summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/test/wasm/reloc-addend.ll19
-rw-r--r--lld/wasm/InputChunks.cpp2
2 files changed, 20 insertions, 1 deletions
diff --git a/lld/test/wasm/reloc-addend.ll b/lld/test/wasm/reloc-addend.ll
new file mode 100644
index 00000000000..630bd868916
--- /dev/null
+++ b/lld/test/wasm/reloc-addend.ll
@@ -0,0 +1,19 @@
+; RUN: llc -filetype=obj %s -o %t.o
+; RUN: wasm-ld --check-signatures -r -o %t.wasm %t.o
+; RUN: obj2yaml %t.wasm | FileCheck %s
+
+target triple = "wasm32-unknown-unknown-wasm"
+
+@foo = hidden global [76 x i32] zeroinitializer, align 16
+
+; bar points to the 16th element, which happens to be 64 bytes
+; This generates an addend of 64 which, is the value at which
+; signed and unsigned LEB encodes will differ.
+@bar = hidden local_unnamed_addr global i32* getelementptr inbounds ([76 x i32], [76 x i32]* @foo, i32 0, i32 16), align 4
+
+; CHECK: - Type: DATA
+; CHECK-NEXT: Relocations:
+; CHECK-NEXT: - Type: R_WEBASSEMBLY_MEMORY_ADDR_I32
+; CHECK-NEXT: Index: 0
+; CHECK-NEXT: Offset: 0x0000013D
+; CHECK-NEXT: Addend: 64
diff --git a/lld/wasm/InputChunks.cpp b/lld/wasm/InputChunks.cpp
index 0cac19b3d4e..1f11bde4a67 100644
--- a/lld/wasm/InputChunks.cpp
+++ b/lld/wasm/InputChunks.cpp
@@ -124,7 +124,7 @@ void InputChunk::writeRelocations(raw_ostream &OS) const {
case R_WEBASSEMBLY_MEMORY_ADDR_LEB:
case R_WEBASSEMBLY_MEMORY_ADDR_SLEB:
case R_WEBASSEMBLY_MEMORY_ADDR_I32:
- writeUleb128(OS, Rel.Addend, "reloc addend");
+ writeSleb128(OS, Rel.Addend, "reloc addend");
break;
}
}
OpenPOWER on IntegriCloud