diff options
| -rw-r--r-- | lld/ELF/InputFiles.cpp | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 9c88d5f3fd9..af0f30a427d 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -693,7 +693,8 @@ static uint8_t mapVisibility(GlobalValue::VisibilityTypes GvVisibility) { } template <class ELFT> -static Symbol *createBitcodeSymbol(const DenseSet<StringRef> &KeptComdats, +static Symbol *createBitcodeSymbol(DenseSet<StringRef> &KeptComdats, + DenseSet<StringRef> &ComdatGroups, const lto::InputFile::Symbol &ObjSym, StringSaver &Saver, BitcodeFile *F) { StringRef NameRef = Saver.save(ObjSym.getName()); @@ -705,9 +706,19 @@ static Symbol *createBitcodeSymbol(const DenseSet<StringRef> &KeptComdats, bool CanOmitFromDynSym = ObjSym.canBeOmittedFromSymbolTable(); StringRef C = check(ObjSym.getComdat()); - if (!C.empty() && !KeptComdats.count(C)) - return Symtab<ELFT>::X->addUndefined(NameRef, Binding, Visibility, Type, - CanOmitFromDynSym, F); + if (!C.empty()) { + bool Keep = KeptComdats.count(C); + if (!Keep) { + StringRef N = Saver.save(C); + if (ComdatGroups.insert(N).second) { + Keep = true; + KeptComdats.insert(C); + } + } + if (!Keep) + return Symtab<ELFT>::X->addUndefined(NameRef, Binding, Visibility, Type, + CanOmitFromDynSym, F); +} if (Flags & BasicSymbolRef::SF_Undefined) return Symtab<ELFT>::X->addUndefined(NameRef, Binding, Visibility, Type, @@ -737,15 +748,9 @@ void BitcodeFile::parse(DenseSet<StringRef> &ComdatGroups) { MB.getBuffer(), Saver.save(ArchiveName + MB.getBufferIdentifier() + utostr(OffsetInArchive))))); DenseSet<StringRef> KeptComdats; - for (const auto &P : Obj->getComdatSymbolTable()) { - StringRef N = Saver.save(P.first()); - if (ComdatGroups.insert(N).second) - KeptComdats.insert(N); - } - for (const lto::InputFile::Symbol &ObjSym : Obj->symbols()) - Symbols.push_back( - createBitcodeSymbol<ELFT>(KeptComdats, ObjSym, Saver, this)); + Symbols.push_back(createBitcodeSymbol<ELFT>(KeptComdats, ComdatGroups, + ObjSym, Saver, this)); } template <template <class> class T> |

