aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorRobin Voetter <robin@voetter.nl>2021-12-20 03:58:19 +0100
committerRobin Voetter <robin@voetter.nl>2021-12-21 01:41:51 +0100
commit58d67a6718d5d0673389fa19f5bb20812b4bb22a (patch)
treef18a6306939c3564929548b4e7a4f0a026fc8c00 /src/codegen
parentc47ed0c912d2f445710fe4486fa071dd63601989 (diff)
downloadzig-58d67a6718d5d0673389fa19f5bb20812b4bb22a.tar.gz
zig-58d67a6718d5d0673389fa19f5bb20812b4bb22a.zip
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.
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/llvm.zig28
1 files changed, 16 insertions, 12 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 209e3fb4de..07fe138786 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -761,21 +761,25 @@ pub const DeclGen = struct {
dg.context.intType(8);
return llvm_elem_ty.pointerType(llvm_addrspace);
},
- .Opaque => {
- const gop = try dg.object.type_map.getOrPut(gpa, t);
- if (gop.found_existing) return gop.value_ptr.*;
+ .Opaque => switch (t.tag()) {
+ .@"opaque" => {
+ const gop = try dg.object.type_map.getOrPut(gpa, t);
+ if (gop.found_existing) return gop.value_ptr.*;
- // The Type memory is ephemeral; since we want to store a longer-lived
- // reference, we need to copy it here.
- gop.key_ptr.* = try t.copy(dg.object.type_map_arena.allocator());
+ // The Type memory is ephemeral; since we want to store a longer-lived
+ // reference, we need to copy it here.
+ gop.key_ptr.* = try t.copy(dg.object.type_map_arena.allocator());
- const opaque_obj = t.castTag(.@"opaque").?.data;
- const name = try opaque_obj.getFullyQualifiedName(gpa);
- defer gpa.free(name);
+ const opaque_obj = t.castTag(.@"opaque").?.data;
+ const name = try opaque_obj.getFullyQualifiedName(gpa);
+ defer gpa.free(name);
- const llvm_struct_ty = dg.context.structCreateNamed(name);
- gop.value_ptr.* = llvm_struct_ty; // must be done before any recursive calls
- return llvm_struct_ty;
+ const llvm_struct_ty = dg.context.structCreateNamed(name);
+ gop.value_ptr.* = llvm_struct_ty; // must be done before any recursive calls
+ return llvm_struct_ty;
+ },
+ .anyopaque => return dg.context.intType(8),
+ else => unreachable,
},
.Array => {
const elem_type = try dg.llvmType(t.childType());