- // Register Pass using default constructor explicitly...
- RegisterAnalysis(const char *PassArg, const char *Name, Pass *(*ctor)()) {
- registerPass(new PassInfo(Name, PassArg, typeid(PassName),
- PassInfo::Analys, ctor, 0));
+
+/// 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) {