summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/InputFiles.cpp29
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>
OpenPOWER on IntegriCloud