mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-03 19:58:18 +00:00
Merge remote-tracking branch 'origin/main' into remove-nat
This commit is contained in:
commit
24a38c4a26
99 changed files with 2636 additions and 938 deletions
|
@ -1071,17 +1071,19 @@ pub fn module_from_builtins<'ctx>(
|
|||
// Anything not depended on by a `roc_builtin.` function could already by DCE'd theoretically.
|
||||
// That said, this workaround is good enough and fixes compilations times.
|
||||
|
||||
// Also, must_keep is the functions we depend on that would normally be provide by libc.
|
||||
// Also, must_keep is the functions we depend on that would normally be provide by libc or compiler-rt.
|
||||
// They are magically linked to by llvm builtins, so we must specify that they can't be DCE'd.
|
||||
let must_keep = [
|
||||
// Windows special required when floats are used
|
||||
"_fltused",
|
||||
// From libc
|
||||
"floorf",
|
||||
"memcpy",
|
||||
"memset",
|
||||
// I have no idea why this function is special.
|
||||
// Without it, some tests hang on M1 mac outside of nix.
|
||||
// From compiler-rt
|
||||
"__divti3",
|
||||
"__modti3",
|
||||
"__muloti4",
|
||||
// fixes `Undefined Symbol in relocation`
|
||||
"__udivti3",
|
||||
// Roc special functions
|
||||
"__roc_force_longjmp",
|
||||
|
@ -6751,9 +6753,7 @@ pub fn to_cc_return<'a>(
|
|||
) -> CCReturn {
|
||||
let return_size = layout_interner.stack_size(layout);
|
||||
let pass_result_by_pointer = match env.target_info.operating_system {
|
||||
roc_target::OperatingSystem::Windows => {
|
||||
return_size >= 2 * env.target_info.ptr_width() as u32
|
||||
}
|
||||
roc_target::OperatingSystem::Windows => return_size > env.target_info.ptr_width() as u32,
|
||||
roc_target::OperatingSystem::Unix => return_size > 2 * env.target_info.ptr_width() as u32,
|
||||
roc_target::OperatingSystem::Wasi => return_size > 2 * env.target_info.ptr_width() as u32,
|
||||
};
|
||||
|
|
|
@ -533,12 +533,6 @@ pub(crate) fn run_low_level<'a, 'ctx>(
|
|||
bitcode::STR_COUNT_UTF8_BYTES,
|
||||
)
|
||||
}
|
||||
StrGetCapacity => {
|
||||
// Str.capacity : Str -> U64
|
||||
arguments!(string);
|
||||
|
||||
call_bitcode_fn(env, &[string], bitcode::STR_CAPACITY)
|
||||
}
|
||||
StrSubstringUnsafe => {
|
||||
// Str.substringUnsafe : Str, U64, U64 -> Str
|
||||
arguments!(string, start, length);
|
||||
|
@ -2011,6 +2005,54 @@ fn dec_unary_op<'ctx>(
|
|||
}
|
||||
}
|
||||
|
||||
fn dec_binary_op<'ctx>(
|
||||
env: &Env<'_, 'ctx, '_>,
|
||||
fn_name: &str,
|
||||
dec1: BasicValueEnum<'ctx>,
|
||||
dec2: BasicValueEnum<'ctx>,
|
||||
) -> BasicValueEnum<'ctx> {
|
||||
use roc_target::Architecture::*;
|
||||
use roc_target::OperatingSystem::*;
|
||||
|
||||
let dec1 = dec1.into_int_value();
|
||||
let dec2 = dec2.into_int_value();
|
||||
|
||||
match env.target_info {
|
||||
TargetInfo {
|
||||
architecture: X86_64 | X86_32,
|
||||
operating_system: Unix,
|
||||
} => {
|
||||
let (low1, high1) = dec_split_into_words(env, dec1);
|
||||
let (low2, high2) = dec_split_into_words(env, dec2);
|
||||
let lowr_highr = call_bitcode_fn(
|
||||
env,
|
||||
&[low1.into(), high1.into(), low2.into(), high2.into()],
|
||||
fn_name,
|
||||
);
|
||||
|
||||
let block = env.builder.get_insert_block().expect("to be in a function");
|
||||
let parent = block.get_parent().expect("to be in a function");
|
||||
|
||||
let ptr =
|
||||
create_entry_block_alloca(env, parent, env.context.i128_type().into(), "to_i128");
|
||||
env.builder.build_store(ptr, lowr_highr).unwrap();
|
||||
|
||||
env.builder
|
||||
.build_load(env.context.i128_type(), ptr, "to_i128")
|
||||
.unwrap()
|
||||
}
|
||||
TargetInfo {
|
||||
architecture: Wasm32,
|
||||
operating_system: Unix,
|
||||
} => call_bitcode_fn(env, &[dec1.into(), dec2.into()], fn_name),
|
||||
_ => call_bitcode_fn(
|
||||
env,
|
||||
&[dec_alloca(env, dec1), dec_alloca(env, dec2)],
|
||||
fn_name,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
fn dec_binop_with_overflow<'ctx>(
|
||||
env: &Env<'_, 'ctx, '_>,
|
||||
fn_name: &str,
|
||||
|
@ -2229,6 +2271,7 @@ fn build_dec_binop<'a, 'ctx>(
|
|||
&[lhs, rhs],
|
||||
&bitcode::NUM_GREATER_THAN_OR_EQUAL[IntWidth::I128],
|
||||
),
|
||||
NumPow => dec_binary_op(env, bitcode::DEC_POW, lhs, rhs),
|
||||
_ => {
|
||||
unreachable!("Unrecognized dec binary operation: {:?}", op);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue