From e3a845e25ecc541f37dac31c7f2d6c5e7eb5c310 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Fri, 29 Mar 2019 22:56:39 +0000 Subject: [PATCH] Re-land "[WebAssembly] Improve invalid relocation error message"" See https://reviews.llvm.org/D59860 The initial version of this change effected more than just the error message. This version is scoped down to only effect the error itself. llvm-svn: 357328 --- lld/test/wasm/undefined-data.ll | 2 +- lld/wasm/InputChunks.cpp | 6 +++--- lld/wasm/InputChunks.h | 2 ++ lld/wasm/Writer.cpp | 13 ++++++------- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lld/test/wasm/undefined-data.ll b/lld/test/wasm/undefined-data.ll index 8063d333efae..21691bc3cfc1 100644 --- a/lld/test/wasm/undefined-data.ll +++ b/lld/test/wasm/undefined-data.ll @@ -13,4 +13,4 @@ entry: } ; UNDEF: undefined symbol: data_external -; BADRELOC: undefined-data.ll.tmp.o: relocation of type R_WASM_MEMORY_ADDR_* against undefined data symbol: data_external +; BADRELOC: undefined-data.ll.tmp.o: relocation R_WASM_MEMORY_ADDR_LEB cannot be used againt symbol data_external; recompile with -fPIC diff --git a/lld/wasm/InputChunks.cpp b/lld/wasm/InputChunks.cpp index 5d6dfa0d989e..32157d3e8f2c 100644 --- a/lld/wasm/InputChunks.cpp +++ b/lld/wasm/InputChunks.cpp @@ -22,7 +22,7 @@ using namespace llvm::support::endian; using namespace lld; using namespace lld::wasm; -static StringRef reloctTypeToString(uint8_t RelocType) { +StringRef lld::relocTypeToString(uint8_t RelocType) { switch (RelocType) { #define WASM_RELOC(NAME, REL) \ case REL: \ @@ -78,7 +78,7 @@ void InputChunk::verifyRelocTargets() const { if (Rel.Type != R_WASM_GLOBAL_INDEX_LEB) { uint32_t ExpectedValue = File->calcExpectedValue(Rel); if (ExpectedValue != ExistingValue) - warn("unexpected existing value for " + reloctTypeToString(Rel.Type) + + warn("unexpected existing value for " + relocTypeToString(Rel.Type) + ": existing=" + Twine(ExistingValue) + " expected=" + Twine(ExpectedValue)); } @@ -105,7 +105,7 @@ void InputChunk::writeTo(uint8_t *Buf) const { for (const WasmRelocation &Rel : Relocations) { uint8_t *Loc = Buf + Rel.Offset + Off; uint32_t Value = File->calcNewValue(Rel); - LLVM_DEBUG(dbgs() << "apply reloc: type=" << reloctTypeToString(Rel.Type) + LLVM_DEBUG(dbgs() << "apply reloc: type=" << relocTypeToString(Rel.Type) << " addend=" << Rel.Addend << " index=" << Rel.Index << " value=" << Value << " offset=" << Rel.Offset << "\n"); diff --git a/lld/wasm/InputChunks.h b/lld/wasm/InputChunks.h index 20b8f01f61a6..04957cf1feec 100644 --- a/lld/wasm/InputChunks.h +++ b/lld/wasm/InputChunks.h @@ -218,6 +218,8 @@ protected: } // namespace wasm std::string toString(const wasm::InputChunk *); +StringRef relocTypeToString(uint8_t RelocType); + } // namespace lld #endif // LLD_WASM_INPUT_CHUNKS_H diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp index 50dc76f8e41b..8da52f532dc5 100644 --- a/lld/wasm/Writer.cpp +++ b/lld/wasm/Writer.cpp @@ -1152,13 +1152,12 @@ void Writer::processRelocations(InputChunk *Chunk) { case R_WASM_MEMORY_ADDR_SLEB: case R_WASM_MEMORY_ADDR_I32: case R_WASM_MEMORY_ADDR_LEB: { - DataSymbol *DataSym = File->getDataSymbol(Reloc.Index); - if (!Config->Relocatable && !isa(DataSym) && - !DataSym->isWeak()) - error(File->getName() + - ": relocation of type R_WASM_MEMORY_ADDR_* " - "against undefined data symbol: " + - DataSym->getName()); + DataSymbol *Sym = File->getDataSymbol(Reloc.Index); + if (!Config->Relocatable && !isa(Sym) && !Sym->isWeak()) + error(File->getName() + ": relocation " + + relocTypeToString(Reloc.Type) + " cannot be used againt symbol " + + Sym->getName() + "; recompile with -fPIC"); + break; } case R_WASM_GLOBAL_INDEX_LEB: {