diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2024-02-23 07:51:02 +0100 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2024-02-23 07:51:38 +0100 |
| commit | 6abb432598c2d9b4395cc4d86d7d69663b4a0ad0 (patch) | |
| tree | a0c43e1b5aaa9a864b94e8a7406cc07046209b86 /src/codegen | |
| parent | 43daed64fe8ce6e18571154adfea37ace2d84a34 (diff) | |
| download | zig-6abb432598c2d9b4395cc4d86d7d69663b4a0ad0.tar.gz zig-6abb432598c2d9b4395cc4d86d7d69663b4a0ad0.zip | |
Builder: implement opaque structs in bitcode
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/llvm/Builder.zig | 27 | ||||
| -rw-r--r-- | src/codegen/llvm/ir.zig | 8 |
2 files changed, 24 insertions, 11 deletions
diff --git a/src/codegen/llvm/Builder.zig b/src/codegen/llvm/Builder.zig index 02f5ce7d16..7bbfb4426a 100644 --- a/src/codegen/llvm/Builder.zig +++ b/src/codegen/llvm/Builder.zig @@ -13015,18 +13015,23 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co .string = extra.id.slice(self).?, }); - const real_struct = self.type_items.items[@intFromEnum(extra.body)]; - const is_packed: bool = switch (real_struct.tag) { - .structure => false, - .packed_structure => true, - else => unreachable, - }; + switch (extra.body) { + .none => try type_block.writeAbbrev(ir.Type.Opaque{}), + else => { + const real_struct = self.type_items.items[@intFromEnum(extra.body)]; + const is_packed: bool = switch (real_struct.tag) { + .structure => false, + .packed_structure => true, + else => unreachable, + }; - var real_extra = self.typeExtraDataTrail(Type.Structure, real_struct.data); - try type_block.writeAbbrev(ir.Type.StructNamed{ - .is_packed = is_packed, - .types = real_extra.trail.next(real_extra.data.fields_len, Type, self), - }); + var real_extra = self.typeExtraDataTrail(Type.Structure, real_struct.data); + try type_block.writeAbbrev(ir.Type.StructNamed{ + .is_packed = is_packed, + .types = real_extra.trail.next(real_extra.data.fields_len, Type, self), + }); + }, + } }, .array, .small_array, diff --git a/src/codegen/llvm/ir.zig b/src/codegen/llvm/ir.zig index df234a6cc4..1b855cb7df 100644 --- a/src/codegen/llvm/ir.zig +++ b/src/codegen/llvm/ir.zig @@ -188,6 +188,7 @@ pub const Type = struct { pub const abbrevs = [_]type{ NumEntry, Simple, + Opaque, Integer, StructAnon, StructNamed, @@ -214,6 +215,13 @@ pub const Type = struct { code: u5, }; + pub const Opaque = struct { + pub const ops = [_]AbbrevOp{ + .{ .literal = 6 }, + .{ .literal = 0 }, + }; + }; + pub const Integer = struct { pub const ops = [_]AbbrevOp{ .{ .literal = 7 }, |
