[PATCH] D65344: [analyzer] exploded-graph-rewriter: NFC: Replace explorers with trimmers.

Artem Dergachev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 26 12:57:53 PDT 2019


NoQ updated this revision to Diff 211992.
NoQ added a comment.

Fxd.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D65344/new/

https://reviews.llvm.org/D65344

Files:
  clang/test/Analysis/exploded-graph-rewriter/explorers.dot
  clang/test/Analysis/exploded-graph-rewriter/trimmers.dot
  clang/utils/analyzer/exploded-graph-rewriter.py


Index: clang/utils/analyzer/exploded-graph-rewriter.py
===================================================================
--- clang/utils/analyzer/exploded-graph-rewriter.py
+++ clang/utils/analyzer/exploded-graph-rewriter.py
@@ -882,37 +882,36 @@
         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__()
+#===-----------------------------------------------------------------------===#
+# Trimmers cut out parts of the ExplodedGraph so that to focus on other parts.
+# Trimmers can be combined together by applying them sequentially.
+#===-----------------------------------------------------------------------===#
 
-    def explore(self, graph, visitor):
-        visitor.visit_begin_graph(graph)
 
-        # Keep track of visited nodes in order to avoid loops.
-        visited = set()
+# SinglePathTrimmer keeps only a single path - the leftmost path from the root.
+# Useful when the trimmed graph is still too large.
+class SinglePathTrimmer(object):
+    def __init__(self):
+        super(SinglePathTrimmer, self).__init__()
+
+    def trim(self, graph):
+        visited_nodes = set()
         node_id = graph.root_id
         while True:
-            visited.add(node_id)
+            visited_nodes.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:
+            if len(node.successors) > 0:
+                succ_id = node.successors[0]
+                succ = graph.nodes[succ_id]
+                node.successors = [succ_id]
+                succ.predecessors = [node_id]
+                if succ_id in visited_nodes:
+                    break
+                node_id = succ_id
+            else:
                 break
-
-            node_id = succ_id
-
-        visitor.visit_end_of_graph()
+        graph.nodes = {node_id: graph.nodes[node_id]
+                       for node_id in visited_nodes}
 
 
 #===-----------------------------------------------------------------------===#
@@ -960,10 +959,18 @@
             raw_line = raw_line.strip()
             graph.add_raw_line(raw_line)
 
-    explorer = SinglePathExplorer() if args.single_path else BasicExplorer()
+    trimmers = []
+    if args.single_path:
+        trimmers.append(SinglePathTrimmer())
+
+    explorer = BasicExplorer()
+
     visitor = DotDumpVisitor(args.diff, args.dark, args.gray, args.topology,
                              args.rewrite_only)
 
+    for trimmer in trimmers:
+        trimmer.trim(graph)
+
     explorer.explore(graph, visitor)
 
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D65344.211992.patch
Type: text/x-patch
Size: 3128 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190726/8b738faa/attachment.bin>


More information about the cfe-commits mailing list