2 ----------------------------------------------------------------
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.
9 ----------------------------------------------------------------
11 This file is part of Valgrind, a dynamic binary instrumentation
14 Copyright (C) 2000-2005 Julian Seward. All rights reserved.
16 Redistribution and use in source and binary forms, with or without
17 modification, are permitted provided that the following conditions
20 1. Redistributions of source code must retain the above copyright
21 notice, this list of conditions and the following disclaimer.
23 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.
28 3. Altered source versions must be plainly marked as such, and must
29 not be misrepresented as being the original software.
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
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.
47 ----------------------------------------------------------------
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.
54 ----------------------------------------------------------------
58 /* This file is for inclusion into client (your!) code.
60 You can use these macros to manipulate and query Valgrind's
61 execution inside your own programs.
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. */
77 /* 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
81 /* If we're not compiling for our target architecture, don't generate
82 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. */
85 #if !defined(__i386__) && !defined(__x86_64__) && !defined(__powerpc__)
88 # endif /* NVALGRIND */
91 /* ------------------------------------------------------------------ */
92 /* The architecture-specific part */
93 /* ------------------------------------------------------------------ */
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) \
103 (_zzq_rlval) = (_zzq_default); \
106 #else /* NVALGRIND */
108 /* 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
110 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.
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
121 Nb: we put the assembly code sequences for all architectures in this one
122 file. This is because this file must be stand-alone, and we don't want
123 to have multiple files.
127 #define VALGRIND_MAGIC_SEQUENCE( \
128 _zzq_rlval, _zzq_default, _zzq_request, \
129 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
131 { volatile unsigned long long _zzq_args[5]; \
132 _zzq_args[0] = (volatile unsigned long long)(_zzq_request); \
133 _zzq_args[1] = (volatile unsigned long long)(_zzq_arg1); \
134 _zzq_args[2] = (volatile unsigned long long)(_zzq_arg2); \
135 _zzq_args[3] = (volatile unsigned long long)(_zzq_arg3); \
136 _zzq_args[4] = (volatile unsigned long long)(_zzq_arg4); \
137 __asm__ volatile("roll $29, %%eax ; roll $3, %%eax\n\t" \
138 "rorl $27, %%eax ; rorl $5, %%eax\n\t" \
139 "roll $13, %%eax ; roll $19, %%eax" \
140 : "=d" (_zzq_rlval) \
141 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
145 #endif /* __x86_64__ */
148 #define VALGRIND_MAGIC_SEQUENCE( \
149 _zzq_rlval, _zzq_default, _zzq_request, \
150 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
152 { unsigned int _zzq_args[5]; \
153 _zzq_args[0] = (unsigned int)(_zzq_request); \
154 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
155 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
156 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
157 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
158 __asm__ volatile("roll $29, %%eax ; roll $3, %%eax\n\t" \
159 "rorl $27, %%eax ; rorl $5, %%eax\n\t" \
160 "roll $13, %%eax ; roll $19, %%eax" \
161 : "=d" (_zzq_rlval) \
162 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
166 #endif /* __i386__ */
169 #define VALGRIND_MAGIC_SEQUENCE( \
170 _zzq_rlval, _zzq_default, _zzq_request, \
171 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
173 { volatile unsigned int _zzq_args[5]; \
174 register unsigned int _zzq_tmp __asm__("r3"); \
175 register volatile unsigned int *_zzq_ptr __asm__("r4"); \
176 _zzq_args[0] = (volatile unsigned int)(_zzq_request); \
177 _zzq_args[1] = (volatile unsigned int)(_zzq_arg1); \
178 _zzq_args[2] = (volatile unsigned int)(_zzq_arg2); \
179 _zzq_args[3] = (volatile unsigned int)(_zzq_arg3); \
180 _zzq_args[4] = (volatile unsigned int)(_zzq_arg4); \
181 _zzq_ptr = _zzq_args; \
182 __asm__ volatile("tw 0,3,27\n\t" \
183 "rlwinm 0,0,29,0,0\n\t" \
184 "rlwinm 0,0,3,0,0\n\t" \
185 "rlwinm 0,0,13,0,0\n\t" \
186 "rlwinm 0,0,19,0,0\n\t" \
189 : "0" (_zzq_default), "r" (_zzq_ptr) \
191 _zzq_rlval = (__typeof__(_zzq_rlval)) _zzq_tmp; \
193 #endif /* __powerpc__ */
195 /* Insert assembly code for other architectures here... */
197 #endif /* NVALGRIND */
200 /* ------------------------------------------------------------------ */
201 /* The architecture-independent part */
202 /* ------------------------------------------------------------------ */
204 /* Some request codes. There are many more of these, but most are not
205 exposed to end-user view. These are the public ones, all of the
206 form 0x1000 + small_number.
208 Core ones are in the range 0x00000000--0x0000ffff. The non-public ones
212 /* These macros are used by tools -- they must be public, but don't embed them
213 * into other programs. */
214 #define VG_USERREQ_TOOL_BASE(a,b) \
215 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
216 #define VG_IS_TOOL_USERREQ(a, b, v) \
217 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
220 enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001,
221 VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
223 /* These allow any function to be called from the
224 simulated CPU but run on the real CPU.
225 Nb: the first arg passed to the function is always the ThreadId of
226 the running thread! So CLIENT_CALL0 actually requires a 1 arg
228 VG_USERREQ__CLIENT_CALL0 = 0x1101,
229 VG_USERREQ__CLIENT_CALL1 = 0x1102,
230 VG_USERREQ__CLIENT_CALL2 = 0x1103,
231 VG_USERREQ__CLIENT_CALL3 = 0x1104,
233 /* Can be useful in regression testing suites -- eg. can send
234 Valgrind's output to /dev/null and still count errors. */
235 VG_USERREQ__COUNT_ERRORS = 0x1201,
237 /* These are useful and can be interpreted by any tool that tracks
238 malloc() et al, by using vg_replace_malloc.c. */
239 VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
240 VG_USERREQ__FREELIKE_BLOCK = 0x1302,
241 /* Memory pool support. */
242 VG_USERREQ__CREATE_MEMPOOL = 0x1303,
243 VG_USERREQ__DESTROY_MEMPOOL = 0x1304,
244 VG_USERREQ__MEMPOOL_ALLOC = 0x1305,
245 VG_USERREQ__MEMPOOL_FREE = 0x1306,
247 /* Allow printfs to valgrind log. */
248 VG_USERREQ__PRINTF = 0x1401,
249 VG_USERREQ__PRINTF_BACKTRACE = 0x1402,
252 VG_USERREQ__STACK_REGISTER = 0x1501,
253 VG_USERREQ__STACK_DEREGISTER = 0x1502,
254 VG_USERREQ__STACK_CHANGE = 0x1503,
258 #define __extension__
261 /* Returns the number of Valgrinds this code is running under. That is,
262 0 if running natively, 1 if running under Valgrind, 2 if running under
263 Valgrind which is running under another Valgrind, etc. */
264 #define RUNNING_ON_VALGRIND __extension__ \
265 ({unsigned int _qzz_res; \
266 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0 /* returned if not */, \
267 VG_USERREQ__RUNNING_ON_VALGRIND, \
273 /* Discard translation of code in the range [_qzz_addr .. _qzz_addr +
274 _qzz_len - 1]. Useful if you are debugging a JITter or some such,
275 since it provides a way to make sure valgrind will retranslate the
276 invalidated area. Returns no value. */
277 #define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
278 {unsigned int _qzz_res; \
279 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
280 VG_USERREQ__DISCARD_TRANSLATIONS, \
281 _qzz_addr, _qzz_len, 0, 0); \
286 #define VALGRIND_PRINTF(...)
287 #define VALGRIND_PRINTF_BACKTRACE(...)
289 #else /* NVALGRIND */
291 int VALGRIND_PRINTF(const char *format, ...)
292 __attribute__((format(__printf__, 1, 2)));
293 __attribute__((weak))
295 VALGRIND_PRINTF(const char *format, ...)
297 unsigned long _qzz_res;
299 va_start(vargs, format);
300 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, VG_USERREQ__PRINTF,
301 (unsigned long)format, (unsigned long)vargs, 0, 0);
303 return (int)_qzz_res;
306 int VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
307 __attribute__((format(__printf__, 1, 2)));
308 __attribute__((weak))
310 VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
312 unsigned long _qzz_res;
314 va_start(vargs, format);
315 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, VG_USERREQ__PRINTF_BACKTRACE,
316 (unsigned long)format, (unsigned long)vargs, 0, 0);
318 return (int)_qzz_res;
321 #endif /* NVALGRIND */
323 /* These requests allow control to move from the simulated CPU to the
324 real CPU, calling an arbitary function */
325 #define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
326 ({unsigned long _qyy_res; \
327 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
328 VG_USERREQ__CLIENT_CALL0, \
334 #define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
335 ({unsigned long _qyy_res; \
336 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
337 VG_USERREQ__CLIENT_CALL1, \
343 #define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
344 ({unsigned long _qyy_res; \
345 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
346 VG_USERREQ__CLIENT_CALL2, \
348 _qyy_arg1, _qyy_arg2, 0); \
352 #define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
353 ({unsigned long _qyy_res; \
354 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
355 VG_USERREQ__CLIENT_CALL3, \
357 _qyy_arg1, _qyy_arg2, _qyy_arg3); \
362 /* Counts the number of errors that have been recorded by a tool. Nb:
363 the tool must record the errors with VG_(maybe_record_error)() or
364 VG_(unique_error)() for them to be counted. */
365 #define VALGRIND_COUNT_ERRORS \
366 ({unsigned int _qyy_res; \
367 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
368 VG_USERREQ__COUNT_ERRORS, \
373 /* Mark a block of memory as having been allocated by a malloc()-like
374 function. `addr' is the start of the usable block (ie. after any
375 redzone) `rzB' is redzone size if the allocator can apply redzones;
376 use '0' if not. Adding redzones makes it more likely Valgrind will spot
377 block overruns. `is_zeroed' indicates if the memory is zeroed, as it is
378 for calloc(). Put it immediately after the point where a block is
381 If you're allocating memory via superblocks, and then handing out small
382 chunks of each superblock, if you don't have redzones on your small
383 blocks, it's worth marking the superblock with VALGRIND_MAKE_NOACCESS
384 when it's created, so that block overruns are detected. But if you can
385 put redzones on, it's probably better to not do this, so that messages
386 for small overruns are described in terms of the small block rather than
387 the superblock (but if you have a big overrun that skips over a redzone,
388 you could miss an error this way). See memcheck/tests/custom_alloc.c
391 Nb: block must be freed via a free()-like function specified
392 with VALGRIND_FREELIKE_BLOCK or mismatch errors will occur. */
393 #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \
394 {unsigned int _qzz_res; \
395 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
396 VG_USERREQ__MALLOCLIKE_BLOCK, \
397 addr, sizeB, rzB, is_zeroed); \
400 /* Mark a block of memory as having been freed by a free()-like function.
401 `rzB' is redzone size; it must match that given to
402 VALGRIND_MALLOCLIKE_BLOCK. Memory not freed will be detected by the leak
403 checker. Put it immediately after the point where the block is freed. */
404 #define VALGRIND_FREELIKE_BLOCK(addr, rzB) \
405 {unsigned int _qzz_res; \
406 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
407 VG_USERREQ__FREELIKE_BLOCK, \
411 /* Create a memory pool. */
412 #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \
413 {unsigned int _qzz_res; \
414 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
415 VG_USERREQ__CREATE_MEMPOOL, \
416 pool, rzB, is_zeroed, 0); \
419 /* Destroy a memory pool. */
420 #define VALGRIND_DESTROY_MEMPOOL(pool) \
421 {unsigned int _qzz_res; \
422 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
423 VG_USERREQ__DESTROY_MEMPOOL, \
427 /* Associate a piece of memory with a memory pool. */
428 #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \
429 {unsigned int _qzz_res; \
430 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
431 VG_USERREQ__MEMPOOL_ALLOC, \
432 pool, addr, size, 0); \
435 /* Disassociate a piece of memory from a memory pool. */
436 #define VALGRIND_MEMPOOL_FREE(pool, addr) \
437 {unsigned int _qzz_res; \
438 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
439 VG_USERREQ__MEMPOOL_FREE, \
443 /* Mark a piece of memory as being a stack. Returns a stack id. */
444 #define VALGRIND_STACK_REGISTER(start, end) \
445 ({unsigned int _qzz_res; \
446 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
447 VG_USERREQ__STACK_REGISTER, \
452 /* Unmark the piece of memory associated with a stack id as being a
454 #define VALGRIND_STACK_DEREGISTER(id) \
455 {unsigned int _qzz_res; \
456 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
457 VG_USERREQ__STACK_DEREGISTER, \
461 /* Change the start and end address of the stack id. */
462 #define VALGRIND_STACK_CHANGE(id, start, end) \
463 {unsigned int _qzz_res; \
464 VALGRIND_MAGIC_SEQUENCE(_qzz_res, 0, \
465 VG_USERREQ__STACK_CHANGE, \
466 id, start, end, 0); \
469 #endif /* __VALGRIND_H */