aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorantlilja <liljaanton2001@gmail.com>2024-02-24 01:36:20 +0100
committerantlilja <liljaanton2001@gmail.com>2024-02-24 02:28:00 +0100
commit9b39e824cdd523ec32b33d630ea9a58ca6fd4103 (patch)
treefa4fa288c07fd9f80065e8449aea78cc0fa057d6 /src/codegen
parentceb2c030c43da90ac38e67388e934a3ce76d25a7 (diff)
downloadzig-9b39e824cdd523ec32b33d630ea9a58ca6fd4103.tar.gz
zig-9b39e824cdd523ec32b33d630ea9a58ca6fd4103.zip
Builder: Emit metadata attachment for globals
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/llvm/Builder.zig27
-rw-r--r--src/codegen/llvm/ir.zig22
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 {