Index: ELF/InputFiles.cpp =================================================================== --- ELF/InputFiles.cpp +++ ELF/InputFiles.cpp @@ -694,8 +694,7 @@ } template -static Symbol *createBitcodeSymbol(DenseSet &KeptComdats, - DenseSet &ComdatGroups, +static Symbol *createBitcodeSymbol(const std::vector &KeptComdats, const lto::InputFile::Symbol &ObjSym, StringSaver &Saver, BitcodeFile *F) { StringRef NameRef = Saver.save(ObjSym.getName()); @@ -706,22 +705,10 @@ uint8_t Visibility = mapVisibility(ObjSym.getVisibility()); bool CanOmitFromDynSym = ObjSym.canBeOmittedFromSymbolTable(); - StringRef C = check(ObjSym.getComdat()); - if (!C.empty()) { - auto CH = CachedHashStringRef(C); - bool Keep = KeptComdats.count(CH); - if (!Keep) { - StringRef N = Saver.save(C); - CachedHashStringRef NH(N, CH.hash()); - if (ComdatGroups.insert(NH).second) { - Keep = true; - KeptComdats.insert(NH); - } - } - if (!Keep) - return Symtab::X->addUndefined(NameRef, Binding, Visibility, Type, - CanOmitFromDynSym, F); - } + int C = check(ObjSym.getComdatIndex()); + if (C != -1 && !KeptComdats[C]) + return Symtab::X->addUndefined(NameRef, Binding, Visibility, Type, + CanOmitFromDynSym, F); if (Flags & BasicSymbolRef::SF_Undefined) return Symtab::X->addUndefined(NameRef, Binding, Visibility, Type, @@ -750,10 +737,16 @@ Obj = check(lto::InputFile::create(MemoryBufferRef( MB.getBuffer(), Saver.save(ArchiveName + MB.getBufferIdentifier() + utostr(OffsetInArchive))))); - DenseSet KeptComdats; + + std::vector KeptComdats; + for (StringRef S : Obj->getComdatTable()) { + StringRef N = Saver.save(S); + KeptComdats.push_back(ComdatGroups.insert(CachedHashStringRef(N)).second); + } + for (const lto::InputFile::Symbol &ObjSym : Obj->symbols()) - Symbols.push_back(createBitcodeSymbol(KeptComdats, ComdatGroups, - ObjSym, Saver, this)); + Symbols.push_back( + createBitcodeSymbol(KeptComdats, ObjSym, Saver, this)); } template