1//===- LegacyPassManager.h - Legacy Container for Passes --------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the legacy PassManager class. This class is used to hold,
10// maintain, and optimize execution of Passes. The PassManager class ensures
11// that analysis results are available before a pass runs, and that Pass's are
12// destroyed when the PassManager is destroyed.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_IR_LEGACYPASSMANAGER_H
17#define LLVM_IR_LEGACYPASSMANAGER_H
18
19#include "llvm/Pass.h"
20#include "llvm/Support/CBindingWrapping.h"
21
22namespace llvm {
23
24class Pass;
25class Module;
26
27namespace legacy {
28
29// Whether or not -debug-pass has been specified. For use to check if it's
30// specified alongside the new PM.
31bool debugPassSpecified();
32
33class PassManagerImpl;
34class FunctionPassManagerImpl;
35
36/// PassManagerBase - An abstract interface to allow code to add passes to
37/// a pass manager without having to hard-code what kind of pass manager
38/// it is.
39class PassManagerBase {
40public:
41 virtual ~PassManagerBase();
42
43 /// Add a pass to the queue of passes to run. This passes ownership of
44 /// the Pass to the PassManager. When the PassManager is destroyed, the pass
45 /// will be destroyed as well, so there is no need to delete the pass. This
46 /// may even destroy the pass right away if it is found to be redundant. This
47 /// implies that all passes MUST be allocated with 'new'.
48 virtual void add(Pass *P) = 0;
49};
50
51/// PassManager manages ModulePassManagers
52class PassManager : public PassManagerBase {
53public:
54
55 PassManager();
56 ~PassManager() override;
57
58 void add(Pass *P) override;
59
60 /// run - Execute all of the passes scheduled for execution. Keep track of
61 /// whether any of the passes modifies the module, and if so, return true.
62 bool run(Module &M);
63
64private:
65 /// PassManagerImpl_New is the actual class. PassManager is just the
66 /// wraper to publish simple pass manager interface
67 PassManagerImpl *PM;
68};
69
70/// FunctionPassManager manages FunctionPasses.
71class FunctionPassManager : public PassManagerBase {
72public:
73 /// FunctionPassManager ctor - This initializes the pass manager. It needs,
74 /// but does not take ownership of, the specified Module.
75 explicit FunctionPassManager(Module *M);
76 ~FunctionPassManager() override;
77
78 void add(Pass *P) override;
79
80 /// run - Execute all of the passes scheduled for execution. Keep
81 /// track of whether any of the passes modifies the function, and if
82 /// so, return true.
83 ///
84 bool run(Function &F);
85
86 /// doInitialization - Run all of the initializers for the function passes.
87 ///
88 bool doInitialization();
89
90 /// doFinalization - Run all of the finalizers for the function passes.
91 ///
92 bool doFinalization();
93
94private:
95 FunctionPassManagerImpl *FPM;
96 Module *M;
97};
98
99} // End legacy namespace
100
101// Create wrappers for C Binding types (see CBindingWrapping.h).
102DEFINE_STDCXX_CONVERSION_FUNCTIONS(legacy::PassManagerBase, LLVMPassManagerRef)
103
104} // End llvm namespace
105
106#endif
107