aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/llvm.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-10-13 17:53:28 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-10-13 17:53:28 -0700
commitdf7d6d263e4ad6adb302856235641ae9ceb142b6 (patch)
tree186182733c89cec8fa990a681ab8e6f915d15908 /src/codegen/llvm.zig
parentda7fcfd1586fa93c3d00815f60030e00ea583701 (diff)
downloadzig-df7d6d263e4ad6adb302856235641ae9ceb142b6.tar.gz
zig-df7d6d263e4ad6adb302856235641ae9ceb142b6.zip
stage2: implement opaque declarations
* Module: implement opaque type namespace lookup * Add `Type.type` for convenience * Sema: fix `validateVarType` for pointer-to-opaque * x86_64 ABI: implement support for pointers * LLVM backend: fix lowering of opaque types * Type: implement equality checking for opaques
Diffstat (limited to 'src/codegen/llvm.zig')
-rw-r--r--src/codegen/llvm.zig21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 2e072fbdd6..d7dbeade15 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -758,11 +758,27 @@ pub const DeclGen = struct {
};
return dg.context.structType(&fields, fields.len, .False);
} else {
- const elem_type = try dg.llvmType(t.elemType());
const llvm_addrspace = dg.llvmAddressSpace(t.ptrAddressSpace());
- return elem_type.pointerType(llvm_addrspace);
+ const llvm_elem_ty = try dg.llvmType(t.childType());
+ 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.*;
+
+ // 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 llvm_struct_ty = dg.context.structCreateNamed(name);
+ gop.value_ptr.* = llvm_struct_ty; // must be done before any recursive calls
+ return llvm_struct_ty;
+ },
.Array => {
const elem_type = try dg.llvmType(t.elemType());
const total_len = t.arrayLen() + @boolToInt(t.sentinel() != null);
@@ -896,7 +912,6 @@ pub const DeclGen = struct {
.BoundFn => @panic("TODO remove BoundFn from the language"),
- .Opaque,
.Frame,
.AnyFrame,
.Vector,