Skip to content

Commit

Permalink
[ThinLTO] Use NoPromote flag in summary during promotion
Browse files Browse the repository at this point in the history
Summary:
Replace the check of whether a GV has a section with the flag check
in the summary. This is in preparation for using the NoPromote flag
to convey other situations when we can't promote (e.g. locals used in
inline asm).

Reviewers: mehdi_amini

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D26063

llvm-svn: 285507
  • Loading branch information
teresajohnson committed Oct 29, 2016
1 parent 310474f commit 1b9c2be
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 17 deletions.
10 changes: 6 additions & 4 deletions llvm/include/llvm/Transforms/Utils/FunctionImportUtils.h
Expand Up @@ -54,8 +54,9 @@ class FunctionImportGlobalProcessing {

/// Get the name for SGV that should be used in the linked destination
/// module. Specifically, this handles the case where we need to rename
/// a local that is being promoted to global scope.
std::string getName(const GlobalValue *SGV);
/// a local that is being promoted to global scope, which it will always
/// do when \p DoPromote is true (or when importing a local).
std::string getName(const GlobalValue *SGV, bool DoPromote);

/// Process globals so that they can be used in ThinLTO. This includes
/// promoting local variables so that they can be reference externally by
Expand All @@ -66,8 +67,9 @@ class FunctionImportGlobalProcessing {

/// Get the new linkage for SGV that should be used in the linked destination
/// module. Specifically, for ThinLTO importing or exporting it may need
/// to be adjusted.
GlobalValue::LinkageTypes getLinkage(const GlobalValue *SGV);
/// to be adjusted. When \p DoPromote is true then we must adjust the
/// linkage for a required promotion of a local to global scope.
GlobalValue::LinkageTypes getLinkage(const GlobalValue *SGV, bool DoPromote);

public:
FunctionImportGlobalProcessing(
Expand Down
32 changes: 19 additions & 13 deletions llvm/lib/Transforms/Utils/FunctionImportUtils.cpp
Expand Up @@ -67,9 +67,9 @@ bool FunctionImportGlobalProcessing::doPromoteLocalToGlobal(
if (GVar && GVar->isConstant() && GVar->hasGlobalUnnamedAddr())
return false;

if (GVar && GVar->hasSection())
// Some sections like "__DATA,__cfstring" are "magic" and promotion is not
// allowed. Just disable promotion on any GVar with sections right now.
auto *Summary = ImportIndex.getGlobalValueSummary(SGV->getGUID());
assert(Summary && "Missing summary for global value");
if (Summary->noRename())
return false;

// Eventually we only need to promote functions in the exporting module that
Expand All @@ -78,28 +78,29 @@ bool FunctionImportGlobalProcessing::doPromoteLocalToGlobal(
return true;
}

std::string FunctionImportGlobalProcessing::getName(const GlobalValue *SGV) {
std::string FunctionImportGlobalProcessing::getName(const GlobalValue *SGV,
bool DoPromote) {
// For locals that must be promoted to global scope, ensure that
// the promoted name uniquely identifies the copy in the original module,
// using the ID assigned during combined index creation. When importing,
// we rename all locals (not just those that are promoted) in order to
// avoid naming conflicts between locals imported from different modules.
if (SGV->hasLocalLinkage() &&
(doPromoteLocalToGlobal(SGV) || isPerformingImport()))
if (SGV->hasLocalLinkage() && (DoPromote || isPerformingImport()))
return ModuleSummaryIndex::getGlobalNameForLocal(
SGV->getName(),
ImportIndex.getModuleHash(SGV->getParent()->getModuleIdentifier()));
return SGV->getName();
}

GlobalValue::LinkageTypes
FunctionImportGlobalProcessing::getLinkage(const GlobalValue *SGV) {
FunctionImportGlobalProcessing::getLinkage(const GlobalValue *SGV,
bool DoPromote) {
// Any local variable that is referenced by an exported function needs
// to be promoted to global scope. Since we don't currently know which
// functions reference which local variables/functions, we must treat
// all as potentially exported if this module is exporting anything.
if (isModuleExporting()) {
if (SGV->hasLocalLinkage() && doPromoteLocalToGlobal(SGV))
if (SGV->hasLocalLinkage() && DoPromote)
return GlobalValue::ExternalLinkage;
return SGV->getLinkage();
}
Expand Down Expand Up @@ -164,7 +165,7 @@ FunctionImportGlobalProcessing::getLinkage(const GlobalValue *SGV) {
case GlobalValue::PrivateLinkage:
// If we are promoting the local to global scope, it is handled
// similarly to a normal externally visible global.
if (doPromoteLocalToGlobal(SGV)) {
if (DoPromote) {
if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV))
return GlobalValue::AvailableExternallyLinkage;
else
Expand All @@ -190,14 +191,19 @@ FunctionImportGlobalProcessing::getLinkage(const GlobalValue *SGV) {
}

void FunctionImportGlobalProcessing::processGlobalForThinLTO(GlobalValue &GV) {
bool DoPromote = false;
if (GV.hasLocalLinkage() &&
(doPromoteLocalToGlobal(&GV) || isPerformingImport())) {
GV.setName(getName(&GV));
GV.setLinkage(getLinkage(&GV));
((DoPromote = doPromoteLocalToGlobal(&GV)) || isPerformingImport())) {
// Once we change the name or linkage it is difficult to determine
// again whether we should promote since doPromoteLocalToGlobal needs
// to locate the summary (based on GUID from name and linkage). Therefore,
// use DoPromote result saved above.
GV.setName(getName(&GV, DoPromote));
GV.setLinkage(getLinkage(&GV, DoPromote));
if (!GV.hasLocalLinkage())
GV.setVisibility(GlobalValue::HiddenVisibility);
} else
GV.setLinkage(getLinkage(&GV));
GV.setLinkage(getLinkage(&GV, /* DoPromote */ false));

// Remove functions imported as available externally defs from comdats,
// as this is a declaration for the linker, and will be dropped eventually.
Expand Down

0 comments on commit 1b9c2be

Please sign in to comment.