https://github.com/ArcaneNibble created https://github.com/llvm/llvm-project/pull/129164
If the user specifies a target triple of wasm32-wasi-threads, then enable all of the same flags as if `-pthread` were passed. This helps prevent user error, as the whole point of selecting this target is to gain pthread support. The reverse does not happen (passing `-pthread` does not alter the target triple) so as to not interfere with custom environments and/or custom multilib setups. >From b5988ff4fa2e5115e325020655fd570fd68eedd2 Mon Sep 17 00:00:00 2001 From: R <r...@berkeley.edu> Date: Fri, 28 Feb 2025 00:45:16 +0000 Subject: [PATCH] [WebAssembly] Make WASI -threads environment behave as -pthread If the user specifies a target triple of wasm32-wasi-threads, then enable all of the same flags as if -pthread were passed. This helps prevent user error, as the whole point of selecting this target is to gain pthread support. The reverse does not happen (passing -pthread does not alter the target triple) so as to not interfere with custom environments and/or custom multilib setups. --- clang/lib/Driver/ToolChains/WebAssembly.cpp | 20 ++++++++++++++++---- clang/test/Driver/wasm-toolchain.c | 6 ++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp b/clang/lib/Driver/ToolChains/WebAssembly.cpp index 93f17a03c580f..78cf8a1f6b343 100644 --- a/clang/lib/Driver/ToolChains/WebAssembly.cpp +++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp @@ -69,6 +69,19 @@ static bool TargetBuildsComponents(const llvm::Triple &TargetTriple) { TargetTriple.getOSName() != "wasi"; } +static bool WantsPthread(const llvm::Triple &Triple, const ArgList &Args) { + bool WantsPthread = Args.hasFlag(options::OPT_pthread, + options::OPT_no_pthread, + false); + + // If the WASI environment is "threads" then enable pthreads support + // without requiring -pthread, in order to prevent user error + if (Triple.isOSWASI() && Triple.getEnvironmentName() == "threads") + WantsPthread = true; + + return WantsPthread; +} + void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, @@ -150,14 +163,14 @@ void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA, AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA); - if (Args.hasArg(options::OPT_pthread)) + if (WantsPthread(ToolChain.getTriple(), Args)) CmdArgs.push_back("--shared-memory"); if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { if (ToolChain.ShouldLinkCXXStdlib(Args)) ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); - if (Args.hasArg(options::OPT_pthread)) + if (WantsPthread(ToolChain.getTriple(), Args)) CmdArgs.push_back("-lpthread"); CmdArgs.push_back("-lc"); @@ -292,8 +305,7 @@ void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs, CC1Args.push_back("-fno-use-init-array"); // '-pthread' implies atomics, bulk-memory, mutable-globals, and sign-ext - if (DriverArgs.hasFlag(options::OPT_pthread, options::OPT_no_pthread, - false)) { + if (WantsPthread(getTriple(), DriverArgs)) { if (DriverArgs.hasFlag(options::OPT_mno_atomics, options::OPT_matomics, false)) getDriver().Diag(diag::err_drv_argument_not_allowed_with) diff --git a/clang/test/Driver/wasm-toolchain.c b/clang/test/Driver/wasm-toolchain.c index 1ad219338ac28..91803fe6bc1f2 100644 --- a/clang/test/Driver/wasm-toolchain.c +++ b/clang/test/Driver/wasm-toolchain.c @@ -110,6 +110,12 @@ // RUN: | FileCheck -check-prefix=PTHREAD_NO_SIGN_EXT %s // PTHREAD_NO_SIGN_EXT: invalid argument '-pthread' not allowed with '-mno-sign-ext' +// 'wasm32-wasi-threads' does the same thing as '-pthread' +// RUN: %clang -### --target=wasm32-wasi-threads --sysroot=/foo %s 2>&1 \ +// RUN: | FileCheck -check-prefix=WASI_THREADS %s +// WASI_THREADS: "-cc1" {{.*}} "-target-feature" "+atomics" "-target-feature" "+bulk-memory" "-target-feature" "+mutable-globals" "-target-feature" "+sign-ext" +// WASI_THREADS: wasm-ld{{.*}}" "--shared-memory" "-lpthread" + // '-mllvm -emscripten-cxx-exceptions-allowed=foo,bar' sets // '-mllvm --force-attribute=foo:noinline -mllvm --force-attribute=bar:noinline' // RUN: %clang -### --target=wasm32-unknown-unknown \ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits