diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2024-09-02 17:57:27 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-02 17:57:27 -0700 |
| commit | 242d268a06261d31161ad3a30ac0c2827ca49d99 (patch) | |
| tree | 619805cd04cd46e14263ccbb8fb41f463e853ab0 /src/codegen | |
| parent | 9bcb0e938c6de1d4de6546de57495092a5903536 (diff) | |
| parent | 15b4c01ab1dd578b0a306b18b11b79f6b9bce88d (diff) | |
| download | zig-242d268a06261d31161ad3a30ac0c2827ca49d99.tar.gz zig-242d268a06261d31161ad3a30ac0c2827ca49d99.zip | |
Merge pull request #21277 from antlilja/llvm-module-flags
LLVM: Set module flags through Builder instead of LLVM API bindings
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/llvm.zig | 141 | ||||
| -rw-r--r-- | src/codegen/llvm/Builder.zig | 14 | ||||
| -rw-r--r-- | src/codegen/llvm/bindings.zig | 9 |
3 files changed, 86 insertions, 78 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index dc8996afda..6915e9a2ac 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -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,84 @@ pub const Object = struct { } } + { + var module_flags = try std.ArrayList(Builder.Metadata).initCapacity(o.gpa, 6); + defer module_flags.deinit(); + + const behavior_error = try o.builder.metadataConstant(try o.builder.intConst(.i32, 1)); + const behavior_warning = try o.builder.metadataConstant(try o.builder.intConst(.i32, 2)); + const behavior_max = try o.builder.metadataConstant(try o.builder.intConst(.i32, 7)); + const behavior_min = try o.builder.metadataConstant(try o.builder.intConst(.i32, 8)); + + const pic_level = target_util.picLevel(comp.root_mod.resolved_target.result); + if (comp.root_mod.pic) { + module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag( + behavior_min, + try o.builder.metadataString("PIC Level"), + try o.builder.metadataConstant(try o.builder.intConst(.i32, pic_level)), + )); + } + + if (comp.config.pie) { + module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag( + behavior_max, + try o.builder.metadataString("PIE Level"), + try o.builder.metadataConstant(try o.builder.intConst(.i32, pic_level)), + )); + } + + if (comp.root_mod.code_model != .default) { + module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag( + behavior_error, + 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_max, + 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_max, + 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 +1262,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 +1302,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); } diff --git a/src/codegen/llvm/Builder.zig b/src/codegen/llvm/Builder.zig index 029b81dc3f..9b28126604 100644 --- a/src/codegen/llvm/Builder.zig +++ b/src/codegen/llvm/Builder.zig @@ -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, diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index d21fc69ff3..a002dbcd8a 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -51,15 +51,6 @@ pub const Context = opaque { pub const Module = opaque { pub const dispose = LLVMDisposeModule; extern fn LLVMDisposeModule(*Module) void; - - pub const setModulePICLevel = ZigLLVMSetModulePICLevel; - extern fn ZigLLVMSetModulePICLevel(module: *Module, big: bool) void; - - pub const setModulePIELevel = ZigLLVMSetModulePIELevel; - extern fn ZigLLVMSetModulePIELevel(module: *Module, large: bool) void; - - pub const setModuleCodeModel = ZigLLVMSetModuleCodeModel; - extern fn ZigLLVMSetModuleCodeModel(module: *Module, code_model: CodeModel) void; }; pub const disposeMessage = LLVMDisposeMessage; |
