summaryrefslogtreecommitdiffstats
path: root/clang/utils/analyzer/exploded-graph-rewriter.py
diff options
context:
space:
mode:
Diffstat (limited to 'clang/utils/analyzer/exploded-graph-rewriter.py')
-rwxr-xr-xclang/utils/analyzer/exploded-graph-rewriter.py44
1 files changed, 41 insertions, 3 deletions
diff --git a/clang/utils/analyzer/exploded-graph-rewriter.py b/clang/utils/analyzer/exploded-graph-rewriter.py
index b78789f0b64..3ff9e5b93f9 100755
--- a/clang/utils/analyzer/exploded-graph-rewriter.py
+++ b/clang/utils/analyzer/exploded-graph-rewriter.py
@@ -804,8 +804,7 @@ class DotDumpVisitor(object):
#===-----------------------------------------------------------------------===#
-# A class that encapsulates traversal of the ExplodedGraph. Different explorer
-# kinds could potentially traverse specific sub-graphs.
+# BasicExplorer explores the whole graph in no particular order.
class BasicExplorer(object):
def __init__(self):
super(BasicExplorer, self).__init__()
@@ -821,6 +820,39 @@ class BasicExplorer(object):
visitor.visit_end_of_graph()
+# SinglePathExplorer traverses only a single path - the leftmost path
+# from the root. Useful when the trimmed graph is still too large
+# due to a large amount of equivalent reports.
+class SinglePathExplorer(object):
+ def __init__(self):
+ super(SinglePathExplorer, self).__init__()
+
+ def explore(self, graph, visitor):
+ visitor.visit_begin_graph(graph)
+
+ # Keep track of visited nodes in order to avoid loops.
+ visited = set()
+ node_id = graph.root_id
+ while True:
+ visited.add(node_id)
+ node = graph.nodes[node_id]
+ logging.debug('Visiting ' + node_id)
+ visitor.visit_node(node)
+ if len(node.successors) == 0:
+ break
+
+ succ_id = node.successors[0]
+ succ = graph.nodes[succ_id]
+ logging.debug('Visiting edge: %s -> %s ' % (node_id, succ_id))
+ visitor.visit_edge(node, succ)
+ if succ_id in visited:
+ break
+
+ node_id = succ_id
+
+ visitor.visit_end_of_graph()
+
+
#===-----------------------------------------------------------------------===#
# The entry point to the script.
#===-----------------------------------------------------------------------===#
@@ -836,6 +868,11 @@ def main():
parser.add_argument('-d', '--diff', action='store_const', dest='diff',
const=True, default=False,
help='display differences between 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 '
+ '(useful for trimmed graphs that still '
+ 'branch too much)')
parser.add_argument('--dark', action='store_const', dest='dark',
const=True, default=False,
help='dark mode')
@@ -851,8 +888,9 @@ def main():
raw_line = raw_line.strip()
graph.add_raw_line(raw_line)
- explorer = BasicExplorer()
+ explorer = SinglePathExplorer() if args.single_path else BasicExplorer()
visitor = DotDumpVisitor(args.diff, args.dark, args.gray)
+
explorer.explore(graph, visitor)
OpenPOWER on IntegriCloud