69 lines · python
1#!/usr/bin/env python2 3# Given a -print-before-all and/or -print-after-all -print-module-scope log from4# an opt invocation, chunk it into a series of individual IR files, one for each5# pass invocation. If the log ends with an obvious stack trace, try to split off6# a separate "crashinfo.txt" file leaving only the valid input IR in the last7# chunk. Files are written to current working directory.8 9import sys10import re11 12chunk_id = 013pass_regex = re.compile(r"\(([\w-]+)\)")14 15# This function gets the pass name from the following line:16# *** IR Dump Before/After PASS_NAME... ***17def get_pass_name(line, prefix):18 # avoid accidentally parsing function name in e.g.19 # "*** IR Dump Before InlinerPass on (foo) ***"20 line = line.split(" on ")[0]21 non_pretty_pass_name = pass_regex.search(line)22 # machine function pass names can contain spaces,23 # but have a CLI friendly name also, e.g.:24 # "*** IR Dump Before Stack Frame Layout Analysis (stack-frame-layout) ***"25 if non_pretty_pass_name:26 return non_pretty_pass_name.group(1)27 short_line = line[line.find(prefix) + len(prefix) + 1 :]28 return re.split(" |<", short_line)[0]29 30 31def print_chunk(lines, prefix, pass_name):32 global chunk_id33 fname = str(chunk_id).zfill(4) + "-" + prefix + "-" + pass_name + ".ll"34 chunk_id = chunk_id + 135 print("writing chunk " + fname + " (" + str(len(lines)) + " lines)")36 with open(fname, "w") as f:37 f.writelines(lines)38 39 40is_dump = False41cur = []42for line in sys.stdin:43 if "*** IR Dump Before " in line:44 if len(cur) != 0:45 print_chunk(cur, "before", pass_name)46 cur = []47 cur.append("; " + line)48 pass_name = get_pass_name(line, "Before")49 elif "*** IR Dump After " in line:50 if len(cur) != 0:51 print_chunk(cur, "after", pass_name)52 cur = []53 cur.append("; " + line)54 pass_name = get_pass_name(line, "After")55 elif line.startswith("Stack dump:"):56 print_chunk(cur, "crash", pass_name)57 cur = []58 cur.append(line)59 is_dump = True60 else:61 cur.append(line)62 63if is_dump:64 print("writing crashinfo.txt (" + str(len(cur)) + " lines)")65 with open("crashinfo.txt", "w") as f:66 f.writelines(cur)67else:68 print_chunk(cur, "last", pass_name)69