File: mark_aarch64fns.py

package info (click to toggle)
llvm-toolchain-3.9 1%3A3.9.1-8
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 441,060 kB
  • ctags: 428,777
  • sloc: cpp: 2,546,577; ansic: 538,318; asm: 119,677; objc: 103,316; python: 102,148; sh: 27,847; pascal: 5,626; ml: 5,510; perl: 5,293; lisp: 4,801; makefile: 2,177; xml: 686; cs: 362; php: 212; csh: 117
file content (65 lines) | stat: -rwxr-xr-x 1,700 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/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)