authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-09-02 17:57:27-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-09-02 17:57:27-07:00
log242d268a06261d31161ad3a30ac0c2827ca49d99
tree619805cd04cd46e14263ccbb8fb41f463e853ab0
parent9bcb0e938c6de1d4de6546de57495092a5903536
parent15b4c01ab1dd578b0a306b18b11b79f6b9bce88d
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #21277 from antlilja/llvm-module-flags

LLVM: Set module flags through Builder instead of LLVM API bindings

6 files changed, 88 insertions(+), 98 deletions(-)

src/codegen/llvm.zig+80-61
...@@ -898,58 +898,7 @@ pub const Object = struct {...@@ -898,58 +898,7 @@ pub const Object = struct {
898 .{ .optimized = comp.root_mod.optimize_mode != .Debug },898 .{ .optimized = comp.root_mod.optimize_mode != .Debug },
899 );899 );
900900
901 const i32_2 = try builder.intConst(.i32, 2);901 try builder.metadataNamed(try builder.metadataString("llvm.dbg.cu"), &.{debug_compile_unit});
902 const i32_3 = try builder.intConst(.i32, 3);
903 const debug_info_version = try builder.debugModuleFlag(
904 try builder.metadataConstant(i32_2),
905 try builder.metadataString("Debug Info Version"),
906 try builder.metadataConstant(i32_3),
907 );
908
909 switch (comp.config.debug_format) {
910 .strip => unreachable,
911 .dwarf => |f| {
912 const i32_4 = try builder.intConst(.i32, 4);
913 const dwarf_version = try builder.debugModuleFlag(
914 try builder.metadataConstant(i32_2),
915 try builder.metadataString("Dwarf Version"),
916 try builder.metadataConstant(i32_4),
917 );
918 switch (f) {
919 .@"32" => {
920 try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{
921 debug_info_version,
922 dwarf_version,
923 });
924 },
925 .@"64" => {
926 const dwarf64 = try builder.debugModuleFlag(
927 try builder.metadataConstant(i32_2),
928 try builder.metadataString("DWARF64"),
929 try builder.metadataConstant(.@"1"),
930 );
931 try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{
932 debug_info_version,
933 dwarf_version,
934 dwarf64,
935 });
936 },
937 }
938 },
939 .code_view => {
940 const code_view = try builder.debugModuleFlag(
941 try builder.metadataConstant(i32_2),
942 try builder.metadataString("CodeView"),
943 try builder.metadataConstant(.@"1"),
944 );
945 try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{
946 debug_info_version,
947 code_view,
948 });
949 },
950 }
951
952 try builder.debugNamed(try builder.metadataString("llvm.dbg.cu"), &.{debug_compile_unit});
953 break :debug_info .{ debug_compile_unit, debug_enums_fwd_ref, debug_globals_fwd_ref };902 break :debug_info .{ debug_compile_unit, debug_enums_fwd_ref, debug_globals_fwd_ref };
954 } else .{.none} ** 3;903 } else .{.none} ** 3;
955904
...@@ -1149,6 +1098,84 @@ pub const Object = struct {...@@ -1149,6 +1098,84 @@ pub const Object = struct {
1149 }1098 }
1150 }1099 }
11511100
1101 {
1102 var module_flags = try std.ArrayList(Builder.Metadata).initCapacity(o.gpa, 6);
1103 defer module_flags.deinit();
1104
1105 const behavior_error = try o.builder.metadataConstant(try o.builder.intConst(.i32, 1));
1106 const behavior_warning = try o.builder.metadataConstant(try o.builder.intConst(.i32, 2));
1107 const behavior_max = try o.builder.metadataConstant(try o.builder.intConst(.i32, 7));
1108 const behavior_min = try o.builder.metadataConstant(try o.builder.intConst(.i32, 8));
1109
1110 const pic_level = target_util.picLevel(comp.root_mod.resolved_target.result);
1111 if (comp.root_mod.pic) {
1112 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1113 behavior_min,
1114 try o.builder.metadataString("PIC Level"),
1115 try o.builder.metadataConstant(try o.builder.intConst(.i32, pic_level)),
1116 ));
1117 }
1118
1119 if (comp.config.pie) {
1120 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1121 behavior_max,
1122 try o.builder.metadataString("PIE Level"),
1123 try o.builder.metadataConstant(try o.builder.intConst(.i32, pic_level)),
1124 ));
1125 }
1126
1127 if (comp.root_mod.code_model != .default) {
1128 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1129 behavior_error,
1130 try o.builder.metadataString("Code Model"),
1131 try o.builder.metadataConstant(try o.builder.intConst(.i32, @as(i32, switch (comp.root_mod.code_model) {
1132 .tiny => 0,
1133 .small => 1,
1134 .kernel => 2,
1135 .medium => 3,
1136 .large => 4,
1137 else => unreachable,
1138 }))),
1139 ));
1140 }
1141
1142 if (!o.builder.strip) {
1143 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1144 behavior_warning,
1145 try o.builder.metadataString("Debug Info Version"),
1146 try o.builder.metadataConstant(try o.builder.intConst(.i32, 3)),
1147 ));
1148
1149 switch (comp.config.debug_format) {
1150 .strip => unreachable,
1151 .dwarf => |f| {
1152 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1153 behavior_max,
1154 try o.builder.metadataString("Dwarf Version"),
1155 try o.builder.metadataConstant(try o.builder.intConst(.i32, 4)),
1156 ));
1157
1158 if (f == .@"64") {
1159 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1160 behavior_max,
1161 try o.builder.metadataString("DWARF64"),
1162 try o.builder.metadataConstant(.@"1"),
1163 ));
1164 }
1165 },
1166 .code_view => {
1167 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1168 behavior_warning,
1169 try o.builder.metadataString("CodeView"),
1170 try o.builder.metadataConstant(.@"1"),
1171 ));
1172 },
1173 }
1174 }
1175
1176 try o.builder.metadataNamed(try o.builder.metadataString("llvm.module.flags"), module_flags.items);
1177 }
1178
1152 const target_triple_sentinel =1179 const target_triple_sentinel =
1153 try o.gpa.dupeZ(u8, o.builder.target_triple.slice(&o.builder).?);1180 try o.gpa.dupeZ(u8, o.builder.target_triple.slice(&o.builder).?);
1154 defer o.gpa.free(target_triple_sentinel);1181 defer o.gpa.free(target_triple_sentinel);
...@@ -1235,14 +1262,13 @@ pub const Object = struct {...@@ -1235,14 +1262,13 @@ pub const Object = struct {
1235 }1262 }
12361263
1237 const optimize_mode = comp.root_mod.optimize_mode;1264 const optimize_mode = comp.root_mod.optimize_mode;
1238 const pic = comp.root_mod.pic;
12391265
1240 const opt_level: llvm.CodeGenOptLevel = if (optimize_mode == .Debug)1266 const opt_level: llvm.CodeGenOptLevel = if (optimize_mode == .Debug)
1241 .None1267 .None
1242 else1268 else
1243 .Aggressive;1269 .Aggressive;
12441270
1245 const reloc_mode: llvm.RelocMode = if (pic)1271 const reloc_mode: llvm.RelocMode = if (comp.root_mod.pic)
1246 .PIC1272 .PIC
1247 else if (comp.config.link_mode == .dynamic)1273 else if (comp.config.link_mode == .dynamic)
1248 llvm.RelocMode.DynamicNoPIC1274 llvm.RelocMode.DynamicNoPIC
...@@ -1276,13 +1302,6 @@ pub const Object = struct {...@@ -1276,13 +1302,6 @@ pub const Object = struct {
1276 );1302 );
1277 errdefer target_machine.dispose();1303 errdefer target_machine.dispose();
12781304
1279 const large_pic = target_util.usesLargePIC(comp.root_mod.resolved_target.result);
1280
1281 if (pic) module.setModulePICLevel(large_pic);
1282 if (comp.config.pie) module.setModulePIELevel(large_pic);
1283
1284 if (code_model != .Default) module.setModuleCodeModel(code_model);
1285
1286 if (comp.llvm_opt_bisect_limit >= 0) {1305 if (comp.llvm_opt_bisect_limit >= 0) {
1287 context.setOptBisectLimit(comp.llvm_opt_bisect_limit);1306 context.setOptBisectLimit(comp.llvm_opt_bisect_limit);
1288 }1307 }
src/codegen/llvm/Builder.zig+6-8
...@@ -11899,10 +11899,10 @@ pub fn trailingMetadataStringAssumeCapacity(self: *Builder) MetadataString {...@@ -11899,10 +11899,10 @@ pub fn trailingMetadataStringAssumeCapacity(self: *Builder) MetadataString {
11899 return @enumFromInt(gop.index);11899 return @enumFromInt(gop.index);
11900}11900}
1190111901
11902pub fn debugNamed(self: *Builder, name: MetadataString, operands: []const Metadata) Allocator.Error!void {11902pub fn metadataNamed(self: *Builder, name: MetadataString, operands: []const Metadata) Allocator.Error!void {
11903 try self.metadata_extra.ensureUnusedCapacity(self.gpa, operands.len);11903 try self.metadata_extra.ensureUnusedCapacity(self.gpa, operands.len);
11904 try self.metadata_named.ensureUnusedCapacity(self.gpa, 1);11904 try self.metadata_named.ensureUnusedCapacity(self.gpa, 1);
11905 self.debugNamedAssumeCapacity(name, operands);11905 self.metadataNamedAssumeCapacity(name, operands);
11906}11906}
1190711907
11908fn metadataNone(self: *Builder) Allocator.Error!Metadata {11908fn metadataNone(self: *Builder) Allocator.Error!Metadata {
...@@ -12213,14 +12213,14 @@ pub fn strTuple(...@@ -12213,14 +12213,14 @@ pub fn strTuple(
12213 return self.strTupleAssumeCapacity(str, elements);12213 return self.strTupleAssumeCapacity(str, elements);
12214}12214}
1221512215
12216pub fn debugModuleFlag(12216pub fn metadataModuleFlag(
12217 self: *Builder,12217 self: *Builder,
12218 behavior: Metadata,12218 behavior: Metadata,
12219 name: MetadataString,12219 name: MetadataString,
12220 constant: Metadata,12220 constant: Metadata,
12221) Allocator.Error!Metadata {12221) Allocator.Error!Metadata {
12222 try self.ensureUnusedMetadataCapacity(1, Metadata.ModuleFlag, 0);12222 try self.ensureUnusedMetadataCapacity(1, Metadata.ModuleFlag, 0);
12223 return self.debugModuleFlagAssumeCapacity(behavior, name, constant);12223 return self.metadataModuleFlagAssumeCapacity(behavior, name, constant);
12224}12224}
1222512225
12226pub fn debugLocalVar(12226pub fn debugLocalVar(
...@@ -12365,8 +12365,7 @@ fn metadataDistinctAssumeCapacity(self: *Builder, tag: Metadata.Tag, value: anyt...@@ -12365,8 +12365,7 @@ fn metadataDistinctAssumeCapacity(self: *Builder, tag: Metadata.Tag, value: anyt
12365 return @enumFromInt(gop.index);12365 return @enumFromInt(gop.index);
12366}12366}
1236712367
12368fn debugNamedAssumeCapacity(self: *Builder, name: MetadataString, operands: []const Metadata) void {12368fn metadataNamedAssumeCapacity(self: *Builder, name: MetadataString, operands: []const Metadata) void {
12369 assert(!self.strip);
12370 assert(name != .none);12369 assert(name != .none);
12371 const extra_index: u32 = @intCast(self.metadata_extra.items.len);12370 const extra_index: u32 = @intCast(self.metadata_extra.items.len);
12372 self.metadata_extra.appendSliceAssumeCapacity(@ptrCast(operands));12371 self.metadata_extra.appendSliceAssumeCapacity(@ptrCast(operands));
...@@ -12949,13 +12948,12 @@ fn strTupleAssumeCapacity(...@@ -12949,13 +12948,12 @@ fn strTupleAssumeCapacity(
12949 return @enumFromInt(gop.index);12948 return @enumFromInt(gop.index);
12950}12949}
1295112950
12952fn debugModuleFlagAssumeCapacity(12951fn metadataModuleFlagAssumeCapacity(
12953 self: *Builder,12952 self: *Builder,
12954 behavior: Metadata,12953 behavior: Metadata,
12955 name: MetadataString,12954 name: MetadataString,
12956 constant: Metadata,12955 constant: Metadata,
12957) Metadata {12956) Metadata {
12958 assert(!self.strip);
12959 return self.metadataSimpleAssumeCapacity(.module_flag, Metadata.ModuleFlag{12957 return self.metadataSimpleAssumeCapacity(.module_flag, Metadata.ModuleFlag{
12960 .behavior = behavior,12958 .behavior = behavior,
12961 .name = name,12959 .name = name,
src/codegen/llvm/bindings.zig-9
...@@ -51,15 +51,6 @@ pub const Context = opaque {...@@ -51,15 +51,6 @@ pub const Context = opaque {
51pub const Module = opaque {51pub const Module = opaque {
52 pub const dispose = LLVMDisposeModule;52 pub const dispose = LLVMDisposeModule;
53 extern fn LLVMDisposeModule(*Module) void;53 extern fn LLVMDisposeModule(*Module) void;
54
55 pub const setModulePICLevel = ZigLLVMSetModulePICLevel;
56 extern fn ZigLLVMSetModulePICLevel(module: *Module, big: bool) void;
57
58 pub const setModulePIELevel = ZigLLVMSetModulePIELevel;
59 extern fn ZigLLVMSetModulePIELevel(module: *Module, large: bool) void;
60
61 pub const setModuleCodeModel = ZigLLVMSetModuleCodeModel;
62 extern fn ZigLLVMSetModuleCodeModel(module: *Module, code_model: CodeModel) void;
63};54};
6455
65pub const disposeMessage = LLVMDisposeMessage;56pub const disposeMessage = LLVMDisposeMessage;
src/target.zig+2-2
...@@ -49,10 +49,10 @@ pub fn requiresPIC(target: std.Target, linking_libc: bool) bool {...@@ -49,10 +49,10 @@ pub fn requiresPIC(target: std.Target, linking_libc: bool) bool {
49 (target.abi == .ohos and target.cpu.arch == .aarch64);49 (target.abi == .ohos and target.cpu.arch == .aarch64);
50}50}
5151
52pub fn usesLargePIC(target: std.Target) bool {52pub fn picLevel(target: std.Target) u32 {
53 // MIPS always uses PIC level 1; other platforms vary in their default PIC levels, but they53 // MIPS always uses PIC level 1; other platforms vary in their default PIC levels, but they
54 // support both level 1 and 2, in which case we prefer 2.54 // support both level 1 and 2, in which case we prefer 2.
55 return !target.cpu.arch.isMIPS();55 return if (target.cpu.arch.isMIPS()) 1 else 2;
56}56}
5757
58/// This is not whether the target supports Position Independent Code, but whether the -fPIC58/// This is not whether the target supports Position Independent Code, but whether the -fPIC
src/zig_llvm.cpp-14
...@@ -435,20 +435,6 @@ void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv) {...@@ -435,20 +435,6 @@ void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv) {
435 cl::ParseCommandLineOptions(argc, argv);435 cl::ParseCommandLineOptions(argc, argv);
436}436}
437437
438void ZigLLVMSetModulePICLevel(LLVMModuleRef module, bool big) {
439 unwrap(module)->setPICLevel(big ? PICLevel::Level::BigPIC : PICLevel::Level::SmallPIC);
440}
441
442void ZigLLVMSetModulePIELevel(LLVMModuleRef module, bool large) {
443 unwrap(module)->setPIELevel(large ? PIELevel::Level::Large : PIELevel::Level::Small);
444}
445
446void ZigLLVMSetModuleCodeModel(LLVMModuleRef module, LLVMCodeModel code_model) {
447 bool JIT;
448 unwrap(module)->setCodeModel(*unwrap(code_model, JIT));
449 assert(!JIT);
450}
451
452bool ZigLLVMWriteImportLibrary(const char *def_path, const ZigLLVM_ArchType arch,438bool ZigLLVMWriteImportLibrary(const char *def_path, const ZigLLVM_ArchType arch,
453 const char *output_lib_path, bool kill_at)439 const char *output_lib_path, bool kill_at)
454{440{
src/zig_llvm.h-4
...@@ -155,10 +155,6 @@ enum ZigLLVM_CallingConv {...@@ -155,10 +155,6 @@ enum ZigLLVM_CallingConv {
155 ZigLLVM_MaxID = 1023,155 ZigLLVM_MaxID = 1023,
156};156};
157157
158ZIG_EXTERN_C void ZigLLVMSetModulePICLevel(LLVMModuleRef module, bool big);
159ZIG_EXTERN_C void ZigLLVMSetModulePIELevel(LLVMModuleRef module, bool large);
160ZIG_EXTERN_C void ZigLLVMSetModuleCodeModel(LLVMModuleRef module, LLVMCodeModel code_model);
161
162ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv);158ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv);
163159
164// synchronize with llvm/include/ADT/Triple.h::ArchType160// synchronize with llvm/include/ADT/Triple.h::ArchType