blob: 8df4f62a31ef14207309f338460405990beffbd1 [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
58#ifndef __VALGRIND_H
59#define __VALGRIND_H
60
fitzhardinge39de4b42003-10-31 07:12:21 +000061#include <stdarg.h>
62
nethercoteb2decc32004-10-25 19:33:26 +000063#undef __@VG_ARCH@__
64#define __@VG_ARCH@__ 1 // Architecture we're installed on
sewardjde4a1d02002-03-22 01:27:54 +000065
sewardjb5f6f512005-03-10 23:59:00 +000066
67/* If we're not compiling for our target architecture, don't generate
68 any inline asms. This would be a bit neater if we used the same
69 CPP symbols as the compiler for identifying architectures. */
sewardjde4a4ab2005-03-23 13:10:32 +000070#if !defined(__i386__) && !defined(__amd64__)
sewardjb5f6f512005-03-10 23:59:00 +000071# ifndef NVALGRIND
72# define NVALGRIND 1
73# endif /* NVALGRIND */
74#endif
75
76
sewardjde4a1d02002-03-22 01:27:54 +000077/* This file is for inclusion into client (your!) code.
78
njn25e49d8e72002-09-23 09:36:25 +000079 You can use these macros to manipulate and query Valgrind's
80 execution inside your own programs.
sewardjde4a1d02002-03-22 01:27:54 +000081
82 The resulting executables will still run without Valgrind, just a
83 little bit more slowly than they otherwise would, but otherwise
sewardj285f77f2003-03-15 23:39:11 +000084 unchanged. When not running on valgrind, each client request
nethercotee90c6832004-10-18 18:07:49 +000085 consumes very few (eg. < 10) instructions, so the resulting performance
sewardj285f77f2003-03-15 23:39:11 +000086 loss is negligible unless you plan to execute client requests
87 millions of times per second. Nevertheless, if that is still a
88 problem, you can compile with the NVALGRIND symbol defined (gcc
89 -DNVALGRIND) so that client requests are not even compiled in. */
sewardjde4a1d02002-03-22 01:27:54 +000090
sewardj37091fb2002-11-16 11:06:50 +000091#ifndef NVALGRIND
nethercotee90c6832004-10-18 18:07:49 +000092
nethercote54265442004-10-26 12:56:58 +000093/* The following defines the magic code sequences which the JITter spots and
94 handles magically. Don't look too closely at them; they will rot
nethercotee90c6832004-10-18 18:07:49 +000095 your brain. We must ensure that the default value gets put in the return
96 slot, so that everything works when this is executed not under Valgrind.
97 Args are passed in a memory block, and so there's no intrinsic limit to
98 the number that could be passed, but it's currently four.
99
nethercote54265442004-10-26 12:56:58 +0000100 The macro args are:
101 _zzq_rlval result lvalue
102 _zzq_default default value (result returned when running on real CPU)
103 _zzq_request request code
104 _zzq_arg1..4 request params
105
nethercotee90c6832004-10-18 18:07:49 +0000106 Nb: we put the assembly code sequences for all architectures in this one
107 file. This is because this file must be stand-alone, so we can't rely on
108 eg. x86/ subdirectories like we do within the rest of Valgrind.
109*/
110
sewardjde4a4ab2005-03-23 13:10:32 +0000111#ifdef __amd64__
112extern int printf (__const char *__restrict __format, ...);
113extern void exit (int __status);
114#define VALGRIND_MAGIC_SEQUENCE( \
115 _zzq_rlval, _zzq_default, _zzq_request, \
116 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
117 \
118 { volatile unsigned long long _zzq_args[5]; \
119 _zzq_args[0] = (volatile unsigned long long)(_zzq_request); \
120 _zzq_args[1] = (volatile unsigned long long)(_zzq_arg1); \
121 _zzq_args[2] = (volatile unsigned long long)(_zzq_arg2); \
122 _zzq_args[3] = (volatile unsigned long long)(_zzq_arg3); \
123 _zzq_args[4] = (volatile unsigned long long)(_zzq_arg4); \
124 asm volatile("roll $29, %%eax ; roll $3, %%eax\n\t" \
125 "rorl $27, %%eax ; rorl $5, %%eax\n\t" \
126 "roll $13, %%eax ; roll $19, %%eax" \
127 : "=d" (_zzq_rlval) \
128 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
129 : "cc", "memory" \
130 ); \
131 }
132// XXX: make sure that the register holding the args and the register taking
njn35172bc2005-03-26 00:04:03 +0000133// the return value match VGA_CLREQ_ARGS and VGA_CLREQ_RET in
sewardjde4a4ab2005-03-23 13:10:32 +0000134// amd64/core_arch.h!
135#endif // __amd64__
136
137#ifdef __i386__
138#define VALGRIND_MAGIC_SEQUENCE( \
139 _zzq_rlval, _zzq_default, _zzq_request, \
140 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
141 \
142 { unsigned int _zzq_args[5]; \
143 _zzq_args[0] = (unsigned int)(_zzq_request); \
144 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
145 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
146 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
147 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
148 asm volatile("roll $29, %%eax ; roll $3, %%eax\n\t" \
149 "rorl $27, %%eax ; rorl $5, %%eax\n\t" \
150 "roll $13, %%eax ; roll $19, %%eax" \
151 : "=d" (_zzq_rlval) \
152 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
153 : "cc", "memory" \
154 ); \
155 }
156#endif // __i386__
157// Insert assembly code for other architectures here...
158
njnc6168192004-11-29 13:54:10 +0000159#ifdef __arm__
sewardjde4a4ab2005-03-23 13:10:32 +0000160// XXX: terporary, until MAGIC_SEQUENCE is written properly
njnc6168192004-11-29 13:54:10 +0000161extern int printf (__const char *__restrict __format, ...);
162extern void exit (int __status);
163#define VALGRIND_MAGIC_SEQUENCE( \
164 _zzq_rlval, _zzq_default, _zzq_request, \
165 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
166 \
167 { volatile unsigned int _zzq_args[5]; \
168 _zzq_args[0] = (volatile unsigned int)(_zzq_request); \
169 _zzq_args[1] = (volatile unsigned int)(_zzq_arg1); \
170 _zzq_args[2] = (volatile unsigned int)(_zzq_arg2); \
171 _zzq_args[3] = (volatile unsigned int)(_zzq_arg3); \
172 _zzq_args[4] = (volatile unsigned int)(_zzq_arg4); \
173 (_zzq_rlval) = (_zzq_default);/* temporary only */ \
174 printf("argh: MAGIC_SEQUENCE"); exit(1); \
175 asm volatile(""); \
176 }
177// XXX: make sure that the register holding the args and the register taking
njn35172bc2005-03-26 00:04:03 +0000178// the return value match VGA_CLREQ_ARGS and VGA_CLREQ_RET in
njnc6168192004-11-29 13:54:10 +0000179// arm/core_arch.h!
180#endif // __arm__
nethercotee90c6832004-10-18 18:07:49 +0000181
sewardj37091fb2002-11-16 11:06:50 +0000182#else /* NVALGRIND */
183/* Define NVALGRIND to completely remove the Valgrind magic sequence
184 from the compiled code (analogous to NDEBUG's effects on
185 assert()) */
186#define VALGRIND_MAGIC_SEQUENCE( \
nethercote69d9c462004-10-26 13:00:12 +0000187 _zzq_rlval, _zzq_default, _zzq_request, \
188 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
sewardj37091fb2002-11-16 11:06:50 +0000189 { \
190 (_zzq_rlval) = (_zzq_default); \
191 }
192#endif /* NVALGRIND */
sewardj2e93c502002-04-12 11:12:52 +0000193
nethercote69d9c462004-10-26 13:00:12 +0000194
sewardj2e93c502002-04-12 11:12:52 +0000195/* Some request codes. There are many more of these, but most are not
196 exposed to end-user view. These are the public ones, all of the
njn25e49d8e72002-09-23 09:36:25 +0000197 form 0x1000 + small_number.
njnd7994182003-10-02 13:44:04 +0000198
199 Core ones are in the range 0x00000000--0x0000ffff. The non-public ones
200 start at 0x2000.
sewardj2e93c502002-04-12 11:12:52 +0000201*/
202
njnfc26ff92004-11-22 19:12:49 +0000203// These macros are used by tools -- they must be public, but don't embed them
204// into other programs.
205#define VG_USERREQ_TOOL_BASE(a,b) \
njn4c791212003-05-02 17:53:54 +0000206 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
njnfc26ff92004-11-22 19:12:49 +0000207#define VG_IS_TOOL_USERREQ(a, b, v) \
208 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
sewardj34042512002-10-22 04:14:35 +0000209
njn25e49d8e72002-09-23 09:36:25 +0000210typedef
njn4c791212003-05-02 17:53:54 +0000211 enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001,
212 VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
njn3e884182003-04-15 13:03:23 +0000213
njnd4795be2004-11-24 11:57:51 +0000214 /* These allow any function to be called from the
215 simulated CPU but run on the real CPU.
216 Nb: the first arg passed to the function is always the ThreadId of
217 the running thread! So CLIENT_CALL0 actually requires a 1 arg
218 function, etc. */
njn4c791212003-05-02 17:53:54 +0000219 VG_USERREQ__CLIENT_CALL0 = 0x1101,
220 VG_USERREQ__CLIENT_CALL1 = 0x1102,
221 VG_USERREQ__CLIENT_CALL2 = 0x1103,
222 VG_USERREQ__CLIENT_CALL3 = 0x1104,
njn3e884182003-04-15 13:03:23 +0000223
njn47363ab2003-04-21 13:24:40 +0000224 /* Can be useful in regression testing suites -- eg. can send
225 Valgrind's output to /dev/null and still count errors. */
njn4c791212003-05-02 17:53:54 +0000226 VG_USERREQ__COUNT_ERRORS = 0x1201,
njn47363ab2003-04-21 13:24:40 +0000227
nethercote7cc9c232004-01-21 15:08:04 +0000228 /* These are useful and can be interpreted by any tool that tracks
njnd7994182003-10-02 13:44:04 +0000229 malloc() et al, by using vg_replace_malloc.c. */
230 VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
231 VG_USERREQ__FREELIKE_BLOCK = 0x1302,
rjwalshbc0bb832004-06-19 18:12:36 +0000232 /* Memory pool support. */
233 VG_USERREQ__CREATE_MEMPOOL = 0x1303,
234 VG_USERREQ__DESTROY_MEMPOOL = 0x1304,
235 VG_USERREQ__MEMPOOL_ALLOC = 0x1305,
236 VG_USERREQ__MEMPOOL_FREE = 0x1306,
njnd7994182003-10-02 13:44:04 +0000237
fitzhardinge39de4b42003-10-31 07:12:21 +0000238 /* Allow printfs to valgrind log. */
239 VG_USERREQ__PRINTF = 0x1401,
thughes85c8a502004-08-25 13:25:30 +0000240 VG_USERREQ__PRINTF_BACKTRACE = 0x1402
njn25e49d8e72002-09-23 09:36:25 +0000241 } Vg_ClientRequest;
sewardj2e93c502002-04-12 11:12:52 +0000242
muellerc9b36552003-12-31 14:32:23 +0000243#ifndef __GNUC__
244#define __extension__
245#endif
sewardj2e93c502002-04-12 11:12:52 +0000246
njnf09745a2005-05-10 03:01:23 +0000247/* Returns the number of Valgrinds this code is running under. That is,
248 0 if running natively, 1 if running under Valgrind, 2 if running under
249 Valgrind which is running under another Valgrind, etc. */
muellerc9b36552003-12-31 14:32:23 +0000250#define RUNNING_ON_VALGRIND __extension__ \
sewardj2e93c502002-04-12 11:12:52 +0000251 ({unsigned int _qzz_res; \
252 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0 /* returned if not */, \
253 VG_USERREQ__RUNNING_ON_VALGRIND, \
254 0, 0, 0, 0); \
255 _qzz_res; \
sewardjde4a1d02002-03-22 01:27:54 +0000256 })
257
258
sewardj18d75132002-05-16 11:06:21 +0000259/* Discard translation of code in the range [_qzz_addr .. _qzz_addr +
260 _qzz_len - 1]. Useful if you are debugging a JITter or some such,
261 since it provides a way to make sure valgrind will retranslate the
262 invalidated area. Returns no value. */
263#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
264 {unsigned int _qzz_res; \
265 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
266 VG_USERREQ__DISCARD_TRANSLATIONS, \
267 _qzz_addr, _qzz_len, 0, 0); \
268 }
269
fitzhardinge39de4b42003-10-31 07:12:21 +0000270#ifndef NVALGRIND
271
fitzhardingea09a1b52003-11-07 23:09:48 +0000272int VALGRIND_PRINTF(const char *format, ...)
273 __attribute__((format(__printf__, 1, 2)));
fitzhardinge39de4b42003-10-31 07:12:21 +0000274__attribute__((weak))
275int
fitzhardingea09a1b52003-11-07 23:09:48 +0000276VALGRIND_PRINTF(const char *format, ...)
fitzhardinge39de4b42003-10-31 07:12:21 +0000277{
njnc6168192004-11-29 13:54:10 +0000278 unsigned long _qzz_res;
fitzhardinge39de4b42003-10-31 07:12:21 +0000279 va_list vargs;
280 va_start(vargs, format);
281 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, VG_USERREQ__PRINTF,
njnc6168192004-11-29 13:54:10 +0000282 (unsigned long)format, (unsigned long)vargs, 0, 0);
fitzhardinge39de4b42003-10-31 07:12:21 +0000283 va_end(vargs);
njnc6168192004-11-29 13:54:10 +0000284 return (int)_qzz_res;
fitzhardinge39de4b42003-10-31 07:12:21 +0000285}
286
fitzhardingea09a1b52003-11-07 23:09:48 +0000287int VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
288 __attribute__((format(__printf__, 1, 2)));
fitzhardinge39de4b42003-10-31 07:12:21 +0000289__attribute__((weak))
290int
fitzhardingea09a1b52003-11-07 23:09:48 +0000291VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
fitzhardinge39de4b42003-10-31 07:12:21 +0000292{
njnc6168192004-11-29 13:54:10 +0000293 unsigned long _qzz_res;
fitzhardinge39de4b42003-10-31 07:12:21 +0000294 va_list vargs;
295 va_start(vargs, format);
296 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, VG_USERREQ__PRINTF_BACKTRACE,
njnc6168192004-11-29 13:54:10 +0000297 (unsigned long)format, (unsigned long)vargs, 0, 0);
fitzhardinge39de4b42003-10-31 07:12:21 +0000298 va_end(vargs);
njnc6168192004-11-29 13:54:10 +0000299 return (int)_qzz_res;
fitzhardinge39de4b42003-10-31 07:12:21 +0000300}
301
302#else /* NVALGRIND */
303
304#define VALGRIND_PRINTF(...)
305#define VALGRIND_PRINTF_BACKTRACE(...)
306
307#endif /* NVALGRIND */
sewardj18d75132002-05-16 11:06:21 +0000308
njn3e884182003-04-15 13:03:23 +0000309/* These requests allow control to move from the simulated CPU to the
310 real CPU, calling an arbitary function */
njn057c65f2003-04-21 13:30:55 +0000311#define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
njnc6168192004-11-29 13:54:10 +0000312 ({unsigned long _qyy_res; \
njn3e884182003-04-15 13:03:23 +0000313 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
314 VG_USERREQ__CLIENT_CALL0, \
315 _qyy_fn, \
316 0, 0, 0); \
317 _qyy_res; \
318 })
319
njn057c65f2003-04-21 13:30:55 +0000320#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
njnc6168192004-11-29 13:54:10 +0000321 ({unsigned long _qyy_res; \
njn3e884182003-04-15 13:03:23 +0000322 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
323 VG_USERREQ__CLIENT_CALL1, \
324 _qyy_fn, \
325 _qyy_arg1, 0, 0); \
326 _qyy_res; \
327 })
328
njn057c65f2003-04-21 13:30:55 +0000329#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
njnc6168192004-11-29 13:54:10 +0000330 ({unsigned long _qyy_res; \
njn3e884182003-04-15 13:03:23 +0000331 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
332 VG_USERREQ__CLIENT_CALL2, \
333 _qyy_fn, \
334 _qyy_arg1, _qyy_arg2, 0); \
335 _qyy_res; \
336 })
337
njn057c65f2003-04-21 13:30:55 +0000338#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
njnc6168192004-11-29 13:54:10 +0000339 ({unsigned long _qyy_res; \
njn3e884182003-04-15 13:03:23 +0000340 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
341 VG_USERREQ__CLIENT_CALL3, \
342 _qyy_fn, \
343 _qyy_arg1, _qyy_arg2, _qyy_arg3); \
344 _qyy_res; \
345 })
346
347
nethercote7cc9c232004-01-21 15:08:04 +0000348/* Counts the number of errors that have been recorded by a tool. Nb:
349 the tool must record the errors with VG_(maybe_record_error)() or
njn47363ab2003-04-21 13:24:40 +0000350 VG_(unique_error)() for them to be counted. */
351#define VALGRIND_COUNT_ERRORS \
352 ({unsigned int _qyy_res; \
353 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
354 VG_USERREQ__COUNT_ERRORS, \
355 0, 0, 0, 0); \
356 _qyy_res; \
357 })
358
njnd7994182003-10-02 13:44:04 +0000359/* Mark a block of memory as having been allocated by a malloc()-like
360 function. `addr' is the start of the usable block (ie. after any
361 redzone) `rzB' is redzone size if the allocator can apply redzones;
362 use '0' if not. Adding redzones makes it more likely Valgrind will spot
363 block overruns. `is_zeroed' indicates if the memory is zeroed, as it is
364 for calloc(). Put it immediately after the point where a block is
365 allocated.
366
367 If you're allocating memory via superblocks, and then handing out small
368 chunks of each superblock, if you don't have redzones on your small
369 blocks, it's worth marking the superblock with VALGRIND_MAKE_NOACCESS
370 when it's created, so that block overruns are detected. But if you can
371 put redzones on, it's probably better to not do this, so that messages
372 for small overruns are described in terms of the small block rather than
373 the superblock (but if you have a big overrun that skips over a redzone,
374 you could miss an error this way). See memcheck/tests/custom_alloc.c
375 for an example.
376
377 Nb: block must be freed via a free()-like function specified
378 with VALGRIND_FREELIKE_BLOCK or mismatch errors will occur. */
379#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \
380 {unsigned int _qzz_res; \
381 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
382 VG_USERREQ__MALLOCLIKE_BLOCK, \
383 addr, sizeB, rzB, is_zeroed); \
384 }
385
386/* Mark a block of memory as having been freed by a free()-like function.
387 `rzB' is redzone size; it must match that given to
388 VALGRIND_MALLOCLIKE_BLOCK. Memory not freed will be detected by the leak
389 checker. Put it immediately after the point where the block is freed. */
390#define VALGRIND_FREELIKE_BLOCK(addr, rzB) \
391 {unsigned int _qzz_res; \
392 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
393 VG_USERREQ__FREELIKE_BLOCK, \
394 addr, rzB, 0, 0); \
395 }
396
rjwalshbc0bb832004-06-19 18:12:36 +0000397/* Create a memory pool. */
398#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \
399 {unsigned int _qzz_res; \
400 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
401 VG_USERREQ__CREATE_MEMPOOL, \
402 pool, rzB, is_zeroed, 0); \
403 }
404
405/* Destroy a memory pool. */
406#define VALGRIND_DESTROY_MEMPOOL(pool) \
407 {unsigned int _qzz_res; \
408 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
409 VG_USERREQ__DESTROY_MEMPOOL, \
410 pool, 0, 0, 0); \
411 }
412
413/* Associate a piece of memory with a memory pool. */
414#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \
415 {unsigned int _qzz_res; \
416 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
417 VG_USERREQ__MEMPOOL_ALLOC, \
418 pool, addr, size, 0); \
419 }
420
421/* Disassociate a piece of memory from a memory pool. */
422#define VALGRIND_MEMPOOL_FREE(pool, addr) \
423 {unsigned int _qzz_res; \
424 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
425 VG_USERREQ__MEMPOOL_FREE, \
426 pool, addr, 0, 0); \
427 }
428
njn3e884182003-04-15 13:03:23 +0000429#endif /* __VALGRIND_H */