-
Notifications
You must be signed in to change notification settings - Fork 2
/
flowchart-aarch64.py
71 lines (53 loc) · 1.61 KB
/
flowchart-aarch64.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/env python3
import sys
import re
print("digraph g {")
branchPattern = re.compile(r"^bl?(?:\...)? 0x([0-9a-f]+)")
lines = [line.strip() for line in sys.stdin]
# the split is the index of the last item
splits = []
pos = 0
for line in lines:
match = branchPattern.match(line)
if match:
destPos = match.group(0).split(' ')[1]
destPos = int(destPos, 16)//4
splits.append(pos)
splits.append(destPos-1)
if line.startswith("ret"):
splits.append(pos)
pos += 1
splits.sort()
blocks = []
currentBlock = []
for i, line in enumerate(lines):
currentBlock.append(line)
if i in splits:
blocks.append(currentBlock)
currentBlock = []
if len(currentBlock) > 0:
blocks.append(currentBlock)
for i, block in enumerate(blocks):
label = '\\n'.join(block)
print('a{} [label="{}", shape=box]'.format(i, label))
match = branchPattern.match(block[-1])
if match:
if i < len(blocks) - 1 and (match.group(0).startswith('b.') or match.group(0).startswith('bl')):
print("a{} -> a{}".format(i, i+1))
destPos = match.group(0).split(' ')[1]
destPos = int(destPos, 16)//4
destBlockIdx = 0
currentDestPos = 0
for di, b in enumerate(blocks):
if currentDestPos + len(b) < destPos:
destBlockIdx += 1
currentDestPos += len(b)
elif match.group(0)[1] == 'l':
print("a{} -> a{} [color=green, dir=both]".format(i, destBlockIdx+1))
break
else:
print("a{} -> a{} [color=blue]".format(i, destBlockIdx+1))
break
elif i < len(blocks) - 1 and not block[-1].startswith('ret'):
print("a{} -> a{}".format(i, i+1))
print("}")