[llvm] r363884 - [Util] Add a helper script for converting -print-before-all output into a file based equivelent

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 19 15:05:47 PDT 2019


Author: reames
Date: Wed Jun 19 15:05:47 2019
New Revision: 363884

URL: http://llvm.org/viewvc/llvm-project?rev=363884&view=rev
Log:
[Util] Add a helper script for converting -print-before-all output into a file based equivelent

Simple little utility which takes a opt logfile generated with "opt -print-before-all -print-module-scope -o /dev/null <args> 2&>1", and splits into a series of individual "chunk-X.ll" files. The intended purpose is to help automate one step in failure reduction.

The imagined workflow is:

    New crasher bug reported against clang or other frontend
    Frontend run with -emit-llvm equivalent and manually confirmed that opt -O2 <emit.ll> crashes
    Run this splitter script
    Manually map pass name to invocation command (next on the to automate list)
    Run bugpoint on last chunk file + manual command

I chose to dump every chunk rather than only the last since miscompile debugging frequently requires either manual step by step reduction, or cross feeding IR into different compiler versions. Not an immediate target, but there may be applications.

Differential Revision: https://reviews.llvm.org/D63461


Added:
    llvm/trunk/utils/chunk-print-before-all.py

Added: llvm/trunk/utils/chunk-print-before-all.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/chunk-print-before-all.py?rev=363884&view=auto
==============================================================================
--- llvm/trunk/utils/chunk-print-before-all.py (added)
+++ llvm/trunk/utils/chunk-print-before-all.py Wed Jun 19 15:05:47 2019
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+# Given a -print-before-all -print-module-scope log from an opt invocation,
+# chunk it into a series of individual IR files, one for each pass invocation.
+# If the log ends with an obvious stack trace, try to split off a separate
+# "crashinfo.txt" file leaving only the valid input IR in the last chunk.
+# Files are written to current working directory.
+
+import sys
+
+basename = "chunk-"
+chunk_id = 0
+
+def print_chunk(lines):
+    global chunk_id
+    global basename
+    fname = basename + str(chunk_id) + ".ll"
+    chunk_id = chunk_id + 1
+    print "writing chunk " + fname + " (" + str(len(lines)) + " lines)"
+    with open(fname, "w") as f:
+        f.writelines(lines)
+
+is_dump = False
+cur = []
+for line in sys.stdin:
+    if line.startswith("*** IR Dump Before ") and len(cur) != 0:
+        print_chunk(cur);
+        cur = []
+        cur.append("; " + line)
+    elif line.startswith("Stack dump:"):
+        print_chunk(cur);
+        cur = []
+        cur.append(line)
+        is_dump = True
+    else:
+        cur.append(line)
+
+if is_dump:
+    print "writing crashinfo.txt (" + str(len(cur)) + " lines)"
+    with open("crashinfo.txt", "w") as f:
+        f.writelines(cur)
+else:
+    print_chunk(cur);




More information about the llvm-commits mailing list