Index: cfe/trunk/test/Analysis/exploded-graph-rewriter/topology.dot =================================================================== --- cfe/trunk/test/Analysis/exploded-graph-rewriter/topology.dot +++ cfe/trunk/test/Analysis/exploded-graph-rewriter/topology.dot @@ -0,0 +1,32 @@ +// RUN: %exploded_graph_rewriter %s \ +// RUN: | FileCheck -check-prefixes=NORMAL %s +// RUN: %exploded_graph_rewriter -t %s \ +// RUN: | FileCheck -check-prefixes=TOPOLOGY %s + +// FIXME: Substitution doesn't seem to work on Windows. +// UNSUPPORTED: system-windows + +// NORMAL: Program point +// TOPOLOGY-NOT: Program point +// NORMAL: Checker State +// TOPOLOGY-NOT: Checker State +Node0x1 [shape=record,label= + "{ + { "node_id": 1, + "pointer": "0x1", + "has_report": false, + "is_sink": false, + "state_id": 2, + "program_points": [], + "program_state": { + "environment": null, + "constraints": null, + "dynamic_types": null, + "constructing_objects": null, + "checker_messages": [ + { "checker": "foo", "messages": ["bar"] } + ], + "store": null + } + } +\l}"]; Index: cfe/trunk/utils/analyzer/exploded-graph-rewriter.py =================================================================== --- cfe/trunk/utils/analyzer/exploded-graph-rewriter.py +++ cfe/trunk/utils/analyzer/exploded-graph-rewriter.py @@ -384,11 +384,12 @@ # A visitor that dumps the ExplodedGraph into a DOT file with fancy HTML-based # syntax highlighing. class DotDumpVisitor(object): - def __init__(self, do_diffs, dark_mode, gray_mode): + def __init__(self, do_diffs, dark_mode, gray_mode, topo_mode): super(DotDumpVisitor, self).__init__() self._do_diffs = do_diffs self._dark_mode = dark_mode self._gray_mode = gray_mode + self._topo_mode = topo_mode @staticmethod def _dump_raw(s): @@ -766,18 +767,19 @@ if node.is_sink: self._dump('Sink Node' '') - self._dump('') - if len(node.points) > 1: - self._dump('Program points:') - else: - self._dump('Program point:') + if not self._topo_mode: + self._dump('') + if len(node.points) > 1: + self._dump('Program points:') + else: + self._dump('Program point:') self._dump('' '') for p in node.points: self.visit_program_point(p) self._dump('
') - if node.state is not None: + if node.state is not None and not self._topo_mode: prev_s = None # Do diffs only when we have a unique predecessor. # Don't do diffs on the leaf nodes because they're @@ -868,6 +870,9 @@ parser.add_argument('-d', '--diff', action='store_const', dest='diff', const=True, default=False, help='display differences between states') + parser.add_argument('-t', '--topology', action='store_const', + dest='topology', const=True, default=False, + help='only display program points, omit states') parser.add_argument('-s', '--single-path', action='store_const', dest='single_path', const=True, default=False, help='only display the leftmost path in the graph ' @@ -889,7 +894,7 @@ graph.add_raw_line(raw_line) explorer = SinglePathExplorer() if args.single_path else BasicExplorer() - visitor = DotDumpVisitor(args.diff, args.dark, args.gray) + visitor = DotDumpVisitor(args.diff, args.dark, args.gray, args.topology) explorer.explore(graph, visitor)