diff options
Diffstat (limited to 'llvm/lib/Transforms/IPO')
| -rw-r--r-- | llvm/lib/Transforms/IPO/FunctionImport.cpp | 39 | 
1 files changed, 35 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/IPO/FunctionImport.cpp b/llvm/lib/Transforms/IPO/FunctionImport.cpp index 1196dd0099b..d8807f8a064 100644 --- a/llvm/lib/Transforms/IPO/FunctionImport.cpp +++ b/llvm/lib/Transforms/IPO/FunctionImport.cpp @@ -294,10 +294,8 @@ static void computeImportForReferencedGlobals(      LLVM_DEBUG(dbgs() << " ref -> " << VI << "\n");      for (auto &RefSummary : VI.getSummaryList()) -      if (RefSummary->getSummaryKind() == GlobalValueSummary::GlobalVarKind && -          !RefSummary->notEligibleToImport() && -          !GlobalValue::isInterposableLinkage(RefSummary->linkage()) && -          RefSummary->refs().empty()) { +      if (isa<GlobalVarSummary>(RefSummary.get()) && +          canImportGlobalVar(RefSummary.get())) {          auto ILI = ImportList[RefSummary->modulePath()].insert(VI.getGUID());          // Only update stat if we haven't already imported this variable.          if (ILI.second) @@ -824,6 +822,25 @@ void llvm::computeDeadSymbols(    NumLiveSymbols += LiveSymbols;  } +// Compute dead symbols and propagate constants in combined index. +void llvm::computeDeadSymbolsWithConstProp( +    ModuleSummaryIndex &Index, +    const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols, +    function_ref<PrevailingType(GlobalValue::GUID)> isPrevailing, +    bool ImportEnabled) { +  computeDeadSymbols(Index, GUIDPreservedSymbols, isPrevailing); +  if (ImportEnabled) { +    Index.propagateConstants(GUIDPreservedSymbols); +  } else { +    // If import is disabled we should drop read-only attribute +    // from all summaries to prevent internalization. +    for (auto &P : Index) +      for (auto &S : P.second.SummaryList) +        if (auto *GVS = dyn_cast<GlobalVarSummary>(S.get())) +          GVS->setReadOnly(false); +  } +} +  /// Compute the set of summaries needed for a ThinLTO backend compilation of  /// \p ModulePath.  void llvm::gatherImportedSummariesForModule( @@ -1020,6 +1037,18 @@ static Function *replaceAliasWithAliasee(Module *SrcModule, GlobalAlias *GA) {    return NewFn;  } +// Internalize values that we marked with specific attribute +// in processGlobalForThinLTO. +static void internalizeImmutableGVs(Module &M) { +  for (auto &GV : M.globals()) +    // Skip GVs which have been converted to declarations +    // by dropDeadSymbols. +    if (!GV.isDeclaration() && GV.hasAttribute("thinlto-internalize")) { +      GV.setLinkage(GlobalValue::InternalLinkage); +      GV.setVisibility(GlobalValue::DefaultVisibility); +    } +} +  // Automatically import functions in Module \p DestModule based on the summaries  // index.  Expected<bool> FunctionImporter::importFunctions( @@ -1143,6 +1172,8 @@ Expected<bool> FunctionImporter::importFunctions(      NumImportedModules++;    } +  internalizeImmutableGVs(DestModule); +    NumImportedFunctions += (ImportedCount - ImportedGVCount);    NumImportedGlobalVars += ImportedGVCount;  | 

