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