| author | |
| committer | |
| log | 242d268a06261d31161ad3a30ac0c2827ca49d99 |
| tree | 619805cd04cd46e14263ccbb8fb41f463e853ab0 |
| parent | 9bcb0e938c6de1d4de6546de57495092a5903536 |
| parent | 15b4c01ab1dd578b0a306b18b11b79f6b9bce88d |
| signature |
LLVM: Set module flags through Builder instead of LLVM API bindings6 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 | ); |
| 900 | 900 | ||
| 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; |
| 955 | 904 | ||
| ... | @@ -1149,6 +1098,84 @@ pub const Object = struct { | ... | @@ -1149,6 +1098,84 @@ pub const Object = struct { |
| 1149 | } | 1098 | } |
| 1150 | } | 1099 | } |
| 1151 | 1100 | ||
| 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 | } |
| 1236 | 1263 | ||
| 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; | ||
| 1239 | 1265 | ||
| 1240 | const opt_level: llvm.CodeGenOptLevel = if (optimize_mode == .Debug) | 1266 | const opt_level: llvm.CodeGenOptLevel = if (optimize_mode == .Debug) |
| 1241 | .None | 1267 | .None |
| 1242 | else | 1268 | else |
| 1243 | .Aggressive; | 1269 | .Aggressive; |
| 1244 | 1270 | ||
| 1245 | const reloc_mode: llvm.RelocMode = if (pic) | 1271 | const reloc_mode: llvm.RelocMode = if (comp.root_mod.pic) |
| 1246 | .PIC | 1272 | .PIC |
| 1247 | else if (comp.config.link_mode == .dynamic) | 1273 | else if (comp.config.link_mode == .dynamic) |
| 1248 | llvm.RelocMode.DynamicNoPIC | 1274 | 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(); |
| 1278 | 1304 | ||
| 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 | } |
| 11901 | 11901 | ||
| 11902 | pub fn debugNamed(self: *Builder, name: MetadataString, operands: []const Metadata) Allocator.Error!void { | 11902 | pub 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 | } |
| 11907 | 11907 | ||
| 11908 | fn metadataNone(self: *Builder) Allocator.Error!Metadata { | 11908 | fn 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 | } |
| 12215 | 12215 | ||
| 12216 | pub fn debugModuleFlag( | 12216 | pub 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 | } |
| 12225 | 12225 | ||
| 12226 | pub fn debugLocalVar( | 12226 | pub 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 | } |
| 12367 | 12367 | ||
| 12368 | fn debugNamedAssumeCapacity(self: *Builder, name: MetadataString, operands: []const Metadata) void { | 12368 | fn 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 | } |
| 12951 | 12950 | ||
| 12952 | fn debugModuleFlagAssumeCapacity( | 12951 | fn 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 { |
| 51 | pub const Module = opaque { | 51 | pub 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 | }; |
| 64 | 55 | ||
| 65 | pub const disposeMessage = LLVMDisposeMessage; | 56 | pub 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 | } |
| 51 | 51 | ||
| 52 | pub fn usesLargePIC(target: std.Target) bool { | 52 | pub fn picLevel(target: std.Target) u32 { |
| 53 | // MIPS always uses PIC level 1; other platforms vary in their default PIC levels, but they | 53 | // 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 | } |
| 57 | 57 | ||
| 58 | /// This is not whether the target supports Position Independent Code, but whether the -fPIC | 58 | /// 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 | } |
| 437 | 437 | ||
| 438 | void ZigLLVMSetModulePICLevel(LLVMModuleRef module, bool big) { | ||
| 439 | unwrap(module)->setPICLevel(big ? PICLevel::Level::BigPIC : PICLevel::Level::SmallPIC); | ||
| 440 | } | ||
| 441 | |||
| 442 | void ZigLLVMSetModulePIELevel(LLVMModuleRef module, bool large) { | ||
| 443 | unwrap(module)->setPIELevel(large ? PIELevel::Level::Large : PIELevel::Level::Small); | ||
| 444 | } | ||
| 445 | |||
| 446 | void ZigLLVMSetModuleCodeModel(LLVMModuleRef module, LLVMCodeModel code_model) { | ||
| 447 | bool JIT; | ||
| 448 | unwrap(module)->setCodeModel(*unwrap(code_model, JIT)); | ||
| 449 | assert(!JIT); | ||
| 450 | } | ||
| 451 | |||
| 452 | bool ZigLLVMWriteImportLibrary(const char *def_path, const ZigLLVM_ArchType arch, | 438 | bool 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 | }; |
| 157 | 157 | ||
| 158 | ZIG_EXTERN_C void ZigLLVMSetModulePICLevel(LLVMModuleRef module, bool big); | ||
| 159 | ZIG_EXTERN_C void ZigLLVMSetModulePIELevel(LLVMModuleRef module, bool large); | ||
| 160 | ZIG_EXTERN_C void ZigLLVMSetModuleCodeModel(LLVMModuleRef module, LLVMCodeModel code_model); | ||
| 161 | |||
| 162 | ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv); | 158 | ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv); |
| 163 | 159 | ||
| 164 | // synchronize with llvm/include/ADT/Triple.h::ArchType | 160 | // synchronize with llvm/include/ADT/Triple.h::ArchType |