aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-07-13 18:32:53 +0100
committergingerBill <bill@gingerbill.org>2021-07-13 18:32:53 +0100
commit74c019f2717d4a885907a5833bed5028e02abc77 (patch)
tree613dd33401b16a025755a71a3d7a5a1723391c3a /src/llvm_backend.cpp
parenta745bb8f42c5e96737595f44037009f93a1eb7c0 (diff)
Correct `lb_big_int_to_llvm`
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp19
1 files changed, 10 insertions, 9 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 4f832f8d9..ef6a816e2 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -6367,32 +6367,33 @@ LLVMValueRef lb_big_int_to_llvm(lbModule *m, Type *original_type, BigInt const *
return LLVMConstNull(lb_type(m, original_type));
}
- u8 *rop = nullptr;
+ size_t sz = cast(size_t)type_size_of(original_type);
+ u8 rop[64] = {};
size_t max_count = 0;
size_t written = 0;
size_t size = 1;
size_t nails = 0;
- mp_endian endian = MP_NATIVE_ENDIAN;
+ mp_endian endian = MP_LITTLE_ENDIAN;
max_count = mp_pack_count(a, nails, size);
- rop = cast(u8 *)gb_alloc_align(permanent_allocator(), max_count, gb_align_of(u64));
- mp_err err = mp_pack(rop, max_count, &written,
+ GB_ASSERT(max_count <= sz);
+
+ mp_err err = mp_pack(rop, sz, &written,
MP_LSB_FIRST,
size, endian, nails,
a);
GB_ASSERT(err == MP_OKAY);
- i64 sz = type_size_of(original_type);
- if (is_type_different_to_arch_endianness(original_type)) {
- GB_ASSERT_MSG(sz == cast(i64)written, "max_count: %tu, sz: %lld, written: %tu", max_count, sz, written);
- for (i64 i = 0; i < sz/2; i++) {
+ if (!is_type_endian_little(original_type)) {
+ GB_ASSERT_MSG(sz >= max_count, "max_count: %tu, sz: %tu, written: %tu", max_count, sz, written);
+ for (size_t i = 0; i < sz/2; i++) {
u8 tmp = rop[i];
rop[i] = rop[sz-1-i];
rop[sz-1-i] = tmp;
}
}
- LLVMValueRef value = LLVMConstIntOfArbitraryPrecision(lb_type(m, original_type), cast(unsigned)((written+7)/8), cast(u64 *)rop);
+ LLVMValueRef value = LLVMConstIntOfArbitraryPrecision(lb_type(m, original_type), cast(unsigned)(sz+7/8), cast(u64 *)rop);
if (big_int_is_neg(a)) {
value = LLVMConstNeg(value);
}