//===----------------------------------------------------------------------===//
//
// This file defines PassRegistry, a class that is used in the initialization
-// and registration of passes. At initialization, passes are registered with
-// the PassRegistry, which is later provided to the PassManager for dependency
-// resolution and similar tasks.
+// and registration of passes. At application startup, passes are registered
+// with the PassRegistry, which is later provided to the PassManager for
+// dependency resolution and similar tasks.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_PASSREGISTRY_H
#define LLVM_PASSREGISTRY_H
-#include "llvm/PassSupport.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/System/DataTypes.h"
-#include "llvm/System/Mutex.h"
-#include <map>
-#include <set>
-
-using namespace llvm;
namespace llvm {
-class PassRegistry {
- /// Guards the contents of this class.
- mutable sys::SmartMutex<true> Lock;
-
- /// PassInfoMap - Keep track of the PassInfo object for each registered pass.
- typedef std::map<intptr_t, const PassInfo*> MapType;
- MapType PassInfoMap;
-
- typedef StringMap<const PassInfo*> StringMapType;
- StringMapType PassInfoStringMap;
-
- /// AnalysisGroupInfo - Keep track of information for each analysis group.
- struct AnalysisGroupInfo {
- std::set<const PassInfo *> Implementations;
- };
- std::map<const PassInfo*, AnalysisGroupInfo> AnalysisGroupInfoMap;
+class PassInfo;
+struct PassRegistrationListener;
+/// PassRegistry - This class manages the registration and intitialization of
+/// the pass subsystem as application startup, and assists the PassManager
+/// in resolving pass dependencies.
+/// NOTE: PassRegistry is NOT thread-safe. If you want to use LLVM on multiple
+/// threads simultaneously, you will need to use a separate PassRegistry on
+/// each thread.
+class PassRegistry {
+ mutable void *pImpl;
+ void *getImpl() const;
+
public:
static PassRegistry *getPassRegistry();
- const PassInfo *getPassInfo(intptr_t TI) const;
+ const PassInfo *getPassInfo(const void *TI) const;
const PassInfo *getPassInfo(StringRef Arg) const;
void registerPass(const PassInfo &PI);
void unregisterPass(const PassInfo &PI);
/// Analysis Group Mechanisms.
- void registerAnalysisGroup(PassInfo *InterfaceInfo,
- const PassInfo *ImplementationInfo,
- bool isDefault);
+ void registerAnalysisGroup(const void *InterfaceID, const void *PassID,
+ PassInfo& Registeree, bool isDefault);
void enumerateWith(PassRegistrationListener *L);
+ void addRegistrationListener(PassRegistrationListener *L);
+ void removeRegistrationListener(PassRegistrationListener *L);
};
}