summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/SymbolTable.cpp23
-rw-r--r--lld/ELF/SymbolTable.h5
-rw-r--r--lld/ELF/Writer.cpp10
3 files changed, 24 insertions, 14 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index d751e8b0916..5fb41a26bd5 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -127,9 +127,9 @@ template <class ELFT> bool SymbolTable<ELFT>::isUndefined(StringRef Name) {
// Returns a file from which symbol B was created.
// If B does not belong to any file in ObjectFiles, returns a nullptr.
template <class ELFT>
-static ELFFileBase<ELFT> *
-findFile(std::vector<std::unique_ptr<ObjectFile<ELFT>>> &ObjectFiles,
- SymbolBody *B) {
+ELFFileBase<ELFT> *
+elf2::findFile(ArrayRef<std::unique_ptr<ObjectFile<ELFT>>> ObjectFiles,
+ const SymbolBody *B) {
typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
typedef typename ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
@@ -144,8 +144,8 @@ findFile(std::vector<std::unique_ptr<ObjectFile<ELFT>>> &ObjectFiles,
template <class ELFT>
std::string SymbolTable<ELFT>::conflictMsg(SymbolBody *Old, SymbolBody *New) {
- ELFFileBase<ELFT> *OldFile = findFile(ObjectFiles, Old);
- ELFFileBase<ELFT> *NewFile = findFile(ObjectFiles, New);
+ ELFFileBase<ELFT> *OldFile = findFile<ELFT>(ObjectFiles, Old);
+ ELFFileBase<ELFT> *NewFile = findFile<ELFT>(ObjectFiles, New);
StringRef Sym = Old->getName();
StringRef F1 = OldFile ? OldFile->getName() : "(internal)";
@@ -257,3 +257,16 @@ template class lld::elf2::SymbolTable<ELF32LE>;
template class lld::elf2::SymbolTable<ELF32BE>;
template class lld::elf2::SymbolTable<ELF64LE>;
template class lld::elf2::SymbolTable<ELF64BE>;
+
+template ELFFileBase<ELF32LE> *
+lld::elf2::findFile(ArrayRef<std::unique_ptr<ObjectFile<ELF32LE>>>,
+ const SymbolBody *);
+template ELFFileBase<ELF32BE> *
+lld::elf2::findFile(ArrayRef<std::unique_ptr<ObjectFile<ELF32BE>>>,
+ const SymbolBody *);
+template ELFFileBase<ELF64LE> *
+lld::elf2::findFile(ArrayRef<std::unique_ptr<ObjectFile<ELF64LE>>>,
+ const SymbolBody *);
+template ELFFileBase<ELF64BE> *
+lld::elf2::findFile(ArrayRef<std::unique_ptr<ObjectFile<ELF64BE>>>,
+ const SymbolBody *);
diff --git a/lld/ELF/SymbolTable.h b/lld/ELF/SymbolTable.h
index 0b74efaca4d..1f50f1a21e3 100644
--- a/lld/ELF/SymbolTable.h
+++ b/lld/ELF/SymbolTable.h
@@ -87,6 +87,11 @@ private:
llvm::DenseSet<StringRef> IncludedSoNames;
};
+template <class ELFT>
+ELFFileBase<ELFT> *
+findFile(ArrayRef<std::unique_ptr<ObjectFile<ELFT>>> ObjectFiles,
+ const SymbolBody *B);
+
} // namespace elf2
} // namespace lld
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 6d932e60888..8d2a3d6d739 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -333,15 +333,7 @@ static void reportUndefined(const SymbolTable<ELFT> &S, const SymbolBody &Sym) {
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();
- }
-
+ ELFFileBase<ELFT> *SymFile = findFile<ELFT>(S.getObjectFiles(), &Sym);
std::string Message = "undefined symbol: " + Sym.getName().str();
if (SymFile)
Message += " in " + SymFile->getName().str();
OpenPOWER on IntegriCloud