[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:
parent
1c215d0a11
commit
f784d08d25
|
@ -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; }
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
Loading…
Reference in New Issue