blob: 87fb1e3bcd847ffd0c57bafb44f8bd19d2e31c49 [file] [log] [blame]
njn25e49d8e72002-09-23 09:36:25 +00001
2/*--------------------------------------------------------------------*/
3/*--- The only header your skin will ever need to #include... ---*/
4/*--- vg_skin.h ---*/
5/*--------------------------------------------------------------------*/
6
7/*
njnc9539842002-10-02 13:26:35 +00008 This file is part of Valgrind, an extensible x86 protected-mode
9 emulator for monitoring program execution on x86-Unixes.
njn25e49d8e72002-09-23 09:36:25 +000010
11 Copyright (C) 2000-2002 Julian Seward
12 jseward@acm.org
13
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation; either version 2 of the
17 License, or (at your option) any later version.
18
19 This program is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27 02111-1307, USA.
28
29 The GNU General Public License is contained in the file COPYING.
30*/
31
32#ifndef __VG_SKIN_H
33#define __VG_SKIN_H
34
35#include <stdarg.h> /* ANSI varargs stuff */
36#include <setjmp.h> /* for jmp_buf */
37
38#include "vg_constants_skin.h"
39
40
41/*====================================================================*/
42/*=== Build options and table sizes. ===*/
43/*====================================================================*/
44
45/* You should be able to change these options or sizes, recompile, and
46 still have a working system. */
47
48/* The maximum number of pthreads that we support. This is
49 deliberately not very high since our implementation of some of the
50 scheduler algorithms is surely O(N) in the number of threads, since
51 that's simple, at least. And (in practice) we hope that most
52 programs do not need many threads. */
53#define VG_N_THREADS 50
54
55/* Maximum number of pthread keys available. Again, we start low until
56 the need for a higher number presents itself. */
57#define VG_N_THREAD_KEYS 50
58
59/* Total number of integer registers available for allocation -- all of
60 them except %esp, %ebp. %ebp permanently points at VG_(baseBlock).
61
62 If you change this you'll have to also change at least these:
njn4ba5a792002-09-30 10:23:54 +000063 - VG_(rank_to_realreg)()
64 - VG_(realreg_to_rank)()
njn25e49d8e72002-09-23 09:36:25 +000065 - ppRegsLiveness()
66 - the RegsLive type (maybe -- RegsLive type must have more than
67 VG_MAX_REALREGS bits)
68
69 Do not change this unless you really know what you are doing! */
70#define VG_MAX_REALREGS 6
71
72
73/*====================================================================*/
njn1a1dd8b2002-09-27 10:42:20 +000074/*=== Basic types, useful macros ===*/
njn25e49d8e72002-09-23 09:36:25 +000075/*====================================================================*/
76
njn25e49d8e72002-09-23 09:36:25 +000077typedef unsigned char UChar;
78typedef unsigned short UShort;
79typedef unsigned int UInt;
80typedef unsigned long long int ULong;
81
82typedef signed char Char;
83typedef signed short Short;
84typedef signed int Int;
85typedef signed long long int Long;
86
87typedef unsigned int Addr;
88
89typedef unsigned char Bool;
90#define False ((Bool)0)
91#define True ((Bool)1)
92
93
njn1a1dd8b2002-09-27 10:42:20 +000094#define mycat_wrk(aaa,bbb) aaa##bbb
95#define mycat(aaa,bbb) mycat_wrk(aaa,bbb)
96
97/* No, really. I _am_ that strange. */
98#define OINK(nnn) VG_(message)(Vg_DebugMsg, "OINK %d",nnn)
99
njn25e49d8e72002-09-23 09:36:25 +0000100/* ---------------------------------------------------------------------
101 Now the basic types are set up, we can haul in the kernel-interface
102 definitions.
103 ------------------------------------------------------------------ */
104
njn2574bb4762002-09-24 11:23:50 +0000105#include "../coregrind/vg_kerneliface.h"
njn25e49d8e72002-09-23 09:36:25 +0000106
107
108/*====================================================================*/
njn27f1a382002-11-08 15:48:16 +0000109/*=== Core/skin interface version ===*/
110/*====================================================================*/
111
112/* The major version number indicates binary-incompatible changes to the
113 interface; if the core and skin major versions don't match, Valgrind
114 will abort. The minor version indicates binary-compatible changes.
115
116 We don't want the variables themselves in the core, only in the skins,
117 hence the #ifndef. But the core needs to know of their existence, hence
118 the #else branch. Phew.
119
120 In summary: skins don't need to do anything, the core works it all out.
121*/
122
123#define VG_CORE_INTERFACE_MAJOR_VERSION 1
124#define VG_CORE_INTERFACE_MINOR_VERSION 1
125
126extern const Int VG_(skin_interface_major_version);
127extern const Int VG_(skin_interface_minor_version);
128
129/* Every skin must define this macro somewhere, exactly once. */
130#define VG_DETERMINE_INTERFACE_VERSION \
131const Int VG_(skin_interface_major_version) = VG_CORE_INTERFACE_MAJOR_VERSION; \
132const Int VG_(skin_interface_minor_version) = VG_CORE_INTERFACE_MINOR_VERSION;
133
134/*====================================================================*/
njn25e49d8e72002-09-23 09:36:25 +0000135/*=== Command-line options ===*/
136/*====================================================================*/
137
138/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
139extern Int VG_(clo_verbosity);
140
141/* Profile? */
142extern Bool VG_(clo_profile);
143
njn25e49d8e72002-09-23 09:36:25 +0000144/* Call this if a recognised option was bad for some reason.
145 Note: don't use it just because an option was unrecognised -- return 'False'
146 from SKN_(process_cmd_line_option) to indicate that. */
147extern void VG_(bad_option) ( Char* opt );
148
149/* Client args */
150extern Int VG_(client_argc);
151extern Char** VG_(client_argv);
152
njnd5bb0a52002-09-27 10:24:48 +0000153/* Client environment. Can be inspected with VG_(getenv)() */
njn25e49d8e72002-09-23 09:36:25 +0000154extern Char** VG_(client_envp);
155
156
157/*====================================================================*/
158/*=== Printing messages for the user ===*/
159/*====================================================================*/
160
161/* Print a message prefixed by "??<pid>?? "; '?' depends on the VgMsgKind.
162 Should be used for all user output. */
163
164typedef
165 enum { Vg_UserMsg, /* '?' == '=' */
166 Vg_DebugMsg, /* '?' == '-' */
167 Vg_DebugExtraMsg /* '?' == '+' */
168 }
169 VgMsgKind;
170
171/* Functions for building a message from multiple parts. */
172extern void VG_(start_msg) ( VgMsgKind kind );
173extern void VG_(add_to_msg) ( Char* format, ... );
174/* Ends and prints the message. Appends a newline. */
175extern void VG_(end_msg) ( void );
176
njnd5bb0a52002-09-27 10:24:48 +0000177/* Send a single-part message. Appends a newline. */
njn25e49d8e72002-09-23 09:36:25 +0000178extern void VG_(message) ( VgMsgKind kind, Char* format, ... );
179
180
181/*====================================================================*/
182/*=== Profiling ===*/
183/*====================================================================*/
184
185/* Nb: VGP_(register_profile_event)() relies on VgpUnc being the first one */
186#define VGP_CORE_LIST \
187 /* These ones depend on the core */ \
188 VGP_PAIR(VgpUnc, "unclassified"), \
189 VGP_PAIR(VgpRun, "running"), \
190 VGP_PAIR(VgpSched, "scheduler"), \
191 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
192 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
193 VGP_PAIR(VgpStack, "adjust-stack"), \
194 VGP_PAIR(VgpTranslate, "translate-main"), \
195 VGP_PAIR(VgpToUCode, "to-ucode"), \
196 VGP_PAIR(VgpFromUcode, "from-ucode"), \
197 VGP_PAIR(VgpImprove, "improve"), \
198 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
199 VGP_PAIR(VgpLiveness, "liveness-analysis"), \
200 VGP_PAIR(VgpDoLRU, "do-lru"), \
201 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
202 VGP_PAIR(VgpInitMem, "init-memory"), \
203 VGP_PAIR(VgpExeContext, "exe-context"), \
204 VGP_PAIR(VgpReadSyms, "read-syms"), \
205 VGP_PAIR(VgpSearchSyms, "search-syms"), \
206 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
207 VGP_PAIR(VgpCoreSysWrap, "core-syscall-wrapper"), \
208 VGP_PAIR(VgpDemangle, "demangle"), \
njn37cea302002-09-30 11:24:00 +0000209 VGP_PAIR(VgpCoreCheapSanity, "core-cheap-sanity"), \
210 VGP_PAIR(VgpCoreExpensiveSanity, "core-expensive-sanity"), \
njn25e49d8e72002-09-23 09:36:25 +0000211 /* These ones depend on the skin */ \
212 VGP_PAIR(VgpPreCloInit, "pre-clo-init"), \
213 VGP_PAIR(VgpPostCloInit, "post-clo-init"), \
214 VGP_PAIR(VgpInstrument, "instrument"), \
215 VGP_PAIR(VgpSkinSysWrap, "skin-syscall-wrapper"), \
njn37cea302002-09-30 11:24:00 +0000216 VGP_PAIR(VgpSkinCheapSanity, "skin-cheap-sanity"), \
217 VGP_PAIR(VgpSkinExpensiveSanity, "skin-expensive-sanity"), \
njn25e49d8e72002-09-23 09:36:25 +0000218 VGP_PAIR(VgpFini, "fini")
219
220#define VGP_PAIR(n,name) n
221typedef enum { VGP_CORE_LIST } VgpCoreCC;
222#undef VGP_PAIR
223
224/* When registering skin profiling events, ensure that the 'n' value is in
225 * the range (VgpFini+1..) */
226extern void VGP_(register_profile_event) ( Int n, Char* name );
227
228extern void VGP_(pushcc) ( UInt cc );
229extern void VGP_(popcc) ( UInt cc );
230
231/* Define them only if they haven't already been defined by vg_profile.c */
232#ifndef VGP_PUSHCC
233# define VGP_PUSHCC(x)
234#endif
235#ifndef VGP_POPCC
236# define VGP_POPCC(x)
237#endif
238
239
240/*====================================================================*/
241/*=== Useful stuff to call from generated code ===*/
242/*====================================================================*/
243
244/* ------------------------------------------------------------------ */
245/* General stuff */
246
njn41557122002-10-14 09:25:37 +0000247/* 64-bit counter for the number of basic blocks done. */
248extern ULong VG_(bbs_done);
249
njn25e49d8e72002-09-23 09:36:25 +0000250/* Get the simulated %esp */
251extern Addr VG_(get_stack_pointer) ( void );
252
njnd5bb0a52002-09-27 10:24:48 +0000253/* Detect if an address is within Valgrind's stack or Valgrind's
254 m_state_static; useful for memory leak detectors to tell if a block
255 is used by Valgrind (and thus can be ignored). */
njn25e49d8e72002-09-23 09:36:25 +0000256extern Bool VG_(within_stack)(Addr a);
njn25e49d8e72002-09-23 09:36:25 +0000257extern Bool VG_(within_m_state_static)(Addr a);
258
259/* Check if an address is 4-byte aligned */
260#define IS_ALIGNED4_ADDR(aaa_p) (0 == (((UInt)(aaa_p)) & 3))
261
262
263/* ------------------------------------------------------------------ */
264/* Thread-related stuff */
265
266/* Special magic value for an invalid ThreadId. It corresponds to
267 LinuxThreads using zero as the initial value for
268 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
269#define VG_INVALID_THREADID ((ThreadId)(0))
270
271/* ThreadIds are simply indices into the vg_threads[] array. */
272typedef
273 UInt
274 ThreadId;
275
njnd5bb0a52002-09-27 10:24:48 +0000276/* struct _ThreadState defined elsewhere; ThreadState is abstract as its
277 definition is not important for skins. */
njn25e49d8e72002-09-23 09:36:25 +0000278typedef
279 struct _ThreadState
280 ThreadState;
281
sewardj7ab2aca2002-10-20 19:40:32 +0000282extern ThreadId VG_(get_current_tid) ( void );
sewardjb52a1b02002-10-23 21:38:22 +0000283extern ThreadId VG_(get_current_or_recent_tid) ( void );
sewardj7ab2aca2002-10-20 19:40:32 +0000284extern ThreadId VG_(get_tid_from_ThreadState) ( ThreadState* );
njn25e49d8e72002-09-23 09:36:25 +0000285extern ThreadState* VG_(get_ThreadState) ( ThreadId tid );
286
287
288/*====================================================================*/
289/*=== Valgrind's version of libc ===*/
290/*====================================================================*/
291
292/* Valgrind doesn't use libc at all, for good reasons (trust us). So here
293 are its own versions of C library functions, but with VG_ prefixes. Note
294 that the types of some are slightly different to the real ones. Some
295 extra useful functions are provided too; descriptions of how they work
296 are given below. */
297
298#if !defined(NULL)
299# define NULL ((void*)0)
300#endif
301
302
303/* ------------------------------------------------------------------ */
304/* stdio.h
305 *
306 * Note that they all output to the file descriptor given by the
307 * --logfile-fd=N argument, which defaults to 2 (stderr). Hence no
308 * need for VG_(fprintf)().
njn25e49d8e72002-09-23 09:36:25 +0000309 */
sewardj78e3cd92002-10-22 04:45:48 +0000310extern UInt VG_(printf) ( const char *format, ... );
njn25e49d8e72002-09-23 09:36:25 +0000311/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
sewardj78e3cd92002-10-22 04:45:48 +0000312extern UInt VG_(sprintf) ( Char* buf, Char *format, ... );
313extern UInt VG_(vprintf) ( void(*send)(Char),
njn25e49d8e72002-09-23 09:36:25 +0000314 const Char *format, va_list vargs );
315
njn41557122002-10-14 09:25:37 +0000316extern Int VG_(rename) ( Char* old_name, Char* new_name );
317
njn25e49d8e72002-09-23 09:36:25 +0000318/* ------------------------------------------------------------------ */
319/* stdlib.h */
320
321extern void* VG_(malloc) ( Int nbytes );
njnd5bb0a52002-09-27 10:24:48 +0000322extern void VG_(free) ( void* p );
323extern void* VG_(calloc) ( Int n, Int nbytes );
324extern void* VG_(realloc) ( void* p, Int size );
325extern void* VG_(malloc_aligned) ( Int align_bytes, Int nbytes );
njn25e49d8e72002-09-23 09:36:25 +0000326
327extern void VG_(print_malloc_stats) ( void );
328
329
330extern void VG_(exit)( Int status )
331 __attribute__ ((__noreturn__));
njne427a662002-10-02 11:08:25 +0000332/* Prints a panic message (a constant string), appends newline and bug
333 reporting info, aborts. */
334__attribute__ ((__noreturn__))
335extern void VG_(skin_panic) ( Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000336
njnd5bb0a52002-09-27 10:24:48 +0000337/* Looks up VG_(client_envp) */
njn25e49d8e72002-09-23 09:36:25 +0000338extern Char* VG_(getenv) ( Char* name );
339
340/* Crude stand-in for the glibc system() call. */
341extern Int VG_(system) ( Char* cmd );
342
njnd5bb0a52002-09-27 10:24:48 +0000343extern Long VG_(atoll) ( Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000344
345/* Like atoll(), but converts a number of base 2..36 */
346extern Long VG_(atoll36) ( UInt base, Char* str );
347
348
349/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000350/* ctype.h */
njn25e49d8e72002-09-23 09:36:25 +0000351extern Bool VG_(isspace) ( Char c );
352extern Bool VG_(isdigit) ( Char c );
353extern Char VG_(toupper) ( Char c );
354
355
356/* ------------------------------------------------------------------ */
357/* string.h */
358extern Int VG_(strlen) ( const Char* str );
359extern Char* VG_(strcat) ( Char* dest, const Char* src );
360extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
361extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
362extern Char* VG_(strcpy) ( Char* dest, const Char* src );
363extern Char* VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
364extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
365extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
366extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
367extern Char* VG_(strchr) ( const Char* s, Char c );
368extern Char* VG_(strdup) ( const Char* s);
sewardj7ab2aca2002-10-20 19:40:32 +0000369extern void* VG_(memcpy) ( void *d, const void *s, Int sz );
370extern void* VG_(memset) ( void *s, Int c, Int sz );
njn25e49d8e72002-09-23 09:36:25 +0000371
njnd5bb0a52002-09-27 10:24:48 +0000372/* Like strcmp() and strncmp(), but stop comparing at any whitespace. */
njn25e49d8e72002-09-23 09:36:25 +0000373extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
njn25e49d8e72002-09-23 09:36:25 +0000374extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
375
njnd5bb0a52002-09-27 10:24:48 +0000376/* Like strncpy(), but if 'src' is longer than 'ndest' inserts a '\0' as the
377 last character. */
njn25e49d8e72002-09-23 09:36:25 +0000378extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
379
380/* Mini-regexp function. Searches for 'pat' in 'str'. Supports
381 * meta-symbols '*' and '?'. '\' escapes meta-symbols. */
njn4ba5a792002-09-30 10:23:54 +0000382extern Bool VG_(string_match) ( Char* pat, Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000383
384
385/* ------------------------------------------------------------------ */
386/* math.h */
njnd5bb0a52002-09-27 10:24:48 +0000387/* Returns the base-2 logarithm of x. */
njn25e49d8e72002-09-23 09:36:25 +0000388extern Int VG_(log2) ( Int x );
389
390
391/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000392/* unistd.h, fcntl.h, sys/stat.h */
sewardj4cf05692002-10-27 20:28:29 +0000393extern Int VG_(getpid) ( void );
394extern Int VG_(getppid) ( void );
njnd5bb0a52002-09-27 10:24:48 +0000395
njn4aca2d22002-10-04 10:29:38 +0000396extern Int VG_(open) ( const Char* pathname, Int flags, Int mode );
397extern Int VG_(read) ( Int fd, void* buf, Int count);
398extern Int VG_(write) ( Int fd, void* buf, Int count);
399extern void VG_(close) ( Int fd );
njnd5bb0a52002-09-27 10:24:48 +0000400
njn41557122002-10-14 09:25:37 +0000401/* Nb: VG_(rename)() declared in stdio.h section above */
njn4aca2d22002-10-04 10:29:38 +0000402extern Int VG_(unlink) ( Char* file_name );
403extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
njn25e49d8e72002-09-23 09:36:25 +0000404
405
406/* ------------------------------------------------------------------ */
407/* assert.h */
408/* Asserts permanently enabled -- no turning off with NDEBUG. Hurrah! */
409#define VG__STRING(__str) #__str
410
njne427a662002-10-02 11:08:25 +0000411#define sk_assert(expr) \
njn25e49d8e72002-09-23 09:36:25 +0000412 ((void) ((expr) ? 0 : \
njne427a662002-10-02 11:08:25 +0000413 (VG_(skin_assert_fail) (VG__STRING(expr), \
414 __FILE__, __LINE__, \
415 __PRETTY_FUNCTION__), 0)))
njn25e49d8e72002-09-23 09:36:25 +0000416
njne427a662002-10-02 11:08:25 +0000417__attribute__ ((__noreturn__))
418extern void VG_(skin_assert_fail) ( Char* expr, Char* file,
419 Int line, Char* fn );
njn25e49d8e72002-09-23 09:36:25 +0000420
421
422/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000423/* system/mman.h */
njn25e49d8e72002-09-23 09:36:25 +0000424extern void* VG_(mmap)( void* start, UInt length,
425 UInt prot, UInt flags, UInt fd, UInt offset );
426extern Int VG_(munmap)( void* start, Int length );
427
428/* Get memory by anonymous mmap. */
429extern void* VG_(get_memory_from_mmap) ( Int nBytes, Char* who );
430
431
432/* ------------------------------------------------------------------ */
433/* signal.h.
434
435 Note that these use the vk_ (kernel) structure
436 definitions, which are different in places from those that glibc
437 defines -- hence the 'k' prefix. Since we're operating right at the
438 kernel interface, glibc's view of the world is entirely irrelevant. */
439
440/* --- Signal set ops --- */
njnd5bb0a52002-09-27 10:24:48 +0000441extern Int VG_(ksigfillset) ( vki_ksigset_t* set );
442extern Int VG_(ksigemptyset) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000443
njnd5bb0a52002-09-27 10:24:48 +0000444extern Bool VG_(kisfullsigset) ( vki_ksigset_t* set );
445extern Bool VG_(kisemptysigset) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000446
njnd5bb0a52002-09-27 10:24:48 +0000447extern Int VG_(ksigaddset) ( vki_ksigset_t* set, Int signum );
448extern Int VG_(ksigdelset) ( vki_ksigset_t* set, Int signum );
njn25e49d8e72002-09-23 09:36:25 +0000449extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
450
njnd5bb0a52002-09-27 10:24:48 +0000451extern void VG_(ksigaddset_from_set) ( vki_ksigset_t* dst, vki_ksigset_t* src );
452extern void VG_(ksigdelset_from_set) ( vki_ksigset_t* dst, vki_ksigset_t* src );
njn25e49d8e72002-09-23 09:36:25 +0000453
454/* --- Mess with the kernel's sig state --- */
njnd5bb0a52002-09-27 10:24:48 +0000455extern Int VG_(ksigprocmask) ( Int how, const vki_ksigset_t* set,
njn25e49d8e72002-09-23 09:36:25 +0000456 vki_ksigset_t* oldset );
njnd5bb0a52002-09-27 10:24:48 +0000457extern Int VG_(ksigaction) ( Int signum,
458 const vki_ksigaction* act,
459 vki_ksigaction* oldact );
njn25e49d8e72002-09-23 09:36:25 +0000460
njnd5bb0a52002-09-27 10:24:48 +0000461extern Int VG_(ksignal) ( Int signum, void (*sighandler)(Int) );
462extern Int VG_(ksigaltstack) ( const vki_kstack_t* ss, vki_kstack_t* oss );
njn25e49d8e72002-09-23 09:36:25 +0000463
sewardjdcaf3122002-09-30 23:12:33 +0000464extern Int VG_(kkill) ( Int pid, Int signo );
465extern Int VG_(ksigpending) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000466
467
468/*====================================================================*/
469/*=== UCode definition ===*/
470/*====================================================================*/
471
sewardje1042472002-09-30 12:33:11 +0000472/* Tags which describe what operands are. Must fit into 4 bits, which
473 they clearly do. */
njn25e49d8e72002-09-23 09:36:25 +0000474typedef
sewardje1042472002-09-30 12:33:11 +0000475enum { TempReg =0, /* virtual temp-reg */
476 ArchReg =1, /* simulated integer reg */
477 ArchRegS =2, /* simulated segment reg */
478 RealReg =3, /* real machine's real reg */
479 SpillNo =4, /* spill slot location */
480 Literal =5, /* literal; .lit32 field has actual value */
481 Lit16 =6, /* literal; .val[123] field has actual value */
482 NoValue =7 /* operand not in use */
483 }
484 Tag;
njn25e49d8e72002-09-23 09:36:25 +0000485
njnd5bb0a52002-09-27 10:24:48 +0000486/* Invalid register numbers (can't be negative) */
njn25e49d8e72002-09-23 09:36:25 +0000487#define INVALID_TEMPREG 999999999
488#define INVALID_REALREG 999999999
489
490/* Microinstruction opcodes. */
491typedef
492 enum {
njnd5bb0a52002-09-27 10:24:48 +0000493 NOP, /* Null op */
njn25e49d8e72002-09-23 09:36:25 +0000494
njnd5bb0a52002-09-27 10:24:48 +0000495 /* Moving values around */
496 GET, PUT, /* simulated register <--> TempReg */
497 GETF, PUTF, /* simulated %eflags <--> TempReg */
498 LOAD, STORE, /* memory <--> TempReg */
499 MOV, /* TempReg <--> TempReg */
500 CMOV, /* Used for cmpxchg and cmov */
njn25e49d8e72002-09-23 09:36:25 +0000501
njnd5bb0a52002-09-27 10:24:48 +0000502 /* Arithmetic/logical ops */
503 ADD, ADC, SUB, SBB, /* Add/subtract (w/wo carry) */
504 AND, OR, XOR, NOT, /* Boolean ops */
505 SHL, SHR, SAR, ROL, ROR, RCL, RCR, /* Shift/rotate (w/wo carry) */
506 NEG, /* Negate */
507 INC, DEC, /* Increment/decrement */
508 BSWAP, /* Big-endian <--> little-endian */
509 CC2VAL, /* Condition code --> 0 or 1 */
510 WIDEN, /* Signed or unsigned widening */
njn25e49d8e72002-09-23 09:36:25 +0000511
njnd5bb0a52002-09-27 10:24:48 +0000512 /* Conditional or unconditional jump */
513 JMP,
514
515 /* FPU ops */
516 FPU, /* Doesn't touch memory */
517 FPU_R, FPU_W, /* Reads/writes memory */
518
519 /* Not strictly needed, but improve address calculation translations. */
njn25e49d8e72002-09-23 09:36:25 +0000520 LEA1, /* reg2 := const + reg1 */
521 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
522
njnd5bb0a52002-09-27 10:24:48 +0000523 /* Hack for x86 REP insns. Jump to literal if TempReg/RealReg is zero. */
524 JIFZ,
njn25e49d8e72002-09-23 09:36:25 +0000525
njnd5bb0a52002-09-27 10:24:48 +0000526 /* Advance the simulated %eip by some small (< 128) number. */
527 INCEIP,
njn25e49d8e72002-09-23 09:36:25 +0000528
sewardje1042472002-09-30 12:33:11 +0000529 /* Dealing with segment registers */
530 GETSEG, PUTSEG, /* simulated segment register <--> TempReg */
531 USESEG, /* (LDT/GDT index, virtual addr) --> linear addr */
532
njnd5bb0a52002-09-27 10:24:48 +0000533 /* Not for translating x86 calls -- only to call helpers */
534 CALLM_S, CALLM_E, /* Mark start/end of CALLM push/pop sequence */
535 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers */
536 CALLM, /* Call assembly-code helper */
537
538 /* Not for translating x86 calls -- only to call C helper functions of
539 up to three arguments (or two if the functions has a return value).
540 Arguments and return value must be word-sized. More arguments can
541 be faked with global variables (eg. use VG_(set_global_var)()).
542
543 Seven possibilities: 'arg[123]' show where args go, 'ret' shows
544 where return value goes (if present).
njn25e49d8e72002-09-23 09:36:25 +0000545
546 CCALL(-, -, - ) void f(void)
547 CCALL(arg1, -, - ) void f(UInt arg1)
548 CCALL(arg1, arg2, - ) void f(UInt arg1, UInt arg2)
549 CCALL(arg1, arg2, arg3) void f(UInt arg1, UInt arg2, UInt arg3)
550 CCALL(-, -, ret ) UInt f(UInt)
551 CCALL(arg1, -, ret ) UInt f(UInt arg1)
njnd5bb0a52002-09-27 10:24:48 +0000552 CCALL(arg1, arg2, ret ) UInt f(UInt arg1, UInt arg2) */
njn25e49d8e72002-09-23 09:36:25 +0000553 CCALL,
554
njnd5bb0a52002-09-27 10:24:48 +0000555 /* This opcode makes it easy for skins that extend UCode to do this to
556 avoid opcode overlap:
njn25e49d8e72002-09-23 09:36:25 +0000557
njnd5bb0a52002-09-27 10:24:48 +0000558 enum { EU_OP1 = DUMMY_FINAL_UOPCODE + 1, ... }
njn25e49d8e72002-09-23 09:36:25 +0000559
560 WARNING: Do not add new opcodes after this one! They can be added
561 before, though. */
562 DUMMY_FINAL_UOPCODE
563 }
564 Opcode;
565
566
njnd5bb0a52002-09-27 10:24:48 +0000567/* Condition codes, using the Intel encoding. CondAlways is an extra. */
njn25e49d8e72002-09-23 09:36:25 +0000568typedef
569 enum {
570 CondO = 0, /* overflow */
571 CondNO = 1, /* no overflow */
572 CondB = 2, /* below */
573 CondNB = 3, /* not below */
574 CondZ = 4, /* zero */
575 CondNZ = 5, /* not zero */
576 CondBE = 6, /* below or equal */
577 CondNBE = 7, /* not below or equal */
578 CondS = 8, /* negative */
sewardje1042472002-09-30 12:33:11 +0000579 CondNS = 9, /* not negative */
njn25e49d8e72002-09-23 09:36:25 +0000580 CondP = 10, /* parity even */
581 CondNP = 11, /* not parity even */
582 CondL = 12, /* jump less */
583 CondNL = 13, /* not less */
584 CondLE = 14, /* less or equal */
585 CondNLE = 15, /* not less or equal */
586 CondAlways = 16 /* Jump always */
587 }
588 Condcode;
589
590
591/* Descriptions of additional properties of *unconditional* jumps. */
592typedef
593 enum {
594 JmpBoring=0, /* boring unconditional jump */
595 JmpCall=1, /* jump due to an x86 call insn */
596 JmpRet=2, /* jump due to an x86 ret insn */
597 JmpSyscall=3, /* do a system call, then jump */
598 JmpClientReq=4 /* do a client request, then jump */
599 }
600 JmpKind;
601
602
603/* Flags. User-level code can only read/write O(verflow), S(ign),
604 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
605 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
606 thusly:
607 76543210
608 DOSZACP
609 and bit 7 must always be zero since it is unused.
610*/
611typedef UChar FlagSet;
612
613#define FlagD (1<<6)
614#define FlagO (1<<5)
615#define FlagS (1<<4)
616#define FlagZ (1<<3)
617#define FlagA (1<<2)
618#define FlagC (1<<1)
619#define FlagP (1<<0)
620
621#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
622#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
623#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
624#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
625#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
626#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
627#define FlagsZCP ( FlagZ | FlagC | FlagP)
628#define FlagsOC (FlagO | FlagC )
629#define FlagsAC ( FlagA | FlagC )
630
631#define FlagsALL (FlagsOSZACP | FlagD)
632#define FlagsEmpty (FlagSet)0
633
634
635/* Liveness of general purpose registers, useful for code generation.
636 Reg rank order 0..N-1 corresponds to bits 0..N-1, ie. first
637 reg's liveness in bit 0, last reg's in bit N-1. Note that
638 these rankings don't match the Intel register ordering. */
639typedef UInt RRegSet;
640
641#define ALL_RREGS_DEAD 0 /* 0000...00b */
njne7c258c2002-10-03 08:57:01 +0000642#define ALL_RREGS_LIVE ((1 << VG_MAX_REALREGS)-1) /* 0011...11b */
njn25e49d8e72002-09-23 09:36:25 +0000643#define UNIT_RREGSET(rank) (1 << (rank))
644
645#define IS_RREG_LIVE(rank,rregs_live) (rregs_live & UNIT_RREGSET(rank))
646#define SET_RREG_LIVENESS(rank,rregs_live,b) \
647 do { RRegSet unit = UNIT_RREGSET(rank); \
648 if (b) rregs_live |= unit; \
649 else rregs_live &= ~unit; \
650 } while(0)
651
652
653/* A Micro (u)-instruction. */
654typedef
655 struct {
656 /* word 1 */
657 UInt lit32; /* 32-bit literal */
658
659 /* word 2 */
660 UShort val1; /* first operand */
661 UShort val2; /* second operand */
662
663 /* word 3 */
664 UShort val3; /* third operand */
665 UChar opcode; /* opcode */
666 UChar size; /* data transfer size */
667
668 /* word 4 */
669 FlagSet flags_r; /* :: FlagSet */
670 FlagSet flags_w; /* :: FlagSet */
671 UChar tag1:4; /* first operand tag */
672 UChar tag2:4; /* second operand tag */
673 UChar tag3:4; /* third operand tag */
674 UChar extra4b:4; /* Spare field, used by WIDEN for src
675 -size, and by LEA2 for scale (1,2,4 or 8),
676 and by JMPs for original x86 instr size */
677
678 /* word 5 */
679 UChar cond; /* condition, for jumps */
680 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
681 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
682
683 /* Additional properties for UInstrs that call C functions:
684 - CCALL
685 - PUT (when %ESP is the target)
686 - possibly skin-specific UInstrs
687 */
688 UChar argc:2; /* Number of args, max 3 */
689 UChar regparms_n:2; /* Number of args passed in registers */
690 Bool has_ret_val:1; /* Function has return value? */
691
692 /* RealReg liveness; only sensical after reg alloc and liveness
693 analysis done. This info is a little bit arch-specific --
694 VG_MAX_REALREGS can vary on different architectures. Note that
695 to use this information requires converting between register ranks
njn4ba5a792002-09-30 10:23:54 +0000696 and the Intel register numbers, using VG_(realreg_to_rank)()
697 and/or VG_(rank_to_realreg)() */
njn25e49d8e72002-09-23 09:36:25 +0000698 RRegSet regs_live_after:VG_MAX_REALREGS;
699 }
700 UInstr;
701
702
703/* Expandable arrays of uinstrs. */
704typedef
705 struct {
706 Int used;
707 Int size;
708 UInstr* instrs;
709 Int nextTemp;
710 }
711 UCodeBlock;
712
713
714/*====================================================================*/
715/*=== Instrumenting UCode ===*/
716/*====================================================================*/
717
718/* A structure for communicating TempReg and RealReg uses of UInstrs. */
719typedef
720 struct {
721 Int num;
722 Bool isWrite;
723 }
724 RegUse;
725
726/* Find what this instruction does to its regs. Tag indicates whether we're
727 * considering TempRegs (pre-reg-alloc) or RealRegs (post-reg-alloc).
728 * Useful for analysis/optimisation passes. */
njn4ba5a792002-09-30 10:23:54 +0000729extern Int VG_(get_reg_usage) ( UInstr* u, Tag tag, RegUse* arr );
njn25e49d8e72002-09-23 09:36:25 +0000730
731
732/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000733/* Used to register helper functions to be called from generated code. A
734 limited number of compact helpers can be registered; the code generated
735 to call them is slightly shorter -- so register the mostly frequently
736 called helpers as compact. */
njn25e49d8e72002-09-23 09:36:25 +0000737extern void VG_(register_compact_helper) ( Addr a );
738extern void VG_(register_noncompact_helper) ( Addr a );
739
740
741/* ------------------------------------------------------------------ */
742/* Virtual register allocation */
743
744/* Get a new virtual register */
njn4ba5a792002-09-30 10:23:54 +0000745extern Int VG_(get_new_temp) ( UCodeBlock* cb );
njn25e49d8e72002-09-23 09:36:25 +0000746
747/* Get a new virtual shadow register */
njn4ba5a792002-09-30 10:23:54 +0000748extern Int VG_(get_new_shadow) ( UCodeBlock* cb );
njn25e49d8e72002-09-23 09:36:25 +0000749
750/* Get a virtual register's corresponding virtual shadow register */
751#define SHADOW(tempreg) ((tempreg)+1)
752
753
754/* ------------------------------------------------------------------ */
755/* Low-level UInstr builders */
njn4ba5a792002-09-30 10:23:54 +0000756extern void VG_(new_NOP) ( UInstr* u );
757extern void VG_(new_UInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
758extern void VG_(new_UInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000759 Tag tag1, UInt val1 );
njn4ba5a792002-09-30 10:23:54 +0000760extern void VG_(new_UInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000761 Tag tag1, UInt val1,
762 Tag tag2, UInt val2 );
njn4ba5a792002-09-30 10:23:54 +0000763extern void VG_(new_UInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000764 Tag tag1, UInt val1,
765 Tag tag2, UInt val2,
766 Tag tag3, UInt val3 );
njn25e49d8e72002-09-23 09:36:25 +0000767
njn4ba5a792002-09-30 10:23:54 +0000768extern void VG_(set_flag_RW) ( UInstr* u, FlagSet fr, FlagSet fw );
769extern void VG_(set_lit_field) ( UCodeBlock* cb, UInt lit32 );
770extern void VG_(set_ccall_fields) ( UCodeBlock* cb, Addr fn, UChar argc,
771 UChar regparms_n, Bool has_ret_val );
njn25e49d8e72002-09-23 09:36:25 +0000772
njn4ba5a792002-09-30 10:23:54 +0000773extern void VG_(copy_UInstr) ( UCodeBlock* cb, UInstr* instr );
774
775extern Bool VG_(any_flag_use)( UInstr* u );
njn25e49d8e72002-09-23 09:36:25 +0000776
njnac6c1762002-10-04 14:34:15 +0000777/* Macro versions of the above; just shorter to type. */
778#define uInstr0 VG_(new_UInstr0)
779#define uInstr1 VG_(new_UInstr1)
780#define uInstr2 VG_(new_UInstr2)
781#define uInstr3 VG_(new_UInstr3)
782#define uLiteral VG_(set_lit_field)
783#define uCCall VG_(set_ccall_fields)
784#define newTemp VG_(get_new_temp)
785#define newShadow VG_(get_new_shadow)
786
njn25e49d8e72002-09-23 09:36:25 +0000787/* Refer to `the last instruction stuffed in' (can be lvalue). */
788#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
789
790
791/* ------------------------------------------------------------------ */
792/* Higher-level UInstr sequence builders */
njn4ba5a792002-09-30 10:23:54 +0000793extern void VG_(call_helper_0_0) ( UCodeBlock* cb, Addr f);
794extern void VG_(call_helper_1_0) ( UCodeBlock* cb, Addr f, UInt arg1,
795 UInt regparms_n);
796extern void VG_(call_helper_2_0) ( UCodeBlock* cb, Addr f, UInt arg1, UInt arg2,
797 UInt regparms_n);
njn25e49d8e72002-09-23 09:36:25 +0000798
799/* One way around the 3-arg C function limit is to pass args via global
800 * variables... ugly, but it works. */
njn4ba5a792002-09-30 10:23:54 +0000801extern void VG_(set_global_var) ( UCodeBlock* cb, Addr globvar_ptr, UInt val);
njn25e49d8e72002-09-23 09:36:25 +0000802
803/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000804/* Allocating/freeing basic blocks of UCode */
njn4ba5a792002-09-30 10:23:54 +0000805extern UCodeBlock* VG_(alloc_UCodeBlock) ( void );
806extern void VG_(free_UCodeBlock) ( UCodeBlock* cb );
njnd5bb0a52002-09-27 10:24:48 +0000807
808/* ------------------------------------------------------------------ */
809/* UCode pretty/ugly printing. Probably only useful to call from a skin
njn25e49d8e72002-09-23 09:36:25 +0000810 if VG_(needs).extended_UCode == True. */
811
812/* When True, all generated code is/should be printed. */
813extern Bool VG_(print_codegen);
814
njn4ba5a792002-09-30 10:23:54 +0000815/* Pretty/ugly printing functions */
816extern void VG_(pp_UCodeBlock) ( UCodeBlock* cb, Char* title );
817extern void VG_(pp_UInstr) ( Int instrNo, UInstr* u );
818extern void VG_(pp_UInstr_regs) ( Int instrNo, UInstr* u );
819extern void VG_(up_UInstr) ( Int instrNo, UInstr* u );
820extern Char* VG_(name_UOpcode) ( Bool upper, Opcode opc );
821extern void VG_(pp_UOperand) ( UInstr* u, Int operandNo,
822 Int sz, Bool parens );
njn25e49d8e72002-09-23 09:36:25 +0000823
njn25e49d8e72002-09-23 09:36:25 +0000824
825/*====================================================================*/
njnd5bb0a52002-09-27 10:24:48 +0000826/*=== Generating x86 code from UCode ===*/
njn25e49d8e72002-09-23 09:36:25 +0000827/*====================================================================*/
828
njnd5bb0a52002-09-27 10:24:48 +0000829/* All this only necessary for skins with VG_(needs).extends_UCode == True. */
njn25e49d8e72002-09-23 09:36:25 +0000830
sewardje1042472002-09-30 12:33:11 +0000831/* This is the Intel register encoding -- integer regs. */
njn25e49d8e72002-09-23 09:36:25 +0000832#define R_EAX 0
833#define R_ECX 1
834#define R_EDX 2
835#define R_EBX 3
836#define R_ESP 4
837#define R_EBP 5
838#define R_ESI 6
839#define R_EDI 7
840
841#define R_AL (0+R_EAX)
842#define R_CL (0+R_ECX)
843#define R_DL (0+R_EDX)
844#define R_BL (0+R_EBX)
845#define R_AH (4+R_EAX)
846#define R_CH (4+R_ECX)
847#define R_DH (4+R_EDX)
848#define R_BH (4+R_EBX)
849
sewardje1042472002-09-30 12:33:11 +0000850/* This is the Intel register encoding -- segment regs. */
851#define R_ES 0
852#define R_CS 1
853#define R_SS 2
854#define R_DS 3
855#define R_FS 4
856#define R_GS 5
857
njn25e49d8e72002-09-23 09:36:25 +0000858/* For pretty printing x86 code */
sewardje1042472002-09-30 12:33:11 +0000859extern Char* VG_(name_of_seg_reg) ( Int sreg );
njn4ba5a792002-09-30 10:23:54 +0000860extern Char* VG_(name_of_int_reg) ( Int size, Int reg );
861extern Char VG_(name_of_int_size) ( Int size );
njn25e49d8e72002-09-23 09:36:25 +0000862
njnac6c1762002-10-04 14:34:15 +0000863/* Shorter macros for convenience */
864#define nameIReg VG_(name_of_int_reg)
865#define nameISize VG_(name_of_int_size)
866#define nameSReg VG_(name_of_seg_reg)
867
njn25e49d8e72002-09-23 09:36:25 +0000868/* Randomly useful things */
869extern UInt VG_(extend_s_8to32) ( UInt x );
870
871/* Code emitters */
njn4ba5a792002-09-30 10:23:54 +0000872extern void VG_(emitB) ( UInt b );
873extern void VG_(emitW) ( UInt w );
874extern void VG_(emitL) ( UInt l );
875extern void VG_(new_emit) ( void );
njn25e49d8e72002-09-23 09:36:25 +0000876
877/* Finding offsets */
njn4ba5a792002-09-30 10:23:54 +0000878extern Int VG_(helper_offset) ( Addr a );
879extern Int VG_(shadow_reg_offset) ( Int arch );
880extern Int VG_(shadow_flags_offset) ( void );
njn25e49d8e72002-09-23 09:36:25 +0000881
njnd5bb0a52002-09-27 10:24:48 +0000882/* Convert reg ranks <-> Intel register ordering, for using register
883 liveness information. */
njn4ba5a792002-09-30 10:23:54 +0000884extern Int VG_(realreg_to_rank) ( Int realreg );
885extern Int VG_(rank_to_realreg) ( Int rank );
njn25e49d8e72002-09-23 09:36:25 +0000886
njnd5bb0a52002-09-27 10:24:48 +0000887/* Call a subroutine. Does no argument passing, stack manipulations, etc. */
njn4ba5a792002-09-30 10:23:54 +0000888extern void VG_(synth_call) ( Bool ensure_shortform, Int word_offset );
njn25e49d8e72002-09-23 09:36:25 +0000889
njnd5bb0a52002-09-27 10:24:48 +0000890/* For calling C functions -- saves caller save regs, pushes args, calls,
891 clears the stack, restores caller save regs. `fn' must be registered in
892 the baseBlock first. Acceptable tags are RealReg and Literal. Optimises
893 things, eg. by not preserving non-live caller-save registers.
njn25e49d8e72002-09-23 09:36:25 +0000894
njnd5bb0a52002-09-27 10:24:48 +0000895 WARNING: a UInstr should *not* be translated with synth_ccall() followed
896 by some other x86 assembly code; this will invalidate the results of
897 vg_realreg_liveness_analysis() and everything will fall over. */
njn4ba5a792002-09-30 10:23:54 +0000898extern void VG_(synth_ccall) ( Addr fn, Int argc, Int regparms_n, UInt argv[],
899 Tag tagv[], Int ret_reg,
900 RRegSet regs_live_before,
901 RRegSet regs_live_after );
njn25e49d8e72002-09-23 09:36:25 +0000902
903/* Addressing modes */
njn4ba5a792002-09-30 10:23:54 +0000904extern void VG_(emit_amode_offregmem_reg)( Int off, Int regmem, Int reg );
905extern void VG_(emit_amode_ereg_greg) ( Int e_reg, Int g_reg );
njn25e49d8e72002-09-23 09:36:25 +0000906
907/* v-size (4, or 2 with OSO) insn emitters */
njn4ba5a792002-09-30 10:23:54 +0000908extern void VG_(emit_movv_offregmem_reg) ( Int sz, Int off, Int areg, Int reg );
909extern void VG_(emit_movv_reg_offregmem) ( Int sz, Int reg, Int off, Int areg );
910extern void VG_(emit_movv_reg_reg) ( Int sz, Int reg1, Int reg2 );
911extern void VG_(emit_nonshiftopv_lit_reg)( Int sz, Opcode opc, UInt lit,
912 Int reg );
913extern void VG_(emit_shiftopv_lit_reg) ( Int sz, Opcode opc, UInt lit,
914 Int reg );
915extern void VG_(emit_nonshiftopv_reg_reg)( Int sz, Opcode opc,
916 Int reg1, Int reg2 );
917extern void VG_(emit_movv_lit_reg) ( Int sz, UInt lit, Int reg );
918extern void VG_(emit_unaryopv_reg) ( Int sz, Opcode opc, Int reg );
919extern void VG_(emit_pushv_reg) ( Int sz, Int reg );
920extern void VG_(emit_popv_reg) ( Int sz, Int reg );
njn25e49d8e72002-09-23 09:36:25 +0000921
njn4ba5a792002-09-30 10:23:54 +0000922extern void VG_(emit_pushl_lit32) ( UInt int32 );
923extern void VG_(emit_pushl_lit8) ( Int lit8 );
924extern void VG_(emit_cmpl_zero_reg) ( Int reg );
925extern void VG_(emit_swapl_reg_EAX) ( Int reg );
926extern void VG_(emit_movv_lit_offregmem) ( Int sz, UInt lit, Int off,
927 Int memreg );
njn25e49d8e72002-09-23 09:36:25 +0000928
929/* b-size (1 byte) instruction emitters */
njn4ba5a792002-09-30 10:23:54 +0000930extern void VG_(emit_movb_lit_offregmem) ( UInt lit, Int off, Int memreg );
931extern void VG_(emit_movb_reg_offregmem) ( Int reg, Int off, Int areg );
932extern void VG_(emit_unaryopb_reg) ( Opcode opc, Int reg );
933extern void VG_(emit_testb_lit_reg) ( UInt lit, Int reg );
njn25e49d8e72002-09-23 09:36:25 +0000934
935/* zero-extended load emitters */
njn4ba5a792002-09-30 10:23:54 +0000936extern void VG_(emit_movzbl_offregmem_reg) ( Int off, Int regmem, Int reg );
937extern void VG_(emit_movzwl_offregmem_reg) ( Int off, Int areg, Int reg );
njn25e49d8e72002-09-23 09:36:25 +0000938
939/* misc instruction emitters */
njn4ba5a792002-09-30 10:23:54 +0000940extern void VG_(emit_call_reg) ( Int reg );
941extern void VG_(emit_add_lit_to_esp) ( Int lit );
942extern void VG_(emit_jcondshort_delta) ( Condcode cond, Int delta );
943extern void VG_(emit_pushal) ( void );
944extern void VG_(emit_popal) ( void );
945extern void VG_(emit_AMD_prefetch_reg) ( Int reg );
njn25e49d8e72002-09-23 09:36:25 +0000946
947
948/*====================================================================*/
949/*=== Execution contexts ===*/
950/*====================================================================*/
951
952/* Generic resolution type used in a few different ways, such as deciding
953 how closely to compare two errors for equality. */
954typedef
955 enum { Vg_LowRes, Vg_MedRes, Vg_HighRes }
956 VgRes;
957
958typedef
959 struct _ExeContext
960 ExeContext;
961
njnd5bb0a52002-09-27 10:24:48 +0000962/* Compare two ExeContexts. Number of callers considered depends on `res':
963 Vg_LowRes: 2
964 Vg_MedRes: 4
965 Vg_HighRes: all */
njn25e49d8e72002-09-23 09:36:25 +0000966extern Bool VG_(eq_ExeContext) ( VgRes res,
967 ExeContext* e1, ExeContext* e2 );
968
969/* Print an ExeContext. */
970extern void VG_(pp_ExeContext) ( ExeContext* );
971
972/* Take a snapshot of the client's stack. Search our collection of
973 ExeContexts to see if we already have it, and if not, allocate a
974 new one. Either way, return a pointer to the context. */
975extern ExeContext* VG_(get_ExeContext) ( ThreadState *tst );
976
sewardj499e3de2002-11-13 22:22:25 +0000977/* Just grab the client's EIP, as a much smaller and cheaper
978 indication of where they are. */
979extern Addr VG_(get_EIP)( ThreadState *tst );
njn25e49d8e72002-09-23 09:36:25 +0000980
981/*====================================================================*/
982/*=== Error reporting ===*/
983/*====================================================================*/
984
985/* ------------------------------------------------------------------ */
986/* Suppressions describe errors which we want to suppress, ie, not
987 show the user, usually because it is caused by a problem in a library
988 which we can't fix, replace or work around. Suppressions are read from
njnd5bb0a52002-09-27 10:24:48 +0000989 a file at startup time. This gives flexibility so that new
njn25e49d8e72002-09-23 09:36:25 +0000990 suppressions can be added to the file as and when needed.
991*/
992
993typedef
994 Int /* Do not make this unsigned! */
995 SuppKind;
996
997/* An extensible (via the 'extra' field) suppression record. This holds
998 the suppression details of interest to a skin. Skins can use a normal
999 enum (with element values in the normal range (0..)) for `skind'.
1000
1001 If VG_(needs).report_errors==True, for each suppression read in by core
1002 SKN_(recognised_suppression)() and SKN_(read_extra_suppression_info) will
1003 be called. The `skind' field is filled in by the value returned in the
1004 argument of the first function; the second function can fill in the
1005 `string' and `extra' fields if it wants.
1006*/
1007typedef
1008 struct {
1009 /* What kind of suppression. Must use the range (0..) */
1010 SuppKind skind;
1011 /* String -- use is optional. NULL by default. */
1012 Char* string;
1013 /* Anything else -- use is optional. NULL by default. */
1014 void* extra;
1015 }
1016 SkinSupp;
1017
1018
1019/* ------------------------------------------------------------------ */
1020/* Error records contain enough info to generate an error report. The idea
1021 is that (typically) the same few points in the program generate thousands
njnd5bb0a52002-09-27 10:24:48 +00001022 of errors, and we don't want to spew out a fresh error message for each
1023 one. Instead, we use these structures to common up duplicates.
njn25e49d8e72002-09-23 09:36:25 +00001024*/
1025
1026typedef
1027 Int /* Do not make this unsigned! */
1028 ErrorKind;
1029
1030/* An extensible (via the 'extra' field) error record. This holds
1031 the error details of interest to a skin. Skins can use a normal
1032 enum (with element values in the normal range (0..)) for `ekind'.
1033
1034 When errors are found and recorded with VG_(maybe_record_error)(), all
1035 the skin must do is pass in the four parameters; core will
1036 allocate/initialise the error record.
1037*/
1038typedef
1039 struct {
1040 /* Used by ALL. Must be in the range (0..) */
1041 Int ekind;
1042 /* Used frequently */
1043 Addr addr;
1044 /* Used frequently */
1045 Char* string;
njnd5bb0a52002-09-27 10:24:48 +00001046 /* For any skin-specific extras */
njn25e49d8e72002-09-23 09:36:25 +00001047 void* extra;
1048 }
1049 SkinError;
1050
1051
1052/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +00001053/* Call this when an error occurs. It will be recorded if it hasn't been
njn25e49d8e72002-09-23 09:36:25 +00001054 seen before. If it has, the existing error record will have its count
1055 incremented.
1056
1057 If the error occurs in generated code, 'tst' should be NULL. If the
1058 error occurs in non-generated code, 'tst' should be non-NULL. The
1059 `extra' field can be stack-allocated; it will be copied (using
1060 SKN_(dup_extra_and_update)()) if needed. But it won't be copied
1061 if it's NULL.
njnd5bb0a52002-09-27 10:24:48 +00001062
1063 If no 'a', 's' or 'extra' of interest needs to be recorded, just use
1064 NULL for them.
njn25e49d8e72002-09-23 09:36:25 +00001065*/
1066extern void VG_(maybe_record_error) ( ThreadState* tst, ErrorKind ekind,
1067 Addr a, Char* s, void* extra );
1068
1069/* Gets a non-blank, non-comment line of at most nBuf chars from fd.
1070 Skips leading spaces on the line. Returns True if EOF was hit instead.
1071 Useful for reading in extra skin-specific suppression lines.
1072*/
njn4ba5a792002-09-30 10:23:54 +00001073extern Bool VG_(get_line) ( Int fd, Char* buf, Int nBuf );
njn25e49d8e72002-09-23 09:36:25 +00001074
1075
1076/*====================================================================*/
1077/*=== Obtaining debug information ===*/
1078/*====================================================================*/
1079
1080/* Get the file/function/line number of the instruction at address 'a'.
1081 For these four, if debug info for the address is found, it copies the
1082 info into the buffer/UInt and returns True. If not, it returns False and
1083 nothing is copied. VG_(get_fnname) always demangles C++ function names.
1084*/
1085extern Bool VG_(get_filename) ( Addr a, Char* filename, Int n_filename );
1086extern Bool VG_(get_fnname) ( Addr a, Char* fnname, Int n_fnname );
1087extern Bool VG_(get_linenum) ( Addr a, UInt* linenum );
1088
1089/* This one is more efficient if getting both filename and line number,
1090 because the two lookups are done together. */
1091extern Bool VG_(get_filename_linenum)
1092 ( Addr a, Char* filename, Int n_filename,
1093 UInt* linenum );
1094
1095/* Succeeds only if we find from debug info that 'a' is the address of the
1096 first instruction in a function -- as opposed to VG_(get_fnname) which
1097 succeeds if we find from debug info that 'a' is the address of any
1098 instruction in a function. Use this to instrument the start of
njnd5bb0a52002-09-27 10:24:48 +00001099 a particular function. Nb: if an executable/shared object is stripped
njn25e49d8e72002-09-23 09:36:25 +00001100 of its symbols, this function will not be able to recognise function
1101 entry points within it. */
1102extern Bool VG_(get_fnname_if_entry) ( Addr a, Char* filename, Int n_filename );
1103
1104/* Succeeds if the address is within a shared object or the main executable.
1105 It doesn't matter if debug info is present or not. */
1106extern Bool VG_(get_objname) ( Addr a, Char* objname, Int n_objname );
1107
sewardj47104382002-10-20 18:35:48 +00001108/* A way to get information about what segments are mapped */
1109typedef struct _SegInfo SegInfo;
1110
1111extern const SegInfo* VG_(next_seginfo)(const SegInfo *);
1112extern Addr VG_(seg_start)(const SegInfo *);
1113extern UInt VG_(seg_size)(const SegInfo *);
1114extern const UChar* VG_(seg_filename)(const SegInfo *);
1115extern UInt VG_(seg_sym_offset)(const SegInfo *);
1116
1117typedef
1118 enum {
1119 Vg_SectUnknown,
1120 Vg_SectText,
sewardj8fe15a32002-10-20 19:29:21 +00001121 Vg_SectData,
1122 Vg_SectBSS,
sewardj47104382002-10-20 18:35:48 +00001123 Vg_SectGOT,
sewardj8fe15a32002-10-20 19:29:21 +00001124 Vg_SectPLT,
sewardj47104382002-10-20 18:35:48 +00001125 }
1126 VgSectKind;
1127
1128extern VgSectKind VG_(seg_sect_kind)(Addr);
1129
njn25e49d8e72002-09-23 09:36:25 +00001130
1131/*====================================================================*/
1132/*=== Shadow chunks and block-finding ===*/
1133/*====================================================================*/
1134
1135typedef
1136 enum {
1137 Vg_AllocMalloc = 0,
1138 Vg_AllocNew = 1,
1139 Vg_AllocNewVec = 2
1140 }
1141 VgAllocKind;
1142
1143/* Description of a malloc'd chunk. skin_extra[] part can be used by
1144 the skin; size of array is given by VG_(needs).sizeof_shadow_chunk. */
1145typedef
1146 struct _ShadowChunk {
1147 struct _ShadowChunk* next;
1148 UInt size : 30; /* size requested */
1149 VgAllocKind allockind : 2; /* which wrapper did the allocation */
1150 Addr data; /* ptr to actual block */
1151 UInt skin_extra[0]; /* extra skin-specific info */
1152 }
1153 ShadowChunk;
1154
1155/* Use this to free blocks if VG_(needs).alternative_free == True.
1156 It frees the ShadowChunk and the malloc'd block it points to. */
njn4ba5a792002-09-30 10:23:54 +00001157extern void VG_(free_ShadowChunk) ( ShadowChunk* sc );
njn25e49d8e72002-09-23 09:36:25 +00001158
1159/* Makes an array of pointers to all the shadow chunks of malloc'd blocks */
1160extern ShadowChunk** VG_(get_malloc_shadows) ( /*OUT*/ UInt* n_shadows );
1161
1162/* Determines if address 'a' is within the bounds of the block at start.
1163 Allows a little 'slop' round the edges. */
1164extern Bool VG_(addr_is_in_block) ( Addr a, Addr start, UInt size );
1165
1166/* Searches through currently malloc'd blocks until a matching one is found.
1167 Returns NULL if none match. Extra arguments can be implicitly passed to
njnd5bb0a52002-09-27 10:24:48 +00001168 p using nested functions; see memcheck/mc_errcontext.c for an example. */
njn25e49d8e72002-09-23 09:36:25 +00001169extern ShadowChunk* VG_(any_matching_mallocd_ShadowChunks)
1170 ( Bool (*p) ( ShadowChunk* ));
1171
1172/* Searches through all thread's stacks to see if any match. Returns
1173 * VG_INVALID_THREADID if none match. */
1174extern ThreadId VG_(any_matching_thread_stack)
1175 ( Bool (*p) ( Addr stack_min, Addr stack_max ));
1176
sewardja4495682002-10-21 07:29:59 +00001177/* Do memory leak detection. */
1178extern void VG_(generic_detect_memory_leaks) (
1179 Bool is_valid_64k_chunk ( UInt ),
1180 Bool is_valid_address ( Addr ),
1181 ExeContext* get_where ( ShadowChunk* ),
1182 VgRes leak_resolution,
1183 Bool show_reachable
1184 );
1185
1186
njn25e49d8e72002-09-23 09:36:25 +00001187/*====================================================================*/
1188/*=== Skin-specific stuff ===*/
1189/*====================================================================*/
1190
njnd04b7c62002-10-03 14:05:52 +00001191/* ------------------------------------------------------------------ */
1192/* Details */
1193typedef
1194 struct {
1195 /* Information used in the startup message. `name' also determines the
1196 string used for identifying suppressions in a suppression file as
1197 belonging to this skin. `version' can be NULL, in which case (not
1198 surprisingly) no version info is printed; this mechanism is
1199 designed for skins distributed with Valgrind that share a version
1200 number with Valgrind. Other skins not distributed as part of
1201 Valgrind should probably have their own version number. */
1202 Char* name;
1203 Char* version;
1204 Char* description;
1205 Char* copyright_author;
1206
1207 /* String printed if an `sk_assert' assertion fails or VG_(skin_panic)
1208 is called. Should probably be an email address. */
1209 Char* bug_reports_to;
1210 }
1211 VgDetails;
1212
1213extern VgDetails VG_(details);
1214
1215/* ------------------------------------------------------------------ */
1216/* Needs */
1217
1218/* If new fields are added to this type, update:
njnd5bb0a52002-09-27 10:24:48 +00001219 * - vg_main.c:initialisation of VG_(needs)
njn25e49d8e72002-09-23 09:36:25 +00001220 * - vg_main.c:sanity_check_needs()
1221 *
1222 * If the name of this type or any of its fields change, update:
1223 * - dependent comments (just search for "VG_(needs)").
1224 */
1225typedef
1226 struct {
njnd5bb0a52002-09-27 10:24:48 +00001227 /* Booleans that decide core behaviour, but don't require extra
1228 operations to be defined if `True' */
1229
1230 /* Should __libc_freeres() be run? Bugs in it can crash the skin. */
njnd04b7c62002-10-03 14:05:52 +00001231 Bool libc_freeres;
njn25e49d8e72002-09-23 09:36:25 +00001232
1233 /* Want to have errors detected by Valgrind's core reported? Includes:
1234 - pthread API errors (many; eg. unlocking a non-locked mutex)
1235 - silly arguments to malloc() et al (eg. negative size)
1236 - invalid file descriptors to blocking syscalls read() and write()
1237 - bad signal numbers passed to sigaction()
1238 - attempt to install signal handler for SIGKILL or SIGSTOP */
1239 Bool core_errors;
njn25e49d8e72002-09-23 09:36:25 +00001240
1241 /* Booleans that indicate extra operations are defined; if these are
1242 True, the corresponding template functions (given below) must be
1243 defined. A lot like being a member of a type class. */
1244
njnd5bb0a52002-09-27 10:24:48 +00001245 /* Want to report errors from the skin? This implies use of
1246 suppressions, too. */
1247 Bool skin_errors;
1248
njn25e49d8e72002-09-23 09:36:25 +00001249 /* Is information kept about specific individual basic blocks? (Eg. for
njnd5bb0a52002-09-27 10:24:48 +00001250 cachegrind there are cost-centres for every instruction, stored at a
njn25e49d8e72002-09-23 09:36:25 +00001251 basic block level.) If so, it sometimes has to be discarded, because
1252 .so mmap/munmap-ping or self-modifying code (informed by the
1253 DISCARD_TRANSLATIONS user request) can cause one instruction address
njnd5bb0a52002-09-27 10:24:48 +00001254 to be used for more than one instruction in one program run... */
njn25e49d8e72002-09-23 09:36:25 +00001255 Bool basic_block_discards;
1256
njnd5bb0a52002-09-27 10:24:48 +00001257 /* Skin maintains information about each register? */
njn25e49d8e72002-09-23 09:36:25 +00001258 Bool shadow_regs;
1259
1260 /* Skin defines its own command line options? */
1261 Bool command_line_options;
1262 /* Skin defines its own client requests? */
1263 Bool client_requests;
1264
1265 /* Skin defines its own UInstrs? */
1266 Bool extended_UCode;
1267
1268 /* Skin does stuff before and/or after system calls? */
1269 Bool syscall_wrapper;
1270
1271 /* Size, in words, of extra info about malloc'd blocks recorded by
1272 skin. Be careful to get this right or you'll get seg faults! */
1273 UInt sizeof_shadow_block;
1274
1275 /* Skin does free()s itself? */
1276 Bool alternative_free;
1277
1278 /* Are skin-state sanity checks performed? */
1279 Bool sanity_checks;
sewardj8fe15a32002-10-20 19:29:21 +00001280
1281 /* Do we need to see data symbols? */
1282 Bool data_syms;
njn25e49d8e72002-09-23 09:36:25 +00001283 }
1284 VgNeeds;
1285
1286extern VgNeeds VG_(needs);
1287
1288
1289/* ------------------------------------------------------------------ */
1290/* Core events to track */
1291
1292/* Part of the core from which this call was made. Useful for determining
njnd5bb0a52002-09-27 10:24:48 +00001293 what kind of error message should be emitted. */
njn25e49d8e72002-09-23 09:36:25 +00001294typedef
1295 enum { Vg_CorePThread, Vg_CoreSignal, Vg_CoreSysCall, Vg_CoreTranslate }
1296 CorePart;
1297
1298/* Events happening in core to track. To be notified, assign a function
njnd5bb0a52002-09-27 10:24:48 +00001299 to the function pointer. To ignore an event, don't do anything
1300 (default assignment is to NULL in which case the call is skipped). */
njn25e49d8e72002-09-23 09:36:25 +00001301typedef
1302 struct {
1303 /* Memory events */
1304 void (*new_mem_startup)( Addr a, UInt len, Bool rr, Bool ww, Bool xx );
1305 void (*new_mem_heap) ( Addr a, UInt len, Bool is_inited );
1306 void (*new_mem_stack) ( Addr a, UInt len );
1307 void (*new_mem_stack_aligned) ( Addr a, UInt len );
1308 void (*new_mem_stack_signal) ( Addr a, UInt len );
1309 void (*new_mem_brk) ( Addr a, UInt len );
sewardj40f8ebe2002-10-23 21:46:13 +00001310 void (*new_mem_mmap) ( Addr a, UInt len, Bool rr, Bool ww, Bool xx );
njn25e49d8e72002-09-23 09:36:25 +00001311
1312 void (*copy_mem_heap) ( Addr from, Addr to, UInt len );
1313 void (*copy_mem_remap) ( Addr from, Addr to, UInt len );
sewardj40f8ebe2002-10-23 21:46:13 +00001314 void (*change_mem_mprotect) ( Addr a, UInt len, Bool rr, Bool ww, Bool xx );
njn25e49d8e72002-09-23 09:36:25 +00001315
njnd5bb0a52002-09-27 10:24:48 +00001316 /* Used on redzones around malloc'd blocks and at end of stack */
njn25e49d8e72002-09-23 09:36:25 +00001317 void (*ban_mem_heap) ( Addr a, UInt len );
1318 void (*ban_mem_stack) ( Addr a, UInt len );
1319
1320 void (*die_mem_heap) ( Addr a, UInt len );
1321 void (*die_mem_stack) ( Addr a, UInt len );
1322 void (*die_mem_stack_aligned) ( Addr a, UInt len );
1323 void (*die_mem_stack_signal) ( Addr a, UInt len );
1324 void (*die_mem_brk) ( Addr a, UInt len );
1325 void (*die_mem_munmap) ( Addr a, UInt len );
1326
1327 void (*bad_free) ( ThreadState* tst, Addr a );
1328 void (*mismatched_free) ( ThreadState* tst, Addr a );
1329
1330 void (*pre_mem_read) ( CorePart part, ThreadState* tst,
1331 Char* s, Addr a, UInt size );
1332 void (*pre_mem_read_asciiz) ( CorePart part, ThreadState* tst,
1333 Char* s, Addr a );
1334 void (*pre_mem_write) ( CorePart part, ThreadState* tst,
1335 Char* s, Addr a, UInt size );
1336 /* Not implemented yet -- have to add in lots of places, which is a
1337 pain. Won't bother unless/until there's a need. */
1338 /* void (*post_mem_read) ( ThreadState* tst, Char* s,
1339 Addr a, UInt size ); */
1340 void (*post_mem_write) ( Addr a, UInt size );
1341
1342
njnd5bb0a52002-09-27 10:24:48 +00001343 /* Scheduler events (not exhaustive) */
njn25e49d8e72002-09-23 09:36:25 +00001344 void (*thread_run) ( ThreadId tid );
1345
1346
njnd5bb0a52002-09-27 10:24:48 +00001347 /* Mutex events (not exhaustive) */
njn25e49d8e72002-09-23 09:36:25 +00001348 void (*post_mutex_lock) ( ThreadId tid,
1349 void* /*pthread_mutex_t* */ mutex );
1350 void (*post_mutex_unlock) ( ThreadId tid,
1351 void* /*pthread_mutex_t* */ mutex );
njn25e49d8e72002-09-23 09:36:25 +00001352
njnd5bb0a52002-09-27 10:24:48 +00001353
1354 /* Others... thread, condition variable, signal events... */
njn25e49d8e72002-09-23 09:36:25 +00001355 /* ... */
1356 }
1357 VgTrackEvents;
1358
1359/* Declare the struct instance */
1360extern VgTrackEvents VG_(track_events);
1361
1362
1363/* ------------------------------------------------------------------ */
1364/* Template functions */
1365
1366/* These are the parameterised functions in the core. The default definitions
njnd5bb0a52002-09-27 10:24:48 +00001367 are overridden by LD_PRELOADed skin version. At the very least, a skin
1368 must define the fundamental template functions. Depending on what needs
1369 are set, extra template functions will be used too. Functions are
1370 grouped under the needs that govern their use. */
njn25e49d8e72002-09-23 09:36:25 +00001371
1372
1373/* ------------------------------------------------------------------ */
1374/* Fundamental template functions */
1375
1376/* Initialise skin. Must do the following:
njnd04b7c62002-10-03 14:05:52 +00001377 - initialise the `details' struct
njn25e49d8e72002-09-23 09:36:25 +00001378 - register any helpers called by generated code
1379
1380 May do the following:
njnd04b7c62002-10-03 14:05:52 +00001381 - initialise the `needs' struct to indicate certain requirements
1382 - initialise the `track' struct to indicate core events of interest
njn25e49d8e72002-09-23 09:36:25 +00001383 - register any skin-specific profiling events
1384 - any other skin-specific initialisation
1385*/
njnd04b7c62002-10-03 14:05:52 +00001386extern void SK_(pre_clo_init) ( VgDetails* details, VgNeeds* needs,
1387 VgTrackEvents* track );
njn25e49d8e72002-09-23 09:36:25 +00001388
njnd5bb0a52002-09-27 10:24:48 +00001389/* Do initialisation that can only be done after command line processing. */
njn25e49d8e72002-09-23 09:36:25 +00001390extern void SK_(post_clo_init)( void );
1391
1392/* Instrument a basic block. Must be a true function, ie. the same input
1393 always results in the same output, because basic blocks can be
1394 retranslated. Unless you're doing something really strange...
1395 'orig_addr' is the address of the first instruction in the block. */
1396extern UCodeBlock* SK_(instrument) ( UCodeBlock* cb, Addr orig_addr );
1397
1398/* Finish up, print out any results, etc. */
1399extern void SK_(fini) ( void );
1400
1401
1402/* ------------------------------------------------------------------ */
1403/* VG_(needs).report_errors */
1404
1405/* Identify if two errors are equal, or equal enough. `res' indicates how
1406 close is "close enough". `res' should be passed on as necessary, eg. if
1407 the SkinError's extra field contains an ExeContext, `res' should be
1408 passed to VG_(eq_ExeContext)() if the ExeContexts are considered. Other
1409 than that, probably don't worry about it unless you have lots of very
1410 similar errors occurring.
1411 */
1412extern Bool SK_(eq_SkinError) ( VgRes res,
1413 SkinError* e1, SkinError* e2 );
1414
1415/* Print error context. The passed function pp_ExeContext() can be (and
1416 probably should be) used to print the location of the error. */
1417extern void SK_(pp_SkinError) ( SkinError* ec, void (*pp_ExeContext)(void) );
1418
1419/* Copy the ec->extra part and replace ec->extra with the new copy. This is
1420 necessary to move from a temporary stack copy to a permanent heap one.
1421
1422 Then fill in any details that could be postponed until after the decision
1423 whether to ignore the error (ie. details not affecting the result of
1424 SK_(eq_SkinError)()). This saves time when errors are ignored.
1425
1426 Yuk.
1427*/
1428extern void SK_(dup_extra_and_update)(SkinError* ec);
1429
1430/* Return value indicates recognition. If recognised, type goes in `skind'. */
1431extern Bool SK_(recognised_suppression) ( Char* name, SuppKind *skind );
1432
1433/* Read any extra info for this suppression kind. For filling up the
1434 `string' and `extra' fields in a `SkinSupp' struct if necessary. */
1435extern Bool SK_(read_extra_suppression_info) ( Int fd, Char* buf,
njnd5bb0a52002-09-27 10:24:48 +00001436 Int nBuf, SkinSupp *s );
njn25e49d8e72002-09-23 09:36:25 +00001437
1438/* This should just check the kinds match and maybe some stuff in the
1439 'extra' field if appropriate */
1440extern Bool SK_(error_matches_suppression)(SkinError* ec, SkinSupp* su);
1441
1442
1443/* ------------------------------------------------------------------ */
1444/* VG_(needs).basic_block_discards */
1445
njnd5bb0a52002-09-27 10:24:48 +00001446/* Should discard any information that pertains to specific basic blocks
1447 or instructions within the address range given. */
njn25e49d8e72002-09-23 09:36:25 +00001448extern void SK_(discard_basic_block_info) ( Addr a, UInt size );
1449
1450
1451/* ------------------------------------------------------------------ */
1452/* VG_(needs).shadow_regs */
1453
1454/* Valid values for general registers and EFLAGS register, for initialising
1455 and updating registers when written in certain places in core. */
1456extern void SK_(written_shadow_regs_values) ( UInt* gen_reg, UInt* eflags );
1457
1458
1459/* ------------------------------------------------------------------ */
1460/* VG_(needs).command_line_options */
1461
njnd5bb0a52002-09-27 10:24:48 +00001462/* Return True if option was recognised. Presumably sets some state to
1463 record the option as well. */
1464extern Bool SK_(process_cmd_line_option) ( Char* argv );
njn25e49d8e72002-09-23 09:36:25 +00001465
1466/* Print out command line usage for skin options */
1467extern Char* SK_(usage) ( void );
1468
1469
1470/* ------------------------------------------------------------------ */
1471/* VG_(needs).client_requests */
1472
sewardj34042512002-10-22 04:14:35 +00001473extern Bool SK_(handle_client_request) ( ThreadState* tst, UInt* arg_block, UInt *ret );
njn25e49d8e72002-09-23 09:36:25 +00001474
1475
1476/* ------------------------------------------------------------------ */
1477/* VG_(needs).extends_UCode */
1478
njn4ba5a792002-09-30 10:23:54 +00001479/* Useful to use in VG_(get_Xreg_usage)() */
njnd5bb0a52002-09-27 10:24:48 +00001480#define VG_UINSTR_READS_REG(ono) \
njn25e49d8e72002-09-23 09:36:25 +00001481 { if (mycat(u->tag,ono) == tag) \
1482 { arr[n].num = mycat(u->val,ono); \
1483 arr[n].isWrite = False; \
1484 n++; \
1485 } \
1486 }
njnd5bb0a52002-09-27 10:24:48 +00001487#define VG_UINSTR_WRITES_REG(ono) \
1488 { if (mycat(u->tag,ono) == tag) \
1489 { arr[n].num = mycat(u->val,ono); \
1490 arr[n].isWrite = True; \
1491 n++; \
1492 } \
njn25e49d8e72002-09-23 09:36:25 +00001493 }
1494
njn4ba5a792002-09-30 10:23:54 +00001495/* 'X' prefix indicates eXtended UCode. */
1496extern Int SK_(get_Xreg_usage) ( UInstr* u, Tag tag, RegUse* arr );
1497extern void SK_(emit_XUInstr) ( UInstr* u, RRegSet regs_live_before );
1498extern Bool SK_(sane_XUInstr) ( Bool beforeRA, Bool beforeLiveness,
njn25e49d8e72002-09-23 09:36:25 +00001499 UInstr* u );
njn4ba5a792002-09-30 10:23:54 +00001500extern Char* SK_(name_XUOpcode) ( Opcode opc );
1501extern void SK_(pp_XUInstr) ( UInstr* u );
njn25e49d8e72002-09-23 09:36:25 +00001502
1503
1504/* ------------------------------------------------------------------ */
1505/* VG_(needs).syscall_wrapper */
1506
1507/* If either of the pre_ functions malloc() something to return, the
1508 * corresponding post_ function had better free() it!
1509 */
1510extern void* SK_( pre_syscall) ( ThreadId tid, UInt syscallno,
1511 Bool is_blocking );
1512extern void SK_(post_syscall) ( ThreadId tid, UInt syscallno,
1513 void* pre_result, Int res,
1514 Bool is_blocking );
1515
njnd5bb0a52002-09-27 10:24:48 +00001516
njn25e49d8e72002-09-23 09:36:25 +00001517/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +00001518/* VG_(needs).sizeof_shadow_chunk (if > 0) */
njn25e49d8e72002-09-23 09:36:25 +00001519
1520extern void SK_(complete_shadow_chunk) ( ShadowChunk* sc, ThreadState* tst );
1521
1522
1523/* ------------------------------------------------------------------ */
1524/* VG_(needs).alternative_free */
1525
1526extern void SK_(alt_free) ( ShadowChunk* sc, ThreadState* tst );
1527
njnd5bb0a52002-09-27 10:24:48 +00001528
njn25e49d8e72002-09-23 09:36:25 +00001529/* ---------------------------------------------------------------------
1530 VG_(needs).sanity_checks */
1531
njnd5bb0a52002-09-27 10:24:48 +00001532/* Can be useful for ensuring a skin's correctness. SK_(cheap_sanity_check)
1533 is called very frequently; SK_(expensive_sanity_check) is called less
1534 frequently and can be more involved. */
njn25e49d8e72002-09-23 09:36:25 +00001535extern Bool SK_(cheap_sanity_check) ( void );
1536extern Bool SK_(expensive_sanity_check) ( void );
1537
1538
1539#endif /* NDEF __VG_SKIN_H */
1540
1541/*--------------------------------------------------------------------*/
1542/*--- end vg_skin.h ---*/
1543/*--------------------------------------------------------------------*/
1544