1 | //===- ModuleSummaryAnalysis.h - Module summary index builder ---*- C++ -*-===// |
2 | // |
3 | // The LLVM Compiler Infrastructure |
4 | // |
5 | // This file is distributed under the University of Illinois Open Source |
6 | // License. See LICENSE.TXT for details. |
7 | // |
8 | //===----------------------------------------------------------------------===// |
9 | /// \file |
10 | /// This is the interface to build a ModuleSummaryIndex for a module. |
11 | /// |
12 | //===----------------------------------------------------------------------===// |
13 | |
14 | #ifndef LLVM_ANALYSIS_MODULESUMMARYANALYSIS_H |
15 | #define LLVM_ANALYSIS_MODULESUMMARYANALYSIS_H |
16 | |
17 | #include "llvm/ADT/Optional.h" |
18 | #include "llvm/IR/ModuleSummaryIndex.h" |
19 | #include "llvm/IR/PassManager.h" |
20 | #include "llvm/Pass.h" |
21 | #include <functional> |
22 | |
23 | namespace llvm { |
24 | |
25 | class BlockFrequencyInfo; |
26 | class Function; |
27 | class Module; |
28 | class ProfileSummaryInfo; |
29 | |
30 | /// Direct function to compute a \c ModuleSummaryIndex from a given module. |
31 | /// |
32 | /// If operating within a pass manager which has defined ways to compute the \c |
33 | /// BlockFrequencyInfo for a given function, that can be provided via |
34 | /// a std::function callback. Otherwise, this routine will manually construct |
35 | /// that information. |
36 | ModuleSummaryIndex buildModuleSummaryIndex( |
37 | const Module &M, |
38 | std::function<BlockFrequencyInfo *(const Function &F)> GetBFICallback, |
39 | ProfileSummaryInfo *PSI); |
40 | |
41 | /// Analysis pass to provide the ModuleSummaryIndex object. |
42 | class ModuleSummaryIndexAnalysis |
43 | : public AnalysisInfoMixin<ModuleSummaryIndexAnalysis> { |
44 | friend AnalysisInfoMixin<ModuleSummaryIndexAnalysis>; |
45 | |
46 | static AnalysisKey Key; |
47 | |
48 | public: |
49 | using Result = ModuleSummaryIndex; |
50 | |
51 | Result run(Module &M, ModuleAnalysisManager &AM); |
52 | }; |
53 | |
54 | /// Legacy wrapper pass to provide the ModuleSummaryIndex object. |
55 | class ModuleSummaryIndexWrapperPass : public ModulePass { |
56 | Optional<ModuleSummaryIndex> Index; |
57 | |
58 | public: |
59 | static char ID; |
60 | |
61 | ModuleSummaryIndexWrapperPass(); |
62 | |
63 | /// Get the index built by pass |
64 | ModuleSummaryIndex &getIndex() { return *Index; } |
65 | const ModuleSummaryIndex &getIndex() const { return *Index; } |
66 | |
67 | bool runOnModule(Module &M) override; |
68 | bool doFinalization(Module &M) override; |
69 | void getAnalysisUsage(AnalysisUsage &AU) const override; |
70 | }; |
71 | |
72 | //===--------------------------------------------------------------------===// |
73 | // |
74 | // createModuleSummaryIndexWrapperPass - This pass builds a ModuleSummaryIndex |
75 | // object for the module, to be written to bitcode or LLVM assembly. |
76 | // |
77 | ModulePass *createModuleSummaryIndexWrapperPass(); |
78 | |
79 | } // end namespace llvm |
80 | |
81 | #endif // LLVM_ANALYSIS_MODULESUMMARYANALYSIS_H |
82 | |