Modified LiveVariables to perform all of its base initialization in the ctor,
and now we require a FunctionDecl* object so that we can also keep track of
all of the ParmDecls.

Modified clients of LiveVariables to conform to the new interface.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46490 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp
index 69f344c..b96a905 100644
--- a/Driver/ASTConsumers.cpp
+++ b/Driver/ASTConsumers.cpp
@@ -449,7 +449,7 @@
 class CFGVisitor : public ASTConsumer {
 public:
   // CFG Visitor interface to be implemented by subclass.
-  virtual void VisitCFG(CFG& C) = 0;
+  virtual void VisitCFG(CFG& C, FunctionDecl& FD) = 0;
   virtual bool printFuncDeclStart() { return true; }
   
   virtual void HandleTopLevelDecl(Decl *D);
@@ -468,7 +468,7 @@
   }
     
   CFG *C = CFG::buildCFG(FD->getBody());
-  VisitCFG(*C);
+  VisitCFG(*C, *FD);
   delete C;
 }
 
@@ -481,7 +481,7 @@
   public:
     CFGDumper(bool use_graphviz) : UseGraphviz(use_graphviz) {}
     
-    virtual void VisitCFG(CFG &C) {
+    virtual void VisitCFG(CFG& C, FunctionDecl&) {
       if (UseGraphviz)
         C.viewCFG();
       else
@@ -505,8 +505,8 @@
       SM = &Context.getSourceManager();
     }
 
-    virtual void VisitCFG(CFG& C) {
-      LiveVariables L(C);
+    virtual void VisitCFG(CFG& C, FunctionDecl& FD) {
+      LiveVariables L(C, FD);
       L.runOnCFG(C);
       L.dumpBlockLiveness(*SM);
     }
@@ -530,7 +530,10 @@
       Ctx = &Context;
     }
     
-    virtual void VisitCFG(CFG& C) { CheckDeadStores(C, *Ctx, Diags); }
+    virtual void VisitCFG(CFG& C, FunctionDecl& FD) {
+      CheckDeadStores(C, FD, *Ctx, Diags);
+    }
+    
     virtual bool printFuncDeclStart() { return false; }
   }; 
 } // end anonymous namespace
@@ -553,7 +556,10 @@
       Ctx = &Context;
     }
     
-    virtual void VisitCFG(CFG& C) { CheckUninitializedValues(C, *Ctx, Diags); }
+    virtual void VisitCFG(CFG& C, FunctionDecl&) { 
+      CheckUninitializedValues(C, *Ctx, Diags);
+    }
+    
     virtual bool printFuncDeclStart() { return false; }
   }; 
 } // end anonymous namespace
@@ -566,12 +572,12 @@
 // GRConstants - Perform intra-procedural, path-sensitive constant propagation.
 
 namespace {
-  class GRConstantsVisitor : public ASTConsumer {
+  class GRConstantsVisitor : public CFGVisitor {
     ASTContext* Ctx;
   public:
     
     virtual void Initialize(ASTContext &Context) { Ctx = &Context; }    
-    virtual void HandleTopLevelDecl(Decl *D);
+    virtual void VisitCFG(CFG& C, FunctionDecl&);
   };
 } // end anonymous namespace
 
@@ -579,18 +585,8 @@
   return new GRConstantsVisitor();
 }
 
-void GRConstantsVisitor::HandleTopLevelDecl(Decl *D) {
-  FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
-
-  if (!FD || !FD->getBody())
-    return;
-
-  DeclPrinter().PrintFunctionDeclStart(FD);
-  llvm::cerr << '\n';
-  
-  CFG *C = CFG::buildCFG(FD->getBody());
-  RunGRConstants(*C, *FD, *Ctx);
-  delete C;
+void GRConstantsVisitor::VisitCFG(CFG& C, FunctionDecl& FD) {
+  RunGRConstants(C, FD, *Ctx);
 }
 
 //===----------------------------------------------------------------------===//