mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-04 04:08:19 +00:00
Have basic_type_from_layout take LayoutRepr
This commit is contained in:
parent
555cbcc87b
commit
8495f3b085
10 changed files with 403 additions and 137 deletions
|
@ -113,7 +113,11 @@ pub fn call_bitcode_fn_fixing_for_convention<'a, 'ctx, 'env>(
|
|||
}
|
||||
CCReturn::ByPointer => {
|
||||
// We need to pass the return value by pointer.
|
||||
let roc_return_type = basic_type_from_layout(env, layout_interner, return_layout);
|
||||
let roc_return_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(return_layout),
|
||||
);
|
||||
|
||||
let cc_return_type: BasicTypeEnum<'ctx> = bitcode_return_type.into();
|
||||
|
||||
|
@ -245,7 +249,8 @@ fn build_transform_caller_help<'a, 'ctx>(
|
|||
|
||||
for (argument_ptr, layout) in arguments.iter().zip(argument_layouts) {
|
||||
let basic_type =
|
||||
basic_type_from_layout(env, layout_interner, *layout).ptr_type(AddressSpace::default());
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(*layout))
|
||||
.ptr_type(AddressSpace::default());
|
||||
|
||||
let cast_ptr = env.builder.build_pointer_cast(
|
||||
argument_ptr.into_pointer_value(),
|
||||
|
@ -274,8 +279,9 @@ fn build_transform_caller_help<'a, 'ctx>(
|
|||
// the function doesn't expect a closure argument, nothing to add
|
||||
}
|
||||
(true, layout) => {
|
||||
let closure_type = basic_type_from_layout(env, layout_interner, layout)
|
||||
.ptr_type(AddressSpace::default());
|
||||
let closure_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout))
|
||||
.ptr_type(AddressSpace::default());
|
||||
|
||||
let closure_cast =
|
||||
env.builder
|
||||
|
@ -410,7 +416,8 @@ fn build_rc_wrapper<'a, 'ctx>(
|
|||
|
||||
generic_value_ptr.set_name(Symbol::ARG_1.as_str(&env.interns));
|
||||
|
||||
let value_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let value_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
let value_ptr_type = value_type.ptr_type(AddressSpace::default());
|
||||
let value_ptr =
|
||||
env.builder
|
||||
|
@ -500,8 +507,9 @@ pub fn build_eq_wrapper<'a, 'ctx>(
|
|||
value_ptr1.set_name(Symbol::ARG_1.as_str(&env.interns));
|
||||
value_ptr2.set_name(Symbol::ARG_2.as_str(&env.interns));
|
||||
|
||||
let value_type = basic_type_from_layout(env, layout_interner, layout)
|
||||
.ptr_type(AddressSpace::default());
|
||||
let value_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout))
|
||||
.ptr_type(AddressSpace::default());
|
||||
|
||||
let value_cast1 = env
|
||||
.builder
|
||||
|
@ -590,7 +598,8 @@ pub fn build_compare_wrapper<'a, 'ctx>(
|
|||
value_ptr1.set_name(Symbol::ARG_2.as_str(&env.interns));
|
||||
value_ptr2.set_name(Symbol::ARG_3.as_str(&env.interns));
|
||||
|
||||
let value_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let value_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
let value_ptr_type = value_type.ptr_type(AddressSpace::default());
|
||||
|
||||
let value_cast1 =
|
||||
|
@ -617,8 +626,11 @@ pub fn build_compare_wrapper<'a, 'ctx>(
|
|||
&default
|
||||
}
|
||||
_ => {
|
||||
let closure_type =
|
||||
basic_type_from_layout(env, layout_interner, closure_data_repr);
|
||||
let closure_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(closure_data_repr),
|
||||
);
|
||||
let closure_ptr_type = closure_type.ptr_type(AddressSpace::default());
|
||||
|
||||
let closure_cast = env.builder.build_pointer_cast(
|
||||
|
|
|
@ -1026,7 +1026,8 @@ pub(crate) fn build_exp_expr<'a, 'ctx>(
|
|||
match expr {
|
||||
Literal(literal) => build_exp_literal(env, layout_interner, parent, layout, literal),
|
||||
NullPointer => {
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let basic_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
|
||||
debug_assert!(basic_type.is_pointer_type());
|
||||
basic_type.into_pointer_type().const_zero().into()
|
||||
|
@ -1090,7 +1091,8 @@ pub(crate) fn build_exp_expr<'a, 'ctx>(
|
|||
|
||||
ExprBox { symbol } => {
|
||||
let (value, layout) = scope.load_symbol_and_layout(symbol);
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let basic_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
let allocation = reserve_with_refcount_help(
|
||||
env,
|
||||
basic_type,
|
||||
|
@ -1303,13 +1305,21 @@ pub(crate) fn build_exp_expr<'a, 'ctx>(
|
|||
|
||||
let struct_layout = layout_interner
|
||||
.insert_direct_no_semantic(LayoutRepr::struct_(field_layouts));
|
||||
let struct_type = basic_type_from_layout(env, layout_interner, struct_layout);
|
||||
let struct_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(struct_layout),
|
||||
);
|
||||
|
||||
let opaque_data_ptr = env
|
||||
.builder
|
||||
.new_build_struct_gep(
|
||||
basic_type_from_layout(env, layout_interner, structure_layout)
|
||||
.into_struct_type(),
|
||||
basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(structure_layout),
|
||||
)
|
||||
.into_struct_type(),
|
||||
argument.into_pointer_value(),
|
||||
RocUnion::TAG_DATA_INDEX,
|
||||
"get_opaque_data_ptr",
|
||||
|
@ -1346,7 +1356,11 @@ pub(crate) fn build_exp_expr<'a, 'ctx>(
|
|||
let field_layouts = tag_layouts[*tag_id as usize];
|
||||
|
||||
let ptr = tag_pointer_clear_tag_id(env, argument.into_pointer_value());
|
||||
let target_loaded_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let target_loaded_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
);
|
||||
|
||||
lookup_at_index_ptr2(
|
||||
env,
|
||||
|
@ -1361,8 +1375,16 @@ pub(crate) fn build_exp_expr<'a, 'ctx>(
|
|||
let struct_layout = layout_interner
|
||||
.insert_direct_no_semantic(LayoutRepr::struct_(field_layouts));
|
||||
|
||||
let struct_type = basic_type_from_layout(env, layout_interner, struct_layout);
|
||||
let target_loaded_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let struct_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(struct_layout),
|
||||
);
|
||||
let target_loaded_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
);
|
||||
|
||||
lookup_at_index_ptr(
|
||||
env,
|
||||
|
@ -1390,7 +1412,11 @@ pub(crate) fn build_exp_expr<'a, 'ctx>(
|
|||
let field_layouts = other_tags[tag_index as usize];
|
||||
|
||||
let ptr = tag_pointer_clear_tag_id(env, argument.into_pointer_value());
|
||||
let target_loaded_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let target_loaded_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
);
|
||||
|
||||
lookup_at_index_ptr2(
|
||||
env,
|
||||
|
@ -1412,8 +1438,16 @@ pub(crate) fn build_exp_expr<'a, 'ctx>(
|
|||
let struct_layout = layout_interner
|
||||
.insert_direct_no_semantic(LayoutRepr::struct_(field_layouts));
|
||||
|
||||
let struct_type = basic_type_from_layout(env, layout_interner, struct_layout);
|
||||
let target_loaded_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let struct_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(struct_layout),
|
||||
);
|
||||
let target_loaded_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
);
|
||||
|
||||
lookup_at_index_ptr(
|
||||
env,
|
||||
|
@ -1483,8 +1517,12 @@ fn build_wrapped_tag<'a, 'ctx>(
|
|||
)
|
||||
.unwrap();
|
||||
|
||||
let tag_id_type =
|
||||
basic_type_from_layout(env, layout_interner, tag_id_layout).into_int_type();
|
||||
let tag_id_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(tag_id_layout),
|
||||
)
|
||||
.into_int_type();
|
||||
|
||||
env.builder
|
||||
.build_store(tag_id_ptr, tag_id_type.const_int(tag_id as u64, false));
|
||||
|
@ -1583,7 +1621,11 @@ fn build_tag_fields<'a, 'r, 'ctx, 'env>(
|
|||
let mut field_values = std::vec::Vec::with_capacity(capacity);
|
||||
|
||||
for (field_symbol, tag_field_layout) in arguments.iter().zip(fields.iter()) {
|
||||
let field_type = basic_type_from_layout(env, layout_interner, *tag_field_layout);
|
||||
let field_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(*tag_field_layout),
|
||||
);
|
||||
field_types.push(field_type);
|
||||
|
||||
let raw_value: BasicValueEnum<'ctx> = scope.load_symbol(field_symbol);
|
||||
|
@ -1661,10 +1703,14 @@ fn build_tag<'a, 'ctx>(
|
|||
let layout = layout_interner
|
||||
.insert_direct_no_semantic(LayoutRepr::Union(*union_layout));
|
||||
|
||||
return basic_type_from_layout(env, layout_interner, layout)
|
||||
.into_pointer_type()
|
||||
.const_null()
|
||||
.into();
|
||||
return basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
)
|
||||
.into_pointer_type()
|
||||
.const_null()
|
||||
.into();
|
||||
}
|
||||
Less => &tags[tag_id as usize],
|
||||
Greater => &tags[tag_id as usize - 1],
|
||||
|
@ -1899,8 +1945,12 @@ pub fn get_tag_id<'a, 'ctx>(
|
|||
let builder = env.builder;
|
||||
|
||||
let tag_id_layout = union_layout.tag_id_layout();
|
||||
let tag_id_int_type =
|
||||
basic_type_from_layout(env, layout_interner, tag_id_layout).into_int_type();
|
||||
let tag_id_int_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(tag_id_layout),
|
||||
)
|
||||
.into_int_type();
|
||||
|
||||
match union_layout {
|
||||
UnionLayout::NonRecursive(_) => {
|
||||
|
@ -2019,8 +2069,12 @@ fn lookup_at_index_ptr2<'a, 'ctx>(
|
|||
|
||||
let struct_layout =
|
||||
layout_interner.insert_direct_no_semantic(LayoutRepr::struct_(field_layouts));
|
||||
let struct_type =
|
||||
basic_type_from_layout(env, layout_interner, struct_layout).into_struct_type();
|
||||
let struct_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(struct_layout),
|
||||
)
|
||||
.into_struct_type();
|
||||
|
||||
let data_ptr = env.builder.build_pointer_cast(
|
||||
value,
|
||||
|
@ -2059,7 +2113,7 @@ pub fn reserve_with_refcount<'a, 'ctx>(
|
|||
let stack_size = layout_interner.stack_size(layout);
|
||||
let alignment_bytes = layout_interner.alignment_bytes(layout);
|
||||
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
|
||||
reserve_with_refcount_help(env, basic_type, stack_size, alignment_bytes)
|
||||
}
|
||||
|
@ -2146,7 +2200,11 @@ fn list_literal<'a, 'ctx>(
|
|||
let ctx = env.context;
|
||||
let builder = env.builder;
|
||||
|
||||
let element_type = basic_type_from_layout(env, layout_interner, element_layout);
|
||||
let element_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(element_layout),
|
||||
);
|
||||
|
||||
let list_length = elems.len();
|
||||
let list_length_intval = env.ptr_int().const_int(list_length as _, false);
|
||||
|
@ -2311,7 +2369,7 @@ pub fn load_roc_value<'a, 'ctx>(
|
|||
source: PointerValue<'ctx>,
|
||||
name: &str,
|
||||
) -> BasicValueEnum<'ctx> {
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
|
||||
if layout_interner.is_passed_by_reference(layout) {
|
||||
let alloca = entry_block_alloca_zerofill(env, basic_type, name);
|
||||
|
@ -2334,7 +2392,7 @@ pub fn use_roc_value<'a, 'ctx>(
|
|||
if layout_interner.is_passed_by_reference(layout) {
|
||||
let alloca = entry_block_alloca_zerofill(
|
||||
env,
|
||||
basic_type_from_layout(env, layout_interner, layout),
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout)),
|
||||
name,
|
||||
);
|
||||
|
||||
|
@ -2354,7 +2412,8 @@ pub fn store_roc_value_opaque<'a, 'ctx>(
|
|||
value: BasicValueEnum<'ctx>,
|
||||
) {
|
||||
let target_type =
|
||||
basic_type_from_layout(env, layout_interner, layout).ptr_type(AddressSpace::default());
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout))
|
||||
.ptr_type(AddressSpace::default());
|
||||
let destination =
|
||||
env.builder
|
||||
.build_pointer_cast(opaque_destination, target_type, "store_roc_value_opaque");
|
||||
|
@ -2477,7 +2536,8 @@ pub(crate) fn build_exp_stmt<'a, 'ctx>(
|
|||
cond_layout,
|
||||
cond_symbol,
|
||||
} => {
|
||||
let ret_type = basic_type_from_layout(env, layout_interner, *ret_layout);
|
||||
let ret_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(*ret_layout));
|
||||
|
||||
let switch_args = SwitchArgsIr {
|
||||
cond_layout: *cond_layout,
|
||||
|
@ -2515,7 +2575,11 @@ pub(crate) fn build_exp_stmt<'a, 'ctx>(
|
|||
builder.position_at_end(cont_block);
|
||||
|
||||
for param in parameters.iter() {
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, param.layout);
|
||||
let basic_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(param.layout),
|
||||
);
|
||||
|
||||
let phi_type = if layout_interner.is_passed_by_reference(param.layout) {
|
||||
basic_type.ptr_type(AddressSpace::default()).into()
|
||||
|
@ -3186,7 +3250,11 @@ fn get_tag_id_wrapped<'a, 'ctx>(
|
|||
from_value: PointerValue<'ctx>,
|
||||
) -> IntValue<'ctx> {
|
||||
let union_struct_type = struct_type_from_union_layout(env, layout_interner, &union_layout);
|
||||
let tag_id_type = basic_type_from_layout(env, layout_interner, union_layout.tag_id_layout());
|
||||
let tag_id_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(union_layout.tag_id_layout()),
|
||||
);
|
||||
|
||||
let tag_id_ptr = env
|
||||
.builder
|
||||
|
@ -3275,8 +3343,12 @@ fn build_switch_ir<'a, 'ctx>(
|
|||
let (cond_value, stored_layout) = scope.load_symbol_and_layout(cond_symbol);
|
||||
|
||||
debug_assert_eq!(
|
||||
basic_type_from_layout(env, layout_interner, cond_layout),
|
||||
basic_type_from_layout(env, layout_interner, stored_layout),
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(cond_layout)),
|
||||
basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(stored_layout)
|
||||
),
|
||||
"This switch matches on {:?}, but the matched-on symbol {:?} has layout {:?}",
|
||||
cond_layout,
|
||||
cond_symbol,
|
||||
|
@ -3659,7 +3731,11 @@ fn expose_function_to_host_help_c_abi_gen_test<'a, 'ctx>(
|
|||
// does not seem to be a smarter solution
|
||||
let wrapper_return_type = roc_call_result_type(
|
||||
env,
|
||||
basic_type_from_layout(env, layout_interner, return_layout),
|
||||
basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(return_layout),
|
||||
),
|
||||
);
|
||||
|
||||
let mut cc_argument_types = Vec::with_capacity_in(arguments.len(), env.arena);
|
||||
|
@ -3827,7 +3903,11 @@ fn expose_function_to_host_help_c_abi_v2<'a, 'ctx>(
|
|||
.map(|l| to_cc_type(env, layout_interner, *l));
|
||||
let argument_types = Vec::from_iter_in(it, env.arena);
|
||||
|
||||
let return_type = basic_type_from_layout(env, layout_interner, return_layout);
|
||||
let return_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(return_layout),
|
||||
);
|
||||
|
||||
let cc_return = to_cc_return(env, layout_interner, return_layout);
|
||||
let roc_return = RocReturn::from_layout(layout_interner, return_layout);
|
||||
|
@ -4128,7 +4208,11 @@ fn expose_function_to_host_help_c_abi<'a, 'ctx>(
|
|||
}
|
||||
|
||||
LlvmBackendMode::Binary | LlvmBackendMode::BinaryDev | LlvmBackendMode::BinaryGlue => {
|
||||
basic_type_from_layout(env, layout_interner, return_layout)
|
||||
basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(return_layout),
|
||||
)
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -4277,7 +4361,11 @@ fn set_jump_and_catch_long_jump<'a, 'ctx>(
|
|||
let context = env.context;
|
||||
let builder = env.builder;
|
||||
|
||||
let return_type = basic_type_from_layout(env, layout_interner, roc_return_layout);
|
||||
let return_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(roc_return_layout),
|
||||
);
|
||||
let call_result_return_conv = {
|
||||
let layout = layout_interner
|
||||
.insert_direct_no_semantic(roc_call_result_layout(env.arena, roc_return_layout));
|
||||
|
@ -4413,11 +4501,19 @@ fn make_good_roc_result<'a, 'ctx>(
|
|||
let context = env.context;
|
||||
let builder = env.builder;
|
||||
|
||||
let return_type = basic_type_from_layout(env, layout_interner, return_layout);
|
||||
let return_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(return_layout),
|
||||
);
|
||||
|
||||
let v1 = roc_call_result_type(
|
||||
env,
|
||||
basic_type_from_layout(env, layout_interner, return_layout),
|
||||
basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(return_layout),
|
||||
),
|
||||
)
|
||||
.const_zero();
|
||||
|
||||
|
@ -4461,7 +4557,11 @@ fn make_exception_catching_wrapper<'a, 'ctx>(
|
|||
|
||||
let wrapper_return_type = roc_call_result_type(
|
||||
env,
|
||||
basic_type_from_layout(env, layout_interner, return_layout),
|
||||
basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(return_layout),
|
||||
),
|
||||
);
|
||||
|
||||
let roc_function_type = roc_function.get_type();
|
||||
|
@ -4902,7 +5002,11 @@ fn build_proc_header<'a, 'ctx>(
|
|||
|
||||
let fn_name = func_spec_name(env.arena, &env.interns, symbol, func_spec);
|
||||
|
||||
let ret_type = basic_type_from_layout(env, layout_interner, proc.ret_layout);
|
||||
let ret_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(proc.ret_layout),
|
||||
);
|
||||
let mut arg_basic_types = Vec::with_capacity_in(args.len(), arena);
|
||||
|
||||
for (layout, _) in args.iter() {
|
||||
|
@ -5024,7 +5128,8 @@ fn expose_alias_to_host<'a>(
|
|||
//
|
||||
// * roc__mainForHost_1_Update_result_size() -> i64
|
||||
|
||||
let result_type = basic_type_from_layout(env, layout_interner, result);
|
||||
let result_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(result));
|
||||
|
||||
build_host_exposed_alias_size_help(
|
||||
env,
|
||||
|
@ -5051,15 +5156,19 @@ fn build_closure_caller<'a, 'ctx>(
|
|||
let mut argument_types = Vec::with_capacity_in(arguments.len() + 3, env.arena);
|
||||
|
||||
for layout in arguments {
|
||||
let arg_type = basic_type_from_layout(env, layout_interner, *layout);
|
||||
let arg_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(*layout));
|
||||
let arg_ptr_type = arg_type.ptr_type(AddressSpace::default());
|
||||
|
||||
argument_types.push(arg_ptr_type.into());
|
||||
}
|
||||
|
||||
let closure_argument_type = {
|
||||
let basic_type =
|
||||
basic_type_from_layout(env, layout_interner, lambda_set.runtime_representation());
|
||||
let basic_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(lambda_set.runtime_representation()),
|
||||
);
|
||||
|
||||
basic_type.ptr_type(AddressSpace::default())
|
||||
};
|
||||
|
@ -5068,7 +5177,8 @@ fn build_closure_caller<'a, 'ctx>(
|
|||
let context = &env.context;
|
||||
let builder = env.builder;
|
||||
|
||||
let result_type = basic_type_from_layout(env, layout_interner, result);
|
||||
let result_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(result));
|
||||
|
||||
let output_type = { result_type.ptr_type(AddressSpace::default()) };
|
||||
argument_types.push(output_type.into());
|
||||
|
@ -5105,7 +5215,8 @@ fn build_closure_caller<'a, 'ctx>(
|
|||
let layouts_it = arguments.iter().chain(std::iter::once(&closure_layout));
|
||||
for (param, layout) in evaluator_arguments.iter_mut().zip(layouts_it) {
|
||||
if param.is_pointer_value() && !layout_interner.is_passed_by_reference(*layout) {
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, *layout);
|
||||
let basic_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(*layout));
|
||||
*param = builder.new_build_load(basic_type, param.into_pointer_value(), "load_param");
|
||||
}
|
||||
}
|
||||
|
@ -5170,7 +5281,7 @@ fn build_host_exposed_alias_size<'a, 'r>(
|
|||
def_name,
|
||||
alias_symbol,
|
||||
None,
|
||||
basic_type_from_layout(env, layout_interner, layout),
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout)),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -5384,7 +5495,11 @@ pub fn call_roc_function<'a, 'ctx>(
|
|||
let mut arguments = Vec::from_iter_in(it, env.arena);
|
||||
arguments.pop();
|
||||
|
||||
let result_type = basic_type_from_layout(env, layout_interner, result_layout);
|
||||
let result_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(result_layout),
|
||||
);
|
||||
let result_alloca = env.builder.build_alloca(result_type, "result_value");
|
||||
|
||||
arguments.push(result_alloca.into());
|
||||
|
@ -5406,7 +5521,11 @@ pub fn call_roc_function<'a, 'ctx>(
|
|||
let it = arguments.iter().map(|x| (*x).into());
|
||||
let mut arguments = Vec::from_iter_in(it, env.arena);
|
||||
|
||||
let result_type = basic_type_from_layout(env, layout_interner, result_layout);
|
||||
let result_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(result_layout),
|
||||
);
|
||||
let result_alloca = entry_block_alloca_zerofill(env, result_type, "result_value");
|
||||
|
||||
arguments.push(result_alloca.into());
|
||||
|
@ -5496,8 +5615,11 @@ pub(crate) fn roc_function_call<'a, 'ctx>(
|
|||
) -> RocFunctionCall<'ctx> {
|
||||
use crate::llvm::bitcode::{build_inc_n_wrapper, build_transform_caller};
|
||||
|
||||
let closure_data_type =
|
||||
basic_type_from_layout(env, layout_interner, lambda_set.runtime_representation());
|
||||
let closure_data_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(lambda_set.runtime_representation()),
|
||||
);
|
||||
|
||||
let closure_data_ptr = env
|
||||
.builder
|
||||
|
@ -5557,7 +5679,7 @@ fn to_cc_type<'a, 'ctx>(
|
|||
LayoutRepr::Builtin(builtin) => to_cc_type_builtin(env, &builtin),
|
||||
_ => {
|
||||
// TODO this is almost certainly incorrect for bigger structs
|
||||
basic_type_from_layout(env, layout_interner, layout)
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5804,7 +5926,8 @@ fn build_foreign_symbol<'a, 'ctx>(
|
|||
// and can use in the wrapper
|
||||
// - a FAST_CALL_CONV wrapper that we make here, e.g. `roc_fx_putLine_fastcc_wrapper`
|
||||
|
||||
let return_type = basic_type_from_layout(env, layout_interner, ret_layout);
|
||||
let return_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(ret_layout));
|
||||
let roc_return = RocReturn::from_layout(layout_interner, ret_layout);
|
||||
let cc_return = to_cc_return(env, layout_interner, ret_layout);
|
||||
|
||||
|
|
|
@ -65,7 +65,8 @@ fn pass_element_as_opaque<'a, 'ctx>(
|
|||
element: BasicValueEnum<'ctx>,
|
||||
layout: InLayout<'a>,
|
||||
) -> BasicValueEnum<'ctx> {
|
||||
let element_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let element_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
let element_ptr = env
|
||||
.builder
|
||||
.build_alloca(element_type, "element_to_pass_as_opaque");
|
||||
|
@ -131,7 +132,11 @@ pub(crate) fn list_get_unsafe<'a, 'ctx>(
|
|||
) -> BasicValueEnum<'ctx> {
|
||||
let builder = env.builder;
|
||||
|
||||
let elem_type = basic_type_from_layout(env, layout_interner, element_layout);
|
||||
let elem_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(element_layout),
|
||||
);
|
||||
let ptr_type = elem_type.ptr_type(AddressSpace::default());
|
||||
// Load the pointer to the array data
|
||||
let array_data_ptr = load_list_ptr(builder, wrapper_struct, ptr_type);
|
||||
|
@ -320,7 +325,11 @@ pub(crate) fn list_replace_unsafe<'a, 'ctx>(
|
|||
element_layout: InLayout<'a>,
|
||||
update_mode: UpdateMode,
|
||||
) -> BasicValueEnum<'ctx> {
|
||||
let element_type = basic_type_from_layout(env, layout_interner, element_layout);
|
||||
let element_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(element_layout),
|
||||
);
|
||||
let element_ptr = env
|
||||
.builder
|
||||
.build_alloca(element_type, "output_element_as_opaque");
|
||||
|
@ -371,8 +380,12 @@ pub(crate) fn list_replace_unsafe<'a, 'ctx>(
|
|||
// TODO: have use_roc_value take LayoutRepr
|
||||
let result_layout =
|
||||
layout_interner.insert_direct_no_semantic(LayoutRepr::Struct(env.arena.alloc(fields)));
|
||||
let result_struct_type =
|
||||
basic_type_from_layout(env, layout_interner, result_layout).into_struct_type();
|
||||
let result_struct_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(result_layout),
|
||||
)
|
||||
.into_struct_type();
|
||||
|
||||
let result = result_struct_type.const_zero();
|
||||
|
||||
|
@ -683,7 +696,11 @@ where
|
|||
{
|
||||
let builder = env.builder;
|
||||
|
||||
let element_type = basic_type_from_layout(env, layout_interner, element_layout);
|
||||
let element_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(element_layout),
|
||||
);
|
||||
|
||||
incrementing_index_loop(
|
||||
env,
|
||||
|
@ -815,7 +832,8 @@ pub(crate) fn allocate_list<'a, 'ctx>(
|
|||
let number_of_data_bytes =
|
||||
builder.build_int_mul(bytes_per_element, number_of_elements, "data_length");
|
||||
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, elem_layout);
|
||||
let basic_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(elem_layout));
|
||||
let alignment_bytes = layout_interner.alignment_bytes(elem_layout);
|
||||
allocate_with_refcount_help(env, basic_type, alignment_bytes, number_of_data_bytes)
|
||||
}
|
||||
|
|
|
@ -201,7 +201,7 @@ fn build_eq<'a, 'ctx>(
|
|||
LayoutRepr::RecursivePointer(rec_layout) => {
|
||||
let layout = rec_layout;
|
||||
|
||||
let bt = basic_type_from_layout(env, layout_interner, layout);
|
||||
let bt = basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
|
||||
// cast the i64 pointer to a pointer to block of memory
|
||||
let field1_cast = env.builder.build_pointer_cast(
|
||||
|
@ -438,7 +438,8 @@ fn build_list_eq<'a, 'ctx>(
|
|||
let function = match env.module.get_function(fn_name.as_str()) {
|
||||
Some(function_value) => function_value,
|
||||
None => {
|
||||
let arg_type = basic_type_from_layout(env, layout_interner, list_layout);
|
||||
let arg_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(list_layout));
|
||||
|
||||
let function_value = crate::llvm::refcounting::build_header_help(
|
||||
env,
|
||||
|
@ -534,7 +535,11 @@ fn build_list_eq_help<'a, 'ctx>(
|
|||
env.builder.position_at_end(then_block);
|
||||
|
||||
let builder = env.builder;
|
||||
let element_type = basic_type_from_layout(env, layout_interner, element_layout);
|
||||
let element_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(element_layout),
|
||||
);
|
||||
let ptr_type = element_type.ptr_type(AddressSpace::default());
|
||||
let ptr1 = load_list_ptr(env.builder, list1, ptr_type);
|
||||
let ptr2 = load_list_ptr(env.builder, list2, ptr_type);
|
||||
|
@ -757,7 +762,11 @@ fn build_struct_eq_help<'a, 'ctx>(
|
|||
|
||||
let field_layout = rec_layout;
|
||||
|
||||
let bt = basic_type_from_layout(env, layout_interner, field_layout);
|
||||
let bt = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(field_layout),
|
||||
);
|
||||
|
||||
// cast the i64 pointer to a pointer to block of memory
|
||||
let field1_cast = env.builder.build_pointer_cast(
|
||||
|
@ -1286,7 +1295,11 @@ fn eq_ptr_to_struct<'a, 'ctx>(
|
|||
tag1: PointerValue<'ctx>,
|
||||
tag2: PointerValue<'ctx>,
|
||||
) -> IntValue<'ctx> {
|
||||
let wrapper_type = basic_type_from_layout(env, layout_interner, struct_layout);
|
||||
let wrapper_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(struct_layout),
|
||||
);
|
||||
debug_assert!(wrapper_type.is_struct_type());
|
||||
|
||||
// cast the opaque pointer to a pointer of the correct shape
|
||||
|
@ -1351,7 +1364,8 @@ fn build_box_eq<'a, 'ctx>(
|
|||
let function = match env.module.get_function(fn_name.as_str()) {
|
||||
Some(function_value) => function_value,
|
||||
None => {
|
||||
let arg_type = basic_type_from_layout(env, layout_interner, box_layout);
|
||||
let arg_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(box_layout));
|
||||
|
||||
let function_value = crate::llvm::refcounting::build_header_help(
|
||||
env,
|
||||
|
|
|
@ -15,14 +15,6 @@ use roc_target::TargetInfo;
|
|||
use super::struct_::RocStruct;
|
||||
|
||||
pub fn basic_type_from_layout<'a, 'ctx, 'env>(
|
||||
env: &Env<'a, 'ctx, 'env>,
|
||||
layout_interner: &'env STLayoutInterner<'a>,
|
||||
layout: InLayout<'_>,
|
||||
) -> BasicTypeEnum<'ctx> {
|
||||
basic_type_from_layout_repr(env, layout_interner, layout_interner.get_repr(layout))
|
||||
}
|
||||
|
||||
pub fn basic_type_from_layout_repr<'a, 'ctx, 'env>(
|
||||
env: &Env<'a, 'ctx, 'env>,
|
||||
layout_interner: &'env STLayoutInterner<'a>,
|
||||
layout: LayoutRepr<'_>,
|
||||
|
@ -33,11 +25,17 @@ pub fn basic_type_from_layout_repr<'a, 'ctx, 'env>(
|
|||
Struct(sorted_fields, ..) => {
|
||||
basic_type_from_record(env, layout_interner, sorted_fields).into()
|
||||
}
|
||||
LambdaSet(lambda_set) => {
|
||||
basic_type_from_layout(env, layout_interner, lambda_set.runtime_representation())
|
||||
}
|
||||
LambdaSet(lambda_set) => basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(lambda_set.runtime_representation()),
|
||||
),
|
||||
Boxed(inner_layout) => {
|
||||
let inner_type = basic_type_from_layout(env, layout_interner, inner_layout);
|
||||
let inner_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(inner_layout),
|
||||
);
|
||||
|
||||
inner_type.ptr_type(AddressSpace::default()).into()
|
||||
}
|
||||
|
@ -60,7 +58,11 @@ fn basic_type_from_record<'a, 'ctx>(
|
|||
let mut field_types = AVec::with_capacity_in(fields.len(), env.arena);
|
||||
|
||||
for field_layout in fields.iter() {
|
||||
let typ = basic_type_from_layout(env, layout_interner, *field_layout);
|
||||
let typ = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(*field_layout),
|
||||
);
|
||||
|
||||
field_types.push(typ);
|
||||
}
|
||||
|
@ -169,7 +171,8 @@ pub fn argument_type_from_layout<'a, 'ctx>(
|
|||
}
|
||||
Union(union_layout) => argument_type_from_union_layout(env, layout_interner, &union_layout),
|
||||
Builtin(_) => {
|
||||
let base = basic_type_from_layout(env, layout_interner, layout);
|
||||
let base =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
|
||||
if layout_interner.is_passed_by_reference(layout) {
|
||||
base.ptr_type(AddressSpace::default()).into()
|
||||
|
@ -178,7 +181,7 @@ pub fn argument_type_from_layout<'a, 'ctx>(
|
|||
}
|
||||
}
|
||||
Struct(_) => argument_type_from_struct_layout(env, layout_interner, layout),
|
||||
_ => basic_type_from_layout(env, layout_interner, layout),
|
||||
_ => basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout)),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -192,7 +195,11 @@ fn argument_type_from_struct_layout<'a, 'ctx>(
|
|||
layout_interner.get_repr(struct_layout),
|
||||
LayoutRepr::Struct(_)
|
||||
));
|
||||
let stack_type = basic_type_from_layout(env, layout_interner, struct_layout);
|
||||
let stack_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(struct_layout),
|
||||
);
|
||||
|
||||
if layout_interner.is_passed_by_reference(struct_layout) {
|
||||
stack_type.ptr_type(AddressSpace::default()).into()
|
||||
|
|
|
@ -387,7 +387,7 @@ fn build_clone<'a, 'ctx>(
|
|||
LayoutRepr::RecursivePointer(rec_layout) => {
|
||||
let layout = rec_layout;
|
||||
|
||||
let bt = basic_type_from_layout(env, layout_interner, layout);
|
||||
let bt = basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
|
||||
// cast the i64 pointer to a pointer to block of memory
|
||||
let field1_cast = env.builder.build_pointer_cast(
|
||||
|
@ -578,7 +578,11 @@ fn clone_tag_payload_and_id<'a, 'ctx>(
|
|||
payload_in_layout: InLayout<'a>,
|
||||
opaque_payload_ptr: PointerValue<'ctx>,
|
||||
) -> IntValue<'ctx> {
|
||||
let payload_type = basic_type_from_layout(env, layout_interner, payload_in_layout);
|
||||
let payload_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(payload_in_layout),
|
||||
);
|
||||
|
||||
let payload_ptr = env.builder.build_pointer_cast(
|
||||
opaque_payload_ptr,
|
||||
|
@ -752,7 +756,8 @@ fn build_clone_tag_help<'a, 'ctx>(
|
|||
))
|
||||
};
|
||||
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let basic_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
let data = load_tag_data(env, layout_interner, union_layout, tag_value, basic_type);
|
||||
|
||||
let (width, _) =
|
||||
|
@ -793,7 +798,8 @@ fn build_clone_tag_help<'a, 'ctx>(
|
|||
build_copy(env, ptr, offset, extra_offset.into());
|
||||
|
||||
let layout = layout_interner.insert_direct_no_semantic(LayoutRepr::struct_(fields));
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let basic_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
|
||||
let (width, _) = union_layout.data_size_and_alignment(layout_interner, env.target_info);
|
||||
|
||||
|
@ -850,7 +856,11 @@ fn build_clone_tag_help<'a, 'ctx>(
|
|||
|
||||
let layout =
|
||||
layout_interner.insert_direct_no_semantic(LayoutRepr::struct_(fields));
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let basic_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
);
|
||||
|
||||
let (width, _) =
|
||||
union_layout.data_size_and_alignment(layout_interner, env.target_info);
|
||||
|
@ -926,7 +936,8 @@ fn build_clone_tag_help<'a, 'ctx>(
|
|||
|
||||
let layout =
|
||||
layout_interner.insert_direct_no_semantic(LayoutRepr::struct_(other_fields));
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let basic_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
|
||||
let cursors = Cursors {
|
||||
offset: extra_offset,
|
||||
|
@ -1077,7 +1088,8 @@ fn build_clone_builtin<'a, 'ctx>(
|
|||
|
||||
bd.build_int_add(elements_start_offset, elements_width, "new_offset")
|
||||
} else {
|
||||
let element_type = basic_type_from_layout(env, layout_interner, elem);
|
||||
let element_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(elem));
|
||||
let elements = bd.build_pointer_cast(
|
||||
elements,
|
||||
element_type.ptr_type(AddressSpace::default()),
|
||||
|
|
|
@ -261,9 +261,12 @@ pub(crate) fn run_low_level<'a, 'ctx>(
|
|||
intrinsic,
|
||||
);
|
||||
|
||||
let roc_return_type =
|
||||
basic_type_from_layout(env, layout_interner, layout)
|
||||
.ptr_type(AddressSpace::default());
|
||||
let roc_return_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
)
|
||||
.ptr_type(AddressSpace::default());
|
||||
|
||||
let roc_return_alloca = env.builder.build_pointer_cast(
|
||||
zig_return_alloca,
|
||||
|
@ -502,7 +505,11 @@ pub(crate) fn run_low_level<'a, 'ctx>(
|
|||
bitcode::STR_GET_SCALAR_UNSAFE,
|
||||
);
|
||||
|
||||
let return_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let return_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
);
|
||||
let cast_result = env.builder.build_pointer_cast(
|
||||
result,
|
||||
return_type.ptr_type(AddressSpace::default()),
|
||||
|
@ -525,7 +532,11 @@ pub(crate) fn run_low_level<'a, 'ctx>(
|
|||
match env.target_info.ptr_width() {
|
||||
PtrWidth::Bytes8 => result,
|
||||
PtrWidth::Bytes4 => {
|
||||
let to = basic_type_from_layout(env, layout_interner, layout);
|
||||
let to = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
);
|
||||
complex_bitcast_check_size(env, result, to, "to_roc_record")
|
||||
}
|
||||
}
|
||||
|
@ -1147,7 +1158,8 @@ pub(crate) fn run_low_level<'a, 'ctx>(
|
|||
NumIntCast => {
|
||||
arguments!(arg);
|
||||
|
||||
let to = basic_type_from_layout(env, layout_interner, layout).into_int_type();
|
||||
let to = basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout))
|
||||
.into_int_type();
|
||||
let to_signed = intwidth_from_layout(layout).is_signed();
|
||||
|
||||
env.builder
|
||||
|
@ -1161,8 +1173,12 @@ pub(crate) fn run_low_level<'a, 'ctx>(
|
|||
LayoutRepr::Builtin(Builtin::Int(width)) => {
|
||||
// Converting from int to float
|
||||
let int_val = arg.into_int_value();
|
||||
let dest =
|
||||
basic_type_from_layout(env, layout_interner, layout).into_float_type();
|
||||
let dest = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
)
|
||||
.into_float_type();
|
||||
|
||||
if width.is_signed() {
|
||||
env.builder
|
||||
|
@ -1176,8 +1192,12 @@ pub(crate) fn run_low_level<'a, 'ctx>(
|
|||
}
|
||||
LayoutRepr::Builtin(Builtin::Float(_)) => {
|
||||
// Converting from float to float - e.g. F64 to F32, or vice versa
|
||||
let dest =
|
||||
basic_type_from_layout(env, layout_interner, layout).into_float_type();
|
||||
let dest = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
)
|
||||
.into_float_type();
|
||||
|
||||
env.builder
|
||||
.build_float_cast(arg.into_float_value(), dest, "cast_float_to_float")
|
||||
|
@ -1273,7 +1293,8 @@ pub(crate) fn run_low_level<'a, 'ctx>(
|
|||
arguments!(data_ptr);
|
||||
|
||||
let target_type =
|
||||
basic_type_from_layout(env, layout_interner, layout).into_pointer_type();
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout))
|
||||
.into_pointer_type();
|
||||
|
||||
debug_assert!(data_ptr.is_pointer_value());
|
||||
|
||||
|
@ -1312,11 +1333,13 @@ pub(crate) fn run_low_level<'a, 'ctx>(
|
|||
|
||||
Unreachable => match RocReturn::from_layout(layout_interner, layout) {
|
||||
RocReturn::Return => {
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let basic_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
basic_type.const_zero()
|
||||
}
|
||||
RocReturn::ByPointer => {
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let basic_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
let ptr = env.builder.build_alloca(basic_type, "unreachable_alloca");
|
||||
env.builder.build_store(ptr, basic_type.const_zero());
|
||||
|
||||
|
@ -1948,7 +1971,11 @@ fn change_with_overflow_dec_to_roc_type<'a, 'ctx>(
|
|||
val: StructValue<'ctx>,
|
||||
return_layout: InLayout<'a>,
|
||||
) -> BasicValueEnum<'ctx> {
|
||||
let return_type = convert::basic_type_from_layout(env, layout_interner, return_layout);
|
||||
let return_type = convert::basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(return_layout),
|
||||
);
|
||||
let casted = cast_basic_basic(env.builder, val.into(), return_type);
|
||||
use_roc_value(
|
||||
env,
|
||||
|
@ -2114,9 +2141,12 @@ fn build_int_unary_op<'a, 'ctx, 'env>(
|
|||
arg_width == target_int_width;
|
||||
|
||||
// How the return type needs to be stored on the stack.
|
||||
let return_type_stack_type =
|
||||
convert::basic_type_from_layout(env, layout_interner, return_layout)
|
||||
.into_struct_type();
|
||||
let return_type_stack_type = convert::basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(return_layout),
|
||||
)
|
||||
.into_struct_type();
|
||||
// How the return type is actually used, in the Roc calling convention.
|
||||
let return_type_use_type =
|
||||
convert::argument_type_from_layout(env, layout_interner, return_layout);
|
||||
|
@ -2189,9 +2219,12 @@ fn build_int_unary_op<'a, 'ctx, 'env>(
|
|||
intrinsic,
|
||||
);
|
||||
|
||||
let roc_return_type =
|
||||
basic_type_from_layout(env, layout_interner, return_layout)
|
||||
.ptr_type(AddressSpace::default());
|
||||
let roc_return_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(return_layout),
|
||||
)
|
||||
.ptr_type(AddressSpace::default());
|
||||
|
||||
let roc_return_alloca = env.builder.build_pointer_cast(
|
||||
zig_return_alloca,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use inkwell::{types::BasicType, values::PointerValue};
|
||||
use roc_mono::layout::{LayoutRepr, STLayoutInterner};
|
||||
|
||||
use super::{align::LlvmAlignment, build::Env, convert::basic_type_from_layout_repr};
|
||||
use super::{align::LlvmAlignment, build::Env, convert::basic_type_from_layout};
|
||||
|
||||
pub fn build_memcpy<'a, 'ctx>(
|
||||
env: &Env<'a, 'ctx, '_>,
|
||||
|
@ -11,7 +11,7 @@ pub fn build_memcpy<'a, 'ctx>(
|
|||
source: PointerValue<'ctx>,
|
||||
) {
|
||||
let align_bytes = layout.llvm_alignment_bytes(layout_interner);
|
||||
let width = basic_type_from_layout_repr(env, layout_interner, layout)
|
||||
let width = basic_type_from_layout(env, layout_interner, layout)
|
||||
.size_of()
|
||||
.unwrap();
|
||||
if align_bytes > 0 {
|
||||
|
|
|
@ -465,7 +465,7 @@ fn modify_refcount_layout_help<'a, 'ctx>(
|
|||
LayoutRepr::RecursivePointer(rec_layout) => {
|
||||
let layout = rec_layout;
|
||||
|
||||
let bt = basic_type_from_layout(env, layout_interner, layout);
|
||||
let bt = basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
|
||||
// cast the i64 pointer to a pointer to block of memory
|
||||
let field_cast = env.builder.build_pointer_cast(
|
||||
|
@ -697,8 +697,12 @@ fn modify_refcount_list_help<'a, 'ctx>(
|
|||
builder.position_at_end(modification_list_block);
|
||||
|
||||
if layout_interner.contains_refcounted(element_layout) {
|
||||
let ptr_type = basic_type_from_layout(env, layout_interner, element_layout)
|
||||
.ptr_type(AddressSpace::default());
|
||||
let ptr_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(element_layout),
|
||||
)
|
||||
.ptr_type(AddressSpace::default());
|
||||
|
||||
let (len, ptr) = load_list(env.builder, original_wrapper, ptr_type);
|
||||
|
||||
|
@ -870,7 +874,11 @@ fn modify_refcount_boxed<'a, 'ctx>(
|
|||
let function = match env.module.get_function(fn_name.as_str()) {
|
||||
Some(function_value) => function_value,
|
||||
None => {
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, boxed_layout);
|
||||
let basic_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(boxed_layout),
|
||||
);
|
||||
let function_value = build_header(env, basic_type, mode, &fn_name);
|
||||
|
||||
modify_refcount_box_help(
|
||||
|
@ -1079,7 +1087,8 @@ fn build_rec_union<'a, 'ctx>(
|
|||
let block = env.builder.get_insert_block().expect("to be in a function");
|
||||
let di_location = env.builder.get_current_debug_location().unwrap();
|
||||
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, layout);
|
||||
let basic_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout));
|
||||
let function_value = build_header(env, basic_type, mode, &fn_name);
|
||||
|
||||
build_rec_union_help(
|
||||
|
@ -1249,8 +1258,12 @@ fn build_rec_union_recursive_decrement<'a, 'ctx>(
|
|||
// next, make a jump table for all possible values of the tag_id
|
||||
let mut cases = Vec::with_capacity_in(tags.len(), env.arena);
|
||||
|
||||
let tag_id_int_type =
|
||||
basic_type_from_layout(env, layout_interner, union_layout.tag_id_layout()).into_int_type();
|
||||
let tag_id_int_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(union_layout.tag_id_layout()),
|
||||
)
|
||||
.into_int_type();
|
||||
|
||||
for (tag_id, field_layouts) in tags.iter().enumerate() {
|
||||
let tag_id = match nullable_id {
|
||||
|
@ -1273,7 +1286,11 @@ fn build_rec_union_recursive_decrement<'a, 'ctx>(
|
|||
|
||||
let fields_struct =
|
||||
layout_interner.insert_direct_no_semantic(LayoutRepr::struct_(field_layouts));
|
||||
let wrapper_type = basic_type_from_layout(env, layout_interner, fields_struct);
|
||||
let wrapper_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(fields_struct),
|
||||
);
|
||||
|
||||
// cast the opaque pointer to a pointer of the correct shape
|
||||
let struct_ptr = env.builder.build_pointer_cast(
|
||||
|
@ -1311,7 +1328,11 @@ fn build_rec_union_recursive_decrement<'a, 'ctx>(
|
|||
// therefore we must cast it to our desired type
|
||||
let union_layout =
|
||||
layout_interner.insert_direct_no_semantic(LayoutRepr::Union(union_layout));
|
||||
let union_type = basic_type_from_layout(env, layout_interner, union_layout);
|
||||
let union_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(union_layout),
|
||||
);
|
||||
let recursive_field_ptr = cast_basic_basic(env.builder, ptr_as_i64_ptr, union_type);
|
||||
|
||||
deferred_rec.push(recursive_field_ptr);
|
||||
|
@ -1482,7 +1503,11 @@ pub fn build_reset<'a, 'ctx>(
|
|||
let block = env.builder.get_insert_block().expect("to be in a function");
|
||||
let di_location = env.builder.get_current_debug_location().unwrap();
|
||||
|
||||
let basic_type = basic_type_from_layout(env, layout_interner, union_layout_in);
|
||||
let basic_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(union_layout_in),
|
||||
);
|
||||
let function_value = build_header(env, basic_type, mode, &fn_name);
|
||||
|
||||
build_reuse_rec_union_help(
|
||||
|
@ -1698,7 +1723,9 @@ fn modify_refcount_nonrecursive_help<'a, 'ctx>(
|
|||
|
||||
let union_layout = UnionLayout::NonRecursive(tags);
|
||||
let layout = layout_interner.insert_direct_no_semantic(LayoutRepr::Union(union_layout));
|
||||
let union_struct_type = basic_type_from_layout(env, layout_interner, layout).into_struct_type();
|
||||
let union_struct_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout))
|
||||
.into_struct_type();
|
||||
|
||||
// read the tag_id
|
||||
let tag_id_ptr = env
|
||||
|
@ -1714,7 +1741,11 @@ fn modify_refcount_nonrecursive_help<'a, 'ctx>(
|
|||
let tag_id = env
|
||||
.builder
|
||||
.new_build_load(
|
||||
basic_type_from_layout(env, layout_interner, union_layout.tag_id_layout()),
|
||||
basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(union_layout.tag_id_layout()),
|
||||
),
|
||||
tag_id_ptr,
|
||||
"load_tag_id",
|
||||
)
|
||||
|
@ -1745,7 +1776,11 @@ fn modify_refcount_nonrecursive_help<'a, 'ctx>(
|
|||
|
||||
let fields_struct =
|
||||
layout_interner.insert_direct_no_semantic(LayoutRepr::struct_(field_layouts));
|
||||
let data_struct_type = basic_type_from_layout(env, layout_interner, fields_struct);
|
||||
let data_struct_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(fields_struct),
|
||||
);
|
||||
|
||||
debug_assert!(data_struct_type.is_struct_type());
|
||||
let data_struct_type = data_struct_type.into_struct_type();
|
||||
|
@ -1790,7 +1825,11 @@ fn modify_refcount_nonrecursive_help<'a, 'ctx>(
|
|||
debug_assert!(field_value.is_pointer_value());
|
||||
|
||||
// therefore we must cast it to our desired type
|
||||
let union_type = basic_type_from_layout(env, layout_interner, union_layout);
|
||||
let union_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(union_layout),
|
||||
);
|
||||
let recursive_ptr_field_value =
|
||||
cast_basic_basic(env.builder, field_value, union_type);
|
||||
|
||||
|
@ -1817,7 +1856,11 @@ fn modify_refcount_nonrecursive_help<'a, 'ctx>(
|
|||
field_ptr.into()
|
||||
} else {
|
||||
env.builder.new_build_load(
|
||||
basic_type_from_layout(env, layout_interner, *field_layout),
|
||||
basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(*field_layout),
|
||||
),
|
||||
field_ptr,
|
||||
"field_value",
|
||||
)
|
||||
|
|
|
@ -207,7 +207,11 @@ fn build_struct_helper<'a, 'ctx>(
|
|||
.get_repr(field_layout)
|
||||
.is_dropped_because_empty()
|
||||
{
|
||||
let field_type = basic_type_from_layout(env, layout_interner, field_layout);
|
||||
let field_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(field_layout),
|
||||
);
|
||||
field_types.push(field_type);
|
||||
|
||||
if layout_interner.is_passed_by_reference(field_layout) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue