Skip to content
This repository has been archived by the owner on May 21, 2019. It is now read-only.

Commit

Permalink
Minor updates to gen_dynamic_list script suggested by glider
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@189588 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Alexey Samsonov committed Aug 29, 2013
1 parent 0bc4a0b commit fb23e2f
Showing 1 changed file with 49 additions and 42 deletions.
91 changes: 49 additions & 42 deletions lib/sanitizer_common/scripts/gen_dynamic_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand All @@ -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)

0 comments on commit fb23e2f

Please sign in to comment.