149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//===- LegacyPassManager.h - Legacy Container for Passes --------*- C++ -*-===//
249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//
349837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//                     The LLVM Compiler Infrastructure
449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//
549837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// This file is distributed under the University of Illinois Open Source
649837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// License. See LICENSE.TXT for details.
749837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//
849837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//===----------------------------------------------------------------------===//
949837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//
1049837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// This file defines the legacy PassManager class.  This class is used to hold,
1149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// maintain, and optimize execution of Passes.  The PassManager class ensures
1249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// that analysis results are available before a pass runs, and that Pass's are
1349837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// destroyed when the PassManager is destroyed.
1449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//
1549837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//===----------------------------------------------------------------------===//
1649837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
1749837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth#ifndef LLVM_IR_LEGACYPASSMANAGER_H
1849837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth#define LLVM_IR_LEGACYPASSMANAGER_H
1949837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
2049837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth#include "llvm/Pass.h"
2149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth#include "llvm/Support/CBindingWrapping.h"
2249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
2349837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthnamespace llvm {
2449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
2549837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthclass Pass;
2649837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthclass Module;
2749837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
2849837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthnamespace legacy {
2949837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
3049837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthclass PassManagerImpl;
3149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthclass FunctionPassManagerImpl;
3249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
3349837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth/// PassManagerBase - An abstract interface to allow code to add passes to
3449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth/// a pass manager without having to hard-code what kind of pass manager
3549837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth/// it is.
3649837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthclass PassManagerBase {
3749837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthpublic:
3849837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  virtual ~PassManagerBase();
3949837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// Add a pass to the queue of passes to run.  This passes ownership of
4149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// the Pass to the PassManager.  When the PassManager is destroyed, the pass
4249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// will be destroyed as well, so there is no need to delete the pass.  This
43ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// may even destroy the pass right away if it is found to be redundant. This
4449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// implies that all passes MUST be allocated with 'new'.
4549837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  virtual void add(Pass *P) = 0;
4649837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth};
4749837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
4849837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth/// PassManager manages ModulePassManagers
4949837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthclass PassManager : public PassManagerBase {
5049837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthpublic:
5149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
5249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  PassManager();
532c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  ~PassManager() override;
5449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void add(Pass *P) override;
5649837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
5749837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// run - Execute all of the passes scheduled for execution.  Keep track of
5849837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// whether any of the passes modifies the module, and if so, return true.
5949837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  bool run(Module &M);
6049837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
6149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthprivate:
6249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// PassManagerImpl_New is the actual class. PassManager is just the
6349837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// wraper to publish simple pass manager interface
6449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  PassManagerImpl *PM;
6549837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth};
6649837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
6749837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth/// FunctionPassManager manages FunctionPasses and BasicBlockPassManagers.
6849837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthclass FunctionPassManager : public PassManagerBase {
6949837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthpublic:
7049837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// FunctionPassManager ctor - This initializes the pass manager.  It needs,
7149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// but does not take ownership of, the specified Module.
7249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  explicit FunctionPassManager(Module *M);
732c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  ~FunctionPassManager() override;
7449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void add(Pass *P) override;
7649837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
7749837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// run - Execute all of the passes scheduled for execution.  Keep
7849837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// track of whether any of the passes modifies the function, and if
7949837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// so, return true.
8049837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  ///
8149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  bool run(Function &F);
8249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
8349837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// doInitialization - Run all of the initializers for the function passes.
8449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  ///
8549837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  bool doInitialization();
8649837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
8749837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  /// doFinalization - Run all of the finalizers for the function passes.
8849837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  ///
8949837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  bool doFinalization();
9049837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
9149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruthprivate:
9249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  FunctionPassManagerImpl *FPM;
9349837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth  Module *M;
9449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth};
9549837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
9649837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth} // End legacy namespace
9749837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
9849837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// Create wrappers for C Binding types (see CBindingWrapping.h).
9949837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler CarruthDEFINE_STDCXX_CONVERSION_FUNCTIONS(legacy::PassManagerBase, LLVMPassManagerRef)
10049837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
10149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth} // End llvm namespace
10249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth
10349837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth#endif
104