Fix some bugs with the handling of indices in insertvalue/extractvalue.
[oota-llvm.git] / include / llvm / PassManagers.h
index bcdea2bc3dc6688b3b33da741b3594854fc2dbbe..495b32c7e9b8bf61c705b9caf3062bf4b624ce26 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by Devang Patel and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -13,9 +13,8 @@
 
 #include "llvm/PassManager.h"
 #include "llvm/ADT/SmallVector.h"
-using namespace llvm;
-class llvm::PMDataManager;
-class llvm::PMStack;
+#include <deque>
+#include <map>
 
 //===----------------------------------------------------------------------===//
 // Overview:
@@ -87,6 +86,9 @@ class llvm::PMStack;
 #ifndef PASSMANAGERS_H
 #define PASSMANAGERS_H
 
+#include "llvm/Pass.h"
+#include <deque>
+
 namespace llvm {
 
 /// FunctionPassManager and PassManager, two top level managers, serve 
@@ -108,6 +110,36 @@ enum PassDebuggingString {
   ON_CG_MSG // "' on Call Graph ...\n'"
 };  
 
+//===----------------------------------------------------------------------===//
+// PMStack
+//
+/// PMStack
+/// Top level pass managers (see PassManager.cpp) maintain active Pass Managers 
+/// using PMStack. Each Pass implements assignPassManager() to connect itself
+/// with appropriate manager. assignPassManager() walks PMStack to find
+/// suitable manager.
+///
+/// PMStack is just a wrapper around standard deque that overrides pop() and
+/// push() methods.
+class PMStack {
+public:
+  typedef std::deque<PMDataManager *>::reverse_iterator iterator;
+  iterator begin() { return S.rbegin(); }
+  iterator end() { return S.rend(); }
+
+  void handleLastUserOverflow();
+
+  void pop();
+  inline PMDataManager *top() { return S.back(); }
+  void push(PMDataManager *PM);
+  inline bool empty() { return S.empty(); }
+
+  void dump();
+private:
+  std::deque<PMDataManager *> S;
+};
+
+
 //===----------------------------------------------------------------------===//
 // PMTopLevelManager
 //
@@ -116,8 +148,8 @@ enum PassDebuggingString {
 class PMTopLevelManager {
 public:
 
-  virtual unsigned getNumContainedManagers() {
-    return PassManagers.size();
+  virtual unsigned getNumContainedManagers() const {
+    return (unsigned)PassManagers.size();
   }
 
   /// Schedule pass P for execution. Make sure that passes required by
@@ -153,7 +185,7 @@ public:
     return ImmutablePasses;
   }
 
-  void addPassManager(Pass *Manager) {
+  void addPassManager(PMDataManager *Manager) {
     PassManagers.push_back(Manager);
   }
 
@@ -175,7 +207,7 @@ public:
 protected:
   
   /// Collection of pass managers
-  std::vector<Pass *> PassManagers;
+  std::vector<PMDataManager *> PassManagers;
 
 private:
 
@@ -207,10 +239,6 @@ public:
 
   virtual ~PMDataManager();
 
-  /// 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);
 
@@ -280,8 +308,8 @@ public:
   void dumpAnalysisSetInfo(const char *Msg, Pass *P,
                            const std::vector<AnalysisID> &Set) const;
 
-  virtual unsigned getNumContainedPasses() 
-    return PassVector.size();
+  virtual unsigned getNumContainedPasses() const {
+    return (unsigned)PassVector.size();
   }
 
   virtual PassManagerType getPassManagerType() const { 
@@ -341,7 +369,7 @@ class FPPassManager : public ModulePass, public PMDataManager {
 public:
   static char ID;
   explicit FPPassManager(int Depth) 
-  : ModulePass((intptr_t)&ID), PMDataManager(Depth) { }
+  : ModulePass(intptr_t(&ID)), PMDataManager(Depth) { }
   
   /// run - Execute all of the passes scheduled for execution.  Keep track of
   /// whether any of the passes modifies the module, and if so, return true.
@@ -381,8 +409,8 @@ public:
 
 }
 
-extern void StartPassTimer(Pass *);
-extern void StopPassTimer(Pass *);
+extern void StartPassTimer(llvm::Pass *);
+extern void StopPassTimer(llvm::Pass *);
 
 #endif