diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp --- a/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp @@ -315,9 +315,12 @@ // which will generate an import and asssumes that it will exist at link time. static GlobalVariable *getGlobalVariableI32(Module &M, IRBuilder<> &IRB, const char *Name) { - - auto *GV = - dyn_cast(M.getOrInsertGlobal(Name, IRB.getInt32Ty())); + auto Int32Ty = IRB.getInt32Ty(); + auto *GV = dyn_cast(M.getOrInsertGlobal(Name, Int32Ty, [&]() { + return new GlobalVariable(M, Int32Ty, false, + GlobalVariable::ExternalLinkage, nullptr, Name, + nullptr, GlobalValue::LocalExecTLSModel); + })); if (!GV) report_fatal_error(Twine("unable to create global: ") + Name); diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp --- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp @@ -348,12 +348,6 @@ //===----------------------------------------------------------------------===// void WebAssemblyPassConfig::addIRPasses() { - // Runs LowerAtomicPass if necessary - addPass(new CoalesceFeaturesAndStripAtomics(&getWebAssemblyTargetMachine())); - - // This is a no-op if atomics are not used in the module - addPass(createAtomicExpandPass()); - // Add signatures to prototype-less function declarations addPass(createWebAssemblyAddMissingPrototypes()); @@ -389,6 +383,12 @@ // Expand indirectbr instructions to switches. addPass(createIndirectBrExpandPass()); + // Lower atomics and TLS if necessary + addPass(new CoalesceFeaturesAndStripAtomics(&getWebAssemblyTargetMachine())); + + // This is a no-op if atomics are not used in the module + addPass(createAtomicExpandPass()); + TargetPassConfig::addIRPasses(); } diff --git a/llvm/test/CodeGen/WebAssembly/lower-em-exceptions.ll b/llvm/test/CodeGen/WebAssembly/lower-em-exceptions.ll --- a/llvm/test/CodeGen/WebAssembly/lower-em-exceptions.ll +++ b/llvm/test/CodeGen/WebAssembly/lower-em-exceptions.ll @@ -5,8 +5,8 @@ @_ZTIi = external constant i8* @_ZTIc = external constant i8* -; CHECK-DAG: __THREW__ = external global i32 -; CHECK-DAG: __threwValue = external global i32 +; CHECK-DAG: __THREW__ = external thread_local(localexec) global i32 +; CHECK-DAG: __threwValue = external thread_local(localexec) global i32 ; Test invoke instruction with clauses (try-catch block) define void @clause() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { diff --git a/llvm/test/CodeGen/WebAssembly/lower-em-sjlj.ll b/llvm/test/CodeGen/WebAssembly/lower-em-sjlj.ll --- a/llvm/test/CodeGen/WebAssembly/lower-em-sjlj.ll +++ b/llvm/test/CodeGen/WebAssembly/lower-em-sjlj.ll @@ -6,8 +6,8 @@ %struct.__jmp_buf_tag = type { [6 x i32], i32, [32 x i32] } @global_var = global i32 0, align 4 -; CHECK-DAG: __THREW__ = external global i32 -; CHECK-DAG: __threwValue = external global i32 +; CHECK-DAG: __THREW__ = external thread_local(localexec) global i32 +; CHECK-DAG: __threwValue = external thread_local(localexec) global i32 ; Test a simple setjmp - longjmp sequence define void @setjmp_longjmp() {