#!/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 aarch64 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
last_globl_name = None
begin = INVALID
in_text_section = False
begins = dict()
for line in inp:
linenum += 1
if re.search(r'.section\s+__TEXT,__text,regular,pure_instructions', line):
in_text_section = True
continue
elif ".section" in line:
in_text_section = False
continue
if not in_text_section:
continue
if ".align" in line:
last_align = linenum
gl = re.search(r'.globl\s+(\w+)', line)
if gl:
last_globl_name = gl.group(1)
last_globl = linenum
m = re.search(r'^(\w+):', line)
if m and begin == INVALID:
labelname = m.group(1)
if last_globl+2 == linenum and last_globl_name == labelname:
begin = last_globl
funcname = labelname
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)