diff options
| author | antlilja <liljaanton2001@gmail.com> | 2024-02-24 01:36:20 +0100 |
|---|---|---|
| committer | antlilja <liljaanton2001@gmail.com> | 2024-02-24 02:28:00 +0100 |
| commit | 9b39e824cdd523ec32b33d630ea9a58ca6fd4103 (patch) | |
| tree | fa4fa288c07fd9f80065e8449aea78cc0fa057d6 /src/codegen | |
| parent | ceb2c030c43da90ac38e67388e934a3ce76d25a7 (diff) | |
| download | zig-9b39e824cdd523ec32b33d630ea9a58ca6fd4103.tar.gz zig-9b39e824cdd523ec32b33d630ea9a58ca6fd4103.zip | |
Builder: Emit metadata attachment for globals
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/llvm/Builder.zig | 27 | ||||
| -rw-r--r-- | src/codegen/llvm/ir.zig | 22 |
2 files changed, 41 insertions, 8 deletions
diff --git a/src/codegen/llvm/Builder.zig b/src/codegen/llvm/Builder.zig index 88c39055b1..bc2a534e98 100644 --- a/src/codegen/llvm/Builder.zig +++ b/src/codegen/llvm/Builder.zig @@ -13853,16 +13853,12 @@ 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| { + inline for (@typeInfo(ir.MetadataKind).Enum.fields) |field| { try metadata_kind_block.writeAbbrev(MetadataKindBlock.Kind{ .id = field.value, .name = field.name, @@ -14296,6 +14292,25 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co }); } + // Write global attached metadata + { + for (globals.keys()) |global| { + const global_ptr = global.ptrConst(self); + if (global_ptr.dbg == .none) continue; + + switch (global_ptr.kind) { + .function => |f| if (f.ptrConst(self).instructions.len != 0) continue, + else => {}, + } + + try metadata_block.writeAbbrev(MetadataBlock.GlobalDeclAttachment{ + .value = @enumFromInt(constant_adapter.getConstantIndex(global.toConst())), + .kind = ir.MetadataKind.dbg, + .metadata = @enumFromInt(metadata_adapter.getMetadataIndex(global_ptr.dbg) - 1), + }); + } + } + try metadata_block.end(); } @@ -14909,7 +14924,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co var metadata_attach_block = try function_block.enterSubBlock(MetadataAttachmentBlock); try metadata_attach_block.writeAbbrev(MetadataAttachmentBlock.AttachmentSingle{ - .id = @intFromEnum(MetadataKind.dbg), + .kind = ir.MetadataKind.dbg, .metadata = @enumFromInt(metadata_adapter.getMetadataIndex(dbg) - 1), }); diff --git a/src/codegen/llvm/ir.zig b/src/codegen/llvm/ir.zig index 7165d714c0..bde52f7d8b 100644 --- a/src/codegen/llvm/ir.zig +++ b/src/codegen/llvm/ir.zig @@ -20,6 +20,10 @@ const ColumnAbbrev = AbbrevOp{ .vbr = 8 }; const BlockAbbrev = AbbrevOp{ .vbr = 6 }; +pub const MetadataKind = enum(u1) { + dbg = 0, +}; + pub const Identification = struct { pub const id = 13; @@ -616,10 +620,10 @@ pub const MetadataAttachmentBlock = struct { pub const AttachmentSingle = struct { pub const ops = [_]AbbrevOp{ .{ .literal = 11 }, - .{ .vbr = 4 }, + .{ .fixed = 1 }, MetadataAbbrev, }; - id: u32, + kind: MetadataKind, metadata: Builder.Metadata, }; }; @@ -649,6 +653,7 @@ pub const MetadataBlock = struct { Constant, Name, NamedNode, + GlobalDeclAttachment, }; pub const Strings = struct { @@ -1045,6 +1050,19 @@ pub const MetadataBlock = struct { elements: []const Builder.Metadata, }; + + pub const GlobalDeclAttachment = struct { + pub const ops = [_]AbbrevOp{ + .{ .literal = 36 }, + ValueAbbrev, // value id + .{ .fixed = 1 }, // kind + MetadataAbbrev, // elements + }; + + value: Builder.Constant, + kind: MetadataKind, + metadata: Builder.Metadata, + }; }; pub const FunctionMetadataBlock = struct { |
