
##----------------------------------------------------------------------##

# Errors to suppress by default with glibc 2.6.x

# Format of this file is:
# {
#     name_of_suppression
#     tool_name:supp_kind
#     (optional extra info for some suppression types)
#     caller0 name, or /name/of/so/file.so
#     caller1 name, or ditto
#     (optionally: caller2 name)
#     (optionally: caller3 name)
#  }
#
# For Memcheck, the supp_kinds are:
#
#     Param Value1 Value2 Value4 Value8 Value16 Jump
#     Free Addr1 Addr2 Addr4 Addr8 Addr16
#     Cond (previously known as Value0)
#
# and the optional extra info is:
#     if Param: name of system call param

{
   dl-hack1
   Memcheck:Cond
   fun:_dl_start
   fun:_start
}

{
   dl-hack2
   Memcheck:Cond
   obj:/lib*/ld-2.6*.so
   obj:/lib*/ld-2.6*.so
   obj:/lib*/ld-2.6*.so
   obj:/lib*/ld-2.6*.so
}

{
   dl-hack3-1
   Memcheck:Cond
   obj:/lib*/ld-2.6*.so*
   obj:/lib*/ld-2.6*.so*
   obj:/lib*/ld-2.6*.so*
}
{
   dl-hack3-2
   Memcheck:Cond
   obj:/lib*/ld-2.6*.so*
   obj:/lib*/ld-2.6*.so*
   obj:/lib*/libc-2.6*.so*
}

{
   dl-hack4-64bit-1
   Memcheck:Addr8
   obj:/lib64/ld-2.6*.so*
   obj:/lib64/ld-2.6*.so*
   obj:/lib64/ld-2.6*.so*
}
{
   dl-hack4-64bit-2
   Memcheck:Addr8
   obj:/lib64/ld-2.6*.so*
   obj:/lib64/ld-2.6*.so*
   obj:/lib64/libc-2.6*.so*
}
{
   dl-hack4-64bit-3
   Memcheck:Addr8
   obj:/lib64/ld-2.6*.so*
   obj:/lib64/ld-2.6*.so*
   obj:/lib64/libdl-2.6*.so*
}



##----------------------------------------------------------------------##
{
   glibc-2.5.x-on-SUSE-10.2-(PPC)-1
   Memcheck:Cond
   fun:_dl_start_final
   fun:_dl_start
   fun:_start
}
{
   glibc-2.5.x-on-SUSE-10.2-(PPC)-2a
   Memcheck:Cond
   fun:index
   obj:*ld-2.6.*.so
}
{
   glibc-2.5.x-on-SuSE-10.2-(PPC)-2b
   Memcheck:Addr4
   fun:index
   fun:expand_dynamic_string_token
}
{
   glibc-2.5.5-on-SuSE-10.2-(PPC)-2c
   Memcheck:Addr4
   fun:index
   obj:*ld-2.6.*.so
}
{
   glibc-2.3.5-on-SuSE-10.1-(PPC)-3
   Memcheck:Addr4
   fun:*wordcopy_fwd_dest_aligned*
   fun:mem*cpy
   obj:*lib*2.6.*.so
}

{
   glibc-2.6-on-SUSE-10.3-(x86)
   Memcheck:Addr4
   obj:/lib/ld-2.6*.so
   obj:/lib/ld-2.6*.so
   obj:/lib/ld-2.6*.so
}

##----------------------------------------------------------------------##
## Various structure padding things on SUSE 10.2
##
{
   X11-64bit-padding-1a
   Memcheck:Param
   write(buf)
   fun:__write_nocancel
   obj:/usr/lib*/libX11.so*
   obj:/usr/lib*/libX11.so*
   fun:X*
}
{
   X11-64bit-padding-1b
   Memcheck:Param
   write(buf)
   fun:__write_nocancel
   obj:/usr/lib*/libX11.so*
   obj:/usr/lib*/libX11.so*
   fun:_X*
}
{
   X11-64bit-padding-1c
   Memcheck:Param
   write(buf)
   fun:__write_nocancel
   obj:/usr/lib*/libX11.so*
   obj:/usr/lib*/libX11.so*
   obj:/usr/lib*/libX11.so*
}
{
   X11-64bit-padding-1d
   Memcheck:Param
   write(buf)
   fun:__write_nocancel
   obj:/usr/lib*/libICE.so*
   obj:/usr/lib*/libICE.so*
   obj:/usr/lib*/libICE.so*
}
{
   X11-64bit-padding-2a
   Memcheck:Param
   writev(vector[...])
   fun:do_writev
   obj:/usr/lib*/libX11.so*
   obj:/usr/lib*/libX11.so*
   obj:/usr/lib*/libX11.so*
}
{
   X11-64bit-padding-2b
   Memcheck:Param
   writev(vector[...])
   fun:do_writev
   fun:writev
   obj:/usr/lib*/libX11.so*
   obj:/usr/lib*/libX11.so*
}

{
   glibc24-64bit-padding-1a
   Memcheck:Param
   socketcall.sendto(msg)
   fun:send
   fun:get_mapping
   fun:__nscd_get_map_ref
   fun:nscd*
}
{
   glibc24-64bit-padding-1b
   Memcheck:Param
   socketcall.sendto(msg)
   fun:__sendto_nocancel
   obj:/*libc-2.6.so
   obj:/*libc-2.6.so
   obj:/*libc-2.6.so
}
{
   glibc24-64bit-padding-1c
   Memcheck:Param
   socketcall.send(msg)
   fun:send
   fun:__nscd_get_map_ref
   fun:nscd_get*_r
   fun:*nscd*
   obj:/*libc-2.6.so
}


{
   X11-64bit-padding-3a
   Memcheck:Param
   write(buf)
   obj:/*libpthread-2.4.so*
   obj:/usr/lib*/libX11.so*
   obj:/usr/lib*/libX11.so*
   obj:/usr/lib*/libX11.so*
}

{
   X11-64bit-padding-4a
   Memcheck:Param
   socketcall.sendto(msg)
   fun:send
   obj:/*libc-2.6.so
   obj:/*libc-2.6.so
   obj:/*libc-2.6.so
}
{
   X11-64bit-padding-4b
   Memcheck:Param
   socketcall.send(msg)
   fun:send
   obj:/*libc-2.6.so
   obj:/*libc-2.6.so
   obj:/*libc-2.6.so
}

##----------------------------------------------------------------------##
# MontaVista Linux 4.0.1 on ppc32
{
    MVL-401-linuxthreads-pthread_create
    Memcheck:Param
    write(buf)
    fun:pthread_create
}
{
   MVL-401-linuxthreads-pthread_create
   Memcheck:Param
   write(buf)
   obj:/lib/libpthread-0.10.so
   fun:pthread_create
}

##----------------------------------------------------------------------##
# ppc32 running openSUSE 10.3
{
   X11-libXaw8-libXaw8-libXaw8
   Memcheck:Cond
   obj:/usr/lib*/libXaw8.so*
   obj:/usr/lib*/libXaw8.so*
   obj:/usr/lib*/libXaw8.so*
}
