Improved graph visualization of ExplodedGraphs to include source line and column
information.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48031 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/GRExprEngine.cpp b/Analysis/GRExprEngine.cpp
index 87c3bd7..aaef2f8 100644
--- a/Analysis/GRExprEngine.cpp
+++ b/Analysis/GRExprEngine.cpp
@@ -14,6 +14,7 @@
//===----------------------------------------------------------------------===//
#include "clang/Analysis/PathSensitive/GRExprEngine.h"
+#include "clang/Basic/SourceManager.h"
#include "llvm/Support/Streams.h"
#ifndef NDEBUG
@@ -1563,6 +1564,7 @@
#ifndef NDEBUG
static GRExprEngine* GraphPrintCheckerState;
+static SourceManager* GraphPrintSourceManager;
namespace llvm {
template<>
@@ -1702,11 +1704,16 @@
break;
case ProgramPoint::PostStmtKind: {
- const PostStmt& L = cast<PostStmt>(Loc);
- Out << L.getStmt()->getStmtClassName() << ':'
- << (void*) L.getStmt() << ' ';
+ const PostStmt& L = cast<PostStmt>(Loc);
+ Stmt* S = L.getStmt();
+ SourceLocation SLoc = S->getLocStart();
+
+ Out << S->getStmtClassName() << ' ' << (void*) S << ' ';
+ S->printPretty(Out);
- L.getStmt()->printPretty(Out);
+ Out << "\\lline="
+ << GraphPrintSourceManager->getLineNumber(SLoc) << " col="
+ << GraphPrintSourceManager->getColumnNumber(SLoc) << "\\l";
if (GraphPrintCheckerState->isImplicitNullDeref(N))
Out << "\\|Implicit-Null Dereference.\\l";
@@ -1738,9 +1745,17 @@
<< E.getDst()->getBlockID() << ')';
if (Stmt* T = E.getSrc()->getTerminator()) {
+
+ SourceLocation SLoc = T->getLocStart();
+
Out << "\\|Terminator: ";
+
E.getSrc()->printTerminator(Out);
+ Out << "\\lline="
+ << GraphPrintSourceManager->getLineNumber(SLoc) << " col="
+ << GraphPrintSourceManager->getColumnNumber(SLoc);
+
if (isa<SwitchStmt>(T)) {
Stmt* Label = E.getDst()->getLabel();
@@ -1798,7 +1813,9 @@
void GRExprEngine::ViewGraph() {
#ifndef NDEBUG
GraphPrintCheckerState = this;
+ GraphPrintSourceManager = &getContext().getSourceManager();
llvm::ViewGraph(*G.roots_begin(), "GRExprEngine");
GraphPrintCheckerState = NULL;
+ GraphPrintSourceManager = NULL;
#endif
}