From de536e84739e949ed5bd85be9a263f74c70e7b94 Mon Sep 17 00:00:00 2001 From: antlilja Date: Thu, 22 Feb 2024 15:29:28 +0100 Subject: [PATCH] LLVM Builder: Emit metadata kinds and function metadata attachments --- src/codegen/llvm/Builder.zig | 36 ++++++++++++++++++++++++++++++++++++ src/codegen/llvm/ir.zig | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) 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;