blob: 3f9a10ce12d0bae2763274a352b6aa512e927383 [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. */
sewardj604ec3c2002-04-18 22:38:41 +0000129#define VG_N_THREADS 10
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
sewardjbc5b99f2002-04-13 00:08:51 +0000400#define VG_USERREQ__PTHREAD_MUTEX_LOCK 0x3005
401#define VG_USERREQ__PTHREAD_MUTEX_UNLOCK 0x3006
sewardjbc5b99f2002-04-13 00:08:51 +0000402#define VG_USERREQ__PTHREAD_CANCEL 0x3008
sewardj2e93c502002-04-12 11:12:52 +0000403
sewardj45b4b372002-04-16 22:50:32 +0000404/* Cosmetic ... */
405#define VG_USERREQ__GET_PTHREAD_TRACE_LEVEL 0x3101
406
sewardj54cacf02002-04-12 23:24:59 +0000407/*
408In vg_constants.h:
409#define VG_USERREQ__SIGNAL_RETURNS 0x4001
sewardjbc5b99f2002-04-13 00:08:51 +0000410#define VG_USERREQ__PTHREAD_RETURNS 0x4002
411#define VG_USERREQ__SHUTDOWN_VALGRIND 0x4003
sewardj54cacf02002-04-12 23:24:59 +0000412*/
413
414
sewardj2e93c502002-04-12 11:12:52 +0000415/* ---------------------------------------------------------------------
416 Constants pertaining to the simulated CPU state, VG_(baseBlock),
417 which need to go here to avoid ugly circularities.
418 ------------------------------------------------------------------ */
419
420/* How big is the saved FPU state? */
421#define VG_SIZE_OF_FPUSTATE 108
422/* ... and in words ... */
423#define VG_SIZE_OF_FPUSTATE_W ((VG_SIZE_OF_FPUSTATE+3)/4)
424
425
426/* ---------------------------------------------------------------------
427 Exports of vg_scheduler.c
428 ------------------------------------------------------------------ */
429
430/* ThreadIds are simply indices into the vg_threads[] array. */
431typedef
432 UInt
433 ThreadId;
434
sewardj6072c362002-04-19 14:40:57 +0000435/* Special magic value for an invalid ThreadId. It corresponds to
436 LinuxThreads using zero as the initial value for
437 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
438#define VG_INVALID_THREADID ((ThreadId)(0))
sewardj2e93c502002-04-12 11:12:52 +0000439
440typedef
441 enum {
442 VgTs_Empty, /* this slot is not in use */
443 VgTs_Runnable, /* waiting to be scheduled */
444 VgTs_WaitJoiner, /* waiting for someone to do join on me */
445 VgTs_WaitJoinee, /* waiting for the thread I did join on */
446 VgTs_WaitFD, /* waiting for I/O completion on a fd */
447 VgTs_WaitMX, /* waiting on a mutex */
448 VgTs_Sleeping /* sleeping for a while */
449 }
450 ThreadStatus;
451
452typedef
453 struct {
sewardj6072c362002-04-19 14:40:57 +0000454 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
455 The thread identity is simply the index in vg_threads[].
456 ThreadId == 1 is the root thread and has the special property
sewardj1e8cdc92002-04-18 11:37:52 +0000457 that we don't try and allocate or deallocate its stack. For
458 convenience of generating error message, we also put the
459 ThreadId in this tid field, but be aware that it should
sewardj604ec3c2002-04-18 22:38:41 +0000460 ALWAYS == the index in vg_threads[]. */
sewardj1e8cdc92002-04-18 11:37:52 +0000461 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000462
463 /* Current scheduling status. */
464 ThreadStatus status;
465
466 /* Identity of joiner (thread who called join on me), or
467 VG_INVALID_THREADID if no one asked to join yet. */
468 ThreadId joiner;
469
sewardj6072c362002-04-19 14:40:57 +0000470 /* When .status == WaitMX, points to the mutex I am waiting
471 for. */
472 void* /* pthread_mutex_t* */ waited_on_mx;
sewardj2e93c502002-04-12 11:12:52 +0000473
474 /* If VgTs_Sleeping, this is when we should wake up. */
475 ULong awaken_at;
476
477 /* return value */
478 void* retval;
479
480 /* Stacks. When a thread slot is freed, we don't deallocate its
481 stack; we just leave it lying around for the next use of the
482 slot. If the next use of the slot requires a larger stack,
483 only then is the old one deallocated and a new one
484 allocated.
485
486 For the main thread (threadid == 0), this mechanism doesn't
487 apply. We don't know the size of the stack since we didn't
488 allocate it, and furthermore we never reallocate it. */
489
490 /* The allocated size of this thread's stack (permanently zero
491 if this is ThreadId == 0, since we didn't allocate its stack) */
492 UInt stack_size;
493
494 /* Address of the lowest word in this thread's stack. NULL means
495 not allocated yet.
496 */
497 Addr stack_base;
498
sewardj1e8cdc92002-04-18 11:37:52 +0000499 /* Address of the highest legitimate word in this stack. This is
500 used for error messages only -- not critical for execution
501 correctness. Is is set for all stacks, specifically including
502 ThreadId == 0 (the main thread). */
503 Addr stack_highest_word;
504
sewardj2e93c502002-04-12 11:12:52 +0000505 /* Saved machine context. */
506 UInt m_eax;
507 UInt m_ebx;
508 UInt m_ecx;
509 UInt m_edx;
510 UInt m_esi;
511 UInt m_edi;
512 UInt m_ebp;
513 UInt m_esp;
514 UInt m_eflags;
515 UInt m_eip;
516 UInt m_fpu[VG_SIZE_OF_FPUSTATE_W];
517
518 UInt sh_eax;
519 UInt sh_ebx;
520 UInt sh_ecx;
521 UInt sh_edx;
522 UInt sh_esi;
523 UInt sh_edi;
524 UInt sh_ebp;
525 UInt sh_esp;
526 UInt sh_eflags;
527 }
528 ThreadState;
529
530
531/* Copy the specified thread's state into VG_(baseBlock) in
532 preparation for running it. */
533extern void VG_(load_thread_state)( ThreadId );
534
535/* Save the specified thread's state back in VG_(baseBlock), and fill
536 VG_(baseBlock) with junk, for sanity-check reasons. */
537extern void VG_(save_thread_state)( ThreadId );
538
539/* Get the thread state block for the specified thread. */
540extern ThreadState* VG_(get_thread_state)( ThreadId );
541
sewardj1e8cdc92002-04-18 11:37:52 +0000542/* And for the currently running one, if valid. */
543extern ThreadState* VG_(get_current_thread_state) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000544
sewardj1e8cdc92002-04-18 11:37:52 +0000545/* Similarly ... */
546extern ThreadId VG_(get_current_tid) ( void );
547
548/* Which thread is this address in the stack of, if any? Used for
549 error message generation. */
550extern ThreadId VG_(identify_stack_addr)( Addr a );
551
sewardj2e93c502002-04-12 11:12:52 +0000552
553/* Return codes from the scheduler. */
554typedef
555 enum { VgSrc_Deadlock, VgSrc_Shutdown, VgSrc_BbsDone }
556 VgSchedReturnCode;
557
558/* The scheduler. */
559extern VgSchedReturnCode VG_(scheduler) ( void );
560
561extern void VG_(scheduler_init) ( void );
562
sewardj15a43e12002-04-17 19:35:12 +0000563extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000564
565/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
566extern jmp_buf VG_(scheduler_jmpbuf);
567/* ... and if so, here's the signal which caused it to do so. */
568extern Int VG_(longjmpd_on_signal);
569
570
571/* We check that the initial stack, which we can't move, is allocated
572 here. VG_(scheduler_init) checks this.
573*/
574#define VG_STARTUP_STACK_MASK (Addr)0xBFFF8000
575
576
577/* The red-zone size which we put at the bottom (highest address) of
578 thread stacks, for paranoia reasons. This can be arbitrary, and
579 doesn't really need to be set at compile time. */
580#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
581
582#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
583 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
584
585
586
587/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000588 Exports of vg_signals.c
589 ------------------------------------------------------------------ */
590
sewardjde4a1d02002-03-22 01:27:54 +0000591extern void VG_(sigstartup_actions) ( void );
592
sewardj2e93c502002-04-12 11:12:52 +0000593extern void VG_(deliver_signals) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000594extern void VG_(unblock_host_signal) ( Int sigNo );
595
596
597/* Fake system calls for signal handling. */
sewardj2e93c502002-04-12 11:12:52 +0000598extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +0000599extern void VG_(do__NR_sigprocmask) ( Int how, vki_ksigset_t* set );
600
sewardj2e93c502002-04-12 11:12:52 +0000601/* Modify the current thread's state once we have detected it is
602 returning from a signal handler. */
sewardj77e466c2002-04-14 02:29:29 +0000603extern Bool VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000604
sewardj2e93c502002-04-12 11:12:52 +0000605/* Handy utilities to block/restore all host signals. */
606extern void VG_(block_all_host_signals)
607 ( /* OUT */ vki_ksigset_t* saved_mask );
608extern void VG_(restore_host_signals)
609 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000610
611/* ---------------------------------------------------------------------
612 Exports of vg_mylibc.c
613 ------------------------------------------------------------------ */
614
615
616#define NULL ((void*)0)
617
618extern void VG_(exit)( Int status )
619 __attribute__ ((__noreturn__));
620
621extern void VG_(printf) ( const char *format, ... );
622/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
623
624extern void VG_(sprintf) ( Char* buf, Char *format, ... );
625
626extern void VG_(vprintf) ( void(*send)(Char),
627 const Char *format, va_list vargs );
628
629extern Bool VG_(isspace) ( Char c );
630
631extern Int VG_(strlen) ( const Char* str );
632
633extern Long VG_(atoll) ( Char* str );
634
635extern Char* VG_(strcat) ( Char* dest, const Char* src );
636extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
637extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
638
639extern Char* VG_(strcpy) ( Char* dest, const Char* src );
640
641extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
642extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
643
644extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
645extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
646
647extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
648extern Char* VG_(strchr) ( const Char* s, Char c );
649extern Char* VG_(strdup) ( ArenaId aid, const Char* s);
650
651extern Char* VG_(getenv) ( Char* name );
652extern Int VG_(getpid) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000653extern ULong VG_(read_microsecond_timer)( void );
sewardjde4a1d02002-03-22 01:27:54 +0000654
655
656extern Char VG_(toupper) ( Char c );
657
658extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
659
660extern void VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
661
662extern Bool VG_(stringMatch) ( Char* pat, Char* str );
663
664
665#define __STRING(x) #x
666
667/* Asserts are permanently enabled. Hurrah! */
668#define vg_assert(expr) \
669 ((void) ((expr) ? 0 : \
670 (VG_(assert_fail) (__STRING(expr), \
671 __FILE__, __LINE__, \
672 __PRETTY_FUNCTION__), 0)))
673
674extern void VG_(assert_fail) ( Char* expr, Char* file,
675 Int line, Char* fn )
676 __attribute__ ((__noreturn__));
677
sewardjde4a1d02002-03-22 01:27:54 +0000678/* Reading files. */
679extern Int VG_(open_read) ( Char* pathname );
680extern void VG_(close) ( Int fd );
681extern Int VG_(read) ( Int fd, void* buf, Int count);
682extern Int VG_(write) ( Int fd, void* buf, Int count);
683
sewardj2e93c502002-04-12 11:12:52 +0000684extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
685
686extern Int VG_(select)( Int n,
687 vki_fd_set* readfds,
688 vki_fd_set* writefds,
689 vki_fd_set* exceptfds,
690 struct vki_timeval * timeout );
691extern Int VG_(nanosleep)( const struct vki_timespec *req,
692 struct vki_timespec *rem );
693
694
sewardjde4a1d02002-03-22 01:27:54 +0000695/* mmap-ery ... */
696extern void* VG_(mmap)( void* start, UInt length,
697 UInt prot, UInt flags, UInt fd, UInt offset );
698
sewardj2e93c502002-04-12 11:12:52 +0000699extern Int VG_(munmap)( void* start, Int length );
sewardjde4a1d02002-03-22 01:27:54 +0000700
701
702/* Print a (panic) message, and abort. */
703extern void VG_(panic) ( Char* str )
704 __attribute__ ((__noreturn__));
705
706/* Get memory by anonymous mmap. */
707void* VG_(get_memory_from_mmap) ( Int nBytes );
708
709/* Signal stuff. Note that these use the vk_ (kernel) structure
710 definitions, which are different in places from those that glibc
711 defines. Since we're operating right at the kernel interface,
712 glibc's view of the world is entirely irrelevant. */
713extern Int VG_(ksigfillset)( vki_ksigset_t* set );
714extern Int VG_(ksigemptyset)( vki_ksigset_t* set );
715extern Int VG_(ksigaddset)( vki_ksigset_t* set, Int signum );
716
717extern Int VG_(ksigprocmask)( Int how, const vki_ksigset_t* set,
718 vki_ksigset_t* oldset );
719extern Int VG_(ksigaction) ( Int signum,
720 const vki_ksigaction* act,
721 vki_ksigaction* oldact );
722extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
723
724extern Int VG_(ksignal)(Int signum, void (*sighandler)(Int));
725
726extern Int VG_(ksigaltstack)( const vki_kstack_t* ss, vki_kstack_t* oss );
727
728
729
730/* ---------------------------------------------------------------------
731 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
732 vg_from_ucode.c).
733 ------------------------------------------------------------------ */
734
735/* Tags which describe what operands are. */
736typedef
737 enum { TempReg=0, ArchReg=1, RealReg=2,
738 SpillNo=3, Literal=4, Lit16=5,
739 NoValue=6 }
740 Tag;
741
742
743/* Microinstruction opcodes. */
744typedef
745 enum {
746 NOP,
747 GET,
748 PUT,
749 LOAD,
750 STORE,
751 MOV,
752 CMOV, /* Used for cmpxchg and cmov */
753 WIDEN,
754 JMP,
755
756 /* Read/write the %EFLAGS register into a TempReg. */
757 GETF, PUTF,
758
759 ADD, ADC, AND, OR, XOR, SUB, SBB,
760 SHL, SHR, SAR, ROL, ROR, RCL, RCR,
761 NOT, NEG, INC, DEC, BSWAP,
762 CC2VAL,
763
764 /* Not strictly needed, but useful for making better
765 translations of address calculations. */
766 LEA1, /* reg2 := const + reg1 */
767 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
768
769 /* not for translating x86 calls -- only to call helpers */
770 CALLM_S, CALLM_E, /* Mark start and end of push/pop sequences
771 for CALLM. */
772 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers. */
773 CALLM, /* call to a machine-code helper */
774
775 /* Hack for translating string (REP-) insns. Jump to literal if
776 TempReg/RealReg is zero. */
777 JIFZ,
778
779 /* FPU ops which read/write mem or don't touch mem at all. */
780 FPU_R,
781 FPU_W,
782 FPU,
783
784 /* Advance the simulated %eip by some small (< 128) number. */
785 INCEIP,
786
787 /* uinstrs which are not needed for mere translation of x86 code,
788 only for instrumentation of it. */
789 LOADV,
790 STOREV,
791 GETV,
792 PUTV,
793 TESTV,
794 SETV,
795 /* Get/set the v-bit (and it is only one bit) for the simulated
796 %eflags register. */
797 GETVF,
798 PUTVF,
799
800 /* Do a unary or binary tag op. Only for post-instrumented
801 code. For TAG1, first and only arg is a TempReg, and is both
802 arg and result reg. For TAG2, first arg is src, second is
803 dst, in the normal way; both are TempRegs. In both cases,
804 3rd arg is a RiCHelper with a Lit16 tag. This indicates
805 which tag op to do. */
806 TAG1,
807 TAG2
808 }
809 Opcode;
810
811
812/* Condition codes, observing the Intel encoding. CondAlways is an
813 extra. */
814typedef
815 enum {
816 CondO = 0, /* overflow */
817 CondNO = 1, /* no overflow */
818 CondB = 2, /* below */
819 CondNB = 3, /* not below */
820 CondZ = 4, /* zero */
821 CondNZ = 5, /* not zero */
822 CondBE = 6, /* below or equal */
823 CondNBE = 7, /* not below or equal */
824 CondS = 8, /* negative */
825 ConsNS = 9, /* not negative */
826 CondP = 10, /* parity even */
827 CondNP = 11, /* not parity even */
828 CondL = 12, /* jump less */
829 CondNL = 13, /* not less */
830 CondLE = 14, /* less or equal */
831 CondNLE = 15, /* not less or equal */
832 CondAlways = 16 /* Jump always */
833 }
834 Condcode;
835
836
sewardj2e93c502002-04-12 11:12:52 +0000837/* Descriptions of additional properties of *unconditional* jumps. */
838typedef
839 enum {
840 JmpBoring=0, /* boring unconditional jump */
841 JmpCall=1, /* jump due to an x86 call insn */
842 JmpRet=2, /* jump due to an x86 ret insn */
843 JmpSyscall=3, /* do a system call, then jump */
844 JmpClientReq=4 /* do a client request, then jump */
845 }
846 JmpKind;
847
848
sewardjde4a1d02002-03-22 01:27:54 +0000849/* Flags. User-level code can only read/write O(verflow), S(ign),
850 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
851 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
852 thusly:
853 76543210
854 DOSZACP
855 and bit 7 must always be zero since it is unused.
856*/
857typedef UChar FlagSet;
858
859#define FlagD (1<<6)
860#define FlagO (1<<5)
861#define FlagS (1<<4)
862#define FlagZ (1<<3)
863#define FlagA (1<<2)
864#define FlagC (1<<1)
865#define FlagP (1<<0)
866
867#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
868#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
869#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
870#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
871#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
872#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
sewardj4a7456e2002-03-24 13:52:19 +0000873#define FlagsZCP ( FlagZ | FlagC | FlagP)
sewardjde4a1d02002-03-22 01:27:54 +0000874#define FlagsOC (FlagO | FlagC )
sewardj4d0ab1f2002-03-24 10:00:09 +0000875#define FlagsAC ( FlagA | FlagC )
sewardjde4a1d02002-03-22 01:27:54 +0000876
877#define FlagsALL (FlagsOSZACP | FlagD)
878#define FlagsEmpty (FlagSet)0
879
880#define VG_IS_FLAG_SUBSET(set1,set2) \
881 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
882
883#define VG_UNION_FLAG_SETS(set1,set2) \
884 ( ((FlagSet)set1) | ((FlagSet)set2) )
885
886
887
888/* A Micro (u)-instruction. */
889typedef
890 struct {
891 /* word 1 */
892 UInt lit32; /* 32-bit literal */
893
894 /* word 2 */
895 UShort val1; /* first operand */
896 UShort val2; /* second operand */
897
898 /* word 3 */
899 UShort val3; /* third operand */
900 UChar opcode; /* opcode */
901 UChar size; /* data transfer size */
902
903 /* word 4 */
904 FlagSet flags_r; /* :: FlagSet */
905 FlagSet flags_w; /* :: FlagSet */
906 UChar tag1:4; /* first operand tag */
907 UChar tag2:4; /* second operand tag */
908 UChar tag3:4; /* third operand tag */
909 UChar extra4b:4; /* Spare field, used by WIDEN for src
910 -size, and by LEA2 for scale
911 (1,2,4 or 8) */
912
913 /* word 5 */
914 UChar cond; /* condition, for jumps */
915 Bool smc_check:1; /* do a smc test, if writes memory. */
916 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
sewardj2e93c502002-04-12 11:12:52 +0000917 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
sewardjde4a1d02002-03-22 01:27:54 +0000918 }
919 UInstr;
920
921
922/* Expandable arrays of uinstrs. */
923typedef
924 struct {
925 Int used;
926 Int size;
927 UInstr* instrs;
928 Int nextTemp;
929 }
930 UCodeBlock;
931
932/* Refer to `the last instruction stuffed in', including as an
933 lvalue. */
934#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
935
936/* An invalid temporary number :-) */
937#define INVALID_TEMPREG 999999999
938
939
940/* ---------------------------------------------------------------------
941 Exports of vg_demangle.c
942 ------------------------------------------------------------------ */
943
944extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
945
946
947/* ---------------------------------------------------------------------
948 Exports of vg_from_ucode.c
949 ------------------------------------------------------------------ */
950
951extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes );
952
953
954/* ---------------------------------------------------------------------
955 Exports of vg_to_ucode.c
956 ------------------------------------------------------------------ */
957
958extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
959extern Char* VG_(nameOfIntReg) ( Int size, Int reg );
960extern Char VG_(nameOfIntSize) ( Int size );
961extern UInt VG_(extend_s_8to32) ( UInt x );
962extern Int VG_(getNewTemp) ( UCodeBlock* cb );
963extern Int VG_(getNewShadow) ( UCodeBlock* cb );
964
965#define SHADOW(tempreg) ((tempreg)+1)
966
967
968/* ---------------------------------------------------------------------
969 Exports of vg_translate.c
970 ------------------------------------------------------------------ */
971
sewardj1e8cdc92002-04-18 11:37:52 +0000972extern void VG_(translate) ( ThreadState* tst,
973 Addr orig_addr,
sewardjde4a1d02002-03-22 01:27:54 +0000974 UInt* orig_size,
975 Addr* trans_addr,
976 UInt* trans_size );
977
978extern void VG_(emptyUInstr) ( UInstr* u );
979extern void VG_(newUInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
980extern void VG_(newUInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
981 Tag tag1, UInt val1 );
982extern void VG_(newUInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
983 Tag tag1, UInt val1,
984 Tag tag2, UInt val2 );
985extern void VG_(newUInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
986 Tag tag1, UInt val1,
987 Tag tag2, UInt val2,
988 Tag tag3, UInt val3 );
989extern void VG_(setFlagRW) ( UInstr* u,
990 FlagSet fr, FlagSet fw );
991
992extern void VG_(setLiteralField) ( UCodeBlock* cb, UInt lit32 );
993extern Bool VG_(anyFlagUse) ( UInstr* u );
994
995
996
997extern void VG_(ppUInstr) ( Int instrNo, UInstr* u );
998extern void VG_(ppUCodeBlock) ( UCodeBlock* cb, Char* title );
999
1000extern Char* VG_(nameCondcode) ( Condcode cond );
1001extern Bool VG_(saneUInstr) ( Bool beforeRA, UInstr* u );
1002extern Bool VG_(saneUCodeBlock) ( UCodeBlock* cb );
1003extern Char* VG_(nameUOpcode) ( Bool upper, Opcode opc );
1004extern Int VG_(rankToRealRegNo) ( Int rank );
1005
1006extern void* VG_(jitmalloc) ( Int nbytes );
1007extern void VG_(jitfree) ( void* ptr );
1008
1009
1010/* ---------------------------------------------------------------------
1011 Exports of vg_execontext.c.
1012 ------------------------------------------------------------------ */
1013
1014/* Records the PC and a bit of the call chain. The first 4 %eip
1015 values are used in comparisons do remove duplicate errors, and for
1016 comparing against suppression specifications. The rest are purely
1017 informational (but often important). */
1018
1019typedef
1020 struct _ExeContextRec {
1021 struct _ExeContextRec * next;
1022 /* The size of this array is VG_(clo_backtrace_size); at least
1023 2, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
1024 [1] is its caller, [2] is the caller of [1], etc. */
1025 Addr eips[0];
1026 }
1027 ExeContext;
1028
1029
1030/* Initialise the ExeContext storage mechanism. */
1031extern void VG_(init_ExeContext_storage) ( void );
1032
1033/* Print stats (informational only). */
1034extern void VG_(show_ExeContext_stats) ( void );
1035
1036
1037/* Take a snapshot of the client's stack. Search our collection of
1038 ExeContexts to see if we already have it, and if not, allocate a
1039 new one. Either way, return a pointer to the context. */
sewardj8c824512002-04-14 04:16:48 +00001040extern ExeContext* VG_(get_ExeContext) ( Bool skip_top_frame,
1041 Addr eip, Addr ebp );
sewardjde4a1d02002-03-22 01:27:54 +00001042
1043/* Print an ExeContext. */
1044extern void VG_(pp_ExeContext) ( ExeContext* );
1045
1046/* Compare two ExeContexts, just comparing the top two callers. */
1047extern Bool VG_(eq_ExeContext_top2) ( ExeContext* e1, ExeContext* e2 );
1048
1049/* Compare two ExeContexts, just comparing the top four callers. */
1050extern Bool VG_(eq_ExeContext_top4) ( ExeContext* e1, ExeContext* e2 );
1051
1052/* Compare two ExeContexts, comparing all callers. */
1053extern Bool VG_(eq_ExeContext_all) ( ExeContext* e1, ExeContext* e2 );
1054
1055
1056
1057/* ---------------------------------------------------------------------
1058 Exports of vg_errcontext.c.
1059 ------------------------------------------------------------------ */
1060
1061extern void VG_(load_suppressions) ( void );
1062extern void VG_(show_all_errors) ( void );
1063extern void VG_(record_value_error) ( Int size );
1064extern void VG_(record_free_error) ( Addr a );
1065extern void VG_(record_freemismatch_error) ( Addr a );
1066extern void VG_(record_address_error) ( Addr a, Int size,
1067 Bool isWrite );
sewardj1e8cdc92002-04-18 11:37:52 +00001068
1069extern void VG_(record_jump_error) ( ThreadState* tst, Addr a );
sewardj8c824512002-04-14 04:16:48 +00001070
1071extern void VG_(record_param_err) ( ThreadState* tst,
1072 Addr a,
sewardjde4a1d02002-03-22 01:27:54 +00001073 Bool isWriteLack,
1074 Char* msg );
sewardj8c824512002-04-14 04:16:48 +00001075extern void VG_(record_user_err) ( ThreadState* tst,
1076 Addr a, Bool isWriteLack );
sewardjde4a1d02002-03-22 01:27:54 +00001077
1078
1079/* The classification of a faulting address. */
1080typedef
1081 enum { Stack, Unknown, Freed, Mallocd, UserG, UserS }
1082 AddrKind;
1083
1084/* Records info about a faulting address. */
1085typedef
1086 struct {
1087 /* ALL */
1088 AddrKind akind;
1089 /* Freed, Mallocd */
1090 Int blksize;
1091 /* Freed, Mallocd */
1092 Int rwoffset;
1093 /* Freed, Mallocd */
1094 ExeContext* lastchange;
sewardj1e8cdc92002-04-18 11:37:52 +00001095 /* Stack */
1096 ThreadId stack_tid;
sewardjde4a1d02002-03-22 01:27:54 +00001097 }
1098 AddrInfo;
1099
1100
1101/* ---------------------------------------------------------------------
1102 Exports of vg_clientperms.c
1103 ------------------------------------------------------------------ */
1104
1105extern Bool VG_(client_perm_maybe_describe)( Addr a, AddrInfo* ai );
1106
sewardj8c824512002-04-14 04:16:48 +00001107extern UInt VG_(handle_client_request) ( ThreadState* tst, UInt* arg_block );
sewardjde4a1d02002-03-22 01:27:54 +00001108
1109extern void VG_(delete_client_stack_blocks_following_ESP_change) ( void );
1110
1111extern void VG_(show_client_block_stats) ( void );
1112
1113
1114/* ---------------------------------------------------------------------
1115 Exports of vg_procselfmaps.c
1116 ------------------------------------------------------------------ */
1117
1118extern
1119void VG_(read_procselfmaps) (
1120 void (*record_mapping)( Addr, UInt, Char, Char, Char, UInt, UChar* )
1121);
1122
1123
1124/* ---------------------------------------------------------------------
1125 Exports of vg_symtab2.c
1126 ------------------------------------------------------------------ */
1127
1128/* We assume the executable is loaded here ... can't really find
1129 out. There is a hacky sanity check in vg_init_memory_audit()
1130 which should trip up most stupidities.
1131*/
1132#define VG_ASSUMED_EXE_BASE (Addr)0x8048000
1133
1134extern void VG_(read_symbols) ( void );
1135extern void VG_(mini_stack_dump) ( ExeContext* ec );
1136extern void VG_(what_obj_and_fun_is_this)
1137 ( Addr a,
1138 Char* obj_buf, Int n_obj_buf,
1139 Char* fun_buf, Int n_fun_buf );
1140
1141extern void VG_(symtab_notify_munmap) ( Addr start, UInt length );
1142
1143
1144/* ---------------------------------------------------------------------
1145 Exports of vg_clientmalloc.c
1146 ------------------------------------------------------------------ */
1147
sewardjde4a1d02002-03-22 01:27:54 +00001148typedef
1149 enum {
1150 Vg_AllocMalloc = 0,
sewardj2e93c502002-04-12 11:12:52 +00001151 Vg_AllocNew = 1,
sewardjde4a1d02002-03-22 01:27:54 +00001152 Vg_AllocNewVec = 2
1153 }
1154 VgAllocKind;
1155
1156/* Description of a malloc'd chunk. */
1157typedef
1158 struct _ShadowChunk {
1159 struct _ShadowChunk* next;
1160 ExeContext* where; /* where malloc'd/free'd */
1161 UInt size : 30; /* size requested. */
1162 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1163 Addr data; /* ptr to actual block. */
1164 }
1165 ShadowChunk;
1166
1167extern void VG_(clientmalloc_done) ( void );
1168extern void VG_(describe_addr) ( Addr a, AddrInfo* ai );
1169extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1170
sewardj2e93c502002-04-12 11:12:52 +00001171/* These are called from the scheduler, when it intercepts a user
1172 request. */
sewardj8c824512002-04-14 04:16:48 +00001173extern void* VG_(client_malloc) ( ThreadState* tst,
1174 UInt size, VgAllocKind kind );
1175extern void* VG_(client_memalign) ( ThreadState* tst,
1176 UInt align, UInt size );
1177extern void VG_(client_free) ( ThreadState* tst,
1178 void* ptrV, VgAllocKind kind );
1179extern void* VG_(client_calloc) ( ThreadState* tst,
1180 UInt nmemb, UInt size1 );
1181extern void* VG_(client_realloc) ( ThreadState* tst,
1182 void* ptrV, UInt size_new );
sewardjde4a1d02002-03-22 01:27:54 +00001183
1184
1185/* ---------------------------------------------------------------------
1186 Exports of vg_main.c
1187 ------------------------------------------------------------------ */
1188
sewardjde4a1d02002-03-22 01:27:54 +00001189/* A structure used as an intermediary when passing the simulated
1190 CPU's state to some assembly fragments, particularly system calls.
1191 Stuff is copied from baseBlock to here, the assembly magic runs,
1192 and then the inverse copy is done. */
1193
1194extern UInt VG_(m_state_static) [8 /* int regs, in Intel order */
1195 + 1 /* %eflags */
1196 + 1 /* %eip */
1197 + VG_SIZE_OF_FPUSTATE_W /* FPU state */
1198 ];
1199
1200/* Handy fns for doing the copy back and forth. */
1201extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1202extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1203
sewardjde4a1d02002-03-22 01:27:54 +00001204/* Called when some unhandleable client behaviour is detected.
1205 Prints a msg and aborts. */
1206extern void VG_(unimplemented) ( Char* msg );
1207
1208/* The stack on which Valgrind runs. We can't use the same stack as the
1209 simulatee -- that's an important design decision. */
1210extern UInt VG_(stack)[10000];
1211
1212/* Similarly, we have to ask for signals to be delivered on an
1213 alternative stack, since it is possible, although unlikely, that
1214 we'll have to run client code from inside the Valgrind-installed
1215 signal handler. If this happens it will be done by
1216 vg_deliver_signal_immediately(). */
1217extern UInt VG_(sigstack)[10000];
1218
sewardjde4a1d02002-03-22 01:27:54 +00001219/* Holds client's %esp at the point we gained control. From this the
1220 client's argc, argv and envp are deduced. */
1221extern Addr VG_(esp_at_startup);
1222extern Int VG_(client_argc);
1223extern Char** VG_(client_argv);
1224extern Char** VG_(client_envp);
1225
1226/* Remove valgrind.so from a LD_PRELOAD=... string so child processes
1227 don't get traced into. */
1228extern void VG_(mash_LD_PRELOAD_string)( Char* ld_preload_str );
1229
1230/* Something of a function looking for a home ... start up GDB. This
1231 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1232 *client's* stack. This is necessary to give GDB the illusion that
1233 the client program really was running on the real cpu. */
1234extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1235
1236/* Spew out vast amounts of junk during JITting? */
1237extern Bool VG_(disassemble);
1238
1239/* 64-bit counter for the number of basic blocks done. */
1240extern ULong VG_(bbs_done);
1241/* 64-bit counter for the number of bbs to go before a debug exit. */
1242extern ULong VG_(bbs_to_go);
1243
1244/* Counts downwards in vg_run_innerloop. */
1245extern UInt VG_(dispatch_ctr);
1246
sewardjde4a1d02002-03-22 01:27:54 +00001247/* Is the client running on the simulated CPU or the real one? */
1248extern Bool VG_(running_on_simd_CPU); /* Initially False */
1249
1250/* The current LRU epoch. */
1251extern UInt VG_(current_epoch);
1252
1253
1254/* --- Counters, for informational purposes only. --- */
1255
1256/* Number of lookups which miss the fast tt helper. */
1257extern UInt VG_(tt_fast_misses);
1258
1259/* Counts for LRU informational messages. */
1260
1261/* Number and total o/t size of new translations this epoch. */
1262extern UInt VG_(this_epoch_in_count);
1263extern UInt VG_(this_epoch_in_osize);
1264extern UInt VG_(this_epoch_in_tsize);
1265/* Number and total o/t size of discarded translations this epoch. */
1266extern UInt VG_(this_epoch_out_count);
1267extern UInt VG_(this_epoch_out_osize);
1268extern UInt VG_(this_epoch_out_tsize);
1269/* Number and total o/t size of translations overall. */
1270extern UInt VG_(overall_in_count);
1271extern UInt VG_(overall_in_osize);
1272extern UInt VG_(overall_in_tsize);
1273/* Number and total o/t size of discards overall. */
1274extern UInt VG_(overall_out_count);
1275extern UInt VG_(overall_out_osize);
1276extern UInt VG_(overall_out_tsize);
1277
1278/* The number of LRU-clearings of TT/TC. */
1279extern UInt VG_(number_of_lrus);
1280
1281/* Counts pertaining to the register allocator. */
1282
1283/* total number of uinstrs input to reg-alloc */
1284extern UInt VG_(uinstrs_prealloc);
1285
1286/* total number of uinstrs added due to spill code */
1287extern UInt VG_(uinstrs_spill);
1288
1289/* number of bbs requiring spill code */
1290extern UInt VG_(translations_needing_spill);
1291
1292/* total of register ranks over all translations */
1293extern UInt VG_(total_reg_rank);
1294
1295/* Counts pertaining to the self-modifying-code detection machinery. */
1296
1297/* Total number of writes checked. */
1298//extern UInt VG_(smc_total_check4s);
1299
1300/* Number of writes which the fast smc check couldn't show were
1301 harmless. */
1302extern UInt VG_(smc_cache_passed);
1303
1304/* Numnber of writes which really did write on original code. */
1305extern UInt VG_(smc_fancy_passed);
1306
1307/* Number of translations discarded as a result. */
1308//extern UInt VG_(smc_discard_count);
1309
1310/* Counts pertaining to internal sanity checking. */
1311extern UInt VG_(sanity_fast_count);
1312extern UInt VG_(sanity_slow_count);
1313
sewardj2e93c502002-04-12 11:12:52 +00001314/* Counts pertaining to the scheduler. */
1315extern UInt VG_(num_scheduling_events_MINOR);
1316extern UInt VG_(num_scheduling_events_MAJOR);
1317
sewardjde4a1d02002-03-22 01:27:54 +00001318
1319/* ---------------------------------------------------------------------
1320 Exports of vg_memory.c
1321 ------------------------------------------------------------------ */
1322
1323extern void VGM_(init_memory_audit) ( void );
1324extern Addr VGM_(curr_dataseg_end);
1325extern void VG_(show_reg_tags) ( void );
1326extern void VG_(detect_memory_leaks) ( void );
1327extern void VG_(done_prof_mem) ( void );
1328
1329/* Set permissions for an address range. Not speed-critical. */
1330extern void VGM_(make_noaccess) ( Addr a, UInt len );
1331extern void VGM_(make_writable) ( Addr a, UInt len );
1332extern void VGM_(make_readable) ( Addr a, UInt len );
1333/* Use with care! (read: use for shmat only) */
1334extern void VGM_(make_readwritable) ( Addr a, UInt len );
1335extern void VGM_(copy_address_range_perms) ( Addr src, Addr dst,
1336 UInt len );
1337
1338/* Check permissions for an address range. Not speed-critical. */
1339extern Bool VGM_(check_writable) ( Addr a, UInt len, Addr* bad_addr );
1340extern Bool VGM_(check_readable) ( Addr a, UInt len, Addr* bad_addr );
1341extern Bool VGM_(check_readable_asciiz) ( Addr a, Addr* bad_addr );
1342
1343/* Sanity checks which may be done at any time. Doing them at
1344 signal-delivery time turns out to be convenient. */
sewardj2e93c502002-04-12 11:12:52 +00001345extern void VG_(do_sanity_checks) ( ThreadId tid, Bool force_expensive );
sewardjde4a1d02002-03-22 01:27:54 +00001346/* Very cheap ... */
1347extern Bool VG_(first_and_last_secondaries_look_plausible) ( void );
1348
1349/* These functions are called from generated code. */
1350extern void VG_(helperc_STOREV4) ( UInt, Addr );
1351extern void VG_(helperc_STOREV2) ( UInt, Addr );
1352extern void VG_(helperc_STOREV1) ( UInt, Addr );
1353
1354extern UInt VG_(helperc_LOADV1) ( Addr );
1355extern UInt VG_(helperc_LOADV2) ( Addr );
1356extern UInt VG_(helperc_LOADV4) ( Addr );
1357
1358extern void VGM_(handle_esp_assignment) ( Addr new_espA );
1359extern void VGM_(fpu_write_check) ( Addr addr, Int size );
1360extern void VGM_(fpu_read_check) ( Addr addr, Int size );
1361
1362/* Safely (avoiding SIGSEGV / SIGBUS) scan the entire valid address
1363 space and pass the addresses and values of all addressible,
1364 defined, aligned words to notify_word. This is the basis for the
1365 leak detector. Returns the number of calls made to notify_word. */
1366UInt VG_(scan_all_valid_memory) ( void (*notify_word)( Addr, UInt ) );
1367
1368/* Is this address within some small distance below %ESP? Used only
1369 for the --workaround-gcc296-bugs kludge. */
sewardj8c824512002-04-14 04:16:48 +00001370extern Bool VG_(is_just_below_ESP)( Addr esp, Addr aa );
sewardjde4a1d02002-03-22 01:27:54 +00001371
1372/* Nasty kludgery to deal with applications which switch stacks,
1373 like netscape. */
sewardjde4a1d02002-03-22 01:27:54 +00001374#define VG_PLAUSIBLE_STACK_SIZE 8000000
1375
sewardjde4a1d02002-03-22 01:27:54 +00001376
1377/* ---------------------------------------------------------------------
1378 Exports of vg_syscall_mem.c
1379 ------------------------------------------------------------------ */
1380
sewardj2e93c502002-04-12 11:12:52 +00001381extern void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001382
sewardj2e93c502002-04-12 11:12:52 +00001383extern void VG_(check_known_blocking_syscall) ( ThreadId tid,
1384 Int syscallno,
1385 Int* /*IN*/ res );
sewardjde4a1d02002-03-22 01:27:54 +00001386
1387extern Bool VG_(is_kerror) ( Int res );
1388
sewardj2e93c502002-04-12 11:12:52 +00001389#define KERNEL_DO_SYSCALL(thread_id, result_lvalue) \
1390 VG_(load_thread_state)(thread_id); \
sewardjde4a1d02002-03-22 01:27:54 +00001391 VG_(copy_baseBlock_to_m_state_static)(); \
1392 VG_(do_syscall)(); \
1393 VG_(copy_m_state_static_to_baseBlock)(); \
sewardj2e93c502002-04-12 11:12:52 +00001394 VG_(save_thread_state)(thread_id); \
1395 result_lvalue = VG_(get_thread_state)(thread_id)->m_eax;
sewardjde4a1d02002-03-22 01:27:54 +00001396
1397
1398/* ---------------------------------------------------------------------
1399 Exports of vg_transtab.c
1400 ------------------------------------------------------------------ */
1401
1402/* An entry in the translation table (TT). */
1403typedef
1404 struct {
1405 /* +0 */ Addr orig_addr;
1406 /* +4 */ Addr trans_addr;
1407 /* +8 */ UInt mru_epoch;
1408 /* +12 */ UShort orig_size;
1409 /* +14 */ UShort trans_size;
1410 }
1411 TTEntry;
1412
1413/* The number of basic blocks in an epoch (one age-step). */
1414#define VG_BBS_PER_EPOCH 20000
1415
1416extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
1417extern void VG_(maybe_do_lru_pass) ( void );
1418extern void VG_(flush_transtab) ( void );
1419extern Addr VG_(copy_to_transcache) ( Addr trans_addr, Int trans_size );
1420extern void VG_(add_to_trans_tab) ( TTEntry* tte );
1421
1422extern void VG_(smc_mark_original) ( Addr original_addr,
1423 Int original_len );
1424
1425extern void VG_(init_transtab_and_SMC) ( void );
1426
1427extern void VG_(sanity_check_tc_tt) ( void );
1428extern Addr VG_(search_transtab) ( Addr original_addr );
1429
1430extern void VG_(invalidate_tt_fast)( void );
1431
1432
1433/* ---------------------------------------------------------------------
1434 Exports of vg_vtagops.c
1435 ------------------------------------------------------------------ */
1436
1437/* Lists the names of value-tag operations used in instrumented
1438 code. These are the third argument to TAG1 and TAG2 uinsns. */
1439
1440typedef
1441 enum {
1442 /* Unary. */
1443 VgT_PCast40, VgT_PCast20, VgT_PCast10,
1444 VgT_PCast01, VgT_PCast02, VgT_PCast04,
1445
1446 VgT_PCast14, VgT_PCast12, VgT_PCast11,
1447
1448 VgT_Left4, VgT_Left2, VgT_Left1,
1449
1450 VgT_SWiden14, VgT_SWiden24, VgT_SWiden12,
1451 VgT_ZWiden14, VgT_ZWiden24, VgT_ZWiden12,
1452
1453 /* Binary; 1st is rd; 2nd is rd+wr */
1454 VgT_UifU4, VgT_UifU2, VgT_UifU1, VgT_UifU0,
1455 VgT_DifD4, VgT_DifD2, VgT_DifD1,
1456
1457 VgT_ImproveAND4_TQ, VgT_ImproveAND2_TQ, VgT_ImproveAND1_TQ,
1458 VgT_ImproveOR4_TQ, VgT_ImproveOR2_TQ, VgT_ImproveOR1_TQ,
1459 VgT_DebugFn
1460 }
1461 VgTagOp;
1462
1463extern Char* VG_(nameOfTagOp) ( VgTagOp );
1464extern UInt VG_(DebugFn) ( UInt a1, UInt a2 );
1465
1466
1467/* ---------------------------------------------------------------------
1468 Exports of vg_syscall.S
1469 ------------------------------------------------------------------ */
1470
1471extern void VG_(do_syscall) ( void );
1472
1473
1474/* ---------------------------------------------------------------------
1475 Exports of vg_startup.S
1476 ------------------------------------------------------------------ */
1477
1478extern void VG_(shutdown);
1479extern void VG_(switch_to_real_CPU) ( void );
1480
1481extern void VG_(swizzle_esp_then_start_GDB) ( void );
1482
1483
1484/* ---------------------------------------------------------------------
1485 Exports of vg_dispatch.S
1486 ------------------------------------------------------------------ */
1487
sewardj2e93c502002-04-12 11:12:52 +00001488/* Run a thread for a (very short) while, until some event happens
1489 which means we need to defer to the scheduler. */
1490extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001491
1492
1493/* ---------------------------------------------------------------------
1494 Exports of vg_helpers.S
1495 ------------------------------------------------------------------ */
1496
sewardjde4a1d02002-03-22 01:27:54 +00001497/* SMC fast checks. */
1498extern void VG_(helper_smc_check4);
1499
1500/* Mul, div, etc, -- we don't codegen these directly. */
1501extern void VG_(helper_idiv_64_32);
1502extern void VG_(helper_div_64_32);
1503extern void VG_(helper_idiv_32_16);
1504extern void VG_(helper_div_32_16);
1505extern void VG_(helper_idiv_16_8);
1506extern void VG_(helper_div_16_8);
1507
1508extern void VG_(helper_imul_32_64);
1509extern void VG_(helper_mul_32_64);
1510extern void VG_(helper_imul_16_32);
1511extern void VG_(helper_mul_16_32);
1512extern void VG_(helper_imul_8_16);
1513extern void VG_(helper_mul_8_16);
1514
1515extern void VG_(helper_CLD);
1516extern void VG_(helper_STD);
1517extern void VG_(helper_get_dirflag);
1518
1519extern void VG_(helper_shldl);
1520extern void VG_(helper_shldw);
1521extern void VG_(helper_shrdl);
1522extern void VG_(helper_shrdw);
1523
1524extern void VG_(helper_RDTSC);
1525extern void VG_(helper_CPUID);
1526
sewardjde4a1d02002-03-22 01:27:54 +00001527extern void VG_(helper_bsf);
1528extern void VG_(helper_bsr);
1529
1530extern void VG_(helper_fstsw_AX);
1531extern void VG_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001532extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001533extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001534
1535extern void VG_(helper_value_check4_fail);
1536extern void VG_(helper_value_check2_fail);
1537extern void VG_(helper_value_check1_fail);
1538extern void VG_(helper_value_check0_fail);
1539
sewardjbc5b99f2002-04-13 00:08:51 +00001540/* NOT FUNCTIONS; these are bogus RETURN ADDRESS. */
sewardj54cacf02002-04-12 23:24:59 +00001541extern void VG_(signalreturn_bogusRA)( void );
sewardjbc5b99f2002-04-13 00:08:51 +00001542extern void VG_(pthreadreturn_bogusRA)( void );
sewardj54cacf02002-04-12 23:24:59 +00001543
sewardjde4a1d02002-03-22 01:27:54 +00001544
1545/* ---------------------------------------------------------------------
1546 The state of the simulated CPU.
1547 ------------------------------------------------------------------ */
1548
1549/* This is the Intel register encoding. */
1550#define R_EAX 0
1551#define R_ECX 1
1552#define R_EDX 2
1553#define R_EBX 3
1554#define R_ESP 4
1555#define R_EBP 5
1556#define R_ESI 6
1557#define R_EDI 7
1558
1559#define R_AL (0+R_EAX)
1560#define R_CL (0+R_ECX)
1561#define R_DL (0+R_EDX)
1562#define R_BL (0+R_EBX)
1563#define R_AH (4+R_EAX)
1564#define R_CH (4+R_ECX)
1565#define R_DH (4+R_EDX)
1566#define R_BH (4+R_EBX)
1567
1568
1569/* ---------------------------------------------------------------------
1570 Offsets into baseBlock for everything which needs to referred to
1571 from generated code. The order of these decls does not imply
1572 what the order of the actual offsets is. The latter is important
1573 and is set up in vg_main.c.
1574 ------------------------------------------------------------------ */
1575
1576/* An array of words. In generated code, %ebp always points to the
1577 start of this array. Useful stuff, like the simulated CPU state,
1578 and the addresses of helper functions, can then be found by
1579 indexing off %ebp. The following declares variables which, at
1580 startup time, are given values denoting offsets into baseBlock.
1581 These offsets are in *words* from the start of baseBlock. */
1582
1583#define VG_BASEBLOCK_WORDS 200
1584
1585extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1586
1587
1588/* -----------------------------------------------------
1589 Read-write parts of baseBlock.
1590 -------------------------------------------------- */
1591
1592/* State of the simulated CPU. */
1593extern Int VGOFF_(m_eax);
1594extern Int VGOFF_(m_ecx);
1595extern Int VGOFF_(m_edx);
1596extern Int VGOFF_(m_ebx);
1597extern Int VGOFF_(m_esp);
1598extern Int VGOFF_(m_ebp);
1599extern Int VGOFF_(m_esi);
1600extern Int VGOFF_(m_edi);
1601extern Int VGOFF_(m_eflags);
1602extern Int VGOFF_(m_fpustate);
1603extern Int VGOFF_(m_eip);
1604
1605/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1606extern Int VGOFF_(spillslots);
1607
1608/* Records the valid bits for the 8 integer regs & flags reg. */
1609extern Int VGOFF_(sh_eax);
1610extern Int VGOFF_(sh_ecx);
1611extern Int VGOFF_(sh_edx);
1612extern Int VGOFF_(sh_ebx);
1613extern Int VGOFF_(sh_esp);
1614extern Int VGOFF_(sh_ebp);
1615extern Int VGOFF_(sh_esi);
1616extern Int VGOFF_(sh_edi);
1617extern Int VGOFF_(sh_eflags);
1618
1619
1620/* -----------------------------------------------------
1621 Read-only parts of baseBlock.
1622 -------------------------------------------------- */
1623
1624/* Offsets of addresses of helper functions. A "helper" function is
1625 one which is called from generated code. */
1626
1627extern Int VGOFF_(helper_idiv_64_32);
1628extern Int VGOFF_(helper_div_64_32);
1629extern Int VGOFF_(helper_idiv_32_16);
1630extern Int VGOFF_(helper_div_32_16);
1631extern Int VGOFF_(helper_idiv_16_8);
1632extern Int VGOFF_(helper_div_16_8);
1633
1634extern Int VGOFF_(helper_imul_32_64);
1635extern Int VGOFF_(helper_mul_32_64);
1636extern Int VGOFF_(helper_imul_16_32);
1637extern Int VGOFF_(helper_mul_16_32);
1638extern Int VGOFF_(helper_imul_8_16);
1639extern Int VGOFF_(helper_mul_8_16);
1640
1641extern Int VGOFF_(helper_CLD);
1642extern Int VGOFF_(helper_STD);
1643extern Int VGOFF_(helper_get_dirflag);
1644
1645extern Int VGOFF_(helper_shldl);
1646extern Int VGOFF_(helper_shldw);
1647extern Int VGOFF_(helper_shrdl);
1648extern Int VGOFF_(helper_shrdw);
1649
1650extern Int VGOFF_(helper_RDTSC);
1651extern Int VGOFF_(helper_CPUID);
1652
sewardjde4a1d02002-03-22 01:27:54 +00001653extern Int VGOFF_(helper_bsf);
1654extern Int VGOFF_(helper_bsr);
1655
1656extern Int VGOFF_(helper_fstsw_AX);
1657extern Int VGOFF_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001658extern Int VGOFF_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001659extern Int VGOFF_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001660
1661extern Int VGOFF_(helper_value_check4_fail);
1662extern Int VGOFF_(helper_value_check2_fail);
1663extern Int VGOFF_(helper_value_check1_fail);
1664extern Int VGOFF_(helper_value_check0_fail);
1665
sewardjde4a1d02002-03-22 01:27:54 +00001666extern Int VGOFF_(helperc_STOREV4); /* :: UInt -> Addr -> void */
1667extern Int VGOFF_(helperc_STOREV2); /* :: UInt -> Addr -> void */
1668extern Int VGOFF_(helperc_STOREV1); /* :: UInt -> Addr -> void */
1669
1670extern Int VGOFF_(helperc_LOADV4); /* :: Addr -> UInt -> void */
1671extern Int VGOFF_(helperc_LOADV2); /* :: Addr -> UInt -> void */
1672extern Int VGOFF_(helperc_LOADV1); /* :: Addr -> UInt -> void */
1673
1674extern Int VGOFF_(handle_esp_assignment); /* :: Addr -> void */
1675extern Int VGOFF_(fpu_write_check); /* :: Addr -> Int -> void */
1676extern Int VGOFF_(fpu_read_check); /* :: Addr -> Int -> void */
1677
sewardjde4a1d02002-03-22 01:27:54 +00001678
1679
1680#endif /* ndef __VG_INCLUDE_H */
1681
sewardj3b2736a2002-03-24 12:18:35 +00001682
1683/* ---------------------------------------------------------------------
1684 Finally - autoconf-generated settings
1685 ------------------------------------------------------------------ */
1686
1687#include "config.h"
1688
sewardjde4a1d02002-03-22 01:27:54 +00001689/*--------------------------------------------------------------------*/
1690/*--- end vg_include.h ---*/
1691/*--------------------------------------------------------------------*/