diff options
-rw-r--r-- | include/clang/Analysis/PathSensitive/GRState.h | 3 | ||||
-rw-r--r-- | include/clang/Analysis/PathSensitive/Store.h | 6 | ||||
-rw-r--r-- | lib/Analysis/BasicStore.cpp | 23 | ||||
-rw-r--r-- | lib/Analysis/GRState.cpp | 24 |
4 files changed, 35 insertions, 21 deletions
diff --git a/include/clang/Analysis/PathSensitive/GRState.h b/include/clang/Analysis/PathSensitive/GRState.h index 1944cca8fa..584bf6edf9 100644 --- a/include/clang/Analysis/PathSensitive/GRState.h +++ b/include/clang/Analysis/PathSensitive/GRState.h @@ -171,7 +171,8 @@ public: const char* nl, const char* sep) = 0; }; - void print(std::ostream& Out, Printer **Beg = 0, Printer **End = 0, + void print(std::ostream& Out, StoreManager& StoreMgr, + Printer **Beg = 0, Printer **End = 0, const char* nl = "\n", const char *sep = "") const; }; diff --git a/include/clang/Analysis/PathSensitive/Store.h b/include/clang/Analysis/PathSensitive/Store.h index acc3d8e8bb..aa8dc234d4 100644 --- a/include/clang/Analysis/PathSensitive/Store.h +++ b/include/clang/Analysis/PathSensitive/Store.h @@ -19,6 +19,7 @@ #include "llvm/ADT/SmallSet.h" #include "llvm/ADT/DenseSet.h" #include <vector> +#include <iosfwd> namespace clang { @@ -41,8 +42,11 @@ public: virtual Store RemoveDeadBindings(Store store, Stmt* Loc, const LiveVariables& Live, - DeclRootsTy& DRoots, LiveSymbolsTy& LSymbols, + DeclRootsTy& DRoots, LiveSymbolsTy& LSymbols, DeadSymbolsTy& DSymbols) = 0; + + virtual void print(Store store, std::ostream& Out, + const char* nl, const char *sep) = 0; }; } // end clang namespace diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp index 15284567e6..24ec7f0e38 100644 --- a/lib/Analysis/BasicStore.cpp +++ b/lib/Analysis/BasicStore.cpp @@ -16,6 +16,7 @@ #include "clang/Analysis/PathSensitive/GRState.h" #include "llvm/ADT/ImmutableMap.h" #include "llvm/Support/Compiler.h" +#include "llvm/Support/Streams.h" using namespace clang; @@ -42,7 +43,10 @@ public: static inline VarBindingsTy GetVarBindings(Store store) { return VarBindingsTy(static_cast<const VarBindingsTy::TreeTy*>(store)); - } + } + + virtual void print(Store store, std::ostream& Out, + const char* nl, const char *sep); }; } // end anonymous namespace @@ -234,3 +238,20 @@ Store BasicStoreManager::getInitialStore(GRStateManager& StateMgr) { } return St; } + +void BasicStoreManager::print(Store store, std::ostream& Out, + const char* nl, const char *sep) { + + VarBindingsTy B = GetVarBindings(store); + Out << "Variables:" << nl; + + bool isFirst = true; + + for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I != E; ++I) { + if (isFirst) isFirst = false; + else Out << nl; + + Out << ' ' << I.getKey()->getName() << " : "; + I.getData().print(Out); + } +} diff --git a/lib/Analysis/GRState.cpp b/lib/Analysis/GRState.cpp index e4022a2663..23467e2046 100644 --- a/lib/Analysis/GRState.cpp +++ b/lib/Analysis/GRState.cpp @@ -238,26 +238,15 @@ const GRState* GRStateManager::getPersistentState(GRState& State) { // State pretty-printing. //===----------------------------------------------------------------------===// -void GRState::print(std::ostream& Out, Printer** Beg, Printer** End, +void GRState::print(std::ostream& Out, StoreManager& StoreMgr, + Printer** Beg, Printer** End, const char* nl, const char* sep) const { - - // Print Variable Bindings - Out << "Variables:" << nl; - bool isFirst = true; - - for (vb_iterator I = vb_begin(), E = vb_end(); I != E; ++I) { - - if (isFirst) isFirst = false; - else Out << nl; - - Out << ' ' << I.getKey()->getName() << " : "; - I.getData().print(Out); - } + // Print the store. + StoreMgr.print(getStore(), Out, nl, sep); // Print Subexpression bindings. - - isFirst = true; + bool isFirst = true; for (seb_iterator I = seb_begin(), E = seb_end(); I != E; ++I) { @@ -274,7 +263,6 @@ void GRState::print(std::ostream& Out, Printer** Beg, Printer** End, } // Print block-expression bindings. - isFirst = true; for (beb_iterator I = beb_begin(), E = beb_end(); I != E; ++I) { @@ -341,7 +329,7 @@ void GRStateRef::printStdErr() const { void GRStateRef::print(std::ostream& Out, const char* nl, const char* sep)const{ GRState::Printer **beg = Mgr->Printers.empty() ? 0 : &Mgr->Printers[0]; GRState::Printer **end = !beg ? 0 : beg + Mgr->Printers.size(); - St->print(Out, beg, end, nl, sep); + St->print(Out, *Mgr->StMgr, beg, end, nl, sep); } //===----------------------------------------------------------------------===// |