blob: 597b40f6702463e05a895655a48b337e55cd27d7 [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
sewardj56adc352008-05-02 11:25:17 +000099MC_Chunk* MC_(get_freed_list_head)( void );
njn1d0825f2006-03-27 11:37:07 +0000100
njnb965efb2009-08-10 07:36:54 +0000101/* For tracking malloc'd blocks. Nb: it's quite important that it's a
102 VgHashTable, because VgHashTable allows duplicate keys without complaint.
103 This can occur if a user marks a malloc() block as also a custom block with
104 MALLOCLIKE_BLOCK. */
sewardj505a8192008-07-18 20:15:46 +0000105extern VgHashTable MC_(malloc_list);
njn1d0825f2006-03-27 11:37:07 +0000106
107/* For tracking memory pools. */
sewardj505a8192008-07-18 20:15:46 +0000108extern VgHashTable MC_(mempool_list);
njn1d0825f2006-03-27 11:37:07 +0000109
110/* Shadow memory functions */
sewardj56adc352008-05-02 11:25:17 +0000111Bool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr );
112void MC_(make_mem_noaccess) ( Addr a, SizeT len );
113void MC_(make_mem_undefined_w_otag)( Addr a, SizeT len, UInt otag );
114void MC_(make_mem_defined) ( Addr a, SizeT len );
115void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len );
njn1d0825f2006-03-27 11:37:07 +0000116
sewardj56adc352008-05-02 11:25:17 +0000117void MC_(print_malloc_stats) ( void );
njn1d0825f2006-03-27 11:37:07 +0000118
sewardj56adc352008-05-02 11:25:17 +0000119void* MC_(malloc) ( ThreadId tid, SizeT n );
120void* MC_(__builtin_new) ( ThreadId tid, SizeT n );
121void* MC_(__builtin_vec_new) ( ThreadId tid, SizeT n );
122void* MC_(memalign) ( ThreadId tid, SizeT align, SizeT n );
123void* MC_(calloc) ( ThreadId tid, SizeT nmemb, SizeT size1 );
124void MC_(free) ( ThreadId tid, void* p );
125void MC_(__builtin_delete) ( ThreadId tid, void* p );
126void MC_(__builtin_vec_delete) ( ThreadId tid, void* p );
127void* MC_(realloc) ( ThreadId tid, void* p, SizeT new_size );
njn8b140de2009-02-17 04:31:18 +0000128SizeT MC_(malloc_usable_size) ( ThreadId tid, void* p );
sewardj56adc352008-05-02 11:25:17 +0000129
bart91347382011-03-25 20:07:25 +0000130void MC_(handle_resizeInPlace)(ThreadId tid, Addr p,
131 SizeT oldSizeB, SizeT newSizeB, SizeT rzB);
132
njn43c799e2003-04-08 00:08:52 +0000133
sewardj7cf4e6b2008-05-01 20:24:26 +0000134/*------------------------------------------------------------*/
135/*--- Origin tracking translate-time support ---*/
136/*------------------------------------------------------------*/
137
138/* See detailed comments in mc_machine.c. */
sewardj7cf4e6b2008-05-01 20:24:26 +0000139Int MC_(get_otrack_shadow_offset) ( Int offset, Int szB );
sewardj7cf4e6b2008-05-01 20:24:26 +0000140IRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr );
141
142/* Constants which are used as the lowest 2 bits in origin tags.
143
144 An origin tag comprises an upper 30-bit ECU field and a lower 2-bit
145 'kind' field. The ECU field is a number given out by m_execontext
146 and has a 1-1 mapping with ExeContext*s. An ECU can be used
147 directly as an origin tag (otag), but in fact we want to put
148 additional information 'kind' field to indicate roughly where the
149 tag came from. This helps print more understandable error messages
150 for the user -- it has no other purpose.
151
152 Hence the following 2-bit constants are needed for 'kind' field.
153
154 To summarise:
155
156 * Both ECUs and origin tags are represented as 32-bit words
157
158 * m_execontext and the core-tool interface deal purely in ECUs.
159 They have no knowledge of origin tags - that is a purely
160 Memcheck-internal matter.
161
162 * all valid ECUs have the lowest 2 bits zero and at least
163 one of the upper 30 bits nonzero (see VG_(is_plausible_ECU))
164
165 * to convert from an ECU to an otag, OR in one of the MC_OKIND_
166 constants below
167
168 * to convert an otag back to an ECU, AND it with ~3
169*/
170
171#define MC_OKIND_UNKNOWN 0 /* unknown origin */
172#define MC_OKIND_HEAP 1 /* this is a heap origin */
173#define MC_OKIND_STACK 2 /* this is a stack origin */
174#define MC_OKIND_USER 3 /* arises from user-supplied client req */
175
njn43c799e2003-04-08 00:08:52 +0000176
177/*------------------------------------------------------------*/
njn1d0825f2006-03-27 11:37:07 +0000178/*--- Profiling of memory events ---*/
179/*------------------------------------------------------------*/
180
181/* Define to collect detailed performance info. */
182/* #define MC_PROFILE_MEMORY */
183
184#ifdef MC_PROFILE_MEMORY
185# define N_PROF_EVENTS 500
186
sewardj56adc352008-05-02 11:25:17 +0000187UInt MC_(event_ctr)[N_PROF_EVENTS];
188HChar* MC_(event_ctr_name)[N_PROF_EVENTS];
njn1d0825f2006-03-27 11:37:07 +0000189
190# define PROF_EVENT(ev, name) \
191 do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS); \
192 /* crude and inaccurate check to ensure the same */ \
193 /* event isn't being used with > 1 name */ \
194 if (MC_(event_ctr_name)[ev]) \
195 tl_assert(name == MC_(event_ctr_name)[ev]); \
196 MC_(event_ctr)[ev]++; \
197 MC_(event_ctr_name)[ev] = (name); \
198 } while (False);
199
200#else
201
202# define PROF_EVENT(ev, name) /* */
203
204#endif /* MC_PROFILE_MEMORY */
205
206
207/*------------------------------------------------------------*/
208/*--- V and A bits (Victoria & Albert ?) ---*/
209/*------------------------------------------------------------*/
210
211/* The number of entries in the primary map can be altered. However
212 we hardwire the assumption that each secondary map covers precisely
213 64k of address space. */
214#define SM_SIZE 65536 /* DO NOT CHANGE */
215#define SM_MASK (SM_SIZE-1) /* DO NOT CHANGE */
216
217#define V_BIT_DEFINED 0
218#define V_BIT_UNDEFINED 1
219
220#define V_BITS8_DEFINED 0
221#define V_BITS8_UNDEFINED 0xFF
222
223#define V_BITS16_DEFINED 0
224#define V_BITS16_UNDEFINED 0xFFFF
225
226#define V_BITS32_DEFINED 0
227#define V_BITS32_UNDEFINED 0xFFFFFFFF
228
229#define V_BITS64_DEFINED 0ULL
230#define V_BITS64_UNDEFINED 0xFFFFFFFFFFFFFFFFULL
231
232
233/*------------------------------------------------------------*/
234/*--- Leak checking ---*/
235/*------------------------------------------------------------*/
236
njn718d3b12006-12-16 00:54:12 +0000237typedef
238 enum {
njn29a5c012009-05-06 06:15:55 +0000239 // Nb: the order is important -- it dictates the order of loss records
240 // of equal sizes.
241 Reachable =0, // Definitely reachable from root-set.
242 Possible =1, // Possibly reachable from root-set; involves at
njn8225cc02009-03-09 22:52:24 +0000243 // least one interior-pointer along the way.
njn29a5c012009-05-06 06:15:55 +0000244 IndirectLeak =2, // Leaked, but reachable from another leaked block
245 // (be it Unreached or IndirectLeak).
246 Unreached =3, // Not reached, ie. leaked.
247 // (At best, only reachable from itself via a cycle.)
njn718d3b12006-12-16 00:54:12 +0000248 }
249 Reachedness;
250
njn1d0825f2006-03-27 11:37:07 +0000251/* For VALGRIND_COUNT_LEAKS client request */
sewardj505a8192008-07-18 20:15:46 +0000252extern SizeT MC_(bytes_leaked);
253extern SizeT MC_(bytes_indirect);
254extern SizeT MC_(bytes_dubious);
255extern SizeT MC_(bytes_reachable);
256extern SizeT MC_(bytes_suppressed);
njn1d0825f2006-03-27 11:37:07 +0000257
njn8df80b22009-03-02 05:11:06 +0000258/* For VALGRIND_COUNT_LEAK_BLOCKS client request */
259extern SizeT MC_(blocks_leaked);
260extern SizeT MC_(blocks_indirect);
261extern SizeT MC_(blocks_dubious);
262extern SizeT MC_(blocks_reachable);
263extern SizeT MC_(blocks_suppressed);
264
njn1d0825f2006-03-27 11:37:07 +0000265typedef
266 enum {
267 LC_Off,
268 LC_Summary,
269 LC_Full,
270 }
271 LeakCheckMode;
272
sewardjc8bd1df2011-06-26 12:41:33 +0000273typedef
274 enum {
275 LCD_Any, // output all loss records, whatever the delta
276 LCD_Increased, // output loss records with an increase in size or blocks
277 LCD_Changed, // output loss records with an increase or
278 //decrease in size or blocks
279 }
280 LeakCheckDeltaMode;
281
njn29a5c012009-05-06 06:15:55 +0000282/* When a LossRecord is put into an OSet, these elements represent the key. */
283typedef
284 struct _LossRecordKey {
285 Reachedness state; // LC_Extra.state value shared by all blocks.
286 ExeContext* allocated_at; // Where they were allocated.
287 }
288 LossRecordKey;
289
njnb7a4e2e2009-05-01 00:30:43 +0000290/* A loss record, used for generating err msgs. Multiple leaked blocks can be
291 * merged into a single loss record if they have the same state and similar
292 * enough allocation points (controlled by --leak-resolution). */
njn718d3b12006-12-16 00:54:12 +0000293typedef
294 struct _LossRecord {
njn29a5c012009-05-06 06:15:55 +0000295 LossRecordKey key; // Key, when used in an OSet.
296 SizeT szB; // Sum of all MC_Chunk.szB values.
297 SizeT indirect_szB; // Sum of all LC_Extra.indirect_szB values.
298 UInt num_blocks; // Number of blocks represented by the record.
sewardjc8bd1df2011-06-26 12:41:33 +0000299 SizeT old_szB; // old_* values are the values found during the
300 SizeT old_indirect_szB; // previous leak search. old_* values are used to
301 UInt old_num_blocks; // output only the changed/new loss records
njn718d3b12006-12-16 00:54:12 +0000302 }
303 LossRecord;
304
sewardjc8bd1df2011-06-26 12:41:33 +0000305typedef
306 struct _LeakCheckParams {
307 LeakCheckMode mode;
308 Bool show_reachable;
309 Bool show_possibly_lost;
310 LeakCheckDeltaMode deltamode;
311 Bool requested_by_monitor_command; // True when requested by gdb/vgdb.
312 }
313 LeakCheckParams;
314
315void MC_(detect_memory_leaks) ( ThreadId tid, LeakCheckParams lcp);
316
317// maintains the lcp.deltamode given in the last call to detect_memory_leaks
318extern LeakCheckDeltaMode MC_(detect_memory_leaks_last_delta_mode);
319
sewardj30b3eca2011-06-28 08:20:39 +0000320// if delta_mode == LCD_Any, prints in buf an empty string
sewardjc8bd1df2011-06-26 12:41:33 +0000321// otherwise prints a delta in the layout " (+%'lu)" or " (-%'lu)"
322extern char * MC_(snprintf_delta) (char * buf, Int size,
323 SizeT current_val, SizeT old_val,
324 LeakCheckDeltaMode delta_mode);
325
njn8225cc02009-03-09 22:52:24 +0000326
327Bool MC_(is_valid_aligned_word) ( Addr a );
328Bool MC_(is_within_valid_secondary) ( Addr a );
njn1d0825f2006-03-27 11:37:07 +0000329
sewardj56adc352008-05-02 11:25:17 +0000330void MC_(pp_LeakError)(UInt n_this_record, UInt n_total_records,
331 LossRecord* l);
njn718d3b12006-12-16 00:54:12 +0000332
333
334/*------------------------------------------------------------*/
335/*--- Errors and suppressions ---*/
336/*------------------------------------------------------------*/
337
sewardj7ce71662008-05-02 10:33:15 +0000338/* Did we show to the user, any errors for which an uninitialised
339 value origin could have been collected (but wasn't) ? If yes,
340 then, at the end of the run, print a 1 line message advising that a
341 rerun with --track-origins=yes might help. */
sewardj505a8192008-07-18 20:15:46 +0000342extern Bool MC_(any_value_errors);
sewardj7ce71662008-05-02 10:33:15 +0000343
344/* Standard functions for error and suppressions as required by the
345 core/tool iface */
sewardj6b523cd2009-07-15 14:49:40 +0000346Bool MC_(eq_Error) ( VgRes res, Error* e1, Error* e2 );
347void MC_(before_pp_Error) ( Error* err );
348void MC_(pp_Error) ( Error* err );
349UInt MC_(update_Error_extra) ( Error* err );
sewardj7ce71662008-05-02 10:33:15 +0000350
351Bool MC_(is_recognised_suppression) ( Char* name, Supp* su );
352
njn35db56c2009-07-24 07:38:29 +0000353Bool MC_(read_extra_suppression_info) ( Int fd, Char** buf,
354 SizeT* nBuf, Supp *su );
sewardj7ce71662008-05-02 10:33:15 +0000355
356Bool MC_(error_matches_suppression) ( Error* err, Supp* su );
357
sewardj588adef2009-08-15 22:41:51 +0000358Bool MC_(get_extra_suppression_info) ( Error* err,
359 /*OUT*/Char* buf, Int nBuf );
sewardj7ce71662008-05-02 10:33:15 +0000360
361Char* MC_(get_error_name) ( Error* err );
362
363/* Recording of errors */
364void MC_(record_address_error) ( ThreadId tid, Addr a, Int szB,
365 Bool isWrite );
366void MC_(record_cond_error) ( ThreadId tid, UInt otag );
367void MC_(record_value_error) ( ThreadId tid, Int szB, UInt otag );
368void MC_(record_jump_error) ( ThreadId tid, Addr a );
369
370void MC_(record_free_error) ( ThreadId tid, Addr a );
371void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
372void MC_(record_freemismatch_error) ( ThreadId tid, MC_Chunk* mc );
373
374void MC_(record_overlap_error) ( ThreadId tid, Char* function,
375 Addr src, Addr dst, SizeT szB );
njn1dcee092009-02-24 03:07:37 +0000376void MC_(record_core_mem_error) ( ThreadId tid, Char* msg );
sewardj7ce71662008-05-02 10:33:15 +0000377void MC_(record_regparam_error) ( ThreadId tid, Char* msg, UInt otag );
378void MC_(record_memparam_error) ( ThreadId tid, Addr a,
379 Bool isAddrErr, Char* msg, UInt otag );
380void MC_(record_user_error) ( ThreadId tid, Addr a,
381 Bool isAddrErr, UInt otag );
382
383Bool MC_(record_leak_error) ( ThreadId tid,
384 UInt n_this_record,
385 UInt n_total_records,
386 LossRecord* lossRecord,
njn18afe5d2009-08-10 08:25:39 +0000387 Bool print_record,
388 Bool count_error );
sewardj7ce71662008-05-02 10:33:15 +0000389
sewardj3b290482011-05-06 21:02:55 +0000390/* prints a description of address a */
391void MC_(pp_describe_addr) (Addr a);
392
sewardj7ce71662008-05-02 10:33:15 +0000393/* Is this address in a user-specified "ignored range" ? */
394Bool MC_(in_ignored_range) ( Addr a );
395
396
397/*------------------------------------------------------------*/
398/*--- Client blocks ---*/
399/*------------------------------------------------------------*/
400
401/* Describes a client block. See mc_main.c. An unused block has
402 start == size == 0. */
403typedef
404 struct {
405 Addr start;
406 SizeT size;
407 ExeContext* where;
408 Char* desc;
409 }
410 CGenBlock;
411
412/* Get access to the client block array. */
413void MC_(get_ClientBlock_array)( /*OUT*/CGenBlock** blocks,
414 /*OUT*/UWord* nBlocks );
415
njn718d3b12006-12-16 00:54:12 +0000416
njn1d0825f2006-03-27 11:37:07 +0000417/*------------------------------------------------------------*/
418/*--- Command line options + defaults ---*/
419/*------------------------------------------------------------*/
420
421/* Allow loads from partially-valid addresses? default: YES */
sewardj505a8192008-07-18 20:15:46 +0000422extern Bool MC_(clo_partial_loads_ok);
njn1d0825f2006-03-27 11:37:07 +0000423
424/* Max volume of the freed blocks queue. */
sewardj505a8192008-07-18 20:15:46 +0000425extern Long MC_(clo_freelist_vol);
njn1d0825f2006-03-27 11:37:07 +0000426
427/* Do leak check at exit? default: NO */
sewardj505a8192008-07-18 20:15:46 +0000428extern LeakCheckMode MC_(clo_leak_check);
njn1d0825f2006-03-27 11:37:07 +0000429
430/* How closely should we compare ExeContexts in leak records? default: 2 */
sewardj505a8192008-07-18 20:15:46 +0000431extern VgRes MC_(clo_leak_resolution);
njn1d0825f2006-03-27 11:37:07 +0000432
433/* In leak check, show reachable-but-not-freed blocks? default: NO */
sewardj505a8192008-07-18 20:15:46 +0000434extern Bool MC_(clo_show_reachable);
njn1d0825f2006-03-27 11:37:07 +0000435
bart3cedf572010-08-26 10:56:27 +0000436/* In leak check, show possibly-lost blocks? default: YES */
437extern Bool MC_(clo_show_possibly_lost);
438
njn1d0825f2006-03-27 11:37:07 +0000439/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
440 * default: NO */
sewardj505a8192008-07-18 20:15:46 +0000441extern Bool MC_(clo_workaround_gcc296_bugs);
njn1d0825f2006-03-27 11:37:07 +0000442
sewardjeb0fa932007-11-30 21:41:40 +0000443/* Fill malloc-d/free-d client blocks with a specific value? -1 if
444 not, else 0x00 .. 0xFF indicating the fill value to use. Can be
445 useful for causing programs with bad heap corruption to fail in
446 more repeatable ways. Note that malloc-filled and free-filled
447 areas are still undefined and noaccess respectively. This merely
448 causes them to contain the specified values. */
sewardj505a8192008-07-18 20:15:46 +0000449extern Int MC_(clo_malloc_fill);
450extern Int MC_(clo_free_fill);
sewardjeb0fa932007-11-30 21:41:40 +0000451
sewardj7cf4e6b2008-05-01 20:24:26 +0000452/* Indicates the level of instrumentation/checking done by Memcheck.
453
454 1 = No undefined value checking, Addrcheck-style behaviour only:
455 only address checking is done. This is faster but finds fewer
456 errors. Note that although Addrcheck had 1 bit per byte
457 overhead vs the old Memcheck's 9 bits per byte, with this mode
458 and compressed V bits, no memory is saved with this mode --
459 it's still 2 bits per byte overhead. This is a little wasteful
460 -- it could be done with 1 bit per byte -- but lets us reuse
461 the many shadow memory access functions. Note that in this
462 mode neither the secondary V bit table nor the origin-tag cache
463 are used.
464
465 2 = Address checking and Undefined value checking are performed,
466 but origins are not tracked. So the origin-tag cache is not
467 used in this mode. This setting is the default and corresponds
468 to the "normal" Memcheck behaviour that has shipped for years.
469
470 3 = Address checking, undefined value checking, and origins for
471 undefined values are tracked.
472
473 The default is 2.
474*/
sewardj505a8192008-07-18 20:15:46 +0000475extern Int MC_(clo_mc_level);
sewardj7cf4e6b2008-05-01 20:24:26 +0000476
njn1d0825f2006-03-27 11:37:07 +0000477
478/*------------------------------------------------------------*/
479/*--- Instrumentation ---*/
njn25e49d8e72002-09-23 09:36:25 +0000480/*------------------------------------------------------------*/
481
njn66fe05a2003-07-22 09:12:33 +0000482/* Functions defined in mc_main.c */
sewardj95448072004-11-22 20:19:51 +0000483
sewardj7cf4e6b2008-05-01 20:24:26 +0000484/* For the fail_w_o functions, the UWord arg is actually the 32-bit
485 origin tag and should really be UInt, but to be simple and safe
486 considering it's called from generated code, just claim it to be a
487 UWord. */
sewardj56adc352008-05-02 11:25:17 +0000488VG_REGPARM(2) void MC_(helperc_value_checkN_fail_w_o) ( HWord, UWord );
489VG_REGPARM(1) void MC_(helperc_value_check8_fail_w_o) ( UWord );
490VG_REGPARM(1) void MC_(helperc_value_check4_fail_w_o) ( UWord );
491VG_REGPARM(1) void MC_(helperc_value_check1_fail_w_o) ( UWord );
492VG_REGPARM(1) void MC_(helperc_value_check0_fail_w_o) ( UWord );
sewardj7cf4e6b2008-05-01 20:24:26 +0000493
494/* And call these ones instead to report an uninitialised value error
495 but with no origin available. */
sewardj56adc352008-05-02 11:25:17 +0000496VG_REGPARM(1) void MC_(helperc_value_checkN_fail_no_o) ( HWord );
497VG_REGPARM(0) void MC_(helperc_value_check8_fail_no_o) ( void );
498VG_REGPARM(0) void MC_(helperc_value_check4_fail_no_o) ( void );
499VG_REGPARM(0) void MC_(helperc_value_check1_fail_no_o) ( void );
500VG_REGPARM(0) void MC_(helperc_value_check0_fail_no_o) ( void );
sewardj7cf4e6b2008-05-01 20:24:26 +0000501
502/* V-bits load/store helpers */
sewardj56adc352008-05-02 11:25:17 +0000503VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
504VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
505VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
506VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
507VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
508VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
509VG_REGPARM(2) void MC_(helperc_STOREV8) ( Addr, UWord );
sewardj95448072004-11-22 20:19:51 +0000510
sewardj56adc352008-05-02 11:25:17 +0000511VG_REGPARM(1) ULong MC_(helperc_LOADV64be) ( Addr );
512VG_REGPARM(1) ULong MC_(helperc_LOADV64le) ( Addr );
513VG_REGPARM(1) UWord MC_(helperc_LOADV32be) ( Addr );
514VG_REGPARM(1) UWord MC_(helperc_LOADV32le) ( Addr );
515VG_REGPARM(1) UWord MC_(helperc_LOADV16be) ( Addr );
516VG_REGPARM(1) UWord MC_(helperc_LOADV16le) ( Addr );
517VG_REGPARM(1) UWord MC_(helperc_LOADV8) ( Addr );
njn25e49d8e72002-09-23 09:36:25 +0000518
sewardj56adc352008-05-02 11:25:17 +0000519void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len,
520 Addr nia );
sewardj7cf4e6b2008-05-01 20:24:26 +0000521
522/* Origin tag load/store helpers */
523VG_REGPARM(2) void MC_(helperc_b_store1) ( Addr a, UWord d32 );
524VG_REGPARM(2) void MC_(helperc_b_store2) ( Addr a, UWord d32 );
525VG_REGPARM(2) void MC_(helperc_b_store4) ( Addr a, UWord d32 );
526VG_REGPARM(2) void MC_(helperc_b_store8) ( Addr a, UWord d32 );
527VG_REGPARM(2) void MC_(helperc_b_store16)( Addr a, UWord d32 );
528VG_REGPARM(1) UWord MC_(helperc_b_load1) ( Addr a );
529VG_REGPARM(1) UWord MC_(helperc_b_load2) ( Addr a );
530VG_REGPARM(1) UWord MC_(helperc_b_load4) ( Addr a );
531VG_REGPARM(1) UWord MC_(helperc_b_load8) ( Addr a );
532VG_REGPARM(1) UWord MC_(helperc_b_load16)( Addr a );
sewardj826ec492005-05-12 18:05:00 +0000533
njn51d827b2005-05-09 01:02:08 +0000534/* Functions defined in mc_translate.c */
sewardj0b9d74a2006-12-24 02:24:11 +0000535IRSB* MC_(instrument) ( VgCallbackClosure* closure,
536 IRSB* bb_in,
sewardj461df9c2006-01-17 02:06:39 +0000537 VexGuestLayout* layout,
538 VexGuestExtents* vge,
sewardj4ba057c2005-10-18 12:04:18 +0000539 IRType gWordTy, IRType hWordTy );
sewardj8d61eb12005-07-08 09:46:53 +0000540
sewardj81651dc2007-08-28 06:05:20 +0000541IRSB* MC_(final_tidy) ( IRSB* );
542
sewardj8d61eb12005-07-08 09:46:53 +0000543#endif /* ndef __MC_INCLUDE_H */
njn25e49d8e72002-09-23 09:36:25 +0000544
545/*--------------------------------------------------------------------*/
nethercote8b76fe52004-11-08 19:20:09 +0000546/*--- end ---*/
njn25e49d8e72002-09-23 09:36:25 +0000547/*--------------------------------------------------------------------*/