update rust code to llvm-16 and fix build

also update:
 - llvm frame address
 - erased function type
 - dec passing to zig
 - gen dev storage size
This commit is contained in:
Brendan Hansknecht 2023-09-21 13:12:48 -07:00
parent 2e2e609547
commit 398bf2f96c
No known key found for this signature in database
GPG key ID: 0EA784685083E75B
20 changed files with 1830 additions and 1432 deletions

View file

@ -69,7 +69,7 @@ fn build_eq_builtin<'a, 'ctx>(
builtin: &Builtin<'a>,
) -> BasicValueEnum<'ctx> {
let int_cmp = |pred, label| {
let int_val = env.builder.build_int_compare(
let int_val = env.builder.new_build_int_compare(
pred,
lhs_val.into_int_value(),
rhs_val.into_int_value(),
@ -80,7 +80,7 @@ fn build_eq_builtin<'a, 'ctx>(
};
let float_cmp = |pred, label| {
let int_val = env.builder.build_float_compare(
let int_val = env.builder.new_build_float_compare(
pred,
lhs_val.into_float_value(),
rhs_val.into_float_value(),
@ -197,13 +197,13 @@ fn build_eq<'a, 'ctx>(
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(
let field1_cast = env.builder.new_build_pointer_cast(
lhs_val.into_pointer_value(),
bt.into_pointer_type(),
"i64_to_opaque",
);
let field2_cast = env.builder.build_pointer_cast(
let field2_cast = env.builder.new_build_pointer_cast(
rhs_val.into_pointer_value(),
bt.into_pointer_type(),
"i64_to_opaque",
@ -240,7 +240,7 @@ fn build_neq_builtin<'a, 'ctx>(
builtin: &Builtin<'a>,
) -> BasicValueEnum<'ctx> {
let int_cmp = |pred, label| {
let int_val = env.builder.build_int_compare(
let int_val = env.builder.new_build_int_compare(
pred,
lhs_val.into_int_value(),
rhs_val.into_int_value(),
@ -251,7 +251,7 @@ fn build_neq_builtin<'a, 'ctx>(
};
let float_cmp = |pred, label| {
let int_val = env.builder.build_float_compare(
let int_val = env.builder.new_build_float_compare(
pred,
lhs_val.into_float_value(),
rhs_val.into_float_value(),
@ -297,7 +297,7 @@ fn build_neq_builtin<'a, 'ctx>(
Builtin::Str => {
let is_equal = str_equal(env, lhs_val, rhs_val).into_int_value();
let result: IntValue = env.builder.build_not(is_equal, "negate");
let result: IntValue = env.builder.new_build_not(is_equal, "negate");
result.into()
}
@ -313,7 +313,7 @@ fn build_neq_builtin<'a, 'ctx>(
)
.into_int_value();
let result: IntValue = env.builder.build_not(is_equal, "negate");
let result: IntValue = env.builder.new_build_not(is_equal, "negate");
result.into()
}
@ -358,7 +358,7 @@ fn build_neq<'a, 'ctx>(
)
.into_int_value();
let result: IntValue = env.builder.build_not(is_equal, "negate");
let result: IntValue = env.builder.new_build_not(is_equal, "negate");
result.into()
}
@ -375,7 +375,7 @@ fn build_neq<'a, 'ctx>(
)
.into_int_value();
let result: IntValue = env.builder.build_not(is_equal, "negate");
let result: IntValue = env.builder.new_build_not(is_equal, "negate");
result.into()
}
@ -392,7 +392,7 @@ fn build_neq<'a, 'ctx>(
)
.into_int_value();
let result: IntValue = env.builder.build_not(is_equal, "negate");
let result: IntValue = env.builder.new_build_not(is_equal, "negate");
result.into()
}
@ -456,7 +456,7 @@ fn build_list_eq<'a, 'ctx>(
env.builder.set_current_debug_location(di_location);
let call = env
.builder
.build_call(function, &[list1.into(), list2.into()], "list_eq");
.new_build_call(function, &[list1.into(), list2.into()], "list_eq");
call.set_call_convention(FAST_CALL_CONV);
@ -515,12 +515,12 @@ fn build_list_eq_help<'a, 'ctx>(
let length_equal: IntValue =
env.builder
.build_int_compare(IntPredicate::EQ, len1, len2, "bounds_check");
.new_build_int_compare(IntPredicate::EQ, len1, len2, "bounds_check");
let then_block = ctx.append_basic_block(parent, "then");
env.builder
.build_conditional_branch(length_equal, then_block, return_false);
.new_build_conditional_branch(length_equal, then_block, return_false);
{
// the length is equal; check elements pointwise
@ -536,15 +536,15 @@ fn build_list_eq_help<'a, 'ctx>(
let end = len1;
// allocate a stack slot for the current index
let index_alloca = builder.build_alloca(env.ptr_int(), "index");
builder.build_store(index_alloca, env.ptr_int().const_zero());
let index_alloca = builder.new_build_alloca(env.ptr_int(), "index");
builder.new_build_store(index_alloca, env.ptr_int().const_zero());
let loop_bb = ctx.append_basic_block(parent, "loop");
let body_bb = ctx.append_basic_block(parent, "body");
let increment_bb = ctx.append_basic_block(parent, "increment");
// the "top" of the loop
builder.build_unconditional_branch(loop_bb);
builder.new_build_unconditional_branch(loop_bb);
builder.position_at_end(loop_bb);
let curr_index = builder
@ -553,11 +553,11 @@ fn build_list_eq_help<'a, 'ctx>(
// #index < end
let loop_end_cond =
builder.build_int_compare(IntPredicate::ULT, curr_index, end, "bounds_check");
builder.new_build_int_compare(IntPredicate::ULT, curr_index, end, "bounds_check");
// if we're at the end, and all elements were equal so far, return true
// otherwise check the current elements for equality
builder.build_conditional_branch(loop_end_cond, body_bb, return_true);
builder.new_build_conditional_branch(loop_end_cond, body_bb, return_true);
{
// loop body
@ -590,7 +590,7 @@ fn build_list_eq_help<'a, 'ctx>(
// if the elements are equal, increment the index and check the next element
// otherwise, return false
builder.build_conditional_branch(are_equal, increment_bb, return_false);
builder.new_build_conditional_branch(are_equal, increment_bb, return_false);
}
{
@ -599,25 +599,25 @@ fn build_list_eq_help<'a, 'ctx>(
// constant 1isize
let one = env.ptr_int().const_int(1, false);
let next_index = builder.build_int_add(curr_index, one, "nextindex");
let next_index = builder.new_build_int_add(curr_index, one, "nextindex");
builder.build_store(index_alloca, next_index);
builder.new_build_store(index_alloca, next_index);
// jump back to the top of the loop
builder.build_unconditional_branch(loop_bb);
builder.new_build_unconditional_branch(loop_bb);
}
}
{
env.builder.position_at_end(return_true);
env.builder
.build_return(Some(&env.context.bool_type().const_int(1, false)));
.new_build_return(Some(&env.context.bool_type().const_int(1, false)));
}
{
env.builder.position_at_end(return_false);
env.builder
.build_return(Some(&env.context.bool_type().const_int(0, false)));
.new_build_return(Some(&env.context.bool_type().const_int(0, false)));
}
}
@ -667,7 +667,7 @@ fn build_struct_eq<'a, 'ctx>(
env.builder.set_current_debug_location(di_location);
let call = env
.builder
.build_call(function, &[struct1.into(), struct2.into()], "struct_eq");
.new_build_call(function, &[struct1.into(), struct2.into()], "struct_eq");
call.set_call_convention(FAST_CALL_CONV);
@ -717,7 +717,7 @@ fn build_struct_eq_help<'a, 'ctx>(
let entry = ctx.append_basic_block(parent, "entry");
let start = ctx.append_basic_block(parent, "start");
env.builder.position_at_end(entry);
env.builder.build_unconditional_branch(start);
env.builder.new_build_unconditional_branch(start);
let return_true = ctx.append_basic_block(parent, "return_true");
let return_false = ctx.append_basic_block(parent, "return_false");
@ -757,13 +757,13 @@ fn build_struct_eq_help<'a, 'ctx>(
);
// cast the i64 pointer to a pointer to block of memory
let field1_cast = env.builder.build_pointer_cast(
let field1_cast = env.builder.new_build_pointer_cast(
field1.into_pointer_value(),
bt.into_pointer_type(),
"i64_to_opaque",
);
let field2_cast = env.builder.build_pointer_cast(
let field2_cast = env.builder.new_build_pointer_cast(
field2.into_pointer_value(),
bt.into_pointer_type(),
"i64_to_opaque",
@ -795,22 +795,22 @@ fn build_struct_eq_help<'a, 'ctx>(
current = ctx.append_basic_block(parent, &format!("eq_step_{index}"));
env.builder
.build_conditional_branch(are_equal, current, return_false);
.new_build_conditional_branch(are_equal, current, return_false);
}
env.builder.position_at_end(current);
env.builder.build_unconditional_branch(return_true);
env.builder.new_build_unconditional_branch(return_true);
{
env.builder.position_at_end(return_true);
env.builder
.build_return(Some(&env.context.bool_type().const_int(1, false)));
.new_build_return(Some(&env.context.bool_type().const_int(1, false)));
}
{
env.builder.position_at_end(return_false);
env.builder
.build_return(Some(&env.context.bool_type().const_int(0, false)));
.new_build_return(Some(&env.context.bool_type().const_int(0, false)));
}
}
@ -859,7 +859,7 @@ fn build_tag_eq<'a, 'ctx>(
env.builder.set_current_debug_location(di_location);
let call = env
.builder
.build_call(function, &[tag1.into(), tag2.into()], "tag_eq");
.new_build_call(function, &[tag1.into(), tag2.into()], "tag_eq");
call.set_call_convention(FAST_CALL_CONV);
@ -913,13 +913,13 @@ fn build_tag_eq_help<'a, 'ctx>(
{
env.builder.position_at_end(return_false);
env.builder
.build_return(Some(&env.context.bool_type().const_int(0, false)));
.new_build_return(Some(&env.context.bool_type().const_int(0, false)));
}
{
env.builder.position_at_end(return_true);
env.builder
.build_return(Some(&env.context.bool_type().const_int(1, false)));
.new_build_return(Some(&env.context.bool_type().const_int(1, false)));
}
env.builder.position_at_end(entry);
@ -929,22 +929,22 @@ fn build_tag_eq_help<'a, 'ctx>(
match union_layout {
NonRecursive(&[]) => {
// we're comparing empty tag unions; this code is effectively unreachable
env.builder.build_unreachable();
env.builder.new_build_unreachable();
}
NonRecursive(tags) => {
let ptr_equal = env.builder.build_int_compare(
let ptr_equal = env.builder.new_build_int_compare(
IntPredicate::EQ,
env.builder
.build_ptr_to_int(tag1.into_pointer_value(), env.ptr_int(), "pti"),
.new_build_ptr_to_int(tag1.into_pointer_value(), env.ptr_int(), "pti"),
env.builder
.build_ptr_to_int(tag2.into_pointer_value(), env.ptr_int(), "pti"),
.new_build_ptr_to_int(tag2.into_pointer_value(), env.ptr_int(), "pti"),
"compare_pointers",
);
let compare_tag_ids = ctx.append_basic_block(parent, "compare_tag_ids");
env.builder
.build_conditional_branch(ptr_equal, return_true, compare_tag_ids);
.new_build_conditional_branch(ptr_equal, return_true, compare_tag_ids);
env.builder.position_at_end(compare_tag_ids);
@ -959,10 +959,10 @@ fn build_tag_eq_help<'a, 'ctx>(
let same_tag =
env.builder
.build_int_compare(IntPredicate::EQ, id1, id2, "compare_tag_id");
.new_build_int_compare(IntPredicate::EQ, id1, id2, "compare_tag_id");
env.builder
.build_conditional_branch(same_tag, compare_tag_fields, return_false);
.new_build_conditional_branch(same_tag, compare_tag_fields, return_false);
env.builder.position_at_end(compare_tag_fields);
@ -986,7 +986,7 @@ fn build_tag_eq_help<'a, 'ctx>(
tag2,
);
env.builder.build_return(Some(&answer));
env.builder.new_build_return(Some(&answer));
cases.push((id1.get_type().const_int(tag_id as u64, false), block));
}
@ -995,28 +995,28 @@ fn build_tag_eq_help<'a, 'ctx>(
match cases.pop() {
Some((_, default)) => {
env.builder.build_switch(id1, default, &cases);
env.builder.new_build_switch(id1, default, &cases);
}
None => {
// we're comparing empty tag unions; this code is effectively unreachable
env.builder.build_unreachable();
env.builder.new_build_unreachable();
}
}
}
Recursive(tags) => {
let ptr_equal = env.builder.build_int_compare(
let ptr_equal = env.builder.new_build_int_compare(
IntPredicate::EQ,
env.builder
.build_ptr_to_int(tag1.into_pointer_value(), env.ptr_int(), "pti"),
.new_build_ptr_to_int(tag1.into_pointer_value(), env.ptr_int(), "pti"),
env.builder
.build_ptr_to_int(tag2.into_pointer_value(), env.ptr_int(), "pti"),
.new_build_ptr_to_int(tag2.into_pointer_value(), env.ptr_int(), "pti"),
"compare_pointers",
);
let compare_tag_ids = ctx.append_basic_block(parent, "compare_tag_ids");
env.builder
.build_conditional_branch(ptr_equal, return_true, compare_tag_ids);
.new_build_conditional_branch(ptr_equal, return_true, compare_tag_ids);
env.builder.position_at_end(compare_tag_ids);
@ -1031,10 +1031,10 @@ fn build_tag_eq_help<'a, 'ctx>(
let same_tag =
env.builder
.build_int_compare(IntPredicate::EQ, id1, id2, "compare_tag_id");
.new_build_int_compare(IntPredicate::EQ, id1, id2, "compare_tag_id");
env.builder
.build_conditional_branch(same_tag, compare_tag_fields, return_false);
.new_build_conditional_branch(same_tag, compare_tag_fields, return_false);
env.builder.position_at_end(compare_tag_fields);
@ -1058,7 +1058,7 @@ fn build_tag_eq_help<'a, 'ctx>(
tag2,
);
env.builder.build_return(Some(&answer));
env.builder.new_build_return(Some(&answer));
cases.push((id1.get_type().const_int(tag_id as u64, false), block));
}
@ -1067,15 +1067,15 @@ fn build_tag_eq_help<'a, 'ctx>(
let default = cases.pop().unwrap().1;
env.builder.build_switch(id1, default, &cases);
env.builder.new_build_switch(id1, default, &cases);
}
NullableUnwrapped { other_fields, .. } => {
let ptr_equal = env.builder.build_int_compare(
let ptr_equal = env.builder.new_build_int_compare(
IntPredicate::EQ,
env.builder
.build_ptr_to_int(tag1.into_pointer_value(), env.ptr_int(), "pti"),
.new_build_ptr_to_int(tag1.into_pointer_value(), env.ptr_int(), "pti"),
env.builder
.build_ptr_to_int(tag2.into_pointer_value(), env.ptr_int(), "pti"),
.new_build_ptr_to_int(tag2.into_pointer_value(), env.ptr_int(), "pti"),
"compare_pointers",
);
@ -1083,7 +1083,7 @@ fn build_tag_eq_help<'a, 'ctx>(
let compare_other = ctx.append_basic_block(parent, "compare_other");
env.builder
.build_conditional_branch(ptr_equal, return_true, check_for_null);
.new_build_conditional_branch(ptr_equal, return_true, check_for_null);
// check for NULL
@ -1091,18 +1091,20 @@ fn build_tag_eq_help<'a, 'ctx>(
let is_null_1 = env
.builder
.build_is_null(tag1.into_pointer_value(), "is_null");
.new_build_is_null(tag1.into_pointer_value(), "is_null");
let is_null_2 = env
.builder
.build_is_null(tag2.into_pointer_value(), "is_null");
.new_build_is_null(tag2.into_pointer_value(), "is_null");
let either_null = env.builder.build_or(is_null_1, is_null_2, "either_null");
let either_null = env
.builder
.new_build_or(is_null_1, is_null_2, "either_null");
// logic: the pointers are not the same, if one is NULL, the other one is not
// therefore the two tags are not equal
env.builder
.build_conditional_branch(either_null, return_false, compare_other);
.new_build_conditional_branch(either_null, return_false, compare_other);
// compare the non-null case
@ -1120,18 +1122,18 @@ fn build_tag_eq_help<'a, 'ctx>(
tag2.into_pointer_value(),
);
env.builder.build_return(Some(&answer));
env.builder.new_build_return(Some(&answer));
}
NullableWrapped {
other_tags,
nullable_id,
} => {
let ptr_equal = env.builder.build_int_compare(
let ptr_equal = env.builder.new_build_int_compare(
IntPredicate::EQ,
env.builder
.build_ptr_to_int(tag1.into_pointer_value(), env.ptr_int(), "pti"),
.new_build_ptr_to_int(tag1.into_pointer_value(), env.ptr_int(), "pti"),
env.builder
.build_ptr_to_int(tag2.into_pointer_value(), env.ptr_int(), "pti"),
.new_build_ptr_to_int(tag2.into_pointer_value(), env.ptr_int(), "pti"),
"compare_pointers",
);
@ -1139,7 +1141,7 @@ fn build_tag_eq_help<'a, 'ctx>(
let compare_other = ctx.append_basic_block(parent, "compare_other");
env.builder
.build_conditional_branch(ptr_equal, return_true, check_for_null);
.new_build_conditional_branch(ptr_equal, return_true, check_for_null);
// check for NULL
@ -1147,11 +1149,11 @@ fn build_tag_eq_help<'a, 'ctx>(
let is_null_1 = env
.builder
.build_is_null(tag1.into_pointer_value(), "is_null");
.new_build_is_null(tag1.into_pointer_value(), "is_null");
let is_null_2 = env
.builder
.build_is_null(tag2.into_pointer_value(), "is_null");
.new_build_is_null(tag2.into_pointer_value(), "is_null");
// Logic:
//
@ -1162,15 +1164,15 @@ fn build_tag_eq_help<'a, 'ctx>(
let i8_type = env.context.i8_type();
let sum = env.builder.build_int_add(
let sum = env.builder.new_build_int_add(
env.builder
.build_int_cast_sign_flag(is_null_1, i8_type, false, "to_u8"),
.new_build_int_cast_sign_flag(is_null_1, i8_type, false, "to_u8"),
env.builder
.build_int_cast_sign_flag(is_null_2, i8_type, false, "to_u8"),
.new_build_int_cast_sign_flag(is_null_2, i8_type, false, "to_u8"),
"sum_is_null",
);
env.builder.build_switch(
env.builder.new_build_switch(
sum,
compare_other,
&[
@ -1194,10 +1196,10 @@ fn build_tag_eq_help<'a, 'ctx>(
let same_tag =
env.builder
.build_int_compare(IntPredicate::EQ, id1, id2, "compare_tag_id");
.new_build_int_compare(IntPredicate::EQ, id1, id2, "compare_tag_id");
env.builder
.build_conditional_branch(same_tag, compare_tag_fields, return_false);
.new_build_conditional_branch(same_tag, compare_tag_fields, return_false);
env.builder.position_at_end(compare_tag_fields);
@ -1224,7 +1226,7 @@ fn build_tag_eq_help<'a, 'ctx>(
tag2,
);
env.builder.build_return(Some(&answer));
env.builder.new_build_return(Some(&answer));
cases.push((id1.get_type().const_int(tag_id as u64, false), block));
}
@ -1233,22 +1235,22 @@ fn build_tag_eq_help<'a, 'ctx>(
let default = cases.pop().unwrap().1;
env.builder.build_switch(id1, default, &cases);
env.builder.new_build_switch(id1, default, &cases);
}
NonNullableUnwrapped(field_layouts) => {
let ptr_equal = env.builder.build_int_compare(
let ptr_equal = env.builder.new_build_int_compare(
IntPredicate::EQ,
env.builder
.build_ptr_to_int(tag1.into_pointer_value(), env.ptr_int(), "pti"),
.new_build_ptr_to_int(tag1.into_pointer_value(), env.ptr_int(), "pti"),
env.builder
.build_ptr_to_int(tag2.into_pointer_value(), env.ptr_int(), "pti"),
.new_build_ptr_to_int(tag2.into_pointer_value(), env.ptr_int(), "pti"),
"compare_pointers",
);
let compare_fields = ctx.append_basic_block(parent, "compare_fields");
env.builder
.build_conditional_branch(ptr_equal, return_true, compare_fields);
.new_build_conditional_branch(ptr_equal, return_true, compare_fields);
env.builder.position_at_end(compare_fields);
@ -1264,7 +1266,7 @@ fn build_tag_eq_help<'a, 'ctx>(
tag2.into_pointer_value(),
);
env.builder.build_return(Some(&answer));
env.builder.new_build_return(Some(&answer));
}
}
}
@ -1282,13 +1284,13 @@ fn eq_ptr_to_struct<'a, 'ctx>(
debug_assert!(wrapper_type.is_struct_type());
// cast the opaque pointer to a pointer of the correct shape
let struct1_ptr = env.builder.build_pointer_cast(
let struct1_ptr = env.builder.new_build_pointer_cast(
tag1,
wrapper_type.ptr_type(AddressSpace::default()),
"opaque_to_correct",
);
let struct2_ptr = env.builder.build_pointer_cast(
let struct2_ptr = env.builder.new_build_pointer_cast(
tag2,
wrapper_type.ptr_type(AddressSpace::default()),
"opaque_to_correct",
@ -1368,7 +1370,7 @@ fn build_box_eq<'a, 'ctx>(
env.builder.set_current_debug_location(di_location);
let call = env
.builder
.build_call(function, &[tag1.into(), tag2.into()], "box_eq");
.new_build_call(function, &[tag1.into(), tag2.into()], "box_eq");
call.set_call_convention(FAST_CALL_CONV);
@ -1420,23 +1422,23 @@ fn build_box_eq_help<'a, 'ctx>(
let return_true = ctx.append_basic_block(parent, "return_true");
env.builder.position_at_end(return_true);
env.builder
.build_return(Some(&env.context.bool_type().const_all_ones()));
.new_build_return(Some(&env.context.bool_type().const_all_ones()));
env.builder.position_at_end(entry);
let ptr_equal = env.builder.build_int_compare(
let ptr_equal = env.builder.new_build_int_compare(
IntPredicate::EQ,
env.builder
.build_ptr_to_int(box1.into_pointer_value(), env.ptr_int(), "pti"),
.new_build_ptr_to_int(box1.into_pointer_value(), env.ptr_int(), "pti"),
env.builder
.build_ptr_to_int(box2.into_pointer_value(), env.ptr_int(), "pti"),
.new_build_ptr_to_int(box2.into_pointer_value(), env.ptr_int(), "pti"),
"compare_pointers",
);
let check_null_then_compare_inner_values =
ctx.append_basic_block(parent, "check_null_then_compare_inner_values");
env.builder.build_conditional_branch(
env.builder.new_build_conditional_branch(
ptr_equal,
return_true,
check_null_then_compare_inner_values,
@ -1449,27 +1451,27 @@ fn build_box_eq_help<'a, 'ctx>(
let box1_is_null = env
.builder
.build_is_null(box1.into_pointer_value(), "box1_is_null");
.new_build_is_null(box1.into_pointer_value(), "box1_is_null");
let check_box2_is_null = ctx.append_basic_block(parent, "check_if_box2_is_null");
let return_false = ctx.append_basic_block(parent, "return_false");
let compare_inner_values = ctx.append_basic_block(parent, "compare_inner_values");
env.builder
.build_conditional_branch(box1_is_null, return_false, check_box2_is_null);
.new_build_conditional_branch(box1_is_null, return_false, check_box2_is_null);
{
env.builder.position_at_end(check_box2_is_null);
let box2_is_null = env
.builder
.build_is_null(box2.into_pointer_value(), "box2_is_null");
.new_build_is_null(box2.into_pointer_value(), "box2_is_null");
env.builder
.build_conditional_branch(box2_is_null, return_false, compare_inner_values);
.new_build_conditional_branch(box2_is_null, return_false, compare_inner_values);
}
{
env.builder.position_at_end(return_false);
env.builder
.build_return(Some(&env.context.bool_type().const_zero()));
.new_build_return(Some(&env.context.bool_type().const_zero()));
}
// Compare the inner values.
@ -1504,5 +1506,5 @@ fn build_box_eq_help<'a, 'ctx>(
layout_interner.get_repr(inner_layout),
);
env.builder.build_return(Some(&is_equal));
env.builder.new_build_return(Some(&is_equal));
}