diff --git a/lld/test/wasm/tls-import.s b/lld/test/wasm/tls-import.s new file mode 100644 --- /dev/null +++ b/lld/test/wasm/tls-import.s @@ -0,0 +1,23 @@ +# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s +# RUN: not wasm-ld -shared --experimental-pic --shared-memory -o %t.wasm %t.o 2>&1 | FileCheck %s + +# CHECK: error: {{.*}}.o: TLS symbol is undefined, but TLS symbols cannot yet be imported: `foo` + +.globl _start +_start: + .functype _start () -> () + i32.const foo@TLSREL + drop + end_function + +.section .custom_section.target_features,"",@ + .int8 3 + .int8 43 + .int8 7 + .ascii "atomics" + .int8 43 + .int8 11 + .ascii "bulk-memory" + .int8 43 + .int8 15 + .ascii "mutable-globals" diff --git a/lld/wasm/Relocations.cpp b/lld/wasm/Relocations.cpp --- a/lld/wasm/Relocations.cpp +++ b/lld/wasm/Relocations.cpp @@ -146,6 +146,15 @@ " cannot be used against symbol " + toString(*sym) + "; recompile with -fPIC"); break; + case R_WASM_MEMORY_ADDR_TLS_SLEB: + case R_WASM_MEMORY_ADDR_TLS_SLEB64: + if (!sym->isDefined()) { + error(toString(file) + + ": TLS symbol is undefined, but TLS symbols cannot yet be " + "imported: `" + + toString(*sym) + "`"); + } + break; case R_WASM_TABLE_INDEX_I32: case R_WASM_TABLE_INDEX_I64: case R_WASM_MEMORY_ADDR_I32: