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/DataflowSolver.h b/Analysis/DataflowSolver.h
index e215000..de5f9a3 100644
--- a/Analysis/DataflowSolver.h
+++ b/Analysis/DataflowSolver.h
@@ -62,14 +62,13 @@
   typedef typename _DFValuesTy::AnalysisDirTag   AnalysisDirTag;
   typedef typename _DFValuesTy::ValTy            ValTy;
   typedef typename _DFValuesTy::BlockDataMapTy   BlockDataMapTy;
-  typedef typename _DFValuesTy::ObserverTy       ObserverTy;
 
   //===--------------------------------------------------------------------===//
   // External interface: constructing and running the solver.
   //===--------------------------------------------------------------------===//
   
 public:
-  DataflowSolver(DFValuesTy& d, ObserverTy* o = NULL) : D(d), O(o) {}
+  DataflowSolver(DFValuesTy& d) : D(d) {}
   ~DataflowSolver() {}  
   
   /// runOnCFG - Computes dataflow values for all blocks in a CFG.
@@ -86,7 +85,7 @@
   ///  only be used for querying the dataflow values within a block with
   ///  and Observer object.
   void runOnBlock(const CFGBlock* B) {
-    TransferFuncsTy TF (D.getMetaData(),O);
+    TransferFuncsTy TF (D.getAnalysisData());
     ProcessBlock(B,TF,AnalysisDirTag());
   }
   
@@ -106,7 +105,7 @@
     WorkList.enqueue(&cfg.getEntry());
     
     // Create the state for transfer functions.
-    TransferFuncsTy TF(D.getMetaData(),O);
+    TransferFuncsTy TF(D.getAnalysisData());
     
     // Process the worklist until it is empty.    
     while (!WorkList.isEmpty()) {
@@ -131,7 +130,7 @@
     WorkList.enqueue(&cfg.getExit());
     
     // Create the state for transfer functions.
-    TransferFuncsTy TF(D.getMetaData(),O);
+    TransferFuncsTy TF(D.getAnalysisData());
     
     // Process the worklist until it is empty.    
     while (!WorkList.isEmpty()) {
@@ -213,7 +212,6 @@
 
 private:
   DFValuesTy& D;
-  ObserverTy* O;
 };