ModuleSummaryAnalysis.h revision 353358
12116Sjkh//===- ModuleSummaryAnalysis.h - Module summary index builder ---*- C++ -*-===// 22116Sjkh// 32116Sjkh// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42116Sjkh// See https://llvm.org/LICENSE.txt for license information. 52116Sjkh// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 62116Sjkh// 72116Sjkh//===----------------------------------------------------------------------===// 88870Srgrimes/// \file 92116Sjkh/// This is the interface to build a ModuleSummaryIndex for a module. 102116Sjkh/// 11153386Sbde//===----------------------------------------------------------------------===// 12153386Sbde 132116Sjkh#ifndef LLVM_ANALYSIS_MODULESUMMARYANALYSIS_H 142116Sjkh#define LLVM_ANALYSIS_MODULESUMMARYANALYSIS_H 152116Sjkh 1650476Speter#include "llvm/ADT/Optional.h" 172116Sjkh#include "llvm/IR/ModuleSummaryIndex.h" 182116Sjkh#include "llvm/IR/PassManager.h" 192116Sjkh#include "llvm/Pass.h" 202116Sjkh#include <functional> 212116Sjkh 222116Sjkhnamespace llvm { 232116Sjkh 242116Sjkhclass BlockFrequencyInfo; 252116Sjkhclass Function; 26153306Sbdeclass Module; 27153306Sbdeclass ProfileSummaryInfo; 282116Sjkh 292116Sjkh/// Direct function to compute a \c ModuleSummaryIndex from a given module. 302116Sjkh/// 312116Sjkh/// If operating within a pass manager which has defined ways to compute the \c 322116Sjkh/// BlockFrequencyInfo for a given function, that can be provided via 332116Sjkh/// a std::function callback. Otherwise, this routine will manually construct 342116Sjkh/// that information. 352116SjkhModuleSummaryIndex buildModuleSummaryIndex( 3697413Salfred const Module &M, 3797413Salfred std::function<BlockFrequencyInfo *(const Function &F)> GetBFICallback, 382116Sjkh ProfileSummaryInfo *PSI); 392116Sjkh 402116Sjkh/// Analysis pass to provide the ModuleSummaryIndex object. 412116Sjkhclass ModuleSummaryIndexAnalysis 422116Sjkh : public AnalysisInfoMixin<ModuleSummaryIndexAnalysis> { 432116Sjkh friend AnalysisInfoMixin<ModuleSummaryIndexAnalysis>; 442116Sjkh 452116Sjkh static AnalysisKey Key; 462116Sjkh 472116Sjkhpublic: 482116Sjkh using Result = ModuleSummaryIndex; 498870Srgrimes 502116Sjkh Result run(Module &M, ModuleAnalysisManager &AM); 512116Sjkh}; 52153306Sbde 53153306Sbde/// Legacy wrapper pass to provide the ModuleSummaryIndex object. 54153306Sbdeclass ModuleSummaryIndexWrapperPass : public ModulePass { 55153306Sbde Optional<ModuleSummaryIndex> Index; 56153306Sbde 57153306Sbdepublic: 58153306Sbde static char ID; 59153306Sbde 60153306Sbde ModuleSummaryIndexWrapperPass(); 61153306Sbde 62153306Sbde /// Get the index built by pass 63153306Sbde ModuleSummaryIndex &getIndex() { return *Index; } 64153306Sbde const ModuleSummaryIndex &getIndex() const { return *Index; } 65153306Sbde 66153306Sbde bool runOnModule(Module &M) override; 67153382Sbde bool doFinalization(Module &M) override; 68153382Sbde void getAnalysisUsage(AnalysisUsage &AU) const override; 69153382Sbde}; 70153382Sbde 71153386Sbde//===--------------------------------------------------------------------===// 72153382Sbde// 73153386Sbde// createModuleSummaryIndexWrapperPass - This pass builds a ModuleSummaryIndex 742116Sjkh// object for the module, to be written to bitcode or LLVM assembly. 75153447Sbde// 76153447SbdeModulePass *createModuleSummaryIndexWrapperPass(); 77153447Sbde 78153447Sbde} // end namespace llvm 79153447Sbde 80153447Sbde#endif // LLVM_ANALYSIS_MODULESUMMARYANALYSIS_H 81153447Sbde