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-2011 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 /* We want at least a 64B redzone on client heap blocks for Memcheck */ 46 #define MC_MALLOC_REDZONE_SZB 64 47 48 /* For malloc()/new/new[] vs. free()/delete/delete[] mismatch checking. */ 49 typedef 50 enum { 51 MC_AllocMalloc = 0, 52 MC_AllocNew = 1, 53 MC_AllocNewVec = 2, 54 MC_AllocCustom = 3 55 } 56 MC_AllocKind; 57 58 /* This describes a heap block. Nb: first two fields must match core's 59 * VgHashNode. */ 60 typedef 61 struct _MC_Chunk { 62 struct _MC_Chunk* next; 63 Addr data; // Address of the actual block. 64 SizeT szB : (sizeof(SizeT)*8)-2; // Size requested; 30 or 62 bits. 65 MC_AllocKind allockind : 2; // Which operation did the allocation. 66 ExeContext* where; // Where it was allocated. 67 } 68 MC_Chunk; 69 70 /* Memory pool. Nb: first two fields must match core's VgHashNode. */ 71 typedef 72 struct _MC_Mempool { 73 struct _MC_Mempool* next; 74 Addr pool; // pool identifier 75 SizeT rzB; // pool red-zone size 76 Bool is_zeroed; // allocations from this pool are zeroed 77 VgHashTable chunks; // chunks associated with this pool 78 } 79 MC_Mempool; 80 81 82 void* MC_(new_block) ( ThreadId tid, 83 Addr p, SizeT size, SizeT align, 84 Bool is_zeroed, MC_AllocKind kind, 85 VgHashTable table); 86 void MC_(handle_free) ( ThreadId tid, 87 Addr p, UInt rzB, MC_AllocKind kind ); 88 89 void MC_(create_mempool) ( Addr pool, UInt rzB, Bool is_zeroed ); 90 void MC_(destroy_mempool) ( Addr pool ); 91 void MC_(mempool_alloc) ( ThreadId tid, Addr pool, 92 Addr addr, SizeT size ); 93 void MC_(mempool_free) ( Addr pool, Addr addr ); 94 void MC_(mempool_trim) ( Addr pool, Addr addr, SizeT size ); 95 void MC_(move_mempool) ( Addr poolA, Addr poolB ); 96 void MC_(mempool_change) ( Addr pool, Addr addrA, Addr addrB, SizeT size ); 97 Bool MC_(mempool_exists) ( Addr pool ); 98 99 /* Searches for a recently freed block which might bracket Addr a. 100 Return the MC_Chunk* for this block or NULL if no bracketting block 101 is found. */ 102 MC_Chunk* MC_(get_freed_block_bracketting)( Addr a ); 103 104 /* For tracking malloc'd blocks. Nb: it's quite important that it's a 105 VgHashTable, because VgHashTable allows duplicate keys without complaint. 106 This can occur if a user marks a malloc() block as also a custom block with 107 MALLOCLIKE_BLOCK. */ 108 extern VgHashTable MC_(malloc_list); 109 110 /* For tracking memory pools. */ 111 extern VgHashTable MC_(mempool_list); 112 113 /* Shadow memory functions */ 114 Bool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr ); 115 void MC_(make_mem_noaccess) ( Addr a, SizeT len ); 116 void MC_(make_mem_undefined_w_otag)( Addr a, SizeT len, UInt otag ); 117 void MC_(make_mem_defined) ( Addr a, SizeT len ); 118 void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len ); 119 120 void MC_(print_malloc_stats) ( void ); 121 122 void* MC_(malloc) ( ThreadId tid, SizeT n ); 123 void* MC_(__builtin_new) ( ThreadId tid, SizeT n ); 124 void* MC_(__builtin_vec_new) ( ThreadId tid, SizeT n ); 125 void* MC_(memalign) ( ThreadId tid, SizeT align, SizeT n ); 126 void* MC_(calloc) ( ThreadId tid, SizeT nmemb, SizeT size1 ); 127 void MC_(free) ( ThreadId tid, void* p ); 128 void MC_(__builtin_delete) ( ThreadId tid, void* p ); 129 void MC_(__builtin_vec_delete) ( ThreadId tid, void* p ); 130 void* MC_(realloc) ( ThreadId tid, void* p, SizeT new_size ); 131 SizeT MC_(malloc_usable_size) ( ThreadId tid, void* p ); 132 133 void MC_(handle_resizeInPlace)(ThreadId tid, Addr p, 134 SizeT oldSizeB, SizeT newSizeB, SizeT rzB); 135 136 137 /*------------------------------------------------------------*/ 138 /*--- Origin tracking translate-time support ---*/ 139 /*------------------------------------------------------------*/ 140 141 /* See detailed comments in mc_machine.c. */ 142 Int MC_(get_otrack_shadow_offset) ( Int offset, Int szB ); 143 IRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr ); 144 145 /* Constants which are used as the lowest 2 bits in origin tags. 146 147 An origin tag comprises an upper 30-bit ECU field and a lower 2-bit 148 'kind' field. The ECU field is a number given out by m_execontext 149 and has a 1-1 mapping with ExeContext*s. An ECU can be used 150 directly as an origin tag (otag), but in fact we want to put 151 additional information 'kind' field to indicate roughly where the 152 tag came from. This helps print more understandable error messages 153 for the user -- it has no other purpose. 154 155 Hence the following 2-bit constants are needed for 'kind' field. 156 157 To summarise: 158 159 * Both ECUs and origin tags are represented as 32-bit words 160 161 * m_execontext and the core-tool interface deal purely in ECUs. 162 They have no knowledge of origin tags - that is a purely 163 Memcheck-internal matter. 164 165 * all valid ECUs have the lowest 2 bits zero and at least 166 one of the upper 30 bits nonzero (see VG_(is_plausible_ECU)) 167 168 * to convert from an ECU to an otag, OR in one of the MC_OKIND_ 169 constants below 170 171 * to convert an otag back to an ECU, AND it with ~3 172 */ 173 174 #define MC_OKIND_UNKNOWN 0 /* unknown origin */ 175 #define MC_OKIND_HEAP 1 /* this is a heap origin */ 176 #define MC_OKIND_STACK 2 /* this is a stack origin */ 177 #define MC_OKIND_USER 3 /* arises from user-supplied client req */ 178 179 180 /*------------------------------------------------------------*/ 181 /*--- Profiling of memory events ---*/ 182 /*------------------------------------------------------------*/ 183 184 /* Define to collect detailed performance info. */ 185 /* #define MC_PROFILE_MEMORY */ 186 187 #ifdef MC_PROFILE_MEMORY 188 # define N_PROF_EVENTS 500 189 190 UInt MC_(event_ctr)[N_PROF_EVENTS]; 191 HChar* MC_(event_ctr_name)[N_PROF_EVENTS]; 192 193 # define PROF_EVENT(ev, name) \ 194 do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS); \ 195 /* crude and inaccurate check to ensure the same */ \ 196 /* event isn't being used with > 1 name */ \ 197 if (MC_(event_ctr_name)[ev]) \ 198 tl_assert(name == MC_(event_ctr_name)[ev]); \ 199 MC_(event_ctr)[ev]++; \ 200 MC_(event_ctr_name)[ev] = (name); \ 201 } while (False); 202 203 #else 204 205 # define PROF_EVENT(ev, name) /* */ 206 207 #endif /* MC_PROFILE_MEMORY */ 208 209 210 /*------------------------------------------------------------*/ 211 /*--- V and A bits (Victoria & Albert ?) ---*/ 212 /*------------------------------------------------------------*/ 213 214 /* The number of entries in the primary map can be altered. However 215 we hardwire the assumption that each secondary map covers precisely 216 64k of address space. */ 217 #define SM_SIZE 65536 /* DO NOT CHANGE */ 218 #define SM_MASK (SM_SIZE-1) /* DO NOT CHANGE */ 219 220 #define V_BIT_DEFINED 0 221 #define V_BIT_UNDEFINED 1 222 223 #define V_BITS8_DEFINED 0 224 #define V_BITS8_UNDEFINED 0xFF 225 226 #define V_BITS16_DEFINED 0 227 #define V_BITS16_UNDEFINED 0xFFFF 228 229 #define V_BITS32_DEFINED 0 230 #define V_BITS32_UNDEFINED 0xFFFFFFFF 231 232 #define V_BITS64_DEFINED 0ULL 233 #define V_BITS64_UNDEFINED 0xFFFFFFFFFFFFFFFFULL 234 235 236 /*------------------------------------------------------------*/ 237 /*--- Leak checking ---*/ 238 /*------------------------------------------------------------*/ 239 240 typedef 241 enum { 242 // Nb: the order is important -- it dictates the order of loss records 243 // of equal sizes. 244 Reachable =0, // Definitely reachable from root-set. 245 Possible =1, // Possibly reachable from root-set; involves at 246 // least one interior-pointer along the way. 247 IndirectLeak =2, // Leaked, but reachable from another leaked block 248 // (be it Unreached or IndirectLeak). 249 Unreached =3, // Not reached, ie. leaked. 250 // (At best, only reachable from itself via a cycle.) 251 } 252 Reachedness; 253 254 /* For VALGRIND_COUNT_LEAKS client request */ 255 extern SizeT MC_(bytes_leaked); 256 extern SizeT MC_(bytes_indirect); 257 extern SizeT MC_(bytes_dubious); 258 extern SizeT MC_(bytes_reachable); 259 extern SizeT MC_(bytes_suppressed); 260 261 /* For VALGRIND_COUNT_LEAK_BLOCKS client request */ 262 extern SizeT MC_(blocks_leaked); 263 extern SizeT MC_(blocks_indirect); 264 extern SizeT MC_(blocks_dubious); 265 extern SizeT MC_(blocks_reachable); 266 extern SizeT MC_(blocks_suppressed); 267 268 typedef 269 enum { 270 LC_Off, 271 LC_Summary, 272 LC_Full, 273 } 274 LeakCheckMode; 275 276 typedef 277 enum { 278 LCD_Any, // output all loss records, whatever the delta 279 LCD_Increased, // output loss records with an increase in size or blocks 280 LCD_Changed, // output loss records with an increase or 281 //decrease in size or blocks 282 } 283 LeakCheckDeltaMode; 284 285 /* When a LossRecord is put into an OSet, these elements represent the key. */ 286 typedef 287 struct _LossRecordKey { 288 Reachedness state; // LC_Extra.state value shared by all blocks. 289 ExeContext* allocated_at; // Where they were allocated. 290 } 291 LossRecordKey; 292 293 /* A loss record, used for generating err msgs. Multiple leaked blocks can be 294 * merged into a single loss record if they have the same state and similar 295 * enough allocation points (controlled by --leak-resolution). */ 296 typedef 297 struct _LossRecord { 298 LossRecordKey key; // Key, when used in an OSet. 299 SizeT szB; // Sum of all MC_Chunk.szB values. 300 SizeT indirect_szB; // Sum of all LC_Extra.indirect_szB values. 301 UInt num_blocks; // Number of blocks represented by the record. 302 SizeT old_szB; // old_* values are the values found during the 303 SizeT old_indirect_szB; // previous leak search. old_* values are used to 304 UInt old_num_blocks; // output only the changed/new loss records 305 } 306 LossRecord; 307 308 typedef 309 struct _LeakCheckParams { 310 LeakCheckMode mode; 311 Bool show_reachable; 312 Bool show_possibly_lost; 313 LeakCheckDeltaMode deltamode; 314 Bool requested_by_monitor_command; // True when requested by gdb/vgdb. 315 } 316 LeakCheckParams; 317 318 void MC_(detect_memory_leaks) ( ThreadId tid, LeakCheckParams lcp); 319 320 // maintains the lcp.deltamode given in the last call to detect_memory_leaks 321 extern LeakCheckDeltaMode MC_(detect_memory_leaks_last_delta_mode); 322 323 // if delta_mode == LCD_Any, prints in buf an empty string 324 // otherwise prints a delta in the layout " (+%'lu)" or " (-%'lu)" 325 extern char * MC_(snprintf_delta) (char * buf, Int size, 326 SizeT current_val, SizeT old_val, 327 LeakCheckDeltaMode delta_mode); 328 329 330 Bool MC_(is_valid_aligned_word) ( Addr a ); 331 Bool MC_(is_within_valid_secondary) ( Addr a ); 332 333 void MC_(pp_LeakError)(UInt n_this_record, UInt n_total_records, 334 LossRecord* l); 335 336 337 /*------------------------------------------------------------*/ 338 /*--- Errors and suppressions ---*/ 339 /*------------------------------------------------------------*/ 340 341 /* Did we show to the user, any errors for which an uninitialised 342 value origin could have been collected (but wasn't) ? If yes, 343 then, at the end of the run, print a 1 line message advising that a 344 rerun with --track-origins=yes might help. */ 345 extern Bool MC_(any_value_errors); 346 347 /* Standard functions for error and suppressions as required by the 348 core/tool iface */ 349 Bool MC_(eq_Error) ( VgRes res, Error* e1, Error* e2 ); 350 void MC_(before_pp_Error) ( Error* err ); 351 void MC_(pp_Error) ( Error* err ); 352 UInt MC_(update_Error_extra) ( Error* err ); 353 354 Bool MC_(is_recognised_suppression) ( Char* name, Supp* su ); 355 356 Bool MC_(read_extra_suppression_info) ( Int fd, Char** buf, 357 SizeT* nBuf, Supp *su ); 358 359 Bool MC_(error_matches_suppression) ( Error* err, Supp* su ); 360 361 Bool MC_(get_extra_suppression_info) ( Error* err, 362 /*OUT*/Char* buf, Int nBuf ); 363 364 Char* MC_(get_error_name) ( Error* err ); 365 366 /* Recording of errors */ 367 void MC_(record_address_error) ( ThreadId tid, Addr a, Int szB, 368 Bool isWrite ); 369 void MC_(record_cond_error) ( ThreadId tid, UInt otag ); 370 void MC_(record_value_error) ( ThreadId tid, Int szB, UInt otag ); 371 void MC_(record_jump_error) ( ThreadId tid, Addr a ); 372 373 void MC_(record_free_error) ( ThreadId tid, Addr a ); 374 void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a ); 375 void MC_(record_freemismatch_error) ( ThreadId tid, MC_Chunk* mc ); 376 377 void MC_(record_overlap_error) ( ThreadId tid, Char* function, 378 Addr src, Addr dst, SizeT szB ); 379 void MC_(record_core_mem_error) ( ThreadId tid, Char* msg ); 380 void MC_(record_regparam_error) ( ThreadId tid, Char* msg, UInt otag ); 381 void MC_(record_memparam_error) ( ThreadId tid, Addr a, 382 Bool isAddrErr, Char* msg, UInt otag ); 383 void MC_(record_user_error) ( ThreadId tid, Addr a, 384 Bool isAddrErr, UInt otag ); 385 386 Bool MC_(record_leak_error) ( ThreadId tid, 387 UInt n_this_record, 388 UInt n_total_records, 389 LossRecord* lossRecord, 390 Bool print_record, 391 Bool count_error ); 392 393 /* prints a description of address a */ 394 void MC_(pp_describe_addr) (Addr a); 395 396 /* Is this address in a user-specified "ignored range" ? */ 397 Bool MC_(in_ignored_range) ( Addr a ); 398 399 400 /*------------------------------------------------------------*/ 401 /*--- Client blocks ---*/ 402 /*------------------------------------------------------------*/ 403 404 /* Describes a client block. See mc_main.c. An unused block has 405 start == size == 0. */ 406 typedef 407 struct { 408 Addr start; 409 SizeT size; 410 ExeContext* where; 411 Char* desc; 412 } 413 CGenBlock; 414 415 /* Get access to the client block array. */ 416 void MC_(get_ClientBlock_array)( /*OUT*/CGenBlock** blocks, 417 /*OUT*/UWord* nBlocks ); 418 419 420 /*------------------------------------------------------------*/ 421 /*--- Command line options + defaults ---*/ 422 /*------------------------------------------------------------*/ 423 424 /* Allow loads from partially-valid addresses? default: YES */ 425 extern Bool MC_(clo_partial_loads_ok); 426 427 /* Max volume of the freed blocks queue. */ 428 extern Long MC_(clo_freelist_vol); 429 430 /* Blocks with a size >= MC_(clo_freelist_big_blocks) will be put 431 in the "big block" freed blocks queue. */ 432 extern Long MC_(clo_freelist_big_blocks); 433 434 /* Do leak check at exit? default: NO */ 435 extern LeakCheckMode MC_(clo_leak_check); 436 437 /* How closely should we compare ExeContexts in leak records? default: 2 */ 438 extern VgRes MC_(clo_leak_resolution); 439 440 /* In leak check, show reachable-but-not-freed blocks? default: NO */ 441 extern Bool MC_(clo_show_reachable); 442 443 /* In leak check, show possibly-lost blocks? default: YES */ 444 extern Bool MC_(clo_show_possible); 445 446 /* In leak check, show possibly-lost blocks? default: YES */ 447 extern Bool MC_(clo_show_possibly_lost); 448 449 /* Assume accesses immediately below %esp are due to gcc-2.96 bugs. 450 * default: NO */ 451 extern Bool MC_(clo_workaround_gcc296_bugs); 452 453 /* Fill malloc-d/free-d client blocks with a specific value? -1 if 454 not, else 0x00 .. 0xFF indicating the fill value to use. Can be 455 useful for causing programs with bad heap corruption to fail in 456 more repeatable ways. Note that malloc-filled and free-filled 457 areas are still undefined and noaccess respectively. This merely 458 causes them to contain the specified values. */ 459 extern Int MC_(clo_malloc_fill); 460 extern Int MC_(clo_free_fill); 461 462 /* Indicates the level of instrumentation/checking done by Memcheck. 463 464 1 = No undefined value checking, Addrcheck-style behaviour only: 465 only address checking is done. This is faster but finds fewer 466 errors. Note that although Addrcheck had 1 bit per byte 467 overhead vs the old Memcheck's 9 bits per byte, with this mode 468 and compressed V bits, no memory is saved with this mode -- 469 it's still 2 bits per byte overhead. This is a little wasteful 470 -- it could be done with 1 bit per byte -- but lets us reuse 471 the many shadow memory access functions. Note that in this 472 mode neither the secondary V bit table nor the origin-tag cache 473 are used. 474 475 2 = Address checking and Undefined value checking are performed, 476 but origins are not tracked. So the origin-tag cache is not 477 used in this mode. This setting is the default and corresponds 478 to the "normal" Memcheck behaviour that has shipped for years. 479 480 3 = Address checking, undefined value checking, and origins for 481 undefined values are tracked. 482 483 The default is 2. 484 */ 485 extern Int MC_(clo_mc_level); 486 487 // Print a short summary to a separate file. 488 extern const char* MC_(clo_summary_file); 489 490 491 /*------------------------------------------------------------*/ 492 /*--- Instrumentation ---*/ 493 /*------------------------------------------------------------*/ 494 495 /* Functions defined in mc_main.c */ 496 497 /* For the fail_w_o functions, the UWord arg is actually the 32-bit 498 origin tag and should really be UInt, but to be simple and safe 499 considering it's called from generated code, just claim it to be a 500 UWord. */ 501 VG_REGPARM(2) void MC_(helperc_value_checkN_fail_w_o) ( HWord, UWord ); 502 VG_REGPARM(1) void MC_(helperc_value_check8_fail_w_o) ( UWord ); 503 VG_REGPARM(1) void MC_(helperc_value_check4_fail_w_o) ( UWord ); 504 VG_REGPARM(1) void MC_(helperc_value_check1_fail_w_o) ( UWord ); 505 VG_REGPARM(1) void MC_(helperc_value_check0_fail_w_o) ( UWord ); 506 507 /* And call these ones instead to report an uninitialised value error 508 but with no origin available. */ 509 VG_REGPARM(1) void MC_(helperc_value_checkN_fail_no_o) ( HWord ); 510 VG_REGPARM(0) void MC_(helperc_value_check8_fail_no_o) ( void ); 511 VG_REGPARM(0) void MC_(helperc_value_check4_fail_no_o) ( void ); 512 VG_REGPARM(0) void MC_(helperc_value_check1_fail_no_o) ( void ); 513 VG_REGPARM(0) void MC_(helperc_value_check0_fail_no_o) ( void ); 514 515 /* V-bits load/store helpers */ 516 VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong ); 517 VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong ); 518 VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord ); 519 VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord ); 520 VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord ); 521 VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord ); 522 VG_REGPARM(2) void MC_(helperc_STOREV8) ( Addr, UWord ); 523 524 VG_REGPARM(1) ULong MC_(helperc_LOADV64be) ( Addr ); 525 VG_REGPARM(1) ULong MC_(helperc_LOADV64le) ( Addr ); 526 VG_REGPARM(1) UWord MC_(helperc_LOADV32be) ( Addr ); 527 VG_REGPARM(1) UWord MC_(helperc_LOADV32le) ( Addr ); 528 VG_REGPARM(1) UWord MC_(helperc_LOADV16be) ( Addr ); 529 VG_REGPARM(1) UWord MC_(helperc_LOADV16le) ( Addr ); 530 VG_REGPARM(1) UWord MC_(helperc_LOADV8) ( Addr ); 531 532 void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len, 533 Addr nia ); 534 535 /* Origin tag load/store helpers */ 536 VG_REGPARM(2) void MC_(helperc_b_store1) ( Addr a, UWord d32 ); 537 VG_REGPARM(2) void MC_(helperc_b_store2) ( Addr a, UWord d32 ); 538 VG_REGPARM(2) void MC_(helperc_b_store4) ( Addr a, UWord d32 ); 539 VG_REGPARM(2) void MC_(helperc_b_store8) ( Addr a, UWord d32 ); 540 VG_REGPARM(2) void MC_(helperc_b_store16)( Addr a, UWord d32 ); 541 VG_REGPARM(1) UWord MC_(helperc_b_load1) ( Addr a ); 542 VG_REGPARM(1) UWord MC_(helperc_b_load2) ( Addr a ); 543 VG_REGPARM(1) UWord MC_(helperc_b_load4) ( Addr a ); 544 VG_REGPARM(1) UWord MC_(helperc_b_load8) ( Addr a ); 545 VG_REGPARM(1) UWord MC_(helperc_b_load16)( Addr a ); 546 547 /* Functions defined in mc_translate.c */ 548 IRSB* MC_(instrument) ( VgCallbackClosure* closure, 549 IRSB* bb_in, 550 VexGuestLayout* layout, 551 VexGuestExtents* vge, 552 IRType gWordTy, IRType hWordTy ); 553 554 IRSB* MC_(final_tidy) ( IRSB* ); 555 556 #endif /* ndef __MC_INCLUDE_H */ 557 558 /*--------------------------------------------------------------------*/ 559 /*--- end ---*/ 560 /*--------------------------------------------------------------------*/ 561