diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -1502,9 +1502,8 @@ LTO->add(*File); for (InputFile *File : LTO->compile()) { - DenseMap DummyGroups; auto *Obj = cast>(File); - Obj->parse(DummyGroups); + Obj->parse(/*IgnoreComdats*/ true); for (Symbol *Sym : Obj->getGlobalSymbols()) Sym->parseSymbolVersion(); ObjectFiles.push_back(File); diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h --- a/lld/ELF/InputFiles.h +++ b/lld/ELF/InputFiles.h @@ -201,8 +201,7 @@ this->ArchiveName = ArchiveName; } - void parse(llvm::DenseMap - &ComdatGroups); + void parse(bool IgnoreComdats = false); StringRef getShtGroupSignature(ArrayRef Sections, const Elf_Shdr &Sec); @@ -248,8 +247,7 @@ ArrayRef CGProfile; private: - void initializeSections(llvm::DenseMap &ComdatGroups); + void initializeSections(bool IgnoreComdats); void initializeSymbols(); void initializeJustSymbols(); void initializeDwarf(); @@ -339,8 +337,7 @@ uint64_t OffsetInArchive); static bool classof(const InputFile *F) { return F->kind() == BitcodeKind; } template - void parse(llvm::DenseMap - &ComdatGroups); + void parse(); std::unique_ptr Obj; }; diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -176,13 +176,13 @@ // LLVM bitcode file if (auto *F = dyn_cast(File)) { BitcodeFiles.push_back(F); - F->parse(Symtab->ComdatGroups); + F->parse(); return; } // Regular object file ObjectFiles.push_back(File); - cast>(File)->parse(Symtab->ComdatGroups); + cast>(File)->parse(); } // Add symbols in File to the symbol table. @@ -448,13 +448,12 @@ } template -void ObjFile::parse( - DenseMap &ComdatGroups) { +void ObjFile::parse(bool IgnoreComdats) { // Read a section table. JustSymbols is usually false. if (this->JustSymbols) initializeJustSymbols(); else - initializeSections(ComdatGroups); + initializeSections(IgnoreComdats); // Read a symbol table. initializeSymbols(); @@ -562,8 +561,7 @@ } template -void ObjFile::initializeSections( - DenseMap &ComdatGroups) { +void ObjFile::initializeSections(bool IgnoreComdats) { const ELFFile &Obj = this->getObj(); ArrayRef ObjSections = CHECK(Obj.sections(), this); @@ -622,8 +620,7 @@ if (Entries[0] != GRP_COMDAT) fatal(toString(this) + ": unsupported SHT_GROUP format"); - bool IsNew = - ComdatGroups.try_emplace(CachedHashStringRef(Signature), this).second; + bool IsNew = IgnoreComdats || Symtab->ComdatGroups.try_emplace(CachedHashStringRef(Signature), this).second; if (IsNew) { if (Config->Relocatable) this->Sections[I] = createInputSection(Sec); @@ -1400,12 +1397,11 @@ } template -void BitcodeFile::parse( - DenseMap &ComdatGroups) { +void BitcodeFile::parse() { std::vector KeptComdats; for (StringRef S : Obj->getComdatTable()) KeptComdats.push_back( - ComdatGroups.try_emplace(CachedHashStringRef(S), this).second); + Symtab->ComdatGroups.try_emplace(CachedHashStringRef(S), this).second); for (const lto::InputFile::Symbol &ObjSym : Obj->symbols()) Symbols.push_back(createBitcodeSymbol(KeptComdats, ObjSym, *this)); @@ -1538,14 +1534,10 @@ return Path; } -template void -BitcodeFile::parse(DenseMap &); -template void -BitcodeFile::parse(DenseMap &); -template void -BitcodeFile::parse(DenseMap &); -template void -BitcodeFile::parse(DenseMap &); +template void BitcodeFile::parse(); +template void BitcodeFile::parse(); +template void BitcodeFile::parse(); +template void BitcodeFile::parse(); template void LazyObjFile::parse(); template void LazyObjFile::parse(); diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -306,11 +306,10 @@ TypeIsUsed.resize(getWasmObj()->types().size(), false); ArrayRef Comdats = WasmObj->linkingData().Comdats; - for (unsigned I = 0; I < Comdats.size(); ++I) - if (IgnoreComdats) - KeptComdats.push_back(true); - else - KeptComdats.push_back(Symtab->addComdat(Comdats[I])); + for (unsigned I = 0; I < Comdats.size(); ++I) { + bool IsNew = IgnoreComdats || Symtab->addComdat(Comdats[I]); + KeptComdats.push_back(IsNew); + } // Populate `Segments`. for (const WasmSegment &S : WasmObj->dataSegments()) @@ -535,10 +534,7 @@ } std::vector KeptComdats; for (StringRef S : Obj->getComdatTable()) - if (IgnoreComdats) - KeptComdats.push_back(true); - else - KeptComdats.push_back(Symtab->addComdat(S)); + KeptComdats.push_back(Symtab->addComdat(S)); for (const lto::InputFile::Symbol &ObjSym : Obj->symbols()) Symbols.push_back(createBitcodeSymbol(KeptComdats, ObjSym, *this));