LLVM: lib/Transforms/IPO/FunctionImport.cpp File Reference (original) (raw)

Go to the source code of this file.

Classes
class GlobalsImporter
Import globals referenced by a function or other globals that are being imported, if importing such global is possible. More...
class ModuleImportsManager
Determine the list of imports and exports for each module. More...
class WorkloadImportsManager
A ModuleImportsManager that operates based on a workload definition (see -thinlto-workload-def). More...
struct ImportStatistics
Namespaces
namespace llvm
This is an optimization pass for GlobalISel generic memory operations.
Macros
#define DEBUG_TYPE "function-import"
Functions
STATISTIC (NumImportedFunctionsThinLink, "Number of functions thin link decided to import")
STATISTIC (NumImportedHotFunctionsThinLink, "Number of hot functions thin link decided to import")
STATISTIC (NumImportedCriticalFunctionsThinLink, "Number of critical functions thin link decided to import")
STATISTIC (NumImportedGlobalVarsThinLink, "Number of global variables thin link decided to import")
STATISTIC (NumImportedFunctions, "Number of functions imported in backend")
STATISTIC (NumImportedGlobalVars, "Number of global variables imported in backend")
STATISTIC (NumImportedModules, "Number of modules imported from")
STATISTIC (NumDeadSymbols, "Number of dead stripped symbols in index")
STATISTIC (NumLiveSymbols, "Number of live symbols in index")
cl::opt< bool > llvm::ForceImportAll ("force-import-all", cl::init(false), cl::Hidden, cl::desc("Import functions with noinline attribute"))
static std::unique_ptr< Module > loadFile (const std::string &FileName, LLVMContext &Context)
static bool shouldSkipLocalInAnotherModule (const GlobalValueSummary *RefSummary, size_t NumDefs, StringRef ImporterModule)
static auto qualifyCalleeCandidates (const ModuleSummaryIndex &Index, ArrayRef< std::unique_ptr< GlobalValueSummary > > CalleeSummaryList, StringRef CallerModulePath)
Given a list of possible callee implementation for a call site, qualify the legality of importing each.
static const GlobalValueSummary * selectCallee (const ModuleSummaryIndex &Index, ArrayRef< std::unique_ptr< GlobalValueSummary > > CalleeSummaryList, unsigned Threshold, StringRef CallerModulePath, const GlobalValueSummary *&TooLargeOrNoInlineSummary, FunctionImporter::ImportFailureReason &Reason)
Given a list of possible callee implementation for a call site, select one that fits the Threshold for function definition import.
static const char * getFailureName (FunctionImporter::ImportFailureReason Reason)
static bool isGlobalVarSummary (const ModuleSummaryIndex &Index, ValueInfo VI)
static bool isGlobalVarSummary (const ModuleSummaryIndex &Index, GlobalValue::GUID G)
static unsigned numGlobalVarSummaries (const ModuleSummaryIndex &Index, FunctionImporter::ExportSetTy &ExportSet)
static DenseMap< StringRef, ImportStatistics > collectImportStatistics (const ModuleSummaryIndex &Index, const FunctionImporter::ImportMapTy &ImportList)
static bool checkVariableImport (const ModuleSummaryIndex &Index, FunctionImporter::ImportListsTy &ImportLists, DenseMap< StringRef, FunctionImporter::ExportSetTy > &ExportLists)
static void dumpImportListForModule (const ModuleSummaryIndex &Index, StringRef ModulePath, FunctionImporter::ImportMapTy &ImportList)
static void ComputeCrossModuleImportForModuleForTest (StringRef ModulePath, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing, const ModuleSummaryIndex &Index, FunctionImporter::ImportMapTy &ImportList)
Compute all the imports for the given module using the Index.
static void ComputeCrossModuleImportForModuleFromIndexForTest (StringRef ModulePath, const ModuleSummaryIndex &Index, FunctionImporter::ImportMapTy &ImportList)
Mark all external summaries in Index for import into the given module.
void updateValueInfoForIndirectCalls (ModuleSummaryIndex &Index, FunctionSummary *FS)
static Function * replaceAliasWithAliasee (Module *SrcModule, GlobalAlias *GA)
Make alias a clone of its aliasee.
static void internalizeGVsAfterImport (Module &M)
static bool doImportingForModuleForTest (Module &M, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing)
Variables
static cl::opt< unsigned > llvm::ImportInstrLimit ("import-instr-limit", cl::init(100), cl::Hidden, cl::value_desc("N"), cl::desc("Only import functions with less than N instructions"))
Limit on instruction count of imported functions.
static cl::opt< int > llvm::ImportCutoff ("import-cutoff", cl::init(-1), cl::Hidden, cl::value_desc("N"), cl::desc("Only import first N functions if N>=0 (default -1)"))
static cl::opt< float > llvm::ImportInstrFactor ("import-instr-evolution-factor", cl::init(0.7), cl::Hidden, cl::value_desc("x"), cl::desc("As we import functions, multiply the " "`import-instr-limit` threshold by this factor " "before processing newly imported functions"))
static cl::opt< float > llvm::ImportHotInstrFactor ("import-hot-evolution-factor", cl::init(1.0), cl::Hidden, cl::value_desc("x"), cl::desc("As we import functions called from hot callsite, multiply the " "`import-instr-limit` threshold by this factor " "before processing newly imported functions"))
static cl::opt< float > llvm::ImportHotMultiplier ("import-hot-multiplier", cl::init(10.0), cl::Hidden, cl::value_desc("x"), cl::desc("Multiply the `import-instr-limit` threshold for hot callsites"))
static cl::opt< float > llvm::ImportCriticalMultiplier ("import-critical-multiplier", cl::init(100.0), cl::Hidden, cl::value_desc("x"), cl::desc("Multiply the `import-instr-limit` threshold for critical callsites"))
static cl::opt< float > llvm::ImportColdMultiplier ("import-cold-multiplier", cl::init(0), cl::Hidden, cl::value_desc("N"), cl::desc("Multiply the `import-instr-limit` threshold for cold callsites"))
static cl::opt< bool > llvm::PrintImports ("print-imports", cl::init(false), cl::Hidden, cl::desc("Print imported functions"))
static cl::opt< bool > llvm::PrintImportFailures ("print-import-failures", cl::init(false), cl::Hidden, cl::desc("Print information for functions rejected for importing"))
static cl::opt< bool > llvm::ComputeDead ("compute-dead", cl::init(true), cl::Hidden, cl::desc("Compute dead symbols"))
static cl::opt< bool > llvm::EnableImportMetadata ("enable-import-metadata", cl::init(false), cl::Hidden, cl::desc("Enable import metadata like 'thinlto_src_module' and " "'thinlto_src_file'"))
static cl::opt< std::string > llvm::SummaryFile ("summary-file", cl::desc("The summary file to use for function importing."))
Summary file to use for function importing when using -function-import from the command line.
static cl::opt< bool > llvm::ImportAllIndex ("import-all-index", cl::desc("Import all external functions in index."))
Used when testing importing from distributed indexes via opt.
static cl::opt< bool > llvm::ImportDeclaration ("import-declaration", cl::init(false), cl::Hidden, cl::desc("If true, import function declaration as fallback if the function " "definition is not imported."))
This is a test-only option.
static cl::opt< std::string > llvm::WorkloadDefinitions ("thinlto-workload-def", cl::desc("Pass a workload definition. This is a file containing a JSON " "dictionary. The keys are root functions, the values are lists of " "functions to import in the module defining the root. It is " "assumed -funique-internal-linkage-names was used, to ensure " "local linkage functions have unique names. For example: \n" "{\n" " \"rootFunction_1\": [\"function_to_import_1\", " "\"function_to_import_2\"], \n" " \"rootFunction_2\": [\"function_to_import_3\", " "\"function_to_import_4\"] \n" "}"), cl::Hidden)
Pass a workload description file - an example of workload would be the functions executed to satisfy a RPC request.
static cl::opt< bool > llvm::CtxprofMoveRootsToOwnModule ("thinlto-move-ctxprof-trees", cl::desc("Move contextual profiling roots and the graphs under them in " "their own module."), cl::Hidden, cl::init(false))
cl::list< GlobalValue::GUID > llvm::MoveSymbolGUID

DEBUG_TYPE

#define DEBUG_TYPE "function-import"

checkVariableImport()

collectImportStatistics()

ComputeCrossModuleImportForModuleForTest()

ComputeCrossModuleImportForModuleFromIndexForTest()

doImportingForModuleForTest()

Definition at line 2065 of file FunctionImport.cpp.

References ComputeCrossModuleImportForModuleForTest(), ComputeCrossModuleImportForModuleFromIndexForTest(), llvm::errs(), llvm::GlobalValue::ExternalLinkage, llvm::getModuleSummaryIndexForFile(), I, llvm::ImportAllIndex, llvm::FunctionImporter::importFunctions(), llvm::GlobalValue::isLocalLinkage(), loadFile(), llvm::logAllUnhandledErrors(), llvm::renameModuleForThinLTO(), llvm::report_fatal_error(), llvm::SummaryFile, and llvm::Expected< T >::takeError().

Referenced by llvm::FunctionImportPass::run().

dumpImportListForModule()

getFailureName()

internalizeGVsAfterImport()

void internalizeGVsAfterImport ( Module & M) static

isGlobalVarSummary() [1/2]

isGlobalVarSummary() [2/2]

loadFile()

numGlobalVarSummaries()

qualifyCalleeCandidates()

Given a list of possible callee implementation for a call site, qualify the legality of importing each.

The return is a range of pairs. Each pair corresponds to a candidate. The first value is the ImportFailureReason for that candidate, the second is the candidate.

Definition at line 230 of file FunctionImport.cpp.

References llvm::dyn_cast(), llvm::FunctionImporter::GlobalVar, llvm::FunctionImporter::InterposableLinkage, llvm::GlobalValue::isInterposableLinkage(), llvm::FunctionImporter::LocalLinkageNotInModule, llvm::map_range(), llvm::FunctionImporter::None, llvm::FunctionImporter::NotEligible, llvm::FunctionImporter::NotLive, and shouldSkipLocalInAnotherModule().

Referenced by selectCallee().

replaceAliasWithAliasee()

selectCallee()

Given a list of possible callee implementation for a call site, select one that fits the Threshold for function definition import.

If none are found, the Reason will give the last reason for the failure (last, in the order of CalleeSummaryList entries). While looking for a callee definition, sets TooLargeOrNoInlineSummary to the last seen too-large or noinline candidate; other modules may want to know the function summary or declaration even if a definition is not needed.

FIXME: select "best" instead of first that fits. But what is "best"?

Definition at line 302 of file FunctionImport.cpp.

References llvm::cast(), llvm::ForceImportAll, llvm::FunctionImporter::NoInline, llvm::FunctionImporter::None, qualifyCalleeCandidates(), and llvm::FunctionImporter::TooLarge.

shouldSkipLocalInAnotherModule()

STATISTIC() [1/9]

STATISTIC ( NumDeadSymbols ,
"Number of dead stripped symbols in index" )

STATISTIC() [2/9]

STATISTIC ( NumImportedCriticalFunctionsThinLink ,
"Number of critical functions thin link decided to import" )

STATISTIC() [3/9]

STATISTIC ( NumImportedFunctions ,
"Number of functions imported in backend" )

STATISTIC() [4/9]

STATISTIC ( NumImportedFunctionsThinLink ,
"Number of functions thin link decided to import" )

STATISTIC() [5/9]

STATISTIC ( NumImportedGlobalVars ,
"Number of global variables imported in backend" )

STATISTIC() [6/9]

STATISTIC ( NumImportedGlobalVarsThinLink ,
"Number of global variables thin link decided to import" )

STATISTIC() [7/9]

STATISTIC ( NumImportedHotFunctionsThinLink ,
"Number of hot functions thin link decided to import" )

STATISTIC() [8/9]

STATISTIC ( NumImportedModules ,
"Number of modules imported from" )

STATISTIC() [9/9]

STATISTIC ( NumLiveSymbols ,
"Number of live symbols in index" )

updateValueInfoForIndirectCalls()