1//===- llvm/PassManager.h - Container for Passes ----------------*- 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//
10// This file defines the PassManager class.  This class is used to hold,
11// maintain, and optimize execution of Passes.  The PassManager class ensures
12// that analysis results are available before a pass runs, and that Pass's are
13// destroyed when the PassManager is destroyed.
14//
15//===----------------------------------------------------------------------===//
16
17#ifndef LLVM_PASSMANAGER_H
18#define LLVM_PASSMANAGER_H
19
20#include "llvm/Pass.h"
21
22namespace llvm {
23
24class Pass;
25class Module;
26
27class PassManagerImpl;
28class FunctionPassManagerImpl;
29
30/// PassManagerBase - An abstract interface to allow code to add passes to
31/// a pass manager without having to hard-code what kind of pass manager
32/// it is.
33class PassManagerBase {
34public:
35  virtual ~PassManagerBase();
36
37  /// add - Add a pass to the queue of passes to run.  This passes ownership of
38  /// the Pass to the PassManager.  When the PassManager is destroyed, the pass
39  /// will be destroyed as well, so there is no need to delete the pass.  This
40  /// implies that all passes MUST be allocated with 'new'.
41  virtual void add(Pass *P) = 0;
42};
43
44/// PassManager manages ModulePassManagers
45class PassManager : public PassManagerBase {
46public:
47
48  PassManager();
49  ~PassManager();
50
51  /// add - Add a pass to the queue of passes to run.  This passes ownership of
52  /// the Pass to the PassManager.  When the PassManager is destroyed, the pass
53  /// will be destroyed as well, so there is no need to delete the pass.  This
54  /// implies that all passes MUST be allocated with 'new'.
55  void add(Pass *P);
56
57  /// run - Execute all of the passes scheduled for execution.  Keep track of
58  /// whether any of the passes modifies the module, and if so, return true.
59  bool run(Module &M);
60
61private:
62  /// PassManagerImpl_New is the actual class. PassManager is just the
63  /// wraper to publish simple pass manager interface
64  PassManagerImpl *PM;
65};
66
67/// FunctionPassManager manages FunctionPasses and BasicBlockPassManagers.
68class FunctionPassManager : public PassManagerBase {
69public:
70  /// FunctionPassManager ctor - This initializes the pass manager.  It needs,
71  /// but does not take ownership of, the specified Module.
72  explicit FunctionPassManager(Module *M);
73  ~FunctionPassManager();
74
75  /// add - Add a pass to the queue of passes to run.  This passes
76  /// ownership of the Pass to the PassManager.  When the
77  /// PassManager_X is destroyed, the pass will be destroyed as well, so
78  /// there is no need to delete the pass.
79  /// This implies that all passes MUST be allocated with 'new'.
80  void add(Pass *P);
81
82  /// run - Execute all of the passes scheduled for execution.  Keep
83  /// track of whether any of the passes modifies the function, and if
84  /// so, return true.
85  ///
86  bool run(Function &F);
87
88  /// doInitialization - Run all of the initializers for the function passes.
89  ///
90  bool doInitialization();
91
92  /// doFinalization - Run all of the finalizers for the function passes.
93  ///
94  bool doFinalization();
95
96private:
97  FunctionPassManagerImpl *FPM;
98  Module *M;
99};
100
101} // End llvm namespace
102
103#endif
104