blob: 781f97e90dfa387778fad71f09273574f9251269 [file] [log] [blame]
#!/usr/bin/perl
# Replace stack frame for a thread created by pthread_create():
# by 0x........: _thrp_setup (in /lib/libc.so.1)
# with a stack frame expected on Linux:
# by 0x........: start_thread (pthread_create.c:123)
# It will be further reduced and mangled by the main filter_stderr script.
# This needs to be done first.
s/_thrp_setup \(in .*libc.*\)/start_thread \(pthread_create.c:123\)/g;
# We need to filter out the Solaris libc's stack frame which looks like:
# by 0x........: pthread_mutex_init (in /...libc...)
# to be consistent with the expected output of test cases.
#
# Stack frames for synchronization functions are missing on Linux because
# of optimalization.
#
s/.*\(in \/...libc...\)\R//m;
# We need to replace Solaris threading and sychronization function
# names with POSIX ones for drd_pthread_intercepts.c stack frame:
# by 0x........: cond_init (drd_pthread_intercepts.c:123)
# See also comments in drd_pthread_intercepts.c.
my %regex = (
'thr_create' => 'pthread_create',
'thr_join' => 'pthread_join',
'mutex_init' => 'pthread_mutex_init',
'mutex_destroy' => 'pthread_mutex_destroy',
'mutex_lock' => 'pthread_mutex_lock',
'mutex_trylock' => 'pthread_mutex_trylock',
'mutex_unlock' => 'pthread_mutex_unlock',
'cond_init' => 'pthread_cond_init',
'cond_destroy' => 'pthread_cond_destroy',
'cond_wait' => 'pthread_cond_wait',
'cond_timedwait' => 'pthread_cond_timedwait',
'cond_signal' => 'pthread_cond_signal',
'cond_broadcast' => 'pthread_cond_broadcast',
'sema_init' => 'sem_init',
'sema_destroy' => 'sem_destroy',
'sema_wait' => 'sem_wait',
'sema_trywait' => 'sem_trywait',
'sema_timedwait' => 'sem_timedwait',
'sema_post' => 'sem_post',
'rwlock_init' => 'pthread_rwlock_init',
'rwlock_destroy' => 'pthread_rwlock_destroy',
'rw_rdlock' => 'pthread_rwlock_rdlock',
'rw_wrlock' => 'pthread_rwlock_wrlock',
'rw_tryrdlock' => 'pthread_rwlock_tryrdlock',
'rw_trywrlock' => 'pthread_rwlock_trywrlock',
'rw_unlock' => 'pthread_rwlock_unlock'
);
my $check = join "|", keys %regex;
if (! /: pthread_/) {
s/($check)(.*drd_pthread_intercepts.c)/$regex{$1}$2/g;
}