mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 16:44:33 +00:00
remove manual bitcasts
This commit is contained in:
parent
04fd250fe5
commit
3b443eef10
1 changed files with 25 additions and 38 deletions
|
@ -81,6 +81,17 @@ fn layout_width<'a, 'ctx, 'env>(
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn pass_as_opaque<'a, 'ctx, 'env>(
|
||||||
|
env: &Env<'a, 'ctx, 'env>,
|
||||||
|
ptr: PointerValue<'ctx>,
|
||||||
|
) -> BasicValueEnum<'ctx> {
|
||||||
|
env.builder.build_bitcast(
|
||||||
|
ptr,
|
||||||
|
env.context.i8_type().ptr_type(AddressSpace::Generic),
|
||||||
|
"to_opaque",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
/// List.single : a -> List a
|
/// List.single : a -> List a
|
||||||
pub fn list_single<'a, 'ctx, 'env>(
|
pub fn list_single<'a, 'ctx, 'env>(
|
||||||
env: &Env<'a, 'ctx, 'env>,
|
env: &Env<'a, 'ctx, 'env>,
|
||||||
|
@ -490,8 +501,6 @@ fn list_walk_generic<'a, 'ctx, 'env>(
|
||||||
ListWalk::WalkBackwardsUntil => todo!(),
|
ListWalk::WalkBackwardsUntil => todo!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let u8_ptr = env.context.i8_type().ptr_type(AddressSpace::Generic);
|
|
||||||
|
|
||||||
let transform_ptr = builder.build_alloca(func.get_type(), "transform_ptr");
|
let transform_ptr = builder.build_alloca(func.get_type(), "transform_ptr");
|
||||||
env.builder.build_store(transform_ptr, func);
|
env.builder.build_store(transform_ptr, func);
|
||||||
|
|
||||||
|
@ -515,14 +524,13 @@ fn list_walk_generic<'a, 'ctx, 'env>(
|
||||||
env,
|
env,
|
||||||
&[
|
&[
|
||||||
pass_list_as_i128(env, list),
|
pass_list_as_i128(env, list),
|
||||||
env.builder
|
pass_as_opaque(env, transform_ptr),
|
||||||
.build_bitcast(transform_ptr, u8_ptr, "to_opaque"),
|
|
||||||
stepper_caller.into(),
|
stepper_caller.into(),
|
||||||
env.builder.build_bitcast(default_ptr, u8_ptr, "to_u8_ptr"),
|
pass_as_opaque(env, default_ptr),
|
||||||
alignment_intvalue(env, &element_layout),
|
alignment_intvalue(env, &element_layout),
|
||||||
layout_width(env, element_layout),
|
layout_width(env, element_layout),
|
||||||
layout_width(env, default_layout),
|
layout_width(env, default_layout),
|
||||||
env.builder.build_bitcast(result_ptr, u8_ptr, "to_opaque"),
|
pass_as_opaque(env, result_ptr),
|
||||||
],
|
],
|
||||||
zig_function,
|
zig_function,
|
||||||
);
|
);
|
||||||
|
@ -533,15 +541,14 @@ fn list_walk_generic<'a, 'ctx, 'env>(
|
||||||
env,
|
env,
|
||||||
&[
|
&[
|
||||||
pass_list_as_i128(env, list),
|
pass_list_as_i128(env, list),
|
||||||
env.builder
|
pass_as_opaque(env, transform_ptr),
|
||||||
.build_bitcast(transform_ptr, u8_ptr, "to_opaque"),
|
|
||||||
stepper_caller.into(),
|
stepper_caller.into(),
|
||||||
env.builder.build_bitcast(default_ptr, u8_ptr, "to_u8_ptr"),
|
pass_as_opaque(env, default_ptr),
|
||||||
alignment_intvalue(env, &element_layout),
|
alignment_intvalue(env, &element_layout),
|
||||||
layout_width(env, element_layout),
|
layout_width(env, element_layout),
|
||||||
layout_width(env, default_layout),
|
layout_width(env, default_layout),
|
||||||
dec_element_fn.as_global_value().as_pointer_value().into(),
|
dec_element_fn.as_global_value().as_pointer_value().into(),
|
||||||
env.builder.build_bitcast(result_ptr, u8_ptr, "to_opaque"),
|
pass_as_opaque(env, result_ptr),
|
||||||
],
|
],
|
||||||
zig_function,
|
zig_function,
|
||||||
);
|
);
|
||||||
|
@ -592,8 +599,6 @@ pub fn list_range<'a, 'ctx, 'env>(
|
||||||
) -> BasicValueEnum<'ctx> {
|
) -> BasicValueEnum<'ctx> {
|
||||||
let builder = env.builder;
|
let builder = env.builder;
|
||||||
|
|
||||||
let u8_ptr = env.context.i8_type().ptr_type(AddressSpace::Generic);
|
|
||||||
|
|
||||||
let low_ptr = builder.build_alloca(low.get_type(), "low_ptr");
|
let low_ptr = builder.build_alloca(low.get_type(), "low_ptr");
|
||||||
env.builder.build_store(low_ptr, low);
|
env.builder.build_store(low_ptr, low);
|
||||||
|
|
||||||
|
@ -610,8 +615,8 @@ pub fn list_range<'a, 'ctx, 'env>(
|
||||||
env,
|
env,
|
||||||
&[
|
&[
|
||||||
int_width,
|
int_width,
|
||||||
env.builder.build_bitcast(low_ptr, u8_ptr, "to_u8_ptr"),
|
pass_as_opaque(env, low_ptr),
|
||||||
env.builder.build_bitcast(high_ptr, u8_ptr, "to_u8_ptr"),
|
pass_as_opaque(env, high_ptr),
|
||||||
],
|
],
|
||||||
&bitcode::LIST_RANGE,
|
&bitcode::LIST_RANGE,
|
||||||
)
|
)
|
||||||
|
@ -653,8 +658,6 @@ pub fn list_keep_if<'a, 'ctx, 'env>(
|
||||||
) -> BasicValueEnum<'ctx> {
|
) -> BasicValueEnum<'ctx> {
|
||||||
let builder = env.builder;
|
let builder = env.builder;
|
||||||
|
|
||||||
let u8_ptr = env.context.i8_type().ptr_type(AddressSpace::Generic);
|
|
||||||
|
|
||||||
let transform_ptr = builder.build_alloca(transform.get_type(), "transform_ptr");
|
let transform_ptr = builder.build_alloca(transform.get_type(), "transform_ptr");
|
||||||
env.builder.build_store(transform_ptr, transform);
|
env.builder.build_store(transform_ptr, transform);
|
||||||
|
|
||||||
|
@ -670,8 +673,7 @@ pub fn list_keep_if<'a, 'ctx, 'env>(
|
||||||
env,
|
env,
|
||||||
&[
|
&[
|
||||||
pass_list_as_i128(env, list),
|
pass_list_as_i128(env, list),
|
||||||
env.builder
|
pass_as_opaque(env, transform_ptr),
|
||||||
.build_bitcast(transform_ptr, u8_ptr, "to_opaque"),
|
|
||||||
stepper_caller.into(),
|
stepper_caller.into(),
|
||||||
alignment_intvalue(env, &element_layout),
|
alignment_intvalue(env, &element_layout),
|
||||||
layout_width(env, element_layout),
|
layout_width(env, element_layout),
|
||||||
|
@ -738,8 +740,6 @@ pub fn list_keep_result<'a, 'ctx, 'env>(
|
||||||
) -> BasicValueEnum<'ctx> {
|
) -> BasicValueEnum<'ctx> {
|
||||||
let builder = env.builder;
|
let builder = env.builder;
|
||||||
|
|
||||||
let u8_ptr = env.context.i8_type().ptr_type(AddressSpace::Generic);
|
|
||||||
|
|
||||||
let result_layout = match transform_layout {
|
let result_layout = match transform_layout {
|
||||||
Layout::FunctionPointer(_, ret) => ret,
|
Layout::FunctionPointer(_, ret) => ret,
|
||||||
Layout::Closure(_, _, ret) => ret,
|
Layout::Closure(_, _, ret) => ret,
|
||||||
|
@ -773,8 +773,7 @@ pub fn list_keep_result<'a, 'ctx, 'env>(
|
||||||
env,
|
env,
|
||||||
&[
|
&[
|
||||||
pass_list_as_i128(env, list),
|
pass_list_as_i128(env, list),
|
||||||
env.builder
|
pass_as_opaque(env, transform_ptr),
|
||||||
.build_bitcast(transform_ptr, u8_ptr, "to_opaque"),
|
|
||||||
stepper_caller.into(),
|
stepper_caller.into(),
|
||||||
alignment_intvalue(env, &before_layout),
|
alignment_intvalue(env, &before_layout),
|
||||||
before_width.into(),
|
before_width.into(),
|
||||||
|
@ -795,8 +794,6 @@ pub fn list_sort_with<'a, 'ctx, 'env>(
|
||||||
list: BasicValueEnum<'ctx>,
|
list: BasicValueEnum<'ctx>,
|
||||||
element_layout: &Layout<'a>,
|
element_layout: &Layout<'a>,
|
||||||
) -> BasicValueEnum<'ctx> {
|
) -> BasicValueEnum<'ctx> {
|
||||||
let u8_ptr = env.context.i8_type().ptr_type(AddressSpace::Generic);
|
|
||||||
|
|
||||||
let transform_ptr = transform.into_pointer_value();
|
let transform_ptr = transform.into_pointer_value();
|
||||||
|
|
||||||
let compare_wrapper = build_compare_wrapper(env, layout_ids, element_layout)
|
let compare_wrapper = build_compare_wrapper(env, layout_ids, element_layout)
|
||||||
|
@ -807,8 +804,7 @@ pub fn list_sort_with<'a, 'ctx, 'env>(
|
||||||
env,
|
env,
|
||||||
&[
|
&[
|
||||||
pass_list_as_i128(env, list),
|
pass_list_as_i128(env, list),
|
||||||
env.builder
|
pass_as_opaque(env, transform_ptr),
|
||||||
.build_bitcast(transform_ptr, u8_ptr, "to_opaque"),
|
|
||||||
compare_wrapper.into(),
|
compare_wrapper.into(),
|
||||||
alignment_intvalue(env, &element_layout),
|
alignment_intvalue(env, &element_layout),
|
||||||
layout_width(env, element_layout),
|
layout_width(env, element_layout),
|
||||||
|
@ -877,8 +873,6 @@ fn list_map_generic<'a, 'ctx, 'env>(
|
||||||
_ => unreachable!("not a callable layout"),
|
_ => unreachable!("not a callable layout"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let u8_ptr = env.context.i8_type().ptr_type(AddressSpace::Generic);
|
|
||||||
|
|
||||||
let transform_ptr = builder.build_alloca(transform.get_type(), "transform_ptr");
|
let transform_ptr = builder.build_alloca(transform.get_type(), "transform_ptr");
|
||||||
env.builder.build_store(transform_ptr, transform);
|
env.builder.build_store(transform_ptr, transform);
|
||||||
|
|
||||||
|
@ -891,8 +885,7 @@ fn list_map_generic<'a, 'ctx, 'env>(
|
||||||
env,
|
env,
|
||||||
&[
|
&[
|
||||||
pass_list_as_i128(env, list),
|
pass_list_as_i128(env, list),
|
||||||
env.builder
|
pass_as_opaque(env, transform_ptr),
|
||||||
.build_bitcast(transform_ptr, u8_ptr, "to_opaque"),
|
|
||||||
stepper_caller.into(),
|
stepper_caller.into(),
|
||||||
alignment_intvalue(env, &element_layout),
|
alignment_intvalue(env, &element_layout),
|
||||||
layout_width(env, element_layout),
|
layout_width(env, element_layout),
|
||||||
|
@ -920,8 +913,6 @@ pub fn list_map2<'a, 'ctx, 'env>(
|
||||||
_ => unreachable!("not a callable layout"),
|
_ => unreachable!("not a callable layout"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let u8_ptr = env.context.i8_type().ptr_type(AddressSpace::Generic);
|
|
||||||
|
|
||||||
let transform_ptr = builder.build_alloca(transform.get_type(), "transform_ptr");
|
let transform_ptr = builder.build_alloca(transform.get_type(), "transform_ptr");
|
||||||
env.builder.build_store(transform_ptr, transform);
|
env.builder.build_store(transform_ptr, transform);
|
||||||
|
|
||||||
|
@ -951,8 +942,7 @@ pub fn list_map2<'a, 'ctx, 'env>(
|
||||||
&[
|
&[
|
||||||
pass_list_as_i128(env, list1),
|
pass_list_as_i128(env, list1),
|
||||||
pass_list_as_i128(env, list2),
|
pass_list_as_i128(env, list2),
|
||||||
env.builder
|
pass_as_opaque(env, transform_ptr),
|
||||||
.build_bitcast(transform_ptr, u8_ptr, "to_opaque"),
|
|
||||||
stepper_caller.into(),
|
stepper_caller.into(),
|
||||||
alignment_intvalue(env, &transform_layout),
|
alignment_intvalue(env, &transform_layout),
|
||||||
a_width.into(),
|
a_width.into(),
|
||||||
|
@ -985,8 +975,6 @@ pub fn list_map3<'a, 'ctx, 'env>(
|
||||||
_ => unreachable!("not a callable layout"),
|
_ => unreachable!("not a callable layout"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let u8_ptr = env.context.i8_type().ptr_type(AddressSpace::Generic);
|
|
||||||
|
|
||||||
let transform_ptr = builder.build_alloca(transform.get_type(), "transform_ptr");
|
let transform_ptr = builder.build_alloca(transform.get_type(), "transform_ptr");
|
||||||
env.builder.build_store(transform_ptr, transform);
|
env.builder.build_store(transform_ptr, transform);
|
||||||
|
|
||||||
|
@ -1022,8 +1010,7 @@ pub fn list_map3<'a, 'ctx, 'env>(
|
||||||
pass_list_as_i128(env, list1),
|
pass_list_as_i128(env, list1),
|
||||||
pass_list_as_i128(env, list2),
|
pass_list_as_i128(env, list2),
|
||||||
pass_list_as_i128(env, list3),
|
pass_list_as_i128(env, list3),
|
||||||
env.builder
|
pass_as_opaque(env, transform_ptr),
|
||||||
.build_bitcast(transform_ptr, u8_ptr, "to_opaque"),
|
|
||||||
stepper_caller.into(),
|
stepper_caller.into(),
|
||||||
alignment_intvalue(env, transform_layout),
|
alignment_intvalue(env, transform_layout),
|
||||||
a_width.into(),
|
a_width.into(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue