Re-land "[WebAssembly] Improve invalid relocation error message""
authorSam Clegg <sbc@chromium.org>
Fri, 29 Mar 2019 22:56:39 +0000 (22:56 +0000)
committerSam Clegg <sbc@chromium.org>
Fri, 29 Mar 2019 22:56:39 +0000 (22:56 +0000)
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
lld/wasm/InputChunks.cpp
lld/wasm/InputChunks.h
lld/wasm/Writer.cpp

index 8063d33..21691bc 100644 (file)
@@ -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
index 5d6dfa0..32157d3 100644 (file)
@@ -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");
index 20b8f01..04957cf 100644 (file)
@@ -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
index 50dc76f..8da52f5 100644 (file)
@@ -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<DefinedData>(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<DefinedData>(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: {