From b518f655c3b48708931586549bb66cc2df29b7aa Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Thu, 12 Oct 2017 04:52:39 +0000 Subject: [PATCH] Move more code out of scanRelocs(). llvm-svn: 315558 --- lld/ELF/Relocations.cpp | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index 1ce9e76f5e08..97bce7c17442 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -696,29 +696,38 @@ static int64_t computeMipsAddend(const RelTy &Rel, InputSectionBase &Sec, return 0; } +// Report an undefined symbol if necessary. +// Returns true if this function printed out an error message. template -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(Offset); + std::string Src = Sec.getSrcMsg(Offset); if (!Src.empty()) Msg += Src + "\n>>> "; - Msg += S.getObjMsg(Offset); + Msg += Sec.getObjMsg(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 &Sec, ArrayRef Rels) { 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(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(Body, Sec, Rel.r_offset)) + continue; RelExpr Expr = Target->getRelExpr(Type, Body, Sec.Data.begin() + Rel.r_offset);