Handle comdat in LTO.

llvm-svn: 262489
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 78abcf9..8b8cf02 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -13,6 +13,7 @@
 #include "Symbols.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Module.h"
 #include "llvm/Object/IRObjectFile.h"
 #include "llvm/Support/raw_ostream.h"
 
@@ -441,13 +442,27 @@
   return F->kind() == BitcodeKind;
 }
 
-void BitcodeFile::parse() {
+void BitcodeFile::parse(DenseSet<StringRef> &ComdatGroups) {
   LLVMContext Context;
   ErrorOr<std::unique_ptr<IRObjectFile>> ObjOrErr =
       IRObjectFile::create(MB, Context);
   fatal(ObjOrErr);
   IRObjectFile &Obj = **ObjOrErr;
+  const Module &M = Obj.getModule();
+
+  DenseSet<const Comdat *> KeptComdats;
+  for (const auto &P : M.getComdatSymbolTable()) {
+    StringRef N = Saver.save(P.first());
+    if (ComdatGroups.insert(N).second)
+      KeptComdats.insert(&P.second);
+  }
+
   for (const BasicSymbolRef &Sym : Obj.symbols()) {
+    if (const GlobalValue *GV = Obj.getSymbolGV(Sym.getRawDataRefImpl()))
+      if (const Comdat *C = GV->getComdat())
+        if (!KeptComdats.count(C))
+          continue;
+
     SmallString<64> Name;
     raw_svector_ostream OS(Name);
     Sym.printName(OS);