From 9650983b9a30804d3479aeffb2a7f8bdb6b33942 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Wed, 21 Jul 2010 17:52:45 +0000 Subject: [PATCH] Move the smarts of AnalysisGroup registration into PassRegistry. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@109019 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/PassRegistry.h | 5 ++-- lib/VMCore/Pass.cpp | 27 +++------------------- lib/VMCore/PassRegistry.cpp | 46 ++++++++++++++++++++++++++----------- 3 files changed, 38 insertions(+), 40 deletions(-) diff --git a/include/llvm/PassRegistry.h b/include/llvm/PassRegistry.h index 7b1b6fc703a..193ecfd1b58 100644 --- a/include/llvm/PassRegistry.h +++ b/include/llvm/PassRegistry.h @@ -58,9 +58,8 @@ public: void unregisterPass(const PassInfo &PI); /// Analysis Group Mechanisms. - void registerAnalysisGroup(PassInfo *InterfaceInfo, - const PassInfo *ImplementationInfo, - bool isDefault); + void registerAnalysisGroup(intptr_t InterfaceID, intptr_t PassID, + PassInfo& Registeree, bool isDefault); void enumerateWith(PassRegistrationListener *L); void addRegistrationListener(PassRegistrationListener* L); diff --git a/lib/VMCore/Pass.cpp b/lib/VMCore/Pass.cpp index 75ee17cd5a5..5a176d59f9b 100644 --- a/lib/VMCore/Pass.cpp +++ b/lib/VMCore/Pass.cpp @@ -264,30 +264,9 @@ Pass *PassInfo::createPass() const { // RegisterAGBase::RegisterAGBase(const char *Name, intptr_t InterfaceID, intptr_t PassID, bool isDefault) - : PassInfo(Name, InterfaceID) { - - PassInfo *InterfaceInfo = - const_cast(Pass::lookupPassInfo(InterfaceID)); - if (InterfaceInfo == 0) { - // First reference to Interface, register it now. - PassRegistry::getPassRegistry()->registerPass(*this); - InterfaceInfo = this; - } - assert(isAnalysisGroup() && - "Trying to join an analysis group that is a normal pass!"); - - if (PassID) { - const PassInfo *ImplementationInfo = Pass::lookupPassInfo(PassID); - assert(ImplementationInfo && - "Must register pass before adding to AnalysisGroup!"); - - // Make sure we keep track of the fact that the implementation implements - // the interface. - PassInfo *IIPI = const_cast(ImplementationInfo); - IIPI->addInterfaceImplemented(InterfaceInfo); - - PassRegistry::getPassRegistry()->registerAnalysisGroup(InterfaceInfo, IIPI, isDefault); - } + : PassInfo(Name, InterfaceID) { + PassRegistry::getPassRegistry()->registerAnalysisGroup(InterfaceID, PassID, + *this, isDefault); } diff --git a/lib/VMCore/PassRegistry.cpp b/lib/VMCore/PassRegistry.cpp index 140719e12b3..844d82660b4 100644 --- a/lib/VMCore/PassRegistry.cpp +++ b/lib/VMCore/PassRegistry.cpp @@ -108,20 +108,40 @@ void PassRegistry::enumerateWith(PassRegistrationListener *L) { /// Analysis Group Mechanisms. -void PassRegistry::registerAnalysisGroup(PassInfo *InterfaceInfo, - const PassInfo *ImplementationInfo, +void PassRegistry::registerAnalysisGroup(intptr_t InterfaceID, + intptr_t PassID, + PassInfo& Registeree, bool isDefault) { - sys::SmartScopedLock Guard(Lock); - AnalysisGroupInfo &AGI = AnalysisGroupInfoMap[InterfaceInfo]; - assert(AGI.Implementations.count(ImplementationInfo) == 0 && - "Cannot add a pass to the same analysis group more than once!"); - AGI.Implementations.insert(ImplementationInfo); - if (isDefault) { - assert(InterfaceInfo->getNormalCtor() == 0 && - "Default implementation for analysis group already specified!"); - assert(ImplementationInfo->getNormalCtor() && - "Cannot specify pass as default if it does not have a default ctor"); - InterfaceInfo->setNormalCtor(ImplementationInfo->getNormalCtor()); + PassInfo *InterfaceInfo = const_cast(getPassInfo(InterfaceID)); + if (InterfaceInfo == 0) { + // First reference to Interface, register it now. + registerPass(Registeree); + InterfaceInfo = &Registeree; + } + assert(Registeree.isAnalysisGroup() && + "Trying to join an analysis group that is a normal pass!"); + + if (PassID) { + PassInfo *ImplementationInfo = const_cast(getPassInfo(PassID)); + assert(ImplementationInfo && + "Must register pass before adding to AnalysisGroup!"); + + // Make sure we keep track of the fact that the implementation implements + // the interface. + ImplementationInfo->addInterfaceImplemented(InterfaceInfo); + + sys::SmartScopedLock Guard(Lock); + AnalysisGroupInfo &AGI = AnalysisGroupInfoMap[InterfaceInfo]; + assert(AGI.Implementations.count(ImplementationInfo) == 0 && + "Cannot add a pass to the same analysis group more than once!"); + AGI.Implementations.insert(ImplementationInfo); + if (isDefault) { + assert(InterfaceInfo->getNormalCtor() == 0 && + "Default implementation for analysis group already specified!"); + assert(ImplementationInfo->getNormalCtor() && + "Cannot specify pass as default if it does not have a default ctor"); + InterfaceInfo->setNormalCtor(ImplementationInfo->getNormalCtor()); + } } } -- 2.34.1