Have basic_type_from_layout take LayoutRepr

This commit is contained in:
Ayaz Hafiz 2023-06-16 21:17:31 -05:00
parent 555cbcc87b
commit 8495f3b085
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
10 changed files with 403 additions and 137 deletions

View file

@ -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(

View file

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

View file

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

View file

@ -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,

View file

@ -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()

View file

@ -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()),

View file

@ -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,

View file

@ -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 {

View file

@ -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",
)

View file

@ -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) {