Commit 629bd90e26

antlilja <liljaanton2001@gmail.com>
2024-09-01 14:10:56
LLVM: Emit module flags through Builder instead of LLVM API
1 parent cad6530
Changed files (2)
src
codegen
src/codegen/llvm/Builder.zig
@@ -11899,10 +11899,10 @@ pub fn trailingMetadataStringAssumeCapacity(self: *Builder) MetadataString {
     return @enumFromInt(gop.index);
 }
 
-pub fn debugNamed(self: *Builder, name: MetadataString, operands: []const Metadata) Allocator.Error!void {
+pub fn metadataNamed(self: *Builder, name: MetadataString, operands: []const Metadata) Allocator.Error!void {
     try self.metadata_extra.ensureUnusedCapacity(self.gpa, operands.len);
     try self.metadata_named.ensureUnusedCapacity(self.gpa, 1);
-    self.debugNamedAssumeCapacity(name, operands);
+    self.metadataNamedAssumeCapacity(name, operands);
 }
 
 fn metadataNone(self: *Builder) Allocator.Error!Metadata {
@@ -12213,14 +12213,14 @@ pub fn strTuple(
     return self.strTupleAssumeCapacity(str, elements);
 }
 
-pub fn debugModuleFlag(
+pub fn metadataModuleFlag(
     self: *Builder,
     behavior: Metadata,
     name: MetadataString,
     constant: Metadata,
 ) Allocator.Error!Metadata {
     try self.ensureUnusedMetadataCapacity(1, Metadata.ModuleFlag, 0);
-    return self.debugModuleFlagAssumeCapacity(behavior, name, constant);
+    return self.metadataModuleFlagAssumeCapacity(behavior, name, constant);
 }
 
 pub fn debugLocalVar(
@@ -12365,8 +12365,7 @@ fn metadataDistinctAssumeCapacity(self: *Builder, tag: Metadata.Tag, value: anyt
     return @enumFromInt(gop.index);
 }
 
-fn debugNamedAssumeCapacity(self: *Builder, name: MetadataString, operands: []const Metadata) void {
-    assert(!self.strip);
+fn metadataNamedAssumeCapacity(self: *Builder, name: MetadataString, operands: []const Metadata) void {
     assert(name != .none);
     const extra_index: u32 = @intCast(self.metadata_extra.items.len);
     self.metadata_extra.appendSliceAssumeCapacity(@ptrCast(operands));
@@ -12949,13 +12948,12 @@ fn strTupleAssumeCapacity(
     return @enumFromInt(gop.index);
 }
 
-fn debugModuleFlagAssumeCapacity(
+fn metadataModuleFlagAssumeCapacity(
     self: *Builder,
     behavior: Metadata,
     name: MetadataString,
     constant: Metadata,
 ) Metadata {
-    assert(!self.strip);
     return self.metadataSimpleAssumeCapacity(.module_flag, Metadata.ModuleFlag{
         .behavior = behavior,
         .name = name,
src/codegen/llvm.zig
@@ -898,58 +898,7 @@ pub const Object = struct {
                 .{ .optimized = comp.root_mod.optimize_mode != .Debug },
             );
 
-            const i32_2 = try builder.intConst(.i32, 2);
-            const i32_3 = try builder.intConst(.i32, 3);
-            const debug_info_version = try builder.debugModuleFlag(
-                try builder.metadataConstant(i32_2),
-                try builder.metadataString("Debug Info Version"),
-                try builder.metadataConstant(i32_3),
-            );
-
-            switch (comp.config.debug_format) {
-                .strip => unreachable,
-                .dwarf => |f| {
-                    const i32_4 = try builder.intConst(.i32, 4);
-                    const dwarf_version = try builder.debugModuleFlag(
-                        try builder.metadataConstant(i32_2),
-                        try builder.metadataString("Dwarf Version"),
-                        try builder.metadataConstant(i32_4),
-                    );
-                    switch (f) {
-                        .@"32" => {
-                            try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{
-                                debug_info_version,
-                                dwarf_version,
-                            });
-                        },
-                        .@"64" => {
-                            const dwarf64 = try builder.debugModuleFlag(
-                                try builder.metadataConstant(i32_2),
-                                try builder.metadataString("DWARF64"),
-                                try builder.metadataConstant(.@"1"),
-                            );
-                            try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{
-                                debug_info_version,
-                                dwarf_version,
-                                dwarf64,
-                            });
-                        },
-                    }
-                },
-                .code_view => {
-                    const code_view = try builder.debugModuleFlag(
-                        try builder.metadataConstant(i32_2),
-                        try builder.metadataString("CodeView"),
-                        try builder.metadataConstant(.@"1"),
-                    );
-                    try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{
-                        debug_info_version,
-                        code_view,
-                    });
-                },
-            }
-
-            try builder.debugNamed(try builder.metadataString("llvm.dbg.cu"), &.{debug_compile_unit});
+            try builder.metadataNamed(try builder.metadataString("llvm.dbg.cu"), &.{debug_compile_unit});
             break :debug_info .{ debug_compile_unit, debug_enums_fwd_ref, debug_globals_fwd_ref };
         } else .{.none} ** 3;
 
@@ -1149,6 +1098,81 @@ pub const Object = struct {
             }
         }
 
+        {
+            var module_flags = try std.ArrayList(Builder.Metadata).initCapacity(o.gpa, 6);
+            defer module_flags.deinit();
+
+            const behavior_warning = try o.builder.metadataConstant(try o.builder.intConst(.i32, 2));
+
+            const large_pic = target_util.usesLargePIC(comp.root_mod.resolved_target.result);
+            if (comp.root_mod.pic) {
+                module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
+                    behavior_warning,
+                    try o.builder.metadataString("PIC Level"),
+                    try o.builder.metadataConstant(try o.builder.intConst(.i32, @as(i32, if (large_pic) 2 else 1))),
+                ));
+            }
+
+            if (comp.config.pie) {
+                module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
+                    behavior_warning,
+                    try o.builder.metadataString("PIE Level"),
+                    try o.builder.metadataConstant(try o.builder.intConst(.i32, @as(i32, if (large_pic) 2 else 1))),
+                ));
+            }
+
+            if (comp.root_mod.code_model != .default) {
+                module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
+                    behavior_warning,
+                    try o.builder.metadataString("Code Model"),
+                    try o.builder.metadataConstant(try o.builder.intConst(.i32, @as(i32, switch (comp.root_mod.code_model) {
+                        .tiny => 0,
+                        .small => 1,
+                        .kernel => 2,
+                        .medium => 3,
+                        .large => 4,
+                        else => unreachable,
+                    }))),
+                ));
+            }
+
+            if (!o.builder.strip) {
+                module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
+                    behavior_warning,
+                    try o.builder.metadataString("Debug Info Version"),
+                    try o.builder.metadataConstant(try o.builder.intConst(.i32, 3)),
+                ));
+
+                switch (comp.config.debug_format) {
+                    .strip => unreachable,
+                    .dwarf => |f| {
+                        module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
+                            behavior_warning,
+                            try o.builder.metadataString("Dwarf Version"),
+                            try o.builder.metadataConstant(try o.builder.intConst(.i32, 4)),
+                        ));
+
+                        if (f == .@"64") {
+                            module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
+                                behavior_warning,
+                                try o.builder.metadataString("DWARF64"),
+                                try o.builder.metadataConstant(.@"1"),
+                            ));
+                        }
+                    },
+                    .code_view => {
+                        module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
+                            behavior_warning,
+                            try o.builder.metadataString("CodeView"),
+                            try o.builder.metadataConstant(.@"1"),
+                        ));
+                    },
+                }
+            }
+
+            try o.builder.metadataNamed(try o.builder.metadataString("llvm.module.flags"), module_flags.items);
+        }
+
         const target_triple_sentinel =
             try o.gpa.dupeZ(u8, o.builder.target_triple.slice(&o.builder).?);
         defer o.gpa.free(target_triple_sentinel);
@@ -1235,14 +1259,13 @@ pub const Object = struct {
         }
 
         const optimize_mode = comp.root_mod.optimize_mode;
-        const pic = comp.root_mod.pic;
 
         const opt_level: llvm.CodeGenOptLevel = if (optimize_mode == .Debug)
             .None
         else
             .Aggressive;
 
-        const reloc_mode: llvm.RelocMode = if (pic)
+        const reloc_mode: llvm.RelocMode = if (comp.root_mod.pic)
             .PIC
         else if (comp.config.link_mode == .dynamic)
             llvm.RelocMode.DynamicNoPIC
@@ -1276,13 +1299,6 @@ pub const Object = struct {
         );
         errdefer target_machine.dispose();
 
-        const large_pic = target_util.usesLargePIC(comp.root_mod.resolved_target.result);
-
-        if (pic) module.setModulePICLevel(large_pic);
-        if (comp.config.pie) module.setModulePIELevel(large_pic);
-
-        if (code_model != .Default) module.setModuleCodeModel(code_model);
-
         if (comp.llvm_opt_bisect_limit >= 0) {
             context.setOptBisectLimit(comp.llvm_opt_bisect_limit);
         }