diff options
-rw-r--r-- | llvm/include/llvm/LTO/LTO.h | 3 | ||||
-rw-r--r-- | llvm/lib/LTO/LTO.cpp | 24 |
2 files changed, 12 insertions, 15 deletions
diff --git a/llvm/include/llvm/LTO/LTO.h b/llvm/include/llvm/LTO/LTO.h index 2a2b5984728..af1ef6014c8 100644 --- a/llvm/include/llvm/LTO/LTO.h +++ b/llvm/include/llvm/LTO/LTO.h @@ -320,6 +320,9 @@ private: bool UnnamedAddr = true; + /// True if IR contains the prevailing definition. + bool Prevailing = false; + /// This field keeps track of the partition number of this global. The /// regular LTO object is partition 0, while each ThinLTO object has its own /// partition number from 1 onwards. diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp index ccbd065f4c3..98567fb6202 100644 --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -419,8 +419,9 @@ void LTO::addModuleToGlobalRes(ArrayRef<InputFile::Symbol> Syms, auto &GlobalRes = GlobalResolutions[Sym.getName()]; GlobalRes.UnnamedAddr &= Sym.isUnnamedAddr(); if (Res.Prevailing) { - assert(GlobalRes.IRName.empty() && + assert(!GlobalRes.Prevailing && "Multiple prevailing defs are not allowed"); + GlobalRes.Prevailing = true; GlobalRes.IRName = Sym.getIRName(); } @@ -746,14 +747,10 @@ unsigned LTO::getMaxTasks() const { Error LTO::run(AddStreamFn AddStream, NativeObjectCache Cache) { // Compute "dead" symbols, we don't want to import/export these! DenseSet<GlobalValue::GUID> GUIDPreservedSymbols; - for (auto &Res : GlobalResolutions) { - if (Res.second.VisibleOutsideSummary && - // IRName will be defined if we have seen the prevailing copy of - // this value. If not, no need to preserve any ThinLTO copies. - !Res.second.IRName.empty()) + for (auto &Res : GlobalResolutions) + if (Res.second.VisibleOutsideSummary && Res.second.Prevailing) GUIDPreservedSymbols.insert(GlobalValue::getGUID( GlobalValue::dropLLVMManglingEscape(Res.second.IRName))); - } computeDeadSymbols(ThinLTO.CombinedIndex, GUIDPreservedSymbols); @@ -803,7 +800,7 @@ Error LTO::runRegularLTO(AddStreamFn AddStream) { if (!Conf.CodeGenOnly) { for (const auto &R : GlobalResolutions) { - if (R.second.IRName.empty()) + if (!R.second.Prevailing) continue; if (R.second.Partition != 0 && R.second.Partition != GlobalResolution::External) @@ -1114,13 +1111,10 @@ Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache) { // undefined references during the final link. std::set<GlobalValue::GUID> ExportedGUIDs; for (auto &Res : GlobalResolutions) { - // First check if the symbol was flagged as having external references. - if (Res.second.Partition != GlobalResolution::External) - continue; - // IRName will be defined if we have seen the prevailing copy of - // this value. If not, no need to mark as exported from a ThinLTO - // partition (and we can't get the GUID). - if (Res.second.IRName.empty()) + // If the symbol does not have external references or it is not prevailing, + // then not need to mark it as exported from a ThinLTO partition. + if (Res.second.Partition != GlobalResolution::External || + !Res.second.Prevailing) continue; auto GUID = GlobalValue::getGUID( GlobalValue::dropLLVMManglingEscape(Res.second.IRName)); |