From f624850be41459e1d9033d8d9a73620f2a9b0cfc Mon Sep 17 00:00:00 2001 From: Jayden Qi Date: Sat, 22 Feb 2025 13:03:50 -0800 Subject: [PATCH 1/9] fix(bootstrap): hard error with GCC on bare WASM builds with c --- src/bootstrap/src/core/sanity.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/bootstrap/src/core/sanity.rs b/src/bootstrap/src/core/sanity.rs index 241b7386d18c5..d85a1b8fc6fc5 100644 --- a/src/bootstrap/src/core/sanity.rs +++ b/src/bootstrap/src/core/sanity.rs @@ -314,6 +314,17 @@ than building it. .entry(*target) .or_insert_with(|| Target::from_triple(&target.triple)); + // compiler-rt c fallbacks for wasm cannot be built with gcc + if (target.triple == "wasm32-unknown-unknown" || target.triple == "wasm32v1-none") // bare metal targets without wasi sdk + && (build.config.optimized_compiler_builtins(*target) + || build.config.rust_std_features.contains("compiler-builtins-c")) + { + let is_gcc = is_gcc_compiler(build.cc(*target), build); + if is_gcc { + panic!("GCC does not support building c code for bare wasm"); + } + } + if (target.contains("-none-") || target.contains("nvptx")) && build.no_std(*target) == Some(false) { @@ -376,3 +387,8 @@ $ pacman -R cmake && pacman -S mingw-w64-x86_64-cmake cmd_finder.must_have(s); } } + +fn is_gcc_compiler(path: PathBuf, build: &Build) -> bool { + let cc_output = command(&path).arg("--version").run_capture_stdout(build).stdout(); + cc_output.contains("GCC") +} From c49c586297adb821c6931f5156784d4b65637288 Mon Sep 17 00:00:00 2001 From: Jayden Qi Date: Sat, 22 Feb 2025 14:20:28 -0800 Subject: [PATCH 2/9] fix(ci): build non-wasip wasm targets with clang --- src/ci/docker/host-x86_64/dist-various-2/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ci/docker/host-x86_64/dist-various-2/Dockerfile b/src/ci/docker/host-x86_64/dist-various-2/Dockerfile index 03ec77f507e75..2d77b677f7124 100644 --- a/src/ci/docker/host-x86_64/dist-various-2/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-various-2/Dockerfile @@ -65,6 +65,10 @@ ENV \ CXX_i686_unknown_uefi=clang++-11 \ CC_x86_64_unknown_uefi=clang-11 \ CXX_x86_64_unknown_uefi=clang++-11 \ + CC_wasm32_unknown_unknown=clang-11 \ + CXX_wasm32_unknown_unknown=clang++-11 \ + CC_wasm32v1_none=clang-11 \ + CXX_wasm32v1_none=clang++-11 \ CC=gcc-9 \ CXX=g++-9 From 3f2acf2d6227b18a66707127138dcbde5b9cbede Mon Sep 17 00:00:00 2001 From: Jayden Qi Date: Sat, 22 Feb 2025 18:54:27 -0800 Subject: [PATCH 3/9] feat(tests): add test for linker errors caused by x86 obj files in wasm compiler_builtins --- tests/run-make/wasm-builtins-no-linker-warning/foo.rs | 3 +++ tests/run-make/wasm-builtins-no-linker-warning/rmake.rs | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 tests/run-make/wasm-builtins-no-linker-warning/foo.rs create mode 100644 tests/run-make/wasm-builtins-no-linker-warning/rmake.rs diff --git a/tests/run-make/wasm-builtins-no-linker-warning/foo.rs b/tests/run-make/wasm-builtins-no-linker-warning/foo.rs new file mode 100644 index 0000000000000..02a0abab180ec --- /dev/null +++ b/tests/run-make/wasm-builtins-no-linker-warning/foo.rs @@ -0,0 +1,3 @@ +fn main() { + () +} \ No newline at end of file diff --git a/tests/run-make/wasm-builtins-no-linker-warning/rmake.rs b/tests/run-make/wasm-builtins-no-linker-warning/rmake.rs new file mode 100644 index 0000000000000..69f1fdf35c4a9 --- /dev/null +++ b/tests/run-make/wasm-builtins-no-linker-warning/rmake.rs @@ -0,0 +1,7 @@ +//@ only-wasm32-bare + +use run_make_support::rustc; + +fn main() { + rustc().input("foo.rs").target("wasm32-unknown-unknown").arg("-D").arg("linker-messages").run(); +} From afe85f0dbe6b62abffbfcfdabeb84852358a8d74 Mon Sep 17 00:00:00 2001 From: Jayden Qi Date: Sat, 22 Feb 2025 20:33:44 -0800 Subject: [PATCH 4/9] feat(ci): update test-various for wasm32-unknown-unknown --- src/ci/docker/host-x86_64/test-various/Dockerfile | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/ci/docker/host-x86_64/test-various/Dockerfile b/src/ci/docker/host-x86_64/test-various/Dockerfile index 8d2e45ae497ef..b9ed18847d3d4 100644 --- a/src/ci/docker/host-x86_64/test-various/Dockerfile +++ b/src/ci/docker/host-x86_64/test-various/Dockerfile @@ -4,6 +4,7 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y --no-install-recommends \ clang-11 \ llvm-11 \ + gcc-multilib \ g++ \ make \ ninja-build \ @@ -59,8 +60,8 @@ RUN curl -L https://github.com/bytecodealliance/wasmtime/releases/download/v19.0 tar -xJ ENV PATH "$PATH:/wasmtime-v19.0.0-x86_64-linux" -ENV WASM_TARGETS=wasm32-wasip1 -ENV WASM_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $WASM_TARGETS \ +ENV WASM_WASIP_TARGET=wasm32-wasip1 +ENV WASM_WASIP_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $WASM_WASIP_TARGET \ tests/run-make \ tests/ui \ tests/mir-opt \ @@ -69,6 +70,12 @@ ENV WASM_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $WASM_T tests/assembly \ library/core +ENV WASM_BARE_TARGET=wasm32-unknown-unknown \ + CC_wasm32_unknown_unknown=clang-11 \ + CXX_wasm32_unknown_unknown=clang++-11 +ENV WASM_BARE_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $WASM_BARE_TARGET \ + tests/run-make/wasm-builtins-no-linker-warning + ENV NVPTX_TARGETS=nvptx64-nvidia-cuda ENV NVPTX_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $NVPTX_TARGETS \ tests/run-make \ @@ -90,4 +97,4 @@ ENV UEFI_TARGETS=aarch64-unknown-uefi,i686-unknown-uefi,x86_64-unknown-uefi \ ENV UEFI_SCRIPT python3 /checkout/x.py --stage 2 build --host='' --target $UEFI_TARGETS && \ python3 -u /uefi_qemu_test/run.py -ENV SCRIPT $WASM_SCRIPT && $NVPTX_SCRIPT && $MUSL_SCRIPT && $UEFI_SCRIPT +ENV SCRIPT $WASM_BARE_SCRIPT && $WASM_WASIP_SCRIPT && $NVPTX_SCRIPT && $MUSL_SCRIPT && $UEFI_SCRIPT From 2d2c1350382ce611074c03a7aac1e7502e65f7c6 Mon Sep 17 00:00:00 2001 From: Jayden Qi Date: Sat, 22 Feb 2025 20:35:59 -0800 Subject: [PATCH 5/9] chore: format latest test case --- tests/run-make/wasm-builtins-no-linker-warning/foo.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/run-make/wasm-builtins-no-linker-warning/foo.rs b/tests/run-make/wasm-builtins-no-linker-warning/foo.rs index 02a0abab180ec..db91fc694fc67 100644 --- a/tests/run-make/wasm-builtins-no-linker-warning/foo.rs +++ b/tests/run-make/wasm-builtins-no-linker-warning/foo.rs @@ -1,3 +1,3 @@ fn main() { () -} \ No newline at end of file +} From 63edce19a0d171fe1aec7fa6343aa4ff08fa75b9 Mon Sep 17 00:00:00 2001 From: Jayden Qi Date: Mon, 24 Feb 2025 16:02:02 -0800 Subject: [PATCH 6/9] feat(tests): migrate wasm-bare linker run-make to ui test --- tests/ui/wasm/wasm-builtins-no-linker-warning.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 tests/ui/wasm/wasm-builtins-no-linker-warning.rs diff --git a/tests/ui/wasm/wasm-builtins-no-linker-warning.rs b/tests/ui/wasm/wasm-builtins-no-linker-warning.rs new file mode 100644 index 0000000000000..dd754ad4a51b8 --- /dev/null +++ b/tests/ui/wasm/wasm-builtins-no-linker-warning.rs @@ -0,0 +1,10 @@ +//@ only-wasm32-bare +//@ compile-flags: -Dlinker-messages +//@ build-pass +/// This test checks that linker messages due to gcc lacking +/// support for wasm32 messages are not emitted when the target +/// is wasm32-unknown-unknown or wasm32v1-none + +fn main() { + () +} From 60831883ebb7978908f0fd6fa1e0fa65681fbcd3 Mon Sep 17 00:00:00 2001 From: Jayden Qi Date: Mon, 24 Feb 2025 16:03:46 -0800 Subject: [PATCH 7/9] feat(ci): update test-various to include migrated wasm linker test --- src/ci/docker/host-x86_64/test-various/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ci/docker/host-x86_64/test-various/Dockerfile b/src/ci/docker/host-x86_64/test-various/Dockerfile index b9ed18847d3d4..23946e121fbe8 100644 --- a/src/ci/docker/host-x86_64/test-various/Dockerfile +++ b/src/ci/docker/host-x86_64/test-various/Dockerfile @@ -74,7 +74,7 @@ ENV WASM_BARE_TARGET=wasm32-unknown-unknown \ CC_wasm32_unknown_unknown=clang-11 \ CXX_wasm32_unknown_unknown=clang++-11 ENV WASM_BARE_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $WASM_BARE_TARGET \ - tests/run-make/wasm-builtins-no-linker-warning + tests/ui/wasm/wasm-builtins-no-linker-warning.rs ENV NVPTX_TARGETS=nvptx64-nvidia-cuda ENV NVPTX_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $NVPTX_TARGETS \ From 4c129c0d939aeea31fde8c3fd6065af1657f545a Mon Sep 17 00:00:00 2001 From: Jayden Qi Date: Sun, 2 Mar 2025 16:23:15 -0800 Subject: [PATCH 8/9] fix(bootstrap): change compiler detection for all wasm targets --- src/bootstrap/src/core/sanity.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bootstrap/src/core/sanity.rs b/src/bootstrap/src/core/sanity.rs index d85a1b8fc6fc5..98f28bb9caec7 100644 --- a/src/bootstrap/src/core/sanity.rs +++ b/src/bootstrap/src/core/sanity.rs @@ -315,7 +315,7 @@ than building it. .or_insert_with(|| Target::from_triple(&target.triple)); // compiler-rt c fallbacks for wasm cannot be built with gcc - if (target.triple == "wasm32-unknown-unknown" || target.triple == "wasm32v1-none") // bare metal targets without wasi sdk + if target.contains("wasm") // bare metal targets without wasi sdk && (build.config.optimized_compiler_builtins(*target) || build.config.rust_std_features.contains("compiler-builtins-c")) { From 63db26f1a76bb3c1de04ff6fbc963267effd426c Mon Sep 17 00:00:00 2001 From: Jayden Qi Date: Sun, 2 Mar 2025 16:44:10 -0800 Subject: [PATCH 9/9] fix(bootstrap): change compiler detection to clang --- src/bootstrap/src/core/sanity.rs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/bootstrap/src/core/sanity.rs b/src/bootstrap/src/core/sanity.rs index 98f28bb9caec7..a91996c8a54c9 100644 --- a/src/bootstrap/src/core/sanity.rs +++ b/src/bootstrap/src/core/sanity.rs @@ -319,9 +319,9 @@ than building it. && (build.config.optimized_compiler_builtins(*target) || build.config.rust_std_features.contains("compiler-builtins-c")) { - let is_gcc = is_gcc_compiler(build.cc(*target), build); - if is_gcc { - panic!("GCC does not support building c code for bare wasm"); + let is_clang = is_clang_compiler(build.cc(*target), build); + if !is_clang { + panic!("only clang supports building c code for wasm targets"); } } @@ -388,7 +388,15 @@ $ pacman -R cmake && pacman -S mingw-w64-x86_64-cmake } } -fn is_gcc_compiler(path: PathBuf, build: &Build) -> bool { - let cc_output = command(&path).arg("--version").run_capture_stdout(build).stdout(); - cc_output.contains("GCC") +/// checks if the compiler at `path` is clang by looking at defined macros +fn is_clang_compiler(path: PathBuf, build: &Build) -> bool { + let cc_output = command(&path) + .arg("-E") // preprocess only + .arg("-dM") // dump defines + .arg("-x") + .arg("c") + .arg("/dev/null") + .run_capture_stdout(build) + .stdout(); + cc_output.contains("#define __clang__ 1") }