blob: c48e48142f7d35ffbd70153efe52298f7357a85d [file] [log] [blame]
njnc9539842002-10-02 13:26:35 +00001
njn25e49d8e72002-09-23 09:36:25 +00002/*--------------------------------------------------------------------*/
nethercote137bc552003-11-14 17:47:54 +00003/*--- A header file for all parts of the MemCheck tool. ---*/
njn25cac76cb2002-09-23 11:21:57 +00004/*--- mc_include.h ---*/
njn25e49d8e72002-09-23 09:36:25 +00005/*--------------------------------------------------------------------*/
6
7/*
nethercote137bc552003-11-14 17:47:54 +00008 This file is part of MemCheck, a heavyweight Valgrind tool for
njnc9539842002-10-02 13:26:35 +00009 detecting memory errors.
njn25e49d8e72002-09-23 09:36:25 +000010
sewardj9ebd6e02007-01-08 06:01:59 +000011 Copyright (C) 2000-2007 Julian Seward
njn25e49d8e72002-09-23 09:36:25 +000012 jseward@acm.org
13
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation; either version 2 of the
17 License, or (at your option) any later version.
18
19 This program is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27 02111-1307, USA.
28
29 The GNU General Public License is contained in the file COPYING.
30*/
31
njn25cac76cb2002-09-23 11:21:57 +000032#ifndef __MC_INCLUDE_H
33#define __MC_INCLUDE_H
njn25e49d8e72002-09-23 09:36:25 +000034
njn44acd3e2005-05-13 21:39:45 +000035#define MC_(str) VGAPPEND(vgMemCheck_,str)
njn25e49d8e72002-09-23 09:36:25 +000036
37/*------------------------------------------------------------*/
njn1d0825f2006-03-27 11:37:07 +000038/*--- Tracking the heap ---*/
njn43c799e2003-04-08 00:08:52 +000039/*------------------------------------------------------------*/
40
njn1d0825f2006-03-27 11:37:07 +000041/* We want at least a 16B redzone on client heap blocks for Memcheck */
42#define MC_MALLOC_REDZONE_SZB 16
43
44/* For malloc()/new/new[] vs. free()/delete/delete[] mismatch checking. */
45typedef
46 enum {
47 MC_AllocMalloc = 0,
48 MC_AllocNew = 1,
49 MC_AllocNewVec = 2,
50 MC_AllocCustom = 3
51 }
52 MC_AllocKind;
53
54/* Nb: first two fields must match core's VgHashNode. */
55typedef
56 struct _MC_Chunk {
57 struct _MC_Chunk* next;
58 Addr data; // ptr to actual block
njn718d3b12006-12-16 00:54:12 +000059 SizeT szB : (sizeof(UWord)*8)-2; // size requested; 30 or 62 bits
njn1d0825f2006-03-27 11:37:07 +000060 MC_AllocKind allockind : 2; // which wrapper did the allocation
61 ExeContext* where; // where it was allocated
62 }
63 MC_Chunk;
64
65/* Memory pool. Nb: first two fields must match core's VgHashNode. */
66typedef
67 struct _MC_Mempool {
68 struct _MC_Mempool* next;
69 Addr pool; // pool identifier
70 SizeT rzB; // pool red-zone size
71 Bool is_zeroed; // allocations from this pool are zeroed
72 VgHashTable chunks; // chunks associated with this pool
73 }
74 MC_Mempool;
75
76
77extern void* MC_(new_block) ( ThreadId tid,
78 Addr p, SizeT size, SizeT align, UInt rzB,
79 Bool is_zeroed, MC_AllocKind kind,
80 VgHashTable table);
81extern void MC_(handle_free) ( ThreadId tid,
82 Addr p, UInt rzB, MC_AllocKind kind );
83
84extern void MC_(create_mempool) ( Addr pool, UInt rzB, Bool is_zeroed );
85extern void MC_(destroy_mempool) ( Addr pool );
86extern void MC_(mempool_alloc) ( ThreadId tid, Addr pool,
87 Addr addr, SizeT size );
88extern void MC_(mempool_free) ( Addr pool, Addr addr );
sewardj2c1c9df2006-07-28 00:06:37 +000089extern void MC_(mempool_trim) ( Addr pool, Addr addr, SizeT size );
sewardjc740d762006-10-05 17:59:23 +000090extern void MC_(move_mempool) ( Addr poolA, Addr poolB );
91extern void MC_(mempool_change) ( Addr pool, Addr addrA, Addr addrB, SizeT size );
92extern Bool MC_(mempool_exists) ( Addr pool );
njn1d0825f2006-03-27 11:37:07 +000093
94extern MC_Chunk* MC_(get_freed_list_head)( void );
95
96/* For tracking malloc'd blocks */
97extern VgHashTable MC_(malloc_list);
98
99/* For tracking memory pools. */
100extern VgHashTable MC_(mempool_list);
101
102/* Shadow memory functions */
njndbf7ca72006-03-31 11:57:59 +0000103extern Bool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr );
104extern void MC_(make_mem_noaccess) ( Addr a, SizeT len );
105extern void MC_(make_mem_undefined)( Addr a, SizeT len );
106extern void MC_(make_mem_defined) ( Addr a, SizeT len );
njn1d0825f2006-03-27 11:37:07 +0000107extern void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len );
108
109extern void MC_(print_malloc_stats) ( void );
110
111extern void* MC_(malloc) ( ThreadId tid, SizeT n );
112extern void* MC_(__builtin_new) ( ThreadId tid, SizeT n );
113extern void* MC_(__builtin_vec_new) ( ThreadId tid, SizeT n );
114extern void* MC_(memalign) ( ThreadId tid, SizeT align, SizeT n );
115extern void* MC_(calloc) ( ThreadId tid, SizeT nmemb, SizeT size1 );
116extern void MC_(free) ( ThreadId tid, void* p );
117extern void MC_(__builtin_delete) ( ThreadId tid, void* p );
118extern void MC_(__builtin_vec_delete) ( ThreadId tid, void* p );
119extern void* MC_(realloc) ( ThreadId tid, void* p, SizeT new_size );
njn43c799e2003-04-08 00:08:52 +0000120
121
122/*------------------------------------------------------------*/
njn1d0825f2006-03-27 11:37:07 +0000123/*--- Profiling of memory events ---*/
124/*------------------------------------------------------------*/
125
126/* Define to collect detailed performance info. */
127/* #define MC_PROFILE_MEMORY */
128
129#ifdef MC_PROFILE_MEMORY
130# define N_PROF_EVENTS 500
131
132extern UInt MC_(event_ctr)[N_PROF_EVENTS];
133extern HChar* MC_(event_ctr_name)[N_PROF_EVENTS];
134
135# define PROF_EVENT(ev, name) \
136 do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS); \
137 /* crude and inaccurate check to ensure the same */ \
138 /* event isn't being used with > 1 name */ \
139 if (MC_(event_ctr_name)[ev]) \
140 tl_assert(name == MC_(event_ctr_name)[ev]); \
141 MC_(event_ctr)[ev]++; \
142 MC_(event_ctr_name)[ev] = (name); \
143 } while (False);
144
145#else
146
147# define PROF_EVENT(ev, name) /* */
148
149#endif /* MC_PROFILE_MEMORY */
150
151
152/*------------------------------------------------------------*/
153/*--- V and A bits (Victoria & Albert ?) ---*/
154/*------------------------------------------------------------*/
155
156/* The number of entries in the primary map can be altered. However
157 we hardwire the assumption that each secondary map covers precisely
158 64k of address space. */
159#define SM_SIZE 65536 /* DO NOT CHANGE */
160#define SM_MASK (SM_SIZE-1) /* DO NOT CHANGE */
161
162#define V_BIT_DEFINED 0
163#define V_BIT_UNDEFINED 1
164
165#define V_BITS8_DEFINED 0
166#define V_BITS8_UNDEFINED 0xFF
167
168#define V_BITS16_DEFINED 0
169#define V_BITS16_UNDEFINED 0xFFFF
170
171#define V_BITS32_DEFINED 0
172#define V_BITS32_UNDEFINED 0xFFFFFFFF
173
174#define V_BITS64_DEFINED 0ULL
175#define V_BITS64_UNDEFINED 0xFFFFFFFFFFFFFFFFULL
176
177
178/*------------------------------------------------------------*/
179/*--- Leak checking ---*/
180/*------------------------------------------------------------*/
181
njn718d3b12006-12-16 00:54:12 +0000182/* A block is either
183 -- Proper-ly reached; a pointer to its start has been found
184 -- Interior-ly reached; only an interior pointer to it has been found
185 -- Unreached; so far, no pointers to any part of it have been found.
186 -- IndirectLeak; leaked, but referred to by another leaked block
187*/
188typedef
189 enum {
190 Unreached =0,
191 IndirectLeak =1,
192 Interior =2,
193 Proper =3
194 }
195 Reachedness;
196
njn1d0825f2006-03-27 11:37:07 +0000197/* For VALGRIND_COUNT_LEAKS client request */
198extern SizeT MC_(bytes_leaked);
199extern SizeT MC_(bytes_indirect);
200extern SizeT MC_(bytes_dubious);
201extern SizeT MC_(bytes_reachable);
202extern SizeT MC_(bytes_suppressed);
203
njn1d0825f2006-03-27 11:37:07 +0000204typedef
205 enum {
206 LC_Off,
207 LC_Summary,
208 LC_Full,
209 }
210 LeakCheckMode;
211
njn718d3b12006-12-16 00:54:12 +0000212/* A block record, used for generating err msgs. */
213typedef
214 struct _LossRecord {
215 struct _LossRecord* next;
216 /* Where these lost blocks were allocated. */
217 ExeContext* allocated_at;
218 /* Their reachability. */
219 Reachedness loss_mode;
220 /* Number of blocks and total # bytes involved. */
221 SizeT total_bytes;
222 SizeT indirect_bytes;
223 UInt num_blocks;
224 }
225 LossRecord;
226
njn1d0825f2006-03-27 11:37:07 +0000227extern void MC_(do_detect_memory_leaks) (
228 ThreadId tid, LeakCheckMode mode,
229 Bool (*is_within_valid_secondary) ( Addr ),
230 Bool (*is_valid_aligned_word) ( Addr )
231 );
232
njn718d3b12006-12-16 00:54:12 +0000233extern void MC_(pp_LeakError)(UInt n_this_record, UInt n_total_records,
234 LossRecord* l);
235
236
237/*------------------------------------------------------------*/
238/*--- Errors and suppressions ---*/
239/*------------------------------------------------------------*/
240
241extern void MC_(record_free_error) ( ThreadId tid, Addr a );
242extern void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
243extern void MC_(record_freemismatch_error) ( ThreadId tid, MC_Chunk* mc );
244extern Bool MC_(record_leak_error) ( ThreadId tid,
245 UInt n_this_record,
246 UInt n_total_records,
247 LossRecord* lossRecord,
248 Bool print_record );
249
njn1d0825f2006-03-27 11:37:07 +0000250/*------------------------------------------------------------*/
251/*--- Command line options + defaults ---*/
252/*------------------------------------------------------------*/
253
254/* Allow loads from partially-valid addresses? default: YES */
255extern Bool MC_(clo_partial_loads_ok);
256
257/* Max volume of the freed blocks queue. */
sewardjfa4ca3b2007-11-30 17:19:36 +0000258extern Long MC_(clo_freelist_vol);
njn1d0825f2006-03-27 11:37:07 +0000259
260/* Do leak check at exit? default: NO */
261extern LeakCheckMode MC_(clo_leak_check);
262
263/* How closely should we compare ExeContexts in leak records? default: 2 */
264extern VgRes MC_(clo_leak_resolution);
265
266/* In leak check, show reachable-but-not-freed blocks? default: NO */
267extern Bool MC_(clo_show_reachable);
268
269/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
270 * default: NO */
271extern Bool MC_(clo_workaround_gcc296_bugs);
272
273/* Do undefined value checking? "No" gives Addrcheck-style behaviour, ie.
274 * faster but fewer errors found. Note that although Addrcheck had 1 bit
275 * per byte overhead vs the old Memcheck's 9 bits per byte, with this mode
276 * and compressed V bits, no memory is saved with this mode -- it's still
277 * 2 bits per byte overhead. This is a little wasteful -- it could be done
278 * with 1 bit per byte -- but lets us reuse the many shadow memory access
279 * functions. Note also that in this mode the secondary V bit table is
280 * never used.
281 *
282 * default: YES */
283extern Bool MC_(clo_undef_value_errors);
284
sewardjeb0fa932007-11-30 21:41:40 +0000285/* Fill malloc-d/free-d client blocks with a specific value? -1 if
286 not, else 0x00 .. 0xFF indicating the fill value to use. Can be
287 useful for causing programs with bad heap corruption to fail in
288 more repeatable ways. Note that malloc-filled and free-filled
289 areas are still undefined and noaccess respectively. This merely
290 causes them to contain the specified values. */
291extern Int MC_(clo_malloc_fill);
292extern Int MC_(clo_free_fill);
293
njn1d0825f2006-03-27 11:37:07 +0000294
295/*------------------------------------------------------------*/
296/*--- Instrumentation ---*/
njn25e49d8e72002-09-23 09:36:25 +0000297/*------------------------------------------------------------*/
298
njn66fe05a2003-07-22 09:12:33 +0000299/* Functions defined in mc_main.c */
njnaf839f52005-06-23 03:27:57 +0000300extern VG_REGPARM(1) void MC_(helperc_complain_undef) ( HWord );
sewardj11bcc4e2005-04-23 22:38:38 +0000301extern void MC_(helperc_value_check8_fail) ( void );
sewardj95448072004-11-22 20:19:51 +0000302extern void MC_(helperc_value_check4_fail) ( void );
303extern void MC_(helperc_value_check1_fail) ( void );
304extern void MC_(helperc_value_check0_fail) ( void );
305
njn1d0825f2006-03-27 11:37:07 +0000306extern VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
307extern VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
308extern VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
309extern VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
310extern VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
311extern VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
312extern VG_REGPARM(2) void MC_(helperc_STOREV8) ( Addr, UWord );
sewardj95448072004-11-22 20:19:51 +0000313
njn1d0825f2006-03-27 11:37:07 +0000314extern VG_REGPARM(1) ULong MC_(helperc_LOADV64be) ( Addr );
315extern VG_REGPARM(1) ULong MC_(helperc_LOADV64le) ( Addr );
316extern VG_REGPARM(1) UWord MC_(helperc_LOADV32be) ( Addr );
317extern VG_REGPARM(1) UWord MC_(helperc_LOADV32le) ( Addr );
318extern VG_REGPARM(1) UWord MC_(helperc_LOADV16be) ( Addr );
319extern VG_REGPARM(1) UWord MC_(helperc_LOADV16le) ( Addr );
320extern VG_REGPARM(1) UWord MC_(helperc_LOADV8) ( Addr );
njn25e49d8e72002-09-23 09:36:25 +0000321
sewardj826ec492005-05-12 18:05:00 +0000322extern void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len );
323
njn51d827b2005-05-09 01:02:08 +0000324/* Functions defined in mc_translate.c */
sewardj4ba057c2005-10-18 12:04:18 +0000325extern
sewardj0b9d74a2006-12-24 02:24:11 +0000326IRSB* MC_(instrument) ( VgCallbackClosure* closure,
327 IRSB* bb_in,
sewardj461df9c2006-01-17 02:06:39 +0000328 VexGuestLayout* layout,
329 VexGuestExtents* vge,
sewardj4ba057c2005-10-18 12:04:18 +0000330 IRType gWordTy, IRType hWordTy );
sewardj8d61eb12005-07-08 09:46:53 +0000331
sewardj81651dc2007-08-28 06:05:20 +0000332extern
333IRSB* MC_(final_tidy) ( IRSB* );
334
sewardj8d61eb12005-07-08 09:46:53 +0000335#endif /* ndef __MC_INCLUDE_H */
njn25e49d8e72002-09-23 09:36:25 +0000336
337/*--------------------------------------------------------------------*/
nethercote8b76fe52004-11-08 19:20:09 +0000338/*--- end ---*/
njn25e49d8e72002-09-23 09:36:25 +0000339/*--------------------------------------------------------------------*/
340