blob: 4ae38505f75ee827e1d7138097efa5430a87c150 [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. */
sewardj5f07b662002-04-23 16:52:51 +0000105#define VG_GCC296_BUG_STACK_SLOP /*256*/ 1024
sewardjde4a1d02002-03-22 01:27:54 +0000106
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
sewardj5f07b662002-04-23 16:52:51 +0000126 scheduler algorithms is surely O(N) in the number of threads, since
127 that's simple, at least. And (in practice) we hope that most
sewardj2e93c502002-04-12 11:12:52 +0000128 programs do not need many threads. */
sewardj5f07b662002-04-23 16:52:51 +0000129#define VG_N_THREADS 100
130
131/* Maximum number of pthread keys available. Again, we start low until
132 the need for a higher number presents itself. */
133#define VG_N_THREAD_KEYS 10
sewardj2e93c502002-04-12 11:12:52 +0000134
135/* Number of file descriptors that can simultaneously be waited on for
136 I/O to complete. Perhaps this should be the same as VG_N_THREADS
137 (surely a thread can't wait on more than one fd at once?. Who
138 knows.) */
139#define VG_N_WAITING_FDS 10
140
sewardjde4a1d02002-03-22 01:27:54 +0000141
142/* ---------------------------------------------------------------------
143 Basic types
144 ------------------------------------------------------------------ */
145
146typedef unsigned char UChar;
147typedef unsigned short UShort;
148typedef unsigned int UInt;
149typedef unsigned long long int ULong;
150
151typedef signed char Char;
152typedef signed short Short;
153typedef signed int Int;
154typedef signed long long int Long;
155
156typedef unsigned int Addr;
157
158typedef unsigned char Bool;
159#define False ((Bool)0)
160#define True ((Bool)1)
161
162#define mycat_wrk(aaa,bbb) aaa##bbb
163#define mycat(aaa,bbb) mycat_wrk(aaa,bbb)
164
165/* Just pray that gcc's constant folding works properly ... */
166#define BITS(bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0) \
167 ( ((bit7) << 7) | ((bit6) << 6) | ((bit5) << 5) | ((bit4) << 4) \
168 | ((bit3) << 3) | ((bit2) << 2) | ((bit1) << 1) | (bit0))
169
170
171/* ---------------------------------------------------------------------
172 Now the basic types are set up, we can haul in the kernel-interface
173 definitions.
174 ------------------------------------------------------------------ */
175
176#include "./vg_kerneliface.h"
177
178
179/* ---------------------------------------------------------------------
180 Command-line-settable options
181 ------------------------------------------------------------------ */
182
183#define VG_CLO_SMC_NONE 0
184#define VG_CLO_SMC_SOME 1
185#define VG_CLO_SMC_ALL 2
186
187#define VG_CLO_MAX_SFILES 10
188
sewardj97ced732002-03-25 00:07:36 +0000189/* Shall we V-check addrs (they are always A checked too): default: YES */
190extern Bool VG_(clo_check_addrVs);
sewardjde4a1d02002-03-22 01:27:54 +0000191/* Enquire about whether to attach to GDB at errors? default: NO */
192extern Bool VG_(clo_GDB_attach);
193/* Sanity-check level: 0 = none, 1 (default), > 1 = expensive. */
194extern Int VG_(sanity_level);
195/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
196extern Int VG_(clo_verbosity);
197/* Automatically attempt to demangle C++ names? default: YES */
198extern Bool VG_(clo_demangle);
199/* Do leak check at exit? default: NO */
200extern Bool VG_(clo_leak_check);
201/* In leak check, show reachable-but-not-freed blocks? default: NO */
202extern Bool VG_(clo_show_reachable);
203/* How closely should we compare ExeContexts in leak records? default: 2 */
204extern Int VG_(clo_leak_resolution);
205/* Round malloc sizes upwards to integral number of words? default:
206 NO */
207extern Bool VG_(clo_sloppy_malloc);
208/* Allow loads from partially-valid addresses? default: YES */
209extern Bool VG_(clo_partial_loads_ok);
210/* Simulate child processes? default: NO */
211extern Bool VG_(clo_trace_children);
212/* The file id on which we send all messages. default: 2 (stderr). */
213extern Int VG_(clo_logfile_fd);
214/* Max volume of the freed blocks queue. */
215extern Int VG_(clo_freelist_vol);
216/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
217 default: NO */
218extern Bool VG_(clo_workaround_gcc296_bugs);
219
220/* The number of suppression files specified. */
221extern Int VG_(clo_n_suppressions);
222/* The names of the suppression files. */
223extern Char* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
224
225/* Single stepping? default: NO */
226extern Bool VG_(clo_single_step);
227/* Code improvement? default: YES */
228extern Bool VG_(clo_optimise);
229/* Memory-check instrumentation? default: YES */
230extern Bool VG_(clo_instrument);
231/* DEBUG: clean up instrumented code? default: YES */
232extern Bool VG_(clo_cleanup);
sewardjde4a1d02002-03-22 01:27:54 +0000233/* SMC write checks? default: SOME (1,2,4 byte movs to mem) */
234extern Int VG_(clo_smc_check);
235/* DEBUG: print system calls? default: NO */
236extern Bool VG_(clo_trace_syscalls);
237/* DEBUG: print signal details? default: NO */
238extern Bool VG_(clo_trace_signals);
239/* DEBUG: print symtab details? default: NO */
240extern Bool VG_(clo_trace_symtab);
241/* DEBUG: print malloc details? default: NO */
242extern Bool VG_(clo_trace_malloc);
sewardj8937c812002-04-12 20:12:20 +0000243/* DEBUG: print thread scheduling events? default: NO */
244extern Bool VG_(clo_trace_sched);
sewardj45b4b372002-04-16 22:50:32 +0000245/* DEBUG: print pthread (mutex etc) events? default: 0 (none), 1
246 (some), 2 (all) */
247extern Int VG_(clo_trace_pthread_level);
sewardjde4a1d02002-03-22 01:27:54 +0000248/* Stop after this many basic blocks. default: Infinity. */
249extern ULong VG_(clo_stop_after);
250/* Display gory details for the k'th most popular error. default:
251 Infinity. */
252extern Int VG_(clo_dump_error);
253/* Number of parents of a backtrace. Default: 8. */
254extern Int VG_(clo_backtrace_size);
255
256
257/* ---------------------------------------------------------------------
258 Debugging and profiling stuff
259 ------------------------------------------------------------------ */
260
261/* No, really. I _am_ that strange. */
262#define OINK(nnn) VG_(message)(Vg_DebugMsg, "OINK %d",nnn)
263
264/* Tools for building messages from multiple parts. */
265typedef
266 enum { Vg_UserMsg, Vg_DebugMsg, Vg_DebugExtraMsg }
267 VgMsgKind;
268
269extern void VG_(start_msg) ( VgMsgKind kind );
270extern void VG_(add_to_msg) ( Char* format, ... );
271extern void VG_(end_msg) ( void );
272
273/* Send a simple, single-part message. */
274extern void VG_(message) ( VgMsgKind kind, Char* format, ... );
275
276/* Create a logfile into which messages can be dumped. */
277extern void VG_(startup_logging) ( void );
278extern void VG_(shutdown_logging) ( void );
279
280
281/* Profiling stuff */
282#ifdef VG_PROFILE
283
284#define VGP_M_STACK 10
285
286#define VGP_M_CCS 20 /* == the # of elems in VGP_LIST */
287#define VGP_LIST \
288 VGP_PAIR(VgpRun=0, "running"), \
289 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
290 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
291 VGP_PAIR(VgpTranslate, "translate-main"), \
292 VGP_PAIR(VgpToUCode, "to-ucode"), \
293 VGP_PAIR(VgpFromUcode, "from-ucode"), \
294 VGP_PAIR(VgpImprove, "improve"), \
295 VGP_PAIR(VgpInstrument, "instrument"), \
296 VGP_PAIR(VgpCleanup, "cleanup"), \
297 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
298 VGP_PAIR(VgpDoLRU, "do-lru"), \
299 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
300 VGP_PAIR(VgpInitAudit, "init-mem-audit"), \
301 VGP_PAIR(VgpExeContext, "exe-context"), \
302 VGP_PAIR(VgpReadSyms, "read-syms"), \
303 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
304 VGP_PAIR(VgpSARP, "set-addr-range-perms"), \
305 VGP_PAIR(VgpSyscall, "syscall wrapper"), \
306 VGP_PAIR(VgpSpare1, "spare 1"), \
307 VGP_PAIR(VgpSpare2, "spare 2")
308
309#define VGP_PAIR(enumname,str) enumname
310typedef enum { VGP_LIST } VgpCC;
311#undef VGP_PAIR
312
313extern void VGP_(init_profiling) ( void );
314extern void VGP_(done_profiling) ( void );
315extern void VGP_(pushcc) ( VgpCC );
316extern void VGP_(popcc) ( void );
317
318#define VGP_PUSHCC(cc) VGP_(pushcc)(cc)
319#define VGP_POPCC VGP_(popcc)()
320
321#else
322
323#define VGP_PUSHCC(cc) /* */
324#define VGP_POPCC /* */
325
326#endif /* VG_PROFILE */
327
328
329/* ---------------------------------------------------------------------
330 Exports of vg_malloc2.c
331 ------------------------------------------------------------------ */
332
333/* Allocation arenas.
334 SYMTAB is for Valgrind's symbol table storage.
335 CLIENT is for the client's mallocs/frees.
336 DEMANGLE is for the C++ demangler.
337 EXECTXT is for storing ExeContexts.
338 ERRCTXT is for storing ErrContexts.
339 PRIVATE is for Valgrind general stuff.
340 TRANSIENT is for very short-term use. It should be empty
341 in between uses.
342 When adding a new arena, remember also to add it
343 to ensure_mm_init().
344*/
345typedef Int ArenaId;
346
347#define VG_N_ARENAS 7
348
349#define VG_AR_PRIVATE 0 /* :: ArenaId */
350#define VG_AR_SYMTAB 1 /* :: ArenaId */
351#define VG_AR_CLIENT 2 /* :: ArenaId */
352#define VG_AR_DEMANGLE 3 /* :: ArenaId */
353#define VG_AR_EXECTXT 4 /* :: ArenaId */
354#define VG_AR_ERRCTXT 5 /* :: ArenaId */
355#define VG_AR_TRANSIENT 6 /* :: ArenaId */
356
357extern void* VG_(malloc) ( ArenaId arena, Int nbytes );
358extern void VG_(free) ( ArenaId arena, void* ptr );
359extern void* VG_(calloc) ( ArenaId arena, Int nmemb, Int nbytes );
360extern void* VG_(realloc) ( ArenaId arena, void* ptr, Int size );
361extern void* VG_(malloc_aligned) ( ArenaId aid, Int req_alignB,
362 Int req_pszB );
363
364extern void VG_(mallocSanityCheckArena) ( ArenaId arena );
365extern void VG_(mallocSanityCheckAll) ( void );
366
367extern void VG_(show_all_arena_stats) ( void );
368extern Bool VG_(is_empty_arena) ( ArenaId aid );
369
370
371/* The red-zone size for the client. This can be arbitrary, but
372 unfortunately must be set at compile time. */
373#define VG_AR_CLIENT_REDZONE_SZW 4
374
375#define VG_AR_CLIENT_REDZONE_SZB \
376 (VG_AR_CLIENT_REDZONE_SZW * VKI_BYTES_PER_WORD)
377
378
379/* ---------------------------------------------------------------------
sewardj2e93c502002-04-12 11:12:52 +0000380 Exports of vg_clientfuns.c
381 ------------------------------------------------------------------ */
382
383/* This doesn't export code or data that valgrind.so needs to link
384 against. However, the scheduler does need to know the following
385 request codes. A few, publically-visible, request codes are also
386 defined in valgrind.h. */
387
388#define VG_USERREQ__MALLOC 0x2001
389#define VG_USERREQ__BUILTIN_NEW 0x2002
390#define VG_USERREQ__BUILTIN_VEC_NEW 0x2003
391
392#define VG_USERREQ__FREE 0x2004
393#define VG_USERREQ__BUILTIN_DELETE 0x2005
394#define VG_USERREQ__BUILTIN_VEC_DELETE 0x2006
395
396#define VG_USERREQ__CALLOC 0x2007
397#define VG_USERREQ__REALLOC 0x2008
398#define VG_USERREQ__MEMALIGN 0x2009
399
400
401#define VG_USERREQ__PTHREAD_CREATE 0x3001
sewardjbc5b99f2002-04-13 00:08:51 +0000402#define VG_USERREQ__PTHREAD_JOIN 0x3002
403#define VG_USERREQ__PTHREAD_GET_THREADID 0x3003
sewardj3b5d8862002-04-20 13:53:23 +0000404#define VG_USERREQ__PTHREAD_MUTEX_LOCK 0x3004
sewardj30671ff2002-04-21 00:13:57 +0000405#define VG_USERREQ__PTHREAD_MUTEX_TRYLOCK 0x3005
406#define VG_USERREQ__PTHREAD_MUTEX_UNLOCK 0x3006
407#define VG_USERREQ__PTHREAD_CANCEL 0x3007
408#define VG_USERREQ__PTHREAD_EXIT 0x3008
409#define VG_USERREQ__PTHREAD_COND_WAIT 0x3009
sewardj5f07b662002-04-23 16:52:51 +0000410#define VG_USERREQ__PTHREAD_COND_TIMEDWAIT 0x300A
411#define VG_USERREQ__PTHREAD_COND_SIGNAL 0x300B
412#define VG_USERREQ__PTHREAD_COND_BROADCAST 0x300C
413#define VG_USERREQ__PTHREAD_KEY_CREATE 0x300D
414#define VG_USERREQ__PTHREAD_KEY_DELETE 0x300E
415#define VG_USERREQ__PTHREAD_SETSPECIFIC 0x300F
416#define VG_USERREQ__PTHREAD_GETSPECIFIC 0x3010
417
418#define VG_USERREQ__READ_MILLISECOND_TIMER 0x4001
sewardj2e93c502002-04-12 11:12:52 +0000419
sewardj45b4b372002-04-16 22:50:32 +0000420/* Cosmetic ... */
421#define VG_USERREQ__GET_PTHREAD_TRACE_LEVEL 0x3101
422
sewardj54cacf02002-04-12 23:24:59 +0000423/*
424In vg_constants.h:
425#define VG_USERREQ__SIGNAL_RETURNS 0x4001
sewardjbc5b99f2002-04-13 00:08:51 +0000426#define VG_USERREQ__PTHREAD_RETURNS 0x4002
427#define VG_USERREQ__SHUTDOWN_VALGRIND 0x4003
sewardj54cacf02002-04-12 23:24:59 +0000428*/
429
430
sewardj2e93c502002-04-12 11:12:52 +0000431/* ---------------------------------------------------------------------
432 Constants pertaining to the simulated CPU state, VG_(baseBlock),
433 which need to go here to avoid ugly circularities.
434 ------------------------------------------------------------------ */
435
436/* How big is the saved FPU state? */
437#define VG_SIZE_OF_FPUSTATE 108
438/* ... and in words ... */
439#define VG_SIZE_OF_FPUSTATE_W ((VG_SIZE_OF_FPUSTATE+3)/4)
440
441
442/* ---------------------------------------------------------------------
443 Exports of vg_scheduler.c
444 ------------------------------------------------------------------ */
445
446/* ThreadIds are simply indices into the vg_threads[] array. */
447typedef
448 UInt
449 ThreadId;
450
sewardj6072c362002-04-19 14:40:57 +0000451/* Special magic value for an invalid ThreadId. It corresponds to
452 LinuxThreads using zero as the initial value for
453 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
454#define VG_INVALID_THREADID ((ThreadId)(0))
sewardj2e93c502002-04-12 11:12:52 +0000455
456typedef
457 enum {
458 VgTs_Empty, /* this slot is not in use */
459 VgTs_Runnable, /* waiting to be scheduled */
460 VgTs_WaitJoiner, /* waiting for someone to do join on me */
461 VgTs_WaitJoinee, /* waiting for the thread I did join on */
462 VgTs_WaitFD, /* waiting for I/O completion on a fd */
463 VgTs_WaitMX, /* waiting on a mutex */
sewardj3b5d8862002-04-20 13:53:23 +0000464 VgTs_WaitCV, /* waiting on a condition variable */
sewardj2e93c502002-04-12 11:12:52 +0000465 VgTs_Sleeping /* sleeping for a while */
466 }
467 ThreadStatus;
468
469typedef
470 struct {
sewardj6072c362002-04-19 14:40:57 +0000471 /* ThreadId == 0 (and hence vg_threads[0]) is NEVER USED.
472 The thread identity is simply the index in vg_threads[].
473 ThreadId == 1 is the root thread and has the special property
sewardj1e8cdc92002-04-18 11:37:52 +0000474 that we don't try and allocate or deallocate its stack. For
475 convenience of generating error message, we also put the
476 ThreadId in this tid field, but be aware that it should
sewardj604ec3c2002-04-18 22:38:41 +0000477 ALWAYS == the index in vg_threads[]. */
sewardj1e8cdc92002-04-18 11:37:52 +0000478 ThreadId tid;
sewardj2e93c502002-04-12 11:12:52 +0000479
sewardj5f07b662002-04-23 16:52:51 +0000480 /* Current scheduling status.
481
482 Complications: whenever this is set to VgTs_WaitMX, you
483 should also set .m_edx to whatever the required return value
484 is for pthread_mutex_lock / pthread_cond_timedwait for when
485 the mutex finally gets unblocked. */
sewardj2e93c502002-04-12 11:12:52 +0000486 ThreadStatus status;
487
488 /* Identity of joiner (thread who called join on me), or
489 VG_INVALID_THREADID if no one asked to join yet. */
490 ThreadId joiner;
491
sewardj3b5d8862002-04-20 13:53:23 +0000492 /* When .status == WaitMX, points to the mutex I am waiting for.
493 When .status == WaitCV, points to the mutex associated with
494 the condition variable indicated by the .associated_cv field.
495 In all other cases, should be NULL. */
496 void* /* pthread_mutex_t* */ associated_mx;
497
498 /* When .status == WaitCV, points to the condition variable I am
499 waiting for. In all other cases, should be NULL. */
500 void* /* pthread_cond_t* */ associated_cv;
sewardj2e93c502002-04-12 11:12:52 +0000501
sewardj5f07b662002-04-23 16:52:51 +0000502 /* If VgTs_Sleeping, this is when we should wake up, measured in
503 milliseconds as supplied by VG_(read_millisecond_counter).
504
505 If VgTs_WaitCV, this indicates the time at which
506 pthread_cond_timedwait should wake up. If == 0xFFFFFFFF,
507 this means infinitely far in the future, viz,
508 pthread_cond_wait. */
509 UInt awaken_at;
sewardj2e93c502002-04-12 11:12:52 +0000510
511 /* return value */
512 void* retval;
513
sewardj5f07b662002-04-23 16:52:51 +0000514 /* thread-specific data */
515 void* specifics[VG_N_THREAD_KEYS];
516
sewardj2e93c502002-04-12 11:12:52 +0000517 /* Stacks. When a thread slot is freed, we don't deallocate its
518 stack; we just leave it lying around for the next use of the
519 slot. If the next use of the slot requires a larger stack,
520 only then is the old one deallocated and a new one
521 allocated.
522
523 For the main thread (threadid == 0), this mechanism doesn't
524 apply. We don't know the size of the stack since we didn't
525 allocate it, and furthermore we never reallocate it. */
526
527 /* The allocated size of this thread's stack (permanently zero
528 if this is ThreadId == 0, since we didn't allocate its stack) */
529 UInt stack_size;
530
531 /* Address of the lowest word in this thread's stack. NULL means
532 not allocated yet.
533 */
534 Addr stack_base;
535
sewardj1e8cdc92002-04-18 11:37:52 +0000536 /* Address of the highest legitimate word in this stack. This is
537 used for error messages only -- not critical for execution
538 correctness. Is is set for all stacks, specifically including
539 ThreadId == 0 (the main thread). */
540 Addr stack_highest_word;
541
sewardj2e93c502002-04-12 11:12:52 +0000542 /* Saved machine context. */
543 UInt m_eax;
544 UInt m_ebx;
545 UInt m_ecx;
546 UInt m_edx;
547 UInt m_esi;
548 UInt m_edi;
549 UInt m_ebp;
550 UInt m_esp;
551 UInt m_eflags;
552 UInt m_eip;
553 UInt m_fpu[VG_SIZE_OF_FPUSTATE_W];
554
555 UInt sh_eax;
556 UInt sh_ebx;
557 UInt sh_ecx;
558 UInt sh_edx;
559 UInt sh_esi;
560 UInt sh_edi;
561 UInt sh_ebp;
562 UInt sh_esp;
563 UInt sh_eflags;
564 }
565 ThreadState;
566
567
568/* Copy the specified thread's state into VG_(baseBlock) in
569 preparation for running it. */
570extern void VG_(load_thread_state)( ThreadId );
571
572/* Save the specified thread's state back in VG_(baseBlock), and fill
573 VG_(baseBlock) with junk, for sanity-check reasons. */
574extern void VG_(save_thread_state)( ThreadId );
575
576/* Get the thread state block for the specified thread. */
577extern ThreadState* VG_(get_thread_state)( ThreadId );
578
sewardj1e8cdc92002-04-18 11:37:52 +0000579/* And for the currently running one, if valid. */
580extern ThreadState* VG_(get_current_thread_state) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000581
sewardj1e8cdc92002-04-18 11:37:52 +0000582/* Similarly ... */
583extern ThreadId VG_(get_current_tid) ( void );
584
585/* Which thread is this address in the stack of, if any? Used for
586 error message generation. */
587extern ThreadId VG_(identify_stack_addr)( Addr a );
588
sewardj2e93c502002-04-12 11:12:52 +0000589
590/* Return codes from the scheduler. */
591typedef
592 enum { VgSrc_Deadlock, VgSrc_Shutdown, VgSrc_BbsDone }
593 VgSchedReturnCode;
594
595/* The scheduler. */
596extern VgSchedReturnCode VG_(scheduler) ( void );
597
598extern void VG_(scheduler_init) ( void );
599
sewardj15a43e12002-04-17 19:35:12 +0000600extern void VG_(pp_sched_status) ( void );
sewardj2e93c502002-04-12 11:12:52 +0000601
602/* vg_oursignalhandler() might longjmp(). Here's the jmp_buf. */
603extern jmp_buf VG_(scheduler_jmpbuf);
604/* ... and if so, here's the signal which caused it to do so. */
605extern Int VG_(longjmpd_on_signal);
606
607
608/* We check that the initial stack, which we can't move, is allocated
609 here. VG_(scheduler_init) checks this.
610*/
611#define VG_STARTUP_STACK_MASK (Addr)0xBFFF8000
612
613
614/* The red-zone size which we put at the bottom (highest address) of
615 thread stacks, for paranoia reasons. This can be arbitrary, and
616 doesn't really need to be set at compile time. */
617#define VG_AR_CLIENT_STACKBASE_REDZONE_SZW 4
618
619#define VG_AR_CLIENT_STACKBASE_REDZONE_SZB \
620 (VG_AR_CLIENT_STACKBASE_REDZONE_SZW * VKI_BYTES_PER_WORD)
621
622
623
624/* ---------------------------------------------------------------------
sewardjde4a1d02002-03-22 01:27:54 +0000625 Exports of vg_signals.c
626 ------------------------------------------------------------------ */
627
sewardjde4a1d02002-03-22 01:27:54 +0000628extern void VG_(sigstartup_actions) ( void );
629
sewardj2e93c502002-04-12 11:12:52 +0000630extern void VG_(deliver_signals) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000631extern void VG_(unblock_host_signal) ( Int sigNo );
632
633
634/* Fake system calls for signal handling. */
sewardj2e93c502002-04-12 11:12:52 +0000635extern void VG_(do__NR_sigaction) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +0000636extern void VG_(do__NR_sigprocmask) ( Int how, vki_ksigset_t* set );
637
sewardj2e93c502002-04-12 11:12:52 +0000638/* Modify the current thread's state once we have detected it is
639 returning from a signal handler. */
sewardj77e466c2002-04-14 02:29:29 +0000640extern Bool VG_(signal_returns) ( ThreadId );
sewardjde4a1d02002-03-22 01:27:54 +0000641
sewardj2e93c502002-04-12 11:12:52 +0000642/* Handy utilities to block/restore all host signals. */
643extern void VG_(block_all_host_signals)
644 ( /* OUT */ vki_ksigset_t* saved_mask );
645extern void VG_(restore_host_signals)
646 ( /* IN */ vki_ksigset_t* saved_mask );
sewardjde4a1d02002-03-22 01:27:54 +0000647
648/* ---------------------------------------------------------------------
649 Exports of vg_mylibc.c
650 ------------------------------------------------------------------ */
651
652
653#define NULL ((void*)0)
654
655extern void VG_(exit)( Int status )
656 __attribute__ ((__noreturn__));
657
658extern void VG_(printf) ( const char *format, ... );
659/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
660
661extern void VG_(sprintf) ( Char* buf, Char *format, ... );
662
663extern void VG_(vprintf) ( void(*send)(Char),
664 const Char *format, va_list vargs );
665
666extern Bool VG_(isspace) ( Char c );
667
668extern Int VG_(strlen) ( const Char* str );
669
670extern Long VG_(atoll) ( Char* str );
671
672extern Char* VG_(strcat) ( Char* dest, const Char* src );
673extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
674extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
675
676extern Char* VG_(strcpy) ( Char* dest, const Char* src );
677
678extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
679extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
680
681extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
682extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
683
684extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
685extern Char* VG_(strchr) ( const Char* s, Char c );
686extern Char* VG_(strdup) ( ArenaId aid, const Char* s);
687
688extern Char* VG_(getenv) ( Char* name );
689extern Int VG_(getpid) ( void );
sewardj5f07b662002-04-23 16:52:51 +0000690
691extern void VG_(start_rdtsc_calibration) ( void );
692extern void VG_(end_rdtsc_calibration) ( void );
693extern UInt VG_(read_millisecond_timer) ( void );
sewardjde4a1d02002-03-22 01:27:54 +0000694
695
696extern Char VG_(toupper) ( Char c );
697
698extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
699
700extern void VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
701
702extern Bool VG_(stringMatch) ( Char* pat, Char* str );
703
704
705#define __STRING(x) #x
706
707/* Asserts are permanently enabled. Hurrah! */
708#define vg_assert(expr) \
709 ((void) ((expr) ? 0 : \
710 (VG_(assert_fail) (__STRING(expr), \
711 __FILE__, __LINE__, \
712 __PRETTY_FUNCTION__), 0)))
713
714extern void VG_(assert_fail) ( Char* expr, Char* file,
715 Int line, Char* fn )
716 __attribute__ ((__noreturn__));
717
sewardjde4a1d02002-03-22 01:27:54 +0000718/* Reading files. */
719extern Int VG_(open_read) ( Char* pathname );
720extern void VG_(close) ( Int fd );
721extern Int VG_(read) ( Int fd, void* buf, Int count);
722extern Int VG_(write) ( Int fd, void* buf, Int count);
723
sewardj2e93c502002-04-12 11:12:52 +0000724extern Int VG_(fcntl) ( Int fd, Int cmd, Int arg );
725
726extern Int VG_(select)( Int n,
727 vki_fd_set* readfds,
728 vki_fd_set* writefds,
729 vki_fd_set* exceptfds,
730 struct vki_timeval * timeout );
731extern Int VG_(nanosleep)( const struct vki_timespec *req,
732 struct vki_timespec *rem );
733
734
sewardjde4a1d02002-03-22 01:27:54 +0000735/* mmap-ery ... */
736extern void* VG_(mmap)( void* start, UInt length,
737 UInt prot, UInt flags, UInt fd, UInt offset );
738
sewardj2e93c502002-04-12 11:12:52 +0000739extern Int VG_(munmap)( void* start, Int length );
sewardjde4a1d02002-03-22 01:27:54 +0000740
741
742/* Print a (panic) message, and abort. */
743extern void VG_(panic) ( Char* str )
744 __attribute__ ((__noreturn__));
745
746/* Get memory by anonymous mmap. */
sewardje6a25242002-04-21 22:03:07 +0000747extern void* VG_(get_memory_from_mmap) ( Int nBytes );
748
749/* Crude stand-in for the glibc system() call. */
750extern Int VG_(system) ( Char* cmd );
751
sewardjde4a1d02002-03-22 01:27:54 +0000752
753/* Signal stuff. Note that these use the vk_ (kernel) structure
754 definitions, which are different in places from those that glibc
755 defines. Since we're operating right at the kernel interface,
756 glibc's view of the world is entirely irrelevant. */
757extern Int VG_(ksigfillset)( vki_ksigset_t* set );
758extern Int VG_(ksigemptyset)( vki_ksigset_t* set );
759extern Int VG_(ksigaddset)( vki_ksigset_t* set, Int signum );
760
761extern Int VG_(ksigprocmask)( Int how, const vki_ksigset_t* set,
762 vki_ksigset_t* oldset );
763extern Int VG_(ksigaction) ( Int signum,
764 const vki_ksigaction* act,
765 vki_ksigaction* oldact );
766extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
767
768extern Int VG_(ksignal)(Int signum, void (*sighandler)(Int));
769
770extern Int VG_(ksigaltstack)( const vki_kstack_t* ss, vki_kstack_t* oss );
771
772
773
774/* ---------------------------------------------------------------------
775 Definitions for the JITter (vg_translate.c, vg_to_ucode.c,
776 vg_from_ucode.c).
777 ------------------------------------------------------------------ */
778
779/* Tags which describe what operands are. */
780typedef
781 enum { TempReg=0, ArchReg=1, RealReg=2,
782 SpillNo=3, Literal=4, Lit16=5,
783 NoValue=6 }
784 Tag;
785
786
787/* Microinstruction opcodes. */
788typedef
789 enum {
790 NOP,
791 GET,
792 PUT,
793 LOAD,
794 STORE,
795 MOV,
796 CMOV, /* Used for cmpxchg and cmov */
797 WIDEN,
798 JMP,
799
800 /* Read/write the %EFLAGS register into a TempReg. */
801 GETF, PUTF,
802
803 ADD, ADC, AND, OR, XOR, SUB, SBB,
804 SHL, SHR, SAR, ROL, ROR, RCL, RCR,
805 NOT, NEG, INC, DEC, BSWAP,
806 CC2VAL,
807
808 /* Not strictly needed, but useful for making better
809 translations of address calculations. */
810 LEA1, /* reg2 := const + reg1 */
811 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
812
813 /* not for translating x86 calls -- only to call helpers */
814 CALLM_S, CALLM_E, /* Mark start and end of push/pop sequences
815 for CALLM. */
816 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers. */
817 CALLM, /* call to a machine-code helper */
818
819 /* Hack for translating string (REP-) insns. Jump to literal if
820 TempReg/RealReg is zero. */
821 JIFZ,
822
823 /* FPU ops which read/write mem or don't touch mem at all. */
824 FPU_R,
825 FPU_W,
826 FPU,
827
828 /* Advance the simulated %eip by some small (< 128) number. */
829 INCEIP,
830
831 /* uinstrs which are not needed for mere translation of x86 code,
832 only for instrumentation of it. */
833 LOADV,
834 STOREV,
835 GETV,
836 PUTV,
837 TESTV,
838 SETV,
839 /* Get/set the v-bit (and it is only one bit) for the simulated
840 %eflags register. */
841 GETVF,
842 PUTVF,
843
844 /* Do a unary or binary tag op. Only for post-instrumented
845 code. For TAG1, first and only arg is a TempReg, and is both
846 arg and result reg. For TAG2, first arg is src, second is
847 dst, in the normal way; both are TempRegs. In both cases,
848 3rd arg is a RiCHelper with a Lit16 tag. This indicates
849 which tag op to do. */
850 TAG1,
851 TAG2
852 }
853 Opcode;
854
855
856/* Condition codes, observing the Intel encoding. CondAlways is an
857 extra. */
858typedef
859 enum {
860 CondO = 0, /* overflow */
861 CondNO = 1, /* no overflow */
862 CondB = 2, /* below */
863 CondNB = 3, /* not below */
864 CondZ = 4, /* zero */
865 CondNZ = 5, /* not zero */
866 CondBE = 6, /* below or equal */
867 CondNBE = 7, /* not below or equal */
868 CondS = 8, /* negative */
869 ConsNS = 9, /* not negative */
870 CondP = 10, /* parity even */
871 CondNP = 11, /* not parity even */
872 CondL = 12, /* jump less */
873 CondNL = 13, /* not less */
874 CondLE = 14, /* less or equal */
875 CondNLE = 15, /* not less or equal */
876 CondAlways = 16 /* Jump always */
877 }
878 Condcode;
879
880
sewardj2e93c502002-04-12 11:12:52 +0000881/* Descriptions of additional properties of *unconditional* jumps. */
882typedef
883 enum {
884 JmpBoring=0, /* boring unconditional jump */
885 JmpCall=1, /* jump due to an x86 call insn */
886 JmpRet=2, /* jump due to an x86 ret insn */
887 JmpSyscall=3, /* do a system call, then jump */
888 JmpClientReq=4 /* do a client request, then jump */
889 }
890 JmpKind;
891
892
sewardjde4a1d02002-03-22 01:27:54 +0000893/* Flags. User-level code can only read/write O(verflow), S(ign),
894 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
895 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
896 thusly:
897 76543210
898 DOSZACP
899 and bit 7 must always be zero since it is unused.
900*/
901typedef UChar FlagSet;
902
903#define FlagD (1<<6)
904#define FlagO (1<<5)
905#define FlagS (1<<4)
906#define FlagZ (1<<3)
907#define FlagA (1<<2)
908#define FlagC (1<<1)
909#define FlagP (1<<0)
910
911#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
912#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
913#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
914#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
915#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
916#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
sewardj4a7456e2002-03-24 13:52:19 +0000917#define FlagsZCP ( FlagZ | FlagC | FlagP)
sewardjde4a1d02002-03-22 01:27:54 +0000918#define FlagsOC (FlagO | FlagC )
sewardj4d0ab1f2002-03-24 10:00:09 +0000919#define FlagsAC ( FlagA | FlagC )
sewardjde4a1d02002-03-22 01:27:54 +0000920
921#define FlagsALL (FlagsOSZACP | FlagD)
922#define FlagsEmpty (FlagSet)0
923
924#define VG_IS_FLAG_SUBSET(set1,set2) \
925 (( ((FlagSet)set1) & ((FlagSet)set2) ) == ((FlagSet)set1) )
926
927#define VG_UNION_FLAG_SETS(set1,set2) \
928 ( ((FlagSet)set1) | ((FlagSet)set2) )
929
930
931
932/* A Micro (u)-instruction. */
933typedef
934 struct {
935 /* word 1 */
936 UInt lit32; /* 32-bit literal */
937
938 /* word 2 */
939 UShort val1; /* first operand */
940 UShort val2; /* second operand */
941
942 /* word 3 */
943 UShort val3; /* third operand */
944 UChar opcode; /* opcode */
945 UChar size; /* data transfer size */
946
947 /* word 4 */
948 FlagSet flags_r; /* :: FlagSet */
949 FlagSet flags_w; /* :: FlagSet */
950 UChar tag1:4; /* first operand tag */
951 UChar tag2:4; /* second operand tag */
952 UChar tag3:4; /* third operand tag */
953 UChar extra4b:4; /* Spare field, used by WIDEN for src
954 -size, and by LEA2 for scale
955 (1,2,4 or 8) */
956
957 /* word 5 */
958 UChar cond; /* condition, for jumps */
959 Bool smc_check:1; /* do a smc test, if writes memory. */
960 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
sewardj2e93c502002-04-12 11:12:52 +0000961 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
sewardjde4a1d02002-03-22 01:27:54 +0000962 }
963 UInstr;
964
965
966/* Expandable arrays of uinstrs. */
967typedef
968 struct {
969 Int used;
970 Int size;
971 UInstr* instrs;
972 Int nextTemp;
973 }
974 UCodeBlock;
975
976/* Refer to `the last instruction stuffed in', including as an
977 lvalue. */
978#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
979
980/* An invalid temporary number :-) */
981#define INVALID_TEMPREG 999999999
982
983
984/* ---------------------------------------------------------------------
985 Exports of vg_demangle.c
986 ------------------------------------------------------------------ */
987
988extern void VG_(demangle) ( Char* orig, Char* result, Int result_size );
989
990
991/* ---------------------------------------------------------------------
992 Exports of vg_from_ucode.c
993 ------------------------------------------------------------------ */
994
995extern UChar* VG_(emit_code) ( UCodeBlock* cb, Int* nbytes );
996
997
998/* ---------------------------------------------------------------------
999 Exports of vg_to_ucode.c
1000 ------------------------------------------------------------------ */
1001
1002extern Int VG_(disBB) ( UCodeBlock* cb, Addr eip0 );
1003extern Char* VG_(nameOfIntReg) ( Int size, Int reg );
1004extern Char VG_(nameOfIntSize) ( Int size );
1005extern UInt VG_(extend_s_8to32) ( UInt x );
1006extern Int VG_(getNewTemp) ( UCodeBlock* cb );
1007extern Int VG_(getNewShadow) ( UCodeBlock* cb );
1008
1009#define SHADOW(tempreg) ((tempreg)+1)
1010
1011
1012/* ---------------------------------------------------------------------
1013 Exports of vg_translate.c
1014 ------------------------------------------------------------------ */
1015
sewardj1e8cdc92002-04-18 11:37:52 +00001016extern void VG_(translate) ( ThreadState* tst,
1017 Addr orig_addr,
sewardjde4a1d02002-03-22 01:27:54 +00001018 UInt* orig_size,
1019 Addr* trans_addr,
1020 UInt* trans_size );
1021
1022extern void VG_(emptyUInstr) ( UInstr* u );
1023extern void VG_(newUInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
1024extern void VG_(newUInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
1025 Tag tag1, UInt val1 );
1026extern void VG_(newUInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
1027 Tag tag1, UInt val1,
1028 Tag tag2, UInt val2 );
1029extern void VG_(newUInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
1030 Tag tag1, UInt val1,
1031 Tag tag2, UInt val2,
1032 Tag tag3, UInt val3 );
1033extern void VG_(setFlagRW) ( UInstr* u,
1034 FlagSet fr, FlagSet fw );
1035
1036extern void VG_(setLiteralField) ( UCodeBlock* cb, UInt lit32 );
1037extern Bool VG_(anyFlagUse) ( UInstr* u );
1038
1039
1040
1041extern void VG_(ppUInstr) ( Int instrNo, UInstr* u );
1042extern void VG_(ppUCodeBlock) ( UCodeBlock* cb, Char* title );
1043
1044extern Char* VG_(nameCondcode) ( Condcode cond );
1045extern Bool VG_(saneUInstr) ( Bool beforeRA, UInstr* u );
1046extern Bool VG_(saneUCodeBlock) ( UCodeBlock* cb );
1047extern Char* VG_(nameUOpcode) ( Bool upper, Opcode opc );
1048extern Int VG_(rankToRealRegNo) ( Int rank );
1049
1050extern void* VG_(jitmalloc) ( Int nbytes );
1051extern void VG_(jitfree) ( void* ptr );
1052
1053
1054/* ---------------------------------------------------------------------
1055 Exports of vg_execontext.c.
1056 ------------------------------------------------------------------ */
1057
1058/* Records the PC and a bit of the call chain. The first 4 %eip
1059 values are used in comparisons do remove duplicate errors, and for
1060 comparing against suppression specifications. The rest are purely
1061 informational (but often important). */
1062
1063typedef
1064 struct _ExeContextRec {
1065 struct _ExeContextRec * next;
1066 /* The size of this array is VG_(clo_backtrace_size); at least
1067 2, at most VG_DEEPEST_BACKTRACE. [0] is the current %eip,
1068 [1] is its caller, [2] is the caller of [1], etc. */
1069 Addr eips[0];
1070 }
1071 ExeContext;
1072
1073
1074/* Initialise the ExeContext storage mechanism. */
1075extern void VG_(init_ExeContext_storage) ( void );
1076
1077/* Print stats (informational only). */
1078extern void VG_(show_ExeContext_stats) ( void );
1079
1080
1081/* Take a snapshot of the client's stack. Search our collection of
1082 ExeContexts to see if we already have it, and if not, allocate a
1083 new one. Either way, return a pointer to the context. */
sewardj8c824512002-04-14 04:16:48 +00001084extern ExeContext* VG_(get_ExeContext) ( Bool skip_top_frame,
1085 Addr eip, Addr ebp );
sewardjde4a1d02002-03-22 01:27:54 +00001086
1087/* Print an ExeContext. */
1088extern void VG_(pp_ExeContext) ( ExeContext* );
1089
1090/* Compare two ExeContexts, just comparing the top two callers. */
1091extern Bool VG_(eq_ExeContext_top2) ( ExeContext* e1, ExeContext* e2 );
1092
1093/* Compare two ExeContexts, just comparing the top four callers. */
1094extern Bool VG_(eq_ExeContext_top4) ( ExeContext* e1, ExeContext* e2 );
1095
1096/* Compare two ExeContexts, comparing all callers. */
1097extern Bool VG_(eq_ExeContext_all) ( ExeContext* e1, ExeContext* e2 );
1098
1099
1100
1101/* ---------------------------------------------------------------------
1102 Exports of vg_errcontext.c.
1103 ------------------------------------------------------------------ */
1104
1105extern void VG_(load_suppressions) ( void );
1106extern void VG_(show_all_errors) ( void );
1107extern void VG_(record_value_error) ( Int size );
sewardjaabd5ad2002-04-19 15:43:37 +00001108extern void VG_(record_free_error) ( ThreadState* tst, Addr a );
1109extern void VG_(record_freemismatch_error) ( ThreadState* tst, Addr a );
sewardjde4a1d02002-03-22 01:27:54 +00001110extern void VG_(record_address_error) ( Addr a, Int size,
1111 Bool isWrite );
sewardj1e8cdc92002-04-18 11:37:52 +00001112
1113extern void VG_(record_jump_error) ( ThreadState* tst, Addr a );
sewardj8c824512002-04-14 04:16:48 +00001114
1115extern void VG_(record_param_err) ( ThreadState* tst,
1116 Addr a,
sewardjde4a1d02002-03-22 01:27:54 +00001117 Bool isWriteLack,
1118 Char* msg );
sewardj8c824512002-04-14 04:16:48 +00001119extern void VG_(record_user_err) ( ThreadState* tst,
1120 Addr a, Bool isWriteLack );
sewardjde4a1d02002-03-22 01:27:54 +00001121
1122
1123/* The classification of a faulting address. */
1124typedef
1125 enum { Stack, Unknown, Freed, Mallocd, UserG, UserS }
1126 AddrKind;
1127
1128/* Records info about a faulting address. */
1129typedef
1130 struct {
1131 /* ALL */
1132 AddrKind akind;
1133 /* Freed, Mallocd */
1134 Int blksize;
1135 /* Freed, Mallocd */
1136 Int rwoffset;
1137 /* Freed, Mallocd */
1138 ExeContext* lastchange;
sewardj1e8cdc92002-04-18 11:37:52 +00001139 /* Stack */
1140 ThreadId stack_tid;
sewardjde4a1d02002-03-22 01:27:54 +00001141 }
1142 AddrInfo;
1143
1144
1145/* ---------------------------------------------------------------------
1146 Exports of vg_clientperms.c
1147 ------------------------------------------------------------------ */
1148
1149extern Bool VG_(client_perm_maybe_describe)( Addr a, AddrInfo* ai );
1150
sewardj8c824512002-04-14 04:16:48 +00001151extern UInt VG_(handle_client_request) ( ThreadState* tst, UInt* arg_block );
sewardjde4a1d02002-03-22 01:27:54 +00001152
1153extern void VG_(delete_client_stack_blocks_following_ESP_change) ( void );
1154
1155extern void VG_(show_client_block_stats) ( void );
1156
1157
1158/* ---------------------------------------------------------------------
1159 Exports of vg_procselfmaps.c
1160 ------------------------------------------------------------------ */
1161
1162extern
1163void VG_(read_procselfmaps) (
1164 void (*record_mapping)( Addr, UInt, Char, Char, Char, UInt, UChar* )
1165);
1166
1167
1168/* ---------------------------------------------------------------------
1169 Exports of vg_symtab2.c
1170 ------------------------------------------------------------------ */
1171
1172/* We assume the executable is loaded here ... can't really find
1173 out. There is a hacky sanity check in vg_init_memory_audit()
1174 which should trip up most stupidities.
1175*/
1176#define VG_ASSUMED_EXE_BASE (Addr)0x8048000
1177
1178extern void VG_(read_symbols) ( void );
1179extern void VG_(mini_stack_dump) ( ExeContext* ec );
1180extern void VG_(what_obj_and_fun_is_this)
1181 ( Addr a,
1182 Char* obj_buf, Int n_obj_buf,
1183 Char* fun_buf, Int n_fun_buf );
1184
1185extern void VG_(symtab_notify_munmap) ( Addr start, UInt length );
1186
1187
1188/* ---------------------------------------------------------------------
1189 Exports of vg_clientmalloc.c
1190 ------------------------------------------------------------------ */
1191
sewardjde4a1d02002-03-22 01:27:54 +00001192typedef
1193 enum {
1194 Vg_AllocMalloc = 0,
sewardj2e93c502002-04-12 11:12:52 +00001195 Vg_AllocNew = 1,
sewardjde4a1d02002-03-22 01:27:54 +00001196 Vg_AllocNewVec = 2
1197 }
1198 VgAllocKind;
1199
1200/* Description of a malloc'd chunk. */
1201typedef
1202 struct _ShadowChunk {
1203 struct _ShadowChunk* next;
1204 ExeContext* where; /* where malloc'd/free'd */
1205 UInt size : 30; /* size requested. */
1206 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1207 Addr data; /* ptr to actual block. */
1208 }
1209 ShadowChunk;
1210
1211extern void VG_(clientmalloc_done) ( void );
1212extern void VG_(describe_addr) ( Addr a, AddrInfo* ai );
1213extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1214
sewardj2e93c502002-04-12 11:12:52 +00001215/* These are called from the scheduler, when it intercepts a user
1216 request. */
sewardj8c824512002-04-14 04:16:48 +00001217extern void* VG_(client_malloc) ( ThreadState* tst,
1218 UInt size, VgAllocKind kind );
1219extern void* VG_(client_memalign) ( ThreadState* tst,
1220 UInt align, UInt size );
1221extern void VG_(client_free) ( ThreadState* tst,
1222 void* ptrV, VgAllocKind kind );
1223extern void* VG_(client_calloc) ( ThreadState* tst,
1224 UInt nmemb, UInt size1 );
1225extern void* VG_(client_realloc) ( ThreadState* tst,
1226 void* ptrV, UInt size_new );
sewardjde4a1d02002-03-22 01:27:54 +00001227
1228
1229/* ---------------------------------------------------------------------
1230 Exports of vg_main.c
1231 ------------------------------------------------------------------ */
1232
sewardjde4a1d02002-03-22 01:27:54 +00001233/* A structure used as an intermediary when passing the simulated
1234 CPU's state to some assembly fragments, particularly system calls.
1235 Stuff is copied from baseBlock to here, the assembly magic runs,
1236 and then the inverse copy is done. */
1237
1238extern UInt VG_(m_state_static) [8 /* int regs, in Intel order */
1239 + 1 /* %eflags */
1240 + 1 /* %eip */
1241 + VG_SIZE_OF_FPUSTATE_W /* FPU state */
1242 ];
1243
1244/* Handy fns for doing the copy back and forth. */
1245extern void VG_(copy_baseBlock_to_m_state_static) ( void );
1246extern void VG_(copy_m_state_static_to_baseBlock) ( void );
1247
sewardjde4a1d02002-03-22 01:27:54 +00001248/* Called when some unhandleable client behaviour is detected.
1249 Prints a msg and aborts. */
1250extern void VG_(unimplemented) ( Char* msg );
1251
1252/* The stack on which Valgrind runs. We can't use the same stack as the
1253 simulatee -- that's an important design decision. */
1254extern UInt VG_(stack)[10000];
1255
1256/* Similarly, we have to ask for signals to be delivered on an
1257 alternative stack, since it is possible, although unlikely, that
1258 we'll have to run client code from inside the Valgrind-installed
1259 signal handler. If this happens it will be done by
1260 vg_deliver_signal_immediately(). */
1261extern UInt VG_(sigstack)[10000];
1262
sewardjde4a1d02002-03-22 01:27:54 +00001263/* Holds client's %esp at the point we gained control. From this the
1264 client's argc, argv and envp are deduced. */
1265extern Addr VG_(esp_at_startup);
1266extern Int VG_(client_argc);
1267extern Char** VG_(client_argv);
1268extern Char** VG_(client_envp);
1269
1270/* Remove valgrind.so from a LD_PRELOAD=... string so child processes
1271 don't get traced into. */
1272extern void VG_(mash_LD_PRELOAD_string)( Char* ld_preload_str );
1273
1274/* Something of a function looking for a home ... start up GDB. This
1275 is called from VG_(swizzle_esp_then_start_GDB) and so runs on the
1276 *client's* stack. This is necessary to give GDB the illusion that
1277 the client program really was running on the real cpu. */
1278extern void VG_(start_GDB_whilst_on_client_stack) ( void );
1279
1280/* Spew out vast amounts of junk during JITting? */
1281extern Bool VG_(disassemble);
1282
1283/* 64-bit counter for the number of basic blocks done. */
1284extern ULong VG_(bbs_done);
1285/* 64-bit counter for the number of bbs to go before a debug exit. */
1286extern ULong VG_(bbs_to_go);
1287
1288/* Counts downwards in vg_run_innerloop. */
1289extern UInt VG_(dispatch_ctr);
1290
sewardjde4a1d02002-03-22 01:27:54 +00001291/* Is the client running on the simulated CPU or the real one? */
1292extern Bool VG_(running_on_simd_CPU); /* Initially False */
1293
1294/* The current LRU epoch. */
1295extern UInt VG_(current_epoch);
1296
1297
1298/* --- Counters, for informational purposes only. --- */
1299
1300/* Number of lookups which miss the fast tt helper. */
1301extern UInt VG_(tt_fast_misses);
1302
1303/* Counts for LRU informational messages. */
1304
1305/* Number and total o/t size of new translations this epoch. */
1306extern UInt VG_(this_epoch_in_count);
1307extern UInt VG_(this_epoch_in_osize);
1308extern UInt VG_(this_epoch_in_tsize);
1309/* Number and total o/t size of discarded translations this epoch. */
1310extern UInt VG_(this_epoch_out_count);
1311extern UInt VG_(this_epoch_out_osize);
1312extern UInt VG_(this_epoch_out_tsize);
1313/* Number and total o/t size of translations overall. */
1314extern UInt VG_(overall_in_count);
1315extern UInt VG_(overall_in_osize);
1316extern UInt VG_(overall_in_tsize);
1317/* Number and total o/t size of discards overall. */
1318extern UInt VG_(overall_out_count);
1319extern UInt VG_(overall_out_osize);
1320extern UInt VG_(overall_out_tsize);
1321
1322/* The number of LRU-clearings of TT/TC. */
1323extern UInt VG_(number_of_lrus);
1324
1325/* Counts pertaining to the register allocator. */
1326
1327/* total number of uinstrs input to reg-alloc */
1328extern UInt VG_(uinstrs_prealloc);
1329
1330/* total number of uinstrs added due to spill code */
1331extern UInt VG_(uinstrs_spill);
1332
1333/* number of bbs requiring spill code */
1334extern UInt VG_(translations_needing_spill);
1335
1336/* total of register ranks over all translations */
1337extern UInt VG_(total_reg_rank);
1338
1339/* Counts pertaining to the self-modifying-code detection machinery. */
1340
1341/* Total number of writes checked. */
1342//extern UInt VG_(smc_total_check4s);
1343
1344/* Number of writes which the fast smc check couldn't show were
1345 harmless. */
1346extern UInt VG_(smc_cache_passed);
1347
1348/* Numnber of writes which really did write on original code. */
1349extern UInt VG_(smc_fancy_passed);
1350
1351/* Number of translations discarded as a result. */
1352//extern UInt VG_(smc_discard_count);
1353
1354/* Counts pertaining to internal sanity checking. */
1355extern UInt VG_(sanity_fast_count);
1356extern UInt VG_(sanity_slow_count);
1357
sewardj2e93c502002-04-12 11:12:52 +00001358/* Counts pertaining to the scheduler. */
1359extern UInt VG_(num_scheduling_events_MINOR);
1360extern UInt VG_(num_scheduling_events_MAJOR);
1361
sewardjde4a1d02002-03-22 01:27:54 +00001362
1363/* ---------------------------------------------------------------------
1364 Exports of vg_memory.c
1365 ------------------------------------------------------------------ */
1366
1367extern void VGM_(init_memory_audit) ( void );
1368extern Addr VGM_(curr_dataseg_end);
1369extern void VG_(show_reg_tags) ( void );
1370extern void VG_(detect_memory_leaks) ( void );
1371extern void VG_(done_prof_mem) ( void );
1372
1373/* Set permissions for an address range. Not speed-critical. */
1374extern void VGM_(make_noaccess) ( Addr a, UInt len );
1375extern void VGM_(make_writable) ( Addr a, UInt len );
1376extern void VGM_(make_readable) ( Addr a, UInt len );
1377/* Use with care! (read: use for shmat only) */
1378extern void VGM_(make_readwritable) ( Addr a, UInt len );
1379extern void VGM_(copy_address_range_perms) ( Addr src, Addr dst,
1380 UInt len );
1381
1382/* Check permissions for an address range. Not speed-critical. */
1383extern Bool VGM_(check_writable) ( Addr a, UInt len, Addr* bad_addr );
1384extern Bool VGM_(check_readable) ( Addr a, UInt len, Addr* bad_addr );
1385extern Bool VGM_(check_readable_asciiz) ( Addr a, Addr* bad_addr );
1386
1387/* Sanity checks which may be done at any time. Doing them at
1388 signal-delivery time turns out to be convenient. */
sewardj2e93c502002-04-12 11:12:52 +00001389extern void VG_(do_sanity_checks) ( ThreadId tid, Bool force_expensive );
sewardjde4a1d02002-03-22 01:27:54 +00001390/* Very cheap ... */
1391extern Bool VG_(first_and_last_secondaries_look_plausible) ( void );
1392
1393/* These functions are called from generated code. */
1394extern void VG_(helperc_STOREV4) ( UInt, Addr );
1395extern void VG_(helperc_STOREV2) ( UInt, Addr );
1396extern void VG_(helperc_STOREV1) ( UInt, Addr );
1397
1398extern UInt VG_(helperc_LOADV1) ( Addr );
1399extern UInt VG_(helperc_LOADV2) ( Addr );
1400extern UInt VG_(helperc_LOADV4) ( Addr );
1401
1402extern void VGM_(handle_esp_assignment) ( Addr new_espA );
1403extern void VGM_(fpu_write_check) ( Addr addr, Int size );
1404extern void VGM_(fpu_read_check) ( Addr addr, Int size );
1405
1406/* Safely (avoiding SIGSEGV / SIGBUS) scan the entire valid address
1407 space and pass the addresses and values of all addressible,
1408 defined, aligned words to notify_word. This is the basis for the
1409 leak detector. Returns the number of calls made to notify_word. */
1410UInt VG_(scan_all_valid_memory) ( void (*notify_word)( Addr, UInt ) );
1411
1412/* Is this address within some small distance below %ESP? Used only
1413 for the --workaround-gcc296-bugs kludge. */
sewardj8c824512002-04-14 04:16:48 +00001414extern Bool VG_(is_just_below_ESP)( Addr esp, Addr aa );
sewardjde4a1d02002-03-22 01:27:54 +00001415
1416/* Nasty kludgery to deal with applications which switch stacks,
1417 like netscape. */
sewardjde4a1d02002-03-22 01:27:54 +00001418#define VG_PLAUSIBLE_STACK_SIZE 8000000
1419
sewardjde4a1d02002-03-22 01:27:54 +00001420
1421/* ---------------------------------------------------------------------
1422 Exports of vg_syscall_mem.c
1423 ------------------------------------------------------------------ */
1424
sewardj2e93c502002-04-12 11:12:52 +00001425extern void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid );
sewardjde4a1d02002-03-22 01:27:54 +00001426
sewardj2e93c502002-04-12 11:12:52 +00001427extern void VG_(check_known_blocking_syscall) ( ThreadId tid,
1428 Int syscallno,
1429 Int* /*IN*/ res );
sewardjde4a1d02002-03-22 01:27:54 +00001430
1431extern Bool VG_(is_kerror) ( Int res );
1432
sewardj2e93c502002-04-12 11:12:52 +00001433#define KERNEL_DO_SYSCALL(thread_id, result_lvalue) \
1434 VG_(load_thread_state)(thread_id); \
sewardjde4a1d02002-03-22 01:27:54 +00001435 VG_(copy_baseBlock_to_m_state_static)(); \
1436 VG_(do_syscall)(); \
1437 VG_(copy_m_state_static_to_baseBlock)(); \
sewardj2e93c502002-04-12 11:12:52 +00001438 VG_(save_thread_state)(thread_id); \
1439 result_lvalue = VG_(get_thread_state)(thread_id)->m_eax;
sewardjde4a1d02002-03-22 01:27:54 +00001440
1441
1442/* ---------------------------------------------------------------------
1443 Exports of vg_transtab.c
1444 ------------------------------------------------------------------ */
1445
1446/* An entry in the translation table (TT). */
1447typedef
1448 struct {
1449 /* +0 */ Addr orig_addr;
1450 /* +4 */ Addr trans_addr;
1451 /* +8 */ UInt mru_epoch;
1452 /* +12 */ UShort orig_size;
1453 /* +14 */ UShort trans_size;
1454 }
1455 TTEntry;
1456
1457/* The number of basic blocks in an epoch (one age-step). */
1458#define VG_BBS_PER_EPOCH 20000
1459
1460extern void VG_(get_tt_tc_used) ( UInt* tt_used, UInt* tc_used );
1461extern void VG_(maybe_do_lru_pass) ( void );
1462extern void VG_(flush_transtab) ( void );
1463extern Addr VG_(copy_to_transcache) ( Addr trans_addr, Int trans_size );
1464extern void VG_(add_to_trans_tab) ( TTEntry* tte );
1465
1466extern void VG_(smc_mark_original) ( Addr original_addr,
1467 Int original_len );
1468
1469extern void VG_(init_transtab_and_SMC) ( void );
1470
1471extern void VG_(sanity_check_tc_tt) ( void );
1472extern Addr VG_(search_transtab) ( Addr original_addr );
1473
1474extern void VG_(invalidate_tt_fast)( void );
1475
1476
1477/* ---------------------------------------------------------------------
1478 Exports of vg_vtagops.c
1479 ------------------------------------------------------------------ */
1480
1481/* Lists the names of value-tag operations used in instrumented
1482 code. These are the third argument to TAG1 and TAG2 uinsns. */
1483
1484typedef
1485 enum {
1486 /* Unary. */
1487 VgT_PCast40, VgT_PCast20, VgT_PCast10,
1488 VgT_PCast01, VgT_PCast02, VgT_PCast04,
1489
1490 VgT_PCast14, VgT_PCast12, VgT_PCast11,
1491
1492 VgT_Left4, VgT_Left2, VgT_Left1,
1493
1494 VgT_SWiden14, VgT_SWiden24, VgT_SWiden12,
1495 VgT_ZWiden14, VgT_ZWiden24, VgT_ZWiden12,
1496
1497 /* Binary; 1st is rd; 2nd is rd+wr */
1498 VgT_UifU4, VgT_UifU2, VgT_UifU1, VgT_UifU0,
1499 VgT_DifD4, VgT_DifD2, VgT_DifD1,
1500
1501 VgT_ImproveAND4_TQ, VgT_ImproveAND2_TQ, VgT_ImproveAND1_TQ,
1502 VgT_ImproveOR4_TQ, VgT_ImproveOR2_TQ, VgT_ImproveOR1_TQ,
1503 VgT_DebugFn
1504 }
1505 VgTagOp;
1506
1507extern Char* VG_(nameOfTagOp) ( VgTagOp );
1508extern UInt VG_(DebugFn) ( UInt a1, UInt a2 );
1509
1510
1511/* ---------------------------------------------------------------------
1512 Exports of vg_syscall.S
1513 ------------------------------------------------------------------ */
1514
1515extern void VG_(do_syscall) ( void );
1516
1517
1518/* ---------------------------------------------------------------------
1519 Exports of vg_startup.S
1520 ------------------------------------------------------------------ */
1521
1522extern void VG_(shutdown);
1523extern void VG_(switch_to_real_CPU) ( void );
1524
sewardj35805422002-04-21 13:05:34 +00001525extern void VG_(swizzle_esp_then_start_GDB) ( Addr m_eip_at_error,
1526 Addr m_esp_at_error,
1527 Addr m_ebp_at_error );
sewardjde4a1d02002-03-22 01:27:54 +00001528
1529
1530/* ---------------------------------------------------------------------
1531 Exports of vg_dispatch.S
1532 ------------------------------------------------------------------ */
1533
sewardj2e93c502002-04-12 11:12:52 +00001534/* Run a thread for a (very short) while, until some event happens
1535 which means we need to defer to the scheduler. */
1536extern UInt VG_(run_innerloop) ( void );
sewardjde4a1d02002-03-22 01:27:54 +00001537
1538
1539/* ---------------------------------------------------------------------
1540 Exports of vg_helpers.S
1541 ------------------------------------------------------------------ */
1542
sewardjde4a1d02002-03-22 01:27:54 +00001543/* SMC fast checks. */
1544extern void VG_(helper_smc_check4);
1545
1546/* Mul, div, etc, -- we don't codegen these directly. */
1547extern void VG_(helper_idiv_64_32);
1548extern void VG_(helper_div_64_32);
1549extern void VG_(helper_idiv_32_16);
1550extern void VG_(helper_div_32_16);
1551extern void VG_(helper_idiv_16_8);
1552extern void VG_(helper_div_16_8);
1553
1554extern void VG_(helper_imul_32_64);
1555extern void VG_(helper_mul_32_64);
1556extern void VG_(helper_imul_16_32);
1557extern void VG_(helper_mul_16_32);
1558extern void VG_(helper_imul_8_16);
1559extern void VG_(helper_mul_8_16);
1560
1561extern void VG_(helper_CLD);
1562extern void VG_(helper_STD);
1563extern void VG_(helper_get_dirflag);
1564
1565extern void VG_(helper_shldl);
1566extern void VG_(helper_shldw);
1567extern void VG_(helper_shrdl);
1568extern void VG_(helper_shrdw);
1569
1570extern void VG_(helper_RDTSC);
1571extern void VG_(helper_CPUID);
1572
sewardjde4a1d02002-03-22 01:27:54 +00001573extern void VG_(helper_bsf);
1574extern void VG_(helper_bsr);
1575
1576extern void VG_(helper_fstsw_AX);
1577extern void VG_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001578extern void VG_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001579extern void VG_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001580
1581extern void VG_(helper_value_check4_fail);
1582extern void VG_(helper_value_check2_fail);
1583extern void VG_(helper_value_check1_fail);
1584extern void VG_(helper_value_check0_fail);
1585
sewardjbc5b99f2002-04-13 00:08:51 +00001586/* NOT FUNCTIONS; these are bogus RETURN ADDRESS. */
sewardj54cacf02002-04-12 23:24:59 +00001587extern void VG_(signalreturn_bogusRA)( void );
sewardjbc5b99f2002-04-13 00:08:51 +00001588extern void VG_(pthreadreturn_bogusRA)( void );
sewardj54cacf02002-04-12 23:24:59 +00001589
sewardjde4a1d02002-03-22 01:27:54 +00001590
1591/* ---------------------------------------------------------------------
1592 The state of the simulated CPU.
1593 ------------------------------------------------------------------ */
1594
1595/* This is the Intel register encoding. */
1596#define R_EAX 0
1597#define R_ECX 1
1598#define R_EDX 2
1599#define R_EBX 3
1600#define R_ESP 4
1601#define R_EBP 5
1602#define R_ESI 6
1603#define R_EDI 7
1604
1605#define R_AL (0+R_EAX)
1606#define R_CL (0+R_ECX)
1607#define R_DL (0+R_EDX)
1608#define R_BL (0+R_EBX)
1609#define R_AH (4+R_EAX)
1610#define R_CH (4+R_ECX)
1611#define R_DH (4+R_EDX)
1612#define R_BH (4+R_EBX)
1613
1614
1615/* ---------------------------------------------------------------------
1616 Offsets into baseBlock for everything which needs to referred to
1617 from generated code. The order of these decls does not imply
1618 what the order of the actual offsets is. The latter is important
1619 and is set up in vg_main.c.
1620 ------------------------------------------------------------------ */
1621
1622/* An array of words. In generated code, %ebp always points to the
1623 start of this array. Useful stuff, like the simulated CPU state,
1624 and the addresses of helper functions, can then be found by
1625 indexing off %ebp. The following declares variables which, at
1626 startup time, are given values denoting offsets into baseBlock.
1627 These offsets are in *words* from the start of baseBlock. */
1628
1629#define VG_BASEBLOCK_WORDS 200
1630
1631extern UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
1632
1633
1634/* -----------------------------------------------------
1635 Read-write parts of baseBlock.
1636 -------------------------------------------------- */
1637
1638/* State of the simulated CPU. */
1639extern Int VGOFF_(m_eax);
1640extern Int VGOFF_(m_ecx);
1641extern Int VGOFF_(m_edx);
1642extern Int VGOFF_(m_ebx);
1643extern Int VGOFF_(m_esp);
1644extern Int VGOFF_(m_ebp);
1645extern Int VGOFF_(m_esi);
1646extern Int VGOFF_(m_edi);
1647extern Int VGOFF_(m_eflags);
1648extern Int VGOFF_(m_fpustate);
1649extern Int VGOFF_(m_eip);
1650
1651/* Reg-alloc spill area (VG_MAX_SPILLSLOTS words long). */
1652extern Int VGOFF_(spillslots);
1653
1654/* Records the valid bits for the 8 integer regs & flags reg. */
1655extern Int VGOFF_(sh_eax);
1656extern Int VGOFF_(sh_ecx);
1657extern Int VGOFF_(sh_edx);
1658extern Int VGOFF_(sh_ebx);
1659extern Int VGOFF_(sh_esp);
1660extern Int VGOFF_(sh_ebp);
1661extern Int VGOFF_(sh_esi);
1662extern Int VGOFF_(sh_edi);
1663extern Int VGOFF_(sh_eflags);
1664
1665
1666/* -----------------------------------------------------
1667 Read-only parts of baseBlock.
1668 -------------------------------------------------- */
1669
1670/* Offsets of addresses of helper functions. A "helper" function is
1671 one which is called from generated code. */
1672
1673extern Int VGOFF_(helper_idiv_64_32);
1674extern Int VGOFF_(helper_div_64_32);
1675extern Int VGOFF_(helper_idiv_32_16);
1676extern Int VGOFF_(helper_div_32_16);
1677extern Int VGOFF_(helper_idiv_16_8);
1678extern Int VGOFF_(helper_div_16_8);
1679
1680extern Int VGOFF_(helper_imul_32_64);
1681extern Int VGOFF_(helper_mul_32_64);
1682extern Int VGOFF_(helper_imul_16_32);
1683extern Int VGOFF_(helper_mul_16_32);
1684extern Int VGOFF_(helper_imul_8_16);
1685extern Int VGOFF_(helper_mul_8_16);
1686
1687extern Int VGOFF_(helper_CLD);
1688extern Int VGOFF_(helper_STD);
1689extern Int VGOFF_(helper_get_dirflag);
1690
1691extern Int VGOFF_(helper_shldl);
1692extern Int VGOFF_(helper_shldw);
1693extern Int VGOFF_(helper_shrdl);
1694extern Int VGOFF_(helper_shrdw);
1695
1696extern Int VGOFF_(helper_RDTSC);
1697extern Int VGOFF_(helper_CPUID);
1698
sewardjde4a1d02002-03-22 01:27:54 +00001699extern Int VGOFF_(helper_bsf);
1700extern Int VGOFF_(helper_bsr);
1701
1702extern Int VGOFF_(helper_fstsw_AX);
1703extern Int VGOFF_(helper_SAHF);
sewardj4d0ab1f2002-03-24 10:00:09 +00001704extern Int VGOFF_(helper_DAS);
sewardjfe8a1662002-03-24 11:54:07 +00001705extern Int VGOFF_(helper_DAA);
sewardjde4a1d02002-03-22 01:27:54 +00001706
1707extern Int VGOFF_(helper_value_check4_fail);
1708extern Int VGOFF_(helper_value_check2_fail);
1709extern Int VGOFF_(helper_value_check1_fail);
1710extern Int VGOFF_(helper_value_check0_fail);
1711
sewardjde4a1d02002-03-22 01:27:54 +00001712extern Int VGOFF_(helperc_STOREV4); /* :: UInt -> Addr -> void */
1713extern Int VGOFF_(helperc_STOREV2); /* :: UInt -> Addr -> void */
1714extern Int VGOFF_(helperc_STOREV1); /* :: UInt -> Addr -> void */
1715
1716extern Int VGOFF_(helperc_LOADV4); /* :: Addr -> UInt -> void */
1717extern Int VGOFF_(helperc_LOADV2); /* :: Addr -> UInt -> void */
1718extern Int VGOFF_(helperc_LOADV1); /* :: Addr -> UInt -> void */
1719
1720extern Int VGOFF_(handle_esp_assignment); /* :: Addr -> void */
1721extern Int VGOFF_(fpu_write_check); /* :: Addr -> Int -> void */
1722extern Int VGOFF_(fpu_read_check); /* :: Addr -> Int -> void */
1723
sewardjde4a1d02002-03-22 01:27:54 +00001724
1725
1726#endif /* ndef __VG_INCLUDE_H */
1727
sewardj3b2736a2002-03-24 12:18:35 +00001728
1729/* ---------------------------------------------------------------------
1730 Finally - autoconf-generated settings
1731 ------------------------------------------------------------------ */
1732
1733#include "config.h"
1734
sewardjde4a1d02002-03-22 01:27:54 +00001735/*--------------------------------------------------------------------*/
1736/*--- end vg_include.h ---*/
1737/*--------------------------------------------------------------------*/