[clang] [WebAssembly] Make WASI -threads environment behave as -pthread (PR #129164)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 27 16:51:46 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: R (ArcaneNibble)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/129164.diff
2 Files Affected:
- (modified) clang/lib/Driver/ToolChains/WebAssembly.cpp (+16-4)
- (modified) clang/test/Driver/wasm-toolchain.c (+6)
``````````diff
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 \
``````````
</details>
https://github.com/llvm/llvm-project/pull/129164
More information about the cfe-commits
mailing list