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