Added support for multi-skin suppressions, of the form:

  skin_name1,skin_name2:supp_name

No spaces are allowed on either side of the comma.

This is useful for sharing suppressions between Addrcheck and Memcheck.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@1205 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_errcontext.c b/coregrind/vg_errcontext.c
index af447ef..b01ca57 100644
--- a/coregrind/vg_errcontext.c
+++ b/coregrind/vg_errcontext.c
@@ -517,20 +517,36 @@
 }
 
 
+/* Look for "skin" in a string like "skin1,skin2,skin3" */
+static __inline__
+Bool skin_name_present(Char *name, Char *names)
+{
+   Bool  found;
+   Char *s = NULL;   /* Shut gcc up */
+   Int   len = VG_(strlen)(name);
+
+   found = (NULL != (s = VG_(strstr)(names, name)) &&
+            (s        == names || *(s-1)   == ',') &&
+            (*(s+len) == ','   || *(s+len) == '\0')
+           );
+
+   return found;
+}
+
+#define STREQ(s1,s2) (s1 != NULL && s2 != NULL \
+                      && VG_(strcmp)((s1),(s2))==0)
+
 /* Read suppressions from the file specified in vg_clo_suppressions
    and place them in the suppressions list.  If there's any difficulty
    doing this, just give up -- there's no point in trying to recover.  
 */
-#define STREQ(s1,s2) (s1 != NULL && s2 != NULL \
-                      && VG_(strcmp)((s1),(s2))==0)
-
 static void load_one_suppressions_file ( Char* filename )
 {
 #  define N_BUF 200
    Int   fd, i;
    Bool  eof;
    Char  buf[N_BUF+1];
-   Char* skin_name;
+   Char* skin_names;
    Char* supp_name;
 
    fd = VG_(open)( filename, VKI_O_RDONLY, 0 );
@@ -561,7 +577,7 @@
 
       if (eof) goto syntax_error;
 
-      /* Check it has the "skin_name:supp_name" form (ie. look for ':') */
+      /* Check it has the "skin1,skin2,...:supp" form (look for ':') */
       i = 0;
       while (True) {
          if (buf[i] == ':')  break;
@@ -570,20 +586,21 @@
       }
       buf[i]    = '\0';    /* Replace ':', splitting into two strings */
 
-      skin_name = & buf[0];
-      supp_name = & buf[i+1];
+      skin_names = & buf[0];
+      supp_name  = & buf[i+1];
 
-      /* Is it a core suppression?  (core:<supp_name>) */
-      if (VG_(needs).core_errors && STREQ(skin_name, "core"))
+      /* Is it a core suppression? */
+      if (VG_(needs).core_errors && skin_name_present("core", skin_names))
       {
-         if (STREQ(supp_name, "PThread")) 
+         if (STREQ(supp_name, "PThread"))
             supp->skin_supp.skind = PThreadSupp;
          else
             goto syntax_error;
       }
 
-      /* Is it a skin suppression?  (<skin_name>:<supp_name>") */
-      else if (VG_(needs).skin_errors && STREQ(skin_name, VG_(details).name))
+      /* Is it a skin suppression? */
+      else if (VG_(needs).skin_errors && 
+               skin_name_present(VG_(details).name, skin_names))
       {
          if (SK_(recognised_suppression)(supp_name, & supp->skin_supp.skind)) 
          {
@@ -631,7 +648,7 @@
                    filename );
    } else {
       VG_(message)(Vg_UserMsg, 
-                   "FATAL: in suppressions file `%s': syntax error on: %s", 
+                   "FATAL: in suppressions file: `%s': syntax error on: %s", 
                    filename, buf );
    }
    VG_(close)(fd);
@@ -718,8 +735,6 @@
 */
 static CoreSupp* is_suppressible_error ( CoreError* err )
 {
-#  define STREQ(s1,s2) (s1 != NULL && s2 != NULL \
-                        && VG_(strcmp)((s1),(s2))==0)
    Int i;
 
    Char caller_obj[VG_N_SUPP_CALLERS][M_VG_ERRTXT];
@@ -751,10 +766,10 @@
       }
    }
    return NULL;      /* no matches */
-
-#  undef STREQ
 }
 
+#undef STREQ
+
 /*--------------------------------------------------------------------*/
 /*--- end                                          vg_errcontext.c ---*/
 /*--------------------------------------------------------------------*/
diff --git a/glibc-2.1.supp b/glibc-2.1.supp
index 53a2e54..93935ca 100644
--- a/glibc-2.1.supp
+++ b/glibc-2.1.supp
@@ -28,7 +28,7 @@
 
 {
    __libc_freeres/free_mem(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:free_mem
    fun:__libc_freeres
 }
@@ -45,7 +45,7 @@
 
 {
    socketcall.connect(serv_addr)/__libc_connect/*(Param)
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    socketcall.connect(serv_addr)
    fun:__libc_connect
    fun:*
@@ -53,7 +53,7 @@
 
 {
    strrchr/_dl_map_object_from_fd/_dl_map_object(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:strrchr
    fun:_dl_map_object_from_fd
    fun:_dl_map_object
@@ -69,7 +69,7 @@
 
 {
    llseek(result)/__libc_lseek64/_IO_file_seek(Param)
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    llseek(result)
    fun:__libc_lseek64
    fun:_IO_file_seek
@@ -77,7 +77,7 @@
 
 {
    __rawmemchr/_nl_*/*locale(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:__rawmemchr
    fun:_nl_*
    fun:*locale
@@ -165,7 +165,7 @@
 
 {
    socketcall.connect(serv_addr)/__libc_connect/*(Param)
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    socketcall.connect(serv_addr)
    obj:*libc-2.1.3.so
    obj:*libX11.so*
diff --git a/glibc-2.2.supp b/glibc-2.2.supp
index b82aee7..a18cfbc 100644
--- a/glibc-2.2.supp
+++ b/glibc-2.2.supp
@@ -47,13 +47,13 @@
 }
 {
    trecurse/__gconv_release_shlib(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:trecurse
    fun:__gconv_release_shlib
 }
 {
    do_release_shlib/trecurse(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:do_release_shlib
    fun:trecurse
 }
@@ -91,20 +91,20 @@
 
 {
    __twalk/*(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:__twalk
 }
 
 {
    do_release_shlib/__twalk(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:do_release_shlib
    fun:__twalk
 }
 
 {
    __libc_freeres/free_mem/free(Free)
-   Memcheck:Free
+   Addrcheck,Memcheck:Free
    fun:free
    fun:free_mem
    fun:__libc_freeres
@@ -237,13 +237,13 @@
 # two:
 {
    __mpn_construct_double/*(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:__mpn_construct_double
    fun:*
 }
 {
    __mpn_construct_double/*(Addr8)
-   Memcheck:Addr8
+   Addrcheck,Memcheck:Addr8
    fun:__mpn_construct_double
    fun:*
 }
@@ -251,13 +251,13 @@
 # More of the same (gcc bug, I'm pretty sure)
 {
    __fabs/*(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:__fabs
    fun:*
 }
 {
    __fabs/*(Addr8)
-   Memcheck:Addr8
+   Addrcheck,Memcheck:Addr8
    fun:__fabs
    fun:*
 }
@@ -266,7 +266,7 @@
 # Not sure what this is about ... but anyway
 {
    pthread_sighandler/*(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:pthread_sighandler
    fun:*
 }
@@ -309,14 +309,14 @@
 #-------------------
 {
    socketcall.connect(serv_addr)/__libc_connect/*
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    socketcall.connect(serv_addr)
    fun:__libc_connect
    fun:*
 }
 {
    socketcall.connect(serv_addr)/libc-2.2.4.so/libc-2.2.4.so
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    socketcall.connect(serv_addr)
    obj:*libc-2.2.?.so
    obj:*libc-2.2.?.so
@@ -325,7 +325,7 @@
 #----------------------
 {
    write(buf)/__libc_write/libX11.so.6.2/libX11.so.6.2(Param)
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    write(buf)
    fun:__libc_write
    obj:/usr/X11R6/lib/libX11.so.6.2
@@ -333,7 +333,7 @@
 }
 {
    write(buf)/libc-2.2.4.so/libX11.so.6.2/libX11.so.6.2(Param)
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    write(buf)
    obj:*libc-2.2.?.so
    obj:/usr/X11R6/lib/libX11.so.6.2
@@ -350,7 +350,7 @@
 
 {
    writev(vector[...])/__writev/libX11.so.6.2/libX11.so.6.2
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    writev(vector[...])
    fun:__writev
    obj:/usr/X11R6/lib/libX11.so.6.2
diff --git a/linux22.supp b/linux22.supp
index 9260b94..3210817 100644
--- a/linux22.supp
+++ b/linux22.supp
@@ -29,7 +29,7 @@
 
 {
    socketcall.connect(serv_addr)/__libc_connect/*(Param)
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    socketcall.connect(serv_addr)
    fun:__libc_connect
    fun:*
@@ -37,7 +37,7 @@
 
 {
    strrchr/_dl_map_object_from_fd/_dl_map_object(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:strrchr
    fun:_dl_map_object_from_fd
    fun:_dl_map_object
@@ -53,7 +53,7 @@
 
 {
    llseek(result)/__libc_lseek64/_IO_file_seek(Param)
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    llseek(result)
    fun:__libc_lseek64
    fun:_IO_file_seek
@@ -61,7 +61,7 @@
 
 {
    __rawmemchr/_nl_*/*locale(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:__rawmemchr
    fun:_nl_*
    fun:*locale
@@ -149,7 +149,7 @@
 
 {
    socketcall.connect(serv_addr)/__libc_connect/*(Param)
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    socketcall.connect(serv_addr)
    obj:*libc-2.1.3.so
    obj:*libX11.so*
@@ -178,7 +178,7 @@
 
 {
    X11-Addr4-1
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libX11.so.6.1
    obj:/usr/X11R6/lib/libX11.so.6.1
    obj:/usr/X11R6/lib/libX11.so.6.1
@@ -186,7 +186,7 @@
 
 {
    X11-Addr4-2
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libX11.so.6.1
    obj:/usr/X11R6/lib/libX11.so.6.1
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -194,7 +194,7 @@
 
 {
    X11-Addr4-3
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -202,7 +202,7 @@
 
 {
    X11-Addr4-4
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libX11.so.6.1
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -210,7 +210,7 @@
 
 {
    X11-Addr4-5
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:__rawmemchr
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -218,7 +218,7 @@
 
 {
    X11-Addr4-6
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXmu.so.6.0
    obj:/usr/X11R6/lib/libXmu.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -226,7 +226,7 @@
 
 {
    X11-Addr4-7
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXawXpm_posing_as_Xaw.so.6.1
@@ -234,7 +234,7 @@
 
 {
    X11-Param-1
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    write(buf)
    fun:__libc_write
    obj:/usr/X11R6/lib/libX11.so.6.1
@@ -243,7 +243,7 @@
 
 {
    X11-Addr4-8
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libX11.so.6.1
    obj:/usr/X11R6/lib/libXpm.so.4.11
    obj:/usr/X11R6/lib/libXpm.so.4.11
@@ -251,7 +251,7 @@
 
 {
    X11-Addr4-8
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXawXpm_posing_as_Xaw.so.6.1
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -259,7 +259,7 @@
 
 {
    X11-Addr4-9
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXaw.so.6.1
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -267,7 +267,7 @@
 
 {
    X11-Addr4-10
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXaw.so.6.1
    obj:/usr/X11R6/lib/libXaw.so.6.1
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -275,7 +275,7 @@
 
 {
    X11-Addr4-11
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXaw.so.6.1
diff --git a/linux24.supp b/linux24.supp
index 0af3294..37e5648 100644
--- a/linux24.supp
+++ b/linux24.supp
@@ -107,13 +107,13 @@
 # two:
 {
    __mpn_construct_double/*(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:__mpn_construct_double
    fun:*
 }
 {
    __mpn_construct_double/*(Addr8)
-   Memcheck:Addr8
+   Addrcheck,Memcheck:Addr8
    fun:__mpn_construct_double
    fun:*
 }
@@ -121,13 +121,13 @@
 # More of the same (gcc bug, I'm pretty sure)
 {
    __fabs/*(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:__fabs
    fun:*
 }
 {
    __fabs/*(Addr8)
-   Memcheck:Addr8
+   Addrcheck,Memcheck:Addr8
    fun:__fabs
    fun:*
 }
@@ -136,7 +136,7 @@
 # Not sure what this is about ... but anyway
 {
    pthread_sighandler/*(Addr4)
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:pthread_sighandler
    fun:*
 }
@@ -179,14 +179,14 @@
 #-------------------
 {
    socketcall.connect(serv_addr)/__libc_connect/*
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    socketcall.connect(serv_addr)
    fun:__libc_connect
    fun:*
 }
 {
    socketcall.connect(serv_addr)/libc-2.2.4.so/libc-2.2.4.so
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    socketcall.connect(serv_addr)
    obj:*libc-2.2.4.so
    obj:*libc-2.2.4.so
@@ -252,7 +252,7 @@
 #----------------------
 {
    write(buf)/__libc_write/libX11.so.6.2/libX11.so.6.2(Param)
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    write(buf)
    fun:__libc_write
    obj:/usr/X11R6/lib/libX11.so.6.2
@@ -260,7 +260,7 @@
 }
 {
    write(buf)/libc-2.2.4.so/libX11.so.6.2/libX11.so.6.2(Param)
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    write(buf)
    obj:*libc-2.2.4.so
    obj:/usr/X11R6/lib/libX11.so.6.2
@@ -269,7 +269,7 @@
 
 #{
 #   llseek(result)/__libc_lseek64/_IO_file_seek(Param)
-#   Memcheck:Param
+#   Addrcheck,Memcheck:Param
 #   llseek(result)
 #   fun:__libc_lseek64
 #   fun:_IO_file_seek
@@ -277,7 +277,7 @@
 
 {
    writev(vector[...])/__writev/libX11.so.6.2/libX11.so.6.2
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    writev(vector[...])
    fun:__writev
    obj:/usr/X11R6/lib/libX11.so.6.2
diff --git a/memcheck/tests/supp.supp b/memcheck/tests/supp.supp
index 916b353..c9befdc 100644
--- a/memcheck/tests/supp.supp
+++ b/memcheck/tests/supp.supp
@@ -1,6 +1,6 @@
 {
   name_of_this_suppression
-  memcheck:Cond
+  Addrcheck,Memcheck:Cond
   obj:*supp1
   fun:__libc_start_main
 }
diff --git a/xfree-3.supp b/xfree-3.supp
index ae7e3b9..b735b73 100644
--- a/xfree-3.supp
+++ b/xfree-3.supp
@@ -46,7 +46,7 @@
 
 {
    X11-Addr4-1
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libX11.so.6.1
    obj:/usr/X11R6/lib/libX11.so.6.1
    obj:/usr/X11R6/lib/libX11.so.6.1
@@ -54,7 +54,7 @@
 
 {
    X11-Addr4-2
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libX11.so.6.1
    obj:/usr/X11R6/lib/libX11.so.6.1
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -62,7 +62,7 @@
 
 {
    X11-Addr4-3
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -70,7 +70,7 @@
 
 {
    X11-Addr4-4
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libX11.so.6.1
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -78,7 +78,7 @@
 
 {
    X11-Addr4-5
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    fun:__rawmemchr
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -86,7 +86,7 @@
 
 {
    X11-Addr4-6
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXmu.so.6.0
    obj:/usr/X11R6/lib/libXmu.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -94,7 +94,7 @@
 
 {
    X11-Addr4-7
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXawXpm_posing_as_Xaw.so.6.1
@@ -102,7 +102,7 @@
 
 {
    X11-Param-1
-   Memcheck:Param
+   Addrcheck,Memcheck:Param
    write(buf)
    fun:__libc_write
    obj:/usr/X11R6/lib/libX11.so.6.1
@@ -111,7 +111,7 @@
 
 {
    X11-Addr4-8
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libX11.so.6.1
    obj:/usr/X11R6/lib/libXpm.so.4.11
    obj:/usr/X11R6/lib/libXpm.so.4.11
@@ -119,7 +119,7 @@
 
 {
    X11-Addr4-8
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXawXpm_posing_as_Xaw.so.6.1
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -127,7 +127,7 @@
 
 {
    X11-Addr4-9
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXaw.so.6.1
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -135,7 +135,7 @@
 
 {
    X11-Addr4-10
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXaw.so.6.1
    obj:/usr/X11R6/lib/libXaw.so.6.1
    obj:/usr/X11R6/lib/libXt.so.6.0
@@ -143,7 +143,7 @@
 
 {
    X11-Addr4-11
-   Memcheck:Addr4
+   Addrcheck,Memcheck:Addr4
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXt.so.6.0
    obj:/usr/X11R6/lib/libXaw.so.6.1