X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=libmudflap%2Fmf-impl.h;h=6f0268b86ddac6ce255578dcd9427a21a18c22fb;hb=f177c9a82242d10edc08df30d2d24814ae5c0317;hp=6b44edaba5c30ebf5ee2abf7a550a6d3eef0b2d0;hpb=b1df5b265b5f4dc8779eb09c5417cc6c9179c9ae;p=pf3gnuchains%2Fgcc-fork.git diff --git a/libmudflap/mf-impl.h b/libmudflap/mf-impl.h index 6b44edaba5c..6f0268b86dd 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 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2009 Free Software Foundation, Inc. Contributed by Frank Ch. Eigler and Graydon Hoare @@ -8,27 +8,22 @@ This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later +Software Foundation; either version 3, or (at your option) any later version. -In addition to the permissions in the GNU General Public License, the -Free Software Foundation gives you unlimited permission to link the -compiled version of this file into combinations with other programs, -and to distribute those combinations without any restriction coming -from the use of this file. (The General Public License restrictions -do apply in other respects; for example, they cover modification of -the file, and distribution when not linked into a combine -executable.) - GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 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, 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301, USA. */ +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ #ifndef __MF_IMPL_H #define __MF_IMPL_H @@ -94,9 +89,17 @@ extern int __mf_heuristic_check (uintptr_t, uintptr_t); /* Type definitions. */ /* ------------------------------------------------------------------------ */ -/* The mf_state type codes describe recursion and initialization order. */ +/* The mf_state type codes describe recursion and initialization order. + + reentrant means we are inside a mf-runtime support routine, such as + __mf_register, and thus there should be no calls to any wrapped functions, + such as the wrapped malloc. This indicates a bug if it occurs. + in_malloc means we are inside a real malloc call inside a wrapped malloc + call, and thus there should be no calls to any wrapped functions like the + wrapped mmap. This happens on some systems due to how the system libraries + are constructed. */ -enum __mf_state_enum { active, reentrant }; +enum __mf_state_enum { active, reentrant, in_malloc }; /* The __mf_options structure records optional or tunable aspects of the mudflap library's behavior. There is a single global instance of this @@ -126,6 +129,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; @@ -231,7 +239,7 @@ extern pthread_mutex_t __mf_biglock; #define UNLOCKTH() do {} while (0) #endif -#if defined(LIBMUDFLAPTH) && !defined(HAVE_TLS) +#if defined(LIBMUDFLAPTH) && (!defined(HAVE_TLS) || defined(USE_EMUTLS)) extern enum __mf_state_enum __mf_get_state (void); extern void __mf_set_state (enum __mf_state_enum); #else @@ -379,11 +387,23 @@ ret __mfwrap_ ## fname (__VA_ARGS__) __mf_reentrancy ++; \ return CALL_REAL(fname, __VA_ARGS__); \ } \ + else if (UNLIKELY (__mf_get_state () == in_malloc)) \ + { \ + return CALL_REAL(fname, __VA_ARGS__); \ + } \ else \ { \ TRACE ("%s\n", __PRETTY_FUNCTION__); \ } +/* There is an assumption here that these will only be called in routines + that call BEGIN_PROTECT at the start, and hence the state must always + be active when BEGIN_MALLOC_PROTECT is called. */ +#define BEGIN_MALLOC_PROTECT() \ + __mf_set_state (in_malloc) + +#define END_MALLOC_PROTECT() \ + __mf_set_state (active) /* Unlocked variants of main entry points from mf-runtime.h. */ extern void __mfu_check (void *ptr, size_t sz, int type, const char *location);