Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: src/third_party/valgrind/valgrind.h

Issue 101413006: Implement in-heap backing store for typed arrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: GC fixes Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/stub-cache.cc ('k') | src/third_party/vtune/jitprofiling.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* -*- c -*- 1 /* -*- c -*-
2 ---------------------------------------------------------------- 2 ----------------------------------------------------------------
3 3
4 Notice that the following BSD-style license applies to this one 4 Notice that the following BSD-style license applies to this one
5 file (valgrind.h) only. The rest of Valgrind is licensed under the 5 file (valgrind.h) only. The rest of Valgrind is licensed under the
6 terms of the GNU General Public License, version 2, unless 6 terms of the GNU General Public License, version 2, unless
7 otherwise indicated. See the COPYING file in the source 7 otherwise indicated. See the COPYING file in the source
8 distribution for details. 8 distribution for details.
9 9
10 ---------------------------------------------------------------- 10 ----------------------------------------------------------------
11 11
12 This file is part of Valgrind, a dynamic binary instrumentation 12 This file is part of Valgrind, a dynamic binary instrumentation
13 framework. 13 framework.
14 14
15 Copyright (C) 2000-2010 Julian Seward. All rights reserved. 15 Copyright (C) 2000-2010 Julian Seward. All rights reserved.
16 16
17 Redistribution and use in source and binary forms, with or without 17 Redistribution and use in source and binary forms, with or without
18 modification, are permitted provided that the following conditions 18 modification, are permitted provided that the following conditions
19 are met: 19 are met:
20 20
21 1. Redistributions of source code must retain the above copyright 21 1. Redistributions of source code must retain the above copyright
22 notice, this list of conditions and the following disclaimer. 22 notice, this list of conditions and the following disclaimer.
23 23
24 2. The origin of this software must not be misrepresented; you must 24 2. The origin of this software must not be misrepresented; you must
25 not claim that you wrote the original software. If you use this 25 not claim that you wrote the original software. If you use this
26 software in a product, an acknowledgment in the product 26 software in a product, an acknowledgment in the product
27 documentation would be appreciated but is not required. 27 documentation would be appreciated but is not required.
28 28
29 3. Altered source versions must be plainly marked as such, and must 29 3. Altered source versions must be plainly marked as such, and must
30 not be misrepresented as being the original software. 30 not be misrepresented as being the original software.
31 31
32 4. The name of the author may not be used to endorse or promote 32 4. The name of the author may not be used to endorse or promote
33 products derived from this software without specific prior written 33 products derived from this software without specific prior written
34 permission. 34 permission.
35 35
36 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 36 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
37 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 37 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
38 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 38 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
39 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 39 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
40 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 40 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
41 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 41 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
42 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 42 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
43 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 43 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
44 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 44 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
45 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 45 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
46 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 46 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47 47
48 ---------------------------------------------------------------- 48 ----------------------------------------------------------------
49 49
50 Notice that the above BSD-style license applies to this one file 50 Notice that the above BSD-style license applies to this one file
51 (valgrind.h) only. The entire rest of Valgrind is licensed under 51 (valgrind.h) only. The entire rest of Valgrind is licensed under
52 the terms of the GNU General Public License, version 2. See the 52 the terms of the GNU General Public License, version 2. See the
53 COPYING file in the source distribution for details. 53 COPYING file in the source distribution for details.
54 54
55 ---------------------------------------------------------------- 55 ----------------------------------------------------------------
56 */ 56 */
57 57
58 58
59 /* This file is for inclusion into client (your!) code. 59 /* This file is for inclusion into client (your!) code.
60 60
61 You can use these macros to manipulate and query Valgrind's 61 You can use these macros to manipulate and query Valgrind's
62 execution inside your own programs. 62 execution inside your own programs.
63 63
64 The resulting executables will still run without Valgrind, just a 64 The resulting executables will still run without Valgrind, just a
65 little bit more slowly than they otherwise would, but otherwise 65 little bit more slowly than they otherwise would, but otherwise
66 unchanged. When not running on valgrind, each client request 66 unchanged. When not running on valgrind, each client request
67 consumes very few (eg. 7) instructions, so the resulting performance 67 consumes very few (eg. 7) instructions, so the resulting performance
68 loss is negligible unless you plan to execute client requests 68 loss is negligible unless you plan to execute client requests
69 millions of times per second. Nevertheless, if that is still a 69 millions of times per second. Nevertheless, if that is still a
70 problem, you can compile with the NVALGRIND symbol defined (gcc 70 problem, you can compile with the NVALGRIND symbol defined (gcc
71 -DNVALGRIND) so that client requests are not even compiled in. */ 71 -DNVALGRIND) so that client requests are not even compiled in. */
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 187
188 The assembly code sequences for all architectures is in this one 188 The assembly code sequences for all architectures is in this one
189 file. This is because this file must be stand-alone, and we don't 189 file. This is because this file must be stand-alone, and we don't
190 want to have multiple files. 190 want to have multiple files.
191 191
192 For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default 192 For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default
193 value gets put in the return slot, so that everything works when 193 value gets put in the return slot, so that everything works when
194 this is executed not under Valgrind. Args are passed in a memory 194 this is executed not under Valgrind. Args are passed in a memory
195 block, and so there's no intrinsic limit to the number that could 195 block, and so there's no intrinsic limit to the number that could
196 be passed, but it's currently five. 196 be passed, but it's currently five.
197 197
198 The macro args are: 198 The macro args are:
199 _zzq_rlval result lvalue 199 _zzq_rlval result lvalue
200 _zzq_default default value (result returned when running on real CPU) 200 _zzq_default default value (result returned when running on real CPU)
201 _zzq_request request code 201 _zzq_request request code
202 _zzq_arg1..5 request params 202 _zzq_arg1..5 request params
203 203
204 The other two macros are used to support function wrapping, and are 204 The other two macros are used to support function wrapping, and are
205 a lot simpler. VALGRIND_GET_NR_CONTEXT returns the value of the 205 a lot simpler. VALGRIND_GET_NR_CONTEXT returns the value of the
206 guest's NRADDR pseudo-register and whatever other information is 206 guest's NRADDR pseudo-register and whatever other information is
207 needed to safely run the call original from the wrapper: on 207 needed to safely run the call original from the wrapper: on
208 ppc64-linux, the R2 value at the divert point is also needed. This 208 ppc64-linux, the R2 value at the divert point is also needed. This
209 information is abstracted into a user-visible type, OrigFn. 209 information is abstracted into a user-visible type, OrigFn.
210 210
211 VALGRIND_CALL_NOREDIR_* behaves the same as the following on the 211 VALGRIND_CALL_NOREDIR_* behaves the same as the following on the
212 guest, but guarantees that the branch instruction will not be 212 guest, but guarantees that the branch instruction will not be
213 redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64: 213 redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64:
214 branch-and-link-to-r11. VALGRIND_CALL_NOREDIR is just text, not a 214 branch-and-link-to-r11. VALGRIND_CALL_NOREDIR is just text, not a
215 complete inline asm, since it needs to be combined with more magic 215 complete inline asm, since it needs to be combined with more magic
216 inline asm stuff to be useful. 216 inline asm stuff to be useful.
217 */ 217 */
218 218
219 /* ------------------------- x86-{linux,darwin} ---------------- */ 219 /* ------------------------- x86-{linux,darwin} ---------------- */
220 220
221 #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \ 221 #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \
222 || (defined(PLAT_x86_win32) && defined(__GNUC__)) 222 || (defined(PLAT_x86_win32) && defined(__GNUC__))
223 223
224 typedef 224 typedef
225 struct { 225 struct {
226 unsigned int nraddr; /* where's the code? */ 226 unsigned int nraddr; /* where's the code? */
227 } 227 }
228 OrigFn; 228 OrigFn;
229 229
230 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 230 #define __SPECIAL_INSTRUCTION_PREAMBLE \
231 "roll $3, %%edi ; roll $13, %%edi\n\t" \ 231 "roll $3, %%edi ; roll $13, %%edi\n\t" \
232 "roll $29, %%edi ; roll $19, %%edi\n\t" 232 "roll $29, %%edi ; roll $19, %%edi\n\t"
233 233
234 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ 234 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
235 _zzq_default, _zzq_request, \ 235 _zzq_default, _zzq_request, \
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 __SPECIAL_INSTRUCTION_PREAMBLE \ 270 __SPECIAL_INSTRUCTION_PREAMBLE \
271 /* call-noredir *%EAX */ \ 271 /* call-noredir *%EAX */ \
272 "xchgl %%edx,%%edx\n\t" 272 "xchgl %%edx,%%edx\n\t"
273 #endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__) */ 273 #endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__) */
274 274
275 /* ------------------------- x86-Win32 ------------------------- */ 275 /* ------------------------- x86-Win32 ------------------------- */
276 276
277 #if defined(PLAT_x86_win32) && !defined(__GNUC__) 277 #if defined(PLAT_x86_win32) && !defined(__GNUC__)
278 278
279 typedef 279 typedef
280 struct { 280 struct {
281 unsigned int nraddr; /* where's the code? */ 281 unsigned int nraddr; /* where's the code? */
282 } 282 }
283 OrigFn; 283 OrigFn;
284 284
285 #if defined(_MSC_VER) 285 #if defined(_MSC_VER)
286 286
287 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 287 #define __SPECIAL_INSTRUCTION_PREAMBLE \
288 __asm rol edi, 3 __asm rol edi, 13 \ 288 __asm rol edi, 3 __asm rol edi, 13 \
289 __asm rol edi, 29 __asm rol edi, 19 289 __asm rol edi, 29 __asm rol edi, 19
290 290
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 #error Unsupported compiler. 336 #error Unsupported compiler.
337 #endif 337 #endif
338 338
339 #endif /* PLAT_x86_win32 */ 339 #endif /* PLAT_x86_win32 */
340 340
341 /* ------------------------ amd64-{linux,darwin} --------------- */ 341 /* ------------------------ amd64-{linux,darwin} --------------- */
342 342
343 #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) 343 #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin)
344 344
345 typedef 345 typedef
346 struct { 346 struct {
347 uint64_t nraddr; /* where's the code? */ 347 uint64_t nraddr; /* where's the code? */
348 } 348 }
349 OrigFn; 349 OrigFn;
350 350
351 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 351 #define __SPECIAL_INSTRUCTION_PREAMBLE \
352 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \ 352 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \
353 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" 353 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
354 354
355 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ 355 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
356 _zzq_default, _zzq_request, \ 356 _zzq_default, _zzq_request, \
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 __SPECIAL_INSTRUCTION_PREAMBLE \ 391 __SPECIAL_INSTRUCTION_PREAMBLE \
392 /* call-noredir *%RAX */ \ 392 /* call-noredir *%RAX */ \
393 "xchgq %%rdx,%%rdx\n\t" 393 "xchgq %%rdx,%%rdx\n\t"
394 #endif /* PLAT_amd64_linux || PLAT_amd64_darwin */ 394 #endif /* PLAT_amd64_linux || PLAT_amd64_darwin */
395 395
396 /* ------------------------ ppc32-linux ------------------------ */ 396 /* ------------------------ ppc32-linux ------------------------ */
397 397
398 #if defined(PLAT_ppc32_linux) 398 #if defined(PLAT_ppc32_linux)
399 399
400 typedef 400 typedef
401 struct { 401 struct {
402 unsigned int nraddr; /* where's the code? */ 402 unsigned int nraddr; /* where's the code? */
403 } 403 }
404 OrigFn; 404 OrigFn;
405 405
406 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 406 #define __SPECIAL_INSTRUCTION_PREAMBLE \
407 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ 407 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \
408 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" 408 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
409 409
410 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ 410 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
411 _zzq_default, _zzq_request, \ 411 _zzq_default, _zzq_request, \
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 __SPECIAL_INSTRUCTION_PREAMBLE \ 452 __SPECIAL_INSTRUCTION_PREAMBLE \
453 /* branch-and-link-to-noredir *%R11 */ \ 453 /* branch-and-link-to-noredir *%R11 */ \
454 "or 3,3,3\n\t" 454 "or 3,3,3\n\t"
455 #endif /* PLAT_ppc32_linux */ 455 #endif /* PLAT_ppc32_linux */
456 456
457 /* ------------------------ ppc64-linux ------------------------ */ 457 /* ------------------------ ppc64-linux ------------------------ */
458 458
459 #if defined(PLAT_ppc64_linux) 459 #if defined(PLAT_ppc64_linux)
460 460
461 typedef 461 typedef
462 struct { 462 struct {
463 uint64_t nraddr; /* where's the code? */ 463 uint64_t nraddr; /* where's the code? */
464 uint64_t r2; /* what tocptr do we need? */ 464 uint64_t r2; /* what tocptr do we need? */
465 } 465 }
466 OrigFn; 466 OrigFn;
467 467
468 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 468 #define __SPECIAL_INSTRUCTION_PREAMBLE \
469 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ 469 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
470 "rotldi 0,0,61 ; rotldi 0,0,51\n\t" 470 "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
471 471
472 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ 472 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 /* branch-and-link-to-noredir *%R11 */ \ 519 /* branch-and-link-to-noredir *%R11 */ \
520 "or 3,3,3\n\t" 520 "or 3,3,3\n\t"
521 521
522 #endif /* PLAT_ppc64_linux */ 522 #endif /* PLAT_ppc64_linux */
523 523
524 /* ------------------------- arm-linux ------------------------- */ 524 /* ------------------------- arm-linux ------------------------- */
525 525
526 #if defined(PLAT_arm_linux) 526 #if defined(PLAT_arm_linux)
527 527
528 typedef 528 typedef
529 struct { 529 struct {
530 unsigned int nraddr; /* where's the code? */ 530 unsigned int nraddr; /* where's the code? */
531 } 531 }
532 OrigFn; 532 OrigFn;
533 533
534 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 534 #define __SPECIAL_INSTRUCTION_PREAMBLE \
535 "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \ 535 "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \
536 "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t" 536 "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
537 537
538 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ 538 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
539 _zzq_default, _zzq_request, \ 539 _zzq_default, _zzq_request, \
(...skipping 1162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1702 1702
1703 /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ 1703 /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */
1704 1704
1705 /* These regs are trashed by the hidden call. */ 1705 /* These regs are trashed by the hidden call. */
1706 #define __CALLER_SAVED_REGS \ 1706 #define __CALLER_SAVED_REGS \
1707 "lr", "ctr", "xer", \ 1707 "lr", "ctr", "xer", \
1708 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 1708 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
1709 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 1709 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
1710 "r11", "r12", "r13" 1710 "r11", "r12", "r13"
1711 1711
1712 /* These CALL_FN_ macros assume that on ppc32-linux, 1712 /* These CALL_FN_ macros assume that on ppc32-linux,
1713 sizeof(unsigned long) == 4. */ 1713 sizeof(unsigned long) == 4. */
1714 1714
1715 #define CALL_FN_W_v(lval, orig) \ 1715 #define CALL_FN_W_v(lval, orig) \
1716 do { \ 1716 do { \
1717 volatile OrigFn _orig = (orig); \ 1717 volatile OrigFn _orig = (orig); \
1718 volatile unsigned long _argvec[1]; \ 1718 volatile unsigned long _argvec[1]; \
1719 volatile unsigned long _res; \ 1719 volatile unsigned long _res; \
1720 _argvec[0] = (unsigned long)_orig.nraddr; \ 1720 _argvec[0] = (unsigned long)_orig.nraddr; \
1721 __asm__ volatile( \ 1721 __asm__ volatile( \
1722 "mr 11,%1\n\t" \ 1722 "mr 11,%1\n\t" \
(...skipping 1851 matching lines...) Expand 10 before | Expand all | Expand 10 after
3574 ones start at 0x2000. 3574 ones start at 0x2000.
3575 */ 3575 */
3576 3576
3577 /* These macros are used by tools -- they must be public, but don't 3577 /* These macros are used by tools -- they must be public, but don't
3578 embed them into other programs. */ 3578 embed them into other programs. */
3579 #define VG_USERREQ_TOOL_BASE(a,b) \ 3579 #define VG_USERREQ_TOOL_BASE(a,b) \
3580 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16)) 3580 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
3581 #define VG_IS_TOOL_USERREQ(a, b, v) \ 3581 #define VG_IS_TOOL_USERREQ(a, b, v) \
3582 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000)) 3582 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
3583 3583
3584 /* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !! 3584 /* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
3585 This enum comprises an ABI exported by Valgrind to programs 3585 This enum comprises an ABI exported by Valgrind to programs
3586 which use client requests. DO NOT CHANGE THE ORDER OF THESE 3586 which use client requests. DO NOT CHANGE THE ORDER OF THESE
3587 ENTRIES, NOR DELETE ANY -- add new ones at the end. */ 3587 ENTRIES, NOR DELETE ANY -- add new ones at the end. */
3588 typedef 3588 typedef
3589 enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001, 3589 enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001,
3590 VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002, 3590 VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
3591 3591
3592 /* These allow any function to be called from the simulated 3592 /* These allow any function to be called from the simulated
3593 CPU but run on the real CPU. Nb: the first arg passed to 3593 CPU but run on the real CPU. Nb: the first arg passed to
3594 the function is always the ThreadId of the running 3594 the function is always the ThreadId of the running
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
3703 #if defined(_MSC_VER) 3703 #if defined(_MSC_VER)
3704 _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, 3704 _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
3705 VG_USERREQ__PRINTF_VALIST_BY_REF, 3705 VG_USERREQ__PRINTF_VALIST_BY_REF,
3706 (uintptr_t)format, 3706 (uintptr_t)format,
3707 (uintptr_t)&vargs, 3707 (uintptr_t)&vargs,
3708 0, 0, 0); 3708 0, 0, 0);
3709 #else 3709 #else
3710 _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, 3710 _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
3711 VG_USERREQ__PRINTF_VALIST_BY_REF, 3711 VG_USERREQ__PRINTF_VALIST_BY_REF,
3712 (unsigned long)format, 3712 (unsigned long)format,
3713 (unsigned long)&vargs, 3713 (unsigned long)&vargs,
3714 0, 0, 0); 3714 0, 0, 0);
3715 #endif 3715 #endif
3716 va_end(vargs); 3716 va_end(vargs);
3717 return (int)_qzz_res; 3717 return (int)_qzz_res;
3718 #endif /* NVALGRIND */ 3718 #endif /* NVALGRIND */
3719 } 3719 }
3720 3720
3721 #if defined(__GNUC__) || defined(__INTEL_COMPILER) 3721 #if defined(__GNUC__) || defined(__INTEL_COMPILER)
3722 static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...) 3722 static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
3723 __attribute__((format(__printf__, 1, 2), __unused__)); 3723 __attribute__((format(__printf__, 1, 2), __unused__));
(...skipping 17 matching lines...) Expand all
3741 #if defined(_MSC_VER) 3741 #if defined(_MSC_VER)
3742 _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, 3742 _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
3743 VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF, 3743 VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
3744 (uintptr_t)format, 3744 (uintptr_t)format,
3745 (uintptr_t)&vargs, 3745 (uintptr_t)&vargs,
3746 0, 0, 0); 3746 0, 0, 0);
3747 #else 3747 #else
3748 _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, 3748 _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
3749 VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF, 3749 VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
3750 (unsigned long)format, 3750 (unsigned long)format,
3751 (unsigned long)&vargs, 3751 (unsigned long)&vargs,
3752 0, 0, 0); 3752 0, 0, 0);
3753 #endif 3753 #endif
3754 va_end(vargs); 3754 va_end(vargs);
3755 return (int)_qzz_res; 3755 return (int)_qzz_res;
3756 #endif /* NVALGRIND */ 3756 #endif /* NVALGRIND */
3757 } 3757 }
3758 3758
3759 3759
3760 /* These requests allow control to move from the simulated CPU to the 3760 /* These requests allow control to move from the simulated CPU to the
3761 real CPU, calling an arbitary function. 3761 real CPU, calling an arbitary function.
3762 3762
3763 Note that the current ThreadId is inserted as the first argument. 3763 Note that the current ThreadId is inserted as the first argument.
3764 So this call: 3764 So this call:
3765 3765
3766 VALGRIND_NON_SIMD_CALL2(f, arg1, arg2) 3766 VALGRIND_NON_SIMD_CALL2(f, arg1, arg2)
3767 3767
3768 requires f to have this signature: 3768 requires f to have this signature:
3769 3769
3770 Word f(Word tid, Word arg1, Word arg2) 3770 Word f(Word tid, Word arg1, Word arg2)
3771 3771
3772 where "Word" is a word-sized type. 3772 where "Word" is a word-sized type.
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
3838 does two things: 3838 does two things:
3839 3839
3840 - It records that the block has been allocated. This means any addresses 3840 - It records that the block has been allocated. This means any addresses
3841 within the block mentioned in error messages will be 3841 within the block mentioned in error messages will be
3842 identified as belonging to the block. It also means that if the block 3842 identified as belonging to the block. It also means that if the block
3843 isn't freed it will be detected by the leak checker. 3843 isn't freed it will be detected by the leak checker.
3844 3844
3845 - It marks the block as being addressable and undefined (if 'is_zeroed' is 3845 - It marks the block as being addressable and undefined (if 'is_zeroed' is
3846 not set), or addressable and defined (if 'is_zeroed' is set). This 3846 not set), or addressable and defined (if 'is_zeroed' is set). This
3847 controls how accesses to the block by the program are handled. 3847 controls how accesses to the block by the program are handled.
3848 3848
3849 'addr' is the start of the usable block (ie. after any 3849 'addr' is the start of the usable block (ie. after any
3850 redzone), 'sizeB' is its size. 'rzB' is the redzone size if the allocator 3850 redzone), 'sizeB' is its size. 'rzB' is the redzone size if the allocator
3851 can apply redzones -- these are blocks of padding at the start and end of 3851 can apply redzones -- these are blocks of padding at the start and end of
3852 each block. Adding redzones is recommended as it makes it much more likely 3852 each block. Adding redzones is recommended as it makes it much more likely
3853 Valgrind will spot block overruns. `is_zeroed' indicates if the memory is 3853 Valgrind will spot block overruns. `is_zeroed' indicates if the memory is
3854 zeroed (or filled with another predictable value), as is the case for 3854 zeroed (or filled with another predictable value), as is the case for
3855 calloc(). 3855 calloc().
3856 3856
3857 VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a 3857 VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a
3858 heap block -- that will be used by the client program -- is allocated. 3858 heap block -- that will be used by the client program -- is allocated.
3859 It's best to put it at the outermost level of the allocator if possible; 3859 It's best to put it at the outermost level of the allocator if possible;
3860 for example, if you have a function my_alloc() which calls 3860 for example, if you have a function my_alloc() which calls
3861 internal_alloc(), and the client request is put inside internal_alloc(), 3861 internal_alloc(), and the client request is put inside internal_alloc(),
3862 stack traces relating to the heap block will contain entries for both 3862 stack traces relating to the heap block will contain entries for both
3863 my_alloc() and internal_alloc(), which is probably not what you want. 3863 my_alloc() and internal_alloc(), which is probably not what you want.
3864 3864
3865 For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out 3865 For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out
3866 custom blocks from within a heap block, B, that has been allocated with 3866 custom blocks from within a heap block, B, that has been allocated with
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
4024 #undef PLAT_amd64_darwin 4024 #undef PLAT_amd64_darwin
4025 #undef PLAT_x86_win32 4025 #undef PLAT_x86_win32
4026 #undef PLAT_x86_linux 4026 #undef PLAT_x86_linux
4027 #undef PLAT_amd64_linux 4027 #undef PLAT_amd64_linux
4028 #undef PLAT_ppc32_linux 4028 #undef PLAT_ppc32_linux
4029 #undef PLAT_ppc64_linux 4029 #undef PLAT_ppc64_linux
4030 #undef PLAT_arm_linux 4030 #undef PLAT_arm_linux
4031 #undef PLAT_s390x_linux 4031 #undef PLAT_s390x_linux
4032 4032
4033 #endif /* __VALGRIND_H */ 4033 #endif /* __VALGRIND_H */
OLDNEW
« no previous file with comments | « src/stub-cache.cc ('k') | src/third_party/vtune/jitprofiling.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698