blob: 2fe3e2255166fbcef643ca0cb5e479f6226f6fb1 [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
njn0e1b5142003-04-15 14:58:06 +000011 Copyright (C) 2000-2003 Julian Seward
njn25e49d8e72002-09-23 09:36:25 +000012 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
njn211b6ad2003-02-03 12:33:31 +000062 If you increase 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)
njn211b6ad2003-02-03 12:33:31 +000068
69 You can decrease it, and performance will drop because more spills will
70 occur. If you decrease it too much, everything will fall over.
njn25e49d8e72002-09-23 09:36:25 +000071
72 Do not change this unless you really know what you are doing! */
73#define VG_MAX_REALREGS 6
74
75
76/*====================================================================*/
njn1a1dd8b2002-09-27 10:42:20 +000077/*=== Basic types, useful macros ===*/
njn25e49d8e72002-09-23 09:36:25 +000078/*====================================================================*/
79
njn25e49d8e72002-09-23 09:36:25 +000080typedef unsigned char UChar;
81typedef unsigned short UShort;
82typedef unsigned int UInt;
83typedef unsigned long long int ULong;
84
85typedef signed char Char;
86typedef signed short Short;
87typedef signed int Int;
88typedef signed long long int Long;
89
90typedef unsigned int Addr;
91
92typedef unsigned char Bool;
93#define False ((Bool)0)
94#define True ((Bool)1)
95
96
njn1a1dd8b2002-09-27 10:42:20 +000097#define mycat_wrk(aaa,bbb) aaa##bbb
98#define mycat(aaa,bbb) mycat_wrk(aaa,bbb)
99
100/* No, really. I _am_ that strange. */
101#define OINK(nnn) VG_(message)(Vg_DebugMsg, "OINK %d",nnn)
102
njn25e49d8e72002-09-23 09:36:25 +0000103/* ---------------------------------------------------------------------
104 Now the basic types are set up, we can haul in the kernel-interface
105 definitions.
106 ------------------------------------------------------------------ */
107
njn2574bb4762002-09-24 11:23:50 +0000108#include "../coregrind/vg_kerneliface.h"
njn25e49d8e72002-09-23 09:36:25 +0000109
110
111/*====================================================================*/
njn27f1a382002-11-08 15:48:16 +0000112/*=== Core/skin interface version ===*/
113/*====================================================================*/
114
115/* The major version number indicates binary-incompatible changes to the
116 interface; if the core and skin major versions don't match, Valgrind
117 will abort. The minor version indicates binary-compatible changes.
njn27f1a382002-11-08 15:48:16 +0000118*/
njn9b007f62003-04-07 14:40:25 +0000119#define VG_CORE_INTERFACE_MAJOR_VERSION 2
120#define VG_CORE_INTERFACE_MINOR_VERSION 0
njn27f1a382002-11-08 15:48:16 +0000121
122extern const Int VG_(skin_interface_major_version);
123extern const Int VG_(skin_interface_minor_version);
124
njn563f96f2003-02-03 11:17:46 +0000125/* Every skin must include this macro somewhere, exactly once. */
njn27f1a382002-11-08 15:48:16 +0000126#define VG_DETERMINE_INTERFACE_VERSION \
127const Int VG_(skin_interface_major_version) = VG_CORE_INTERFACE_MAJOR_VERSION; \
128const Int VG_(skin_interface_minor_version) = VG_CORE_INTERFACE_MINOR_VERSION;
129
njn211b6ad2003-02-03 12:33:31 +0000130
njn27f1a382002-11-08 15:48:16 +0000131/*====================================================================*/
njn25e49d8e72002-09-23 09:36:25 +0000132/*=== Command-line options ===*/
133/*====================================================================*/
134
njn43c799e2003-04-08 00:08:52 +0000135/* Use this for normal null-termination-style string comparison */
136#define VG_STREQ(s1,s2) (s1 != NULL && s2 != NULL \
137 && VG_(strcmp)((s1),(s2))==0)
138
139/* Use these for recognising skin command line options -- stops comparing
140 once whitespace is reached. */
141# define VG_CLO_STREQ(s1,s2) (0==VG_(strcmp_ws)((s1),(s2)))
142# define VG_CLO_STREQN(nn,s1,s2) (0==VG_(strncmp_ws)((s1),(s2),(nn)))
143
njn25e49d8e72002-09-23 09:36:25 +0000144/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
145extern Int VG_(clo_verbosity);
146
147/* Profile? */
148extern Bool VG_(clo_profile);
149
njn25e49d8e72002-09-23 09:36:25 +0000150/* Call this if a recognised option was bad for some reason.
151 Note: don't use it just because an option was unrecognised -- return 'False'
152 from SKN_(process_cmd_line_option) to indicate that. */
153extern void VG_(bad_option) ( Char* opt );
154
155/* Client args */
156extern Int VG_(client_argc);
157extern Char** VG_(client_argv);
158
njnd5bb0a52002-09-27 10:24:48 +0000159/* Client environment. Can be inspected with VG_(getenv)() */
njn25e49d8e72002-09-23 09:36:25 +0000160extern Char** VG_(client_envp);
161
162
163/*====================================================================*/
164/*=== Printing messages for the user ===*/
165/*====================================================================*/
166
167/* Print a message prefixed by "??<pid>?? "; '?' depends on the VgMsgKind.
168 Should be used for all user output. */
169
170typedef
171 enum { Vg_UserMsg, /* '?' == '=' */
172 Vg_DebugMsg, /* '?' == '-' */
173 Vg_DebugExtraMsg /* '?' == '+' */
174 }
175 VgMsgKind;
176
177/* Functions for building a message from multiple parts. */
178extern void VG_(start_msg) ( VgMsgKind kind );
179extern void VG_(add_to_msg) ( Char* format, ... );
180/* Ends and prints the message. Appends a newline. */
181extern void VG_(end_msg) ( void );
182
njnd5bb0a52002-09-27 10:24:48 +0000183/* Send a single-part message. Appends a newline. */
njn25e49d8e72002-09-23 09:36:25 +0000184extern void VG_(message) ( VgMsgKind kind, Char* format, ... );
185
186
187/*====================================================================*/
188/*=== Profiling ===*/
189/*====================================================================*/
190
191/* Nb: VGP_(register_profile_event)() relies on VgpUnc being the first one */
192#define VGP_CORE_LIST \
193 /* These ones depend on the core */ \
194 VGP_PAIR(VgpUnc, "unclassified"), \
195 VGP_PAIR(VgpRun, "running"), \
196 VGP_PAIR(VgpSched, "scheduler"), \
197 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
198 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
njn25e49d8e72002-09-23 09:36:25 +0000199 VGP_PAIR(VgpTranslate, "translate-main"), \
200 VGP_PAIR(VgpToUCode, "to-ucode"), \
201 VGP_PAIR(VgpFromUcode, "from-ucode"), \
202 VGP_PAIR(VgpImprove, "improve"), \
njn9b007f62003-04-07 14:40:25 +0000203 VGP_PAIR(VgpESPUpdate, "ESP-update"), \
njn25e49d8e72002-09-23 09:36:25 +0000204 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
205 VGP_PAIR(VgpLiveness, "liveness-analysis"), \
206 VGP_PAIR(VgpDoLRU, "do-lru"), \
207 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
208 VGP_PAIR(VgpInitMem, "init-memory"), \
209 VGP_PAIR(VgpExeContext, "exe-context"), \
210 VGP_PAIR(VgpReadSyms, "read-syms"), \
211 VGP_PAIR(VgpSearchSyms, "search-syms"), \
212 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
213 VGP_PAIR(VgpCoreSysWrap, "core-syscall-wrapper"), \
214 VGP_PAIR(VgpDemangle, "demangle"), \
njn37cea302002-09-30 11:24:00 +0000215 VGP_PAIR(VgpCoreCheapSanity, "core-cheap-sanity"), \
216 VGP_PAIR(VgpCoreExpensiveSanity, "core-expensive-sanity"), \
njn25e49d8e72002-09-23 09:36:25 +0000217 /* These ones depend on the skin */ \
218 VGP_PAIR(VgpPreCloInit, "pre-clo-init"), \
219 VGP_PAIR(VgpPostCloInit, "post-clo-init"), \
220 VGP_PAIR(VgpInstrument, "instrument"), \
221 VGP_PAIR(VgpSkinSysWrap, "skin-syscall-wrapper"), \
njn37cea302002-09-30 11:24:00 +0000222 VGP_PAIR(VgpSkinCheapSanity, "skin-cheap-sanity"), \
223 VGP_PAIR(VgpSkinExpensiveSanity, "skin-expensive-sanity"), \
njn25e49d8e72002-09-23 09:36:25 +0000224 VGP_PAIR(VgpFini, "fini")
225
226#define VGP_PAIR(n,name) n
227typedef enum { VGP_CORE_LIST } VgpCoreCC;
228#undef VGP_PAIR
229
230/* When registering skin profiling events, ensure that the 'n' value is in
231 * the range (VgpFini+1..) */
232extern void VGP_(register_profile_event) ( Int n, Char* name );
233
234extern void VGP_(pushcc) ( UInt cc );
235extern void VGP_(popcc) ( UInt cc );
236
237/* Define them only if they haven't already been defined by vg_profile.c */
238#ifndef VGP_PUSHCC
239# define VGP_PUSHCC(x)
240#endif
241#ifndef VGP_POPCC
242# define VGP_POPCC(x)
243#endif
244
245
246/*====================================================================*/
247/*=== Useful stuff to call from generated code ===*/
248/*====================================================================*/
249
250/* ------------------------------------------------------------------ */
251/* General stuff */
252
njn41557122002-10-14 09:25:37 +0000253/* 64-bit counter for the number of basic blocks done. */
254extern ULong VG_(bbs_done);
255
njn25e49d8e72002-09-23 09:36:25 +0000256/* Get the simulated %esp */
257extern Addr VG_(get_stack_pointer) ( void );
258
njnd5bb0a52002-09-27 10:24:48 +0000259/* Detect if an address is within Valgrind's stack or Valgrind's
260 m_state_static; useful for memory leak detectors to tell if a block
261 is used by Valgrind (and thus can be ignored). */
njn25e49d8e72002-09-23 09:36:25 +0000262extern Bool VG_(within_stack)(Addr a);
njn25e49d8e72002-09-23 09:36:25 +0000263extern Bool VG_(within_m_state_static)(Addr a);
264
265/* Check if an address is 4-byte aligned */
266#define IS_ALIGNED4_ADDR(aaa_p) (0 == (((UInt)(aaa_p)) & 3))
njn9b007f62003-04-07 14:40:25 +0000267#define IS_ALIGNED8_ADDR(aaa_p) (0 == (((UInt)(aaa_p)) & 7))
njn25e49d8e72002-09-23 09:36:25 +0000268
269
270/* ------------------------------------------------------------------ */
271/* Thread-related stuff */
272
273/* Special magic value for an invalid ThreadId. It corresponds to
274 LinuxThreads using zero as the initial value for
275 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
276#define VG_INVALID_THREADID ((ThreadId)(0))
277
278/* ThreadIds are simply indices into the vg_threads[] array. */
279typedef
280 UInt
281 ThreadId;
282
njnd5bb0a52002-09-27 10:24:48 +0000283/* struct _ThreadState defined elsewhere; ThreadState is abstract as its
284 definition is not important for skins. */
njn25e49d8e72002-09-23 09:36:25 +0000285typedef
286 struct _ThreadState
287 ThreadState;
288
sewardj7ab2aca2002-10-20 19:40:32 +0000289extern ThreadId VG_(get_current_tid) ( void );
sewardjb52a1b02002-10-23 21:38:22 +0000290extern ThreadId VG_(get_current_or_recent_tid) ( void );
sewardj7ab2aca2002-10-20 19:40:32 +0000291extern ThreadId VG_(get_tid_from_ThreadState) ( ThreadState* );
njn25e49d8e72002-09-23 09:36:25 +0000292extern ThreadState* VG_(get_ThreadState) ( ThreadId tid );
293
njn3e884182003-04-15 13:03:23 +0000294/* Searches through all thread's stacks to see if any match. Returns
295 * VG_INVALID_THREADID if none match. */
296extern ThreadId VG_(first_matching_thread_stack)
297 ( Bool (*p) ( Addr stack_min, Addr stack_max ));
298
njn25e49d8e72002-09-23 09:36:25 +0000299
300/*====================================================================*/
301/*=== Valgrind's version of libc ===*/
302/*====================================================================*/
303
304/* Valgrind doesn't use libc at all, for good reasons (trust us). So here
305 are its own versions of C library functions, but with VG_ prefixes. Note
306 that the types of some are slightly different to the real ones. Some
njnf4ce3d32003-02-10 10:17:26 +0000307 additional useful functions are provided too; descriptions of how they
308 work are given below. */
njn25e49d8e72002-09-23 09:36:25 +0000309
310#if !defined(NULL)
311# define NULL ((void*)0)
312#endif
313
314
315/* ------------------------------------------------------------------ */
316/* stdio.h
317 *
318 * Note that they all output to the file descriptor given by the
319 * --logfile-fd=N argument, which defaults to 2 (stderr). Hence no
320 * need for VG_(fprintf)().
njn25e49d8e72002-09-23 09:36:25 +0000321 */
sewardj78e3cd92002-10-22 04:45:48 +0000322extern UInt VG_(printf) ( const char *format, ... );
njn25e49d8e72002-09-23 09:36:25 +0000323/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
sewardj78e3cd92002-10-22 04:45:48 +0000324extern UInt VG_(sprintf) ( Char* buf, Char *format, ... );
325extern UInt VG_(vprintf) ( void(*send)(Char),
njn25e49d8e72002-09-23 09:36:25 +0000326 const Char *format, va_list vargs );
327
njn41557122002-10-14 09:25:37 +0000328extern Int VG_(rename) ( Char* old_name, Char* new_name );
329
njn25e49d8e72002-09-23 09:36:25 +0000330/* ------------------------------------------------------------------ */
331/* stdlib.h */
332
333extern void* VG_(malloc) ( Int nbytes );
njnd5bb0a52002-09-27 10:24:48 +0000334extern void VG_(free) ( void* p );
335extern void* VG_(calloc) ( Int n, Int nbytes );
336extern void* VG_(realloc) ( void* p, Int size );
337extern void* VG_(malloc_aligned) ( Int align_bytes, Int nbytes );
njn25e49d8e72002-09-23 09:36:25 +0000338
339extern void VG_(print_malloc_stats) ( void );
340
341
342extern void VG_(exit)( Int status )
343 __attribute__ ((__noreturn__));
njne427a662002-10-02 11:08:25 +0000344/* Prints a panic message (a constant string), appends newline and bug
345 reporting info, aborts. */
346__attribute__ ((__noreturn__))
347extern void VG_(skin_panic) ( Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000348
njnd5bb0a52002-09-27 10:24:48 +0000349/* Looks up VG_(client_envp) */
njn25e49d8e72002-09-23 09:36:25 +0000350extern Char* VG_(getenv) ( Char* name );
351
352/* Crude stand-in for the glibc system() call. */
353extern Int VG_(system) ( Char* cmd );
354
njnd5bb0a52002-09-27 10:24:48 +0000355extern Long VG_(atoll) ( Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000356
357/* Like atoll(), but converts a number of base 2..36 */
358extern Long VG_(atoll36) ( UInt base, Char* str );
359
360
361/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000362/* ctype.h */
njn25e49d8e72002-09-23 09:36:25 +0000363extern Bool VG_(isspace) ( Char c );
364extern Bool VG_(isdigit) ( Char c );
365extern Char VG_(toupper) ( Char c );
366
367
368/* ------------------------------------------------------------------ */
369/* string.h */
370extern Int VG_(strlen) ( const Char* str );
371extern Char* VG_(strcat) ( Char* dest, const Char* src );
372extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
373extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
374extern Char* VG_(strcpy) ( Char* dest, const Char* src );
375extern Char* VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
376extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
377extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
378extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
379extern Char* VG_(strchr) ( const Char* s, Char c );
380extern Char* VG_(strdup) ( const Char* s);
sewardj7ab2aca2002-10-20 19:40:32 +0000381extern void* VG_(memcpy) ( void *d, const void *s, Int sz );
382extern void* VG_(memset) ( void *s, Int c, Int sz );
njn6d68e792003-02-24 10:49:08 +0000383extern Int VG_(memcmp) ( const void* s1, const void* s2, Int n );
njn25e49d8e72002-09-23 09:36:25 +0000384
njnd5bb0a52002-09-27 10:24:48 +0000385/* Like strcmp() and strncmp(), but stop comparing at any whitespace. */
njn25e49d8e72002-09-23 09:36:25 +0000386extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
njn25e49d8e72002-09-23 09:36:25 +0000387extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
388
njnd5bb0a52002-09-27 10:24:48 +0000389/* Like strncpy(), but if 'src' is longer than 'ndest' inserts a '\0' as the
390 last character. */
njn25e49d8e72002-09-23 09:36:25 +0000391extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
392
393/* Mini-regexp function. Searches for 'pat' in 'str'. Supports
394 * meta-symbols '*' and '?'. '\' escapes meta-symbols. */
njn4ba5a792002-09-30 10:23:54 +0000395extern Bool VG_(string_match) ( Char* pat, Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000396
397
398/* ------------------------------------------------------------------ */
399/* math.h */
njnd5bb0a52002-09-27 10:24:48 +0000400/* Returns the base-2 logarithm of x. */
njn25e49d8e72002-09-23 09:36:25 +0000401extern Int VG_(log2) ( Int x );
402
403
404/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000405/* unistd.h, fcntl.h, sys/stat.h */
sewardj4cf05692002-10-27 20:28:29 +0000406extern Int VG_(getpid) ( void );
407extern Int VG_(getppid) ( void );
njnd5bb0a52002-09-27 10:24:48 +0000408
njn4aca2d22002-10-04 10:29:38 +0000409extern Int VG_(open) ( const Char* pathname, Int flags, Int mode );
410extern Int VG_(read) ( Int fd, void* buf, Int count);
411extern Int VG_(write) ( Int fd, void* buf, Int count);
412extern void VG_(close) ( Int fd );
njnd5bb0a52002-09-27 10:24:48 +0000413
njn41557122002-10-14 09:25:37 +0000414/* Nb: VG_(rename)() declared in stdio.h section above */
njn4aca2d22002-10-04 10:29:38 +0000415extern Int VG_(unlink) ( Char* file_name );
416extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
njn25e49d8e72002-09-23 09:36:25 +0000417
418
419/* ------------------------------------------------------------------ */
420/* assert.h */
421/* Asserts permanently enabled -- no turning off with NDEBUG. Hurrah! */
422#define VG__STRING(__str) #__str
423
njne427a662002-10-02 11:08:25 +0000424#define sk_assert(expr) \
njn25e49d8e72002-09-23 09:36:25 +0000425 ((void) ((expr) ? 0 : \
njne427a662002-10-02 11:08:25 +0000426 (VG_(skin_assert_fail) (VG__STRING(expr), \
427 __FILE__, __LINE__, \
428 __PRETTY_FUNCTION__), 0)))
njn25e49d8e72002-09-23 09:36:25 +0000429
njne427a662002-10-02 11:08:25 +0000430__attribute__ ((__noreturn__))
431extern void VG_(skin_assert_fail) ( Char* expr, Char* file,
432 Int line, Char* fn );
njn25e49d8e72002-09-23 09:36:25 +0000433
434
435/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000436/* system/mman.h */
njn25e49d8e72002-09-23 09:36:25 +0000437extern void* VG_(mmap)( void* start, UInt length,
438 UInt prot, UInt flags, UInt fd, UInt offset );
439extern Int VG_(munmap)( void* start, Int length );
440
441/* Get memory by anonymous mmap. */
442extern void* VG_(get_memory_from_mmap) ( Int nBytes, Char* who );
443
444
445/* ------------------------------------------------------------------ */
446/* signal.h.
447
448 Note that these use the vk_ (kernel) structure
449 definitions, which are different in places from those that glibc
450 defines -- hence the 'k' prefix. Since we're operating right at the
451 kernel interface, glibc's view of the world is entirely irrelevant. */
452
453/* --- Signal set ops --- */
njnd5bb0a52002-09-27 10:24:48 +0000454extern Int VG_(ksigfillset) ( vki_ksigset_t* set );
455extern Int VG_(ksigemptyset) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000456
njnd5bb0a52002-09-27 10:24:48 +0000457extern Bool VG_(kisfullsigset) ( vki_ksigset_t* set );
458extern Bool VG_(kisemptysigset) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000459
njnd5bb0a52002-09-27 10:24:48 +0000460extern Int VG_(ksigaddset) ( vki_ksigset_t* set, Int signum );
461extern Int VG_(ksigdelset) ( vki_ksigset_t* set, Int signum );
njn25e49d8e72002-09-23 09:36:25 +0000462extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
463
njnd5bb0a52002-09-27 10:24:48 +0000464extern void VG_(ksigaddset_from_set) ( vki_ksigset_t* dst, vki_ksigset_t* src );
465extern void VG_(ksigdelset_from_set) ( vki_ksigset_t* dst, vki_ksigset_t* src );
njn25e49d8e72002-09-23 09:36:25 +0000466
467/* --- Mess with the kernel's sig state --- */
njnd5bb0a52002-09-27 10:24:48 +0000468extern Int VG_(ksigprocmask) ( Int how, const vki_ksigset_t* set,
njn25e49d8e72002-09-23 09:36:25 +0000469 vki_ksigset_t* oldset );
njnd5bb0a52002-09-27 10:24:48 +0000470extern Int VG_(ksigaction) ( Int signum,
471 const vki_ksigaction* act,
472 vki_ksigaction* oldact );
njn25e49d8e72002-09-23 09:36:25 +0000473
njnd5bb0a52002-09-27 10:24:48 +0000474extern Int VG_(ksignal) ( Int signum, void (*sighandler)(Int) );
475extern Int VG_(ksigaltstack) ( const vki_kstack_t* ss, vki_kstack_t* oss );
njn25e49d8e72002-09-23 09:36:25 +0000476
sewardjdcaf3122002-09-30 23:12:33 +0000477extern Int VG_(kkill) ( Int pid, Int signo );
478extern Int VG_(ksigpending) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000479
480
481/*====================================================================*/
482/*=== UCode definition ===*/
483/*====================================================================*/
484
sewardje1042472002-09-30 12:33:11 +0000485/* Tags which describe what operands are. Must fit into 4 bits, which
486 they clearly do. */
njn25e49d8e72002-09-23 09:36:25 +0000487typedef
sewardje1042472002-09-30 12:33:11 +0000488enum { TempReg =0, /* virtual temp-reg */
489 ArchReg =1, /* simulated integer reg */
490 ArchRegS =2, /* simulated segment reg */
491 RealReg =3, /* real machine's real reg */
492 SpillNo =4, /* spill slot location */
493 Literal =5, /* literal; .lit32 field has actual value */
494 Lit16 =6, /* literal; .val[123] field has actual value */
495 NoValue =7 /* operand not in use */
496 }
497 Tag;
njn25e49d8e72002-09-23 09:36:25 +0000498
njnd5bb0a52002-09-27 10:24:48 +0000499/* Invalid register numbers (can't be negative) */
njn25e49d8e72002-09-23 09:36:25 +0000500#define INVALID_TEMPREG 999999999
501#define INVALID_REALREG 999999999
502
503/* Microinstruction opcodes. */
504typedef
505 enum {
njnd5bb0a52002-09-27 10:24:48 +0000506 NOP, /* Null op */
njn25e49d8e72002-09-23 09:36:25 +0000507
sewardj7a5ebcf2002-11-13 22:42:13 +0000508 LOCK, /* Indicate the existance of a LOCK prefix (functionally NOP) */
509
njnd5bb0a52002-09-27 10:24:48 +0000510 /* Moving values around */
511 GET, PUT, /* simulated register <--> TempReg */
512 GETF, PUTF, /* simulated %eflags <--> TempReg */
513 LOAD, STORE, /* memory <--> TempReg */
514 MOV, /* TempReg <--> TempReg */
515 CMOV, /* Used for cmpxchg and cmov */
njn25e49d8e72002-09-23 09:36:25 +0000516
njnd5bb0a52002-09-27 10:24:48 +0000517 /* Arithmetic/logical ops */
518 ADD, ADC, SUB, SBB, /* Add/subtract (w/wo carry) */
519 AND, OR, XOR, NOT, /* Boolean ops */
520 SHL, SHR, SAR, ROL, ROR, RCL, RCR, /* Shift/rotate (w/wo carry) */
521 NEG, /* Negate */
522 INC, DEC, /* Increment/decrement */
523 BSWAP, /* Big-endian <--> little-endian */
524 CC2VAL, /* Condition code --> 0 or 1 */
525 WIDEN, /* Signed or unsigned widening */
njn25e49d8e72002-09-23 09:36:25 +0000526
njnd5bb0a52002-09-27 10:24:48 +0000527 /* Conditional or unconditional jump */
528 JMP,
529
530 /* FPU ops */
531 FPU, /* Doesn't touch memory */
532 FPU_R, FPU_W, /* Reads/writes memory */
533
sewardj3d7c9c82003-03-26 21:08:13 +0000534 /* ------------ MMX ops ------------ */
535
536 /* 1 byte, no memrefs, no iregdefs, copy exactly to the
537 output. Held in val1[7:0]. */
538 MMX1,
539
540 /* 2 bytes, no memrefs, no iregdefs, copy exactly to the
541 output. Held in val1[15:0]. */
542 MMX2,
543
544 /* 3 bytes, no memrefs, no iregdefs, copy exactly to the
545 output. Held in val1[15:0] and val2[7:0]. */
546 MMX3,
547
548 /* 2 bytes, reads/writes mem. Insns of the form
549 bbbbbbbb:mod mmxreg r/m.
550 Held in val1[15:0], and mod and rm are to be replaced
551 at codegen time by a reference to the Temp/RealReg holding
552 the address. Arg2 holds this Temp/Real Reg.
553 Transfer is always at size 8.
554 */
555 MMX2_MemRd,
556 MMX2_MemWr,
557
558 /* 2 bytes, reads/writes an integer register. Insns of the form
559 bbbbbbbb:11 mmxreg ireg.
560 Held in val1[15:0], and ireg is to be replaced
561 at codegen time by a reference to the relevant RealReg.
562 Transfer is always at size 4. Arg2 holds this Temp/Real Reg.
563 */
564 MMX2_RegRd,
565 MMX2_RegWr,
566
567 /* ------------------------ */
568
njnd5bb0a52002-09-27 10:24:48 +0000569 /* Not strictly needed, but improve address calculation translations. */
njn25e49d8e72002-09-23 09:36:25 +0000570 LEA1, /* reg2 := const + reg1 */
571 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
572
njnd5bb0a52002-09-27 10:24:48 +0000573 /* Hack for x86 REP insns. Jump to literal if TempReg/RealReg is zero. */
574 JIFZ,
njn25e49d8e72002-09-23 09:36:25 +0000575
njnd5bb0a52002-09-27 10:24:48 +0000576 /* Advance the simulated %eip by some small (< 128) number. */
577 INCEIP,
njn25e49d8e72002-09-23 09:36:25 +0000578
sewardje1042472002-09-30 12:33:11 +0000579 /* Dealing with segment registers */
580 GETSEG, PUTSEG, /* simulated segment register <--> TempReg */
581 USESEG, /* (LDT/GDT index, virtual addr) --> linear addr */
582
njnd5bb0a52002-09-27 10:24:48 +0000583 /* Not for translating x86 calls -- only to call helpers */
584 CALLM_S, CALLM_E, /* Mark start/end of CALLM push/pop sequence */
585 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers */
586 CALLM, /* Call assembly-code helper */
587
588 /* Not for translating x86 calls -- only to call C helper functions of
589 up to three arguments (or two if the functions has a return value).
590 Arguments and return value must be word-sized. More arguments can
591 be faked with global variables (eg. use VG_(set_global_var)()).
592
593 Seven possibilities: 'arg[123]' show where args go, 'ret' shows
594 where return value goes (if present).
njn25e49d8e72002-09-23 09:36:25 +0000595
596 CCALL(-, -, - ) void f(void)
597 CCALL(arg1, -, - ) void f(UInt arg1)
598 CCALL(arg1, arg2, - ) void f(UInt arg1, UInt arg2)
599 CCALL(arg1, arg2, arg3) void f(UInt arg1, UInt arg2, UInt arg3)
600 CCALL(-, -, ret ) UInt f(UInt)
601 CCALL(arg1, -, ret ) UInt f(UInt arg1)
njnd5bb0a52002-09-27 10:24:48 +0000602 CCALL(arg1, arg2, ret ) UInt f(UInt arg1, UInt arg2) */
njn25e49d8e72002-09-23 09:36:25 +0000603 CCALL,
604
njnd5bb0a52002-09-27 10:24:48 +0000605 /* This opcode makes it easy for skins that extend UCode to do this to
606 avoid opcode overlap:
njn25e49d8e72002-09-23 09:36:25 +0000607
njnd5bb0a52002-09-27 10:24:48 +0000608 enum { EU_OP1 = DUMMY_FINAL_UOPCODE + 1, ... }
njn25e49d8e72002-09-23 09:36:25 +0000609
610 WARNING: Do not add new opcodes after this one! They can be added
611 before, though. */
612 DUMMY_FINAL_UOPCODE
613 }
614 Opcode;
615
616
njnd5bb0a52002-09-27 10:24:48 +0000617/* Condition codes, using the Intel encoding. CondAlways is an extra. */
njn25e49d8e72002-09-23 09:36:25 +0000618typedef
619 enum {
620 CondO = 0, /* overflow */
621 CondNO = 1, /* no overflow */
622 CondB = 2, /* below */
623 CondNB = 3, /* not below */
624 CondZ = 4, /* zero */
625 CondNZ = 5, /* not zero */
626 CondBE = 6, /* below or equal */
627 CondNBE = 7, /* not below or equal */
628 CondS = 8, /* negative */
sewardje1042472002-09-30 12:33:11 +0000629 CondNS = 9, /* not negative */
njn25e49d8e72002-09-23 09:36:25 +0000630 CondP = 10, /* parity even */
631 CondNP = 11, /* not parity even */
632 CondL = 12, /* jump less */
633 CondNL = 13, /* not less */
634 CondLE = 14, /* less or equal */
635 CondNLE = 15, /* not less or equal */
636 CondAlways = 16 /* Jump always */
637 }
638 Condcode;
639
640
641/* Descriptions of additional properties of *unconditional* jumps. */
642typedef
643 enum {
644 JmpBoring=0, /* boring unconditional jump */
645 JmpCall=1, /* jump due to an x86 call insn */
646 JmpRet=2, /* jump due to an x86 ret insn */
647 JmpSyscall=3, /* do a system call, then jump */
648 JmpClientReq=4 /* do a client request, then jump */
649 }
650 JmpKind;
651
652
653/* Flags. User-level code can only read/write O(verflow), S(ign),
654 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
655 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
656 thusly:
657 76543210
658 DOSZACP
659 and bit 7 must always be zero since it is unused.
sewardj2370f3b2002-11-30 15:01:01 +0000660
661 Note: these Flag? values are **not** the positions in the actual
662 %eflags register. */
663
njn25e49d8e72002-09-23 09:36:25 +0000664typedef UChar FlagSet;
665
666#define FlagD (1<<6)
667#define FlagO (1<<5)
668#define FlagS (1<<4)
669#define FlagZ (1<<3)
670#define FlagA (1<<2)
671#define FlagC (1<<1)
672#define FlagP (1<<0)
673
674#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
675#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
676#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
677#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
678#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
679#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
680#define FlagsZCP ( FlagZ | FlagC | FlagP)
681#define FlagsOC (FlagO | FlagC )
682#define FlagsAC ( FlagA | FlagC )
683
684#define FlagsALL (FlagsOSZACP | FlagD)
685#define FlagsEmpty (FlagSet)0
686
687
sewardj2370f3b2002-11-30 15:01:01 +0000688/* flag positions in eflags */
689#define EFlagC (1 << 0) /* carry */
690#define EFlagP (1 << 2) /* parity */
sewardjfa492d42002-12-08 18:20:01 +0000691#define EFlagA (1 << 4) /* aux carry */
sewardj2370f3b2002-11-30 15:01:01 +0000692#define EFlagZ (1 << 6) /* zero */
693#define EFlagS (1 << 7) /* sign */
sewardjfa492d42002-12-08 18:20:01 +0000694#define EFlagD (1 << 10) /* direction */
sewardj2370f3b2002-11-30 15:01:01 +0000695#define EFlagO (1 << 11) /* overflow */
696
njn25e49d8e72002-09-23 09:36:25 +0000697/* Liveness of general purpose registers, useful for code generation.
698 Reg rank order 0..N-1 corresponds to bits 0..N-1, ie. first
699 reg's liveness in bit 0, last reg's in bit N-1. Note that
700 these rankings don't match the Intel register ordering. */
701typedef UInt RRegSet;
702
703#define ALL_RREGS_DEAD 0 /* 0000...00b */
njne7c258c2002-10-03 08:57:01 +0000704#define ALL_RREGS_LIVE ((1 << VG_MAX_REALREGS)-1) /* 0011...11b */
njn25e49d8e72002-09-23 09:36:25 +0000705#define UNIT_RREGSET(rank) (1 << (rank))
706
707#define IS_RREG_LIVE(rank,rregs_live) (rregs_live & UNIT_RREGSET(rank))
708#define SET_RREG_LIVENESS(rank,rregs_live,b) \
709 do { RRegSet unit = UNIT_RREGSET(rank); \
710 if (b) rregs_live |= unit; \
711 else rregs_live &= ~unit; \
712 } while(0)
713
714
715/* A Micro (u)-instruction. */
716typedef
717 struct {
718 /* word 1 */
719 UInt lit32; /* 32-bit literal */
720
721 /* word 2 */
722 UShort val1; /* first operand */
723 UShort val2; /* second operand */
724
725 /* word 3 */
726 UShort val3; /* third operand */
727 UChar opcode; /* opcode */
728 UChar size; /* data transfer size */
729
730 /* word 4 */
731 FlagSet flags_r; /* :: FlagSet */
732 FlagSet flags_w; /* :: FlagSet */
733 UChar tag1:4; /* first operand tag */
734 UChar tag2:4; /* second operand tag */
735 UChar tag3:4; /* third operand tag */
736 UChar extra4b:4; /* Spare field, used by WIDEN for src
737 -size, and by LEA2 for scale (1,2,4 or 8),
738 and by JMPs for original x86 instr size */
739
740 /* word 5 */
741 UChar cond; /* condition, for jumps */
742 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
743 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
744
745 /* Additional properties for UInstrs that call C functions:
746 - CCALL
747 - PUT (when %ESP is the target)
748 - possibly skin-specific UInstrs
749 */
750 UChar argc:2; /* Number of args, max 3 */
751 UChar regparms_n:2; /* Number of args passed in registers */
752 Bool has_ret_val:1; /* Function has return value? */
753
754 /* RealReg liveness; only sensical after reg alloc and liveness
755 analysis done. This info is a little bit arch-specific --
756 VG_MAX_REALREGS can vary on different architectures. Note that
757 to use this information requires converting between register ranks
njn4ba5a792002-09-30 10:23:54 +0000758 and the Intel register numbers, using VG_(realreg_to_rank)()
759 and/or VG_(rank_to_realreg)() */
njn25e49d8e72002-09-23 09:36:25 +0000760 RRegSet regs_live_after:VG_MAX_REALREGS;
761 }
762 UInstr;
763
764
njn25e49d8e72002-09-23 09:36:25 +0000765typedef
njn810086f2002-11-14 12:42:47 +0000766 struct _UCodeBlock
njn25e49d8e72002-09-23 09:36:25 +0000767 UCodeBlock;
768
njn810086f2002-11-14 12:42:47 +0000769extern Int VG_(get_num_instrs) (UCodeBlock* cb);
770extern Int VG_(get_num_temps) (UCodeBlock* cb);
njn25e49d8e72002-09-23 09:36:25 +0000771
njn810086f2002-11-14 12:42:47 +0000772extern UInstr* VG_(get_instr) (UCodeBlock* cb, Int i);
773extern UInstr* VG_(get_last_instr) (UCodeBlock* cb);
774
njn211b6ad2003-02-03 12:33:31 +0000775
njn25e49d8e72002-09-23 09:36:25 +0000776/*====================================================================*/
777/*=== Instrumenting UCode ===*/
778/*====================================================================*/
779
njnf4ce3d32003-02-10 10:17:26 +0000780/* Maximum number of registers read or written by a single UInstruction. */
781#define VG_MAX_REGS_USED 3
njn25e49d8e72002-09-23 09:36:25 +0000782
njnf4ce3d32003-02-10 10:17:26 +0000783/* Find what this instruction does to its regs, useful for
784 analysis/optimisation passes. `tag' indicates whether we're considering
785 TempRegs (pre-reg-alloc) or RealRegs (post-reg-alloc). `regs' is filled
786 with the affected register numbers, `isWrites' parallels it and indicates
787 if the reg is read or written. If a reg is read and written, it will
788 appear twice in `regs'. `regs' and `isWrites' must be able to fit
789 VG_MAX_REGS_USED elements. */
njn810086f2002-11-14 12:42:47 +0000790extern Int VG_(get_reg_usage) ( UInstr* u, Tag tag, Int* regs, Bool* isWrites );
njn25e49d8e72002-09-23 09:36:25 +0000791
792
njnd5bb0a52002-09-27 10:24:48 +0000793/* Used to register helper functions to be called from generated code. A
794 limited number of compact helpers can be registered; the code generated
795 to call them is slightly shorter -- so register the mostly frequently
796 called helpers as compact. */
njn25e49d8e72002-09-23 09:36:25 +0000797extern void VG_(register_compact_helper) ( Addr a );
798extern void VG_(register_noncompact_helper) ( Addr a );
799
800
801/* ------------------------------------------------------------------ */
802/* Virtual register allocation */
803
804/* Get a new virtual register */
njn4ba5a792002-09-30 10:23:54 +0000805extern Int VG_(get_new_temp) ( UCodeBlock* cb );
njn25e49d8e72002-09-23 09:36:25 +0000806
807/* Get a new virtual shadow register */
njn4ba5a792002-09-30 10:23:54 +0000808extern Int VG_(get_new_shadow) ( UCodeBlock* cb );
njn25e49d8e72002-09-23 09:36:25 +0000809
810/* Get a virtual register's corresponding virtual shadow register */
811#define SHADOW(tempreg) ((tempreg)+1)
812
813
814/* ------------------------------------------------------------------ */
815/* Low-level UInstr builders */
njn4ba5a792002-09-30 10:23:54 +0000816extern void VG_(new_NOP) ( UInstr* u );
817extern void VG_(new_UInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
818extern void VG_(new_UInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000819 Tag tag1, UInt val1 );
njn4ba5a792002-09-30 10:23:54 +0000820extern void VG_(new_UInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000821 Tag tag1, UInt val1,
822 Tag tag2, UInt val2 );
njn4ba5a792002-09-30 10:23:54 +0000823extern void VG_(new_UInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000824 Tag tag1, UInt val1,
825 Tag tag2, UInt val2,
826 Tag tag3, UInt val3 );
njn25e49d8e72002-09-23 09:36:25 +0000827
njn810086f2002-11-14 12:42:47 +0000828/* Set read/write/undefined flags. Undefined flags are treaten as written,
829 but it's worth keeping them logically distinct. */
830extern void VG_(set_flag_fields) ( UCodeBlock* cb, FlagSet fr, FlagSet fw,
831 FlagSet fu);
njn4ba5a792002-09-30 10:23:54 +0000832extern void VG_(set_lit_field) ( UCodeBlock* cb, UInt lit32 );
833extern void VG_(set_ccall_fields) ( UCodeBlock* cb, Addr fn, UChar argc,
834 UChar regparms_n, Bool has_ret_val );
njn810086f2002-11-14 12:42:47 +0000835extern void VG_(set_cond_field) ( UCodeBlock* cb, Condcode code );
njn25e49d8e72002-09-23 09:36:25 +0000836
njn4ba5a792002-09-30 10:23:54 +0000837extern void VG_(copy_UInstr) ( UCodeBlock* cb, UInstr* instr );
838
839extern Bool VG_(any_flag_use)( UInstr* u );
njn25e49d8e72002-09-23 09:36:25 +0000840
njnac6c1762002-10-04 14:34:15 +0000841/* Macro versions of the above; just shorter to type. */
842#define uInstr0 VG_(new_UInstr0)
843#define uInstr1 VG_(new_UInstr1)
844#define uInstr2 VG_(new_UInstr2)
845#define uInstr3 VG_(new_UInstr3)
846#define uLiteral VG_(set_lit_field)
847#define uCCall VG_(set_ccall_fields)
njn810086f2002-11-14 12:42:47 +0000848#define uCond VG_(set_cond_field)
849#define uFlagsRWU VG_(set_flag_fields)
njnac6c1762002-10-04 14:34:15 +0000850#define newTemp VG_(get_new_temp)
851#define newShadow VG_(get_new_shadow)
852
njn25e49d8e72002-09-23 09:36:25 +0000853/* Refer to `the last instruction stuffed in' (can be lvalue). */
854#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
855
856
857/* ------------------------------------------------------------------ */
858/* Higher-level UInstr sequence builders */
njn4ba5a792002-09-30 10:23:54 +0000859extern void VG_(call_helper_0_0) ( UCodeBlock* cb, Addr f);
860extern void VG_(call_helper_1_0) ( UCodeBlock* cb, Addr f, UInt arg1,
861 UInt regparms_n);
862extern void VG_(call_helper_2_0) ( UCodeBlock* cb, Addr f, UInt arg1, UInt arg2,
863 UInt regparms_n);
njn25e49d8e72002-09-23 09:36:25 +0000864
865/* One way around the 3-arg C function limit is to pass args via global
njn6fefa1b2003-02-24 10:32:51 +0000866 * variables... ugly, but it works. This one puts a literal in there. */
njn4ba5a792002-09-30 10:23:54 +0000867extern void VG_(set_global_var) ( UCodeBlock* cb, Addr globvar_ptr, UInt val);
njn25e49d8e72002-09-23 09:36:25 +0000868
njn6fefa1b2003-02-24 10:32:51 +0000869/* This one puts the contents of a TempReg in the global variable. */
870extern void VG_(set_global_var_tempreg) ( UCodeBlock* cb, Addr globvar_ptr,
871 UInt t_val);
872
njn25e49d8e72002-09-23 09:36:25 +0000873/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000874/* Allocating/freeing basic blocks of UCode */
njn810086f2002-11-14 12:42:47 +0000875extern UCodeBlock* VG_(setup_UCodeBlock) ( UCodeBlock* cb );
njn4ba5a792002-09-30 10:23:54 +0000876extern void VG_(free_UCodeBlock) ( UCodeBlock* cb );
njnd5bb0a52002-09-27 10:24:48 +0000877
878/* ------------------------------------------------------------------ */
879/* UCode pretty/ugly printing. Probably only useful to call from a skin
njn25e49d8e72002-09-23 09:36:25 +0000880 if VG_(needs).extended_UCode == True. */
881
882/* When True, all generated code is/should be printed. */
883extern Bool VG_(print_codegen);
884
njn4ba5a792002-09-30 10:23:54 +0000885/* Pretty/ugly printing functions */
886extern void VG_(pp_UCodeBlock) ( UCodeBlock* cb, Char* title );
887extern void VG_(pp_UInstr) ( Int instrNo, UInstr* u );
888extern void VG_(pp_UInstr_regs) ( Int instrNo, UInstr* u );
889extern void VG_(up_UInstr) ( Int instrNo, UInstr* u );
890extern Char* VG_(name_UOpcode) ( Bool upper, Opcode opc );
njn563f96f2003-02-03 11:17:46 +0000891extern Char* VG_(name_UCondcode) ( Condcode cond );
njn4ba5a792002-09-30 10:23:54 +0000892extern void VG_(pp_UOperand) ( UInstr* u, Int operandNo,
893 Int sz, Bool parens );
njn25e49d8e72002-09-23 09:36:25 +0000894
njnb93d1782003-02-03 12:03:22 +0000895/* ------------------------------------------------------------------ */
njnf4ce3d32003-02-10 10:17:26 +0000896/* Accessing archregs and their shadows */
897extern UInt VG_(get_archreg) ( UInt archreg );
898extern UInt VG_(get_thread_archreg) ( ThreadId tid, UInt archreg );
899
njnb93d1782003-02-03 12:03:22 +0000900extern UInt VG_(get_shadow_archreg) ( UInt archreg );
901extern void VG_(set_shadow_archreg) ( UInt archreg, UInt val );
902extern Addr VG_(shadow_archreg_address) ( UInt archreg );
njn25e49d8e72002-09-23 09:36:25 +0000903
njnf4ce3d32003-02-10 10:17:26 +0000904extern UInt VG_(get_thread_shadow_archreg) ( ThreadId tid, UInt archreg );
905extern void VG_(set_thread_shadow_archreg) ( ThreadId tid, UInt archreg,
906 UInt val );
njn211b6ad2003-02-03 12:33:31 +0000907
908/* ------------------------------------------------------------------ */
909/* Offsets of addresses of helper functions. A "helper" function is one
910 which is called from generated code via CALLM. */
911
912extern Int VGOFF_(helper_idiv_64_32);
913extern Int VGOFF_(helper_div_64_32);
914extern Int VGOFF_(helper_idiv_32_16);
915extern Int VGOFF_(helper_div_32_16);
916extern Int VGOFF_(helper_idiv_16_8);
917extern Int VGOFF_(helper_div_16_8);
918
919extern Int VGOFF_(helper_imul_32_64);
920extern Int VGOFF_(helper_mul_32_64);
921extern Int VGOFF_(helper_imul_16_32);
922extern Int VGOFF_(helper_mul_16_32);
923extern Int VGOFF_(helper_imul_8_16);
924extern Int VGOFF_(helper_mul_8_16);
925
926extern Int VGOFF_(helper_CLD);
927extern Int VGOFF_(helper_STD);
928extern Int VGOFF_(helper_get_dirflag);
929
930extern Int VGOFF_(helper_CLC);
931extern Int VGOFF_(helper_STC);
932
933extern Int VGOFF_(helper_shldl);
934extern Int VGOFF_(helper_shldw);
935extern Int VGOFF_(helper_shrdl);
936extern Int VGOFF_(helper_shrdw);
937
938extern Int VGOFF_(helper_RDTSC);
939extern Int VGOFF_(helper_CPUID);
940
941extern Int VGOFF_(helper_bsf);
942extern Int VGOFF_(helper_bsr);
943
944extern Int VGOFF_(helper_fstsw_AX);
945extern Int VGOFF_(helper_SAHF);
946extern Int VGOFF_(helper_DAS);
947extern Int VGOFF_(helper_DAA);
948
949
njn25e49d8e72002-09-23 09:36:25 +0000950/*====================================================================*/
njnd5bb0a52002-09-27 10:24:48 +0000951/*=== Generating x86 code from UCode ===*/
njn25e49d8e72002-09-23 09:36:25 +0000952/*====================================================================*/
953
njnd5bb0a52002-09-27 10:24:48 +0000954/* All this only necessary for skins with VG_(needs).extends_UCode == True. */
njn25e49d8e72002-09-23 09:36:25 +0000955
sewardje1042472002-09-30 12:33:11 +0000956/* This is the Intel register encoding -- integer regs. */
njn25e49d8e72002-09-23 09:36:25 +0000957#define R_EAX 0
958#define R_ECX 1
959#define R_EDX 2
960#define R_EBX 3
961#define R_ESP 4
962#define R_EBP 5
963#define R_ESI 6
964#define R_EDI 7
965
966#define R_AL (0+R_EAX)
967#define R_CL (0+R_ECX)
968#define R_DL (0+R_EDX)
969#define R_BL (0+R_EBX)
970#define R_AH (4+R_EAX)
971#define R_CH (4+R_ECX)
972#define R_DH (4+R_EDX)
973#define R_BH (4+R_EBX)
974
sewardje1042472002-09-30 12:33:11 +0000975/* This is the Intel register encoding -- segment regs. */
976#define R_ES 0
977#define R_CS 1
978#define R_SS 2
979#define R_DS 3
980#define R_FS 4
981#define R_GS 5
982
njn25e49d8e72002-09-23 09:36:25 +0000983/* For pretty printing x86 code */
sewardj3d7c9c82003-03-26 21:08:13 +0000984extern Char* VG_(name_of_mmx_gran) ( UChar gran );
985extern Char* VG_(name_of_mmx_reg) ( Int mmxreg );
sewardje1042472002-09-30 12:33:11 +0000986extern Char* VG_(name_of_seg_reg) ( Int sreg );
njn4ba5a792002-09-30 10:23:54 +0000987extern Char* VG_(name_of_int_reg) ( Int size, Int reg );
988extern Char VG_(name_of_int_size) ( Int size );
njn25e49d8e72002-09-23 09:36:25 +0000989
njnac6c1762002-10-04 14:34:15 +0000990/* Shorter macros for convenience */
sewardj3d7c9c82003-03-26 21:08:13 +0000991#define nameIReg VG_(name_of_int_reg)
992#define nameISize VG_(name_of_int_size)
993#define nameSReg VG_(name_of_seg_reg)
994#define nameMMXReg VG_(name_of_mmx_reg)
995#define nameMMXGran VG_(name_of_mmx_gran)
njnac6c1762002-10-04 14:34:15 +0000996
njn25e49d8e72002-09-23 09:36:25 +0000997/* Randomly useful things */
998extern UInt VG_(extend_s_8to32) ( UInt x );
999
1000/* Code emitters */
njn4ba5a792002-09-30 10:23:54 +00001001extern void VG_(emitB) ( UInt b );
1002extern void VG_(emitW) ( UInt w );
1003extern void VG_(emitL) ( UInt l );
sewardjfa492d42002-12-08 18:20:01 +00001004extern void VG_(new_emit) ( Bool upd_cc, FlagSet uses_flags, FlagSet sets_flags );
njn25e49d8e72002-09-23 09:36:25 +00001005
1006/* Finding offsets */
njn4ba5a792002-09-30 10:23:54 +00001007extern Int VG_(helper_offset) ( Addr a );
1008extern Int VG_(shadow_reg_offset) ( Int arch );
1009extern Int VG_(shadow_flags_offset) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001010
njnd5bb0a52002-09-27 10:24:48 +00001011/* Convert reg ranks <-> Intel register ordering, for using register
1012 liveness information. */
njn4ba5a792002-09-30 10:23:54 +00001013extern Int VG_(realreg_to_rank) ( Int realreg );
1014extern Int VG_(rank_to_realreg) ( Int rank );
njn25e49d8e72002-09-23 09:36:25 +00001015
njnd5bb0a52002-09-27 10:24:48 +00001016/* Call a subroutine. Does no argument passing, stack manipulations, etc. */
sewardjfa492d42002-12-08 18:20:01 +00001017extern void VG_(synth_call) ( Bool ensure_shortform, Int word_offset,
1018 Bool upd_cc, FlagSet use_flags, FlagSet set_flags );
njn25e49d8e72002-09-23 09:36:25 +00001019
njnd5bb0a52002-09-27 10:24:48 +00001020/* For calling C functions -- saves caller save regs, pushes args, calls,
1021 clears the stack, restores caller save regs. `fn' must be registered in
1022 the baseBlock first. Acceptable tags are RealReg and Literal. Optimises
1023 things, eg. by not preserving non-live caller-save registers.
njn25e49d8e72002-09-23 09:36:25 +00001024
njnd5bb0a52002-09-27 10:24:48 +00001025 WARNING: a UInstr should *not* be translated with synth_ccall() followed
1026 by some other x86 assembly code; this will invalidate the results of
1027 vg_realreg_liveness_analysis() and everything will fall over. */
njn4ba5a792002-09-30 10:23:54 +00001028extern void VG_(synth_ccall) ( Addr fn, Int argc, Int regparms_n, UInt argv[],
1029 Tag tagv[], Int ret_reg,
1030 RRegSet regs_live_before,
1031 RRegSet regs_live_after );
njn25e49d8e72002-09-23 09:36:25 +00001032
1033/* Addressing modes */
njn4ba5a792002-09-30 10:23:54 +00001034extern void VG_(emit_amode_offregmem_reg)( Int off, Int regmem, Int reg );
1035extern void VG_(emit_amode_ereg_greg) ( Int e_reg, Int g_reg );
njn25e49d8e72002-09-23 09:36:25 +00001036
1037/* v-size (4, or 2 with OSO) insn emitters */
njn4ba5a792002-09-30 10:23:54 +00001038extern void VG_(emit_movv_offregmem_reg) ( Int sz, Int off, Int areg, Int reg );
1039extern void VG_(emit_movv_reg_offregmem) ( Int sz, Int reg, Int off, Int areg );
1040extern void VG_(emit_movv_reg_reg) ( Int sz, Int reg1, Int reg2 );
sewardjfa492d42002-12-08 18:20:01 +00001041extern void VG_(emit_nonshiftopv_lit_reg)( Bool upd_cc, Int sz, Opcode opc, UInt lit,
njn4ba5a792002-09-30 10:23:54 +00001042 Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001043extern void VG_(emit_shiftopv_lit_reg) ( Bool upd_cc, Int sz, Opcode opc, UInt lit,
njn4ba5a792002-09-30 10:23:54 +00001044 Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001045extern void VG_(emit_nonshiftopv_reg_reg)( Bool upd_cc, Int sz, Opcode opc,
njn4ba5a792002-09-30 10:23:54 +00001046 Int reg1, Int reg2 );
1047extern void VG_(emit_movv_lit_reg) ( Int sz, UInt lit, Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001048extern void VG_(emit_unaryopv_reg) ( Bool upd_cc, Int sz, Opcode opc, Int reg );
njn4ba5a792002-09-30 10:23:54 +00001049extern void VG_(emit_pushv_reg) ( Int sz, Int reg );
1050extern void VG_(emit_popv_reg) ( Int sz, Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001051
njn4ba5a792002-09-30 10:23:54 +00001052extern void VG_(emit_pushl_lit32) ( UInt int32 );
1053extern void VG_(emit_pushl_lit8) ( Int lit8 );
sewardjfa492d42002-12-08 18:20:01 +00001054extern void VG_(emit_cmpl_zero_reg) ( Bool upd_cc, Int reg );
njn4ba5a792002-09-30 10:23:54 +00001055extern void VG_(emit_swapl_reg_EAX) ( Int reg );
1056extern void VG_(emit_movv_lit_offregmem) ( Int sz, UInt lit, Int off,
1057 Int memreg );
njn25e49d8e72002-09-23 09:36:25 +00001058
1059/* b-size (1 byte) instruction emitters */
njn4ba5a792002-09-30 10:23:54 +00001060extern void VG_(emit_movb_lit_offregmem) ( UInt lit, Int off, Int memreg );
1061extern void VG_(emit_movb_reg_offregmem) ( Int reg, Int off, Int areg );
sewardjfa492d42002-12-08 18:20:01 +00001062extern void VG_(emit_unaryopb_reg) ( Bool upd_cc, Opcode opc, Int reg );
1063extern void VG_(emit_testb_lit_reg) ( Bool upd_cc, UInt lit, Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001064
1065/* zero-extended load emitters */
njn4ba5a792002-09-30 10:23:54 +00001066extern void VG_(emit_movzbl_offregmem_reg) ( Int off, Int regmem, Int reg );
1067extern void VG_(emit_movzwl_offregmem_reg) ( Int off, Int areg, Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001068
1069/* misc instruction emitters */
njn4ba5a792002-09-30 10:23:54 +00001070extern void VG_(emit_call_reg) ( Int reg );
1071extern void VG_(emit_add_lit_to_esp) ( Int lit );
njn4ba5a792002-09-30 10:23:54 +00001072extern void VG_(emit_pushal) ( void );
1073extern void VG_(emit_popal) ( void );
1074extern void VG_(emit_AMD_prefetch_reg) ( Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001075
sewardja2113f92002-12-12 23:42:48 +00001076/* jump emitters */
1077extern void VG_(init_target) ( Int *tgt );
1078
1079extern void VG_(target_back) ( Int *tgt );
1080extern void VG_(target_forward) ( Int *tgt );
1081extern void VG_(emit_target_delta) ( Int *tgt );
1082
1083extern void VG_(emit_jcondshort_delta) ( Bool simd_cc, Condcode cond, Int delta );
1084extern void VG_(emit_jcondshort_target)( Bool simd_cc, Condcode cond, Int *tgt );
1085
njn25e49d8e72002-09-23 09:36:25 +00001086
1087/*====================================================================*/
1088/*=== Execution contexts ===*/
1089/*====================================================================*/
1090
1091/* Generic resolution type used in a few different ways, such as deciding
1092 how closely to compare two errors for equality. */
1093typedef
1094 enum { Vg_LowRes, Vg_MedRes, Vg_HighRes }
1095 VgRes;
1096
1097typedef
1098 struct _ExeContext
1099 ExeContext;
1100
njnd5bb0a52002-09-27 10:24:48 +00001101/* Compare two ExeContexts. Number of callers considered depends on `res':
1102 Vg_LowRes: 2
1103 Vg_MedRes: 4
1104 Vg_HighRes: all */
njn25e49d8e72002-09-23 09:36:25 +00001105extern Bool VG_(eq_ExeContext) ( VgRes res,
1106 ExeContext* e1, ExeContext* e2 );
1107
1108/* Print an ExeContext. */
1109extern void VG_(pp_ExeContext) ( ExeContext* );
1110
1111/* Take a snapshot of the client's stack. Search our collection of
1112 ExeContexts to see if we already have it, and if not, allocate a
1113 new one. Either way, return a pointer to the context. */
1114extern ExeContext* VG_(get_ExeContext) ( ThreadState *tst );
1115
sewardj499e3de2002-11-13 22:22:25 +00001116/* Just grab the client's EIP, as a much smaller and cheaper
1117 indication of where they are. */
1118extern Addr VG_(get_EIP)( ThreadState *tst );
njn25e49d8e72002-09-23 09:36:25 +00001119
njn211b6ad2003-02-03 12:33:31 +00001120
njn25e49d8e72002-09-23 09:36:25 +00001121/*====================================================================*/
1122/*=== Error reporting ===*/
1123/*====================================================================*/
1124
1125/* ------------------------------------------------------------------ */
1126/* Suppressions describe errors which we want to suppress, ie, not
1127 show the user, usually because it is caused by a problem in a library
1128 which we can't fix, replace or work around. Suppressions are read from
njnd5bb0a52002-09-27 10:24:48 +00001129 a file at startup time. This gives flexibility so that new
njn25e49d8e72002-09-23 09:36:25 +00001130 suppressions can be added to the file as and when needed.
1131*/
1132
1133typedef
1134 Int /* Do not make this unsigned! */
1135 SuppKind;
1136
njn810086f2002-11-14 12:42:47 +00001137/* The skin-relevant parts of a suppression are:
1138 kind: what kind of suppression; must be in the range (0..)
1139 string: use is optional. NULL by default.
1140 extra: use is optional. NULL by default. void* so it's extensible.
njn25e49d8e72002-09-23 09:36:25 +00001141*/
1142typedef
njn810086f2002-11-14 12:42:47 +00001143 struct _Supp
1144 Supp;
1145
1146/* Useful in SK_(error_matches_suppression)() */
1147SuppKind VG_(get_supp_kind) ( Supp* su );
1148Char* VG_(get_supp_string) ( Supp* su );
1149void* VG_(get_supp_extra) ( Supp* su );
1150
1151/* Must be used in VG_(recognised_suppression)() */
1152void VG_(set_supp_kind) ( Supp* su, SuppKind suppkind );
1153/* May be used in VG_(read_extra_suppression_info)() */
1154void VG_(set_supp_string) ( Supp* su, Char* string );
1155void VG_(set_supp_extra) ( Supp* su, void* extra );
njn25e49d8e72002-09-23 09:36:25 +00001156
1157
1158/* ------------------------------------------------------------------ */
1159/* Error records contain enough info to generate an error report. The idea
1160 is that (typically) the same few points in the program generate thousands
njnd5bb0a52002-09-27 10:24:48 +00001161 of errors, and we don't want to spew out a fresh error message for each
1162 one. Instead, we use these structures to common up duplicates.
njn25e49d8e72002-09-23 09:36:25 +00001163*/
1164
1165typedef
1166 Int /* Do not make this unsigned! */
1167 ErrorKind;
1168
njn810086f2002-11-14 12:42:47 +00001169/* The skin-relevant parts of an Error are:
1170 kind: what kind of error; must be in the range (0..)
1171 addr: use is optional. 0 by default.
1172 string: use is optional. NULL by default.
1173 extra: use is optional. NULL by default. void* so it's extensible.
njn25e49d8e72002-09-23 09:36:25 +00001174*/
1175typedef
njn810086f2002-11-14 12:42:47 +00001176 struct _Error
1177 Error;
njn25e49d8e72002-09-23 09:36:25 +00001178
njn810086f2002-11-14 12:42:47 +00001179/* Useful in SK_(error_matches_suppression)(), SK_(pp_SkinError)(), etc */
njnb877d492003-01-28 20:40:57 +00001180ExeContext* VG_(get_error_where) ( Error* err );
1181SuppKind VG_(get_error_kind) ( Error* err );
1182Addr VG_(get_error_address) ( Error* err );
1183Char* VG_(get_error_string) ( Error* err );
1184void* VG_(get_error_extra) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001185
njnd5bb0a52002-09-27 10:24:48 +00001186/* Call this when an error occurs. It will be recorded if it hasn't been
njn25e49d8e72002-09-23 09:36:25 +00001187 seen before. If it has, the existing error record will have its count
1188 incremented.
1189
1190 If the error occurs in generated code, 'tst' should be NULL. If the
1191 error occurs in non-generated code, 'tst' should be non-NULL. The
njn43c799e2003-04-08 00:08:52 +00001192 `extra' field can be stack-allocated; it will be copied by the core
1193 if needed. But it won't be copied if it's NULL.
njnd5bb0a52002-09-27 10:24:48 +00001194
1195 If no 'a', 's' or 'extra' of interest needs to be recorded, just use
njn3e884182003-04-15 13:03:23 +00001196 NULL for them. */
njn25e49d8e72002-09-23 09:36:25 +00001197extern void VG_(maybe_record_error) ( ThreadState* tst, ErrorKind ekind,
1198 Addr a, Char* s, void* extra );
1199
njn43c799e2003-04-08 00:08:52 +00001200/* Similar to VG_(maybe_record_error)(), except this one doesn't record the
1201 error -- useful for errors that can only happen once. The errors can be
1202 suppressed, though. Return value is True if it was suppressed.
1203 `print_error' dictates whether to print the error, which is a bit of a
1204 hack that's useful sometimes if you just want to know if the error would
njn47363ab2003-04-21 13:24:40 +00001205 be suppressed without possibly printing it. `count_error' dictates
1206 whether to add the error in the error total count (another mild hack). */
njn43c799e2003-04-08 00:08:52 +00001207extern Bool VG_(unique_error) ( ThreadState* tst, ErrorKind ekind,
1208 Addr a, Char* s, void* extra,
njn3e884182003-04-15 13:03:23 +00001209 ExeContext* where, Bool print_error,
njn47363ab2003-04-21 13:24:40 +00001210 Bool allow_GDB_attach, Bool count_error );
njn43c799e2003-04-08 00:08:52 +00001211
njn25e49d8e72002-09-23 09:36:25 +00001212/* Gets a non-blank, non-comment line of at most nBuf chars from fd.
1213 Skips leading spaces on the line. Returns True if EOF was hit instead.
njn3e884182003-04-15 13:03:23 +00001214 Useful for reading in extra skin-specific suppression lines. */
njn4ba5a792002-09-30 10:23:54 +00001215extern Bool VG_(get_line) ( Int fd, Char* buf, Int nBuf );
njn25e49d8e72002-09-23 09:36:25 +00001216
njn3e884182003-04-15 13:03:23 +00001217/* Client request: write a string to the logging sink. */
1218#define VG_USERREQ__LOGMESSAGE 0x3103
1219
njn25e49d8e72002-09-23 09:36:25 +00001220
1221/*====================================================================*/
1222/*=== Obtaining debug information ===*/
1223/*====================================================================*/
1224
sewardj6e008cb2002-12-15 13:11:39 +00001225/* Get the file/function/line number of the instruction at address
1226 'a'. For these four, if debug info for the address is found, it
1227 copies the info into the buffer/UInt and returns True. If not, it
1228 returns False and nothing is copied. VG_(get_fnname) always
1229 demangles C++ function names. VG_(get_fnname_w_offset) is the
njn3e884182003-04-15 13:03:23 +00001230 same, except it appends "+N" to symbol names to indicate offsets. */
njn25e49d8e72002-09-23 09:36:25 +00001231extern Bool VG_(get_filename) ( Addr a, Char* filename, Int n_filename );
1232extern Bool VG_(get_fnname) ( Addr a, Char* fnname, Int n_fnname );
1233extern Bool VG_(get_linenum) ( Addr a, UInt* linenum );
sewardj6e008cb2002-12-15 13:11:39 +00001234extern Bool VG_(get_fnname_w_offset)
1235 ( Addr a, Char* fnname, Int n_fnname );
njn25e49d8e72002-09-23 09:36:25 +00001236
1237/* This one is more efficient if getting both filename and line number,
1238 because the two lookups are done together. */
1239extern Bool VG_(get_filename_linenum)
1240 ( Addr a, Char* filename, Int n_filename,
1241 UInt* linenum );
1242
1243/* Succeeds only if we find from debug info that 'a' is the address of the
1244 first instruction in a function -- as opposed to VG_(get_fnname) which
1245 succeeds if we find from debug info that 'a' is the address of any
1246 instruction in a function. Use this to instrument the start of
njnd5bb0a52002-09-27 10:24:48 +00001247 a particular function. Nb: if an executable/shared object is stripped
njn25e49d8e72002-09-23 09:36:25 +00001248 of its symbols, this function will not be able to recognise function
1249 entry points within it. */
1250extern Bool VG_(get_fnname_if_entry) ( Addr a, Char* filename, Int n_filename );
1251
1252/* Succeeds if the address is within a shared object or the main executable.
1253 It doesn't matter if debug info is present or not. */
1254extern Bool VG_(get_objname) ( Addr a, Char* objname, Int n_objname );
1255
sewardj47104382002-10-20 18:35:48 +00001256/* A way to get information about what segments are mapped */
1257typedef struct _SegInfo SegInfo;
1258
njnb877d492003-01-28 20:40:57 +00001259/* Returns NULL if the SegInfo isn't found. It doesn't matter if debug info
1260 is present or not. */
1261extern SegInfo* VG_(get_obj) ( Addr a );
1262
1263extern const SegInfo* VG_(next_seginfo) ( const SegInfo *seg );
1264extern Addr VG_(seg_start) ( const SegInfo *seg );
1265extern UInt VG_(seg_size) ( const SegInfo *seg );
1266extern const UChar* VG_(seg_filename) ( const SegInfo *seg );
1267extern UInt VG_(seg_sym_offset)( const SegInfo *seg );
sewardj47104382002-10-20 18:35:48 +00001268
1269typedef
1270 enum {
1271 Vg_SectUnknown,
1272 Vg_SectText,
sewardj8fe15a32002-10-20 19:29:21 +00001273 Vg_SectData,
1274 Vg_SectBSS,
sewardj47104382002-10-20 18:35:48 +00001275 Vg_SectGOT,
sewardj8fe15a32002-10-20 19:29:21 +00001276 Vg_SectPLT,
sewardj47104382002-10-20 18:35:48 +00001277 }
1278 VgSectKind;
1279
1280extern VgSectKind VG_(seg_sect_kind)(Addr);
1281
njn25e49d8e72002-09-23 09:36:25 +00001282
1283/*====================================================================*/
njn3e884182003-04-15 13:03:23 +00001284/*=== Generic hash table ===*/
njn25e49d8e72002-09-23 09:36:25 +00001285/*====================================================================*/
1286
njn3e884182003-04-15 13:03:23 +00001287/* Generic type for a separately-chained hash table. Via a kind of dodgy
1288 C-as-C++ style inheritance, skins can extend the VgHashNode type, so long
1289 as the first two fields match the sizes of these two fields. Requires
1290 a bit of casting by the skin. */
njn25e49d8e72002-09-23 09:36:25 +00001291typedef
njn3e884182003-04-15 13:03:23 +00001292 struct _VgHashNode {
1293 struct _VgHashNode * next;
1294 UInt key;
1295 }
1296 VgHashNode;
njn25e49d8e72002-09-23 09:36:25 +00001297
njn3e884182003-04-15 13:03:23 +00001298typedef
1299 VgHashNode**
1300 VgHashTable;
njn810086f2002-11-14 12:42:47 +00001301
njn3e884182003-04-15 13:03:23 +00001302/* Make a new table. */
1303extern VgHashTable VG_(HT_construct) ( void );
1304
1305/* Add a node to the table. */
1306extern void VG_(HT_add_node) ( VgHashTable t, VgHashNode* node );
1307
1308/* Looks up a node in the hash table. Also returns the address of the
1309 previous node's `next' pointer which allows it to be removed from the
1310 list later without having to look it up again. */
1311extern VgHashNode* VG_(HT_get_node) ( VgHashTable t, UInt key,
1312 /*OUT*/VgHashNode*** next_ptr );
1313
1314/* Allocates a sorted array of pointers to all the shadow chunks of malloc'd
1315 blocks. */
1316extern VgHashNode** VG_(HT_to_sorted_array) ( VgHashTable t,
1317 /*OUT*/ UInt* n_shadows );
1318
1319/* Returns first node that matches predicate `p', or NULL if none do.
1320 Extra arguments can be implicitly passed to `p' using nested functions;
1321 see memcheck/mc_errcontext.c for an example. */
1322extern VgHashNode* VG_(HT_first_match) ( VgHashTable t,
1323 Bool (*p)(VgHashNode*) );
1324
1325/* Applies a function f() once to each node. Again, nested functions
1326 can be very useful. */
1327extern void VG_(HT_apply_to_all_nodes)( VgHashTable t, void (*f)(VgHashNode*) );
1328
1329/* Destroy a table. */
1330extern void VG_(HT_destruct) ( VgHashTable t );
njn810086f2002-11-14 12:42:47 +00001331
1332
njn3e884182003-04-15 13:03:23 +00001333/*====================================================================*/
1334/*=== General stuff for replacing functions ===*/
1335/*====================================================================*/
njn25e49d8e72002-09-23 09:36:25 +00001336
njn3e884182003-04-15 13:03:23 +00001337/* Some skins need to replace the standard definitions of some functions. */
njn25e49d8e72002-09-23 09:36:25 +00001338
njn3e884182003-04-15 13:03:23 +00001339/* ------------------------------------------------------------------ */
1340/* General stuff, for replacing any functions */
njn25e49d8e72002-09-23 09:36:25 +00001341
njn3e884182003-04-15 13:03:23 +00001342/* Is the client running on the simulated CPU or the real one?
njn25e49d8e72002-09-23 09:36:25 +00001343
njn3e884182003-04-15 13:03:23 +00001344 Nb: If it is, and you want to call a function to be run on the real CPU,
njn057c65f2003-04-21 13:30:55 +00001345 use one of the VALGRIND_NON_SIMD_CALL[123] macros in valgrind.h to call it.
njn25e49d8e72002-09-23 09:36:25 +00001346
njn3e884182003-04-15 13:03:23 +00001347 Nb: don't forget the function parentheses when using this in a
1348 condition... write this:
1349
1350 if (VG_(is_running_on_simd_CPU)()) { ... } // calls function
1351
1352 not this:
1353
1354 if (VG_(is_running_on_simd_CPU)) { ... } // address of var!
1355*/
1356extern Bool VG_(is_running_on_simd_CPU) ( void );
1357
1358
1359/*====================================================================*/
1360/*=== Specific stuff for replacing malloc() and friends ===*/
1361/*====================================================================*/
1362
1363/* ------------------------------------------------------------------ */
1364/* Replacing malloc() and friends */
1365
1366/* If a skin replaces malloc() et al, the easiest way to do so is to link
1367 with coregrind/vg_replace_malloc.c, and follow the following instructions.
1368 You can do it from scratch, though, if you enjoy that sort of thing. */
1369
1370/* Arena size for valgrind's own malloc(); default value is 0, but can
1371 be overridden by skin -- but must be done so *statically*, eg:
1372
1373 Int VG_(vg_malloc_redzone_szB) = 4;
1374
1375 It can't be done from a function like SK_(pre_clo_init)(). So it can't,
1376 for example, be controlled with a command line option, unfortunately. */
1377extern UInt VG_(vg_malloc_redzone_szB);
1378
1379/* If a skin links with vg_replace_malloc.c, the following functions will be
1380 called appropriately when malloc() et al are called. */
1381extern void* SK_(malloc) ( ThreadState* tst, Int n );
1382extern void* SK_(__builtin_new) ( ThreadState* tst, Int n );
1383extern void* SK_(__builtin_vec_new) ( ThreadState* tst, Int n );
1384extern void* SK_(memalign) ( ThreadState* tst, Int align, Int n );
1385extern void* SK_(calloc) ( ThreadState* tst, Int nmemb, Int n );
1386extern void SK_(free) ( ThreadState* tst, void* p );
1387extern void SK_(__builtin_delete) ( ThreadState* tst, void* p );
1388extern void SK_(__builtin_vec_delete) ( ThreadState* tst, void* p );
1389extern void* SK_(realloc) ( ThreadState* tst, void* p, Int size );
1390
1391/* Can be called from SK_(malloc) et al to do the actual alloc/freeing. */
1392extern void* VG_(cli_malloc) ( UInt align, Int nbytes );
1393extern void VG_(cli_free) ( void* p );
1394
1395/* Check if an address is within a range, allowing for redzones at edges */
1396extern Bool VG_(addr_is_in_block)( Addr a, Addr start, UInt size );
1397
1398/* ------------------------------------------------------------------ */
1399/* Some options that can be used by a skin if malloc() et al are replaced.
1400 The skin should use the VG_(process...)() and VG_(print...)() functions
1401 to give control over these aspects of Valgrind's version of malloc(). */
1402
1403/* Round malloc sizes upwards to integral number of words? default: NO */
1404extern Bool VG_(clo_sloppy_malloc);
1405/* DEBUG: print malloc details? default: NO */
1406extern Bool VG_(clo_trace_malloc);
1407/* Minimum alignment in functions that don't specify alignment explicitly.
1408 default: 0, i.e. use default of the machine (== 4) */
1409extern Int VG_(clo_alignment);
1410
1411extern Bool VG_(replacement_malloc_process_cmd_line_option) ( Char* arg );
1412extern void VG_(replacement_malloc_print_usage) ( void );
1413extern void VG_(replacement_malloc_print_debug_usage) ( void );
sewardja4495682002-10-21 07:29:59 +00001414
1415
njn25e49d8e72002-09-23 09:36:25 +00001416/*====================================================================*/
1417/*=== Skin-specific stuff ===*/
1418/*====================================================================*/
1419
njnd04b7c62002-10-03 14:05:52 +00001420/* ------------------------------------------------------------------ */
1421/* Details */
njnd04b7c62002-10-03 14:05:52 +00001422
njn120281f2003-02-03 12:20:07 +00001423/* Default value for avg_translations_sizeB (in bytes), indicating typical
1424 code expansion of about 6:1. */
1425#define VG_DEFAULT_TRANS_SIZEB 100
1426
njn810086f2002-11-14 12:42:47 +00001427/* Information used in the startup message. `name' also determines the
1428 string used for identifying suppressions in a suppression file as
1429 belonging to this skin. `version' can be NULL, in which case (not
1430 surprisingly) no version info is printed; this mechanism is designed for
1431 skins distributed with Valgrind that share a version number with
1432 Valgrind. Other skins not distributed as part of Valgrind should
sewardjc0d8f682002-11-30 00:49:43 +00001433 probably have their own version number. */
1434extern void VG_(details_name) ( Char* name );
1435extern void VG_(details_version) ( Char* version );
1436extern void VG_(details_description) ( Char* description );
1437extern void VG_(details_copyright_author) ( Char* copyright_author );
1438
1439/* Average size of a translation, in bytes, so that the translation
njn120281f2003-02-03 12:20:07 +00001440 storage machinery can allocate memory appropriately. Not critical,
1441 setting is optional. */
1442extern void VG_(details_avg_translation_sizeB) ( UInt size );
njnd04b7c62002-10-03 14:05:52 +00001443
njn810086f2002-11-14 12:42:47 +00001444/* String printed if an `sk_assert' assertion fails or VG_(skin_panic)
1445 is called. Should probably be an email address. */
1446extern void VG_(details_bug_reports_to) ( Char* bug_reports_to );
njnd04b7c62002-10-03 14:05:52 +00001447
1448/* ------------------------------------------------------------------ */
1449/* Needs */
1450
njn810086f2002-11-14 12:42:47 +00001451/* Booleans that decide core behaviour, but don't require extra
1452 operations to be defined if `True' */
njnd5bb0a52002-09-27 10:24:48 +00001453
njn810086f2002-11-14 12:42:47 +00001454/* Should __libc_freeres() be run? Bugs in it can crash the skin. */
1455extern void VG_(needs_libc_freeres) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001456
njn810086f2002-11-14 12:42:47 +00001457/* Want to have errors detected by Valgrind's core reported? Includes:
1458 - pthread API errors (many; eg. unlocking a non-locked mutex)
njn810086f2002-11-14 12:42:47 +00001459 - invalid file descriptors to blocking syscalls read() and write()
1460 - bad signal numbers passed to sigaction()
1461 - attempt to install signal handler for SIGKILL or SIGSTOP */
1462extern void VG_(needs_core_errors) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001463
njn810086f2002-11-14 12:42:47 +00001464/* Booleans that indicate extra operations are defined; if these are True,
1465 the corresponding template functions (given below) must be defined. A
1466 lot like being a member of a type class. */
njn25e49d8e72002-09-23 09:36:25 +00001467
njn810086f2002-11-14 12:42:47 +00001468/* Want to report errors from skin? This implies use of suppressions, too. */
1469extern void VG_(needs_skin_errors) ( void );
njnd5bb0a52002-09-27 10:24:48 +00001470
njn810086f2002-11-14 12:42:47 +00001471/* Is information kept about specific individual basic blocks? (Eg. for
1472 cachegrind there are cost-centres for every instruction, stored at a
1473 basic block level.) If so, it sometimes has to be discarded, because
1474 .so mmap/munmap-ping or self-modifying code (informed by the
1475 DISCARD_TRANSLATIONS user request) can cause one instruction address
1476 to be used for more than one instruction in one program run... */
1477extern void VG_(needs_basic_block_discards) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001478
njn810086f2002-11-14 12:42:47 +00001479/* Skin maintains information about each register? */
1480extern void VG_(needs_shadow_regs) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001481
njn810086f2002-11-14 12:42:47 +00001482/* Skin defines its own command line options? */
1483extern void VG_(needs_command_line_options) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001484
njn810086f2002-11-14 12:42:47 +00001485/* Skin defines its own client requests? */
1486extern void VG_(needs_client_requests) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001487
njn810086f2002-11-14 12:42:47 +00001488/* Skin defines its own UInstrs? */
1489extern void VG_(needs_extended_UCode) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001490
njn810086f2002-11-14 12:42:47 +00001491/* Skin does stuff before and/or after system calls? */
1492extern void VG_(needs_syscall_wrapper) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001493
njn810086f2002-11-14 12:42:47 +00001494/* Are skin-state sanity checks performed? */
1495extern void VG_(needs_sanity_checks) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001496
njn810086f2002-11-14 12:42:47 +00001497/* Do we need to see data symbols? */
1498extern void VG_(needs_data_syms) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001499
1500/* ------------------------------------------------------------------ */
1501/* Core events to track */
1502
1503/* Part of the core from which this call was made. Useful for determining
njnd5bb0a52002-09-27 10:24:48 +00001504 what kind of error message should be emitted. */
njn25e49d8e72002-09-23 09:36:25 +00001505typedef
1506 enum { Vg_CorePThread, Vg_CoreSignal, Vg_CoreSysCall, Vg_CoreTranslate }
1507 CorePart;
1508
njn810086f2002-11-14 12:42:47 +00001509#define EV extern void
njn25e49d8e72002-09-23 09:36:25 +00001510
njn810086f2002-11-14 12:42:47 +00001511/* Events happening in core to track. To be notified, pass a callback
1512 function to the appropriate function. To ignore an event, don't do
1513 anything (default is for events to be ignored). */
1514
njn810086f2002-11-14 12:42:47 +00001515
njn3e884182003-04-15 13:03:23 +00001516/* Memory events (Nb: to track heap allocation/freeing, a skin must replace
1517 malloc() et al. See above how to do this.) */
1518
1519/* These ones occur at startup, upon some signals, and upon some syscalls */
njn810086f2002-11-14 12:42:47 +00001520EV VG_(track_new_mem_startup) ( void (*f)(Addr a, UInt len,
1521 Bool rr, Bool ww, Bool xx) );
njn810086f2002-11-14 12:42:47 +00001522EV VG_(track_new_mem_stack_signal) ( void (*f)(Addr a, UInt len) );
1523EV VG_(track_new_mem_brk) ( void (*f)(Addr a, UInt len) );
1524EV VG_(track_new_mem_mmap) ( void (*f)(Addr a, UInt len,
1525 Bool rr, Bool ww, Bool xx) );
1526
njn3e884182003-04-15 13:03:23 +00001527EV VG_(track_copy_mem_remap) ( void (*f)(Addr from, Addr to, UInt len) );
1528EV VG_(track_change_mem_mprotect) ( void (*f)(Addr a, UInt len,
1529 Bool rr, Bool ww, Bool xx) );
1530EV VG_(track_die_mem_stack_signal) ( void (*f)(Addr a, UInt len) );
1531EV VG_(track_die_mem_brk) ( void (*f)(Addr a, UInt len) );
1532EV VG_(track_die_mem_munmap) ( void (*f)(Addr a, UInt len) );
1533
1534
1535/* These ones are called when %esp changes. A skin could track these itself
1536 (except for ban_mem_stack) but it's much easier to use the core's help.
1537
1538 The specialised ones are called in preference to the general one, if they
njn9b007f62003-04-07 14:40:25 +00001539 are defined. These functions are called a lot if they are used, so
1540 specialising can optimise things significantly. If any of the
1541 specialised cases are defined, the general case must be defined too.
1542
1543 Nb: they must all use the __attribute__((regparm(n))) attribute. */
1544EV VG_(track_new_mem_stack_4) ( void (*f)(Addr new_ESP) );
1545EV VG_(track_new_mem_stack_8) ( void (*f)(Addr new_ESP) );
1546EV VG_(track_new_mem_stack_12) ( void (*f)(Addr new_ESP) );
1547EV VG_(track_new_mem_stack_16) ( void (*f)(Addr new_ESP) );
1548EV VG_(track_new_mem_stack_32) ( void (*f)(Addr new_ESP) );
1549EV VG_(track_new_mem_stack) ( void (*f)(Addr a, UInt len) );
1550
njn9b007f62003-04-07 14:40:25 +00001551EV VG_(track_die_mem_stack_4) ( void (*f)(Addr die_ESP) );
1552EV VG_(track_die_mem_stack_8) ( void (*f)(Addr die_ESP) );
1553EV VG_(track_die_mem_stack_12) ( void (*f)(Addr die_ESP) );
1554EV VG_(track_die_mem_stack_16) ( void (*f)(Addr die_ESP) );
1555EV VG_(track_die_mem_stack_32) ( void (*f)(Addr die_ESP) );
1556EV VG_(track_die_mem_stack) ( void (*f)(Addr a, UInt len) );
1557
njn3e884182003-04-15 13:03:23 +00001558/* Used for redzone at end of thread stacks */
1559EV VG_(track_ban_mem_stack) ( void (*f)(Addr a, UInt len) );
njn25e49d8e72002-09-23 09:36:25 +00001560
njn3e884182003-04-15 13:03:23 +00001561/* These ones occur around syscalls, signal handling, etc */
njn810086f2002-11-14 12:42:47 +00001562EV VG_(track_pre_mem_read) ( void (*f)(CorePart part, ThreadState* tst,
1563 Char* s, Addr a, UInt size) );
1564EV VG_(track_pre_mem_read_asciiz) ( void (*f)(CorePart part, ThreadState* tst,
1565 Char* s, Addr a) );
1566EV VG_(track_pre_mem_write) ( void (*f)(CorePart part, ThreadState* tst,
1567 Char* s, Addr a, UInt size) );
1568/* Not implemented yet -- have to add in lots of places, which is a
1569 pain. Won't bother unless/until there's a need. */
1570/* EV VG_(track_post_mem_read) ( void (*f)(ThreadState* tst, Char* s,
1571 Addr a, UInt size) ); */
1572EV VG_(track_post_mem_write) ( void (*f)(Addr a, UInt size) );
njn25e49d8e72002-09-23 09:36:25 +00001573
1574
njn810086f2002-11-14 12:42:47 +00001575/* Scheduler events (not exhaustive) */
njn25e49d8e72002-09-23 09:36:25 +00001576
njn810086f2002-11-14 12:42:47 +00001577EV VG_(track_thread_run) ( void (*f)(ThreadId tid) );
njn25e49d8e72002-09-23 09:36:25 +00001578
njn810086f2002-11-14 12:42:47 +00001579/* Thread events (not exhaustive) */
sewardjdca84112002-11-13 22:29:34 +00001580
njn810086f2002-11-14 12:42:47 +00001581/* Called during thread create, before the new thread has run any
1582 instructions (or touched any memory). */
1583EV VG_(track_post_thread_create)( void (*f)(ThreadId tid, ThreadId child) );
1584/* Called once the joinee thread is terminated and the joining thread is
1585 about to resume. */
1586EV VG_(track_post_thread_join) ( void (*f)(ThreadId joiner, ThreadId joinee) );
njn25e49d8e72002-09-23 09:36:25 +00001587
njnd5bb0a52002-09-27 10:24:48 +00001588
njn810086f2002-11-14 12:42:47 +00001589/* Mutex events (not exhaustive) */
njn25e49d8e72002-09-23 09:36:25 +00001590
njn810086f2002-11-14 12:42:47 +00001591/* Called before a thread can block while waiting for a mutex (called
1592 regardless of whether the thread will block or not). */
1593EV VG_(track_pre_mutex_lock) ( void (*f)(ThreadId tid,
1594 void* /*pthread_mutex_t* */ mutex) );
1595/* Called once the thread actually holds the mutex (always paired with
1596 pre_mutex_lock). */
1597EV VG_(track_post_mutex_lock) ( void (*f)(ThreadId tid,
1598 void* /*pthread_mutex_t* */ mutex) );
1599/* Called after a thread has released a mutex (no need for a corresponding
1600 pre_mutex_unlock, because unlocking can't block). */
1601EV VG_(track_post_mutex_unlock) ( void (*f)(ThreadId tid,
1602 void* /*pthread_mutex_t* */ mutex) );
njn25e49d8e72002-09-23 09:36:25 +00001603
njn1045b0a2003-02-24 10:42:47 +00001604
1605/* Signal events (not exhaustive) */
1606
1607/* Called before a signal is delivered; `alt_stack' indicates if it is
1608 delivered on an alternative stack. */
1609EV VG_(track_pre_deliver_signal) ( void (*f)(ThreadId tid, Int sigNum,
1610 Bool alt_stack) );
1611/* Called after a signal is delivered. */
1612EV VG_(track_post_deliver_signal) ( void (*f)(ThreadId tid, Int sigNum ) );
1613
1614
1615/* Others... condition variables... */
njn810086f2002-11-14 12:42:47 +00001616/* ... */
1617
1618#undef EV
njn25e49d8e72002-09-23 09:36:25 +00001619
1620/* ------------------------------------------------------------------ */
1621/* Template functions */
1622
1623/* These are the parameterised functions in the core. The default definitions
njnd5bb0a52002-09-27 10:24:48 +00001624 are overridden by LD_PRELOADed skin version. At the very least, a skin
1625 must define the fundamental template functions. Depending on what needs
1626 are set, extra template functions will be used too. Functions are
1627 grouped under the needs that govern their use. */
njn25e49d8e72002-09-23 09:36:25 +00001628
1629
1630/* ------------------------------------------------------------------ */
1631/* Fundamental template functions */
1632
1633/* Initialise skin. Must do the following:
njn810086f2002-11-14 12:42:47 +00001634 - initialise the `details' struct, via the VG_(details_*)() functions
njn25e49d8e72002-09-23 09:36:25 +00001635 - register any helpers called by generated code
1636
1637 May do the following:
njn810086f2002-11-14 12:42:47 +00001638 - initialise the `needs' struct to indicate certain requirements, via
1639 the VG_(needs_*)() functions
1640 - initialise the `track' struct to indicate core events of interest, via
1641 the VG_(track_*)() functions
njn25e49d8e72002-09-23 09:36:25 +00001642 - register any skin-specific profiling events
1643 - any other skin-specific initialisation
1644*/
njn810086f2002-11-14 12:42:47 +00001645extern void SK_(pre_clo_init) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001646
njnd5bb0a52002-09-27 10:24:48 +00001647/* Do initialisation that can only be done after command line processing. */
njn25e49d8e72002-09-23 09:36:25 +00001648extern void SK_(post_clo_init)( void );
1649
1650/* Instrument a basic block. Must be a true function, ie. the same input
1651 always results in the same output, because basic blocks can be
1652 retranslated. Unless you're doing something really strange...
1653 'orig_addr' is the address of the first instruction in the block. */
1654extern UCodeBlock* SK_(instrument) ( UCodeBlock* cb, Addr orig_addr );
1655
1656/* Finish up, print out any results, etc. */
1657extern void SK_(fini) ( void );
1658
1659
1660/* ------------------------------------------------------------------ */
1661/* VG_(needs).report_errors */
1662
1663/* Identify if two errors are equal, or equal enough. `res' indicates how
1664 close is "close enough". `res' should be passed on as necessary, eg. if
njn810086f2002-11-14 12:42:47 +00001665 the Error's `extra' part contains an ExeContext, `res' should be
njn25e49d8e72002-09-23 09:36:25 +00001666 passed to VG_(eq_ExeContext)() if the ExeContexts are considered. Other
1667 than that, probably don't worry about it unless you have lots of very
1668 similar errors occurring.
1669 */
njn810086f2002-11-14 12:42:47 +00001670extern Bool SK_(eq_SkinError) ( VgRes res, Error* e1, Error* e2 );
njn25e49d8e72002-09-23 09:36:25 +00001671
njn43c799e2003-04-08 00:08:52 +00001672/* Print error context. */
1673extern void SK_(pp_SkinError) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001674
njn43c799e2003-04-08 00:08:52 +00001675/* Should fill in any details that could be postponed until after the
njn810086f2002-11-14 12:42:47 +00001676 decision whether to ignore the error (ie. details not affecting the
1677 result of SK_(eq_SkinError)()). This saves time when errors are ignored.
njn25e49d8e72002-09-23 09:36:25 +00001678 Yuk.
njn43c799e2003-04-08 00:08:52 +00001679
1680 Return value: must be the size of the `extra' part in bytes -- used by
1681 the core to make a copy.
njn25e49d8e72002-09-23 09:36:25 +00001682*/
njn43c799e2003-04-08 00:08:52 +00001683extern UInt SK_(update_extra) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001684
njn810086f2002-11-14 12:42:47 +00001685/* Return value indicates recognition. If recognised, must set skind using
1686 VG_(set_supp_kind)(). */
1687extern Bool SK_(recognised_suppression) ( Char* name, Supp* su );
njn25e49d8e72002-09-23 09:36:25 +00001688
njn810086f2002-11-14 12:42:47 +00001689/* Read any extra info for this suppression kind. Most likely for filling
1690 in the `extra' and `string' parts (with VG_(set_supp_{extra,string})())
1691 of a suppression if necessary. Should return False if a syntax error
1692 occurred, True otherwise. */
1693extern Bool SK_(read_extra_suppression_info) ( Int fd, Char* buf, Int nBuf,
1694 Supp* su );
njn25e49d8e72002-09-23 09:36:25 +00001695
1696/* This should just check the kinds match and maybe some stuff in the
njn810086f2002-11-14 12:42:47 +00001697 `string' and `extra' field if appropriate (using VG_(get_supp_*)() to
1698 get the relevant suppression parts). */
njn43c799e2003-04-08 00:08:52 +00001699extern Bool SK_(error_matches_suppression) ( Error* err, Supp* su );
1700
1701/* This should return the suppression name, for --gen-suppressions, or NULL
1702 if that error type cannot be suppressed. This is the inverse of
1703 SK_(recognised_suppression)(). */
1704extern Char* SK_(get_error_name) ( Error* err );
1705
1706/* This should print any extra info for the error, for --gen-suppressions,
1707 including the newline. This is the inverse of
1708 SK_(read_extra_suppression_info)(). */
1709extern void SK_(print_extra_suppression_info) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001710
1711
1712/* ------------------------------------------------------------------ */
1713/* VG_(needs).basic_block_discards */
1714
njnd5bb0a52002-09-27 10:24:48 +00001715/* Should discard any information that pertains to specific basic blocks
1716 or instructions within the address range given. */
njn25e49d8e72002-09-23 09:36:25 +00001717extern void SK_(discard_basic_block_info) ( Addr a, UInt size );
1718
1719
1720/* ------------------------------------------------------------------ */
1721/* VG_(needs).shadow_regs */
1722
1723/* Valid values for general registers and EFLAGS register, for initialising
1724 and updating registers when written in certain places in core. */
1725extern void SK_(written_shadow_regs_values) ( UInt* gen_reg, UInt* eflags );
1726
1727
1728/* ------------------------------------------------------------------ */
1729/* VG_(needs).command_line_options */
1730
njnd5bb0a52002-09-27 10:24:48 +00001731/* Return True if option was recognised. Presumably sets some state to
1732 record the option as well. */
1733extern Bool SK_(process_cmd_line_option) ( Char* argv );
njn25e49d8e72002-09-23 09:36:25 +00001734
njn3e884182003-04-15 13:03:23 +00001735/* Print out command line usage for options for normal skin operation. */
1736extern void SK_(print_usage) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001737
njn3e884182003-04-15 13:03:23 +00001738/* Print out command line usage for options for debugging the skin. */
1739extern void SK_(print_debug_usage) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001740
1741/* ------------------------------------------------------------------ */
1742/* VG_(needs).client_requests */
1743
sewardj34042512002-10-22 04:14:35 +00001744extern Bool SK_(handle_client_request) ( ThreadState* tst, UInt* arg_block, UInt *ret );
njn25e49d8e72002-09-23 09:36:25 +00001745
1746
1747/* ------------------------------------------------------------------ */
1748/* VG_(needs).extends_UCode */
1749
njn4ba5a792002-09-30 10:23:54 +00001750/* Useful to use in VG_(get_Xreg_usage)() */
njn810086f2002-11-14 12:42:47 +00001751#define VG_UINSTR_READS_REG(ono,regs,isWrites) \
njn25e49d8e72002-09-23 09:36:25 +00001752 { if (mycat(u->tag,ono) == tag) \
njn810086f2002-11-14 12:42:47 +00001753 { regs[n] = mycat(u->val,ono); \
1754 isWrites[n] = False; \
njn25e49d8e72002-09-23 09:36:25 +00001755 n++; \
1756 } \
1757 }
njn810086f2002-11-14 12:42:47 +00001758#define VG_UINSTR_WRITES_REG(ono,regs,isWrites) \
njnd5bb0a52002-09-27 10:24:48 +00001759 { if (mycat(u->tag,ono) == tag) \
njn810086f2002-11-14 12:42:47 +00001760 { regs[n] = mycat(u->val,ono); \
1761 isWrites[n] = True; \
njnd5bb0a52002-09-27 10:24:48 +00001762 n++; \
1763 } \
njn25e49d8e72002-09-23 09:36:25 +00001764 }
1765
njn4ba5a792002-09-30 10:23:54 +00001766/* 'X' prefix indicates eXtended UCode. */
njn810086f2002-11-14 12:42:47 +00001767extern Int SK_(get_Xreg_usage) ( UInstr* u, Tag tag, Int* regs,
1768 Bool* isWrites );
njn4ba5a792002-09-30 10:23:54 +00001769extern void SK_(emit_XUInstr) ( UInstr* u, RRegSet regs_live_before );
1770extern Bool SK_(sane_XUInstr) ( Bool beforeRA, Bool beforeLiveness,
njn25e49d8e72002-09-23 09:36:25 +00001771 UInstr* u );
njn4ba5a792002-09-30 10:23:54 +00001772extern Char* SK_(name_XUOpcode) ( Opcode opc );
1773extern void SK_(pp_XUInstr) ( UInstr* u );
njn25e49d8e72002-09-23 09:36:25 +00001774
1775
1776/* ------------------------------------------------------------------ */
1777/* VG_(needs).syscall_wrapper */
1778
1779/* If either of the pre_ functions malloc() something to return, the
1780 * corresponding post_ function had better free() it!
1781 */
1782extern void* SK_( pre_syscall) ( ThreadId tid, UInt syscallno,
1783 Bool is_blocking );
1784extern void SK_(post_syscall) ( ThreadId tid, UInt syscallno,
1785 void* pre_result, Int res,
1786 Bool is_blocking );
1787
njnd5bb0a52002-09-27 10:24:48 +00001788
njn25e49d8e72002-09-23 09:36:25 +00001789/* ---------------------------------------------------------------------
1790 VG_(needs).sanity_checks */
1791
njnd5bb0a52002-09-27 10:24:48 +00001792/* Can be useful for ensuring a skin's correctness. SK_(cheap_sanity_check)
1793 is called very frequently; SK_(expensive_sanity_check) is called less
1794 frequently and can be more involved. */
njn25e49d8e72002-09-23 09:36:25 +00001795extern Bool SK_(cheap_sanity_check) ( void );
1796extern Bool SK_(expensive_sanity_check) ( void );
1797
1798
1799#endif /* NDEF __VG_SKIN_H */
1800
1801/*--------------------------------------------------------------------*/
1802/*--- end vg_skin.h ---*/
1803/*--------------------------------------------------------------------*/
1804