Home | History | Annotate | Download | only in include
      1 /* Implementation header for mudflap runtime library.
      2    Mudflap: narrow-pointer bounds-checking by tree rewriting.
      3    Copyright (C) 2002, 2003, 2004, 2005, 2009 Free Software Foundation, Inc.
      4    Contributed by Frank Ch. Eigler <fche (at) redhat.com>
      5    and Graydon Hoare <graydon (at) redhat.com>
      6 
      7 This file is part of GCC.
      8 
      9 GCC is free software; you can redistribute it and/or modify it under
     10 the terms of the GNU General Public License as published by the Free
     11 Software Foundation; either version 3, or (at your option) any later
     12 version.
     13 
     14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
     16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     17 for more details.
     18 
     19 Under Section 7 of GPL version 3, you are granted additional
     20 permissions described in the GCC Runtime Library Exception, version
     21 3.1, as published by the Free Software Foundation.
     22 
     23 You should have received a copy of the GNU General Public License and
     24 a copy of the GCC Runtime Library Exception along with this program;
     25 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     26 <http://www.gnu.org/licenses/>.  */
     27 
     28 /* Public libmudflap declarations -*- C -*- */
     29 
     30 #ifndef MF_RUNTIME_H
     31 #define MF_RUNTIME_H
     32 
     33 typedef void *__mf_ptr_t;
     34 typedef unsigned int __mf_uintptr_t __attribute__ ((__mode__ (__pointer__)));
     35 typedef __SIZE_TYPE__ __mf_size_t;
     36 
     37 /* Global declarations used by instrumentation.  When _MUDFLAP is
     38    defined, these have been auto-declared by the compiler and we
     39    should not declare them again (ideally we *would* declare them
     40    again, to verify that the compiler's declarations match the
     41    library's, but the C++ front end has no mechanism for allowing
     42    the re-definition of a structure type).  */
     43 #ifndef _MUDFLAP
     44 struct __mf_cache { __mf_uintptr_t low; __mf_uintptr_t high; };
     45 extern struct __mf_cache __mf_lookup_cache [];
     46 extern __mf_uintptr_t __mf_lc_mask;
     47 extern unsigned char __mf_lc_shift;
     48 #endif
     49 
     50 /* Multithreading support.  */
     51 #ifdef _MUDFLAPTH
     52 /* extern pthread_mutex_t __mf_biglock; */
     53 #ifndef _REENTRANT
     54 #define _REENTRANT
     55 #endif
     56 #ifndef _THREAD_SAFE
     57 #define _THREAD_SAFE
     58 #endif
     59 #endif
     60 
     61 /* Codes to describe the type of access to check: __mf_check arg 3 */
     62 
     63 #define __MF_CHECK_READ 0
     64 #define __MF_CHECK_WRITE 1
     65 
     66 
     67 /* Codes to describe a region of memory being registered: __mf_*register arg 3 */
     68 
     69 #define __MF_TYPE_NOACCESS 0
     70 #define __MF_TYPE_HEAP 1
     71 #define __MF_TYPE_HEAP_I 2
     72 #define __MF_TYPE_STACK 3
     73 #define __MF_TYPE_STATIC 4
     74 #define __MF_TYPE_GUESS 5
     75 
     76 
     77 /* The public mudflap API */
     78 
     79 #ifdef __cplusplus
     80 extern "C" {
     81 #endif
     82 
     83 extern void __mf_check (void *ptr, __mf_size_t sz, int type, const char *location)
     84        __attribute((nothrow));
     85 extern void __mf_register (void *ptr, __mf_size_t sz, int type, const char *name)
     86        __attribute((nothrow));
     87 extern void __mf_unregister (void *ptr, __mf_size_t sz, int type)
     88        __attribute((nothrow));
     89 extern unsigned __mf_watch (void *ptr, __mf_size_t sz);
     90 extern unsigned __mf_unwatch (void *ptr, __mf_size_t sz);
     91 extern void __mf_report ();
     92 extern int __mf_set_options (const char *opts);
     93 
     94 
     95 /* Redirect some standard library functions to libmudflap.  These are
     96    done by simple #define rather than linker wrapping, since only
     97    instrumented modules are meant to be affected.  */
     98 
     99 #ifdef _MUDFLAP
    100 #pragma redefine_extname memcpy __mfwrap_memcpy
    101 #pragma redefine_extname memmove __mfwrap_memmove
    102 #pragma redefine_extname memset __mfwrap_memset
    103 #pragma redefine_extname memcmp __mfwrap_memcmp
    104 #pragma redefine_extname memchr __mfwrap_memchr
    105 #pragma redefine_extname memrchr __mfwrap_memrchr
    106 #pragma redefine_extname strcpy __mfwrap_strcpy
    107 #pragma redefine_extname strncpy __mfwrap_strncpy
    108 #pragma redefine_extname strcat __mfwrap_strcat
    109 #pragma redefine_extname strncat __mfwrap_strncat
    110 #pragma redefine_extname strcmp __mfwrap_strcmp
    111 #pragma redefine_extname strcasecmp __mfwrap_strcasecmp
    112 #pragma redefine_extname strncmp __mfwrap_strncmp
    113 #pragma redefine_extname strncasecmp __mfwrap_strncasecmp
    114 #pragma redefine_extname strdup __mfwrap_strdup
    115 #pragma redefine_extname strndup __mfwrap_strndup
    116 #pragma redefine_extname strchr __mfwrap_strchr
    117 #pragma redefine_extname strrchr __mfwrap_strrchr
    118 #pragma redefine_extname strstr __mfwrap_strstr
    119 #pragma redefine_extname memmem __mfwrap_memmem
    120 #pragma redefine_extname strlen __mfwrap_strlen
    121 #pragma redefine_extname strnlen __mfwrap_strnlen
    122 #pragma redefine_extname bzero __mfwrap_bzero
    123 #pragma redefine_extname bcopy __mfwrap_bcopy
    124 #pragma redefine_extname bcmp __mfwrap_bcmp
    125 #pragma redefine_extname index __mfwrap_index
    126 #pragma redefine_extname rindex __mfwrap_rindex
    127 #pragma redefine_extname asctime __mfwrap_asctime
    128 #pragma redefine_extname ctime __mfwrap_ctime
    129 #pragma redefine_extname gmtime __mfwrap_gmtime
    130 #pragma redefine_extname localtime __mfwrap_localtime
    131 #pragma redefine_extname time __mfwrap_time
    132 #pragma redefine_extname strerror __mfwrap_strerror
    133 #pragma redefine_extname fopen __mfwrap_fopen
    134 #pragma redefine_extname fdopen __mfwrap_fdopen
    135 #pragma redefine_extname freopen __mfwrap_freopen
    136 #pragma redefine_extname fclose __mfwrap_fclose
    137 #pragma redefine_extname fread __mfwrap_fread
    138 #pragma redefine_extname fwrite __mfwrap_fwrite
    139 #pragma redefine_extname fgetc __mfwrap_fgetc
    140 #pragma redefine_extname fgets __mfwrap_fgets
    141 #pragma redefine_extname getc __mfwrap_getc
    142 #pragma redefine_extname gets __mfwrap_gets
    143 #pragma redefine_extname ungetc __mfwrap_ungetc
    144 #pragma redefine_extname fputc __mfwrap_fputc
    145 #pragma redefine_extname fputs __mfwrap_fputs
    146 #pragma redefine_extname putc __mfwrap_putc
    147 #pragma redefine_extname puts __mfwrap_puts
    148 #pragma redefine_extname clearerr __mfwrap_clearerr
    149 #pragma redefine_extname feof __mfwrap_feof
    150 #pragma redefine_extname ferror __mfwrap_ferror
    151 #pragma redefine_extname fileno __mfwrap_fileno
    152 #pragma redefine_extname printf __mfwrap_printf
    153 #pragma redefine_extname fprintf __mfwrap_fprintf
    154 #pragma redefine_extname sprintf __mfwrap_sprintf
    155 #pragma redefine_extname snprintf __mfwrap_snprintf
    156 #pragma redefine_extname vprintf __mfwrap_vprintf
    157 #pragma redefine_extname vfprintf __mfwrap_vfprintf
    158 #pragma redefine_extname vsprintf __mfwrap_vsprintf
    159 #pragma redefine_extname vsnprintf __mfwrap_vsnprintf
    160 #pragma redefine_extname access __mfwrap_access
    161 #pragma redefine_extname remove __mfwrap_remove
    162 #pragma redefine_extname fflush __mfwrap_fflush
    163 #pragma redefine_extname fseek __mfwrap_fseek
    164 #pragma redefine_extname ftell __mfwrap_ftell
    165 #pragma redefine_extname rewind __mfwrap_rewind
    166 #pragma redefine_extname fgetpos __mfwrap_fgetpos
    167 #pragma redefine_extname fsetpos __mfwrap_fsetpos
    168 #pragma redefine_extname stat __mfwrap_stat
    169 #pragma redefine_extname fstat __mfwrap_fstat
    170 #pragma redefine_extname lstat __mfwrap_lstat
    171 #pragma redefine_extname mkfifo __mfwrap_mkfifo
    172 #pragma redefine_extname setvbuf __mfwrap_setvbuf
    173 #pragma redefine_extname setbuf __mfwrap_setbuf
    174 #pragma redefine_extname setbuffer __mfwrap_setbuffer
    175 #pragma redefine_extname setlinebuf __mfwrap_setlinebuf
    176 #pragma redefine_extname opendir __mfwrap_opendir
    177 #pragma redefine_extname closedir __mfwrap_closedir
    178 #pragma redefine_extname readdir __mfwrap_readdir
    179 #pragma redefine_extname recv __mfwrap_recv
    180 #pragma redefine_extname recvfrom __mfwrap_recvfrom
    181 #pragma redefine_extname recvmsg __mfwrap_recvmsg
    182 #pragma redefine_extname send __mfwrap_send
    183 #pragma redefine_extname sendto __mfwrap_sendto
    184 #pragma redefine_extname sendmsg __mfwrap_sendmsg
    185 #pragma redefine_extname setsockopt __mfwrap_setsockopt
    186 #pragma redefine_extname getsockopt __mfwrap_getsockopt
    187 #pragma redefine_extname accept __mfwrap_accept
    188 #pragma redefine_extname bind __mfwrap_bind
    189 #pragma redefine_extname connect __mfwrap_connect
    190 #pragma redefine_extname gethostname __mfwrap_gethostname
    191 #pragma redefine_extname sethostname __mfwrap_sethostname
    192 #pragma redefine_extname gethostbyname __mfwrap_gethostbyname
    193 #pragma redefine_extname wait __mfwrap_wait
    194 #pragma redefine_extname waitpid __mfwrap_waitpid
    195 #pragma redefine_extname popen __mfwrap_popen
    196 #pragma redefine_extname pclose __mfwrap_pclose
    197 #pragma redefine_extname execve __mfwrap_execve
    198 #pragma redefine_extname execv __mfwrap_execv
    199 #pragma redefine_extname execvp __mfwrap_execvp
    200 #pragma redefine_extname system __mfwrap_system
    201 #pragma redefine_extname dlopen __mfwrap_dlopen
    202 #pragma redefine_extname dlerror __mfwrap_dlerror
    203 #pragma redefine_extname dlsym __mfwrap_dlsym
    204 #pragma redefine_extname dlclose __mfwrap_dlclose
    205 #pragma redefine_extname fopen64 __mfwrap_fopen64
    206 #pragma redefine_extname freopen64 __mfwrap_freopen64
    207 #pragma redefine_extname stat64 __mfwrap_stat64
    208 #pragma redefine_extname fseeko64 __mfwrap_fseeko64
    209 #pragma redefine_extname ftello64 __mfwrap_ftello64
    210 #pragma redefine_extname semop __mfwrap_semop
    211 #pragma redefine_extname semctl __mfwrap_semctl
    212 #pragma redefine_extname shmctl __mfwrap_shmctl
    213 #pragma redefine_extname shmat __mfwrap_shmat
    214 #pragma redefine_extname shmdt __mfwrap_shmdt
    215 #pragma redefine_extname __ctype_b_loc __mfwrap___ctype_b_loc
    216 #pragma redefine_extname __ctype_toupper_loc __mfwrap___ctype_toupper_loc
    217 #pragma redefine_extname __ctype_tolower_loc __mfwrap___ctype_tolower_loc
    218 #pragma redefine_extname getlogin __mfwrap_getlogin
    219 #pragma redefine_extname cuserid __mfwrap_cuserid
    220 #pragma redefine_extname getpwnam __mfwrap_getpwnam
    221 #pragma redefine_extname getpwuid __mfwrap_getpwuid
    222 #pragma redefine_extname getgrnam __mfwrap_getgrnam
    223 #pragma redefine_extname getgrgid __mfwrap_getgrgid
    224 #pragma redefine_extname getservent __mfwrap_getservent
    225 #pragma redefine_extname getservbyname __mfwrap_getservbyname
    226 #pragma redefine_extname getservbyport __mfwrap_getservbyport
    227 #pragma redefine_extname gai_strerror __mfwrap_gai_strerror
    228 #pragma redefine_extname getmntent __mfwrap_getmntent
    229 #pragma redefine_extname inet_ntoa __mfwrap_inet_ntoa
    230 #pragma redefine_extname getprotoent __mfwrap_getprotoent
    231 #pragma redefine_extname getprotobyname __mfwrap_getprotobyname
    232 #pragma redefine_extname getprotobynumber __mfwrap_getprotobynumber
    233 
    234 /* Disable glibc macros.  */
    235 #define __NO_STRING_INLINES
    236 
    237 #endif /* _MUDFLAP */
    238 
    239 
    240 #ifdef __cplusplus
    241 }
    242 #endif
    243 
    244 #endif /* MF_RUNTIME_H */
    245