brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 6ad126e Raw
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