diff options
-rw-r--r-- | lld/test/wasm/reloc-addend.ll | 19 | ||||
-rw-r--r-- | lld/wasm/InputChunks.cpp | 2 |
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; } } |