blob: 4c06628970b76580d74ffa7edb820b95c24354d1 [file] [log] [blame]
sewardjb5f6f512005-03-10 23:59:00 +00001/* -*- c -*-
njn25e49d8e72002-09-23 09:36:25 +00002 ----------------------------------------------------------------
3
4 Notice that the following BSD-style license applies to this one
5 file (valgrind.h) only. The entire rest of Valgrind is licensed
6 under the terms of the GNU General Public License, version 2. See
7 the COPYING file in the source distribution for details.
8
9 ----------------------------------------------------------------
10
njnb9c427c2004-12-01 14:14:42 +000011 This file is part of Valgrind, a dynamic binary instrumentation
12 framework.
sewardjde4a1d02002-03-22 01:27:54 +000013
njn53612422005-03-12 16:22:54 +000014 Copyright (C) 2000-2005 Julian Seward. All rights reserved.
sewardjde4a1d02002-03-22 01:27:54 +000015
njn25e49d8e72002-09-23 09:36:25 +000016 Redistribution and use in source and binary forms, with or without
17 modification, are permitted provided that the following conditions
18 are met:
sewardjde4a1d02002-03-22 01:27:54 +000019
njn25e49d8e72002-09-23 09:36:25 +000020 1. Redistributions of source code must retain the above copyright
21 notice, this list of conditions and the following disclaimer.
sewardjde4a1d02002-03-22 01:27:54 +000022
njn25e49d8e72002-09-23 09:36:25 +000023 2. The origin of this software must not be misrepresented; you must
24 not claim that you wrote the original software. If you use this
25 software in a product, an acknowledgment in the product
26 documentation would be appreciated but is not required.
sewardjde4a1d02002-03-22 01:27:54 +000027
njn25e49d8e72002-09-23 09:36:25 +000028 3. Altered source versions must be plainly marked as such, and must
29 not be misrepresented as being the original software.
30
31 4. The name of the author may not be used to endorse or promote
32 products derived from this software without specific prior written
33 permission.
34
35 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
36 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
37 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
38 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
39 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
40 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
41 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
42 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
43 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
44 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
45 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46
47 ----------------------------------------------------------------
48
49 Notice that the above BSD-style license applies to this one file
50 (valgrind.h) only. The entire rest of Valgrind is licensed under
51 the terms of the GNU General Public License, version 2. See the
52 COPYING file in the source distribution for details.
53
54 ----------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +000055*/
56
57
njn30d76c62005-06-18 15:07:39 +000058/* This file is for inclusion into client (your!) code.
59
60 You can use these macros to manipulate and query Valgrind's
61 execution inside your own programs.
62
63 The resulting executables will still run without Valgrind, just a
64 little bit more slowly than they otherwise would, but otherwise
65 unchanged. When not running on valgrind, each client request
66 consumes very few (eg. < 10) instructions, so the resulting performance
67 loss is negligible unless you plan to execute client requests
68 millions of times per second. Nevertheless, if that is still a
69 problem, you can compile with the NVALGRIND symbol defined (gcc
70 -DNVALGRIND) so that client requests are not even compiled in. */
71
sewardjde4a1d02002-03-22 01:27:54 +000072#ifndef __VALGRIND_H
73#define __VALGRIND_H
74
fitzhardinge39de4b42003-10-31 07:12:21 +000075#include <stdarg.h>
76
njn3dd0a912005-06-28 19:44:10 +000077/* Nb: this file might be included in a file compiled with -ansi. So
78 we can't use C++ style "//" comments nor the "asm" keyword (instead
79 use "__asm__"). */
80
sewardjb5f6f512005-03-10 23:59:00 +000081/* If we're not compiling for our target architecture, don't generate
njn26aba4d2005-05-16 13:31:23 +000082 any inline asms. Note that in this file we're using the compiler's
83 CPP symbols for identifying architectures, which are different to
84 the ones we use within the rest of Valgrind. */
cerion85665ca2005-06-20 15:51:07 +000085#if !defined(__i386__) && !defined(__x86_64__) && !defined(__powerpc__)
sewardjb5f6f512005-03-10 23:59:00 +000086# ifndef NVALGRIND
87# define NVALGRIND 1
88# endif /* NVALGRIND */
89#endif
90
njn30d76c62005-06-18 15:07:39 +000091/* ------------------------------------------------------------------ */
92/* The architecture-specific part */
93/* ------------------------------------------------------------------ */
sewardjde4a1d02002-03-22 01:27:54 +000094
njn26aba4d2005-05-16 13:31:23 +000095#ifdef NVALGRIND
96
97/* Define NVALGRIND to completely remove the Valgrind magic sequence
98 from the compiled code (analogous to NDEBUG's effects on assert()) */
99#define VALGRIND_MAGIC_SEQUENCE( \
100 _zzq_rlval, _zzq_default, _zzq_request, \
101 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
102 { \
103 (_zzq_rlval) = (_zzq_default); \
104 }
105
106#else /* NVALGRIND */
nethercotee90c6832004-10-18 18:07:49 +0000107
nethercote54265442004-10-26 12:56:58 +0000108/* The following defines the magic code sequences which the JITter spots and
109 handles magically. Don't look too closely at them; they will rot
nethercotee90c6832004-10-18 18:07:49 +0000110 your brain. We must ensure that the default value gets put in the return
111 slot, so that everything works when this is executed not under Valgrind.
112 Args are passed in a memory block, and so there's no intrinsic limit to
113 the number that could be passed, but it's currently four.
114
nethercote54265442004-10-26 12:56:58 +0000115 The macro args are:
116 _zzq_rlval result lvalue
117 _zzq_default default value (result returned when running on real CPU)
118 _zzq_request request code
119 _zzq_arg1..4 request params
120
nethercotee90c6832004-10-18 18:07:49 +0000121 Nb: we put the assembly code sequences for all architectures in this one
njn26aba4d2005-05-16 13:31:23 +0000122 file. This is because this file must be stand-alone, and we don't want
123 to have multiple files.
nethercotee90c6832004-10-18 18:07:49 +0000124*/
125
njn26aba4d2005-05-16 13:31:23 +0000126#ifdef __x86_64__
sewardjde4a4ab2005-03-23 13:10:32 +0000127extern int printf (__const char *__restrict __format, ...);
128extern void exit (int __status);
129#define VALGRIND_MAGIC_SEQUENCE( \
130 _zzq_rlval, _zzq_default, _zzq_request, \
131 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
132 \
133 { volatile unsigned long long _zzq_args[5]; \
134 _zzq_args[0] = (volatile unsigned long long)(_zzq_request); \
135 _zzq_args[1] = (volatile unsigned long long)(_zzq_arg1); \
136 _zzq_args[2] = (volatile unsigned long long)(_zzq_arg2); \
137 _zzq_args[3] = (volatile unsigned long long)(_zzq_arg3); \
138 _zzq_args[4] = (volatile unsigned long long)(_zzq_arg4); \
njn3dd0a912005-06-28 19:44:10 +0000139 __asm__ volatile("roll $29, %%eax ; roll $3, %%eax\n\t" \
140 "rorl $27, %%eax ; rorl $5, %%eax\n\t" \
141 "roll $13, %%eax ; roll $19, %%eax" \
142 : "=d" (_zzq_rlval) \
143 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
144 : "cc", "memory" \
145 ); \
sewardjde4a4ab2005-03-23 13:10:32 +0000146 }
njn3dd0a912005-06-28 19:44:10 +0000147#endif /* __x86_64__ */
sewardjde4a4ab2005-03-23 13:10:32 +0000148
149#ifdef __i386__
150#define VALGRIND_MAGIC_SEQUENCE( \
151 _zzq_rlval, _zzq_default, _zzq_request, \
152 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
153 \
154 { unsigned int _zzq_args[5]; \
155 _zzq_args[0] = (unsigned int)(_zzq_request); \
156 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
157 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
158 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
159 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
njn3dd0a912005-06-28 19:44:10 +0000160 __asm__ volatile("roll $29, %%eax ; roll $3, %%eax\n\t" \
161 "rorl $27, %%eax ; rorl $5, %%eax\n\t" \
162 "roll $13, %%eax ; roll $19, %%eax" \
163 : "=d" (_zzq_rlval) \
164 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
165 : "cc", "memory" \
166 ); \
sewardjde4a4ab2005-03-23 13:10:32 +0000167 }
njn3dd0a912005-06-28 19:44:10 +0000168#endif /* __i386__ */
sewardjde4a4ab2005-03-23 13:10:32 +0000169
njnc6168192004-11-29 13:54:10 +0000170#ifdef __arm__
njn3dd0a912005-06-28 19:44:10 +0000171/* XXX: temporary, until MAGIC_SEQUENCE is written properly */
njnc6168192004-11-29 13:54:10 +0000172extern int printf (__const char *__restrict __format, ...);
173extern void exit (int __status);
174#define VALGRIND_MAGIC_SEQUENCE( \
175 _zzq_rlval, _zzq_default, _zzq_request, \
176 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
177 \
178 { volatile unsigned int _zzq_args[5]; \
179 _zzq_args[0] = (volatile unsigned int)(_zzq_request); \
180 _zzq_args[1] = (volatile unsigned int)(_zzq_arg1); \
181 _zzq_args[2] = (volatile unsigned int)(_zzq_arg2); \
182 _zzq_args[3] = (volatile unsigned int)(_zzq_arg3); \
183 _zzq_args[4] = (volatile unsigned int)(_zzq_arg4); \
184 (_zzq_rlval) = (_zzq_default);/* temporary only */ \
185 printf("argh: MAGIC_SEQUENCE"); exit(1); \
njn3dd0a912005-06-28 19:44:10 +0000186 __asm__ volatile(""); \
njnc6168192004-11-29 13:54:10 +0000187 }
njn3dd0a912005-06-28 19:44:10 +0000188/* XXX: make sure that the register holding the args and the register taking
189 * the return value match what the scheduler is expecting. */
190#endif /* __arm__ */
nethercotee90c6832004-10-18 18:07:49 +0000191
cerion85665ca2005-06-20 15:51:07 +0000192#ifdef __powerpc__
193#define VALGRIND_MAGIC_SEQUENCE( \
194 _zzq_rlval, _zzq_default, _zzq_request, \
195 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
196 \
197 { volatile unsigned int _zzq_args[5]; \
198 register unsigned int _zzq_tmp __asm__("r3"); \
199 register volatile unsigned int *_zzq_ptr __asm__("r4"); \
200 _zzq_args[0] = (volatile unsigned int)(_zzq_request); \
201 _zzq_args[1] = (volatile unsigned int)(_zzq_arg1); \
202 _zzq_args[2] = (volatile unsigned int)(_zzq_arg2); \
203 _zzq_args[3] = (volatile unsigned int)(_zzq_arg3); \
204 _zzq_args[4] = (volatile unsigned int)(_zzq_arg4); \
205 _zzq_ptr = _zzq_args; \
njn3dd0a912005-06-28 19:44:10 +0000206 __asm__ volatile("tw 0,3,27\n\t" \
207 "rlwinm 0,0,29,0,0\n\t" \
208 "rlwinm 0,0,3,0,0\n\t" \
209 "rlwinm 0,0,13,0,0\n\t" \
210 "rlwinm 0,0,19,0,0\n\t" \
211 "nop\n\t" \
212 : "=r" (_zzq_tmp) \
213 : "0" (_zzq_default), "r" (_zzq_ptr) \
214 : "memory"); \
cerion85665ca2005-06-20 15:51:07 +0000215 _zzq_rlval = (__typeof__(_zzq_rlval)) _zzq_tmp; \
216 }
njn3dd0a912005-06-28 19:44:10 +0000217#endif /* __powerpc__ */
cerion85665ca2005-06-20 15:51:07 +0000218
njn3dd0a912005-06-28 19:44:10 +0000219/* Insert assembly code for other architectures here... */
njn26aba4d2005-05-16 13:31:23 +0000220
sewardj37091fb2002-11-16 11:06:50 +0000221#endif /* NVALGRIND */
sewardj2e93c502002-04-12 11:12:52 +0000222
nethercote69d9c462004-10-26 13:00:12 +0000223
njn30d76c62005-06-18 15:07:39 +0000224/* ------------------------------------------------------------------ */
225/* The architecture-independent part */
226/* ------------------------------------------------------------------ */
227
sewardj2e93c502002-04-12 11:12:52 +0000228/* Some request codes. There are many more of these, but most are not
229 exposed to end-user view. These are the public ones, all of the
njn25e49d8e72002-09-23 09:36:25 +0000230 form 0x1000 + small_number.
njnd7994182003-10-02 13:44:04 +0000231
232 Core ones are in the range 0x00000000--0x0000ffff. The non-public ones
233 start at 0x2000.
sewardj2e93c502002-04-12 11:12:52 +0000234*/
235
njn3dd0a912005-06-28 19:44:10 +0000236/* These macros are used by tools -- they must be public, but don't embed them
237 * into other programs. */
njnfc26ff92004-11-22 19:12:49 +0000238#define VG_USERREQ_TOOL_BASE(a,b) \
njn4c791212003-05-02 17:53:54 +0000239 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
njnfc26ff92004-11-22 19:12:49 +0000240#define VG_IS_TOOL_USERREQ(a, b, v) \
241 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
sewardj34042512002-10-22 04:14:35 +0000242
njn25e49d8e72002-09-23 09:36:25 +0000243typedef
njn4c791212003-05-02 17:53:54 +0000244 enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001,
245 VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
njn3e884182003-04-15 13:03:23 +0000246
njnd4795be2004-11-24 11:57:51 +0000247 /* These allow any function to be called from the
248 simulated CPU but run on the real CPU.
249 Nb: the first arg passed to the function is always the ThreadId of
250 the running thread! So CLIENT_CALL0 actually requires a 1 arg
251 function, etc. */
njn4c791212003-05-02 17:53:54 +0000252 VG_USERREQ__CLIENT_CALL0 = 0x1101,
253 VG_USERREQ__CLIENT_CALL1 = 0x1102,
254 VG_USERREQ__CLIENT_CALL2 = 0x1103,
255 VG_USERREQ__CLIENT_CALL3 = 0x1104,
njn3e884182003-04-15 13:03:23 +0000256
njn47363ab2003-04-21 13:24:40 +0000257 /* Can be useful in regression testing suites -- eg. can send
258 Valgrind's output to /dev/null and still count errors. */
njn4c791212003-05-02 17:53:54 +0000259 VG_USERREQ__COUNT_ERRORS = 0x1201,
njn47363ab2003-04-21 13:24:40 +0000260
nethercote7cc9c232004-01-21 15:08:04 +0000261 /* These are useful and can be interpreted by any tool that tracks
njnd7994182003-10-02 13:44:04 +0000262 malloc() et al, by using vg_replace_malloc.c. */
263 VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
264 VG_USERREQ__FREELIKE_BLOCK = 0x1302,
rjwalshbc0bb832004-06-19 18:12:36 +0000265 /* Memory pool support. */
266 VG_USERREQ__CREATE_MEMPOOL = 0x1303,
267 VG_USERREQ__DESTROY_MEMPOOL = 0x1304,
268 VG_USERREQ__MEMPOOL_ALLOC = 0x1305,
269 VG_USERREQ__MEMPOOL_FREE = 0x1306,
njnd7994182003-10-02 13:44:04 +0000270
fitzhardinge39de4b42003-10-31 07:12:21 +0000271 /* Allow printfs to valgrind log. */
njn30d76c62005-06-18 15:07:39 +0000272 VG_USERREQ__PRINTF = 0x1401,
rjwalsh0140af52005-06-04 20:42:33 +0000273 VG_USERREQ__PRINTF_BACKTRACE = 0x1402,
274
275 /* Stack support. */
276 VG_USERREQ__STACK_REGISTER = 0x1501,
277 VG_USERREQ__STACK_DEREGISTER = 0x1502,
278 VG_USERREQ__STACK_CHANGE = 0x1503,
njn25e49d8e72002-09-23 09:36:25 +0000279 } Vg_ClientRequest;
sewardj2e93c502002-04-12 11:12:52 +0000280
muellerc9b36552003-12-31 14:32:23 +0000281#ifndef __GNUC__
282#define __extension__
283#endif
sewardj2e93c502002-04-12 11:12:52 +0000284
njnf09745a2005-05-10 03:01:23 +0000285/* Returns the number of Valgrinds this code is running under. That is,
286 0 if running natively, 1 if running under Valgrind, 2 if running under
287 Valgrind which is running under another Valgrind, etc. */
muellerc9b36552003-12-31 14:32:23 +0000288#define RUNNING_ON_VALGRIND __extension__ \
sewardj2e93c502002-04-12 11:12:52 +0000289 ({unsigned int _qzz_res; \
290 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0 /* returned if not */, \
291 VG_USERREQ__RUNNING_ON_VALGRIND, \
292 0, 0, 0, 0); \
293 _qzz_res; \
sewardjde4a1d02002-03-22 01:27:54 +0000294 })
295
296
sewardj18d75132002-05-16 11:06:21 +0000297/* Discard translation of code in the range [_qzz_addr .. _qzz_addr +
298 _qzz_len - 1]. Useful if you are debugging a JITter or some such,
299 since it provides a way to make sure valgrind will retranslate the
300 invalidated area. Returns no value. */
301#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
302 {unsigned int _qzz_res; \
303 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
304 VG_USERREQ__DISCARD_TRANSLATIONS, \
305 _qzz_addr, _qzz_len, 0, 0); \
306 }
307
njn26aba4d2005-05-16 13:31:23 +0000308#ifdef NVALGRIND
309
310#define VALGRIND_PRINTF(...)
311#define VALGRIND_PRINTF_BACKTRACE(...)
312
313#else /* NVALGRIND */
fitzhardinge39de4b42003-10-31 07:12:21 +0000314
fitzhardingea09a1b52003-11-07 23:09:48 +0000315int VALGRIND_PRINTF(const char *format, ...)
316 __attribute__((format(__printf__, 1, 2)));
fitzhardinge39de4b42003-10-31 07:12:21 +0000317__attribute__((weak))
318int
fitzhardingea09a1b52003-11-07 23:09:48 +0000319VALGRIND_PRINTF(const char *format, ...)
fitzhardinge39de4b42003-10-31 07:12:21 +0000320{
njnc6168192004-11-29 13:54:10 +0000321 unsigned long _qzz_res;
fitzhardinge39de4b42003-10-31 07:12:21 +0000322 va_list vargs;
323 va_start(vargs, format);
324 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, VG_USERREQ__PRINTF,
njnc6168192004-11-29 13:54:10 +0000325 (unsigned long)format, (unsigned long)vargs, 0, 0);
fitzhardinge39de4b42003-10-31 07:12:21 +0000326 va_end(vargs);
njnc6168192004-11-29 13:54:10 +0000327 return (int)_qzz_res;
fitzhardinge39de4b42003-10-31 07:12:21 +0000328}
329
fitzhardingea09a1b52003-11-07 23:09:48 +0000330int VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
331 __attribute__((format(__printf__, 1, 2)));
fitzhardinge39de4b42003-10-31 07:12:21 +0000332__attribute__((weak))
333int
fitzhardingea09a1b52003-11-07 23:09:48 +0000334VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
fitzhardinge39de4b42003-10-31 07:12:21 +0000335{
njnc6168192004-11-29 13:54:10 +0000336 unsigned long _qzz_res;
fitzhardinge39de4b42003-10-31 07:12:21 +0000337 va_list vargs;
338 va_start(vargs, format);
339 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, VG_USERREQ__PRINTF_BACKTRACE,
njnc6168192004-11-29 13:54:10 +0000340 (unsigned long)format, (unsigned long)vargs, 0, 0);
fitzhardinge39de4b42003-10-31 07:12:21 +0000341 va_end(vargs);
njnc6168192004-11-29 13:54:10 +0000342 return (int)_qzz_res;
fitzhardinge39de4b42003-10-31 07:12:21 +0000343}
344
fitzhardinge39de4b42003-10-31 07:12:21 +0000345#endif /* NVALGRIND */
sewardj18d75132002-05-16 11:06:21 +0000346
njn3e884182003-04-15 13:03:23 +0000347/* These requests allow control to move from the simulated CPU to the
348 real CPU, calling an arbitary function */
njn057c65f2003-04-21 13:30:55 +0000349#define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
njnc6168192004-11-29 13:54:10 +0000350 ({unsigned long _qyy_res; \
njn3e884182003-04-15 13:03:23 +0000351 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
352 VG_USERREQ__CLIENT_CALL0, \
353 _qyy_fn, \
354 0, 0, 0); \
355 _qyy_res; \
356 })
357
njn057c65f2003-04-21 13:30:55 +0000358#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
njnc6168192004-11-29 13:54:10 +0000359 ({unsigned long _qyy_res; \
njn3e884182003-04-15 13:03:23 +0000360 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
361 VG_USERREQ__CLIENT_CALL1, \
362 _qyy_fn, \
363 _qyy_arg1, 0, 0); \
364 _qyy_res; \
365 })
366
njn057c65f2003-04-21 13:30:55 +0000367#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
njnc6168192004-11-29 13:54:10 +0000368 ({unsigned long _qyy_res; \
njn3e884182003-04-15 13:03:23 +0000369 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
370 VG_USERREQ__CLIENT_CALL2, \
371 _qyy_fn, \
372 _qyy_arg1, _qyy_arg2, 0); \
373 _qyy_res; \
374 })
375
njn057c65f2003-04-21 13:30:55 +0000376#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
njnc6168192004-11-29 13:54:10 +0000377 ({unsigned long _qyy_res; \
njn3e884182003-04-15 13:03:23 +0000378 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
379 VG_USERREQ__CLIENT_CALL3, \
380 _qyy_fn, \
381 _qyy_arg1, _qyy_arg2, _qyy_arg3); \
382 _qyy_res; \
383 })
384
385
nethercote7cc9c232004-01-21 15:08:04 +0000386/* Counts the number of errors that have been recorded by a tool. Nb:
387 the tool must record the errors with VG_(maybe_record_error)() or
njn47363ab2003-04-21 13:24:40 +0000388 VG_(unique_error)() for them to be counted. */
389#define VALGRIND_COUNT_ERRORS \
390 ({unsigned int _qyy_res; \
391 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
392 VG_USERREQ__COUNT_ERRORS, \
393 0, 0, 0, 0); \
394 _qyy_res; \
395 })
396
njnd7994182003-10-02 13:44:04 +0000397/* Mark a block of memory as having been allocated by a malloc()-like
398 function. `addr' is the start of the usable block (ie. after any
399 redzone) `rzB' is redzone size if the allocator can apply redzones;
400 use '0' if not. Adding redzones makes it more likely Valgrind will spot
401 block overruns. `is_zeroed' indicates if the memory is zeroed, as it is
402 for calloc(). Put it immediately after the point where a block is
403 allocated.
404
405 If you're allocating memory via superblocks, and then handing out small
406 chunks of each superblock, if you don't have redzones on your small
407 blocks, it's worth marking the superblock with VALGRIND_MAKE_NOACCESS
408 when it's created, so that block overruns are detected. But if you can
409 put redzones on, it's probably better to not do this, so that messages
410 for small overruns are described in terms of the small block rather than
411 the superblock (but if you have a big overrun that skips over a redzone,
412 you could miss an error this way). See memcheck/tests/custom_alloc.c
413 for an example.
414
415 Nb: block must be freed via a free()-like function specified
416 with VALGRIND_FREELIKE_BLOCK or mismatch errors will occur. */
417#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \
418 {unsigned int _qzz_res; \
419 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
420 VG_USERREQ__MALLOCLIKE_BLOCK, \
421 addr, sizeB, rzB, is_zeroed); \
422 }
423
424/* Mark a block of memory as having been freed by a free()-like function.
425 `rzB' is redzone size; it must match that given to
426 VALGRIND_MALLOCLIKE_BLOCK. Memory not freed will be detected by the leak
427 checker. Put it immediately after the point where the block is freed. */
428#define VALGRIND_FREELIKE_BLOCK(addr, rzB) \
429 {unsigned int _qzz_res; \
430 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
431 VG_USERREQ__FREELIKE_BLOCK, \
432 addr, rzB, 0, 0); \
433 }
434
rjwalshbc0bb832004-06-19 18:12:36 +0000435/* Create a memory pool. */
436#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \
437 {unsigned int _qzz_res; \
438 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
439 VG_USERREQ__CREATE_MEMPOOL, \
440 pool, rzB, is_zeroed, 0); \
441 }
442
443/* Destroy a memory pool. */
444#define VALGRIND_DESTROY_MEMPOOL(pool) \
445 {unsigned int _qzz_res; \
446 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
447 VG_USERREQ__DESTROY_MEMPOOL, \
448 pool, 0, 0, 0); \
449 }
450
451/* Associate a piece of memory with a memory pool. */
452#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \
453 {unsigned int _qzz_res; \
454 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
455 VG_USERREQ__MEMPOOL_ALLOC, \
456 pool, addr, size, 0); \
457 }
458
459/* Disassociate a piece of memory from a memory pool. */
460#define VALGRIND_MEMPOOL_FREE(pool, addr) \
461 {unsigned int _qzz_res; \
462 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
463 VG_USERREQ__MEMPOOL_FREE, \
464 pool, addr, 0, 0); \
465 }
466
rjwalsh0140af52005-06-04 20:42:33 +0000467/* Mark a piece of memory as being a stack. Returns a stack id. */
468#define VALGRIND_STACK_REGISTER(start, end) \
469 ({unsigned int _qzz_res; \
470 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
471 VG_USERREQ__STACK_REGISTER, \
472 start, end, 0, 0); \
473 _qzz_res; \
474 })
475
476/* Unmark the piece of memory associated with a stack id as being a
477 stack. */
478#define VALGRIND_STACK_DEREGISTER(id) \
479 {unsigned int _qzz_res; \
480 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
481 VG_USERREQ__STACK_DEREGISTER, \
482 id, 0, 0, 0); \
483 }
484
485/* Change the start and end address of the stack id. */
486#define VALGRIND_STACK_CHANGE(id, start, end) \
487 {unsigned int _qzz_res; \
488 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
489 VG_USERREQ__STACK_CHANGE, \
490 id, start, end, 0); \
491 }
492
njn3e884182003-04-15 13:03:23 +0000493#endif /* __VALGRIND_H */