//===----------------------------------------------------------------------===//
#include "llvm/PassManager.h"
-
-using namespace llvm;
+#include "llvm/ADT/SmallVector.h"
class llvm::PMDataManager;
class llvm::PMStack;
// MPPassManagers.
//===----------------------------------------------------------------------===//
+#ifndef PASSMANAGERS_H
+#define PASSMANAGERS_H
+
namespace llvm {
/// FunctionPassManager and PassManager, two top level managers, serve
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);
+ void setLastUser(SmallVector<Pass *, 12> &AnalysisPasses, Pass *P);
/// Collect passes whose last user is P
- void collectLastUses(std::vector<Pass *> &LastUses, Pass *P);
+ void collectLastUses(SmallVector<Pass *, 12> &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);
- PMTopLevelManager(enum TopLevelManagerType t);
+ explicit PMTopLevelManager(enum TopLevelManagerType t);
virtual ~PMTopLevelManager();
/// Add immutable pass and initialize it.
class PMDataManager {
public:
- PMDataManager(int Depth) : TPM(NULL), Depth(Depth) {
+ explicit PMDataManager(int Depth) : TPM(NULL), Depth(Depth) {
initializeAnalysisInfo();
}
/// Augment AvailableAnalysis by adding analysis made available by pass P.
void recordAvailableAnalysis(Pass *P);
+ /// verifyPreservedAnalysis -- Verify analysis presreved by pass P.
+ void verifyPreservedAnalysis(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, 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 add(Pass *P, bool ProcessAnalysis = true);
+ /// Add RequiredPass into list of lower level passes required by pass P.
+ /// RequiredPass is run on the fly by Pass Manager when P requests it
+ /// through getAnalysis interface.
+ virtual void addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass);
+
+ virtual Pass * getOnTheFlyPass(Pass *P, const PassInfo *PI, Function &F) {
+ assert (0 && "Unable to find on the fly pass");
+ return NULL;
+ }
+
/// Initialize available analysis information.
void initializeAnalysisInfo() {
AvailableAnalysis.clear();
bool preserveHigherLevelAnalysis(Pass *P);
- /// Populate RequiredPasses with the analysis pass that are required by
- /// pass P.
- void collectRequiredAnalysisPasses(std::vector<Pass *> &RequiredPasses,
- Pass *P);
+ /// Populate RequiredPasses with analysis pass that are required by
+ /// pass P and are available. Populate ReqPassNotAvailable with analysis
+ /// pass that are required by pass P but are not available.
+ void collectRequiredAnalysis(SmallVector<Pass *, 8> &RequiredPasses,
+ SmallVector<AnalysisID, 8> &ReqPassNotAvailable,
+ 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
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;
class FPPassManager : public ModulePass, public PMDataManager {
public:
- FPPassManager(int Depth) : PMDataManager(Depth) { }
+ static char ID;
+ explicit FPPassManager(int 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
+