[lld] 670944f - [WebAssembly] Support R_WASM_MEMORY_ADDR_TLS_SLEB64 for wasm64

Wouter van Oortmerssen via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 19 10:23:08 PDT 2021


Author: Wouter van Oortmerssen
Date: 2021-07-19T10:22:43-07:00
New Revision: 670944fb20b226fc22fa993ab521125f9adbd30a

URL: https://github.com/llvm/llvm-project/commit/670944fb20b226fc22fa993ab521125f9adbd30a
DIFF: https://github.com/llvm/llvm-project/commit/670944fb20b226fc22fa993ab521125f9adbd30a.diff

LOG: [WebAssembly] Support R_WASM_MEMORY_ADDR_TLS_SLEB64 for wasm64

Also fixed TLS tests swapping addr & value in store op
Differential Revision: https://reviews.llvm.org/D106096

Added: 
    llvm/test/MC/WebAssembly/tls64.s

Modified: 
    lld/wasm/InputChunks.cpp
    lld/wasm/InputFiles.cpp
    lld/wasm/Relocations.cpp
    llvm/include/llvm/BinaryFormat/WasmRelocs.def
    llvm/lib/BinaryFormat/Wasm.cpp
    llvm/lib/MC/WasmObjectWriter.cpp
    llvm/lib/Object/WasmObjectFile.cpp
    llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
    llvm/test/MC/WebAssembly/tls.s

Removed: 
    


################################################################################
diff  --git a/lld/wasm/InputChunks.cpp b/lld/wasm/InputChunks.cpp
index cfd1f56104087..1207f523f2ee4 100644
--- a/lld/wasm/InputChunks.cpp
+++ b/lld/wasm/InputChunks.cpp
@@ -43,6 +43,7 @@ bool relocIs64(uint8_t relocType) {
   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 @@ void InputChunk::relocate(uint8_t *buf) const {
     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:

diff  --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp
index f9e279501b700..1ee5a8eb0b03a 100644
--- a/lld/wasm/InputFiles.cpp
+++ b/lld/wasm/InputFiles.cpp
@@ -124,6 +124,7 @@ uint64_t ObjFile::calcNewAddend(const WasmRelocation &reloc) const {
   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 @@ uint64_t ObjFile::calcNewValue(const WasmRelocation &reloc, uint64_t tombstone,
     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

diff  --git a/lld/wasm/Relocations.cpp b/lld/wasm/Relocations.cpp
index bb2019a6cce58..9313e30d805da 100644
--- a/lld/wasm/Relocations.cpp
+++ b/lld/wasm/Relocations.cpp
@@ -115,6 +115,7 @@ void scanRelocations(InputChunk *chunk) {
         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
index a78a76f5778f9..2913f20dfd26b 100644
--- a/llvm/include/llvm/BinaryFormat/WasmRelocs.def
+++ b/llvm/include/llvm/BinaryFormat/WasmRelocs.def
@@ -27,3 +27,4 @@ WASM_RELOC(R_WASM_MEMORY_ADDR_TLS_SLEB,   21)
 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
index 4192622d2d217..55efe31f26690 100644
--- a/llvm/lib/BinaryFormat/Wasm.cpp
+++ b/llvm/lib/BinaryFormat/Wasm.cpp
@@ -49,6 +49,7 @@ bool llvm::wasm::relocTypeHasAddend(uint32_t Type) {
   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
index 4832cd3ff54ee..b86604d54f443 100644
--- a/llvm/lib/MC/WasmObjectWriter.cpp
+++ b/llvm/lib/MC/WasmObjectWriter.cpp
@@ -633,6 +633,7 @@ WasmObjectWriter::getProvisionalValue(const WasmRelocationEntry &RelEntry,
   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 @@ void WasmObjectWriter::applyRelocations(
     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
index 518803792f5d9..a08c648358c03 100644
--- a/llvm/lib/Object/WasmObjectFile.cpp
+++ b/llvm/lib/Object/WasmObjectFile.cpp
@@ -919,6 +919,7 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {
     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);

diff  --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
index cd3465a1b3736..48e86544149fa 100644
--- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
+++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
@@ -79,7 +79,8 @@ unsigned WebAssemblyWasmObjectWriter::getRelocType(const MCValue &Target,
       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
index 0f5a5a394c398..542273c339c30 100644
--- a/llvm/test/MC/WebAssembly/tls.s
+++ b/llvm/test/MC/WebAssembly/tls.s
@@ -9,11 +9,12 @@ tls_store:
   # CHECK: global.get __tls_base
   # CHECK-NEXT: i32.const tls1 at 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 at TLSREL
   i32.add
+  local.get 0
   i32.store 0
   end_function
 
@@ -33,10 +34,10 @@ tls2:
 # 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/tls64.s b/llvm/test/MC/WebAssembly/tls64.s
new file mode 100644
index 0000000000000..f066fd29424e2
--- /dev/null
+++ b/llvm/test/MC/WebAssembly/tls64.s
@@ -0,0 +1,76 @@
+# 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 at TLSREL
+  # CHECK-NEXT: i64.add
+  # CHECK-NEXT: local.get 0
+  # CHECK-NEXT: i32.store 0
+  global.get __tls_base
+  i64.const tls1 at 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 ]


        


More information about the llvm-commits mailing list