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