Improve printing of dominator sets
[oota-llvm.git] / lib / VMCore / Pass.cpp
index 3d09d9d7e1c8b1d78724f00ab8ccf193db48439f..85c4dec5fe722876aba27eb79f1a533512f219e2 100644 (file)
 #include "Support/TypeInfo.h"
 #include <stdio.h>
 #include <sys/resource.h>
+#include <sys/time.h>
 #include <sys/unistd.h>
 #include <set>
 
+// IncludeFile - Stub function used to help linking out.
+IncludeFile::IncludeFile(void*) {}
+
 //===----------------------------------------------------------------------===//
 //   AnalysisID Class Implementation
 //
@@ -252,8 +256,10 @@ void PMDebug::PrintAnalysisSetInfo(unsigned Depth, const char *Msg,
                                    Pass *P, const std::vector<AnalysisID> &Set){
   if (PassDebugging >= Details && !Set.empty()) {
     std::cerr << (void*)P << std::string(Depth*2+3, ' ') << Msg << " Analyses:";
-    for (unsigned i = 0; i != Set.size(); ++i)
-      std::cerr << "  " << Set[i]->getPassName();
+    for (unsigned i = 0; i != Set.size(); ++i) {
+      if (i) std::cerr << ",";
+      std::cerr << " " << Set[i]->getPassName();
+    }
     std::cerr << "\n";
   }
 }
@@ -292,6 +298,15 @@ void Pass::dump() const {
   print(std::cerr, 0);
 }
 
+//===----------------------------------------------------------------------===//
+// ImmutablePass Implementation
+//
+void ImmutablePass::addToPassManager(PassManagerT<Module> *PM,
+                                     AnalysisUsage &AU) {
+  PM->addPass(this, AU);
+}
+
+
 //===----------------------------------------------------------------------===//
 // FunctionPass Implementation
 //
@@ -336,18 +351,20 @@ void FunctionPass::addToPassManager(PassManagerT<Function> *PM,
 // function.
 //
 bool BasicBlockPass::runOnFunction(Function &F) {
-  bool Changed = false;
+  bool Changed = doInitialization(F);
   for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
     Changed |= runOnBasicBlock(*I);
-  return Changed;
+  return Changed | doFinalization(F);
 }
 
 // To run directly on the basic block, we initialize, runOnBasicBlock, then
 // finalize.
 //
 bool BasicBlockPass::run(BasicBlock &BB) {
-  Module &M = *BB.getParent()->getParent();
-  return doInitialization(M) | runOnBasicBlock(BB) | doFinalization(M);
+  Function &F = *BB.getParent();
+  Module &M = *F.getParent();
+  return doInitialization(M) | doInitialization(F) | runOnBasicBlock(BB) |
+         doFinalization(F) | doFinalization(M);
 }
 
 void BasicBlockPass::addToPassManager(PassManagerT<Function> *PM,
@@ -437,8 +454,6 @@ RegisterAGBase::RegisterAGBase(const std::type_info &Interface,
                                const std::type_info *Pass, bool isDefault)
   : ImplementationInfo(0), isDefaultImplementation(isDefault) {
 
-  std::cerr << "Registering interface: " << Interface.name() << "\n";
-
   InterfaceInfo = const_cast<PassInfo*>(Pass::lookupPassInfo(Interface));
   if (InterfaceInfo == 0) {   // First reference to Interface, add it now.
     InterfaceInfo =   // Create the new PassInfo for the interface...
@@ -450,12 +465,15 @@ RegisterAGBase::RegisterAGBase(const std::type_info &Interface,
          "Trying to join an analysis group that is a normal pass!");
 
   if (Pass) {
-  std::cerr << "Registering interface impl: " << Pass->name() << "\n";
-
     ImplementationInfo = Pass::lookupPassInfo(*Pass);
     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<PassInfo*>(ImplementationInfo);
+    IIPI->addInterfaceImplemented(InterfaceInfo);
+
     // Lazily allocate to avoid nasty initialization order dependencies
     if (AnalysisGroupInfoMap == 0)
       AnalysisGroupInfoMap = new std::map<const PassInfo *,AnalysisGroupInfo>();
@@ -509,34 +527,6 @@ RegisterAGBase::~RegisterAGBase() {
 }
 
 
-// findAnalysisGroupMember - Return an iterator pointing to one of the elements
-// of Map if there is a pass in Map that is a member of the analysis group for
-// the specified AnalysisGroupID.
-//
-static std::map<const PassInfo*, Pass*>::const_iterator
-findAnalysisGroupMember(const PassInfo *AnalysisGroupID,
-                        const std::map<const PassInfo*, Pass*> &Map) {
-  assert(AnalysisGroupID->getPassType() == PassInfo::AnalysisGroup &&
-         "AnalysisGroupID is not an analysis group!");
-  assert(AnalysisGroupInfoMap && AnalysisGroupInfoMap->count(AnalysisGroupID) &&
-         "Analysis Group does not have any registered members!");
-
-  // Get the set of all known implementations of this analysis group...
-  std::set<const PassInfo *> &Impls = 
-    (*AnalysisGroupInfoMap)[AnalysisGroupID].Implementations;
-
-  // Scan over available passes, checking to see if any is a valid analysis
-  for (std::map<const PassInfo*, Pass*>::const_iterator I = Map.begin(),
-         E = Map.end(); I != E; ++I)
-    if (Impls.count(I->first))  // This is a valid analysis, return it.
-      return I;
-
-  return Map.end();  // Nothing of use found.
-}
-
-
-
-
 //===----------------------------------------------------------------------===//
 // PassRegistrationListener implementation
 //