aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-04-06 11:07:05 +0100
committergingerBill <bill@gingerbill.org>2021-04-06 11:07:05 +0100
commit535048e2b3f2d2752f2b0a36e0854dcd886e1573 (patch)
tree38db1e6224a5797722fc6ba564fe6fef036db683 /src/llvm_backend.cpp
parent050d6f670eae5505254f9eb6f9e93f98fa5d273e (diff)
Fix `LLVMConstIntOfArbitraryPrecision` usage for a pointer
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp11
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);