diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-11-18 17:46:49 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-11-18 17:47:12 +0800 |
commit | bffed50ec9da2d18a84184e69d18f1e25d708ecc (patch) | |
tree | b9bd007ac67d8a965f9cf031a7f5319b14f0a19e /scripts/mir_to_dot.py | |
parent | fa7ad5fb4963e8a6315a69fcba71cc63a75b1be5 (diff) | |
download | mrust-bffed50ec9da2d18a84184e69d18f1e25d708ecc.tar.gz |
Updated gitignore and some useful scripts
Diffstat (limited to 'scripts/mir_to_dot.py')
-rw-r--r-- | scripts/mir_to_dot.py | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/scripts/mir_to_dot.py b/scripts/mir_to_dot.py new file mode 100644 index 00000000..4df784e6 --- /dev/null +++ b/scripts/mir_to_dot.py @@ -0,0 +1,119 @@ +import re + + +class Link(object): + def __init__(self, src, dst, label): + self._src = 'bb%i' % (src,) + self._dst = dst if isinstance(dst, str) else 'bb%i' % (dst,) + self._label = label + +def main(): + + #cratename,pat = 'rustc_lint','fn .*expr_refers_to_this_method.*' + cratename,pat = 'std','fn resize.*HashMap' + #cratename,pat = 'rustc', 'fn tables.*::"rustc"::ty::context::TyCtxt' + + fp = open('output/lib'+cratename+'.hir_3_mir.rs'); + start_pat = re.compile(pat) + def_line = None + for line in fp: + line = line.strip() + if start_pat.match(line) != None: + print "#",line + def_line = line + break + + if def_line is None: + return + + for line in fp: + if line.strip() == "bb0: {": + break + + bbs = [] + cur_bb_lines = [] + level = 2 + for line in fp: + line = line.strip() + if line == "}": + level -= 1 + if level == 0: + break + else: + bbs.append( cur_bb_lines ) + cur_bb_lines = [] + continue + + if "bb" in line and ": {" in line: + level += 1 + continue + + outstr = "" + comment_level = 0 + i = 0 + while i < len(line): + if comment_level > 0: + if line[i:i+2] == '*/': + comment_level -= 1 + i += 2 + continue + if line[i:i+2] == '/*': + comment_level += 1 + i += 2 + continue + if comment_level == 0: + outstr += line[i] + i += 1 + print "#",len(bbs),outstr + + cur_bb_lines.append(outstr) + + goto_regex = re.compile('goto bb(\d+);$') + call_regex = re.compile('.*goto bb(\d+) else bb(\d+)$') + if_regex = re.compile('.*goto bb(\d+); } else { goto bb(\d+); }$') + switch_regex = re.compile('(\d+) => bb(\d+),') + + links = [] + for idx,bb in enumerate(bbs): + if bb[-1] == 'return;': + links.append( Link(idx, 'return', "return") ) + continue + if bb[-1] == 'diverge;': + #links.append( Link(idx, 'panic', "diverge") ) + continue + m = goto_regex.match(bb[-1]) + if m != None: + links.append( Link(idx, int(m.group(1)), "") ) + continue + m = call_regex.match(bb[-1]) + if m != None: + links.append( Link(idx, int(m.group(1)), "ret") ) + #links.append( Link(idx, int(m.group(2)), "panic") ) + continue + m = if_regex.match(bb[-1]) + if m != None: + links.append( Link(idx, int(m.group(1)), "true") ) + links.append( Link(idx, int(m.group(2)), "false") ) + continue + + + for m in switch_regex.finditer(bb[-1]): + links.append( Link(idx, int(m.group(2)), "var%s" % (m.group(1),) ) ) + + + + print "digraph {" + for l in links: + print '"%s" -> "%s" [label="%s"];' % (l._src, l._dst, l._label) + + print "" + for idx,bb in enumerate(bbs): + print '"bb%i" [label="BB%i:' % (idx,idx,), + for stmt in bb: + print '\\n',stmt.replace('"', '\\"'), + print '"];' + print "}" + + +main() + |