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 arm 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 Workerbegin = INVALID 18*9880d681SAndroid Build Coastguard Workerbegins = dict() 19*9880d681SAndroid Build Coastguard Workerfor line in inp: 20*9880d681SAndroid Build Coastguard Worker linenum += 1 21*9880d681SAndroid Build Coastguard Worker if ".align" in line: 22*9880d681SAndroid Build Coastguard Worker last_align = linenum 23*9880d681SAndroid Build Coastguard Worker if ".code" in line: 24*9880d681SAndroid Build Coastguard Worker last_code = linenum 25*9880d681SAndroid Build Coastguard Worker if ".globl" in line: 26*9880d681SAndroid Build Coastguard Worker last_globl = linenum 27*9880d681SAndroid Build Coastguard Worker m = re.search(r'.thumb_func\s+(\w+)', line) 28*9880d681SAndroid Build Coastguard Worker if m: 29*9880d681SAndroid Build Coastguard Worker funcname = m.group(1) 30*9880d681SAndroid Build Coastguard Worker if last_code == last_align+1 and (linenum - last_code) < 4: 31*9880d681SAndroid Build Coastguard Worker begin = last_align 32*9880d681SAndroid Build Coastguard Worker if last_globl+1 == last_align: 33*9880d681SAndroid Build Coastguard Worker begin = last_globl 34*9880d681SAndroid Build Coastguard Worker if line == "\n" and begin != INVALID: 35*9880d681SAndroid Build Coastguard Worker end = linenum 36*9880d681SAndroid Build Coastguard Worker triple = (funcname, begin, end) 37*9880d681SAndroid Build Coastguard Worker begins[begin] = triple 38*9880d681SAndroid Build Coastguard Worker begin = INVALID 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker# Second pass: Mark 41*9880d681SAndroid Build Coastguard Workerout = open(sys.argv[1], "w") 42*9880d681SAndroid Build Coastguard Workerin_func = None 43*9880d681SAndroid Build Coastguard Workerlinenum = 0 44*9880d681SAndroid Build Coastguard Workerfor line in inp: 45*9880d681SAndroid Build Coastguard Worker linenum += 1 46*9880d681SAndroid Build Coastguard Worker if in_func is not None and linenum == end: 47*9880d681SAndroid Build Coastguard Worker out.write("# -- End %s\n" % in_func) 48*9880d681SAndroid Build Coastguard Worker in_func = None 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker triple = begins.get(linenum) 51*9880d681SAndroid Build Coastguard Worker if triple is not None: 52*9880d681SAndroid Build Coastguard Worker in_func, begin, end = triple 53*9880d681SAndroid Build Coastguard Worker out.write("# -- Begin %s\n" % in_func) 54*9880d681SAndroid Build Coastguard Worker out.write(line) 55