blob: bdb60fc47801cd4a658f05d330ae39fb9f68f1df [file] [log] [blame]
sewardjde4a1d02002-03-22 01:27:54 +00001
2/*--------------------------------------------------------------------*/
3/*--- A header file for all parts of Valgrind. ---*/
4/*--- Include no other! ---*/
5/*--- vg_include.h ---*/
6/*--------------------------------------------------------------------*/
7
8/*
9 This file is part of Valgrind, an x86 protected-mode emulator
10 designed for debugging and profiling binaries on x86-Unixes.
11
12 Copyright (C) 2000-2002 Julian Seward
13 jseward@acm.org
sewardjde4a1d02002-03-22 01:27:54 +000014
15 This program is free software; you can redistribute it and/or
16 modify it under the terms of the GNU General Public License as
17 published by the Free Software Foundation; either version 2 of the
18 License, or (at your option) any later version.
19
20 This program is distributed in the hope that it will be useful, but
21 WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
24
25 You should have received a copy of the GNU General Public License
26 along with this program; if not, write to the Free Software
27 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28 02111-1307, USA.
29
30 The GNU General Public License is contained in the file LICENSE.
31*/
32
33#ifndef __VG_INCLUDE_H
34#define __VG_INCLUDE_H
35
36
37#include <stdarg.h> /* ANSI varargs stuff */
38#include <setjmp.h> /* for jmp_buf */
39
40
41/* ---------------------------------------------------------------------
42 Build options and table sizes. You should be able to change these
43 options or sizes, recompile, and still have a working system.
44 ------------------------------------------------------------------ */
45
46#include "vg_constants.h"
47
48
49/* Set to 1 to enable time profiling. Since this uses SIGPROF, we
50 don't want this permanently enabled -- only for profiling
51 builds. */
52#if 0
53# define VG_PROFILE
54#endif
55
56
57/* Total number of integer registers available for allocation. That's
58 all of them except %esp, %edi and %ebp. %edi is a general spare
59 temporary. %ebp permanently points at VG_(baseBlock). Note that
60 it's important that this tie in with what rankToRealRegNo() says.
61 DO NOT CHANGE THIS VALUE FROM 5. ! */
62#define VG_MAX_REALREGS 5
63
64/* Total number of spill slots available for allocation, if a TempReg
65 doesn't make it into a RealReg. Just bomb the entire system if
66 this value is too small; we don't expect it will ever get
67 particularly high. */
68#define VG_MAX_SPILLSLOTS 24
69
70
71/* Constants for the slow translation lookup cache. */
72#define VG_TRANSTAB_SLOW_BITS 11
73#define VG_TRANSTAB_SLOW_SIZE (1 << VG_TRANSTAB_SLOW_BITS)
74#define VG_TRANSTAB_SLOW_MASK ((VG_TRANSTAB_SLOW_SIZE) - 1)
75
76/* Size of a buffer used for creating messages. */
77#define M_VG_MSGBUF 10000
78
79/* Size of a smallish table used to read /proc/self/map entries. */
80#define M_PROCMAP_BUF 20000
81
82/* Max length of pathname to a .so/executable file. */
83#define M_VG_LIBNAMESTR 100
84
85/* Max length of a text fragment used to construct error messages. */
86#define M_VG_ERRTXT 512
87
88/* Max length of the string copied from env var VG_ARGS at startup. */
89#define M_VG_CMDLINE_STRLEN 1000
90
91/* Max number of options for Valgrind which we can handle. */
92#define M_VG_CMDLINE_OPTS 100
93
94/* After this many different unsuppressed errors have been observed,
95 be more conservative about collecting new ones. */
96#define M_VG_COLLECT_ERRORS_SLOWLY_AFTER 50
97
98/* After this many different unsuppressed errors have been observed,
99 stop collecting errors at all, and tell the user their program is
100 evidently a steaming pile of camel dung. */
101#define M_VG_COLLECT_NO_ERRORS_AFTER 500
102
103/* These many bytes below %ESP are considered addressible if we're
104 doing the --workaround-gcc296-bugs hack. */
105#define VG_GCC296_BUG_STACK_SLOP 256
106
107/* The maximum number of calls we're prepared to save in a
108 backtrace. */
109#define VG_DEEPEST_BACKTRACE 50
110
111/* Number of lists in which we keep track of malloc'd but not free'd
112 blocks. Should be prime. */
113#define VG_N_MALLOCLISTS 997
114
115/* Number of lists in which we keep track of ExeContexts. Should be
116 prime. */
117#define VG_N_EC_LISTS /*997*/ 4999
118
sewardj2e93c502002-04-12 11:12:52 +0000119/* Defines the thread-scheduling timeslice, in terms of the number of
120 basic blocks we attempt to run each thread for. Smaller values
121 give finer interleaving but much increased scheduling overheads. */
122#define VG_SCHEDULING_QUANTUM 10000
123
124/* The maximum number of pthreads that we support. This is
125 deliberately not very high since our implementation of some of the
126 scheduler algorithms is surely O(N^2) in the number of threads,
127 since that's simple, at least. And (in practice) we hope that most
128 programs do not need many threads. */
sewardj3b5d8862002-04-20 13:53:23 +0000129#define VG_N_THREADS 20
sewardj2e93c502002-04-12 11:12:52 +0000130
131/* Number of file descriptors that can simultaneously be waited on for
132 I/O to complete. Perhaps this should be the same as VG_N_THREADS
133 (surely a thread can't wait on more than one fd at once?. Who
134 knows.) */
135#define VG_N_WAITING_FDS 10
136
sewardjde4a1d02002-03-22 01:27:54 +0000137
138/* ---------------------------------------------------------------------
139 Basic types
140 ------------------------------------------------------------------ */
141
142typedef unsigned char UChar;
143typedef unsigned short UShort;
144typedef unsigned int UInt;
145typedef unsigned long long int ULong;
146
147typedef signed char Char;
148typedef signed short Short;
149typedef signed int Int;
150typedef signed long long int Long;
151
152typedef unsigned int Addr;
153
154typedef unsigned char Bool;
155#define False ((Bool)0)
156#define True ((Bool)1)
157
158#define mycat_wrk(aaa,bbb) aaa##bbb
159#define mycat(aaa,bbb) mycat_wrk(aaa,bbb)
160
161/* Just pray that gcc's constant folding works properly ... */
162#define BITS(bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0) \
163 ( ((bit7) << 7) | ((bit6) << 6) | ((bit5) << 5) | ((bit4) << 4) \
164 | ((bit3) << 3) | ((bit2) << 2) | ((bit1) << 1) | (bit0))
165
166
167/* ---------------------------------------------------------------------
168 Now the basic types are set up, we can haul in the kernel-interface
169 definitions.
170 ------------------------------------------------------------------ */
171
172#include "./vg_kerneliface.h"
173
174
175/* ---------------------------------------------------------------------
176 Command-line-settable options
177 ------------------------------------------------------------------ */
178
179#define VG_CLO_SMC_NONE 0
180#define VG_CLO_SMC_SOME 1
181#define VG_CLO_SMC_ALL 2
182
183#define VG_CLO_MAX_SFILES 10
184
sewardj97ced732002-03-25 00:07:36 +0000185/* Shall we V-check addrs (they are always A checked too): default: YES */
186extern Bool VG_(clo_check_addrVs);
sewardjde4a1d02002-03-22 01:27:54 +0000187/* Enquire about whether to attach to GDB at errors? default: NO */
188extern Bool VG_(clo_GDB_attach);
189/* Sanity-check level: 0 = none, 1 (default), > 1 = expensive. */
190extern Int VG_(sanity_level);
191/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
192extern Int VG_(clo_verbosity);
193/* Automatically attempt to demangle C++ names? default: YES */
194extern Bool VG_(clo_demangle);
195/* Do leak check at exit? default: NO */
196extern Bool VG_(clo_leak_check);
197/* In leak check, show reachable-but-not-freed blocks? default: NO */
198extern Bool VG_(clo_show_reachable);
199/* How closely should we compare ExeContexts in leak records? default: 2 */
200extern Int VG_(clo_leak_resolution);
201/* Round malloc sizes upwards to integral number of words? default:
202 NO */
203extern Bool VG_(clo_sloppy_malloc);
204/* Allow loads from partially-valid addresses? default: YES */
205extern Bool VG_(clo_partial_loads_ok);
206/* Simulate child processes? default: NO */
207extern Bool VG_(clo_trace_children);
208/* The file id on which we send all messages. default: 2 (stderr). */
209extern Int VG_(clo_logfile_fd);
210/* Max volume of the freed blocks queue. */
211extern Int VG_(clo_freelist_vol);
212/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
213 default: NO */
214extern Bool VG_(clo_workaround_gcc296_bugs);
215
216/* The number of suppression files specified. */
217extern Int VG_(clo_n_suppressions);
218/* The names of the suppression files. */
219extern Char* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
220
221/* Single stepping? default: NO */
222extern Bool VG_(clo_single_step);
223/* Code improvement? default: YES */
224extern Bool VG_(clo_optimise);
225/* Memory-check instrumentation? default: YES */
226extern Bool VG_(clo_instrument);
227/* DEBUG: clean up instrumented code? default: YES */
228extern Bool VG_(clo_cleanup);
sewardjde4a1d02002-03-22 01:27:54 +0000229/* SMC write checks? default: SOME (1,2,4 byte movs to mem) */
230extern Int VG_(clo_smc_check);
231/* DEBUG: print system calls? default: NO */
232extern Bool VG_(clo_trace_syscalls);
233/* DEBUG: print signal details? default: NO */
234extern Bool VG_(clo_trace_signals);
235/* DEBUG: print symtab details? default: NO */
236extern Bool VG_(clo_trace_symtab);
237/* DEBUG: print malloc details? default: NO */
238extern Bool VG_(clo_trace_malloc);
sewardj8937c812002-04-12 20:12:20 +0000239/* DEBUG: print thread scheduling events? default: NO */
240extern Bool VG_(clo_trace_sched);
sewardj45b4b372002-04-16 22:50:32 +0000241/* DEBUG: print pthread (mutex etc) events? default: 0 (none), 1
242 (some), 2 (all) */
243extern Int VG_(clo_trace_pthread_level);
sewardjde4a1d02002-03-22 01:27:54 +0000244/* Stop after this many basic blocks. default: Infinity. */
245extern ULong VG_(clo_stop_after);
246/* Display gory details for the k'th most popular error. default:
247 Infinity. */
248extern Int VG_(clo_dump_error);
249/* Number of parents of a backtrace. Default: 8. */
250extern Int VG_(clo_backtrace_size);
251
252
253/* ---------------------------------------------------------------------
254 Debugging and profiling stuff
255 ------------------------------------------------------------------ */
256
257/* No, really. I _am_ that strange. */
258#define OINK(nnn) VG_(message)(Vg_DebugMsg, "OINK %d",nnn)
259
260/* Tools for building messages from multiple parts. */
261typedef
262 enum { Vg_UserMsg, Vg_DebugMsg, Vg_DebugExtraMsg }
263 VgMsgKind;
264
265extern void VG_(start_msg) ( VgMsgKind kind );
266extern void VG_(add_to_msg) ( Char* format, ... );
267extern void VG_(end_msg) ( void );
268
269/* Send a simple, single-part message. */
270extern void VG_(message) ( VgMsgKind kind, Char* format, ... );
271
272/* Create a logfile into which messages can be dumped. */
273extern void VG_(startup_logging) ( void );
274extern void VG_(shutdown_logging) ( void );
275
276
277/* Profiling stuff */
278#ifdef VG_PROFILE
279
280#define VGP_M_STACK 10
281
282#define VGP_M_CCS 20 /* == the # of elems in VGP_LIST */
283#define VGP_LIST \
284 VGP_PAIR(VgpRun=0, "running"), \
285 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
286 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
287 VGP_PAIR(VgpTranslate, "translate-main"), \
288 VGP_PAIR(VgpToUCode, "to-ucode"), \
289 VGP_PAIR(VgpFromUcode, "from-ucode"), \
290 VGP_PAIR(VgpImprove, "improve"), \
291 VGP_PAIR(VgpInstrument, "instrument"), \
292 VGP_PAIR(VgpCleanup, "cleanup"), \
293 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
294 VGP_PAIR(VgpDoLRU, "do-lru"), \
295 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
296 VGP_PAIR(VgpInitAudit, "init-mem-audit"), \
297 VGP_PAIR(VgpExeContext, "exe-context"), \
298 VGP_PAIR(VgpReadSyms, "read-syms"), \
299 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
300 VGP_PAIR(VgpSARP, "set-addr-range-perms"), \
301 VGP_PAIR(VgpSyscall, "syscall wrapper"), \
302 VGP_PAIR(VgpSpare1, "spare 1"), \
303 VGP_PAIR(VgpSpare2, "spare 2")
304
305#define VGP_PAIR(enumname,str) enumname
306typedef enum { VGP_LIST } VgpCC;
307#undef VGP_PAIR
308
309extern void VGP_(init_profiling) ( void );
310extern void VGP_(done_profiling) ( void );
311extern void VGP_(pushcc) ( VgpCC );
312extern void VGP_(popcc) ( void );
313
314#define VGP_PUSHCC(cc) VGP_(pushcc)(cc)
315#define VGP_POPCC VGP_(popcc)()
316
317#else
318
319#define VGP_PUSHCC(cc) /* */
320#define VGP_POPCC /* */
321
322#endif /* VG_PROFILE */
323
324
325/* ---------------------------------------------------------------------
326 Exports of vg_malloc2.c
327 ------------------------------------------------------------------ */
328
329/* Allocation arenas.
330 SYMTAB is for Valgrind's symbol table storage.
331 CLIENT is for the client's mallocs/frees.
332 DEMANGLE is for the C++ demangler.
333 EXECTXT is for storing ExeContexts.
334 ERRCTXT is for storing ErrContexts.
335 PRIVATE is for Valgrind general stuff.
336 TRANSIENT is for very short-term use. It should be empty
337 in between uses.
338 When adding a new arena, remember also to add it
339 to ensure_mm_init().
340*/
341typedef Int ArenaId;
342
343#define VG_N_ARENAS 7
344
345#define VG_AR_PRIVATE 0 /* :: ArenaId */
346#define VG_AR_SYMTAB 1 /* :: ArenaId */
347#define VG_AR_CLIENT 2 /* :: ArenaId */
348#define VG_AR_DEMANGLE 3 /* :: ArenaId */
349#define VG_AR_EXECTXT 4 /* :: ArenaId */
350#define VG_AR_ERRCTXT 5 /* :: ArenaId */
351#define VG_AR_TRANSIENT 6 /* :: ArenaId */
352
353extern void* VG_(malloc) ( ArenaId arena, Int nbytes );
354extern void VG_(free) ( ArenaId arena, void* ptr );
355extern void* VG_(calloc) ( ArenaId arena, Int nmemb, Int nbytes );
356extern void* VG_(realloc) ( ArenaId arena, void* ptr, Int size );
357extern void* VG_(malloc_aligned) ( ArenaId aid, Int req_alignB,
358 Int req_pszB );
359
360extern void VG_(mallocSanityCheckArena) ( ArenaId arena );
361extern void VG_(mallocSanityCheckAll) ( void );
362
363extern void VG_(show_all_arena_stats) ( void );
364extern Bool VG_(is_empty_arena) ( ArenaId aid );
365
366
367/* The red-zone size for the client. This can be arbitrary, but
368 unfortunately must be set at compile time. */
369#define VG_AR_CLIENT_REDZONE_SZW 4
370
371#define VG_AR_CLIENT_REDZONE_SZB \
372 (VG_AR_CLIENT_REDZONE_SZW * VKI_BYTES_PER_WORD)
373
374
375/* ---------------------------------------------------------------------
sewardj2e93c502002-04-12 11:12:52 +0000376 Exports of vg_clientfuns.c
377 ------------------------------------------------------------------ */
378
379/* This doesn't export code or data that valgrind.so needs to link
380 against. However, the scheduler does need to know the following
381 request codes. A few, publically-visible, request codes are also
382 defined in valgrind.h. */
383
384#define VG_USERREQ__MALLOC 0x2001
385#define VG_USERREQ__BUILTIN_NEW 0x2002
386#define VG_USERREQ__BUILTIN_VEC_NEW 0x2003
387
388#define VG_USERREQ__FREE 0x2004
389#define VG_USERREQ__BUILTIN_DELETE 0x2005
390#define VG_USERREQ__BUILTIN_VEC_DELETE 0x2006
391
392#define VG_USERREQ__CALLOC 0x2007
393#define VG_USERREQ__REALLOC 0x2008
394#define VG_USERREQ__MEMALIGN 0x2009
395
396
397#define VG_USERREQ__PTHREAD_CREATE 0x3001
sewardjbc5b99f2002-04-13 00:08:51 +0000398#define VG_USERREQ__PTHREAD_JOIN 0x3002
399#define VG_USERREQ__PTHREAD_GET_THREADID 0x3003
sewardj3b5d8862002-04-20 13:53:23 +0000400#define VG_USERREQ__PTHREAD_MUTEX_LOCK 0x3004
401#define VG_USERREQ__PTHREAD_MUTEX_UNLOCK 0x3005
402#define VG_USERREQ__PTHREAD_CANCEL 0x3006
403#define VG_USERREQ__PTHREAD_EXIT 0x3007
404#define VG_USERREQ__PTHREAD_COND_WAIT 0x3008
405#define VG_USERREQ__PTHREAD_COND_SIGNAL 0x3009
406#define VG_USERREQ__PTHREAD_COND_BROADCAST 0x300A
sewardj2e93c502002-04-12 11:12:52 +0000407
sewardj45b4b372002-04-16 22:50:32 +0000408/* Cosmetic ... */
409#define VG_USERREQ__GET_PTHREAD_TRACE_LEVEL 0x3101
410
sewardj54cacf02002-04-12 23:24:59 +0000411/*
412In vg_constants.h:
413#define VG_USERREQ__SIGNAL_RETURNS 0x4001
sewardjbc5b99f2002-04-13 00:08:51 +0000414#define VG_USERREQ__PTHREAD_RETURNS 0x4002
415#define VG_USERREQ__SHUTDOWN_VALGRIND 0x4003
sewardj54cacf02002-04-12 23:24:59 +0000416*/
417
418
sewardj2e93c502002-04-12 11:12:52 +0000419/* ---------------------------------------------------------------------
420 Constants pertaining to the simulated CPU state, VG_(baseBlock),
421 which need to go here to avoid ugly circularities.
422 ------------------------------------------------------------------ */
423
424/* How big is the saved FPU state? */
425#define VG_SIZE_OF_FPUSTATE 108
426/* ... and in words ... */
427#define VG_SIZE_OF_FPUSTATE_W ((VG_SIZE_OF_FPUSTATE+3)/4)
428
429
430/* ---------------------------------------------------------------------
431 Exports of vg_scheduler.c
432 ------------------------------------------------------------------ */
433
434/* ThreadIds are simply indices into the vg_threads[] array. */
435typedef
436 UInt
437 ThreadId;
438
sewardj6072c362002-04-19 14:40:57 +0000439/* Special magic value for an invalid ThreadId. It corresponds to
440 LinuxThreads using zero as the initial value for
441 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
442#define VG_INVALID_THREADID ((ThreadId)(0))
sewardj2e93c502002-04-12 11:12:52 +0000443
444typedef
445 enum {
446 VgTs_Empty, /* this slot is not in use */
447 VgTs_Runnable, /* waiting to be scheduled */
448 VgTs_WaitJoiner, /* waiting for someone to do join on me */
449 VgTs_WaitJoinee, /* waiting for the thread I did join on */
450 VgTs_WaitFD, /* waiting for I/O completion on a fd */
451 VgTs_WaitMX, /* waiting on a mutex */
sewardj3b5d8862002-04-20 13:53:23 +0000452 VgTs_WaitCV, /* waiting on a condition variable */
sewardj2e93c502002-04-12 11:12:52 +0000453 VgTs_Sleeping /* sleeping for a while */
454 }
455 ThreadStatus;
456
457typedef
458 struct {
sewardj6072c362002-04-19 14:40:57 +0000459 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
460 The thread identity is simply the index in vg_threads[].
461 ThreadId == 1 is the root thread and has the special property
sewardj1e8cdc92002-04-18 11:37:52 +0000462 that we don't try and allocate or deallocate its stack. For
463 convenience of generating error message, we also put the
464 ThreadId in this tid field, but be aware that it should
sewardj604ec3c2002-04-18 22:38:41 +0000465 ALWAYS == the index in vg_threads[]. */
sewardj1e8cdc92002-04-18 11:37:52 +0000466 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000467
468 /* Current scheduling status. */
469 ThreadStatus status;
470
471 /* Identity of joiner (thread who called join on me), or
472 VG_INVALID_THREADID if no one asked to join yet. */
473 ThreadId joiner;
474
sewardj3b5d8862002-04-20 13:53:23 +0000475 /* When .status == WaitMX, points to the mutex I am waiting for.
476 When .status == WaitCV, points to the mutex associated with
477 the condition variable indicated by the .associated_cv field.
478 In all other cases, should be NULL. */
479 void* /* pthread_mutex_t* */ associated_mx;
480
481 /* When .status == WaitCV, points to the condition variable I am
482 waiting for. In all other cases, should be NULL. */
483 void* /* pthread_cond_t* */ associated_cv;
sewardj2e93c502002-04-12 11:12:52 +0000484
485 /* If VgTs_Sleeping, this is when we should wake up. */
486 ULong awaken_at;
487
488 /* return value */
489 void* retval;
490
491 /* Stacks. When a thread slot is freed, we don't deallocate its
492 stack; we just leave it lying around for the next use of the
493 slot. If the next use of the slot requires a larger stack,
494 only then is the old one deallocated and a new one
495 allocated.
496
497 For the main thread (threadid == 0), this mechanism doesn't
498 apply. We don't know the size of the stack since we didn't
499 allocate it, and furthermore we never reallocate it. */
500
501 /* The allocated size of this thread's stack (permanently zero
502 if this is ThreadId == 0, since we didn't allocate its stack) */
503 UInt stack_size;
504
505 /* Address of the lowest word in this thread's stack. NULL means
506 not allocated yet.
507 */
508 Addr stack_base;
509
sewardj1e8cdc92002-04-18 11:37:52 +0000510 /* Address of the highest legitimate word in this stack. This is
511 used for error messages only -- not critical for execution
512 correctness. Is is set for all stacks, specifically including
513 ThreadId == 0 (the main thread). */
514 Addr stack_highest_word;
515
sewardj2e93c502002-04-12 11:12:52 +0000516 /* Saved machine context. */
517 UInt m_eax;
518 UInt m_ebx;
519 UInt m_ecx;
520 UInt m_edx;
521 UInt m_esi;
522 UInt m_edi;
523 UInt m_ebp;
524 UInt m_esp;
525 UInt m_eflags;
526 UInt m_eip;
527 UInt m_fpu[VG_SIZE_OF_FPUSTATE_W];
528
529 UInt sh_eax;
530 UInt sh_ebx;
531 UInt sh_ecx;
532 UInt sh_edx;
533 UInt sh_esi;
534 UInt sh_edi;
535 UInt sh_ebp;
536 UInt sh_esp;
537 UInt sh_eflags;
538 }
539 ThreadState;
540
541
542/* Copy the specified thread's state into VG_(baseBlock) in
543 preparation for running it. */
544extern void VG_(load_thread_state)( ThreadId );
545
546/* Save the specified thread's state back in VG_(baseBlock), and fill
547 VG_(baseBlock) with junk, for sanity-check reasons. */
548extern void VG_(save_thread_state)( ThreadId );
549
550/* Get the thread state block for the specified thread. */
551extern ThreadState* VG_(get_thread_state)( ThreadId );
552
sewardj1e8cdc92002-04-18 11:37:52 +0000553/* And for the currently running one, if valid. */
554extern ThreadState* VG_(get_current_thread_state) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000555
sewardj1e8cdc92002-04-18 11:37:52 +0000556/* Similarly ... */
557extern ThreadId VG_(get_current_tid) ( void );
558
559/* Which thread is this address in the stack of, if any? Used for
560 error message generation. */
561extern ThreadId VG_(identify_stack_addr)( Addr a );
562
sewardj2e93c502002-04-12 11:12:52 +0000563
564/* Return codes from the scheduler. */
565typedef
566 enum { VgSrc_Deadlock, VgSrc_Shutdown, VgSrc_BbsDone }
567 VgSchedReturnCode;
568
569/* The scheduler. */
570extern VgSchedReturnCode VG_(scheduler) ( void );
571
572extern void VG_(scheduler_init) ( void );
573
sewardj15a43e12002-04-17 19:35:12 +0000574extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000575
576/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
577extern jmp_buf VG_(scheduler_jmpbuf);
578/* ... and if so, here's the signal which caused it to do so. */
579extern Int VG_(longjmpd_on_signal);
580
581
582/* We check that the initial stack, which we can't move, is allocated
583 here. VG_(scheduler_init) checks this.
584*/
585#define VG_STARTUP_STACK_MASK (Addr)0xBFFF8000
586
587
588/* The red-zone size which we put at the bottom (highest address) of
589 thread stacks, for paranoia reasons. This can be arbitrary, and
590 doesn't really need to be set at compile time. */
591#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
592
593#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
594 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
595
596
597
598/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000599 Exports of vg_signals.c
600 ------------------------------------------------------------------ */
601
sewardjde4a1d02002-03-22 01:27:54 +0000602extern void VG_(sigstartup_actions) ( void );
603
sewardj2e93c502002-04-12 11:12:52 +0000604extern void VG_(deliver_signals) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000605extern void VG_(unblock_host_signal) ( Int sigNo );
606
607
608/* Fake system calls for signal handling. */
sewardj2e93c502002-04-12 11:12:52 +0000609extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +0000610extern void VG_(do__NR_sigprocmask) ( Int how, vki_ksigset_t* set );
611
sewardj2e93c502002-04-12 11:12:52 +0000612/* Modify the current thread's state once we have detected it is
613 returning from a signal handler. */
sewardj77e466c2002-04-14 02:29:29 +0000614extern Bool VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000615
sewardj2e93c502002-04-12 11:12:52 +0000616/* Handy utilities to block/restore all host signals. */
617extern void VG_(block_all_host_signals)
618 ( /* OUT */ vki_ksigset_t* saved_mask );
619extern void VG_(restore_host_signals)
620 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000621
622/* ---------------------------------------------------------------------
623 Exports of vg_mylibc.c
624 ------------------------------------------------------------------ */
625
626
627#define NULL ((void*)0)
628
629extern void VG_(exit)( Int status )
630 __attribute__ ((__noreturn__));
631
632extern void VG_(printf) ( const char *format, ... );
633/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
634
635extern void VG_(sprintf) ( Char* buf, Char *format, ... );
636
637extern void VG_(vprintf) ( void(*send)(Char),
638 const Char *format, va_list vargs );
639
640extern Bool VG_(isspace) ( Char c );
641
642extern Int VG_(strlen) ( const Char* str );
643
644extern Long VG_(atoll) ( Char* str );
645
646extern Char* VG_(strcat) ( Char* dest, const Char* src );
647extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
648extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
649
650extern Char* VG_(strcpy) ( Char* dest, const Char* src );
651
652extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
653extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
654
655extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
656extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
657
658extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
659extern Char* VG_(strchr) ( const Char* s, Char c );
660extern Char* VG_(strdup) ( ArenaId aid, const Char* s);
661
662extern Char* VG_(getenv) ( Char* name );
663extern Int VG_(getpid) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000664extern ULong VG_(read_microsecond_timer)( void );
sewardjde4a1d02002-03-22 01:27:54 +0000665
666
667extern Char VG_(toupper) ( Char c );
668
669extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
670
671extern void VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
672
673extern Bool VG_(stringMatch) ( Char* pat, Char* str );
674
675
676#define __STRING(x) #x
677
678/* Asserts are permanently enabled. Hurrah! */
679#define vg_assert(expr) \
680 ((void) ((expr) ? 0 : \
681 (VG_(assert_fail) (__STRING(expr), \
682 __FILE__, __LINE__, \
683 __PRETTY_FUNCTION__), 0)))
684
685extern void VG_(assert_fail) ( Char* expr, Char* file,
686 Int line, Char* fn )
687 __attribute__ ((__noreturn__));
688
sewardjde4a1d02002-03-22 01:27:54 +0000689/* Reading files. */
690extern Int VG_(open_read) ( Char* pathname );
691extern void VG_(close) ( Int fd );
692extern Int VG_(read) ( Int fd, void* buf, Int count);
693extern Int VG_(write) ( Int fd, void* buf, Int count);
694
sewardj2e93c502002-04-12 11:12:52 +0000695extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
696
697extern Int VG_(select)( Int n,
698 vki_fd_set* readfds,
699 vki_fd_set* writefds,
700 vki_fd_set* exceptfds,
701 struct vki_timeval * timeout );
702extern Int VG_(nanosleep)( const struct vki_timespec *req,
703 struct vki_timespec *rem );
704
705
sewardjde4a1d02002-03-22 01:27:54 +0000706/* mmap-ery ... */
707extern void* VG_(mmap)( void* start, UInt length,
708 UInt prot, UInt flags, UInt fd, UInt offset );
709
sewardj2e93c502002-04-12 11:12:52 +0000710extern Int VG_(munmap)( void* start, Int length );
sewardjde4a1d02002-03-22 01:27:54 +0000711
712
713/* Print a (panic) message, and abort. */
714extern void VG_(panic) ( Char* str )
715 __attribute__ ((__noreturn__));
716
717/* Get memory by anonymous mmap. */
718void* VG_(get_memory_from_mmap) ( Int nBytes );
719
720/* Signal stuff. Note that these use the vk_ (kernel) structure
721 definitions, which are different in places from those that glibc
722 defines. Since we're operating right at the kernel interface,
723 glibc's view of the world is entirely irrelevant. */
724extern Int VG_(ksigfillset)( vki_ksigset_t* set );
725extern Int VG_(ksigemptyset)( vki_ksigset_t* set );
726extern Int VG_(ksigaddset)( vki_ksigset_t* set, Int signum );
727
728extern Int VG_(ksigprocmask)( Int how, const vki_ksigset_t* set,
729 vki_ksigset_t* oldset );
730extern Int VG_(ksigaction) ( Int signum,
731 const vki_ksigaction* act,
732 vki_ksigaction* oldact );
733extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
734
735extern Int VG_(ksignal)(Int signum, void (*sighandler)(Int));
736
737extern Int VG_(ksigaltstack)( const vki_kstack_t* ss, vki_kstack_t* oss );
738
739
740
741/* ---------------------------------------------------------------------
742 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
743 vg_from_ucode.c).
744 ------------------------------------------------------------------ */
745
746/* Tags which describe what operands are. */
747typedef
748 enum { TempReg=0, ArchReg=1, RealReg=2,
749 SpillNo=3, Literal=4, Lit16=5,
750 NoValue=6 }
751 Tag;
752
753
754/* Microinstruction opcodes. */
755typedef
756 enum {
757 NOP,
758 GET,
759 PUT,
760 LOAD,
761 STORE,
762 MOV,
763 CMOV, /* Used for cmpxchg and cmov */
764 WIDEN,
765 JMP,
766
767 /* Read/write the %EFLAGS register into a TempReg. */
768 GETF, PUTF,
769
770 ADD, ADC, AND, OR, XOR, SUB, SBB,
771 SHL, SHR, SAR, ROL, ROR, RCL, RCR,
772 NOT, NEG, INC, DEC, BSWAP,
773 CC2VAL,
774
775 /* Not strictly needed, but useful for making better
776 translations of address calculations. */
777 LEA1, /* reg2 := const + reg1 */
778 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
779
780 /* not for translating x86 calls -- only to call helpers */
781 CALLM_S, CALLM_E, /* Mark start and end of push/pop sequences
782 for CALLM. */
783 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers. */
784 CALLM, /* call to a machine-code helper */
785
786 /* Hack for translating string (REP-) insns. Jump to literal if
787 TempReg/RealReg is zero. */
788 JIFZ,
789
790 /* FPU ops which read/write mem or don't touch mem at all. */
791 FPU_R,
792 FPU_W,
793 FPU,
794
795 /* Advance the simulated %eip by some small (< 128) number. */
796 INCEIP,
797
798 /* uinstrs which are not needed for mere translation of x86 code,
799 only for instrumentation of it. */
800 LOADV,
801 STOREV,
802 GETV,
803 PUTV,
804 TESTV,
805 SETV,
806 /* Get/set the v-bit (and it is only one bit) for the simulated
807 %eflags register. */
808 GETVF,
809 PUTVF,
810
811 /* Do a unary or binary tag op. Only for post-instrumented
812 code. For TAG1, first and only arg is a TempReg, and is both
813 arg and result reg. For TAG2, first arg is src, second is
814 dst, in the normal way; both are TempRegs. In both cases,
815 3rd arg is a RiCHelper with a Lit16 tag. This indicates
816 which tag op to do. */
817 TAG1,
818 TAG2
819 }
820 Opcode;
821
822
823/* Condition codes, observing the Intel encoding. CondAlways is an
824 extra. */
825typedef
826 enum {
827 CondO = 0, /* overflow */
828 CondNO = 1, /* no overflow */
829 CondB = 2, /* below */
830 CondNB = 3, /* not below */
831 CondZ = 4, /* zero */
832 CondNZ = 5, /* not zero */
833 CondBE = 6, /* below or equal */
834 CondNBE = 7, /* not below or equal */
835 CondS = 8, /* negative */
836 ConsNS = 9, /* not negative */
837 CondP = 10, /* parity even */
838 CondNP = 11, /* not parity even */
839 CondL = 12, /* jump less */
840 CondNL = 13, /* not less */
841 CondLE = 14, /* less or equal */
842 CondNLE = 15, /* not less or equal */
843 CondAlways = 16 /* Jump always */
844 }
845 Condcode;
846
847
sewardj2e93c502002-04-12 11:12:52 +0000848/* Descriptions of additional properties of *unconditional* jumps. */
849typedef
850 enum {
851 JmpBoring=0, /* boring unconditional jump */
852 JmpCall=1, /* jump due to an x86 call insn */
853 JmpRet=2, /* jump due to an x86 ret insn */
854 JmpSyscall=3, /* do a system call, then jump */
855 JmpClientReq=4 /* do a client request, then jump */
856 }
857 JmpKind;
858
859
sewardjde4a1d02002-03-22 01:27:54 +0000860/* Flags. User-level code can only read/write O(verflow), S(ign),
861 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
862 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
863 thusly:
864 76543210
865 DOSZACP
866 and bit 7 must always be zero since it is unused.
867*/
868typedef UChar FlagSet;
869
870#define FlagD (1<<6)
871#define FlagO (1<<5)
872#define FlagS (1<<4)
873#define FlagZ (1<<3)
874#define FlagA (1<<2)
875#define FlagC (1<<1)
876#define FlagP (1<<0)
877
878#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
879#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
880#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
881#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
882#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
883#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
sewardj4a7456e2002-03-24 13:52:19 +0000884#define FlagsZCP ( FlagZ | FlagC | FlagP)
sewardjde4a1d02002-03-22 01:27:54 +0000885#define FlagsOC (FlagO | FlagC )
sewardj4d0ab1f2002-03-24 10:00:09 +0000886#define FlagsAC ( FlagA | FlagC )
sewardjde4a1d02002-03-22 01:27:54 +0000887
888#define FlagsALL (FlagsOSZACP | FlagD)
889#define FlagsEmpty (FlagSet)0
890
891#define VG_IS_FLAG_SUBSET(set1,set2) \
892 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
893
894#define VG_UNION_FLAG_SETS(set1,set2) \
895 ( ((FlagSet)set1) | ((FlagSet)set2) )
896
897
898
899/* A Micro (u)-instruction. */
900typedef
901 struct {
902 /* word 1 */
903 UInt lit32; /* 32-bit literal */
904
905 /* word 2 */
906 UShort val1; /* first operand */
907 UShort val2; /* second operand */
908
909 /* word 3 */
910 UShort val3; /* third operand */
911 UChar opcode; /* opcode */
912 UChar size; /* data transfer size */
913
914 /* word 4 */
915 FlagSet flags_r; /* :: FlagSet */
916 FlagSet flags_w; /* :: FlagSet */
917 UChar tag1:4; /* first operand tag */
918 UChar tag2:4; /* second operand tag */
919 UChar tag3:4; /* third operand tag */
920 UChar extra4b:4; /* Spare field, used by WIDEN for src
921 -size, and by LEA2 for scale
922 (1,2,4 or 8) */
923
924 /* word 5 */
925 UChar cond; /* condition, for jumps */
926 Bool smc_check:1; /* do a smc test, if writes memory. */
927 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
sewardj2e93c502002-04-12 11:12:52 +0000928 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
sewardjde4a1d02002-03-22 01:27:54 +0000929 }
930 UInstr;
931
932
933/* Expandable arrays of uinstrs. */
934typedef
935 struct {
936 Int used;
937 Int size;
938 UInstr* instrs;
939 Int nextTemp;
940 }
941 UCodeBlock;
942
943/* Refer to `the last instruction stuffed in', including as an
944 lvalue. */
945#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
946
947/* An invalid temporary number :-) */
948#define INVALID_TEMPREG 999999999
949
950
951/* ---------------------------------------------------------------------
952 Exports of vg_demangle.c
953 ------------------------------------------------------------------ */
954
955extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
956
957
958/* ---------------------------------------------------------------------
959 Exports of vg_from_ucode.c
960 ------------------------------------------------------------------ */
961
962extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes );
963
964
965/* ---------------------------------------------------------------------
966 Exports of vg_to_ucode.c
967 ------------------------------------------------------------------ */
968
969extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
970extern Char* VG_(nameOfIntReg) ( Int size, Int reg );
971extern Char VG_(nameOfIntSize) ( Int size );
972extern UInt VG_(extend_s_8to32) ( UInt x );
973extern Int VG_(getNewTemp) ( UCodeBlock* cb );
974extern Int VG_(getNewShadow) ( UCodeBlock* cb );
975
976#define SHADOW(tempreg) ((tempreg)+1)
977
978
979/* ---------------------------------------------------------------------
980 Exports of vg_translate.c
981 ------------------------------------------------------------------ */
982
sewardj1e8cdc92002-04-18 11:37:52 +0000983extern void VG_(translate) ( ThreadState* tst,
984 Addr orig_addr,
sewardjde4a1d02002-03-22 01:27:54 +0000985 UInt* orig_size,
986 Addr* trans_addr,
987 UInt* trans_size );
988
989extern void VG_(emptyUInstr) ( UInstr* u );
990extern void VG_(newUInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
991extern void VG_(newUInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
992 Tag tag1, UInt val1 );
993extern void VG_(newUInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
994 Tag tag1, UInt val1,
995 Tag tag2, UInt val2 );
996extern void VG_(newUInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
997 Tag tag1, UInt val1,
998 Tag tag2, UInt val2,
999 Tag tag3, UInt val3 );
1000extern void VG_(setFlagRW) ( UInstr* u,
1001 FlagSet fr, FlagSet fw );
1002
1003extern void VG_(setLiteralField) ( UCodeBlock* cb, UInt lit32 );
1004extern Bool VG_(anyFlagUse) ( UInstr* u );
1005
1006
1007
1008extern void VG_(ppUInstr) ( Int instrNo, UInstr* u );
1009extern void VG_(ppUCodeBlock) ( UCodeBlock* cb, Char* title );
1010
1011extern Char* VG_(nameCondcode) ( Condcode cond );
1012extern Bool VG_(saneUInstr) ( Bool beforeRA, UInstr* u );
1013extern Bool VG_(saneUCodeBlock) ( UCodeBlock* cb );
1014extern Char* VG_(nameUOpcode) ( Bool upper, Opcode opc );
1015extern Int VG_(rankToRealRegNo) ( Int rank );
1016
1017extern void* VG_(jitmalloc) ( Int nbytes );
1018extern void VG_(jitfree) ( void* ptr );
1019
1020
1021/* ---------------------------------------------------------------------
1022 Exports of vg_execontext.c.
1023 ------------------------------------------------------------------ */
1024
1025/* Records the PC and a bit of the call chain. The first 4 %eip
1026 values are used in comparisons do remove duplicate errors, and for
1027 comparing against suppression specifications. The rest are purely
1028 informational (but often important). */
1029
1030typedef
1031 struct _ExeContextRec {
1032 struct _ExeContextRec * next;
1033 /* The size of this array is VG_(clo_backtrace_size); at least
1034 2, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
1035 [1] is its caller, [2] is the caller of [1], etc. */
1036 Addr eips[0];
1037 }
1038 ExeContext;
1039
1040
1041/* Initialise the ExeContext storage mechanism. */
1042extern void VG_(init_ExeContext_storage) ( void );
1043
1044/* Print stats (informational only). */
1045extern void VG_(show_ExeContext_stats) ( void );
1046
1047
1048/* Take a snapshot of the client's stack. Search our collection of
1049 ExeContexts to see if we already have it, and if not, allocate a
1050 new one. Either way, return a pointer to the context. */
sewardj8c824512002-04-14 04:16:48 +00001051extern ExeContext* VG_(get_ExeContext) ( Bool skip_top_frame,
1052 Addr eip, Addr ebp );
sewardjde4a1d02002-03-22 01:27:54 +00001053
1054/* Print an ExeContext. */
1055extern void VG_(pp_ExeContext) ( ExeContext* );
1056
1057/* Compare two ExeContexts, just comparing the top two callers. */
1058extern Bool VG_(eq_ExeContext_top2) ( ExeContext* e1, ExeContext* e2 );
1059
1060/* Compare two ExeContexts, just comparing the top four callers. */
1061extern Bool VG_(eq_ExeContext_top4) ( ExeContext* e1, ExeContext* e2 );
1062
1063/* Compare two ExeContexts, comparing all callers. */
1064extern Bool VG_(eq_ExeContext_all) ( ExeContext* e1, ExeContext* e2 );
1065
1066
1067
1068/* ---------------------------------------------------------------------
1069 Exports of vg_errcontext.c.
1070 ------------------------------------------------------------------ */
1071
1072extern void VG_(load_suppressions) ( void );
1073extern void VG_(show_all_errors) ( void );
1074extern void VG_(record_value_error) ( Int size );
sewardjaabd5ad2002-04-19 15:43:37 +00001075extern void VG_(record_free_error) ( ThreadState* tst, Addr a );
1076extern void VG_(record_freemismatch_error) ( ThreadState* tst, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +00001077extern void VG_(record_address_error) ( Addr a, Int size,
1078 Bool isWrite );
sewardj1e8cdc92002-04-18 11:37:52 +00001079
1080extern void VG_(record_jump_error) ( ThreadState* tst, Addr a );
sewardj8c824512002-04-14 04:16:48 +00001081
1082extern void VG_(record_param_err) ( ThreadState* tst,
1083 Addr a,
sewardjde4a1d02002-03-22 01:27:54 +00001084 Bool isWriteLack,
1085 Char* msg );
sewardj8c824512002-04-14 04:16:48 +00001086extern void VG_(record_user_err) ( ThreadState* tst,
1087 Addr a, Bool isWriteLack );
sewardjde4a1d02002-03-22 01:27:54 +00001088
1089
1090/* The classification of a faulting address. */
1091typedef
1092 enum { Stack, Unknown, Freed, Mallocd, UserG, UserS }
1093 AddrKind;
1094
1095/* Records info about a faulting address. */
1096typedef
1097 struct {
1098 /* ALL */
1099 AddrKind akind;
1100 /* Freed, Mallocd */
1101 Int blksize;
1102 /* Freed, Mallocd */
1103 Int rwoffset;
1104 /* Freed, Mallocd */
1105 ExeContext* lastchange;
sewardj1e8cdc92002-04-18 11:37:52 +00001106 /* Stack */
1107 ThreadId stack_tid;
sewardjde4a1d02002-03-22 01:27:54 +00001108 }
1109 AddrInfo;
1110
1111
1112/* ---------------------------------------------------------------------
1113 Exports of vg_clientperms.c
1114 ------------------------------------------------------------------ */
1115
1116extern Bool VG_(client_perm_maybe_describe)( Addr a, AddrInfo* ai );
1117
sewardj8c824512002-04-14 04:16:48 +00001118extern UInt VG_(handle_client_request) ( ThreadState* tst, UInt* arg_block );
sewardjde4a1d02002-03-22 01:27:54 +00001119
1120extern void VG_(delete_client_stack_blocks_following_ESP_change) ( void );
1121
1122extern void VG_(show_client_block_stats) ( void );
1123
1124
1125/* ---------------------------------------------------------------------
1126 Exports of vg_procselfmaps.c
1127 ------------------------------------------------------------------ */
1128
1129extern
1130void VG_(read_procselfmaps) (
1131 void (*record_mapping)( Addr, UInt, Char, Char, Char, UInt, UChar* )
1132);
1133
1134
1135/* ---------------------------------------------------------------------
1136 Exports of vg_symtab2.c
1137 ------------------------------------------------------------------ */
1138
1139/* We assume the executable is loaded here ... can't really find
1140 out. There is a hacky sanity check in vg_init_memory_audit()
1141 which should trip up most stupidities.
1142*/
1143#define VG_ASSUMED_EXE_BASE (Addr)0x8048000
1144
1145extern void VG_(read_symbols) ( void );
1146extern void VG_(mini_stack_dump) ( ExeContext* ec );
1147extern void VG_(what_obj_and_fun_is_this)
1148 ( Addr a,
1149 Char* obj_buf, Int n_obj_buf,
1150 Char* fun_buf, Int n_fun_buf );
1151
1152extern void VG_(symtab_notify_munmap) ( Addr start, UInt length );
1153
1154
1155/* ---------------------------------------------------------------------
1156 Exports of vg_clientmalloc.c
1157 ------------------------------------------------------------------ */
1158
sewardjde4a1d02002-03-22 01:27:54 +00001159typedef
1160 enum {
1161 Vg_AllocMalloc = 0,
sewardj2e93c502002-04-12 11:12:52 +00001162 Vg_AllocNew = 1,
sewardjde4a1d02002-03-22 01:27:54 +00001163 Vg_AllocNewVec = 2
1164 }
1165 VgAllocKind;
1166
1167/* Description of a malloc'd chunk. */
1168typedef
1169 struct _ShadowChunk {
1170 struct _ShadowChunk* next;
1171 ExeContext* where; /* where malloc'd/free'd */
1172 UInt size : 30; /* size requested. */
1173 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1174 Addr data; /* ptr to actual block. */
1175 }
1176 ShadowChunk;
1177
1178extern void VG_(clientmalloc_done) ( void );
1179extern void VG_(describe_addr) ( Addr a, AddrInfo* ai );
1180extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1181
sewardj2e93c502002-04-12 11:12:52 +00001182/* These are called from the scheduler, when it intercepts a user
1183 request. */
sewardj8c824512002-04-14 04:16:48 +00001184extern void* VG_(client_malloc) ( ThreadState* tst,
1185 UInt size, VgAllocKind kind );
1186extern void* VG_(client_memalign) ( ThreadState* tst,
1187 UInt align, UInt size );
1188extern void VG_(client_free) ( ThreadState* tst,
1189 void* ptrV, VgAllocKind kind );
1190extern void* VG_(client_calloc) ( ThreadState* tst,
1191 UInt nmemb, UInt size1 );
1192extern void* VG_(client_realloc) ( ThreadState* tst,
1193 void* ptrV, UInt size_new );
sewardjde4a1d02002-03-22 01:27:54 +00001194
1195
1196/* ---------------------------------------------------------------------
1197 Exports of vg_main.c
1198 ------------------------------------------------------------------ */
1199
sewardjde4a1d02002-03-22 01:27:54 +00001200/* A structure used as an intermediary when passing the simulated
1201 CPU's state to some assembly fragments, particularly system calls.
1202 Stuff is copied from baseBlock to here, the assembly magic runs,
1203 and then the inverse copy is done. */
1204
1205extern UInt VG_(m_state_static) [8 /* int regs, in Intel order */
1206 + 1 /* %eflags */
1207 + 1 /* %eip */
1208 + VG_SIZE_OF_FPUSTATE_W /* FPU state */
1209 ];
1210
1211/* Handy fns for doing the copy back and forth. */
1212extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1213extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1214
sewardjde4a1d02002-03-22 01:27:54 +00001215/* Called when some unhandleable client behaviour is detected.
1216 Prints a msg and aborts. */
1217extern void VG_(unimplemented) ( Char* msg );
1218
1219/* The stack on which Valgrind runs. We can't use the same stack as the
1220 simulatee -- that's an important design decision. */
1221extern UInt VG_(stack)[10000];
1222
1223/* Similarly, we have to ask for signals to be delivered on an
1224 alternative stack, since it is possible, although unlikely, that
1225 we'll have to run client code from inside the Valgrind-installed
1226 signal handler. If this happens it will be done by
1227 vg_deliver_signal_immediately(). */
1228extern UInt VG_(sigstack)[10000];
1229
sewardjde4a1d02002-03-22 01:27:54 +00001230/* Holds client's %esp at the point we gained control. From this the
1231 client's argc, argv and envp are deduced. */
1232extern Addr VG_(esp_at_startup);
1233extern Int VG_(client_argc);
1234extern Char** VG_(client_argv);
1235extern Char** VG_(client_envp);
1236
1237/* Remove valgrind.so from a LD_PRELOAD=... string so child processes
1238 don't get traced into. */
1239extern void VG_(mash_LD_PRELOAD_string)( Char* ld_preload_str );
1240
1241/* Something of a function looking for a home ... start up GDB. This
1242 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1243 *client's* stack. This is necessary to give GDB the illusion that
1244 the client program really was running on the real cpu. */
1245extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1246
1247/* Spew out vast amounts of junk during JITting? */
1248extern Bool VG_(disassemble);
1249
1250/* 64-bit counter for the number of basic blocks done. */
1251extern ULong VG_(bbs_done);
1252/* 64-bit counter for the number of bbs to go before a debug exit. */
1253extern ULong VG_(bbs_to_go);
1254
1255/* Counts downwards in vg_run_innerloop. */
1256extern UInt VG_(dispatch_ctr);
1257
sewardjde4a1d02002-03-22 01:27:54 +00001258/* Is the client running on the simulated CPU or the real one? */
1259extern Bool VG_(running_on_simd_CPU); /* Initially False */
1260
1261/* The current LRU epoch. */
1262extern UInt VG_(current_epoch);
1263
1264
1265/* --- Counters, for informational purposes only. --- */
1266
1267/* Number of lookups which miss the fast tt helper. */
1268extern UInt VG_(tt_fast_misses);
1269
1270/* Counts for LRU informational messages. */
1271
1272/* Number and total o/t size of new translations this epoch. */
1273extern UInt VG_(this_epoch_in_count);
1274extern UInt VG_(this_epoch_in_osize);
1275extern UInt VG_(this_epoch_in_tsize);
1276/* Number and total o/t size of discarded translations this epoch. */
1277extern UInt VG_(this_epoch_out_count);
1278extern UInt VG_(this_epoch_out_osize);
1279extern UInt VG_(this_epoch_out_tsize);
1280/* Number and total o/t size of translations overall. */
1281extern UInt VG_(overall_in_count);
1282extern UInt VG_(overall_in_osize);
1283extern UInt VG_(overall_in_tsize);
1284/* Number and total o/t size of discards overall. */
1285extern UInt VG_(overall_out_count);
1286extern UInt VG_(overall_out_osize);
1287extern UInt VG_(overall_out_tsize);
1288
1289/* The number of LRU-clearings of TT/TC. */
1290extern UInt VG_(number_of_lrus);
1291
1292/* Counts pertaining to the register allocator. */
1293
1294/* total number of uinstrs input to reg-alloc */
1295extern UInt VG_(uinstrs_prealloc);
1296
1297/* total number of uinstrs added due to spill code */
1298extern UInt VG_(uinstrs_spill);
1299
1300/* number of bbs requiring spill code */
1301extern UInt VG_(translations_needing_spill);
1302
1303/* total of register ranks over all translations */
1304extern UInt VG_(total_reg_rank);
1305
1306/* Counts pertaining to the self-modifying-code detection machinery. */
1307
1308/* Total number of writes checked. */
1309//extern UInt VG_(smc_total_check4s);
1310
1311/* Number of writes which the fast smc check couldn't show were
1312 harmless. */
1313extern UInt VG_(smc_cache_passed);
1314
1315/* Numnber of writes which really did write on original code. */
1316extern UInt VG_(smc_fancy_passed);
1317
1318/* Number of translations discarded as a result. */
1319//extern UInt VG_(smc_discard_count);
1320
1321/* Counts pertaining to internal sanity checking. */
1322extern UInt VG_(sanity_fast_count);
1323extern UInt VG_(sanity_slow_count);
1324
sewardj2e93c502002-04-12 11:12:52 +00001325/* Counts pertaining to the scheduler. */
1326extern UInt VG_(num_scheduling_events_MINOR);
1327extern UInt VG_(num_scheduling_events_MAJOR);
1328
sewardjde4a1d02002-03-22 01:27:54 +00001329
1330/* ---------------------------------------------------------------------
1331 Exports of vg_memory.c
1332 ------------------------------------------------------------------ */
1333
1334extern void VGM_(init_memory_audit) ( void );
1335extern Addr VGM_(curr_dataseg_end);
1336extern void VG_(show_reg_tags) ( void );
1337extern void VG_(detect_memory_leaks) ( void );
1338extern void VG_(done_prof_mem) ( void );
1339
1340/* Set permissions for an address range. Not speed-critical. */
1341extern void VGM_(make_noaccess) ( Addr a, UInt len );
1342extern void VGM_(make_writable) ( Addr a, UInt len );
1343extern void VGM_(make_readable) ( Addr a, UInt len );
1344/* Use with care! (read: use for shmat only) */
1345extern void VGM_(make_readwritable) ( Addr a, UInt len );
1346extern void VGM_(copy_address_range_perms) ( Addr src, Addr dst,
1347 UInt len );
1348
1349/* Check permissions for an address range. Not speed-critical. */
1350extern Bool VGM_(check_writable) ( Addr a, UInt len, Addr* bad_addr );
1351extern Bool VGM_(check_readable) ( Addr a, UInt len, Addr* bad_addr );
1352extern Bool VGM_(check_readable_asciiz) ( Addr a, Addr* bad_addr );
1353
1354/* Sanity checks which may be done at any time. Doing them at
1355 signal-delivery time turns out to be convenient. */
sewardj2e93c502002-04-12 11:12:52 +00001356extern void VG_(do_sanity_checks) ( ThreadId tid, Bool force_expensive );
sewardjde4a1d02002-03-22 01:27:54 +00001357/* Very cheap ... */
1358extern Bool VG_(first_and_last_secondaries_look_plausible) ( void );
1359
1360/* These functions are called from generated code. */
1361extern void VG_(helperc_STOREV4) ( UInt, Addr );
1362extern void VG_(helperc_STOREV2) ( UInt, Addr );
1363extern void VG_(helperc_STOREV1) ( UInt, Addr );
1364
1365extern UInt VG_(helperc_LOADV1) ( Addr );
1366extern UInt VG_(helperc_LOADV2) ( Addr );
1367extern UInt VG_(helperc_LOADV4) ( Addr );
1368
1369extern void VGM_(handle_esp_assignment) ( Addr new_espA );
1370extern void VGM_(fpu_write_check) ( Addr addr, Int size );
1371extern void VGM_(fpu_read_check) ( Addr addr, Int size );
1372
1373/* Safely (avoiding SIGSEGV / SIGBUS) scan the entire valid address
1374 space and pass the addresses and values of all addressible,
1375 defined, aligned words to notify_word. This is the basis for the
1376 leak detector. Returns the number of calls made to notify_word. */
1377UInt VG_(scan_all_valid_memory) ( void (*notify_word)( Addr, UInt ) );
1378
1379/* Is this address within some small distance below %ESP? Used only
1380 for the --workaround-gcc296-bugs kludge. */
sewardj8c824512002-04-14 04:16:48 +00001381extern Bool VG_(is_just_below_ESP)( Addr esp, Addr aa );
sewardjde4a1d02002-03-22 01:27:54 +00001382
1383/* Nasty kludgery to deal with applications which switch stacks,
1384 like netscape. */
sewardjde4a1d02002-03-22 01:27:54 +00001385#define VG_PLAUSIBLE_STACK_SIZE 8000000
1386
sewardjde4a1d02002-03-22 01:27:54 +00001387
1388/* ---------------------------------------------------------------------
1389 Exports of vg_syscall_mem.c
1390 ------------------------------------------------------------------ */
1391
sewardj2e93c502002-04-12 11:12:52 +00001392extern void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001393
sewardj2e93c502002-04-12 11:12:52 +00001394extern void VG_(check_known_blocking_syscall) ( ThreadId tid,
1395 Int syscallno,
1396 Int* /*IN*/ res );
sewardjde4a1d02002-03-22 01:27:54 +00001397
1398extern Bool VG_(is_kerror) ( Int res );
1399
sewardj2e93c502002-04-12 11:12:52 +00001400#define KERNEL_DO_SYSCALL(thread_id, result_lvalue) \
1401 VG_(load_thread_state)(thread_id); \
sewardjde4a1d02002-03-22 01:27:54 +00001402 VG_(copy_baseBlock_to_m_state_static)(); \
1403 VG_(do_syscall)(); \
1404 VG_(copy_m_state_static_to_baseBlock)(); \
sewardj2e93c502002-04-12 11:12:52 +00001405 VG_(save_thread_state)(thread_id); \
1406 result_lvalue = VG_(get_thread_state)(thread_id)->m_eax;
sewardjde4a1d02002-03-22 01:27:54 +00001407
1408
1409/* ---------------------------------------------------------------------
1410 Exports of vg_transtab.c
1411 ------------------------------------------------------------------ */
1412
1413/* An entry in the translation table (TT). */
1414typedef
1415 struct {
1416 /* +0 */ Addr orig_addr;
1417 /* +4 */ Addr trans_addr;
1418 /* +8 */ UInt mru_epoch;
1419 /* +12 */ UShort orig_size;
1420 /* +14 */ UShort trans_size;
1421 }
1422 TTEntry;
1423
1424/* The number of basic blocks in an epoch (one age-step). */
1425#define VG_BBS_PER_EPOCH 20000
1426
1427extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
1428extern void VG_(maybe_do_lru_pass) ( void );
1429extern void VG_(flush_transtab) ( void );
1430extern Addr VG_(copy_to_transcache) ( Addr trans_addr, Int trans_size );
1431extern void VG_(add_to_trans_tab) ( TTEntry* tte );
1432
1433extern void VG_(smc_mark_original) ( Addr original_addr,
1434 Int original_len );
1435
1436extern void VG_(init_transtab_and_SMC) ( void );
1437
1438extern void VG_(sanity_check_tc_tt) ( void );
1439extern Addr VG_(search_transtab) ( Addr original_addr );
1440
1441extern void VG_(invalidate_tt_fast)( void );
1442
1443
1444/* ---------------------------------------------------------------------
1445 Exports of vg_vtagops.c
1446 ------------------------------------------------------------------ */
1447
1448/* Lists the names of value-tag operations used in instrumented
1449 code. These are the third argument to TAG1 and TAG2 uinsns. */
1450
1451typedef
1452 enum {
1453 /* Unary. */
1454 VgT_PCast40, VgT_PCast20, VgT_PCast10,
1455 VgT_PCast01, VgT_PCast02, VgT_PCast04,
1456
1457 VgT_PCast14, VgT_PCast12, VgT_PCast11,
1458
1459 VgT_Left4, VgT_Left2, VgT_Left1,
1460
1461 VgT_SWiden14, VgT_SWiden24, VgT_SWiden12,
1462 VgT_ZWiden14, VgT_ZWiden24, VgT_ZWiden12,
1463
1464 /* Binary; 1st is rd; 2nd is rd+wr */
1465 VgT_UifU4, VgT_UifU2, VgT_UifU1, VgT_UifU0,
1466 VgT_DifD4, VgT_DifD2, VgT_DifD1,
1467
1468 VgT_ImproveAND4_TQ, VgT_ImproveAND2_TQ, VgT_ImproveAND1_TQ,
1469 VgT_ImproveOR4_TQ, VgT_ImproveOR2_TQ, VgT_ImproveOR1_TQ,
1470 VgT_DebugFn
1471 }
1472 VgTagOp;
1473
1474extern Char* VG_(nameOfTagOp) ( VgTagOp );
1475extern UInt VG_(DebugFn) ( UInt a1, UInt a2 );
1476
1477
1478/* ---------------------------------------------------------------------
1479 Exports of vg_syscall.S
1480 ------------------------------------------------------------------ */
1481
1482extern void VG_(do_syscall) ( void );
1483
1484
1485/* ---------------------------------------------------------------------
1486 Exports of vg_startup.S
1487 ------------------------------------------------------------------ */
1488
1489extern void VG_(shutdown);
1490extern void VG_(switch_to_real_CPU) ( void );
1491
1492extern void VG_(swizzle_esp_then_start_GDB) ( void );
1493
1494
1495/* ---------------------------------------------------------------------
1496 Exports of vg_dispatch.S
1497 ------------------------------------------------------------------ */
1498
sewardj2e93c502002-04-12 11:12:52 +00001499/* Run a thread for a (very short) while, until some event happens
1500 which means we need to defer to the scheduler. */
1501extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001502
1503
1504/* ---------------------------------------------------------------------
1505 Exports of vg_helpers.S
1506 ------------------------------------------------------------------ */
1507
sewardjde4a1d02002-03-22 01:27:54 +00001508/* SMC fast checks. */
1509extern void VG_(helper_smc_check4);
1510
1511/* Mul, div, etc, -- we don't codegen these directly. */
1512extern void VG_(helper_idiv_64_32);
1513extern void VG_(helper_div_64_32);
1514extern void VG_(helper_idiv_32_16);
1515extern void VG_(helper_div_32_16);
1516extern void VG_(helper_idiv_16_8);
1517extern void VG_(helper_div_16_8);
1518
1519extern void VG_(helper_imul_32_64);
1520extern void VG_(helper_mul_32_64);
1521extern void VG_(helper_imul_16_32);
1522extern void VG_(helper_mul_16_32);
1523extern void VG_(helper_imul_8_16);
1524extern void VG_(helper_mul_8_16);
1525
1526extern void VG_(helper_CLD);
1527extern void VG_(helper_STD);
1528extern void VG_(helper_get_dirflag);
1529
1530extern void VG_(helper_shldl);
1531extern void VG_(helper_shldw);
1532extern void VG_(helper_shrdl);
1533extern void VG_(helper_shrdw);
1534
1535extern void VG_(helper_RDTSC);
1536extern void VG_(helper_CPUID);
1537
sewardjde4a1d02002-03-22 01:27:54 +00001538extern void VG_(helper_bsf);
1539extern void VG_(helper_bsr);
1540
1541extern void VG_(helper_fstsw_AX);
1542extern void VG_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001543extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001544extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001545
1546extern void VG_(helper_value_check4_fail);
1547extern void VG_(helper_value_check2_fail);
1548extern void VG_(helper_value_check1_fail);
1549extern void VG_(helper_value_check0_fail);
1550
sewardjbc5b99f2002-04-13 00:08:51 +00001551/* NOT FUNCTIONS; these are bogus RETURN ADDRESS. */
sewardj54cacf02002-04-12 23:24:59 +00001552extern void VG_(signalreturn_bogusRA)( void );
sewardjbc5b99f2002-04-13 00:08:51 +00001553extern void VG_(pthreadreturn_bogusRA)( void );
sewardj54cacf02002-04-12 23:24:59 +00001554
sewardjde4a1d02002-03-22 01:27:54 +00001555
1556/* ---------------------------------------------------------------------
1557 The state of the simulated CPU.
1558 ------------------------------------------------------------------ */
1559
1560/* This is the Intel register encoding. */
1561#define R_EAX 0
1562#define R_ECX 1
1563#define R_EDX 2
1564#define R_EBX 3
1565#define R_ESP 4
1566#define R_EBP 5
1567#define R_ESI 6
1568#define R_EDI 7
1569
1570#define R_AL (0+R_EAX)
1571#define R_CL (0+R_ECX)
1572#define R_DL (0+R_EDX)
1573#define R_BL (0+R_EBX)
1574#define R_AH (4+R_EAX)
1575#define R_CH (4+R_ECX)
1576#define R_DH (4+R_EDX)
1577#define R_BH (4+R_EBX)
1578
1579
1580/* ---------------------------------------------------------------------
1581 Offsets into baseBlock for everything which needs to referred to
1582 from generated code. The order of these decls does not imply
1583 what the order of the actual offsets is. The latter is important
1584 and is set up in vg_main.c.
1585 ------------------------------------------------------------------ */
1586
1587/* An array of words. In generated code, %ebp always points to the
1588 start of this array. Useful stuff, like the simulated CPU state,
1589 and the addresses of helper functions, can then be found by
1590 indexing off %ebp. The following declares variables which, at
1591 startup time, are given values denoting offsets into baseBlock.
1592 These offsets are in *words* from the start of baseBlock. */
1593
1594#define VG_BASEBLOCK_WORDS 200
1595
1596extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1597
1598
1599/* -----------------------------------------------------
1600 Read-write parts of baseBlock.
1601 -------------------------------------------------- */
1602
1603/* State of the simulated CPU. */
1604extern Int VGOFF_(m_eax);
1605extern Int VGOFF_(m_ecx);
1606extern Int VGOFF_(m_edx);
1607extern Int VGOFF_(m_ebx);
1608extern Int VGOFF_(m_esp);
1609extern Int VGOFF_(m_ebp);
1610extern Int VGOFF_(m_esi);
1611extern Int VGOFF_(m_edi);
1612extern Int VGOFF_(m_eflags);
1613extern Int VGOFF_(m_fpustate);
1614extern Int VGOFF_(m_eip);
1615
1616/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1617extern Int VGOFF_(spillslots);
1618
1619/* Records the valid bits for the 8 integer regs & flags reg. */
1620extern Int VGOFF_(sh_eax);
1621extern Int VGOFF_(sh_ecx);
1622extern Int VGOFF_(sh_edx);
1623extern Int VGOFF_(sh_ebx);
1624extern Int VGOFF_(sh_esp);
1625extern Int VGOFF_(sh_ebp);
1626extern Int VGOFF_(sh_esi);
1627extern Int VGOFF_(sh_edi);
1628extern Int VGOFF_(sh_eflags);
1629
1630
1631/* -----------------------------------------------------
1632 Read-only parts of baseBlock.
1633 -------------------------------------------------- */
1634
1635/* Offsets of addresses of helper functions. A "helper" function is
1636 one which is called from generated code. */
1637
1638extern Int VGOFF_(helper_idiv_64_32);
1639extern Int VGOFF_(helper_div_64_32);
1640extern Int VGOFF_(helper_idiv_32_16);
1641extern Int VGOFF_(helper_div_32_16);
1642extern Int VGOFF_(helper_idiv_16_8);
1643extern Int VGOFF_(helper_div_16_8);
1644
1645extern Int VGOFF_(helper_imul_32_64);
1646extern Int VGOFF_(helper_mul_32_64);
1647extern Int VGOFF_(helper_imul_16_32);
1648extern Int VGOFF_(helper_mul_16_32);
1649extern Int VGOFF_(helper_imul_8_16);
1650extern Int VGOFF_(helper_mul_8_16);
1651
1652extern Int VGOFF_(helper_CLD);
1653extern Int VGOFF_(helper_STD);
1654extern Int VGOFF_(helper_get_dirflag);
1655
1656extern Int VGOFF_(helper_shldl);
1657extern Int VGOFF_(helper_shldw);
1658extern Int VGOFF_(helper_shrdl);
1659extern Int VGOFF_(helper_shrdw);
1660
1661extern Int VGOFF_(helper_RDTSC);
1662extern Int VGOFF_(helper_CPUID);
1663
sewardjde4a1d02002-03-22 01:27:54 +00001664extern Int VGOFF_(helper_bsf);
1665extern Int VGOFF_(helper_bsr);
1666
1667extern Int VGOFF_(helper_fstsw_AX);
1668extern Int VGOFF_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001669extern Int VGOFF_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001670extern Int VGOFF_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001671
1672extern Int VGOFF_(helper_value_check4_fail);
1673extern Int VGOFF_(helper_value_check2_fail);
1674extern Int VGOFF_(helper_value_check1_fail);
1675extern Int VGOFF_(helper_value_check0_fail);
1676
sewardjde4a1d02002-03-22 01:27:54 +00001677extern Int VGOFF_(helperc_STOREV4); /* :: UInt -> Addr -> void */
1678extern Int VGOFF_(helperc_STOREV2); /* :: UInt -> Addr -> void */
1679extern Int VGOFF_(helperc_STOREV1); /* :: UInt -> Addr -> void */
1680
1681extern Int VGOFF_(helperc_LOADV4); /* :: Addr -> UInt -> void */
1682extern Int VGOFF_(helperc_LOADV2); /* :: Addr -> UInt -> void */
1683extern Int VGOFF_(helperc_LOADV1); /* :: Addr -> UInt -> void */
1684
1685extern Int VGOFF_(handle_esp_assignment); /* :: Addr -> void */
1686extern Int VGOFF_(fpu_write_check); /* :: Addr -> Int -> void */
1687extern Int VGOFF_(fpu_read_check); /* :: Addr -> Int -> void */
1688
sewardjde4a1d02002-03-22 01:27:54 +00001689
1690
1691#endif /* ndef __VG_INCLUDE_H */
1692
sewardj3b2736a2002-03-24 12:18:35 +00001693
1694/* ---------------------------------------------------------------------
1695 Finally - autoconf-generated settings
1696 ------------------------------------------------------------------ */
1697
1698#include "config.h"
1699
sewardjde4a1d02002-03-22 01:27:54 +00001700/*--------------------------------------------------------------------*/
1701/*--- end vg_include.h ---*/
1702/*--------------------------------------------------------------------*/