/* Implementation header for mudflap runtime library.
   Mudflap: narrow-pointer bounds-checking by tree rewriting.
   Copyright (C) 2002, 2003, 2004, 2005, 2009 Free Software Foundation, Inc.
   Contributed by Frank Ch. Eigler <fche@redhat.com>
   and Graydon Hoare <graydon@redhat.com>

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 3, or (at your option) any later
version.

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.

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
<http://www.gnu.org/licenses/>.  */

/* Public libmudflap declarations -*- C -*- */

#ifndef MF_RUNTIME_H
#define MF_RUNTIME_H

typedef void *__mf_ptr_t;
typedef unsigned int __mf_uintptr_t __attribute__ ((__mode__ (__pointer__)));
typedef __SIZE_TYPE__ __mf_size_t;

/* Global declarations used by instrumentation.  When _MUDFLAP is
   defined, these have been auto-declared by the compiler and we
   should not declare them again (ideally we *would* declare them
   again, to verify that the compiler's declarations match the
   library's, but the C++ front end has no mechanism for allowing
   the re-definition of a structure type).  */
#ifndef _MUDFLAP
struct __mf_cache { __mf_uintptr_t low; __mf_uintptr_t high; };
extern struct __mf_cache __mf_lookup_cache [];
extern __mf_uintptr_t __mf_lc_mask;
extern unsigned char __mf_lc_shift;
#endif

/* Multithreading support.  */
#ifdef _MUDFLAPTH
/* extern pthread_mutex_t __mf_biglock; */
#ifndef _REENTRANT
#define _REENTRANT
#endif
#ifndef _THREAD_SAFE
#define _THREAD_SAFE
#endif
#endif

/* Codes to describe the type of access to check: __mf_check arg 3 */

#define __MF_CHECK_READ 0
#define __MF_CHECK_WRITE 1


/* Codes to describe a region of memory being registered: __mf_*register arg 3 */

#define __MF_TYPE_NOACCESS 0
#define __MF_TYPE_HEAP 1
#define __MF_TYPE_HEAP_I 2
#define __MF_TYPE_STACK 3
#define __MF_TYPE_STATIC 4
#define __MF_TYPE_GUESS 5


/* The public mudflap API */

#ifdef __cplusplus
extern "C" {
#endif

extern void __mf_check (void *ptr, __mf_size_t sz, int type, const char *location)
       __attribute((nothrow));
extern void __mf_register (void *ptr, __mf_size_t sz, int type, const char *name)
       __attribute((nothrow));
extern void __mf_unregister (void *ptr, __mf_size_t sz, int type)
       __attribute((nothrow));
extern unsigned __mf_watch (void *ptr, __mf_size_t sz);
extern unsigned __mf_unwatch (void *ptr, __mf_size_t sz);
extern void __mf_report ();
extern int __mf_set_options (const char *opts);


/* Redirect some standard library functions to libmudflap.  These are
   done by simple #define rather than linker wrapping, since only
   instrumented modules are meant to be affected.  */

#ifdef _MUDFLAP
#ifndef __USER_LABEL_PREFIX__
#pragma redefine_extname memcpy __mfwrap_memcpy
#pragma redefine_extname memmove __mfwrap_memmove
#pragma redefine_extname memset __mfwrap_memset
#pragma redefine_extname memcmp __mfwrap_memcmp
#pragma redefine_extname memchr __mfwrap_memchr
#pragma redefine_extname memrchr __mfwrap_memrchr
#pragma redefine_extname strcpy __mfwrap_strcpy
#pragma redefine_extname strncpy __mfwrap_strncpy
#pragma redefine_extname strcat __mfwrap_strcat
#pragma redefine_extname strncat __mfwrap_strncat
#pragma redefine_extname strcmp __mfwrap_strcmp
#pragma redefine_extname strcasecmp __mfwrap_strcasecmp
#pragma redefine_extname strncmp __mfwrap_strncmp
#pragma redefine_extname strncasecmp __mfwrap_strncasecmp
#pragma redefine_extname strdup __mfwrap_strdup
#pragma redefine_extname strndup __mfwrap_strndup
#pragma redefine_extname strchr __mfwrap_strchr
#pragma redefine_extname strrchr __mfwrap_strrchr
#pragma redefine_extname strstr __mfwrap_strstr
#pragma redefine_extname memmem __mfwrap_memmem
#pragma redefine_extname strlen __mfwrap_strlen
#pragma redefine_extname strnlen __mfwrap_strnlen
#pragma redefine_extname bzero __mfwrap_bzero
#pragma redefine_extname bcopy __mfwrap_bcopy
#pragma redefine_extname bcmp __mfwrap_bcmp
#pragma redefine_extname index __mfwrap_index
#pragma redefine_extname rindex __mfwrap_rindex
#pragma redefine_extname asctime __mfwrap_asctime
#pragma redefine_extname ctime __mfwrap_ctime
#pragma redefine_extname gmtime __mfwrap_gmtime
#pragma redefine_extname localtime __mfwrap_localtime
#pragma redefine_extname time __mfwrap_time
#pragma redefine_extname strerror __mfwrap_strerror
#pragma redefine_extname fopen __mfwrap_fopen
#pragma redefine_extname fdopen __mfwrap_fdopen
#pragma redefine_extname freopen __mfwrap_freopen
#pragma redefine_extname fclose __mfwrap_fclose
#pragma redefine_extname fread __mfwrap_fread
#pragma redefine_extname fwrite __mfwrap_fwrite
#pragma redefine_extname fgetc __mfwrap_fgetc
#pragma redefine_extname fgets __mfwrap_fgets
#pragma redefine_extname getc __mfwrap_getc
#pragma redefine_extname gets __mfwrap_gets
#pragma redefine_extname ungetc __mfwrap_ungetc
#pragma redefine_extname fputc __mfwrap_fputc
#pragma redefine_extname fputs __mfwrap_fputs
#pragma redefine_extname putc __mfwrap_putc
#pragma redefine_extname puts __mfwrap_puts
#pragma redefine_extname clearerr __mfwrap_clearerr
#pragma redefine_extname feof __mfwrap_feof
#pragma redefine_extname ferror __mfwrap_ferror
#pragma redefine_extname fileno __mfwrap_fileno
#pragma redefine_extname printf __mfwrap_printf
#pragma redefine_extname fprintf __mfwrap_fprintf
#pragma redefine_extname sprintf __mfwrap_sprintf
#pragma redefine_extname snprintf __mfwrap_snprintf
#pragma redefine_extname vprintf __mfwrap_vprintf
#pragma redefine_extname vfprintf __mfwrap_vfprintf
#pragma redefine_extname vsprintf __mfwrap_vsprintf
#pragma redefine_extname vsnprintf __mfwrap_vsnprintf
#pragma redefine_extname access __mfwrap_access
#pragma redefine_extname remove __mfwrap_remove
#pragma redefine_extname fflush __mfwrap_fflush
#pragma redefine_extname fseek __mfwrap_fseek
#pragma redefine_extname ftell __mfwrap_ftell
#pragma redefine_extname rewind __mfwrap_rewind
#pragma redefine_extname fgetpos __mfwrap_fgetpos
#pragma redefine_extname fsetpos __mfwrap_fsetpos
#pragma redefine_extname stat __mfwrap_stat
#pragma redefine_extname fstat __mfwrap_fstat
#pragma redefine_extname lstat __mfwrap_lstat
#pragma redefine_extname mkfifo __mfwrap_mkfifo
#pragma redefine_extname setvbuf __mfwrap_setvbuf
#pragma redefine_extname setbuf __mfwrap_setbuf
#pragma redefine_extname setbuffer __mfwrap_setbuffer
#pragma redefine_extname setlinebuf __mfwrap_setlinebuf
#pragma redefine_extname opendir __mfwrap_opendir
#pragma redefine_extname closedir __mfwrap_closedir
#pragma redefine_extname readdir __mfwrap_readdir
#pragma redefine_extname recv __mfwrap_recv
#pragma redefine_extname recvfrom __mfwrap_recvfrom
#pragma redefine_extname recvmsg __mfwrap_recvmsg
#pragma redefine_extname send __mfwrap_send
#pragma redefine_extname sendto __mfwrap_sendto
#pragma redefine_extname sendmsg __mfwrap_sendmsg
#pragma redefine_extname setsockopt __mfwrap_setsockopt
#pragma redefine_extname getsockopt __mfwrap_getsockopt
#pragma redefine_extname accept __mfwrap_accept
#pragma redefine_extname bind __mfwrap_bind
#pragma redefine_extname connect __mfwrap_connect
#pragma redefine_extname gethostname __mfwrap_gethostname
#pragma redefine_extname sethostname __mfwrap_sethostname
#pragma redefine_extname gethostbyname __mfwrap_gethostbyname
#pragma redefine_extname wait __mfwrap_wait
#pragma redefine_extname waitpid __mfwrap_waitpid
#pragma redefine_extname popen __mfwrap_popen
#pragma redefine_extname pclose __mfwrap_pclose
#pragma redefine_extname execve __mfwrap_execve
#pragma redefine_extname execv __mfwrap_execv
#pragma redefine_extname execvp __mfwrap_execvp
#pragma redefine_extname system __mfwrap_system
#pragma redefine_extname dlopen __mfwrap_dlopen
#pragma redefine_extname dlerror __mfwrap_dlerror
#pragma redefine_extname dlsym __mfwrap_dlsym
#pragma redefine_extname dlclose __mfwrap_dlclose
#pragma redefine_extname fopen64 __mfwrap_fopen64
#pragma redefine_extname freopen64 __mfwrap_freopen64
#pragma redefine_extname stat64 __mfwrap_stat64
#pragma redefine_extname fseeko64 __mfwrap_fseeko64
#pragma redefine_extname ftello64 __mfwrap_ftello64
#pragma redefine_extname semop __mfwrap_semop
#pragma redefine_extname semctl __mfwrap_semctl
#pragma redefine_extname shmctl __mfwrap_shmctl
#pragma redefine_extname shmat __mfwrap_shmat
#pragma redefine_extname shmdt __mfwrap_shmdt
#pragma redefine_extname __ctype_b_loc __mfwrap___ctype_b_loc
#pragma redefine_extname __ctype_toupper_loc __mfwrap___ctype_toupper_loc
#pragma redefine_extname __ctype_tolower_loc __mfwrap___ctype_tolower_loc
#pragma redefine_extname getlogin __mfwrap_getlogin
#pragma redefine_extname cuserid __mfwrap_cuserid
#pragma redefine_extname getpwnam __mfwrap_getpwnam
#pragma redefine_extname getpwuid __mfwrap_getpwuid
#pragma redefine_extname getgrnam __mfwrap_getgrnam
#pragma redefine_extname getgrgid __mfwrap_getgrgid
#pragma redefine_extname getservent __mfwrap_getservent
#pragma redefine_extname getservbyname __mfwrap_getservbyname
#pragma redefine_extname getservbyport __mfwrap_getservbyport
#pragma redefine_extname gai_strerror __mfwrap_gai_strerror
#pragma redefine_extname getmntent __mfwrap_getmntent
#pragma redefine_extname inet_ntoa __mfwrap_inet_ntoa
#pragma redefine_extname getprotoent __mfwrap_getprotoent
#pragma redefine_extname getprotobyname __mfwrap_getprotobyname
#pragma redefine_extname getprotobynumber __mfwrap_getprotobynumber
#else
#pragma redefine_extname memcpy ___mfwrap_memcpy
#pragma redefine_extname memmove ___mfwrap_memmove
#pragma redefine_extname memset ___mfwrap_memset
#pragma redefine_extname memcmp ___mfwrap_memcmp
#pragma redefine_extname memchr ___mfwrap_memchr
#pragma redefine_extname memrchr ___mfwrap_memrchr
#pragma redefine_extname strcpy ___mfwrap_strcpy
#pragma redefine_extname strncpy ___mfwrap_strncpy
#pragma redefine_extname strcat ___mfwrap_strcat
#pragma redefine_extname strncat ___mfwrap_strncat
#pragma redefine_extname strcmp ___mfwrap_strcmp
#pragma redefine_extname strcasecmp ___mfwrap_strcasecmp
#pragma redefine_extname strncmp ___mfwrap_strncmp
#pragma redefine_extname strncasecmp ___mfwrap_strncasecmp
#pragma redefine_extname strdup ___mfwrap_strdup
#pragma redefine_extname strndup ___mfwrap_strndup
#pragma redefine_extname strchr ___mfwrap_strchr
#pragma redefine_extname strrchr ___mfwrap_strrchr
#pragma redefine_extname strstr ___mfwrap_strstr
#pragma redefine_extname memmem ___mfwrap_memmem
#pragma redefine_extname strlen ___mfwrap_strlen
#pragma redefine_extname strnlen ___mfwrap_strnlen
#pragma redefine_extname bzero ___mfwrap_bzero
#pragma redefine_extname bcopy ___mfwrap_bcopy
#pragma redefine_extname bcmp ___mfwrap_bcmp
#pragma redefine_extname index ___mfwrap_index
#pragma redefine_extname rindex ___mfwrap_rindex
#pragma redefine_extname asctime ___mfwrap_asctime
#pragma redefine_extname ctime ___mfwrap_ctime
#pragma redefine_extname gmtime ___mfwrap_gmtime
#pragma redefine_extname localtime ___mfwrap_localtime
#pragma redefine_extname time ___mfwrap_time
#pragma redefine_extname strerror ___mfwrap_strerror
#pragma redefine_extname fopen ___mfwrap_fopen
#pragma redefine_extname fdopen ___mfwrap_fdopen
#pragma redefine_extname freopen ___mfwrap_freopen
#pragma redefine_extname fclose ___mfwrap_fclose
#pragma redefine_extname fread ___mfwrap_fread
#pragma redefine_extname fwrite ___mfwrap_fwrite
#pragma redefine_extname fgetc ___mfwrap_fgetc
#pragma redefine_extname fgets ___mfwrap_fgets
#pragma redefine_extname getc ___mfwrap_getc
#pragma redefine_extname gets ___mfwrap_gets
#pragma redefine_extname ungetc ___mfwrap_ungetc
#pragma redefine_extname fputc ___mfwrap_fputc
#pragma redefine_extname fputs ___mfwrap_fputs
#pragma redefine_extname putc ___mfwrap_putc
#pragma redefine_extname puts ___mfwrap_puts
#pragma redefine_extname clearerr ___mfwrap_clearerr
#pragma redefine_extname feof ___mfwrap_feof
#pragma redefine_extname ferror ___mfwrap_ferror
#pragma redefine_extname fileno ___mfwrap_fileno
#pragma redefine_extname printf ___mfwrap_printf
#pragma redefine_extname fprintf ___mfwrap_fprintf
#pragma redefine_extname sprintf ___mfwrap_sprintf
#pragma redefine_extname snprintf ___mfwrap_snprintf
#pragma redefine_extname vprintf ___mfwrap_vprintf
#pragma redefine_extname vfprintf ___mfwrap_vfprintf
#pragma redefine_extname vsprintf ___mfwrap_vsprintf
#pragma redefine_extname vsnprintf ___mfwrap_vsnprintf
#pragma redefine_extname access ___mfwrap_access
#pragma redefine_extname remove ___mfwrap_remove
#pragma redefine_extname fflush ___mfwrap_fflush
#pragma redefine_extname fseek ___mfwrap_fseek
#pragma redefine_extname ftell ___mfwrap_ftell
#pragma redefine_extname rewind ___mfwrap_rewind
#pragma redefine_extname fgetpos ___mfwrap_fgetpos
#pragma redefine_extname fsetpos ___mfwrap_fsetpos
#pragma redefine_extname stat ___mfwrap_stat
#pragma redefine_extname fstat ___mfwrap_fstat
#pragma redefine_extname lstat ___mfwrap_lstat
#pragma redefine_extname mkfifo ___mfwrap_mkfifo
#pragma redefine_extname setvbuf ___mfwrap_setvbuf
#pragma redefine_extname setbuf ___mfwrap_setbuf
#pragma redefine_extname setbuffer ___mfwrap_setbuffer
#pragma redefine_extname setlinebuf ___mfwrap_setlinebuf
#pragma redefine_extname opendir ___mfwrap_opendir
#pragma redefine_extname closedir ___mfwrap_closedir
#pragma redefine_extname readdir ___mfwrap_readdir
#pragma redefine_extname recv ___mfwrap_recv
#pragma redefine_extname recvfrom ___mfwrap_recvfrom
#pragma redefine_extname recvmsg ___mfwrap_recvmsg
#pragma redefine_extname send ___mfwrap_send
#pragma redefine_extname sendto ___mfwrap_sendto
#pragma redefine_extname sendmsg ___mfwrap_sendmsg
#pragma redefine_extname setsockopt ___mfwrap_setsockopt
#pragma redefine_extname getsockopt ___mfwrap_getsockopt
#pragma redefine_extname accept ___mfwrap_accept
#pragma redefine_extname bind ___mfwrap_bind
#pragma redefine_extname connect ___mfwrap_connect
#pragma redefine_extname gethostname ___mfwrap_gethostname
#pragma redefine_extname sethostname ___mfwrap_sethostname
#pragma redefine_extname gethostbyname ___mfwrap_gethostbyname
#pragma redefine_extname wait ___mfwrap_wait
#pragma redefine_extname waitpid ___mfwrap_waitpid
#pragma redefine_extname popen ___mfwrap_popen
#pragma redefine_extname pclose ___mfwrap_pclose
#pragma redefine_extname execve ___mfwrap_execve
#pragma redefine_extname execv ___mfwrap_execv
#pragma redefine_extname execvp ___mfwrap_execvp
#pragma redefine_extname system ___mfwrap_system
#pragma redefine_extname dlopen ___mfwrap_dlopen
#pragma redefine_extname dlerror ___mfwrap_dlerror
#pragma redefine_extname dlsym ___mfwrap_dlsym
#pragma redefine_extname dlclose ___mfwrap_dlclose
#pragma redefine_extname fopen64 ___mfwrap_fopen64
#pragma redefine_extname freopen64 ___mfwrap_freopen64
#pragma redefine_extname stat64 ___mfwrap_stat64
#pragma redefine_extname fseeko64 ___mfwrap_fseeko64
#pragma redefine_extname ftello64 ___mfwrap_ftello64
#pragma redefine_extname semop ___mfwrap_semop
#pragma redefine_extname semctl ___mfwrap_semctl
#pragma redefine_extname shmctl ___mfwrap_shmctl
#pragma redefine_extname shmat ___mfwrap_shmat
#pragma redefine_extname shmdt ___mfwrap_shmdt
#pragma redefine_extname __ctype_b_loc ___mfwrap___ctype_b_loc
#pragma redefine_extname __ctype_toupper_loc ___mfwrap___ctype_toupper_loc
#pragma redefine_extname __ctype_tolower_loc ___mfwrap___ctype_tolower_loc
#pragma redefine_extname getlogin ___mfwrap_getlogin
#pragma redefine_extname cuserid ___mfwrap_cuserid
#pragma redefine_extname getpwnam ___mfwrap_getpwnam
#pragma redefine_extname getpwuid ___mfwrap_getpwuid
#pragma redefine_extname getgrnam ___mfwrap_getgrnam
#pragma redefine_extname getgrgid ___mfwrap_getgrgid
#pragma redefine_extname getservent ___mfwrap_getservent
#pragma redefine_extname getservbyname ___mfwrap_getservbyname
#pragma redefine_extname getservbyport ___mfwrap_getservbyport
#pragma redefine_extname gai_strerror ___mfwrap_gai_strerror
#pragma redefine_extname getmntent ___mfwrap_getmntent
#pragma redefine_extname inet_ntoa ___mfwrap_inet_ntoa
#pragma redefine_extname getprotoent ___mfwrap_getprotoent
#pragma redefine_extname getprotobyname ___mfwrap_getprotobyname
#pragma redefine_extname getprotobynumber ___mfwrap_getprotobynumber
#endif

/* Disable glibc macros.  */
#define __NO_STRING_INLINES

#endif /* _MUDFLAP */


#ifdef __cplusplus
}
#endif

#endif /* MF_RUNTIME_H */
