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

Reply via email to