diff options
| author | gingerBill <bill@gingerbill.org> | 2021-04-06 11:07:05 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-04-06 11:07:05 +0100 |
| commit | 535048e2b3f2d2752f2b0a36e0854dcd886e1573 (patch) | |
| tree | 38db1e6224a5797722fc6ba564fe6fef036db683 /src/llvm_backend.cpp | |
| parent | 050d6f670eae5505254f9eb6f9e93f98fa5d273e (diff) | |
Fix `LLVMConstIntOfArbitraryPrecision` usage for a pointer
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 3f439fd35..0adb25f72 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -5797,12 +5797,17 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, bool allow_loc case ExactValue_Integer: if (is_type_pointer(type)) { - LLVMValueRef i = LLVMConstIntOfArbitraryPrecision(lb_type(m, t_uintptr), cast(unsigned)value.value_integer.len, big_int_ptr(&value.value_integer)); - res.value = LLVMConstIntToPtr(i, lb_type(m, original_type)); + unsigned len = cast(unsigned)value.value_integer.len; + LLVMTypeRef t = lb_type(m, t_uintptr); + if (len == 0) { + res.value = LLVMConstNull(t); + } else { + LLVMValueRef i = LLVMConstIntOfArbitraryPrecision(t, len, big_int_ptr(&value.value_integer)); + res.value = LLVMConstIntToPtr(i, lb_type(m, original_type)); + } } else { unsigned len = cast(unsigned)value.value_integer.len; if (len == 0) { - u64 word = 0; res.value = LLVMConstNull(lb_type(m, original_type)); } else { u64 *words = big_int_ptr(&value.value_integer); |