blob: 51afdf3cf1bfff3bfcaecc127efd99038a3fa6e6 [file] [log] [blame]
rjw1f884582022-01-06 17:20:42 +08001#!/usr/bin/env python
2
3import sys
4import re
5
6hexrule = re.compile("([0-9a-fA-F]+)")
7hex2byterule = re.compile("([0-9a-fA-F]{4})")
8hexcolonrule = re.compile("([0-9a-fA-F]+)\:")
9symbolrule = re.compile("<([\._a-zA-Z]+[\._0-9a-zA-Z]*)>:")
10insrule = re.compile("([a-zA-Z][\.a-zA-Z]*)")
11
12currsymbol = ""
13curraddress = 0
14count = 0
15
16for line in sys.stdin:
17 t = line.split()
18
19 if len(t) == 0:
20 continue
21
22 try:
23
24 # match the address
25 match = hexcolonrule.match(t[0])
26 if match:
27 #print "%s %s" % (match, match.group(1))
28 curraddress = int(match.group(1), 16)
29 #print "curraddress 0x%x" % curraddress
30
31 # see if this is a symbol declaration
32 match = symbolrule.match(t[1])
33 if match:
34 # print the previous count
35 if count > 0:
36 print "%d %s" % (count, currsymbol)
37 count = 0
38
39 #print "%s %s" % (match, match.group(1))
40 currsymbol = str(match.group(1))
41 #print "current symbol is now '%s'" % currsymbol
42 continue
43
44 # see if it's a one or two byte opcode
45 iindex = 2
46 match = hex2byterule.match(t[1])
47 if not match:
48 continue
49 match = hex2byterule.match(t[2])
50 if match:
51 #print "match %s, %s" % (match, match.group(0))
52 iindex = 3
53
54 #print "instruction starts at index %d: '%s'" % (iindex, t[iindex])
55
56 # match the instruction string
57 insmatch = insrule.match(t[iindex])
58 if not insmatch:
59 continue
60 ins = insmatch.group(1)
61 #print "instruction '%s'" % ins
62
63 # look for a few special instructions
64 if ins == "push":
65 c = (len(t) - 1 - iindex) * 4
66 #print "%d bytes pushed" % c
67 count += c
68
69 # look for a few special instructions
70 if ins == "stmdb":
71 c = (len(t) - 2 - iindex) * 4
72 #print "%d bytes stmed" % c
73 count += c
74
75 if ins == "sub":
76 reg = t[iindex+1]
77 if reg == "sp,":
78 conststr = t[iindex+2]
79 c = int(conststr[1:])
80 #print "subtracting from sp, val %d" % c
81 count += c
82
83 except IndexError:
84 continue
85 except Exception as e:
86 print "Exception %s" % e
87 continue
88
89# print the last count
90if count > 0:
91 print "%d %s" % (count, currsymbol)
92