diff options
Diffstat (limited to 'lld/ELF/Relocations.cpp')
-rw-r--r-- | lld/ELF/Relocations.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index c5aa801dee7..c57585e187e 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -714,12 +714,19 @@ static bool canSuggestExternCForCXX(StringRef ref, StringRef def) { // Suggest an alternative spelling of an "undefined symbol" diagnostic. Returns // the suggested symbol, which is either in the symbol table, or in the same // file of sym. +template <class ELFT> static const Symbol *getAlternativeSpelling(const Undefined &sym, std::string &pre_hint, std::string &post_hint) { - // Build a map of local defined symbols. DenseMap<StringRef, const Symbol *> map; - if (sym.file && !isa<SharedFile>(sym.file)) { + if (auto *file = dyn_cast_or_null<ObjFile<ELFT>>(sym.file)) { + // If sym is a symbol defined in a discarded section, maybeReportDiscarded() + // will give an error. Don't suggest an alternative spelling. + if (file && sym.discardedSecIdx != 0 && + file->getSections()[sym.discardedSecIdx] == &InputSection::discarded) + return nullptr; + + // Build a map of local defined symbols. for (const Symbol *s : sym.file->getSymbols()) if (s->isLocal() && s->isDefined()) map.try_emplace(s->getName(), s); @@ -865,8 +872,8 @@ static void reportUndefinedSymbol(const UndefinedDiag &undef, if (correctSpelling) { std::string pre_hint = ": ", post_hint; - if (const Symbol *corrected = - getAlternativeSpelling(cast<Undefined>(sym), pre_hint, post_hint)) { + if (const Symbol *corrected = getAlternativeSpelling<ELFT>( + cast<Undefined>(sym), pre_hint, post_hint)) { msg += "\n>>> did you mean" + pre_hint + toString(*corrected) + post_hint; if (corrected->file) msg += "\n>>> defined in: " + toString(corrected->file); |