diff options
| author | Sam Clegg <sbc@chromium.org> | 2019-03-28 02:02:07 +0000 |
|---|---|---|
| committer | Sam Clegg <sbc@chromium.org> | 2019-03-28 02:02:07 +0000 |
| commit | 0805ec5f7b5c80474352531a99e721c30e73e77f (patch) | |
| tree | 4687e8c852bd07c008e6b9317befa58a7d6916c2 /lld | |
| parent | 0a2d0c1f5ff018576681c5514846ad1963f7b1a2 (diff) | |
| download | bcm5719-llvm-0805ec5f7b5c80474352531a99e721c30e73e77f.tar.gz bcm5719-llvm-0805ec5f7b5c80474352531a99e721c30e73e77f.zip | |
[WebAssembly] Improve invalid relocation error message
This message now matches the equivalent message in the ELF linker.
Differential Revision: https://reviews.llvm.org/D59860
llvm-svn: 357143
Diffstat (limited to 'lld')
| -rw-r--r-- | lld/test/wasm/undefined-data.ll | 2 | ||||
| -rw-r--r-- | lld/wasm/InputChunks.cpp | 2 | ||||
| -rw-r--r-- | lld/wasm/InputChunks.h | 2 | ||||
| -rw-r--r-- | lld/wasm/Writer.cpp | 29 |
4 files changed, 21 insertions, 14 deletions
diff --git a/lld/test/wasm/undefined-data.ll b/lld/test/wasm/undefined-data.ll index 8063d333efa..21691bc3cfc 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 5d6dfa0d989..15e57a8e4c2 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::reloctTypeToString(uint8_t RelocType) { switch (RelocType) { #define WASM_RELOC(NAME, REL) \ case REL: \ diff --git a/lld/wasm/InputChunks.h b/lld/wasm/InputChunks.h index 20b8f01f61a..8f0999abac6 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 reloctTypeToString(uint8_t RelocType); + } // namespace lld #endif // LLD_WASM_INPUT_CHUNKS_H diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp index 480257f18bd..4697540e5e5 100644 --- a/lld/wasm/Writer.cpp +++ b/lld/wasm/Writer.cpp @@ -1141,18 +1141,6 @@ void Writer::processRelocations(InputChunk *Chunk) { File->TypeMap[Reloc.Index] = registerType(Types[Reloc.Index]); File->TypeIsUsed[Reloc.Index] = true; break; - 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<DefinedData>(DataSym) && - !DataSym->isWeak()) - error(File->getName() + - ": relocation of type R_WASM_MEMORY_ADDR_* " - "against undefined data symbol: " + - DataSym->getName()); - break; - } case R_WASM_GLOBAL_INDEX_LEB: { auto* Sym = File->getSymbols()[Reloc.Index]; if (!isa<GlobalSymbol>(Sym) && !Sym->isInGOT()) { @@ -1161,6 +1149,23 @@ void Writer::processRelocations(InputChunk *Chunk) { } } } + + if (!Config->Relocatable) { + switch (Reloc.Type) { + // These relocations types appear the code section. + // They should never appear in code compiled with -fPIC. + case R_WASM_TABLE_INDEX_SLEB: + case R_WASM_MEMORY_ADDR_I32: + case R_WASM_MEMORY_ADDR_LEB: { + auto *Sym = File->getSymbols()[Reloc.Index]; + if (Sym->isUndefined() && !Sym->isWeak()) + error(File->getName() + ": relocation " + + reloctTypeToString(Reloc.Type) + + " cannot be used againt symbol " + Sym->getName() + + "; recompile with -fPIC"); + } + } + } } } |

