1*9880d681SAndroid Build Coastguard Worker#!/usr/bin/env python 2*9880d681SAndroid Build Coastguard Worker# 3*9880d681SAndroid Build Coastguard Worker# Mark functions in an arm assembly file. This is done by surrounding the 4*9880d681SAndroid Build Coastguard Worker# function with "# -- Begin Name" and "# -- End Name" 5*9880d681SAndroid Build Coastguard Worker# (This script is designed for aarch64 ios assembly syntax) 6*9880d681SAndroid Build Coastguard Workerimport sys 7*9880d681SAndroid Build Coastguard Workerimport re 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerinp = open(sys.argv[1], "r").readlines() 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker# First pass 12*9880d681SAndroid Build Coastguard Workerlinenum = 0 13*9880d681SAndroid Build Coastguard WorkerINVALID=-100 14*9880d681SAndroid Build Coastguard Workerlast_align = INVALID 15*9880d681SAndroid Build Coastguard Workerlast_code = INVALID 16*9880d681SAndroid Build Coastguard Workerlast_globl = INVALID 17*9880d681SAndroid Build Coastguard Workerlast_globl_name = None 18*9880d681SAndroid Build Coastguard Workerbegin = INVALID 19*9880d681SAndroid Build Coastguard Workerin_text_section = False 20*9880d681SAndroid Build Coastguard Workerbegins = dict() 21*9880d681SAndroid Build Coastguard Workerfor line in inp: 22*9880d681SAndroid Build Coastguard Worker linenum += 1 23*9880d681SAndroid Build Coastguard Worker if re.search(r'.section\s+__TEXT,__text,regular,pure_instructions', line): 24*9880d681SAndroid Build Coastguard Worker in_text_section = True 25*9880d681SAndroid Build Coastguard Worker continue 26*9880d681SAndroid Build Coastguard Worker elif ".section" in line: 27*9880d681SAndroid Build Coastguard Worker in_text_section = False 28*9880d681SAndroid Build Coastguard Worker continue 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker if not in_text_section: 31*9880d681SAndroid Build Coastguard Worker continue 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker if ".align" in line: 34*9880d681SAndroid Build Coastguard Worker last_align = linenum 35*9880d681SAndroid Build Coastguard Worker gl = re.search(r'.globl\s+(\w+)', line) 36*9880d681SAndroid Build Coastguard Worker if gl: 37*9880d681SAndroid Build Coastguard Worker last_globl_name = gl.group(1) 38*9880d681SAndroid Build Coastguard Worker last_globl = linenum 39*9880d681SAndroid Build Coastguard Worker m = re.search(r'^(\w+):', line) 40*9880d681SAndroid Build Coastguard Worker if m and begin == INVALID: 41*9880d681SAndroid Build Coastguard Worker labelname = m.group(1) 42*9880d681SAndroid Build Coastguard Worker if last_globl+2 == linenum and last_globl_name == labelname: 43*9880d681SAndroid Build Coastguard Worker begin = last_globl 44*9880d681SAndroid Build Coastguard Worker funcname = labelname 45*9880d681SAndroid Build Coastguard Worker if line == "\n" and begin != INVALID: 46*9880d681SAndroid Build Coastguard Worker end = linenum 47*9880d681SAndroid Build Coastguard Worker triple = (funcname, begin, end) 48*9880d681SAndroid Build Coastguard Worker begins[begin] = triple 49*9880d681SAndroid Build Coastguard Worker begin = INVALID 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker# Second pass: Mark 52*9880d681SAndroid Build Coastguard Workerout = open(sys.argv[1], "w") 53*9880d681SAndroid Build Coastguard Workerin_func = None 54*9880d681SAndroid Build Coastguard Workerlinenum = 0 55*9880d681SAndroid Build Coastguard Workerfor line in inp: 56*9880d681SAndroid Build Coastguard Worker linenum += 1 57*9880d681SAndroid Build Coastguard Worker if in_func is not None and linenum == end: 58*9880d681SAndroid Build Coastguard Worker out.write("# -- End %s\n" % in_func) 59*9880d681SAndroid Build Coastguard Worker in_func = None 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker triple = begins.get(linenum) 62*9880d681SAndroid Build Coastguard Worker if triple is not None: 63*9880d681SAndroid Build Coastguard Worker in_func, begin, end = triple 64*9880d681SAndroid Build Coastguard Worker out.write("# -- Begin %s\n" % in_func) 65*9880d681SAndroid Build Coastguard Worker out.write(line) 66