aboutsummaryrefslogtreecommitdiff
path: root/utils/add_argument_names.py
diff options
context:
space:
mode:
Diffstat (limited to 'utils/add_argument_names.py')
-rwxr-xr-xutils/add_argument_names.py82
1 files changed, 82 insertions, 0 deletions
diff --git a/utils/add_argument_names.py b/utils/add_argument_names.py
new file mode 100755
index 000000000000..38dde2599794
--- /dev/null
+++ b/utils/add_argument_names.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python3
+import re, sys
+
+def fix_string(s):
+ 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*')
+
+ counter = 0
+ if 'i32{{.*}}' in s:
+ counter = 1
+
+ at_pos = s.find('@')
+ if at_pos == -1:
+ at_pos = 0
+
+ annoying_pos = s.find('{{[^(]+}}')
+ if annoying_pos != -1:
+ at_pos = annoying_pos + 9
+
+ paren_pos = s.find('(', at_pos)
+ if paren_pos == -1:
+ return s
+
+ res = s[:paren_pos+1]
+ s = s[paren_pos+1:]
+
+ m = TYPE.match(s)
+ while m:
+ res += m.group()
+ s = s[m.end():]
+ if s.startswith(',') or s.startswith(')'):
+ res += f' %{counter}'
+ counter += 1
+
+ next_arg = s.find(',')
+ if next_arg == -1:
+ break
+
+ res += s[:next_arg+1]
+ s = s[next_arg+1:]
+ m = TYPE.match(s)
+
+ return res+s
+
+def process_file(contents):
+ PREFIX = re.compile(r'check-prefix(es)?(=|\s+)([a-zA-Z0-9,]+)')
+ check_prefixes = ['CHECK']
+ result = ''
+ for line in contents.split('\n'):
+ if 'FileCheck' in line:
+ m = PREFIX.search(line)
+ if m:
+ check_prefixes.extend(m.group(3).split(','))
+
+ found_check = False
+ for prefix in check_prefixes:
+ if prefix in line:
+ found_check = True
+ break
+
+ if not found_check or 'define' not in line:
+ result += line + '\n'
+ continue
+
+ # We have a check for a function definition. Number the args.
+ line = fix_string(line)
+ result += line + '\n'
+ return result
+
+def main():
+ print(f'Processing {sys.argv[1]}')
+ f = open(sys.argv[1])
+ content = f.read()
+ f.close()
+
+ content = process_file(content)
+
+ f = open(sys.argv[1], 'w')
+ f.write(content)
+ f.close()
+
+if __name__ == '__main__':
+ main()