diff --git a/compiler-rt/lib/sanitizer_common/scripts/gen_dynamic_list.py b/compiler-rt/lib/sanitizer_common/scripts/gen_dynamic_list.py index 23b861eedbe9..de8ea4d0f70b 100755 --- a/compiler-rt/lib/sanitizer_common/scripts/gen_dynamic_list.py +++ b/compiler-rt/lib/sanitizer_common/scripts/gen_dynamic_list.py @@ -14,14 +14,25 @@ # gen_dynamic_list.py libclang_rt.*san*.a [ files ... ] # #===------------------------------------------------------------------------===# -import re import os +import re import subprocess import sys +new_delete = set(['_ZdaPv', '_ZdaPvRKSt9nothrow_t', + '_ZdlPv', '_ZdlPvRKSt9nothrow_t', + '_Znam', '_ZnamRKSt9nothrow_t', + '_Znwm', '_ZnwmRKSt9nothrow_t']) + +versioned_functions = set(['memcpy', 'pthread_cond_broadcast', + 'pthread_cond_destroy', 'pthread_cond_signal', + 'pthread_cond_timedwait', 'pthread_cond_wait', + 'realpath', 'sched_getaffinity']) + def get_global_functions(library): functions = [] - nm_proc = subprocess.Popen(['nm', library], stdout=subprocess.PIPE) + nm_proc = subprocess.Popen(['nm', library], stdout=subprocess.PIPE, + stderr=subprocess.PIPE) nm_out = nm_proc.communicate()[0].split('\n') if nm_proc.returncode != 0: raise subprocess.CalledProcessError(nm_proc.returncode, 'nm') @@ -31,46 +42,42 @@ def get_global_functions(library): functions.append(cols[2]) return functions -result = [] +def main(argv): + result = [] -library = sys.argv[1] -all_functions = get_global_functions(library) -function_set = set(all_functions) -new_delete = set(['_ZdaPv', '_ZdaPvRKSt9nothrow_t', - '_ZdlPv', '_ZdlPvRKSt9nothrow_t', - '_Znam', '_ZnamRKSt9nothrow_t', - '_Znwm', '_ZnwmRKSt9nothrow_t']) -versioned_functions = set(['memcpy', 'pthread_cond_broadcast', - 'pthread_cond_destroy', 'pthread_cond_signal', - 'pthread_cond_timedwait', 'pthread_cond_wait', - 'realpath', 'sched_getaffinity']) -for func in all_functions: - # Export new/delete operators. - if func in new_delete: - result.append(func) - continue - # Export interceptors. - match = re.match('__interceptor_(.*)', func) - if match: - result.append(func) - # 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: - result.append(orig_name) - continue - # Export sanitizer interface functions. - if re.match('__sanitizer_(.*)', func): - result.append(func) + library = argv[1] + all_functions = get_global_functions(library) + function_set = set(all_functions) + for func in all_functions: + # Export new/delete operators. + if func in new_delete: + result.append(func) + continue + # Export interceptors. + match = re.match('__interceptor_(.*)', func) + if match: + result.append(func) + # 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: + result.append(orig_name) + continue + # Export sanitizer interface functions. + if re.match('__sanitizer_(.*)', func): + result.append(func) -# Additional exported functions from files. -for fname in sys.argv[2:]: - f = open(fname, 'r') - for line in f: - result.append(line.rstrip()) + # Additional exported functions from files. + for fname in argv[2:]: + f = open(fname, 'r') + for line in f: + result.append(line.rstrip()) + # Print the resulting list in the format recognized by ld. + print '{' + result.sort() + for f in result: + print ' ' + f + ';' + print '};' -print '{' -result.sort() -for f in result: - print ' ' + f + ';' -print '};' +if __name__ == '__main__': + main(sys.argv)