aboutsummaryrefslogtreecommitdiff
path: root/libmudflap
diff options
context:
space:
mode:
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>2011-07-07 10:14:02 +0000
committerRainer Orth <ro@gcc.gnu.org>2011-07-07 10:14:02 +0000
commit891a2e42599a554e074f3c9e5fde54cce4795ed9 (patch)
treedabd723386297a21ecafc7c91d84abf760884544 /libmudflap
parent8384ac41e6036d9055c6a1725546eced5d479ec8 (diff)
downloadgcc-891a2e42599a554e074f3c9e5fde54cce4795ed9.zip
gcc-891a2e42599a554e074f3c9e5fde54cce4795ed9.tar.gz
gcc-891a2e42599a554e074f3c9e5fde54cce4795ed9.tar.bz2
re PR libmudflap/49550 (Many libmudflap tests fail on Solaris 11/x86)
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
Diffstat (limited to 'libmudflap')
-rw-r--r--libmudflap/ChangeLog30
-rw-r--r--libmudflap/config.h.in15
-rwxr-xr-xlibmudflap/configure28
-rw-r--r--libmudflap/configure.ac2
-rw-r--r--libmudflap/mf-hooks1.c57
-rw-r--r--libmudflap/mf-hooks2.c37
-rw-r--r--libmudflap/mf-hooks3.c3
-rw-r--r--libmudflap/mf-impl.h5
-rw-r--r--libmudflap/mf-runtime.c15
-rw-r--r--libmudflap/testsuite/libmudflap.c/heap-scalestress.c2
-rw-r--r--libmudflap/testsuite/libmudflap.c/pass-stratcliff.c15
-rw-r--r--libmudflap/testsuite/libmudflap.c/pass47-frag.c2
12 files changed, 199 insertions, 12 deletions
diff --git a/libmudflap/ChangeLog b/libmudflap/ChangeLog
index 177c018..d755ddb 100644
--- a/libmudflap/ChangeLog
+++ b/libmudflap/ChangeLog
@@ -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
diff --git a/libmudflap/config.h.in b/libmudflap/config.h.in
index 16afd05..9e4e191 100644
--- a/libmudflap/config.h.in
+++ b/libmudflap/config.h.in
@@ -126,18 +126,27 @@
/* 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
@@ -156,6 +165,9 @@
/* 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
@@ -192,6 +204,9 @@
/* 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
diff --git a/libmudflap/configure b/libmudflap/configure
index ebf8f2d..d2b9418 100755
--- a/libmudflap/configure
+++ b/libmudflap/configure
@@ -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
diff --git a/libmudflap/configure.ac b/libmudflap/configure.ac
index b61b56f..f8b9995 100644
--- a/libmudflap/configure.ac
+++ b/libmudflap/configure.ac
@@ -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>
diff --git a/libmudflap/mf-hooks1.c b/libmudflap/mf-hooks1.c
index 1e46a65..3dd332e 100644
--- a/libmudflap/mf-hooks1.c
+++ b/libmudflap/mf-hooks1.c
@@ -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 *
diff --git a/libmudflap/mf-hooks2.c b/libmudflap/mf-hooks2.c
index 77d5813..c030e69 100644
--- a/libmudflap/mf-hooks2.c
+++ b/libmudflap/mf-hooks2.c
@@ -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
diff --git a/libmudflap/mf-hooks3.c b/libmudflap/mf-hooks3.c
index 79a5d5e..3a26224 100644
--- a/libmudflap/mf-hooks3.c
+++ b/libmudflap/mf-hooks3.c
@@ -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>
diff --git a/libmudflap/mf-impl.h b/libmudflap/mf-impl.h
index 6f0268b..865079c 100644
--- a/libmudflap/mf-impl.h
+++ b/libmudflap/mf-impl.h
@@ -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
diff --git a/libmudflap/mf-runtime.c b/libmudflap/mf-runtime.c
index 6892804..1036ccc 100644
--- a/libmudflap/mf-runtime.c
+++ b/libmudflap/mf-runtime.c
@@ -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. */
}
diff --git a/libmudflap/testsuite/libmudflap.c/heap-scalestress.c b/libmudflap/testsuite/libmudflap.c/heap-scalestress.c
index 2d51731..6e7813b 100644
--- a/libmudflap/testsuite/libmudflap.c/heap-scalestress.c
+++ b/libmudflap/testsuite/libmudflap.c/heap-scalestress.c
@@ -8,7 +8,7 @@
#include <unistd.h>
#ifndef SCALE
-#define SCALE 100000
+#define SCALE 10000
#endif
diff --git a/libmudflap/testsuite/libmudflap.c/pass-stratcliff.c b/libmudflap/testsuite/libmudflap.c/pass-stratcliff.c
index 985c796..cf54306 100644
--- a/libmudflap/testsuite/libmudflap.c/pass-stratcliff.c
+++ b/libmudflap/testsuite/libmudflap.c/pass-stratcliff.c
@@ -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>
@@ -36,6 +39,10 @@
#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)
diff --git a/libmudflap/testsuite/libmudflap.c/pass47-frag.c b/libmudflap/testsuite/libmudflap.c/pass47-frag.c
index 9e4ac50..7117582 100644
--- a/libmudflap/testsuite/libmudflap.c/pass47-frag.c
+++ b/libmudflap/testsuite/libmudflap.c/pass47-frag.c
@@ -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 } */