diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index 3023944cea..82e06fa6eb 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -873,18 +873,24 @@ pub fn build( let opt_level = opt_level_from_flags(matches); - // Note: This allows using `--dev` with `--optimize`. - // This means frontend optimizations and dev backend. - let code_gen_backend = if matches.get_flag(FLAG_DEV) { + let should_run_expects = matches!(opt_level, OptLevel::Development | OptLevel::Normal) && + // TODO: once expect is decoupled from roc launching the executable, remove this part of the conditional. + matches!( + config, + BuildConfig::BuildAndRun | BuildConfig::BuildAndRunIfNoErrors + ); + + let code_gen_backend = if matches!(opt_level, OptLevel::Development) { if matches!(target.architecture(), Architecture::Wasm32) { CodeGenBackend::Wasm } else { CodeGenBackend::Assembly(AssemblyBackendMode::Binary) } } else { - let backend_mode = match opt_level { - OptLevel::Development => LlvmBackendMode::BinaryDev, - OptLevel::Normal | OptLevel::Size | OptLevel::Optimize => LlvmBackendMode::Binary, + let backend_mode = if should_run_expects { + LlvmBackendMode::BinaryWithExpect + } else { + LlvmBackendMode::Binary }; CodeGenBackend::Llvm(backend_mode) @@ -1022,7 +1028,7 @@ pub fn build( roc_run( &arena, path, - opt_level, + should_run_expects, target, args, bytes, @@ -1065,7 +1071,7 @@ pub fn build( roc_run( &arena, path, - opt_level, + should_run_expects, target, args, bytes, @@ -1084,7 +1090,7 @@ pub fn build( fn roc_run<'a, I: IntoIterator>( arena: &Bump, script_path: &Path, - opt_level: OptLevel, + should_run_expects: bool, target: Target, args: I, binary_bytes: &[u8], @@ -1126,7 +1132,7 @@ fn roc_run<'a, I: IntoIterator>( _ => roc_run_native( arena, script_path, - opt_level, + should_run_expects, args, binary_bytes, expect_metadata, @@ -1194,7 +1200,7 @@ fn make_argv_envp<'a, I: IntoIterator, S: AsRef>( fn roc_run_native, S: AsRef>( arena: &Bump, script_path: &Path, - opt_level: OptLevel, + should_run_expects: bool, args: I, binary_bytes: &[u8], expect_metadata: ExpectMetadata, @@ -1216,11 +1222,10 @@ fn roc_run_native, S: AsRef>( .chain([std::ptr::null()]) .collect_in(arena); - match opt_level { - OptLevel::Development => roc_dev_native(arena, executable, argv, envp, expect_metadata), - OptLevel::Normal | OptLevel::Size | OptLevel::Optimize => unsafe { - roc_run_native_fast(executable, &argv, &envp); - }, + if should_run_expects { + roc_dev_native(arena, executable, argv, envp, expect_metadata); + } else { + unsafe { roc_run_native_fast(executable, &argv, &envp) }; } Ok(1) @@ -1458,7 +1463,7 @@ fn roc_run_executable_file_path(binary_bytes: &[u8]) -> std::io::Result, S: AsRef>( arena: &Bump, // This should be passed an owned value, not a reference, so we can usefully mem::forget it! script_path: &Path, - opt_level: OptLevel, + should_run_expects: bool, args: I, binary_bytes: &[u8], _expect_metadata: ExpectMetadata, @@ -1483,14 +1488,11 @@ fn roc_run_native, S: AsRef>( .chain([std::ptr::null()]) .collect_in(arena); - match opt_level { - OptLevel::Development => { - // roc_run_native_debug(executable, &argv, &envp, expectations, interns) - internal_error!("running `expect`s does not currently work on windows") - } - OptLevel::Normal | OptLevel::Size | OptLevel::Optimize => { - roc_run_native_fast(executable, &argv, &envp); - } + if should_run_expects { + // roc_run_native_debug(executable, &argv, &envp, expectations, interns) + internal_error!("running `expect`s does not currently work on windows"); + } else { + roc_run_native_fast(executable, &argv, &envp); } } diff --git a/crates/compiler/gen_llvm/src/llvm/build.rs b/crates/compiler/gen_llvm/src/llvm/build.rs index 9b1e8f5e9e..023ca5c13e 100644 --- a/crates/compiler/gen_llvm/src/llvm/build.rs +++ b/crates/compiler/gen_llvm/src/llvm/build.rs @@ -685,7 +685,7 @@ macro_rules! debug_info_init { pub enum LlvmBackendMode { /// Assumes primitives (roc_alloc, roc_panic, etc) are provided by the host Binary, - BinaryDev, + BinaryWithExpect, /// Creates a test wrapper around the main roc function to catch and report panics. /// Provides a testing implementation of primitives (roc_alloc, roc_panic, etc) BinaryGlue, @@ -698,7 +698,7 @@ impl LlvmBackendMode { pub(crate) fn has_host(self) -> bool { match self { LlvmBackendMode::Binary => true, - LlvmBackendMode::BinaryDev => true, + LlvmBackendMode::BinaryWithExpect => true, LlvmBackendMode::BinaryGlue => false, LlvmBackendMode::GenTest => false, LlvmBackendMode::WasmGenTest => true, @@ -710,7 +710,7 @@ impl LlvmBackendMode { fn returns_roc_result(self) -> bool { match self { LlvmBackendMode::Binary => false, - LlvmBackendMode::BinaryDev => false, + LlvmBackendMode::BinaryWithExpect => false, LlvmBackendMode::BinaryGlue => true, LlvmBackendMode::GenTest => true, LlvmBackendMode::WasmGenTest => true, @@ -721,7 +721,7 @@ impl LlvmBackendMode { pub(crate) fn runs_expects(self) -> bool { match self { LlvmBackendMode::Binary => false, - LlvmBackendMode::BinaryDev => true, + LlvmBackendMode::BinaryWithExpect => true, LlvmBackendMode::BinaryGlue => false, LlvmBackendMode::GenTest => false, LlvmBackendMode::WasmGenTest => false, @@ -3559,12 +3559,10 @@ pub(crate) fn build_exp_stmt<'a, 'ctx>( variable: _, remainder, } => { - if env.mode.runs_expects() { - let location = build_string_literal(env, source_location); - let source = build_string_literal(env, source); - let message = scope.load_symbol(symbol); - env.call_dbg(env, location, source, message); - } + let location = build_string_literal(env, source_location); + let source = build_string_literal(env, source); + let message = scope.load_symbol(symbol); + env.call_dbg(env, location, source, message); build_exp_stmt( env, @@ -3620,7 +3618,7 @@ pub(crate) fn build_exp_stmt<'a, 'ctx>( variables, ); - if let LlvmBackendMode::BinaryDev = env.mode { + if let LlvmBackendMode::BinaryWithExpect = env.mode { crate::llvm::expect::notify_parent_expect(env, &shared_memory); } @@ -4903,7 +4901,9 @@ fn expose_function_to_host_help_c_abi<'a, 'ctx>( ) } - LlvmBackendMode::Binary | LlvmBackendMode::BinaryDev | LlvmBackendMode::BinaryGlue => {} + LlvmBackendMode::Binary + | LlvmBackendMode::BinaryWithExpect + | LlvmBackendMode::BinaryGlue => {} } // a generic version that writes the result into a passed *u8 pointer @@ -4956,13 +4956,13 @@ fn expose_function_to_host_help_c_abi<'a, 'ctx>( roc_call_result_type(env, roc_function.get_type().get_return_type().unwrap()).into() } - LlvmBackendMode::Binary | LlvmBackendMode::BinaryDev | LlvmBackendMode::BinaryGlue => { - basic_type_from_layout( - env, - layout_interner, - layout_interner.get_repr(return_layout), - ) - } + LlvmBackendMode::Binary + | LlvmBackendMode::BinaryWithExpect + | LlvmBackendMode::BinaryGlue => basic_type_from_layout( + env, + layout_interner, + layout_interner.get_repr(return_layout), + ), }; let size: BasicValueEnum = return_type.size_of().unwrap().into(); @@ -5759,7 +5759,7 @@ fn build_procedures_help<'a>( use LlvmBackendMode::*; match env.mode { GenTest | WasmGenTest | CliTest => { /* no host, or exposing types is not supported */ } - Binary | BinaryDev | BinaryGlue => { + Binary | BinaryWithExpect | BinaryGlue => { for (proc_name, alias_name, hels) in host_exposed_lambda_sets.iter() { let ident_string = proc_name.name().as_unsuffixed_str(&env.interns); let fn_name: String = format!("{}_{}", ident_string, hels.id.0); diff --git a/crates/compiler/gen_llvm/src/llvm/expect.rs b/crates/compiler/gen_llvm/src/llvm/expect.rs index a51101906c..84b6324776 100644 --- a/crates/compiler/gen_llvm/src/llvm/expect.rs +++ b/crates/compiler/gen_llvm/src/llvm/expect.rs @@ -29,7 +29,7 @@ pub(crate) struct SharedMemoryPointer<'ctx>(PointerValue<'ctx>); impl<'ctx> SharedMemoryPointer<'ctx> { pub(crate) fn get<'a, 'env>(env: &Env<'a, 'ctx, 'env>) -> Self { - let start_function = if let LlvmBackendMode::BinaryDev = env.mode { + let start_function = if let LlvmBackendMode::BinaryWithExpect = env.mode { bitcode::UTILS_EXPECT_FAILED_START_SHARED_FILE } else { bitcode::UTILS_EXPECT_FAILED_START_SHARED_BUFFER diff --git a/crates/compiler/test_gen/src/helpers/llvm.rs b/crates/compiler/test_gen/src/helpers/llvm.rs index 91ed28dcfc..db1f84fad3 100644 --- a/crates/compiler/test_gen/src/helpers/llvm.rs +++ b/crates/compiler/test_gen/src/helpers/llvm.rs @@ -257,7 +257,7 @@ fn create_llvm_module<'a>( }; let (main_fn_name, main_fn) = match config.mode { LlvmBackendMode::Binary => unreachable!(), - LlvmBackendMode::BinaryDev => unreachable!(), + LlvmBackendMode::BinaryWithExpect => unreachable!(), LlvmBackendMode::BinaryGlue => unreachable!(), LlvmBackendMode::CliTest => unreachable!(), LlvmBackendMode::WasmGenTest => roc_gen_llvm::llvm::build::build_wasm_test_wrapper(