Move more code out of scanRelocs().

llvm-svn: 315558
This commit is contained in:
Rui Ueyama 2017-10-12 04:52:39 +00:00
parent 9ea7fbd1e8
commit b518f655c3
1 changed files with 21 additions and 20 deletions

View File

@ -696,29 +696,38 @@ static int64_t computeMipsAddend(const RelTy &Rel, InputSectionBase &Sec,
return 0; return 0;
} }
// Report an undefined symbol if necessary.
// Returns true if this function printed out an error message.
template <class ELFT> template <class ELFT>
static void reportUndefined(SymbolBody &Sym, InputSectionBase &S, static bool maybeReportUndefined(SymbolBody &Sym, InputSectionBase &Sec,
uint64_t Offset) { uint64_t Offset) {
if (Config->UnresolvedSymbols == UnresolvedPolicy::IgnoreAll) 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 && bool CanBeExternal = Sym.symbol()->computeBinding() != STB_LOCAL &&
Sym.getVisibility() == STV_DEFAULT; Sym.getVisibility() == STV_DEFAULT;
if (Config->UnresolvedSymbols == UnresolvedPolicy::Ignore && CanBeExternal) if (Config->UnresolvedSymbols == UnresolvedPolicy::Ignore && CanBeExternal)
return; return false;
std::string Msg = std::string Msg =
"undefined symbol: " + toString(Sym) + "\n>>> referenced by "; "undefined symbol: " + toString(Sym) + "\n>>> referenced by ";
std::string Src = S.getSrcMsg<ELFT>(Offset); std::string Src = Sec.getSrcMsg<ELFT>(Offset);
if (!Src.empty()) if (!Src.empty())
Msg += Src + "\n>>> "; 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); warn(Msg);
else return false;
errorOrWarn(Msg); }
error(Msg);
return true;
} }
// MIPS N32 ABI treats series of successive relocations with the same offset // MIPS N32 ABI treats series of successive relocations with the same offset
@ -848,17 +857,9 @@ static void scanRelocs(InputSectionBase &Sec, ArrayRef<RelTy> Rels) {
if (Offset == uint64_t(-1)) if (Offset == uint64_t(-1))
continue; continue;
// Report undefined symbols. The fact that we report undefined // Skip if the target symbol is an erroneous undefined symbol.
// symbols here means that we report undefined symbols only when if (maybeReportUndefined<ELFT>(Body, Sec, Rel.r_offset))
// they have relocations pointing to them. We don't care about continue;
// 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;
}
RelExpr Expr = RelExpr Expr =
Target->getRelExpr(Type, Body, Sec.Data.begin() + Rel.r_offset); Target->getRelExpr(Type, Body, Sec.Data.begin() + Rel.r_offset);