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;
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<int64_t>(value), loc, 10);
break;
case R_WASM_TABLE_INDEX_I32:
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:
return value;
}
case R_WASM_MEMORY_ADDR_TLS_SLEB:
+ case R_WASM_MEMORY_ADDR_TLS_SLEB64:
if (isa<UndefinedData>(sym) || sym->isUndefWeak())
return 0;
// TLS relocations are relative to the start of the TLS output segment
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.
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)
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:
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
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:
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<GenericBinaryError>("invalid relocation data index",
object_error::parse_failed);
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
# 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
# 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
--- /dev/null
+# 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, i64
+
+tls_store:
+ .functype tls_store (i32) -> ()
+ # CHECK: global.get __tls_base
+ # CHECK-NEXT: i64.const tls1@TLSREL
+ # CHECK-NEXT: i64.add
+ # CHECK-NEXT: local.get 0
+ # CHECK-NEXT: i32.store 0
+ global.get __tls_base
+ i64.const tls1@TLSREL
+ i64.add
+ local.get 0
+ i32.store 0
+ end_function
+
+.section .tls.foo,"T",@
+# CHECK: .tls.foo,"T",@
+tls1:
+ .int32 42
+ .size tls1, 4
+
+.section custom_tls,"T",@
+# CHECK: custom_tls,"T",@
+tls2:
+ .int32 43
+ .size tls2, 4
+
+# CHECK-OBJ: - Type: CODE
+# CHECK-OBJ-NEXT: Relocations:
+# CHECK-OBJ-NEXT: - Type: R_WASM_GLOBAL_INDEX_LEB
+# CHECK-OBJ-NEXT: Index: 1
+# CHECK-OBJ-NEXT: Offset: 0x4
+# CHECK-OBJ-NEXT: - Type: R_WASM_MEMORY_ADDR_TLS_SLEB64
+# CHECK-OBJ-NEXT: Index: 2
+# CHECK-OBJ-NEXT: Offset: 0xA
+
+# CHECK-OBJ: - Type: CUSTOM
+# CHECK-OBJ-NEXT: Name: linking
+# CHECK-OBJ-NEXT: Version: 2
+# CHECK-OBJ-NEXT: SymbolTable:
+# CHECK-OBJ-NEXT: - Index: 0
+# CHECK-OBJ-NEXT: Kind: FUNCTION
+# CHECK-OBJ-NEXT: Name: tls_store
+# CHECK-OBJ-NEXT: Flags: [ BINDING_LOCAL ]
+# CHECK-OBJ-NEXT: Function: 0
+# CHECK-OBJ-NEXT: - Index: 1
+# CHECK-OBJ-NEXT: Kind: GLOBAL
+# CHECK-OBJ-NEXT: Name: __tls_base
+# CHECK-OBJ-NEXT: Flags: [ UNDEFINED ]
+# CHECK-OBJ-NEXT: Global: 0
+# CHECK-OBJ-NEXT: - Index: 2
+# CHECK-OBJ-NEXT: Kind: DATA
+# CHECK-OBJ-NEXT: Name: tls1
+# CHECK-OBJ-NEXT: Flags: [ BINDING_LOCAL ]
+# CHECK-OBJ-NEXT: Segment: 0
+# CHECK-OBJ-NEXT: Size: 4
+# CHECK-OBJ-NEXT: - Index: 3
+# CHECK-OBJ-NEXT: Kind: DATA
+# CHECK-OBJ-NEXT: Name: tls2
+# CHECK-OBJ-NEXT: Flags: [ BINDING_LOCAL ]
+# CHECK-OBJ-NEXT: Segment: 1
+# CHECK-OBJ-NEXT: Size: 4
+# CHECK-OBJ-NEXT: SegmentInfo:
+# CHECK-OBJ-NEXT: - Index: 0
+# CHECK-OBJ-NEXT: Name: .tls.foo
+# CHECK-OBJ-NEXT: Alignment: 0
+# CHECK-OBJ-NEXT: Flags: [ TLS ]
+# CHECK-OBJ-NEXT: - Index: 1
+# CHECK-OBJ-NEXT: Name: custom_tls
+# CHECK-OBJ-NEXT: Alignment: 0
+# CHECK-OBJ-NEXT: Flags: [ TLS ]