authorgravatar for liljaanton2001@gmail.comantlilja <liljaanton2001@gmail.com> 2024-02-24 01:36:20+01:00
committergravatar for liljaanton2001@gmail.comantlilja <liljaanton2001@gmail.com> 2024-02-24 02:28:00+01:00
log9b39e824cdd523ec32b33d630ea9a58ca6fd4103
treefa4fa288c07fd9f80065e8449aea78cc0fa057d6
parentceb2c030c43da90ac38e67388e934a3ce76d25a7

Builder: Emit metadata attachment for globals


2 files changed, 41 insertions(+), 8 deletions(-)

src/codegen/llvm/Builder.zig+21-6
...@@ -13853,16 +13853,12 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co...@@ -13853,16 +13853,12 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
13853 try constants_block.end();13853 try constants_block.end();
13854 }13854 }
1385513855
13856 const MetadataKind = enum(u8) {
13857 dbg = 0,
13858 };
13859
13860 // METADATA_KIND_BLOCK13856 // METADATA_KIND_BLOCK
13861 if (!self.strip) {13857 if (!self.strip) {
13862 const MetadataKindBlock = ir.MetadataKindBlock;13858 const MetadataKindBlock = ir.MetadataKindBlock;
13863 var metadata_kind_block = try module_block.enterSubBlock(MetadataKindBlock);13859 var metadata_kind_block = try module_block.enterSubBlock(MetadataKindBlock);
1386413860
13865 inline for (@typeInfo(MetadataKind).Enum.fields) |field| {13861 inline for (@typeInfo(ir.MetadataKind).Enum.fields) |field| {
13866 try metadata_kind_block.writeAbbrev(MetadataKindBlock.Kind{13862 try metadata_kind_block.writeAbbrev(MetadataKindBlock.Kind{
13867 .id = field.value,13863 .id = field.value,
13868 .name = field.name,13864 .name = field.name,
...@@ -14296,6 +14292,25 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co...@@ -14296,6 +14292,25 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
14296 });14292 });
14297 }14293 }
1429814294
14295 // Write global attached metadata
14296 {
14297 for (globals.keys()) |global| {
14298 const global_ptr = global.ptrConst(self);
14299 if (global_ptr.dbg == .none) continue;
14300
14301 switch (global_ptr.kind) {
14302 .function => |f| if (f.ptrConst(self).instructions.len != 0) continue,
14303 else => {},
14304 }
14305
14306 try metadata_block.writeAbbrev(MetadataBlock.GlobalDeclAttachment{
14307 .value = @enumFromInt(constant_adapter.getConstantIndex(global.toConst())),
14308 .kind = ir.MetadataKind.dbg,
14309 .metadata = @enumFromInt(metadata_adapter.getMetadataIndex(global_ptr.dbg) - 1),
14310 });
14311 }
14312 }
14313
14299 try metadata_block.end();14314 try metadata_block.end();
14300 }14315 }
1430114316
...@@ -14909,7 +14924,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co...@@ -14909,7 +14924,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
14909 var metadata_attach_block = try function_block.enterSubBlock(MetadataAttachmentBlock);14924 var metadata_attach_block = try function_block.enterSubBlock(MetadataAttachmentBlock);
1491014925
14911 try metadata_attach_block.writeAbbrev(MetadataAttachmentBlock.AttachmentSingle{14926 try metadata_attach_block.writeAbbrev(MetadataAttachmentBlock.AttachmentSingle{
14912 .id = @intFromEnum(MetadataKind.dbg),14927 .kind = ir.MetadataKind.dbg,
14913 .metadata = @enumFromInt(metadata_adapter.getMetadataIndex(dbg) - 1),14928 .metadata = @enumFromInt(metadata_adapter.getMetadataIndex(dbg) - 1),
14914 });14929 });
1491514930
src/codegen/llvm/ir.zig+20-2
...@@ -20,6 +20,10 @@ const ColumnAbbrev = AbbrevOp{ .vbr = 8 };...@@ -20,6 +20,10 @@ const ColumnAbbrev = AbbrevOp{ .vbr = 8 };
2020
21const BlockAbbrev = AbbrevOp{ .vbr = 6 };21const BlockAbbrev = AbbrevOp{ .vbr = 6 };
2222
23pub const MetadataKind = enum(u1) {
24 dbg = 0,
25};
26
23pub const Identification = struct {27pub const Identification = struct {
24 pub const id = 13;28 pub const id = 13;
2529
...@@ -616,10 +620,10 @@ pub const MetadataAttachmentBlock = struct {...@@ -616,10 +620,10 @@ pub const MetadataAttachmentBlock = struct {
616 pub const AttachmentSingle = struct {620 pub const AttachmentSingle = struct {
617 pub const ops = [_]AbbrevOp{621 pub const ops = [_]AbbrevOp{
618 .{ .literal = 11 },622 .{ .literal = 11 },
619 .{ .vbr = 4 },623 .{ .fixed = 1 },
620 MetadataAbbrev,624 MetadataAbbrev,
621 };625 };
622 id: u32,626 kind: MetadataKind,
623 metadata: Builder.Metadata,627 metadata: Builder.Metadata,
624 };628 };
625};629};
...@@ -649,6 +653,7 @@ pub const MetadataBlock = struct {...@@ -649,6 +653,7 @@ pub const MetadataBlock = struct {
649 Constant,653 Constant,
650 Name,654 Name,
651 NamedNode,655 NamedNode,
656 GlobalDeclAttachment,
652 };657 };
653658
654 pub const Strings = struct {659 pub const Strings = struct {
...@@ -1045,6 +1050,19 @@ pub const MetadataBlock = struct {...@@ -1045,6 +1050,19 @@ pub const MetadataBlock = struct {
10451050
1046 elements: []const Builder.Metadata,1051 elements: []const Builder.Metadata,
1047 };1052 };
1053
1054 pub const GlobalDeclAttachment = struct {
1055 pub const ops = [_]AbbrevOp{
1056 .{ .literal = 36 },
1057 ValueAbbrev, // value id
1058 .{ .fixed = 1 }, // kind
1059 MetadataAbbrev, // elements
1060 };
1061
1062 value: Builder.Constant,
1063 kind: MetadataKind,
1064 metadata: Builder.Metadata,
1065 };
1048};1066};
10491067
1050pub const FunctionMetadataBlock = struct {1068pub const FunctionMetadataBlock = struct {