普通文本  |  55行  |  1.38 KB

#!/usr/bin/env python
#
# Mark functions in an arm assembly file. This is done by surrounding the
# function with "# -- Begin Name" and "# -- End Name"
# (This script is designed for arm ios assembly syntax)
import sys
import re

inp = open(sys.argv[1], "r").readlines()

# First pass
linenum = 0
INVALID=-100
last_align = INVALID
last_code = INVALID
last_globl = INVALID
begin = INVALID
begins = dict()
for line in inp:
    linenum += 1
    if ".align" in line:
        last_align = linenum
    if ".code" in line:
        last_code = linenum
    if ".globl" in line:
        last_globl = linenum
    m = re.search(r'.thumb_func\s+(\w+)', line)
    if m:
        funcname = m.group(1)
        if last_code == last_align+1 and (linenum - last_code) < 4:
            begin = last_align
            if last_globl+1 == last_align:
                begin = last_globl
    if line == "\n" and begin != INVALID:
        end = linenum
        triple = (funcname, begin, end)
        begins[begin] = triple
        begin = INVALID

# Second pass: Mark
out = open(sys.argv[1], "w")
in_func = None
linenum = 0
for line in inp:
    linenum += 1
    if in_func is not None and linenum == end:
        out.write("# -- End  %s\n" % in_func)
        in_func = None

    triple = begins.get(linenum)
    if triple is not None:
        in_func, begin, end = triple
        out.write("# -- Begin  %s\n" % in_func)
    out.write(line)