mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 04:48:20 +00:00
LLVM: Emit module flags through Builder instead of LLVM API
This commit is contained in:
parent
cad65307b7
commit
629bd90e26
@ -898,58 +898,7 @@ pub const Object = struct {
|
||||
.{ .optimized = comp.root_mod.optimize_mode != .Debug },
|
||||
);
|
||||
|
||||
const i32_2 = try builder.intConst(.i32, 2);
|
||||
const i32_3 = try builder.intConst(.i32, 3);
|
||||
const debug_info_version = try builder.debugModuleFlag(
|
||||
try builder.metadataConstant(i32_2),
|
||||
try builder.metadataString("Debug Info Version"),
|
||||
try builder.metadataConstant(i32_3),
|
||||
);
|
||||
|
||||
switch (comp.config.debug_format) {
|
||||
.strip => unreachable,
|
||||
.dwarf => |f| {
|
||||
const i32_4 = try builder.intConst(.i32, 4);
|
||||
const dwarf_version = try builder.debugModuleFlag(
|
||||
try builder.metadataConstant(i32_2),
|
||||
try builder.metadataString("Dwarf Version"),
|
||||
try builder.metadataConstant(i32_4),
|
||||
);
|
||||
switch (f) {
|
||||
.@"32" => {
|
||||
try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{
|
||||
debug_info_version,
|
||||
dwarf_version,
|
||||
});
|
||||
},
|
||||
.@"64" => {
|
||||
const dwarf64 = try builder.debugModuleFlag(
|
||||
try builder.metadataConstant(i32_2),
|
||||
try builder.metadataString("DWARF64"),
|
||||
try builder.metadataConstant(.@"1"),
|
||||
);
|
||||
try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{
|
||||
debug_info_version,
|
||||
dwarf_version,
|
||||
dwarf64,
|
||||
});
|
||||
},
|
||||
}
|
||||
},
|
||||
.code_view => {
|
||||
const code_view = try builder.debugModuleFlag(
|
||||
try builder.metadataConstant(i32_2),
|
||||
try builder.metadataString("CodeView"),
|
||||
try builder.metadataConstant(.@"1"),
|
||||
);
|
||||
try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{
|
||||
debug_info_version,
|
||||
code_view,
|
||||
});
|
||||
},
|
||||
}
|
||||
|
||||
try builder.debugNamed(try builder.metadataString("llvm.dbg.cu"), &.{debug_compile_unit});
|
||||
try builder.metadataNamed(try builder.metadataString("llvm.dbg.cu"), &.{debug_compile_unit});
|
||||
break :debug_info .{ debug_compile_unit, debug_enums_fwd_ref, debug_globals_fwd_ref };
|
||||
} else .{.none} ** 3;
|
||||
|
||||
@ -1149,6 +1098,81 @@ pub const Object = struct {
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
var module_flags = try std.ArrayList(Builder.Metadata).initCapacity(o.gpa, 6);
|
||||
defer module_flags.deinit();
|
||||
|
||||
const behavior_warning = try o.builder.metadataConstant(try o.builder.intConst(.i32, 2));
|
||||
|
||||
const large_pic = target_util.usesLargePIC(comp.root_mod.resolved_target.result);
|
||||
if (comp.root_mod.pic) {
|
||||
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
|
||||
behavior_warning,
|
||||
try o.builder.metadataString("PIC Level"),
|
||||
try o.builder.metadataConstant(try o.builder.intConst(.i32, @as(i32, if (large_pic) 2 else 1))),
|
||||
));
|
||||
}
|
||||
|
||||
if (comp.config.pie) {
|
||||
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
|
||||
behavior_warning,
|
||||
try o.builder.metadataString("PIE Level"),
|
||||
try o.builder.metadataConstant(try o.builder.intConst(.i32, @as(i32, if (large_pic) 2 else 1))),
|
||||
));
|
||||
}
|
||||
|
||||
if (comp.root_mod.code_model != .default) {
|
||||
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
|
||||
behavior_warning,
|
||||
try o.builder.metadataString("Code Model"),
|
||||
try o.builder.metadataConstant(try o.builder.intConst(.i32, @as(i32, switch (comp.root_mod.code_model) {
|
||||
.tiny => 0,
|
||||
.small => 1,
|
||||
.kernel => 2,
|
||||
.medium => 3,
|
||||
.large => 4,
|
||||
else => unreachable,
|
||||
}))),
|
||||
));
|
||||
}
|
||||
|
||||
if (!o.builder.strip) {
|
||||
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
|
||||
behavior_warning,
|
||||
try o.builder.metadataString("Debug Info Version"),
|
||||
try o.builder.metadataConstant(try o.builder.intConst(.i32, 3)),
|
||||
));
|
||||
|
||||
switch (comp.config.debug_format) {
|
||||
.strip => unreachable,
|
||||
.dwarf => |f| {
|
||||
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
|
||||
behavior_warning,
|
||||
try o.builder.metadataString("Dwarf Version"),
|
||||
try o.builder.metadataConstant(try o.builder.intConst(.i32, 4)),
|
||||
));
|
||||
|
||||
if (f == .@"64") {
|
||||
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
|
||||
behavior_warning,
|
||||
try o.builder.metadataString("DWARF64"),
|
||||
try o.builder.metadataConstant(.@"1"),
|
||||
));
|
||||
}
|
||||
},
|
||||
.code_view => {
|
||||
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
|
||||
behavior_warning,
|
||||
try o.builder.metadataString("CodeView"),
|
||||
try o.builder.metadataConstant(.@"1"),
|
||||
));
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
try o.builder.metadataNamed(try o.builder.metadataString("llvm.module.flags"), module_flags.items);
|
||||
}
|
||||
|
||||
const target_triple_sentinel =
|
||||
try o.gpa.dupeZ(u8, o.builder.target_triple.slice(&o.builder).?);
|
||||
defer o.gpa.free(target_triple_sentinel);
|
||||
@ -1235,14 +1259,13 @@ pub const Object = struct {
|
||||
}
|
||||
|
||||
const optimize_mode = comp.root_mod.optimize_mode;
|
||||
const pic = comp.root_mod.pic;
|
||||
|
||||
const opt_level: llvm.CodeGenOptLevel = if (optimize_mode == .Debug)
|
||||
.None
|
||||
else
|
||||
.Aggressive;
|
||||
|
||||
const reloc_mode: llvm.RelocMode = if (pic)
|
||||
const reloc_mode: llvm.RelocMode = if (comp.root_mod.pic)
|
||||
.PIC
|
||||
else if (comp.config.link_mode == .dynamic)
|
||||
llvm.RelocMode.DynamicNoPIC
|
||||
@ -1276,13 +1299,6 @@ pub const Object = struct {
|
||||
);
|
||||
errdefer target_machine.dispose();
|
||||
|
||||
const large_pic = target_util.usesLargePIC(comp.root_mod.resolved_target.result);
|
||||
|
||||
if (pic) module.setModulePICLevel(large_pic);
|
||||
if (comp.config.pie) module.setModulePIELevel(large_pic);
|
||||
|
||||
if (code_model != .Default) module.setModuleCodeModel(code_model);
|
||||
|
||||
if (comp.llvm_opt_bisect_limit >= 0) {
|
||||
context.setOptBisectLimit(comp.llvm_opt_bisect_limit);
|
||||
}
|
||||
|
||||
@ -11899,10 +11899,10 @@ pub fn trailingMetadataStringAssumeCapacity(self: *Builder) MetadataString {
|
||||
return @enumFromInt(gop.index);
|
||||
}
|
||||
|
||||
pub fn debugNamed(self: *Builder, name: MetadataString, operands: []const Metadata) Allocator.Error!void {
|
||||
pub fn metadataNamed(self: *Builder, name: MetadataString, operands: []const Metadata) Allocator.Error!void {
|
||||
try self.metadata_extra.ensureUnusedCapacity(self.gpa, operands.len);
|
||||
try self.metadata_named.ensureUnusedCapacity(self.gpa, 1);
|
||||
self.debugNamedAssumeCapacity(name, operands);
|
||||
self.metadataNamedAssumeCapacity(name, operands);
|
||||
}
|
||||
|
||||
fn metadataNone(self: *Builder) Allocator.Error!Metadata {
|
||||
@ -12213,14 +12213,14 @@ pub fn strTuple(
|
||||
return self.strTupleAssumeCapacity(str, elements);
|
||||
}
|
||||
|
||||
pub fn debugModuleFlag(
|
||||
pub fn metadataModuleFlag(
|
||||
self: *Builder,
|
||||
behavior: Metadata,
|
||||
name: MetadataString,
|
||||
constant: Metadata,
|
||||
) Allocator.Error!Metadata {
|
||||
try self.ensureUnusedMetadataCapacity(1, Metadata.ModuleFlag, 0);
|
||||
return self.debugModuleFlagAssumeCapacity(behavior, name, constant);
|
||||
return self.metadataModuleFlagAssumeCapacity(behavior, name, constant);
|
||||
}
|
||||
|
||||
pub fn debugLocalVar(
|
||||
@ -12365,8 +12365,7 @@ fn metadataDistinctAssumeCapacity(self: *Builder, tag: Metadata.Tag, value: anyt
|
||||
return @enumFromInt(gop.index);
|
||||
}
|
||||
|
||||
fn debugNamedAssumeCapacity(self: *Builder, name: MetadataString, operands: []const Metadata) void {
|
||||
assert(!self.strip);
|
||||
fn metadataNamedAssumeCapacity(self: *Builder, name: MetadataString, operands: []const Metadata) void {
|
||||
assert(name != .none);
|
||||
const extra_index: u32 = @intCast(self.metadata_extra.items.len);
|
||||
self.metadata_extra.appendSliceAssumeCapacity(@ptrCast(operands));
|
||||
@ -12949,13 +12948,12 @@ fn strTupleAssumeCapacity(
|
||||
return @enumFromInt(gop.index);
|
||||
}
|
||||
|
||||
fn debugModuleFlagAssumeCapacity(
|
||||
fn metadataModuleFlagAssumeCapacity(
|
||||
self: *Builder,
|
||||
behavior: Metadata,
|
||||
name: MetadataString,
|
||||
constant: Metadata,
|
||||
) Metadata {
|
||||
assert(!self.strip);
|
||||
return self.metadataSimpleAssumeCapacity(.module_flag, Metadata.ModuleFlag{
|
||||
.behavior = behavior,
|
||||
.name = name,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user