diff --git a/lld/wasm/InputChunks.cpp b/lld/wasm/InputChunks.cpp --- a/lld/wasm/InputChunks.cpp +++ b/lld/wasm/InputChunks.cpp @@ -43,6 +43,7 @@ case R_WASM_TABLE_INDEX_I64: case R_WASM_FUNCTION_OFFSET_I64: case R_WASM_TABLE_INDEX_REL_SLEB64: + case R_WASM_MEMORY_ADDR_TLS_SLEB64: return true; default: return false; @@ -140,6 +141,7 @@ case R_WASM_TABLE_INDEX_REL_SLEB64: case R_WASM_MEMORY_ADDR_SLEB64: case R_WASM_MEMORY_ADDR_REL_SLEB64: + case R_WASM_MEMORY_ADDR_TLS_SLEB64: encodeSLEB128(static_cast(value), loc, 10); break; case R_WASM_TABLE_INDEX_I32: diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -124,6 +124,7 @@ case R_WASM_MEMORY_ADDR_I32: case R_WASM_MEMORY_ADDR_I64: case R_WASM_MEMORY_ADDR_TLS_SLEB: + case R_WASM_MEMORY_ADDR_TLS_SLEB64: case R_WASM_FUNCTION_OFFSET_I32: case R_WASM_FUNCTION_OFFSET_I64: case R_WASM_MEMORY_ADDR_LOCREL_I32: @@ -196,6 +197,7 @@ return value; } case R_WASM_MEMORY_ADDR_TLS_SLEB: + case R_WASM_MEMORY_ADDR_TLS_SLEB64: if (isa(sym) || sym->isUndefWeak()) return 0; // TLS relocations are relative to the start of the TLS output segment diff --git a/lld/wasm/Relocations.cpp b/lld/wasm/Relocations.cpp --- a/lld/wasm/Relocations.cpp +++ b/lld/wasm/Relocations.cpp @@ -115,6 +115,7 @@ addGOTEntry(sym); break; case R_WASM_MEMORY_ADDR_TLS_SLEB: + case R_WASM_MEMORY_ADDR_TLS_SLEB64: // In single-threaded builds TLS is lowered away and TLS data can be // merged with normal data and allowing TLS relocation in non-TLS // segments. diff --git a/llvm/include/llvm/BinaryFormat/WasmRelocs.def b/llvm/include/llvm/BinaryFormat/WasmRelocs.def --- a/llvm/include/llvm/BinaryFormat/WasmRelocs.def +++ b/llvm/include/llvm/BinaryFormat/WasmRelocs.def @@ -27,3 +27,4 @@ WASM_RELOC(R_WASM_FUNCTION_OFFSET_I64, 22) WASM_RELOC(R_WASM_MEMORY_ADDR_LOCREL_I32, 23) WASM_RELOC(R_WASM_TABLE_INDEX_REL_SLEB64, 24) +WASM_RELOC(R_WASM_MEMORY_ADDR_TLS_SLEB64, 25) diff --git a/llvm/lib/BinaryFormat/Wasm.cpp b/llvm/lib/BinaryFormat/Wasm.cpp --- a/llvm/lib/BinaryFormat/Wasm.cpp +++ b/llvm/lib/BinaryFormat/Wasm.cpp @@ -49,6 +49,7 @@ case R_WASM_MEMORY_ADDR_I32: case R_WASM_MEMORY_ADDR_I64: case R_WASM_MEMORY_ADDR_TLS_SLEB: + case R_WASM_MEMORY_ADDR_TLS_SLEB64: case R_WASM_FUNCTION_OFFSET_I32: case R_WASM_FUNCTION_OFFSET_I64: case R_WASM_SECTION_OFFSET_I32: diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp --- a/llvm/lib/MC/WasmObjectWriter.cpp +++ b/llvm/lib/MC/WasmObjectWriter.cpp @@ -633,6 +633,7 @@ case wasm::R_WASM_MEMORY_ADDR_I32: case wasm::R_WASM_MEMORY_ADDR_I64: case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB: + case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB64: case wasm::R_WASM_MEMORY_ADDR_LOCREL_I32: { // Provisional value is address of the global plus the offset // For undefined symbols, use zero @@ -748,6 +749,7 @@ case wasm::R_WASM_TABLE_INDEX_REL_SLEB64: case wasm::R_WASM_MEMORY_ADDR_SLEB64: case wasm::R_WASM_MEMORY_ADDR_REL_SLEB64: + case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB64: writePatchableSLEB<10>(Stream, Value, Offset); break; default: diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -919,6 +919,7 @@ case wasm::R_WASM_MEMORY_ADDR_SLEB64: case wasm::R_WASM_MEMORY_ADDR_I64: case wasm::R_WASM_MEMORY_ADDR_REL_SLEB64: + case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB64: if (!isValidDataSymbol(Reloc.Index)) return make_error("invalid relocation data index", object_error::parse_failed); diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp @@ -79,7 +79,8 @@ return is64Bit() ? wasm::R_WASM_TABLE_INDEX_REL_SLEB64 : wasm::R_WASM_TABLE_INDEX_REL_SLEB; case MCSymbolRefExpr::VK_WASM_TLSREL: - return wasm::R_WASM_MEMORY_ADDR_TLS_SLEB; + return is64Bit() ? wasm::R_WASM_MEMORY_ADDR_TLS_SLEB64 + : wasm::R_WASM_MEMORY_ADDR_TLS_SLEB; case MCSymbolRefExpr::VK_WASM_MBREL: assert(SymA.isData()); return is64Bit() ? wasm::R_WASM_MEMORY_ADDR_REL_SLEB64 diff --git a/llvm/test/MC/WebAssembly/tls.s b/llvm/test/MC/WebAssembly/tls.s --- a/llvm/test/MC/WebAssembly/tls.s +++ b/llvm/test/MC/WebAssembly/tls.s @@ -9,11 +9,12 @@ # CHECK: global.get __tls_base # CHECK-NEXT: i32.const tls1@TLSREL # CHECK-NEXT: i32.add + # CHECK-NEXT: local.get 0 # CHECK-NEXT: i32.store 0 - local.get 0 global.get __tls_base i32.const tls1@TLSREL i32.add + local.get 0 i32.store 0 end_function @@ -33,10 +34,10 @@ # CHECK-OBJ-NEXT: Relocations: # CHECK-OBJ-NEXT: - Type: R_WASM_GLOBAL_INDEX_LEB # CHECK-OBJ-NEXT: Index: 1 -# CHECK-OBJ-NEXT: Offset: 0x6 +# CHECK-OBJ-NEXT: Offset: 0x4 # CHECK-OBJ-NEXT: - Type: R_WASM_MEMORY_ADDR_TLS_SLEB # CHECK-OBJ-NEXT: Index: 2 -# CHECK-OBJ-NEXT: Offset: 0xC +# CHECK-OBJ-NEXT: Offset: 0xA # CHECK-OBJ: - Type: CUSTOM # CHECK-OBJ-NEXT: Name: linking diff --git a/llvm/test/MC/WebAssembly/tls.s b/llvm/test/MC/WebAssembly/tls64.s copy from llvm/test/MC/WebAssembly/tls.s copy to llvm/test/MC/WebAssembly/tls64.s --- a/llvm/test/MC/WebAssembly/tls.s +++ b/llvm/test/MC/WebAssembly/tls64.s @@ -1,19 +1,20 @@ -# RUN: llvm-mc -triple=wasm32-unknown-unknown < %s | FileCheck %s -# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj -o %t.o < %s -# RUN: obj2yaml %t.o | FileCheck %s --check-prefix=CHECK-OBJ +# RUN: llvm-mc -triple=wasm64-unknown-unknown < %s | FileCheck %s +# RUN: llvm-mc -triple=wasm64-unknown-unknown -filetype=obj -o %t.o < %s +# RUN: obj2yaml %t.o | FileCheck %s --check-prefix=CHECK-OBJ --match-full-lines -.globaltype __tls_base, i32 +.globaltype __tls_base, i64 tls_store: .functype tls_store (i32) -> () # CHECK: global.get __tls_base - # CHECK-NEXT: i32.const tls1@TLSREL - # CHECK-NEXT: i32.add + # CHECK-NEXT: i64.const tls1@TLSREL + # CHECK-NEXT: i64.add + # CHECK-NEXT: local.get 0 # CHECK-NEXT: i32.store 0 - local.get 0 global.get __tls_base - i32.const tls1@TLSREL - i32.add + i64.const tls1@TLSREL + i64.add + local.get 0 i32.store 0 end_function @@ -33,10 +34,10 @@ # CHECK-OBJ-NEXT: Relocations: # CHECK-OBJ-NEXT: - Type: R_WASM_GLOBAL_INDEX_LEB # CHECK-OBJ-NEXT: Index: 1 -# CHECK-OBJ-NEXT: Offset: 0x6 -# CHECK-OBJ-NEXT: - Type: R_WASM_MEMORY_ADDR_TLS_SLEB +# CHECK-OBJ-NEXT: Offset: 0x4 +# CHECK-OBJ-NEXT: - Type: R_WASM_MEMORY_ADDR_TLS_SLEB64 # CHECK-OBJ-NEXT: Index: 2 -# CHECK-OBJ-NEXT: Offset: 0xC +# CHECK-OBJ-NEXT: Offset: 0xA # CHECK-OBJ: - Type: CUSTOM # CHECK-OBJ-NEXT: Name: linking