+// 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 a specialization of RegisterAnalysisGroup that is used to set the name
+// for the analysis group.
+//
+template<typename Interface>
+struct RegisterAnalysisGroup<Interface, void, false> : public RegisterAGBase {
+ RegisterAnalysisGroup(const char *Name)
+ : RegisterAGBase(typeid(Interface)) {
+ setGroupName(Name);
+ }
+};
+
+
+