X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=libmudflap%2Fmf-hooks1.c;h=bef22687f195e162176690dc3025cddb5632958c;hp=d2f8312314fa26581ccd008d4b7c110912d1602d;hb=acf503a40b378589b5a392d17c79ec407f46c7bf;hpb=8981aed2e88666a3668271f54391f9266c4c80bb diff --git a/libmudflap/mf-hooks1.c b/libmudflap/mf-hooks1.c index d2f8312314f..bef22687f19 100644 --- a/libmudflap/mf-hooks1.c +++ b/libmudflap/mf-hooks1.c @@ -26,8 +26,8 @@ for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301, USA. */ #include "config.h" @@ -42,7 +42,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #if !defined(__FreeBSD__) && !defined(__APPLE__) #define _POSIX_SOURCE #endif /* Some BSDs break if this is defined. */ -#define _GNU_SOURCE +#define _GNU_SOURCE #define _XOPEN_SOURCE #define _BSD_TYPES #define __EXTENSIONS__ @@ -79,7 +79,19 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA void * __mf_0fn_malloc (size_t c) { - /* fprintf (stderr, "0fn malloc c=%lu\n", c); */ + enum foo { BS = 4096, NB=10 }; + static char bufs[NB][BS]; + static unsigned bufs_used[NB]; + unsigned i; + + for (i=0; i 0)) { @@ -268,14 +274,16 @@ WRAPPER(void, free, void *buf) { if (__mf_opts.trace_mf_calls) { - VERBOSE_TRACE ("freeing deferred pointer %p (crumple %u)\n", + VERBOSE_TRACE ("freeing deferred pointer %p (crumple %u)\n", (void *) freeme, __mf_opts.crumple_zone); } + BEGIN_MALLOC_PROTECT (); CALL_REAL (free, freeme); + END_MALLOC_PROTECT (); } - } - else + } + else { /* back pointer up a bit to the beginning of crumple zone */ char *base = (char *)buf; @@ -283,15 +291,21 @@ WRAPPER(void, free, void *buf) if (__mf_opts.trace_mf_calls) { VERBOSE_TRACE ("freeing pointer %p = %p - %u\n", - (void *) base, - (void *) buf, + (void *) base, + (void *) buf, __mf_opts.crumple_zone); } + BEGIN_MALLOC_PROTECT (); CALL_REAL (free, base); + END_MALLOC_PROTECT (); } } +/* We can only wrap mmap if the target supports it. Likewise for munmap. + We assume we have both if we have mmap. */ +#ifdef HAVE_MMAP + #if PIC /* A special bootstrap variant. */ void * @@ -303,20 +317,20 @@ __mf_0fn_mmap (void *start, size_t l, int prot, int f, int fd, off_t off) #undef mmap -WRAPPER(void *, mmap, - void *start, size_t length, int prot, +WRAPPER(void *, mmap, + void *start, size_t length, int prot, int flags, int fd, off_t offset) { - DECLARE(void *, mmap, void *, size_t, int, + DECLARE(void *, mmap, void *, size_t, int, int, int, off_t); void *result; BEGIN_PROTECT (mmap, start, length, prot, flags, fd, offset); - result = CALL_REAL (mmap, start, length, prot, + result = CALL_REAL (mmap, start, length, prot, flags, fd, offset); /* - VERBOSE_TRACE ("mmap (%08lx, %08lx, ...) => %08lx\n", + VERBOSE_TRACE ("mmap (%08lx, %08lx, ...) => %08lx\n", (uintptr_t) start, (uintptr_t) length, (uintptr_t) result); */ @@ -361,11 +375,11 @@ WRAPPER(int , munmap, void *start, size_t length) DECLARE(int, munmap, void *, size_t); int result; BEGIN_PROTECT (munmap, start, length); - + result = CALL_REAL (munmap, start, length); /* - VERBOSE_TRACE ("munmap (%08lx, %08lx, ...) => %08lx\n", + VERBOSE_TRACE ("munmap (%08lx, %08lx, ...) => %08lx\n", (uintptr_t) start, (uintptr_t) length, (uintptr_t) result); */ @@ -378,14 +392,15 @@ WRAPPER(int , munmap, void *start, size_t length) uintptr_t offset; for (offset=0; offsetstack DEEPER_THAN (uintptr_t) stack)) { struct alloca_tracking *next = alloca_history->next; - __mf_unregister (alloca_history->ptr, 0); + __mf_unregister (alloca_history->ptr, 0, __MF_TYPE_HEAP); + BEGIN_MALLOC_PROTECT (); CALL_REAL (free, alloca_history->ptr); CALL_REAL (free, alloca_history); + END_MALLOC_PROTECT (); alloca_history = next; } @@ -429,14 +446,20 @@ __mf_wrap_alloca_indirect (size_t c) result = NULL; if (LIKELY (c > 0)) /* alloca(0) causes no allocation. */ { - track = (struct alloca_tracking *) CALL_REAL (malloc, + BEGIN_MALLOC_PROTECT (); + track = (struct alloca_tracking *) CALL_REAL (malloc, sizeof (struct alloca_tracking)); + END_MALLOC_PROTECT (); if (LIKELY (track != NULL)) { + BEGIN_MALLOC_PROTECT (); result = CALL_REAL (malloc, c); + END_MALLOC_PROTECT (); if (UNLIKELY (result == NULL)) { + BEGIN_MALLOC_PROTECT (); CALL_REAL (free, track); + END_MALLOC_PROTECT (); /* Too bad. XXX: What about errno? */ } else @@ -449,7 +472,7 @@ __mf_wrap_alloca_indirect (size_t c) } } } - + return result; }