diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-10-13 17:53:28 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-10-13 17:53:28 -0700 |
| commit | df7d6d263e4ad6adb302856235641ae9ceb142b6 (patch) | |
| tree | 186182733c89cec8fa990a681ab8e6f915d15908 /src/codegen/llvm.zig | |
| parent | da7fcfd1586fa93c3d00815f60030e00ea583701 (diff) | |
| download | zig-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.zig | 21 |
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, |
