summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2020-12-18 10:02:29 -0800
committerSam Clegg <sbc@chromium.org>2021-01-13 07:49:39 -0800
commit07b6aeb5685fa6474cbeae797ebc5ea1f17da0f7 (patch)
treeb718dc472b0b28d38d31d5e89c1b89141f5d5582
parent4e8e888905a4258932dcb593a5531a6329cc821a (diff)
downloadllvm-07b6aeb5685fa6474cbeae797ebc5ea1f17da0f7.tar.gz
[lld][WebAssembly] Fix for TLS + --relocatable
When running in `-r/--relocatable` we output relocations but the new TLS relocations type was missing from `ObjFile::calcNewAddend` causing this combination of inputs/flags to crash the linker. Also avoid creating tls variables in relocatable mode. These variables are only needed when linking final executables. Fixes: https://github.com/emscripten-core/emscripten/issues/12934 Fixes: PR48506 Differential Revision: https://reviews.llvm.org/D93554
-rw-r--r--lld/test/wasm/tls-no-shared.s2
-rw-r--r--lld/test/wasm/tls.s33
-rw-r--r--lld/wasm/Driver.cpp2
-rw-r--r--lld/wasm/InputFiles.cpp1
-rw-r--r--lld/wasm/Writer.cpp2
5 files changed, 35 insertions, 5 deletions
diff --git a/lld/test/wasm/tls-no-shared.s b/lld/test/wasm/tls-no-shared.s
index 3fdc7057ad07..6c17489b7d42 100644
--- a/lld/test/wasm/tls-no-shared.s
+++ b/lld/test/wasm/tls-no-shared.s
@@ -1,5 +1,5 @@
# Test that linking without shared memory causes __tls_base to be
-# interlized
+# internalized
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
diff --git a/lld/test/wasm/tls.s b/lld/test/wasm/tls.s
index f5072dc13afa..878498bc2e48 100644
--- a/lld/test/wasm/tls.s
+++ b/lld/test/wasm/tls.s
@@ -73,8 +73,8 @@ tls3:
# RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --no-entry -o %t.wasm %t.o
# RUN: obj2yaml %t.wasm | FileCheck %s
-# RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --no-merge-data-segments --no-entry -o %t.wasm %t.o
-# RUN: obj2yaml %t.wasm | FileCheck %s
+# RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --no-merge-data-segments --no-entry -o %t2.wasm %t.o
+# RUN: obj2yaml %t2.wasm | FileCheck %s
# CHECK: - Type: GLOBAL
# CHECK-NEXT: Globals:
@@ -163,3 +163,32 @@ tls3:
# Expected body of tls_align:
# global.get 3
# end
+
+
+# Also verify TLS usage with --relocatable
+# RUN: wasm-ld --relocatable -o %t3.wasm %t.o
+# RUN: obj2yaml %t3.wasm | FileCheck %s --check-prefix=RELOC
+
+# RELOC: - Type: IMPORT
+# RELOC-NEXT: Imports:
+# RELOC-NEXT: - Module: env
+# RELOC-NEXT: Field: __tls_base
+# RELOC-NEXT: Kind: GLOBAL
+# RELOC-NEXT: GlobalType: I32
+# RELOC-NEXT: GlobalMutable: true
+# RELOC-NEXT: - Module: env
+# RELOC-NEXT: Field: __tls_align
+# RELOC-NEXT: Kind: GLOBAL
+# RELOC-NEXT: GlobalType: I32
+# RELOC-NEXT: GlobalMutable: false
+
+# RELOC: GlobalNames:
+# RELOC-NEXT: - Index: 0
+# RELOC-NEXT: Name: __tls_base
+# RELOC-NEXT: - Index: 1
+# RELOC-NEXT: Name: __tls_align
+# RELOC-NEXT: DataSegmentNames:
+# RELOC-NEXT: - Index: 0
+# RELOC-NEXT: Name: .tdata
+# RELOC-NEXT: - Index: 1
+# RELOC-NEXT: Name: .bss.no_tls
diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index fb699c55fc8c..84fdb77aea2c 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -639,7 +639,7 @@ static void createSyntheticSymbols() {
WasmSym::stackPointer->markLive();
}
- if (config->sharedMemory) {
+ if (config->sharedMemory && !config->relocatable) {
WasmSym::tlsBase = createGlobalVariable("__tls_base", true);
WasmSym::tlsSize = createGlobalVariable("__tls_size", false);
WasmSym::tlsAlign = createGlobalVariable("__tls_align", false);
diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp
index 68a9472819e4..eb37ae548b80 100644
--- a/lld/wasm/InputFiles.cpp
+++ b/lld/wasm/InputFiles.cpp
@@ -123,6 +123,7 @@ uint64_t ObjFile::calcNewAddend(const WasmRelocation &reloc) const {
case R_WASM_MEMORY_ADDR_REL_SLEB64:
case R_WASM_MEMORY_ADDR_I32:
case R_WASM_MEMORY_ADDR_I64:
+ case R_WASM_MEMORY_ADDR_TLS_SLEB:
case R_WASM_FUNCTION_OFFSET_I32:
case R_WASM_FUNCTION_OFFSET_I64:
return reloc.Addend;
diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index c95b92504634..710404943df2 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -284,7 +284,7 @@ void Writer::layoutMemory() {
log(formatv("mem: {0,-15} offset={1,-8} size={2,-8} align={3}", seg->name,
memoryPtr, seg->size, seg->alignment));
- if (seg->name == ".tdata") {
+ if (!config->relocatable && seg->name == ".tdata") {
if (config->sharedMemory) {
auto *tlsSize = cast<DefinedGlobal>(WasmSym::tlsSize);
setGlobalPtr(tlsSize, seg->size);