From 00ee5edc0de59ad90623144730252b3ffc276946 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 17 Oct 2016 19:25:08 +0000 Subject: [PATCH] Avoid using getComdatSymbolTable. This is not particularly efficient, but does avoid exposing Comdat* out of LTO.h. I will send a patch for review with a more efficient interface that should map nicely to a bitcode symbol table. llvm-svn: 284413 --- lld/ELF/InputFiles.cpp | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 9c88d5f..af0f30a 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -693,7 +693,8 @@ static uint8_t mapVisibility(GlobalValue::VisibilityTypes GvVisibility) { } template -static Symbol *createBitcodeSymbol(const DenseSet &KeptComdats, +static Symbol *createBitcodeSymbol(DenseSet &KeptComdats, + DenseSet &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 &KeptComdats, bool CanOmitFromDynSym = ObjSym.canBeOmittedFromSymbolTable(); StringRef C = check(ObjSym.getComdat()); - if (!C.empty() && !KeptComdats.count(C)) - return Symtab::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::X->addUndefined(NameRef, Binding, Visibility, Type, + CanOmitFromDynSym, F); +} if (Flags & BasicSymbolRef::SF_Undefined) return Symtab::X->addUndefined(NameRef, Binding, Visibility, Type, @@ -737,15 +748,9 @@ void BitcodeFile::parse(DenseSet &ComdatGroups) { MB.getBuffer(), Saver.save(ArchiveName + MB.getBufferIdentifier() + utostr(OffsetInArchive))))); DenseSet 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(KeptComdats, ObjSym, Saver, this)); + Symbols.push_back(createBitcodeSymbol(KeptComdats, ComdatGroups, + ObjSym, Saver, this)); } template