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 {
898898 .{ .optimized = comp.root_mod.optimize_mode != .Debug },
899899 );
900900
901 const i32_2 = try builder.intConst(.i32, 2);
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});
901 try builder.metadataNamed(try builder.metadataString("llvm.dbg.cu"), &.{debug_compile_unit});
953902 break :debug_info .{ debug_compile_unit, debug_enums_fwd_ref, debug_globals_fwd_ref };
954903 } else .{.none} ** 3;
955904
......@@ -1149,6 +1098,84 @@ pub const Object = struct {
11491098 }
11501099 }
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
11521179 const target_triple_sentinel =
11531180 try o.gpa.dupeZ(u8, o.builder.target_triple.slice(&o.builder).?);
11541181 defer o.gpa.free(target_triple_sentinel);
......@@ -1235,14 +1262,13 @@ pub const Object = struct {
12351262 }
12361263
12371264 const optimize_mode = comp.root_mod.optimize_mode;
1238 const pic = comp.root_mod.pic;
12391265
12401266 const opt_level: llvm.CodeGenOptLevel = if (optimize_mode == .Debug)
12411267 .None
12421268 else
12431269 .Aggressive;
12441270
1245 const reloc_mode: llvm.RelocMode = if (pic)
1271 const reloc_mode: llvm.RelocMode = if (comp.root_mod.pic)
12461272 .PIC
12471273 else if (comp.config.link_mode == .dynamic)
12481274 llvm.RelocMode.DynamicNoPIC
......@@ -1276,13 +1302,6 @@ pub const Object = struct {
12761302 );
12771303 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
12861305 if (comp.llvm_opt_bisect_limit >= 0) {
12871306 context.setOptBisectLimit(comp.llvm_opt_bisect_limit);
12881307 }
src/codegen/llvm/Builder.zig+6-8
......@@ -11899,10 +11899,10 @@ pub fn trailingMetadataStringAssumeCapacity(self: *Builder) MetadataString {
1189911899 return @enumFromInt(gop.index);
1190011900}
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 {
1190311903 try self.metadata_extra.ensureUnusedCapacity(self.gpa, operands.len);
1190411904 try self.metadata_named.ensureUnusedCapacity(self.gpa, 1);
11905 self.debugNamedAssumeCapacity(name, operands);
11905 self.metadataNamedAssumeCapacity(name, operands);
1190611906}
1190711907
1190811908fn metadataNone(self: *Builder) Allocator.Error!Metadata {
......@@ -12213,14 +12213,14 @@ pub fn strTuple(
1221312213 return self.strTupleAssumeCapacity(str, elements);
1221412214}
1221512215
12216pub fn debugModuleFlag(
12216pub fn metadataModuleFlag(
1221712217 self: *Builder,
1221812218 behavior: Metadata,
1221912219 name: MetadataString,
1222012220 constant: Metadata,
1222112221) Allocator.Error!Metadata {
1222212222 try self.ensureUnusedMetadataCapacity(1, Metadata.ModuleFlag, 0);
12223 return self.debugModuleFlagAssumeCapacity(behavior, name, constant);
12223 return self.metadataModuleFlagAssumeCapacity(behavior, name, constant);
1222412224}
1222512225
1222612226pub fn debugLocalVar(
......@@ -12365,8 +12365,7 @@ fn metadataDistinctAssumeCapacity(self: *Builder, tag: Metadata.Tag, value: anyt
1236512365 return @enumFromInt(gop.index);
1236612366}
1236712367
12368fn debugNamedAssumeCapacity(self: *Builder, name: MetadataString, operands: []const Metadata) void {
12369 assert(!self.strip);
12368fn metadataNamedAssumeCapacity(self: *Builder, name: MetadataString, operands: []const Metadata) void {
1237012369 assert(name != .none);
1237112370 const extra_index: u32 = @intCast(self.metadata_extra.items.len);
1237212371 self.metadata_extra.appendSliceAssumeCapacity(@ptrCast(operands));
......@@ -12949,13 +12948,12 @@ fn strTupleAssumeCapacity(
1294912948 return @enumFromInt(gop.index);
1295012949}
1295112950
12952fn debugModuleFlagAssumeCapacity(
12951fn metadataModuleFlagAssumeCapacity(
1295312952 self: *Builder,
1295412953 behavior: Metadata,
1295512954 name: MetadataString,
1295612955 constant: Metadata,
1295712956) Metadata {
12958 assert(!self.strip);
1295912957 return self.metadataSimpleAssumeCapacity(.module_flag, Metadata.ModuleFlag{
1296012958 .behavior = behavior,
1296112959 .name = name,
src/codegen/llvm/bindings.zig-9
......@@ -51,15 +51,6 @@ pub const Context = opaque {
5151pub const Module = opaque {
5252 pub const dispose = LLVMDisposeModule;
5353 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;
6354};
6455
6556pub const disposeMessage = LLVMDisposeMessage;
src/target.zig+2-2
......@@ -49,10 +49,10 @@ pub fn requiresPIC(target: std.Target, linking_libc: bool) bool {
4949 (target.abi == .ohos and target.cpu.arch == .aarch64);
5050}
5151
52pub fn usesLargePIC(target: std.Target) bool {
52pub fn picLevel(target: std.Target) u32 {
5353 // MIPS always uses PIC level 1; other platforms vary in their default PIC levels, but they
5454 // 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;
5656}
5757
5858/// 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) {
435435 cl::ParseCommandLineOptions(argc, argv);
436436}
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
452438bool ZigLLVMWriteImportLibrary(const char *def_path, const ZigLLVM_ArchType arch,
453439 const char *output_lib_path, bool kill_at)
454440{
src/zig_llvm.h-4
......@@ -155,10 +155,6 @@ enum ZigLLVM_CallingConv {
155155 ZigLLVM_MaxID = 1023,
156156};
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
162158ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv);
163159
164160// synchronize with llvm/include/ADT/Triple.h::ArchType