X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=include%2Fllvm%2FPassAnalysisSupport.h;h=0454f2143fe7566afab961a1bc8345954bc6d6bc;hb=798cb2ab82afd5862c80594abf47dac5f4251221;hp=1575d565bbbd677ca34ae43883b601f215378cb5;hpb=3162691f69f85f740bc28f3ddca39b166d35187c;p=oota-llvm.git diff --git a/include/llvm/PassAnalysisSupport.h b/include/llvm/PassAnalysisSupport.h index 1575d565bbb..0454f2143fe 100644 --- a/include/llvm/PassAnalysisSupport.h +++ b/include/llvm/PassAnalysisSupport.h @@ -44,24 +44,26 @@ public: // for a pass. // AnalysisUsage &addRequiredID(AnalysisID ID) { + assert(ID && "Pass class not registered!"); Required.push_back(ID); return *this; } template AnalysisUsage &addRequired() { - assert(Pass::getClassPassInfo() && "Pass class not registered!"); - Required.push_back(Pass::getClassPassInfo()); - return *this; + return addRequiredID(Pass::getClassPassInfo()); } - template - AnalysisUsage &addRequiredTransitive() { - AnalysisID ID = Pass::getClassPassInfo(); + AnalysisUsage &addRequiredTransitiveID(AnalysisID ID) { assert(ID && "Pass class not registered!"); Required.push_back(ID); RequiredTransitive.push_back(ID); return *this; } + template + AnalysisUsage &addRequiredTransitive() { + AnalysisID ID = Pass::getClassPassInfo(); + return addRequiredTransitiveID(ID); + } // addPreserved - Add the specified ID to the set of analyses preserved by // this pass @@ -106,12 +108,12 @@ public: // the pass. // class PMDataManager; -class AnalysisResolver_New { +class AnalysisResolver { private: - AnalysisResolver_New(); // DO NOT IMPLEMENT + AnalysisResolver(); // DO NOT IMPLEMENT public: - AnalysisResolver_New(PMDataManager &P) : PM(P) { } + explicit AnalysisResolver(PMDataManager &P) : PM(P) { } inline PMDataManager &getPMDataManager() { return PM; } @@ -127,6 +129,9 @@ public: return ResultPass; } + // Find pass that is implementing PI. Initialize pass for Function F. + Pass *findImplPass(Pass *P, const PassInfo *PI, Function &F); + void addAnalysisImplsPair(const PassInfo *PI, Pass *P) { std::pair pir = std::make_pair(PI,P); AnalysisImpls.push_back(pir); @@ -137,7 +142,7 @@ public: // AnalysisImpls - This keeps track of which passes implements the interfaces // that are required by the current pass (to implement getAnalysis()). - // NOTE : Remove AnalysisImpls from class Pass, when AnalysisResolver_New + // NOTE : Remove AnalysisImpls from class Pass, when AnalysisResolver // replaces AnalysisResolver std::vector > AnalysisImpls; @@ -146,39 +151,6 @@ private: PMDataManager ± }; -//===----------------------------------------------------------------------===// -// AnalysisResolver - Simple interface implemented by PassManager objects that -// is used to pull analysis information out of them. -// -struct AnalysisResolver { - virtual ~AnalysisResolver(); - virtual Pass *getAnalysisOrNullUp(AnalysisID ID) const = 0; - virtual Pass *getAnalysisOrNullDown(AnalysisID ID) const = 0; - virtual void addPass(ImmutablePass *IP, AnalysisUsage &AU) = 0; - Pass *getAnalysis(AnalysisID ID) const { - Pass *Result = getAnalysisOrNullUp(ID); - assert(Result && "Pass has an incorrect analysis uses set!"); - return Result; - } - - // getAnalysisToUpdate - Return an analysis result or null if it doesn't exist - Pass *getAnalysisToUpdate(AnalysisID ID) const { - return getAnalysisOrNullUp(ID); - } - - // Methods for introspecting into pass manager objects... - virtual unsigned getDepth() const = 0; - virtual unsigned getNumContainedPasses() const = 0; - virtual const Pass *getContainedPass(unsigned N) const = 0; - - virtual void markPassUsed(AnalysisID P, Pass *User) = 0; - - void startPass(Pass *P) {} - void endPass(Pass *P) {} -protected: - void setAnalysisResolver(Pass *P, AnalysisResolver *AR); -}; - /// getAnalysisToUpdate() - This function is used by subclasses /// to get to the analysis information that might be around that needs to be /// updated. This is different than getAnalysis in that it can fail (ie the @@ -189,19 +161,12 @@ protected: /// template AnalysisType *Pass::getAnalysisToUpdate() const { -#ifdef USE_OLD_PASSMANAGER assert(Resolver && "Pass not resident in a PassManager object!"); -#else - assert(Resolver_New && "Pass not resident in a PassManager object!"); -#endif + const PassInfo *PI = getClassPassInfo(); if (PI == 0) return 0; -#ifdef USE_OLD_PASSMANAGER - return dynamic_cast(Resolver->getAnalysisToUpdate(PI)); -#else return dynamic_cast - (Resolver_New->getAnalysisToUpdate(PI, true)); -#endif + (Resolver->getAnalysisToUpdate(PI, true)); } /// getAnalysis() - This function is used by subclasses to get @@ -210,45 +175,23 @@ AnalysisType *Pass::getAnalysisToUpdate() const { /// template AnalysisType &Pass::getAnalysis() const { -#ifdef USE_OLD_PASSMANAGER - assert(Resolver && "Pass has not been inserted into a PassManager object!"); -#else - assert(Resolver_New && "Pass has not been inserted into a PassManager object!"); -#endif - const PassInfo *PI = getClassPassInfo(); - return getAnalysisID(PI); + assert(Resolver &&"Pass has not been inserted into a PassManager object!"); + + return getAnalysisID(getClassPassInfo()); } template AnalysisType &Pass::getAnalysisID(const PassInfo *PI) const { assert(PI && "getAnalysis for unregistered pass!"); -#ifdef USE_OLD_PASSMANAGER - assert(Resolver && "Pass has not been inserted into a PassManager object!"); - + assert(Resolver&&"Pass has not been inserted into a PassManager object!"); // PI *must* appear in AnalysisImpls. Because the number of passes used // should be a small number, we just do a linear search over a (dense) // vector. - Pass *ResultPass = 0; - for (unsigned i = 0; ; ++i) { - assert(i != AnalysisImpls.size() && - "getAnalysis*() called on an analysis that was not " - "'required' by pass!"); - if (AnalysisImpls[i].first == PI) { - ResultPass = AnalysisImpls[i].second; - break; - } - } -#else - assert(Resolver_New && "Pass has not been inserted into a PassManager object!"); - // PI *must* appear in AnalysisImpls. Because the number of passes used - // should be a small number, we just do a linear search over a (dense) - // vector. - Pass *ResultPass = Resolver_New->findImplPass(PI); + Pass *ResultPass = Resolver->findImplPass(PI); assert (ResultPass && "getAnalysis*() called on an analysis that was not " "'required' by pass!"); -#endif // Because the AnalysisType may not be a subclass of pass (for // AnalysisGroups), we must use dynamic_cast here to potentially adjust the // return pointer (because the class may multiply inherit, once from pass, @@ -259,6 +202,39 @@ AnalysisType &Pass::getAnalysisID(const PassInfo *PI) const { return *Result; } +/// getAnalysis() - This function is used by subclasses to get +/// to the analysis information that they claim to use by overriding the +/// getAnalysisUsage function. +/// +template +AnalysisType &Pass::getAnalysis(Function &F) { + assert(Resolver &&"Pass has not been inserted into a PassManager object!"); + + return getAnalysisID(getClassPassInfo(), F); +} + +template +AnalysisType &Pass::getAnalysisID(const PassInfo *PI, Function &F) { + assert(PI && "getAnalysis for unregistered pass!"); + assert(Resolver&&"Pass has not been inserted into a PassManager object!"); + // PI *must* appear in AnalysisImpls. Because the number of passes used + // should be a small number, we just do a linear search over a (dense) + // vector. + Pass *ResultPass = Resolver->findImplPass(this, PI, F); + assert (ResultPass && + "getAnalysis*() called on an analysis that was not " + "'required' by pass!"); + + // Because the AnalysisType may not be a subclass of pass (for + // AnalysisGroups), we must use dynamic_cast here to potentially adjust the + // return pointer (because the class may multiply inherit, once from pass, + // once from AnalysisType). + // + AnalysisType *Result = dynamic_cast(ResultPass); + assert(Result && "Pass does not implement interface required!"); + return *Result; +} + } // End llvm namespace #endif