Removed "ObserverTy" from core DataflowValues types.  The observer
mechanism can be implemented simply by affixing the Observer to an
analysis meta data, so it doesn't need to be a required type.  This
also permits analyses not to implement an Observer if it doesn't make
sense.

Changed "DataflowValues::MetaDataTy" to
"DataflowValues::AnalysisDataTy" to reflect that the type
enscapsulated the data associated with analyzing a given CFG.

Changed CFGStmtVisitor::BlockStmt_VisitImplicitControlFlowStmt(Stmt*)
to ...VisitImplicitControlFlowExpr(Expr*).  The type narrowing is more
precise and more useful to clients.

Added CFGStmtVisitor::BlockStmt_VisitExpr to reflect the visitation of
expressions at the block statement level.  This captures all implicit
control-flow statements as well as other expressions that are hoisted
to the block level (such as conditions for terminators and function
calls).  This is especially useful for dataflow analysis.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42034 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/UnintializedValues.cpp b/Analysis/UnintializedValues.cpp
index 58e263c..dd741c1 100644
--- a/Analysis/UnintializedValues.cpp
+++ b/Analysis/UnintializedValues.cpp
@@ -24,26 +24,30 @@
 
 namespace {
 
-class RegisterDecls : public CFGVarDeclVisitor<RegisterDecls> {
-  UninitializedValues::MetaDataTy& M;
+class RegisterDeclsAndExprs : public CFGVarDeclVisitor<RegisterDeclsAndExprs> {
+  UninitializedValues::AnalysisDataTy& AD;
 public:
-  RegisterDecls(const CFG& cfg, UninitializedValues::MetaDataTy& m) :
-    CFGVarDeclVisitor<RegisterDecls>(cfg), M(m) {}
+  RegisterDeclsAndExprs(const CFG& cfg, UninitializedValues::AnalysisDataTy& ad)
+                        : CFGVarDeclVisitor<RegisterDeclsAndExprs>(cfg), AD(ad)
+  {}
   
   void VisitVarDecl(VarDecl* D) {
-    if (M.Map.find(D) == M.Map.end()) {
-      M.Map[D] = M.NumDecls++;
-    }
-  }  
+    if (AD.VMap.find(D) == AD.VMap.end())
+      AD.VMap[D] = AD.Counter++;
+  }
+  
+  void BlockStmt_VisitExpr(Expr* E) {
+    if (AD.EMap.find(E) == AD.EMap.end())
+      AD.EMap[E] = AD.Counter++;
+  }        
 };
   
 } // end anonymous namespace
 
 void UninitializedValues::InitializeValues(const CFG& cfg) {
-  RegisterDecls R(cfg,this->getMetaData());
-  R.VisitAllDecls();
-    
-  getBlockDataMap()[ &cfg.getEntry() ].resize( getMetaData().NumDecls );
+  RegisterDeclsAndExprs R(cfg,this->getAnalysisData());
+  R.VisitAllDecls();    
+  getBlockDataMap()[ &cfg.getEntry() ].resize( getAnalysisData().Counter );
 }
 
 //===--------------------------------------------------------------------===//
@@ -53,15 +57,17 @@
 namespace {
 class TransferFuncs : public CFGStmtVisitor<TransferFuncs,bool> {
   UninitializedValues::ValTy V;
-  UninitializedValues::MetaDataTy& M;
-  UninitializedValues::ObserverTy* O;
+  UninitializedValues::AnalysisDataTy& AD;
 public:
-  TransferFuncs(UninitializedValues::MetaDataTy& m,
-                UninitializedValues::ObserverTy* o) : M(m), O(o) {
-    V.resize(M.NumDecls);
+  TransferFuncs(UninitializedValues::AnalysisDataTy& ad) : AD(ad) {
+    V.resize(AD.Counter);
   }
   
   UninitializedValues::ValTy& getVal() { return V; }
+  
+//  bool VisitDeclRefExpr(DeclRefExpr* DR);
+//  bool VisitBinaryOperator(BinaryOperator* B);
+//  bool VisitUnaryOperator(UnaryOperator* U);    
 };
 } // end anonymous namespace