mirror of
https://github.com/odin-lang/Odin.git
synced 2026-06-06 18:54:12 +00:00
Fix constant slice initialization for wasm64p32
This commit is contained in:
@@ -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};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user