brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · caa73b6 Raw
95 lines · python
1#!/usr/bin/env python2 3# This creates a CSV file from the output of the debug output of subtarget:4#   llvm-tblgen --gen-subtarget --debug-only=subtarget-emitter5# With thanks to Dave Estes for mentioning the idea at 2014 LLVM Developers' Meeting6 7import os8import sys9import re10import operator11 12table = {}13models = set()14filt = None15 16 17def add(instr, model, resource=None):18    global table, models19 20    entry = table.setdefault(instr, dict())21    entry[model] = resource22    models.add(model)23 24 25def filter_model(m):26    global filt27    if m and filt:28        return filt.search(m) is not None29    else:30        return True31 32 33def display():34    global table, models35 36    # remove default and itinerary so we can control their sort order to make37    # them first38    models.discard("default")39    models.discard("itinerary")40 41    ordered_table = sorted(table.items(), key=operator.itemgetter(0))42    ordered_models = ["itinerary", "default"]43    ordered_models.extend(sorted(models))44    ordered_models = [m for m in ordered_models if filter_model(m)]45 46    # print header47    sys.stdout.write("instruction")48    for model in ordered_models:49        sys.stdout.write(", {}".format(model))50    sys.stdout.write(os.linesep)51 52    for (instr, mapping) in ordered_table:53        sys.stdout.write(instr)54        for model in ordered_models:55            if model in mapping and mapping[model] is not None:56                sys.stdout.write(", {}".format(mapping[model]))57            else:58                sys.stdout.write(", ")59        sys.stdout.write(os.linesep)60 61 62def machineModelCover(path):63    # The interesting bits64    re_sched_default = re.compile("SchedRW machine model for ([^ ]*) (.*)\n")65    re_sched_no_default = re.compile("No machine model for ([^ ]*)\n")66    re_sched_spec = re.compile("InstRW on ([^ ]*) for ([^ ]*) (.*)\n")67    re_sched_no_spec = re.compile("No machine model for ([^ ]*) on processor (.*)\n")68    re_sched_itin = re.compile("Itinerary for ([^ ]*): ([^ ]*)\n")69 70    # scan the file71    with open(path, "r") as f:72        for line in f.readlines():73            match = re_sched_default.match(line)74            if match:75                add(match.group(1), "default", match.group(2))76            match = re_sched_no_default.match(line)77            if match:78                add(match.group(1), "default")79            match = re_sched_spec.match(line)80            if match:81                add(match.group(2), match.group(1), match.group(3))82            match = re_sched_no_spec.match(line)83            if match:84                add(match.group(1), match.group(2))85            match = re_sched_itin.match(line)86            if match:87                add(match.group(1), "itinerary", match.group(2))88 89    display()90 91 92if len(sys.argv) > 2:93    filt = re.compile(sys.argv[2], re.IGNORECASE)94machineModelCover(sys.argv[1])95