From f784d08d25763ec5cf6b419b98697a9b256039d2 Mon Sep 17 00:00:00 2001 From: Anna Zaks Date: Mon, 5 Dec 2011 18:58:08 +0000 Subject: [PATCH] [analyzer] Add ability to do a simple ProgramState dump() without requiring CFG. Adding more ugly code; the evnvironment printing should be moved to envirnment at some point. llvm-svn: 145828 --- .../Core/PathSensitive/ProgramState.h | 6 +- .../lib/StaticAnalyzer/Core/ProgramState.cpp | 92 ++++++++++++------- 2 files changed, 61 insertions(+), 37 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h index d70600f29949..8b646f42744a 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h @@ -356,13 +356,15 @@ public: } // Pretty-printing. - void print(raw_ostream &Out, CFG &C, const char *nl = "\n", + void print(raw_ostream &Out, CFG *C, const char *nl = "\n", const char *sep = "") const; - void printStdErr(CFG &C) const; + void dump(CFG &C) const; void printDOT(raw_ostream &Out, CFG &C) const; + void dump() const; + private: /// Increments the number of times this state is referenced by ExplodeNodes. void incrementReferenceCount() { ++refCount; } diff --git a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp index 07f76c585f8b..a93b5bfd6451 100644 --- a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp @@ -385,53 +385,71 @@ static bool IsEnvLoc(const Stmt *S) { return (bool) (((uintptr_t) S) & 0x1); } -void ProgramState::print(raw_ostream &Out, CFG &C, +void ProgramState::print(raw_ostream &Out, CFG *C, const char *NL, const char *Sep) const { // Print the store. ProgramStateManager &Mgr = getStateManager(); Mgr.getStoreManager().print(getStore(), Out, NL, Sep); - - // Print Subexpression bindings. bool isFirst = true; // FIXME: All environment printing should be moved inside Environment. - for (Environment::iterator I = Env.begin(), E = Env.end(); I != E; ++I) { - if (C.isBlkExpr(I.getKey()) || IsEnvLoc(I.getKey())) - continue; + if (C) { + // Print Subexpression bindings. + for (Environment::iterator I = Env.begin(), E = Env.end(); I != E; ++I) { + if (C->isBlkExpr(I.getKey()) || IsEnvLoc(I.getKey())) + continue; - if (isFirst) { - Out << NL << NL << "Sub-Expressions:" << NL; - isFirst = false; - } else { - Out << NL; + if (isFirst) { + Out << NL << NL << "Sub-Expressions:" << NL; + isFirst = false; + } else { + Out << NL; + } + + Out << " (" << (void*) I.getKey() << ") "; + LangOptions LO; // FIXME. + I.getKey()->printPretty(Out, 0, PrintingPolicy(LO)); + Out << " : " << I.getData(); } - Out << " (" << (void*) I.getKey() << ") "; - LangOptions LO; // FIXME. - I.getKey()->printPretty(Out, 0, PrintingPolicy(LO)); - Out << " : " << I.getData(); - } + // Print block-expression bindings. + isFirst = true; + for (Environment::iterator I = Env.begin(), E = Env.end(); I != E; ++I) { + if (!C->isBlkExpr(I.getKey())) + continue; - // Print block-expression bindings. - isFirst = true; + if (isFirst) { + Out << NL << NL << "Block-level Expressions:" << NL; + isFirst = false; + } else { + Out << NL; + } - for (Environment::iterator I = Env.begin(), E = Env.end(); I != E; ++I) { - if (!C.isBlkExpr(I.getKey())) - continue; - - if (isFirst) { - Out << NL << NL << "Block-level Expressions:" << NL; - isFirst = false; - } else { - Out << NL; + Out << " (" << (void*) I.getKey() << ") "; + LangOptions LO; // FIXME. + I.getKey()->printPretty(Out, 0, PrintingPolicy(LO)); + Out << " : " << I.getData(); } + } else { + // Print All bindings - no info to differentiate block from subexpressions. + for (Environment::iterator I = Env.begin(), E = Env.end(); I != E; ++I) { + if (IsEnvLoc(I.getKey())) + continue; - Out << " (" << (void*) I.getKey() << ") "; - LangOptions LO; // FIXME. - I.getKey()->printPretty(Out, 0, PrintingPolicy(LO)); - Out << " : " << I.getData(); + if (isFirst) { + Out << NL << NL << "Expressions:" << NL; + isFirst = false; + } else { + Out << NL; + } + + Out << " (" << (void*) I.getKey() << ") "; + LangOptions LO; // FIXME. + I.getKey()->printPretty(Out, 0, PrintingPolicy(LO)); + Out << " : " << I.getData(); + } } - + // Print locations. isFirst = true; @@ -461,11 +479,15 @@ void ProgramState::print(raw_ostream &Out, CFG &C, } void ProgramState::printDOT(raw_ostream &Out, CFG &C) const { - print(Out, C, "\\l", "\\|"); + print(Out, &C, "\\l", "\\|"); } -void ProgramState::printStdErr(CFG &C) const { - print(llvm::errs(), C); +void ProgramState::dump(CFG &C) const { + print(llvm::errs(), &C); +} + +void ProgramState::dump() const { + print(llvm::errs(), 0); } //===----------------------------------------------------------------------===//