blob: ed4c789459f785d18820910c07e7ca1c691cda0d [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
sewardj4d474d02008-02-11 11:34:59 +000011 Copyright (C) 2000-2008 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
sewardj7ce71662008-05-02 10:33:15 +000037
38/* This is a private header file for use only within the
39 memcheck/ directory. */
40
njn25e49d8e72002-09-23 09:36:25 +000041/*------------------------------------------------------------*/
njn1d0825f2006-03-27 11:37:07 +000042/*--- Tracking the heap ---*/
njn43c799e2003-04-08 00:08:52 +000043/*------------------------------------------------------------*/
44
njn1d0825f2006-03-27 11:37:07 +000045/* We want at least a 16B redzone on client heap blocks for Memcheck */
46#define MC_MALLOC_REDZONE_SZB 16
47
48/* For malloc()/new/new[] vs. free()/delete/delete[] mismatch checking. */
49typedef
50 enum {
51 MC_AllocMalloc = 0,
52 MC_AllocNew = 1,
53 MC_AllocNewVec = 2,
54 MC_AllocCustom = 3
55 }
56 MC_AllocKind;
57
58/* Nb: first two fields must match core's VgHashNode. */
59typedef
60 struct _MC_Chunk {
61 struct _MC_Chunk* next;
62 Addr data; // ptr to actual block
njn718d3b12006-12-16 00:54:12 +000063 SizeT szB : (sizeof(UWord)*8)-2; // size requested; 30 or 62 bits
njn1d0825f2006-03-27 11:37:07 +000064 MC_AllocKind allockind : 2; // which wrapper did the allocation
65 ExeContext* where; // where it was allocated
66 }
67 MC_Chunk;
68
69/* Memory pool. Nb: first two fields must match core's VgHashNode. */
70typedef
71 struct _MC_Mempool {
72 struct _MC_Mempool* next;
73 Addr pool; // pool identifier
74 SizeT rzB; // pool red-zone size
75 Bool is_zeroed; // allocations from this pool are zeroed
76 VgHashTable chunks; // chunks associated with this pool
77 }
78 MC_Mempool;
79
80
81extern void* MC_(new_block) ( ThreadId tid,
82 Addr p, SizeT size, SizeT align, UInt rzB,
83 Bool is_zeroed, MC_AllocKind kind,
84 VgHashTable table);
85extern void MC_(handle_free) ( ThreadId tid,
86 Addr p, UInt rzB, MC_AllocKind kind );
87
88extern void MC_(create_mempool) ( Addr pool, UInt rzB, Bool is_zeroed );
89extern void MC_(destroy_mempool) ( Addr pool );
90extern void MC_(mempool_alloc) ( ThreadId tid, Addr pool,
91 Addr addr, SizeT size );
92extern void MC_(mempool_free) ( Addr pool, Addr addr );
sewardj2c1c9df2006-07-28 00:06:37 +000093extern void MC_(mempool_trim) ( Addr pool, Addr addr, SizeT size );
sewardjc740d762006-10-05 17:59:23 +000094extern void MC_(move_mempool) ( Addr poolA, Addr poolB );
95extern void MC_(mempool_change) ( Addr pool, Addr addrA, Addr addrB, SizeT size );
96extern Bool MC_(mempool_exists) ( Addr pool );
njn1d0825f2006-03-27 11:37:07 +000097
98extern MC_Chunk* MC_(get_freed_list_head)( void );
99
100/* For tracking malloc'd blocks */
101extern VgHashTable MC_(malloc_list);
102
103/* For tracking memory pools. */
104extern VgHashTable MC_(mempool_list);
105
106/* Shadow memory functions */
njndbf7ca72006-03-31 11:57:59 +0000107extern Bool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr );
sewardj7cf4e6b2008-05-01 20:24:26 +0000108extern void MC_(make_mem_noaccess) ( Addr a, SizeT len );
109extern void MC_(make_mem_undefined_w_otag)( Addr a, SizeT len, UInt otag );
110extern void MC_(make_mem_defined) ( Addr a, SizeT len );
njn1d0825f2006-03-27 11:37:07 +0000111extern void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len );
112
113extern void MC_(print_malloc_stats) ( void );
114
115extern void* MC_(malloc) ( ThreadId tid, SizeT n );
116extern void* MC_(__builtin_new) ( ThreadId tid, SizeT n );
117extern void* MC_(__builtin_vec_new) ( ThreadId tid, SizeT n );
118extern void* MC_(memalign) ( ThreadId tid, SizeT align, SizeT n );
119extern void* MC_(calloc) ( ThreadId tid, SizeT nmemb, SizeT size1 );
120extern void MC_(free) ( ThreadId tid, void* p );
121extern void MC_(__builtin_delete) ( ThreadId tid, void* p );
122extern void MC_(__builtin_vec_delete) ( ThreadId tid, void* p );
123extern void* MC_(realloc) ( ThreadId tid, void* p, SizeT new_size );
njn43c799e2003-04-08 00:08:52 +0000124
sewardj7cf4e6b2008-05-01 20:24:26 +0000125/*------------------------------------------------------------*/
126/*--- Origin tracking translate-time support ---*/
127/*------------------------------------------------------------*/
128
129/* See detailed comments in mc_machine.c. */
130extern
131Int MC_(get_otrack_shadow_offset) ( Int offset, Int szB );
132extern
133IRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr );
134
135/* Constants which are used as the lowest 2 bits in origin tags.
136
137 An origin tag comprises an upper 30-bit ECU field and a lower 2-bit
138 'kind' field. The ECU field is a number given out by m_execontext
139 and has a 1-1 mapping with ExeContext*s. An ECU can be used
140 directly as an origin tag (otag), but in fact we want to put
141 additional information 'kind' field to indicate roughly where the
142 tag came from. This helps print more understandable error messages
143 for the user -- it has no other purpose.
144
145 Hence the following 2-bit constants are needed for 'kind' field.
146
147 To summarise:
148
149 * Both ECUs and origin tags are represented as 32-bit words
150
151 * m_execontext and the core-tool interface deal purely in ECUs.
152 They have no knowledge of origin tags - that is a purely
153 Memcheck-internal matter.
154
155 * all valid ECUs have the lowest 2 bits zero and at least
156 one of the upper 30 bits nonzero (see VG_(is_plausible_ECU))
157
158 * to convert from an ECU to an otag, OR in one of the MC_OKIND_
159 constants below
160
161 * to convert an otag back to an ECU, AND it with ~3
162*/
163
164#define MC_OKIND_UNKNOWN 0 /* unknown origin */
165#define MC_OKIND_HEAP 1 /* this is a heap origin */
166#define MC_OKIND_STACK 2 /* this is a stack origin */
167#define MC_OKIND_USER 3 /* arises from user-supplied client req */
168
njn43c799e2003-04-08 00:08:52 +0000169
170/*------------------------------------------------------------*/
njn1d0825f2006-03-27 11:37:07 +0000171/*--- Profiling of memory events ---*/
172/*------------------------------------------------------------*/
173
174/* Define to collect detailed performance info. */
175/* #define MC_PROFILE_MEMORY */
176
177#ifdef MC_PROFILE_MEMORY
178# define N_PROF_EVENTS 500
179
180extern UInt MC_(event_ctr)[N_PROF_EVENTS];
181extern HChar* MC_(event_ctr_name)[N_PROF_EVENTS];
182
183# define PROF_EVENT(ev, name) \
184 do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS); \
185 /* crude and inaccurate check to ensure the same */ \
186 /* event isn't being used with > 1 name */ \
187 if (MC_(event_ctr_name)[ev]) \
188 tl_assert(name == MC_(event_ctr_name)[ev]); \
189 MC_(event_ctr)[ev]++; \
190 MC_(event_ctr_name)[ev] = (name); \
191 } while (False);
192
193#else
194
195# define PROF_EVENT(ev, name) /* */
196
197#endif /* MC_PROFILE_MEMORY */
198
199
200/*------------------------------------------------------------*/
201/*--- V and A bits (Victoria & Albert ?) ---*/
202/*------------------------------------------------------------*/
203
204/* The number of entries in the primary map can be altered. However
205 we hardwire the assumption that each secondary map covers precisely
206 64k of address space. */
207#define SM_SIZE 65536 /* DO NOT CHANGE */
208#define SM_MASK (SM_SIZE-1) /* DO NOT CHANGE */
209
210#define V_BIT_DEFINED 0
211#define V_BIT_UNDEFINED 1
212
213#define V_BITS8_DEFINED 0
214#define V_BITS8_UNDEFINED 0xFF
215
216#define V_BITS16_DEFINED 0
217#define V_BITS16_UNDEFINED 0xFFFF
218
219#define V_BITS32_DEFINED 0
220#define V_BITS32_UNDEFINED 0xFFFFFFFF
221
222#define V_BITS64_DEFINED 0ULL
223#define V_BITS64_UNDEFINED 0xFFFFFFFFFFFFFFFFULL
224
225
226/*------------------------------------------------------------*/
227/*--- Leak checking ---*/
228/*------------------------------------------------------------*/
229
njn718d3b12006-12-16 00:54:12 +0000230/* A block is either
231 -- Proper-ly reached; a pointer to its start has been found
232 -- Interior-ly reached; only an interior pointer to it has been found
233 -- Unreached; so far, no pointers to any part of it have been found.
234 -- IndirectLeak; leaked, but referred to by another leaked block
235*/
236typedef
237 enum {
238 Unreached =0,
239 IndirectLeak =1,
240 Interior =2,
241 Proper =3
242 }
243 Reachedness;
244
njn1d0825f2006-03-27 11:37:07 +0000245/* For VALGRIND_COUNT_LEAKS client request */
246extern SizeT MC_(bytes_leaked);
247extern SizeT MC_(bytes_indirect);
248extern SizeT MC_(bytes_dubious);
249extern SizeT MC_(bytes_reachable);
250extern SizeT MC_(bytes_suppressed);
251
njn1d0825f2006-03-27 11:37:07 +0000252typedef
253 enum {
254 LC_Off,
255 LC_Summary,
256 LC_Full,
257 }
258 LeakCheckMode;
259
njn718d3b12006-12-16 00:54:12 +0000260/* A block record, used for generating err msgs. */
261typedef
262 struct _LossRecord {
263 struct _LossRecord* next;
264 /* Where these lost blocks were allocated. */
265 ExeContext* allocated_at;
266 /* Their reachability. */
267 Reachedness loss_mode;
268 /* Number of blocks and total # bytes involved. */
269 SizeT total_bytes;
270 SizeT indirect_bytes;
271 UInt num_blocks;
272 }
273 LossRecord;
274
njn1d0825f2006-03-27 11:37:07 +0000275extern void MC_(do_detect_memory_leaks) (
276 ThreadId tid, LeakCheckMode mode,
277 Bool (*is_within_valid_secondary) ( Addr ),
278 Bool (*is_valid_aligned_word) ( Addr )
279 );
280
njn718d3b12006-12-16 00:54:12 +0000281extern void MC_(pp_LeakError)(UInt n_this_record, UInt n_total_records,
282 LossRecord* l);
283
284
285/*------------------------------------------------------------*/
286/*--- Errors and suppressions ---*/
287/*------------------------------------------------------------*/
288
sewardj7ce71662008-05-02 10:33:15 +0000289/* Did we show to the user, any errors for which an uninitialised
290 value origin could have been collected (but wasn't) ? If yes,
291 then, at the end of the run, print a 1 line message advising that a
292 rerun with --track-origins=yes might help. */
293Bool MC_(any_value_errors);
294
295/* Standard functions for error and suppressions as required by the
296 core/tool iface */
297Bool MC_(eq_Error) ( VgRes res, Error* e1, Error* e2 );
298void MC_(pp_Error) ( Error* err );
299UInt MC_(update_Error_extra)( Error* err );
300
301Bool MC_(is_recognised_suppression) ( Char* name, Supp* su );
302
303Bool MC_(read_extra_suppression_info) ( Int fd, Char* buf,
304 Int nBuf, Supp *su );
305
306Bool MC_(error_matches_suppression) ( Error* err, Supp* su );
307
308void MC_(print_extra_suppression_info) ( Error* err );
309
310Char* MC_(get_error_name) ( Error* err );
311
312/* Recording of errors */
313void MC_(record_address_error) ( ThreadId tid, Addr a, Int szB,
314 Bool isWrite );
315void MC_(record_cond_error) ( ThreadId tid, UInt otag );
316void MC_(record_value_error) ( ThreadId tid, Int szB, UInt otag );
317void MC_(record_jump_error) ( ThreadId tid, Addr a );
318
319void MC_(record_free_error) ( ThreadId tid, Addr a );
320void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
321void MC_(record_freemismatch_error) ( ThreadId tid, MC_Chunk* mc );
322
323void MC_(record_overlap_error) ( ThreadId tid, Char* function,
324 Addr src, Addr dst, SizeT szB );
325void MC_(record_core_mem_error) ( ThreadId tid, Bool isAddrErr, Char* msg );
326void MC_(record_regparam_error) ( ThreadId tid, Char* msg, UInt otag );
327void MC_(record_memparam_error) ( ThreadId tid, Addr a,
328 Bool isAddrErr, Char* msg, UInt otag );
329void MC_(record_user_error) ( ThreadId tid, Addr a,
330 Bool isAddrErr, UInt otag );
331
332Bool MC_(record_leak_error) ( ThreadId tid,
333 UInt n_this_record,
334 UInt n_total_records,
335 LossRecord* lossRecord,
336 Bool print_record );
337
338/* Is this address in a user-specified "ignored range" ? */
339Bool MC_(in_ignored_range) ( Addr a );
340
341
342/*------------------------------------------------------------*/
343/*--- Client blocks ---*/
344/*------------------------------------------------------------*/
345
346/* Describes a client block. See mc_main.c. An unused block has
347 start == size == 0. */
348typedef
349 struct {
350 Addr start;
351 SizeT size;
352 ExeContext* where;
353 Char* desc;
354 }
355 CGenBlock;
356
357/* Get access to the client block array. */
358void MC_(get_ClientBlock_array)( /*OUT*/CGenBlock** blocks,
359 /*OUT*/UWord* nBlocks );
360
njn718d3b12006-12-16 00:54:12 +0000361
njn1d0825f2006-03-27 11:37:07 +0000362/*------------------------------------------------------------*/
363/*--- Command line options + defaults ---*/
364/*------------------------------------------------------------*/
365
366/* Allow loads from partially-valid addresses? default: YES */
367extern Bool MC_(clo_partial_loads_ok);
368
369/* Max volume of the freed blocks queue. */
sewardjfa4ca3b2007-11-30 17:19:36 +0000370extern Long MC_(clo_freelist_vol);
njn1d0825f2006-03-27 11:37:07 +0000371
372/* Do leak check at exit? default: NO */
373extern LeakCheckMode MC_(clo_leak_check);
374
375/* How closely should we compare ExeContexts in leak records? default: 2 */
376extern VgRes MC_(clo_leak_resolution);
377
378/* In leak check, show reachable-but-not-freed blocks? default: NO */
379extern Bool MC_(clo_show_reachable);
380
381/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
382 * default: NO */
383extern Bool MC_(clo_workaround_gcc296_bugs);
384
sewardjeb0fa932007-11-30 21:41:40 +0000385/* Fill malloc-d/free-d client blocks with a specific value? -1 if
386 not, else 0x00 .. 0xFF indicating the fill value to use. Can be
387 useful for causing programs with bad heap corruption to fail in
388 more repeatable ways. Note that malloc-filled and free-filled
389 areas are still undefined and noaccess respectively. This merely
390 causes them to contain the specified values. */
391extern Int MC_(clo_malloc_fill);
392extern Int MC_(clo_free_fill);
393
sewardj7cf4e6b2008-05-01 20:24:26 +0000394/* Indicates the level of instrumentation/checking done by Memcheck.
395
396 1 = No undefined value checking, Addrcheck-style behaviour only:
397 only address checking is done. This is faster but finds fewer
398 errors. Note that although Addrcheck had 1 bit per byte
399 overhead vs the old Memcheck's 9 bits per byte, with this mode
400 and compressed V bits, no memory is saved with this mode --
401 it's still 2 bits per byte overhead. This is a little wasteful
402 -- it could be done with 1 bit per byte -- but lets us reuse
403 the many shadow memory access functions. Note that in this
404 mode neither the secondary V bit table nor the origin-tag cache
405 are used.
406
407 2 = Address checking and Undefined value checking are performed,
408 but origins are not tracked. So the origin-tag cache is not
409 used in this mode. This setting is the default and corresponds
410 to the "normal" Memcheck behaviour that has shipped for years.
411
412 3 = Address checking, undefined value checking, and origins for
413 undefined values are tracked.
414
415 The default is 2.
416*/
417extern Int MC_(clo_mc_level);
418
njn1d0825f2006-03-27 11:37:07 +0000419
420/*------------------------------------------------------------*/
421/*--- Instrumentation ---*/
njn25e49d8e72002-09-23 09:36:25 +0000422/*------------------------------------------------------------*/
423
njn66fe05a2003-07-22 09:12:33 +0000424/* Functions defined in mc_main.c */
sewardj95448072004-11-22 20:19:51 +0000425
sewardj7cf4e6b2008-05-01 20:24:26 +0000426/* For the fail_w_o functions, the UWord arg is actually the 32-bit
427 origin tag and should really be UInt, but to be simple and safe
428 considering it's called from generated code, just claim it to be a
429 UWord. */
430extern VG_REGPARM(2) void MC_(helperc_value_checkN_fail_w_o) ( HWord, UWord );
431extern VG_REGPARM(1) void MC_(helperc_value_check8_fail_w_o) ( UWord );
432extern VG_REGPARM(1) void MC_(helperc_value_check4_fail_w_o) ( UWord );
433extern VG_REGPARM(1) void MC_(helperc_value_check1_fail_w_o) ( UWord );
434extern VG_REGPARM(1) void MC_(helperc_value_check0_fail_w_o) ( UWord );
435
436/* And call these ones instead to report an uninitialised value error
437 but with no origin available. */
438extern VG_REGPARM(1) void MC_(helperc_value_checkN_fail_no_o) ( HWord );
439extern VG_REGPARM(0) void MC_(helperc_value_check8_fail_no_o) ( void );
440extern VG_REGPARM(0) void MC_(helperc_value_check4_fail_no_o) ( void );
441extern VG_REGPARM(0) void MC_(helperc_value_check1_fail_no_o) ( void );
442extern VG_REGPARM(0) void MC_(helperc_value_check0_fail_no_o) ( void );
443
444/* V-bits load/store helpers */
njn1d0825f2006-03-27 11:37:07 +0000445extern VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
446extern VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
447extern VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
448extern VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
449extern VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
450extern VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
451extern VG_REGPARM(2) void MC_(helperc_STOREV8) ( Addr, UWord );
sewardj95448072004-11-22 20:19:51 +0000452
njn1d0825f2006-03-27 11:37:07 +0000453extern VG_REGPARM(1) ULong MC_(helperc_LOADV64be) ( Addr );
454extern VG_REGPARM(1) ULong MC_(helperc_LOADV64le) ( Addr );
455extern VG_REGPARM(1) UWord MC_(helperc_LOADV32be) ( Addr );
456extern VG_REGPARM(1) UWord MC_(helperc_LOADV32le) ( Addr );
457extern VG_REGPARM(1) UWord MC_(helperc_LOADV16be) ( Addr );
458extern VG_REGPARM(1) UWord MC_(helperc_LOADV16le) ( Addr );
459extern VG_REGPARM(1) UWord MC_(helperc_LOADV8) ( Addr );
njn25e49d8e72002-09-23 09:36:25 +0000460
sewardj7cf4e6b2008-05-01 20:24:26 +0000461extern void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len,
462 Addr nia );
463
464/* Origin tag load/store helpers */
465VG_REGPARM(2) void MC_(helperc_b_store1) ( Addr a, UWord d32 );
466VG_REGPARM(2) void MC_(helperc_b_store2) ( Addr a, UWord d32 );
467VG_REGPARM(2) void MC_(helperc_b_store4) ( Addr a, UWord d32 );
468VG_REGPARM(2) void MC_(helperc_b_store8) ( Addr a, UWord d32 );
469VG_REGPARM(2) void MC_(helperc_b_store16)( Addr a, UWord d32 );
470VG_REGPARM(1) UWord MC_(helperc_b_load1) ( Addr a );
471VG_REGPARM(1) UWord MC_(helperc_b_load2) ( Addr a );
472VG_REGPARM(1) UWord MC_(helperc_b_load4) ( Addr a );
473VG_REGPARM(1) UWord MC_(helperc_b_load8) ( Addr a );
474VG_REGPARM(1) UWord MC_(helperc_b_load16)( Addr a );
sewardj826ec492005-05-12 18:05:00 +0000475
njn51d827b2005-05-09 01:02:08 +0000476/* Functions defined in mc_translate.c */
sewardj4ba057c2005-10-18 12:04:18 +0000477extern
sewardj0b9d74a2006-12-24 02:24:11 +0000478IRSB* MC_(instrument) ( VgCallbackClosure* closure,
479 IRSB* bb_in,
sewardj461df9c2006-01-17 02:06:39 +0000480 VexGuestLayout* layout,
481 VexGuestExtents* vge,
sewardj4ba057c2005-10-18 12:04:18 +0000482 IRType gWordTy, IRType hWordTy );
sewardj8d61eb12005-07-08 09:46:53 +0000483
sewardj81651dc2007-08-28 06:05:20 +0000484extern
485IRSB* MC_(final_tidy) ( IRSB* );
486
sewardj8d61eb12005-07-08 09:46:53 +0000487#endif /* ndef __MC_INCLUDE_H */
njn25e49d8e72002-09-23 09:36:25 +0000488
489/*--------------------------------------------------------------------*/
nethercote8b76fe52004-11-08 19:20:09 +0000490/*--- end ---*/
njn25e49d8e72002-09-23 09:36:25 +0000491/*--------------------------------------------------------------------*/
492