[cfe-commits] r54762 - in /cfe/trunk: include/clang/Analysis/PathSensitive/GRState.h include/clang/Analysis/PathSensitive/GRTransferFuncs.h lib/Analysis/CFRefCount.cpp lib/Analysis/GRExprEngine.cpp lib/Analysis/GRState.cpp

Ted Kremenek kremenek at apple.com
Wed Aug 13 14:24:50 PDT 2008


Author: kremenek
Date: Wed Aug 13 16:24:49 2008
New Revision: 54762

URL: http://llvm.org/viewvc/llvm-project?rev=54762&view=rev
Log:
Renamed GRState::CheckerStatePrinter to GRState::Printer.
Updated checker state printer interface to allow transfer functions to return an arbitrary number of GRState::Printers.

Modified:
    cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h
    cfe/trunk/include/clang/Analysis/PathSensitive/GRTransferFuncs.h
    cfe/trunk/lib/Analysis/CFRefCount.cpp
    cfe/trunk/lib/Analysis/GRExprEngine.cpp
    cfe/trunk/lib/Analysis/GRState.cpp

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h?rev=54762&r1=54761&r2=54762&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h Wed Aug 13 16:24:49 2008
@@ -171,19 +171,18 @@
   ce_iterator ce_begin() const { return ConstEq.begin(); }
   ce_iterator ce_end() const { return ConstEq.end(); }
   
-  class CheckerStatePrinter {
+  class Printer {
   public:
-    virtual ~CheckerStatePrinter() {}
-    virtual void PrintCheckerState(std::ostream& Out, void* State,
-                                   const char* nl, const char* sep) = 0;
+    virtual ~Printer() {}
+    virtual void Print(std::ostream& Out, const GRState* state,
+                       const char* nl, const char* sep) = 0;
   };
 
-  void print(std::ostream& Out, CheckerStatePrinter* P = NULL,
-             const char* nl = "\n", const char* sep = "") const;
+  void print(std::ostream& Out, Printer **Beg = 0, Printer **End = 0,
+             const char* nl = "\n", const char *sep = "") const;
   
-  void printStdErr(CheckerStatePrinter* P = NULL) const;
-  
-  void printDOT(std::ostream& Out, CheckerStatePrinter*P = NULL) const;
+  void printStdErr(Printer **Beg = 0, Printer **End = 0) const;  
+  void printDOT(std::ostream& Out, Printer **Beg = 0, Printer **End = 0) const;
 };  
   
 template<> struct GRTrait<GRState*> {

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRTransferFuncs.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRTransferFuncs.h?rev=54762&r1=54761&r2=54762&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRTransferFuncs.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRTransferFuncs.h Wed Aug 13 16:24:49 2008
@@ -18,6 +18,7 @@
 #include "clang/Analysis/PathSensitive/RValues.h"
 #include "clang/Analysis/PathSensitive/GRCoreEngine.h"
 #include "clang/Analysis/PathSensitive/GRState.h"
+#include <vector>
 
 namespace clang {
   
@@ -42,10 +43,7 @@
   GRTransferFuncs() {}
   virtual ~GRTransferFuncs() {}
   
-  virtual GRState::CheckerStatePrinter* getCheckerStatePrinter() {
-    return NULL;
-  }
-  
+  virtual void getStatePrinters(std::vector<GRState::Printer*>& Printers) {}
   virtual void RegisterChecks(GRExprEngine& Eng);
   
   // Casts.

Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=54762&r1=54761&r2=54762&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
+++ cfe/trunk/lib/Analysis/CFRefCount.cpp Wed Aug 13 16:24:49 2008
@@ -1211,10 +1211,10 @@
   typedef llvm::DenseMap<GRExprEngine::NodeTy*, std::vector<SymbolID>*>
           LeaksTy;
 
-  class BindingsPrinter : public GRState::CheckerStatePrinter {
+  class BindingsPrinter : public GRState::Printer {
   public:
-    virtual void PrintCheckerState(std::ostream& Out, void* State,
-                                   const char* nl, const char* sep);
+    virtual void Print(std::ostream& Out, const GRState* state,
+                       const char* nl, const char* sep);
   };
 
 private:
@@ -1231,6 +1231,10 @@
   static RefBindings GetRefBindings(const GRState& StImpl) {
     return RefBindings((const RefBindings::TreeTy*) StImpl.CheckerState);
   }
+  
+  static RefBindings GetRefBindings(const GRState* state) {
+    return RefBindings((const RefBindings::TreeTy*) state->CheckerState);
+  }
 
 private:
   
@@ -1272,8 +1276,8 @@
   
   virtual void RegisterChecks(GRExprEngine& Eng);
  
-  virtual GRState::CheckerStatePrinter* getCheckerStatePrinter() {
-    return &Printer;
+  virtual void getStatePrinters(std::vector<GRState::Printer*>& Printers) {
+    Printers.push_back(&Printer);
   }
   
   bool isGCEnabled() const { return Summaries.isGCEnabled(); }
@@ -1363,12 +1367,12 @@
 
 
 
-void CFRefCount::BindingsPrinter::PrintCheckerState(std::ostream& Out,
-                                                    void* State, const char* nl,
-                                                    const char* sep) {
-  RefBindings B((RefBindings::TreeTy*) State);
+void CFRefCount::BindingsPrinter::Print(std::ostream& Out, const GRState* state,
+                                        const char* nl, const char* sep) {
+    
+  RefBindings B = GetRefBindings(state);
   
-  if (State)
+  if (!B.isEmpty())
     Out << sep << nl;
   
   for (RefBindings::iterator I=B.begin(), E=B.end(); I!=E; ++I) {

Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=54762&r1=54761&r2=54762&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Wed Aug 13 16:24:49 2008
@@ -2257,7 +2257,7 @@
 #ifndef NDEBUG
 static GRExprEngine* GraphPrintCheckerState;
 static SourceManager* GraphPrintSourceManager;
-static GRState::CheckerStatePrinter* GraphCheckerStatePrinter;
+static GRState::Printer **GraphStatePrinterBeg, **GraphStatePrinterEnd;
 
 namespace llvm {
 template<>
@@ -2500,7 +2500,7 @@
     
     Out << "\\|StateID: " << (void*) N->getState() << "\\|";
 
-    N->getState()->printDOT(Out, GraphCheckerStatePrinter);
+    N->getState()->printDOT(Out, GraphStatePrinterBeg, GraphStatePrinterEnd);
       
     Out << "\\l";
     return Out.str();
@@ -2565,13 +2565,20 @@
   else {
     GraphPrintCheckerState = this;
     GraphPrintSourceManager = &getContext().getSourceManager();
-    GraphCheckerStatePrinter = getTF().getCheckerStatePrinter();
+
+    // Get the state printers.
+    std::vector<GRState::Printer*> Printers;
+    getTF().getStatePrinters(Printers);   
+    GraphStatePrinterBeg = Printers.empty() ? 0 : &Printers[0];
+    GraphStatePrinterEnd = Printers.empty() ? 0 : &Printers[0]+Printers.size();
+    
 
     llvm::ViewGraph(*G.roots_begin(), "GRExprEngine");
     
     GraphPrintCheckerState = NULL;
     GraphPrintSourceManager = NULL;
-    GraphCheckerStatePrinter = NULL;
+    GraphStatePrinterBeg = NULL;
+    GraphStatePrinterEnd = NULL;
   }
 #endif
 }
@@ -2580,7 +2587,12 @@
 #ifndef NDEBUG
   GraphPrintCheckerState = this;
   GraphPrintSourceManager = &getContext().getSourceManager();
-  GraphCheckerStatePrinter = getTF().getCheckerStatePrinter();
+  
+  // Get the state printers.
+  std::vector<GRState::Printer*> Printers;
+  getTF().getStatePrinters(Printers);
+  GraphStatePrinterBeg = Printers.empty() ? 0 : &Printers[0];
+  GraphStatePrinterEnd = Printers.empty() ? 0 : &Printers[0]+Printers.size();
   
   GRExprEngine::GraphTy* TrimmedG = G.Trim(Beg, End);
 
@@ -2593,6 +2605,7 @@
   
   GraphPrintCheckerState = NULL;
   GraphPrintSourceManager = NULL;
-  GraphCheckerStatePrinter = NULL;
+  GraphStatePrinterBeg = NULL;
+  GraphStatePrinterEnd = NULL;
 #endif
 }

Modified: cfe/trunk/lib/Analysis/GRState.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRState.cpp?rev=54762&r1=54761&r2=54762&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/GRState.cpp (original)
+++ cfe/trunk/lib/Analysis/GRState.cpp Wed Aug 13 16:24:49 2008
@@ -202,16 +202,17 @@
   return I;
 }
 
-void GRState::printDOT(std::ostream& Out, CheckerStatePrinter* P) const {
-  print(Out, P, "\\l", "\\|");
+void GRState::printDOT(std::ostream& Out,
+                       Printer** Beg, Printer** End) const {
+  print(Out, Beg, End, "\\l", "\\|");
 }
 
-void GRState::printStdErr(CheckerStatePrinter* P) const {
-  print(*llvm::cerr, P);
+void GRState::printStdErr(Printer** Beg, Printer** End) const {
+  print(*llvm::cerr, Beg, End);
 }  
 
-void GRState::print(std::ostream& Out, CheckerStatePrinter* P,
-                       const char* nl, const char* sep) const {
+void GRState::print(std::ostream& Out, Printer** Beg, Printer** End,
+                    const char* nl, const char* sep) const {
 
   // Print Variable Bindings
   Out << "Variables:" << nl;
@@ -264,6 +265,7 @@
   }
   
   // Print equality constraints.
+  // FIXME: Make just another printer do this.
   
   if (!ConstEq.isEmpty()) {
   
@@ -278,6 +280,7 @@
   }
 
   // Print != constraints.
+  // FIXME: Make just another printer do this.
     
   if (!ConstNotEq.isEmpty()) {
   
@@ -300,10 +303,8 @@
     }
   }
   
-  // Print checker-specific data.
-  
-  if (P && CheckerState)
-    P->PrintCheckerState(Out, CheckerState, nl, sep);
+  // Print checker-specific data. 
+  for ( ; Beg != End ; ++Beg) (*Beg)->Print(Out, this, nl, sep);
 }
 
 





More information about the cfe-commits mailing list