Skip to content

Commit

Permalink
[clang][WebAssembly] Imply -fno-threadsafe-static when threading is d…
Browse files Browse the repository at this point in the history
…isabled

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 emscripten-core/emscripten#16152

Differential Revision: https://reviews.llvm.org/D118571
  • Loading branch information
sbc100 committed Jan 31, 2022
1 parent 2d66ed3 commit 45ad346
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 2 deletions.
1 change: 1 addition & 0 deletions clang/lib/Basic/Targets/WebAssembly.cpp
Expand Up @@ -260,6 +260,7 @@ void WebAssemblyTargetInfo::adjust(DiagnosticsEngine &Diags,
if (!HasAtomics) {
Opts.POSIXThreads = false;
Opts.setThreadModel(LangOptions::ThreadModelKind::Single);
Opts.ThreadsafeStatics = false;
}
}

Expand Down
18 changes: 16 additions & 2 deletions 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.
Expand Down Expand Up @@ -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

0 comments on commit 45ad346

Please sign in to comment.