[lld] r315558 - Move more code out of scanRelocs().
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 11 21:52:39 PDT 2017
Author: ruiu
Date: Wed Oct 11 21:52:39 2017
New Revision: 315558
URL: http://llvm.org/viewvc/llvm-project?rev=315558&view=rev
Log:
Move more code out of scanRelocs().
Modified:
lld/trunk/ELF/Relocations.cpp
Modified: lld/trunk/ELF/Relocations.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=315558&r1=315557&r2=315558&view=diff
==============================================================================
--- lld/trunk/ELF/Relocations.cpp (original)
+++ lld/trunk/ELF/Relocations.cpp Wed Oct 11 21:52:39 2017
@@ -696,29 +696,38 @@ static int64_t computeMipsAddend(const R
return 0;
}
+// Report an undefined symbol if necessary.
+// Returns true if this function printed out an error message.
template <class ELFT>
-static void reportUndefined(SymbolBody &Sym, InputSectionBase &S,
- uint64_t Offset) {
+static bool maybeReportUndefined(SymbolBody &Sym, InputSectionBase &Sec,
+ uint64_t Offset) {
if (Config->UnresolvedSymbols == UnresolvedPolicy::IgnoreAll)
- return;
+ return false;
+
+ if (Sym.isLocal() || !Sym.isUndefined() || Sym.symbol()->isWeak())
+ return false;
bool CanBeExternal = Sym.symbol()->computeBinding() != STB_LOCAL &&
Sym.getVisibility() == STV_DEFAULT;
if (Config->UnresolvedSymbols == UnresolvedPolicy::Ignore && CanBeExternal)
- return;
+ return false;
std::string Msg =
"undefined symbol: " + toString(Sym) + "\n>>> referenced by ";
- std::string Src = S.getSrcMsg<ELFT>(Offset);
+ std::string Src = Sec.getSrcMsg<ELFT>(Offset);
if (!Src.empty())
Msg += Src + "\n>>> ";
- Msg += S.getObjMsg<ELFT>(Offset);
+ Msg += Sec.getObjMsg<ELFT>(Offset);
- if (Config->UnresolvedSymbols == UnresolvedPolicy::Warn && CanBeExternal)
+ if ((Config->UnresolvedSymbols == UnresolvedPolicy::Warn && CanBeExternal) ||
+ Config->NoinhibitExec) {
warn(Msg);
- else
- errorOrWarn(Msg);
+ return false;
+ }
+
+ error(Msg);
+ return true;
}
// MIPS N32 ABI treats series of successive relocations with the same offset
@@ -848,17 +857,9 @@ static void scanRelocs(InputSectionBase
if (Offset == uint64_t(-1))
continue;
- // Report undefined symbols. The fact that we report undefined
- // symbols here means that we report undefined symbols only when
- // they have relocations pointing to them. We don't care about
- // undefined symbols that are in dead-stripped sections.
- if (!Body.isLocal() && Body.isUndefined() && !Body.symbol()->isWeak()) {
- reportUndefined<ELFT>(Body, Sec, Rel.r_offset);
-
- // If we report an undefined, and we have an error, go on.
- if (ErrorCount)
- continue;
- }
+ // Skip if the target symbol is an erroneous undefined symbol.
+ if (maybeReportUndefined<ELFT>(Body, Sec, Rel.r_offset))
+ continue;
RelExpr Expr =
Target->getRelExpr(Type, Body, Sec.Data.begin() + Rel.r_offset);
More information about the llvm-commits
mailing list