blob: 0f5f66afa929a261bd301ea15546ef11e41564ea [file] [log] [blame]
njnc9539842002-10-02 13:26:35 +00001
njn25e49d8e72002-09-23 09:36:25 +00002/*--------------------------------------------------------------------*/
nethercote137bc552003-11-14 17:47:54 +00003/*--- A header file for all parts of the MemCheck tool. ---*/
njn25cac76cb2002-09-23 11:21:57 +00004/*--- mc_include.h ---*/
njn25e49d8e72002-09-23 09:36:25 +00005/*--------------------------------------------------------------------*/
6
7/*
nethercote137bc552003-11-14 17:47:54 +00008 This file is part of MemCheck, a heavyweight Valgrind tool for
njnc9539842002-10-02 13:26:35 +00009 detecting memory errors.
njn25e49d8e72002-09-23 09:36:25 +000010
sewardj4d474d02008-02-11 11:34:59 +000011 Copyright (C) 2000-2008 Julian Seward
njn25e49d8e72002-09-23 09:36:25 +000012 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
njn25cac76cb2002-09-23 11:21:57 +000032#ifndef __MC_INCLUDE_H
33#define __MC_INCLUDE_H
njn25e49d8e72002-09-23 09:36:25 +000034
njn44acd3e2005-05-13 21:39:45 +000035#define MC_(str) VGAPPEND(vgMemCheck_,str)
njn25e49d8e72002-09-23 09:36:25 +000036
sewardj7ce71662008-05-02 10:33:15 +000037
38/* This is a private header file for use only within the
39 memcheck/ directory. */
40
njn25e49d8e72002-09-23 09:36:25 +000041/*------------------------------------------------------------*/
njn1d0825f2006-03-27 11:37:07 +000042/*--- Tracking the heap ---*/
njn43c799e2003-04-08 00:08:52 +000043/*------------------------------------------------------------*/
44
njn1d0825f2006-03-27 11:37:07 +000045/* We want at least a 16B redzone on client heap blocks for Memcheck */
46#define MC_MALLOC_REDZONE_SZB 16
47
48/* For malloc()/new/new[] vs. free()/delete/delete[] mismatch checking. */
49typedef
50 enum {
51 MC_AllocMalloc = 0,
52 MC_AllocNew = 1,
53 MC_AllocNewVec = 2,
54 MC_AllocCustom = 3
55 }
56 MC_AllocKind;
57
58/* Nb: first two fields must match core's VgHashNode. */
59typedef
60 struct _MC_Chunk {
61 struct _MC_Chunk* next;
62 Addr data; // ptr to actual block
njn718d3b12006-12-16 00:54:12 +000063 SizeT szB : (sizeof(UWord)*8)-2; // size requested; 30 or 62 bits
njn1d0825f2006-03-27 11:37:07 +000064 MC_AllocKind allockind : 2; // which wrapper did the allocation
65 ExeContext* where; // where it was allocated
66 }
67 MC_Chunk;
68
69/* Memory pool. Nb: first two fields must match core's VgHashNode. */
70typedef
71 struct _MC_Mempool {
72 struct _MC_Mempool* next;
73 Addr pool; // pool identifier
74 SizeT rzB; // pool red-zone size
75 Bool is_zeroed; // allocations from this pool are zeroed
76 VgHashTable chunks; // chunks associated with this pool
77 }
78 MC_Mempool;
79
80
sewardj56adc352008-05-02 11:25:17 +000081void* MC_(new_block) ( ThreadId tid,
njn1dcee092009-02-24 03:07:37 +000082 Addr p, SizeT size, SizeT align,
sewardj56adc352008-05-02 11:25:17 +000083 Bool is_zeroed, MC_AllocKind kind,
84 VgHashTable table);
85void MC_(handle_free) ( ThreadId tid,
86 Addr p, UInt rzB, MC_AllocKind kind );
njn1d0825f2006-03-27 11:37:07 +000087
sewardj56adc352008-05-02 11:25:17 +000088void MC_(create_mempool) ( Addr pool, UInt rzB, Bool is_zeroed );
89void MC_(destroy_mempool) ( Addr pool );
90void MC_(mempool_alloc) ( ThreadId tid, Addr pool,
91 Addr addr, SizeT size );
92void MC_(mempool_free) ( Addr pool, Addr addr );
93void MC_(mempool_trim) ( Addr pool, Addr addr, SizeT size );
94void MC_(move_mempool) ( Addr poolA, Addr poolB );
95void MC_(mempool_change) ( Addr pool, Addr addrA, Addr addrB, SizeT size );
96Bool MC_(mempool_exists) ( Addr pool );
njn1d0825f2006-03-27 11:37:07 +000097
sewardj56adc352008-05-02 11:25:17 +000098MC_Chunk* MC_(get_freed_list_head)( void );
njn1d0825f2006-03-27 11:37:07 +000099
100/* For tracking malloc'd blocks */
sewardj505a8192008-07-18 20:15:46 +0000101extern VgHashTable MC_(malloc_list);
njn1d0825f2006-03-27 11:37:07 +0000102
103/* For tracking memory pools. */
sewardj505a8192008-07-18 20:15:46 +0000104extern VgHashTable MC_(mempool_list);
njn1d0825f2006-03-27 11:37:07 +0000105
106/* Shadow memory functions */
sewardj56adc352008-05-02 11:25:17 +0000107Bool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr );
108void MC_(make_mem_noaccess) ( Addr a, SizeT len );
109void MC_(make_mem_undefined_w_otag)( Addr a, SizeT len, UInt otag );
110void MC_(make_mem_defined) ( Addr a, SizeT len );
111void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len );
njn1d0825f2006-03-27 11:37:07 +0000112
sewardj56adc352008-05-02 11:25:17 +0000113void MC_(print_malloc_stats) ( void );
njn1d0825f2006-03-27 11:37:07 +0000114
sewardj56adc352008-05-02 11:25:17 +0000115void* MC_(malloc) ( ThreadId tid, SizeT n );
116void* MC_(__builtin_new) ( ThreadId tid, SizeT n );
117void* MC_(__builtin_vec_new) ( ThreadId tid, SizeT n );
118void* MC_(memalign) ( ThreadId tid, SizeT align, SizeT n );
119void* MC_(calloc) ( ThreadId tid, SizeT nmemb, SizeT size1 );
120void MC_(free) ( ThreadId tid, void* p );
121void MC_(__builtin_delete) ( ThreadId tid, void* p );
122void MC_(__builtin_vec_delete) ( ThreadId tid, void* p );
123void* MC_(realloc) ( ThreadId tid, void* p, SizeT new_size );
njn8b140de2009-02-17 04:31:18 +0000124SizeT MC_(malloc_usable_size) ( ThreadId tid, void* p );
sewardj56adc352008-05-02 11:25:17 +0000125
njn43c799e2003-04-08 00:08:52 +0000126
sewardj7cf4e6b2008-05-01 20:24:26 +0000127/*------------------------------------------------------------*/
128/*--- Origin tracking translate-time support ---*/
129/*------------------------------------------------------------*/
130
131/* See detailed comments in mc_machine.c. */
sewardj7cf4e6b2008-05-01 20:24:26 +0000132Int MC_(get_otrack_shadow_offset) ( Int offset, Int szB );
sewardj7cf4e6b2008-05-01 20:24:26 +0000133IRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr );
134
135/* Constants which are used as the lowest 2 bits in origin tags.
136
137 An origin tag comprises an upper 30-bit ECU field and a lower 2-bit
138 'kind' field. The ECU field is a number given out by m_execontext
139 and has a 1-1 mapping with ExeContext*s. An ECU can be used
140 directly as an origin tag (otag), but in fact we want to put
141 additional information 'kind' field to indicate roughly where the
142 tag came from. This helps print more understandable error messages
143 for the user -- it has no other purpose.
144
145 Hence the following 2-bit constants are needed for 'kind' field.
146
147 To summarise:
148
149 * Both ECUs and origin tags are represented as 32-bit words
150
151 * m_execontext and the core-tool interface deal purely in ECUs.
152 They have no knowledge of origin tags - that is a purely
153 Memcheck-internal matter.
154
155 * all valid ECUs have the lowest 2 bits zero and at least
156 one of the upper 30 bits nonzero (see VG_(is_plausible_ECU))
157
158 * to convert from an ECU to an otag, OR in one of the MC_OKIND_
159 constants below
160
161 * to convert an otag back to an ECU, AND it with ~3
162*/
163
164#define MC_OKIND_UNKNOWN 0 /* unknown origin */
165#define MC_OKIND_HEAP 1 /* this is a heap origin */
166#define MC_OKIND_STACK 2 /* this is a stack origin */
167#define MC_OKIND_USER 3 /* arises from user-supplied client req */
168
njn43c799e2003-04-08 00:08:52 +0000169
170/*------------------------------------------------------------*/
njn1d0825f2006-03-27 11:37:07 +0000171/*--- Profiling of memory events ---*/
172/*------------------------------------------------------------*/
173
174/* Define to collect detailed performance info. */
175/* #define MC_PROFILE_MEMORY */
176
177#ifdef MC_PROFILE_MEMORY
178# define N_PROF_EVENTS 500
179
sewardj56adc352008-05-02 11:25:17 +0000180UInt MC_(event_ctr)[N_PROF_EVENTS];
181HChar* MC_(event_ctr_name)[N_PROF_EVENTS];
njn1d0825f2006-03-27 11:37:07 +0000182
183# define PROF_EVENT(ev, name) \
184 do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS); \
185 /* crude and inaccurate check to ensure the same */ \
186 /* event isn't being used with > 1 name */ \
187 if (MC_(event_ctr_name)[ev]) \
188 tl_assert(name == MC_(event_ctr_name)[ev]); \
189 MC_(event_ctr)[ev]++; \
190 MC_(event_ctr_name)[ev] = (name); \
191 } while (False);
192
193#else
194
195# define PROF_EVENT(ev, name) /* */
196
197#endif /* MC_PROFILE_MEMORY */
198
199
200/*------------------------------------------------------------*/
201/*--- V and A bits (Victoria & Albert ?) ---*/
202/*------------------------------------------------------------*/
203
204/* The number of entries in the primary map can be altered. However
205 we hardwire the assumption that each secondary map covers precisely
206 64k of address space. */
207#define SM_SIZE 65536 /* DO NOT CHANGE */
208#define SM_MASK (SM_SIZE-1) /* DO NOT CHANGE */
209
210#define V_BIT_DEFINED 0
211#define V_BIT_UNDEFINED 1
212
213#define V_BITS8_DEFINED 0
214#define V_BITS8_UNDEFINED 0xFF
215
216#define V_BITS16_DEFINED 0
217#define V_BITS16_UNDEFINED 0xFFFF
218
219#define V_BITS32_DEFINED 0
220#define V_BITS32_UNDEFINED 0xFFFFFFFF
221
222#define V_BITS64_DEFINED 0ULL
223#define V_BITS64_UNDEFINED 0xFFFFFFFFFFFFFFFFULL
224
225
226/*------------------------------------------------------------*/
227/*--- Leak checking ---*/
228/*------------------------------------------------------------*/
229
njn718d3b12006-12-16 00:54:12 +0000230/* A block is either
231 -- Proper-ly reached; a pointer to its start has been found
232 -- Interior-ly reached; only an interior pointer to it has been found
233 -- Unreached; so far, no pointers to any part of it have been found.
234 -- IndirectLeak; leaked, but referred to by another leaked block
235*/
236typedef
237 enum {
238 Unreached =0,
239 IndirectLeak =1,
240 Interior =2,
241 Proper =3
242 }
243 Reachedness;
244
njn1d0825f2006-03-27 11:37:07 +0000245/* For VALGRIND_COUNT_LEAKS client request */
sewardj505a8192008-07-18 20:15:46 +0000246extern SizeT MC_(bytes_leaked);
247extern SizeT MC_(bytes_indirect);
248extern SizeT MC_(bytes_dubious);
249extern SizeT MC_(bytes_reachable);
250extern SizeT MC_(bytes_suppressed);
njn1d0825f2006-03-27 11:37:07 +0000251
njn8df80b22009-03-02 05:11:06 +0000252/* For VALGRIND_COUNT_LEAK_BLOCKS client request */
253extern SizeT MC_(blocks_leaked);
254extern SizeT MC_(blocks_indirect);
255extern SizeT MC_(blocks_dubious);
256extern SizeT MC_(blocks_reachable);
257extern SizeT MC_(blocks_suppressed);
258
njn1d0825f2006-03-27 11:37:07 +0000259typedef
260 enum {
261 LC_Off,
262 LC_Summary,
263 LC_Full,
264 }
265 LeakCheckMode;
266
njn718d3b12006-12-16 00:54:12 +0000267/* A block record, used for generating err msgs. */
268typedef
269 struct _LossRecord {
270 struct _LossRecord* next;
271 /* Where these lost blocks were allocated. */
272 ExeContext* allocated_at;
273 /* Their reachability. */
274 Reachedness loss_mode;
275 /* Number of blocks and total # bytes involved. */
276 SizeT total_bytes;
277 SizeT indirect_bytes;
278 UInt num_blocks;
279 }
280 LossRecord;
281
sewardj56adc352008-05-02 11:25:17 +0000282void MC_(do_detect_memory_leaks) (
283 ThreadId tid, LeakCheckMode mode,
284 Bool (*is_within_valid_secondary) ( Addr ),
285 Bool (*is_valid_aligned_word) ( Addr )
286 );
njn1d0825f2006-03-27 11:37:07 +0000287
sewardj56adc352008-05-02 11:25:17 +0000288void MC_(pp_LeakError)(UInt n_this_record, UInt n_total_records,
289 LossRecord* l);
njn718d3b12006-12-16 00:54:12 +0000290
291
292/*------------------------------------------------------------*/
293/*--- Errors and suppressions ---*/
294/*------------------------------------------------------------*/
295
sewardj7ce71662008-05-02 10:33:15 +0000296/* Did we show to the user, any errors for which an uninitialised
297 value origin could have been collected (but wasn't) ? If yes,
298 then, at the end of the run, print a 1 line message advising that a
299 rerun with --track-origins=yes might help. */
sewardj505a8192008-07-18 20:15:46 +0000300extern Bool MC_(any_value_errors);
sewardj7ce71662008-05-02 10:33:15 +0000301
302/* Standard functions for error and suppressions as required by the
303 core/tool iface */
304Bool MC_(eq_Error) ( VgRes res, Error* e1, Error* e2 );
305void MC_(pp_Error) ( Error* err );
306UInt MC_(update_Error_extra)( Error* err );
307
308Bool MC_(is_recognised_suppression) ( Char* name, Supp* su );
309
310Bool MC_(read_extra_suppression_info) ( Int fd, Char* buf,
311 Int nBuf, Supp *su );
312
313Bool MC_(error_matches_suppression) ( Error* err, Supp* su );
314
315void MC_(print_extra_suppression_info) ( Error* err );
316
317Char* MC_(get_error_name) ( Error* err );
318
319/* Recording of errors */
320void MC_(record_address_error) ( ThreadId tid, Addr a, Int szB,
321 Bool isWrite );
322void MC_(record_cond_error) ( ThreadId tid, UInt otag );
323void MC_(record_value_error) ( ThreadId tid, Int szB, UInt otag );
324void MC_(record_jump_error) ( ThreadId tid, Addr a );
325
326void MC_(record_free_error) ( ThreadId tid, Addr a );
327void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
328void MC_(record_freemismatch_error) ( ThreadId tid, MC_Chunk* mc );
329
330void MC_(record_overlap_error) ( ThreadId tid, Char* function,
331 Addr src, Addr dst, SizeT szB );
njn1dcee092009-02-24 03:07:37 +0000332void MC_(record_core_mem_error) ( ThreadId tid, Char* msg );
sewardj7ce71662008-05-02 10:33:15 +0000333void MC_(record_regparam_error) ( ThreadId tid, Char* msg, UInt otag );
334void MC_(record_memparam_error) ( ThreadId tid, Addr a,
335 Bool isAddrErr, Char* msg, UInt otag );
336void MC_(record_user_error) ( ThreadId tid, Addr a,
337 Bool isAddrErr, UInt otag );
338
339Bool MC_(record_leak_error) ( ThreadId tid,
340 UInt n_this_record,
341 UInt n_total_records,
342 LossRecord* lossRecord,
343 Bool print_record );
344
345/* Is this address in a user-specified "ignored range" ? */
346Bool MC_(in_ignored_range) ( Addr a );
347
348
349/*------------------------------------------------------------*/
350/*--- Client blocks ---*/
351/*------------------------------------------------------------*/
352
353/* Describes a client block. See mc_main.c. An unused block has
354 start == size == 0. */
355typedef
356 struct {
357 Addr start;
358 SizeT size;
359 ExeContext* where;
360 Char* desc;
361 }
362 CGenBlock;
363
364/* Get access to the client block array. */
365void MC_(get_ClientBlock_array)( /*OUT*/CGenBlock** blocks,
366 /*OUT*/UWord* nBlocks );
367
njn718d3b12006-12-16 00:54:12 +0000368
njn1d0825f2006-03-27 11:37:07 +0000369/*------------------------------------------------------------*/
370/*--- Command line options + defaults ---*/
371/*------------------------------------------------------------*/
372
373/* Allow loads from partially-valid addresses? default: YES */
sewardj505a8192008-07-18 20:15:46 +0000374extern Bool MC_(clo_partial_loads_ok);
njn1d0825f2006-03-27 11:37:07 +0000375
376/* Max volume of the freed blocks queue. */
sewardj505a8192008-07-18 20:15:46 +0000377extern Long MC_(clo_freelist_vol);
njn1d0825f2006-03-27 11:37:07 +0000378
379/* Do leak check at exit? default: NO */
sewardj505a8192008-07-18 20:15:46 +0000380extern LeakCheckMode MC_(clo_leak_check);
njn1d0825f2006-03-27 11:37:07 +0000381
382/* How closely should we compare ExeContexts in leak records? default: 2 */
sewardj505a8192008-07-18 20:15:46 +0000383extern VgRes MC_(clo_leak_resolution);
njn1d0825f2006-03-27 11:37:07 +0000384
385/* In leak check, show reachable-but-not-freed blocks? default: NO */
sewardj505a8192008-07-18 20:15:46 +0000386extern Bool MC_(clo_show_reachable);
njn1d0825f2006-03-27 11:37:07 +0000387
388/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
389 * default: NO */
sewardj505a8192008-07-18 20:15:46 +0000390extern Bool MC_(clo_workaround_gcc296_bugs);
njn1d0825f2006-03-27 11:37:07 +0000391
sewardjeb0fa932007-11-30 21:41:40 +0000392/* Fill malloc-d/free-d client blocks with a specific value? -1 if
393 not, else 0x00 .. 0xFF indicating the fill value to use. Can be
394 useful for causing programs with bad heap corruption to fail in
395 more repeatable ways. Note that malloc-filled and free-filled
396 areas are still undefined and noaccess respectively. This merely
397 causes them to contain the specified values. */
sewardj505a8192008-07-18 20:15:46 +0000398extern Int MC_(clo_malloc_fill);
399extern Int MC_(clo_free_fill);
sewardjeb0fa932007-11-30 21:41:40 +0000400
sewardj7cf4e6b2008-05-01 20:24:26 +0000401/* Indicates the level of instrumentation/checking done by Memcheck.
402
403 1 = No undefined value checking, Addrcheck-style behaviour only:
404 only address checking is done. This is faster but finds fewer
405 errors. Note that although Addrcheck had 1 bit per byte
406 overhead vs the old Memcheck's 9 bits per byte, with this mode
407 and compressed V bits, no memory is saved with this mode --
408 it's still 2 bits per byte overhead. This is a little wasteful
409 -- it could be done with 1 bit per byte -- but lets us reuse
410 the many shadow memory access functions. Note that in this
411 mode neither the secondary V bit table nor the origin-tag cache
412 are used.
413
414 2 = Address checking and Undefined value checking are performed,
415 but origins are not tracked. So the origin-tag cache is not
416 used in this mode. This setting is the default and corresponds
417 to the "normal" Memcheck behaviour that has shipped for years.
418
419 3 = Address checking, undefined value checking, and origins for
420 undefined values are tracked.
421
422 The default is 2.
423*/
sewardj505a8192008-07-18 20:15:46 +0000424extern Int MC_(clo_mc_level);
sewardj7cf4e6b2008-05-01 20:24:26 +0000425
njn1d0825f2006-03-27 11:37:07 +0000426
427/*------------------------------------------------------------*/
428/*--- Instrumentation ---*/
njn25e49d8e72002-09-23 09:36:25 +0000429/*------------------------------------------------------------*/
430
njn66fe05a2003-07-22 09:12:33 +0000431/* Functions defined in mc_main.c */
sewardj95448072004-11-22 20:19:51 +0000432
sewardj7cf4e6b2008-05-01 20:24:26 +0000433/* For the fail_w_o functions, the UWord arg is actually the 32-bit
434 origin tag and should really be UInt, but to be simple and safe
435 considering it's called from generated code, just claim it to be a
436 UWord. */
sewardj56adc352008-05-02 11:25:17 +0000437VG_REGPARM(2) void MC_(helperc_value_checkN_fail_w_o) ( HWord, UWord );
438VG_REGPARM(1) void MC_(helperc_value_check8_fail_w_o) ( UWord );
439VG_REGPARM(1) void MC_(helperc_value_check4_fail_w_o) ( UWord );
440VG_REGPARM(1) void MC_(helperc_value_check1_fail_w_o) ( UWord );
441VG_REGPARM(1) void MC_(helperc_value_check0_fail_w_o) ( UWord );
sewardj7cf4e6b2008-05-01 20:24:26 +0000442
443/* And call these ones instead to report an uninitialised value error
444 but with no origin available. */
sewardj56adc352008-05-02 11:25:17 +0000445VG_REGPARM(1) void MC_(helperc_value_checkN_fail_no_o) ( HWord );
446VG_REGPARM(0) void MC_(helperc_value_check8_fail_no_o) ( void );
447VG_REGPARM(0) void MC_(helperc_value_check4_fail_no_o) ( void );
448VG_REGPARM(0) void MC_(helperc_value_check1_fail_no_o) ( void );
449VG_REGPARM(0) void MC_(helperc_value_check0_fail_no_o) ( void );
sewardj7cf4e6b2008-05-01 20:24:26 +0000450
451/* V-bits load/store helpers */
sewardj56adc352008-05-02 11:25:17 +0000452VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
453VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
454VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
455VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
456VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
457VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
458VG_REGPARM(2) void MC_(helperc_STOREV8) ( Addr, UWord );
sewardj95448072004-11-22 20:19:51 +0000459
sewardj56adc352008-05-02 11:25:17 +0000460VG_REGPARM(1) ULong MC_(helperc_LOADV64be) ( Addr );
461VG_REGPARM(1) ULong MC_(helperc_LOADV64le) ( Addr );
462VG_REGPARM(1) UWord MC_(helperc_LOADV32be) ( Addr );
463VG_REGPARM(1) UWord MC_(helperc_LOADV32le) ( Addr );
464VG_REGPARM(1) UWord MC_(helperc_LOADV16be) ( Addr );
465VG_REGPARM(1) UWord MC_(helperc_LOADV16le) ( Addr );
466VG_REGPARM(1) UWord MC_(helperc_LOADV8) ( Addr );
njn25e49d8e72002-09-23 09:36:25 +0000467
sewardj56adc352008-05-02 11:25:17 +0000468void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len,
469 Addr nia );
sewardj7cf4e6b2008-05-01 20:24:26 +0000470
471/* Origin tag load/store helpers */
472VG_REGPARM(2) void MC_(helperc_b_store1) ( Addr a, UWord d32 );
473VG_REGPARM(2) void MC_(helperc_b_store2) ( Addr a, UWord d32 );
474VG_REGPARM(2) void MC_(helperc_b_store4) ( Addr a, UWord d32 );
475VG_REGPARM(2) void MC_(helperc_b_store8) ( Addr a, UWord d32 );
476VG_REGPARM(2) void MC_(helperc_b_store16)( Addr a, UWord d32 );
477VG_REGPARM(1) UWord MC_(helperc_b_load1) ( Addr a );
478VG_REGPARM(1) UWord MC_(helperc_b_load2) ( Addr a );
479VG_REGPARM(1) UWord MC_(helperc_b_load4) ( Addr a );
480VG_REGPARM(1) UWord MC_(helperc_b_load8) ( Addr a );
481VG_REGPARM(1) UWord MC_(helperc_b_load16)( Addr a );
sewardj826ec492005-05-12 18:05:00 +0000482
njn51d827b2005-05-09 01:02:08 +0000483/* Functions defined in mc_translate.c */
sewardj0b9d74a2006-12-24 02:24:11 +0000484IRSB* MC_(instrument) ( VgCallbackClosure* closure,
485 IRSB* bb_in,
sewardj461df9c2006-01-17 02:06:39 +0000486 VexGuestLayout* layout,
487 VexGuestExtents* vge,
sewardj4ba057c2005-10-18 12:04:18 +0000488 IRType gWordTy, IRType hWordTy );
sewardj8d61eb12005-07-08 09:46:53 +0000489
sewardj81651dc2007-08-28 06:05:20 +0000490IRSB* MC_(final_tidy) ( IRSB* );
491
sewardj8d61eb12005-07-08 09:46:53 +0000492#endif /* ndef __MC_INCLUDE_H */
njn25e49d8e72002-09-23 09:36:25 +0000493
494/*--------------------------------------------------------------------*/
nethercote8b76fe52004-11-08 19:20:09 +0000495/*--- end ---*/
njn25e49d8e72002-09-23 09:36:25 +0000496/*--------------------------------------------------------------------*/