LLVM Builder: Emit metadata kinds and function metadata attachments

This commit is contained in:
antlilja 2024-02-22 15:29:28 +01:00
parent 92eec8dfec
commit de536e8473
2 changed files with 72 additions and 0 deletions

View File

@ -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();
}
}

View File

@ -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;