StringMap<std::vector<SymbolBody *>> &SymbolTable<ELFT>::getDemangledSyms() { if (!DemangledSyms) { DemangledSyms.emplace(); for (Symbol *Sym : SymVector) { SymbolBody *B = Sym->body(); if (B->isUndefined()) continue; if (Optional<std::string> S = demangle(B->getName())) (*DemangledSyms)[*S].push_back(B); else (*DemangledSyms)[B->getName()].push_back(B); } } return *DemangledSyms; }
std::map<std::string, SymbolBody *> SymbolTable<ELFT>::getDemangledSyms() { std::map<std::string, SymbolBody *> Result; for (Symbol *Sym : SymVector) { SymbolBody *B = Sym->body(); Result[demangle(B->getName())] = B; } return Result; }
std::vector<SymbolBody *> SymbolTable<ELFT>::findAll(StringRef Pattern) { std::vector<SymbolBody *> Res; for (Symbol *Sym : SymVector) { SymbolBody *B = Sym->body(); if (!B->isUndefined() && globMatch(Pattern, B->getName())) Res.push_back(B); } return Res; }
// Print out a log message for --trace-symbol. void elf::printTraceSymbol(Symbol *Sym) { SymbolBody *B = Sym->body(); outs() << getFilename(B->File); if (B->isUndefined()) outs() << ": reference to "; else if (B->isCommon()) outs() << ": common definition of "; else outs() << ": definition of "; outs() << B->getName() << "\n"; }
std::vector<SymbolBody *> SymbolTable<ELFT>::findAllByVersion(SymbolVersion Ver) { std::vector<SymbolBody *> Res; StringMatcher M(Ver.Name); if (Ver.IsExternCpp) { for (auto &P : getDemangledSyms()) if (M.match(P.first())) Res.insert(Res.end(), P.second.begin(), P.second.end()); return Res; } for (Symbol *Sym : SymVector) { SymbolBody *B = Sym->body(); if (!B->isUndefined() && M.match(B->getName())) Res.push_back(B); } return Res; }
static void reportUndefined(const SymbolTable<ELFT> &S, const SymbolBody &Sym) { typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym; typedef typename ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range; if (Config->Shared && !Config->NoUndefined) return; const Elf_Sym &SymE = cast<ELFSymbolBody<ELFT>>(Sym).Sym; ELFFileBase<ELFT> *SymFile = nullptr; for (const std::unique_ptr<ObjectFile<ELFT>> &File : S.getObjectFiles()) { Elf_Sym_Range Syms = File->getObj().symbols(File->getSymbolTable()); if (&SymE > Syms.begin() && &SymE < Syms.end()) SymFile = File.get(); } std::string Message = "undefined symbol: " + Sym.getName().str(); if (SymFile) Message += " in " + SymFile->getName().str(); if (Config->NoInhibitExec) warning(Message); else error(Message); }
// Returns a symbol for an error message. std::string lld::toString(const SymbolBody &B) { if (Config->Demangle) if (Optional<std::string> S = demangle(B.getName())) return *S; return B.getName(); }