authorgravatar for liljaanton2001@gmail.comantlilja <liljaanton2001@gmail.com> 2024-09-01 14:10:56+02:00
committergravatar for liljaanton2001@gmail.comantlilja <liljaanton2001@gmail.com> 2024-09-01 14:10:56+02:00
log629bd90e267691acac7625771bb47de4298aa8aa
tree042ff1b0bc3aaacef3c73e7f53649f3ce7e6c051
parentcad65307b757d4dfcbae018dbdb4c2a98b87b7e3

LLVM: Emit module flags through Builder instead of LLVM API


2 files changed, 83 insertions(+), 69 deletions(-)

src/codegen/llvm.zig+77-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,81 @@ 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_warning = try o.builder.metadataConstant(try o.builder.intConst(.i32, 2));
1106
1107 const large_pic = target_util.usesLargePIC(comp.root_mod.resolved_target.result);
1108 if (comp.root_mod.pic) {
1109 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1110 behavior_warning,
1111 try o.builder.metadataString("PIC Level"),
1112 try o.builder.metadataConstant(try o.builder.intConst(.i32, @as(i32, if (large_pic) 2 else 1))),
1113 ));
1114 }
1115
1116 if (comp.config.pie) {
1117 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1118 behavior_warning,
1119 try o.builder.metadataString("PIE Level"),
1120 try o.builder.metadataConstant(try o.builder.intConst(.i32, @as(i32, if (large_pic) 2 else 1))),
1121 ));
1122 }
1123
1124 if (comp.root_mod.code_model != .default) {
1125 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1126 behavior_warning,
1127 try o.builder.metadataString("Code Model"),
1128 try o.builder.metadataConstant(try o.builder.intConst(.i32, @as(i32, switch (comp.root_mod.code_model) {
1129 .tiny => 0,
1130 .small => 1,
1131 .kernel => 2,
1132 .medium => 3,
1133 .large => 4,
1134 else => unreachable,
1135 }))),
1136 ));
1137 }
1138
1139 if (!o.builder.strip) {
1140 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1141 behavior_warning,
1142 try o.builder.metadataString("Debug Info Version"),
1143 try o.builder.metadataConstant(try o.builder.intConst(.i32, 3)),
1144 ));
1145
1146 switch (comp.config.debug_format) {
1147 .strip => unreachable,
1148 .dwarf => |f| {
1149 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1150 behavior_warning,
1151 try o.builder.metadataString("Dwarf Version"),
1152 try o.builder.metadataConstant(try o.builder.intConst(.i32, 4)),
1153 ));
1154
1155 if (f == .@"64") {
1156 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1157 behavior_warning,
1158 try o.builder.metadataString("DWARF64"),
1159 try o.builder.metadataConstant(.@"1"),
1160 ));
1161 }
1162 },
1163 .code_view => {
1164 module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1165 behavior_warning,
1166 try o.builder.metadataString("CodeView"),
1167 try o.builder.metadataConstant(.@"1"),
1168 ));
1169 },
1170 }
1171 }
1172
1173 try o.builder.metadataNamed(try o.builder.metadataString("llvm.module.flags"), module_flags.items);
1174 }
1175
11521176 const target_triple_sentinel =
11531177 try o.gpa.dupeZ(u8, o.builder.target_triple.slice(&o.builder).?);
11541178 defer o.gpa.free(target_triple_sentinel);
......@@ -1235,14 +1259,13 @@ pub const Object = struct {
12351259 }
12361260
12371261 const optimize_mode = comp.root_mod.optimize_mode;
1238 const pic = comp.root_mod.pic;
12391262
12401263 const opt_level: llvm.CodeGenOptLevel = if (optimize_mode == .Debug)
12411264 .None
12421265 else
12431266 .Aggressive;
12441267
1245 const reloc_mode: llvm.RelocMode = if (pic)
1268 const reloc_mode: llvm.RelocMode = if (comp.root_mod.pic)
12461269 .PIC
12471270 else if (comp.config.link_mode == .dynamic)
12481271 llvm.RelocMode.DynamicNoPIC
......@@ -1276,13 +1299,6 @@ pub const Object = struct {
12761299 );
12771300 errdefer target_machine.dispose();
12781301
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
12861302 if (comp.llvm_opt_bisect_limit >= 0) {
12871303 context.setOptBisectLimit(comp.llvm_opt_bisect_limit);
12881304 }
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,