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 {...@@ -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,81 @@ pub const Object = struct {...@@ -1149,6 +1098,81 @@ 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_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
1152 const target_triple_sentinel =1176 const target_triple_sentinel =
1153 try o.gpa.dupeZ(u8, o.builder.target_triple.slice(&o.builder).?);1177 try o.gpa.dupeZ(u8, o.builder.target_triple.slice(&o.builder).?);
1154 defer o.gpa.free(target_triple_sentinel);1178 defer o.gpa.free(target_triple_sentinel);
...@@ -1235,14 +1259,13 @@ pub const Object = struct {...@@ -1235,14 +1259,13 @@ pub const Object = struct {
1235 }1259 }
12361260
1237 const optimize_mode = comp.root_mod.optimize_mode;1261 const optimize_mode = comp.root_mod.optimize_mode;
1238 const pic = comp.root_mod.pic;
12391262
1240 const opt_level: llvm.CodeGenOptLevel = if (optimize_mode == .Debug)1263 const opt_level: llvm.CodeGenOptLevel = if (optimize_mode == .Debug)
1241 .None1264 .None
1242 else1265 else
1243 .Aggressive;1266 .Aggressive;
12441267
1245 const reloc_mode: llvm.RelocMode = if (pic)1268 const reloc_mode: llvm.RelocMode = if (comp.root_mod.pic)
1246 .PIC1269 .PIC
1247 else if (comp.config.link_mode == .dynamic)1270 else if (comp.config.link_mode == .dynamic)
1248 llvm.RelocMode.DynamicNoPIC1271 llvm.RelocMode.DynamicNoPIC
...@@ -1276,13 +1299,6 @@ pub const Object = struct {...@@ -1276,13 +1299,6 @@ pub const Object = struct {
1276 );1299 );
1277 errdefer target_machine.dispose();1300 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
1286 if (comp.llvm_opt_bisect_limit >= 0) {1302 if (comp.llvm_opt_bisect_limit >= 0) {
1287 context.setOptBisectLimit(comp.llvm_opt_bisect_limit);1303 context.setOptBisectLimit(comp.llvm_opt_bisect_limit);
1288 }1304 }
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,