Mercurial > hg > CbC > CbC_llvm
comparison utils/add_argument_names.py @ 171:66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 11:07:02 +0900 |
parents | c2174574ed3a |
children |
comparison
equal
deleted
inserted
replaced
150:1d019706d866 | 171:66f3bfe93da9 |
---|---|
1 #!/usr/bin/env python3 | |
2 import re, sys | |
3 | |
4 def fix_string(s): | |
5 TYPE = re.compile('\s*(i[0-9]+|float|double|x86_fp80|fp128|ppc_fp128|\[\[.*?\]\]|\[2 x \[\[[A-Z_0-9]+\]\]\]|<.*?>|{.*?}|\[[0-9]+ x .*?\]|%["a-z:A-Z0-9._]+({{.*?}})?|%{{.*?}}|{{.*?}}|\[\[.*?\]\])(\s*(\*|addrspace\(.*?\)|dereferenceable\(.*?\)|byval\(.*?\)|sret|zeroext|inreg|returned|signext|nocapture|align \d+|swiftself|swifterror|readonly|noalias|inalloca|nocapture))*\s*') | |
6 | |
7 counter = 0 | |
8 if 'i32{{.*}}' in s: | |
9 counter = 1 | |
10 | |
11 at_pos = s.find('@') | |
12 if at_pos == -1: | |
13 at_pos = 0 | |
14 | |
15 annoying_pos = s.find('{{[^(]+}}') | |
16 if annoying_pos != -1: | |
17 at_pos = annoying_pos + 9 | |
18 | |
19 paren_pos = s.find('(', at_pos) | |
20 if paren_pos == -1: | |
21 return s | |
22 | |
23 res = s[:paren_pos+1] | |
24 s = s[paren_pos+1:] | |
25 | |
26 m = TYPE.match(s) | |
27 while m: | |
28 res += m.group() | |
29 s = s[m.end():] | |
30 if s.startswith(',') or s.startswith(')'): | |
31 res += f' %{counter}' | |
32 counter += 1 | |
33 | |
34 next_arg = s.find(',') | |
35 if next_arg == -1: | |
36 break | |
37 | |
38 res += s[:next_arg+1] | |
39 s = s[next_arg+1:] | |
40 m = TYPE.match(s) | |
41 | |
42 return res+s | |
43 | |
44 def process_file(contents): | |
45 PREFIX = re.compile(r'check-prefix(es)?(=|\s+)([a-zA-Z0-9,]+)') | |
46 check_prefixes = ['CHECK'] | |
47 result = '' | |
48 for line in contents.split('\n'): | |
49 if 'FileCheck' in line: | |
50 m = PREFIX.search(line) | |
51 if m: | |
52 check_prefixes.extend(m.group(3).split(',')) | |
53 | |
54 found_check = False | |
55 for prefix in check_prefixes: | |
56 if prefix in line: | |
57 found_check = True | |
58 break | |
59 | |
60 if not found_check or 'define' not in line: | |
61 result += line + '\n' | |
62 continue | |
63 | |
64 # We have a check for a function definition. Number the args. | |
65 line = fix_string(line) | |
66 result += line + '\n' | |
67 return result | |
68 | |
69 def main(): | |
70 print(f'Processing {sys.argv[1]}') | |
71 f = open(sys.argv[1]) | |
72 content = f.read() | |
73 f.close() | |
74 | |
75 content = process_file(content) | |
76 | |
77 f = open(sys.argv[1], 'w') | |
78 f.write(content) | |
79 f.close() | |
80 | |
81 if __name__ == '__main__': | |
82 main() |