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

# Errors to suppress by default with XFree86 4.1.0)

# 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

# Resulting from R H 8.0
{
   *libc_write/libX11.so.6.2/*X11TransWrite(Param)
   Memcheck:Param
   write(buf)
   fun:*libc_write
   obj:/usr/X11R6/lib*/libX11.so.6.2
   fun:*X11TransWrite
}

{
   libX11.so.6.2/libX11.so.6.2/libX11.so.6.2(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libX11.so.6.2
   obj:/usr/X11R6/lib*/libX11.so.6.2
   obj:/usr/X11R6/lib*/libX11.so.6.2
}

{
   libXt.so.6.2/libXt.so.6.2/libXt.so.6.2(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libXt.so.6.0
   obj:/usr/X11R6/lib*/libXt.so.6.0
   obj:/usr/X11R6/lib*/libXt.so.6.0
}


{
   libXaw.so.7.0/libXaw.so.7.0/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXaw.so.7.0
}

{
   libXmu.so.6.2/libXmu.so.6.2/libXmu.so.6.2(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libXmu.so.6.2
   obj:/usr/X11R6/lib*/libXmu.so.6.2
   obj:/usr/X11R6/lib*/libXmu.so.6.2
}

{
   libXt.so.6.0/libXt.so.6.0/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libXt.so.6.0
   obj:/usr/X11R6/lib*/libXt.so.6.0
   obj:/usr/X11R6/lib*/libXaw.so.7.0
}

{
   libXaw.so.7.0/libXaw.so.7.0/libXt.so.6.0(Value4)
   Memcheck:Value4
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXt.so.6.0
}

{
   libXaw.so.7.0/libXaw.so.7.0/libXt.so.6.0(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXt.so.6.0
}

{
   libX11.so.6.2/libX11.so.6.2/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libX11.so.6.2
   obj:/usr/X11R6/lib*/libX11.so.6.2
   obj:/usr/X11R6/lib*/libXaw.so.7.0
}

{
   libX11.so.6.2/libX11.so.6.2/libXaw.so.7.0(Addr4)
   Memcheck:Addr4
   obj:/usr/X11R6/lib*/libX11.so.6.2
   obj:/usr/X11R6/lib*/libX11.so.6.2
   obj:/usr/X11R6/lib*/libXaw.so.7.0
}

{
   libX11.so.6.2/libXaw.so.7.0/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libX11.so.6.2
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXaw.so.7.0
}

{
   libXpm.so.4.11/libXpm.so.4.11/libXpm.so.4.11
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libXpm.so.4.11
   obj:/usr/X11R6/lib*/libXpm.so.4.11
   obj:/usr/X11R6/lib*/libXpm.so.4.11
}

{
   struct with uninitialized paddings
   Memcheck:Param
   writev(vector[...])
   fun:*_writev
   fun:_X11TransSocketWritev
   fun:_X11TransWritev
   fun:*
}

{
   struct with uninitialized paddings - libxcb
   Memcheck:Param
   writev(vector[...])
   obj:/lib*/*.so
   obj:/usr/lib*/libxcb.so.1.0.0
   obj:/usr/lib*/libxcb.so.1.0.0
   fun:xcb_send_request
   fun:_X*
}

{
   struct with uninitialized paddings - libxcb
   Memcheck:Param
   writev(vector[...])
   obj:/lib*/*.so
   obj:/usr/lib*/libxcb.so.1.0.0
   obj:/usr/lib*/libxcb.so.1.0.0
   obj:/usr/lib*/libxcb.so.1.0.0
   fun:xcb_*
   fun:_X*
}

{
   another struct with uninitialized paddings
   Memcheck:Param
   write(buf)
   obj:*
   fun:_IceTransSocketWrite
   fun:_IceTransWrite
   fun:_IceWrite
}

{
   Xorg 6.8.1 uninit _write* padding
   Memcheck:Param
   write(buf)
   fun:*
   fun:_X11TransWrite
   obj:/usr/X11R6/lib*/libX11.so.6.2
}

{
   Xorg 6.8.1 uninit write padding
   Memcheck:Param
   write(buf)
   fun:write
   fun:_X11TransWrite
   obj:/usr/X11R6/lib*/libX11.so.6.2
}

{
   Xorg 6.8.1 ICE uninit __write* padding
   Memcheck:Param
   write(buf)
   obj:*
   fun:_IceTransWrite
   fun:_IceWrite
   fun:IceFlush
}

{
   Xorg 6.8.1 writev uninit padding
   Memcheck:Param
   writev(vector[...])
   fun:writev
   obj:/usr/X11R6/lib*/libX11.so.6.2
   fun:_X11TransWritev
   fun:_XSend
}

{
   Xorg 6.9.0 writev uninit padding
   Memcheck:Param
   writev(vector[...])
   fun:do_writev
   fun:writev
   obj:/usr/X11R6/lib*/libX11.so.6.2
   fun:_X11TransWritev
   fun:_XSend
}

{
   X on SUSE11 writev uninit padding
   Memcheck:Param
   writev(vector[...])
   fun:writev
   obj:/usr/lib*/libxcb.so*
   obj:/usr/lib*/libxcb.so*
}
{
   X on SUSE11 writev uninit padding 2
   Memcheck:Param
   writev(vector[...])
   obj:/lib*/ld-2.*.so*
   obj:/usr/lib*/libxcb.so*
   obj:/usr/lib*/libxcb.so*
}
{
   X on SUSE11 writev uninit padding 3
   Memcheck:Param
   writev(vector[...])
   obj:/lib*/ld-2.*.so*
   obj:/usr/lib*/libORBit*.so*
   obj:/usr/lib*/libORBit*.so*
}
{
   X on SUSE11 writev uninit padding 4
   Memcheck:Param
   writev(vector[...])
   obj:/lib*/libc-2.*.so*
   obj:/usr/lib*/libORBit*.so*
   obj:/usr/lib*/libORBit*.so*
}
 

# There's something strange about a % 127 in XftFontOpenInfo
# (hashing) which gcc turns into a multiply by 33818641 and
# some other guff instead.  I don't understand it enough to
# know if libXft is broken or if memcheck's value tracking is
# inadequate here.  Anyway, for the moment, suppress it.
#
# Use of uninitialised value of size 8
#   at 0x71A59F8: XftFontOpenInfo (in /usr/X11R6/lib64/libXft.so.2.1.2)
#   by 0x71A5F0D: XftFontOpenPattern (in /usr/X11R6/lib64/libXft.so.2.1.2)
#   by 0x65F166E: loadFontConfigFont(QFontPrivate const*, QFontDef const&, 
#                 QFont::Script) (qfontdatabase_x11.cpp:1942)
#   by 0x65F5DE4: QFontDatabase::findFont(QFont::Script, QFontPrivate const*,
#                 QFontDef const&, int) (qfontdatabase.cpp:996)
{
   XftFontOpenInfo-umod-127-strangeness
   Memcheck:Value8
   obj:/usr/X11*/lib*/libXft.so*
   obj:/usr/X11*/lib*/libXft.so*
}
{
   XftFontOpenInfo-umod-127-strangeness-a-la-xorg
   Memcheck:Value8
   obj:/usr/lib*/libXft.so*
   obj:/usr/lib*/libXft.so*
}

{
   More X padding stuff
   Memcheck:Param
   writev(vector[...])
   fun:*writev*
   obj:/usr/X11*/lib*/libX11.so*
   obj:/usr/X11*/lib*/libX11.so*
}


##----------------------------------------------------------------------##
# Completely inappropriate place, but ...

{
   ifort-9.X-on-i686-1
   Memcheck:Addr4
   fun:unaligned_bigint
   fun:hash
   fun:for__add_to_lf_table
}
{
   ifort-9.X-on-amd64-1
   Memcheck:Addr8
   fun:unaligned_bigint
   fun:hash
   fun:for__add_to_lf_table
}

# zlib-1.2.x uses uninitialised memory in some tricky way which
# apparently is harmless (it must amount to a vectorised while-loop,
# nothing else makes sense).  Fools Memcheck though.  See the mentioned
# URL for details.
{
   zlib-1.2.x trickyness: See http://www.zlib.net/zlib_faq.html#faq36
   Memcheck:Cond
   obj:/lib64/libz.so.1.2.*
   obj:/lib64/libz.so.1.2.*
   fun:deflate
}


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

## More general versions of some of the old X suppressions above
{
   Ubuntu804 libXaw.so.7.0/libXaw.so.7.0/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/*lib*/libXaw*so*
   obj:/usr/*lib*/libXaw*so*
   obj:/usr/*lib*/libXaw*so*
}
{
   Ubuntu804 libXaw.so.7.0/libXaw.so.7.0/libXt(Cond)
   Memcheck:Cond
   obj:/usr/*lib*/libXaw*so*
   obj:/usr/*lib*/libXaw*so*
   obj:/usr/*lib*/libXt*so*
}

{
   Ubuntu804-hack-1
   Memcheck:Overlap
   fun:mempcpy
   fun:_IO_default_xsputn
   obj:/lib*/libc-2.*so*
}
