aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Ch. Eigler <fche@redhat.com>2006-11-06 18:02:13 +0000
committerFrank Ch. Eigler <fche@redhat.com>2006-11-06 18:02:13 +0000
commita873adc4ad648ba3ce4d083589fe7777230775a4 (patch)
tree56b8c0aa4258be292832ad52f6e3be9089c63077
parent77308455dddf46aa7d6a2fd72bebecea3fa74afb (diff)
2006-11-06 Frank Ch. Eigler <fche@redhat.com>
* configure.ac (__libc_freeres): Look for it. * mf-impl.h (call_libc_freeres): New configuration flag. * mf-runtime.c (__mf_set_default_options): Set it by default. (__mfu_report): Call it if needed. (__mfu_unregister): Remove "unaccessed registered object" warning. * configure, config.h.in: Regenerated. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@118523 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libmudflap/ChangeLog9
-rw-r--r--libmudflap/config.h.in3
-rwxr-xr-xlibmudflap/configure104
-rw-r--r--libmudflap/configure.ac1
-rw-r--r--libmudflap/mf-impl.h5
-rw-r--r--libmudflap/mf-runtime.c23
6 files changed, 143 insertions, 2 deletions
diff --git a/libmudflap/ChangeLog b/libmudflap/ChangeLog
index 4890660a793..6b2a8e2bd9c 100644
--- a/libmudflap/ChangeLog
+++ b/libmudflap/ChangeLog
@@ -1,3 +1,12 @@
+2006-11-06 Frank Ch. Eigler <fche@redhat.com>
+
+ * configure.ac (__libc_freeres): Look for it.
+ * mf-impl.h (call_libc_freeres): New configuration flag.
+ * mf-runtime.c (__mf_set_default_options): Set it by default.
+ (__mfu_report): Call it if needed.
+ (__mfu_unregister): Remove "unaccessed registered object" warning.
+ * configure, config.h.in: Regenerated.
+
2006-09-18 Tom Tromey <tromey@redhat.com>
* configure: Rebuilt.
diff --git a/libmudflap/config.h.in b/libmudflap/config.h.in
index f372741985c..e280b789713 100644
--- a/libmudflap/config.h.in
+++ b/libmudflap/config.h.in
@@ -243,6 +243,9 @@
/* Define to 1 if you have the `__ctype_toupper_loc' function. */
#undef HAVE___CTYPE_TOUPPER_LOC
+/* Define to 1 if you have the `__libc_freeres' function. */
+#undef HAVE___LIBC_FREERES
+
/* Name of package */
#undef PACKAGE
diff --git a/libmudflap/configure b/libmudflap/configure
index ed7cb8f0201..7f7dd06e320 100755
--- a/libmudflap/configure
+++ b/libmudflap/configure
@@ -4940,6 +4940,108 @@ fi
done
+for ac_func in __libc_freeres
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -5849,7 +5951,7 @@ test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic"
case $host in
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 5852 "configure"' > conftest.$ac_ext
+ echo '#line 5954 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
diff --git a/libmudflap/configure.ac b/libmudflap/configure.ac
index ff356f2603c..a22be278d32 100644
--- a/libmudflap/configure.ac
+++ b/libmudflap/configure.ac
@@ -75,6 +75,7 @@ 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(__libc_freeres)
AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/ipc.h>
diff --git a/libmudflap/mf-impl.h b/libmudflap/mf-impl.h
index e61f4b7a85a..728a58bc05d 100644
--- a/libmudflap/mf-impl.h
+++ b/libmudflap/mf-impl.h
@@ -134,6 +134,11 @@ struct __mf_options
/* Print list of leaked heap objects on shutdown. */
unsigned print_leaks;
+#ifdef HAVE___LIBC_FREERES
+ /* Call __libc_freeres before leak analysis. */
+ unsigned call_libc_freeres;
+#endif
+
/* Detect reads of uninitialized objects. */
unsigned check_initialization;
diff --git a/libmudflap/mf-runtime.c b/libmudflap/mf-runtime.c
index 72d1a575958..d6e32262e06 100644
--- a/libmudflap/mf-runtime.c
+++ b/libmudflap/mf-runtime.c
@@ -1,5 +1,5 @@
/* Mudflap: narrow-pointer bounds-checking by tree rewriting.
- Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Contributed by Frank Ch. Eigler <fche@redhat.com>
and Graydon Hoare <graydon@redhat.com>
Splay Tree code originally by Mark Mitchell <mark@markmitchell.com>,
@@ -300,6 +300,9 @@ __mf_set_default_options ()
__mf_opts.timestamps = 1;
__mf_opts.mudflap_mode = mode_check;
__mf_opts.violation_mode = viol_nop;
+#ifdef HAVE___LIBC_FREERES
+ __mf_opts.call_libc_freeres = 1;
+#endif
__mf_opts.heur_std_data = 1;
#ifdef LIBMUDFLAPTH
__mf_opts.thread_stack = 0;
@@ -365,6 +368,11 @@ options [] =
{"print-leaks",
"print any memory leaks at program shutdown",
set_option, 1, &__mf_opts.print_leaks},
+#ifdef HAVE___LIBC_FREERES
+ {"libc-freeres",
+ "call glibc __libc_freeres at shutdown for better leak data",
+ set_option, 1, &__mf_opts.call_libc_freeres},
+#endif
{"check-initialization",
"detect uninitialized object reads",
set_option, 1, &__mf_opts.check_initialization},
@@ -1323,10 +1331,15 @@ __mfu_unregister (void *ptr, size_t sz, int type)
(old_obj->type == __MF_TYPE_HEAP
|| old_obj->type == __MF_TYPE_HEAP_I))
{
+ /* The problem with a warning message here is that we may not
+ be privy to accesses to such objects that occur within
+ uninstrumented libraries. */
+#if 0
fprintf (stderr,
"*******\n"
"mudflap warning: unaccessed registered object:\n");
__mf_describe_object (old_obj);
+#endif
}
}
@@ -1855,6 +1868,14 @@ __mfu_report ()
/* Free up any remaining alloca()'d blocks. */
__mf_wrap_alloca_indirect (0);
+#ifdef HAVE___LIBC_FREERES
+ if (__mf_opts.call_libc_freeres)
+ {
+ extern void __libc_freeres (void);
+ __libc_freeres ();
+ }
+#endif
+
__mf_describe_object (NULL); /* Reset description epoch. */
l = __mf_report_leaks ();
fprintf (stderr, "number of leaked objects: %u\n", l);