X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FPassManagers.h;h=1aa0d3a6fa427cc64114ea9d4db5ac428d06cff8;hb=47128fe2969b90880c5ffdbeb8c699a06bbaa9f9;hp=0c6ff19f9ff5e3ffed47ca887604a7213e67ae2e;hpb=5d9bac6d8d3eb44823009e6d2609e39256df7e44;p=oota-llvm.git diff --git a/include/llvm/PassManagers.h b/include/llvm/PassManagers.h index 0c6ff19f9ff..1aa0d3a6fa4 100644 --- a/include/llvm/PassManagers.h +++ b/include/llvm/PassManagers.h @@ -1,4 +1,4 @@ -//===- llvm/PassManager.h - Pass Inftrastructre classes --------*- C++ -*-===// +//===- llvm/PassManagers.h - Pass Infrastructure classes -------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -11,8 +11,13 @@ // //===----------------------------------------------------------------------===// +#ifndef LLVM_PASSMANAGERS_H +#define LLVM_PASSMANAGERS_H + #include "llvm/PassManager.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/DenseMap.h" #include #include @@ -28,8 +33,8 @@ // // Pass Manager Infrastructure uses multiple pass managers. They are // PassManager, FunctionPassManager, MPPassManager, FPPassManager, BBPassManager. -// This class hierarcy uses multiple inheritance but pass managers do not derive -// from another pass manager. +// This class hierarchy uses multiple inheritance but pass managers do not +// derive from another pass manager. // // PassManager and FunctionPassManager are two top-level pass manager that // represents the external interface of this entire pass manager infrastucture. @@ -83,10 +88,12 @@ // MPPassManagers. //===----------------------------------------------------------------------===// -#ifndef PASSMANAGERS_H -#define PASSMANAGERS_H +#include "llvm/Support/PrettyStackTrace.h" namespace llvm { + class Pass; + class Value; + class Module; /// FunctionPassManager and PassManager, two top level managers, serve /// as the public interface of pass manager infrastructure. @@ -107,6 +114,25 @@ enum PassDebuggingString { ON_CG_MSG // "' on Call Graph ...\n'" }; +/// PassManagerPrettyStackEntry - This is used to print informative information +/// about what pass is running when/if a stack trace is generated. +class PassManagerPrettyStackEntry : public PrettyStackTraceEntry { + Pass *P; + Value *V; + Module *M; +public: + PassManagerPrettyStackEntry(Pass *p) + : P(p), V(0), M(0) {} // When P is releaseMemory'd. + PassManagerPrettyStackEntry(Pass *p, Value &v) + : P(p), V(&v), M(0) {} // When P is run on V + PassManagerPrettyStackEntry(Pass *p, Module &m) + : P(p), V(0), M(&m) {} // When P is run on M + + /// print - Emit information about this stack frame to OS. + virtual void print(raw_ostream &OS) const; +}; + + //===----------------------------------------------------------------------===// // PMStack // @@ -169,6 +195,9 @@ public: /// then return NULL. Pass *findAnalysisPass(AnalysisID AID); + /// Find analysis usage information for the pass P. + AnalysisUsage *findAnalysisUsage(Pass *P); + explicit PMTopLevelManager(enum TopLevelManagerType t); virtual ~PMTopLevelManager(); @@ -178,7 +207,7 @@ public: ImmutablePasses.push_back(P); } - inline std::vector& getImmutablePasses() { + inline SmallVector& getImmutablePasses() { return ImmutablePasses; } @@ -204,20 +233,27 @@ public: protected: /// Collection of pass managers - std::vector PassManagers; + SmallVector PassManagers; private: /// Collection of pass managers that are not directly maintained /// by this pass manager - std::vector IndirectPassManagers; + SmallVector IndirectPassManagers; // Map to keep track of last user of the analysis pass. // LastUser->second is the last user of Lastuser->first. - std::map LastUser; + DenseMap LastUser; + + // Map to keep track of passes that are last used by a pass. + // This inverse map is initialized at PM->run() based on + // LastUser map. + DenseMap > InversedLastUser; /// Immutable passes are managed by top level manager. - std::vector ImmutablePasses; + SmallVector ImmutablePasses; + + DenseMap AnUsageMap; }; @@ -242,6 +278,9 @@ public: /// verifyPreservedAnalysis -- Verify analysis presreved by pass P. void verifyPreservedAnalysis(Pass *P); + /// verifyDomInfo -- Verify dominator information if it is available. + void verifyDomInfo(Pass &P, Function &F); + /// Remove Analysis that is not preserved by the pass void removeNotPreservedAnalysis(Pass *P); @@ -302,8 +341,8 @@ public: void dumpPassArguments() const; void dumpPassInfo(Pass *P, enum PassDebuggingString S1, enum PassDebuggingString S2, const char *Msg); - void dumpAnalysisSetInfo(const char *Msg, Pass *P, - const std::vector &Set) const; + void dumpRequiredSet(const Pass *P) const; + void dumpPreservedSet(const Pass *P) const; virtual unsigned getNumContainedPasses() const { return (unsigned)PassVector.size(); @@ -332,7 +371,7 @@ protected: PMTopLevelManager *TPM; // Collection of pass that are managed by this manager - std::vector PassVector; + SmallVector PassVector; // Collection of Analysis provided by Parent pass manager and // used by current pass manager. At at time there can not be more @@ -340,6 +379,9 @@ protected: std::map *InheritedAnalysis[PMT_Last]; private: + void dumpAnalysisUsage(const char *Msg, const Pass *P, + const AnalysisUsage::VectorType &Set) const; + // 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 @@ -348,7 +390,7 @@ private: // Collection of higher level analysis used by the pass managed by // this manager. - std::vector HigherLevelAnalysis; + SmallVector HigherLevelAnalysis; unsigned Depth; }; @@ -366,12 +408,15 @@ class FPPassManager : public ModulePass, public PMDataManager { public: static char ID; explicit FPPassManager(int Depth) - : ModulePass(intptr_t(&ID)), PMDataManager(Depth) { } + : ModulePass(&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 runOnFunction(Function &F); bool runOnModule(Module &M); + + /// cleanup - After running all passes, clean up pass manager cache. + void cleanup(); /// doInitialization - Run all of the initializers for the function passes. /// @@ -410,4 +455,3 @@ extern void StartPassTimer(llvm::Pass *); extern void StopPassTimer(llvm::Pass *); #endif -