[clang] 45ad346 - [clang][WebAssembly] Imply -fno-threadsafe-static when threading is disabled
Sam Clegg via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 31 14:30:47 PST 2022
Author: Sam Clegg
Date: 2022-01-31T14:26:09-08:00
New Revision: 45ad3467b708618841869cb529a814001d2295f9
URL: https://github.com/llvm/llvm-project/commit/45ad3467b708618841869cb529a814001d2295f9
DIFF: https://github.com/llvm/llvm-project/commit/45ad3467b708618841869cb529a814001d2295f9.diff
LOG: [clang][WebAssembly] Imply -fno-threadsafe-static when threading is disabled
When we don't enable atomics we completely disabled threading in
which case there is no point in generating thread safe code for
static initialization.
This should always be safe because, in WebAssembly, it is not
possible to link object compiled without the atomics feature into a
mutli-threaded program.
See https://github.com/emscripten-core/emscripten/pull/16152
Differential Revision: https://reviews.llvm.org/D118571
Added:
Modified:
clang/lib/Basic/Targets/WebAssembly.cpp
clang/test/CodeGenCXX/static-init-wasm.cpp
Removed:
################################################################################
diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp
index 4cba861f61d2c..2309997eb77b2 100644
--- a/clang/lib/Basic/Targets/WebAssembly.cpp
+++ b/clang/lib/Basic/Targets/WebAssembly.cpp
@@ -260,6 +260,7 @@ void WebAssemblyTargetInfo::adjust(DiagnosticsEngine &Diags,
if (!HasAtomics) {
Opts.POSIXThreads = false;
Opts.setThreadModel(LangOptions::ThreadModelKind::Single);
+ Opts.ThreadsafeStatics = false;
}
}
diff --git a/clang/test/CodeGenCXX/static-init-wasm.cpp b/clang/test/CodeGenCXX/static-init-wasm.cpp
index 647a61b84721e..0a066de616fa9 100644
--- a/clang/test/CodeGenCXX/static-init-wasm.cpp
+++ b/clang/test/CodeGenCXX/static-init-wasm.cpp
@@ -1,6 +1,6 @@
-// RUN: %clang_cc1 -emit-llvm -triple=wasm32-unknown-unknown -o - %s \
+// RUN: %clang_cc1 -emit-llvm -triple=wasm32-unknown-unknown -target-feature +atomics -o - %s \
// RUN: | FileCheck %s -check-prefix=WEBASSEMBLY32
-// RUN: %clang_cc1 -emit-llvm -triple=wasm64-unknown-unknown -o - %s \
+// RUN: %clang_cc1 -emit-llvm -triple=wasm64-unknown-unknown -target-feature +atomics -o - %s \
// RUN: | FileCheck %s -check-prefix=WEBASSEMBLY64
// Test that we don't create common blocks.
@@ -52,3 +52,17 @@ A theA;
// WEBASSEMBLY64: call noundef %struct.A* @_ZN1AC1Ev(%struct.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 -o - %s \
+// RUN: | FileCheck %s -check-prefix=NOATOMICS
+// RUN: %clang_cc1 -emit-llvm -triple=wasm64-unknown-unknown -o - %s \
+// RUN: | FileCheck %s -check-prefix=NOATOMICS
+
+// NOATOMICS-LABEL: @_Z1gv()
+// NOATOMICS: %[[R0:.+]] = load i8, i8* @_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
More information about the cfe-commits
mailing list