diff --git a/lld/test/wasm/merge-string.s b/lld/test/wasm/merge-string.s --- a/lld/test/wasm/merge-string.s +++ b/lld/test/wasm/merge-string.s @@ -14,6 +14,11 @@ .asciz "bc" .size bar, 4 + .section .rodata_relocs,"",@ +negative_addend: + .int32 foo-10 + .size negative_addend, 4 + .globl foo .globl bar .export_name foo, foo diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -185,7 +185,7 @@ if (D->segment && D->segment->outputSeg->isTLS()) return D->getOutputSegmentOffset() + reloc.Addend; - uint64_t value = D->getVA(reloc.Addend); + uint64_t value = D->getVA() + reloc.Addend; if (reloc.Type == R_WASM_MEMORY_ADDR_LOCREL_I32) { const auto *segment = cast(chunk); uint64_t p = segment->outputSeg->startVA + segment->outputSegmentOffset + diff --git a/lld/wasm/Symbols.h b/lld/wasm/Symbols.h --- a/lld/wasm/Symbols.h +++ b/lld/wasm/Symbols.h @@ -290,7 +290,7 @@ static bool classof(const Symbol *s) { return s->kind() == DefinedDataKind; } // Returns the output virtual address of a defined data symbol. - uint64_t getVA(uint64_t addend = 0) const; + uint64_t getVA() const; void setVA(uint64_t va); // Returns the offset of a defined data symbol within its OutputSegment. diff --git a/lld/wasm/Symbols.cpp b/lld/wasm/Symbols.cpp --- a/lld/wasm/Symbols.cpp +++ b/lld/wasm/Symbols.cpp @@ -286,10 +286,9 @@ function ? &function->signature : nullptr), function(function) {} -uint64_t DefinedData::getVA(uint64_t addend) const { - LLVM_DEBUG(dbgs() << "getVA: " << getName() << "\n"); +uint64_t DefinedData::getVA() const { if (segment) - return segment->getVA(value + addend); + return segment->getVA(value); return value; }