diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-10-25 19:41:19 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-25 19:41:19 -0400 |
| commit | df198ea60e05664b5b72a43aae815fa06d94c19c (patch) | |
| tree | edf13ce2d73ab17a56d6b07b4734b97260bde3eb /src/codegen/llvm.zig | |
| parent | 30d01c8fea68baab396081da040f49defa494088 (diff) | |
| parent | 21bf3b80666c14c9b2a2e1ec984a6b4bb23a5bb7 (diff) | |
| download | zig-df198ea60e05664b5b72a43aae815fa06d94c19c.tar.gz zig-df198ea60e05664b5b72a43aae815fa06d94c19c.zip | |
Merge pull request #10034 from Snektron/stage2-slice
stage2: slice and optional improvements
Diffstat (limited to 'src/codegen/llvm.zig')
| -rw-r--r-- | src/codegen/llvm.zig | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 80625928cb..ca9e973354 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -767,7 +767,7 @@ pub const DeclGen = struct { } const llvm_addrspace = dg.llvmAddressSpace(t.ptrAddressSpace()); const elem_ty = t.childType(); - const llvm_elem_ty = if (elem_ty.hasCodeGenBits()) + const llvm_elem_ty = if (elem_ty.hasCodeGenBits() or elem_ty.zigTypeTag() == .Array) try dg.llvmType(elem_ty) else dg.context.intType(8); @@ -1480,7 +1480,7 @@ pub const DeclGen = struct { } const llvm_type = try self.llvmType(tv.ty); - if (!tv.ty.childType().hasCodeGenBits()) { + if (!tv.ty.childType().hasCodeGenBits() or !decl.ty.hasCodeGenBits()) { return self.lowerPtrToVoid(tv.ty); } @@ -1502,7 +1502,7 @@ pub const DeclGen = struct { // for non-optional pointers. We also need to respect the alignment, even though // the address will never be dereferenced. const llvm_usize = try dg.llvmType(Type.usize); - const llvm_ptr_ty = dg.context.intType(8).pointerType(0); + const llvm_ptr_ty = try dg.llvmType(ptr_ty); if (alignment != 0) { return llvm_usize.constInt(alignment, .False).constIntToPtr(llvm_ptr_ty); } @@ -2475,6 +2475,12 @@ pub const FuncGen = struct { const operand = try self.resolveInst(un_op); const operand_ty = self.air.typeOf(un_op); const optional_ty = if (operand_is_ptr) operand_ty.childType() else operand_ty; + if (optional_ty.isPtrLikeOptional()) { + const optional_llvm_ty = try self.dg.llvmType(optional_ty); + const loaded = if (operand_is_ptr) self.builder.buildLoad(operand, "") else operand; + return self.builder.buildICmp(pred, loaded, optional_llvm_ty.constNull(), ""); + } + var buf: Type.Payload.ElemType = undefined; const payload_ty = optional_ty.optionalChild(&buf); if (!payload_ty.hasCodeGenBits()) { @@ -2484,11 +2490,6 @@ pub const FuncGen = struct { return operand; } } - if (optional_ty.isPtrLikeOptional()) { - const optional_llvm_ty = try self.dg.llvmType(optional_ty); - const loaded = if (operand_is_ptr) self.builder.buildLoad(operand, "") else operand; - return self.builder.buildICmp(pred, loaded, optional_llvm_ty.constNull(), ""); - } if (operand_is_ptr or isByRef(optional_ty)) { const index_type = self.context.intType(32); |
