forked from OSchip/llvm-project
[analyzer] exploded-graph-rewriter: Implement a dark color scheme.
Addresses a popular request. Activated via --dark. Differential Revision: https://reviews.llvm.org/D64056 llvm-svn: 364882
This commit is contained in:
parent
2ca5355712
commit
ad38e58ef2
|
@ -1,4 +1,5 @@
|
|||
// RUN: %exploded_graph_rewriter %s | FileCheck %s
|
||||
// RUN: %exploded_graph_rewriter %s | FileCheck %s -check-prefix=LIGHT
|
||||
// RUN: %exploded_graph_rewriter --dark %s | FileCheck %s -check-prefixes=DARK
|
||||
|
||||
// FIXME: Substitution doesn't seem to work on Windows.
|
||||
// UNSUPPORTED: system-windows
|
||||
|
@ -7,7 +8,8 @@ Node0x1 [shape=record,label=
|
|||
"{{ "node_id": 1, "pointer": "0x1",
|
||||
"program_state": null, "program_points": []}\l}"];
|
||||
|
||||
// CHECK: Node0x1 -> Node0x2;
|
||||
// LIGHT: Node0x1 -> Node0x2;
|
||||
// DARK: Node0x1 -> Node0x2 [color="white"];
|
||||
Node0x1 -> Node0x2;
|
||||
|
||||
Node0x2 [shape=record,label=
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
// RUN: %exploded_graph_rewriter %s | FileCheck %s
|
||||
// RUN: %exploded_graph_rewriter --dark %s | FileCheck %s \
|
||||
// RUN: -check-prefixes=CHECK,DARK
|
||||
|
||||
// FIXME: Substitution doesn't seem to work on Windows.
|
||||
// UNSUPPORTED: system-windows
|
||||
|
@ -8,5 +10,6 @@ digraph "Exploded Graph" {
|
|||
}
|
||||
|
||||
// CHECK: digraph "ExplodedGraph" {
|
||||
// DARK-NEXT: bgcolor="gray10";
|
||||
// CHECK-NEXT: label="";
|
||||
// CHECK-NEXT: }
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
// CHECK-SAME: <b>#0 Call</b>
|
||||
// CHECK-SAME: </td>
|
||||
// CHECK-SAME: <td align="left" colspan="2">
|
||||
// CHECK-SAME: <font color="grey60">foo </font>(line 4)
|
||||
// CHECK-SAME: <font color="gray60">foo </font>(line 4)
|
||||
// CHECK-SAME: </td>
|
||||
// CHECK-SAME: </tr>
|
||||
// CHECK-SAME: <tr>
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
// RUN: %exploded_graph_rewriter %s | FileCheck %s -check-prefixes=CHECK,LIGHT
|
||||
// RUN: %exploded_graph_rewriter %s --dark | FileCheck %s \
|
||||
// RUN: -check-prefixes CHECK,DARK
|
||||
|
||||
// FIXME: Substitution doesn't seem to work on Windows.
|
||||
// UNSUPPORTED: system-windows
|
||||
|
||||
// LIGHT: Node0x1 [shape=record,label=<
|
||||
// DARK: Node0x1 [shape=record,color="white",fontcolor="gray80",label=<
|
||||
// CHECK-SAME: <tr>
|
||||
// LIGHT-SAME: <td bgcolor="gray">
|
||||
// DARK-SAME: <td bgcolor="gray20">
|
||||
// CHECK-SAME: <b>Node 1 (0x1) - State Unspecified</b>
|
||||
// CHECK-SAME: </td>
|
||||
// CHECK-SAME: </tr>
|
||||
Node0x1 [shape=record,label=
|
||||
"{
|
||||
{ "node_id": 1, "pointer": "0x1",
|
||||
"program_state": null,
|
||||
"program_points": []
|
||||
}
|
||||
\l}"];
|
|
@ -17,7 +17,7 @@ void test() {
|
|||
// CHECK-SAME: <tr>
|
||||
// CHECK-SAME: <td align="left"><b>#0 Call</b></td>
|
||||
// CHECK-SAME: <td align="left" colspan="2">
|
||||
// CHECK-SAME: <font color="grey60">test </font>
|
||||
// CHECK-SAME: <font color="gray60">test </font>
|
||||
// CHECK-SAME: </td>
|
||||
// CHECK-SAME: </tr>
|
||||
// CHECK-SAME: <tr>
|
||||
|
|
|
@ -334,9 +334,10 @@ class ExplodedGraph(object):
|
|||
# A visitor that dumps the ExplodedGraph into a DOT file with fancy HTML-based
|
||||
# syntax highlighing.
|
||||
class DotDumpVisitor(object):
|
||||
def __init__(self, do_diffs):
|
||||
def __init__(self, do_diffs, dark_mode):
|
||||
super(DotDumpVisitor, self).__init__()
|
||||
self._do_diffs = do_diffs
|
||||
self._dark_mode = dark_mode
|
||||
|
||||
@staticmethod
|
||||
def _dump_raw(s):
|
||||
|
@ -363,6 +364,8 @@ class DotDumpVisitor(object):
|
|||
def visit_begin_graph(self, graph):
|
||||
self._graph = graph
|
||||
self._dump_raw('digraph "ExplodedGraph" {\n')
|
||||
if self._dark_mode:
|
||||
self._dump_raw('bgcolor="gray10";\n')
|
||||
self._dump_raw('label="";\n')
|
||||
|
||||
def visit_program_point(self, p):
|
||||
|
@ -372,7 +375,7 @@ class DotDumpVisitor(object):
|
|||
'PostStmtPurgeDeadSymbols']:
|
||||
color = 'red'
|
||||
elif p.kind in ['CallEnter', 'CallExitBegin', 'CallExitEnd']:
|
||||
color = 'blue'
|
||||
color = 'dodgerblue' if self._dark_mode else 'blue'
|
||||
elif p.kind in ['Statement']:
|
||||
color = 'cyan4'
|
||||
else:
|
||||
|
@ -436,7 +439,7 @@ class DotDumpVisitor(object):
|
|||
self._dump('<tr><td>%s</td>'
|
||||
'<td align="left"><b>%s</b></td>'
|
||||
'<td align="left" colspan="2">'
|
||||
'<font color="grey60">%s </font>'
|
||||
'<font color="gray60">%s </font>'
|
||||
'%s</td></tr>'
|
||||
% (self._diff_plus_minus(is_added),
|
||||
lc.caption, lc.decl,
|
||||
|
@ -451,9 +454,11 @@ class DotDumpVisitor(object):
|
|||
'<td align="left">%s</td></tr>'
|
||||
% (self._diff_plus_minus(is_added),
|
||||
b.stmt_id,
|
||||
'<td align="left"><font color="darkgreen"><i>'
|
||||
'(%s)</i></font></td>' % b.kind
|
||||
if b.kind is not None else '',
|
||||
'<td align="left"><font color="%s"><i>'
|
||||
'%s</i></font></td>' % (
|
||||
'lavender' if self._dark_mode else 'darkgreen',
|
||||
('(%s)' % b.kind) if b.kind is not None else ' '
|
||||
),
|
||||
b.pretty, f.bindings[b]))
|
||||
|
||||
frames_updated = e.diff_frames(prev_e) if prev_e is not None else None
|
||||
|
@ -615,12 +620,16 @@ class DotDumpVisitor(object):
|
|||
s, prev_s)
|
||||
|
||||
def visit_node(self, node):
|
||||
self._dump('%s [shape=record,label=<<table border="0">'
|
||||
self._dump('%s [shape=record,'
|
||||
% (node.node_name()))
|
||||
if self._dark_mode:
|
||||
self._dump('color="white",fontcolor="gray80",')
|
||||
self._dump('label=<<table border="0">')
|
||||
|
||||
self._dump('<tr><td bgcolor="grey"><b>Node %d (%s) - '
|
||||
self._dump('<tr><td bgcolor="%s"><b>Node %d (%s) - '
|
||||
'State %s</b></td></tr>'
|
||||
% (node.node_id, node.ptr, node.state.state_id
|
||||
% ("gray20" if self._dark_mode else "gray",
|
||||
node.node_id, node.ptr, node.state.state_id
|
||||
if node.state is not None else 'Unspecified'))
|
||||
self._dump('<tr><td align="left" width="0">')
|
||||
if len(node.points) > 1:
|
||||
|
@ -645,7 +654,10 @@ class DotDumpVisitor(object):
|
|||
self._dump_raw('</table>>];\n')
|
||||
|
||||
def visit_edge(self, pred, succ):
|
||||
self._dump_raw('%s -> %s;\n' % (pred.node_name(), succ.node_name()))
|
||||
self._dump_raw('%s -> %s%s;\n' % (
|
||||
pred.node_name(), succ.node_name(),
|
||||
' [color="white"]' if self._dark_mode else ''
|
||||
))
|
||||
|
||||
def visit_end_of_graph(self):
|
||||
self._dump_raw('}\n')
|
||||
|
@ -678,6 +690,9 @@ def main():
|
|||
parser.add_argument('-d', '--diff', action='store_const', dest='diff',
|
||||
const=True, default=False,
|
||||
help='display differences between states')
|
||||
parser.add_argument('--dark', action='store_const', dest='dark',
|
||||
const=True, default=False,
|
||||
help='dark mode')
|
||||
args = parser.parse_args()
|
||||
logging.basicConfig(level=args.loglevel)
|
||||
|
||||
|
@ -688,7 +703,7 @@ def main():
|
|||
graph.add_raw_line(raw_line)
|
||||
|
||||
explorer = Explorer()
|
||||
visitor = DotDumpVisitor(args.diff)
|
||||
visitor = DotDumpVisitor(args.diff, args.dark)
|
||||
explorer.explore(graph, visitor)
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue