66 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| #!/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)
 |