re PR libmudflap/49550 (Many libmudflap tests fail on Solaris 11/x86)
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Thu, 7 Jul 2011 10:14:02 +0000 (10:14 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Thu, 7 Jul 2011 10:14:02 +0000 (10:14 +0000)
gcc:
PR libmudflap/49550
* gcc.c (MFWRAP_SPEC): Also wrap mmap64.

libmudflap:
PR libmudflap/49550
* mf-runtime.c (__wrap_main) [__sun__ && __svr4__]: Don't register
stdin, stdout, stderr.
Register __ctype, __ctype_mask.

* configure.ac: Check for mmap64.
Check for rawmemchr, stpcpy, mempcpy.
* configure: Regenerate.
* config.h.in: Regenerate.
* mf-hooks1.c [HAVE_MMAP64] (__mf_0fn_mmap64): New function.
(mmap64): New wrapper function.
* mf-impl.h (__mf_dynamic_index) [HAVE_MMAP64]: Add dyn_mmap64.
* mf-runtime.c (__mf_dynamic) [HAVE_MMAP64]: Handle mmap64.

* mf-hooks2.c [HAVE_GETMNTENT && HAVE_SYS_MNTTAB_H]: Implement
getmntent wrapper.

* mf-hooks3.c (_REENTRANT): Define.

* testsuite/libmudflap.c/heap-scalestress.c (SCALE): Reduce to 10000.

* testsuite/libmudflap.c/pass-stratcliff.c: Include ../config.h.
(MIN): Define.
Use HAVE_RAWMEMCHR, HAVE_STPCPY, HAVE_MEMPCPY as guards.

* testsuite/libmudflap.c/pass47-frag.c: Expect __ctype warning on
*-*-solaris2.*.

From-SVN: r175961

14 files changed:
gcc/ChangeLog
gcc/gcc.c
libmudflap/ChangeLog
libmudflap/config.h.in
libmudflap/configure
libmudflap/configure.ac
libmudflap/mf-hooks1.c
libmudflap/mf-hooks2.c
libmudflap/mf-hooks3.c
libmudflap/mf-impl.h
libmudflap/mf-runtime.c
libmudflap/testsuite/libmudflap.c/heap-scalestress.c
libmudflap/testsuite/libmudflap.c/pass-stratcliff.c
libmudflap/testsuite/libmudflap.c/pass47-frag.c

index b44a29fe614cd487cc7e93883e3884446d895145..22e3269a3c552c832d9f4651b9f06e4599c910ab 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-07  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       PR libmudflap/49550
+       * gcc.c (MFWRAP_SPEC): Also wrap mmap64.
+
 2011-07-07  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR target/39150
index 2996de40d23ce3aa337f652aab3bcdd028892760..235c54c134704d28c7bbbaeccb7067fa8caea23b 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -518,7 +518,7 @@ proper position among the other output files.  */
 /* XXX: should exactly match hooks provided by libmudflap.a */
 #define MFWRAP_SPEC " %{static: %{fmudflap|fmudflapth: \
  --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc\
- --wrap=mmap --wrap=munmap --wrap=alloca\
+ --wrap=mmap --wrap=mmap64 --wrap=munmap --wrap=alloca\
 } %{fmudflapth: --wrap=pthread_create\
 }} %{fmudflap|fmudflapth: --wrap=main}"
 #endif
index 177c01865d3817a91a4e88ca7d49936b08271169..d755ddb349acee58ccec535534aa8c2afe9975b7 100644 (file)
@@ -1,3 +1,33 @@
+2011-07-07  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       PR libmudflap/49550
+       * mf-runtime.c (__wrap_main) [__sun__ && __svr4__]: Don't register
+       stdin, stdout, stderr.
+       Register __ctype, __ctype_mask.
+
+       * configure.ac: Check for mmap64.
+       Check for rawmemchr, stpcpy, mempcpy.
+       * configure: Regenerate.
+       * config.h.in: Regenerate.
+       * mf-hooks1.c [HAVE_MMAP64] (__mf_0fn_mmap64): New function.
+       (mmap64): New wrapper function.
+       * mf-impl.h (__mf_dynamic_index) [HAVE_MMAP64]: Add dyn_mmap64.
+       * mf-runtime.c (__mf_dynamic) [HAVE_MMAP64]: Handle mmap64.
+
+       * mf-hooks2.c [HAVE_GETMNTENT && HAVE_SYS_MNTTAB_H]: Implement
+       getmntent wrapper.
+
+       * mf-hooks3.c (_REENTRANT): Define.
+
+       * testsuite/libmudflap.c/heap-scalestress.c (SCALE): Reduce to 10000.
+
+       * testsuite/libmudflap.c/pass-stratcliff.c: Include ../config.h.
+       (MIN): Define.
+       Use HAVE_RAWMEMCHR, HAVE_STPCPY, HAVE_MEMPCPY as guards.
+
+       * testsuite/libmudflap.c/pass47-frag.c: Expect __ctype warning on
+       *-*-solaris2.*.
+
 2011-07-01  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR libmudflap/49549
index 16afd05efcdcc008654bc4a6af1c6db446c4a4a3..9e4e1910dfee034978daeccc8df8619507ddb468 100644 (file)
 /* Define to 1 if you have the `dl' library (-ldl). */
 #undef HAVE_LIBDL
 
+/* Define to 1 if you have the `socket' library (-lsocket). */
+#undef HAVE_LIBSOCKET
+
 /* Define to 1 if you have the `memmem' function. */
 #undef HAVE_MEMMEM
 
 /* Define to 1 if you have the <memory.h> header file. */
 #undef HAVE_MEMORY_H
 
+/* Define to 1 if you have the `mempcpy' function. */
+#undef HAVE_MEMPCPY
+
 /* Define to 1 if you have the `memrchr' function. */
 #undef HAVE_MEMRCHR
 
 /* Define to 1 if you have the `mmap' function. */
 #undef HAVE_MMAP
 
+/* Define to 1 if you have the `mmap64' function. */
+#undef HAVE_MMAP64
+
 /* Define to 1 if you have the <mntent.h> header file. */
 #undef HAVE_MNTENT_H
 
 /* Define to 1 if you have the <pwd.h> header file. */
 #undef HAVE_PWD_H
 
+/* Define to 1 if you have the `rawmemchr' function. */
+#undef HAVE_RAWMEMCHR
+
 /* Define to 1 if you have the `setbuf' function. */
 #undef HAVE_SETBUF
 
 /* Define to 1 if you have the <stdlib.h> header file. */
 #undef HAVE_STDLIB_H
 
+/* Define to 1 if you have the `stpcpy' function. */
+#undef HAVE_STPCPY
+
 /* Define to 1 if you have the <strings.h> header file. */
 #undef HAVE_STRINGS_H
 
index ebf8f2d9ce4cc11384e07eb1b3a745704c828339..d2b9418793280e07fe210ed8f52a475a02659f43 100755 (executable)
@@ -4455,6 +4455,17 @@ _ACEOF
 fi
 done
 
+for ac_func in mmap64
+do :
+  ac_fn_c_check_func "$LINENO" "mmap64" "ac_cv_func_mmap64"
+if test "x$ac_cv_func_mmap64" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_MMAP64 1
+_ACEOF
+
+fi
+done
+
 for ac_func in __libc_freeres
 do :
   ac_fn_c_check_func "$LINENO" "__libc_freeres" "ac_cv_func___libc_freeres"
@@ -4466,6 +4477,19 @@ _ACEOF
 fi
 done
 
+for ac_func in rawmemchr stpcpy mempcpy
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+eval as_val=\$$as_ac_var
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
 
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
@@ -10583,7 +10607,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10586 "configure"
+#line 10610 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10689,7 +10713,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10692 "configure"
+#line 10716 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
index b61b56f2708eb2405ec304c1afd0fba2ee471742..f8b99955743a047ed18fd9dbed6d9aa4dcf124de 100644 (file)
@@ -75,7 +75,9 @@ AC_CHECK_FUNCS(getservent getservbyname getservbyport getaddrinfo gai_strerror)
 AC_CHECK_FUNCS(getprotoent getprotobyname getprotobynumber)
 AC_CHECK_FUNCS(getmntent setmntent addmntent)
 AC_CHECK_FUNCS(inet_ntoa mmap munmap)
+AC_CHECK_FUNCS(mmap64)
 AC_CHECK_FUNCS(__libc_freeres)
+AC_CHECK_FUNCS(rawmemchr stpcpy mempcpy)
 
 AC_TRY_COMPILE([#include <sys/types.h>
 #include <sys/ipc.h>
index 1e46a650947f759c7e16ebec64c587c750afae65..3dd332e12c6b8ced877e7063eccb84f82e6b9699 100644 (file)
@@ -1,5 +1,5 @@
 /* Mudflap: narrow-pointer bounds-checking by tree rewriting.
-   Copyright (C) 2002, 2003, 2004, 2009 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2009, 2011 Free Software Foundation, Inc.
    Contributed by Frank Ch. Eigler <fche@redhat.com>
    and Graydon Hoare <graydon@redhat.com>
 
@@ -414,6 +414,61 @@ WRAPPER(int , munmap, void *start, size_t length)
 #endif /* HAVE_MMAP */
 
 
+#ifdef HAVE_MMAP64
+#if PIC
+/* A special bootstrap variant. */
+void *
+__mf_0fn_mmap64 (void *start, size_t l, int prot, int f, int fd, off64_t off)
+{
+  return (void *) -1;
+}
+#endif
+
+
+#undef mmap
+WRAPPER(void *, mmap64,
+       void  *start,  size_t length, int prot,
+       int flags, int fd, off64_t offset)
+{
+  DECLARE(void *, mmap64, void *, size_t, int,
+                           int, int, off64_t);
+  void *result;
+  BEGIN_PROTECT (mmap64, start, length, prot, flags, fd, offset);
+
+  result = CALL_REAL (mmap64, start, length, prot,
+                       flags, fd, offset);
+
+  /*
+  VERBOSE_TRACE ("mmap64 (%08lx, %08lx, ...) => %08lx\n",
+                (uintptr_t) start, (uintptr_t) length,
+                (uintptr_t) result);
+  */
+
+  if (result != (void *)-1)
+    {
+      /* Register each page as a heap object.  Why not register it all
+        as a single segment?  That's so that a later munmap() call
+        can unmap individual pages.  XXX: would __MF_TYPE_GUESS make
+        this more automatic?  */
+      size_t ps = getpagesize ();
+      uintptr_t base = (uintptr_t) result;
+      uintptr_t offset;
+
+      for (offset=0; offset<length; offset+=ps)
+       {
+         /* XXX: We could map PROT_NONE to __MF_TYPE_NOACCESS. */
+         /* XXX: Unaccessed HEAP pages are reported as leaks.  Is this
+            appropriate for unaccessed mmap pages? */
+         __mf_register ((void *) CLAMPADD (base, offset), ps,
+                        __MF_TYPE_HEAP_I, "mmap64 page");
+       }
+    }
+
+  return result;
+}
+#endif /* HAVE_MMAP64 */
+
+
 /* This wrapper is a little different, as it's called indirectly from
    __mf_fini also to clean up pending allocations.  */
 void *
index 77d58131bfa841e236abfd9df7e2bf11f21f1655..c030e694035bcaa151f9fa205211d01cb0ab8134 100644 (file)
@@ -2102,7 +2102,42 @@ WRAPPER2(struct mntent *, getmntent, FILE *filep)
   return m;
 }
 #elif defined HAVE_SYS_MNTTAB_H
-/* FIXME: Implement.  */
+WRAPPER2(int, getmntent, FILE *filep, struct mnttab *mp)
+{
+  static struct mnttab *last = NULL;
+  int res;
+
+  MF_VALIDATE_EXTENT (filep, sizeof (*filep), __MF_CHECK_WRITE,
+    "getmntent stream");
+#define UR(field) __mf_unregister(last->field, strlen (last->field)+1, __MF_TYPE_STATIC)
+  if (last)
+    {
+      UR (mnt_special);
+      UR (mnt_mountp);
+      UR (mnt_fstype);
+      UR (mnt_mntopts);
+      UR (mnt_time);
+      __mf_unregister (last, sizeof (*last), __MF_TYPE_STATIC);
+    }
+#undef UR
+
+  res = getmntent (filep, mp);
+  last = mp;
+
+#define R(field) __mf_register(last->field, strlen (last->field)+1, __MF_TYPE_STATIC, "mntent " #field)
+  if (mp)
+    {
+      R (mnt_special);
+      R (mnt_mountp);
+      R (mnt_fstype);
+      R (mnt_mntopts);
+      R (mnt_time);
+      __mf_register (last, sizeof (*last), __MF_TYPE_STATIC, "getmntent result");
+    }
+#undef R
+
+  return res;
+}
 #endif
 #endif
 
index 79a5d5e8d14bf22fbc52ec8d73ba6501c7667380..3a26224d7fb69fb20ad94048faeeadf0cb6189d2 100644 (file)
@@ -1,5 +1,5 @@
 /* Mudflap: narrow-pointer bounds-checking by tree rewriting.
-   Copyright (C) 2002, 2003, 2004, 2005, 2009
+   Copyright (C) 2002, 2003, 2004, 2005, 2009, 2011
    Free Software Foundation, Inc.
    Contributed by Frank Ch. Eigler <fche@redhat.com>
    and Graydon Hoare <graydon@redhat.com>
@@ -44,6 +44,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define _ALL_SOURCE
 #define _LARGE_FILE_API
 #define _XOPEN_SOURCE_EXTENDED 1
+#define _REENTRANT
 
 #include <string.h>
 #include <stdio.h>
index 6f0268b86ddac6ce255578dcd9427a21a18c22fb..865079c239fc8c8a204a6a0419b3a32ca41360d2 100644 (file)
@@ -1,6 +1,6 @@
 /* Implementation header for mudflap runtime library.
    Mudflap: narrow-pointer bounds-checking by tree rewriting.
-   Copyright (C) 2002, 2003, 2004, 2009 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2009, 2011 Free Software Foundation, Inc.
    Contributed by Frank Ch. Eigler <fche@redhat.com>
    and Graydon Hoare <graydon@redhat.com>
 
@@ -212,6 +212,9 @@ extern struct __mf_dynamic_entry __mf_dynamic[];
 enum __mf_dynamic_index
 {
   dyn_calloc, dyn_free, dyn_malloc, dyn_mmap,
+#ifdef HAVE_MMAP64
+  dyn_mmap64,
+#endif
   dyn_munmap, dyn_realloc,
   dyn_INITRESOLVE,  /* Marker for last init-time resolution. */
 #ifdef LIBMUDFLAPTH
index 6892804ca72bd01a12d3f6d4ae8cd95fa0602d3e..1036ccc93db01b9203015ab537e1a48cef0ed7d4 100644 (file)
@@ -666,6 +666,9 @@ struct __mf_dynamic_entry __mf_dynamic [] =
   {NULL, "free", NULL},
   {NULL, "malloc", NULL},
   {NULL, "mmap", NULL},
+#ifdef HAVE_MMAP64
+  {NULL, "mmap64", NULL},
+#endif
   {NULL, "munmap", NULL},
   {NULL, "realloc", NULL},
   {NULL, "DUMMY", NULL}, /* dyn_INITRESOLVE */
@@ -781,12 +784,22 @@ __wrap_main (int argc, char* argv[])
 
       __mf_register (& errno, sizeof (errno), __MF_TYPE_STATIC, "errno area");
 
+#if !(defined(__sun__) && defined(__svr4__))
+      /* Conflicts with the automatic registration of __iob[].  */
       __mf_register (stdin,  sizeof (*stdin),  __MF_TYPE_STATIC, "stdin");
       __mf_register (stdout, sizeof (*stdout), __MF_TYPE_STATIC, "stdout");
       __mf_register (stderr, sizeof (*stderr), __MF_TYPE_STATIC, "stderr");
+#endif
 
       /* Make some effort to register ctype.h static arrays.  */
-      /* XXX: e.g., on Solaris, may need to register __ctype, _ctype, __ctype_mask, __toupper, etc. */
+#if defined(__sun__) && defined(__svr4__)
+      /* __ctype[] is declared without size, but MB_CUR_MAX is the last
+        member.  There seems to be no proper way to determine the size.  */
+      __mf_register (__ctype, &MB_CUR_MAX - &__ctype[0] + 1, __MF_TYPE_STATIC, "__ctype");
+      /* __ctype_mask points at _C_masks[1].  The size can only determined
+        using nm on libc.so.1.  */
+      __mf_register (__ctype_mask - 1, 1028, __MF_TYPE_STATIC, "_C_masks");
+#endif
       /* On modern Linux GLIBC, these are thread-specific and changeable, and are dealt
          with in mf-hooks2.c.  */
     }
index 2d51731d611ec2b9059be22a1e21f6282bcf6afb..6e7813ba2aca0b976c13367e632e6fee78419d24 100644 (file)
@@ -8,7 +8,7 @@
 #include <unistd.h>
 
 #ifndef SCALE
-#define SCALE 100000
+#define SCALE 10000
 #endif
 
 
index 985c796e13c8ca834c2d6ad5aeae9e768b7aa5b5..cf5430657ff949dba2052e937359e1f9282076fd 100644 (file)
@@ -1,5 +1,6 @@
 /* Test for string function add boundaries of usable memory.
-   Copyright (C) 1996,1997,1999,2000,2001,2002 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2011
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -25,6 +26,8 @@
    test the real implementation.  */
 #undef __USE_STRING_INLINES
 
+#include "../config.h"
+
 #include <errno.h>
 #include <stdio.h>
 #include <string.h>
 #define MAX(a, b) ((a) > (b) ? (a) : (b))
 #endif
 
+#ifndef MIN
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
 int
 main (int argc, char *argv[])
 {
@@ -153,7 +160,7 @@ main (int argc, char *argv[])
            }
         }
 
-#if !defined  __FreeBSD__ && !(defined __sun__ && defined __svr4__)
+#ifdef HAVE_RAWMEMCHR
       /* rawmemchr test */
       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
         {
@@ -250,7 +257,7 @@ main (int argc, char *argv[])
            }
         }
 
-#ifndef __FreeBSD__ && !(defined __sun__ && defined __svr4__)
+#ifdef HAVE_STPCPY
       /* stpcpy test */
       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
         {
@@ -302,7 +309,7 @@ main (int argc, char *argv[])
              result = 1;
            }
 
-#if !defined __FreeBSD__ && !(defined __sun__ && defined __svr4__)
+#ifdef HAVE_MEMPCPY
       /* mempcpy test */
       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
        for (inner = 0; inner < size - outer; ++inner)
index 9e4ac50ef3fed3783c906e6371dbb069da67be19..71175827209f9521415057ab5ace9f76cf66c4de 100644 (file)
@@ -8,3 +8,5 @@ int main ()
              tolower (buf[4]) == 'o' && tolower ('X') == 'x' &&
              isdigit (buf[3])) == 0 && isalnum ('4'));
 }
+
+/* { dg-warning "cannot track unknown size extern .__ctype." "Solaris __ctype declared without size" { target *-*-solaris2.* } 0 } */