aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/llvm.zig10
-rw-r--r--src/codegen/llvm/bindings.zig5
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 {