Author: Derek Schuff Date: 2026-09-25T08:48:31-07:00 New Revision: 14f451262dc753b53f79a103744dd6988894467f
URL: https://github.com/llvm/llvm-project/commit/14f451262dc753b53f79a103744dd6988894467f DIFF: https://github.com/llvm/llvm-project/commit/14f451262dc753b53f79a103744dd6988894467f.diff LOG: [clang][WeAssembly] Do not override thread model when building without atomics (#225981) This change does 2 things. The first is to revert #223917, setting the Triple's default thread model back to posix. The second is to stop overriding it when atomics are not enabled. This means that compiles with no thread- or atomics-related flags will get the default posix thread model, independently of whether they get _REENTRANT defined or the atomics feature is enabled. Practically this means that the thread model will always be posix unless explicitly overridden at the driver command line. The leftover setting of Opts.POSIXThreads became a no-op when used with the clang driver because the logic would only activate when -pthread was not already used (since the driver has separate logic linking several flags together). This is a safer version of the status quo before the thread-model module flag was introduced, because atomics are still lowered in the same way but there is no risk of unsafe initialization or LICM in such scenarios. We could probably further simplify the interaction between various thread- and atomics-related flags and thread agnosticism, but this is a small step that fixes a known hazard. Added: Modified: clang/lib/Basic/Targets/WebAssembly.cpp clang/lib/Basic/Targets/WebAssembly.h clang/test/CodeGen/thread-model.c clang/test/CodeGenCXX/static-init-wasm.cpp clang/test/Preprocessor/init.c llvm/lib/Target/WebAssembly/WebAssemblyCoalesceFeaturesAndStripAtomics.cpp llvm/lib/TargetParser/Triple.cpp Removed: llvm/test/CodeGen/WebAssembly/coalesce-features-thread-model.ll ################################################################################ diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp index a483e3d6f9b10..e2b819b1c98a5 100644 --- a/clang/lib/Basic/Targets/WebAssembly.cpp +++ b/clang/lib/Basic/Targets/WebAssembly.cpp @@ -418,19 +418,6 @@ WebAssemblyTargetInfo::getTargetBuiltins() const { return {{&BuiltinStrings, BuiltinInfos}}; } -void WebAssemblyTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts, - const TargetInfo *Aux) { - TargetInfo::adjust(Diags, Opts, Aux); - // Turn off POSIXThreads and ThreadModel so that we don't predefine _REENTRANT - // or __STDCPP_THREADS__ if we will eventually end up stripping atomics - // because they are unsupported. - if ((!HasCooperativeThreading && !HasAtomics) || !HasBulkMemory) { - Opts.POSIXThreads = false; - Opts.setThreadModel(LangOptions::ThreadModelKind::Single); - Opts.ThreadsafeStatics = false; - } -} - void WebAssembly32TargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { WebAssemblyTargetInfo::getTargetDefines(Opts, Builder); diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h index 630b1a7cd2b36..93dad2442db23 100644 --- a/clang/lib/Basic/Targets/WebAssembly.h +++ b/clang/lib/Basic/Targets/WebAssembly.h @@ -171,9 +171,6 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo { bool hasBitIntType() const override { return true; } bool hasProtectedVisibility() const override { return false; } - - void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, - const TargetInfo *Aux) override; }; class LLVM_LIBRARY_VISIBILITY WebAssembly32TargetInfo diff --git a/clang/test/CodeGen/thread-model.c b/clang/test/CodeGen/thread-model.c index 419615fb40edb..5a84eb829be7f 100644 --- a/clang/test/CodeGen/thread-model.c +++ b/clang/test/CodeGen/thread-model.c @@ -5,15 +5,11 @@ // RUN: %clang_cc1 -triple arm-none-linux-gnueabi -mthread-model posix -emit-llvm %s -o - | FileCheck %s --check-prefix=POSIX // RUN: %clang_cc1 -triple arm-none-linux-gnueabi -emit-llvm %s -o - | FileCheck %s --check-prefix=POSIX -// RUN: %clang_cc1 -triple wasm32-unknown-unknown -mthread-model single -emit-llvm %s -o - | FileCheck %s --check-prefix=WASM-SINGLE -// RUN: %clang_cc1 -triple wasm32-unknown-unknown -target-feature +atomics -target-feature +bulk-memory -mthread-model posix -emit-llvm %s -o - | FileCheck %s --check-prefix=WASM-POSIX -// RUN: %clang_cc1 -triple wasm32-unknown-unknown -target-feature +atomics -target-feature +bulk-memory -emit-llvm %s -o - | FileCheck %s --check-prefix=WASM-POSIX -// RUN: %clang_cc1 -triple wasm32-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix=WASM-SINGLE +// RUN: %clang_cc1 -triple wasm32-unknown-unknown -mthread-model single -emit-llvm %s -o - | FileCheck %s --check-prefix=SINGLE +// RUN: %clang_cc1 -triple wasm32-unknown-unknown -mthread-model posix -emit-llvm %s -o - | FileCheck %s --check-prefix=POSIX +// RUN: %clang_cc1 -triple wasm32-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix=POSIX void f(void) {} // SINGLE: !{i32 1, !"thread-model", !"single"} // POSIX-NOT: "thread-model" - -// WASM-SINGLE-NOT: "thread-model" -// WASM-POSIX: !{i32 1, !"thread-model", !"posix"} diff --git a/clang/test/CodeGenCXX/static-init-wasm.cpp b/clang/test/CodeGenCXX/static-init-wasm.cpp index 1406dcbd5ffc2..8677bf7fd60b9 100644 --- a/clang/test/CodeGenCXX/static-init-wasm.cpp +++ b/clang/test/CodeGenCXX/static-init-wasm.cpp @@ -53,30 +53,20 @@ A theA; // WEBASSEMBLY64: define internal void @_GLOBAL__sub_I_static_init_wasm.cpp() #3 { // WEBASSEMBLY64: call void @__cxx_global_var_init() -// RUN: %clang_cc1 -emit-llvm -triple=wasm32-unknown-unknown -target-feature +bulk-memory -o - %s \ -// RUN: | FileCheck %s -check-prefix=NOATOMICS -// RUN: %clang_cc1 -emit-llvm -triple=wasm64-unknown-unknown -target-feature +bulk-memory -o - %s \ -// RUN: | FileCheck %s -check-prefix=NOATOMICS - -// NOATOMICS-LABEL: @_Z1gv() -// NOATOMICS: %[[R0:.+]] = load i8, ptr @_ZGVZ1gvE1a, align 1 -// NOATOMICS-NEXT: %guard.uninitialized = icmp eq i8 %[[R0]], 0 -// NOATOMICS-NEXT: br i1 %guard.uninitialized, label %[[CHECK:.+]], label %[[END:.+]], -// NOATOMICS: [[CHECK]]: -// NOATOMICS-NOT: __cxa_guard_acquire -// NOATOMICS: [[END]]: -// NOATOMICS-NEXT: ret void - -// RUN: %clang_cc1 -emit-llvm -triple=wasm32-unknown-unknown -target-feature +atomics -o - %s \ -// RUN: | FileCheck %s -check-prefix=NOBULKMEM -// RUN: %clang_cc1 -emit-llvm -triple=wasm64-unknown-unknown -target-feature +atomics -o - %s \ -// RUN: | FileCheck %s -check-prefix=NOBULKMEM +// RUN: %clang_cc1 -emit-llvm -triple=wasm32-unknown-unknown -o - %s \ +// RUN: | FileCheck %s -check-prefix=WEBASSEMBLY32 +// RUN: %clang_cc1 -emit-llvm -triple=wasm64-unknown-unknown -o - %s \ +// RUN: | FileCheck %s -check-prefix=WEBASSEMBLY64 +// RUN: %clang_cc1 -emit-llvm -triple=wasm32-unknown-unknown -fno-threadsafe-statics -o - %s \ +// RUN: | FileCheck %s -check-prefix=NOTHREADSAFE +// RUN: %clang_cc1 -emit-llvm -triple=wasm64-unknown-unknown -fno-threadsafe-statics -o - %s \ +// RUN: | FileCheck %s -check-prefix=NOTHREADSAFE -// NOBULKMEM-LABEL: @_Z1gv() -// NOBULKMEM: %[[R0:.+]] = load i8, ptr @_ZGVZ1gvE1a, align 1 -// NOBULKMEM-NEXT: %guard.uninitialized = icmp eq i8 %[[R0]], 0 -// NOBULKMEM-NEXT: br i1 %guard.uninitialized, label %[[CHECK:.+]], label %[[END:.+]], -// NOBULKMEM: [[CHECK]]: -// NOBULKMEM-NOT: __cxa_guard_acquire -// NOBULKMEM: [[END]]: -// NOBULKMEM-NEXT: ret void +// NOTHREADSAFE-LABEL: @_Z1gv() +// NOTHREADSAFE: %[[R0:.+]] = load i8, ptr @_ZGVZ1gvE1a, align 1 +// NOTHREADSAFE-NEXT: %guard.uninitialized = icmp eq i8 %[[R0]], 0 +// NOTHREADSAFE-NEXT: br i1 %guard.uninitialized, label %[[CHECK:.+]], label %[[END:.+]], +// NOTHREADSAFE: [[CHECK]]: +// NOTHREADSAFE-NOT: __cxa_guard_acquire +// NOTHREADSAFE: [[END]]: +// NOTHREADSAFE-NEXT: ret void diff --git a/clang/test/Preprocessor/init.c b/clang/test/Preprocessor/init.c index faeb7861e5d21..c07dc27f0bb4f 100644 --- a/clang/test/Preprocessor/init.c +++ b/clang/test/Preprocessor/init.c @@ -2150,7 +2150,7 @@ // EMSCRIPTEN:#define unix 1 // WASI-NOT:#define unix 1 // WEBASSEMBLY-CXX-NOT:_REENTRANT -// WEBASSEMBLY-CXX-NOT:__STDCPP_THREADS__ +// WEBASSEMBLY-CXX:#define __STDCPP_THREADS__ 1 // WEBASSEMBLY-CXX-ATOMICS:#define _REENTRANT 1 // WEBASSEMBLY-CXX-ATOMICS:#define __STDCPP_THREADS__ 1 diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyCoalesceFeaturesAndStripAtomics.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyCoalesceFeaturesAndStripAtomics.cpp index 2cdd7d908994b..68c8f1087f7a6 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyCoalesceFeaturesAndStripAtomics.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyCoalesceFeaturesAndStripAtomics.cpp @@ -195,15 +195,7 @@ static bool coalesceFeaturesAndStripAtomics(Module &M, else if (StrippedTLS && !StrippedAtomics) stripAtomics(M); - bool Stripped = StrippedAtomics || StrippedTLS; - if (!Stripped && - (Features[WebAssembly::FeatureAtomics] || - (CooperativeThreading && Features[WebAssembly::FeatureBulkMemory])) && - !M.getModuleFlag("thread-model")) { - M.setThreadModel(ThreadModel::POSIX); - } - - recordFeatures(M, ST, Features, Stripped); + recordFeatures(M, ST, Features, StrippedAtomics || StrippedTLS); // Conservatively assume we have made some change return true; diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp index 91997355ee414..6f2c867a318d2 100644 --- a/llvm/lib/TargetParser/Triple.cpp +++ b/llvm/lib/TargetParser/Triple.cpp @@ -2543,11 +2543,7 @@ FloatABI::ABIType Triple::getDefaultFloatABI() const { return FloatABI::Hard; } -ThreadModel Triple::getDefaultThreadModel() const { - if (isWasm()) - return ThreadModel::Single; - return ThreadModel::POSIX; -} +ThreadModel Triple::getDefaultThreadModel() const { return ThreadModel::POSIX; } LongDoubleFormat Triple::getDefaultLongDoubleFormat() const { switch (getArch()) { diff --git a/llvm/test/CodeGen/WebAssembly/coalesce-features-thread-model.ll b/llvm/test/CodeGen/WebAssembly/coalesce-features-thread-model.ll deleted file mode 100644 index 606e48c04b83a..0000000000000 --- a/llvm/test/CodeGen/WebAssembly/coalesce-features-thread-model.ll +++ /dev/null @@ -1,44 +0,0 @@ -; RUN: split-file %s %t - -; Test that wasm-coalesce-features-and-strip-atomics sets the "thread-model" -; module flag to "posix" when threading features (+atomics or cooperative -; multithreading with +bulk-memory) are enabled and atomics/TLS were not -; stripped, unless an explicit "thread-model" flag is already present. - -; RUN: opt -mtriple=wasm32-unknown-unknown -passes=wasm-coalesce-features-and-strip-atomics -S %t/default.ll | FileCheck %s --check-prefix=NO-FLAG -; RUN: opt -mtriple=wasm32-unknown-unknown -mattr=+atomics -passes=wasm-coalesce-features-and-strip-atomics -S %t/default.ll | FileCheck %s --check-prefix=POSIX -; RUN: opt -mtriple=wasm32-wasip3 -mattr=+bulk-memory -passes=wasm-coalesce-features-and-strip-atomics -S %t/default.ll | FileCheck %s --check-prefix=POSIX -; RUN: opt -mtriple=wasm32-wasip3 -mattr=-bulk-memory -passes=wasm-coalesce-features-and-strip-atomics -S %t/default.ll | FileCheck %s --check-prefix=NO-FLAG - -; RUN: opt -mtriple=wasm32-unknown-unknown -passes=wasm-coalesce-features-and-strip-atomics -S %t/attr.ll | FileCheck %s --check-prefix=POSIX - -; RUN: opt -mtriple=wasm32-unknown-unknown -mattr=+atomics,-bulk-memory -passes=wasm-coalesce-features-and-strip-atomics -S %t/tls.ll | FileCheck %s --check-prefix=NO-FLAG -; RUN: opt -mtriple=wasm32-unknown-unknown -mattr=+atomics,+bulk-memory -passes=wasm-coalesce-features-and-strip-atomics -S %t/tls.ll | FileCheck %s --check-prefix=POSIX - -; RUN: opt -mtriple=wasm32-unknown-unknown -mattr=+atomics -passes=wasm-coalesce-features-and-strip-atomics -S %t/explicit.ll | FileCheck %s --check-prefix=EXPLICIT-SINGLE - -; NO-FLAG-NOT: !"thread-model" -; POSIX: !{i32 1, !"thread-model", !"posix"} -; EXPLICIT-SINGLE: !{i32 1, !"thread-model", !"single"} -; EXPLICIT-SINGLE-NOT: !"posix" - -;--- default.ll -define void @foo() { - ret void -} - -;--- attr.ll -define void @foo() "target-features"="+atomics" { - ret void -} - -;--- tls.ll -@tls = thread_local global i32 0 - -;--- explicit.ll -define void @foo() { - ret void -} - -!llvm.module.flags = !{!0} -!0 = !{i32 1, !"thread-model", !"single"} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
