When merging multiple symbols with the same address, rather than always
choosing the longest symbol, choose the longest ignoring any of the libc
junk prefixes like __libc_, __, __GI_*, etc.  This makes the symbol
presented to the user in messages and used in *.supp files more consistent
and comprehensible.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2114 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/corecheck/tests/fdleak_cmsg.stderr.exp b/corecheck/tests/fdleak_cmsg.stderr.exp
index 8d7f2fe..512fda0 100644
--- a/corecheck/tests/fdleak_cmsg.stderr.exp
+++ b/corecheck/tests/fdleak_cmsg.stderr.exp
@@ -2,19 +2,19 @@
 
 FILE DESCRIPTORS: 7 open at exit.
 Open AF_UNIX socket .: /tmp/sock
-   at 0x........: __libc_accept (...libc...)
+   at 0x........: accept (in /...libc...)
    by 0x........: main (fdleak_cmsg.c:170)
 
 Open AF_UNIX socket .: /tmp/sock
-   at 0x........: __socket (in /...libc...)
+   at 0x........: socket (in /...libc...)
    by 0x........: main (fdleak_cmsg.c:170)
 
 Open file descriptor .: /tmp/data2
-   at 0x........: __libc_open (...libc...)
+   at 0x........: open (in /...libc...)
    by 0x........: main (fdleak_cmsg.c:170)
 
 Open file descriptor .: /tmp/data1
-   at 0x........: __libc_open (...libc...)
+   at 0x........: open (in /...libc...)
    by 0x........: main (fdleak_cmsg.c:170)
 
 Open file descriptor .: .
@@ -31,15 +31,15 @@
 
 FILE DESCRIPTORS: 6 open at exit.
 Open file descriptor .: /tmp/data2
-   at 0x........: __libc_recvmsg (...libc...)
+   at 0x........: recvmsg (in /...libc...)
    by 0x........: main (fdleak_cmsg.c:174)
 
 Open file descriptor .: /tmp/data1
-   at 0x........: __libc_recvmsg (...libc...)
+   at 0x........: recvmsg (in /...libc...)
    by 0x........: main (fdleak_cmsg.c:174)
 
 Open AF_UNIX socket .: <unknown>
-   at 0x........: __socket (in /...libc...)
+   at 0x........: socket (in /...libc...)
    by 0x........: main (fdleak_cmsg.c:174)
 
 Open file descriptor .: .
diff --git a/corecheck/tests/fdleak_creat.stderr.exp b/corecheck/tests/fdleak_creat.stderr.exp
index 2b2d0fd..66bcc39 100644
--- a/corecheck/tests/fdleak_creat.stderr.exp
+++ b/corecheck/tests/fdleak_creat.stderr.exp
@@ -3,7 +3,7 @@
 FILE DESCRIPTORS: 4 open at exit.
 Open file descriptor .: /tmp/file
 
-   at 0x........: __libc_creat (...libc...)
+   at 0x........: creat (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
diff --git a/corecheck/tests/fdleak_dup.stderr.exp b/corecheck/tests/fdleak_dup.stderr.exp
index 554e023..3fe6ffb 100644
--- a/corecheck/tests/fdleak_dup.stderr.exp
+++ b/corecheck/tests/fdleak_dup.stderr.exp
@@ -2,12 +2,12 @@
 
 FILE DESCRIPTORS: 5 open at exit.
 Open file descriptor .: /dev/null
-   at 0x........: __dup (in /...libc...)
+   at 0x........: dup (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
 Open file descriptor .: /dev/null
-   at 0x........: __libc_open (...libc...)
+   at 0x........: open (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
diff --git a/corecheck/tests/fdleak_dup2.stderr.exp b/corecheck/tests/fdleak_dup2.stderr.exp
index 6c811ce..81eb342 100644
--- a/corecheck/tests/fdleak_dup2.stderr.exp
+++ b/corecheck/tests/fdleak_dup2.stderr.exp
@@ -2,17 +2,17 @@
 
 FILE DESCRIPTORS: 6 open at exit.
 Open file descriptor .: /dev/null
-   at 0x........: __dup2 (in /...libc...)
+   at 0x........: dup2 (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
 Open file descriptor .: /dev/null
-   at 0x........: __dup2 (in /...libc...)
+   at 0x........: dup2 (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
 Open file descriptor .: /dev/null
-   at 0x........: __libc_open (...libc...)
+   at 0x........: open (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
diff --git a/corecheck/tests/fdleak_fcntl.stderr.exp b/corecheck/tests/fdleak_fcntl.stderr.exp
index 3e2a225..12faca7 100644
--- a/corecheck/tests/fdleak_fcntl.stderr.exp
+++ b/corecheck/tests/fdleak_fcntl.stderr.exp
@@ -2,11 +2,11 @@
 
 FILE DESCRIPTORS: 5 open at exit.
 Open file descriptor .: /dev/null
-   at 0x........: __libc_fcntl (...libc...)
+   at 0x........: fcntl (in /...libc...)
    by 0x........: main (fdleak_fcntl.c:18)
 
 Open file descriptor .: /dev/null
-   at 0x........: __libc_open (...libc...)
+   at 0x........: open (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
diff --git a/corecheck/tests/fdleak_ipv4.stderr.exp b/corecheck/tests/fdleak_ipv4.stderr.exp
index b3e88b1..374960c 100644
--- a/corecheck/tests/fdleak_ipv4.stderr.exp
+++ b/corecheck/tests/fdleak_ipv4.stderr.exp
@@ -2,11 +2,11 @@
 
 FILE DESCRIPTORS: 5 open at exit.
 Open AF_INET socket 4: 127.0.0.1:... <-> 127.0.0.1:...
-   at 0x........: __libc_accept (...libc...)
+   at 0x........: accept (in /...libc...)
    by 0x........: main (fdleak_ipv4.c:100)
 
 Open AF_INET socket 3: 127.0.0.1:... <-> unbound
-   at 0x........: __socket (in /...libc...)
+   at 0x........: socket (in /...libc...)
    by 0x........: main (fdleak_ipv4.c:100)
 
 Open file descriptor .: .
@@ -23,7 +23,7 @@
 
 FILE DESCRIPTORS: 4 open at exit.
 Open AF_INET socket 3: 127.0.0.1:... <-> 127.0.0.1:...
-   at 0x........: __socket (in /...libc...)
+   at 0x........: socket (in /...libc...)
    by 0x........: main (fdleak_ipv4.c:104)
 
 Open file descriptor .: .
diff --git a/corecheck/tests/fdleak_open.stderr.exp b/corecheck/tests/fdleak_open.stderr.exp
index 85d67ae..f24a5ef 100644
--- a/corecheck/tests/fdleak_open.stderr.exp
+++ b/corecheck/tests/fdleak_open.stderr.exp
@@ -2,7 +2,7 @@
 
 FILE DESCRIPTORS: 4 open at exit.
 Open file descriptor .: /dev/null
-   at 0x........: __libc_open (...libc...)
+   at 0x........: open (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
diff --git a/corecheck/tests/fdleak_pipe.stderr.exp b/corecheck/tests/fdleak_pipe.stderr.exp
index 41f9d8f..4ac5afc 100644
--- a/corecheck/tests/fdleak_pipe.stderr.exp
+++ b/corecheck/tests/fdleak_pipe.stderr.exp
@@ -2,12 +2,12 @@
 
 FILE DESCRIPTORS: 5 open at exit.
 Open file descriptor .:
-   at 0x........: __pipe (in /...libc...)
+   at 0x........: pipe (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
 Open file descriptor .:
-   at 0x........: __pipe (in /...libc...)
+   at 0x........: pipe (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
diff --git a/corecheck/tests/fdleak_socketpair.stderr.exp b/corecheck/tests/fdleak_socketpair.stderr.exp
index a63e4d6..a60040b 100644
--- a/corecheck/tests/fdleak_socketpair.stderr.exp
+++ b/corecheck/tests/fdleak_socketpair.stderr.exp
@@ -2,12 +2,12 @@
 
 FILE DESCRIPTORS: 5 open at exit.
 Open AF_UNIX socket .: <unknown>
-   at 0x........: __socketpair (in /...libc...)
+   at 0x........: socketpair (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
 Open AF_UNIX socket .: <unknown>
-   at 0x........: __socketpair (in /...libc...)
+   at 0x........: socketpair (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
diff --git a/coregrind/vg_symtab2.c b/coregrind/vg_symtab2.c
index de7ee53..5dd363e 100644
--- a/coregrind/vg_symtab2.c
+++ b/coregrind/vg_symtab2.c
@@ -398,6 +398,46 @@
    return a->addr - b->addr;
 }
 
+/* Two symbols have the same address.  Which name do we prefer?
+
+   In general we prefer the longer name, but if the choice is between
+   __libc_X and X, then choose X (similarly with __GI__ and __
+   prefixes).
+ */
+static RiSym *prefersym(RiSym *a, RiSym *b)
+{
+   Int pfx;
+
+   /* rearrange so that a is the long one */
+   if (VG_(strlen)(a->name) < VG_(strlen)(b->name)) {
+      RiSym *t;
+
+      t = a;
+      a = b;
+      b = t;
+   }
+
+   pfx = 0;
+   
+   if      (VG_(memcmp)(a->name, "__GI___libc_", 12) == 0)
+      pfx = 12;
+   else if (VG_(memcmp)(a->name, "__libc_", 7) == 0)
+      pfx = 7;
+   else if (VG_(memcmp)(a->name, "__GI___", 7) == 0)
+      pfx = 7;
+   else if (VG_(memcmp)(a->name, "__GI__", 6) == 0)
+      pfx = 6;
+   else if (VG_(memcmp)(a->name, "__GI_", 5) == 0)
+      pfx = 5;
+   else if (VG_(memcmp)(a->name, "__", 2) == 0)
+      pfx = 2;
+
+   if (pfx != 0 && VG_(strcmp)(a->name + pfx, b->name) == 0)
+      return b;
+
+   return a;
+}
+
 static 
 void canonicaliseSymtab ( SegInfo* si )
 {
@@ -427,12 +467,7 @@
              && si->symtab[i].size   == si->symtab[i+1].size) {
             n_merged++;
             /* merge the two into one */
-            if (VG_(strlen)(si->symtab[i].name) 
-                > VG_(strlen)(si->symtab[i+1].name)) {
-               si->symtab[si->symtab_used++] = si->symtab[i];
-            } else {
-               si->symtab[si->symtab_used++] = si->symtab[i+1];
-            }
+	    si->symtab[si->symtab_used++] = *prefersym(&si->symtab[i], &si->symtab[i+1]);
             i++;
          } else {
             si->symtab[si->symtab_used++] = si->symtab[i];
diff --git a/glibc-2.1.supp b/glibc-2.1.supp
index b318e20..c7d778a 100644
--- a/glibc-2.1.supp
+++ b/glibc-2.1.supp
@@ -37,17 +37,17 @@
 ##----------------------------------------------------------------------##
 
 {
-   __pthread_mutex_unlock/__register_frame_info_bases
+   pthread_mutex_unlock/__register_frame_info_bases
    core:PThread
-   fun:__pthread_mutex_unlock
+   fun:pthread_mutex_unlock
    fun:__register_frame_info_bases
 }
 
 {
-   socketcall.connect(serv_addr)/__libc_connect/*(Param)
+   socketcall.connect(serv_addr)/connect/*(Param)
    Addrcheck,Memcheck:Param
    socketcall.connect(serv_addr)
-   fun:__libc_connect
+   fun:connect
    fun:*
 }
 
@@ -68,10 +68,10 @@
 }
 
 {
-   llseek(result)/__libc_lseek64/_IO_file_seek(Param)
+   llseek(result)/lseek64/_IO_file_seek(Param)
    Addrcheck,Memcheck:Param
    llseek(result)
-   fun:__libc_lseek64
+   fun:lseek64
    fun:_IO_file_seek
 }
 
@@ -164,7 +164,7 @@
 }
 
 {
-   socketcall.connect(serv_addr)/__libc_connect/*(Param)
+   socketcall.connect(serv_addr)/connect/*(Param)
    Addrcheck,Memcheck:Param
    socketcall.connect(serv_addr)
    obj:*libc-2.1.3.so
@@ -174,10 +174,10 @@
 ##----------------------------------------------------------------------##
 ## For a leak in Valgrind's own libpthread.so :(
 {
-   my_malloc/get_or_allocate_specifics_ptr/__pthread_key_create(Leak)
+   my_malloc/get_or_allocate_specifics_ptr/pthread_key_create(Leak)
    Memcheck:Leak
    fun:my_malloc
    fun:get_or_allocate_specifics_ptr
-   fun:__pthread_key_create
+   fun:pthread_key_create
 }
 
diff --git a/glibc-2.2.supp b/glibc-2.2.supp
index afc65c3..ff1a9bd 100644
--- a/glibc-2.2.supp
+++ b/glibc-2.2.supp
@@ -173,25 +173,25 @@
 #-------- Threading bugs?
 # glibc 'knows' that destroying a locked mutex will unlock it
 {
-   pthread_error/__pthread_mutex_destroy/__closedir
+   pthread_error/pthread_mutex_destroy/__closedir
    core:PThread
    fun:pthread_error
-   fun:__pthread_mutex_destroy
+   fun:pthread_mutex_destroy
    fun:__closedir
 }
 
 {
-   pthread_error/__pthread_mutex_destroy/_IO_default_finish
+   pthread_error/pthread_mutex_destroy/_IO_default_finish
    core:PThread
    fun:pthread_error
-   fun:__pthread_mutex_destroy
+   fun:pthread_mutex_destroy
    fun:_IO_default_finish*
 }
 
 {
-   __pthread_mutex_unlock/_IO_funlockfile
+   pthread_mutex_unlock/_IO_funlockfile
    core:PThread
-   fun:__pthread_mutex_unlock
+   fun:pthread_mutex_unlock
    fun:_IO_funlockfile
 }
 
@@ -345,10 +345,10 @@
 
 #-------------------
 {
-   socketcall.connect(serv_addr)/__libc_connect/*
+   socketcall.connect(serv_addr)/connect/*
    Addrcheck,Memcheck:Param
    socketcall.connect(serv_addr)
-   fun:__libc_connect
+   fun:connect
    fun:*
 }
 {
@@ -361,10 +361,10 @@
 
 #----------------------
 {
-   write(buf)/__libc_write/libX11.so.6.2/libX11.so.6.2(Param)
+   write(buf)/write/libX11.so.6.2/libX11.so.6.2(Param)
    Addrcheck,Memcheck:Param
    write(buf)
-   fun:__libc_write
+   fun:write
    obj:/usr/X11R6/lib/libX11.so.6.2
    obj:/usr/X11R6/lib/libX11.so.6.2
 }
@@ -378,10 +378,10 @@
 }
 
 #{
-#   llseek(result)/__libc_lseek64/_IO_file_seek(Param)
+#   llseek(result)/lseek64/_IO_file_seek(Param)
 #   Param
 #   llseek(result)
-#   fun:__libc_lseek64
+#   fun:lseek64
 #   fun:_IO_file_seek
 #}
 
@@ -413,11 +413,11 @@
 ##----------------------------------------------------------------------##
 ## For a leak in Valgrind's own libpthread.so :(
 {
-   my_malloc/get_or_allocate_specifics_ptr/__pthread_key_create(Leak)
+   my_malloc/get_or_allocate_specifics_ptr/pthread_key_create(Leak)
    Memcheck:Leak
    fun:my_malloc
    fun:get_or_allocate_specifics_ptr
-   fun:__pthread_key_create
+   fun:pthread_key_create
 }
 
 
diff --git a/glibc-2.3.supp b/glibc-2.3.supp
index 72b346a..7e1f34c 100644
--- a/glibc-2.3.supp
+++ b/glibc-2.3.supp
@@ -106,40 +106,63 @@
    fun:dl_open_worker
 }
 
+#-------- glibc 2.3.2/ Fedora Core 1
+{
+   dl_relocate/dl_main
+   Memcheck:Cond
+   fun:_dl_relocate_object_internal
+   fun:dl_main
+}
+
+#-------- Data races
+{
+   _dl_lookup_symbol_internal/fixup/_dl_runtime_resolve
+   Helgrind:Eraser
+   fun:_dl_lookup_symbol_internal
+   fun:fixup
+   fun:_dl_runtime_resolve
+}
+{
+   _dl_lookup_versioned_symbol_internal/fixup/_dl_runtime_resolve
+   Helgrind:Eraser
+   fun:_dl_lookup_versioned_symbol_internal
+   fun:fixup
+   fun:_dl_runtime_resolve
+}
 
 #-------- Threading bugs?
 # glibc 'knows' that destroying a locked mutex will unlock it
 {
-   pthread_error/__pthread_mutex_destroy/__closedir
+   pthread_error/pthread_mutex_destroy/__closedir
    core:PThread
    fun:pthread_error
-   fun:__pthread_mutex_destroy
+   fun:pthread_mutex_destroy
    fun:__closedir
 }
 
 {
-   pthread_error/__pthread_mutex_destroy/_IO_default_finish
+   pthread_error/pthread_mutex_destroy/_IO_default_finish
    core:PThread
    fun:pthread_error
-   fun:__pthread_mutex_destroy
+   fun:pthread_mutex_destroy
    fun:_IO_default_finish*
 }
 
 {
-   __pthread_mutex_unlock/_IO_funlockfile
+   pthread_mutex_unlock/_IO_funlockfile
    core:PThread
-   fun:__pthread_mutex_unlock
+   fun:pthread_mutex_unlock
    fun:_IO_funlockfile
 }
 
 ##----------------------------------------------------------------------##
 ## For a leak in Valgrind's own libpthread.so :(
 {
-   my_malloc/get_or_allocate_specifics_ptr/__pthread_key_create(Leak)
+   my_malloc/get_or_allocate_specifics_ptr/pthread_key_create(Leak)
    Memcheck:Leak
    fun:my_malloc
    fun:get_or_allocate_specifics_ptr
-   fun:__pthread_key_create
+   fun:pthread_key_create
 }
 
 ##----------------------------------------------------------------------##
diff --git a/helgrind/tests/deadlock.stderr.exp b/helgrind/tests/deadlock.stderr.exp
index a60d087..050d008 100644
--- a/helgrind/tests/deadlock.stderr.exp
+++ b/helgrind/tests/deadlock.stderr.exp
@@ -1,13 +1,13 @@
 
 Thread 3:
 Mutex 0x........(m1) locked in inconsistent order
-   at 0x........: __pthread_mutex_lock (vg_libpthread.c:...)
+   at 0x........: pthread_mutex_lock (vg_libpthread.c:...)
    by 0x........: t2 (deadlock.c:20)
    by 0x........: thread_wrapper (vg_libpthread.c:...)
    by 0x........: do__quit (vg_scheduler.c:...)
  while holding locks 0x........(m2)
  0x........(m2) last locked at
-   at 0x........: __pthread_mutex_lock (vg_libpthread.c:...)
+   at 0x........: pthread_mutex_lock (vg_libpthread.c:...)
    by 0x........: t2 (deadlock.c:19)
    by 0x........: thread_wrapper (vg_libpthread.c:...)
    by 0x........: do__quit (vg_scheduler.c:...)
diff --git a/memcheck/tests/fwrite.stderr.exp b/memcheck/tests/fwrite.stderr.exp
index 4cf2593..76f9221 100644
--- a/memcheck/tests/fwrite.stderr.exp
+++ b/memcheck/tests/fwrite.stderr.exp
@@ -1,5 +1,5 @@
 Syscall param write(buf) contains uninitialised or unaddressable byte(s)
-   at 0x........: __libc_write (...libc...)
+   at 0x........: write (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
  Address 0x........ is 0 bytes inside a block of size 10 alloc'd
diff --git a/memcheck/tests/weirdioctl.stderr.exp b/memcheck/tests/weirdioctl.stderr.exp
index 42ea90a..37a24aa 100644
--- a/memcheck/tests/weirdioctl.stderr.exp
+++ b/memcheck/tests/weirdioctl.stderr.exp
@@ -1,5 +1,5 @@
 Syscall param ioctl(TCSET{A,AW,AF}) contains uninitialised or unaddressable byte(s)
-   at 0x........: __ioctl (in /...libc...)
+   at 0x........: ioctl (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
  Address 0x........ is on thread 1's stack
diff --git a/memcheck/tests/writev.stderr.exp b/memcheck/tests/writev.stderr.exp
index acbd5f3..e234732 100644
--- a/memcheck/tests/writev.stderr.exp
+++ b/memcheck/tests/writev.stderr.exp
@@ -1,19 +1,19 @@
 
 Test file created.
 Syscall param writev(vector[...]) contains uninitialised or unaddressable byte(s)
-   at 0x........: __libc_writev (...libc...)
+   at 0x........: writev (in /...libc...)
    by 0x........: main (writev.c:56)
  Address 0x........ is not stack'd, malloc'd or free'd
 Received EFAULT as expected
 
 Syscall param writev(vector) contains uninitialised or unaddressable byte(s)
-   at 0x........: __libc_writev (...libc...)
+   at 0x........: writev (in /...libc...)
    by 0x........: main (writev.c:68)
  Address 0x........ is not stack'd, malloc'd or free'd
 Received EINVAL as expected
 
 Syscall param readv(vector) contains uninitialised or unaddressable byte(s)
-   at 0x........: __libc_readv (...libc...)
+   at 0x........: readv (in /...libc...)
    by 0x........: main (writev.c:76)
  Address 0x........ is not stack'd, malloc'd or free'd
 Received EINVAL as expected