summaryrefslogtreecommitdiffstats
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
commitd325196f19bfecff59252f3d214278fb6ee4ad61 (patch)
tree3e4d1cf85aed53aef2a637b9b3b0649892e15888
parent73b67f0b1a3ca835a4c0481abee87a96a2107b7d (diff)
downloadbcm5719-llvm-d325196f19bfecff59252f3d214278fb6ee4ad61.tar.gz
bcm5719-llvm-d325196f19bfecff59252f3d214278fb6ee4ad61.zip
[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. llvm-svn: 375185
-rw-r--r--clang/lib/Analysis/ProgramPoint.cpp6
-rw-r--r--clang/test/Analysis/exploded-graph-rewriter/program_points.dot48
-rwxr-xr-xclang/utils/analyzer/exploded-graph-rewriter.py6
3 files changed, 58 insertions, 2 deletions
diff --git a/clang/lib/Analysis/ProgramPoint.cpp b/clang/lib/Analysis/ProgramPoint.cpp
index 97e90965d00..0783fbed531 100644
--- a/clang/lib/Analysis/ProgramPoint.cpp
+++ b/clang/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/clang/test/Analysis/exploded-graph-rewriter/program_points.dot b/clang/test/Analysis/exploded-graph-rewriter/program_points.dot
index 2f49d7f75ef..c27c230ebfb 100644
--- a/clang/test/Analysis/exploded-graph-rewriter/program_points.dot
+++ b/clang/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/clang/utils/analyzer/exploded-graph-rewriter.py b/clang/utils/analyzer/exploded-graph-rewriter.py
index 05b01b3f950..77da7392e36 100755
--- a/clang/utils/analyzer/exploded-graph-rewriter.py
+++ b/clang/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 ''))
OpenPOWER on IntegriCloud