1c953984b8ee34ac55830b9871138b409d9d9476cnjn
2e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn/*--------------------------------------------------------------------*/
3137bc55f216bc7d9528f159a78cdf9025e0b02ffnethercote/*--- A header file for all parts of the MemCheck tool.            ---*/
4cac76cb18577b9c51d331f56e8ea241f6effaf31njn/*---                                                 mc_include.h ---*/
5e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn/*--------------------------------------------------------------------*/
6e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
7e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn/*
8137bc55f216bc7d9528f159a78cdf9025e0b02ffnethercote   This file is part of MemCheck, a heavyweight Valgrind tool for
9c953984b8ee34ac55830b9871138b409d9d9476cnjn   detecting memory errors.
10e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
110f157ddb404bcde7815a1c5bf2d7e41c114f3d73sewardj   Copyright (C) 2000-2013 Julian Seward
12e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn      jseward@acm.org
13e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
14e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   This program is free software; you can redistribute it and/or
15e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   modify it under the terms of the GNU General Public License as
16e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   published by the Free Software Foundation; either version 2 of the
17e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   License, or (at your option) any later version.
18e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
19e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   This program is distributed in the hope that it will be useful, but
20e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   WITHOUT ANY WARRANTY; without even the implied warranty of
21e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   General Public License for more details.
23e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
24e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   You should have received a copy of the GNU General Public License
25e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   along with this program; if not, write to the Free Software
26e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   02111-1307, USA.
28e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
29e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn   The GNU General Public License is contained in the file COPYING.
30e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn*/
31e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
32cac76cb18577b9c51d331f56e8ea241f6effaf31njn#ifndef __MC_INCLUDE_H
33cac76cb18577b9c51d331f56e8ea241f6effaf31njn#define __MC_INCLUDE_H
34e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
3544acd3e8526899deb041d11df690f69dc071fe2cnjn#define MC_(str)    VGAPPEND(vgMemCheck_,str)
36e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
377ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
387ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj/* This is a private header file for use only within the
397ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj   memcheck/ directory. */
407ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
41e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn/*------------------------------------------------------------*/
421d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*--- Tracking the heap                                    ---*/
431d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*------------------------------------------------------------*/
441d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
45d99c26a4bc18fd3b17c4626c9c1fbd1583388660philippe/* By default, we want at least a 16B redzone on client heap blocks
46d99c26a4bc18fd3b17c4626c9c1fbd1583388660philippe   for Memcheck.
47d99c26a4bc18fd3b17c4626c9c1fbd1583388660philippe   The default can be modified by --redzone-size. */
48d99c26a4bc18fd3b17c4626c9c1fbd1583388660philippe#define MC_MALLOC_DEFAULT_REDZONE_SZB    16
49d99c26a4bc18fd3b17c4626c9c1fbd1583388660philippe// effective redzone, as (possibly) modified by --redzone-size:
50d99c26a4bc18fd3b17c4626c9c1fbd1583388660philippeextern SizeT MC_(Malloc_Redzone_SzB);
511d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
521d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* For malloc()/new/new[] vs. free()/delete/delete[] mismatch checking. */
531d0825ff46d57f0ce83c3fa88538a42f67022eeenjntypedef
541d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   enum {
551d0825ff46d57f0ce83c3fa88538a42f67022eeenjn      MC_AllocMalloc = 0,
561d0825ff46d57f0ce83c3fa88538a42f67022eeenjn      MC_AllocNew    = 1,
571d0825ff46d57f0ce83c3fa88538a42f67022eeenjn      MC_AllocNewVec = 2,
581d0825ff46d57f0ce83c3fa88538a42f67022eeenjn      MC_AllocCustom = 3
591d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   }
601d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   MC_AllocKind;
611d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
628225cc0de2ccf390127b5910dceb7c6185091a38njn/* This describes a heap block. Nb: first two fields must match core's
638225cc0de2ccf390127b5910dceb7c6185091a38njn * VgHashNode. */
641d0825ff46d57f0ce83c3fa88538a42f67022eeenjntypedef
651d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   struct _MC_Chunk {
661d0825ff46d57f0ce83c3fa88538a42f67022eeenjn      struct _MC_Chunk* next;
678225cc0de2ccf390127b5910dceb7c6185091a38njn      Addr         data;            // Address of the actual block.
688225cc0de2ccf390127b5910dceb7c6185091a38njn      SizeT        szB : (sizeof(SizeT)*8)-2; // Size requested; 30 or 62 bits.
698225cc0de2ccf390127b5910dceb7c6185091a38njn      MC_AllocKind allockind : 2;   // Which operation did the allocation.
708617b5b8f16570c9003379464d60e8572a801a8cphilippe      ExeContext*  where[0];
718617b5b8f16570c9003379464d60e8572a801a8cphilippe      /* Variable-length array. The size depends on MC_(clo_keep_stacktraces).
728617b5b8f16570c9003379464d60e8572a801a8cphilippe         This array optionally stores the alloc and/or free stack trace. */
731d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   }
741d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   MC_Chunk;
751d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
768617b5b8f16570c9003379464d60e8572a801a8cphilippe/* Returns the execontext where the MC_Chunk was allocated/freed.
778617b5b8f16570c9003379464d60e8572a801a8cphilippe   Returns VG_(null_ExeContext)() if the execontext has not been recorded (due
788617b5b8f16570c9003379464d60e8572a801a8cphilippe   to MC_(clo_keep_stacktraces) and/or because block not yet freed). */
798617b5b8f16570c9003379464d60e8572a801a8cphilippeExeContext* MC_(allocated_at) (MC_Chunk*);
808617b5b8f16570c9003379464d60e8572a801a8cphilippeExeContext* MC_(freed_at) (MC_Chunk*);
818617b5b8f16570c9003379464d60e8572a801a8cphilippe
828617b5b8f16570c9003379464d60e8572a801a8cphilippe/* Records and sets execontext according to MC_(clo_keep_stacktraces) */
838617b5b8f16570c9003379464d60e8572a801a8cphilippevoid  MC_(set_allocated_at) (ThreadId, MC_Chunk*);
848617b5b8f16570c9003379464d60e8572a801a8cphilippevoid  MC_(set_freed_at) (ThreadId, MC_Chunk*);
858617b5b8f16570c9003379464d60e8572a801a8cphilippe
868617b5b8f16570c9003379464d60e8572a801a8cphilippe/* number of pointers needed according to MC_(clo_keep_stacktraces). */
878617b5b8f16570c9003379464d60e8572a801a8cphilippeUInt MC_(n_where_pointers) (void);
888617b5b8f16570c9003379464d60e8572a801a8cphilippe
891d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* Memory pool.  Nb: first two fields must match core's VgHashNode. */
901d0825ff46d57f0ce83c3fa88538a42f67022eeenjntypedef
911d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   struct _MC_Mempool {
921d0825ff46d57f0ce83c3fa88538a42f67022eeenjn      struct _MC_Mempool* next;
931d0825ff46d57f0ce83c3fa88538a42f67022eeenjn      Addr          pool;           // pool identifier
941d0825ff46d57f0ce83c3fa88538a42f67022eeenjn      SizeT         rzB;            // pool red-zone size
951d0825ff46d57f0ce83c3fa88538a42f67022eeenjn      Bool          is_zeroed;      // allocations from this pool are zeroed
9609a4c794458cdb9dea743fa40e450150a2725257florian      VgHashTable  *chunks;         // chunks associated with this pool
971d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   }
981d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   MC_Mempool;
991d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
1001d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
10156adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid* MC_(new_block)  ( ThreadId tid,
1021dcee097db02f9ef3ba355162c4373d90d0e895cnjn                        Addr p, SizeT size, SizeT align,
10356adc358fd23a1b1d9e331ca63f773aca1ec0953sewardj                        Bool is_zeroed, MC_AllocKind kind,
10409a4c794458cdb9dea743fa40e450150a2725257florian                        VgHashTable *table);
10556adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(handle_free) ( ThreadId tid,
10656adc358fd23a1b1d9e331ca63f773aca1ec0953sewardj                        Addr p, UInt rzB, MC_AllocKind kind );
10756adc358fd23a1b1d9e331ca63f773aca1ec0953sewardj
10856adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(create_mempool)  ( Addr pool, UInt rzB, Bool is_zeroed );
10956adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(destroy_mempool) ( Addr pool );
11056adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(mempool_alloc)   ( ThreadId tid, Addr pool,
11156adc358fd23a1b1d9e331ca63f773aca1ec0953sewardj                            Addr addr, SizeT size );
11256adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(mempool_free)    ( Addr pool, Addr addr );
11356adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(mempool_trim)    ( Addr pool, Addr addr, SizeT size );
11456adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(move_mempool)    ( Addr poolA, Addr poolB );
11556adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(mempool_change)  ( Addr pool, Addr addrA, Addr addrB, SizeT size );
11656adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjBool MC_(mempool_exists)  ( Addr pool );
11756adc358fd23a1b1d9e331ca63f773aca1ec0953sewardj
118403d8aada736841ca05764ffe12ca78435c01d3asewardj/* Searches for a recently freed block which might bracket Addr a.
119403d8aada736841ca05764ffe12ca78435c01d3asewardj   Return the MC_Chunk* for this block or NULL if no bracketting block
120403d8aada736841ca05764ffe12ca78435c01d3asewardj   is found. */
121403d8aada736841ca05764ffe12ca78435c01d3asewardjMC_Chunk* MC_(get_freed_block_bracketting)( Addr a );
1221d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
1236643e96a72e8530a7c8830c02ffb2fb4aee74c88philippe/* For efficient pooled alloc/free of the MC_Chunk. */
1246643e96a72e8530a7c8830c02ffb2fb4aee74c88philippeextern PoolAlloc* MC_(chunk_poolalloc);
1256643e96a72e8530a7c8830c02ffb2fb4aee74c88philippe
126b965efb4990bdedc3215ffcca8ea566d25874d26njn/* For tracking malloc'd blocks.  Nb: it's quite important that it's a
127b965efb4990bdedc3215ffcca8ea566d25874d26njn   VgHashTable, because VgHashTable allows duplicate keys without complaint.
128b965efb4990bdedc3215ffcca8ea566d25874d26njn   This can occur if a user marks a malloc() block as also a custom block with
129b965efb4990bdedc3215ffcca8ea566d25874d26njn   MALLOCLIKE_BLOCK. */
13009a4c794458cdb9dea743fa40e450150a2725257florianextern VgHashTable *MC_(malloc_list);
1311d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
1321d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* For tracking memory pools. */
13309a4c794458cdb9dea743fa40e450150a2725257florianextern VgHashTable *MC_(mempool_list);
1341d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
1351d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* Shadow memory functions */
13656adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjBool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr );
13756adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(make_mem_noaccess)        ( Addr a, SizeT len );
13856adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(make_mem_undefined_w_otag)( Addr a, SizeT len, UInt otag );
13956adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(make_mem_defined)         ( Addr a, SizeT len );
14056adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len );
14156adc358fd23a1b1d9e331ca63f773aca1ec0953sewardj
14256adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(print_malloc_stats) ( void );
143a22f59db02284784a1e5e51587e2ce09db3a2a18philippe/* nr of free operations done */
144a22f59db02284784a1e5e51587e2ce09db3a2a18philippeSizeT MC_(get_cmalloc_n_frees) ( void );
14556adc358fd23a1b1d9e331ca63f773aca1ec0953sewardj
14656adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid* MC_(malloc)               ( ThreadId tid, SizeT n );
14756adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid* MC_(__builtin_new)        ( ThreadId tid, SizeT n );
14856adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid* MC_(__builtin_vec_new)    ( ThreadId tid, SizeT n );
14956adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid* MC_(memalign)             ( ThreadId tid, SizeT align, SizeT n );
15056adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid* MC_(calloc)               ( ThreadId tid, SizeT nmemb, SizeT size1 );
15156adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid  MC_(free)                 ( ThreadId tid, void* p );
15256adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid  MC_(__builtin_delete)     ( ThreadId tid, void* p );
15356adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid  MC_(__builtin_vec_delete) ( ThreadId tid, void* p );
15456adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid* MC_(realloc)              ( ThreadId tid, void* p, SizeT new_size );
1558b140dee891a850c09d27f316df913acc7d7bae7njnSizeT MC_(malloc_usable_size)   ( ThreadId tid, void* p );
15656adc358fd23a1b1d9e331ca63f773aca1ec0953sewardj
157913473803432ee37d6edaf232e21978d4f426125bartvoid MC_(handle_resizeInPlace)(ThreadId tid, Addr p,
158913473803432ee37d6edaf232e21978d4f426125bart                               SizeT oldSizeB, SizeT newSizeB, SizeT rzB);
159913473803432ee37d6edaf232e21978d4f426125bart
1601d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
1617cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj/*------------------------------------------------------------*/
1627cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj/*--- Origin tracking translate-time support               ---*/
1637cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj/*------------------------------------------------------------*/
1647cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
1657cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj/* See detailed comments in mc_machine.c. */
1667cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardjInt MC_(get_otrack_shadow_offset) ( Int offset, Int szB );
1677cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardjIRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr );
1687cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
1697cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj/* Constants which are used as the lowest 2 bits in origin tags.
1707cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
1717cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   An origin tag comprises an upper 30-bit ECU field and a lower 2-bit
1727cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   'kind' field.  The ECU field is a number given out by m_execontext
1737cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   and has a 1-1 mapping with ExeContext*s.  An ECU can be used
1747cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   directly as an origin tag (otag), but in fact we want to put
1757cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   additional information 'kind' field to indicate roughly where the
1767cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   tag came from.  This helps print more understandable error messages
1777cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   for the user -- it has no other purpose.
1787cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
1797cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   Hence the following 2-bit constants are needed for 'kind' field.
1807cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
1817cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   To summarise:
1827cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
1837cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   * Both ECUs and origin tags are represented as 32-bit words
1847cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
1857cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   * m_execontext and the core-tool interface deal purely in ECUs.
1867cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj     They have no knowledge of origin tags - that is a purely
1877cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj     Memcheck-internal matter.
1887cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
1897cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   * all valid ECUs have the lowest 2 bits zero and at least
1907cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj     one of the upper 30 bits nonzero (see VG_(is_plausible_ECU))
1917cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
1927cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   * to convert from an ECU to an otag, OR in one of the MC_OKIND_
1937cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj     constants below
1947cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
1957cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   * to convert an otag back to an ECU, AND it with ~3
1967cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj*/
1977cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
1987cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj#define MC_OKIND_UNKNOWN  0  /* unknown origin */
1997cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj#define MC_OKIND_HEAP     1  /* this is a heap origin */
2007cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj#define MC_OKIND_STACK    2  /* this is a stack origin */
2017cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj#define MC_OKIND_USER     3  /* arises from user-supplied client req */
2027cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
2031d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2041d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*------------------------------------------------------------*/
2051d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*--- Profiling of memory events                           ---*/
2061d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*------------------------------------------------------------*/
2071d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2081d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* Define to collect detailed performance info. */
2091d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* #define MC_PROFILE_MEMORY */
2101d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2111d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#ifdef MC_PROFILE_MEMORY
2121d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#  define N_PROF_EVENTS 500
2131d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
21456adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjUInt   MC_(event_ctr)[N_PROF_EVENTS];
21556adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjHChar* MC_(event_ctr_name)[N_PROF_EVENTS];
2161d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2171d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#  define PROF_EVENT(ev, name)                                \
2181d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS);         \
2191d0825ff46d57f0ce83c3fa88538a42f67022eeenjn        /* crude and inaccurate check to ensure the same */   \
2201d0825ff46d57f0ce83c3fa88538a42f67022eeenjn        /* event isn't being used with > 1 name */            \
2211d0825ff46d57f0ce83c3fa88538a42f67022eeenjn        if (MC_(event_ctr_name)[ev])                         \
2221d0825ff46d57f0ce83c3fa88538a42f67022eeenjn           tl_assert(name == MC_(event_ctr_name)[ev]);       \
2231d0825ff46d57f0ce83c3fa88538a42f67022eeenjn        MC_(event_ctr)[ev]++;                                \
2241d0825ff46d57f0ce83c3fa88538a42f67022eeenjn        MC_(event_ctr_name)[ev] = (name);                    \
2251d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   } while (False);
2261d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2271d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#else
2281d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2291d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#  define PROF_EVENT(ev, name) /* */
2301d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2311d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#endif   /* MC_PROFILE_MEMORY */
2321d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2331d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2341d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*------------------------------------------------------------*/
2351d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*--- V and A bits (Victoria & Albert ?)                   ---*/
23643c799ed4de307bf00b2467b9b63e583894a030bnjn/*------------------------------------------------------------*/
23743c799ed4de307bf00b2467b9b63e583894a030bnjn
2381d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* The number of entries in the primary map can be altered.  However
2391d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   we hardwire the assumption that each secondary map covers precisely
2401d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   64k of address space. */
2411d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#define SM_SIZE 65536            /* DO NOT CHANGE */
2421d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#define SM_MASK (SM_SIZE-1)      /* DO NOT CHANGE */
2431d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2441d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#define V_BIT_DEFINED         0
2451d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#define V_BIT_UNDEFINED       1
2461d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2471d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#define V_BITS8_DEFINED       0
2481d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#define V_BITS8_UNDEFINED     0xFF
2491d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2501d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#define V_BITS16_DEFINED      0
2511d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#define V_BITS16_UNDEFINED    0xFFFF
2521d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2531d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#define V_BITS32_DEFINED      0
2541d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#define V_BITS32_UNDEFINED    0xFFFFFFFF
2551d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2561d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#define V_BITS64_DEFINED      0ULL
2571d0825ff46d57f0ce83c3fa88538a42f67022eeenjn#define V_BITS64_UNDEFINED    0xFFFFFFFFFFFFFFFFULL
25843c799ed4de307bf00b2467b9b63e583894a030bnjn
25943c799ed4de307bf00b2467b9b63e583894a030bnjn
26043c799ed4de307bf00b2467b9b63e583894a030bnjn/*------------------------------------------------------------*/
2611d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*--- Leak checking                                        ---*/
2621d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*------------------------------------------------------------*/
2631d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
264718d3b11d1d3f2665c05b5670893baf1ad068401njntypedef
265718d3b11d1d3f2665c05b5670893baf1ad068401njn   enum {
26629a5c01528ca7cffe17880a038b4563de920f08dnjn      // Nb: the order is important -- it dictates the order of loss records
26729a5c01528ca7cffe17880a038b4563de920f08dnjn      // of equal sizes.
26829a5c01528ca7cffe17880a038b4563de920f08dnjn      Reachable    =0,  // Definitely reachable from root-set.
26929a5c01528ca7cffe17880a038b4563de920f08dnjn      Possible     =1,  // Possibly reachable from root-set;  involves at
2708225cc0de2ccf390127b5910dceb7c6185091a38njn                        //   least one interior-pointer along the way.
27129a5c01528ca7cffe17880a038b4563de920f08dnjn      IndirectLeak =2,  // Leaked, but reachable from another leaked block
27229a5c01528ca7cffe17880a038b4563de920f08dnjn                        //   (be it Unreached or IndirectLeak).
27329a5c01528ca7cffe17880a038b4563de920f08dnjn      Unreached    =3,  // Not reached, ie. leaked.
27429a5c01528ca7cffe17880a038b4563de920f08dnjn                        //   (At best, only reachable from itself via a cycle.)
275718d3b11d1d3f2665c05b5670893baf1ad068401njn  }
276718d3b11d1d3f2665c05b5670893baf1ad068401njn  Reachedness;
277718d3b11d1d3f2665c05b5670893baf1ad068401njn
2782193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippe// Build mask to check or set Reachedness r membership
2792193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippe#define R2S(r) (1 << (r))
2802193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippe// Reachedness r is member of the Set s ?
2812193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippe#define RiS(r,s) ((s) & R2S(r))
282ec905f7ed1659f2251045114c785659fbb11ea88philippe// Returns a set containing all Reachedness
283ec905f7ed1659f2251045114c785659fbb11ea88philippeUInt MC_(all_Reachedness)(void);
284a22f59db02284784a1e5e51587e2ce09db3a2a18philippe
2851d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* For VALGRIND_COUNT_LEAKS client request */
286505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern SizeT MC_(bytes_leaked);
287505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern SizeT MC_(bytes_indirect);
288505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern SizeT MC_(bytes_dubious);
289505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern SizeT MC_(bytes_reachable);
290505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern SizeT MC_(bytes_suppressed);
2911d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
2928df80b22d8f0ed19fb2d7ac7267b8015b202f661njn/* For VALGRIND_COUNT_LEAK_BLOCKS client request */
2938df80b22d8f0ed19fb2d7ac7267b8015b202f661njnextern SizeT MC_(blocks_leaked);
2948df80b22d8f0ed19fb2d7ac7267b8015b202f661njnextern SizeT MC_(blocks_indirect);
2958df80b22d8f0ed19fb2d7ac7267b8015b202f661njnextern SizeT MC_(blocks_dubious);
2968df80b22d8f0ed19fb2d7ac7267b8015b202f661njnextern SizeT MC_(blocks_reachable);
2978df80b22d8f0ed19fb2d7ac7267b8015b202f661njnextern SizeT MC_(blocks_suppressed);
2988df80b22d8f0ed19fb2d7ac7267b8015b202f661njn
2991d0825ff46d57f0ce83c3fa88538a42f67022eeenjntypedef
3001d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   enum {
3011d0825ff46d57f0ce83c3fa88538a42f67022eeenjn      LC_Off,
3021d0825ff46d57f0ce83c3fa88538a42f67022eeenjn      LC_Summary,
3031d0825ff46d57f0ce83c3fa88538a42f67022eeenjn      LC_Full,
3041d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   }
3051d0825ff46d57f0ce83c3fa88538a42f67022eeenjn   LeakCheckMode;
3061d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
307c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardjtypedef
308c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj   enum {
309c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj      LCD_Any,       // output all loss records, whatever the delta
310c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj      LCD_Increased, // output loss records with an increase in size or blocks
311c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj      LCD_Changed,   // output loss records with an increase or
312c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj                     //decrease in size or blocks
313c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj   }
314c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj   LeakCheckDeltaMode;
315c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj
31629a5c01528ca7cffe17880a038b4563de920f08dnjn/* When a LossRecord is put into an OSet, these elements represent the key. */
31729a5c01528ca7cffe17880a038b4563de920f08dnjntypedef
31829a5c01528ca7cffe17880a038b4563de920f08dnjn   struct _LossRecordKey {
31929a5c01528ca7cffe17880a038b4563de920f08dnjn      Reachedness  state;        // LC_Extra.state value shared by all blocks.
32029a5c01528ca7cffe17880a038b4563de920f08dnjn      ExeContext*  allocated_at; // Where they were allocated.
32129a5c01528ca7cffe17880a038b4563de920f08dnjn   }
32229a5c01528ca7cffe17880a038b4563de920f08dnjn   LossRecordKey;
32329a5c01528ca7cffe17880a038b4563de920f08dnjn
324b7a4e2ea4e1adfda6bf2d7e3c448f663c5d173a9njn/* A loss record, used for generating err msgs.  Multiple leaked blocks can be
325b7a4e2ea4e1adfda6bf2d7e3c448f663c5d173a9njn * merged into a single loss record if they have the same state and similar
326b7a4e2ea4e1adfda6bf2d7e3c448f663c5d173a9njn * enough allocation points (controlled by --leak-resolution). */
327718d3b11d1d3f2665c05b5670893baf1ad068401njntypedef
328718d3b11d1d3f2665c05b5670893baf1ad068401njn   struct _LossRecord {
32929a5c01528ca7cffe17880a038b4563de920f08dnjn      LossRecordKey key;  // Key, when used in an OSet.
33029a5c01528ca7cffe17880a038b4563de920f08dnjn      SizeT szB;          // Sum of all MC_Chunk.szB values.
33129a5c01528ca7cffe17880a038b4563de920f08dnjn      SizeT indirect_szB; // Sum of all LC_Extra.indirect_szB values.
33229a5c01528ca7cffe17880a038b4563de920f08dnjn      UInt  num_blocks;   // Number of blocks represented by the record.
333c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj      SizeT old_szB;          // old_* values are the values found during the
334c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj      SizeT old_indirect_szB; // previous leak search. old_* values are used to
335c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj      UInt  old_num_blocks;   // output only the changed/new loss records
336718d3b11d1d3f2665c05b5670893baf1ad068401njn   }
337718d3b11d1d3f2665c05b5670893baf1ad068401njn   LossRecord;
338718d3b11d1d3f2665c05b5670893baf1ad068401njn
339c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardjtypedef
340c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj   struct _LeakCheckParams {
341c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj      LeakCheckMode mode;
3422193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippe      UInt show_leak_kinds;
3432193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippe      UInt errors_for_leak_kinds;
344ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe      UInt heuristics;
345c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj      LeakCheckDeltaMode deltamode;
346ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe      UInt max_loss_records_output; // limit on the nr of loss records output.
347c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj      Bool requested_by_monitor_command; // True when requested by gdb/vgdb.
348c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj   }
349c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj   LeakCheckParams;
350c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj
3518423490aad3a068849eca1ee741f3ca669ab01f1philippevoid MC_(detect_memory_leaks) ( ThreadId tid, LeakCheckParams * lcp);
352c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj
3534e32d67a5b880bf1d871c5141822078d4dcdc3acphilippe// Each time a leak search is done, the leak search generation
3544e32d67a5b880bf1d871c5141822078d4dcdc3acphilippe// MC_(leak_search_gen) is incremented.
3554e32d67a5b880bf1d871c5141822078d4dcdc3acphilippeextern UInt MC_(leak_search_gen);
3564e32d67a5b880bf1d871c5141822078d4dcdc3acphilippe
357c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj// maintains the lcp.deltamode given in the last call to detect_memory_leaks
358c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardjextern LeakCheckDeltaMode MC_(detect_memory_leaks_last_delta_mode);
359c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj
360a22f59db02284784a1e5e51587e2ce09db3a2a18philippe// prints the list of blocks corresponding to the given loss_record_nr.
361ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe// Returns True if loss_record_nr identifies a correct loss record from last
362ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe// leak search, returns False otherwise.
363a22f59db02284784a1e5e51587e2ce09db3a2a18philippeBool MC_(print_block_list) ( UInt loss_record_nr);
364a22f59db02284784a1e5e51587e2ce09db3a2a18philippe
365a22f59db02284784a1e5e51587e2ce09db3a2a18philippe// Prints the addresses/registers/... at which a pointer to
366a22f59db02284784a1e5e51587e2ce09db3a2a18philippe// the given range [address, address+szB[ is found.
367a22f59db02284784a1e5e51587e2ce09db3a2a18philippevoid MC_(who_points_at) ( Addr address, SizeT szB);
368a22f59db02284784a1e5e51587e2ce09db3a2a18philippe
36930b3eca94e609214d9ac8dabfee9be3f3ab46d85sewardj// if delta_mode == LCD_Any, prints in buf an empty string
370c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj// otherwise prints a delta in the layout  " (+%'lu)" or " (-%'lu)"
371dbb3584f591710a15a437918c0fc27e300993566florianextern HChar * MC_(snprintf_delta) (HChar * buf, Int size,
372dbb3584f591710a15a437918c0fc27e300993566florian                                    SizeT current_val, SizeT old_val,
373dbb3584f591710a15a437918c0fc27e300993566florian                                    LeakCheckDeltaMode delta_mode);
374c8bd1df6c23e2409512e1e50616e7dc3bae501a2sewardj
3758225cc0de2ccf390127b5910dceb7c6185091a38njn
3768225cc0de2ccf390127b5910dceb7c6185091a38njnBool MC_(is_valid_aligned_word)     ( Addr a );
3778225cc0de2ccf390127b5910dceb7c6185091a38njnBool MC_(is_within_valid_secondary) ( Addr a );
3781d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
379a22f59db02284784a1e5e51587e2ce09db3a2a18philippe// Prints as user msg a description of the given loss record.
380a22f59db02284784a1e5e51587e2ce09db3a2a18philippevoid MC_(pp_LossRecord)(UInt n_this_record, UInt n_total_records,
381a22f59db02284784a1e5e51587e2ce09db3a2a18philippe                        LossRecord* l);
382718d3b11d1d3f2665c05b5670893baf1ad068401njn
383718d3b11d1d3f2665c05b5670893baf1ad068401njn
384718d3b11d1d3f2665c05b5670893baf1ad068401njn/*------------------------------------------------------------*/
385718d3b11d1d3f2665c05b5670893baf1ad068401njn/*--- Errors and suppressions                              ---*/
386718d3b11d1d3f2665c05b5670893baf1ad068401njn/*------------------------------------------------------------*/
387718d3b11d1d3f2665c05b5670893baf1ad068401njn
3887ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj/* Did we show to the user, any errors for which an uninitialised
3897ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj   value origin could have been collected (but wasn't) ?  If yes,
3907ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj   then, at the end of the run, print a 1 line message advising that a
3917ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj   rerun with --track-origins=yes might help. */
392505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern Bool MC_(any_value_errors);
3937ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
3947ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj/* Standard functions for error and suppressions as required by the
3957ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj   core/tool iface */
3968e3fbb5cd8276a7d07d5712bc05f9b3376d81a6aflorianBool MC_(eq_Error)           ( VgRes res, const Error* e1, const Error* e2 );
3978e3fbb5cd8276a7d07d5712bc05f9b3376d81a6aflorianvoid MC_(before_pp_Error)    ( const Error* err );
3988e3fbb5cd8276a7d07d5712bc05f9b3376d81a6aflorianvoid MC_(pp_Error)           ( const Error* err );
3998e3fbb5cd8276a7d07d5712bc05f9b3376d81a6aflorianUInt MC_(update_Error_extra) ( const Error* err );
4007ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
40119f91bbaedb4caef8a60ce94b0f507193cc0bc10florianBool MC_(is_recognised_suppression) ( const HChar* name, Supp* su );
4027ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
40319f91bbaedb4caef8a60ce94b0f507193cc0bc10florianBool MC_(read_extra_suppression_info) ( Int fd, HChar** buf,
404362441db825242200142a91bb07c4a0300b36a3ephilippe                                        SizeT* nBuf, Int* lineno, Supp *su );
4057ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
4068e3fbb5cd8276a7d07d5712bc05f9b3376d81a6aflorianBool MC_(error_matches_suppression) ( const Error* err, const Supp* su );
4077ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
4088e3fbb5cd8276a7d07d5712bc05f9b3376d81a6aflorianSizeT MC_(get_extra_suppression_info) ( const Error* err,
4094e32d67a5b880bf1d871c5141822078d4dcdc3acphilippe                                        /*OUT*/HChar* buf, Int nBuf );
4108e3fbb5cd8276a7d07d5712bc05f9b3376d81a6aflorianSizeT MC_(print_extra_suppression_use) ( const Supp* su,
4113e81b8bed1f7ab6848a83f5507487131a6f9d778florian                                         /*OUT*/HChar* buf, Int nBuf );
4128e3fbb5cd8276a7d07d5712bc05f9b3376d81a6aflorianvoid MC_(update_extra_suppression_use) ( const Error* err, const Supp* su );
4137ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
4148e3fbb5cd8276a7d07d5712bc05f9b3376d81a6aflorianconst HChar* MC_(get_error_name) ( const Error* err );
4157ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
4167ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj/* Recording of errors */
4177ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjvoid MC_(record_address_error) ( ThreadId tid, Addr a, Int szB,
4187ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj                                 Bool isWrite );
4197ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjvoid MC_(record_cond_error)    ( ThreadId tid, UInt otag );
4207ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjvoid MC_(record_value_error)   ( ThreadId tid, Int szB, UInt otag );
4217ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjvoid MC_(record_jump_error)    ( ThreadId tid, Addr a );
4227ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
4237ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjvoid MC_(record_free_error)            ( ThreadId tid, Addr a );
4247ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjvoid MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
4257ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjvoid MC_(record_freemismatch_error)    ( ThreadId tid, MC_Chunk* mc );
4267ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
427e543f3024ace2925a0fb81985e9fcfc95b8c555aflorianvoid MC_(record_overlap_error)  ( ThreadId tid, const HChar* function,
4287ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj                                  Addr src, Addr dst, SizeT szB );
429e543f3024ace2925a0fb81985e9fcfc95b8c555aflorianvoid MC_(record_core_mem_error) ( ThreadId tid, const HChar* msg );
430e543f3024ace2925a0fb81985e9fcfc95b8c555aflorianvoid MC_(record_regparam_error) ( ThreadId tid, const HChar* msg, UInt otag );
4317ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjvoid MC_(record_memparam_error) ( ThreadId tid, Addr a,
432e543f3024ace2925a0fb81985e9fcfc95b8c555aflorian                                  Bool isAddrErr, const HChar* msg, UInt otag );
4337ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjvoid MC_(record_user_error)     ( ThreadId tid, Addr a,
4347ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj                                  Bool isAddrErr, UInt otag );
4357ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
4367ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjBool MC_(record_leak_error)     ( ThreadId tid,
4377ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj                                  UInt n_this_record,
4387ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj                                  UInt n_total_records,
4397ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj                                  LossRecord* lossRecord,
44018afe5d1c3dc9e4e16d3e10617d6afa4bf9fcd40njn                                  Bool print_record,
44118afe5d1c3dc9e4e16d3e10617d6afa4bf9fcd40njn                                  Bool count_error );
4427ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
4437b6899dd211aafa1e0d3e3a0dc0cf798ea882768florianBool MC_(record_fishy_value_error)  ( ThreadId tid, const HChar* function,
4447b6899dd211aafa1e0d3e3a0dc0cf798ea882768florian                                      const HChar *argument_name, SizeT value );
4457b6899dd211aafa1e0d3e3a0dc0cf798ea882768florian
446ec905f7ed1659f2251045114c785659fbb11ea88philippe/* Leak kinds tokens to call VG_(parse_enum_set). */
447ec905f7ed1659f2251045114c785659fbb11ea88philippeextern const HChar* MC_(parse_leak_kinds_tokens);
4482193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippe
4493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* prints a description of address a */
4503b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid MC_(pp_describe_addr) (Addr a);
4513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
4527ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj/* Is this address in a user-specified "ignored range" ? */
4537ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjBool MC_(in_ignored_range) ( Addr a );
4547ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
4557ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
4567ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj/*------------------------------------------------------------*/
4577ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj/*--- Client blocks                                        ---*/
4587ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj/*------------------------------------------------------------*/
4597ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
4607ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj/* Describes a client block.  See mc_main.c.  An unused block has
4617ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj   start == size == 0.  */
4627ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjtypedef
4637ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj   struct {
4647ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj      Addr        start;
4657ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj      SizeT       size;
4667ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj      ExeContext* where;
467a5f894c271248c13e0bb387e5ca33fa122b4819cflorian      HChar*      desc;
4687ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj   }
4697ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj   CGenBlock;
4707ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
4717ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj/* Get access to the client block array. */
4727ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardjvoid MC_(get_ClientBlock_array)( /*OUT*/CGenBlock** blocks,
4737ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj                                 /*OUT*/UWord* nBlocks );
4747ce7166aeae2d8401f2b3b1f9e6f60be9ae9dd72sewardj
475718d3b11d1d3f2665c05b5670893baf1ad068401njn
4761d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*------------------------------------------------------------*/
4771d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*--- Command line options + defaults                      ---*/
4781d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*------------------------------------------------------------*/
4791d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
4801d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* Allow loads from partially-valid addresses?  default: YES */
481505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern Bool MC_(clo_partial_loads_ok);
4821d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
4831d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* Max volume of the freed blocks queue. */
484505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern Long MC_(clo_freelist_vol);
4851d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
486403d8aada736841ca05764ffe12ca78435c01d3asewardj/* Blocks with a size >= MC_(clo_freelist_big_blocks) will be put
487403d8aada736841ca05764ffe12ca78435c01d3asewardj   in the "big block" freed blocks queue. */
488403d8aada736841ca05764ffe12ca78435c01d3asewardjextern Long MC_(clo_freelist_big_blocks);
489403d8aada736841ca05764ffe12ca78435c01d3asewardj
4901d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* Do leak check at exit?  default: NO */
491505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern LeakCheckMode MC_(clo_leak_check);
4921d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
4931d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* How closely should we compare ExeContexts in leak records? default: 2 */
494505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern VgRes MC_(clo_leak_resolution);
4951d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
4962193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippe/* In leak check, show loss records if their R2S(reachedness) is set.
4972193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippe   Default : R2S(Possible) | R2S(Unreached). */
4982193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippeextern UInt MC_(clo_show_leak_kinds);
4991d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
5002193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippe/* In leak check, a loss record is an error if its R2S(reachedness) is set.
5012193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippe   Default : R2S(Possible) | R2S(Unreached). */
5022193a7c20b74867de85a5ac10e7db5c7038f7c8aphilippeextern UInt MC_(clo_errors_for_leak_kinds);
5033cedf574e2d9e479dd58998ad8f0a187e00329dabart
504ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe/* Various leak check heuristics which can be activated/deactivated. */
505ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippetypedef
506ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe   enum {
507ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe      LchNone                =0,
508ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe      // no heuristic.
509ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe      LchStdString           =1,
510ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe      // Consider interior pointer pointing at the array of char in a
511ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe      // std::string as reachable.
5127c69a3edda5335fa4c60f8161252b4bab8a76f7ephilippe      LchLength64            =2,
5137c69a3edda5335fa4c60f8161252b4bab8a76f7ephilippe      // Consider interior pointer pointing at offset 64bit of a block as
5147c69a3edda5335fa4c60f8161252b4bab8a76f7ephilippe      // reachable, when the first 8 bytes contains the block size - 8.
5157c69a3edda5335fa4c60f8161252b4bab8a76f7ephilippe      // Such length+interior pointers are used by e.g. sqlite3MemMalloc.
5167c69a3edda5335fa4c60f8161252b4bab8a76f7ephilippe      // On 64bit platforms LchNewArray will also match these blocks.
5177c69a3edda5335fa4c60f8161252b4bab8a76f7ephilippe      LchNewArray            =3,
518ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe      // Consider interior pointer pointing at second word of a new[] array as
519ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe      // reachable. Such interior pointers are used for arrays whose elements
520ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe      // have a destructor.
5217c69a3edda5335fa4c60f8161252b4bab8a76f7ephilippe      LchMultipleInheritance =4,
522ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe      // Conside interior pointer pointing just after what looks a vtable
523ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe      // as reachable.
524ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe  }
525ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe  LeakCheckHeuristic;
526ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe
5275bd40601a929e8216b1c4b98d5048dddd2c2c20ephilippe// Nr of heuristics, including the LchNone heuristic.
5287c69a3edda5335fa4c60f8161252b4bab8a76f7ephilippe#define N_LEAK_CHECK_HEURISTICS 5
529ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe
530ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe// Build mask to check or set Heuristic h membership
531ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe#define H2S(h) (1 << (h))
532ec905f7ed1659f2251045114c785659fbb11ea88philippe// Heuristic h is member of the Set s ?
533ec905f7ed1659f2251045114c785659fbb11ea88philippe#define HiS(h,s) ((s) & H2S(h))
534ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe
535ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe/* Heuristics set to use for the leak search.
536ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe   Default : no heuristic. */
537ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippeextern UInt MC_(clo_leak_check_heuristics);
538ab1fce9bfb9742bffdfbd7ea9e4dad04ffb17819philippe
5391d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
5401d0825ff46d57f0ce83c3fa88538a42f67022eeenjn * default: NO */
541505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern Bool MC_(clo_workaround_gcc296_bugs);
5421d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
543eb0fa9345010077e1e4852b238dde303b8f271b3sewardj/* Fill malloc-d/free-d client blocks with a specific value?  -1 if
544eb0fa9345010077e1e4852b238dde303b8f271b3sewardj   not, else 0x00 .. 0xFF indicating the fill value to use.  Can be
545eb0fa9345010077e1e4852b238dde303b8f271b3sewardj   useful for causing programs with bad heap corruption to fail in
546eb0fa9345010077e1e4852b238dde303b8f271b3sewardj   more repeatable ways.  Note that malloc-filled and free-filled
547eb0fa9345010077e1e4852b238dde303b8f271b3sewardj   areas are still undefined and noaccess respectively.  This merely
548eb0fa9345010077e1e4852b238dde303b8f271b3sewardj   causes them to contain the specified values. */
549505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern Int MC_(clo_malloc_fill);
550505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern Int MC_(clo_free_fill);
551eb0fa9345010077e1e4852b238dde303b8f271b3sewardj
5528617b5b8f16570c9003379464d60e8572a801a8cphilippe/* Which stack trace(s) to keep for malloc'd/free'd client blocks?
5538617b5b8f16570c9003379464d60e8572a801a8cphilippe   For each client block, the stack traces where it was allocated
5548617b5b8f16570c9003379464d60e8572a801a8cphilippe   and/or freed are optionally kept depending on MC_(clo_keep_stacktraces). */
5558617b5b8f16570c9003379464d60e8572a801a8cphilippetypedef
5568617b5b8f16570c9003379464d60e8572a801a8cphilippe   enum {                 // keep alloc stack trace ?  keep free stack trace ?
5578617b5b8f16570c9003379464d60e8572a801a8cphilippe      KS_none,            // never                     never
5588617b5b8f16570c9003379464d60e8572a801a8cphilippe      KS_alloc,           // always                    never
5598617b5b8f16570c9003379464d60e8572a801a8cphilippe      KS_free,            // never                     always
5608617b5b8f16570c9003379464d60e8572a801a8cphilippe      KS_alloc_then_free, // when still malloc'd       when free'd
5618617b5b8f16570c9003379464d60e8572a801a8cphilippe      KS_alloc_and_free,  // always                    always
5628617b5b8f16570c9003379464d60e8572a801a8cphilippe   }
5638617b5b8f16570c9003379464d60e8572a801a8cphilippe   KeepStacktraces;
5648617b5b8f16570c9003379464d60e8572a801a8cphilippeextern KeepStacktraces MC_(clo_keep_stacktraces);
5658617b5b8f16570c9003379464d60e8572a801a8cphilippe
5667cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj/* Indicates the level of instrumentation/checking done by Memcheck.
5677cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
5687cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   1 = No undefined value checking, Addrcheck-style behaviour only:
5697cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       only address checking is done.  This is faster but finds fewer
5707cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       errors.  Note that although Addrcheck had 1 bit per byte
5717cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       overhead vs the old Memcheck's 9 bits per byte, with this mode
5727cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       and compressed V bits, no memory is saved with this mode --
5737cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       it's still 2 bits per byte overhead.  This is a little wasteful
5747cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       -- it could be done with 1 bit per byte -- but lets us reuse
5757cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       the many shadow memory access functions.  Note that in this
5767cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       mode neither the secondary V bit table nor the origin-tag cache
5777cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       are used.
5787cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
5797cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   2 = Address checking and Undefined value checking are performed,
5807cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       but origins are not tracked.  So the origin-tag cache is not
5817cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       used in this mode.  This setting is the default and corresponds
5827cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       to the "normal" Memcheck behaviour that has shipped for years.
5837cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
5847cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   3 = Address checking, undefined value checking, and origins for
5857cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj       undefined values are tracked.
5867cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
5877cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   The default is 2.
5887cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj*/
589505a819357c173778e2748d2666a576cd8ac6e9fsewardjextern Int MC_(clo_mc_level);
5907cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
591021e6b676376a6654204ebf107876c5145c22222sewardj/* Should we show mismatched frees?  Default: YES */
592021e6b676376a6654204ebf107876c5145c22222sewardjextern Bool MC_(clo_show_mismatched_frees);
593021e6b676376a6654204ebf107876c5145c22222sewardj
5941d0825ff46d57f0ce83c3fa88538a42f67022eeenjn
5951d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*------------------------------------------------------------*/
5961d0825ff46d57f0ce83c3fa88538a42f67022eeenjn/*--- Instrumentation                                      ---*/
597e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn/*------------------------------------------------------------*/
598e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
59966fe05a4cf9c53f09ffc6edc31497be506049831njn/* Functions defined in mc_main.c */
60095448075345dc73986042f6dc68eb464d02bc6a8sewardj
6017cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj/* For the fail_w_o functions, the UWord arg is actually the 32-bit
6027cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   origin tag and should really be UInt, but to be simple and safe
6037cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   considering it's called from generated code, just claim it to be a
6047cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   UWord. */
60556adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(2) void MC_(helperc_value_checkN_fail_w_o) ( HWord, UWord );
60656adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(1) void MC_(helperc_value_check8_fail_w_o) ( UWord );
60756adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(1) void MC_(helperc_value_check4_fail_w_o) ( UWord );
60856adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(1) void MC_(helperc_value_check1_fail_w_o) ( UWord );
60956adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(1) void MC_(helperc_value_check0_fail_w_o) ( UWord );
6107cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
6117cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj/* And call these ones instead to report an uninitialised value error
6127cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj   but with no origin available. */
61356adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(1) void MC_(helperc_value_checkN_fail_no_o) ( HWord );
61456adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(0) void MC_(helperc_value_check8_fail_no_o) ( void );
61556adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(0) void MC_(helperc_value_check4_fail_no_o) ( void );
61656adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(0) void MC_(helperc_value_check1_fail_no_o) ( void );
61756adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(0) void MC_(helperc_value_check0_fail_no_o) ( void );
6187cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
6197cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj/* V-bits load/store helpers */
62056adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
62156adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
62256adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
62356adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
62456adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
62556adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjVG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
62621a5f8cd6b05e19a644ee9a9f8623f0be1d4badcsewardjVG_REGPARM(2) void MC_(helperc_STOREV8)    ( Addr, UWord );
62721a5f8cd6b05e19a644ee9a9f8623f0be1d4badcsewardj
6286756454dd872134b243a7a4ff43b953c5bb309eesewardjVG_REGPARM(2) void  MC_(helperc_LOADV256be) ( /*OUT*/V256*, Addr );
6296756454dd872134b243a7a4ff43b953c5bb309eesewardjVG_REGPARM(2) void  MC_(helperc_LOADV256le) ( /*OUT*/V256*, Addr );
63021a5f8cd6b05e19a644ee9a9f8623f0be1d4badcsewardjVG_REGPARM(2) void  MC_(helperc_LOADV128be) ( /*OUT*/V128*, Addr );
63121a5f8cd6b05e19a644ee9a9f8623f0be1d4badcsewardjVG_REGPARM(2) void  MC_(helperc_LOADV128le) ( /*OUT*/V128*, Addr );
63221a5f8cd6b05e19a644ee9a9f8623f0be1d4badcsewardjVG_REGPARM(1) ULong MC_(helperc_LOADV64be)  ( Addr );
63321a5f8cd6b05e19a644ee9a9f8623f0be1d4badcsewardjVG_REGPARM(1) ULong MC_(helperc_LOADV64le)  ( Addr );
63421a5f8cd6b05e19a644ee9a9f8623f0be1d4badcsewardjVG_REGPARM(1) UWord MC_(helperc_LOADV32be)  ( Addr );
63521a5f8cd6b05e19a644ee9a9f8623f0be1d4badcsewardjVG_REGPARM(1) UWord MC_(helperc_LOADV32le)  ( Addr );
63621a5f8cd6b05e19a644ee9a9f8623f0be1d4badcsewardjVG_REGPARM(1) UWord MC_(helperc_LOADV16be)  ( Addr );
63721a5f8cd6b05e19a644ee9a9f8623f0be1d4badcsewardjVG_REGPARM(1) UWord MC_(helperc_LOADV16le)  ( Addr );
63821a5f8cd6b05e19a644ee9a9f8623f0be1d4badcsewardjVG_REGPARM(1) UWord MC_(helperc_LOADV8)     ( Addr );
63956adc358fd23a1b1d9e331ca63f773aca1ec0953sewardj
64056adc358fd23a1b1d9e331ca63f773aca1ec0953sewardjvoid MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len,
64156adc358fd23a1b1d9e331ca63f773aca1ec0953sewardj                                                 Addr nia );
6427cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj
6437cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardj/* Origin tag load/store helpers */
6447cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardjVG_REGPARM(2) void  MC_(helperc_b_store1) ( Addr a, UWord d32 );
6457cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardjVG_REGPARM(2) void  MC_(helperc_b_store2) ( Addr a, UWord d32 );
6467cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardjVG_REGPARM(2) void  MC_(helperc_b_store4) ( Addr a, UWord d32 );
6477cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardjVG_REGPARM(2) void  MC_(helperc_b_store8) ( Addr a, UWord d32 );
6487cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardjVG_REGPARM(2) void  MC_(helperc_b_store16)( Addr a, UWord d32 );
64945fa9f4bd1819c7ac0d9469df4e35cee0c130153sewardjVG_REGPARM(2) void  MC_(helperc_b_store32)( Addr a, UWord d32 );
6507cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardjVG_REGPARM(1) UWord MC_(helperc_b_load1) ( Addr a );
6517cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardjVG_REGPARM(1) UWord MC_(helperc_b_load2) ( Addr a );
6527cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardjVG_REGPARM(1) UWord MC_(helperc_b_load4) ( Addr a );
6537cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardjVG_REGPARM(1) UWord MC_(helperc_b_load8) ( Addr a );
6547cf4e6b6aed533af53339f36099ed244dc4a5b7fsewardjVG_REGPARM(1) UWord MC_(helperc_b_load16)( Addr a );
65545fa9f4bd1819c7ac0d9469df4e35cee0c130153sewardjVG_REGPARM(1) UWord MC_(helperc_b_load32)( Addr a );
656826ec49ac9fcbc4f9bb1134d3b8827e4ee0f7687sewardj
65751d827bcd88ce045a383ea1ca81768757df2d1fanjn/* Functions defined in mc_translate.c */
6580b9d74abd0a663b530d290b2b788ddeda46e5400sewardjIRSB* MC_(instrument) ( VgCallbackClosure* closure,
6590b9d74abd0a663b530d290b2b788ddeda46e5400sewardj                        IRSB* bb_in,
6603c0c94777f547bcb5eadbe8cb4328debf0f51875florian                        const VexGuestLayout* layout,
6613c0c94777f547bcb5eadbe8cb4328debf0f51875florian                        const VexGuestExtents* vge,
6623c0c94777f547bcb5eadbe8cb4328debf0f51875florian                        const VexArchInfo* archinfo_host,
6634ba057cce1d81a949f5a899b5abb99e90a731bccsewardj                        IRType gWordTy, IRType hWordTy );
6648d61eb1774d5d3f7a9215c7bf783f300b1fb8d55sewardj
66581651dc1ae8cc13a5c857a0fb4137304ed17aa43sewardjIRSB* MC_(final_tidy) ( IRSB* );
66681651dc1ae8cc13a5c857a0fb4137304ed17aa43sewardj
6678d61eb1774d5d3f7a9215c7bf783f300b1fb8d55sewardj#endif /* ndef __MC_INCLUDE_H */
668e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
669e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn/*--------------------------------------------------------------------*/
6708b76fe55a596a4296ba5028e2510015fef38b02fnethercote/*--- end                                                          ---*/
671e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn/*--------------------------------------------------------------------*/
672