-#ifndef USE_OLD_PASSMANAGER
-namespace llvm {
-
-class PMDataManager;
-
-//===----------------------------------------------------------------------===//
-// PMTopLevelManager
-//
-/// PMTopLevelManager manages LastUser info and collects common APIs used by
-/// top level pass managers.
-class PMTopLevelManager {
-public:
-
- inline std::vector<Pass *>::iterator passManagersBegin() {
- return PassManagers.begin();
- }
-
- inline std::vector<Pass *>::iterator passManagersEnd() {
- return PassManagers.end();
- }
-
- /// Schedule pass P for execution. Make sure that passes required by
- /// P are run before P is run. Update analysis info maintained by
- /// the manager. Remove dead passes. This is a recursive function.
- void schedulePass(Pass *P);
-
- /// This is implemented by top level pass manager and used by
- /// schedulePass() to add analysis info passes that are not available.
- virtual void addTopLevelPass(Pass *P) = 0;
-
- /// Set pass P as the last user of the given analysis passes.
- void setLastUser(std::vector<Pass *> &AnalysisPasses, Pass *P);
-
- /// Collect passes whose last user is P
- void collectLastUses(std::vector<Pass *> &LastUses, Pass *P);
-
- /// Find the pass that implements Analysis AID. Search immutable
- /// passes and all pass managers. If desired pass is not found
- /// then return NULL.
- Pass *findAnalysisPass(AnalysisID AID);
-
- inline void clearManagers() {
- PassManagers.clear();
- }
-
- virtual ~PMTopLevelManager() {
- for (std::vector<Pass *>::iterator I = PassManagers.begin(),
- E = PassManagers.end(); I != E; ++I)
- delete *I;
-
- for (std::vector<ImmutablePass *>::iterator
- I = ImmutablePasses.begin(), E = ImmutablePasses.end(); I != E; ++I)
- delete *I;
-
- PassManagers.clear();
- }
-
- /// Add immutable pass and initialize it.
- inline void addImmutablePass(ImmutablePass *P) {
- P->initializePass();
- ImmutablePasses.push_back(P);
- }
-
- inline std::vector<ImmutablePass *>& getImmutablePasses() {
- return ImmutablePasses;
- }
-
- void addPassManager(Pass *Manager) {
- PassManagers.push_back(Manager);
- }
-
- // Add Manager into the list of managers that are not directly
- // maintained by this top level pass manager
- inline void addIndirectPassManager(PMDataManager *Manager) {
- IndirectPassManagers.push_back(Manager);
- }
-
- // Print passes managed by this top level manager.
- void dumpPasses();
- void dumpArguments();
-
-private:
-
- /// Collection of pass managers
- std::vector<Pass *> PassManagers;
-
- /// Collection of pass managers that are not directly maintained
- /// by this pass manager
- std::vector<PMDataManager *> IndirectPassManagers;
-
- // Map to keep track of last user of the analysis pass.
- // LastUser->second is the last user of Lastuser->first.
- std::map<Pass *, Pass *> LastUser;
-
- /// Immutable passes are managed by top level manager.
- std::vector<ImmutablePass *> ImmutablePasses;
-};
-
-//===----------------------------------------------------------------------===//
-// PMDataManager
-
-/// PMDataManager provides the common place to manage the analysis data
-/// used by pass managers.
-class PMDataManager {
-public:
- PMDataManager(int D) : TPM(NULL), Depth(D) {
- initializeAnalysisInfo();
- }
-
- virtual ~PMDataManager() {
-
- for (std::vector<Pass *>::iterator I = PassVector.begin(),
- E = PassVector.end(); I != E; ++I)
- delete *I;
-
- PassVector.clear();
- }
-
- /// Return true IFF pass P's required analysis set does not required new
- /// manager.
- bool manageablePass(Pass *P);
-
- /// Augment AvailableAnalysis by adding analysis made available by pass P.
- void recordAvailableAnalysis(Pass *P);
-
- /// Remove Analysis that is not preserved by the pass
- void removeNotPreservedAnalysis(Pass *P);
-
- /// Remove dead passes
- void removeDeadPasses(Pass *P, std::string &Msg);
-
- /// Add pass P into the PassVector. Update
- /// AvailableAnalysis appropriately if ProcessAnalysis is true.
- void addPassToManager(Pass *P, bool ProcessAnalysis = true);
-
- /// Initialize available analysis information.
- void initializeAnalysisInfo() {
- TransferLastUses.clear();
- AvailableAnalysis.clear();
- }
-
- /// Populate RequiredPasses with the analysis pass that are required by
- /// pass P.
- void collectRequiredAnalysisPasses(std::vector<Pass *> &RequiredPasses,
- Pass *P);
-
- /// All Required analyses should be available to the pass as it runs! Here
- /// we fill in the AnalysisImpls member of the pass so that it can
- /// successfully use the getAnalysis() method to retrieve the
- /// implementations it needs.
- void initializeAnalysisImpl(Pass *P);
-
- /// Find the pass that implements Analysis AID. If desired pass is not found
- /// then return NULL.
- Pass *findAnalysisPass(AnalysisID AID, bool Direction);
-
- inline std::vector<Pass *>::iterator passVectorBegin() {
- return PassVector.begin();
- }
-
- inline std::vector<Pass *>::iterator passVectorEnd() {
- return PassVector.end();
- }
-
- // Access toplevel manager
- PMTopLevelManager *getTopLevelManager() { return TPM; }
- void setTopLevelManager(PMTopLevelManager *T) { TPM = T; }
-
- unsigned getDepth() { return Depth; }
-
- // Print list of passes that are last used by P.
- void dumpLastUses(Pass *P, unsigned Offset) {
-
- std::vector<Pass *> LUses;
-
- assert (TPM && "Top Level Manager is missing");
- TPM->collectLastUses(LUses, P);
-
- for (std::vector<Pass *>::iterator I = LUses.begin(),
- E = LUses.end(); I != E; ++I) {
- llvm::cerr << "--" << std::string(Offset*2, ' ');
- (*I)->dumpPassStructure(0);
- }
- }
-
- void dumpPassArguments() {
- for(std::vector<Pass *>::iterator I = PassVector.begin(),
- E = PassVector.end(); I != E; ++I) {
- if (PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I))
- PMD->dumpPassArguments();
- else
- if (const PassInfo *PI = (*I)->getPassInfo())
- if (!PI->isAnalysisGroup())
- cerr << " -" << PI->getPassArgument();
- }
- }
-
- void dumpPassInfo(Pass *P, std::string &Msg1, std::string &Msg2) {
- if (PassDebugging_New < Executions)
- return;
- cerr << (void*)this << std::string(getDepth()*2+1, ' ');
- cerr << Msg1;
- cerr << P->getPassName();
- cerr << Msg2;
- }
-
- void dumpAnalysisSetInfo(const char *Msg, Pass *P,
- const std::vector<AnalysisID> &Set) {
- if (PassDebugging_New >= Details && !Set.empty()) {
- cerr << (void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:";
- for (unsigned i = 0; i != Set.size(); ++i) {
- if (i) cerr << ",";
- cerr << " " << Set[i]->getPassName();
- }
- cerr << "\n";
- }
- }
-
- std::vector<Pass *>& getTransferredLastUses() {
- return TransferLastUses;
- }
-
-protected:
-
- // If a FunctionPass F is the last user of ModulePass info M
- // then the F's manager, not F, records itself as a last user of M.
- // Current pass manage is requesting parent manager to record parent
- // manager as the last user of these TrransferLastUses passes.
- std::vector<Pass *> TransferLastUses;
-
- // Top level manager.
- PMTopLevelManager *TPM;
-
-private:
- // Set of available Analysis. This information is used while scheduling
- // pass. If a pass requires an analysis which is not not available then
- // equired analysis pass is scheduled to run before the pass itself is
- // scheduled to run.
- std::map<AnalysisID, Pass*> AvailableAnalysis;
-
- // Collection of pass that are managed by this manager
- std::vector<Pass *> PassVector;
-
- unsigned Depth;
-};