//
// 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.
//
//===----------------------------------------------------------------------===//
//
#include "llvm/PassManager.h"
#include "llvm/ADT/SmallVector.h"
-using namespace llvm;
-class llvm::PMDataManager;
-class llvm::PMStack;
+#include <deque>
+#include <map>
//===----------------------------------------------------------------------===//
// Overview:
// MPPassManagers.
//===----------------------------------------------------------------------===//
+#ifndef PASSMANAGERS_H
+#define PASSMANAGERS_H
+
+#include "llvm/Pass.h"
+#include <deque>
+
namespace llvm {
/// FunctionPassManager and PassManager, two top level managers, serve
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
//
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
return ImmutablePasses;
}
- void addPassManager(Pass *Manager) {
+ void addPassManager(PMDataManager *Manager) {
PassManagers.push_back(Manager);
}
protected:
/// Collection of pass managers
- std::vector<Pass *> PassManagers;
+ std::vector<PMDataManager *> PassManagers;
private:
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);
void removeNotPreservedAnalysis(Pass *P);
/// Remove dead passes
- void removeDeadPasses(Pass *P, std::string Msg, enum PassDebuggingString);
+ void removeDeadPasses(Pass *P, const char *Msg, enum PassDebuggingString);
/// Add pass P into the PassVector. Update
/// AvailableAnalysis appropriately if ProcessAnalysis is true.
void dumpLastUses(Pass *P, unsigned Offset) const;
void dumpPassArguments() const;
void dumpPassInfo(Pass *P, enum PassDebuggingString S1,
- enum PassDebuggingString S2, std::string Msg);
+ enum PassDebuggingString S2, const char *Msg);
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 {
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.
///
bool doInitialization(Module &M);
- /// doFinalization - Run all of the initializers for the function passes.
+ /// doFinalization - Run all of the finalizers for the function passes.
///
bool doFinalization(Module &M);
}
-extern void StartPassTimer(Pass *);
-extern void StopPassTimer(Pass *);
+extern void StartPassTimer(llvm::Pass *);
+extern void StopPassTimer(llvm::Pass *);
+
+#endif
+