Fix constant slice initialization for wasm64p32

This commit is contained in:
gingerBill
2023-06-06 22:51:51 +01:00
parent 4a75a1e839
commit 1c2a30d7e9
2 changed files with 26 additions and 10 deletions

View File

@@ -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};

View File

@@ -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);
}