Home | History | Annotate | Download | only in VMCore
      1 //===- PassRegistry.cpp - Pass Registration Implementation ----------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file implements the PassRegistry, with which passes are registered on
     11 // initialization, and supports the PassManager in dependency resolution.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #include "llvm/PassRegistry.h"
     16 #include "llvm/PassSupport.h"
     17 #include "llvm/Support/Compiler.h"
     18 #include "llvm/Support/ManagedStatic.h"
     19 #include "llvm/Support/Mutex.h"
     20 #include "llvm/ADT/DenseMap.h"
     21 #include "llvm/ADT/SmallPtrSet.h"
     22 #include "llvm/ADT/StringMap.h"
     23 #include <vector>
     24 
     25 using namespace llvm;
     26 
     27 // FIXME: We use ManagedStatic to erase the pass registrar on shutdown.
     28 // Unfortunately, passes are registered with static ctors, and having
     29 // llvm_shutdown clear this map prevents successful resurrection after
     30 // llvm_shutdown is run.  Ideally we should find a solution so that we don't
     31 // leak the map, AND can still resurrect after shutdown.
     32 static ManagedStatic<PassRegistry> PassRegistryObj;
     33 PassRegistry *PassRegistry::getPassRegistry() {
     34   return &*PassRegistryObj;
     35 }
     36 
     37 static ManagedStatic<sys::SmartMutex<true> > Lock;
     38 
     39 //===----------------------------------------------------------------------===//
     40 // PassRegistryImpl
     41 //
     42 
     43 namespace {
     44 struct PassRegistryImpl {
     45   /// PassInfoMap - Keep track of the PassInfo object for each registered pass.
     46   typedef DenseMap<const void*, const PassInfo*> MapType;
     47   MapType PassInfoMap;
     48 
     49   typedef StringMap<const PassInfo*> StringMapType;
     50   StringMapType PassInfoStringMap;
     51 
     52   /// AnalysisGroupInfo - Keep track of information for each analysis group.
     53   struct AnalysisGroupInfo {
     54     SmallPtrSet<const PassInfo *, 8> Implementations;
     55   };
     56   DenseMap<const PassInfo*, AnalysisGroupInfo> AnalysisGroupInfoMap;
     57 
     58   std::vector<const PassInfo*> ToFree;
     59   std::vector<PassRegistrationListener*> Listeners;
     60 };
     61 } // end anonymous namespace
     62 
     63 void *PassRegistry::getImpl() const {
     64   if (!pImpl)
     65     pImpl = new PassRegistryImpl();
     66   return pImpl;
     67 }
     68 
     69 //===----------------------------------------------------------------------===//
     70 // Accessors
     71 //
     72 
     73 PassRegistry::~PassRegistry() {
     74   sys::SmartScopedLock<true> Guard(*Lock);
     75   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(pImpl);
     76 
     77   for (std::vector<const PassInfo*>::iterator I = Impl->ToFree.begin(),
     78        E = Impl->ToFree.end(); I != E; ++I)
     79     delete *I;
     80 
     81   delete Impl;
     82   pImpl = 0;
     83 }
     84 
     85 const PassInfo *PassRegistry::getPassInfo(const void *TI) const {
     86   sys::SmartScopedLock<true> Guard(*Lock);
     87   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
     88   PassRegistryImpl::MapType::const_iterator I = Impl->PassInfoMap.find(TI);
     89   return I != Impl->PassInfoMap.end() ? I->second : 0;
     90 }
     91 
     92 const PassInfo *PassRegistry::getPassInfo(StringRef Arg) const {
     93   sys::SmartScopedLock<true> Guard(*Lock);
     94   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
     95   PassRegistryImpl::StringMapType::const_iterator
     96     I = Impl->PassInfoStringMap.find(Arg);
     97   return I != Impl->PassInfoStringMap.end() ? I->second : 0;
     98 }
     99 
    100 //===----------------------------------------------------------------------===//
    101 // Pass Registration mechanism
    102 //
    103 
    104 void PassRegistry::registerPass(const PassInfo &PI, bool ShouldFree) {
    105   sys::SmartScopedLock<true> Guard(*Lock);
    106   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
    107   bool Inserted =
    108     Impl->PassInfoMap.insert(std::make_pair(PI.getTypeInfo(),&PI)).second;
    109   assert(Inserted && "Pass registered multiple times!");
    110   (void)Inserted;
    111   Impl->PassInfoStringMap[PI.getPassArgument()] = &PI;
    112 
    113   // Notify any listeners.
    114   for (std::vector<PassRegistrationListener*>::iterator
    115        I = Impl->Listeners.begin(), E = Impl->Listeners.end(); I != E; ++I)
    116     (*I)->passRegistered(&PI);
    117 
    118   if (ShouldFree) Impl->ToFree.push_back(&PI);
    119 }
    120 
    121 void PassRegistry::unregisterPass(const PassInfo &PI) {
    122   sys::SmartScopedLock<true> Guard(*Lock);
    123   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
    124   PassRegistryImpl::MapType::iterator I =
    125     Impl->PassInfoMap.find(PI.getTypeInfo());
    126   assert(I != Impl->PassInfoMap.end() && "Pass registered but not in map!");
    127 
    128   // Remove pass from the map.
    129   Impl->PassInfoMap.erase(I);
    130   Impl->PassInfoStringMap.erase(PI.getPassArgument());
    131 }
    132 
    133 void PassRegistry::enumerateWith(PassRegistrationListener *L) {
    134   sys::SmartScopedLock<true> Guard(*Lock);
    135   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
    136   for (PassRegistryImpl::MapType::const_iterator I = Impl->PassInfoMap.begin(),
    137        E = Impl->PassInfoMap.end(); I != E; ++I)
    138     L->passEnumerate(I->second);
    139 }
    140 
    141 
    142 /// Analysis Group Mechanisms.
    143 void PassRegistry::registerAnalysisGroup(const void *InterfaceID,
    144                                          const void *PassID,
    145                                          PassInfo& Registeree,
    146                                          bool isDefault,
    147                                          bool ShouldFree) {
    148   PassInfo *InterfaceInfo =  const_cast<PassInfo*>(getPassInfo(InterfaceID));
    149   if (InterfaceInfo == 0) {
    150     // First reference to Interface, register it now.
    151     registerPass(Registeree);
    152     InterfaceInfo = &Registeree;
    153   }
    154   assert(Registeree.isAnalysisGroup() &&
    155          "Trying to join an analysis group that is a normal pass!");
    156 
    157   if (PassID) {
    158     PassInfo *ImplementationInfo = const_cast<PassInfo*>(getPassInfo(PassID));
    159     assert(ImplementationInfo &&
    160            "Must register pass before adding to AnalysisGroup!");
    161 
    162     sys::SmartScopedLock<true> Guard(*Lock);
    163 
    164     // Make sure we keep track of the fact that the implementation implements
    165     // the interface.
    166     ImplementationInfo->addInterfaceImplemented(InterfaceInfo);
    167 
    168     PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
    169     PassRegistryImpl::AnalysisGroupInfo &AGI =
    170       Impl->AnalysisGroupInfoMap[InterfaceInfo];
    171     assert(AGI.Implementations.count(ImplementationInfo) == 0 &&
    172            "Cannot add a pass to the same analysis group more than once!");
    173     AGI.Implementations.insert(ImplementationInfo);
    174     if (isDefault) {
    175       assert(InterfaceInfo->getNormalCtor() == 0 &&
    176              "Default implementation for analysis group already specified!");
    177       assert(ImplementationInfo->getNormalCtor() &&
    178            "Cannot specify pass as default if it does not have a default ctor");
    179       InterfaceInfo->setNormalCtor(ImplementationInfo->getNormalCtor());
    180     }
    181   }
    182 
    183   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
    184   if (ShouldFree) Impl->ToFree.push_back(&Registeree);
    185 }
    186 
    187 void PassRegistry::addRegistrationListener(PassRegistrationListener *L) {
    188   sys::SmartScopedLock<true> Guard(*Lock);
    189   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
    190   Impl->Listeners.push_back(L);
    191 }
    192 
    193 void PassRegistry::removeRegistrationListener(PassRegistrationListener *L) {
    194   sys::SmartScopedLock<true> Guard(*Lock);
    195 
    196   // NOTE: This is necessary, because removeRegistrationListener() can be called
    197   // as part of the llvm_shutdown sequence.  Since we have no control over the
    198   // order of that sequence, we need to gracefully handle the case where the
    199   // PassRegistry is destructed before the object that triggers this call.
    200   if (!pImpl) return;
    201 
    202   PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl());
    203   std::vector<PassRegistrationListener*>::iterator I =
    204     std::find(Impl->Listeners.begin(), Impl->Listeners.end(), L);
    205   assert(I != Impl->Listeners.end() &&
    206          "PassRegistrationListener not registered!");
    207   Impl->Listeners.erase(I);
    208 }
    209