aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-06-06 22:51:51 +0100
committergingerBill <bill@gingerbill.org>2023-06-06 22:51:51 +0100
commit1c2a30d7e9a0f2ce29d2e8c2f06adf83d16779ac (patch)
tree68a55d95bbf03894a257b69c0ea384cf5782affb /src
parent4a75a1e839252e7719e4126e0e98dd647850f91d (diff)
Fix constant slice initialization for wasm64p32
Diffstat (limited to 'src')
-rw-r--r--src/llvm_backend_const.cpp26
-rw-r--r--src/llvm_backend_type.cpp10
2 files changed, 26 insertions, 10 deletions
diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp
index 8149b1eda..c8f1fea0f 100644
--- a/src/llvm_backend_const.cpp
+++ b/src/llvm_backend_const.cpp
@@ -180,17 +180,33 @@ gb_internal LLVMValueRef llvm_const_array(LLVMTypeRef elem_type, LLVMValueRef *v
return LLVMConstArray(elem_type, values, value_count);
}
+gb_internal LLVMValueRef llvm_const_slice_internal(lbModule *m, LLVMValueRef data, LLVMValueRef len) {
+ if (build_context.metrics.ptr_size < build_context.metrics.int_size) {
+ GB_ASSERT(build_context.metrics.ptr_size == 4);
+ GB_ASSERT(build_context.metrics.int_size == 8);
+ LLVMValueRef vals[3] = {
+ data,
+ LLVMConstNull(lb_type(m, t_u32)),
+ len,
+ };
+ return LLVMConstStructInContext(m->ctx, vals, gb_count_of(vals), false);
+ } else {
+ LLVMValueRef vals[2] = {
+ data,
+ len,
+ };
+ return LLVMConstStructInContext(m->ctx, vals, gb_count_of(vals), false);
+ }
+}
gb_internal LLVMValueRef llvm_const_slice(lbModule *m, lbValue data, lbValue len) {
GB_ASSERT(is_type_pointer(data.type) || is_type_multi_pointer(data.type));
GB_ASSERT(are_types_identical(len.type, t_int));
- LLVMValueRef vals[2] = {
- data.value,
- len.value,
- };
- return LLVMConstStructInContext(m->ctx, vals, gb_count_of(vals), false);
+
+ return llvm_const_slice_internal(m, data.value, len.value);
}
+
gb_internal lbValue lb_const_nil(lbModule *m, Type *type) {
LLVMValueRef v = LLVMConstNull(lb_type(m, type));
return lbValue{v, type};
diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp
index eba41a55c..0810ecd11 100644
--- a/src/llvm_backend_type.cpp
+++ b/src/llvm_backend_type.cpp
@@ -157,11 +157,11 @@ gb_internal void lb_setup_type_info_data(lbProcedure *p) { // NOTE(bill): Setup
global_type_info_data_entity_count = type->Array.count;
LLVMValueRef indices[2] = {llvm_zero(m), llvm_zero(m)};
- LLVMValueRef values[2] = {
- LLVMConstInBoundsGEP2(lb_type(m, lb_global_type_info_data_entity->type), lb_global_type_info_data_ptr(m).value, indices, gb_count_of(indices)),
- LLVMConstInt(lb_type(m, t_int), type->Array.count, true),
- };
- LLVMValueRef slice = llvm_const_named_struct_internal(lb_type(m, type_deref(global_type_table.type)), values, gb_count_of(values));
+ LLVMValueRef data = LLVMConstInBoundsGEP2(lb_type(m, lb_global_type_info_data_entity->type), lb_global_type_info_data_ptr(m).value, indices, gb_count_of(indices));
+ LLVMValueRef len = LLVMConstInt(lb_type(m, t_int), type->Array.count, true);
+ Type *t = type_deref(global_type_table.type);
+ GB_ASSERT(is_type_slice(t));
+ LLVMValueRef slice = llvm_const_slice_internal(m, data, len);
LLVMSetInitializer(global_type_table.value, slice);
}