diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-09-20 16:48:42 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-09-20 16:48:42 -0700 |
| commit | abc30f79489b68f6dc0ee4b408c63a8e783215d1 (patch) | |
| tree | 0979982ebfa529405ae0e6014f910a3cf496aa14 /src | |
| parent | 4b2d7a9c67760aa9a81bfd364ac0d88cbb9737f1 (diff) | |
| download | zig-abc30f79489b68f6dc0ee4b408c63a8e783215d1.tar.gz zig-abc30f79489b68f6dc0ee4b408c63a8e783215d1.zip | |
stage2: improve handling of 0 bit types
* Sema: zirAtomicLoad handles 0-bit types correctly
* LLVM backend: when lowering function types, elide parameters
with 0-bit types.
* Type: abiSize handles u0/i0 correctly
Diffstat (limited to 'src')
| -rw-r--r-- | src/Sema.zig | 4 | ||||
| -rw-r--r-- | src/codegen/llvm.zig | 18 | ||||
| -rw-r--r-- | src/type.zig | 1 |
3 files changed, 16 insertions, 7 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index f53dbea90c..990aa4ddf0 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -7803,6 +7803,10 @@ fn zirAtomicLoad(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Compile else => {}, } + if (try sema.typeHasOnePossibleValue(block, elem_ty_src, elem_ty)) |val| { + return sema.addConstant(elem_ty, val); + } + if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| { if (try ptr_val.pointerDeref(sema.arena)) |elem_val| { return sema.addConstant(elem_ty, elem_val); diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 2e835260af..2f703e2d68 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -541,17 +541,21 @@ pub const DeclGen = struct { defer self.gpa.free(fn_param_types); zig_fn_type.fnParamTypes(fn_param_types); - const llvm_param = try self.gpa.alloc(*const llvm.Type, fn_param_len); - defer self.gpa.free(llvm_param); - - for (fn_param_types) |fn_param, i| { - llvm_param[i] = try self.llvmType(fn_param); + const llvm_param_buffer = try self.gpa.alloc(*const llvm.Type, fn_param_len); + defer self.gpa.free(llvm_param_buffer); + + var llvm_params_len: c_uint = 0; + for (fn_param_types) |fn_param| { + if (fn_param.hasCodeGenBits()) { + llvm_param_buffer[llvm_params_len] = try self.llvmType(fn_param); + llvm_params_len += 1; + } } const fn_type = llvm.functionType( try self.llvmType(return_type), - llvm_param.ptr, - @intCast(c_uint, fn_param_len), + llvm_param_buffer.ptr, + llvm_params_len, .False, ); const llvm_fn = self.llvmModule().addFunction(decl.name, fn_type); diff --git a/src/type.zig b/src/type.zig index 122faefbc7..c2dc150347 100644 --- a/src/type.zig +++ b/src/type.zig @@ -1822,6 +1822,7 @@ pub const Type = extern union { .int_signed, .int_unsigned => { const bits: u16 = self.cast(Payload.Bits).?.data; + if (bits == 0) return 0; return std.math.ceilPowerOfTwoPromote(u16, (bits + 7) / 8); }, |
