Commit de536e8473

antlilja <liljaanton2001@gmail.com>
2024-02-22 15:29:28
LLVM Builder: Emit metadata kinds and function metadata attachments
1 parent 92eec8d
Changed files (2)
src
codegen
src/codegen/llvm/Builder.zig
@@ -13739,6 +13739,25 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
             try constants_block.end();
         }
 
+        const MetadataKind = enum(u8) {
+            dbg = 0,
+        };
+
+        // METADATA_KIND_BLOCK
+        if (!self.strip) {
+            const MetadataKindBlock = ir.MetadataKindBlock;
+            var metadata_kind_block = try module_block.enterSubBlock(MetadataKindBlock);
+
+            inline for (@typeInfo(MetadataKind).Enum.fields) |field| {
+                try metadata_kind_block.writeAbbrev(MetadataKindBlock.Kind{
+                    .id = field.value,
+                    .name = field.name,
+                });
+            }
+
+            try metadata_kind_block.end();
+        }
+
         const MetadataAdapter = struct {
             builder: *const Builder,
             constant_adapter: ConstantAdapter,
@@ -14766,6 +14785,23 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
                     try value_symtab_block.end();
                 }
 
+                // METADATA_ATTACHMENT_BLOCK
+                if (!self.strip) blk: {
+                    const dbg = func.global.ptrConst(self).dbg;
+
+                    if (dbg == .none) break :blk;
+
+                    const MetadataAttachmentBlock = ir.MetadataAttachmentBlock;
+                    var metadata_attach_block = try function_block.enterSubBlock(MetadataAttachmentBlock);
+
+                    try metadata_attach_block.writeAbbrev(MetadataAttachmentBlock.AttachmentSingle{
+                        .id = @intFromEnum(MetadataKind.dbg),
+                        .metadata = @enumFromInt(metadata_adapter.getMetadataIndex(dbg) - 1),
+                    });
+
+                    try metadata_attach_block.end();
+                }
+
                 try function_block.end();
             }
         }
src/codegen/llvm/ir.zig
@@ -580,6 +580,42 @@ pub const Constants = struct {
     };
 };
 
+pub const MetadataKindBlock = struct {
+    pub const id = 22;
+
+    pub const abbrevs = [_]type{
+        Kind,
+    };
+
+    pub const Kind = struct {
+        pub const ops = [_]AbbrevOp{
+            .{ .literal = 6 },
+            .{ .vbr = 4 },
+            .{ .array_fixed = 8 },
+        };
+        id: u32,
+        name: []const u8,
+    };
+};
+
+pub const MetadataAttachmentBlock = struct {
+    pub const id = 16;
+
+    pub const abbrevs = [_]type{
+        AttachmentSingle,
+    };
+
+    pub const AttachmentSingle = struct {
+        pub const ops = [_]AbbrevOp{
+            .{ .literal = 11 },
+            .{ .vbr = 4 },
+            MetadataAbbrev,
+        };
+        id: u32,
+        metadata: Builder.Metadata,
+    };
+};
+
 pub const MetadataBlock = struct {
     pub const id = 15;