1169695Skan/* Implementation header for mudflap runtime library.
2169695Skan   Mudflap: narrow-pointer bounds-checking by tree rewriting.
3169695Skan   Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4169695Skan   Contributed by Frank Ch. Eigler <fche@redhat.com>
5169695Skan   and Graydon Hoare <graydon@redhat.com>
6169695Skan
7169695SkanThis file is part of GCC.
8169695Skan
9169695SkanGCC is free software; you can redistribute it and/or modify it under
10169695Skanthe terms of the GNU General Public License as published by the Free
11169695SkanSoftware Foundation; either version 2, or (at your option) any later
12169695Skanversion.
13169695Skan
14169695SkanIn addition to the permissions in the GNU General Public License, the
15169695SkanFree Software Foundation gives you unlimited permission to link the
16169695Skancompiled version of this file into combinations with other programs,
17169695Skanand to distribute those combinations without any restriction coming
18169695Skanfrom the use of this file.  (The General Public License restrictions
19169695Skando apply in other respects; for example, they cover modification of
20169695Skanthe file, and distribution when not linked into a combine
21169695Skanexecutable.)
22169695Skan
23169695SkanGCC is distributed in the hope that it will be useful, but WITHOUT ANY
24169695SkanWARRANTY; without even the implied warranty of MERCHANTABILITY or
25169695SkanFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
26169695Skanfor more details.
27169695Skan
28169695SkanYou should have received a copy of the GNU General Public License
29169695Skanalong with GCC; see the file COPYING.  If not, write to the Free
30169695SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
31169695Skan02110-1301, USA.  */
32169695Skan
33169695Skan/* Public libmudflap declarations -*- C -*- */
34169695Skan
35169695Skan#ifndef MF_RUNTIME_H
36169695Skan#define MF_RUNTIME_H
37169695Skan
38169695Skantypedef void *__mf_ptr_t;
39169695Skantypedef unsigned int __mf_uintptr_t __attribute__ ((__mode__ (__pointer__)));
40169695Skantypedef __SIZE_TYPE__ __mf_size_t;
41169695Skan
42169695Skan/* Global declarations used by instrumentation.  When _MUDFLAP is
43169695Skan   defined, these have been auto-declared by the compiler and we
44169695Skan   should not declare them again (ideally we *would* declare them
45169695Skan   again, to verify that the compiler's declarations match the
46169695Skan   library's, but the C++ front end has no mechanism for allowing
47169695Skan   the re-definition of a structure type).  */
48169695Skan#ifndef _MUDFLAP
49169695Skanstruct __mf_cache { __mf_uintptr_t low; __mf_uintptr_t high; };
50169695Skanextern struct __mf_cache __mf_lookup_cache [];
51169695Skanextern __mf_uintptr_t __mf_lc_mask;
52169695Skanextern unsigned char __mf_lc_shift;
53169695Skan#endif
54169695Skan
55169695Skan/* Multithreading support.  */
56169695Skan#ifdef _MUDFLAPTH
57169695Skan/* extern pthread_mutex_t __mf_biglock; */
58169695Skan#ifndef _REENTRANT
59169695Skan#define _REENTRANT
60169695Skan#endif
61169695Skan#ifndef _THREAD_SAFE
62169695Skan#define _THREAD_SAFE
63169695Skan#endif
64169695Skan#endif
65169695Skan
66169695Skan/* Codes to describe the type of access to check: __mf_check arg 3 */
67169695Skan
68169695Skan#define __MF_CHECK_READ 0
69169695Skan#define __MF_CHECK_WRITE 1
70169695Skan
71169695Skan
72169695Skan/* Codes to describe a region of memory being registered: __mf_*register arg 3 */
73169695Skan
74169695Skan#define __MF_TYPE_NOACCESS 0
75169695Skan#define __MF_TYPE_HEAP 1
76169695Skan#define __MF_TYPE_HEAP_I 2
77169695Skan#define __MF_TYPE_STACK 3
78169695Skan#define __MF_TYPE_STATIC 4
79169695Skan#define __MF_TYPE_GUESS 5
80169695Skan
81169695Skan
82169695Skan/* The public mudflap API */
83169695Skan
84169695Skan#ifdef __cplusplus
85169695Skanextern "C" {
86169695Skan#endif
87169695Skan
88169695Skanextern void __mf_check (void *ptr, __mf_size_t sz, int type, const char *location)
89169695Skan       __attribute((nothrow));
90169695Skanextern void __mf_register (void *ptr, __mf_size_t sz, int type, const char *name)
91169695Skan       __attribute((nothrow));
92169695Skanextern void __mf_unregister (void *ptr, __mf_size_t sz, int type)
93169695Skan       __attribute((nothrow));
94169695Skanextern unsigned __mf_watch (void *ptr, __mf_size_t sz);
95169695Skanextern unsigned __mf_unwatch (void *ptr, __mf_size_t sz);
96169695Skanextern void __mf_report ();
97169695Skanextern int __mf_set_options (const char *opts);
98169695Skan
99169695Skan
100169695Skan/* Redirect some standard library functions to libmudflap.  These are
101169695Skan   done by simple #define rather than linker wrapping, since only
102169695Skan   instrumented modules are meant to be affected.  */
103169695Skan
104169695Skan#ifdef _MUDFLAP
105169695Skan#pragma redefine_extname memcpy __mfwrap_memcpy
106169695Skan#pragma redefine_extname memmove __mfwrap_memmove
107169695Skan#pragma redefine_extname memset __mfwrap_memset
108169695Skan#pragma redefine_extname memcmp __mfwrap_memcmp
109169695Skan#pragma redefine_extname memchr __mfwrap_memchr
110169695Skan#pragma redefine_extname memrchr __mfwrap_memrchr
111169695Skan#pragma redefine_extname strcpy __mfwrap_strcpy
112169695Skan#pragma redefine_extname strncpy __mfwrap_strncpy
113169695Skan#pragma redefine_extname strcat __mfwrap_strcat
114169695Skan#pragma redefine_extname strncat __mfwrap_strncat
115169695Skan#pragma redefine_extname strcmp __mfwrap_strcmp
116169695Skan#pragma redefine_extname strcasecmp __mfwrap_strcasecmp
117169695Skan#pragma redefine_extname strncmp __mfwrap_strncmp
118169695Skan#pragma redefine_extname strncasecmp __mfwrap_strncasecmp
119169695Skan#pragma redefine_extname strdup __mfwrap_strdup
120169695Skan#pragma redefine_extname strndup __mfwrap_strndup
121169695Skan#pragma redefine_extname strchr __mfwrap_strchr
122169695Skan#pragma redefine_extname strrchr __mfwrap_strrchr
123169695Skan#pragma redefine_extname strstr __mfwrap_strstr
124169695Skan#pragma redefine_extname memmem __mfwrap_memmem
125169695Skan#pragma redefine_extname strlen __mfwrap_strlen
126169695Skan#pragma redefine_extname strnlen __mfwrap_strnlen
127169695Skan#pragma redefine_extname bzero __mfwrap_bzero
128169695Skan#pragma redefine_extname bcopy __mfwrap_bcopy
129169695Skan#pragma redefine_extname bcmp __mfwrap_bcmp
130169695Skan#pragma redefine_extname index __mfwrap_index
131169695Skan#pragma redefine_extname rindex __mfwrap_rindex
132169695Skan#pragma redefine_extname asctime __mfwrap_asctime
133169695Skan#pragma redefine_extname ctime __mfwrap_ctime
134169695Skan#pragma redefine_extname gmtime __mfwrap_gmtime
135169695Skan#pragma redefine_extname localtime __mfwrap_localtime
136169695Skan#pragma redefine_extname time __mfwrap_time
137169695Skan#pragma redefine_extname strerror __mfwrap_strerror
138169695Skan#pragma redefine_extname fopen __mfwrap_fopen
139169695Skan#pragma redefine_extname fdopen __mfwrap_fdopen
140169695Skan#pragma redefine_extname freopen __mfwrap_freopen
141169695Skan#pragma redefine_extname fclose __mfwrap_fclose
142169695Skan#pragma redefine_extname fread __mfwrap_fread
143169695Skan#pragma redefine_extname fwrite __mfwrap_fwrite
144169695Skan#pragma redefine_extname fgetc __mfwrap_fgetc
145169695Skan#pragma redefine_extname fgets __mfwrap_fgets
146169695Skan#pragma redefine_extname getc __mfwrap_getc
147169695Skan#pragma redefine_extname gets __mfwrap_gets
148169695Skan#pragma redefine_extname ungetc __mfwrap_ungetc
149169695Skan#pragma redefine_extname fputc __mfwrap_fputc
150169695Skan#pragma redefine_extname fputs __mfwrap_fputs
151169695Skan#pragma redefine_extname putc __mfwrap_putc
152169695Skan#pragma redefine_extname puts __mfwrap_puts
153169695Skan#pragma redefine_extname clearerr __mfwrap_clearerr
154169695Skan#pragma redefine_extname feof __mfwrap_feof
155169695Skan#pragma redefine_extname ferror __mfwrap_ferror
156169695Skan#pragma redefine_extname fileno __mfwrap_fileno
157169695Skan#pragma redefine_extname printf __mfwrap_printf
158169695Skan#pragma redefine_extname fprintf __mfwrap_fprintf
159169695Skan#pragma redefine_extname sprintf __mfwrap_sprintf
160169695Skan#pragma redefine_extname snprintf __mfwrap_snprintf
161169695Skan#pragma redefine_extname vprintf __mfwrap_vprintf
162169695Skan#pragma redefine_extname vfprintf __mfwrap_vfprintf
163169695Skan#pragma redefine_extname vsprintf __mfwrap_vsprintf
164169695Skan#pragma redefine_extname vsnprintf __mfwrap_vsnprintf
165169695Skan#pragma redefine_extname access __mfwrap_access
166169695Skan#pragma redefine_extname remove __mfwrap_remove
167169695Skan#pragma redefine_extname fflush __mfwrap_fflush
168169695Skan#pragma redefine_extname fseek __mfwrap_fseek
169169695Skan#pragma redefine_extname ftell __mfwrap_ftell
170169695Skan#pragma redefine_extname rewind __mfwrap_rewind
171169695Skan#pragma redefine_extname fgetpos __mfwrap_fgetpos
172169695Skan#pragma redefine_extname fsetpos __mfwrap_fsetpos
173169695Skan#pragma redefine_extname stat __mfwrap_stat
174169695Skan#pragma redefine_extname fstat __mfwrap_fstat
175169695Skan#pragma redefine_extname lstat __mfwrap_lstat
176169695Skan#pragma redefine_extname mkfifo __mfwrap_mkfifo
177169695Skan#pragma redefine_extname setvbuf __mfwrap_setvbuf
178169695Skan#pragma redefine_extname setbuf __mfwrap_setbuf
179169695Skan#pragma redefine_extname setbuffer __mfwrap_setbuffer
180169695Skan#pragma redefine_extname setlinebuf __mfwrap_setlinebuf
181169695Skan#pragma redefine_extname opendir __mfwrap_opendir
182169695Skan#pragma redefine_extname closedir __mfwrap_closedir
183169695Skan#pragma redefine_extname readdir __mfwrap_readdir
184169695Skan#pragma redefine_extname recv __mfwrap_recv
185169695Skan#pragma redefine_extname recvfrom __mfwrap_recvfrom
186169695Skan#pragma redefine_extname recvmsg __mfwrap_recvmsg
187169695Skan#pragma redefine_extname send __mfwrap_send
188169695Skan#pragma redefine_extname sendto __mfwrap_sendto
189169695Skan#pragma redefine_extname sendmsg __mfwrap_sendmsg
190169695Skan#pragma redefine_extname setsockopt __mfwrap_setsockopt
191169695Skan#pragma redefine_extname getsockopt __mfwrap_getsockopt
192169695Skan#pragma redefine_extname accept __mfwrap_accept
193169695Skan#pragma redefine_extname bind __mfwrap_bind
194169695Skan#pragma redefine_extname connect __mfwrap_connect
195169695Skan#pragma redefine_extname gethostname __mfwrap_gethostname
196169695Skan#pragma redefine_extname sethostname __mfwrap_sethostname
197169695Skan#pragma redefine_extname gethostbyname __mfwrap_gethostbyname
198169695Skan#pragma redefine_extname wait __mfwrap_wait
199169695Skan#pragma redefine_extname waitpid __mfwrap_waitpid
200169695Skan#pragma redefine_extname popen __mfwrap_popen
201169695Skan#pragma redefine_extname pclose __mfwrap_pclose
202169695Skan#pragma redefine_extname execve __mfwrap_execve
203169695Skan#pragma redefine_extname execv __mfwrap_execv
204169695Skan#pragma redefine_extname execvp __mfwrap_execvp
205169695Skan#pragma redefine_extname system __mfwrap_system
206169695Skan#pragma redefine_extname dlopen __mfwrap_dlopen
207169695Skan#pragma redefine_extname dlerror __mfwrap_dlerror
208169695Skan#pragma redefine_extname dlsym __mfwrap_dlsym
209169695Skan#pragma redefine_extname dlclose __mfwrap_dlclose
210169695Skan#pragma redefine_extname fopen64 __mfwrap_fopen64
211169695Skan#pragma redefine_extname freopen64 __mfwrap_freopen64
212169695Skan#pragma redefine_extname stat64 __mfwrap_stat64
213169695Skan#pragma redefine_extname fseeko64 __mfwrap_fseeko64
214169695Skan#pragma redefine_extname ftello64 __mfwrap_ftello64
215169695Skan#pragma redefine_extname semop __mfwrap_semop
216169695Skan#pragma redefine_extname semctl __mfwrap_semctl
217169695Skan#pragma redefine_extname shmctl __mfwrap_shmctl
218169695Skan#pragma redefine_extname shmat __mfwrap_shmat
219169695Skan#pragma redefine_extname shmdt __mfwrap_shmdt
220169695Skan#pragma redefine_extname __ctype_b_loc __mfwrap___ctype_b_loc
221169695Skan#pragma redefine_extname __ctype_toupper_loc __mfwrap___ctype_toupper_loc
222169695Skan#pragma redefine_extname __ctype_tolower_loc __mfwrap___ctype_tolower_loc
223169695Skan#pragma redefine_extname getlogin __mfwrap_getlogin
224169695Skan#pragma redefine_extname cuserid __mfwrap_cuserid
225169695Skan#pragma redefine_extname getpwnam __mfwrap_getpwnam
226169695Skan#pragma redefine_extname getpwuid __mfwrap_getpwuid
227169695Skan#pragma redefine_extname getgrnam __mfwrap_getgrnam
228169695Skan#pragma redefine_extname getgrgid __mfwrap_getgrgid
229169695Skan#pragma redefine_extname getservent __mfwrap_getservent
230169695Skan#pragma redefine_extname getservbyname __mfwrap_getservbyname
231169695Skan#pragma redefine_extname getservbyport __mfwrap_getservbyport
232169695Skan#pragma redefine_extname gai_strerror __mfwrap_gai_strerror
233169695Skan#pragma redefine_extname getmntent __mfwrap_getmntent
234169695Skan#pragma redefine_extname inet_ntoa __mfwrap_inet_ntoa
235169695Skan#pragma redefine_extname getprotoent __mfwrap_getprotoent
236169695Skan#pragma redefine_extname getprotobyname __mfwrap_getprotobyname
237169695Skan#pragma redefine_extname getprotobynumber __mfwrap_getprotobynumber
238169695Skan
239169695Skan/* Disable glibc macros.  */
240169695Skan#define __NO_STRING_INLINES
241169695Skan
242169695Skan#endif /* _MUDFLAP */
243169695Skan
244169695Skan
245169695Skan#ifdef __cplusplus
246169695Skan}
247169695Skan#endif
248169695Skan
249169695Skan#endif /* MF_RUNTIME_H */
250