diff options
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/llvm.zig | 10 | ||||
| -rw-r--r-- | src/codegen/llvm/bindings.zig | 5 |
2 files changed, 11 insertions, 4 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 22361a1c6e..2ec1cb4708 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -1361,10 +1361,12 @@ pub const DeclGen = struct { .val = field_val, }); const ty_bit_size = @intCast(u16, field.ty.bitSize(target)); - const llvm_int_ty = dg.context.intType(ty_bit_size); - const int_val = non_int_val.constBitCast(llvm_int_ty); - const shift_rhs = llvm_int_ty.constInt(running_bits, .False); - const shifted = int_val.constShl(shift_rhs); + const small_int_ty = dg.context.intType(ty_bit_size); + const small_int_val = non_int_val.constBitCast(small_int_ty); + const big_int_ty = running_int.typeOf(); + const shift_rhs = big_int_ty.constInt(running_bits, .False); + const extended_int_val = small_int_val.constZExt(big_int_ty); + const shifted = extended_int_val.constShl(shift_rhs); running_int = running_int.constOr(shifted); running_bits += ty_bit_size; } else { diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index e6a61ca883..3c85524cc1 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -201,6 +201,11 @@ pub const Value = opaque { pub const addCase = LLVMAddCase; extern fn LLVMAddCase(Switch: *const Value, OnVal: *const Value, Dest: *const BasicBlock) void; + + pub inline fn isPoison(Val: *const Value) bool { + return LLVMIsPoison(Val).toBool(); + } + extern fn LLVMIsPoison(Val: *const Value) Bool; }; pub const Type = opaque { |
