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