summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2019-10-17 23:10:05 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2019-10-17 23:10:05 +0000
commit40a1cfa0b13160d82f688daa7fbab9f249679617 (patch)
tree70bd8d0fec3f93d6075e2572d6e7179540886fda
parent7d0e090bbc61baebf0be18e4d9ba36615b6cd566 (diff)
downloadclang-40a1cfa0b13160d82f688daa7fbab9f249679617.tar.gz
[analyzer] Display cast kinds in program point dumps.
Because cast expressions have their own hierarchy, it's extremely useful to have some information about what kind of casts are we dealing with. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@375185 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Analysis/ProgramPoint.cpp6
-rw-r--r--test/Analysis/exploded-graph-rewriter/program_points.dot48
-rwxr-xr-xutils/analyzer/exploded-graph-rewriter.py6
3 files changed, 58 insertions, 2 deletions
diff --git a/lib/Analysis/ProgramPoint.cpp b/lib/Analysis/ProgramPoint.cpp
index 97e90965d0..0783fbed53 100644
--- a/lib/Analysis/ProgramPoint.cpp
+++ b/lib/Analysis/ProgramPoint.cpp
@@ -188,7 +188,11 @@ void ProgramPoint::printJson(llvm::raw_ostream &Out, const char *NL) const {
Out << "Statement\", \"stmt_kind\": \"" << S->getStmtClassName()
<< "\", \"stmt_id\": " << S->getID(Context)
- << ", \"pointer\": \"" << (const void *)S << "\", \"pretty\": ";
+ << ", \"pointer\": \"" << (const void *)S << "\", ";
+ if (const auto *CS = dyn_cast<CastExpr>(S))
+ Out << "\"cast_kind\": \"" << CS->getCastKindName() << "\", ";
+
+ Out << "\"pretty\": ";
S->printJson(Out, nullptr, PP, AddQuotes);
diff --git a/test/Analysis/exploded-graph-rewriter/program_points.dot b/test/Analysis/exploded-graph-rewriter/program_points.dot
index 2f49d7f75e..c27c230ebf 100644
--- a/test/Analysis/exploded-graph-rewriter/program_points.dot
+++ b/test/Analysis/exploded-graph-rewriter/program_points.dot
@@ -116,3 +116,51 @@ Node0x3 [shape=record,label=
}
]}
\l}"];
+
+// CHECK-NEXT: <b>Program point:</b>
+// CHECK-SAME: <table border="0" align="left" width="0">
+// CHECK-SAME: <tr>
+// CHECK-SAME: <td align="left" width="0">
+// CHECK-SAME: main.cpp:<b>8</b>:<b>9</b>:
+// CHECK-SAME: </td>
+// CHECK-SAME: <td align="left" width="0">
+// CHECK-SAME: <font color="cyan4">
+// CHECK-SAME: ImplicitCastExpr (LValueToRValue)
+// CHECK-SAME: </font>
+// CHECK-SAME: </td>
+// CHECK-SAME: <td align="left"><i>S5</i></td>
+// CHECK-SAME: <td align="left">
+// CHECK-SAME: <font color="cyan3">PreStmt</font>
+// CHECK-SAME: </td>
+// CHECK-SAME: <td align="left">y</td>
+// CHECK-SAME: </tr>
+// CHECK-SAME: <tr>
+// CHECK-SAME: <td width="0">
+// CHECK-SAME: </td>
+// CHECK-SAME: <td colspan="3" align="left">
+// CHECK-SAME: <b>Tag: </b>
+// CHECK-SAME: <font color="crimson">ExprEngine : Clean Node</font>
+// CHECK-SAME: </td>
+// CHECK-SAME: </tr>
+// CHECK-SAME: </table>
+Node0x4 [shape=record,label=
+ "{
+ { "node_id": 4, "pointer": "0x4", "has_report": false, "is_sink": false,
+ "program_state": null, "program_points": [
+ {
+ "kind": "Statement",
+ "stmt_kind": "ImplicitCastExpr",
+ "cast_kind": "LValueToRValue",
+ "stmt_point_kind": "PreStmt",
+ "stmt_id": 5,
+ "pointer": "0x6",
+ "pretty": "y",
+ "location": {
+ "file": "main.cpp",
+ "line": 8,
+ "column": 9
+ },
+ "tag": "ExprEngine : Clean Node"
+ }
+ ]}
+\l}"];
diff --git a/utils/analyzer/exploded-graph-rewriter.py b/utils/analyzer/exploded-graph-rewriter.py
index 05b01b3f95..77da7392e3 100755
--- a/utils/analyzer/exploded-graph-rewriter.py
+++ b/utils/analyzer/exploded-graph-rewriter.py
@@ -73,6 +73,8 @@ class ProgramPoint(object):
elif self.kind == 'Statement':
logging.debug(json_pp)
self.stmt_kind = json_pp['stmt_kind']
+ self.cast_kind = json_pp['cast_kind'] \
+ if 'cast_kind' in json_pp else None
self.stmt_point_kind = json_pp['stmt_point_kind']
self.stmt_id = json_pp['stmt_id']
self.pointer = json_pp['pointer']
@@ -497,7 +499,9 @@ class DotDumpVisitor(object):
'<td align="left"><i>S%s</i></td>'
'<td align="left"><font color="%s">%s</font></td>'
'<td align="left">%s</td></tr>'
- % (self._make_sloc(p.loc), color, p.stmt_kind,
+ % (self._make_sloc(p.loc), color,
+ '%s (%s)' % (p.stmt_kind, p.cast_kind)
+ if p.cast_kind is not None else p.stmt_kind,
p.stmt_id, stmt_color, p.stmt_point_kind,
self._short_pretty(p.pretty)
if not skip_pretty else ''))