Store value by layoutrepr

This commit is contained in:
Ayaz Hafiz 2023-06-16 21:40:44 -05:00
parent bc41db2a34
commit 5979405b79
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
3 changed files with 62 additions and 14 deletions

View file

@ -702,7 +702,7 @@ fn promote_to_wasm_test_wrapper<'a, 'ctx>(
store_roc_value(
env,
layout_interner,
top_level.result,
layout_interner.get_repr(top_level.result),
ptr,
roc_main_fn_result,
);
@ -1007,7 +1007,13 @@ fn struct_pointer_from_fields<'a, 'ctx, 'env, I>(
.new_build_struct_gep(struct_type, struct_ptr, index as u32, "field_struct_gep")
.unwrap();
store_roc_value(env, layout_interner, field_layout, field_ptr, field_value);
store_roc_value(
env,
layout_interner,
layout_interner.get_repr(field_layout),
field_ptr,
field_value,
);
}
}
@ -1100,7 +1106,13 @@ pub(crate) fn build_exp_expr<'a, 'ctx>(
layout_interner.alignment_bytes(layout),
);
store_roc_value(env, layout_interner, layout, allocation, value);
store_roc_value(
env,
layout_interner,
layout_interner.get_repr(layout),
allocation,
value,
);
allocation.into()
}
@ -2350,7 +2362,13 @@ fn list_literal<'a, 'ctx>(
builder.new_build_in_bounds_gep(element_type, ptr, &[index_val], "index")
};
store_roc_value(env, layout_interner, element_layout, elem_ptr, val);
store_roc_value(
env,
layout_interner,
layout_interner.get_repr(element_layout),
elem_ptr,
val,
);
}
super::build_list::store_list(env, ptr, list_length_intval).into()
@ -2369,7 +2387,13 @@ pub fn load_roc_value<'a, 'ctx>(
if layout_interner.is_passed_by_reference(layout) {
let alloca = entry_block_alloca_zerofill(env, basic_type, name);
store_roc_value(env, layout_interner, layout, alloca, source.into());
store_roc_value(
env,
layout_interner,
layout_interner.get_repr(layout),
alloca,
source.into(),
);
alloca.into()
} else {
@ -2413,23 +2437,29 @@ pub fn store_roc_value_opaque<'a, 'ctx>(
env.builder
.build_pointer_cast(opaque_destination, target_type, "store_roc_value_opaque");
store_roc_value(env, layout_interner, layout, destination, value)
store_roc_value(
env,
layout_interner,
layout_interner.get_repr(layout),
destination,
value,
)
}
pub fn store_roc_value<'a, 'ctx>(
env: &Env<'a, 'ctx, '_>,
layout_interner: &STLayoutInterner<'a>,
layout: InLayout<'a>,
layout: LayoutRepr<'a>,
destination: PointerValue<'ctx>,
value: BasicValueEnum<'ctx>,
) {
if layout_interner.is_passed_by_reference(layout) {
if layout.is_passed_by_reference(layout_interner) {
debug_assert!(value.is_pointer_value());
build_memcpy(
env,
layout_interner,
layout_interner.get_repr(layout),
layout,
destination,
value.into_pointer_value(),
);
@ -3705,7 +3735,13 @@ fn expose_function_to_host_help_c_abi_generic<'a, 'ctx>(
.unwrap()
.into_pointer_value();
store_roc_value(env, layout_interner, return_layout, output_arg, call_result);
store_roc_value(
env,
layout_interner,
layout_interner.get_repr(return_layout),
output_arg,
call_result,
);
builder.build_return(None);
c_function
@ -3845,7 +3881,7 @@ fn expose_function_to_host_help_c_abi_gen_test<'a, 'ctx>(
store_roc_value(
env,
layout_interner,
call_result_layout,
layout_interner.get_repr(call_result_layout),
output_arg,
call_result,
);
@ -5622,7 +5658,7 @@ pub(crate) fn roc_function_call<'a, 'ctx>(
store_roc_value(
env,
layout_interner,
lambda_set.runtime_representation(),
layout_interner.get_repr(lambda_set.runtime_representation()),
closure_data_ptr,
closure_data,
);

View file

@ -70,7 +70,13 @@ fn pass_element_as_opaque<'a, 'ctx>(
let element_ptr = env
.builder
.build_alloca(element_type, "element_to_pass_as_opaque");
store_roc_value(env, layout_interner, layout, element_ptr, element);
store_roc_value(
env,
layout_interner,
layout_interner.get_repr(layout),
element_ptr,
element,
);
env.builder
.build_pointer_cast(

View file

@ -337,7 +337,13 @@ fn build_clone<'a, 'ctx>(
.builder
.build_pointer_cast(ptr, ptr_type, "cast_ptr_type");
store_roc_value(env, layout_interner, layout, ptr, value);
store_roc_value(
env,
layout_interner,
layout_interner.get_repr(layout),
ptr,
value,
);
cursors.extra_offset
} else {