X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=include%2Fllvm%2FPassSupport.h;h=09abe93e916dd07b46c6501a479396ca595038de;hp=7121835a7e524f88be44c505583039aad3f54528;hb=8be3291f5942e3ae4a5d66c480e7aabe2f771031;hpb=13d57320bd212483463d4f8992d5787b29eda5df diff --git a/include/llvm/PassSupport.h b/include/llvm/PassSupport.h index 7121835a7e5..09abe93e916 100644 --- a/include/llvm/PassSupport.h +++ b/include/llvm/PassSupport.h @@ -21,7 +21,7 @@ #ifndef LLVM_PASS_SUPPORT_H #define LLVM_PASS_SUPPORT_H -// No need to include Pass.h, we are being included by it! +#include "Pass.h" namespace llvm { @@ -36,6 +36,10 @@ class TargetMachine; class PassInfo { public: typedef Pass* (*NormalCtor_t)(); + struct InterfaceInfo { + const PassInfo *interface; + const InterfaceInfo *next; + }; private: const char *const PassName; // Nice name for Pass @@ -44,7 +48,7 @@ private: const bool IsCFGOnlyPass; // Pass only looks at the CFG. const bool IsAnalysis; // True if an analysis pass. const bool IsAnalysisGroup; // True if an analysis group. - std::vector ItfImpl;// Interfaces implemented by this pass + const InterfaceInfo *ItfImpl;// Interfaces implemented by this pass NormalCtor_t NormalCtor; @@ -82,6 +86,11 @@ public: /// TODO : Rename intptr_t getTypeInfo() const { return PassID; } + /// Return true if this PassID implements the specified ID pointer. + bool isPassID(void *IDPtr) const { + return PassID == (intptr_t)IDPtr; + } + /// isAnalysisGroup - Return true if this is an analysis group, not a normal /// pass. /// @@ -104,36 +113,26 @@ public: } /// createPass() - Use this method to create an instance of this pass. - Pass *createPass() const { - assert((!isAnalysisGroup() || NormalCtor) && - "No default implementation found for analysis group!"); - assert(NormalCtor && - "Cannot call createPass on PassInfo without default ctor!"); - return NormalCtor(); - } + Pass *createPass() const; /// addInterfaceImplemented - This method is called when this pass is /// registered as a member of an analysis group with the RegisterAnalysisGroup /// template. /// void addInterfaceImplemented(const PassInfo *ItfPI) { - ItfImpl.push_back(ItfPI); + InterfaceInfo *NewInfo = new InterfaceInfo(); + NewInfo->interface = ItfPI; + NewInfo->next = ItfImpl; + ItfImpl = NewInfo; } /// getInterfacesImplemented - Return a list of all of the analysis group /// interfaces implemented by this pass. /// - const std::vector &getInterfacesImplemented() const { + const InterfaceInfo *getInterfacesImplemented() const { return ItfImpl; } - /// getPassInfo - Deprecated API compaatibility function. This function - /// just returns 'this'. - /// - const PassInfo *getPassInfo() const { - return this; - } - protected: void registerPass(); void unregisterPass(); @@ -185,7 +184,7 @@ struct RegisterPass : public PassInfo { /// /// If no analysis implementing the interface is available, a default /// implementation is created and added. A pass registers itself as the default -/// implementation by specifying 'true' as the third template argument of this +/// implementation by specifying 'true' as the second template argument of this /// class. /// /// In addition to registering itself as an analysis group member, a pass must @@ -197,14 +196,11 @@ struct RegisterPass : public PassInfo { /// a nice name with the interface. /// class RegisterAGBase : public PassInfo { - PassInfo *InterfaceInfo; - const PassInfo *ImplementationInfo; - bool isDefaultImplementation; protected: - explicit RegisterAGBase(const char *Name, - intptr_t InterfaceID, - intptr_t PassID = 0, - bool isDefault = false); + RegisterAGBase(const char *Name, + intptr_t InterfaceID, + intptr_t PassID = 0, + bool isDefault = false); }; template