pytracediff: change how 'junk' calls are handled
authorMatti Hamalainen <ccr@tnsp.org>
Sun, 19 Jun 2022 18:28:42 +0000 (21:28 +0300)
committerMatti Hämäläinen <ccr@tnsp.org>
Tue, 28 Jun 2022 11:40:58 +0000 (11:40 +0000)
Instead of discarding them at parsing phase, let the difflib
SequenceMatcher always ignore them, and optionally suppress
them from output if -I/--ignore-junk option is given.

Signed-off-by: Matti Hamalainen <ccr@tnsp.org>
Acked-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Dylan Baker <dylan@pnwbakers.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17135>

src/gallium/tools/trace/parse.py
src/gallium/tools/trace/pytracediff.py

index f86b533..5611814 100755 (executable)
@@ -218,8 +218,8 @@ class TraceParser(XmlParser):
         self.element_start('trace')
         while self.token.type not in (ELEMENT_END, EOF):
             call = self.parse_call()
-            if not self.options.ignore_junk or not trace_call_ignore(call):
-                self.handle_call(call)
+            call.is_junk = trace_call_ignore(call)
+            self.handle_call(call)
         if self.token.type != EOF:
             self.element_end('trace')
 
@@ -381,6 +381,9 @@ class SimpleTraceDumper(TraceParser):
         self.pretty_printer = PrettyPrinter(self.formatter, options)
 
     def handle_call(self, call):
+        if self.options.ignore_junk and call.is_junk:
+            return
+
         call.visit(self.pretty_printer)
 
 
@@ -391,6 +394,9 @@ class TraceDumper(SimpleTraceDumper):
         self.call_stack = []
 
     def handle_call(self, call):
+        if self.options.ignore_junk and call.is_junk:
+            return
+
         if self.options.named_ptrs:
             self.call_stack.append(call)
         else:
index 9c2a896..7c79f75 100755 (executable)
@@ -319,7 +319,7 @@ if __name__ == "__main__":
 
     ### Perform diffing
     pkk_info("Matching trace sequences ...")
-    sequence = difflib.SequenceMatcher(None, stack1, stack2, autojunk=False)
+    sequence = difflib.SequenceMatcher(lambda x : x.is_junk, stack1, stack2, autojunk=False)
 
     pkk_info("Sequencing diff ...")
     opcodes = sequence.get_opcodes()
@@ -378,18 +378,24 @@ if __name__ == "__main__":
         while True:
             # Get line data
             if ncall1 < end1:
-                printer.entry_start(show_args)
-                stack1[ncall1].visit(printer)
-                data1 = printer.entry_get()
+                if not options.ignore_junk or not stack1[ncall1].is_junk:
+                    printer.entry_start(show_args)
+                    stack1[ncall1].visit(printer)
+                    data1 = printer.entry_get()
+                else:
+                    data1 = []
                 ncall1 += 1
             else:
                 data1 = []
                 last1 = True
 
             if ncall2 < end2:
-                printer.entry_start(show_args)
-                stack2[ncall2].visit(printer)
-                data2 = printer.entry_get()
+                if not options.ignore_junk or not stack2[ncall2].is_junk:
+                    printer.entry_start(show_args)
+                    stack2[ncall2].visit(printer)
+                    data2 = printer.entry_get()
+                else:
+                    data2 = []
                 ncall2 += 1
             else:
                 data2 = []