-//===- PassManager.cpp - LLVM Pass Infrastructure Implementation ----------===//
+//===- llvm/PassManager.h - Pass Inftrastructre classes --------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
//
//===----------------------------------------------------------------------===//
//
-// This file implements the LLVM Pass Manager infrastructure.
+// This file declares the LLVM Pass Manager infrastructure.
//
//===----------------------------------------------------------------------===//
#include "llvm/PassManager.h"
-
+#include "llvm/ADT/SmallVector.h"
using namespace llvm;
class llvm::PMDataManager;
class llvm::PMStack;
// MPPassManagers.
//===----------------------------------------------------------------------===//
+#ifndef PASSMANAGERS_H
+#define PASSMANAGERS_H
+
namespace llvm {
+/// FunctionPassManager and PassManager, two top level managers, serve
+/// as the public interface of pass manager infrastructure.
+enum TopLevelManagerType {
+ TLM_Function, // FunctionPassManager
+ TLM_Pass // PassManager
+};
+
+// enums for debugging strings
+enum PassDebuggingString {
+ EXECUTION_MSG, // "Executing Pass '"
+ MODIFICATION_MSG, // "' Made Modification '"
+ FREEING_MSG, // " Freeing Pass '"
+ ON_BASICBLOCK_MSG, // "' on BasicBlock '" + PassName + "'...\n"
+ ON_FUNCTION_MSG, // "' on Function '" + FunctionName + "'...\n"
+ ON_MODULE_MSG, // "' on Module '" + ModuleName + "'...\n"
+ ON_LOOP_MSG, // " 'on Loop ...\n'"
+ ON_CG_MSG // "' on Call Graph ...\n'"
+};
+
//===----------------------------------------------------------------------===//
// PMTopLevelManager
//
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);
+ explicit PMTopLevelManager(enum TopLevelManagerType t);
virtual ~PMTopLevelManager();
/// Add immutable pass and initialize it.
/// used by pass managers.
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);
+ void removeDeadPasses(Pass *P, const char *Msg, enum PassDebuggingString);
/// Add pass P into the PassVector. Update
/// AvailableAnalysis appropriately if ProcessAnalysis is true.
- void addPassToManager(Pass *P, bool ProcessAnalysis = 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() {
- TransferLastUses.clear();
AvailableAnalysis.clear();
+ for (unsigned i = 0; i < PMT_Last; ++i)
+ InheritedAnalysis[i] = NULL;
}
- /// Populate RequiredPasses with the analysis pass that are required by
- /// pass P.
- void collectRequiredAnalysisPasses(std::vector<Pass *> &RequiredPasses,
- Pass *P);
+ // Return true if P preserves high level analysis used by other
+ // passes that are managed by this manager.
+ bool preserveHigherLevelAnalysis(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
// Print routines used by debug-pass
void dumpLastUses(Pass *P, unsigned Offset) const;
void dumpPassArguments() const;
- void dumpPassInfo(Pass *P, std::string &Msg1, std::string &Msg2) const;
+ void dumpPassInfo(Pass *P, enum PassDebuggingString S1,
+ enum PassDebuggingString S2, const char *Msg);
void dumpAnalysisSetInfo(const char *Msg, Pass *P,
const std::vector<AnalysisID> &Set) const;
- std::vector<Pass *>& getTransferredLastUses() {
- return TransferLastUses;
- }
-
virtual unsigned getNumContainedPasses() {
return PassVector.size();
}
- virtual PassManagerType getPassManagerType() {
+ virtual PassManagerType getPassManagerType() const {
assert ( 0 && "Invalid use of getPassManagerType");
return PMT_Unknown;
}
-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;
+ std::map<AnalysisID, Pass*> *getAvailableAnalysis() {
+ return &AvailableAnalysis;
+ }
+
+ // Collect AvailableAnalysis from all the active Pass Managers.
+ void populateInheritedAnalysis(PMStack &PMS) {
+ unsigned Index = 0;
+ for (PMStack::iterator I = PMS.begin(), E = PMS.end();
+ I != E; ++I)
+ InheritedAnalysis[Index++] = (*I)->getAvailableAnalysis();
+ }
+
+protected:
// Top level manager.
PMTopLevelManager *TPM;
// Collection of pass that are managed by this manager
std::vector<Pass *> PassVector;
+ // Collection of Analysis provided by Parent pass manager and
+ // used by current pass manager. At at time there can not be more
+ // then PMT_Last active pass mangers.
+ std::map<AnalysisID, Pass *> *InheritedAnalysis[PMT_Last];
+
private:
// Set of available Analysis. This information is used while scheduling
// pass. If a pass requires an analysis which is not not available then
// scheduled to run.
std::map<AnalysisID, Pass*> AvailableAnalysis;
+ // Collection of higher level analysis used by the pass managed by
+ // this manager.
+ std::vector<Pass *> HigherLevelAnalysis;
+
unsigned Depth;
};
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);
// Print passes managed by this manager
void dumpPassStructure(unsigned Offset);
+ virtual const char *getPassName() const {
+ return "Function Pass Manager";
+ }
+
FunctionPass *getContainedPass(unsigned N) {
assert ( N < PassVector.size() && "Pass number out of range!");
FunctionPass *FP = static_cast<FunctionPass *>(PassVector[N]);
return FP;
}
- virtual PassManagerType getPassManagerType() {
+ virtual PassManagerType getPassManagerType() const {
return PMT_FunctionPassManager;
}
};
}
+extern void StartPassTimer(Pass *);
+extern void StopPassTimer(Pass *);
+
+#endif
+