diff options
| author | antlilja <liljaanton2001@gmail.com> | 2024-02-22 15:29:28 +0100 |
|---|---|---|
| committer | antlilja <liljaanton2001@gmail.com> | 2024-02-22 15:29:28 +0100 |
| commit | de536e84739e949ed5bd85be9a263f74c70e7b94 (patch) | |
| tree | 8b7b2821b66dde4a3be8e0ccbd9aa3f52720c2ff /src/codegen | |
| parent | 92eec8dfec6b02465cdf36cfcc594465623a5c65 (diff) | |
| download | zig-de536e84739e949ed5bd85be9a263f74c70e7b94.tar.gz zig-de536e84739e949ed5bd85be9a263f74c70e7b94.zip | |
LLVM Builder: Emit metadata kinds and function metadata attachments
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/llvm/Builder.zig | 36 | ||||
| -rw-r--r-- | src/codegen/llvm/ir.zig | 36 |
2 files changed, 72 insertions, 0 deletions
diff --git a/src/codegen/llvm/Builder.zig b/src/codegen/llvm/Builder.zig index 57ed36b755..f9ecbdf7b9 100644 --- a/src/codegen/llvm/Builder.zig +++ b/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(); } } diff --git a/src/codegen/llvm/ir.zig b/src/codegen/llvm/ir.zig index 21a842f639..50a8f65654 100644 --- a/src/codegen/llvm/ir.zig +++ b/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; |
