Skip to content

Commit 2ca5355

Browse files
committed
[analyzer] exploded-graph-rewriter: Improve program point dumps.
- Take advantage of the stmt_point_kind. - Dump block IDs for BlockEntrance nodes. - Don't dump huge compound statements on PurgeDeadSymbols nodes. - Rename Edge to BlockEdge for consistency. - Tweak colors. Differential Revision: https://reviews.llvm.org/D64051 llvm-svn: 364881
1 parent 0a77d91 commit 2ca5355

File tree

3 files changed

+54
-13
lines changed

3 files changed

+54
-13
lines changed

clang/test/Analysis/exploded-graph-rewriter/escapes.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ void escapes() {
1717
// CHECK-SAME: <td align="left">&amp;Element\{"foo",0 S64b,char\}</td>
1818
const char *const foo = "\x66\x6f\x6f";
1919

20-
// CHECK: <font color="cyan3">BinaryOperator</font>
20+
// CHECK: <font color="cyan4">BinaryOperator</font>
2121
// CHECK-SAME: <td align="left">1 \| 2</td>
2222
// CHECK-SAME: <td align="left">3 S32b</td>
2323
int x = 1 | 2;

clang/test/Analysis/exploded-graph-rewriter/program_points.dot

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,28 @@
33
// FIXME: Substitution doesn't seem to work on Windows.
44
// UNSUPPORTED: system-windows
55

6-
// CHECK: <b>Program point:</b>
6+
// CHECK: <b>Program points:</b>
77
// CHECK-SAME: <table border="0" align="left" width="0">
88
// CHECK-SAME: <tr>
99
// CHECK-SAME: <td width="0">
1010
// CHECK-SAME: </td>
1111
// CHECK-SAME: <td align="left" width="0">
12-
// CHECK-SAME: <font color="gold3">Edge</font>
12+
// CHECK-SAME: <font color="gold3">BlockEdge</font>
1313
// CHECK-SAME: </td>
1414
// CHECK-SAME: <td align="left">
1515
// CHECK-SAME: [B0] -&gt; [B1]
1616
// CHECK-SAME: </td>
1717
// CHECK-SAME: </tr>
18+
// CHECK-SAME: <tr>
19+
// CHECK-SAME: <td width="0">
20+
// CHECK-SAME: </td>
21+
// CHECK-SAME: <td align="left" width="0">
22+
// CHECK-SAME: <font color="gold3">BlockEntrance</font>
23+
// CHECK-SAME: </td>
24+
// CHECK-SAME: <td align="left">
25+
// CHECK-SAME: [B1]
26+
// CHECK-SAME: </td>
27+
// CHECK-SAME: </tr>
1828
// CHECK-SAME: </table>
1929
Node0x1 [shape=record,label=
2030
"{
@@ -26,7 +36,15 @@ Node0x1 [shape=record,label=
2636
"dst_id": 1,
2737
"terminator": null,
2838
"term_kind": null,
29-
"tag": null }
39+
"tag": null
40+
},
41+
{
42+
"kind": "BlockEntrance",
43+
"block_id": 1,
44+
"terminator": null,
45+
"term_kind": null,
46+
"tag": null
47+
}
3048
]}
3149
\l}"];
3250

@@ -37,14 +55,17 @@ Node0x1 [shape=record,label=
3755
// CHECK-SAME: (main file):<b>4</b>:<b>5</b>:
3856
// CHECK-SAME: </td>
3957
// CHECK-SAME: <td align="left" width="0">
40-
// CHECK-SAME: <font color="cyan3">DeclRefExpr</font>
58+
// CHECK-SAME: <font color="cyan4">DeclRefExpr</font>
59+
// CHECK-SAME: </td>
60+
// CHECK-SAME: <td align="left">
61+
// CHECK-SAME: <font color="cyan3">PreStmt</font>
4162
// CHECK-SAME: </td>
4263
// CHECK-SAME: <td>x</td>
4364
// CHECK-SAME: </tr>
4465
// CHECK-SAME: <tr>
4566
// CHECK-SAME: <td width="0">
4667
// CHECK-SAME: </td>
47-
// CHECK-SAME: <td colspan="2" align="left">
68+
// CHECK-SAME: <td colspan="3" align="left">
4869
// CHECK-SAME: <b>Tag: </b>
4970
// CHECK-SAME: <font color="crimson">ExprEngine : Clean Node</font>
5071
// CHECK-SAME: </td>
@@ -57,6 +78,7 @@ Node0x2 [shape=record,label=
5778
{
5879
"kind": "Statement",
5980
"stmt_kind": "DeclRefExpr",
81+
"stmt_point_kind": "PreStmt",
6082
"stmd_id": 3,
6183
"pointer": "0x3",
6284
"pretty": "x",

clang/utils/analyzer/exploded-graph-rewriter.py

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def __init__(self, json_pp):
5959
self.dst_id = json_pp['dst_id']
6060
elif self.kind == 'Statement':
6161
self.stmt_kind = json_pp['stmt_kind']
62+
self.stmt_point_kind = json_pp['stmt_point_kind']
6263
self.pointer = json_pp['pointer']
6364
self.pretty = json_pp['pretty']
6465
self.loc = SourceLocation(json_pp['location']) \
@@ -373,30 +374,48 @@ def visit_program_point(self, p):
373374
elif p.kind in ['CallEnter', 'CallExitBegin', 'CallExitEnd']:
374375
color = 'blue'
375376
elif p.kind in ['Statement']:
376-
color = 'cyan3'
377+
color = 'cyan4'
377378
else:
378379
color = 'forestgreen'
379380

380381
if p.kind == 'Statement':
382+
# This avoids pretty-printing huge statements such as CompoundStmt.
383+
# Such statements show up only at [Pre|Post]StmtPurgeDeadSymbols
384+
skip_pretty = 'PurgeDeadSymbols' in p.stmt_point_kind
385+
stmt_color = 'cyan3'
381386
if p.loc is not None:
382387
self._dump('<tr><td align="left" width="0">'
383388
'%s:<b>%s</b>:<b>%s</b>:</td>'
384389
'<td align="left" width="0"><font color="%s">'
385-
'%s</font></td><td>%s</td></tr>'
390+
'%s</font></td>'
391+
'<td align="left"><font color="%s">%s</font></td>'
392+
'<td>%s</td></tr>'
386393
% (p.loc.filename, p.loc.line,
387-
p.loc.col, color, p.stmt_kind, p.pretty))
394+
p.loc.col, color, p.stmt_kind,
395+
stmt_color, p.stmt_point_kind,
396+
p.pretty if not skip_pretty else ''))
388397
else:
389398
self._dump('<tr><td align="left" width="0">'
390399
'<i>Invalid Source Location</i>:</td>'
391400
'<td align="left" width="0">'
392-
'<font color="%s">%s</font></td><td>%s</td></tr>'
393-
% (color, p.stmt_kind, p.pretty))
401+
'<font color="%s">%s</font></td>'
402+
'<td align="left"><font color="%s">%s</font></td>'
403+
'<td>%s</td></tr>'
404+
% (color, p.stmt_kind,
405+
stmt_color, p.stmt_point_kind,
406+
p.pretty if not skip_pretty else ''))
394407
elif p.kind == 'Edge':
395408
self._dump('<tr><td width="0"></td>'
396409
'<td align="left" width="0">'
397410
'<font color="%s">%s</font></td><td align="left">'
398411
'[B%d] -\\> [B%d]</td></tr>'
399-
% (color, p.kind, p.src_id, p.dst_id))
412+
% (color, 'BlockEdge', p.src_id, p.dst_id))
413+
elif p.kind == 'BlockEntrance':
414+
self._dump('<tr><td width="0"></td>'
415+
'<td align="left" width="0">'
416+
'<font color="%s">%s</font></td>'
417+
'<td align="left">[B%d]</td></tr>'
418+
% (color, p.kind, p.block_id))
400419
else:
401420
# TODO: Print more stuff for other kinds of points.
402421
self._dump('<tr><td width="0"></td>'
@@ -406,7 +425,7 @@ def visit_program_point(self, p):
406425

407426
if p.tag is not None:
408427
self._dump('<tr><td width="0"></td>'
409-
'<td colspan="2" align="left">'
428+
'<td colspan="3" align="left">'
410429
'<b>Tag: </b> <font color="crimson">'
411430
'%s</font></td></tr>' % p.tag)
412431

0 commit comments

Comments
 (0)