diff --git a/lib/wasix/tests/.gitignore b/lib/wasix/tests/.gitignore index dba9407aa1f..23863bb2249 100644 --- a/lib/wasix/tests/.gitignore +++ b/lib/wasix/tests/.gitignore @@ -1 +1,9 @@ -*/*.test.wasm \ No newline at end of file +*/*.test.wasm +*/*.out +wasix-tests +*/*/* +!*/*/build.sh +!*/*/*.c +!*/*/*.cpp +!*/*/*.hpp +!*/*/*.h \ No newline at end of file diff --git a/lib/wasix/tests/basic_tests.rs b/lib/wasix/tests/basic_tests.rs new file mode 100644 index 00000000000..7b7b7ad8665 --- /dev/null +++ b/lib/wasix/tests/basic_tests.rs @@ -0,0 +1,14 @@ +//! Basic tests from wasix-tests directory +//! +//! These tests verify fundamental functionality: +//! - helloworld: Basic printf and return 0 + +mod wasixcc_test_utils; +use wasixcc_test_utils::{run_build_script, run_wasm}; + +#[test] +fn test_helloworld() { + let wasm_path = run_build_script(file!(), "helloworld").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} diff --git a/lib/wasix/tests/basic_tests/helloworld/build.sh b/lib/wasix/tests/basic_tests/helloworld/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/basic_tests/helloworld/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/basic_tests/helloworld/main.c b/lib/wasix/tests/basic_tests/helloworld/main.c new file mode 100644 index 00000000000..8321e25d317 --- /dev/null +++ b/lib/wasix/tests/basic_tests/helloworld/main.c @@ -0,0 +1,6 @@ +#include + +int main() { + printf("Hello, World!\n"); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/context_switching.rs b/lib/wasix/tests/context_switching.rs index f085cec18d6..728d5548c59 100644 --- a/lib/wasix/tests/context_switching.rs +++ b/lib/wasix/tests/context_switching.rs @@ -1,162 +1,156 @@ -use std::path::PathBuf; -use std::process::Command; -use wasmer::Module; -use wasmer_types::ModuleHash; -use wasmer_wasix::runners::wasi::{RuntimeOrEngine, WasiRunner}; - -fn test_with_wasixcc(name: &str) -> Result<(), anyhow::Error> { - eprintln!("Compiling test case: {}", name); - let test_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("tests") - .join(PathBuf::from( - file!() - .split('/') - .next_back() - .unwrap() - .trim_end_matches(".rs"), - )); - let main_c = test_dir.join(format!("{name}.c")); - let main_wasm = test_dir.join(format!("{name}.test.wasm")); - - // Compile with wasixcc - let mut command = Command::new("wasixcc"); - command - .arg(&main_c) - .arg("-fwasm-exceptions") - .arg("-o") - .arg(&main_wasm) - .current_dir(&test_dir); - eprintln!("Running wasixcc: {:?}", command); - let compile_status = command.status().expect("Failed to run wasixcc"); - assert!(compile_status.success(), "wasixcc compilation failed"); - - // Load the compiled WASM module - let wasm_bytes = std::fs::read(&main_wasm).expect("Failed to read compiled WASM file"); - let engine = wasmer::Engine::default(); - let module = Module::new(&engine, &wasm_bytes).expect("Failed to create module"); - - // Run the WASM module using WasiRunner - let runner = WasiRunner::new(); - runner.run_wasm( - RuntimeOrEngine::Engine(engine), - "wasix-test", - module, - ModuleHash::random(), - ) -} +mod wasixcc_test_utils; +use wasixcc_test_utils::{run_build_script, run_wasm}; // macOS is currently disabled, because cranelift does not // support exception handling on that platform yet. #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_simple_switching() { - test_with_wasixcc("simple_switching").unwrap(); + let wasm_path = run_build_script(file!(), "simple_switching").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_switching_with_main() { - test_with_wasixcc("switching_with_main").unwrap(); + let wasm_path = run_build_script(file!(), "switching_with_main").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_switching_to_a_deleted_context() { - test_with_wasixcc("switching_to_a_deleted_context").unwrap(); + let wasm_path = run_build_script(file!(), "switching_to_a_deleted_context").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_switching_threads() { - test_with_wasixcc("switching_in_threads").unwrap(); + let wasm_path = run_build_script(file!(), "switching_in_threads").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_multiple_contexts() { - test_with_wasixcc("multiple_contexts").unwrap(); + let wasm_path = run_build_script(file!(), "multiple_contexts").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_error_handling() { - test_with_wasixcc("error_handling").unwrap(); + let wasm_path = run_build_script(file!(), "error_handling").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_nested_switches() { - test_with_wasixcc("nested_switches").unwrap(); + let wasm_path = run_build_script(file!(), "nested_switches").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_contexts_with_mutexes() { - test_with_wasixcc("contexts_with_mutexes").unwrap(); + let wasm_path = run_build_script(file!(), "contexts_with_mutexes").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_contexts_with_env_vars() { - test_with_wasixcc("contexts_with_env_vars").unwrap(); + let wasm_path = run_build_script(file!(), "contexts_with_env_vars").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_contexts_with_signals() { - test_with_wasixcc("contexts_with_signals").unwrap(); + let wasm_path = run_build_script(file!(), "contexts_with_signals").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_contexts_with_timers() { - test_with_wasixcc("contexts_with_timers").unwrap(); + let wasm_path = run_build_script(file!(), "contexts_with_timers").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_contexts_with_pipes() { - test_with_wasixcc("contexts_with_pipes").unwrap(); + let wasm_path = run_build_script(file!(), "contexts_with_pipes").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_pending_file_operations() { - test_with_wasixcc("pending_file_operations").unwrap(); + let wasm_path = run_build_script(file!(), "pending_file_operations").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_recursive_host_calls() { - test_with_wasixcc("recursive_host_calls").unwrap(); + let wasm_path = run_build_script(file!(), "recursive_host_calls").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_malloc_during_switch() { - test_with_wasixcc("malloc_during_switch").unwrap(); + let wasm_path = run_build_script(file!(), "malloc_during_switch").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_nested_host_call_switch() { - test_with_wasixcc("nested_host_call_switch").unwrap(); + let wasm_path = run_build_script(file!(), "nested_host_call_switch").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_switch_to_never_resumed() { - test_with_wasixcc("switch_to_never_resumed").unwrap(); + let wasm_path = run_build_script(file!(), "switch_to_never_resumed").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_three_way_recursion() { - test_with_wasixcc("three_way_recursion").unwrap(); + let wasm_path = run_build_script(file!(), "three_way_recursion").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } #[cfg(all(unix, not(target_os = "macos")))] #[test] fn test_contexts_with_setjmp() { - test_with_wasixcc("contexts_with_setjmp").unwrap(); + let wasm_path = run_build_script(file!(), "contexts_with_setjmp").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); } diff --git a/lib/wasix/tests/context_switching/contexts_with_env_vars/build.sh b/lib/wasix/tests/context_switching/contexts_with_env_vars/build.sh new file mode 100755 index 00000000000..359a9cb3fbd --- /dev/null +++ b/lib/wasix/tests/context_switching/contexts_with_env_vars/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC contexts_with_env_vars.c -o main diff --git a/lib/wasix/tests/context_switching/contexts_with_env_vars.c b/lib/wasix/tests/context_switching/contexts_with_env_vars/contexts_with_env_vars.c similarity index 100% rename from lib/wasix/tests/context_switching/contexts_with_env_vars.c rename to lib/wasix/tests/context_switching/contexts_with_env_vars/contexts_with_env_vars.c diff --git a/lib/wasix/tests/context_switching/contexts_with_mutexes/build.sh b/lib/wasix/tests/context_switching/contexts_with_mutexes/build.sh new file mode 100755 index 00000000000..94832c47b7d --- /dev/null +++ b/lib/wasix/tests/context_switching/contexts_with_mutexes/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC contexts_with_mutexes.c -o main diff --git a/lib/wasix/tests/context_switching/contexts_with_mutexes.c b/lib/wasix/tests/context_switching/contexts_with_mutexes/contexts_with_mutexes.c similarity index 100% rename from lib/wasix/tests/context_switching/contexts_with_mutexes.c rename to lib/wasix/tests/context_switching/contexts_with_mutexes/contexts_with_mutexes.c diff --git a/lib/wasix/tests/context_switching/contexts_with_pipes/build.sh b/lib/wasix/tests/context_switching/contexts_with_pipes/build.sh new file mode 100755 index 00000000000..50e8b191762 --- /dev/null +++ b/lib/wasix/tests/context_switching/contexts_with_pipes/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC contexts_with_pipes.c -o main diff --git a/lib/wasix/tests/context_switching/contexts_with_pipes.c b/lib/wasix/tests/context_switching/contexts_with_pipes/contexts_with_pipes.c similarity index 100% rename from lib/wasix/tests/context_switching/contexts_with_pipes.c rename to lib/wasix/tests/context_switching/contexts_with_pipes/contexts_with_pipes.c diff --git a/lib/wasix/tests/context_switching/contexts_with_setjmp/build.sh b/lib/wasix/tests/context_switching/contexts_with_setjmp/build.sh new file mode 100755 index 00000000000..9d3d117a8e7 --- /dev/null +++ b/lib/wasix/tests/context_switching/contexts_with_setjmp/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC contexts_with_setjmp.c -o main diff --git a/lib/wasix/tests/context_switching/contexts_with_setjmp.c b/lib/wasix/tests/context_switching/contexts_with_setjmp/contexts_with_setjmp.c similarity index 100% rename from lib/wasix/tests/context_switching/contexts_with_setjmp.c rename to lib/wasix/tests/context_switching/contexts_with_setjmp/contexts_with_setjmp.c diff --git a/lib/wasix/tests/context_switching/contexts_with_signals/build.sh b/lib/wasix/tests/context_switching/contexts_with_signals/build.sh new file mode 100755 index 00000000000..1627ba0e4c1 --- /dev/null +++ b/lib/wasix/tests/context_switching/contexts_with_signals/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC contexts_with_signals.c -o main diff --git a/lib/wasix/tests/context_switching/contexts_with_signals.c b/lib/wasix/tests/context_switching/contexts_with_signals/contexts_with_signals.c similarity index 100% rename from lib/wasix/tests/context_switching/contexts_with_signals.c rename to lib/wasix/tests/context_switching/contexts_with_signals/contexts_with_signals.c diff --git a/lib/wasix/tests/context_switching/contexts_with_timers/build.sh b/lib/wasix/tests/context_switching/contexts_with_timers/build.sh new file mode 100755 index 00000000000..02be93066c9 --- /dev/null +++ b/lib/wasix/tests/context_switching/contexts_with_timers/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC contexts_with_timers.c -o main diff --git a/lib/wasix/tests/context_switching/contexts_with_timers.c b/lib/wasix/tests/context_switching/contexts_with_timers/contexts_with_timers.c similarity index 100% rename from lib/wasix/tests/context_switching/contexts_with_timers.c rename to lib/wasix/tests/context_switching/contexts_with_timers/contexts_with_timers.c diff --git a/lib/wasix/tests/context_switching/error_handling/build.sh b/lib/wasix/tests/context_switching/error_handling/build.sh new file mode 100755 index 00000000000..8bde2bc9c5f --- /dev/null +++ b/lib/wasix/tests/context_switching/error_handling/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC error_handling.c -o main diff --git a/lib/wasix/tests/context_switching/error_handling.c b/lib/wasix/tests/context_switching/error_handling/error_handling.c similarity index 100% rename from lib/wasix/tests/context_switching/error_handling.c rename to lib/wasix/tests/context_switching/error_handling/error_handling.c diff --git a/lib/wasix/tests/context_switching/malloc_during_switch/build.sh b/lib/wasix/tests/context_switching/malloc_during_switch/build.sh new file mode 100755 index 00000000000..440132bb0aa --- /dev/null +++ b/lib/wasix/tests/context_switching/malloc_during_switch/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC malloc_during_switch.c -o main diff --git a/lib/wasix/tests/context_switching/malloc_during_switch.c b/lib/wasix/tests/context_switching/malloc_during_switch/malloc_during_switch.c similarity index 100% rename from lib/wasix/tests/context_switching/malloc_during_switch.c rename to lib/wasix/tests/context_switching/malloc_during_switch/malloc_during_switch.c diff --git a/lib/wasix/tests/context_switching/multiple_contexts/build.sh b/lib/wasix/tests/context_switching/multiple_contexts/build.sh new file mode 100755 index 00000000000..eaf5cb60e34 --- /dev/null +++ b/lib/wasix/tests/context_switching/multiple_contexts/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC multiple_contexts.c -o main diff --git a/lib/wasix/tests/context_switching/multiple_contexts.c b/lib/wasix/tests/context_switching/multiple_contexts/multiple_contexts.c similarity index 100% rename from lib/wasix/tests/context_switching/multiple_contexts.c rename to lib/wasix/tests/context_switching/multiple_contexts/multiple_contexts.c diff --git a/lib/wasix/tests/context_switching/nested_host_call_switch/build.sh b/lib/wasix/tests/context_switching/nested_host_call_switch/build.sh new file mode 100755 index 00000000000..0cb4356e018 --- /dev/null +++ b/lib/wasix/tests/context_switching/nested_host_call_switch/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC nested_host_call_switch.c -o main diff --git a/lib/wasix/tests/context_switching/nested_host_call_switch.c b/lib/wasix/tests/context_switching/nested_host_call_switch/nested_host_call_switch.c similarity index 100% rename from lib/wasix/tests/context_switching/nested_host_call_switch.c rename to lib/wasix/tests/context_switching/nested_host_call_switch/nested_host_call_switch.c diff --git a/lib/wasix/tests/context_switching/nested_switches/build.sh b/lib/wasix/tests/context_switching/nested_switches/build.sh new file mode 100755 index 00000000000..5e767a260b4 --- /dev/null +++ b/lib/wasix/tests/context_switching/nested_switches/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC nested_switches.c -o main diff --git a/lib/wasix/tests/context_switching/nested_switches.c b/lib/wasix/tests/context_switching/nested_switches/nested_switches.c similarity index 100% rename from lib/wasix/tests/context_switching/nested_switches.c rename to lib/wasix/tests/context_switching/nested_switches/nested_switches.c diff --git a/lib/wasix/tests/context_switching/pending_file_operations/build.sh b/lib/wasix/tests/context_switching/pending_file_operations/build.sh new file mode 100755 index 00000000000..a469994a5ee --- /dev/null +++ b/lib/wasix/tests/context_switching/pending_file_operations/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC pending_file_operations.c -o main diff --git a/lib/wasix/tests/context_switching/pending_file_operations.c b/lib/wasix/tests/context_switching/pending_file_operations/pending_file_operations.c similarity index 100% rename from lib/wasix/tests/context_switching/pending_file_operations.c rename to lib/wasix/tests/context_switching/pending_file_operations/pending_file_operations.c diff --git a/lib/wasix/tests/context_switching/recursive_host_calls/build.sh b/lib/wasix/tests/context_switching/recursive_host_calls/build.sh new file mode 100755 index 00000000000..dc2cc5da6e5 --- /dev/null +++ b/lib/wasix/tests/context_switching/recursive_host_calls/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC recursive_host_calls.c -o main diff --git a/lib/wasix/tests/context_switching/recursive_host_calls.c b/lib/wasix/tests/context_switching/recursive_host_calls/recursive_host_calls.c similarity index 100% rename from lib/wasix/tests/context_switching/recursive_host_calls.c rename to lib/wasix/tests/context_switching/recursive_host_calls/recursive_host_calls.c diff --git a/lib/wasix/tests/context_switching/simple_switching/build.sh b/lib/wasix/tests/context_switching/simple_switching/build.sh new file mode 100755 index 00000000000..acad6b04ba8 --- /dev/null +++ b/lib/wasix/tests/context_switching/simple_switching/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC simple_switching.c -o main diff --git a/lib/wasix/tests/context_switching/simple_switching.c b/lib/wasix/tests/context_switching/simple_switching/simple_switching.c similarity index 100% rename from lib/wasix/tests/context_switching/simple_switching.c rename to lib/wasix/tests/context_switching/simple_switching/simple_switching.c diff --git a/lib/wasix/tests/context_switching/switch_to_never_resumed/build.sh b/lib/wasix/tests/context_switching/switch_to_never_resumed/build.sh new file mode 100755 index 00000000000..3d407fd8127 --- /dev/null +++ b/lib/wasix/tests/context_switching/switch_to_never_resumed/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC switch_to_never_resumed.c -o main diff --git a/lib/wasix/tests/context_switching/switch_to_never_resumed.c b/lib/wasix/tests/context_switching/switch_to_never_resumed/switch_to_never_resumed.c similarity index 100% rename from lib/wasix/tests/context_switching/switch_to_never_resumed.c rename to lib/wasix/tests/context_switching/switch_to_never_resumed/switch_to_never_resumed.c diff --git a/lib/wasix/tests/context_switching/switching_in_threads/build.sh b/lib/wasix/tests/context_switching/switching_in_threads/build.sh new file mode 100755 index 00000000000..e88f7f254a7 --- /dev/null +++ b/lib/wasix/tests/context_switching/switching_in_threads/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC switching_in_threads.c -o main diff --git a/lib/wasix/tests/context_switching/switching_in_threads.c b/lib/wasix/tests/context_switching/switching_in_threads/switching_in_threads.c similarity index 100% rename from lib/wasix/tests/context_switching/switching_in_threads.c rename to lib/wasix/tests/context_switching/switching_in_threads/switching_in_threads.c diff --git a/lib/wasix/tests/context_switching/switching_to_a_deleted_context/build.sh b/lib/wasix/tests/context_switching/switching_to_a_deleted_context/build.sh new file mode 100755 index 00000000000..c51c2340b42 --- /dev/null +++ b/lib/wasix/tests/context_switching/switching_to_a_deleted_context/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC switching_to_a_deleted_context.c -o main diff --git a/lib/wasix/tests/context_switching/switching_to_a_deleted_context.c b/lib/wasix/tests/context_switching/switching_to_a_deleted_context/switching_to_a_deleted_context.c similarity index 100% rename from lib/wasix/tests/context_switching/switching_to_a_deleted_context.c rename to lib/wasix/tests/context_switching/switching_to_a_deleted_context/switching_to_a_deleted_context.c diff --git a/lib/wasix/tests/context_switching/switching_with_main/build.sh b/lib/wasix/tests/context_switching/switching_with_main/build.sh new file mode 100755 index 00000000000..1bce93f148d --- /dev/null +++ b/lib/wasix/tests/context_switching/switching_with_main/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC switching_with_main.c -o main diff --git a/lib/wasix/tests/context_switching/switching_with_main.c b/lib/wasix/tests/context_switching/switching_with_main/switching_with_main.c similarity index 100% rename from lib/wasix/tests/context_switching/switching_with_main.c rename to lib/wasix/tests/context_switching/switching_with_main/switching_with_main.c diff --git a/lib/wasix/tests/context_switching/three_way_recursion/build.sh b/lib/wasix/tests/context_switching/three_way_recursion/build.sh new file mode 100755 index 00000000000..36a759c7e4b --- /dev/null +++ b/lib/wasix/tests/context_switching/three_way_recursion/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC three_way_recursion.c -o main diff --git a/lib/wasix/tests/context_switching/three_way_recursion.c b/lib/wasix/tests/context_switching/three_way_recursion/three_way_recursion.c similarity index 100% rename from lib/wasix/tests/context_switching/three_way_recursion.c rename to lib/wasix/tests/context_switching/three_way_recursion/three_way_recursion.c diff --git a/lib/wasix/tests/exception_tests.rs b/lib/wasix/tests/exception_tests.rs new file mode 100644 index 00000000000..bb3c22a053e --- /dev/null +++ b/lib/wasix/tests/exception_tests.rs @@ -0,0 +1,71 @@ +mod wasixcc_test_utils; +use wasixcc_test_utils::{run_build_script, run_wasm}; + +#[test] +fn simple_exceptions() { + let wasm = run_build_script(file!(), "simple-exceptions").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn simple_exceptions_with_lto() { + let wasm = run_build_script(file!(), "simple-exceptions-with-lto").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn simple_exceptions_with_shared_lib_in_callstack() { + let wasm = run_build_script(file!(), "simple-exceptions-with-shared-lib-in-callstack").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn simple_exceptions_with_shared_lib_present() { + let wasm = run_build_script(file!(), "simple-exceptions-with-shared-lib-present").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn exceptions_catchall_in_shared_lib() { + let wasm = run_build_script(file!(), "exceptions-catchall-in-shared-lib").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn exceptions_in_main_and_shared() { + let wasm = run_build_script(file!(), "exceptions-in-main-and-shared").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +// Grid tests for exceptions-across-modules with different combinations +// of static/shared linking for thrower and catcher modules + +#[test] +fn static_thrower_static_catcher() { + let wasm = run_build_script(file!(), "static-thrower-static-catcher").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn static_thrower_shared_catcher() { + let wasm = run_build_script(file!(), "static-thrower-shared-catcher").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn shared_thrower_static_catcher() { + let wasm = run_build_script(file!(), "shared-thrower-static-catcher").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn shared_thrower_shared_catcher() { + let wasm = run_build_script(file!(), "shared-thrower-shared-catcher").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn static_thrower_via_shared_proxy_static_catcher() { + let wasm = run_build_script(file!(), "static-thrower-via-shared-proxy-static-catcher").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} diff --git a/lib/wasix/tests/exception_tests/exceptions-across-modules/catcher.cpp b/lib/wasix/tests/exception_tests/exceptions-across-modules/catcher.cpp new file mode 100644 index 00000000000..4d0a3a5174e --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-across-modules/catcher.cpp @@ -0,0 +1,10 @@ +#include +#include "thrower.hpp" + +void catch_exception() { + try { + throw_exception(); + } catch (const char* msg) { + printf("Caught exception: %s\n", msg); + } +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/exceptions-across-modules/catcher.hpp b/lib/wasix/tests/exception_tests/exceptions-across-modules/catcher.hpp new file mode 100644 index 00000000000..5c90f4a7c7d --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-across-modules/catcher.hpp @@ -0,0 +1 @@ +void catch_exception(); \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/exceptions-across-modules/main.cpp b/lib/wasix/tests/exception_tests/exceptions-across-modules/main.cpp new file mode 100644 index 00000000000..a10f163777f --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-across-modules/main.cpp @@ -0,0 +1,16 @@ +#include +#ifdef STATIC_THROWER +#include "thrower.cpp" +#else +#include "thrower.hpp" +#endif +#ifdef STATIC_CATCHER +#include "catcher.cpp" +#else +#include "catcher.hpp" +#endif + +int main() { + catch_exception(); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/exceptions-across-modules/proxy.cpp b/lib/wasix/tests/exception_tests/exceptions-across-modules/proxy.cpp new file mode 100644 index 00000000000..c8e68e30265 --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-across-modules/proxy.cpp @@ -0,0 +1,5 @@ +#include "thrower.hpp" + +void throw_exception_proxy() { + // throw_exception(); +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/exceptions-across-modules/proxy.hpp b/lib/wasix/tests/exception_tests/exceptions-across-modules/proxy.hpp new file mode 100644 index 00000000000..0eace030636 --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-across-modules/proxy.hpp @@ -0,0 +1 @@ +void throw_exception_proxy(); \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/exceptions-across-modules/thrower.cpp b/lib/wasix/tests/exception_tests/exceptions-across-modules/thrower.cpp new file mode 100644 index 00000000000..10d576a47cd --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-across-modules/thrower.cpp @@ -0,0 +1,3 @@ +void throw_exception() { + throw "An exception occurred!"; +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/exceptions-across-modules/thrower.hpp b/lib/wasix/tests/exception_tests/exceptions-across-modules/thrower.hpp new file mode 100644 index 00000000000..28f7e1e97a4 --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-across-modules/thrower.hpp @@ -0,0 +1 @@ +void throw_exception(); \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/exceptions-catchall-in-shared-lib/build.sh b/lib/wasix/tests/exception_tests/exceptions-catchall-in-shared-lib/build.sh new file mode 100755 index 00000000000..40915216765 --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-catchall-in-shared-lib/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC library.cpp -o library.o +$CXX -shared library.o -o liblibrary.so +$CXX main.cpp -L$PWD -Wl,--no-as-needed -llibrary -o main diff --git a/lib/wasix/tests/exception_tests/exceptions-catchall-in-shared-lib/library.cpp b/lib/wasix/tests/exception_tests/exceptions-catchall-in-shared-lib/library.cpp new file mode 100644 index 00000000000..670ae6c7cfd --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-catchall-in-shared-lib/library.cpp @@ -0,0 +1,10 @@ +#include + +int try_catch_in_lib() { + try { + throw "An exception occurred!"; + } catch (...) { + printf("Caught some exception\n"); + } + return 42; +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/exceptions-catchall-in-shared-lib/library.hpp b/lib/wasix/tests/exception_tests/exceptions-catchall-in-shared-lib/library.hpp new file mode 100644 index 00000000000..5e6348fd28d --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-catchall-in-shared-lib/library.hpp @@ -0,0 +1 @@ +int try_catch_in_lib(); \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/exceptions-catchall-in-shared-lib/main.cpp b/lib/wasix/tests/exception_tests/exceptions-catchall-in-shared-lib/main.cpp new file mode 100644 index 00000000000..cbfb07f80d7 --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-catchall-in-shared-lib/main.cpp @@ -0,0 +1,9 @@ +#include +#include +#include "library.hpp" + + +int main() { + try_catch_in_lib(); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/exceptions-in-main-and-shared/build.sh b/lib/wasix/tests/exception_tests/exceptions-in-main-and-shared/build.sh new file mode 100755 index 00000000000..40915216765 --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-in-main-and-shared/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC library.cpp -o library.o +$CXX -shared library.o -o liblibrary.so +$CXX main.cpp -L$PWD -Wl,--no-as-needed -llibrary -o main diff --git a/lib/wasix/tests/exception_tests/exceptions-in-main-and-shared/library.cpp b/lib/wasix/tests/exception_tests/exceptions-in-main-and-shared/library.cpp new file mode 100644 index 00000000000..670ae6c7cfd --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-in-main-and-shared/library.cpp @@ -0,0 +1,10 @@ +#include + +int try_catch_in_lib() { + try { + throw "An exception occurred!"; + } catch (...) { + printf("Caught some exception\n"); + } + return 42; +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/exceptions-in-main-and-shared/library.hpp b/lib/wasix/tests/exception_tests/exceptions-in-main-and-shared/library.hpp new file mode 100644 index 00000000000..5e6348fd28d --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-in-main-and-shared/library.hpp @@ -0,0 +1 @@ +int try_catch_in_lib(); \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/exceptions-in-main-and-shared/main.cpp b/lib/wasix/tests/exception_tests/exceptions-in-main-and-shared/main.cpp new file mode 100644 index 00000000000..8f8afedb390 --- /dev/null +++ b/lib/wasix/tests/exception_tests/exceptions-in-main-and-shared/main.cpp @@ -0,0 +1,18 @@ +#include +#include +#include "library.hpp" + +int try_catch_in_main() { + try { + throw "An exception occurred!"; + } catch (...) { + printf("Caught some exception\n"); + } + return 42; +} + +int main() { + try_catch_in_main(); + try_catch_in_lib(); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/shared-thrower-shared-catcher/build.sh b/lib/wasix/tests/exception_tests/shared-thrower-shared-catcher/build.sh new file mode 100755 index 00000000000..b3db8fb05e1 --- /dev/null +++ b/lib/wasix/tests/exception_tests/shared-thrower-shared-catcher/build.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -e +# shared-thrower-shared-catcher: both in shared libs +$CXX -c -fPIC ../exceptions-across-modules/thrower.cpp -o thrower.o +$CXX -shared thrower.o -o libthrower.so +$CXX -c -fPIC ../exceptions-across-modules/catcher.cpp -o catcher.o +$CXX -shared catcher.o -o libcatcher.so +$CXX ../exceptions-across-modules/main.cpp -L$PWD -Wl,--no-as-needed -lthrower -lcatcher -o main diff --git a/lib/wasix/tests/exception_tests/shared-thrower-static-catcher/build.sh b/lib/wasix/tests/exception_tests/shared-thrower-static-catcher/build.sh new file mode 100755 index 00000000000..ff23536206b --- /dev/null +++ b/lib/wasix/tests/exception_tests/shared-thrower-static-catcher/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -e +# shared-thrower-static-catcher: thrower in shared lib, catcher static +$CXX -c -fPIC ../exceptions-across-modules/thrower.cpp -o thrower.o +$CXX -shared thrower.o -o libthrower.so +$CXX -c -DSTATIC_CATCHER ../exceptions-across-modules/main.cpp -o main.o +$CXX main.o -L$PWD -Wl,--no-as-needed -lthrower -o main diff --git a/lib/wasix/tests/exception_tests/simple-exceptions-with-lto/build.sh b/lib/wasix/tests/exception_tests/simple-exceptions-with-lto/build.sh new file mode 100755 index 00000000000..9661f7eff13 --- /dev/null +++ b/lib/wasix/tests/exception_tests/simple-exceptions-with-lto/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CXX -c -flto main.cpp -o main.o +$CXX -flto main.o -o main diff --git a/lib/wasix/tests/exception_tests/simple-exceptions-with-lto/main.cpp b/lib/wasix/tests/exception_tests/simple-exceptions-with-lto/main.cpp new file mode 100644 index 00000000000..d38492eee9b --- /dev/null +++ b/lib/wasix/tests/exception_tests/simple-exceptions-with-lto/main.cpp @@ -0,0 +1,10 @@ +#include + +int main() { + try { + throw "An exception occurred!"; + } catch (const char* msg) { + printf("Caught exception: %s\n", msg); + } + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-in-callstack/build.sh b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-in-callstack/build.sh new file mode 100755 index 00000000000..5eed3e51638 --- /dev/null +++ b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-in-callstack/build.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC library.cpp -o library.o +$CXX -shared library.o -o liblibrary.so +$CXX -c main.cpp -o main.o +$CXX main.o -L$PWD -Wl,--no-as-needed -llibrary -o main diff --git a/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-in-callstack/library.cpp b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-in-callstack/library.cpp new file mode 100644 index 00000000000..2124a4db356 --- /dev/null +++ b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-in-callstack/library.cpp @@ -0,0 +1,6 @@ +void throw_exception(); + +int get_number_from_library() { + throw_exception(); + return 42; +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-in-callstack/library.hpp b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-in-callstack/library.hpp new file mode 100644 index 00000000000..1ac1aabe012 --- /dev/null +++ b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-in-callstack/library.hpp @@ -0,0 +1 @@ +int get_number_from_library(); \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-in-callstack/main.cpp b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-in-callstack/main.cpp new file mode 100644 index 00000000000..0e8260a2b6f --- /dev/null +++ b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-in-callstack/main.cpp @@ -0,0 +1,18 @@ +#include +#include +#include "library.hpp" + +void throw_exception() { + throw "An exception occurred!"; +} + +int main() { + try { + // This function calls throw_exception() from the shared library. + int number = get_number_from_library(); + assert(number == 42); + } catch (const char* msg) { + printf("Caught exception: %s\n", msg); + } + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-present/build.sh b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-present/build.sh new file mode 100755 index 00000000000..40915216765 --- /dev/null +++ b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-present/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC library.cpp -o library.o +$CXX -shared library.o -o liblibrary.so +$CXX main.cpp -L$PWD -Wl,--no-as-needed -llibrary -o main diff --git a/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-present/library.cpp b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-present/library.cpp new file mode 100644 index 00000000000..4de7dbde1af --- /dev/null +++ b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-present/library.cpp @@ -0,0 +1,3 @@ +int get_number_from_library() { + return 42; +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-present/library.hpp b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-present/library.hpp new file mode 100644 index 00000000000..1ac1aabe012 --- /dev/null +++ b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-present/library.hpp @@ -0,0 +1 @@ +int get_number_from_library(); \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-present/main.cpp b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-present/main.cpp new file mode 100644 index 00000000000..221234a69f0 --- /dev/null +++ b/lib/wasix/tests/exception_tests/simple-exceptions-with-shared-lib-present/main.cpp @@ -0,0 +1,16 @@ +#include +#include +#include "library.hpp" + +int main() { + try { + // See if the presence of a shared library changes anything. + int number = get_number_from_library(); + assert(number == 42); + + throw "An exception occurred!"; + } catch (const char* msg) { + printf("Caught exception: %s\n", msg); + } + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/simple-exceptions/build.sh b/lib/wasix/tests/exception_tests/simple-exceptions/build.sh new file mode 100755 index 00000000000..69a0f5c7183 --- /dev/null +++ b/lib/wasix/tests/exception_tests/simple-exceptions/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CXX -c main.cpp -o main.o +$CXX main.o -o main diff --git a/lib/wasix/tests/exception_tests/simple-exceptions/main.cpp b/lib/wasix/tests/exception_tests/simple-exceptions/main.cpp new file mode 100644 index 00000000000..d38492eee9b --- /dev/null +++ b/lib/wasix/tests/exception_tests/simple-exceptions/main.cpp @@ -0,0 +1,10 @@ +#include + +int main() { + try { + throw "An exception occurred!"; + } catch (const char* msg) { + printf("Caught exception: %s\n", msg); + } + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/exception_tests/static-thrower-shared-catcher/build.sh b/lib/wasix/tests/exception_tests/static-thrower-shared-catcher/build.sh new file mode 100755 index 00000000000..62c071ae83d --- /dev/null +++ b/lib/wasix/tests/exception_tests/static-thrower-shared-catcher/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -e +# static-thrower-shared-catcher: thrower static, catcher in shared lib +$CXX -c -fPIC ../exceptions-across-modules/catcher.cpp -o catcher.o +$CXX -shared catcher.o -o libcatcher.so +$CXX -c -DSTATIC_THROWER ../exceptions-across-modules/main.cpp -o main.o +$CXX main.o -L$PWD -Wl,--no-as-needed -lcatcher -o main diff --git a/lib/wasix/tests/exception_tests/static-thrower-static-catcher/build.sh b/lib/wasix/tests/exception_tests/static-thrower-static-catcher/build.sh new file mode 100755 index 00000000000..44458efe81c --- /dev/null +++ b/lib/wasix/tests/exception_tests/static-thrower-static-catcher/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +# static-thrower-static-catcher: both statically linked +$CXX -c -DSTATIC_THROWER -DSTATIC_CATCHER ../exceptions-across-modules/main.cpp -o main.o +$CXX main.o -o main diff --git a/lib/wasix/tests/exception_tests/static-thrower-via-shared-proxy-static-catcher/build.sh b/lib/wasix/tests/exception_tests/static-thrower-via-shared-proxy-static-catcher/build.sh new file mode 100755 index 00000000000..3245dbb75e8 --- /dev/null +++ b/lib/wasix/tests/exception_tests/static-thrower-via-shared-proxy-static-catcher/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -e +# static-thrower-via-shared-proxy-static-catcher: thrower and catcher static, proxy in shared lib +$CXX -c -fPIC ../exceptions-across-modules/proxy.cpp -o proxy.o +$CXX -shared proxy.o -o libproxy.so +$CXX -c -DSTATIC_THROWER -DSTATIC_CATCHER -DTHROW_VIA_PROXY ../exceptions-across-modules/main.cpp -o main.o +$CXX main.o -L$PWD -Wl,--no-as-needed -lproxy -o main diff --git a/lib/wasix/tests/exit_tests.rs b/lib/wasix/tests/exit_tests.rs new file mode 100644 index 00000000000..e1d7ea7edc3 --- /dev/null +++ b/lib/wasix/tests/exit_tests.rs @@ -0,0 +1,102 @@ +//! Exit tests from wasix-tests directory +//! +//! These tests verify various exit scenarios: +//! - exit-zero/exit-nonzero: Basic exit with status codes +//! - exit-*-in-thread: Exit from a pthread +//! - exit-*-in-fficall: Exit from an FFI callback +//! - exit-*-in-dyncall-thread: Exit from dynamically called thread +//! - exit-*-in-fficall-thread: Exit from FFI callback in thread + +mod wasixcc_test_utils; +use wasixcc_test_utils::{run_build_script, run_wasm}; + +#[test] +fn test_exit_zero() { + let wasm_path = run_build_script(file!(), "exit-zero").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_exit_nonzero() { + let wasm_path = run_build_script(file!(), "exit-nonzero").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + let result = run_wasm(&wasm_path, test_dir); + assert!( + result.is_err(), + "exit-nonzero should fail with non-zero exit code" + ); +} + +#[test] +fn test_exit_zero_in_thread() { + let wasm_path = run_build_script(file!(), "exit-zero-in-thread").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_exit_nonzero_in_thread() { + let wasm_path = run_build_script(file!(), "exit-nonzero-in-thread").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + let result = run_wasm(&wasm_path, test_dir); + // exit(99) in a thread should terminate the entire process with exit code 99 + assert!( + result.is_err(), + "exit-nonzero-in-thread should fail with non-zero exit code" + ); +} + +#[test] +fn test_exit_zero_in_fficall() { + let wasm_path = run_build_script(file!(), "exit-zero-in-fficall").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_exit_nonzero_in_fficall() { + let wasm_path = run_build_script(file!(), "exit-nonzero-in-fficall").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + let result = run_wasm(&wasm_path, test_dir); + assert!( + result.is_err(), + "exit-nonzero-in-fficall should fail with non-zero exit code" + ); +} + +#[test] +fn test_exit_zero_in_fficall_thread() { + let wasm_path = run_build_script(file!(), "exit-zero-in-fficall-thread").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_exit_nonzero_in_fficall_thread() { + let wasm_path = run_build_script(file!(), "exit-nonzero-in-fficall-thread").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + let result = run_wasm(&wasm_path, test_dir); + assert!( + result.is_err(), + "exit-nonzero-in-fficall-thread should fail with non-zero exit code" + ); +} + +#[test] +fn test_exit_zero_in_dyncall_thread() { + let wasm_path = run_build_script(file!(), "exit-zero-in-dyncall-thread").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_exit_nonzero_in_dyncall_thread() { + let wasm_path = run_build_script(file!(), "exit-nonzero-in-dyncall-thread").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + let result = run_wasm(&wasm_path, test_dir); + assert!( + result.is_err(), + "exit-nonzero-in-dyncall-thread should fail with non-zero exit code" + ); +} diff --git a/lib/wasix/tests/exit_tests/exit-nonzero-in-dyncall-thread/build.sh b/lib/wasix/tests/exit_tests/exit-nonzero-in-dyncall-thread/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-nonzero-in-dyncall-thread/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/exit_tests/exit-nonzero-in-dyncall-thread/main.c b/lib/wasix/tests/exit_tests/exit-nonzero-in-dyncall-thread/main.c new file mode 100644 index 00000000000..6a9b9e704d0 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-nonzero-in-dyncall-thread/main.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include +#if __has_include() +#include + +void dynamically_called() { + printf("Dyncall in thread\n"); + exit(99); +} + +void *thread_func(void *data) { + wasix_call_dynamic((wasix_function_pointer_t)dynamically_called, NULL, 0, NULL, 0, true); +} +#else +// Mock so the tests compiles on other platforms +// TODO: Remove once our test runner can have platform-specific tests +void *thread_func(void *data) { + printf("Dyncall in thread\n"); + exit(99); +} +#endif + +int main() +{ + pthread_attr_t attr = {0}; + if (pthread_attr_init(&attr) != 0) { + perror("init attr"); + return -1; + } + + pthread_t thread = {0}; + if (pthread_create(&thread, &attr, &thread_func, (void *)stdout) != 0) { + perror("create thread"); + return -1; + } + + void *thread_ret; + if (pthread_join(thread, &thread_ret) != 0) { + perror("join"); + return -1; + } + sleep(1); + + return 1; +} \ No newline at end of file diff --git a/lib/wasix/tests/exit_tests/exit-nonzero-in-fficall-thread/build.sh b/lib/wasix/tests/exit_tests/exit-nonzero-in-fficall-thread/build.sh new file mode 100755 index 00000000000..11cb4faeac4 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-nonzero-in-fficall-thread/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC -lffi main.c -o main diff --git a/lib/wasix/tests/exit_tests/exit-nonzero-in-fficall-thread/main.c b/lib/wasix/tests/exit_tests/exit-nonzero-in-fficall-thread/main.c new file mode 100644 index 00000000000..b6d2b2657e1 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-nonzero-in-fficall-thread/main.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include +#include + +void exit_with_code(void){ + printf("FFI call in thread\n"); + exit(99); +} + +void * thread_func(void * data){ + ffi_cif cif; + + ffi_type *arg_types[0]; + ffi_type *ret_type; + ret_type = &ffi_type_void; + + ffi_status cif_result = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, ret_type, arg_types); + if (cif_result != FFI_OK) { + fprintf(stderr, "ffi_prep_cif failed with status %d\n", cif_result); + exit(1); + } + + ffi_call(&cif, (void (*)(void))&exit_with_code, NULL, NULL); + + return 0; +} + +int main() +{ + pthread_attr_t attr = {0}; + if (pthread_attr_init(&attr) != 0) { + perror("init attr"); + return -1; + } + + pthread_t thread = {0}; + if (pthread_create(&thread, &attr, &thread_func, (void *)stdout) != 0) { + perror("create thread"); + return -1; + } + + void *thread_ret; + if (pthread_join(thread, &thread_ret) != 0) { + perror("join"); + return -1; + } + sleep(1); + + return 1; +} \ No newline at end of file diff --git a/lib/wasix/tests/exit_tests/exit-nonzero-in-fficall/build.sh b/lib/wasix/tests/exit_tests/exit-nonzero-in-fficall/build.sh new file mode 100755 index 00000000000..11cb4faeac4 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-nonzero-in-fficall/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC -lffi main.c -o main diff --git a/lib/wasix/tests/exit_tests/exit-nonzero-in-fficall/main.c b/lib/wasix/tests/exit_tests/exit-nonzero-in-fficall/main.c new file mode 100644 index 00000000000..6bd811a5f90 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-nonzero-in-fficall/main.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include + +void exit_with_code(void){ + printf("FFI call\n"); + exit(99); +} + +int main(){ + ffi_cif cif; + + ffi_type *arg_types[0]; + ffi_type *ret_type; + ret_type = &ffi_type_void; + + ffi_status cif_result = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, ret_type, arg_types); + if (cif_result != FFI_OK) { + fprintf(stderr, "ffi_prep_cif failed with status %d\n", cif_result); + return 1; + } + + ffi_call(&cif, (void (*)(void))&exit_with_code, NULL, NULL); + + return 1; +} \ No newline at end of file diff --git a/lib/wasix/tests/exit_tests/exit-nonzero-in-thread/build.sh b/lib/wasix/tests/exit_tests/exit-nonzero-in-thread/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-nonzero-in-thread/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/exit_tests/exit-nonzero-in-thread/main.c b/lib/wasix/tests/exit_tests/exit-nonzero-in-thread/main.c new file mode 100644 index 00000000000..6fd721a61af --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-nonzero-in-thread/main.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include +#include + +void* print_and_exit(void *data) { + printf("Thread called!\n"); + exit(99); // Exit the program with 0 +} + +int main() +{ + pthread_attr_t attr = {0}; + if (pthread_attr_init(&attr) != 0) { + perror("init attr"); + return -1; + } + + pthread_t thread = {0}; + if (pthread_create(&thread, &attr, &print_and_exit, (void *)stdout) != 0) { + perror("create thread"); + return -1; + } + + void *thread_ret; + if (pthread_join(thread, &thread_ret) != 0) { + perror("join"); + return -1; + } + sleep(1); + + return 1; +} \ No newline at end of file diff --git a/lib/wasix/tests/exit_tests/exit-nonzero/build.sh b/lib/wasix/tests/exit_tests/exit-nonzero/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-nonzero/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/exit_tests/exit-nonzero/main.c b/lib/wasix/tests/exit_tests/exit-nonzero/main.c new file mode 100644 index 00000000000..f027ebfefeb --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-nonzero/main.c @@ -0,0 +1,8 @@ +#include +#include +#include + +int main(){ + exit(99); + return 1; +} \ No newline at end of file diff --git a/lib/wasix/tests/exit_tests/exit-zero-in-dyncall-thread/build.sh b/lib/wasix/tests/exit_tests/exit-zero-in-dyncall-thread/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-zero-in-dyncall-thread/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/exit_tests/exit-zero-in-dyncall-thread/main.c b/lib/wasix/tests/exit_tests/exit-zero-in-dyncall-thread/main.c new file mode 100644 index 00000000000..4a1dc77d1f5 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-zero-in-dyncall-thread/main.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include +#if __has_include() +#include + +void dynamically_called() { + printf("Dyncall in thread\n"); + exit(0); +} + +void *thread_func(void *data) { + wasix_call_dynamic((wasix_function_pointer_t)dynamically_called, NULL, 0, NULL, 0, true); +} +#else +// Mock so the tests compiles on other platforms +// TODO: Remove once our test runner can have platform-specific tests +void *thread_func(void *data) { + printf("Dyncall in thread\n"); + exit(0); +} +#endif + +int main() +{ + pthread_attr_t attr = {0}; + if (pthread_attr_init(&attr) != 0) { + perror("init attr"); + return -1; + } + + pthread_t thread = {0}; + if (pthread_create(&thread, &attr, &thread_func, (void *)stdout) != 0) { + perror("create thread"); + return -1; + } + + void *thread_ret; + if (pthread_join(thread, &thread_ret) != 0) { + perror("join"); + return -1; + } + sleep(1); + + return 1; +} \ No newline at end of file diff --git a/lib/wasix/tests/exit_tests/exit-zero-in-fficall-thread/build.sh b/lib/wasix/tests/exit_tests/exit-zero-in-fficall-thread/build.sh new file mode 100755 index 00000000000..11cb4faeac4 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-zero-in-fficall-thread/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC -lffi main.c -o main diff --git a/lib/wasix/tests/exit_tests/exit-zero-in-fficall-thread/main.c b/lib/wasix/tests/exit_tests/exit-zero-in-fficall-thread/main.c new file mode 100644 index 00000000000..dd303dd88f8 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-zero-in-fficall-thread/main.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include +#include + +void exit_with_code(void){ + printf("FFI call in thread\n"); + exit(0); +} + +void * thread_func(void * data){ + ffi_cif cif; + + ffi_type *arg_types[0]; + ffi_type *ret_type; + ret_type = &ffi_type_void; + + ffi_status cif_result = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, ret_type, arg_types); + if (cif_result != FFI_OK) { + fprintf(stderr, "ffi_prep_cif failed with status %d\n", cif_result); + exit(1); + } + + ffi_call(&cif, (void (*)(void))&exit_with_code, NULL, NULL); + + return 0; +} + +int main() +{ + pthread_attr_t attr = {0}; + if (pthread_attr_init(&attr) != 0) { + perror("init attr"); + return -1; + } + + pthread_t thread = {0}; + if (pthread_create(&thread, &attr, &thread_func, (void *)stdout) != 0) { + perror("create thread"); + return -1; + } + + void *thread_ret; + if (pthread_join(thread, &thread_ret) != 0) { + perror("join"); + return -1; + } + sleep(1); + + return 1; +} \ No newline at end of file diff --git a/lib/wasix/tests/exit_tests/exit-zero-in-fficall/build.sh b/lib/wasix/tests/exit_tests/exit-zero-in-fficall/build.sh new file mode 100755 index 00000000000..11cb4faeac4 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-zero-in-fficall/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC -lffi main.c -o main diff --git a/lib/wasix/tests/exit_tests/exit-zero-in-fficall/main.c b/lib/wasix/tests/exit_tests/exit-zero-in-fficall/main.c new file mode 100644 index 00000000000..843de2737c8 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-zero-in-fficall/main.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include + +void exit_with_code(void){ + printf("FFI call\n"); + exit(0); +} + +int main(){ + ffi_cif cif; + + ffi_type *arg_types[0]; + ffi_type *ret_type; + ret_type = &ffi_type_void; + + ffi_status cif_result = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, ret_type, arg_types); + if (cif_result != FFI_OK) { + fprintf(stderr, "ffi_prep_cif failed with status %d\n", cif_result); + return 1; + } + + ffi_call(&cif, (void (*)(void))&exit_with_code, NULL, NULL); + + return 1; +} \ No newline at end of file diff --git a/lib/wasix/tests/exit_tests/exit-zero-in-thread/build.sh b/lib/wasix/tests/exit_tests/exit-zero-in-thread/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-zero-in-thread/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/exit_tests/exit-zero-in-thread/main.c b/lib/wasix/tests/exit_tests/exit-zero-in-thread/main.c new file mode 100644 index 00000000000..000e0fd9ce9 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-zero-in-thread/main.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include +#include + +void* print_and_exit(void *data) { + printf("Thread called!\n"); + exit(0); // Exit the program with 0 +} + +int main() +{ + pthread_attr_t attr = {0}; + if (pthread_attr_init(&attr) != 0) { + perror("init attr"); + return -1; + } + + pthread_t thread = {0}; + if (pthread_create(&thread, &attr, &print_and_exit, (void *)stdout) != 0) { + perror("create thread"); + return -1; + } + + void *thread_ret; + if (pthread_join(thread, &thread_ret) != 0) { + perror("join"); + return -1; + } + sleep(1); + + return 1; +} \ No newline at end of file diff --git a/lib/wasix/tests/exit_tests/exit-zero/build.sh b/lib/wasix/tests/exit_tests/exit-zero/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-zero/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/exit_tests/exit-zero/main.c b/lib/wasix/tests/exit_tests/exit-zero/main.c new file mode 100644 index 00000000000..aae4827e491 --- /dev/null +++ b/lib/wasix/tests/exit_tests/exit-zero/main.c @@ -0,0 +1,8 @@ +#include +#include +#include + +int main(){ + exit(0); + return 1; +} \ No newline at end of file diff --git a/lib/wasix/tests/ffi_tests.rs b/lib/wasix/tests/ffi_tests.rs new file mode 100644 index 00000000000..6951cb98001 --- /dev/null +++ b/lib/wasix/tests/ffi_tests.rs @@ -0,0 +1,26 @@ +mod wasixcc_test_utils; +use wasixcc_test_utils::{run_build_script, run_wasm}; + +#[test] +fn simple_ffi_call() { + let wasm = run_build_script(file!(), "simple-ffi-call").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn complex_ffi_call() { + let wasm = run_build_script(file!(), "complex-ffi-call").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn longdouble_ffi_call() { + let wasm = run_build_script(file!(), "longdouble-ffi-call").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn simple_ffi_closure() { + let wasm = run_build_script(file!(), "simple-ffi-closure").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} diff --git a/lib/wasix/tests/ffi_tests/complex-ffi-call/build.sh b/lib/wasix/tests/ffi_tests/complex-ffi-call/build.sh new file mode 100755 index 00000000000..ddc2c37bd89 --- /dev/null +++ b/lib/wasix/tests/ffi_tests/complex-ffi-call/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CC -c main.c -o main.o +$CC main.o -lffi -o main diff --git a/lib/wasix/tests/ffi_tests/complex-ffi-call/main.c b/lib/wasix/tests/ffi_tests/complex-ffi-call/main.c new file mode 100644 index 00000000000..74ad4920ebf --- /dev/null +++ b/lib/wasix/tests/ffi_tests/complex-ffi-call/main.c @@ -0,0 +1,228 @@ +#include +#include +#include +#include + +// Test 1: Basic struct passing and returning +typedef struct { + int x; + double y; + char z[32]; +} TestStruct; + +TestStruct update_struct(TestStruct s) { + s.x += 1; + s.y *= 2.0; + strcat(s.z, "_updated"); + return s; +} + +// Test 2: Function with 10 arguments +int sum_ten(int a, int b, int c, int d, int e, + int f, int g, int h, int i, int j) { + return a + b + c + d + e + f + g + h + i + j; +} + +// Test 3: Long double operations +long double multiply_ldoubles(long double a, long double b) { + return a * b; +} + +// Function that creates and returns a new struct +TestStruct create_struct(int x, double y, const char* z) { + TestStruct result; + result.x = x; + result.y = y; + strncpy(result.z, z, sizeof(result.z) - 1); + result.z[sizeof(result.z) - 1] = '\0'; // Ensure null termination + printf("Inside create_struct: {%d, %f, %s}\n", result.x, result.y, result.z); + return result; +} + +// Opaque function pointers +void *opaque_update_struct = &update_struct; +void *opaque_sum_ten = &sum_ten; +void *opaque_multiply_ldoubles = &multiply_ldoubles; +void *opaque_create_struct = &create_struct; + +int main() { + ffi_status status; + void *arg_values[10]; + + // Test 1: Struct passing and returning + { + printf("=== Testing struct passing/returning ===\n"); + ffi_cif struct_cif; + ffi_type *struct_arg_types[1]; + + // Define struct type + ffi_type struct_type; + ffi_type *struct_elements[7]; + + // Initialize the struct type + memset(&struct_type, 0, sizeof(ffi_type)); + struct_type.type = FFI_TYPE_STRUCT; + + // Set up elements + struct_elements[0] = &ffi_type_sint32; // x + struct_elements[1] = &ffi_type_double; // y + struct_elements[2] = &ffi_type_uint64; // z[0] - treat char array as bytes + struct_elements[3] = &ffi_type_uint64; // z[0] - treat char array as bytes + struct_elements[4] = &ffi_type_uint64; // z[0] - treat char array as bytes + struct_elements[5] = &ffi_type_uint64; // z[0] - treat char array as bytes + struct_elements[6] = NULL; // Terminator + + struct_type.elements = struct_elements; + + struct_arg_types[0] = &struct_type; + + status = ffi_prep_cif(&struct_cif, FFI_DEFAULT_ABI, 1, &struct_type, struct_arg_types); + if (status != FFI_OK) { + fprintf(stderr, "Failed to prepare struct CIF\n"); + return 1; + } + + // Prepare test data + TestStruct test_in; + TestStruct test_out; + + // Initialize test data + memset(&test_in, 0, sizeof(TestStruct)); + test_in.x = 42; + test_in.y = 3.14; + strncpy(test_in.z, "test_string", sizeof(test_in.z) - 1); + + // Print struct size and alignment for debugging + printf("TestStruct size: %zu, alignment: %zu\n", + sizeof(TestStruct), __alignof__(TestStruct)); + printf("TestStruct field offsets: x=%zu, y=%zu, z=%zu\n", + (size_t)&((TestStruct *)0)->x, + (size_t)&((TestStruct *)0)->y, + (size_t)&((TestStruct *)0)->z); + + // Initialize output + memset(&test_out, 0, sizeof(TestStruct)); + + // For struct passing, we need to pass pointers + void *args[1] = { &test_in }; + + ffi_call(&struct_cif, (void (*)(void))opaque_update_struct, &test_out, args); + + printf("Struct test: {%d, %f, %s}\n", test_out.x, test_out.y, test_out.z); + assert(test_out.x == 43); + assert(test_out.y > 6.2799 && test_out.y < 6.2801); + assert(strcmp(test_out.z, "test_string_updated") == 0); + } + + // Test 2: 10 arguments + { + printf("\n=== Testing 10 arguments ===\n"); + ffi_cif ten_args_cif; + ffi_type *ten_args_types[10]; + + for (int i = 0; i < 10; i++) { + ten_args_types[i] = &ffi_type_sint32; + } + + status = ffi_prep_cif(&ten_args_cif, FFI_DEFAULT_ABI, 10, &ffi_type_sint32, ten_args_types); + if (status != FFI_OK) { + fprintf(stderr, "Failed to prepare 10-args CIF\n"); + return 1; + } + + int args[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + for (int i = 0; i < 10; i++) { + arg_values[i] = &args[i]; + } + + int result; + ffi_call(&ten_args_cif, (void (*)(void))opaque_sum_ten, &result, arg_values); + + printf("Sum of 1..10: %d\n", result); + assert(result == 55); + } + + // Test 3: Long double operations + { + printf("\n=== Testing long double operations ===\n"); + ffi_cif ld_cif; + ffi_type *ld_arg_types[2] = { &ffi_type_longdouble, &ffi_type_longdouble }; + + status = ffi_prep_cif(&ld_cif, FFI_DEFAULT_ABI, 2, &ffi_type_longdouble, ld_arg_types); + if (status != FFI_OK) { + fprintf(stderr, "Failed to prepare long double CIF\n"); + return 1; + } + + long double a = 123456789.123456789L; + long double b = 987654321.987654321L; + long double result; + + void *ld_args[2] = { &a, &b }; + ffi_call(&ld_cif, (void (*)(void))opaque_multiply_ldoubles, &result, ld_args); + + // Calculate expected result with high precision + long double expected = a * b; + printf("Long double result: %Lf\n", result); + printf("Expected: %Lf\n", expected); + + // Compare with a small epsilon due to floating-point imprecision + long double epsilon = 0.000001L; + long double diff = result - expected; + if (diff < 0) diff = -diff; + assert(diff < epsilon); + } + + // Test 4: Return a struct from a function + { + printf("\n=== Testing returning a struct ===\n"); + ffi_cif create_cif; + ffi_type *create_arg_types[3]; + + // Set up argument types + create_arg_types[0] = &ffi_type_sint32; // x + create_arg_types[1] = &ffi_type_double; // y + create_arg_types[2] = &ffi_type_pointer; // z + + // Define the return type (same as before) + ffi_type return_struct_type; + ffi_type *return_struct_elements[7]; + + memset(&return_struct_type, 0, sizeof(ffi_type)); + return_struct_type.type = FFI_TYPE_STRUCT; + return_struct_elements[0] = &ffi_type_sint32; // x + return_struct_elements[1] = &ffi_type_double; // y + return_struct_elements[2] = &ffi_type_uint64; // z[0-7] + return_struct_elements[3] = &ffi_type_uint64; // z[8-15] + return_struct_elements[4] = &ffi_type_uint64; // z[16-23] + return_struct_elements[5] = &ffi_type_uint64; // z[24-31] + return_struct_elements[6] = NULL; // Terminator + return_struct_type.elements = return_struct_elements; + + // Prepare the call interface + status = ffi_prep_cif(&create_cif, FFI_DEFAULT_ABI, 3, &return_struct_type, create_arg_types); + if (status != FFI_OK) { + fprintf(stderr, "Failed to prepare create_struct CIF\n"); + return 1; + } + + // Prepare arguments + int x = 100; + double y = 3.14159; + const char *z = "created_by_ffi"; + void *create_args[3] = { &x, &y, &z }; + + // Call the function through FFI + TestStruct result; + ffi_call(&create_cif, (void (*)(void))opaque_create_struct, &result, create_args); + + // Verify the result + printf("Returned struct: {%d, %f, %s}\n", result.x, result.y, result.z); + assert(result.x == 100); + assert(result.y > 3.14158 && result.y < 3.14160); + assert(strcmp(result.z, "created_by_ffi") == 0); + } + + printf("\nAll tests passed!\n"); + return 0; +} diff --git a/lib/wasix/tests/ffi_tests/longdouble-ffi-call/build.sh b/lib/wasix/tests/ffi_tests/longdouble-ffi-call/build.sh new file mode 100755 index 00000000000..ddc2c37bd89 --- /dev/null +++ b/lib/wasix/tests/ffi_tests/longdouble-ffi-call/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CC -c main.c -o main.o +$CC main.o -lffi -o main diff --git a/lib/wasix/tests/ffi_tests/longdouble-ffi-call/main.c b/lib/wasix/tests/ffi_tests/longdouble-ffi-call/main.c new file mode 100644 index 00000000000..029cb775971 --- /dev/null +++ b/lib/wasix/tests/ffi_tests/longdouble-ffi-call/main.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +long double multiply_ldoubles(long double a, long double b) { + return a * b; +} + +void *opaque_multiply_ldoubles = &multiply_ldoubles; + +int main() { + ffi_status status; + void *arg_values[10]; + + // Test 3: Long double operations + { + ffi_cif ld_cif; + ffi_type *ld_arg_types[2] = { &ffi_type_longdouble, &ffi_type_longdouble }; + + status = ffi_prep_cif(&ld_cif, FFI_DEFAULT_ABI, 2, &ffi_type_longdouble, ld_arg_types); + if (status != FFI_OK) { + fprintf(stderr, "Failed to prepare long double CIF\n"); + return 1; + } + + long double a = 123456789.123456789L; + long double b = 987654321.987654321L; + long double result; + + void *ld_args[2] = { &a, &b }; + ffi_call(&ld_cif, (void (*)(void))opaque_multiply_ldoubles, &result, ld_args); + + // Calculate expected result with high precision + long double expected = a * b; + printf("Long double result: %Lf\n", result); + printf("Expected: %Lf\n", expected); + + // Compare with a small epsilon due to floating-point imprecision + long double epsilon = 0.000001L; + long double diff = result - expected; + if (diff < 0) diff = -diff; + assert(diff < epsilon); + } + + printf("\nAll tests passed!\n"); + return 0; +} diff --git a/lib/wasix/tests/ffi_tests/simple-ffi-call/build.sh b/lib/wasix/tests/ffi_tests/simple-ffi-call/build.sh new file mode 100755 index 00000000000..ddc2c37bd89 --- /dev/null +++ b/lib/wasix/tests/ffi_tests/simple-ffi-call/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CC -c main.c -o main.o +$CC main.o -lffi -o main diff --git a/lib/wasix/tests/ffi_tests/simple-ffi-call/main.c b/lib/wasix/tests/ffi_tests/simple-ffi-call/main.c new file mode 100644 index 00000000000..974e940728b --- /dev/null +++ b/lib/wasix/tests/ffi_tests/simple-ffi-call/main.c @@ -0,0 +1,49 @@ +#include +#include +#include + +int fib(int n){ + if (n <= 1) { + return n; + } + return fib(n - 1) + fib(n - 2); +} + +// If you forgot the type +// Of your function pointer +// How you gonna call? +// (libffi!) +void *opaque_fib = &fib; + +int main(){ + ffi_cif cif; + + ffi_type *arg_types[1]; + ffi_type *ret_type; + arg_types[0] = &ffi_type_sint32; + ret_type = &ffi_type_sint32; + + // To define a type + // For your void* + // Who you gonna call? + // (ffi_prep_cif!) + ffi_status cif_result = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, ret_type, arg_types); + if (cif_result != FFI_OK) { + fprintf(stderr, "ffi_prep_cif failed with status %d\n", cif_result); + return 1; + } + + int argument; + int result; + void *arg_values[1]; + void *ret_value; + arg_values[0] = &argument; + ret_value = &result; + + argument = 11; + ffi_call(&cif, (void (*)(void))opaque_fib, ret_value, arg_values); + + printf("ffi_call returned %d\n", result); + assert(result == 89); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/ffi_tests/simple-ffi-closure/build.sh b/lib/wasix/tests/ffi_tests/simple-ffi-closure/build.sh new file mode 100755 index 00000000000..f762d0fcf08 --- /dev/null +++ b/lib/wasix/tests/ffi_tests/simple-ffi-closure/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CC -c -DFFI_CLOSURES=1 main.c -o main.o +$CC main.o -lffi -o main diff --git a/lib/wasix/tests/ffi_tests/simple-ffi-closure/main.c b/lib/wasix/tests/ffi_tests/simple-ffi-closure/main.c new file mode 100644 index 00000000000..1fccaab622d --- /dev/null +++ b/lib/wasix/tests/ffi_tests/simple-ffi-closure/main.c @@ -0,0 +1,92 @@ +#include +#include +#include + +// Callback function for closure +static void closure_callback(ffi_cif* cif, void* ret, void* args[], void* user_data) { + // Get the call counter from user data + int* count = (int*)user_data; + + // Get the function arguments + int a = *(int*)args[0]; + int b = *(int*)args[1]; + + // Print debug information + printf("Inside closure callback: %d + %d (called %d times)\n", a, b, *count); + + // Calculate result: a + b + call_count + *(int*)ret = a + b + (*count)++; +} + +int main() { + ffi_status status; + + printf("=== Testing libffi closures ===\n"); + + // Initialize the call interface + ffi_cif cif; + ffi_type *arg_types[2]; + ffi_closure *closure; + + // This will hold our callable function pointer + int (*closure_func)(int, int); + + // This will count how many times the closure is called + int call_count = 0; + + // Allocate a closure + closure = ffi_closure_alloc(sizeof(ffi_closure), (void**)&closure_func); + if (!closure) { + fprintf(stderr, "Failed to allocate closure\n"); + return 1; + } + + // Set up argument and return types + ffi_type *ret_type = &ffi_type_sint32; + arg_types[0] = &ffi_type_sint32; // First argument (int) + arg_types[1] = &ffi_type_sint32; // Second argument (int) + + // Prepare the call interface + status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, ret_type, arg_types); + if (status != FFI_OK) { + fprintf(stderr, "Failed to prepare CIF\n"); + return 1; + } + + // Initialize the closure + status = ffi_prep_closure_loc( + closure, // The closure + &cif, // The call interface + closure_callback, // The callback function + &call_count, // User data (passed to callback) + closure_func // The function pointer to call + ); + + if (status != FFI_OK) { + fprintf(stderr, "Failed to prepare closure\n"); + return 1; + } + + printf("Testing closure...\n"); + + // First call + int result1 = closure_func(10, 20); + printf("Closure result 1: %d\n", result1); + assert(result1 == 30); // 10 + 20 + 0 + + // Second call (should increment the counter) + int result2 = closure_func(5, 7); + printf("Closure result 2: %d\n", result2); + assert(result2 == 13); // 5 + 7 + 1 + + // Third call (should increment the counter again) + int result3 = closure_func(100, 200); + printf("Closure result 3: %d\n", result3); + assert(result3 == 302); // 100 + 200 + 2 + + // Clean up + ffi_closure_free(closure); + + printf("Closure test completed\n"); + return 0; +} diff --git a/lib/wasix/tests/lifecycle_tests.rs b/lib/wasix/tests/lifecycle_tests.rs new file mode 100644 index 00000000000..83510409180 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests.rs @@ -0,0 +1,48 @@ +mod wasixcc_test_utils; +use wasixcc_test_utils::{run_build_script, run_wasm}; + +#[test] +fn lifecycle_of_global_in_shared_library() { + let wasm = run_build_script(file!(), "lifecycle-of-global-in-shared-library").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn lifecycle_of_global_in_dynamic_library() { + let wasm = run_build_script(file!(), "lifecycle-of-global-in-dynamic-library").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn lifecycle_of_global_in_main_module() { + let wasm = run_build_script(file!(), "lifecycle-of-global-in-main-module").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn lifecycle_of_tls_global_in_shared_library() { + let wasm = run_build_script(file!(), "lifecycle-of-tls-global-in-shared-library").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn lifecycle_of_tls_global_in_dynamic_library() { + let wasm = run_build_script(file!(), "lifecycle-of-tls-global-in-dynamic-library").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn lifecycle_of_tls_global_in_main_module() { + let wasm = run_build_script(file!(), "lifecycle-of-tls-global-in-main-module").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn lifecycle_of_dlsymed_tls_global_in_dynamic_library() { + let wasm = run_build_script( + file!(), + "lifecycle-of-dlsymed-tls-global-in-dynamic-library", + ) + .unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-dlsymed-tls-global-in-dynamic-library/build.sh b/lib/wasix/tests/lifecycle_tests/lifecycle-of-dlsymed-tls-global-in-dynamic-library/build.sh new file mode 100755 index 00000000000..18ae5defb55 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-dlsymed-tls-global-in-dynamic-library/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC library.cpp -o library.o +$CXX -shared library.o -o liblibrary.so +$CXX main.cpp -L$PWD -llibrary -o main diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-dlsymed-tls-global-in-dynamic-library/library.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-dlsymed-tls-global-in-dynamic-library/library.cpp new file mode 100644 index 00000000000..c58b64f8da1 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-dlsymed-tls-global-in-dynamic-library/library.cpp @@ -0,0 +1,18 @@ +#include + +struct Item { + Item() { std::cout << "Item constructed"; } + ~Item() { std::cout << "Item destructed"; } +}; + +struct TlsItem { + TlsItem() { std::cout << "TlsItem constructed"; } + ~TlsItem() { std::cout << "TlsItem destructed"; } +}; + +thread_local TlsItem tls_item; +Item item; + +extern "C" void* use_tls_item() { + return &tls_item; +} \ No newline at end of file diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-dlsymed-tls-global-in-dynamic-library/main.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-dlsymed-tls-global-in-dynamic-library/main.cpp new file mode 100644 index 00000000000..940e6d5c916 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-dlsymed-tls-global-in-dynamic-library/main.cpp @@ -0,0 +1,24 @@ +#include +#include +#include + + +typedef void * (* side_type)(); +int main() { + void* handle = dlopen("liblibrary.so", RTLD_NOW); + if (!handle) { + std::cerr << "dlopen failed: " << dlerror() << std::endl; + return 1; + } + + int * tls_item_loaded = (int *)dlsym(handle, "tls_item"); + if (!tls_item_loaded) { + printf("dlsym failed: %s\n", dlerror()); + return 1; + } + // In the default TLS model this should neither construct nor destruct the tls item, but just call test on an uninitialized item + int _ = *tls_item_loaded; + + dlclose(handle); + return 0; +} diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-dynamic-library/build.sh b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-dynamic-library/build.sh new file mode 100755 index 00000000000..8292aff4e40 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-dynamic-library/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC library.cpp -o library.o +$CXX -shared library.o -o liblibrary.so +$CXX main.cpp -L$PWD -o main diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-dynamic-library/library.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-dynamic-library/library.cpp new file mode 100644 index 00000000000..b505cbce1a2 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-dynamic-library/library.cpp @@ -0,0 +1,17 @@ +#include + +struct Item { + Item() { std::cout << "Item constructed"; } + ~Item() { std::cout << "Item destructed"; } +}; +struct TlsItem { + TlsItem() { std::cout << "TlsItem constructed"; } + ~TlsItem() { std::cout << "TlsItem destructed"; } +}; + +thread_local TlsItem tls_item; +Item item; + +extern "C" void* use_tls_item() { + return &tls_item; +} \ No newline at end of file diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-dynamic-library/main.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-dynamic-library/main.cpp new file mode 100644 index 00000000000..e5fb3999650 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-dynamic-library/main.cpp @@ -0,0 +1,14 @@ +#include +#include +#include + +int main() { + void* handle = dlopen("liblibrary.so", RTLD_NOW); + if (!handle) { + std::cerr << "dlopen failed: " << dlerror() << std::endl; + return 1; + } + + dlclose(handle); + return 0; +} diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-main-module/build.sh b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-main-module/build.sh new file mode 100755 index 00000000000..40915216765 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-main-module/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC library.cpp -o library.o +$CXX -shared library.o -o liblibrary.so +$CXX main.cpp -L$PWD -Wl,--no-as-needed -llibrary -o main diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-main-module/library.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-main-module/library.cpp new file mode 100644 index 00000000000..b505cbce1a2 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-main-module/library.cpp @@ -0,0 +1,17 @@ +#include + +struct Item { + Item() { std::cout << "Item constructed"; } + ~Item() { std::cout << "Item destructed"; } +}; +struct TlsItem { + TlsItem() { std::cout << "TlsItem constructed"; } + ~TlsItem() { std::cout << "TlsItem destructed"; } +}; + +thread_local TlsItem tls_item; +Item item; + +extern "C" void* use_tls_item() { + return &tls_item; +} \ No newline at end of file diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-main-module/main.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-main-module/main.cpp new file mode 100644 index 00000000000..1dd4fd7987d --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-main-module/main.cpp @@ -0,0 +1,8 @@ +#include +#include +#include + +int main() { + // For the same test, but without the TLS item beeing used, see lifecycle-of-global-in-shared-library + return 0; +} diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-shared-library/build.sh b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-shared-library/build.sh new file mode 100755 index 00000000000..40915216765 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-shared-library/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC library.cpp -o library.o +$CXX -shared library.o -o liblibrary.so +$CXX main.cpp -L$PWD -Wl,--no-as-needed -llibrary -o main diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-shared-library/library.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-shared-library/library.cpp new file mode 100644 index 00000000000..b505cbce1a2 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-shared-library/library.cpp @@ -0,0 +1,17 @@ +#include + +struct Item { + Item() { std::cout << "Item constructed"; } + ~Item() { std::cout << "Item destructed"; } +}; +struct TlsItem { + TlsItem() { std::cout << "TlsItem constructed"; } + ~TlsItem() { std::cout << "TlsItem destructed"; } +}; + +thread_local TlsItem tls_item; +Item item; + +extern "C" void* use_tls_item() { + return &tls_item; +} \ No newline at end of file diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-shared-library/main.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-shared-library/main.cpp new file mode 100644 index 00000000000..aea28a709d0 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-global-in-shared-library/main.cpp @@ -0,0 +1,7 @@ +#include +#include +#include + +int main() { + return 0; +} diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-dynamic-library/build.sh b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-dynamic-library/build.sh new file mode 100755 index 00000000000..40915216765 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-dynamic-library/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC library.cpp -o library.o +$CXX -shared library.o -o liblibrary.so +$CXX main.cpp -L$PWD -Wl,--no-as-needed -llibrary -o main diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-dynamic-library/library.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-dynamic-library/library.cpp new file mode 100644 index 00000000000..b505cbce1a2 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-dynamic-library/library.cpp @@ -0,0 +1,17 @@ +#include + +struct Item { + Item() { std::cout << "Item constructed"; } + ~Item() { std::cout << "Item destructed"; } +}; +struct TlsItem { + TlsItem() { std::cout << "TlsItem constructed"; } + ~TlsItem() { std::cout << "TlsItem destructed"; } +}; + +thread_local TlsItem tls_item; +Item item; + +extern "C" void* use_tls_item() { + return &tls_item; +} \ No newline at end of file diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-dynamic-library/main.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-dynamic-library/main.cpp new file mode 100644 index 00000000000..d9e37e859a3 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-dynamic-library/main.cpp @@ -0,0 +1,23 @@ +#include +#include +#include + +typedef void * (* side_type)(); +int main() { + void* handle = dlopen("liblibrary.so", RTLD_NOW); + if (!handle) { + std::cerr << "dlopen failed: " << dlerror() << std::endl; + return 1; + } + + side_type side = (side_type)dlsym(handle, "use_tls_item"); + void * (*use_tls_item)() = (void * (*)())dlsym(handle, "use_tls_item"); + if (!side) { + printf("dlsym failed: %s\n", dlerror()); + return 1; + } + use_tls_item(); + + dlclose(handle); + return 0; +} diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-main-module/build.sh b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-main-module/build.sh new file mode 100755 index 00000000000..40915216765 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-main-module/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC library.cpp -o library.o +$CXX -shared library.o -o liblibrary.so +$CXX main.cpp -L$PWD -Wl,--no-as-needed -llibrary -o main diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-main-module/library.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-main-module/library.cpp new file mode 100644 index 00000000000..b505cbce1a2 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-main-module/library.cpp @@ -0,0 +1,17 @@ +#include + +struct Item { + Item() { std::cout << "Item constructed"; } + ~Item() { std::cout << "Item destructed"; } +}; +struct TlsItem { + TlsItem() { std::cout << "TlsItem constructed"; } + ~TlsItem() { std::cout << "TlsItem destructed"; } +}; + +thread_local TlsItem tls_item; +Item item; + +extern "C" void* use_tls_item() { + return &tls_item; +} \ No newline at end of file diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-main-module/main.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-main-module/main.cpp new file mode 100644 index 00000000000..d36a07f3a87 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-main-module/main.cpp @@ -0,0 +1,11 @@ +#include +#include +#include + +extern "C" void* use_tls_item(); + +int main() { + // For the same test, but without the TLS item beeing used, see lifecycle-of-global-in-shared-library + use_tls_item(); + return 0; +} diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-shared-library/build.sh b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-shared-library/build.sh new file mode 100755 index 00000000000..40915216765 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-shared-library/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC library.cpp -o library.o +$CXX -shared library.o -o liblibrary.so +$CXX main.cpp -L$PWD -Wl,--no-as-needed -llibrary -o main diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-shared-library/library.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-shared-library/library.cpp new file mode 100644 index 00000000000..b505cbce1a2 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-shared-library/library.cpp @@ -0,0 +1,17 @@ +#include + +struct Item { + Item() { std::cout << "Item constructed"; } + ~Item() { std::cout << "Item destructed"; } +}; +struct TlsItem { + TlsItem() { std::cout << "TlsItem constructed"; } + ~TlsItem() { std::cout << "TlsItem destructed"; } +}; + +thread_local TlsItem tls_item; +Item item; + +extern "C" void* use_tls_item() { + return &tls_item; +} \ No newline at end of file diff --git a/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-shared-library/main.cpp b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-shared-library/main.cpp new file mode 100644 index 00000000000..d36a07f3a87 --- /dev/null +++ b/lib/wasix/tests/lifecycle_tests/lifecycle-of-tls-global-in-shared-library/main.cpp @@ -0,0 +1,11 @@ +#include +#include +#include + +extern "C" void* use_tls_item(); + +int main() { + // For the same test, but without the TLS item beeing used, see lifecycle-of-global-in-shared-library + use_tls_item(); + return 0; +} diff --git a/lib/wasix/tests/reflection_tests.rs b/lib/wasix/tests/reflection_tests.rs new file mode 100644 index 00000000000..f7bff617beb --- /dev/null +++ b/lib/wasix/tests/reflection_tests.rs @@ -0,0 +1,26 @@ +mod wasixcc_test_utils; +use wasixcc_test_utils::{run_build_script, run_wasm}; + +#[test] +fn wasix_reflection() { + let wasm = run_build_script(file!(), "wasix-reflection").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn wasix_reflection_and_closures() { + let wasm = run_build_script(file!(), "wasix-reflection-and-closures").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn wasix_reflection_dlopen() { + let wasm = run_build_script(file!(), "wasix-reflection-dlopen").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn wasix_reflection_static() { + let wasm = run_build_script(file!(), "wasix-reflection-static").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} diff --git a/lib/wasix/tests/reflection_tests/wasix-reflection-and-closures/build.sh b/lib/wasix/tests/reflection_tests/wasix-reflection-and-closures/build.sh new file mode 100755 index 00000000000..c26f9175438 --- /dev/null +++ b/lib/wasix/tests/reflection_tests/wasix-reflection-and-closures/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CC -c main.c -o main.o +$CC main.o -o main diff --git a/lib/wasix/tests/reflection_tests/wasix-reflection-and-closures/main.c b/lib/wasix/tests/reflection_tests/wasix-reflection-and-closures/main.c new file mode 100644 index 00000000000..a5ffff931ce --- /dev/null +++ b/lib/wasix/tests/reflection_tests/wasix-reflection-and-closures/main.c @@ -0,0 +1,43 @@ +#include + +#if defined __has_include +#if __has_include() && __has_include() +#include +#include +#include +#include +#endif +#endif + +int main() { +#if defined __has_include +#if __has_include() && __has_include() + wasix_function_pointer_t closure_pointer; + wasix_closure_allocate( + (wasix_function_pointer_t*)&closure_pointer + ); + + wasix_reflection_result_t result; + int code; + + // Test that closures are not cacheable + code = wasix_reflect_signature( + (wasix_function_pointer_t)closure_pointer, + NULL, + 0, + NULL, + 0, + &result + ); + + assert(code == -1); + assert(errno == EINVAL); + assert(result.arguments == 0); + assert(result.results == 0); + assert(result.cacheable == 0); +#endif +#endif + + printf("Reflection API seems to work with closures\n"); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/reflection_tests/wasix-reflection-dlopen/build.sh b/lib/wasix/tests/reflection_tests/wasix-reflection-dlopen/build.sh new file mode 100755 index 00000000000..d2ef209661e --- /dev/null +++ b/lib/wasix/tests/reflection_tests/wasix-reflection-dlopen/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CC -c -fPIC library.c -o library.o +$CC -shared library.o -o liblibrary.so +$CC main.c -L$PWD -Wl,--no-as-needed -llibrary -o main diff --git a/lib/wasix/tests/reflection_tests/wasix-reflection-dlopen/library.c b/lib/wasix/tests/reflection_tests/wasix-reflection-dlopen/library.c new file mode 100644 index 00000000000..838604580e0 --- /dev/null +++ b/lib/wasix/tests/reflection_tests/wasix-reflection-dlopen/library.c @@ -0,0 +1,9 @@ +#include + +int add_three(int a, int b, int c) { + return a + b + c; +} + +void no_params_no_results(void) { + printf("Function with no params and no results\n"); +} diff --git a/lib/wasix/tests/reflection_tests/wasix-reflection-dlopen/main.c b/lib/wasix/tests/reflection_tests/wasix-reflection-dlopen/main.c new file mode 100644 index 00000000000..118f965844a --- /dev/null +++ b/lib/wasix/tests/reflection_tests/wasix-reflection-dlopen/main.c @@ -0,0 +1,74 @@ +#include +#include + +#if defined __has_include +#if __has_include() +#include +#include +#include +#endif +#endif + +int main() { +#if defined __has_include +#if __has_include() + // Open the shared library + void* handle = dlopen("./liblibrary.so", RTLD_LAZY); + assert(handle != NULL); + + // Get function pointers from the library + int (*add_three_ptr)(int, int, int) = dlsym(handle, "add_three"); + assert(add_three_ptr != NULL); + + void (*no_params_ptr)(void) = dlsym(handle, "no_params_no_results"); + assert(no_params_ptr != NULL); + + wasix_reflection_result_t result; + int code; + + // Test reflection on dlopened function with parameters + wasix_value_type_t params[5]; + wasix_value_type_t results[5]; + + code = wasix_reflect_signature( + (wasix_function_pointer_t)add_three_ptr, + params, + 5, + results, + 5, + &result + ); + + assert(code == 0); + assert(errno == 0); + assert(result.arguments == 3); + assert(result.results == 1); + assert(result.cacheable == 1); + assert(params[0] == WASIX_VALUE_TYPE_I32); + assert(params[1] == WASIX_VALUE_TYPE_I32); + assert(params[2] == WASIX_VALUE_TYPE_I32); + assert(results[0] == WASIX_VALUE_TYPE_I32); + + // Test reflection on dlopened function without parameters + code = wasix_reflect_signature( + (wasix_function_pointer_t)no_params_ptr, + NULL, + 0, + NULL, + 0, + &result + ); + + assert(code == 0); + assert(errno == 0); + assert(result.arguments == 0); + assert(result.results == 0); + assert(result.cacheable == 1); + + dlclose(handle); +#endif +#endif + + printf("Reflection API works with dlopened functions\n"); + return 0; +} diff --git a/lib/wasix/tests/reflection_tests/wasix-reflection-static/build.sh b/lib/wasix/tests/reflection_tests/wasix-reflection-static/build.sh new file mode 100755 index 00000000000..c26f9175438 --- /dev/null +++ b/lib/wasix/tests/reflection_tests/wasix-reflection-static/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CC -c main.c -o main.o +$CC main.o -o main diff --git a/lib/wasix/tests/reflection_tests/wasix-reflection-static/main.c b/lib/wasix/tests/reflection_tests/wasix-reflection-static/main.c new file mode 100644 index 00000000000..700cf89d23b --- /dev/null +++ b/lib/wasix/tests/reflection_tests/wasix-reflection-static/main.c @@ -0,0 +1,89 @@ +#include + +#if defined __has_include +#if __has_include() +#include +#include +#include +#endif +#endif + +static int static_add(int a, int b) { + return a + b; +} + +static void static_no_params(void) { + printf("Static function with no params\n"); +} + +static double static_double_func(double x, double y) { + return x * y; +} + +int main() { +#if defined __has_include +#if __has_include() + wasix_reflection_result_t result; + int code; + wasix_value_type_t params[5]; + wasix_value_type_t results[5]; + + // Test reflection on static function with int parameters + code = wasix_reflect_signature( + (wasix_function_pointer_t)static_add, + params, + 5, + results, + 5, + &result + ); + + assert(code == 0); + assert(errno == 0); + assert(result.arguments == 2); + assert(result.results == 1); + assert(result.cacheable == 1); + assert(params[0] == WASIX_VALUE_TYPE_I32); + assert(params[1] == WASIX_VALUE_TYPE_I32); + assert(results[0] == WASIX_VALUE_TYPE_I32); + + // Test reflection on static function without parameters + code = wasix_reflect_signature( + (wasix_function_pointer_t)static_no_params, + NULL, + 0, + NULL, + 0, + &result + ); + + assert(code == 0); + assert(errno == 0); + assert(result.arguments == 0); + assert(result.results == 0); + assert(result.cacheable == 1); + + // Test reflection on static function with double parameters + code = wasix_reflect_signature( + (wasix_function_pointer_t)static_double_func, + params, + 5, + results, + 5, + &result + ); + + assert(code == 0); + assert(errno == 0); + assert(result.arguments == 2); + assert(result.results == 1); + assert(result.cacheable == 1); + assert(params[0] == WASIX_VALUE_TYPE_F64); + assert(params[1] == WASIX_VALUE_TYPE_F64); + assert(results[0] == WASIX_VALUE_TYPE_F64); +#endif +#endif + + printf("Reflection API works with static functions\n"); + return 0; +} diff --git a/lib/wasix/tests/reflection_tests/wasix-reflection/build.sh b/lib/wasix/tests/reflection_tests/wasix-reflection/build.sh new file mode 100755 index 00000000000..c26f9175438 --- /dev/null +++ b/lib/wasix/tests/reflection_tests/wasix-reflection/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CC -c main.c -o main.o +$CC main.o -o main diff --git a/lib/wasix/tests/reflection_tests/wasix-reflection/main.c b/lib/wasix/tests/reflection_tests/wasix-reflection/main.c new file mode 100644 index 00000000000..103656af97b --- /dev/null +++ b/lib/wasix/tests/reflection_tests/wasix-reflection/main.c @@ -0,0 +1,129 @@ +#include +#if defined __has_include +#if __has_include() && __has_include() +#include +#include +#include +#endif +#endif + +void nothing(void) { + // Nothing +}; + +int triple_add(int a, int b, int c) { + // Nothing +}; + +int main() { +#if defined __has_include +#if __has_include() && __has_include() + void (*nothing_ptr)(void) = nothing; + int (*triple_add_ptr)(int, int, int) = triple_add; + + wasix_reflection_result_t result; + int code; + + code = wasix_reflect_signature( + (wasix_function_pointer_t)nothing_ptr, + NULL, + 0, + NULL, + 0, + &result + ); + + assert(code == 0); + assert(errno == 0); + assert(result.arguments == 0); + assert(result.results == 0); + assert(result.cacheable == 1); + + wasix_value_type_t params[5]; + wasix_value_type_t results[5]; + + // Test that a function without parameters and results works + code = wasix_reflect_signature( + (wasix_function_pointer_t)triple_add_ptr, + params, + 5, + results, + 5, + &result + ); + + assert(code == 0); + assert(errno == 0); + assert(result.arguments == 3); + assert(result.results == 1); + assert(result.cacheable == 1); + + // Test that EOVERFLOW works + code = wasix_reflect_signature( + (wasix_function_pointer_t)triple_add_ptr, + params, + 2, + results, + 1, + &result + ); + + assert(code == -1); + assert(errno == EOVERFLOW); + assert(result.arguments == 3); + assert(result.results == 1); + assert(result.cacheable == 1); + + // Test that null pointers for params and results work if len is 0 + code = wasix_reflect_signature( + (wasix_function_pointer_t)triple_add_ptr, + NULL, + 0, + NULL, + 0, + &result + ); + + assert(code == -1); + assert(errno == EOVERFLOW); + assert(result.arguments == 3); + assert(result.results == 1); + assert(result.cacheable == 1); + + // Test an out of bounds pointer is not cacheable + code = wasix_reflect_signature( + (wasix_function_pointer_t)9999, // Out of bound, can not be cached + NULL, + 0, + NULL, + 0, + &result + ); + + assert(code == -1); + assert(errno == EINVAL); + assert(result.arguments == 0); + assert(result.results == 0); + assert(result.cacheable == 0); + + // Test that a the result of the null pointer is cacheable + code = wasix_reflect_signature( + (wasix_function_pointer_t)NULL, // Out of bound, can not be cached + NULL, + 0, + NULL, + 0, + &result + ); + + assert(code == -1); + assert(errno == EINVAL); + assert(result.arguments == 0); + assert(result.results == 0); + assert(result.cacheable == 1); +#endif +#endif + + printf("Reflection API seems to work\n"); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/semaphore_tests.rs b/lib/wasix/tests/semaphore_tests.rs new file mode 100644 index 00000000000..933337a9800 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests.rs @@ -0,0 +1,84 @@ +//! Semaphore tests +//! +//! These tests verify POSIX semaphore functionality: +//! - Named semaphores (sem_open, sem_close, sem_unlink) +//! - Unnamed semaphores (sem_init, sem_destroy) +//! - Semaphore operations (sem_wait, sem_post) +//! - Edge cases and error handling + +mod wasixcc_test_utils; +use wasixcc_test_utils::{run_build_script, run_wasm, run_wasm_with_result}; + +#[test] +fn test_semaphore_named() { + let wasm_path = run_build_script(file!(), "semaphore-named").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_semaphore_unnamed() { + let wasm_path = run_build_script(file!(), "semaphore-unnamed").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_semaphore_open_without_create() { + let wasm_path = run_build_script(file!(), "semaphore-open-without-create").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_semaphore_open_invalid_names() { + let wasm_path = run_build_script(file!(), "semaphore-open-invalid-names").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_semaphore_same_name_no_create_on_second() { + let wasm_path = run_build_script(file!(), "semaphore-same-name-no-create-on-second").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_semaphore_same_name_twice_with_excl() { + let wasm_path = run_build_script(file!(), "semaphore-same-name-twice-with-excl").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_semaphore_same_name_twice_without_excl() { + let wasm_path = run_build_script(file!(), "semaphore-same-name-twice-without-excl").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_semaphore_unlink_named() { + let wasm_path = run_build_script(file!(), "semaphore-unlink-named").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_semaphore_unlink_nonexistent() { + let wasm_path = run_build_script(file!(), "semaphore-unlink-nonexistent").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_semaphore_unlink_nullptr_exits() { + let wasm_path = run_build_script(file!(), "semaphore-unlink-nullptr-exits").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + let result = run_wasm_with_result(&wasm_path, test_dir).unwrap(); + + // The test should exit with a non-zero code (assertion failure) + assert!(result.exit_code.is_some(), "Expected an exit code"); + assert_ne!(result.exit_code.unwrap(), 0, "Expected non-zero exit code"); +} diff --git a/lib/wasix/tests/semaphore_tests/semaphore-named/build.sh b/lib/wasix/tests/semaphore_tests/semaphore-named/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-named/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/semaphore_tests/semaphore-named/main.c b/lib/wasix/tests/semaphore_tests/semaphore-named/main.c new file mode 100644 index 00000000000..abca5012949 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-named/main.c @@ -0,0 +1,88 @@ +// named_sem_test.c +// Build: gcc -pthread named_sem_test.c -o named_sem_test +// Run: ./named_sem_test +// +// Demonstrates a named semaphore between threads. +// Includes exit code checks for all semaphore-related calls. + +#include +#include +#include +#include +#include // For O_CREAT, O_EXCL +#include +#include +#include + +#define SEM_NAME "/test_named_sems" +#define TOKENS 5 + +void* worker(void* arg) { + sem_t* sem = (sem_t*)arg; + for (int i = 1; i <= TOKENS; i++) { + if (sem_wait(sem) < 0) { + perror("sem_wait"); + pthread_exit((void*)1); + } + printf("worker: got token %d\n", i); + usleep(100 * 1000); + } + return NULL; +} + +int main(void) { + sem_t* sem = sem_open(SEM_NAME, O_CREAT | O_EXCL, 0600, 0); + if (sem == SEM_FAILED) { + perror("sem_open"); + return EXIT_FAILURE; + } + + pthread_t th; + if (pthread_create(&th, NULL, worker, sem) != 0) { + perror("pthread_create"); + if (sem_close(sem) < 0) perror("sem_close"); + if (sem_unlink(SEM_NAME) < 0) perror("sem_unlink"); + return EXIT_FAILURE; + } + + usleep(100 * 1000); // let worker block + + for (int i = 1; i <= TOKENS; i++) { + printf("main: posting token %d\n", i); + if (sem_post(sem) < 0) { + perror("sem_post"); + pthread_cancel(th); + pthread_join(th, NULL); + if (sem_close(sem) < 0) perror("sem_close"); + if (sem_unlink(SEM_NAME) < 0) perror("sem_unlink"); + return EXIT_FAILURE; + } + usleep(50 * 1000); + } + + void* thread_ret; + if (pthread_join(th, &thread_ret) != 0) { + perror("pthread_join"); + if (sem_close(sem) < 0) perror("sem_close"); + if (sem_unlink(SEM_NAME) < 0) perror("sem_unlink"); + return EXIT_FAILURE; + } + if (thread_ret != NULL) { + fprintf(stderr, "Worker thread exited with error\n"); + if (sem_close(sem) < 0) perror("sem_close"); + if (sem_unlink(SEM_NAME) < 0) perror("sem_unlink"); + return EXIT_FAILURE; + } + + if (sem_close(sem) < 0) { + perror("sem_close"); + return EXIT_FAILURE; + } + if (sem_unlink(SEM_NAME) < 0) { + perror("sem_unlink"); + return EXIT_FAILURE; + } + + puts("done."); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/lib/wasix/tests/semaphore_tests/semaphore-open-invalid-names/build.sh b/lib/wasix/tests/semaphore_tests/semaphore-open-invalid-names/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-open-invalid-names/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/semaphore_tests/semaphore-open-invalid-names/main.c b/lib/wasix/tests/semaphore_tests/semaphore-open-invalid-names/main.c new file mode 100644 index 00000000000..9e09fa7eee7 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-open-invalid-names/main.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +// Even though POSIX requires the name to start with a slash, Linux also allows names with no or multiple leading slashes. +// However, names with embedded slashes are not allowed. +#define VALID_NAME_1 "/valid" +#define VALID_NAME_2 "valid" +#define VALID_NAME_3 "//////valid" +// #define VALID_NAME_4 "/." // Valid on POSIX, but not with musl +// #define VALID_NAME_5 "/.." +#define VALID_NAME_6 "/valid.name" +#define VALID_NAME_7 "/valid.<>:'\\|\"?*name" +#define VALID_NAME_8 "/embedded\0null" // Equivalent to "/embedded" ... why am I even testing this? +// #define VALID_NAME_9 "." +// #define VALID_NAME_10 ".." +#define INVALID_NAME_1 "" +#define INVALID_NAME_2 "/embedded/slash" +#define INVALID_NAME_3 "/name-that-is-way-too-long-123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678" + +// // NULL pointer is also invalid but results in a segmentation fault instead of sem_open returning SEM_FAILED +// #define INVALID_NAME_99 NULL +void expect_valid_name(const char* name) { + sem_t* sem = sem_open(name, O_CREAT, 0600, 0); + if (sem == SEM_FAILED) { + fprintf(stderr, "sem_open failed with a valid name: %s\n", name); + perror("sem_open"); + sem_unlink(name); // Don't check for errors, just best-effort cleanup + exit(EXIT_FAILURE); + } + sem_unlink(name); +} + +void expect_invalid_name(const char* name) { + sem_t* sem = sem_open(name, O_CREAT, 0600, 0); + if (sem != SEM_FAILED) { + fprintf(stderr, "sem_open worked with an invalid name: %s\n", name); + sem_unlink(name); // Don't check for errors, just best-effort cleanup + exit(EXIT_FAILURE); + } + sem_unlink(name); +} + +int main(void) { + expect_valid_name(VALID_NAME_1); + expect_valid_name(VALID_NAME_2); + expect_valid_name(VALID_NAME_3); + // expect_valid_name(VALID_NAME_4); + // expect_valid_name(VALID_NAME_5); + expect_valid_name(VALID_NAME_6); + expect_valid_name(VALID_NAME_7); + expect_valid_name(VALID_NAME_8); + // expect_valid_name(VALID_NAME_9); + // expect_valid_name(VALID_NAME_10); + expect_invalid_name(INVALID_NAME_1); + expect_invalid_name(INVALID_NAME_2); + expect_invalid_name(INVALID_NAME_3); + // expect_invalid_name(INVALID_NAME_99); // This one causes a segmentation fault instead + + puts("done."); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/lib/wasix/tests/semaphore_tests/semaphore-open-without-create/build.sh b/lib/wasix/tests/semaphore_tests/semaphore-open-without-create/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-open-without-create/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/semaphore_tests/semaphore-open-without-create/main.c b/lib/wasix/tests/semaphore_tests/semaphore-open-without-create/main.c new file mode 100644 index 00000000000..9e5dc96fb47 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-open-without-create/main.c @@ -0,0 +1,21 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int main(void) { + sem_t* sem = sem_open("/without-create", O_EXCL, 0600, 0); + if (sem != SEM_FAILED) { + fprintf(stderr, "sem_open worked even without _CREAT\n"); + sem_unlink("/without-create"); // Don't check for errors, just best-effort cleanup + return EXIT_FAILURE; + } + + sem_unlink("/without-create"); // Don't check for errors, just best-effort cleanup + puts("done."); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/lib/wasix/tests/semaphore_tests/semaphore-same-name-no-create-on-second/build.sh b/lib/wasix/tests/semaphore_tests/semaphore-same-name-no-create-on-second/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-same-name-no-create-on-second/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/semaphore_tests/semaphore-same-name-no-create-on-second/main.c b/lib/wasix/tests/semaphore_tests/semaphore-same-name-no-create-on-second/main.c new file mode 100644 index 00000000000..740f3cd0452 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-same-name-no-create-on-second/main.c @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int main(void) { + puts("opening the first time with O_CREAT"); + sem_t* sem1 = sem_open("/open-with-create", O_CREAT, 0600, 0); + if (sem1 == SEM_FAILED) { + perror("sem_open"); + sem_unlink("/open-with-create"); // Don't check for errors, just best-effort cleanup + return EXIT_FAILURE; + } + + puts("opening a second time without O_CREAT"); + // This one is expected to fail, because the name is already taken and O_EXCL was specified + sem_t* sem2 = sem_open("/open-with-create", 0, 0600, 0); + if (sem2 == SEM_FAILED) { + perror("sem_open"); + sem_unlink("/open-with-create"); // Don't check for errors, just best-effort cleanup + return EXIT_FAILURE; + } + + sem_unlink("/open-with-create"); // Don't check for errors, just best-effort cleanup + puts("done."); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/lib/wasix/tests/semaphore_tests/semaphore-same-name-twice-with-excl/build.sh b/lib/wasix/tests/semaphore_tests/semaphore-same-name-twice-with-excl/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-same-name-twice-with-excl/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/semaphore_tests/semaphore-same-name-twice-with-excl/main.c b/lib/wasix/tests/semaphore_tests/semaphore-same-name-twice-with-excl/main.c new file mode 100644 index 00000000000..c5d4c272d72 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-same-name-twice-with-excl/main.c @@ -0,0 +1,29 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int main(void) { + sem_t* sem1 = sem_open("/valid", O_CREAT | O_EXCL, 0600, 0); + if (sem1 == SEM_FAILED) { + perror("sem_open"); + sem_unlink("/valid"); // Don't check for errors, just best-effort cleanup + return EXIT_FAILURE; + } + + // This one is expected to fail, because the name is already taken and O_EXCL was specified + sem_t* sem2 = sem_open("/valid", O_CREAT | O_EXCL, 0600, 0); + if (sem2 != SEM_FAILED) { + fprintf(stderr, "sem_open twice with same name and O_EXCL did not fail\n"); + sem_unlink("/valid"); // Don't check for errors, just best-effort cleanup + return EXIT_FAILURE; + } + + sem_unlink("/valid"); // Don't check for errors, just best-effort cleanup + puts("done."); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/lib/wasix/tests/semaphore_tests/semaphore-same-name-twice-without-excl/build.sh b/lib/wasix/tests/semaphore_tests/semaphore-same-name-twice-without-excl/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-same-name-twice-without-excl/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/semaphore_tests/semaphore-same-name-twice-without-excl/main.c b/lib/wasix/tests/semaphore_tests/semaphore-same-name-twice-without-excl/main.c new file mode 100644 index 00000000000..0263dc9cbd0 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-same-name-twice-without-excl/main.c @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int main(void) { + puts("opening the first time"); + sem_t* sem1 = sem_open("/valid", O_CREAT | O_EXCL, 0600, 0); + if (sem1 == SEM_FAILED) { + perror("sem_open"); + sem_unlink("/valid"); // Don't check for errors, just best-effort cleanup + return EXIT_FAILURE; + } + + puts("opening a second time"); + // This one is expected to fail, because the name is already taken and O_EXCL was specified + sem_t* sem2 = sem_open("/valid", O_CREAT, 0600, 0); + if (sem2 == SEM_FAILED) { + perror("sem_open"); + sem_unlink("/valid"); // Don't check for errors, just best-effort cleanup + return EXIT_FAILURE; + } + + sem_unlink("/valid"); // Don't check for errors, just best-effort cleanup + puts("done."); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/lib/wasix/tests/semaphore_tests/semaphore-unlink-named/build.sh b/lib/wasix/tests/semaphore_tests/semaphore-unlink-named/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-unlink-named/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/semaphore_tests/semaphore-unlink-named/main.c b/lib/wasix/tests/semaphore_tests/semaphore-unlink-named/main.c new file mode 100644 index 00000000000..64707289dad --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-unlink-named/main.c @@ -0,0 +1,34 @@ +// Assert that the edgecases when unlinking a semaphore work the same as on native + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SEM_NAME "/test_unlink_unnamed_sem" +#define SEM_NAME_NON "/test_nonexistent_sem" + +int main(void) { + sem_t* sem = sem_open(SEM_NAME, O_CREAT | O_EXCL, 0600, 0); + if (sem == SEM_FAILED) { + perror("sem_open"); + return EXIT_FAILURE; + } + printf("Unlinking semaphore the first time\n"); + if (sem_unlink(SEM_NAME) == -1) { + perror("sem_unlink"); + return EXIT_FAILURE; + } + + printf("Unlinking semaphore again\n"); + assert(sem_unlink(SEM_NAME) == -1); + assert(errno == ENOENT); + + puts("done."); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/lib/wasix/tests/semaphore_tests/semaphore-unlink-nonexistent/build.sh b/lib/wasix/tests/semaphore_tests/semaphore-unlink-nonexistent/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-unlink-nonexistent/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/semaphore_tests/semaphore-unlink-nonexistent/main.c b/lib/wasix/tests/semaphore_tests/semaphore-unlink-nonexistent/main.c new file mode 100644 index 00000000000..6305a09fc65 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-unlink-nonexistent/main.c @@ -0,0 +1,22 @@ +// Assert that the edgecases when unlinking a semaphore work the same as on native + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SEM_NAME_NON "/test_nonexistent_sem" + +int main(void) { + printf("Unlinking nonexistent semaphore\n"); + assert(sem_unlink(SEM_NAME_NON) == -1); + assert(errno == ENOENT); + + puts("done."); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/lib/wasix/tests/semaphore_tests/semaphore-unlink-nullptr-exits/build.sh b/lib/wasix/tests/semaphore_tests/semaphore-unlink-nullptr-exits/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-unlink-nullptr-exits/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/semaphore_tests/semaphore-unlink-nullptr-exits/main.c b/lib/wasix/tests/semaphore_tests/semaphore-unlink-nullptr-exits/main.c new file mode 100644 index 00000000000..93c3019f5c1 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-unlink-nullptr-exits/main.c @@ -0,0 +1,23 @@ +// Assert that the edgecases when unlinking a semaphore work the same as on native + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SEM_NAME_NON "/test_nonexistent_sem" + +int main(void) { + printf("Unlinking nullptr\n"); + // Unlinking a nullpointer causes a segmentation fault on native, so it should also cause some sort of exit on WASIX + assert(sem_unlink(NULL) == -1); + assert(errno == ENOENT); + + puts("Should not reach this"); + return EXIT_SUCCESS; +} diff --git a/lib/wasix/tests/semaphore_tests/semaphore-unnamed/build.sh b/lib/wasix/tests/semaphore_tests/semaphore-unnamed/build.sh new file mode 100755 index 00000000000..02603fd6c51 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-unnamed/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +$CC main.c -o main diff --git a/lib/wasix/tests/semaphore_tests/semaphore-unnamed/main.c b/lib/wasix/tests/semaphore_tests/semaphore-unnamed/main.c new file mode 100644 index 00000000000..3b30c42e540 --- /dev/null +++ b/lib/wasix/tests/semaphore_tests/semaphore-unnamed/main.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include +#include +#include +#include + +#define TOKENS 5 + +static sem_t sem; + +static int sem_wait_checked(sem_t* s) { + for (;;) { + if (sem_wait(s) == 0) return 0; + if (errno == EINTR) continue; // retry if interrupted by signal + perror("sem_wait"); + return -1; + } +} + +void* worker(void* arg) { + (void)arg; + for (int i = 1; i <= TOKENS; i++) { + if (sem_wait_checked(&sem) == -1) { + // Return a non-null value to signal error to the joiner + pthread_exit((void*)1); + } + printf("worker: got token %d\n", i); + usleep(100 * 1000); + } + return NULL; +} + +int main(void) { + // Initialize unnamed semaphore for intra-process use (pshared = 0), initial value = 0 + if (sem_init(&sem, 0, 0) == -1) { + perror("sem_init"); + return EXIT_FAILURE; + } + + pthread_t th; + int rc = pthread_create(&th, NULL, worker, NULL); + if (rc != 0) { + fprintf(stderr, "pthread_create: %s\n", strerror(rc)); + if (sem_destroy(&sem) == -1) perror("sem_destroy"); + return EXIT_FAILURE; + } + + // Let worker start and block on sem_wait + usleep(100 * 1000); + + for (int i = 1; i <= TOKENS; i++) { + printf("main: posting token %d\n", i); + if (sem_post(&sem) == -1) { + perror("sem_post"); + // Best-effort cleanup: stop worker, join, then destroy semaphore + pthread_cancel(th); + pthread_join(th, NULL); + if (sem_destroy(&sem) == -1) perror("sem_destroy"); + return EXIT_FAILURE; + } + usleep(50 * 1000); + } + + void* thread_ret = NULL; + rc = pthread_join(th, &thread_ret); + if (rc != 0) { + fprintf(stderr, "pthread_join: %s\n", strerror(rc)); + if (sem_destroy(&sem) == -1) perror("sem_destroy"); + return EXIT_FAILURE; + } + if (thread_ret != NULL) { + fprintf(stderr, "worker thread reported an error\n"); + if (sem_destroy(&sem) == -1) perror("sem_destroy"); + return EXIT_FAILURE; + } + if (sem_destroy(&sem) == -1) { + perror("sem_destroy"); + return EXIT_FAILURE; + } + + puts("done."); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/lib/wasix/tests/shared_library_tests.rs b/lib/wasix/tests/shared_library_tests.rs new file mode 100644 index 00000000000..bcf8f04677b --- /dev/null +++ b/lib/wasix/tests/shared_library_tests.rs @@ -0,0 +1,30 @@ +//! Shared library tests from wasix-tests directory +//! +//! These tests verify that shared libraries (.so) work correctly: +//! - simple-shared-lib: Basic shared library with a function +//! - errno-in-shared-lib: errno (thread-local) works correctly in shared libraries +//! - simple-exceptions-in-shared-lib: C++ exceptions in shared libraries + +mod wasixcc_test_utils; +use wasixcc_test_utils::{run_build_script, run_wasm}; + +#[test] +fn test_simple_shared_lib() { + let wasm_path = run_build_script(file!(), "simple-shared-lib").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_errno_in_shared_lib() { + let wasm_path = run_build_script(file!(), "errno-in-shared-lib").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} + +#[test] +fn test_simple_exceptions_in_shared_lib() { + let wasm_path = run_build_script(file!(), "simple-exceptions-in-shared-lib").unwrap(); + let test_dir = wasm_path.parent().unwrap(); + run_wasm(&wasm_path, test_dir).unwrap(); +} diff --git a/lib/wasix/tests/shared_library_tests/errno-in-shared-lib/build.sh b/lib/wasix/tests/shared_library_tests/errno-in-shared-lib/build.sh new file mode 100755 index 00000000000..d10925b5035 --- /dev/null +++ b/lib/wasix/tests/shared_library_tests/errno-in-shared-lib/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CC -c -fPIC -fwasm-exceptions side.c -o side.o +$CC -shared -fwasm-exceptions side.o -o libside.so +$CC -fwasm-exceptions main.c -L$PWD -lside -o main diff --git a/lib/wasix/tests/shared_library_tests/errno-in-shared-lib/main.c b/lib/wasix/tests/shared_library_tests/errno-in-shared-lib/main.c new file mode 100644 index 00000000000..1d8bca85866 --- /dev/null +++ b/lib/wasix/tests/shared_library_tests/errno-in-shared-lib/main.c @@ -0,0 +1,8 @@ +#include + +extern int get_value(); + +int main() { + printf("The shared library returned: %i\n", get_value()); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/shared_library_tests/errno-in-shared-lib/side.c b/lib/wasix/tests/shared_library_tests/errno-in-shared-lib/side.c new file mode 100644 index 00000000000..40612dd3fd6 --- /dev/null +++ b/lib/wasix/tests/shared_library_tests/errno-in-shared-lib/side.c @@ -0,0 +1,5 @@ +#include + +int get_value() { + return errno; +} \ No newline at end of file diff --git a/lib/wasix/tests/shared_library_tests/simple-exceptions-in-shared-lib/build.sh b/lib/wasix/tests/shared_library_tests/simple-exceptions-in-shared-lib/build.sh new file mode 100755 index 00000000000..17f1241441a --- /dev/null +++ b/lib/wasix/tests/shared_library_tests/simple-exceptions-in-shared-lib/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC -fwasm-exceptions library.cpp -o library.o +$CXX -shared -fwasm-exceptions library.o -o liblibrary.so +$CXX -fwasm-exceptions main.cpp -L$PWD -Wl,--no-as-needed -llibrary -o main diff --git a/lib/wasix/tests/shared_library_tests/simple-exceptions-in-shared-lib/library.cpp b/lib/wasix/tests/shared_library_tests/simple-exceptions-in-shared-lib/library.cpp new file mode 100644 index 00000000000..f1f6d9a9862 --- /dev/null +++ b/lib/wasix/tests/shared_library_tests/simple-exceptions-in-shared-lib/library.cpp @@ -0,0 +1,10 @@ +#include + +int try_catch_in_lib() { + try { + throw "An exception occurred!"; + } catch (const char* msg) { + printf("Caught exception: %s\n", msg); + } + return 42; +} \ No newline at end of file diff --git a/lib/wasix/tests/shared_library_tests/simple-exceptions-in-shared-lib/library.hpp b/lib/wasix/tests/shared_library_tests/simple-exceptions-in-shared-lib/library.hpp new file mode 100644 index 00000000000..5e6348fd28d --- /dev/null +++ b/lib/wasix/tests/shared_library_tests/simple-exceptions-in-shared-lib/library.hpp @@ -0,0 +1 @@ +int try_catch_in_lib(); \ No newline at end of file diff --git a/lib/wasix/tests/shared_library_tests/simple-exceptions-in-shared-lib/main.cpp b/lib/wasix/tests/shared_library_tests/simple-exceptions-in-shared-lib/main.cpp new file mode 100644 index 00000000000..cbfb07f80d7 --- /dev/null +++ b/lib/wasix/tests/shared_library_tests/simple-exceptions-in-shared-lib/main.cpp @@ -0,0 +1,9 @@ +#include +#include +#include "library.hpp" + + +int main() { + try_catch_in_lib(); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/shared_library_tests/simple-shared-lib/build.sh b/lib/wasix/tests/shared_library_tests/simple-shared-lib/build.sh new file mode 100755 index 00000000000..d10925b5035 --- /dev/null +++ b/lib/wasix/tests/shared_library_tests/simple-shared-lib/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CC -c -fPIC -fwasm-exceptions side.c -o side.o +$CC -shared -fwasm-exceptions side.o -o libside.so +$CC -fwasm-exceptions main.c -L$PWD -lside -o main diff --git a/lib/wasix/tests/shared_library_tests/simple-shared-lib/main.c b/lib/wasix/tests/shared_library_tests/simple-shared-lib/main.c new file mode 100644 index 00000000000..1d8bca85866 --- /dev/null +++ b/lib/wasix/tests/shared_library_tests/simple-shared-lib/main.c @@ -0,0 +1,8 @@ +#include + +extern int get_value(); + +int main() { + printf("The shared library returned: %i\n", get_value()); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/shared_library_tests/simple-shared-lib/side.c b/lib/wasix/tests/shared_library_tests/simple-shared-lib/side.c new file mode 100644 index 00000000000..d9aced8efa0 --- /dev/null +++ b/lib/wasix/tests/shared_library_tests/simple-shared-lib/side.c @@ -0,0 +1,3 @@ +int get_value() { + return 42; +} diff --git a/lib/wasix/tests/threadlocal_tests.rs b/lib/wasix/tests/threadlocal_tests.rs new file mode 100644 index 00000000000..a40bd3f004f --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests.rs @@ -0,0 +1,588 @@ +mod wasixcc_test_utils; +use wasixcc_test_utils::{run_build_script, run_wasm}; + +#[test] +fn minimal_threadlocal() { + let wasm = run_build_script(file!(), "minimal-threadlocal").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn minimal_threadlocals() { + let wasm = run_build_script(file!(), "minimal-threadlocals").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn thread_getspecific_in_main_thread() { + let wasm = run_build_script(file!(), "thread-getspecific-in-main-thread").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn threadlocal_errno() { + let wasm = run_build_script(file!(), "threadlocal-errno").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn threadlocal_defined_in_main_used_in_shared_lib() { + let wasm = run_build_script(file!(), "threadlocal-defined-in-main-used-in-shared-lib").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn threadlocal_in_shared_lib() { + let wasm = run_build_script(file!(), "threadlocal-in-shared-lib").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn threadlocals_are_actually_threadlocal() { + let wasm = run_build_script(file!(), "threadlocals-are-actually-threadlocal").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn threadlocals_work_in_a_shared_lib() { + let wasm = run_build_script(file!(), "threadlocals-work-in-a-shared-lib").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn threadlocals_work_in_a_shared_lib_weird() { + let wasm = run_build_script(file!(), "threadlocals-work-in-a-shared-lib-weird").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn extern_threadlocal() { + let wasm = run_build_script(file!(), "extern-threadlocal").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn extern_threadlocal_nopic() { + let wasm = run_build_script(file!(), "extern-threadlocal-nopic").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +// Grid tests for thread-getspecific set/get with different linking strategies +#[test] +fn tsd_set_direct_in_direct_get_direct_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-DIRECT-get-DIRECT-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_direct_get_direct_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-DIRECT-get-DIRECT-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_direct_get_direct_in_dynamic() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-DIRECT-get-DIRECT-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_shared_get_direct_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-SHARED-get-DIRECT-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_shared_get_direct_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-SHARED-get-DIRECT-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_shared_get_direct_in_dynamic() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-SHARED-get-DIRECT-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_dynamic_get_direct_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-DYNAMIC-get-DIRECT-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_dynamic_get_direct_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-DYNAMIC-get-DIRECT-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_dynamic_get_direct_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DIRECT-in-DYNAMIC-get-DIRECT-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_direct_get_shared_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-DIRECT-get-SHARED-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_direct_get_shared_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-DIRECT-get-SHARED-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_direct_get_shared_in_dynamic() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-DIRECT-get-SHARED-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_shared_get_shared_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-SHARED-get-SHARED-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_shared_get_shared_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-SHARED-get-SHARED-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_shared_get_shared_in_dynamic() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-SHARED-get-SHARED-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_dynamic_get_shared_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-DYNAMIC-get-SHARED-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_dynamic_get_shared_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-DYNAMIC-get-SHARED-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_dynamic_get_shared_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DIRECT-in-DYNAMIC-get-SHARED-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_direct_get_dynamic_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-DIRECT-get-DYNAMIC-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_direct_get_dynamic_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-DIRECT-get-DYNAMIC-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_direct_get_dynamic_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DIRECT-in-DIRECT-get-DYNAMIC-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_shared_get_dynamic_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-SHARED-get-DYNAMIC-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_shared_get_dynamic_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-DIRECT-in-SHARED-get-DYNAMIC-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_shared_get_dynamic_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DIRECT-in-SHARED-get-DYNAMIC-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_dynamic_get_dynamic_in_direct() { + let wasm = + run_build_script(file!(), "tsd-set-DIRECT-in-DYNAMIC-get-DYNAMIC-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_dynamic_get_dynamic_in_shared() { + let wasm = + run_build_script(file!(), "tsd-set-DIRECT-in-DYNAMIC-get-DYNAMIC-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_direct_in_dynamic_get_dynamic_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DIRECT-in-DYNAMIC-get-DYNAMIC-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_direct_get_direct_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-DIRECT-get-DIRECT-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_direct_get_direct_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-DIRECT-get-DIRECT-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_direct_get_direct_in_dynamic() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-DIRECT-get-DIRECT-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_shared_get_direct_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-SHARED-get-DIRECT-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_shared_get_direct_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-SHARED-get-DIRECT-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_shared_get_direct_in_dynamic() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-SHARED-get-DIRECT-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_dynamic_get_direct_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-DYNAMIC-get-DIRECT-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_dynamic_get_direct_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-DYNAMIC-get-DIRECT-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_dynamic_get_direct_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-SHARED-in-DYNAMIC-get-DIRECT-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_direct_get_shared_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-DIRECT-get-SHARED-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_direct_get_shared_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-DIRECT-get-SHARED-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_direct_get_shared_in_dynamic() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-DIRECT-get-SHARED-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_shared_get_shared_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-SHARED-get-SHARED-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_shared_get_shared_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-SHARED-get-SHARED-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_shared_get_shared_in_dynamic() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-SHARED-get-SHARED-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_dynamic_get_shared_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-DYNAMIC-get-SHARED-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_dynamic_get_shared_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-DYNAMIC-get-SHARED-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_dynamic_get_shared_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-SHARED-in-DYNAMIC-get-SHARED-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_direct_get_dynamic_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-DIRECT-get-DYNAMIC-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_direct_get_dynamic_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-DIRECT-get-DYNAMIC-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_direct_get_dynamic_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-SHARED-in-DIRECT-get-DYNAMIC-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_shared_get_dynamic_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-SHARED-get-DYNAMIC-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_shared_get_dynamic_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-SHARED-in-SHARED-get-DYNAMIC-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_shared_get_dynamic_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-SHARED-in-SHARED-get-DYNAMIC-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_dynamic_get_dynamic_in_direct() { + let wasm = + run_build_script(file!(), "tsd-set-SHARED-in-DYNAMIC-get-DYNAMIC-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_dynamic_get_dynamic_in_shared() { + let wasm = + run_build_script(file!(), "tsd-set-SHARED-in-DYNAMIC-get-DYNAMIC-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_shared_in_dynamic_get_dynamic_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-SHARED-in-DYNAMIC-get-DYNAMIC-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_direct_get_direct_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-DYNAMIC-in-DIRECT-get-DIRECT-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_direct_get_direct_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-DYNAMIC-in-DIRECT-get-DIRECT-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_direct_get_direct_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DIRECT-get-DIRECT-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_shared_get_direct_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-DYNAMIC-in-SHARED-get-DIRECT-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_shared_get_direct_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-DYNAMIC-in-SHARED-get-DIRECT-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_shared_get_direct_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-SHARED-get-DIRECT-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_dynamic_get_direct_in_direct() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DYNAMIC-get-DIRECT-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_dynamic_get_direct_in_shared() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DYNAMIC-get-DIRECT-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_dynamic_get_direct_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DYNAMIC-get-DIRECT-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_direct_get_shared_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-DYNAMIC-in-DIRECT-get-SHARED-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_direct_get_shared_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-DYNAMIC-in-DIRECT-get-SHARED-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_direct_get_shared_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DIRECT-get-SHARED-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_shared_get_shared_in_direct() { + let wasm = run_build_script(file!(), "tsd-set-DYNAMIC-in-SHARED-get-SHARED-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_shared_get_shared_in_shared() { + let wasm = run_build_script(file!(), "tsd-set-DYNAMIC-in-SHARED-get-SHARED-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_shared_get_shared_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-SHARED-get-SHARED-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_dynamic_get_shared_in_direct() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DYNAMIC-get-SHARED-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_dynamic_get_shared_in_shared() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DYNAMIC-get-SHARED-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_dynamic_get_shared_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DYNAMIC-get-SHARED-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_direct_get_dynamic_in_direct() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DIRECT-get-DYNAMIC-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_direct_get_dynamic_in_shared() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DIRECT-get-DYNAMIC-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_direct_get_dynamic_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DIRECT-get-DYNAMIC-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_shared_get_dynamic_in_direct() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-SHARED-get-DYNAMIC-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_shared_get_dynamic_in_shared() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-SHARED-get-DYNAMIC-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_shared_get_dynamic_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-SHARED-get-DYNAMIC-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_dynamic_get_dynamic_in_direct() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DYNAMIC-get-DYNAMIC-in-DIRECT").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_dynamic_get_dynamic_in_shared() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DYNAMIC-get-DYNAMIC-in-SHARED").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} + +#[test] +fn tsd_set_dynamic_in_dynamic_get_dynamic_in_dynamic() { + let wasm = + run_build_script(file!(), "tsd-set-DYNAMIC-in-DYNAMIC-get-DYNAMIC-in-DYNAMIC").unwrap(); + run_wasm(&wasm, wasm.parent().unwrap()).unwrap(); +} diff --git a/lib/wasix/tests/threadlocal_tests/extern-threadlocal-nopic/build.sh b/lib/wasix/tests/threadlocal_tests/extern-threadlocal-nopic/build.sh new file mode 100755 index 00000000000..2c9efe91a5f --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/extern-threadlocal-nopic/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC erryes.cpp -o erryes.o +$CXX -shared erryes.o -o liberryes.so +$CXX main.cpp -L$PWD -lerryes -o main diff --git a/lib/wasix/tests/threadlocal_tests/extern-threadlocal-nopic/erryes.cpp b/lib/wasix/tests/threadlocal_tests/extern-threadlocal-nopic/erryes.cpp new file mode 100644 index 00000000000..21c5850474b --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/extern-threadlocal-nopic/erryes.cpp @@ -0,0 +1 @@ +thread_local int erryes = 999; \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/extern-threadlocal-nopic/main.cpp b/lib/wasix/tests/threadlocal_tests/extern-threadlocal-nopic/main.cpp new file mode 100644 index 00000000000..46b8ce9c818 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/extern-threadlocal-nopic/main.cpp @@ -0,0 +1,8 @@ +#include + +extern thread_local int erryes; + +int main() { + printf("error number: %i\n", erryes); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/extern-threadlocal/build.sh b/lib/wasix/tests/threadlocal_tests/extern-threadlocal/build.sh new file mode 100755 index 00000000000..2c9efe91a5f --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/extern-threadlocal/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CXX -c -fPIC erryes.cpp -o erryes.o +$CXX -shared erryes.o -o liberryes.so +$CXX main.cpp -L$PWD -lerryes -o main diff --git a/lib/wasix/tests/threadlocal_tests/extern-threadlocal/erryes.cpp b/lib/wasix/tests/threadlocal_tests/extern-threadlocal/erryes.cpp new file mode 100644 index 00000000000..21c5850474b --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/extern-threadlocal/erryes.cpp @@ -0,0 +1 @@ +thread_local int erryes = 999; \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/extern-threadlocal/main.cpp b/lib/wasix/tests/threadlocal_tests/extern-threadlocal/main.cpp new file mode 100644 index 00000000000..46b8ce9c818 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/extern-threadlocal/main.cpp @@ -0,0 +1,8 @@ +#include + +extern thread_local int erryes; + +int main() { + printf("error number: %i\n", erryes); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/minimal-threadlocal/build.sh b/lib/wasix/tests/threadlocal_tests/minimal-threadlocal/build.sh new file mode 100755 index 00000000000..69a0f5c7183 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/minimal-threadlocal/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CXX -c main.cpp -o main.o +$CXX main.o -o main diff --git a/lib/wasix/tests/threadlocal_tests/minimal-threadlocal/main.cpp b/lib/wasix/tests/threadlocal_tests/minimal-threadlocal/main.cpp new file mode 100644 index 00000000000..74089f2c65c --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/minimal-threadlocal/main.cpp @@ -0,0 +1,6 @@ +#include +#include + +struct yeah { ~yeah() { std::cout << "destruct thread local\n"; } }; +thread_local yeah x; +int main() { std::thread{ []() { std::cout << "hello\n"; } }.join(); } \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/minimal-threadlocals/build.sh b/lib/wasix/tests/threadlocal_tests/minimal-threadlocals/build.sh new file mode 100755 index 00000000000..03e76ad3949 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/minimal-threadlocals/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CC -c -fPIC side.c -o side.o +$CC -shared side.o -o libside.so +$CC main.c -L$PWD -lside -o main diff --git a/lib/wasix/tests/threadlocal_tests/minimal-threadlocals/main.c b/lib/wasix/tests/threadlocal_tests/minimal-threadlocals/main.c new file mode 100644 index 00000000000..f111272969f --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/minimal-threadlocals/main.c @@ -0,0 +1,23 @@ +#include +#include +#include +#include + +extern _Thread_local int toast; +void *thread_func(void *data) { + printf("%d\n", toast); + return NULL; +} + +int main() { + toast = 10; + printf("%d ", toast); + + pthread_attr_t attr = {0}; + pthread_t thread = {0}; + void *thread_ret; + if (pthread_attr_init(&attr) != 0) { return 1; } + if (pthread_create(&thread, &attr, &thread_func, (void *)stdout) != 0) { return 2; } + if (pthread_join(thread, &thread_ret) != 0) { return 3; } + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/minimal-threadlocals/side.c b/lib/wasix/tests/threadlocal_tests/minimal-threadlocals/side.c new file mode 100644 index 00000000000..183152b7098 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/minimal-threadlocals/side.c @@ -0,0 +1 @@ +int _Thread_local toast = 20; \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/thread-getspecific-in-main-thread/build.sh b/lib/wasix/tests/threadlocal_tests/thread-getspecific-in-main-thread/build.sh new file mode 100755 index 00000000000..69a0f5c7183 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/thread-getspecific-in-main-thread/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CXX -c main.cpp -o main.o +$CXX main.o -o main diff --git a/lib/wasix/tests/threadlocal_tests/thread-getspecific-in-main-thread/main.cpp b/lib/wasix/tests/threadlocal_tests/thread-getspecific-in-main-thread/main.cpp new file mode 100644 index 00000000000..ed8068f018b --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/thread-getspecific-in-main-thread/main.cpp @@ -0,0 +1,21 @@ +#include +#include +#include + +int main() { + pthread_key_t key; + int res = pthread_key_create(&key, nullptr); + assert(res == 0); + + void* value = (void*)0x12345; + res = pthread_setspecific(key, value); + assert(res == 0); + + void* retrieved = pthread_getspecific(key); + printf("thread_getspecific returned: %p\n", retrieved); + + assert(retrieved == value); + + pthread_key_delete(key); + return 0; +} diff --git a/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/get-data-proxy.c b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/get-data-proxy.c new file mode 100644 index 00000000000..8ef496c636d --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/get-data-proxy.c @@ -0,0 +1,32 @@ +#if defined(GET_DATA_DIRECT) || defined(GET_DATA_SHARED) +#include "get-data.h" + +void get_data_proxy() { + get_data(); +} +#elif defined(GET_DATA_DYNAMIC) +#include +#include +#include +#include +#include "thread-keys.h" + +typedef void (*get_data_func_t)(); + +void get_data_proxy() { + void* handle = dlopen("./libget-data.so", RTLD_LAZY); + if(handle == NULL) { + fprintf(stderr, "dlopen failed: %s\n", dlerror()); + exit(1); + } + get_data_func_t func = (get_data_func_t)dlsym(handle, "get_data"); + if (func == NULL) { + fprintf(stderr, "dlsym failed: %s\n", dlerror()); + exit(1); + } + func(); + dlclose(handle); +} +#else +#error "You need to define one of GET_DATA_DIRECT, GET_DATA_SHARED, or GET_DATA_DYNAMIC" +#endif \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/get-data-proxy.h b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/get-data-proxy.h new file mode 100644 index 00000000000..cc527a268f6 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/get-data-proxy.h @@ -0,0 +1 @@ +void get_data_proxy(); \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/get-data.c b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/get-data.c new file mode 100644 index 00000000000..8934dbc2568 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/get-data.c @@ -0,0 +1,13 @@ +#include +#include "thread-keys.h" +#include + +void get_data() { + void* valueA = (void*)0x12345; + void* valueB = (void*)0x67890; + void* retrievedA = pthread_getspecific(key_a); + assert(retrievedA == valueA); + void* retrievedB = pthread_getspecific(key_b); + assert(retrievedB == valueB); + fprintf(stdout, "get"); +} diff --git a/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/get-data.h b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/get-data.h new file mode 100644 index 00000000000..2c024d4cdbe --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/get-data.h @@ -0,0 +1 @@ +void get_data(); \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/main.c b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/main.c new file mode 100644 index 00000000000..ee268e3d1c5 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/main.c @@ -0,0 +1,91 @@ +#include +#include "thread-keys.h" +#include +#include +#if defined(SET_DATA_PROXY_DIRECT) || defined(SET_DATA_PROXY_SHARED) +#include "set-data-proxy.h" +#endif +#if defined(GET_DATA_PROXY_DIRECT) || defined(GET_DATA_PROXY_SHARED) +#include "get-data-proxy.h" +#endif +#if defined(SET_DATA_PROXY_DYNAMIC) || defined(GET_DATA_PROXY_DYNAMIC) +#include "dlfcn.h" +#include +#endif + +pthread_key_t key_a; +pthread_key_t key_b; + +void* run_test(void *data) { + // Set thread specific data +#if defined(SET_DATA_PROXY_DYNAMIC) + void* handle_set_data_proxy = dlopen("./libset-data-proxy.so", RTLD_LAZY); + if(handle_set_data_proxy == NULL) { + fprintf(stderr, "dlopen failed: %s\n", dlerror()); + exit(1); + } + typedef void (*set_data_proxy_func_t)(); + set_data_proxy_func_t set_data_proxy = (set_data_proxy_func_t)dlsym(handle_set_data_proxy, "set_data_proxy"); + if (set_data_proxy == NULL) { + fprintf(stderr, "dlsym failed: %s\n", dlerror()); + exit(1); + } +#endif + set_data_proxy(); + + // Get thread specific data +#if defined(GET_DATA_PROXY_DYNAMIC) + void* handle_get_data_proxy = dlopen("./libget-data-proxy.so", RTLD_LAZY); + if(handle_get_data_proxy == NULL) { + fprintf(stderr, "dlopen failed: %s\n", dlerror()); + exit(1); + } + typedef void (*get_data_proxy_func_t)(); + get_data_proxy_func_t get_data_proxy = (get_data_proxy_func_t)dlsym(handle_get_data_proxy, "get_data_proxy"); + if (get_data_proxy == NULL) { + fprintf(stderr, "dlsym failed: %s\n", dlerror()); + exit(1); + } +#endif + get_data_proxy(); + + // Terminate the output with a newline + printf("\n"); +} + +int main() { + int res = pthread_key_create(&key_a, NULL); + assert(res == 0); + assert(pthread_getspecific(key_a) == NULL); + res = pthread_key_create(&key_b, NULL); + assert(res == 0); + assert(pthread_getspecific(key_b) == NULL); + +#if defined(THREAD_WORKER) + pthread_attr_t attr = {0}; + if (pthread_attr_init(&attr) != 0) { + perror("init attr"); + return -1; + } + + pthread_t thread = {0}; + if (pthread_create(&thread, &attr, &run_test, (void *)stdout) != 0) { + perror("create thread"); + return -1; + } + + void *thread_ret; + if (pthread_join(thread, &thread_ret) != 0) { + perror("join"); + return -1; + } +#elif defined(THREAD_MAIN) + run_test(NULL); +#else +#error "You need to define one of THREAD_MAIN or THREAD_WORKER" +#endif + + pthread_key_delete(key_a); + pthread_key_delete(key_b); + return 0; +} diff --git a/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/set-data-proxy.c b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/set-data-proxy.c new file mode 100644 index 00000000000..63c0e73f97c --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/set-data-proxy.c @@ -0,0 +1,32 @@ +#if defined(SET_DATA_DIRECT) || defined(SET_DATA_SHARED) +#include "set-data.h" + +void set_data_proxy() { + set_data(); +} +#elif defined(SET_DATA_DYNAMIC) +#include +#include +#include +#include +#include "thread-keys.h" + +typedef void (*set_data_func_t)(); + +void set_data_proxy() { + void* handle = dlopen("./libset-data.so", RTLD_LAZY); + if(handle == NULL) { + fprintf(stderr, "dlopen failed: %s\n", dlerror()); + exit(1); + } + set_data_func_t func = (set_data_func_t)dlsym(handle, "set_data"); + if (func == NULL) { + fprintf(stderr, "dlsym failed: %s\n", dlerror()); + exit(1); + } + func(); + dlclose(handle); +} +#else +#error "You need to define one of SET_DATA_DIRECT, SET_DATA_SHARED, or SET_DATA_DYNAMIC" +#endif \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/set-data-proxy.h b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/set-data-proxy.h new file mode 100644 index 00000000000..56668980ce2 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/set-data-proxy.h @@ -0,0 +1 @@ +void set_data_proxy(); \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/set-data.c b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/set-data.c new file mode 100644 index 00000000000..c577a538743 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/set-data.c @@ -0,0 +1,20 @@ +#include +#include +#include "thread-keys.h" +#include + +void set_data() { + void* valueA = (void*)0x12345; + void* valueB = (void*)0x67890; + + void* retrievedA = pthread_getspecific(key_a); + assert(retrievedA == NULL); + int res = pthread_setspecific(key_a, valueA); + assert(res == 0); + + void* retrievedB = pthread_getspecific(key_b); + assert(retrievedB == NULL); + res = pthread_setspecific(key_b, valueB); + assert(res == 0); + fprintf(stdout, "set"); +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/set-data.h b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/set-data.h new file mode 100644 index 00000000000..ab3167827da --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/set-data.h @@ -0,0 +1 @@ +void set_data(); \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/thread-keys.h b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/thread-keys.h new file mode 100644 index 00000000000..7517bc23a6e --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/thread-getspecific-set-and-get/thread-keys.h @@ -0,0 +1,4 @@ +#include + +extern pthread_key_t key_a; +extern pthread_key_t key_b; \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/threadlocal-defined-in-main-used-in-shared-lib/build.sh b/lib/wasix/tests/threadlocal_tests/threadlocal-defined-in-main-used-in-shared-lib/build.sh new file mode 100755 index 00000000000..03e76ad3949 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocal-defined-in-main-used-in-shared-lib/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CC -c -fPIC side.c -o side.o +$CC -shared side.o -o libside.so +$CC main.c -L$PWD -lside -o main diff --git a/lib/wasix/tests/threadlocal_tests/threadlocal-defined-in-main-used-in-shared-lib/main.c b/lib/wasix/tests/threadlocal_tests/threadlocal-defined-in-main-used-in-shared-lib/main.c new file mode 100644 index 00000000000..2f84e7a39f6 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocal-defined-in-main-used-in-shared-lib/main.c @@ -0,0 +1,9 @@ +#include + +_Thread_local int my_tls_int = 42; +extern int get_value(); + +int main() { + printf("The shared library returned: %i\n", get_value()); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/threadlocal-defined-in-main-used-in-shared-lib/side.c b/lib/wasix/tests/threadlocal_tests/threadlocal-defined-in-main-used-in-shared-lib/side.c new file mode 100644 index 00000000000..dd711dfbd53 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocal-defined-in-main-used-in-shared-lib/side.c @@ -0,0 +1,5 @@ +extern _Thread_local int my_tls_int; + +int get_value() { + return my_tls_int; +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/threadlocal-errno/build.sh b/lib/wasix/tests/threadlocal_tests/threadlocal-errno/build.sh new file mode 100755 index 00000000000..69a0f5c7183 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocal-errno/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CXX -c main.cpp -o main.o +$CXX main.o -o main diff --git a/lib/wasix/tests/threadlocal_tests/threadlocal-errno/main.cpp b/lib/wasix/tests/threadlocal_tests/threadlocal-errno/main.cpp new file mode 100644 index 00000000000..1aed16ab5b8 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocal-errno/main.cpp @@ -0,0 +1,29 @@ +#include +#include +#include +#include + +constexpr int NUM_THREADS = 4; +int thread_values[NUM_THREADS]; + +void worker(int idx) { + errno = 100 + idx; + thread_values[idx] = errno; +} + +int main() { + errno = 1; + std::vector threads; + threads.reserve(NUM_THREADS); + for (int i = 0; i < NUM_THREADS; ++i) { + threads.emplace_back(worker, i); + } + for (auto &t : threads) { + t.join(); + } + printf("main errno %d\n", errno); + for (int i = 0; i < NUM_THREADS; ++i) { + printf("thread %d errno %d\n", i, thread_values[i]); + } + return 0; +} diff --git a/lib/wasix/tests/threadlocal_tests/threadlocal-in-shared-lib/build.sh b/lib/wasix/tests/threadlocal_tests/threadlocal-in-shared-lib/build.sh new file mode 100755 index 00000000000..03e76ad3949 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocal-in-shared-lib/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CC -c -fPIC side.c -o side.o +$CC -shared side.o -o libside.so +$CC main.c -L$PWD -lside -o main diff --git a/lib/wasix/tests/threadlocal_tests/threadlocal-in-shared-lib/main.c b/lib/wasix/tests/threadlocal_tests/threadlocal-in-shared-lib/main.c new file mode 100644 index 00000000000..1d8bca85866 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocal-in-shared-lib/main.c @@ -0,0 +1,8 @@ +#include + +extern int get_value(); + +int main() { + printf("The shared library returned: %i\n", get_value()); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/threadlocal-in-shared-lib/side.c b/lib/wasix/tests/threadlocal_tests/threadlocal-in-shared-lib/side.c new file mode 100644 index 00000000000..8f325261f69 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocal-in-shared-lib/side.c @@ -0,0 +1,5 @@ +_Thread_local int my_tls_int = 42; // Set a thread-local variable + +int get_value() { + return my_tls_int; +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/threadlocals-are-actually-threadlocal/build.sh b/lib/wasix/tests/threadlocal_tests/threadlocals-are-actually-threadlocal/build.sh new file mode 100755 index 00000000000..c26f9175438 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocals-are-actually-threadlocal/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e +$CC -c main.c -o main.o +$CC main.o -o main diff --git a/lib/wasix/tests/threadlocal_tests/threadlocals-are-actually-threadlocal/main.c b/lib/wasix/tests/threadlocal_tests/threadlocals-are-actually-threadlocal/main.c new file mode 100644 index 00000000000..0f86c18f5ab --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocals-are-actually-threadlocal/main.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include + +_Thread_local int toast = 10; + +void print_toast() { + printf("value=%d ", toast++); +} + +void *thread_func(void *data) { + print_toast(); + return NULL; +} + +int main() +{ + print_toast(); + print_toast(); + + pthread_attr_t attr = {0}; + if (pthread_attr_init(&attr) != 0) { + perror("init attr"); + return -1; + } + pthread_t thread = {0}; + if (pthread_create(&thread, &attr, &thread_func, (void *)stdout) != 0) { + perror("create thread"); + return -1; + } + void *thread_ret; + if (pthread_join(thread, &thread_ret) != 0) { + perror("join"); + return -1; + } + + print_toast(); + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib-weird/build.sh b/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib-weird/build.sh new file mode 100755 index 00000000000..03e76ad3949 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib-weird/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CC -c -fPIC side.c -o side.o +$CC -shared side.o -o libside.so +$CC main.c -L$PWD -lside -o main diff --git a/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib-weird/main.c b/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib-weird/main.c new file mode 100644 index 00000000000..ddea9e13cca --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib-weird/main.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include + +_Thread_local int toast = 10; +extern void print_toast_from_lib(); +extern void increment_toast_from_lib(); +void increment_toast_from_main() { + toast++; +} +void print_toast_from_main() { + printf("%d", toast); +} + +void print_main_and_lib() { + print_toast_from_lib(); + printf(":"); + print_toast_from_main(); + printf(" "); +} + +void *thread_func(void *data) { + print_main_and_lib(); + increment_toast_from_lib(); + print_main_and_lib(); + increment_toast_from_lib(); + print_main_and_lib(); + return NULL; +} + +int main() +{ + print_main_and_lib(); + increment_toast_from_lib(); + print_main_and_lib(); + increment_toast_from_lib(); + print_main_and_lib(); + + pthread_attr_t attr = {0}; + if (pthread_attr_init(&attr) != 0) { + perror("init attr"); + return -1; + } + pthread_t thread = {0}; + if (pthread_create(&thread, &attr, &thread_func, (void *)stdout) != 0) { + perror("create thread"); + return -1; + } + void *thread_ret; + if (pthread_join(thread, &thread_ret) != 0) { + perror("join"); + return -1; + } + + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib-weird/side.c b/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib-weird/side.c new file mode 100644 index 00000000000..0a83af8ca7c --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib-weird/side.c @@ -0,0 +1,9 @@ +#include + +int _Thread_local toast = 20; +void increment_toast_from_lib() { + toast++; +} +void print_toast_from_lib() { + printf("%d", toast); +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib/build.sh b/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib/build.sh new file mode 100755 index 00000000000..03e76ad3949 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +$CC -c -fPIC side.c -o side.o +$CC -shared side.o -o libside.so +$CC main.c -L$PWD -lside -o main diff --git a/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib/main.c b/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib/main.c new file mode 100644 index 00000000000..7b86f2e2833 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib/main.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include + +extern _Thread_local int toast; +extern void print_toast_from_lib(); +extern void increment_toast_from_lib(); +void increment_toast_from_main() { + toast++; +} +void print_toast_from_main() { + printf("%d", toast); +} + +void print_main_and_lib() { + print_toast_from_lib(); + printf(":"); + print_toast_from_main(); + printf(" "); +} + +void *thread_func(void *data) { + print_main_and_lib(); + increment_toast_from_lib(); + print_main_and_lib(); + increment_toast_from_lib(); + print_main_and_lib(); + return NULL; +} + +int main() +{ + print_main_and_lib(); + increment_toast_from_lib(); + print_main_and_lib(); + increment_toast_from_lib(); + print_main_and_lib(); + + pthread_attr_t attr = {0}; + if (pthread_attr_init(&attr) != 0) { + perror("init attr"); + return -1; + } + pthread_t thread = {0}; + if (pthread_create(&thread, &attr, &thread_func, (void *)stdout) != 0) { + perror("create thread"); + return -1; + } + void *thread_ret; + if (pthread_join(thread, &thread_ret) != 0) { + perror("join"); + return -1; + } + + return 0; +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib/side.c b/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib/side.c new file mode 100644 index 00000000000..f5a9f455d07 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/threadlocals-work-in-a-shared-lib/side.c @@ -0,0 +1,9 @@ +#include + +int _Thread_local toast = 10; +void increment_toast_from_lib() { + toast++; +} +void print_toast_from_lib() { + printf("%d", toast); +} \ No newline at end of file diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DIRECT-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DIRECT-in-DIRECT/build.sh new file mode 100755 index 00000000000..16115b9a1b6 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DIRECT-in-DIRECT/build.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DIRECT, GET_DATA=DIRECT in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DIRECT -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DIRECT -DGET_DATA_PROXY_DIRECT -DGET_DATA_DIRECT $SRCDIR/set-data-proxy.c $SRCDIR/get-data-proxy.c $SRCDIR/set-data.c $SRCDIR/get-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DIRECT-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DIRECT-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..fc5e3e91021 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DIRECT-in-DYNAMIC/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DIRECT, GET_DATA=DIRECT in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DIRECT -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c $SRCDIR/set-data.c $SRCDIR/get-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DIRECT-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DIRECT-in-SHARED/build.sh new file mode 100755 index 00000000000..3fd335c5f79 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DIRECT-in-SHARED/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DIRECT, GET_DATA=DIRECT in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DIRECT -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c $SRCDIR/set-data.c $SRCDIR/get-data.c -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DYNAMIC-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DYNAMIC-in-DIRECT/build.sh new file mode 100755 index 00000000000..ca3f5dfd0c8 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DYNAMIC-in-DIRECT/build.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DIRECT, GET_DATA=DYNAMIC in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DIRECT -DGET_DATA_PROXY_DIRECT -DGET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c $SRCDIR/get-data-proxy.c $SRCDIR/set-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DYNAMIC-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DYNAMIC-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..0b927490a7b --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DYNAMIC-in-DYNAMIC/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DIRECT, GET_DATA=DYNAMIC in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c $SRCDIR/set-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DYNAMIC-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DYNAMIC-in-SHARED/build.sh new file mode 100755 index 00000000000..7e85a655e3b --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-DYNAMIC-in-SHARED/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DIRECT, GET_DATA=DYNAMIC in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c $SRCDIR/set-data.c -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-SHARED-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-SHARED-in-DIRECT/build.sh new file mode 100755 index 00000000000..eae62765b6d --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-SHARED-in-DIRECT/build.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DIRECT, GET_DATA=SHARED in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_SHARED -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DIRECT -DGET_DATA_PROXY_DIRECT -DGET_DATA_SHARED $SRCDIR/set-data-proxy.c $SRCDIR/get-data-proxy.c $SRCDIR/set-data.c -L$PWD -lget-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-SHARED-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-SHARED-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..454dc99e9a7 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-SHARED-in-DYNAMIC/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DIRECT, GET_DATA=SHARED in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_SHARED -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c $SRCDIR/set-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-SHARED-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-SHARED-in-SHARED/build.sh new file mode 100755 index 00000000000..0ada0bc126a --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DIRECT-get-SHARED-in-SHARED/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DIRECT, GET_DATA=SHARED in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_SHARED -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c $SRCDIR/set-data.c -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DIRECT-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DIRECT-in-DIRECT/build.sh new file mode 100755 index 00000000000..59ed967b249 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DIRECT-in-DIRECT/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DYNAMIC, GET_DATA=DIRECT in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DIRECT -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c $SRCDIR/set-data.c $SRCDIR/get-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DIRECT-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DIRECT-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..62ccfce2f6f --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DIRECT-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DYNAMIC, GET_DATA=DIRECT in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DIRECT -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/set-data.c $SRCDIR/get-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DIRECT-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DIRECT-in-SHARED/build.sh new file mode 100755 index 00000000000..5526da4ff19 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DIRECT-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DYNAMIC, GET_DATA=DIRECT in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DIRECT -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/set-data.c $SRCDIR/get-data.c -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DYNAMIC-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DYNAMIC-in-DIRECT/build.sh new file mode 100755 index 00000000000..2b3db2aa7e8 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DYNAMIC-in-DIRECT/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DYNAMIC, GET_DATA=DYNAMIC in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c $SRCDIR/set-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DYNAMIC-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DYNAMIC-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..d143eb51a5c --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DYNAMIC-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DYNAMIC, GET_DATA=DYNAMIC in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/set-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DYNAMIC-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DYNAMIC-in-SHARED/build.sh new file mode 100755 index 00000000000..f2d48ede6e9 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-DYNAMIC-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DYNAMIC, GET_DATA=DYNAMIC in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/set-data.c -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-SHARED-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-SHARED-in-DIRECT/build.sh new file mode 100755 index 00000000000..ce121f896f4 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-SHARED-in-DIRECT/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DYNAMIC, GET_DATA=SHARED in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_SHARED -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c $SRCDIR/set-data.c -L$PWD -lget-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-SHARED-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-SHARED-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..b23a200a4a0 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-SHARED-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DYNAMIC, GET_DATA=SHARED in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_SHARED -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/set-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-SHARED-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-SHARED-in-SHARED/build.sh new file mode 100755 index 00000000000..47db224cddd --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-DYNAMIC-get-SHARED-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in DYNAMIC, GET_DATA=SHARED in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_SHARED -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/set-data.c -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DIRECT-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DIRECT-in-DIRECT/build.sh new file mode 100755 index 00000000000..3b630c48863 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DIRECT-in-DIRECT/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in SHARED, GET_DATA=DIRECT in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DIRECT -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c $SRCDIR/set-data.c $SRCDIR/get-data.c -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DIRECT-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DIRECT-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..0fba1d09026 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DIRECT-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in SHARED, GET_DATA=DIRECT in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DIRECT -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/set-data.c $SRCDIR/get-data.c -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DIRECT-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DIRECT-in-SHARED/build.sh new file mode 100755 index 00000000000..86da9529829 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DIRECT-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in SHARED, GET_DATA=DIRECT in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DIRECT -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/set-data.c $SRCDIR/get-data.c -L$PWD -lset-data-proxy -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DYNAMIC-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DYNAMIC-in-DIRECT/build.sh new file mode 100755 index 00000000000..18370cb40f5 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DYNAMIC-in-DIRECT/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in SHARED, GET_DATA=DYNAMIC in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c $SRCDIR/set-data.c -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DYNAMIC-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DYNAMIC-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..03820b2ee05 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DYNAMIC-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in SHARED, GET_DATA=DYNAMIC in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/set-data.c -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DYNAMIC-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DYNAMIC-in-SHARED/build.sh new file mode 100755 index 00000000000..ca395b0da29 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-DYNAMIC-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in SHARED, GET_DATA=DYNAMIC in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/set-data.c -L$PWD -lset-data-proxy -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-SHARED-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-SHARED-in-DIRECT/build.sh new file mode 100755 index 00000000000..9de07afab12 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-SHARED-in-DIRECT/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in SHARED, GET_DATA=SHARED in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_SHARED -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c $SRCDIR/set-data.c -L$PWD -lset-data-proxy -lget-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-SHARED-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-SHARED-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..cd48d780d06 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-SHARED-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in SHARED, GET_DATA=SHARED in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_SHARED -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/set-data.c -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-SHARED-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-SHARED-in-SHARED/build.sh new file mode 100755 index 00000000000..a8af68c21fe --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DIRECT-in-SHARED-get-SHARED-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DIRECT in SHARED, GET_DATA=SHARED in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DIRECT $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DIRECT -DGET_DATA_SHARED -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/set-data.c -L$PWD -lset-data-proxy -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DIRECT-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DIRECT-in-DIRECT/build.sh new file mode 100755 index 00000000000..068b34abeb8 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DIRECT-in-DIRECT/build.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DIRECT, GET_DATA=DIRECT in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DIRECT -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DYNAMIC -DGET_DATA_PROXY_DIRECT -DGET_DATA_DIRECT $SRCDIR/set-data-proxy.c $SRCDIR/get-data-proxy.c $SRCDIR/get-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DIRECT-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DIRECT-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..eb9b8aadc17 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DIRECT-in-DYNAMIC/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DIRECT, GET_DATA=DIRECT in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DIRECT -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c $SRCDIR/get-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DIRECT-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DIRECT-in-SHARED/build.sh new file mode 100755 index 00000000000..c44c73fff91 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DIRECT-in-SHARED/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DIRECT, GET_DATA=DIRECT in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DIRECT -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c $SRCDIR/get-data.c -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DYNAMIC-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DYNAMIC-in-DIRECT/build.sh new file mode 100755 index 00000000000..7715c745299 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DYNAMIC-in-DIRECT/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DIRECT, GET_DATA=DYNAMIC in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DYNAMIC -DGET_DATA_PROXY_DIRECT -DGET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c $SRCDIR/get-data-proxy.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DYNAMIC-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DYNAMIC-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..1433f35cc21 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DYNAMIC-in-DYNAMIC/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DIRECT, GET_DATA=DYNAMIC in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DYNAMIC-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DYNAMIC-in-SHARED/build.sh new file mode 100755 index 00000000000..1327d33b0f3 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-DYNAMIC-in-SHARED/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DIRECT, GET_DATA=DYNAMIC in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-SHARED-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-SHARED-in-DIRECT/build.sh new file mode 100755 index 00000000000..24eef171bf0 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-SHARED-in-DIRECT/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DIRECT, GET_DATA=SHARED in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_SHARED -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DYNAMIC -DGET_DATA_PROXY_DIRECT -DGET_DATA_SHARED $SRCDIR/set-data-proxy.c $SRCDIR/get-data-proxy.c -L$PWD -lget-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-SHARED-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-SHARED-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..63ec2ba5b8d --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-SHARED-in-DYNAMIC/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DIRECT, GET_DATA=SHARED in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_SHARED -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-SHARED-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-SHARED-in-SHARED/build.sh new file mode 100755 index 00000000000..643576822e3 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DIRECT-get-SHARED-in-SHARED/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DIRECT, GET_DATA=SHARED in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_SHARED -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DIRECT-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DIRECT-in-DIRECT/build.sh new file mode 100755 index 00000000000..a88d0eae7a0 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DIRECT-in-DIRECT/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DYNAMIC, GET_DATA=DIRECT in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DIRECT -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c $SRCDIR/get-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DIRECT-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DIRECT-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..d0eef8d0e56 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DIRECT-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DYNAMIC, GET_DATA=DIRECT in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DIRECT -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/get-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DIRECT-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DIRECT-in-SHARED/build.sh new file mode 100755 index 00000000000..1b0be1a778a --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DIRECT-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DYNAMIC, GET_DATA=DIRECT in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DIRECT -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/get-data.c -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DYNAMIC-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DYNAMIC-in-DIRECT/build.sh new file mode 100755 index 00000000000..36e5b91c2ed --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DYNAMIC-in-DIRECT/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DYNAMIC, GET_DATA=DYNAMIC in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DYNAMIC-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DYNAMIC-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..fc088b499d7 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DYNAMIC-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DYNAMIC, GET_DATA=DYNAMIC in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DYNAMIC-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DYNAMIC-in-SHARED/build.sh new file mode 100755 index 00000000000..34a5a28d3da --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-DYNAMIC-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DYNAMIC, GET_DATA=DYNAMIC in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-SHARED-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-SHARED-in-DIRECT/build.sh new file mode 100755 index 00000000000..538420a6122 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-SHARED-in-DIRECT/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DYNAMIC, GET_DATA=SHARED in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_SHARED -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -L$PWD -lget-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-SHARED-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-SHARED-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..339697b6564 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-SHARED-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DYNAMIC, GET_DATA=SHARED in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_SHARED -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-SHARED-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-SHARED-in-SHARED/build.sh new file mode 100755 index 00000000000..c2807b548cf --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-DYNAMIC-get-SHARED-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in DYNAMIC, GET_DATA=SHARED in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_SHARED -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DIRECT-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DIRECT-in-DIRECT/build.sh new file mode 100755 index 00000000000..324d6bfe047 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DIRECT-in-DIRECT/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in SHARED, GET_DATA=DIRECT in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DIRECT -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c $SRCDIR/get-data.c -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DIRECT-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DIRECT-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..1541d3e0419 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DIRECT-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in SHARED, GET_DATA=DIRECT in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DIRECT -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/get-data.c -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DIRECT-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DIRECT-in-SHARED/build.sh new file mode 100755 index 00000000000..ce2aa9ef98f --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DIRECT-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in SHARED, GET_DATA=DIRECT in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DIRECT -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/get-data.c -L$PWD -lset-data-proxy -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DYNAMIC-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DYNAMIC-in-DIRECT/build.sh new file mode 100755 index 00000000000..822ea482a03 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DYNAMIC-in-DIRECT/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in SHARED, GET_DATA=DYNAMIC in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DYNAMIC-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DYNAMIC-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..755c76301a3 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DYNAMIC-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in SHARED, GET_DATA=DYNAMIC in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DYNAMIC-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DYNAMIC-in-SHARED/build.sh new file mode 100755 index 00000000000..aa709bd0847 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-DYNAMIC-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in SHARED, GET_DATA=DYNAMIC in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -L$PWD -lset-data-proxy -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-SHARED-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-SHARED-in-DIRECT/build.sh new file mode 100755 index 00000000000..ce12bb87948 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-SHARED-in-DIRECT/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in SHARED, GET_DATA=SHARED in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_SHARED -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -L$PWD -lset-data-proxy -lget-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-SHARED-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-SHARED-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..84e16c2d2d3 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-SHARED-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in SHARED, GET_DATA=SHARED in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_SHARED -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-SHARED-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-SHARED-in-SHARED/build.sh new file mode 100755 index 00000000000..ef3bf6cd822 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-DYNAMIC-in-SHARED-get-SHARED-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=DYNAMIC in SHARED, GET_DATA=SHARED in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_DYNAMIC -DGET_DATA_SHARED -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -L$PWD -lset-data-proxy -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DIRECT-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DIRECT-in-DIRECT/build.sh new file mode 100755 index 00000000000..671c531c4ab --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DIRECT-in-DIRECT/build.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DIRECT, GET_DATA=DIRECT in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DIRECT -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_SHARED -DGET_DATA_PROXY_DIRECT -DGET_DATA_DIRECT $SRCDIR/set-data-proxy.c $SRCDIR/get-data-proxy.c $SRCDIR/get-data.c -L$PWD -lset-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DIRECT-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DIRECT-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..77c87517c65 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DIRECT-in-DYNAMIC/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DIRECT, GET_DATA=DIRECT in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DIRECT -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c $SRCDIR/get-data.c -L$PWD -lset-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DIRECT-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DIRECT-in-SHARED/build.sh new file mode 100755 index 00000000000..5fd5c7679fb --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DIRECT-in-SHARED/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DIRECT, GET_DATA=DIRECT in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DIRECT -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c $SRCDIR/get-data.c -L$PWD -lget-data-proxy -lset-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DYNAMIC-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DYNAMIC-in-DIRECT/build.sh new file mode 100755 index 00000000000..4a9797ba100 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DYNAMIC-in-DIRECT/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DIRECT, GET_DATA=DYNAMIC in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_SHARED -DGET_DATA_PROXY_DIRECT -DGET_DATA_DYNAMIC $SRCDIR/set-data-proxy.c $SRCDIR/get-data-proxy.c -L$PWD -lset-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DYNAMIC-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DYNAMIC-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..065acf59b43 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DYNAMIC-in-DYNAMIC/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DIRECT, GET_DATA=DYNAMIC in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -L$PWD -lset-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DYNAMIC-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DYNAMIC-in-SHARED/build.sh new file mode 100755 index 00000000000..ced8d68c10c --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-DYNAMIC-in-SHARED/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DIRECT, GET_DATA=DYNAMIC in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -L$PWD -lget-data-proxy -lset-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-SHARED-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-SHARED-in-DIRECT/build.sh new file mode 100755 index 00000000000..1b333d75f5c --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-SHARED-in-DIRECT/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DIRECT, GET_DATA=SHARED in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_SHARED -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_SHARED -DGET_DATA_PROXY_DIRECT -DGET_DATA_SHARED $SRCDIR/set-data-proxy.c $SRCDIR/get-data-proxy.c -L$PWD -lset-data -lget-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-SHARED-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-SHARED-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..6fed0235657 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-SHARED-in-DYNAMIC/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DIRECT, GET_DATA=SHARED in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_SHARED -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -L$PWD -lset-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-SHARED-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-SHARED-in-SHARED/build.sh new file mode 100755 index 00000000000..2743c3690ac --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DIRECT-get-SHARED-in-SHARED/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DIRECT, GET_DATA=SHARED in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_SHARED -DSET_DATA_PROXY_DIRECT -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR -DSET_DATA_PROXY_DIRECT -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -L$PWD -lget-data-proxy -lset-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DIRECT-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DIRECT-in-DIRECT/build.sh new file mode 100755 index 00000000000..449cd6b80ea --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DIRECT-in-DIRECT/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DYNAMIC, GET_DATA=DIRECT in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DIRECT -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c $SRCDIR/get-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DIRECT-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DIRECT-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..2d40f290e4f --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DIRECT-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DYNAMIC, GET_DATA=DIRECT in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DIRECT -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/get-data.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DIRECT-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DIRECT-in-SHARED/build.sh new file mode 100755 index 00000000000..825fc21e692 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DIRECT-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DYNAMIC, GET_DATA=DIRECT in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DIRECT -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/get-data.c -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DYNAMIC-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DYNAMIC-in-DIRECT/build.sh new file mode 100755 index 00000000000..247cf5c7fd1 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DYNAMIC-in-DIRECT/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DYNAMIC, GET_DATA=DYNAMIC in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DYNAMIC-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DYNAMIC-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..ab67bbb1770 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DYNAMIC-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DYNAMIC, GET_DATA=DYNAMIC in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DYNAMIC-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DYNAMIC-in-SHARED/build.sh new file mode 100755 index 00000000000..bc3389016a9 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-DYNAMIC-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DYNAMIC, GET_DATA=DYNAMIC in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-SHARED-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-SHARED-in-DIRECT/build.sh new file mode 100755 index 00000000000..afeb2642630 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-SHARED-in-DIRECT/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DYNAMIC, GET_DATA=SHARED in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_SHARED -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -L$PWD -lget-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-SHARED-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-SHARED-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..dcef9354cca --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-SHARED-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DYNAMIC, GET_DATA=SHARED in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_SHARED -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-SHARED-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-SHARED-in-SHARED/build.sh new file mode 100755 index 00000000000..7edeb7a0990 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-DYNAMIC-get-SHARED-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in DYNAMIC, GET_DATA=SHARED in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_SHARED -DSET_DATA_PROXY_DYNAMIC -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -L$PWD -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DIRECT-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DIRECT-in-DIRECT/build.sh new file mode 100755 index 00000000000..9ff55d6c953 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DIRECT-in-DIRECT/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in SHARED, GET_DATA=DIRECT in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DIRECT -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c $SRCDIR/get-data.c -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DIRECT-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DIRECT-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..f37989e22a8 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DIRECT-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in SHARED, GET_DATA=DIRECT in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DIRECT -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/get-data.c -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DIRECT-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DIRECT-in-SHARED/build.sh new file mode 100755 index 00000000000..39af1cf590a --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DIRECT-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in SHARED, GET_DATA=DIRECT in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DIRECT $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DIRECT -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -I$SRCDIR $SRCDIR/get-data.c -L$PWD -lset-data-proxy -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DYNAMIC-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DYNAMIC-in-DIRECT/build.sh new file mode 100755 index 00000000000..5c4c638791f --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DYNAMIC-in-DIRECT/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in SHARED, GET_DATA=DYNAMIC in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DYNAMIC-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DYNAMIC-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..6ed6f07a194 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DYNAMIC-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in SHARED, GET_DATA=DYNAMIC in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DYNAMIC-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DYNAMIC-in-SHARED/build.sh new file mode 100755 index 00000000000..f8b9f8daafb --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-DYNAMIC-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in SHARED, GET_DATA=DYNAMIC in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_DYNAMIC $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_DYNAMIC -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -L$PWD -lset-data-proxy -lget-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-SHARED-in-DIRECT/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-SHARED-in-DIRECT/build.sh new file mode 100755 index 00000000000..a84b1b873d3 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-SHARED-in-DIRECT/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in SHARED, GET_DATA=SHARED in DIRECT + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_SHARED -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DIRECT \ + -o main.o +$CC main.o -I$SRCDIR -DGET_DATA_PROXY_DIRECT -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -L$PWD -lset-data-proxy -lget-data -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-SHARED-in-DYNAMIC/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-SHARED-in-DYNAMIC/build.sh new file mode 100755 index 00000000000..a6007c2020d --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-SHARED-in-DYNAMIC/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in SHARED, GET_DATA=SHARED in DYNAMIC + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_SHARED -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_DYNAMIC \ + -o main.o +$CC main.o -L$PWD -lset-data-proxy -o main diff --git a/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-SHARED-in-SHARED/build.sh b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-SHARED-in-SHARED/build.sh new file mode 100755 index 00000000000..fcf830f44d1 --- /dev/null +++ b/lib/wasix/tests/threadlocal_tests/tsd-set-SHARED-in-SHARED-get-SHARED-in-SHARED/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -e +cd "$(dirname "$0")" +SRCDIR=../thread-getspecific-set-and-get + +# Build strategy: SET_DATA=SHARED in SHARED, GET_DATA=SHARED in SHARED + +$CC -I$SRCDIR -c -fPIC $SRCDIR/set-data.c -o set-data.o +$CC -shared set-data.o -o libset-data.so + +$CC -I$SRCDIR -c -fPIC -DSET_DATA_SHARED $SRCDIR/set-data-proxy.c -o set-data-proxy.o +$CC -shared set-data-proxy.o -L$PWD -lset-data -o libset-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/get-data.c -o get-data.o +$CC -shared get-data.o -o libget-data.so + +$CC -I$SRCDIR -c -fPIC -DGET_DATA_SHARED $SRCDIR/get-data-proxy.c -o get-data-proxy.o +$CC -shared get-data-proxy.o -L$PWD -lget-data -o libget-data-proxy.so + +$CC -I$SRCDIR -c -fPIC $SRCDIR/main.c \ + -DTHREAD_MAIN -DSET_DATA_SHARED -DGET_DATA_SHARED -DSET_DATA_PROXY_SHARED -DGET_DATA_PROXY_SHARED \ + -o main.o +$CC main.o -L$PWD -lset-data-proxy -lget-data-proxy -o main diff --git a/lib/wasix/tests/wasixcc_test_utils.rs b/lib/wasix/tests/wasixcc_test_utils.rs new file mode 100644 index 00000000000..cfcbdaa5049 --- /dev/null +++ b/lib/wasix/tests/wasixcc_test_utils.rs @@ -0,0 +1,600 @@ +use std::fmt::Debug; +use std::io::Write; +use std::path::{Path, PathBuf}; +use std::pin::Pin; +use std::process::Command; +use std::sync::{Arc, Mutex}; +use std::task::{Context, Poll}; +use wasmer::Module; +use wasmer_wasix::VirtualFile as VirtualFileTrait; +use wasmer_wasix::runners::MappedDirectory; +use wasmer_wasix::runners::wasi::{RuntimeOrEngine, WasiRunner}; +use wasmer_wasix::runtime::module_cache::{HashedModuleData, ModuleCache}; +use wasmer_wasix::virtual_fs::{AsyncRead, AsyncSeek, AsyncWrite}; + +/// A virtual file that captures all writes to an in-memory buffer +#[derive(Debug)] +struct CaptureFile { + buffer: Arc>>, + file: Option, +} + +impl CaptureFile { + fn new(buffer: Arc>>, file: Option) -> Self { + Self { buffer, file: file } + } +} + +impl VirtualFileTrait for CaptureFile { + fn last_accessed(&self) -> u64 { + 0 + } + + fn last_modified(&self) -> u64 { + 0 + } + + fn created_time(&self) -> u64 { + 0 + } + + fn size(&self) -> u64 { + self.buffer.lock().unwrap().len() as u64 + } + + fn set_len(&mut self, _new_size: u64) -> Result<(), wasmer_wasix::FsError> { + Err(wasmer_wasix::FsError::PermissionDenied) + } + + fn unlink(&mut self) -> Result<(), wasmer_wasix::FsError> { + Ok(()) + } + + fn is_open(&self) -> bool { + true + } + + fn get_special_fd(&self) -> Option { + None + } + + fn poll_read_ready( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(0)) + } + + fn poll_write_ready( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(8192)) + } +} + +impl AsyncRead for CaptureFile { + fn poll_read( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &mut tokio::io::ReadBuf<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } +} + +impl AsyncWrite for CaptureFile { + fn poll_write( + mut self: Pin<&mut Self>, + _cx: &mut Context<'_>, + buf: &[u8], + ) -> Poll> { + Poll::Ready(self.write(buf)) + } + + fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } +} + +impl AsyncSeek for CaptureFile { + fn start_seek(self: Pin<&mut Self>, _position: std::io::SeekFrom) -> std::io::Result<()> { + Ok(()) + } + + fn poll_complete(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(0)) + } +} + +impl std::io::Read for CaptureFile { + fn read(&mut self, _buf: &mut [u8]) -> std::io::Result { + Ok(0) + } +} + +impl std::io::Write for CaptureFile { + fn write(&mut self, buf: &[u8]) -> std::io::Result { + if let Some(output) = &mut self.file { + output.write(buf)?; + output.flush()?; + } + let mut buffer = self.buffer.lock().unwrap(); + buffer.extend_from_slice(buf); + Ok(buf.len()) + } + + fn flush(&mut self) -> std::io::Result<()> { + Ok(()) + } +} + +impl std::io::Seek for CaptureFile { + fn seek(&mut self, _pos: std::io::SeekFrom) -> std::io::Result { + Ok(0) + } +} + +/// A utility struct for testing wasixcc-compiled programs. +/// +/// The main reason for having this utility is to simplify the process of compiling +/// C/C++ source files to WASM using wasixcc and running them in a WASI environment. +/// +/// It provides methods to compile source files with specific flags and run the resulting +/// WASM modules, handling the necessary setup and teardown. +/// +/// The main reason why this is a struct is to have some state for the input and output directories. +pub struct WasixccTest { + input_dir: PathBuf, + output_dir: PathBuf, + test_name: String, + default_source: PathBuf, + default_executable: PathBuf, +} + +impl WasixccTest { + /// Create a new WasixccTest instance for a given test file and test name. + /// + /// ### Example + /// ```no_run + /// let test = WasixccTest::new(file!(), "simple_test"); + /// test.compile().unwrap(); + /// test.run().unwrap(); + /// ``` + pub fn new(test_file: &str, test_name: &str) -> Self { + let input_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join(PathBuf::from( + test_file + .split('/') + .next_back() + .expect("The test file name can not be empty") + .trim_end_matches(".rs"), + )); + assert!(input_dir.exists()); + let test_name = test_name.split('.').next().unwrap(); + let output_dir = input_dir.join(format!("{test_name}.out")); + std::fs::create_dir_all(&output_dir).unwrap(); + Self { + default_source: input_dir.join(format!("{test_name}.c")), + default_executable: output_dir.join(test_name), + input_dir, + output_dir, + test_name: test_name.to_string(), + } + } + + /// Lowlevel function to invoke wasixcc with custom arguments and environment variables. + fn wasixcc( + &self, + sources: &[&str], + output_file: &Path, + extra_args: &[&str], + extra_env: &[(&str, &str)], + cpp: bool, + ) -> Result<(), anyhow::Error> { + // Derive the test directory from the test file path + let tool = if cpp { "wasix++" } else { "wasixcc" }; + + // Check if the tool is available in PATH + if Command::new(tool).arg("--version").output().is_err() { + anyhow::bail!( + "{} not found in PATH. Please install it before running these tests.", + tool + ); + } + + // Compile with wasixcc + let mut command = Command::new(tool); + for source in sources { + let source_path = self.input_dir.join(source); + command.arg(source_path); + } + command + .arg("-o") + .arg(&output_file) + .current_dir(&self.input_dir); + + // Add any extra arguments + for arg in extra_args { + command.arg(arg); + } + for (key, value) in extra_env { + command.env(key, value); + } + + eprintln!("Running wasixcc: {:?}", command); + let output = command + .output() + .expect(format!("Failed to run {tool}").as_str()); + + if !output.status.success() { + eprintln!( + "wasixcc stdout: {}", + String::from_utf8_lossy(&output.stdout) + ); + eprintln!( + "wasixcc stderr: {}", + String::from_utf8_lossy(&output.stderr) + ); + anyhow::bail!("wasixcc compilation failed"); + } + + assert!( + output_file.exists(), + "Expected output file does not exist after compilation" + ); + + Ok(()) + } + + /// Compiles the default C source file with wasixcc and wasm-exceptions enabled and returns the path to the WASM file. + /// + /// If you need more control about the file use `compile_executable()` instead. + pub fn compile(&self) -> Result { + self.compile_executable(&self.default_source, &[]) + } + + /// Compiles a C file with wasixcc and wasm-exceptions enabled and returns the path to the WASM file. + /// + /// If you need more control about the compiler flags use `wasixcc()` instead. + #[allow(dead_code)] + pub fn compile_executable( + &self, + source_file: &Path, + extra_flags: &[&str], + ) -> Result { + let main_c = self.input_dir.join(source_file); + + let cpp = source_file + .extension() + .map_or(false, |ext| ext == "cpp" || ext == "cc"); + + let link_dir_flag = format!("-L{}", self.output_dir.display()); + let mut base_flags = vec![ + "-fwasm-exceptions", + "-Wl,--pie", + "-fPIC", + link_dir_flag.as_str(), + ]; + base_flags.extend_from_slice(extra_flags); + + self.wasixcc( + &[main_c.to_str().unwrap()], + &self.default_executable, + &base_flags, + &[], + cpp, + )?; + + Ok(self.default_executable.clone()) + } + + /// Compile a shared library (.so) from source files + /// + /// ### Example + /// ```no_run + /// let test = WasixccTest::new(file!(), "my_test"); + /// test.compile_shared_library(&["side.c"], "libside.so").unwrap(); + /// ``` + pub fn compile_shared_library( + &self, + sources: &[&str], + lib_name: &str, + extra_flags: &[&str], + ) -> Result { + let cpp = sources + .iter() + .find(|source| { + PathBuf::from(source) + .extension() + .map_or(false, |ext| ext == "cpp" || ext == "cc") + }) + .is_some(); + + let link_dir_flag = format!("-L{}", self.output_dir.display()); + let mut base_flags = vec![ + "-fwasm-exceptions", + "-shared", + "-fPIC", + link_dir_flag.as_str(), + ]; + base_flags.extend_from_slice(extra_flags); + + self.wasixcc(sources, &self.default_executable, &base_flags, &[], cpp)?; + + Ok(self.default_executable.clone()) + } + + /// Run a compiled WASM module using wasix. Returns ok if it exits with code 0. + pub fn run_executable(&self, executable_path: &PathBuf) -> Result<(), anyhow::Error> { + // The directory containing the WASM module + let wasm_path = self.output_dir.join(executable_path.file_name().unwrap()); + + // Load the compiled WASM module + let wasm_bytes = std::fs::read(&wasm_path).expect("Failed to read compiled WASM file"); + let module_data = HashedModuleData::new(wasm_bytes); + let (hash, wasm_bytes) = module_data.into_parts(); + let engine = wasmer::Engine::default(); + let module = Module::new(&engine, &wasm_bytes).expect("Failed to create module"); + + // Create buffers to capture stdout and stderr + // + // For now these are not used, but they can be useful for debugging test failures. + let stdout_buffer = Arc::new(Mutex::new(Vec::new())); + let stderr_buffer = Arc::new(Mutex::new(Vec::new())); + + let stdout_capture = Box::new(CaptureFile::new( + stdout_buffer.clone(), + Some(std::io::stdout()), + )); + let stderr_capture = Box::new(CaptureFile::new( + stderr_buffer.clone(), + Some(std::io::stderr()), + )); + + let rt = tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .expect("Failed to create tokio runtime for running wasix programs"); + + rt.block_on(async { + tokio::task::block_in_place(move || { + // Run the WASM module using WasiRunner + let mut runner = WasiRunner::new(); + runner + .with_mapped_directories([MappedDirectory { + guest: self.output_dir.to_string_lossy().to_string(), + host: self.output_dir.clone(), + }]) + .with_mapped_directories([MappedDirectory { + guest: "/lib".to_string(), + host: self.output_dir.clone(), + }]) + .with_current_dir(self.output_dir.to_string_lossy().to_string()) + .with_stdout(stdout_capture) + .with_stderr(stderr_capture); + runner.run_wasm( + RuntimeOrEngine::Engine(engine), + &executable_path.to_string_lossy().to_string(), + module, + hash, + ) + }) + }) + } + + /// Run the default compiled WASM module using wasix. Returns ok if it exits with code 0. + /// + /// If you need more control about the executable path use `run_executable()` instead. + pub fn run(&self) -> Result<(), anyhow::Error> { + self.run_executable(&self.output_dir.join(&self.test_name)) + } +} + +/// Get the wasix-tests directory path +pub fn get_wasix_tests_dir() -> PathBuf { + PathBuf::from(std::env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join("wasix-tests") +} + +/// Run a build.sh script in the context_switching directory +pub fn run_build_script(file: &str, test_dir: &str) -> Result { + let input_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join(PathBuf::from( + file.split('/') + .next_back() + .expect("The test file name cannot be empty") + .trim_end_matches(".rs"), + )); + + let cc = "wasixcc"; + let cxx = "wasix++"; + let test_path = input_dir.join(test_dir); + let build_script = test_path.join("build.sh"); + + let output = Command::new("bash") + .arg(&build_script) + .current_dir(&test_path) + .env("CC", cc) + .env("CXX", cxx) + .env("WASIXCC_SYSROOT", "/home/lennart/.wasix-clang/wasix-sysroot") + .env("WASIXCC_COMPILER_FLAGS", "-fPIC:-fwasm-exceptions:-Wl,-L/home/lennart/.wasix-clang/wasix-sysroot/usr/local/lib/wasm32-wasi:-I/home/lennart/.wasix-clang/wasix-sysroot/usr/local/include:-Wl,-mllvm,--wasm-enable-eh:-Wl,-mllvm,--wasm-enable-sjlj:-Wl,-mllvm,--wasm-use-legacy-eh=false:-Wl,-mllvm,--exception-model=wasm:-iwithsysroot:/usr/local/include/c++/v1") + .output()?; + + if !output.status.success() { + eprintln!("Build stdout: {}", String::from_utf8_lossy(&output.stdout)); + eprintln!("Build stderr: {}", String::from_utf8_lossy(&output.stderr)); + anyhow::bail!("Build script failed"); + } + + Ok(test_path.join("main")) +} + +/// Result from running a WASM program, including captured output and exit status +pub struct WasmRunResult { + #[allow(dead_code)] + pub stdout: Vec, + #[allow(dead_code)] + pub stderr: Vec, + #[allow(dead_code)] + pub exit_code: Option, +} + +/// Run a compiled WASM file using WasiRunner and return output buffers and exit status +/// +/// This function uses the same caching mechanism as the Wasmer CLI: +/// - In-memory cache (SharedCache) for fast repeated loads within the same process +/// - Filesystem cache as a fallback for persistence across test runs +/// - Cache directory follows the same precedence as the CLI: +/// 1. WASMER_CACHE_DIR environment variable +/// 2. WASMER_DIR/cache/compiled +/// 3. ~/.wasmer/cache/compiled +/// 4. temp_dir/wasmer/cache/compiled (fallback) +/// +/// The caching significantly improves test performance by avoiding recompilation +/// of the same WASM modules across multiple test runs. +pub fn run_wasm_with_result( + wasm_path: &PathBuf, + dir: &Path, +) -> Result { + // Load the compiled WASM module + let wasm_bytes = std::fs::read(&wasm_path)?; + let module_data = HashedModuleData::new(wasm_bytes); + let hash = *module_data.hash(); + let engine = wasmer::Engine::default(); + + // Use the same caching mechanism as the CLI + let rt = tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .expect("Failed to create tokio runtime for module caching"); + + let module = rt.block_on(async { + // Set up module cache with in-memory + filesystem fallback (same as CLI) + let cache_dir = if let Ok(dir_str) = std::env::var("WASMER_CACHE_DIR") { + PathBuf::from(dir_str).join("compiled") + } else if let Ok(dir_str) = std::env::var("WASMER_DIR") { + PathBuf::from(dir_str).join("cache").join("compiled") + } else if let Ok(home) = std::env::var("HOME") { + PathBuf::from(home) + .join(".wasmer") + .join("cache") + .join("compiled") + } else { + // Fallback to temp directory if no home is available + std::env::temp_dir() + .join("wasmer") + .join("cache") + .join("compiled") + }; + + std::fs::create_dir_all(&cache_dir).ok(); + + let rt_handle = wasmer_wasix::runtime::task_manager::tokio::RuntimeOrHandle::Handle( + tokio::runtime::Handle::current(), + ); + let tokio_task_manager = + Arc::new(wasmer_wasix::runtime::task_manager::tokio::TokioTaskManager::new(rt_handle)); + let module_cache = wasmer_wasix::runtime::module_cache::SharedCache::default() + .with_fallback(wasmer_wasix::runtime::module_cache::FileSystemCache::new( + cache_dir, + tokio_task_manager, + )); + + wasmer_wasix::runtime::load_module(&engine, &module_cache, &module_data) + .await + .map_err(|e| anyhow::anyhow!("Failed to load module: {}", e)) + })?; + + // Create buffers to capture stdout and stderr + let stdout_buffer = Arc::new(Mutex::new(Vec::new())); + let stderr_buffer = Arc::new(Mutex::new(Vec::new())); + + let stdout_capture = Box::new(CaptureFile::new( + stdout_buffer.clone(), + Some(std::io::stdout()), + )); + let stderr_capture = Box::new(CaptureFile::new( + stderr_buffer.clone(), + Some(std::io::stderr()), + )); + + let rt = tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .expect("Failed to create tokio runtime for running wasix programs"); + + let result = rt.block_on(async { + tokio::task::block_in_place(move || { + // Run the WASM module using WasiRunner + let mut runner = WasiRunner::new(); + runner + .with_mapped_directories([MappedDirectory { + guest: dir.to_string_lossy().to_string(), + host: dir.to_path_buf(), + }]) + .with_mapped_directories([MappedDirectory { + guest: "/lib".to_string(), + host: dir.to_path_buf(), + }]) + .with_current_dir(dir.to_string_lossy().to_string()) + .with_stdout(stdout_capture) + .with_stderr(stderr_capture); + runner.run_wasm( + RuntimeOrEngine::Engine(engine), + &wasm_path.to_string_lossy().to_string(), + module, + hash, + ) + }) + }); + + // Extract the captured output + let stdout = stdout_buffer.lock().unwrap().clone(); + let stderr = stderr_buffer.lock().unwrap().clone(); + + // Extract exit code from result + let exit_code = match &result { + Ok(_) => Some(0), + Err(e) => { + // Try to extract exit code from error message + let error_msg = e.to_string(); + if let Some(code_str) = error_msg.split("ExitCode::").nth(1) { + if let Some(code) = code_str.split_whitespace().next() { + code.parse::().ok() + } else { + None + } + } else { + None + } + } + }; + + Ok(WasmRunResult { + stdout, + stderr, + exit_code, + }) +} + +/// Run a compiled WASM file using WasiRunner +pub fn run_wasm(wasm_path: &PathBuf, dir: &Path) -> Result<(), anyhow::Error> { + let result = run_wasm_with_result(wasm_path, dir)?; + + // If exit code is non-zero, return an error + if let Some(code) = result.exit_code { + if code != 0 { + anyhow::bail!("WASI exited with code: {}", code); + } + } + + Ok(()) +}