1
2/*--------------------------------------------------------------------*/
3/*--- A header file for all parts of the MemCheck tool.            ---*/
4/*---                                                 mc_include.h ---*/
5/*--------------------------------------------------------------------*/
6
7/*
8   This file is part of MemCheck, a heavyweight Valgrind tool for
9   detecting memory errors.
10
11   Copyright (C) 2000-2015 Julian Seward
12      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
32#ifndef __MC_INCLUDE_H
33#define __MC_INCLUDE_H
34
35#define MC_(str)    VGAPPEND(vgMemCheck_,str)
36
37
38/* This is a private header file for use only within the
39   memcheck/ directory. */
40
41/*------------------------------------------------------------*/
42/*--- Tracking the heap                                    ---*/
43/*------------------------------------------------------------*/
44
45/* By default, we want at least a 16B redzone on client heap blocks
46   for Memcheck.
47   The default can be modified by --redzone-size. */
48#define MC_MALLOC_DEFAULT_REDZONE_SZB    16
49// effective redzone, as (possibly) modified by --redzone-size:
50extern SizeT MC_(Malloc_Redzone_SzB);
51
52/* For malloc()/new/new[] vs. free()/delete/delete[] mismatch checking. */
53typedef
54   enum {
55      MC_AllocMalloc = 0,
56      MC_AllocNew    = 1,
57      MC_AllocNewVec = 2,
58      MC_AllocCustom = 3
59   }
60   MC_AllocKind;
61
62/* This describes a heap block. Nb: first two fields must match core's
63 * VgHashNode. */
64typedef
65   struct _MC_Chunk {
66      struct _MC_Chunk* next;
67      Addr         data;            // Address of the actual block.
68      SizeT        szB : (sizeof(SizeT)*8)-2; // Size requested; 30 or 62 bits.
69      MC_AllocKind allockind : 2;   // Which operation did the allocation.
70      ExeContext*  where[0];
71      /* Variable-length array. The size depends on MC_(clo_keep_stacktraces).
72         This array optionally stores the alloc and/or free stack trace. */
73   }
74   MC_Chunk;
75
76/* Returns the execontext where the MC_Chunk was allocated/freed.
77   Returns VG_(null_ExeContext)() if the execontext has not been recorded (due
78   to MC_(clo_keep_stacktraces) and/or because block not yet freed). */
79ExeContext* MC_(allocated_at) (MC_Chunk*);
80ExeContext* MC_(freed_at) (MC_Chunk*);
81
82/* Records and sets execontext according to MC_(clo_keep_stacktraces) */
83void  MC_(set_allocated_at) (ThreadId, MC_Chunk*);
84void  MC_(set_freed_at) (ThreadId, MC_Chunk*);
85
86/* number of pointers needed according to MC_(clo_keep_stacktraces). */
87UInt MC_(n_where_pointers) (void);
88
89/* Memory pool.  Nb: first two fields must match core's VgHashNode. */
90typedef
91   struct _MC_Mempool {
92      struct _MC_Mempool* next;
93      Addr          pool;           // pool identifier
94      SizeT         rzB;            // pool red-zone size
95      Bool          is_zeroed;      // allocations from this pool are zeroed
96      VgHashTable  *chunks;         // chunks associated with this pool
97   }
98   MC_Mempool;
99
100
101void* MC_(new_block)  ( ThreadId tid,
102                        Addr p, SizeT size, SizeT align,
103                        Bool is_zeroed, MC_AllocKind kind,
104                        VgHashTable *table);
105void MC_(handle_free) ( ThreadId tid,
106                        Addr p, UInt rzB, MC_AllocKind kind );
107
108void MC_(create_mempool)  ( Addr pool, UInt rzB, Bool is_zeroed );
109void MC_(destroy_mempool) ( Addr pool );
110void MC_(mempool_alloc)   ( ThreadId tid, Addr pool,
111                            Addr addr, SizeT size );
112void MC_(mempool_free)    ( Addr pool, Addr addr );
113void MC_(mempool_trim)    ( Addr pool, Addr addr, SizeT size );
114void MC_(move_mempool)    ( Addr poolA, Addr poolB );
115void MC_(mempool_change)  ( Addr pool, Addr addrA, Addr addrB, SizeT size );
116Bool MC_(mempool_exists)  ( Addr pool );
117
118/* Searches for a recently freed block which might bracket Addr a.
119   Return the MC_Chunk* for this block or NULL if no bracketting block
120   is found. */
121MC_Chunk* MC_(get_freed_block_bracketting)( Addr a );
122
123/* For efficient pooled alloc/free of the MC_Chunk. */
124extern PoolAlloc* MC_(chunk_poolalloc);
125
126/* For tracking malloc'd blocks.  Nb: it's quite important that it's a
127   VgHashTable, because VgHashTable allows duplicate keys without complaint.
128   This can occur if a user marks a malloc() block as also a custom block with
129   MALLOCLIKE_BLOCK. */
130extern VgHashTable *MC_(malloc_list);
131
132/* For tracking memory pools. */
133extern VgHashTable *MC_(mempool_list);
134
135/* Shadow memory functions */
136Bool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr );
137void MC_(make_mem_noaccess)        ( Addr a, SizeT len );
138void MC_(make_mem_undefined_w_otag)( Addr a, SizeT len, UInt otag );
139void MC_(make_mem_defined)         ( Addr a, SizeT len );
140void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len );
141
142void MC_(print_malloc_stats) ( void );
143/* nr of free operations done */
144SizeT MC_(get_cmalloc_n_frees) ( void );
145
146void* MC_(malloc)               ( ThreadId tid, SizeT n );
147void* MC_(__builtin_new)        ( ThreadId tid, SizeT n );
148void* MC_(__builtin_vec_new)    ( ThreadId tid, SizeT n );
149void* MC_(memalign)             ( ThreadId tid, SizeT align, SizeT n );
150void* MC_(calloc)               ( ThreadId tid, SizeT nmemb, SizeT size1 );
151void  MC_(free)                 ( ThreadId tid, void* p );
152void  MC_(__builtin_delete)     ( ThreadId tid, void* p );
153void  MC_(__builtin_vec_delete) ( ThreadId tid, void* p );
154void* MC_(realloc)              ( ThreadId tid, void* p, SizeT new_size );
155SizeT MC_(malloc_usable_size)   ( ThreadId tid, void* p );
156
157void MC_(handle_resizeInPlace)(ThreadId tid, Addr p,
158                               SizeT oldSizeB, SizeT newSizeB, SizeT rzB);
159
160
161/*------------------------------------------------------------*/
162/*--- Origin tracking translate-time support               ---*/
163/*------------------------------------------------------------*/
164
165/* See detailed comments in mc_machine.c. */
166Int MC_(get_otrack_shadow_offset) ( Int offset, Int szB );
167IRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr );
168
169/* Constants which are used as the lowest 2 bits in origin tags.
170
171   An origin tag comprises an upper 30-bit ECU field and a lower 2-bit
172   'kind' field.  The ECU field is a number given out by m_execontext
173   and has a 1-1 mapping with ExeContext*s.  An ECU can be used
174   directly as an origin tag (otag), but in fact we want to put
175   additional information 'kind' field to indicate roughly where the
176   tag came from.  This helps print more understandable error messages
177   for the user -- it has no other purpose.
178
179   Hence the following 2-bit constants are needed for 'kind' field.
180
181   To summarise:
182
183   * Both ECUs and origin tags are represented as 32-bit words
184
185   * m_execontext and the core-tool interface deal purely in ECUs.
186     They have no knowledge of origin tags - that is a purely
187     Memcheck-internal matter.
188
189   * all valid ECUs have the lowest 2 bits zero and at least
190     one of the upper 30 bits nonzero (see VG_(is_plausible_ECU))
191
192   * to convert from an ECU to an otag, OR in one of the MC_OKIND_
193     constants below
194
195   * to convert an otag back to an ECU, AND it with ~3
196*/
197
198#define MC_OKIND_UNKNOWN  0  /* unknown origin */
199#define MC_OKIND_HEAP     1  /* this is a heap origin */
200#define MC_OKIND_STACK    2  /* this is a stack origin */
201#define MC_OKIND_USER     3  /* arises from user-supplied client req */
202
203
204/*------------------------------------------------------------*/
205/*--- Profiling of memory events                           ---*/
206/*------------------------------------------------------------*/
207
208/* Define to collect detailed performance info. */
209/* #define MC_PROFILE_MEMORY */
210#ifdef MC_PROFILE_MEMORY
211
212/* Order of enumerators does not matter. But MCPE_LAST has to be the
213   last entry in the list as it is used as an array bound. */
214enum {
215   MCPE_LOADV8,
216   MCPE_LOADV8_SLOW1,
217   MCPE_LOADV8_SLOW2,
218   MCPE_LOADV16,
219   MCPE_LOADV16_SLOW1,
220   MCPE_LOADV16_SLOW2,
221   MCPE_LOADV32,
222   MCPE_LOADV32_SLOW1,
223   MCPE_LOADV32_SLOW2,
224   MCPE_LOADV64,
225   MCPE_LOADV64_SLOW1,
226   MCPE_LOADV64_SLOW2,
227   MCPE_LOADV_128_OR_256,
228   MCPE_LOADV_128_OR_256_SLOW_LOOP,
229   MCPE_LOADV_128_OR_256_SLOW1,
230   MCPE_LOADV_128_OR_256_SLOW2,
231   MCPE_LOADVN_SLOW,
232   MCPE_LOADVN_SLOW_LOOP,
233   MCPE_STOREV8,
234   MCPE_STOREV8_SLOW1,
235   MCPE_STOREV8_SLOW2,
236   MCPE_STOREV8_SLOW3,
237   MCPE_STOREV8_SLOW4,
238   MCPE_STOREV16,
239   MCPE_STOREV16_SLOW1,
240   MCPE_STOREV16_SLOW2,
241   MCPE_STOREV16_SLOW3,
242   MCPE_STOREV16_SLOW4,
243   MCPE_STOREV32,
244   MCPE_STOREV32_SLOW1,
245   MCPE_STOREV32_SLOW2,
246   MCPE_STOREV32_SLOW3,
247   MCPE_STOREV32_SLOW4,
248   MCPE_STOREV64,
249   MCPE_STOREV64_SLOW1,
250   MCPE_STOREV64_SLOW2,
251   MCPE_STOREV64_SLOW3,
252   MCPE_STOREV64_SLOW4,
253   MCPE_STOREVN_SLOW,
254   MCPE_STOREVN_SLOW_LOOP,
255   MCPE_MAKE_ALIGNED_WORD32_UNDEFINED,
256   MCPE_MAKE_ALIGNED_WORD32_UNDEFINED_SLOW,
257   MCPE_MAKE_ALIGNED_WORD64_UNDEFINED,
258   MCPE_MAKE_ALIGNED_WORD64_UNDEFINED_SLOW,
259   MCPE_MAKE_ALIGNED_WORD32_NOACCESS,
260   MCPE_MAKE_ALIGNED_WORD32_NOACCESS_SLOW,
261   MCPE_MAKE_ALIGNED_WORD64_NOACCESS,
262   MCPE_MAKE_ALIGNED_WORD64_NOACCESS_SLOW,
263   MCPE_MAKE_MEM_NOACCESS,
264   MCPE_MAKE_MEM_UNDEFINED,
265   MCPE_MAKE_MEM_UNDEFINED_W_OTAG,
266   MCPE_MAKE_MEM_DEFINED,
267   MCPE_CHEAP_SANITY_CHECK,
268   MCPE_EXPENSIVE_SANITY_CHECK,
269   MCPE_COPY_ADDRESS_RANGE_STATE,
270   MCPE_COPY_ADDRESS_RANGE_STATE_LOOP1,
271   MCPE_COPY_ADDRESS_RANGE_STATE_LOOP2,
272   MCPE_CHECK_MEM_IS_NOACCESS,
273   MCPE_CHECK_MEM_IS_NOACCESS_LOOP,
274   MCPE_IS_MEM_ADDRESSABLE,
275   MCPE_IS_MEM_ADDRESSABLE_LOOP,
276   MCPE_IS_MEM_DEFINED,
277   MCPE_IS_MEM_DEFINED_LOOP,
278   MCPE_IS_MEM_DEFINED_COMPREHENSIVE,
279   MCPE_IS_MEM_DEFINED_COMPREHENSIVE_LOOP,
280   MCPE_IS_DEFINED_ASCIIZ,
281   MCPE_IS_DEFINED_ASCIIZ_LOOP,
282   MCPE_FIND_CHUNK_FOR_OLD,
283   MCPE_FIND_CHUNK_FOR_OLD_LOOP,
284   MCPE_SET_ADDRESS_RANGE_PERMS,
285   MCPE_SET_ADDRESS_RANGE_PERMS_SINGLE_SECMAP,
286   MCPE_SET_ADDRESS_RANGE_PERMS_STARTOF_SECMAP,
287   MCPE_SET_ADDRESS_RANGE_PERMS_MULTIPLE_SECMAPS,
288   MCPE_SET_ADDRESS_RANGE_PERMS_DIST_SM1,
289   MCPE_SET_ADDRESS_RANGE_PERMS_DIST_SM2,
290   MCPE_SET_ADDRESS_RANGE_PERMS_DIST_SM1_QUICK,
291   MCPE_SET_ADDRESS_RANGE_PERMS_DIST_SM2_QUICK,
292   MCPE_SET_ADDRESS_RANGE_PERMS_LOOP1A,
293   MCPE_SET_ADDRESS_RANGE_PERMS_LOOP1B,
294   MCPE_SET_ADDRESS_RANGE_PERMS_LOOP1C,
295   MCPE_SET_ADDRESS_RANGE_PERMS_LOOP8A,
296   MCPE_SET_ADDRESS_RANGE_PERMS_LOOP8B,
297   MCPE_SET_ADDRESS_RANGE_PERMS_LOOP64K,
298   MCPE_SET_ADDRESS_RANGE_PERMS_LOOP64K_FREE_DIST_SM,
299   MCPE_NEW_MEM_STACK,
300   MCPE_NEW_MEM_STACK_4,
301   MCPE_NEW_MEM_STACK_8,
302   MCPE_NEW_MEM_STACK_12,
303   MCPE_NEW_MEM_STACK_16,
304   MCPE_NEW_MEM_STACK_32,
305   MCPE_NEW_MEM_STACK_112,
306   MCPE_NEW_MEM_STACK_128,
307   MCPE_NEW_MEM_STACK_144,
308   MCPE_NEW_MEM_STACK_160,
309   MCPE_DIE_MEM_STACK,
310   MCPE_DIE_MEM_STACK_4,
311   MCPE_DIE_MEM_STACK_8,
312   MCPE_DIE_MEM_STACK_12,
313   MCPE_DIE_MEM_STACK_16,
314   MCPE_DIE_MEM_STACK_32,
315   MCPE_DIE_MEM_STACK_112,
316   MCPE_DIE_MEM_STACK_128,
317   MCPE_DIE_MEM_STACK_144,
318   MCPE_DIE_MEM_STACK_160,
319   /* Do not add enumerators past this line. */
320   MCPE_LAST
321};
322
323extern ULong MC_(event_ctr)[MCPE_LAST];
324
325#  define PROF_EVENT(ev)                           \
326   do { tl_assert((ev) >= 0 && (ev) < MCPE_LAST);  \
327      MC_(event_ctr)[ev]++;                        \
328   } while (False);
329
330#else
331
332#  define PROF_EVENT(ev)    /* */
333
334#endif   /* MC_PROFILE_MEMORY */
335
336
337/*------------------------------------------------------------*/
338/*--- V and A bits (Victoria & Albert ?)                   ---*/
339/*------------------------------------------------------------*/
340
341/* The number of entries in the primary map can be altered.  However
342   we hardwire the assumption that each secondary map covers precisely
343   64k of address space. */
344#define SM_SIZE 65536            /* DO NOT CHANGE */
345#define SM_MASK (SM_SIZE-1)      /* DO NOT CHANGE */
346
347#define V_BIT_DEFINED         0
348#define V_BIT_UNDEFINED       1
349
350#define V_BITS8_DEFINED       0
351#define V_BITS8_UNDEFINED     0xFF
352
353#define V_BITS16_DEFINED      0
354#define V_BITS16_UNDEFINED    0xFFFF
355
356#define V_BITS32_DEFINED      0
357#define V_BITS32_UNDEFINED    0xFFFFFFFF
358
359#define V_BITS64_DEFINED      0ULL
360#define V_BITS64_UNDEFINED    0xFFFFFFFFFFFFFFFFULL
361
362
363/*------------------------------------------------------------*/
364/*--- Leak checking                                        ---*/
365/*------------------------------------------------------------*/
366
367typedef
368   enum {
369      // Nb: the order is important -- it dictates the order of loss records
370      // of equal sizes.
371      Reachable    =0,  // Definitely reachable from root-set.
372      Possible     =1,  // Possibly reachable from root-set;  involves at
373                        //   least one interior-pointer along the way.
374      IndirectLeak =2,  // Leaked, but reachable from another leaked block
375                        //   (be it Unreached or IndirectLeak).
376      Unreached    =3,  // Not reached, ie. leaked.
377                        //   (At best, only reachable from itself via a cycle.)
378  }
379  Reachedness;
380
381// Build mask to check or set Reachedness r membership
382#define R2S(r) (1 << (r))
383// Reachedness r is member of the Set s ?
384#define RiS(r,s) ((s) & R2S(r))
385// Returns a set containing all Reachedness
386UInt MC_(all_Reachedness)(void);
387
388/* For VALGRIND_COUNT_LEAKS client request */
389extern SizeT MC_(bytes_leaked);
390extern SizeT MC_(bytes_indirect);
391extern SizeT MC_(bytes_dubious);
392extern SizeT MC_(bytes_reachable);
393extern SizeT MC_(bytes_suppressed);
394
395/* For VALGRIND_COUNT_LEAK_BLOCKS client request */
396extern SizeT MC_(blocks_leaked);
397extern SizeT MC_(blocks_indirect);
398extern SizeT MC_(blocks_dubious);
399extern SizeT MC_(blocks_reachable);
400extern SizeT MC_(blocks_suppressed);
401
402typedef
403   enum {
404      LC_Off,
405      LC_Summary,
406      LC_Full,
407   }
408   LeakCheckMode;
409
410typedef
411   enum {
412      LCD_Any,       // output all loss records, whatever the delta
413      LCD_Increased, // output loss records with an increase in size or blocks
414      LCD_Changed,   // output loss records with an increase or
415                     //decrease in size or blocks
416   }
417   LeakCheckDeltaMode;
418
419/* When a LossRecord is put into an OSet, these elements represent the key. */
420typedef
421   struct _LossRecordKey {
422      Reachedness  state;        // LC_Extra.state value shared by all blocks.
423      ExeContext*  allocated_at; // Where they were allocated.
424   }
425   LossRecordKey;
426
427/* A loss record, used for generating err msgs.  Multiple leaked blocks can be
428 * merged into a single loss record if they have the same state and similar
429 * enough allocation points (controlled by --leak-resolution). */
430typedef
431   struct _LossRecord {
432      LossRecordKey key;  // Key, when used in an OSet.
433      SizeT szB;          // Sum of all MC_Chunk.szB values.
434      SizeT indirect_szB; // Sum of all LC_Extra.indirect_szB values.
435      UInt  num_blocks;   // Number of blocks represented by the record.
436      SizeT old_szB;          // old_* values are the values found during the
437      SizeT old_indirect_szB; // previous leak search. old_* values are used to
438      UInt  old_num_blocks;   // output only the changed/new loss records
439   }
440   LossRecord;
441
442typedef
443   struct _LeakCheckParams {
444      LeakCheckMode mode;
445      UInt show_leak_kinds;
446      UInt errors_for_leak_kinds;
447      UInt heuristics;
448      LeakCheckDeltaMode deltamode;
449      UInt max_loss_records_output; // limit on the nr of loss records output.
450      Bool requested_by_monitor_command; // True when requested by gdb/vgdb.
451   }
452   LeakCheckParams;
453
454void MC_(detect_memory_leaks) ( ThreadId tid, LeakCheckParams * lcp);
455
456// Each time a leak search is done, the leak search generation
457// MC_(leak_search_gen) is incremented.
458extern UInt MC_(leak_search_gen);
459
460// maintains the lcp.deltamode given in the last call to detect_memory_leaks
461extern LeakCheckDeltaMode MC_(detect_memory_leaks_last_delta_mode);
462
463// prints the list of blocks corresponding to the given loss_record_nr slice
464// (from/to) (up to maximum max_blocks)
465// Returns True if loss_record_nr_from identifies a correct loss record
466// from last leak search, returns False otherwise.
467// Note that loss_record_nr_to can be bigger than the nr of loss records. All
468// loss records after from will then be examined and maybe printed.
469// If heuristics != 0, print only the loss records/blocks found via
470// one of the heuristics in the set.
471Bool MC_(print_block_list) ( UInt loss_record_nr_from, UInt loss_record_nr_to,
472                             UInt max_blocks, UInt heuristics);
473
474// Prints the addresses/registers/... at which a pointer to
475// the given range [address, address+szB[ is found.
476void MC_(who_points_at) ( Addr address, SizeT szB);
477
478// if delta_mode == LCD_Any, prints in buf an empty string
479// otherwise prints a delta in the layout  " (+%'lu)" or " (-%'lu)"
480extern HChar * MC_(snprintf_delta) (HChar * buf, Int size,
481                                    SizeT current_val, SizeT old_val,
482                                    LeakCheckDeltaMode delta_mode);
483
484
485Bool MC_(is_valid_aligned_word)     ( Addr a );
486Bool MC_(is_within_valid_secondary) ( Addr a );
487
488// Prints as user msg a description of the given loss record.
489void MC_(pp_LossRecord)(UInt n_this_record, UInt n_total_records,
490                        LossRecord* l);
491
492
493/*------------------------------------------------------------*/
494/*--- Errors and suppressions                              ---*/
495/*------------------------------------------------------------*/
496
497/* Did we show to the user, any errors for which an uninitialised
498   value origin could have been collected (but wasn't) ?  If yes,
499   then, at the end of the run, print a 1 line message advising that a
500   rerun with --track-origins=yes might help. */
501extern Bool MC_(any_value_errors);
502
503/* Standard functions for error and suppressions as required by the
504   core/tool iface */
505Bool MC_(eq_Error)           ( VgRes res, const Error* e1, const Error* e2 );
506void MC_(before_pp_Error)    ( const Error* err );
507void MC_(pp_Error)           ( const Error* err );
508UInt MC_(update_Error_extra) ( const Error* err );
509
510Bool MC_(is_recognised_suppression) ( const HChar* name, Supp* su );
511
512Bool MC_(read_extra_suppression_info) ( Int fd, HChar** buf,
513                                        SizeT* nBuf, Int* lineno, Supp *su );
514
515Bool MC_(error_matches_suppression) ( const Error* err, const Supp* su );
516
517SizeT MC_(get_extra_suppression_info) ( const Error* err,
518                                        /*OUT*/HChar* buf, Int nBuf );
519SizeT MC_(print_extra_suppression_use) ( const Supp* su,
520                                         /*OUT*/HChar* buf, Int nBuf );
521void MC_(update_extra_suppression_use) ( const Error* err, const Supp* su );
522
523const HChar* MC_(get_error_name) ( const Error* err );
524
525/* Recording of errors */
526void MC_(record_address_error) ( ThreadId tid, Addr a, Int szB,
527                                 Bool isWrite );
528void MC_(record_cond_error)    ( ThreadId tid, UInt otag );
529void MC_(record_value_error)   ( ThreadId tid, Int szB, UInt otag );
530void MC_(record_jump_error)    ( ThreadId tid, Addr a );
531
532void MC_(record_free_error)            ( ThreadId tid, Addr a );
533void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
534void MC_(record_freemismatch_error)    ( ThreadId tid, MC_Chunk* mc );
535
536void MC_(record_overlap_error)  ( ThreadId tid, const HChar* function,
537                                  Addr src, Addr dst, SizeT szB );
538void MC_(record_core_mem_error) ( ThreadId tid, const HChar* msg );
539void MC_(record_regparam_error) ( ThreadId tid, const HChar* msg, UInt otag );
540void MC_(record_memparam_error) ( ThreadId tid, Addr a,
541                                  Bool isAddrErr, const HChar* msg, UInt otag );
542void MC_(record_user_error)     ( ThreadId tid, Addr a,
543                                  Bool isAddrErr, UInt otag );
544
545Bool MC_(record_leak_error)     ( ThreadId tid,
546                                  UInt n_this_record,
547                                  UInt n_total_records,
548                                  LossRecord* lossRecord,
549                                  Bool print_record,
550                                  Bool count_error );
551
552Bool MC_(record_fishy_value_error)  ( ThreadId tid, const HChar* function,
553                                      const HChar *argument_name, SizeT value );
554
555/* Leak kinds tokens to call VG_(parse_enum_set). */
556extern const HChar* MC_(parse_leak_kinds_tokens);
557
558/* prints a description of address a */
559void MC_(pp_describe_addr) (Addr a);
560
561/* Is this address in a user-specified "ignored range" ? */
562Bool MC_(in_ignored_range) ( Addr a );
563
564
565/*------------------------------------------------------------*/
566/*--- Client blocks                                        ---*/
567/*------------------------------------------------------------*/
568
569/* Describes a client block.  See mc_main.c.  An unused block has
570   start == size == 0.  */
571typedef
572   struct {
573      Addr        start;
574      SizeT       size;
575      ExeContext* where;
576      HChar*      desc;
577   }
578   CGenBlock;
579
580/* Get access to the client block array. */
581void MC_(get_ClientBlock_array)( /*OUT*/CGenBlock** blocks,
582                                 /*OUT*/UWord* nBlocks );
583
584
585/*------------------------------------------------------------*/
586/*--- Command line options + defaults                      ---*/
587/*------------------------------------------------------------*/
588
589/* Allow loads from partially-valid addresses?  default: YES */
590extern Bool MC_(clo_partial_loads_ok);
591
592/* Max volume of the freed blocks queue. */
593extern Long MC_(clo_freelist_vol);
594
595/* Blocks with a size >= MC_(clo_freelist_big_blocks) will be put
596   in the "big block" freed blocks queue. */
597extern Long MC_(clo_freelist_big_blocks);
598
599/* Do leak check at exit?  default: NO */
600extern LeakCheckMode MC_(clo_leak_check);
601
602/* How closely should we compare ExeContexts in leak records? default: 2 */
603extern VgRes MC_(clo_leak_resolution);
604
605/* In leak check, show loss records if their R2S(reachedness) is set.
606   Default : R2S(Possible) | R2S(Unreached). */
607extern UInt MC_(clo_show_leak_kinds);
608
609/* In leak check, a loss record is an error if its R2S(reachedness) is set.
610   Default : R2S(Possible) | R2S(Unreached). */
611extern UInt MC_(clo_errors_for_leak_kinds);
612
613/* Various leak check heuristics which can be activated/deactivated. */
614typedef
615   enum {
616      LchNone                =0,
617      // no heuristic.
618      LchStdString           =1,
619      // Consider interior pointer pointing at the array of char in a
620      // std::string as reachable.
621      LchLength64            =2,
622      // Consider interior pointer pointing at offset 64bit of a block as
623      // reachable, when the first 8 bytes contains the block size - 8.
624      // Such length+interior pointers are used by e.g. sqlite3MemMalloc.
625      // On 64bit platforms LchNewArray will also match these blocks.
626      LchNewArray            =3,
627      // Consider interior pointer pointing at second word of a new[] array as
628      // reachable. Such interior pointers are used for arrays whose elements
629      // have a destructor.
630      LchMultipleInheritance =4,
631      // Conside interior pointer pointing just after what looks a vtable
632      // as reachable.
633  }
634  LeakCheckHeuristic;
635
636// Nr of heuristics, including the LchNone heuristic.
637#define N_LEAK_CHECK_HEURISTICS 5
638
639// Build mask to check or set Heuristic h membership
640#define H2S(h) (1 << (h))
641// Heuristic h is member of the Set s ?
642#define HiS(h,s) ((s) & H2S(h))
643
644/* Heuristics set to use for the leak search.
645   Default : all heuristics. */
646extern UInt MC_(clo_leak_check_heuristics);
647
648/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
649 * default: NO */
650extern Bool MC_(clo_workaround_gcc296_bugs);
651
652/* Fill malloc-d/free-d client blocks with a specific value?  -1 if
653   not, else 0x00 .. 0xFF indicating the fill value to use.  Can be
654   useful for causing programs with bad heap corruption to fail in
655   more repeatable ways.  Note that malloc-filled and free-filled
656   areas are still undefined and noaccess respectively.  This merely
657   causes them to contain the specified values. */
658extern Int MC_(clo_malloc_fill);
659extern Int MC_(clo_free_fill);
660
661/* Which stack trace(s) to keep for malloc'd/free'd client blocks?
662   For each client block, the stack traces where it was allocated
663   and/or freed are optionally kept depending on MC_(clo_keep_stacktraces). */
664typedef
665   enum {                 // keep alloc stack trace ?  keep free stack trace ?
666      KS_none,            // never                     never
667      KS_alloc,           // always                    never
668      KS_free,            // never                     always
669      KS_alloc_then_free, // when still malloc'd       when free'd
670      KS_alloc_and_free,  // always                    always
671   }
672   KeepStacktraces;
673extern KeepStacktraces MC_(clo_keep_stacktraces);
674
675/* Indicates the level of instrumentation/checking done by Memcheck.
676
677   1 = No undefined value checking, Addrcheck-style behaviour only:
678       only address checking is done.  This is faster but finds fewer
679       errors.  Note that although Addrcheck had 1 bit per byte
680       overhead vs the old Memcheck's 9 bits per byte, with this mode
681       and compressed V bits, no memory is saved with this mode --
682       it's still 2 bits per byte overhead.  This is a little wasteful
683       -- it could be done with 1 bit per byte -- but lets us reuse
684       the many shadow memory access functions.  Note that in this
685       mode neither the secondary V bit table nor the origin-tag cache
686       are used.
687
688   2 = Address checking and Undefined value checking are performed,
689       but origins are not tracked.  So the origin-tag cache is not
690       used in this mode.  This setting is the default and corresponds
691       to the "normal" Memcheck behaviour that has shipped for years.
692
693   3 = Address checking, undefined value checking, and origins for
694       undefined values are tracked.
695
696   The default is 2.
697*/
698extern Int MC_(clo_mc_level);
699
700/* Should we show mismatched frees?  Default: YES */
701extern Bool MC_(clo_show_mismatched_frees);
702
703/* Should we use expensive definedness checking for add/sub and compare
704   operations? Default: NO */
705extern Bool MC_(clo_expensive_definedness_checks);
706
707/*------------------------------------------------------------*/
708/*--- Instrumentation                                      ---*/
709/*------------------------------------------------------------*/
710
711/* Functions defined in mc_main.c */
712
713/* For the fail_w_o functions, the UWord arg is actually the 32-bit
714   origin tag and should really be UInt, but to be simple and safe
715   considering it's called from generated code, just claim it to be a
716   UWord. */
717VG_REGPARM(2) void MC_(helperc_value_checkN_fail_w_o) ( HWord, UWord );
718VG_REGPARM(1) void MC_(helperc_value_check8_fail_w_o) ( UWord );
719VG_REGPARM(1) void MC_(helperc_value_check4_fail_w_o) ( UWord );
720VG_REGPARM(1) void MC_(helperc_value_check1_fail_w_o) ( UWord );
721VG_REGPARM(1) void MC_(helperc_value_check0_fail_w_o) ( UWord );
722
723/* And call these ones instead to report an uninitialised value error
724   but with no origin available. */
725VG_REGPARM(1) void MC_(helperc_value_checkN_fail_no_o) ( HWord );
726VG_REGPARM(0) void MC_(helperc_value_check8_fail_no_o) ( void );
727VG_REGPARM(0) void MC_(helperc_value_check4_fail_no_o) ( void );
728VG_REGPARM(0) void MC_(helperc_value_check1_fail_no_o) ( void );
729VG_REGPARM(0) void MC_(helperc_value_check0_fail_no_o) ( void );
730
731/* V-bits load/store helpers */
732VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
733VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
734VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
735VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
736VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
737VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
738VG_REGPARM(2) void MC_(helperc_STOREV8)    ( Addr, UWord );
739
740VG_REGPARM(2) void  MC_(helperc_LOADV256be) ( /*OUT*/V256*, Addr );
741VG_REGPARM(2) void  MC_(helperc_LOADV256le) ( /*OUT*/V256*, Addr );
742VG_REGPARM(2) void  MC_(helperc_LOADV128be) ( /*OUT*/V128*, Addr );
743VG_REGPARM(2) void  MC_(helperc_LOADV128le) ( /*OUT*/V128*, Addr );
744VG_REGPARM(1) ULong MC_(helperc_LOADV64be)  ( Addr );
745VG_REGPARM(1) ULong MC_(helperc_LOADV64le)  ( Addr );
746VG_REGPARM(1) UWord MC_(helperc_LOADV32be)  ( Addr );
747VG_REGPARM(1) UWord MC_(helperc_LOADV32le)  ( Addr );
748VG_REGPARM(1) UWord MC_(helperc_LOADV16be)  ( Addr );
749VG_REGPARM(1) UWord MC_(helperc_LOADV16le)  ( Addr );
750VG_REGPARM(1) UWord MC_(helperc_LOADV8)     ( Addr );
751
752void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len,
753                                                 Addr nia );
754
755/* Origin tag load/store helpers */
756VG_REGPARM(2) void  MC_(helperc_b_store1) ( Addr a, UWord d32 );
757VG_REGPARM(2) void  MC_(helperc_b_store2) ( Addr a, UWord d32 );
758VG_REGPARM(2) void  MC_(helperc_b_store4) ( Addr a, UWord d32 );
759VG_REGPARM(2) void  MC_(helperc_b_store8) ( Addr a, UWord d32 );
760VG_REGPARM(2) void  MC_(helperc_b_store16)( Addr a, UWord d32 );
761VG_REGPARM(2) void  MC_(helperc_b_store32)( Addr a, UWord d32 );
762VG_REGPARM(1) UWord MC_(helperc_b_load1) ( Addr a );
763VG_REGPARM(1) UWord MC_(helperc_b_load2) ( Addr a );
764VG_REGPARM(1) UWord MC_(helperc_b_load4) ( Addr a );
765VG_REGPARM(1) UWord MC_(helperc_b_load8) ( Addr a );
766VG_REGPARM(1) UWord MC_(helperc_b_load16)( Addr a );
767VG_REGPARM(1) UWord MC_(helperc_b_load32)( Addr a );
768
769/* Functions defined in mc_translate.c */
770IRSB* MC_(instrument) ( VgCallbackClosure* closure,
771                        IRSB* bb_in,
772                        const VexGuestLayout* layout,
773                        const VexGuestExtents* vge,
774                        const VexArchInfo* archinfo_host,
775                        IRType gWordTy, IRType hWordTy );
776
777IRSB* MC_(final_tidy) ( IRSB* );
778
779#endif /* ndef __MC_INCLUDE_H */
780
781/*--------------------------------------------------------------------*/
782/*--- end                                                          ---*/
783/*--------------------------------------------------------------------*/
784