[clang] [WebAssembly] Make WASI -threads environment behave as -pthread (PR #129164)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 27 16:56:37 PST 2025
https://github.com/ArcaneNibble updated https://github.com/llvm/llvm-project/pull/129164
>From ddef6376dfde8b6a682abe31bd13a912706c757d Mon Sep 17 00:00:00 2001
From: R <rqou at 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 | 19 +++++++++++++++----
clang/test/Driver/wasm-toolchain.c | 6 ++++++
2 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp b/clang/lib/Driver/ToolChains/WebAssembly.cpp
index 93f17a03c580f..cd12f2ae5a6de 100644
--- a/clang/lib/Driver/ToolChains/WebAssembly.cpp
+++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp
@@ -69,6 +69,18 @@ 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 +162,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 +304,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 \
More information about the cfe-commits
mailing list