blob: 5279603297b264395828f722ef5dee5106d4d98d [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
sewardj9eecbbb2010-05-03 21:37:12 +000011 Copyright (C) 2000-2010 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
njn8225cc02009-03-09 22:52:24 +000058/* This describes a heap block. Nb: first two fields must match core's
59 * VgHashNode. */
njn1d0825f2006-03-27 11:37:07 +000060typedef
61 struct _MC_Chunk {
62 struct _MC_Chunk* next;
njn8225cc02009-03-09 22:52:24 +000063 Addr data; // Address of the actual block.
64 SizeT szB : (sizeof(SizeT)*8)-2; // Size requested; 30 or 62 bits.
65 MC_AllocKind allockind : 2; // Which operation did the allocation.
66 ExeContext* where; // Where it was allocated.
njn1d0825f2006-03-27 11:37:07 +000067 }
68 MC_Chunk;
69
70/* Memory pool. Nb: first two fields must match core's VgHashNode. */
71typedef
72 struct _MC_Mempool {
73 struct _MC_Mempool* next;
74 Addr pool; // pool identifier
75 SizeT rzB; // pool red-zone size
76 Bool is_zeroed; // allocations from this pool are zeroed
77 VgHashTable chunks; // chunks associated with this pool
78 }
79 MC_Mempool;
80
81
sewardj56adc352008-05-02 11:25:17 +000082void* MC_(new_block) ( ThreadId tid,
njn1dcee092009-02-24 03:07:37 +000083 Addr p, SizeT size, SizeT align,
sewardj56adc352008-05-02 11:25:17 +000084 Bool is_zeroed, MC_AllocKind kind,
85 VgHashTable table);
86void MC_(handle_free) ( ThreadId tid,
87 Addr p, UInt rzB, MC_AllocKind kind );
njn1d0825f2006-03-27 11:37:07 +000088
sewardj56adc352008-05-02 11:25:17 +000089void MC_(create_mempool) ( Addr pool, UInt rzB, Bool is_zeroed );
90void MC_(destroy_mempool) ( Addr pool );
91void MC_(mempool_alloc) ( ThreadId tid, Addr pool,
92 Addr addr, SizeT size );
93void MC_(mempool_free) ( Addr pool, Addr addr );
94void MC_(mempool_trim) ( Addr pool, Addr addr, SizeT size );
95void MC_(move_mempool) ( Addr poolA, Addr poolB );
96void MC_(mempool_change) ( Addr pool, Addr addrA, Addr addrB, SizeT size );
97Bool MC_(mempool_exists) ( Addr pool );
njn1d0825f2006-03-27 11:37:07 +000098
sewardj403d8aa2011-10-22 19:48:57 +000099/* Searches for a recently freed block which might bracket Addr a.
100 Return the MC_Chunk* for this block or NULL if no bracketting block
101 is found. */
102MC_Chunk* MC_(get_freed_block_bracketting)( Addr a );
njn1d0825f2006-03-27 11:37:07 +0000103
njnb965efb2009-08-10 07:36:54 +0000104/* For tracking malloc'd blocks. Nb: it's quite important that it's a
105 VgHashTable, because VgHashTable allows duplicate keys without complaint.
106 This can occur if a user marks a malloc() block as also a custom block with
107 MALLOCLIKE_BLOCK. */
sewardj505a8192008-07-18 20:15:46 +0000108extern VgHashTable MC_(malloc_list);
njn1d0825f2006-03-27 11:37:07 +0000109
110/* For tracking memory pools. */
sewardj505a8192008-07-18 20:15:46 +0000111extern VgHashTable MC_(mempool_list);
njn1d0825f2006-03-27 11:37:07 +0000112
113/* Shadow memory functions */
sewardj56adc352008-05-02 11:25:17 +0000114Bool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr );
115void MC_(make_mem_noaccess) ( Addr a, SizeT len );
116void MC_(make_mem_undefined_w_otag)( Addr a, SizeT len, UInt otag );
117void MC_(make_mem_defined) ( Addr a, SizeT len );
118void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len );
njn1d0825f2006-03-27 11:37:07 +0000119
sewardj56adc352008-05-02 11:25:17 +0000120void MC_(print_malloc_stats) ( void );
njn1d0825f2006-03-27 11:37:07 +0000121
sewardj56adc352008-05-02 11:25:17 +0000122void* MC_(malloc) ( ThreadId tid, SizeT n );
123void* MC_(__builtin_new) ( ThreadId tid, SizeT n );
124void* MC_(__builtin_vec_new) ( ThreadId tid, SizeT n );
125void* MC_(memalign) ( ThreadId tid, SizeT align, SizeT n );
126void* MC_(calloc) ( ThreadId tid, SizeT nmemb, SizeT size1 );
127void MC_(free) ( ThreadId tid, void* p );
128void MC_(__builtin_delete) ( ThreadId tid, void* p );
129void MC_(__builtin_vec_delete) ( ThreadId tid, void* p );
130void* MC_(realloc) ( ThreadId tid, void* p, SizeT new_size );
njn8b140de2009-02-17 04:31:18 +0000131SizeT MC_(malloc_usable_size) ( ThreadId tid, void* p );
sewardj56adc352008-05-02 11:25:17 +0000132
bart91347382011-03-25 20:07:25 +0000133void MC_(handle_resizeInPlace)(ThreadId tid, Addr p,
134 SizeT oldSizeB, SizeT newSizeB, SizeT rzB);
135
njn43c799e2003-04-08 00:08:52 +0000136
sewardj7cf4e6b2008-05-01 20:24:26 +0000137/*------------------------------------------------------------*/
138/*--- Origin tracking translate-time support ---*/
139/*------------------------------------------------------------*/
140
141/* See detailed comments in mc_machine.c. */
sewardj7cf4e6b2008-05-01 20:24:26 +0000142Int MC_(get_otrack_shadow_offset) ( Int offset, Int szB );
sewardj7cf4e6b2008-05-01 20:24:26 +0000143IRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr );
144
145/* Constants which are used as the lowest 2 bits in origin tags.
146
147 An origin tag comprises an upper 30-bit ECU field and a lower 2-bit
148 'kind' field. The ECU field is a number given out by m_execontext
149 and has a 1-1 mapping with ExeContext*s. An ECU can be used
150 directly as an origin tag (otag), but in fact we want to put
151 additional information 'kind' field to indicate roughly where the
152 tag came from. This helps print more understandable error messages
153 for the user -- it has no other purpose.
154
155 Hence the following 2-bit constants are needed for 'kind' field.
156
157 To summarise:
158
159 * Both ECUs and origin tags are represented as 32-bit words
160
161 * m_execontext and the core-tool interface deal purely in ECUs.
162 They have no knowledge of origin tags - that is a purely
163 Memcheck-internal matter.
164
165 * all valid ECUs have the lowest 2 bits zero and at least
166 one of the upper 30 bits nonzero (see VG_(is_plausible_ECU))
167
168 * to convert from an ECU to an otag, OR in one of the MC_OKIND_
169 constants below
170
171 * to convert an otag back to an ECU, AND it with ~3
172*/
173
174#define MC_OKIND_UNKNOWN 0 /* unknown origin */
175#define MC_OKIND_HEAP 1 /* this is a heap origin */
176#define MC_OKIND_STACK 2 /* this is a stack origin */
177#define MC_OKIND_USER 3 /* arises from user-supplied client req */
178
njn43c799e2003-04-08 00:08:52 +0000179
180/*------------------------------------------------------------*/
njn1d0825f2006-03-27 11:37:07 +0000181/*--- Profiling of memory events ---*/
182/*------------------------------------------------------------*/
183
184/* Define to collect detailed performance info. */
185/* #define MC_PROFILE_MEMORY */
186
187#ifdef MC_PROFILE_MEMORY
188# define N_PROF_EVENTS 500
189
sewardj56adc352008-05-02 11:25:17 +0000190UInt MC_(event_ctr)[N_PROF_EVENTS];
191HChar* MC_(event_ctr_name)[N_PROF_EVENTS];
njn1d0825f2006-03-27 11:37:07 +0000192
193# define PROF_EVENT(ev, name) \
194 do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS); \
195 /* crude and inaccurate check to ensure the same */ \
196 /* event isn't being used with > 1 name */ \
197 if (MC_(event_ctr_name)[ev]) \
198 tl_assert(name == MC_(event_ctr_name)[ev]); \
199 MC_(event_ctr)[ev]++; \
200 MC_(event_ctr_name)[ev] = (name); \
201 } while (False);
202
203#else
204
205# define PROF_EVENT(ev, name) /* */
206
207#endif /* MC_PROFILE_MEMORY */
208
209
210/*------------------------------------------------------------*/
211/*--- V and A bits (Victoria & Albert ?) ---*/
212/*------------------------------------------------------------*/
213
214/* The number of entries in the primary map can be altered. However
215 we hardwire the assumption that each secondary map covers precisely
216 64k of address space. */
217#define SM_SIZE 65536 /* DO NOT CHANGE */
218#define SM_MASK (SM_SIZE-1) /* DO NOT CHANGE */
219
220#define V_BIT_DEFINED 0
221#define V_BIT_UNDEFINED 1
222
223#define V_BITS8_DEFINED 0
224#define V_BITS8_UNDEFINED 0xFF
225
226#define V_BITS16_DEFINED 0
227#define V_BITS16_UNDEFINED 0xFFFF
228
229#define V_BITS32_DEFINED 0
230#define V_BITS32_UNDEFINED 0xFFFFFFFF
231
232#define V_BITS64_DEFINED 0ULL
233#define V_BITS64_UNDEFINED 0xFFFFFFFFFFFFFFFFULL
234
235
236/*------------------------------------------------------------*/
237/*--- Leak checking ---*/
238/*------------------------------------------------------------*/
239
njn718d3b12006-12-16 00:54:12 +0000240typedef
241 enum {
njn29a5c012009-05-06 06:15:55 +0000242 // Nb: the order is important -- it dictates the order of loss records
243 // of equal sizes.
244 Reachable =0, // Definitely reachable from root-set.
245 Possible =1, // Possibly reachable from root-set; involves at
njn8225cc02009-03-09 22:52:24 +0000246 // least one interior-pointer along the way.
njn29a5c012009-05-06 06:15:55 +0000247 IndirectLeak =2, // Leaked, but reachable from another leaked block
248 // (be it Unreached or IndirectLeak).
249 Unreached =3, // Not reached, ie. leaked.
250 // (At best, only reachable from itself via a cycle.)
njn718d3b12006-12-16 00:54:12 +0000251 }
252 Reachedness;
253
njn1d0825f2006-03-27 11:37:07 +0000254/* For VALGRIND_COUNT_LEAKS client request */
sewardj505a8192008-07-18 20:15:46 +0000255extern SizeT MC_(bytes_leaked);
256extern SizeT MC_(bytes_indirect);
257extern SizeT MC_(bytes_dubious);
258extern SizeT MC_(bytes_reachable);
259extern SizeT MC_(bytes_suppressed);
njn1d0825f2006-03-27 11:37:07 +0000260
njn8df80b22009-03-02 05:11:06 +0000261/* For VALGRIND_COUNT_LEAK_BLOCKS client request */
262extern SizeT MC_(blocks_leaked);
263extern SizeT MC_(blocks_indirect);
264extern SizeT MC_(blocks_dubious);
265extern SizeT MC_(blocks_reachable);
266extern SizeT MC_(blocks_suppressed);
267
njn1d0825f2006-03-27 11:37:07 +0000268typedef
269 enum {
270 LC_Off,
271 LC_Summary,
272 LC_Full,
273 }
274 LeakCheckMode;
275
sewardjc8bd1df2011-06-26 12:41:33 +0000276typedef
277 enum {
278 LCD_Any, // output all loss records, whatever the delta
279 LCD_Increased, // output loss records with an increase in size or blocks
280 LCD_Changed, // output loss records with an increase or
281 //decrease in size or blocks
282 }
283 LeakCheckDeltaMode;
284
njn29a5c012009-05-06 06:15:55 +0000285/* When a LossRecord is put into an OSet, these elements represent the key. */
286typedef
287 struct _LossRecordKey {
288 Reachedness state; // LC_Extra.state value shared by all blocks.
289 ExeContext* allocated_at; // Where they were allocated.
290 }
291 LossRecordKey;
292
njnb7a4e2e2009-05-01 00:30:43 +0000293/* A loss record, used for generating err msgs. Multiple leaked blocks can be
294 * merged into a single loss record if they have the same state and similar
295 * enough allocation points (controlled by --leak-resolution). */
njn718d3b12006-12-16 00:54:12 +0000296typedef
297 struct _LossRecord {
njn29a5c012009-05-06 06:15:55 +0000298 LossRecordKey key; // Key, when used in an OSet.
299 SizeT szB; // Sum of all MC_Chunk.szB values.
300 SizeT indirect_szB; // Sum of all LC_Extra.indirect_szB values.
301 UInt num_blocks; // Number of blocks represented by the record.
sewardjc8bd1df2011-06-26 12:41:33 +0000302 SizeT old_szB; // old_* values are the values found during the
303 SizeT old_indirect_szB; // previous leak search. old_* values are used to
304 UInt old_num_blocks; // output only the changed/new loss records
njn718d3b12006-12-16 00:54:12 +0000305 }
306 LossRecord;
307
sewardjc8bd1df2011-06-26 12:41:33 +0000308typedef
309 struct _LeakCheckParams {
310 LeakCheckMode mode;
311 Bool show_reachable;
312 Bool show_possibly_lost;
313 LeakCheckDeltaMode deltamode;
314 Bool requested_by_monitor_command; // True when requested by gdb/vgdb.
315 }
316 LeakCheckParams;
317
318void MC_(detect_memory_leaks) ( ThreadId tid, LeakCheckParams lcp);
319
320// maintains the lcp.deltamode given in the last call to detect_memory_leaks
321extern LeakCheckDeltaMode MC_(detect_memory_leaks_last_delta_mode);
322
sewardj30b3eca2011-06-28 08:20:39 +0000323// if delta_mode == LCD_Any, prints in buf an empty string
sewardjc8bd1df2011-06-26 12:41:33 +0000324// otherwise prints a delta in the layout " (+%'lu)" or " (-%'lu)"
325extern char * MC_(snprintf_delta) (char * buf, Int size,
326 SizeT current_val, SizeT old_val,
327 LeakCheckDeltaMode delta_mode);
328
njn8225cc02009-03-09 22:52:24 +0000329
330Bool MC_(is_valid_aligned_word) ( Addr a );
331Bool MC_(is_within_valid_secondary) ( Addr a );
njn1d0825f2006-03-27 11:37:07 +0000332
sewardj56adc352008-05-02 11:25:17 +0000333void MC_(pp_LeakError)(UInt n_this_record, UInt n_total_records,
334 LossRecord* l);
njn718d3b12006-12-16 00:54:12 +0000335
336
337/*------------------------------------------------------------*/
338/*--- Errors and suppressions ---*/
339/*------------------------------------------------------------*/
340
sewardj7ce71662008-05-02 10:33:15 +0000341/* Did we show to the user, any errors for which an uninitialised
342 value origin could have been collected (but wasn't) ? If yes,
343 then, at the end of the run, print a 1 line message advising that a
344 rerun with --track-origins=yes might help. */
sewardj505a8192008-07-18 20:15:46 +0000345extern Bool MC_(any_value_errors);
sewardj7ce71662008-05-02 10:33:15 +0000346
347/* Standard functions for error and suppressions as required by the
348 core/tool iface */
sewardj6b523cd2009-07-15 14:49:40 +0000349Bool MC_(eq_Error) ( VgRes res, Error* e1, Error* e2 );
350void MC_(before_pp_Error) ( Error* err );
351void MC_(pp_Error) ( Error* err );
352UInt MC_(update_Error_extra) ( Error* err );
sewardj7ce71662008-05-02 10:33:15 +0000353
354Bool MC_(is_recognised_suppression) ( Char* name, Supp* su );
355
njn35db56c2009-07-24 07:38:29 +0000356Bool MC_(read_extra_suppression_info) ( Int fd, Char** buf,
357 SizeT* nBuf, Supp *su );
sewardj7ce71662008-05-02 10:33:15 +0000358
359Bool MC_(error_matches_suppression) ( Error* err, Supp* su );
360
sewardj588adef2009-08-15 22:41:51 +0000361Bool MC_(get_extra_suppression_info) ( Error* err,
362 /*OUT*/Char* buf, Int nBuf );
sewardj7ce71662008-05-02 10:33:15 +0000363
364Char* MC_(get_error_name) ( Error* err );
365
366/* Recording of errors */
367void MC_(record_address_error) ( ThreadId tid, Addr a, Int szB,
368 Bool isWrite );
369void MC_(record_cond_error) ( ThreadId tid, UInt otag );
370void MC_(record_value_error) ( ThreadId tid, Int szB, UInt otag );
371void MC_(record_jump_error) ( ThreadId tid, Addr a );
372
373void MC_(record_free_error) ( ThreadId tid, Addr a );
374void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
375void MC_(record_freemismatch_error) ( ThreadId tid, MC_Chunk* mc );
376
377void MC_(record_overlap_error) ( ThreadId tid, Char* function,
378 Addr src, Addr dst, SizeT szB );
njn1dcee092009-02-24 03:07:37 +0000379void MC_(record_core_mem_error) ( ThreadId tid, Char* msg );
sewardj7ce71662008-05-02 10:33:15 +0000380void MC_(record_regparam_error) ( ThreadId tid, Char* msg, UInt otag );
381void MC_(record_memparam_error) ( ThreadId tid, Addr a,
382 Bool isAddrErr, Char* msg, UInt otag );
383void MC_(record_user_error) ( ThreadId tid, Addr a,
384 Bool isAddrErr, UInt otag );
385
386Bool MC_(record_leak_error) ( ThreadId tid,
387 UInt n_this_record,
388 UInt n_total_records,
389 LossRecord* lossRecord,
njn18afe5d2009-08-10 08:25:39 +0000390 Bool print_record,
391 Bool count_error );
sewardj7ce71662008-05-02 10:33:15 +0000392
sewardj3b290482011-05-06 21:02:55 +0000393/* prints a description of address a */
394void MC_(pp_describe_addr) (Addr a);
395
sewardj7ce71662008-05-02 10:33:15 +0000396/* Is this address in a user-specified "ignored range" ? */
397Bool MC_(in_ignored_range) ( Addr a );
398
399
400/*------------------------------------------------------------*/
401/*--- Client blocks ---*/
402/*------------------------------------------------------------*/
403
404/* Describes a client block. See mc_main.c. An unused block has
405 start == size == 0. */
406typedef
407 struct {
408 Addr start;
409 SizeT size;
410 ExeContext* where;
411 Char* desc;
412 }
413 CGenBlock;
414
415/* Get access to the client block array. */
416void MC_(get_ClientBlock_array)( /*OUT*/CGenBlock** blocks,
417 /*OUT*/UWord* nBlocks );
418
njn718d3b12006-12-16 00:54:12 +0000419
njn1d0825f2006-03-27 11:37:07 +0000420/*------------------------------------------------------------*/
421/*--- Command line options + defaults ---*/
422/*------------------------------------------------------------*/
423
424/* Allow loads from partially-valid addresses? default: YES */
sewardj505a8192008-07-18 20:15:46 +0000425extern Bool MC_(clo_partial_loads_ok);
njn1d0825f2006-03-27 11:37:07 +0000426
427/* Max volume of the freed blocks queue. */
sewardj505a8192008-07-18 20:15:46 +0000428extern Long MC_(clo_freelist_vol);
njn1d0825f2006-03-27 11:37:07 +0000429
sewardj403d8aa2011-10-22 19:48:57 +0000430/* Blocks with a size >= MC_(clo_freelist_big_blocks) will be put
431 in the "big block" freed blocks queue. */
432extern Long MC_(clo_freelist_big_blocks);
433
njn1d0825f2006-03-27 11:37:07 +0000434/* Do leak check at exit? default: NO */
sewardj505a8192008-07-18 20:15:46 +0000435extern LeakCheckMode MC_(clo_leak_check);
njn1d0825f2006-03-27 11:37:07 +0000436
437/* How closely should we compare ExeContexts in leak records? default: 2 */
sewardj505a8192008-07-18 20:15:46 +0000438extern VgRes MC_(clo_leak_resolution);
njn1d0825f2006-03-27 11:37:07 +0000439
440/* In leak check, show reachable-but-not-freed blocks? default: NO */
sewardj505a8192008-07-18 20:15:46 +0000441extern Bool MC_(clo_show_reachable);
njn1d0825f2006-03-27 11:37:07 +0000442
bart3cedf572010-08-26 10:56:27 +0000443/* In leak check, show possibly-lost blocks? default: YES */
444extern Bool MC_(clo_show_possibly_lost);
445
njn1d0825f2006-03-27 11:37:07 +0000446/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
447 * default: NO */
sewardj505a8192008-07-18 20:15:46 +0000448extern Bool MC_(clo_workaround_gcc296_bugs);
njn1d0825f2006-03-27 11:37:07 +0000449
sewardjeb0fa932007-11-30 21:41:40 +0000450/* Fill malloc-d/free-d client blocks with a specific value? -1 if
451 not, else 0x00 .. 0xFF indicating the fill value to use. Can be
452 useful for causing programs with bad heap corruption to fail in
453 more repeatable ways. Note that malloc-filled and free-filled
454 areas are still undefined and noaccess respectively. This merely
455 causes them to contain the specified values. */
sewardj505a8192008-07-18 20:15:46 +0000456extern Int MC_(clo_malloc_fill);
457extern Int MC_(clo_free_fill);
sewardjeb0fa932007-11-30 21:41:40 +0000458
sewardj7cf4e6b2008-05-01 20:24:26 +0000459/* Indicates the level of instrumentation/checking done by Memcheck.
460
461 1 = No undefined value checking, Addrcheck-style behaviour only:
462 only address checking is done. This is faster but finds fewer
463 errors. Note that although Addrcheck had 1 bit per byte
464 overhead vs the old Memcheck's 9 bits per byte, with this mode
465 and compressed V bits, no memory is saved with this mode --
466 it's still 2 bits per byte overhead. This is a little wasteful
467 -- it could be done with 1 bit per byte -- but lets us reuse
468 the many shadow memory access functions. Note that in this
469 mode neither the secondary V bit table nor the origin-tag cache
470 are used.
471
472 2 = Address checking and Undefined value checking are performed,
473 but origins are not tracked. So the origin-tag cache is not
474 used in this mode. This setting is the default and corresponds
475 to the "normal" Memcheck behaviour that has shipped for years.
476
477 3 = Address checking, undefined value checking, and origins for
478 undefined values are tracked.
479
480 The default is 2.
481*/
sewardj505a8192008-07-18 20:15:46 +0000482extern Int MC_(clo_mc_level);
sewardj7cf4e6b2008-05-01 20:24:26 +0000483
njn1d0825f2006-03-27 11:37:07 +0000484
485/*------------------------------------------------------------*/
486/*--- Instrumentation ---*/
njn25e49d8e72002-09-23 09:36:25 +0000487/*------------------------------------------------------------*/
488
njn66fe05a2003-07-22 09:12:33 +0000489/* Functions defined in mc_main.c */
sewardj95448072004-11-22 20:19:51 +0000490
sewardj7cf4e6b2008-05-01 20:24:26 +0000491/* For the fail_w_o functions, the UWord arg is actually the 32-bit
492 origin tag and should really be UInt, but to be simple and safe
493 considering it's called from generated code, just claim it to be a
494 UWord. */
sewardj56adc352008-05-02 11:25:17 +0000495VG_REGPARM(2) void MC_(helperc_value_checkN_fail_w_o) ( HWord, UWord );
496VG_REGPARM(1) void MC_(helperc_value_check8_fail_w_o) ( UWord );
497VG_REGPARM(1) void MC_(helperc_value_check4_fail_w_o) ( UWord );
498VG_REGPARM(1) void MC_(helperc_value_check1_fail_w_o) ( UWord );
499VG_REGPARM(1) void MC_(helperc_value_check0_fail_w_o) ( UWord );
sewardj7cf4e6b2008-05-01 20:24:26 +0000500
501/* And call these ones instead to report an uninitialised value error
502 but with no origin available. */
sewardj56adc352008-05-02 11:25:17 +0000503VG_REGPARM(1) void MC_(helperc_value_checkN_fail_no_o) ( HWord );
504VG_REGPARM(0) void MC_(helperc_value_check8_fail_no_o) ( void );
505VG_REGPARM(0) void MC_(helperc_value_check4_fail_no_o) ( void );
506VG_REGPARM(0) void MC_(helperc_value_check1_fail_no_o) ( void );
507VG_REGPARM(0) void MC_(helperc_value_check0_fail_no_o) ( void );
sewardj7cf4e6b2008-05-01 20:24:26 +0000508
509/* V-bits load/store helpers */
sewardj56adc352008-05-02 11:25:17 +0000510VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
511VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
512VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
513VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
514VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
515VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
516VG_REGPARM(2) void MC_(helperc_STOREV8) ( Addr, UWord );
sewardj95448072004-11-22 20:19:51 +0000517
sewardj56adc352008-05-02 11:25:17 +0000518VG_REGPARM(1) ULong MC_(helperc_LOADV64be) ( Addr );
519VG_REGPARM(1) ULong MC_(helperc_LOADV64le) ( Addr );
520VG_REGPARM(1) UWord MC_(helperc_LOADV32be) ( Addr );
521VG_REGPARM(1) UWord MC_(helperc_LOADV32le) ( Addr );
522VG_REGPARM(1) UWord MC_(helperc_LOADV16be) ( Addr );
523VG_REGPARM(1) UWord MC_(helperc_LOADV16le) ( Addr );
524VG_REGPARM(1) UWord MC_(helperc_LOADV8) ( Addr );
njn25e49d8e72002-09-23 09:36:25 +0000525
sewardj56adc352008-05-02 11:25:17 +0000526void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len,
527 Addr nia );
sewardj7cf4e6b2008-05-01 20:24:26 +0000528
529/* Origin tag load/store helpers */
530VG_REGPARM(2) void MC_(helperc_b_store1) ( Addr a, UWord d32 );
531VG_REGPARM(2) void MC_(helperc_b_store2) ( Addr a, UWord d32 );
532VG_REGPARM(2) void MC_(helperc_b_store4) ( Addr a, UWord d32 );
533VG_REGPARM(2) void MC_(helperc_b_store8) ( Addr a, UWord d32 );
534VG_REGPARM(2) void MC_(helperc_b_store16)( Addr a, UWord d32 );
535VG_REGPARM(1) UWord MC_(helperc_b_load1) ( Addr a );
536VG_REGPARM(1) UWord MC_(helperc_b_load2) ( Addr a );
537VG_REGPARM(1) UWord MC_(helperc_b_load4) ( Addr a );
538VG_REGPARM(1) UWord MC_(helperc_b_load8) ( Addr a );
539VG_REGPARM(1) UWord MC_(helperc_b_load16)( Addr a );
sewardj826ec492005-05-12 18:05:00 +0000540
njn51d827b2005-05-09 01:02:08 +0000541/* Functions defined in mc_translate.c */
sewardj0b9d74a2006-12-24 02:24:11 +0000542IRSB* MC_(instrument) ( VgCallbackClosure* closure,
543 IRSB* bb_in,
sewardj461df9c2006-01-17 02:06:39 +0000544 VexGuestLayout* layout,
545 VexGuestExtents* vge,
sewardj4ba057c2005-10-18 12:04:18 +0000546 IRType gWordTy, IRType hWordTy );
sewardj8d61eb12005-07-08 09:46:53 +0000547
sewardj81651dc2007-08-28 06:05:20 +0000548IRSB* MC_(final_tidy) ( IRSB* );
549
sewardj8d61eb12005-07-08 09:46:53 +0000550#endif /* ndef __MC_INCLUDE_H */
njn25e49d8e72002-09-23 09:36:25 +0000551
552/*--------------------------------------------------------------------*/
nethercote8b76fe52004-11-08 19:20:09 +0000553/*--- end ---*/
njn25e49d8e72002-09-23 09:36:25 +0000554/*--------------------------------------------------------------------*/