xref: /aosp_15_r20/external/libchrome/base/third_party/valgrind/memcheck.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker 
2*635a8641SAndroid Build Coastguard Worker /*
3*635a8641SAndroid Build Coastguard Worker    ----------------------------------------------------------------
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker    Notice that the following BSD-style license applies to this one
6*635a8641SAndroid Build Coastguard Worker    file (memcheck.h) only.  The rest of Valgrind is licensed under the
7*635a8641SAndroid Build Coastguard Worker    terms of the GNU General Public License, version 2, unless
8*635a8641SAndroid Build Coastguard Worker    otherwise indicated.  See the COPYING file in the source
9*635a8641SAndroid Build Coastguard Worker    distribution for details.
10*635a8641SAndroid Build Coastguard Worker 
11*635a8641SAndroid Build Coastguard Worker    ----------------------------------------------------------------
12*635a8641SAndroid Build Coastguard Worker 
13*635a8641SAndroid Build Coastguard Worker    This file is part of MemCheck, a heavyweight Valgrind tool for
14*635a8641SAndroid Build Coastguard Worker    detecting memory errors.
15*635a8641SAndroid Build Coastguard Worker 
16*635a8641SAndroid Build Coastguard Worker    Copyright (C) 2000-2010 Julian Seward.  All rights reserved.
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker    Redistribution and use in source and binary forms, with or without
19*635a8641SAndroid Build Coastguard Worker    modification, are permitted provided that the following conditions
20*635a8641SAndroid Build Coastguard Worker    are met:
21*635a8641SAndroid Build Coastguard Worker 
22*635a8641SAndroid Build Coastguard Worker    1. Redistributions of source code must retain the above copyright
23*635a8641SAndroid Build Coastguard Worker       notice, this list of conditions and the following disclaimer.
24*635a8641SAndroid Build Coastguard Worker 
25*635a8641SAndroid Build Coastguard Worker    2. The origin of this software must not be misrepresented; you must
26*635a8641SAndroid Build Coastguard Worker       not claim that you wrote the original software.  If you use this
27*635a8641SAndroid Build Coastguard Worker       software in a product, an acknowledgment in the product
28*635a8641SAndroid Build Coastguard Worker       documentation would be appreciated but is not required.
29*635a8641SAndroid Build Coastguard Worker 
30*635a8641SAndroid Build Coastguard Worker    3. Altered source versions must be plainly marked as such, and must
31*635a8641SAndroid Build Coastguard Worker       not be misrepresented as being the original software.
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker    4. The name of the author may not be used to endorse or promote
34*635a8641SAndroid Build Coastguard Worker       products derived from this software without specific prior written
35*635a8641SAndroid Build Coastguard Worker       permission.
36*635a8641SAndroid Build Coastguard Worker 
37*635a8641SAndroid Build Coastguard Worker    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
38*635a8641SAndroid Build Coastguard Worker    OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
39*635a8641SAndroid Build Coastguard Worker    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
40*635a8641SAndroid Build Coastguard Worker    ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
41*635a8641SAndroid Build Coastguard Worker    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
42*635a8641SAndroid Build Coastguard Worker    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
43*635a8641SAndroid Build Coastguard Worker    GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
44*635a8641SAndroid Build Coastguard Worker    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
45*635a8641SAndroid Build Coastguard Worker    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
46*635a8641SAndroid Build Coastguard Worker    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
47*635a8641SAndroid Build Coastguard Worker    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
48*635a8641SAndroid Build Coastguard Worker 
49*635a8641SAndroid Build Coastguard Worker    ----------------------------------------------------------------
50*635a8641SAndroid Build Coastguard Worker 
51*635a8641SAndroid Build Coastguard Worker    Notice that the above BSD-style license applies to this one file
52*635a8641SAndroid Build Coastguard Worker    (memcheck.h) only.  The entire rest of Valgrind is licensed under
53*635a8641SAndroid Build Coastguard Worker    the terms of the GNU General Public License, version 2.  See the
54*635a8641SAndroid Build Coastguard Worker    COPYING file in the source distribution for details.
55*635a8641SAndroid Build Coastguard Worker 
56*635a8641SAndroid Build Coastguard Worker    ----------------------------------------------------------------
57*635a8641SAndroid Build Coastguard Worker */
58*635a8641SAndroid Build Coastguard Worker 
59*635a8641SAndroid Build Coastguard Worker 
60*635a8641SAndroid Build Coastguard Worker #ifndef __MEMCHECK_H
61*635a8641SAndroid Build Coastguard Worker #define __MEMCHECK_H
62*635a8641SAndroid Build Coastguard Worker 
63*635a8641SAndroid Build Coastguard Worker 
64*635a8641SAndroid Build Coastguard Worker /* This file is for inclusion into client (your!) code.
65*635a8641SAndroid Build Coastguard Worker 
66*635a8641SAndroid Build Coastguard Worker    You can use these macros to manipulate and query memory permissions
67*635a8641SAndroid Build Coastguard Worker    inside your own programs.
68*635a8641SAndroid Build Coastguard Worker 
69*635a8641SAndroid Build Coastguard Worker    See comment near the top of valgrind.h on how to use them.
70*635a8641SAndroid Build Coastguard Worker */
71*635a8641SAndroid Build Coastguard Worker 
72*635a8641SAndroid Build Coastguard Worker #include "valgrind.h"
73*635a8641SAndroid Build Coastguard Worker 
74*635a8641SAndroid Build Coastguard Worker /* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
75*635a8641SAndroid Build Coastguard Worker    This enum comprises an ABI exported by Valgrind to programs
76*635a8641SAndroid Build Coastguard Worker    which use client requests.  DO NOT CHANGE THE ORDER OF THESE
77*635a8641SAndroid Build Coastguard Worker    ENTRIES, NOR DELETE ANY -- add new ones at the end. */
78*635a8641SAndroid Build Coastguard Worker typedef
79*635a8641SAndroid Build Coastguard Worker    enum {
80*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__MAKE_MEM_NOACCESS = VG_USERREQ_TOOL_BASE('M','C'),
81*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__MAKE_MEM_UNDEFINED,
82*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__MAKE_MEM_DEFINED,
83*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__DISCARD,
84*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__CHECK_MEM_IS_ADDRESSABLE,
85*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__CHECK_MEM_IS_DEFINED,
86*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__DO_LEAK_CHECK,
87*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__COUNT_LEAKS,
88*635a8641SAndroid Build Coastguard Worker 
89*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__GET_VBITS,
90*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__SET_VBITS,
91*635a8641SAndroid Build Coastguard Worker 
92*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__CREATE_BLOCK,
93*635a8641SAndroid Build Coastguard Worker 
94*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__MAKE_MEM_DEFINED_IF_ADDRESSABLE,
95*635a8641SAndroid Build Coastguard Worker 
96*635a8641SAndroid Build Coastguard Worker       /* Not next to VG_USERREQ__COUNT_LEAKS because it was added later. */
97*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__COUNT_LEAK_BLOCKS,
98*635a8641SAndroid Build Coastguard Worker 
99*635a8641SAndroid Build Coastguard Worker       /* This is just for memcheck's internal use - don't use it */
100*635a8641SAndroid Build Coastguard Worker       _VG_USERREQ__MEMCHECK_RECORD_OVERLAP_ERROR
101*635a8641SAndroid Build Coastguard Worker          = VG_USERREQ_TOOL_BASE('M','C') + 256
102*635a8641SAndroid Build Coastguard Worker    } Vg_MemCheckClientRequest;
103*635a8641SAndroid Build Coastguard Worker 
104*635a8641SAndroid Build Coastguard Worker 
105*635a8641SAndroid Build Coastguard Worker 
106*635a8641SAndroid Build Coastguard Worker /* Client-code macros to manipulate the state of memory. */
107*635a8641SAndroid Build Coastguard Worker 
108*635a8641SAndroid Build Coastguard Worker /* Mark memory at _qzz_addr as unaddressable for _qzz_len bytes. */
109*635a8641SAndroid Build Coastguard Worker #define VALGRIND_MAKE_MEM_NOACCESS(_qzz_addr,_qzz_len)           \
110*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,      \
111*635a8641SAndroid Build Coastguard Worker                             VG_USERREQ__MAKE_MEM_NOACCESS,       \
112*635a8641SAndroid Build Coastguard Worker                             (_qzz_addr), (_qzz_len), 0, 0, 0)
113*635a8641SAndroid Build Coastguard Worker 
114*635a8641SAndroid Build Coastguard Worker /* Similarly, mark memory at _qzz_addr as addressable but undefined
115*635a8641SAndroid Build Coastguard Worker    for _qzz_len bytes. */
116*635a8641SAndroid Build Coastguard Worker #define VALGRIND_MAKE_MEM_UNDEFINED(_qzz_addr,_qzz_len)          \
117*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,      \
118*635a8641SAndroid Build Coastguard Worker                             VG_USERREQ__MAKE_MEM_UNDEFINED,      \
119*635a8641SAndroid Build Coastguard Worker                             (_qzz_addr), (_qzz_len), 0, 0, 0)
120*635a8641SAndroid Build Coastguard Worker 
121*635a8641SAndroid Build Coastguard Worker /* Similarly, mark memory at _qzz_addr as addressable and defined
122*635a8641SAndroid Build Coastguard Worker    for _qzz_len bytes. */
123*635a8641SAndroid Build Coastguard Worker #define VALGRIND_MAKE_MEM_DEFINED(_qzz_addr,_qzz_len)            \
124*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,      \
125*635a8641SAndroid Build Coastguard Worker                             VG_USERREQ__MAKE_MEM_DEFINED,        \
126*635a8641SAndroid Build Coastguard Worker                             (_qzz_addr), (_qzz_len), 0, 0, 0)
127*635a8641SAndroid Build Coastguard Worker 
128*635a8641SAndroid Build Coastguard Worker /* Similar to VALGRIND_MAKE_MEM_DEFINED except that addressability is
129*635a8641SAndroid Build Coastguard Worker    not altered: bytes which are addressable are marked as defined,
130*635a8641SAndroid Build Coastguard Worker    but those which are not addressable are left unchanged. */
131*635a8641SAndroid Build Coastguard Worker #define VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE(_qzz_addr,_qzz_len)     \
132*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,              \
133*635a8641SAndroid Build Coastguard Worker                             VG_USERREQ__MAKE_MEM_DEFINED_IF_ADDRESSABLE, \
134*635a8641SAndroid Build Coastguard Worker                             (_qzz_addr), (_qzz_len), 0, 0, 0)
135*635a8641SAndroid Build Coastguard Worker 
136*635a8641SAndroid Build Coastguard Worker /* Create a block-description handle.  The description is an ascii
137*635a8641SAndroid Build Coastguard Worker    string which is included in any messages pertaining to addresses
138*635a8641SAndroid Build Coastguard Worker    within the specified memory range.  Has no other effect on the
139*635a8641SAndroid Build Coastguard Worker    properties of the memory range. */
140*635a8641SAndroid Build Coastguard Worker #define VALGRIND_CREATE_BLOCK(_qzz_addr,_qzz_len, _qzz_desc)	   \
141*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,        \
142*635a8641SAndroid Build Coastguard Worker                             VG_USERREQ__CREATE_BLOCK,              \
143*635a8641SAndroid Build Coastguard Worker                             (_qzz_addr), (_qzz_len), (_qzz_desc),  \
144*635a8641SAndroid Build Coastguard Worker                             0, 0)
145*635a8641SAndroid Build Coastguard Worker 
146*635a8641SAndroid Build Coastguard Worker /* Discard a block-description-handle. Returns 1 for an
147*635a8641SAndroid Build Coastguard Worker    invalid handle, 0 for a valid handle. */
148*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DISCARD(_qzz_blkindex)                          \
149*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */,      \
150*635a8641SAndroid Build Coastguard Worker                             VG_USERREQ__DISCARD,                 \
151*635a8641SAndroid Build Coastguard Worker                             0, (_qzz_blkindex), 0, 0, 0)
152*635a8641SAndroid Build Coastguard Worker 
153*635a8641SAndroid Build Coastguard Worker 
154*635a8641SAndroid Build Coastguard Worker /* Client-code macros to check the state of memory. */
155*635a8641SAndroid Build Coastguard Worker 
156*635a8641SAndroid Build Coastguard Worker /* Check that memory at _qzz_addr is addressable for _qzz_len bytes.
157*635a8641SAndroid Build Coastguard Worker    If suitable addressibility is not established, Valgrind prints an
158*635a8641SAndroid Build Coastguard Worker    error message and returns the address of the first offending byte.
159*635a8641SAndroid Build Coastguard Worker    Otherwise it returns zero. */
160*635a8641SAndroid Build Coastguard Worker #define VALGRIND_CHECK_MEM_IS_ADDRESSABLE(_qzz_addr,_qzz_len)      \
161*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                             \
162*635a8641SAndroid Build Coastguard Worker                             VG_USERREQ__CHECK_MEM_IS_ADDRESSABLE,  \
163*635a8641SAndroid Build Coastguard Worker                             (_qzz_addr), (_qzz_len), 0, 0, 0)
164*635a8641SAndroid Build Coastguard Worker 
165*635a8641SAndroid Build Coastguard Worker /* Check that memory at _qzz_addr is addressable and defined for
166*635a8641SAndroid Build Coastguard Worker    _qzz_len bytes.  If suitable addressibility and definedness are not
167*635a8641SAndroid Build Coastguard Worker    established, Valgrind prints an error message and returns the
168*635a8641SAndroid Build Coastguard Worker    address of the first offending byte.  Otherwise it returns zero. */
169*635a8641SAndroid Build Coastguard Worker #define VALGRIND_CHECK_MEM_IS_DEFINED(_qzz_addr,_qzz_len)        \
170*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                           \
171*635a8641SAndroid Build Coastguard Worker                             VG_USERREQ__CHECK_MEM_IS_DEFINED,    \
172*635a8641SAndroid Build Coastguard Worker                             (_qzz_addr), (_qzz_len), 0, 0, 0)
173*635a8641SAndroid Build Coastguard Worker 
174*635a8641SAndroid Build Coastguard Worker /* Use this macro to force the definedness and addressibility of an
175*635a8641SAndroid Build Coastguard Worker    lvalue to be checked.  If suitable addressibility and definedness
176*635a8641SAndroid Build Coastguard Worker    are not established, Valgrind prints an error message and returns
177*635a8641SAndroid Build Coastguard Worker    the address of the first offending byte.  Otherwise it returns
178*635a8641SAndroid Build Coastguard Worker    zero. */
179*635a8641SAndroid Build Coastguard Worker #define VALGRIND_CHECK_VALUE_IS_DEFINED(__lvalue)                \
180*635a8641SAndroid Build Coastguard Worker    VALGRIND_CHECK_MEM_IS_DEFINED(                                \
181*635a8641SAndroid Build Coastguard Worker       (volatile unsigned char *)&(__lvalue),                     \
182*635a8641SAndroid Build Coastguard Worker                       (unsigned long)(sizeof (__lvalue)))
183*635a8641SAndroid Build Coastguard Worker 
184*635a8641SAndroid Build Coastguard Worker 
185*635a8641SAndroid Build Coastguard Worker /* Do a full memory leak check (like --leak-check=full) mid-execution. */
186*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_LEAK_CHECK                                   \
187*635a8641SAndroid Build Coastguard Worker    {unsigned long _qzz_res;                                      \
188*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                      \
189*635a8641SAndroid Build Coastguard Worker                             VG_USERREQ__DO_LEAK_CHECK,           \
190*635a8641SAndroid Build Coastguard Worker                             0, 0, 0, 0, 0);                      \
191*635a8641SAndroid Build Coastguard Worker    }
192*635a8641SAndroid Build Coastguard Worker 
193*635a8641SAndroid Build Coastguard Worker /* Do a summary memory leak check (like --leak-check=summary) mid-execution. */
194*635a8641SAndroid Build Coastguard Worker #define VALGRIND_DO_QUICK_LEAK_CHECK				 \
195*635a8641SAndroid Build Coastguard Worker    {unsigned long _qzz_res;                                      \
196*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                      \
197*635a8641SAndroid Build Coastguard Worker                             VG_USERREQ__DO_LEAK_CHECK,           \
198*635a8641SAndroid Build Coastguard Worker                             1, 0, 0, 0, 0);                      \
199*635a8641SAndroid Build Coastguard Worker    }
200*635a8641SAndroid Build Coastguard Worker 
201*635a8641SAndroid Build Coastguard Worker /* Return number of leaked, dubious, reachable and suppressed bytes found by
202*635a8641SAndroid Build Coastguard Worker    all previous leak checks.  They must be lvalues.  */
203*635a8641SAndroid Build Coastguard Worker #define VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed)     \
204*635a8641SAndroid Build Coastguard Worker    /* For safety on 64-bit platforms we assign the results to private
205*635a8641SAndroid Build Coastguard Worker       unsigned long variables, then assign these to the lvalues the user
206*635a8641SAndroid Build Coastguard Worker       specified, which works no matter what type 'leaked', 'dubious', etc
207*635a8641SAndroid Build Coastguard Worker       are.  We also initialise '_qzz_leaked', etc because
208*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__COUNT_LEAKS doesn't mark the values returned as
209*635a8641SAndroid Build Coastguard Worker       defined. */                                                        \
210*635a8641SAndroid Build Coastguard Worker    {unsigned long _qzz_res;                                              \
211*635a8641SAndroid Build Coastguard Worker     unsigned long _qzz_leaked    = 0, _qzz_dubious    = 0;               \
212*635a8641SAndroid Build Coastguard Worker     unsigned long _qzz_reachable = 0, _qzz_suppressed = 0;               \
213*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                              \
214*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__COUNT_LEAKS,                  \
215*635a8641SAndroid Build Coastguard Worker                                &_qzz_leaked, &_qzz_dubious,              \
216*635a8641SAndroid Build Coastguard Worker                                &_qzz_reachable, &_qzz_suppressed, 0);    \
217*635a8641SAndroid Build Coastguard Worker     leaked     = _qzz_leaked;                                            \
218*635a8641SAndroid Build Coastguard Worker     dubious    = _qzz_dubious;                                           \
219*635a8641SAndroid Build Coastguard Worker     reachable  = _qzz_reachable;                                         \
220*635a8641SAndroid Build Coastguard Worker     suppressed = _qzz_suppressed;                                        \
221*635a8641SAndroid Build Coastguard Worker    }
222*635a8641SAndroid Build Coastguard Worker 
223*635a8641SAndroid Build Coastguard Worker /* Return number of leaked, dubious, reachable and suppressed bytes found by
224*635a8641SAndroid Build Coastguard Worker    all previous leak checks.  They must be lvalues.  */
225*635a8641SAndroid Build Coastguard Worker #define VALGRIND_COUNT_LEAK_BLOCKS(leaked, dubious, reachable, suppressed) \
226*635a8641SAndroid Build Coastguard Worker    /* For safety on 64-bit platforms we assign the results to private
227*635a8641SAndroid Build Coastguard Worker       unsigned long variables, then assign these to the lvalues the user
228*635a8641SAndroid Build Coastguard Worker       specified, which works no matter what type 'leaked', 'dubious', etc
229*635a8641SAndroid Build Coastguard Worker       are.  We also initialise '_qzz_leaked', etc because
230*635a8641SAndroid Build Coastguard Worker       VG_USERREQ__COUNT_LEAKS doesn't mark the values returned as
231*635a8641SAndroid Build Coastguard Worker       defined. */                                                        \
232*635a8641SAndroid Build Coastguard Worker    {unsigned long _qzz_res;                                              \
233*635a8641SAndroid Build Coastguard Worker     unsigned long _qzz_leaked    = 0, _qzz_dubious    = 0;               \
234*635a8641SAndroid Build Coastguard Worker     unsigned long _qzz_reachable = 0, _qzz_suppressed = 0;               \
235*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                              \
236*635a8641SAndroid Build Coastguard Worker                                VG_USERREQ__COUNT_LEAK_BLOCKS,            \
237*635a8641SAndroid Build Coastguard Worker                                &_qzz_leaked, &_qzz_dubious,              \
238*635a8641SAndroid Build Coastguard Worker                                &_qzz_reachable, &_qzz_suppressed, 0);    \
239*635a8641SAndroid Build Coastguard Worker     leaked     = _qzz_leaked;                                            \
240*635a8641SAndroid Build Coastguard Worker     dubious    = _qzz_dubious;                                           \
241*635a8641SAndroid Build Coastguard Worker     reachable  = _qzz_reachable;                                         \
242*635a8641SAndroid Build Coastguard Worker     suppressed = _qzz_suppressed;                                        \
243*635a8641SAndroid Build Coastguard Worker    }
244*635a8641SAndroid Build Coastguard Worker 
245*635a8641SAndroid Build Coastguard Worker 
246*635a8641SAndroid Build Coastguard Worker /* Get the validity data for addresses [zza..zza+zznbytes-1] and copy it
247*635a8641SAndroid Build Coastguard Worker    into the provided zzvbits array.  Return values:
248*635a8641SAndroid Build Coastguard Worker       0   if not running on valgrind
249*635a8641SAndroid Build Coastguard Worker       1   success
250*635a8641SAndroid Build Coastguard Worker       2   [previously indicated unaligned arrays;  these are now allowed]
251*635a8641SAndroid Build Coastguard Worker       3   if any parts of zzsrc/zzvbits are not addressable.
252*635a8641SAndroid Build Coastguard Worker    The metadata is not copied in cases 0, 2 or 3 so it should be
253*635a8641SAndroid Build Coastguard Worker    impossible to segfault your system by using this call.
254*635a8641SAndroid Build Coastguard Worker */
255*635a8641SAndroid Build Coastguard Worker #define VALGRIND_GET_VBITS(zza,zzvbits,zznbytes)                \
256*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                          \
257*635a8641SAndroid Build Coastguard Worker                                     VG_USERREQ__GET_VBITS,      \
258*635a8641SAndroid Build Coastguard Worker                                     (const char*)(zza),         \
259*635a8641SAndroid Build Coastguard Worker                                     (char*)(zzvbits),           \
260*635a8641SAndroid Build Coastguard Worker                                     (zznbytes), 0, 0)
261*635a8641SAndroid Build Coastguard Worker 
262*635a8641SAndroid Build Coastguard Worker /* Set the validity data for addresses [zza..zza+zznbytes-1], copying it
263*635a8641SAndroid Build Coastguard Worker    from the provided zzvbits array.  Return values:
264*635a8641SAndroid Build Coastguard Worker       0   if not running on valgrind
265*635a8641SAndroid Build Coastguard Worker       1   success
266*635a8641SAndroid Build Coastguard Worker       2   [previously indicated unaligned arrays;  these are now allowed]
267*635a8641SAndroid Build Coastguard Worker       3   if any parts of zza/zzvbits are not addressable.
268*635a8641SAndroid Build Coastguard Worker    The metadata is not copied in cases 0, 2 or 3 so it should be
269*635a8641SAndroid Build Coastguard Worker    impossible to segfault your system by using this call.
270*635a8641SAndroid Build Coastguard Worker */
271*635a8641SAndroid Build Coastguard Worker #define VALGRIND_SET_VBITS(zza,zzvbits,zznbytes)                \
272*635a8641SAndroid Build Coastguard Worker     VALGRIND_DO_CLIENT_REQUEST_EXPR(0,                          \
273*635a8641SAndroid Build Coastguard Worker                                     VG_USERREQ__SET_VBITS,      \
274*635a8641SAndroid Build Coastguard Worker                                     (const char*)(zza),         \
275*635a8641SAndroid Build Coastguard Worker                                     (const char*)(zzvbits),     \
276*635a8641SAndroid Build Coastguard Worker                                     (zznbytes), 0, 0 )
277*635a8641SAndroid Build Coastguard Worker 
278*635a8641SAndroid Build Coastguard Worker #endif
279*635a8641SAndroid Build Coastguard Worker 
280