aboutsummaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/scripts/gen_dynamic_list.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sanitizer_common/scripts/gen_dynamic_list.py')
-rwxr-xr-xlib/sanitizer_common/scripts/gen_dynamic_list.py39
1 files changed, 30 insertions, 9 deletions
diff --git a/lib/sanitizer_common/scripts/gen_dynamic_list.py b/lib/sanitizer_common/scripts/gen_dynamic_list.py
index 7bab230650cb..f055bb44ba21 100755
--- a/lib/sanitizer_common/scripts/gen_dynamic_list.py
+++ b/lib/sanitizer_common/scripts/gen_dynamic_list.py
@@ -14,15 +14,24 @@
# gen_dynamic_list.py libclang_rt.*san*.a [ files ... ]
#
#===------------------------------------------------------------------------===#
+import argparse
import os
import re
import subprocess
import sys
-new_delete = set(['_ZdaPv', '_ZdaPvRKSt9nothrow_t',
- '_ZdlPv', '_ZdlPvRKSt9nothrow_t',
- '_Znam', '_ZnamRKSt9nothrow_t',
- '_Znwm', '_ZnwmRKSt9nothrow_t'])
+new_delete = set([
+ '_Znam', '_ZnamRKSt9nothrow_t', # operator new[](unsigned long)
+ '_Znwm', '_ZnwmRKSt9nothrow_t', # operator new(unsigned long)
+ '_Znaj', '_ZnajRKSt9nothrow_t', # operator new[](unsigned int)
+ '_Znwj', '_ZnwjRKSt9nothrow_t', # operator new(unsigned int)
+ '_ZdaPv', '_ZdaPvRKSt9nothrow_t', # operator delete[](void *)
+ '_ZdlPv', '_ZdlPvRKSt9nothrow_t', # operator delete(void *)
+ '_ZdaPvm', # operator delete[](void*, unsigned long)
+ '_ZdlPvm', # operator delete(void*, unsigned long)
+ '_ZdaPvj', # operator delete[](void*, unsigned int)
+ '_ZdlPvj', # operator delete(void*, unsigned int)
+ ])
versioned_functions = set(['memcpy', 'pthread_attr_getaffinity_np',
'pthread_cond_broadcast',
@@ -49,10 +58,17 @@ def get_global_functions(library):
return functions
def main(argv):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--version-list', action='store_true')
+ parser.add_argument('--extra', default=[], action='append')
+ parser.add_argument('libraries', default=[], nargs='+')
+ args = parser.parse_args()
+
result = []
- library = argv[1]
- all_functions = get_global_functions(library)
+ all_functions = []
+ for library in args.libraries:
+ all_functions.extend(get_global_functions(library))
function_set = set(all_functions)
for func in all_functions:
# Export new/delete operators.
@@ -66,7 +82,7 @@ def main(argv):
# We have to avoid exporting the interceptors for versioned library
# functions due to gold internal error.
orig_name = match.group(1)
- if orig_name in function_set and orig_name not in versioned_functions:
+ if orig_name in function_set and (args.version_list or orig_name not in versioned_functions):
result.append(orig_name)
continue
# Export sanitizer interface functions.
@@ -74,15 +90,20 @@ def main(argv):
result.append(func)
# Additional exported functions from files.
- for fname in argv[2:]:
+ for fname in args.extra:
f = open(fname, 'r')
for line in f:
result.append(line.rstrip())
# Print the resulting list in the format recognized by ld.
print('{')
+ if args.version_list:
+ print('global:')
result.sort()
for f in result:
- print(' ' + f + ';')
+ print(' ' + f.encode('utf-8') + ';')
+ if args.version_list:
+ print('local:')
+ print(' *;')
print('};')
if __name__ == '__main__':