diff options
-rw-r--r-- | lld/ELF/SymbolTable.cpp | 14 | ||||
-rw-r--r-- | lld/ELF/SymbolTable.h | 2 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 2 | ||||
-rw-r--r-- | lld/test/ELF/lto/duplicated.ll | 10 |
4 files changed, 21 insertions, 7 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index 473f7ab6c68..e844f71cdb3 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -217,18 +217,22 @@ template <class ELFT> void SymbolTable<ELFT>::wrap(StringRef Name) { // Returns a file from which symbol B was created. // If B does not belong to any file, returns a nullptr. -template <class ELFT> -ELFFileBase<ELFT> *SymbolTable<ELFT>::findFile(SymbolBody *B) { +template <class ELFT> InputFile *SymbolTable<ELFT>::findFile(SymbolBody *B) { for (const std::unique_ptr<ObjectFile<ELFT>> &F : ObjectFiles) { ArrayRef<SymbolBody *> Syms = F->getSymbols(); if (std::find(Syms.begin(), Syms.end(), B) != Syms.end()) return F.get(); } + for (const std::unique_ptr<BitcodeFile> &F : BitcodeFiles) { + ArrayRef<SymbolBody *> Syms = F->getSymbols(); + if (std::find(Syms.begin(), Syms.end(), B) != Syms.end()) + return F.get(); + } return nullptr; } // Returns "(internal)", "foo.a(bar.o)" or "baz.o". -template <class ELFT> static std::string getFilename(ELFFileBase<ELFT> *F) { +static std::string getFilename(InputFile *F) { if (!F) return "(internal)"; if (!F->ArchiveName.empty()) @@ -240,8 +244,8 @@ template <class ELFT> static std::string getFilename(ELFFileBase<ELFT> *F) { // Used to construct an error message. template <class ELFT> std::string SymbolTable<ELFT>::conflictMsg(SymbolBody *Old, SymbolBody *New) { - ELFFileBase<ELFT> *F1 = findFile(Old); - ELFFileBase<ELFT> *F2 = findFile(New); + InputFile *F1 = findFile(Old); + InputFile *F2 = findFile(New); StringRef Sym = Old->getName(); return demangle(Sym) + " in " + getFilename(F1) + " and " + getFilename(F2); } diff --git a/lld/ELF/SymbolTable.h b/lld/ELF/SymbolTable.h index 7b041545547..632e71bf36d 100644 --- a/lld/ELF/SymbolTable.h +++ b/lld/ELF/SymbolTable.h @@ -64,7 +64,7 @@ public: void scanShlibUndefined(); SymbolBody *find(StringRef Name); void wrap(StringRef Name); - ELFFileBase<ELFT> *findFile(SymbolBody *B); + InputFile *findFile(SymbolBody *B); private: Symbol *insert(SymbolBody *New); diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 661324bd1ce..a903f27cbbc 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -517,7 +517,7 @@ static void reportUndefined(SymbolTable<ELFT> &Symtab, SymbolBody *Sym) { return; std::string Msg = "undefined symbol: " + Sym->getName().str(); - if (ELFFileBase<ELFT> *File = Symtab.findFile(Sym)) + if (InputFile *File = Symtab.findFile(Sym)) Msg += " in " + File->getName().str(); if (Config->NoInhibitExec) warning(Msg); diff --git a/lld/test/ELF/lto/duplicated.ll b/lld/test/ELF/lto/duplicated.ll new file mode 100644 index 00000000000..6ef6772c5f2 --- /dev/null +++ b/lld/test/ELF/lto/duplicated.ll @@ -0,0 +1,10 @@ +; REQUIRES: x86 +; RUN: llvm-as %s -o %t.o +; RUN: not ld.lld -m elf_x86_64 %t.o %t.o -o %t.so -shared 2>&1 | FileCheck %s +; CHECK: duplicate symbol: f in {{.*}}.o and {{.*}}.o +target triple = "x86_64-unknown-linux-gnu" +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define void @f() { + ret void +} |