njn | c953984 | 2002-10-02 13:26:35 +0000 | [diff] [blame] | 1 | |
njn25 | e49d8e7 | 2002-09-23 09:36:25 +0000 | [diff] [blame] | 2 | /*--------------------------------------------------------------------*/ |
nethercote | 137bc55 | 2003-11-14 17:47:54 +0000 | [diff] [blame] | 3 | /*--- A header file for all parts of the MemCheck tool. ---*/ |
njn25 | cac76cb | 2002-09-23 11:21:57 +0000 | [diff] [blame] | 4 | /*--- mc_include.h ---*/ |
njn25 | e49d8e7 | 2002-09-23 09:36:25 +0000 | [diff] [blame] | 5 | /*--------------------------------------------------------------------*/ |
| 6 | |
| 7 | /* |
nethercote | 137bc55 | 2003-11-14 17:47:54 +0000 | [diff] [blame] | 8 | This file is part of MemCheck, a heavyweight Valgrind tool for |
njn | c953984 | 2002-10-02 13:26:35 +0000 | [diff] [blame] | 9 | detecting memory errors. |
njn25 | e49d8e7 | 2002-09-23 09:36:25 +0000 | [diff] [blame] | 10 | |
sewardj | e4b0bf0 | 2006-06-05 23:21:15 +0000 | [diff] [blame] | 11 | Copyright (C) 2000-2006 Julian Seward |
njn25 | e49d8e7 | 2002-09-23 09:36:25 +0000 | [diff] [blame] | 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 | |
njn25 | cac76cb | 2002-09-23 11:21:57 +0000 | [diff] [blame] | 32 | #ifndef __MC_INCLUDE_H |
| 33 | #define __MC_INCLUDE_H |
njn25 | e49d8e7 | 2002-09-23 09:36:25 +0000 | [diff] [blame] | 34 | |
njn | 44acd3e | 2005-05-13 21:39:45 +0000 | [diff] [blame] | 35 | #define MC_(str) VGAPPEND(vgMemCheck_,str) |
njn25 | e49d8e7 | 2002-09-23 09:36:25 +0000 | [diff] [blame] | 36 | |
| 37 | /*------------------------------------------------------------*/ |
njn | 1d0825f | 2006-03-27 11:37:07 +0000 | [diff] [blame] | 38 | /*--- Tracking the heap ---*/ |
njn | 43c799e | 2003-04-08 00:08:52 +0000 | [diff] [blame] | 39 | /*------------------------------------------------------------*/ |
| 40 | |
njn | 1d0825f | 2006-03-27 11:37:07 +0000 | [diff] [blame] | 41 | /* We want at least a 16B redzone on client heap blocks for Memcheck */ |
| 42 | #define MC_MALLOC_REDZONE_SZB 16 |
| 43 | |
| 44 | /* For malloc()/new/new[] vs. free()/delete/delete[] mismatch checking. */ |
| 45 | typedef |
| 46 | enum { |
| 47 | MC_AllocMalloc = 0, |
| 48 | MC_AllocNew = 1, |
| 49 | MC_AllocNewVec = 2, |
| 50 | MC_AllocCustom = 3 |
| 51 | } |
| 52 | MC_AllocKind; |
| 53 | |
| 54 | /* Nb: first two fields must match core's VgHashNode. */ |
| 55 | typedef |
| 56 | struct _MC_Chunk { |
| 57 | struct _MC_Chunk* next; |
| 58 | Addr data; // ptr to actual block |
| 59 | SizeT size : (sizeof(UWord)*8)-2; // size requested; 30 or 62 bits |
| 60 | MC_AllocKind allockind : 2; // which wrapper did the allocation |
| 61 | ExeContext* where; // where it was allocated |
| 62 | } |
| 63 | MC_Chunk; |
| 64 | |
| 65 | /* Memory pool. Nb: first two fields must match core's VgHashNode. */ |
| 66 | typedef |
| 67 | struct _MC_Mempool { |
| 68 | struct _MC_Mempool* next; |
| 69 | Addr pool; // pool identifier |
| 70 | SizeT rzB; // pool red-zone size |
| 71 | Bool is_zeroed; // allocations from this pool are zeroed |
| 72 | VgHashTable chunks; // chunks associated with this pool |
| 73 | } |
| 74 | MC_Mempool; |
| 75 | |
| 76 | |
| 77 | extern void* MC_(new_block) ( ThreadId tid, |
| 78 | Addr p, SizeT size, SizeT align, UInt rzB, |
| 79 | Bool is_zeroed, MC_AllocKind kind, |
| 80 | VgHashTable table); |
| 81 | extern void MC_(handle_free) ( ThreadId tid, |
| 82 | Addr p, UInt rzB, MC_AllocKind kind ); |
| 83 | |
| 84 | extern void MC_(create_mempool) ( Addr pool, UInt rzB, Bool is_zeroed ); |
| 85 | extern void MC_(destroy_mempool) ( Addr pool ); |
| 86 | extern void MC_(mempool_alloc) ( ThreadId tid, Addr pool, |
| 87 | Addr addr, SizeT size ); |
| 88 | extern void MC_(mempool_free) ( Addr pool, Addr addr ); |
sewardj | 2c1c9df | 2006-07-28 00:06:37 +0000 | [diff] [blame^] | 89 | extern void MC_(mempool_trim) ( Addr pool, Addr addr, SizeT size ); |
njn | 1d0825f | 2006-03-27 11:37:07 +0000 | [diff] [blame] | 90 | |
| 91 | extern MC_Chunk* MC_(get_freed_list_head)( void ); |
| 92 | |
| 93 | /* For tracking malloc'd blocks */ |
| 94 | extern VgHashTable MC_(malloc_list); |
| 95 | |
| 96 | /* For tracking memory pools. */ |
| 97 | extern VgHashTable MC_(mempool_list); |
| 98 | |
| 99 | /* Shadow memory functions */ |
njn | dbf7ca7 | 2006-03-31 11:57:59 +0000 | [diff] [blame] | 100 | extern Bool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr ); |
| 101 | extern void MC_(make_mem_noaccess) ( Addr a, SizeT len ); |
| 102 | extern void MC_(make_mem_undefined)( Addr a, SizeT len ); |
| 103 | extern void MC_(make_mem_defined) ( Addr a, SizeT len ); |
njn | 1d0825f | 2006-03-27 11:37:07 +0000 | [diff] [blame] | 104 | extern void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len ); |
| 105 | |
| 106 | extern void MC_(print_malloc_stats) ( void ); |
| 107 | |
| 108 | extern void* MC_(malloc) ( ThreadId tid, SizeT n ); |
| 109 | extern void* MC_(__builtin_new) ( ThreadId tid, SizeT n ); |
| 110 | extern void* MC_(__builtin_vec_new) ( ThreadId tid, SizeT n ); |
| 111 | extern void* MC_(memalign) ( ThreadId tid, SizeT align, SizeT n ); |
| 112 | extern void* MC_(calloc) ( ThreadId tid, SizeT nmemb, SizeT size1 ); |
| 113 | extern void MC_(free) ( ThreadId tid, void* p ); |
| 114 | extern void MC_(__builtin_delete) ( ThreadId tid, void* p ); |
| 115 | extern void MC_(__builtin_vec_delete) ( ThreadId tid, void* p ); |
| 116 | extern void* MC_(realloc) ( ThreadId tid, void* p, SizeT new_size ); |
njn | 43c799e | 2003-04-08 00:08:52 +0000 | [diff] [blame] | 117 | |
| 118 | |
| 119 | /*------------------------------------------------------------*/ |
njn | 1d0825f | 2006-03-27 11:37:07 +0000 | [diff] [blame] | 120 | /*--- Errors and suppressions ---*/ |
| 121 | /*------------------------------------------------------------*/ |
| 122 | |
| 123 | /* Extra info for overlap errors */ |
| 124 | typedef |
| 125 | struct { |
| 126 | Addr src; |
| 127 | Addr dst; |
| 128 | Int len; // -1 if unused |
| 129 | } |
| 130 | OverlapExtra; |
| 131 | |
| 132 | extern void MC_(record_free_error) ( ThreadId tid, Addr a ); |
| 133 | extern void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a ); |
| 134 | extern void MC_(record_freemismatch_error) ( ThreadId tid, Addr a, |
| 135 | MC_Chunk* mc ); |
| 136 | extern Bool MC_(record_leak_error) ( ThreadId tid, |
| 137 | void* leak_extra, |
| 138 | ExeContext* where, |
| 139 | Bool print_record ); |
| 140 | |
| 141 | /*------------------------------------------------------------*/ |
| 142 | /*--- Profiling of memory events ---*/ |
| 143 | /*------------------------------------------------------------*/ |
| 144 | |
| 145 | /* Define to collect detailed performance info. */ |
| 146 | /* #define MC_PROFILE_MEMORY */ |
| 147 | |
| 148 | #ifdef MC_PROFILE_MEMORY |
| 149 | # define N_PROF_EVENTS 500 |
| 150 | |
| 151 | extern UInt MC_(event_ctr)[N_PROF_EVENTS]; |
| 152 | extern HChar* MC_(event_ctr_name)[N_PROF_EVENTS]; |
| 153 | |
| 154 | # define PROF_EVENT(ev, name) \ |
| 155 | do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS); \ |
| 156 | /* crude and inaccurate check to ensure the same */ \ |
| 157 | /* event isn't being used with > 1 name */ \ |
| 158 | if (MC_(event_ctr_name)[ev]) \ |
| 159 | tl_assert(name == MC_(event_ctr_name)[ev]); \ |
| 160 | MC_(event_ctr)[ev]++; \ |
| 161 | MC_(event_ctr_name)[ev] = (name); \ |
| 162 | } while (False); |
| 163 | |
| 164 | #else |
| 165 | |
| 166 | # define PROF_EVENT(ev, name) /* */ |
| 167 | |
| 168 | #endif /* MC_PROFILE_MEMORY */ |
| 169 | |
| 170 | |
| 171 | /*------------------------------------------------------------*/ |
| 172 | /*--- V and A bits (Victoria & Albert ?) ---*/ |
| 173 | /*------------------------------------------------------------*/ |
| 174 | |
| 175 | /* The number of entries in the primary map can be altered. However |
| 176 | we hardwire the assumption that each secondary map covers precisely |
| 177 | 64k of address space. */ |
| 178 | #define SM_SIZE 65536 /* DO NOT CHANGE */ |
| 179 | #define SM_MASK (SM_SIZE-1) /* DO NOT CHANGE */ |
| 180 | |
| 181 | #define V_BIT_DEFINED 0 |
| 182 | #define V_BIT_UNDEFINED 1 |
| 183 | |
| 184 | #define V_BITS8_DEFINED 0 |
| 185 | #define V_BITS8_UNDEFINED 0xFF |
| 186 | |
| 187 | #define V_BITS16_DEFINED 0 |
| 188 | #define V_BITS16_UNDEFINED 0xFFFF |
| 189 | |
| 190 | #define V_BITS32_DEFINED 0 |
| 191 | #define V_BITS32_UNDEFINED 0xFFFFFFFF |
| 192 | |
| 193 | #define V_BITS64_DEFINED 0ULL |
| 194 | #define V_BITS64_UNDEFINED 0xFFFFFFFFFFFFFFFFULL |
| 195 | |
| 196 | |
| 197 | /*------------------------------------------------------------*/ |
| 198 | /*--- Leak checking ---*/ |
| 199 | /*------------------------------------------------------------*/ |
| 200 | |
| 201 | /* For VALGRIND_COUNT_LEAKS client request */ |
| 202 | extern SizeT MC_(bytes_leaked); |
| 203 | extern SizeT MC_(bytes_indirect); |
| 204 | extern SizeT MC_(bytes_dubious); |
| 205 | extern SizeT MC_(bytes_reachable); |
| 206 | extern SizeT MC_(bytes_suppressed); |
| 207 | |
| 208 | /* For leak checking */ |
| 209 | extern void MC_(pp_LeakError)(void* extra); |
| 210 | |
| 211 | typedef |
| 212 | enum { |
| 213 | LC_Off, |
| 214 | LC_Summary, |
| 215 | LC_Full, |
| 216 | } |
| 217 | LeakCheckMode; |
| 218 | |
| 219 | extern void MC_(do_detect_memory_leaks) ( |
| 220 | ThreadId tid, LeakCheckMode mode, |
| 221 | Bool (*is_within_valid_secondary) ( Addr ), |
| 222 | Bool (*is_valid_aligned_word) ( Addr ) |
| 223 | ); |
| 224 | |
| 225 | /*------------------------------------------------------------*/ |
| 226 | /*--- Command line options + defaults ---*/ |
| 227 | /*------------------------------------------------------------*/ |
| 228 | |
| 229 | /* Allow loads from partially-valid addresses? default: YES */ |
| 230 | extern Bool MC_(clo_partial_loads_ok); |
| 231 | |
| 232 | /* Max volume of the freed blocks queue. */ |
| 233 | extern Int MC_(clo_freelist_vol); |
| 234 | |
| 235 | /* Do leak check at exit? default: NO */ |
| 236 | extern LeakCheckMode MC_(clo_leak_check); |
| 237 | |
| 238 | /* How closely should we compare ExeContexts in leak records? default: 2 */ |
| 239 | extern VgRes MC_(clo_leak_resolution); |
| 240 | |
| 241 | /* In leak check, show reachable-but-not-freed blocks? default: NO */ |
| 242 | extern Bool MC_(clo_show_reachable); |
| 243 | |
| 244 | /* Assume accesses immediately below %esp are due to gcc-2.96 bugs. |
| 245 | * default: NO */ |
| 246 | extern Bool MC_(clo_workaround_gcc296_bugs); |
| 247 | |
| 248 | /* Do undefined value checking? "No" gives Addrcheck-style behaviour, ie. |
| 249 | * faster but fewer errors found. Note that although Addrcheck had 1 bit |
| 250 | * per byte overhead vs the old Memcheck's 9 bits per byte, with this mode |
| 251 | * and compressed V bits, no memory is saved with this mode -- it's still |
| 252 | * 2 bits per byte overhead. This is a little wasteful -- it could be done |
| 253 | * with 1 bit per byte -- but lets us reuse the many shadow memory access |
| 254 | * functions. Note also that in this mode the secondary V bit table is |
| 255 | * never used. |
| 256 | * |
| 257 | * default: YES */ |
| 258 | extern Bool MC_(clo_undef_value_errors); |
| 259 | |
| 260 | |
| 261 | /*------------------------------------------------------------*/ |
| 262 | /*--- Instrumentation ---*/ |
njn25 | e49d8e7 | 2002-09-23 09:36:25 +0000 | [diff] [blame] | 263 | /*------------------------------------------------------------*/ |
| 264 | |
njn | 66fe05a | 2003-07-22 09:12:33 +0000 | [diff] [blame] | 265 | /* Functions defined in mc_main.c */ |
njn | af839f5 | 2005-06-23 03:27:57 +0000 | [diff] [blame] | 266 | extern VG_REGPARM(1) void MC_(helperc_complain_undef) ( HWord ); |
sewardj | 11bcc4e | 2005-04-23 22:38:38 +0000 | [diff] [blame] | 267 | extern void MC_(helperc_value_check8_fail) ( void ); |
sewardj | 9544807 | 2004-11-22 20:19:51 +0000 | [diff] [blame] | 268 | extern void MC_(helperc_value_check4_fail) ( void ); |
| 269 | extern void MC_(helperc_value_check1_fail) ( void ); |
| 270 | extern void MC_(helperc_value_check0_fail) ( void ); |
| 271 | |
njn | 1d0825f | 2006-03-27 11:37:07 +0000 | [diff] [blame] | 272 | extern VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong ); |
| 273 | extern VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong ); |
| 274 | extern VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord ); |
| 275 | extern VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord ); |
| 276 | extern VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord ); |
| 277 | extern VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord ); |
| 278 | extern VG_REGPARM(2) void MC_(helperc_STOREV8) ( Addr, UWord ); |
sewardj | 9544807 | 2004-11-22 20:19:51 +0000 | [diff] [blame] | 279 | |
njn | 1d0825f | 2006-03-27 11:37:07 +0000 | [diff] [blame] | 280 | extern VG_REGPARM(1) ULong MC_(helperc_LOADV64be) ( Addr ); |
| 281 | extern VG_REGPARM(1) ULong MC_(helperc_LOADV64le) ( Addr ); |
| 282 | extern VG_REGPARM(1) UWord MC_(helperc_LOADV32be) ( Addr ); |
| 283 | extern VG_REGPARM(1) UWord MC_(helperc_LOADV32le) ( Addr ); |
| 284 | extern VG_REGPARM(1) UWord MC_(helperc_LOADV16be) ( Addr ); |
| 285 | extern VG_REGPARM(1) UWord MC_(helperc_LOADV16le) ( Addr ); |
| 286 | extern VG_REGPARM(1) UWord MC_(helperc_LOADV8) ( Addr ); |
njn25 | e49d8e7 | 2002-09-23 09:36:25 +0000 | [diff] [blame] | 287 | |
sewardj | 826ec49 | 2005-05-12 18:05:00 +0000 | [diff] [blame] | 288 | extern void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len ); |
| 289 | |
njn | 51d827b | 2005-05-09 01:02:08 +0000 | [diff] [blame] | 290 | /* Functions defined in mc_translate.c */ |
sewardj | 4ba057c | 2005-10-18 12:04:18 +0000 | [diff] [blame] | 291 | extern |
sewardj | 461df9c | 2006-01-17 02:06:39 +0000 | [diff] [blame] | 292 | IRBB* MC_(instrument) ( VgCallbackClosure* closure, |
| 293 | IRBB* bb_in, |
| 294 | VexGuestLayout* layout, |
| 295 | VexGuestExtents* vge, |
sewardj | 4ba057c | 2005-10-18 12:04:18 +0000 | [diff] [blame] | 296 | IRType gWordTy, IRType hWordTy ); |
sewardj | 8d61eb1 | 2005-07-08 09:46:53 +0000 | [diff] [blame] | 297 | |
| 298 | #endif /* ndef __MC_INCLUDE_H */ |
njn25 | e49d8e7 | 2002-09-23 09:36:25 +0000 | [diff] [blame] | 299 | |
| 300 | /*--------------------------------------------------------------------*/ |
nethercote | 8b76fe5 | 2004-11-08 19:20:09 +0000 | [diff] [blame] | 301 | /*--- end ---*/ |
njn25 | e49d8e7 | 2002-09-23 09:36:25 +0000 | [diff] [blame] | 302 | /*--------------------------------------------------------------------*/ |
| 303 | |