blob: 77440cfde8c33ce8ff403670261561f37826f0b9 [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. */
258extern Int MC_(clo_freelist_vol);
259
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
285
286/*------------------------------------------------------------*/
287/*--- Instrumentation ---*/
njn25e49d8e72002-09-23 09:36:25 +0000288/*------------------------------------------------------------*/
289
njn66fe05a2003-07-22 09:12:33 +0000290/* Functions defined in mc_main.c */
njnaf839f52005-06-23 03:27:57 +0000291extern VG_REGPARM(1) void MC_(helperc_complain_undef) ( HWord );
sewardj11bcc4e2005-04-23 22:38:38 +0000292extern void MC_(helperc_value_check8_fail) ( void );
sewardj95448072004-11-22 20:19:51 +0000293extern void MC_(helperc_value_check4_fail) ( void );
294extern void MC_(helperc_value_check1_fail) ( void );
295extern void MC_(helperc_value_check0_fail) ( void );
296
njn1d0825f2006-03-27 11:37:07 +0000297extern VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
298extern VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
299extern VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
300extern VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
301extern VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
302extern VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
303extern VG_REGPARM(2) void MC_(helperc_STOREV8) ( Addr, UWord );
sewardj95448072004-11-22 20:19:51 +0000304
njn1d0825f2006-03-27 11:37:07 +0000305extern VG_REGPARM(1) ULong MC_(helperc_LOADV64be) ( Addr );
306extern VG_REGPARM(1) ULong MC_(helperc_LOADV64le) ( Addr );
307extern VG_REGPARM(1) UWord MC_(helperc_LOADV32be) ( Addr );
308extern VG_REGPARM(1) UWord MC_(helperc_LOADV32le) ( Addr );
309extern VG_REGPARM(1) UWord MC_(helperc_LOADV16be) ( Addr );
310extern VG_REGPARM(1) UWord MC_(helperc_LOADV16le) ( Addr );
311extern VG_REGPARM(1) UWord MC_(helperc_LOADV8) ( Addr );
njn25e49d8e72002-09-23 09:36:25 +0000312
sewardj826ec492005-05-12 18:05:00 +0000313extern void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len );
314
njn51d827b2005-05-09 01:02:08 +0000315/* Functions defined in mc_translate.c */
sewardj4ba057c2005-10-18 12:04:18 +0000316extern
sewardj0b9d74a2006-12-24 02:24:11 +0000317IRSB* MC_(instrument) ( VgCallbackClosure* closure,
318 IRSB* bb_in,
sewardj461df9c2006-01-17 02:06:39 +0000319 VexGuestLayout* layout,
320 VexGuestExtents* vge,
sewardj4ba057c2005-10-18 12:04:18 +0000321 IRType gWordTy, IRType hWordTy );
sewardj8d61eb12005-07-08 09:46:53 +0000322
sewardj81651dc2007-08-28 06:05:20 +0000323extern
324IRSB* MC_(final_tidy) ( IRSB* );
325
sewardj8d61eb12005-07-08 09:46:53 +0000326#endif /* ndef __MC_INCLUDE_H */
njn25e49d8e72002-09-23 09:36:25 +0000327
328/*--------------------------------------------------------------------*/
nethercote8b76fe52004-11-08 19:20:09 +0000329/*--- end ---*/
njn25e49d8e72002-09-23 09:36:25 +0000330/*--------------------------------------------------------------------*/
331