blob: 920378362aa0900a0480033b4e4e6ce75ad25b0f [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
njn9f207462009-03-10 22:02:09 +000011 Copyright (C) 2000-2009 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
njn8225cc02009-03-09 22:52:24 +000058/* This describes a heap block. Nb: first two fields must match core's
59 * VgHashNode. */
njn1d0825f2006-03-27 11:37:07 +000060typedef
61 struct _MC_Chunk {
62 struct _MC_Chunk* next;
njn8225cc02009-03-09 22:52:24 +000063 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.
njn1d0825f2006-03-27 11:37:07 +000067 }
68 MC_Chunk;
69
70/* Memory pool. Nb: first two fields must match core's VgHashNode. */
71typedef
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
sewardj56adc352008-05-02 11:25:17 +000082void* MC_(new_block) ( ThreadId tid,
njn1dcee092009-02-24 03:07:37 +000083 Addr p, SizeT size, SizeT align,
sewardj56adc352008-05-02 11:25:17 +000084 Bool is_zeroed, MC_AllocKind kind,
85 VgHashTable table);
86void MC_(handle_free) ( ThreadId tid,
87 Addr p, UInt rzB, MC_AllocKind kind );
njn1d0825f2006-03-27 11:37:07 +000088
sewardj56adc352008-05-02 11:25:17 +000089void MC_(create_mempool) ( Addr pool, UInt rzB, Bool is_zeroed );
90void MC_(destroy_mempool) ( Addr pool );
91void MC_(mempool_alloc) ( ThreadId tid, Addr pool,
92 Addr addr, SizeT size );
93void MC_(mempool_free) ( Addr pool, Addr addr );
94void MC_(mempool_trim) ( Addr pool, Addr addr, SizeT size );
95void MC_(move_mempool) ( Addr poolA, Addr poolB );
96void MC_(mempool_change) ( Addr pool, Addr addrA, Addr addrB, SizeT size );
97Bool MC_(mempool_exists) ( Addr pool );
njn1d0825f2006-03-27 11:37:07 +000098
sewardj56adc352008-05-02 11:25:17 +000099MC_Chunk* MC_(get_freed_list_head)( void );
njn1d0825f2006-03-27 11:37:07 +0000100
njnb965efb2009-08-10 07:36:54 +0000101/* For tracking malloc'd blocks. Nb: it's quite important that it's a
102 VgHashTable, because VgHashTable allows duplicate keys without complaint.
103 This can occur if a user marks a malloc() block as also a custom block with
104 MALLOCLIKE_BLOCK. */
sewardj505a8192008-07-18 20:15:46 +0000105extern VgHashTable MC_(malloc_list);
njn1d0825f2006-03-27 11:37:07 +0000106
107/* For tracking memory pools. */
sewardj505a8192008-07-18 20:15:46 +0000108extern VgHashTable MC_(mempool_list);
njn1d0825f2006-03-27 11:37:07 +0000109
110/* Shadow memory functions */
sewardj56adc352008-05-02 11:25:17 +0000111Bool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr );
112void MC_(make_mem_noaccess) ( Addr a, SizeT len );
113void MC_(make_mem_undefined_w_otag)( Addr a, SizeT len, UInt otag );
114void MC_(make_mem_defined) ( Addr a, SizeT len );
115void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len );
njn1d0825f2006-03-27 11:37:07 +0000116
sewardj56adc352008-05-02 11:25:17 +0000117void MC_(print_malloc_stats) ( void );
njn1d0825f2006-03-27 11:37:07 +0000118
sewardj56adc352008-05-02 11:25:17 +0000119void* MC_(malloc) ( ThreadId tid, SizeT n );
120void* MC_(__builtin_new) ( ThreadId tid, SizeT n );
121void* MC_(__builtin_vec_new) ( ThreadId tid, SizeT n );
122void* MC_(memalign) ( ThreadId tid, SizeT align, SizeT n );
123void* MC_(calloc) ( ThreadId tid, SizeT nmemb, SizeT size1 );
124void MC_(free) ( ThreadId tid, void* p );
125void MC_(__builtin_delete) ( ThreadId tid, void* p );
126void MC_(__builtin_vec_delete) ( ThreadId tid, void* p );
127void* MC_(realloc) ( ThreadId tid, void* p, SizeT new_size );
njn8b140de2009-02-17 04:31:18 +0000128SizeT MC_(malloc_usable_size) ( ThreadId tid, void* p );
sewardj56adc352008-05-02 11:25:17 +0000129
njn43c799e2003-04-08 00:08:52 +0000130
sewardj7cf4e6b2008-05-01 20:24:26 +0000131/*------------------------------------------------------------*/
132/*--- Origin tracking translate-time support ---*/
133/*------------------------------------------------------------*/
134
135/* See detailed comments in mc_machine.c. */
sewardj7cf4e6b2008-05-01 20:24:26 +0000136Int MC_(get_otrack_shadow_offset) ( Int offset, Int szB );
sewardj7cf4e6b2008-05-01 20:24:26 +0000137IRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr );
138
139/* Constants which are used as the lowest 2 bits in origin tags.
140
141 An origin tag comprises an upper 30-bit ECU field and a lower 2-bit
142 'kind' field. The ECU field is a number given out by m_execontext
143 and has a 1-1 mapping with ExeContext*s. An ECU can be used
144 directly as an origin tag (otag), but in fact we want to put
145 additional information 'kind' field to indicate roughly where the
146 tag came from. This helps print more understandable error messages
147 for the user -- it has no other purpose.
148
149 Hence the following 2-bit constants are needed for 'kind' field.
150
151 To summarise:
152
153 * Both ECUs and origin tags are represented as 32-bit words
154
155 * m_execontext and the core-tool interface deal purely in ECUs.
156 They have no knowledge of origin tags - that is a purely
157 Memcheck-internal matter.
158
159 * all valid ECUs have the lowest 2 bits zero and at least
160 one of the upper 30 bits nonzero (see VG_(is_plausible_ECU))
161
162 * to convert from an ECU to an otag, OR in one of the MC_OKIND_
163 constants below
164
165 * to convert an otag back to an ECU, AND it with ~3
166*/
167
168#define MC_OKIND_UNKNOWN 0 /* unknown origin */
169#define MC_OKIND_HEAP 1 /* this is a heap origin */
170#define MC_OKIND_STACK 2 /* this is a stack origin */
171#define MC_OKIND_USER 3 /* arises from user-supplied client req */
172
njn43c799e2003-04-08 00:08:52 +0000173
174/*------------------------------------------------------------*/
njn1d0825f2006-03-27 11:37:07 +0000175/*--- Profiling of memory events ---*/
176/*------------------------------------------------------------*/
177
178/* Define to collect detailed performance info. */
179/* #define MC_PROFILE_MEMORY */
180
181#ifdef MC_PROFILE_MEMORY
182# define N_PROF_EVENTS 500
183
sewardj56adc352008-05-02 11:25:17 +0000184UInt MC_(event_ctr)[N_PROF_EVENTS];
185HChar* MC_(event_ctr_name)[N_PROF_EVENTS];
njn1d0825f2006-03-27 11:37:07 +0000186
187# define PROF_EVENT(ev, name) \
188 do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS); \
189 /* crude and inaccurate check to ensure the same */ \
190 /* event isn't being used with > 1 name */ \
191 if (MC_(event_ctr_name)[ev]) \
192 tl_assert(name == MC_(event_ctr_name)[ev]); \
193 MC_(event_ctr)[ev]++; \
194 MC_(event_ctr_name)[ev] = (name); \
195 } while (False);
196
197#else
198
199# define PROF_EVENT(ev, name) /* */
200
201#endif /* MC_PROFILE_MEMORY */
202
203
204/*------------------------------------------------------------*/
205/*--- V and A bits (Victoria & Albert ?) ---*/
206/*------------------------------------------------------------*/
207
208/* The number of entries in the primary map can be altered. However
209 we hardwire the assumption that each secondary map covers precisely
210 64k of address space. */
211#define SM_SIZE 65536 /* DO NOT CHANGE */
212#define SM_MASK (SM_SIZE-1) /* DO NOT CHANGE */
213
214#define V_BIT_DEFINED 0
215#define V_BIT_UNDEFINED 1
216
217#define V_BITS8_DEFINED 0
218#define V_BITS8_UNDEFINED 0xFF
219
220#define V_BITS16_DEFINED 0
221#define V_BITS16_UNDEFINED 0xFFFF
222
223#define V_BITS32_DEFINED 0
224#define V_BITS32_UNDEFINED 0xFFFFFFFF
225
226#define V_BITS64_DEFINED 0ULL
227#define V_BITS64_UNDEFINED 0xFFFFFFFFFFFFFFFFULL
228
229
230/*------------------------------------------------------------*/
231/*--- Leak checking ---*/
232/*------------------------------------------------------------*/
233
njn718d3b12006-12-16 00:54:12 +0000234typedef
235 enum {
njn29a5c012009-05-06 06:15:55 +0000236 // Nb: the order is important -- it dictates the order of loss records
237 // of equal sizes.
238 Reachable =0, // Definitely reachable from root-set.
239 Possible =1, // Possibly reachable from root-set; involves at
njn8225cc02009-03-09 22:52:24 +0000240 // least one interior-pointer along the way.
njn29a5c012009-05-06 06:15:55 +0000241 IndirectLeak =2, // Leaked, but reachable from another leaked block
242 // (be it Unreached or IndirectLeak).
243 Unreached =3, // Not reached, ie. leaked.
244 // (At best, only reachable from itself via a cycle.)
njn718d3b12006-12-16 00:54:12 +0000245 }
246 Reachedness;
247
njn1d0825f2006-03-27 11:37:07 +0000248/* For VALGRIND_COUNT_LEAKS client request */
sewardj505a8192008-07-18 20:15:46 +0000249extern SizeT MC_(bytes_leaked);
250extern SizeT MC_(bytes_indirect);
251extern SizeT MC_(bytes_dubious);
252extern SizeT MC_(bytes_reachable);
253extern SizeT MC_(bytes_suppressed);
njn1d0825f2006-03-27 11:37:07 +0000254
njn8df80b22009-03-02 05:11:06 +0000255/* For VALGRIND_COUNT_LEAK_BLOCKS client request */
256extern SizeT MC_(blocks_leaked);
257extern SizeT MC_(blocks_indirect);
258extern SizeT MC_(blocks_dubious);
259extern SizeT MC_(blocks_reachable);
260extern SizeT MC_(blocks_suppressed);
261
njn1d0825f2006-03-27 11:37:07 +0000262typedef
263 enum {
264 LC_Off,
265 LC_Summary,
266 LC_Full,
267 }
268 LeakCheckMode;
269
njn29a5c012009-05-06 06:15:55 +0000270/* When a LossRecord is put into an OSet, these elements represent the key. */
271typedef
272 struct _LossRecordKey {
273 Reachedness state; // LC_Extra.state value shared by all blocks.
274 ExeContext* allocated_at; // Where they were allocated.
275 }
276 LossRecordKey;
277
njnb7a4e2e2009-05-01 00:30:43 +0000278/* A loss record, used for generating err msgs. Multiple leaked blocks can be
279 * merged into a single loss record if they have the same state and similar
280 * enough allocation points (controlled by --leak-resolution). */
njn718d3b12006-12-16 00:54:12 +0000281typedef
282 struct _LossRecord {
njn29a5c012009-05-06 06:15:55 +0000283 LossRecordKey key; // Key, when used in an OSet.
284 SizeT szB; // Sum of all MC_Chunk.szB values.
285 SizeT indirect_szB; // Sum of all LC_Extra.indirect_szB values.
286 UInt num_blocks; // Number of blocks represented by the record.
njn718d3b12006-12-16 00:54:12 +0000287 }
288 LossRecord;
289
njn8225cc02009-03-09 22:52:24 +0000290void MC_(detect_memory_leaks) ( ThreadId tid, LeakCheckMode mode );
291
292Bool MC_(is_valid_aligned_word) ( Addr a );
293Bool MC_(is_within_valid_secondary) ( Addr a );
njn1d0825f2006-03-27 11:37:07 +0000294
sewardj56adc352008-05-02 11:25:17 +0000295void MC_(pp_LeakError)(UInt n_this_record, UInt n_total_records,
296 LossRecord* l);
njn718d3b12006-12-16 00:54:12 +0000297
298
299/*------------------------------------------------------------*/
300/*--- Errors and suppressions ---*/
301/*------------------------------------------------------------*/
302
sewardj7ce71662008-05-02 10:33:15 +0000303/* Did we show to the user, any errors for which an uninitialised
304 value origin could have been collected (but wasn't) ? If yes,
305 then, at the end of the run, print a 1 line message advising that a
306 rerun with --track-origins=yes might help. */
sewardj505a8192008-07-18 20:15:46 +0000307extern Bool MC_(any_value_errors);
sewardj7ce71662008-05-02 10:33:15 +0000308
309/* Standard functions for error and suppressions as required by the
310 core/tool iface */
sewardj6b523cd2009-07-15 14:49:40 +0000311Bool MC_(eq_Error) ( VgRes res, Error* e1, Error* e2 );
312void MC_(before_pp_Error) ( Error* err );
313void MC_(pp_Error) ( Error* err );
314UInt MC_(update_Error_extra) ( Error* err );
sewardj7ce71662008-05-02 10:33:15 +0000315
316Bool MC_(is_recognised_suppression) ( Char* name, Supp* su );
317
njn35db56c2009-07-24 07:38:29 +0000318Bool MC_(read_extra_suppression_info) ( Int fd, Char** buf,
319 SizeT* nBuf, Supp *su );
sewardj7ce71662008-05-02 10:33:15 +0000320
321Bool MC_(error_matches_suppression) ( Error* err, Supp* su );
322
323void MC_(print_extra_suppression_info) ( Error* err );
324
325Char* MC_(get_error_name) ( Error* err );
326
327/* Recording of errors */
328void MC_(record_address_error) ( ThreadId tid, Addr a, Int szB,
329 Bool isWrite );
330void MC_(record_cond_error) ( ThreadId tid, UInt otag );
331void MC_(record_value_error) ( ThreadId tid, Int szB, UInt otag );
332void MC_(record_jump_error) ( ThreadId tid, Addr a );
333
334void MC_(record_free_error) ( ThreadId tid, Addr a );
335void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
336void MC_(record_freemismatch_error) ( ThreadId tid, MC_Chunk* mc );
337
338void MC_(record_overlap_error) ( ThreadId tid, Char* function,
339 Addr src, Addr dst, SizeT szB );
njn1dcee092009-02-24 03:07:37 +0000340void MC_(record_core_mem_error) ( ThreadId tid, Char* msg );
sewardj7ce71662008-05-02 10:33:15 +0000341void MC_(record_regparam_error) ( ThreadId tid, Char* msg, UInt otag );
342void MC_(record_memparam_error) ( ThreadId tid, Addr a,
343 Bool isAddrErr, Char* msg, UInt otag );
344void MC_(record_user_error) ( ThreadId tid, Addr a,
345 Bool isAddrErr, UInt otag );
346
347Bool MC_(record_leak_error) ( ThreadId tid,
348 UInt n_this_record,
349 UInt n_total_records,
350 LossRecord* lossRecord,
njn18afe5d2009-08-10 08:25:39 +0000351 Bool print_record,
352 Bool count_error );
sewardj7ce71662008-05-02 10:33:15 +0000353
354/* Is this address in a user-specified "ignored range" ? */
355Bool MC_(in_ignored_range) ( Addr a );
356
357
358/*------------------------------------------------------------*/
359/*--- Client blocks ---*/
360/*------------------------------------------------------------*/
361
362/* Describes a client block. See mc_main.c. An unused block has
363 start == size == 0. */
364typedef
365 struct {
366 Addr start;
367 SizeT size;
368 ExeContext* where;
369 Char* desc;
370 }
371 CGenBlock;
372
373/* Get access to the client block array. */
374void MC_(get_ClientBlock_array)( /*OUT*/CGenBlock** blocks,
375 /*OUT*/UWord* nBlocks );
376
njn718d3b12006-12-16 00:54:12 +0000377
njn1d0825f2006-03-27 11:37:07 +0000378/*------------------------------------------------------------*/
379/*--- Command line options + defaults ---*/
380/*------------------------------------------------------------*/
381
382/* Allow loads from partially-valid addresses? default: YES */
sewardj505a8192008-07-18 20:15:46 +0000383extern Bool MC_(clo_partial_loads_ok);
njn1d0825f2006-03-27 11:37:07 +0000384
385/* Max volume of the freed blocks queue. */
sewardj505a8192008-07-18 20:15:46 +0000386extern Long MC_(clo_freelist_vol);
njn1d0825f2006-03-27 11:37:07 +0000387
388/* Do leak check at exit? default: NO */
sewardj505a8192008-07-18 20:15:46 +0000389extern LeakCheckMode MC_(clo_leak_check);
njn1d0825f2006-03-27 11:37:07 +0000390
391/* How closely should we compare ExeContexts in leak records? default: 2 */
sewardj505a8192008-07-18 20:15:46 +0000392extern VgRes MC_(clo_leak_resolution);
njn1d0825f2006-03-27 11:37:07 +0000393
394/* In leak check, show reachable-but-not-freed blocks? default: NO */
sewardj505a8192008-07-18 20:15:46 +0000395extern Bool MC_(clo_show_reachable);
njn1d0825f2006-03-27 11:37:07 +0000396
397/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
398 * default: NO */
sewardj505a8192008-07-18 20:15:46 +0000399extern Bool MC_(clo_workaround_gcc296_bugs);
njn1d0825f2006-03-27 11:37:07 +0000400
sewardjeb0fa932007-11-30 21:41:40 +0000401/* Fill malloc-d/free-d client blocks with a specific value? -1 if
402 not, else 0x00 .. 0xFF indicating the fill value to use. Can be
403 useful for causing programs with bad heap corruption to fail in
404 more repeatable ways. Note that malloc-filled and free-filled
405 areas are still undefined and noaccess respectively. This merely
406 causes them to contain the specified values. */
sewardj505a8192008-07-18 20:15:46 +0000407extern Int MC_(clo_malloc_fill);
408extern Int MC_(clo_free_fill);
sewardjeb0fa932007-11-30 21:41:40 +0000409
sewardj7cf4e6b2008-05-01 20:24:26 +0000410/* Indicates the level of instrumentation/checking done by Memcheck.
411
412 1 = No undefined value checking, Addrcheck-style behaviour only:
413 only address checking is done. This is faster but finds fewer
414 errors. Note that although Addrcheck had 1 bit per byte
415 overhead vs the old Memcheck's 9 bits per byte, with this mode
416 and compressed V bits, no memory is saved with this mode --
417 it's still 2 bits per byte overhead. This is a little wasteful
418 -- it could be done with 1 bit per byte -- but lets us reuse
419 the many shadow memory access functions. Note that in this
420 mode neither the secondary V bit table nor the origin-tag cache
421 are used.
422
423 2 = Address checking and Undefined value checking are performed,
424 but origins are not tracked. So the origin-tag cache is not
425 used in this mode. This setting is the default and corresponds
426 to the "normal" Memcheck behaviour that has shipped for years.
427
428 3 = Address checking, undefined value checking, and origins for
429 undefined values are tracked.
430
431 The default is 2.
432*/
sewardj505a8192008-07-18 20:15:46 +0000433extern Int MC_(clo_mc_level);
sewardj7cf4e6b2008-05-01 20:24:26 +0000434
njn1d0825f2006-03-27 11:37:07 +0000435
436/*------------------------------------------------------------*/
437/*--- Instrumentation ---*/
njn25e49d8e72002-09-23 09:36:25 +0000438/*------------------------------------------------------------*/
439
njn66fe05a2003-07-22 09:12:33 +0000440/* Functions defined in mc_main.c */
sewardj95448072004-11-22 20:19:51 +0000441
sewardj7cf4e6b2008-05-01 20:24:26 +0000442/* For the fail_w_o functions, the UWord arg is actually the 32-bit
443 origin tag and should really be UInt, but to be simple and safe
444 considering it's called from generated code, just claim it to be a
445 UWord. */
sewardj56adc352008-05-02 11:25:17 +0000446VG_REGPARM(2) void MC_(helperc_value_checkN_fail_w_o) ( HWord, UWord );
447VG_REGPARM(1) void MC_(helperc_value_check8_fail_w_o) ( UWord );
448VG_REGPARM(1) void MC_(helperc_value_check4_fail_w_o) ( UWord );
449VG_REGPARM(1) void MC_(helperc_value_check1_fail_w_o) ( UWord );
450VG_REGPARM(1) void MC_(helperc_value_check0_fail_w_o) ( UWord );
sewardj7cf4e6b2008-05-01 20:24:26 +0000451
452/* And call these ones instead to report an uninitialised value error
453 but with no origin available. */
sewardj56adc352008-05-02 11:25:17 +0000454VG_REGPARM(1) void MC_(helperc_value_checkN_fail_no_o) ( HWord );
455VG_REGPARM(0) void MC_(helperc_value_check8_fail_no_o) ( void );
456VG_REGPARM(0) void MC_(helperc_value_check4_fail_no_o) ( void );
457VG_REGPARM(0) void MC_(helperc_value_check1_fail_no_o) ( void );
458VG_REGPARM(0) void MC_(helperc_value_check0_fail_no_o) ( void );
sewardj7cf4e6b2008-05-01 20:24:26 +0000459
460/* V-bits load/store helpers */
sewardj56adc352008-05-02 11:25:17 +0000461VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
462VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
463VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
464VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
465VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
466VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
467VG_REGPARM(2) void MC_(helperc_STOREV8) ( Addr, UWord );
sewardj95448072004-11-22 20:19:51 +0000468
sewardj56adc352008-05-02 11:25:17 +0000469VG_REGPARM(1) ULong MC_(helperc_LOADV64be) ( Addr );
470VG_REGPARM(1) ULong MC_(helperc_LOADV64le) ( Addr );
471VG_REGPARM(1) UWord MC_(helperc_LOADV32be) ( Addr );
472VG_REGPARM(1) UWord MC_(helperc_LOADV32le) ( Addr );
473VG_REGPARM(1) UWord MC_(helperc_LOADV16be) ( Addr );
474VG_REGPARM(1) UWord MC_(helperc_LOADV16le) ( Addr );
475VG_REGPARM(1) UWord MC_(helperc_LOADV8) ( Addr );
njn25e49d8e72002-09-23 09:36:25 +0000476
sewardj56adc352008-05-02 11:25:17 +0000477void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len,
478 Addr nia );
sewardj7cf4e6b2008-05-01 20:24:26 +0000479
480/* Origin tag load/store helpers */
481VG_REGPARM(2) void MC_(helperc_b_store1) ( Addr a, UWord d32 );
482VG_REGPARM(2) void MC_(helperc_b_store2) ( Addr a, UWord d32 );
483VG_REGPARM(2) void MC_(helperc_b_store4) ( Addr a, UWord d32 );
484VG_REGPARM(2) void MC_(helperc_b_store8) ( Addr a, UWord d32 );
485VG_REGPARM(2) void MC_(helperc_b_store16)( Addr a, UWord d32 );
486VG_REGPARM(1) UWord MC_(helperc_b_load1) ( Addr a );
487VG_REGPARM(1) UWord MC_(helperc_b_load2) ( Addr a );
488VG_REGPARM(1) UWord MC_(helperc_b_load4) ( Addr a );
489VG_REGPARM(1) UWord MC_(helperc_b_load8) ( Addr a );
490VG_REGPARM(1) UWord MC_(helperc_b_load16)( Addr a );
sewardj826ec492005-05-12 18:05:00 +0000491
njn51d827b2005-05-09 01:02:08 +0000492/* Functions defined in mc_translate.c */
sewardj0b9d74a2006-12-24 02:24:11 +0000493IRSB* MC_(instrument) ( VgCallbackClosure* closure,
494 IRSB* bb_in,
sewardj461df9c2006-01-17 02:06:39 +0000495 VexGuestLayout* layout,
496 VexGuestExtents* vge,
sewardj4ba057c2005-10-18 12:04:18 +0000497 IRType gWordTy, IRType hWordTy );
sewardj8d61eb12005-07-08 09:46:53 +0000498
sewardj81651dc2007-08-28 06:05:20 +0000499IRSB* MC_(final_tidy) ( IRSB* );
500
sewardj8d61eb12005-07-08 09:46:53 +0000501#endif /* ndef __MC_INCLUDE_H */
njn25e49d8e72002-09-23 09:36:25 +0000502
503/*--------------------------------------------------------------------*/
nethercote8b76fe52004-11-08 19:20:09 +0000504/*--- end ---*/
njn25e49d8e72002-09-23 09:36:25 +0000505/*--------------------------------------------------------------------*/