[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
This commit is contained in:
Anna Zaks 2011-12-05 18:58:08 +00:00
parent 1c215d0a11
commit f784d08d25
2 changed files with 61 additions and 37 deletions

View File

@ -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; }

View File

@ -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);
}
//===----------------------------------------------------------------------===//