authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-12-20 03:58:19+01:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-12-21 01:41:51+01:00
log58d67a6718d5d0673389fa19f5bb20812b4bb22a
treef18a6306939c3564929548b4e7a4f0a026fc8c00
parentc47ed0c912d2f445710fe4486fa071dd63601989

stage2: make anyopaque sized

While this is technically incorrect, proper handling of anyopaque, as well as regular opaque, is probably best left until pointers to zero-sized types having no bits is abolished.

2 files changed, 17 insertions(+), 13 deletions(-)

src/codegen/llvm.zig+16-12
...@@ -761,21 +761,25 @@ pub const DeclGen = struct {...@@ -761,21 +761,25 @@ pub const DeclGen = struct {
761 dg.context.intType(8);761 dg.context.intType(8);
762 return llvm_elem_ty.pointerType(llvm_addrspace);762 return llvm_elem_ty.pointerType(llvm_addrspace);
763 },763 },
764 .Opaque => {764 .Opaque => switch (t.tag()) {
765 const gop = try dg.object.type_map.getOrPut(gpa, t);765 .@"opaque" => {
766 if (gop.found_existing) return gop.value_ptr.*;766 const gop = try dg.object.type_map.getOrPut(gpa, t);
767 if (gop.found_existing) return gop.value_ptr.*;
767768
768 // The Type memory is ephemeral; since we want to store a longer-lived769 // The Type memory is ephemeral; since we want to store a longer-lived
769 // reference, we need to copy it here.770 // reference, we need to copy it here.
770 gop.key_ptr.* = try t.copy(dg.object.type_map_arena.allocator());771 gop.key_ptr.* = try t.copy(dg.object.type_map_arena.allocator());
771772
772 const opaque_obj = t.castTag(.@"opaque").?.data;773 const opaque_obj = t.castTag(.@"opaque").?.data;
773 const name = try opaque_obj.getFullyQualifiedName(gpa);774 const name = try opaque_obj.getFullyQualifiedName(gpa);
774 defer gpa.free(name);775 defer gpa.free(name);
775776
776 const llvm_struct_ty = dg.context.structCreateNamed(name);777 const llvm_struct_ty = dg.context.structCreateNamed(name);
777 gop.value_ptr.* = llvm_struct_ty; // must be done before any recursive calls778 gop.value_ptr.* = llvm_struct_ty; // must be done before any recursive calls
778 return llvm_struct_ty;779 return llvm_struct_ty;
780 },
781 .anyopaque => return dg.context.intType(8),
782 else => unreachable,
779 },783 },
780 .Array => {784 .Array => {
781 const elem_type = try dg.llvmType(t.childType());785 const elem_type = try dg.llvmType(t.childType());
src/type.zig+1-1
...@@ -1575,6 +1575,7 @@ pub const Type = extern union {...@@ -1575,6 +1575,7 @@ pub const Type = extern union {
1575 .extern_options,1575 .extern_options,
1576 .@"anyframe",1576 .@"anyframe",
1577 .anyframe_T,1577 .anyframe_T,
1578 .anyopaque,
1578 .@"opaque",1579 .@"opaque",
1579 .single_const_pointer,1580 .single_const_pointer,
1580 .single_mut_pointer,1581 .single_mut_pointer,
...@@ -1654,7 +1655,6 @@ pub const Type = extern union {...@@ -1654,7 +1655,6 @@ pub const Type = extern union {
1654 return payload.error_set.hasCodeGenBits() or payload.payload.hasCodeGenBits();1655 return payload.error_set.hasCodeGenBits() or payload.payload.hasCodeGenBits();
1655 },1656 },
16561657
1657 .anyopaque,
1658 .void,1658 .void,
1659 .type,1659 .type,
1660 .comptime_int,1660 .comptime_int,