-
-// RegisterAnalysisGroup - Register a Pass as a member of an analysis _group_.
-// Analysis groups are used to define an interface (which need not derive from
-// Pass) that is required by passes to do their job. Analysis Groups differ
-// from normal analyses because any available implementation of the group will
-// be used if it is available.
-//
-// 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
-// class.
-//
-// In addition to registering itself as an analysis group member, a pass must
-// register itself normally as well. Passes may be members of multiple groups
-// and may still be "required" specifically by name.
-//
-// The actual interface may also be registered as well (by not specifying the
-// second template argument). The interface should be registered to associate a
-// nice name with the interface.
-//
-class RegisterAGBase : public RegisterPassBase {
- PassInfo *InterfaceInfo;
- const PassInfo *ImplementationInfo;
- bool isDefaultImplementation;
-protected:
- RegisterAGBase(const std::type_info &Interface,
- const std::type_info *Pass = 0,
- bool isDefault = false);
- void setGroupName(const char *Name);
-public:
- ~RegisterAGBase();
-};
-
-
-template<typename Interface, typename DefaultImplementationPass = void,
- bool Default = false>
-struct RegisterAnalysisGroup : public RegisterAGBase {
- RegisterAnalysisGroup() : RegisterAGBase(typeid(Interface),
- &typeid(DefaultImplementationPass),
- Default) {
+#define INITIALIZE_ANALYSIS_GROUP(agName, name, defaultPass) \
+ static void* initialize##agName##AnalysisGroupOnce(PassRegistry &Registry) { \
+ initialize##defaultPass##Pass(Registry); \
+ PassInfo *AI = new PassInfo(name, & agName :: ID); \
+ Registry.registerAnalysisGroup(& agName ::ID, 0, *AI, false, true); \
+ return AI; \
+ } \
+ void llvm::initialize##agName##AnalysisGroup(PassRegistry &Registry) { \
+ CALL_ONCE_INITIALIZATION(initialize##agName##AnalysisGroupOnce) \