[ELF] Linkerscript: print location of undefined symbol usage
Differential revision: https://reviews.llvm.org/D27194
llvm-svn: 290339
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index e4b1e55..925c9fa 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -901,10 +901,11 @@
return elf::getHeaderSize<ELFT>();
}
-template <class ELFT> uint64_t LinkerScript<ELFT>::getSymbolValue(StringRef S) {
+template <class ELFT>
+uint64_t LinkerScript<ELFT>::getSymbolValue(const Twine &Loc, StringRef S) {
if (SymbolBody *B = Symtab<ELFT>::X->find(S))
return B->getVA<ELFT>();
- error("symbol not found: " + S);
+ error(Loc + ": symbol not found: " + S);
return 0;
}
@@ -1523,10 +1524,10 @@
return Cmd;
}
-static uint64_t getSymbolValue(StringRef S, uint64_t Dot) {
+static uint64_t getSymbolValue(const Twine &Loc, StringRef S, uint64_t Dot) {
if (S == ".")
return Dot;
- return ScriptBase->getSymbolValue(S);
+ return ScriptBase->getSymbolValue(Loc, S);
}
static bool isAbsolute(StringRef S) {
@@ -1547,8 +1548,12 @@
} else {
E = readExpr();
}
- if (Op == "+=")
- E = [=](uint64_t Dot) { return getSymbolValue(Name, Dot) + E(Dot); };
+ if (Op == "+=") {
+ std::string Loc = getCurrentLocation();
+ E = [=](uint64_t Dot) {
+ return getSymbolValue(Loc, Name, Dot) + E(Dot);
+ };
+ }
return new SymbolAssignment(Name, E);
}
@@ -1800,7 +1805,7 @@
// Tok is a symbol name.
if (Tok != "." && !isValidCIdentifier(Tok))
setError("malformed number: " + Tok);
- return {[=](uint64_t Dot) { return getSymbolValue(Tok, Dot); },
+ return {[=](uint64_t Dot) { return getSymbolValue(Location, Tok, Dot); },
[=] { return isAbsolute(Tok); },
[=] { return ScriptBase->getSymbolSection(Tok); }};
}