blob: ba163156d75c97b5151b648f5a90adf7944bacd5 [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
daywalker5d945de2003-09-26 00:32:53 +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
daywalker5d945de2003-09-26 00:32:53 +000045/* You should be able to change these options or sizes, recompile, and
njn25e49d8e72002-09-23 09:36:25 +000046 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. */
sewardj989dad92003-07-06 01:52:32 +000053#define VG_N_THREADS 100
njn25e49d8e72002-09-23 09:36:25 +000054
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).
daywalker5d945de2003-09-26 00:32:53 +000061
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.
daywalker5d945de2003-09-26 00:32:53 +000071
njn25e49d8e72002-09-23 09:36:25 +000072 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
njn78adbf42003-07-24 19:35:00 +0000108#include "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*/
njn72718642003-07-24 08:45:32 +0000119#define VG_CORE_INTERFACE_MAJOR_VERSION 3
njn9b007f62003-04-07 14:40:25 +0000120#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
sewardjecf8e102003-07-12 12:11:39 +0000259/* Detect if an address is within Valgrind's stack, Valgrind's
260 m_state_static, or the VG_(threads) array. This is useful for
261 memory leak detectors to rule out spurious pointers to a block. */
njn25e49d8e72002-09-23 09:36:25 +0000262extern Bool VG_(within_stack)(Addr a);
sewardjecf8e102003-07-12 12:11:39 +0000263extern Bool VG_(within_m_state_static_OR_threads)(Addr a);
njn25e49d8e72002-09-23 09:36:25 +0000264
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
njn72718642003-07-24 08:45:32 +0000278/* ThreadIds are simply indices into the VG_(threads)[] array. */
daywalker5d945de2003-09-26 00:32:53 +0000279typedef
280 UInt
njn25e49d8e72002-09-23 09:36:25 +0000281 ThreadId;
282
njn72718642003-07-24 08:45:32 +0000283/* When looking for the current ThreadId, this is the safe option and
284 probably the one you want.
daywalker5d945de2003-09-26 00:32:53 +0000285
njn72718642003-07-24 08:45:32 +0000286 Details: Use this one from non-generated code, eg. from functions called
287 on events like 'new_mem_heap'. In such a case, the "current" thread is
288 temporarily suspended as Valgrind's dispatcher is running. This function
289 is also suitable to be called from generated code (ie. from UCode, or a C
290 function called directly from UCode).
daywalker5d945de2003-09-26 00:32:53 +0000291
njn72718642003-07-24 08:45:32 +0000292 If you use VG_(get_current_tid)() from non-generated code, it will return
293 0 signifying the invalid thread, which is probably not what you want. */
294extern ThreadId VG_(get_current_or_recent_tid) ( void );
njn25e49d8e72002-09-23 09:36:25 +0000295
njn72718642003-07-24 08:45:32 +0000296/* When looking for the current ThreadId, only use this one if you know what
297 you are doing.
daywalker5d945de2003-09-26 00:32:53 +0000298
njn72718642003-07-24 08:45:32 +0000299 Details: Use this one from generated code, eg. from C functions called
300 from UCode. (VG_(get_current_or_recent_tid)() is also suitable in that
301 case.) If you use this function from non-generated code, it will return
302 0 signifying the invalid thread, which is probably not what you want. */
303extern ThreadId VG_(get_current_tid) ( void );
njn25e49d8e72002-09-23 09:36:25 +0000304
njn3e884182003-04-15 13:03:23 +0000305/* Searches through all thread's stacks to see if any match. Returns
njn72718642003-07-24 08:45:32 +0000306 VG_INVALID_THREADID if none match. */
njn3e884182003-04-15 13:03:23 +0000307extern ThreadId VG_(first_matching_thread_stack)
308 ( Bool (*p) ( Addr stack_min, Addr stack_max ));
309
njn25e49d8e72002-09-23 09:36:25 +0000310
311/*====================================================================*/
312/*=== Valgrind's version of libc ===*/
313/*====================================================================*/
314
315/* Valgrind doesn't use libc at all, for good reasons (trust us). So here
316 are its own versions of C library functions, but with VG_ prefixes. Note
317 that the types of some are slightly different to the real ones. Some
njnf4ce3d32003-02-10 10:17:26 +0000318 additional useful functions are provided too; descriptions of how they
319 work are given below. */
njn25e49d8e72002-09-23 09:36:25 +0000320
321#if !defined(NULL)
322# define NULL ((void*)0)
323#endif
324
325
326/* ------------------------------------------------------------------ */
327/* stdio.h
328 *
329 * Note that they all output to the file descriptor given by the
330 * --logfile-fd=N argument, which defaults to 2 (stderr). Hence no
daywalker5d945de2003-09-26 00:32:53 +0000331 * need for VG_(fprintf)().
njn25e49d8e72002-09-23 09:36:25 +0000332 */
sewardj78e3cd92002-10-22 04:45:48 +0000333extern UInt VG_(printf) ( const char *format, ... );
njn25e49d8e72002-09-23 09:36:25 +0000334/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
sewardj78e3cd92002-10-22 04:45:48 +0000335extern UInt VG_(sprintf) ( Char* buf, Char *format, ... );
daywalker5d945de2003-09-26 00:32:53 +0000336extern UInt VG_(vprintf) ( void(*send)(Char),
njn25e49d8e72002-09-23 09:36:25 +0000337 const Char *format, va_list vargs );
338
njn41557122002-10-14 09:25:37 +0000339extern Int VG_(rename) ( Char* old_name, Char* new_name );
340
njn25e49d8e72002-09-23 09:36:25 +0000341/* ------------------------------------------------------------------ */
342/* stdlib.h */
343
344extern void* VG_(malloc) ( Int nbytes );
njnd5bb0a52002-09-27 10:24:48 +0000345extern void VG_(free) ( void* p );
346extern void* VG_(calloc) ( Int n, Int nbytes );
347extern void* VG_(realloc) ( void* p, Int size );
348extern void* VG_(malloc_aligned) ( Int align_bytes, Int nbytes );
njn25e49d8e72002-09-23 09:36:25 +0000349
350extern void VG_(print_malloc_stats) ( void );
351
352
353extern void VG_(exit)( Int status )
354 __attribute__ ((__noreturn__));
njne427a662002-10-02 11:08:25 +0000355/* Prints a panic message (a constant string), appends newline and bug
356 reporting info, aborts. */
357__attribute__ ((__noreturn__))
358extern void VG_(skin_panic) ( Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000359
njnd5bb0a52002-09-27 10:24:48 +0000360/* Looks up VG_(client_envp) */
njn25e49d8e72002-09-23 09:36:25 +0000361extern Char* VG_(getenv) ( Char* name );
362
363/* Crude stand-in for the glibc system() call. */
364extern Int VG_(system) ( Char* cmd );
365
njnd5bb0a52002-09-27 10:24:48 +0000366extern Long VG_(atoll) ( Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000367
368/* Like atoll(), but converts a number of base 2..36 */
369extern Long VG_(atoll36) ( UInt base, Char* str );
370
njne36543a2003-09-30 15:37:24 +0000371/* Like qsort(), but does shell-sort. The size==1/2/4 cases are specialised. */
njnd3b0c5f2003-09-30 14:43:54 +0000372extern void VG_(ssort)( void* base, UInt nmemb, UInt size,
373 Int (*compar)(void*, void*) );
374
njn25e49d8e72002-09-23 09:36:25 +0000375
376/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000377/* ctype.h */
njn25e49d8e72002-09-23 09:36:25 +0000378extern Bool VG_(isspace) ( Char c );
379extern Bool VG_(isdigit) ( Char c );
380extern Char VG_(toupper) ( Char c );
381
382
383/* ------------------------------------------------------------------ */
384/* string.h */
385extern Int VG_(strlen) ( const Char* str );
386extern Char* VG_(strcat) ( Char* dest, const Char* src );
387extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
388extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
389extern Char* VG_(strcpy) ( Char* dest, const Char* src );
390extern Char* VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
391extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
392extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
393extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
394extern Char* VG_(strchr) ( const Char* s, Char c );
395extern Char* VG_(strdup) ( const Char* s);
sewardj7ab2aca2002-10-20 19:40:32 +0000396extern void* VG_(memcpy) ( void *d, const void *s, Int sz );
397extern void* VG_(memset) ( void *s, Int c, Int sz );
njn6d68e792003-02-24 10:49:08 +0000398extern Int VG_(memcmp) ( const void* s1, const void* s2, Int n );
njn25e49d8e72002-09-23 09:36:25 +0000399
njnd5bb0a52002-09-27 10:24:48 +0000400/* Like strcmp() and strncmp(), but stop comparing at any whitespace. */
njn25e49d8e72002-09-23 09:36:25 +0000401extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
njn25e49d8e72002-09-23 09:36:25 +0000402extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
403
daywalker5d945de2003-09-26 00:32:53 +0000404/* Like strncpy(), but if 'src' is longer than 'ndest' inserts a '\0' as the
njnd5bb0a52002-09-27 10:24:48 +0000405 last character. */
njn25e49d8e72002-09-23 09:36:25 +0000406extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
407
408/* Mini-regexp function. Searches for 'pat' in 'str'. Supports
409 * meta-symbols '*' and '?'. '\' escapes meta-symbols. */
njn4ba5a792002-09-30 10:23:54 +0000410extern Bool VG_(string_match) ( Char* pat, Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000411
412
413/* ------------------------------------------------------------------ */
414/* math.h */
njnd5bb0a52002-09-27 10:24:48 +0000415/* Returns the base-2 logarithm of x. */
njn25e49d8e72002-09-23 09:36:25 +0000416extern Int VG_(log2) ( Int x );
417
418
419/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000420/* unistd.h, fcntl.h, sys/stat.h */
sewardj4cf05692002-10-27 20:28:29 +0000421extern Int VG_(getpid) ( void );
422extern Int VG_(getppid) ( void );
jsgf855d93d2003-10-13 22:26:55 +0000423extern Int VG_(getpgrp) ( void );
424extern Int VG_(gettid) ( void );
425extern Int VG_(setpgid) ( Int pid, Int pgrp );
njnd5bb0a52002-09-27 10:24:48 +0000426
njn4aca2d22002-10-04 10:29:38 +0000427extern Int VG_(open) ( const Char* pathname, Int flags, Int mode );
428extern Int VG_(read) ( Int fd, void* buf, Int count);
jsgf855d93d2003-10-13 22:26:55 +0000429extern Int VG_(write) ( Int fd, const void* buf, Int count);
njn4aca2d22002-10-04 10:29:38 +0000430extern void VG_(close) ( Int fd );
njnd5bb0a52002-09-27 10:24:48 +0000431
jsgf855d93d2003-10-13 22:26:55 +0000432extern Int VG_(pipe) ( Int fd[2] );
433
njn41557122002-10-14 09:25:37 +0000434/* Nb: VG_(rename)() declared in stdio.h section above */
njn4aca2d22002-10-04 10:29:38 +0000435extern Int VG_(unlink) ( Char* file_name );
436extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
njnc9d4ba72003-10-15 10:34:03 +0000437extern Int VG_(fstat) ( Int fd, struct vki_stat* buf );
njn25e49d8e72002-09-23 09:36:25 +0000438
njn13f02932003-04-30 20:23:58 +0000439extern Char* VG_(getcwd) ( Char* buf, Int size );
440
njn99ccf082003-09-30 13:51:23 +0000441/* Easier to use than VG_(getcwd)() -- does the buffer fiddling itself.
442 String put into 'cwd' is VG_(malloc)'d, and should be VG_(free)'d.
443 Returns False if it fails. Will fail if the pathname is > 65535 bytes. */
444extern Bool VG_(getcwd_alloc) ( Char** cwd );
njn25e49d8e72002-09-23 09:36:25 +0000445
446/* ------------------------------------------------------------------ */
447/* assert.h */
448/* Asserts permanently enabled -- no turning off with NDEBUG. Hurrah! */
449#define VG__STRING(__str) #__str
450
njne427a662002-10-02 11:08:25 +0000451#define sk_assert(expr) \
njn25e49d8e72002-09-23 09:36:25 +0000452 ((void) ((expr) ? 0 : \
njne427a662002-10-02 11:08:25 +0000453 (VG_(skin_assert_fail) (VG__STRING(expr), \
454 __FILE__, __LINE__, \
455 __PRETTY_FUNCTION__), 0)))
njn25e49d8e72002-09-23 09:36:25 +0000456
njne427a662002-10-02 11:08:25 +0000457__attribute__ ((__noreturn__))
daywalker5d945de2003-09-26 00:32:53 +0000458extern void VG_(skin_assert_fail) ( const Char* expr, const Char* file,
daywalkerdf9ae422003-09-18 01:41:48 +0000459 Int line, const Char* fn );
njn25e49d8e72002-09-23 09:36:25 +0000460
461
462/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000463/* system/mman.h */
daywalker5d945de2003-09-26 00:32:53 +0000464extern void* VG_(mmap)( void* start, UInt length,
njn25e49d8e72002-09-23 09:36:25 +0000465 UInt prot, UInt flags, UInt fd, UInt offset );
466extern Int VG_(munmap)( void* start, Int length );
467
468/* Get memory by anonymous mmap. */
469extern void* VG_(get_memory_from_mmap) ( Int nBytes, Char* who );
470
471
472/* ------------------------------------------------------------------ */
daywalker5d945de2003-09-26 00:32:53 +0000473/* signal.h.
474
njn25e49d8e72002-09-23 09:36:25 +0000475 Note that these use the vk_ (kernel) structure
476 definitions, which are different in places from those that glibc
477 defines -- hence the 'k' prefix. Since we're operating right at the
478 kernel interface, glibc's view of the world is entirely irrelevant. */
479
480/* --- Signal set ops --- */
njnd5bb0a52002-09-27 10:24:48 +0000481extern Int VG_(ksigfillset) ( vki_ksigset_t* set );
482extern Int VG_(ksigemptyset) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000483
njnd5bb0a52002-09-27 10:24:48 +0000484extern Bool VG_(kisfullsigset) ( vki_ksigset_t* set );
485extern Bool VG_(kisemptysigset) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000486
njnd5bb0a52002-09-27 10:24:48 +0000487extern Int VG_(ksigaddset) ( vki_ksigset_t* set, Int signum );
488extern Int VG_(ksigdelset) ( vki_ksigset_t* set, Int signum );
njn25e49d8e72002-09-23 09:36:25 +0000489extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
490
njnd5bb0a52002-09-27 10:24:48 +0000491extern void VG_(ksigaddset_from_set) ( vki_ksigset_t* dst, vki_ksigset_t* src );
492extern void VG_(ksigdelset_from_set) ( vki_ksigset_t* dst, vki_ksigset_t* src );
njn25e49d8e72002-09-23 09:36:25 +0000493
494/* --- Mess with the kernel's sig state --- */
daywalker5d945de2003-09-26 00:32:53 +0000495extern Int VG_(ksigprocmask) ( Int how, const vki_ksigset_t* set,
njn25e49d8e72002-09-23 09:36:25 +0000496 vki_ksigset_t* oldset );
daywalker5d945de2003-09-26 00:32:53 +0000497extern Int VG_(ksigaction) ( Int signum,
498 const vki_ksigaction* act,
njnd5bb0a52002-09-27 10:24:48 +0000499 vki_ksigaction* oldact );
njn25e49d8e72002-09-23 09:36:25 +0000500
jsgf855d93d2003-10-13 22:26:55 +0000501extern Int VG_(ksigtimedwait)( const vki_ksigset_t *, vki_ksiginfo_t *,
502 const struct vki_timespec * );
503
njnd5bb0a52002-09-27 10:24:48 +0000504extern Int VG_(ksignal) ( Int signum, void (*sighandler)(Int) );
505extern Int VG_(ksigaltstack) ( const vki_kstack_t* ss, vki_kstack_t* oss );
njn25e49d8e72002-09-23 09:36:25 +0000506
sewardjdcaf3122002-09-30 23:12:33 +0000507extern Int VG_(kkill) ( Int pid, Int signo );
jsgf855d93d2003-10-13 22:26:55 +0000508extern Int VG_(ktkill) ( Int pid, Int signo );
sewardjdcaf3122002-09-30 23:12:33 +0000509extern Int VG_(ksigpending) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000510
jsgf855d93d2003-10-13 22:26:55 +0000511extern Int VG_(waitpid) ( Int pid, Int *status, Int options );
njn25e49d8e72002-09-23 09:36:25 +0000512
njne7442cf2003-09-30 14:03:21 +0000513/* ------------------------------------------------------------------ */
514/* other, randomly useful functions */
515extern UInt VG_(read_millisecond_timer) ( void );
516
517
njn25e49d8e72002-09-23 09:36:25 +0000518/*====================================================================*/
519/*=== UCode definition ===*/
520/*====================================================================*/
521
sewardje1042472002-09-30 12:33:11 +0000522/* Tags which describe what operands are. Must fit into 4 bits, which
523 they clearly do. */
njn25e49d8e72002-09-23 09:36:25 +0000524typedef
sewardje1042472002-09-30 12:33:11 +0000525enum { TempReg =0, /* virtual temp-reg */
526 ArchReg =1, /* simulated integer reg */
527 ArchRegS =2, /* simulated segment reg */
528 RealReg =3, /* real machine's real reg */
529 SpillNo =4, /* spill slot location */
530 Literal =5, /* literal; .lit32 field has actual value */
531 Lit16 =6, /* literal; .val[123] field has actual value */
532 NoValue =7 /* operand not in use */
533 }
534 Tag;
njn25e49d8e72002-09-23 09:36:25 +0000535
njnd5bb0a52002-09-27 10:24:48 +0000536/* Invalid register numbers (can't be negative) */
njn25e49d8e72002-09-23 09:36:25 +0000537#define INVALID_TEMPREG 999999999
538#define INVALID_REALREG 999999999
539
540/* Microinstruction opcodes. */
541typedef
542 enum {
njnd5bb0a52002-09-27 10:24:48 +0000543 NOP, /* Null op */
njn25e49d8e72002-09-23 09:36:25 +0000544
daywalker7e73e5f2003-07-04 16:18:15 +0000545 LOCK, /* Indicate the existence of a LOCK prefix (functionally NOP) */
sewardj7a5ebcf2002-11-13 22:42:13 +0000546
njnd5bb0a52002-09-27 10:24:48 +0000547 /* Moving values around */
548 GET, PUT, /* simulated register <--> TempReg */
549 GETF, PUTF, /* simulated %eflags <--> TempReg */
550 LOAD, STORE, /* memory <--> TempReg */
551 MOV, /* TempReg <--> TempReg */
552 CMOV, /* Used for cmpxchg and cmov */
njn25e49d8e72002-09-23 09:36:25 +0000553
njnd5bb0a52002-09-27 10:24:48 +0000554 /* Arithmetic/logical ops */
jsgf5efa4fd2003-10-14 21:49:11 +0000555 MUL, UMUL, /* Multiply */
njnd5bb0a52002-09-27 10:24:48 +0000556 ADD, ADC, SUB, SBB, /* Add/subtract (w/wo carry) */
557 AND, OR, XOR, NOT, /* Boolean ops */
558 SHL, SHR, SAR, ROL, ROR, RCL, RCR, /* Shift/rotate (w/wo carry) */
559 NEG, /* Negate */
560 INC, DEC, /* Increment/decrement */
561 BSWAP, /* Big-endian <--> little-endian */
562 CC2VAL, /* Condition code --> 0 or 1 */
563 WIDEN, /* Signed or unsigned widening */
njn25e49d8e72002-09-23 09:36:25 +0000564
njnd5bb0a52002-09-27 10:24:48 +0000565 /* Conditional or unconditional jump */
daywalker5d945de2003-09-26 00:32:53 +0000566 JMP,
njnd5bb0a52002-09-27 10:24:48 +0000567
568 /* FPU ops */
569 FPU, /* Doesn't touch memory */
570 FPU_R, FPU_W, /* Reads/writes memory */
571
sewardj3d7c9c82003-03-26 21:08:13 +0000572 /* ------------ MMX ops ------------ */
sewardj8cec6ee2003-05-18 11:56:39 +0000573 /* In this and the SSE encoding, bytes at higher addresses are
574 held in bits [7:0] in these 16-bit words. I guess this means
575 it is a big-endian encoding. */
sewardj3d7c9c82003-03-26 21:08:13 +0000576
577 /* 1 byte, no memrefs, no iregdefs, copy exactly to the
578 output. Held in val1[7:0]. */
579 MMX1,
580
581 /* 2 bytes, no memrefs, no iregdefs, copy exactly to the
582 output. Held in val1[15:0]. */
583 MMX2,
584
585 /* 3 bytes, no memrefs, no iregdefs, copy exactly to the
586 output. Held in val1[15:0] and val2[7:0]. */
587 MMX3,
588
589 /* 2 bytes, reads/writes mem. Insns of the form
590 bbbbbbbb:mod mmxreg r/m.
591 Held in val1[15:0], and mod and rm are to be replaced
daywalker5d945de2003-09-26 00:32:53 +0000592 at codegen time by a reference to the Temp/RealReg holding
sewardj3d7c9c82003-03-26 21:08:13 +0000593 the address. Arg2 holds this Temp/Real Reg.
594 Transfer is always at size 8.
595 */
596 MMX2_MemRd,
597 MMX2_MemWr,
598
sewardj4fbe6e92003-06-15 21:54:34 +0000599 /* 2 bytes, reads/writes an integer ("E") register. Insns of the form
sewardj3d7c9c82003-03-26 21:08:13 +0000600 bbbbbbbb:11 mmxreg ireg.
601 Held in val1[15:0], and ireg is to be replaced
602 at codegen time by a reference to the relevant RealReg.
603 Transfer is always at size 4. Arg2 holds this Temp/Real Reg.
604 */
sewardj4fbe6e92003-06-15 21:54:34 +0000605 MMX2_ERegRd,
606 MMX2_ERegWr,
sewardj3d7c9c82003-03-26 21:08:13 +0000607
sewardj8cec6ee2003-05-18 11:56:39 +0000608 /* ------------ SSE/SSE2 ops ------------ */
609 /* In the following:
610
sewardjfebaa3b2003-05-25 01:07:34 +0000611 a digit N indicates the next N bytes are to be copied exactly
612 to the output.
sewardj8cec6ee2003-05-18 11:56:39 +0000613
614 'a' indicates a mod-xmmreg-rm byte, where the mod-rm part is
615 to be replaced at codegen time to a Temp/RealReg holding the
616 address.
617
sewardj4fbe6e92003-06-15 21:54:34 +0000618 'e' indicates a byte of the form '11 xmmreg ireg', where ireg
619 is read or written, and is to be replaced at codegen time by
620 a reference to the relevant RealReg. 'e' because it's the E
621 reg in Intel encoding parlance.
sewardj8cec6ee2003-05-18 11:56:39 +0000622
sewardj4fbe6e92003-06-15 21:54:34 +0000623 'g' indicates a byte of the form '11 ireg xmmreg', where ireg
624 is read or written, and is to be replaced at codegen time by
625 a reference to the relevant RealReg. 'g' because it's called
626 G in Intel parlance. */
sewardj8cec6ee2003-05-18 11:56:39 +0000627
628 /* 3 bytes, no memrefs, no iregdefs, copy exactly to the
629 output. Held in val1[15:0] and val2[7:0]. */
630 SSE3,
631
632 /* 3 bytes, reads/writes mem. Insns of the form
633 bbbbbbbb:bbbbbbbb:mod mmxreg r/m.
634 Held in val1[15:0] and val2[7:0], and mod and rm are to be
635 replaced at codegen time by a reference to the Temp/RealReg
636 holding the address. Arg3 holds this Temp/Real Reg.
sewardjfebaa3b2003-05-25 01:07:34 +0000637 Transfer is usually, but not always, at size 16. */
sewardj8cec6ee2003-05-18 11:56:39 +0000638 SSE2a_MemRd,
639 SSE2a_MemWr,
640
641 /* 4 bytes, no memrefs, no iregdefs, copy exactly to the
642 output. Held in val1[15:0] and val2[15:0]. */
643 SSE4,
644
645 /* 4 bytes, reads/writes mem. Insns of the form
646 bbbbbbbb:bbbbbbbb:bbbbbbbb:mod mmxreg r/m.
647 Held in val1[15:0] and val2[15:0], and mod and rm are to be
648 replaced at codegen time by a reference to the Temp/RealReg
649 holding the address. Arg3 holds this Temp/Real Reg.
sewardj9dd209f2003-06-18 23:30:52 +0000650 Transfer is at stated size. */
sewardj8cec6ee2003-05-18 11:56:39 +0000651 SSE3a_MemRd,
652 SSE3a_MemWr,
653
654 /* 4 bytes, reads/writes mem. Insns of the form
655 bbbbbbbb:bbbbbbbb:mod mmxreg r/m:bbbbbbbb
656 Held in val1[15:0] and val2[15:0], and mod and rm are to be
657 replaced at codegen time by a reference to the Temp/RealReg
658 holding the address. Arg3 holds this Temp/Real Reg.
sewardj9dd209f2003-06-18 23:30:52 +0000659 Transfer is at stated size. */
sewardj8cec6ee2003-05-18 11:56:39 +0000660 SSE2a1_MemRd,
sewardj9dd209f2003-06-18 23:30:52 +0000661#if 0
sewardj8cec6ee2003-05-18 11:56:39 +0000662 SSE2a1_MemWr,
sewardj6bc40552003-06-15 01:40:58 +0000663#endif
sewardj8cec6ee2003-05-18 11:56:39 +0000664 /* 4 bytes, writes an integer register. Insns of the form
sewardj4fbe6e92003-06-15 21:54:34 +0000665 bbbbbbbb:bbbbbbbb:bbbbbbbb:11 ireg bbb.
sewardj8cec6ee2003-05-18 11:56:39 +0000666 Held in val1[15:0] and val2[15:0], and ireg is to be replaced
667 at codegen time by a reference to the relevant RealReg.
668 Transfer is always at size 4. Arg3 holds this Temp/Real Reg.
669 */
670 SSE3g_RegWr,
671
sewardjb31b06d2003-06-13 00:26:02 +0000672 /* 5 bytes, writes an integer register. Insns of the form
673 bbbbbbbb:bbbbbbbb:bbbbbbbb: 11 ireg bbb :bbbbbbbb. Held in
674 val1[15:0] and val2[15:0] and lit32[7:0], and ireg is to be
675 replaced at codegen time by a reference to the relevant
676 RealReg. Transfer is always at size 4. Arg3 holds this
677 Temp/Real Reg.
678 */
679 SSE3g1_RegWr,
680
sewardj4fbe6e92003-06-15 21:54:34 +0000681 /* 4 bytes, reads an integer register. Insns of the form
682 bbbbbbbb:bbbbbbbb:bbbbbbbb:11 bbb ireg.
683 Held in val1[15:0] and val2[15:0], and ireg is to be replaced
684 at codegen time by a reference to the relevant RealReg.
685 Transfer is always at size 4. Arg3 holds this Temp/Real Reg.
686 */
687 SSE3e_RegRd,
sewardjabf8bf82003-06-15 22:28:05 +0000688 SSE3e_RegWr, /* variant that writes Ereg, not reads it */
sewardj4fbe6e92003-06-15 21:54:34 +0000689
sewardjb31b06d2003-06-13 00:26:02 +0000690 /* 5 bytes, reads an integer register. Insns of the form
691 bbbbbbbb:bbbbbbbb:bbbbbbbb: 11 bbb ireg :bbbbbbbb. Held in
692 val1[15:0] and val2[15:0] and lit32[7:0], and ireg is to be
693 replaced at codegen time by a reference to the relevant
694 RealReg. Transfer is always at size 4. Arg3 holds this
695 Temp/Real Reg.
696 */
sewardj4fbe6e92003-06-15 21:54:34 +0000697 SSE3e1_RegRd,
sewardj8cec6ee2003-05-18 11:56:39 +0000698
sewardj02af6bc2003-06-12 00:56:06 +0000699 /* 4 bytes, reads memory, writes an integer register, but is
700 nevertheless an SSE insn. The insn is of the form
701 bbbbbbbb:bbbbbbbb:bbbbbbbb:mod ireg rm where mod indicates
702 memory (ie is not 11b) and ireg is the int reg written. The
sewardje3891fa2003-06-15 03:13:48 +0000703 first 4 bytes are held in lit32[31:0] since there is
sewardj02af6bc2003-06-12 00:56:06 +0000704 insufficient space elsewhere. mod and rm are to be replaced
705 at codegen time by a reference to the Temp/RealReg holding
706 the address. Arg1 holds this Temp/RealReg. ireg is to be
707 replaced at codegen time by a reference to the relevant
708 RealReg in which the answer is to be written. Arg2 holds
709 this Temp/RealReg. Transfer to the destination reg is always
710 at size 4. However the memory read can be at sizes 4 or 8
sewardje3891fa2003-06-15 03:13:48 +0000711 and so this is what the sz field holds. Note that the 4th
712 byte of the instruction (the modrm byte) is redundant, but we
713 store it anyway so as to be consistent with all other SSE
714 uinstrs.
sewardj02af6bc2003-06-12 00:56:06 +0000715 */
716 SSE3ag_MemRd_RegWr,
sewardje3891fa2003-06-15 03:13:48 +0000717
sewardj8cec6ee2003-05-18 11:56:39 +0000718 /* 5 bytes, no memrefs, no iregdefs, copy exactly to the
719 output. Held in val1[15:0], val2[15:0] and val3[7:0]. */
720 SSE5,
sewardj6bc40552003-06-15 01:40:58 +0000721#if 0
sewardj8cec6ee2003-05-18 11:56:39 +0000722 /* 5 bytes, reads/writes mem. Insns of the form
723 bbbbbbbb:bbbbbbbb:bbbbbbbb:mod mmxreg r/m:bbbbbbbb
daywalker5d945de2003-09-26 00:32:53 +0000724 Held in val1[15:0], val2[15:0], lit32[7:0].
725 mod and rm are to be replaced at codegen time by a reference
726 to the Temp/RealReg holding the address. Arg3 holds this
sewardj8cec6ee2003-05-18 11:56:39 +0000727 Temp/Real Reg. Transfer is always at size 16. */
728 SSE3a1_MemRd,
729 SSE3a1_MemWr,
sewardj6bc40552003-06-15 01:40:58 +0000730#endif
sewardj3d7c9c82003-03-26 21:08:13 +0000731 /* ------------------------ */
732
njnd5bb0a52002-09-27 10:24:48 +0000733 /* Not strictly needed, but improve address calculation translations. */
njn25e49d8e72002-09-23 09:36:25 +0000734 LEA1, /* reg2 := const + reg1 */
735 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
736
sewardj8cec6ee2003-05-18 11:56:39 +0000737 /* Hack for x86 REP insns. Jump to literal if TempReg/RealReg
738 is zero. */
njnd5bb0a52002-09-27 10:24:48 +0000739 JIFZ,
njn25e49d8e72002-09-23 09:36:25 +0000740
njnd5bb0a52002-09-27 10:24:48 +0000741 /* Advance the simulated %eip by some small (< 128) number. */
742 INCEIP,
njn25e49d8e72002-09-23 09:36:25 +0000743
sewardje1042472002-09-30 12:33:11 +0000744 /* Dealing with segment registers */
745 GETSEG, PUTSEG, /* simulated segment register <--> TempReg */
746 USESEG, /* (LDT/GDT index, virtual addr) --> linear addr */
747
njnd5bb0a52002-09-27 10:24:48 +0000748 /* Not for translating x86 calls -- only to call helpers */
749 CALLM_S, CALLM_E, /* Mark start/end of CALLM push/pop sequence */
750 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers */
751 CALLM, /* Call assembly-code helper */
752
753 /* Not for translating x86 calls -- only to call C helper functions of
754 up to three arguments (or two if the functions has a return value).
755 Arguments and return value must be word-sized. More arguments can
756 be faked with global variables (eg. use VG_(set_global_var)()).
757
758 Seven possibilities: 'arg[123]' show where args go, 'ret' shows
759 where return value goes (if present).
daywalker5d945de2003-09-26 00:32:53 +0000760
njn25e49d8e72002-09-23 09:36:25 +0000761 CCALL(-, -, - ) void f(void)
762 CCALL(arg1, -, - ) void f(UInt arg1)
763 CCALL(arg1, arg2, - ) void f(UInt arg1, UInt arg2)
764 CCALL(arg1, arg2, arg3) void f(UInt arg1, UInt arg2, UInt arg3)
765 CCALL(-, -, ret ) UInt f(UInt)
766 CCALL(arg1, -, ret ) UInt f(UInt arg1)
njnd5bb0a52002-09-27 10:24:48 +0000767 CCALL(arg1, arg2, ret ) UInt f(UInt arg1, UInt arg2) */
njn25e49d8e72002-09-23 09:36:25 +0000768 CCALL,
769
njnd5bb0a52002-09-27 10:24:48 +0000770 /* This opcode makes it easy for skins that extend UCode to do this to
771 avoid opcode overlap:
njn25e49d8e72002-09-23 09:36:25 +0000772
daywalker5d945de2003-09-26 00:32:53 +0000773 enum { EU_OP1 = DUMMY_FINAL_UOPCODE + 1, ... }
774
njn25e49d8e72002-09-23 09:36:25 +0000775 WARNING: Do not add new opcodes after this one! They can be added
776 before, though. */
777 DUMMY_FINAL_UOPCODE
778 }
779 Opcode;
780
781
njnd5bb0a52002-09-27 10:24:48 +0000782/* Condition codes, using the Intel encoding. CondAlways is an extra. */
njn25e49d8e72002-09-23 09:36:25 +0000783typedef
784 enum {
785 CondO = 0, /* overflow */
786 CondNO = 1, /* no overflow */
787 CondB = 2, /* below */
788 CondNB = 3, /* not below */
789 CondZ = 4, /* zero */
790 CondNZ = 5, /* not zero */
791 CondBE = 6, /* below or equal */
792 CondNBE = 7, /* not below or equal */
793 CondS = 8, /* negative */
sewardje1042472002-09-30 12:33:11 +0000794 CondNS = 9, /* not negative */
njn25e49d8e72002-09-23 09:36:25 +0000795 CondP = 10, /* parity even */
796 CondNP = 11, /* not parity even */
797 CondL = 12, /* jump less */
798 CondNL = 13, /* not less */
799 CondLE = 14, /* less or equal */
800 CondNLE = 15, /* not less or equal */
801 CondAlways = 16 /* Jump always */
daywalker5d945de2003-09-26 00:32:53 +0000802 }
njn25e49d8e72002-09-23 09:36:25 +0000803 Condcode;
804
805
806/* Descriptions of additional properties of *unconditional* jumps. */
807typedef
808 enum {
809 JmpBoring=0, /* boring unconditional jump */
810 JmpCall=1, /* jump due to an x86 call insn */
811 JmpRet=2, /* jump due to an x86 ret insn */
812 JmpSyscall=3, /* do a system call, then jump */
813 JmpClientReq=4 /* do a client request, then jump */
814 }
815 JmpKind;
816
817
818/* Flags. User-level code can only read/write O(verflow), S(ign),
819 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
820 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
daywalker5d945de2003-09-26 00:32:53 +0000821 thusly:
njn25e49d8e72002-09-23 09:36:25 +0000822 76543210
823 DOSZACP
824 and bit 7 must always be zero since it is unused.
sewardj2370f3b2002-11-30 15:01:01 +0000825
826 Note: these Flag? values are **not** the positions in the actual
827 %eflags register. */
828
njn25e49d8e72002-09-23 09:36:25 +0000829typedef UChar FlagSet;
830
831#define FlagD (1<<6)
832#define FlagO (1<<5)
833#define FlagS (1<<4)
834#define FlagZ (1<<3)
835#define FlagA (1<<2)
836#define FlagC (1<<1)
837#define FlagP (1<<0)
838
839#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
840#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
841#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
842#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
843#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
844#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
845#define FlagsZCP ( FlagZ | FlagC | FlagP)
846#define FlagsOC (FlagO | FlagC )
847#define FlagsAC ( FlagA | FlagC )
848
849#define FlagsALL (FlagsOSZACP | FlagD)
850#define FlagsEmpty (FlagSet)0
851
852
sewardj2370f3b2002-11-30 15:01:01 +0000853/* flag positions in eflags */
854#define EFlagC (1 << 0) /* carry */
855#define EFlagP (1 << 2) /* parity */
sewardjfa492d42002-12-08 18:20:01 +0000856#define EFlagA (1 << 4) /* aux carry */
sewardj2370f3b2002-11-30 15:01:01 +0000857#define EFlagZ (1 << 6) /* zero */
858#define EFlagS (1 << 7) /* sign */
sewardjfa492d42002-12-08 18:20:01 +0000859#define EFlagD (1 << 10) /* direction */
sewardj2370f3b2002-11-30 15:01:01 +0000860#define EFlagO (1 << 11) /* overflow */
861
njn25e49d8e72002-09-23 09:36:25 +0000862/* Liveness of general purpose registers, useful for code generation.
863 Reg rank order 0..N-1 corresponds to bits 0..N-1, ie. first
864 reg's liveness in bit 0, last reg's in bit N-1. Note that
865 these rankings don't match the Intel register ordering. */
866typedef UInt RRegSet;
867
868#define ALL_RREGS_DEAD 0 /* 0000...00b */
njne7c258c2002-10-03 08:57:01 +0000869#define ALL_RREGS_LIVE ((1 << VG_MAX_REALREGS)-1) /* 0011...11b */
njn25e49d8e72002-09-23 09:36:25 +0000870#define UNIT_RREGSET(rank) (1 << (rank))
871
872#define IS_RREG_LIVE(rank,rregs_live) (rregs_live & UNIT_RREGSET(rank))
873#define SET_RREG_LIVENESS(rank,rregs_live,b) \
874 do { RRegSet unit = UNIT_RREGSET(rank); \
875 if (b) rregs_live |= unit; \
876 else rregs_live &= ~unit; \
877 } while(0)
878
879
880/* A Micro (u)-instruction. */
881typedef
882 struct {
883 /* word 1 */
884 UInt lit32; /* 32-bit literal */
885
886 /* word 2 */
887 UShort val1; /* first operand */
888 UShort val2; /* second operand */
889
890 /* word 3 */
891 UShort val3; /* third operand */
892 UChar opcode; /* opcode */
893 UChar size; /* data transfer size */
894
895 /* word 4 */
896 FlagSet flags_r; /* :: FlagSet */
897 FlagSet flags_w; /* :: FlagSet */
898 UChar tag1:4; /* first operand tag */
899 UChar tag2:4; /* second operand tag */
900 UChar tag3:4; /* third operand tag */
901 UChar extra4b:4; /* Spare field, used by WIDEN for src
902 -size, and by LEA2 for scale (1,2,4 or 8),
903 and by JMPs for original x86 instr size */
904
905 /* word 5 */
906 UChar cond; /* condition, for jumps */
907 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
908 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
909
daywalker5d945de2003-09-26 00:32:53 +0000910 /* Additional properties for UInstrs that call C functions:
njn25e49d8e72002-09-23 09:36:25 +0000911 - CCALL
912 - PUT (when %ESP is the target)
913 - possibly skin-specific UInstrs
914 */
915 UChar argc:2; /* Number of args, max 3 */
916 UChar regparms_n:2; /* Number of args passed in registers */
917 Bool has_ret_val:1; /* Function has return value? */
918
919 /* RealReg liveness; only sensical after reg alloc and liveness
920 analysis done. This info is a little bit arch-specific --
921 VG_MAX_REALREGS can vary on different architectures. Note that
922 to use this information requires converting between register ranks
njn4ba5a792002-09-30 10:23:54 +0000923 and the Intel register numbers, using VG_(realreg_to_rank)()
924 and/or VG_(rank_to_realreg)() */
daywalker5d945de2003-09-26 00:32:53 +0000925 RRegSet regs_live_after:VG_MAX_REALREGS;
njn25e49d8e72002-09-23 09:36:25 +0000926 }
927 UInstr;
928
929
daywalker5d945de2003-09-26 00:32:53 +0000930typedef
njn810086f2002-11-14 12:42:47 +0000931 struct _UCodeBlock
njn25e49d8e72002-09-23 09:36:25 +0000932 UCodeBlock;
933
njn810086f2002-11-14 12:42:47 +0000934extern Int VG_(get_num_instrs) (UCodeBlock* cb);
935extern Int VG_(get_num_temps) (UCodeBlock* cb);
njn25e49d8e72002-09-23 09:36:25 +0000936
njn810086f2002-11-14 12:42:47 +0000937extern UInstr* VG_(get_instr) (UCodeBlock* cb, Int i);
938extern UInstr* VG_(get_last_instr) (UCodeBlock* cb);
daywalker5d945de2003-09-26 00:32:53 +0000939
njn211b6ad2003-02-03 12:33:31 +0000940
njn25e49d8e72002-09-23 09:36:25 +0000941/*====================================================================*/
942/*=== Instrumenting UCode ===*/
943/*====================================================================*/
944
njnf4ce3d32003-02-10 10:17:26 +0000945/* Maximum number of registers read or written by a single UInstruction. */
946#define VG_MAX_REGS_USED 3
njn25e49d8e72002-09-23 09:36:25 +0000947
njnf4ce3d32003-02-10 10:17:26 +0000948/* Find what this instruction does to its regs, useful for
949 analysis/optimisation passes. `tag' indicates whether we're considering
950 TempRegs (pre-reg-alloc) or RealRegs (post-reg-alloc). `regs' is filled
951 with the affected register numbers, `isWrites' parallels it and indicates
952 if the reg is read or written. If a reg is read and written, it will
953 appear twice in `regs'. `regs' and `isWrites' must be able to fit
954 VG_MAX_REGS_USED elements. */
njn810086f2002-11-14 12:42:47 +0000955extern Int VG_(get_reg_usage) ( UInstr* u, Tag tag, Int* regs, Bool* isWrites );
njn25e49d8e72002-09-23 09:36:25 +0000956
957
njnd5bb0a52002-09-27 10:24:48 +0000958/* Used to register helper functions to be called from generated code. A
959 limited number of compact helpers can be registered; the code generated
960 to call them is slightly shorter -- so register the mostly frequently
961 called helpers as compact. */
njn25e49d8e72002-09-23 09:36:25 +0000962extern void VG_(register_compact_helper) ( Addr a );
963extern void VG_(register_noncompact_helper) ( Addr a );
964
965
966/* ------------------------------------------------------------------ */
967/* Virtual register allocation */
968
969/* Get a new virtual register */
njn4ba5a792002-09-30 10:23:54 +0000970extern Int VG_(get_new_temp) ( UCodeBlock* cb );
njn25e49d8e72002-09-23 09:36:25 +0000971
972/* Get a new virtual shadow register */
njn4ba5a792002-09-30 10:23:54 +0000973extern Int VG_(get_new_shadow) ( UCodeBlock* cb );
njn25e49d8e72002-09-23 09:36:25 +0000974
975/* Get a virtual register's corresponding virtual shadow register */
976#define SHADOW(tempreg) ((tempreg)+1)
977
978
979/* ------------------------------------------------------------------ */
980/* Low-level UInstr builders */
njn4ba5a792002-09-30 10:23:54 +0000981extern void VG_(new_NOP) ( UInstr* u );
982extern void VG_(new_UInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
983extern void VG_(new_UInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000984 Tag tag1, UInt val1 );
njn4ba5a792002-09-30 10:23:54 +0000985extern void VG_(new_UInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000986 Tag tag1, UInt val1,
987 Tag tag2, UInt val2 );
njn4ba5a792002-09-30 10:23:54 +0000988extern void VG_(new_UInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000989 Tag tag1, UInt val1,
990 Tag tag2, UInt val2,
991 Tag tag3, UInt val3 );
njn25e49d8e72002-09-23 09:36:25 +0000992
daywalker5d945de2003-09-26 00:32:53 +0000993/* Set read/write/undefined flags. Undefined flags are treaten as written,
njn810086f2002-11-14 12:42:47 +0000994 but it's worth keeping them logically distinct. */
995extern void VG_(set_flag_fields) ( UCodeBlock* cb, FlagSet fr, FlagSet fw,
996 FlagSet fu);
njn4ba5a792002-09-30 10:23:54 +0000997extern void VG_(set_lit_field) ( UCodeBlock* cb, UInt lit32 );
998extern void VG_(set_ccall_fields) ( UCodeBlock* cb, Addr fn, UChar argc,
999 UChar regparms_n, Bool has_ret_val );
njn810086f2002-11-14 12:42:47 +00001000extern void VG_(set_cond_field) ( UCodeBlock* cb, Condcode code );
njn25e49d8e72002-09-23 09:36:25 +00001001
njn4ba5a792002-09-30 10:23:54 +00001002extern void VG_(copy_UInstr) ( UCodeBlock* cb, UInstr* instr );
1003
1004extern Bool VG_(any_flag_use)( UInstr* u );
njn25e49d8e72002-09-23 09:36:25 +00001005
njnac6c1762002-10-04 14:34:15 +00001006/* Macro versions of the above; just shorter to type. */
1007#define uInstr0 VG_(new_UInstr0)
1008#define uInstr1 VG_(new_UInstr1)
1009#define uInstr2 VG_(new_UInstr2)
1010#define uInstr3 VG_(new_UInstr3)
1011#define uLiteral VG_(set_lit_field)
1012#define uCCall VG_(set_ccall_fields)
njn810086f2002-11-14 12:42:47 +00001013#define uCond VG_(set_cond_field)
1014#define uFlagsRWU VG_(set_flag_fields)
njnac6c1762002-10-04 14:34:15 +00001015#define newTemp VG_(get_new_temp)
1016#define newShadow VG_(get_new_shadow)
1017
njn25e49d8e72002-09-23 09:36:25 +00001018/* Refer to `the last instruction stuffed in' (can be lvalue). */
1019#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
1020
1021
1022/* ------------------------------------------------------------------ */
1023/* Higher-level UInstr sequence builders */
njn4ba5a792002-09-30 10:23:54 +00001024extern void VG_(call_helper_0_0) ( UCodeBlock* cb, Addr f);
1025extern void VG_(call_helper_1_0) ( UCodeBlock* cb, Addr f, UInt arg1,
1026 UInt regparms_n);
1027extern void VG_(call_helper_2_0) ( UCodeBlock* cb, Addr f, UInt arg1, UInt arg2,
1028 UInt regparms_n);
njn25e49d8e72002-09-23 09:36:25 +00001029
1030/* One way around the 3-arg C function limit is to pass args via global
njn6fefa1b2003-02-24 10:32:51 +00001031 * variables... ugly, but it works. This one puts a literal in there. */
njn4ba5a792002-09-30 10:23:54 +00001032extern void VG_(set_global_var) ( UCodeBlock* cb, Addr globvar_ptr, UInt val);
njn25e49d8e72002-09-23 09:36:25 +00001033
njn6fefa1b2003-02-24 10:32:51 +00001034/* This one puts the contents of a TempReg in the global variable. */
1035extern void VG_(set_global_var_tempreg) ( UCodeBlock* cb, Addr globvar_ptr,
1036 UInt t_val);
1037
njn25e49d8e72002-09-23 09:36:25 +00001038/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +00001039/* Allocating/freeing basic blocks of UCode */
njn810086f2002-11-14 12:42:47 +00001040extern UCodeBlock* VG_(setup_UCodeBlock) ( UCodeBlock* cb );
njn4ba5a792002-09-30 10:23:54 +00001041extern void VG_(free_UCodeBlock) ( UCodeBlock* cb );
njnd5bb0a52002-09-27 10:24:48 +00001042
1043/* ------------------------------------------------------------------ */
daywalker5d945de2003-09-26 00:32:53 +00001044/* UCode pretty/ugly printing. Probably only useful to call from a skin
njn25e49d8e72002-09-23 09:36:25 +00001045 if VG_(needs).extended_UCode == True. */
1046
1047/* When True, all generated code is/should be printed. */
1048extern Bool VG_(print_codegen);
1049
njn4ba5a792002-09-30 10:23:54 +00001050/* Pretty/ugly printing functions */
1051extern void VG_(pp_UCodeBlock) ( UCodeBlock* cb, Char* title );
1052extern void VG_(pp_UInstr) ( Int instrNo, UInstr* u );
1053extern void VG_(pp_UInstr_regs) ( Int instrNo, UInstr* u );
1054extern void VG_(up_UInstr) ( Int instrNo, UInstr* u );
1055extern Char* VG_(name_UOpcode) ( Bool upper, Opcode opc );
njn563f96f2003-02-03 11:17:46 +00001056extern Char* VG_(name_UCondcode) ( Condcode cond );
daywalker5d945de2003-09-26 00:32:53 +00001057extern void VG_(pp_UOperand) ( UInstr* u, Int operandNo,
njn4ba5a792002-09-30 10:23:54 +00001058 Int sz, Bool parens );
njn25e49d8e72002-09-23 09:36:25 +00001059
njnb93d1782003-02-03 12:03:22 +00001060/* ------------------------------------------------------------------ */
njnf4ce3d32003-02-10 10:17:26 +00001061/* Accessing archregs and their shadows */
1062extern UInt VG_(get_archreg) ( UInt archreg );
1063extern UInt VG_(get_thread_archreg) ( ThreadId tid, UInt archreg );
1064
njnb93d1782003-02-03 12:03:22 +00001065extern UInt VG_(get_shadow_archreg) ( UInt archreg );
1066extern void VG_(set_shadow_archreg) ( UInt archreg, UInt val );
njnd3040452003-05-19 15:04:06 +00001067extern void VG_(set_shadow_eflags) ( UInt val );
njnb93d1782003-02-03 12:03:22 +00001068extern Addr VG_(shadow_archreg_address) ( UInt archreg );
njn25e49d8e72002-09-23 09:36:25 +00001069
njnf4ce3d32003-02-10 10:17:26 +00001070extern UInt VG_(get_thread_shadow_archreg) ( ThreadId tid, UInt archreg );
1071extern void VG_(set_thread_shadow_archreg) ( ThreadId tid, UInt archreg,
1072 UInt val );
njn211b6ad2003-02-03 12:33:31 +00001073
1074/* ------------------------------------------------------------------ */
1075/* Offsets of addresses of helper functions. A "helper" function is one
1076 which is called from generated code via CALLM. */
1077
1078extern Int VGOFF_(helper_idiv_64_32);
1079extern Int VGOFF_(helper_div_64_32);
1080extern Int VGOFF_(helper_idiv_32_16);
1081extern Int VGOFF_(helper_div_32_16);
1082extern Int VGOFF_(helper_idiv_16_8);
1083extern Int VGOFF_(helper_div_16_8);
1084
1085extern Int VGOFF_(helper_imul_32_64);
1086extern Int VGOFF_(helper_mul_32_64);
1087extern Int VGOFF_(helper_imul_16_32);
1088extern Int VGOFF_(helper_mul_16_32);
1089extern Int VGOFF_(helper_imul_8_16);
1090extern Int VGOFF_(helper_mul_8_16);
1091
1092extern Int VGOFF_(helper_CLD);
1093extern Int VGOFF_(helper_STD);
1094extern Int VGOFF_(helper_get_dirflag);
1095
1096extern Int VGOFF_(helper_CLC);
1097extern Int VGOFF_(helper_STC);
1098
1099extern Int VGOFF_(helper_shldl);
1100extern Int VGOFF_(helper_shldw);
1101extern Int VGOFF_(helper_shrdl);
1102extern Int VGOFF_(helper_shrdw);
1103
1104extern Int VGOFF_(helper_RDTSC);
1105extern Int VGOFF_(helper_CPUID);
1106
daywalkerb18d2532003-09-27 20:15:01 +00001107extern Int VGOFF_(helper_IN);
1108extern Int VGOFF_(helper_OUT);
1109
njn211b6ad2003-02-03 12:33:31 +00001110extern Int VGOFF_(helper_bsf);
1111extern Int VGOFF_(helper_bsr);
1112
1113extern Int VGOFF_(helper_fstsw_AX);
1114extern Int VGOFF_(helper_SAHF);
njnd6251f12003-06-03 13:38:51 +00001115extern Int VGOFF_(helper_LAHF);
njn211b6ad2003-02-03 12:33:31 +00001116extern Int VGOFF_(helper_DAS);
1117extern Int VGOFF_(helper_DAA);
1118
1119
njn25e49d8e72002-09-23 09:36:25 +00001120/*====================================================================*/
njnd5bb0a52002-09-27 10:24:48 +00001121/*=== Generating x86 code from UCode ===*/
njn25e49d8e72002-09-23 09:36:25 +00001122/*====================================================================*/
1123
njnd5bb0a52002-09-27 10:24:48 +00001124/* All this only necessary for skins with VG_(needs).extends_UCode == True. */
njn25e49d8e72002-09-23 09:36:25 +00001125
sewardje1042472002-09-30 12:33:11 +00001126/* This is the Intel register encoding -- integer regs. */
njn25e49d8e72002-09-23 09:36:25 +00001127#define R_EAX 0
1128#define R_ECX 1
1129#define R_EDX 2
1130#define R_EBX 3
1131#define R_ESP 4
1132#define R_EBP 5
1133#define R_ESI 6
1134#define R_EDI 7
1135
1136#define R_AL (0+R_EAX)
1137#define R_CL (0+R_ECX)
1138#define R_DL (0+R_EDX)
1139#define R_BL (0+R_EBX)
1140#define R_AH (4+R_EAX)
1141#define R_CH (4+R_ECX)
1142#define R_DH (4+R_EDX)
1143#define R_BH (4+R_EBX)
1144
sewardje1042472002-09-30 12:33:11 +00001145/* This is the Intel register encoding -- segment regs. */
1146#define R_ES 0
1147#define R_CS 1
1148#define R_SS 2
1149#define R_DS 3
1150#define R_FS 4
1151#define R_GS 5
1152
njn25e49d8e72002-09-23 09:36:25 +00001153/* For pretty printing x86 code */
daywalker5d945de2003-09-26 00:32:53 +00001154extern const Char* VG_(name_of_mmx_gran) ( UChar gran );
1155extern const Char* VG_(name_of_mmx_reg) ( Int mmxreg );
1156extern const Char* VG_(name_of_seg_reg) ( Int sreg );
1157extern const Char* VG_(name_of_int_reg) ( Int size, Int reg );
1158extern const Char VG_(name_of_int_size) ( Int size );
njn25e49d8e72002-09-23 09:36:25 +00001159
njnac6c1762002-10-04 14:34:15 +00001160/* Shorter macros for convenience */
sewardj3d7c9c82003-03-26 21:08:13 +00001161#define nameIReg VG_(name_of_int_reg)
1162#define nameISize VG_(name_of_int_size)
1163#define nameSReg VG_(name_of_seg_reg)
1164#define nameMMXReg VG_(name_of_mmx_reg)
1165#define nameMMXGran VG_(name_of_mmx_gran)
sewardjfebaa3b2003-05-25 01:07:34 +00001166#define nameXMMReg VG_(name_of_xmm_reg)
njnac6c1762002-10-04 14:34:15 +00001167
njn25e49d8e72002-09-23 09:36:25 +00001168/* Randomly useful things */
1169extern UInt VG_(extend_s_8to32) ( UInt x );
1170
1171/* Code emitters */
njn4ba5a792002-09-30 10:23:54 +00001172extern void VG_(emitB) ( UInt b );
1173extern void VG_(emitW) ( UInt w );
1174extern void VG_(emitL) ( UInt l );
sewardjfa492d42002-12-08 18:20:01 +00001175extern void VG_(new_emit) ( Bool upd_cc, FlagSet uses_flags, FlagSet sets_flags );
njn25e49d8e72002-09-23 09:36:25 +00001176
1177/* Finding offsets */
njn4ba5a792002-09-30 10:23:54 +00001178extern Int VG_(helper_offset) ( Addr a );
1179extern Int VG_(shadow_reg_offset) ( Int arch );
1180extern Int VG_(shadow_flags_offset) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001181
njnd5bb0a52002-09-27 10:24:48 +00001182/* Convert reg ranks <-> Intel register ordering, for using register
1183 liveness information. */
njn4ba5a792002-09-30 10:23:54 +00001184extern Int VG_(realreg_to_rank) ( Int realreg );
1185extern Int VG_(rank_to_realreg) ( Int rank );
njn25e49d8e72002-09-23 09:36:25 +00001186
njnd5bb0a52002-09-27 10:24:48 +00001187/* Call a subroutine. Does no argument passing, stack manipulations, etc. */
daywalker5d945de2003-09-26 00:32:53 +00001188extern void VG_(synth_call) ( Bool ensure_shortform, Int word_offset,
sewardjfa492d42002-12-08 18:20:01 +00001189 Bool upd_cc, FlagSet use_flags, FlagSet set_flags );
njn25e49d8e72002-09-23 09:36:25 +00001190
njnd5bb0a52002-09-27 10:24:48 +00001191/* For calling C functions -- saves caller save regs, pushes args, calls,
1192 clears the stack, restores caller save regs. `fn' must be registered in
1193 the baseBlock first. Acceptable tags are RealReg and Literal. Optimises
1194 things, eg. by not preserving non-live caller-save registers.
njn25e49d8e72002-09-23 09:36:25 +00001195
njnd5bb0a52002-09-27 10:24:48 +00001196 WARNING: a UInstr should *not* be translated with synth_ccall() followed
1197 by some other x86 assembly code; this will invalidate the results of
1198 vg_realreg_liveness_analysis() and everything will fall over. */
njn4ba5a792002-09-30 10:23:54 +00001199extern void VG_(synth_ccall) ( Addr fn, Int argc, Int regparms_n, UInt argv[],
daywalker5d945de2003-09-26 00:32:53 +00001200 Tag tagv[], Int ret_reg,
njn4ba5a792002-09-30 10:23:54 +00001201 RRegSet regs_live_before,
1202 RRegSet regs_live_after );
njn25e49d8e72002-09-23 09:36:25 +00001203
1204/* Addressing modes */
njn4ba5a792002-09-30 10:23:54 +00001205extern void VG_(emit_amode_offregmem_reg)( Int off, Int regmem, Int reg );
1206extern void VG_(emit_amode_ereg_greg) ( Int e_reg, Int g_reg );
njn25e49d8e72002-09-23 09:36:25 +00001207
1208/* v-size (4, or 2 with OSO) insn emitters */
njn4ba5a792002-09-30 10:23:54 +00001209extern void VG_(emit_movv_offregmem_reg) ( Int sz, Int off, Int areg, Int reg );
1210extern void VG_(emit_movv_reg_offregmem) ( Int sz, Int reg, Int off, Int areg );
1211extern void VG_(emit_movv_reg_reg) ( Int sz, Int reg1, Int reg2 );
sewardjfa492d42002-12-08 18:20:01 +00001212extern void VG_(emit_nonshiftopv_lit_reg)( Bool upd_cc, Int sz, Opcode opc, UInt lit,
njn4ba5a792002-09-30 10:23:54 +00001213 Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001214extern void VG_(emit_shiftopv_lit_reg) ( Bool upd_cc, Int sz, Opcode opc, UInt lit,
njn4ba5a792002-09-30 10:23:54 +00001215 Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001216extern void VG_(emit_nonshiftopv_reg_reg)( Bool upd_cc, Int sz, Opcode opc,
njn4ba5a792002-09-30 10:23:54 +00001217 Int reg1, Int reg2 );
1218extern void VG_(emit_movv_lit_reg) ( Int sz, UInt lit, Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001219extern void VG_(emit_unaryopv_reg) ( Bool upd_cc, Int sz, Opcode opc, Int reg );
njn4ba5a792002-09-30 10:23:54 +00001220extern void VG_(emit_pushv_reg) ( Int sz, Int reg );
1221extern void VG_(emit_popv_reg) ( Int sz, Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001222
njn4ba5a792002-09-30 10:23:54 +00001223extern void VG_(emit_pushl_lit32) ( UInt int32 );
1224extern void VG_(emit_pushl_lit8) ( Int lit8 );
sewardjfa492d42002-12-08 18:20:01 +00001225extern void VG_(emit_cmpl_zero_reg) ( Bool upd_cc, Int reg );
njn4ba5a792002-09-30 10:23:54 +00001226extern void VG_(emit_swapl_reg_EAX) ( Int reg );
1227extern void VG_(emit_movv_lit_offregmem) ( Int sz, UInt lit, Int off,
1228 Int memreg );
njn25e49d8e72002-09-23 09:36:25 +00001229
1230/* b-size (1 byte) instruction emitters */
njn4ba5a792002-09-30 10:23:54 +00001231extern void VG_(emit_movb_lit_offregmem) ( UInt lit, Int off, Int memreg );
1232extern void VG_(emit_movb_reg_offregmem) ( Int reg, Int off, Int areg );
sewardjfa492d42002-12-08 18:20:01 +00001233extern void VG_(emit_unaryopb_reg) ( Bool upd_cc, Opcode opc, Int reg );
1234extern void VG_(emit_testb_lit_reg) ( Bool upd_cc, UInt lit, Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001235
1236/* zero-extended load emitters */
njn4ba5a792002-09-30 10:23:54 +00001237extern void VG_(emit_movzbl_offregmem_reg) ( Int off, Int regmem, Int reg );
1238extern void VG_(emit_movzwl_offregmem_reg) ( Int off, Int areg, Int reg );
daywalkerf26b2162003-09-30 23:01:50 +00001239extern void VG_(emit_movzwl_regmem_reg) ( Int reg1, Int reg2 );
njn25e49d8e72002-09-23 09:36:25 +00001240
1241/* misc instruction emitters */
njn4ba5a792002-09-30 10:23:54 +00001242extern void VG_(emit_call_reg) ( Int reg );
1243extern void VG_(emit_add_lit_to_esp) ( Int lit );
njn4ba5a792002-09-30 10:23:54 +00001244extern void VG_(emit_pushal) ( void );
1245extern void VG_(emit_popal) ( void );
1246extern void VG_(emit_AMD_prefetch_reg) ( Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001247
sewardja2113f92002-12-12 23:42:48 +00001248/* jump emitters */
1249extern void VG_(init_target) ( Int *tgt );
1250
1251extern void VG_(target_back) ( Int *tgt );
1252extern void VG_(target_forward) ( Int *tgt );
1253extern void VG_(emit_target_delta) ( Int *tgt );
1254
1255extern void VG_(emit_jcondshort_delta) ( Bool simd_cc, Condcode cond, Int delta );
1256extern void VG_(emit_jcondshort_target)( Bool simd_cc, Condcode cond, Int *tgt );
1257
njn25e49d8e72002-09-23 09:36:25 +00001258
1259/*====================================================================*/
1260/*=== Execution contexts ===*/
1261/*====================================================================*/
1262
1263/* Generic resolution type used in a few different ways, such as deciding
1264 how closely to compare two errors for equality. */
daywalker5d945de2003-09-26 00:32:53 +00001265typedef
1266 enum { Vg_LowRes, Vg_MedRes, Vg_HighRes }
njn25e49d8e72002-09-23 09:36:25 +00001267 VgRes;
1268
1269typedef
1270 struct _ExeContext
1271 ExeContext;
1272
daywalker5d945de2003-09-26 00:32:53 +00001273/* Compare two ExeContexts. Number of callers considered depends on `res':
1274 Vg_LowRes: 2
1275 Vg_MedRes: 4
njnd5bb0a52002-09-27 10:24:48 +00001276 Vg_HighRes: all */
njn25e49d8e72002-09-23 09:36:25 +00001277extern Bool VG_(eq_ExeContext) ( VgRes res,
1278 ExeContext* e1, ExeContext* e2 );
1279
1280/* Print an ExeContext. */
1281extern void VG_(pp_ExeContext) ( ExeContext* );
1282
1283/* Take a snapshot of the client's stack. Search our collection of
1284 ExeContexts to see if we already have it, and if not, allocate a
njn6c846552003-09-16 07:41:43 +00001285 new one. Either way, return a pointer to the context. Context size
1286 controlled by --num-callers option.
daywalker5d945de2003-09-26 00:32:53 +00001287
njn72718642003-07-24 08:45:32 +00001288 If called from generated code, use VG_(get_current_tid)() to get the
1289 current ThreadId. If called from non-generated code, the current
daywalker5d945de2003-09-26 00:32:53 +00001290 ThreadId should be passed in by the core.
njn7b456f52003-05-19 11:16:50 +00001291*/
njn72718642003-07-24 08:45:32 +00001292extern ExeContext* VG_(get_ExeContext) ( ThreadId tid );
njn25e49d8e72002-09-23 09:36:25 +00001293
njn6c846552003-09-16 07:41:43 +00001294/* Get the nth EIP from the ExeContext. 0 is the EIP of the top function, 1
1295 is its caller, etc. Returns 0 if there isn't one, or if n is greater
1296 than VG_(clo_backtrace_size), set by the --num-callers option. */
1297extern Addr VG_(get_EIP_from_ExeContext) ( ExeContext* e, UInt n );
1298
sewardj499e3de2002-11-13 22:22:25 +00001299/* Just grab the client's EIP, as a much smaller and cheaper
njn72718642003-07-24 08:45:32 +00001300 indication of where they are. Use is basically same as for
daywalker5d945de2003-09-26 00:32:53 +00001301 VG_(get_ExeContext)() above.
njn72718642003-07-24 08:45:32 +00001302*/
1303extern Addr VG_(get_EIP)( ThreadId tid );
njn25e49d8e72002-09-23 09:36:25 +00001304
njn6c846552003-09-16 07:41:43 +00001305/* For skins needing more control over stack traces: walks the stack to get
1306 %eips from the top stack frames for thread 'tid'. Maximum of 'n_eips'
1307 addresses put into 'eips'; 0 is the top of the stack, 1 is its caller,
1308 etc. */
1309extern UInt VG_(stack_snapshot) ( ThreadId tid, Addr* eips, UInt n_eips );
1310
1311/* Does the same thing as VG_(pp_ExeContext)(), just with slightly
1312 different input. */
1313extern void VG_(mini_stack_dump) ( Addr eips[], UInt n_eips );
1314
njn211b6ad2003-02-03 12:33:31 +00001315
njn25e49d8e72002-09-23 09:36:25 +00001316/*====================================================================*/
1317/*=== Error reporting ===*/
1318/*====================================================================*/
1319
1320/* ------------------------------------------------------------------ */
daywalker5d945de2003-09-26 00:32:53 +00001321/* Suppressions describe errors which we want to suppress, ie, not
njn25e49d8e72002-09-23 09:36:25 +00001322 show the user, usually because it is caused by a problem in a library
daywalker5d945de2003-09-26 00:32:53 +00001323 which we can't fix, replace or work around. Suppressions are read from
njnd5bb0a52002-09-27 10:24:48 +00001324 a file at startup time. This gives flexibility so that new
njn25e49d8e72002-09-23 09:36:25 +00001325 suppressions can be added to the file as and when needed.
1326*/
1327
1328typedef
1329 Int /* Do not make this unsigned! */
1330 SuppKind;
1331
njn810086f2002-11-14 12:42:47 +00001332/* The skin-relevant parts of a suppression are:
1333 kind: what kind of suppression; must be in the range (0..)
1334 string: use is optional. NULL by default.
1335 extra: use is optional. NULL by default. void* so it's extensible.
njn25e49d8e72002-09-23 09:36:25 +00001336*/
1337typedef
njn810086f2002-11-14 12:42:47 +00001338 struct _Supp
1339 Supp;
1340
1341/* Useful in SK_(error_matches_suppression)() */
1342SuppKind VG_(get_supp_kind) ( Supp* su );
1343Char* VG_(get_supp_string) ( Supp* su );
1344void* VG_(get_supp_extra) ( Supp* su );
1345
1346/* Must be used in VG_(recognised_suppression)() */
1347void VG_(set_supp_kind) ( Supp* su, SuppKind suppkind );
1348/* May be used in VG_(read_extra_suppression_info)() */
1349void VG_(set_supp_string) ( Supp* su, Char* string );
1350void VG_(set_supp_extra) ( Supp* su, void* extra );
njn25e49d8e72002-09-23 09:36:25 +00001351
1352
1353/* ------------------------------------------------------------------ */
1354/* Error records contain enough info to generate an error report. The idea
1355 is that (typically) the same few points in the program generate thousands
njnd5bb0a52002-09-27 10:24:48 +00001356 of errors, and we don't want to spew out a fresh error message for each
1357 one. Instead, we use these structures to common up duplicates.
njn25e49d8e72002-09-23 09:36:25 +00001358*/
1359
1360typedef
1361 Int /* Do not make this unsigned! */
1362 ErrorKind;
1363
njn810086f2002-11-14 12:42:47 +00001364/* The skin-relevant parts of an Error are:
1365 kind: what kind of error; must be in the range (0..)
1366 addr: use is optional. 0 by default.
1367 string: use is optional. NULL by default.
1368 extra: use is optional. NULL by default. void* so it's extensible.
njn25e49d8e72002-09-23 09:36:25 +00001369*/
1370typedef
njn810086f2002-11-14 12:42:47 +00001371 struct _Error
1372 Error;
njn25e49d8e72002-09-23 09:36:25 +00001373
njn810086f2002-11-14 12:42:47 +00001374/* Useful in SK_(error_matches_suppression)(), SK_(pp_SkinError)(), etc */
njnb877d492003-01-28 20:40:57 +00001375ExeContext* VG_(get_error_where) ( Error* err );
1376SuppKind VG_(get_error_kind) ( Error* err );
1377Addr VG_(get_error_address) ( Error* err );
1378Char* VG_(get_error_string) ( Error* err );
1379void* VG_(get_error_extra) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001380
njnd5bb0a52002-09-27 10:24:48 +00001381/* Call this when an error occurs. It will be recorded if it hasn't been
njn25e49d8e72002-09-23 09:36:25 +00001382 seen before. If it has, the existing error record will have its count
daywalker5d945de2003-09-26 00:32:53 +00001383 incremented.
1384
njn72718642003-07-24 08:45:32 +00001385 'tid' can be found as for VG_(get_ExeContext)(). The `extra' field can
1386 be stack-allocated; it will be copied by the core if needed (but it
1387 won't be copied if it's NULL).
njnd5bb0a52002-09-27 10:24:48 +00001388
1389 If no 'a', 's' or 'extra' of interest needs to be recorded, just use
njn3e884182003-04-15 13:03:23 +00001390 NULL for them. */
daywalker5d945de2003-09-26 00:32:53 +00001391extern void VG_(maybe_record_error) ( ThreadId tid, ErrorKind ekind,
njn25e49d8e72002-09-23 09:36:25 +00001392 Addr a, Char* s, void* extra );
1393
njn43c799e2003-04-08 00:08:52 +00001394/* Similar to VG_(maybe_record_error)(), except this one doesn't record the
1395 error -- useful for errors that can only happen once. The errors can be
1396 suppressed, though. Return value is True if it was suppressed.
daywalker5d945de2003-09-26 00:32:53 +00001397 `print_error' dictates whether to print the error, which is a bit of a
njn43c799e2003-04-08 00:08:52 +00001398 hack that's useful sometimes if you just want to know if the error would
daywalker5d945de2003-09-26 00:32:53 +00001399 be suppressed without possibly printing it. `count_error' dictates
njn47363ab2003-04-21 13:24:40 +00001400 whether to add the error in the error total count (another mild hack). */
njn72718642003-07-24 08:45:32 +00001401extern Bool VG_(unique_error) ( ThreadId tid, ErrorKind ekind,
njn43c799e2003-04-08 00:08:52 +00001402 Addr a, Char* s, void* extra,
njn3e884182003-04-15 13:03:23 +00001403 ExeContext* where, Bool print_error,
njn47363ab2003-04-21 13:24:40 +00001404 Bool allow_GDB_attach, Bool count_error );
njn43c799e2003-04-08 00:08:52 +00001405
njn25e49d8e72002-09-23 09:36:25 +00001406/* Gets a non-blank, non-comment line of at most nBuf chars from fd.
daywalker5d945de2003-09-26 00:32:53 +00001407 Skips leading spaces on the line. Returns True if EOF was hit instead.
njn3e884182003-04-15 13:03:23 +00001408 Useful for reading in extra skin-specific suppression lines. */
njn4ba5a792002-09-30 10:23:54 +00001409extern Bool VG_(get_line) ( Int fd, Char* buf, Int nBuf );
njn25e49d8e72002-09-23 09:36:25 +00001410
1411
1412/*====================================================================*/
1413/*=== Obtaining debug information ===*/
1414/*====================================================================*/
1415
sewardj6e008cb2002-12-15 13:11:39 +00001416/* Get the file/function/line number of the instruction at address
1417 'a'. For these four, if debug info for the address is found, it
1418 copies the info into the buffer/UInt and returns True. If not, it
1419 returns False and nothing is copied. VG_(get_fnname) always
1420 demangles C++ function names. VG_(get_fnname_w_offset) is the
njn3e884182003-04-15 13:03:23 +00001421 same, except it appends "+N" to symbol names to indicate offsets. */
njn25e49d8e72002-09-23 09:36:25 +00001422extern Bool VG_(get_filename) ( Addr a, Char* filename, Int n_filename );
1423extern Bool VG_(get_fnname) ( Addr a, Char* fnname, Int n_fnname );
1424extern Bool VG_(get_linenum) ( Addr a, UInt* linenum );
daywalker5d945de2003-09-26 00:32:53 +00001425extern Bool VG_(get_fnname_w_offset)
sewardj6e008cb2002-12-15 13:11:39 +00001426 ( Addr a, Char* fnname, Int n_fnname );
njn25e49d8e72002-09-23 09:36:25 +00001427
1428/* This one is more efficient if getting both filename and line number,
1429 because the two lookups are done together. */
daywalker5d945de2003-09-26 00:32:53 +00001430extern Bool VG_(get_filename_linenum)
njn25e49d8e72002-09-23 09:36:25 +00001431 ( Addr a, Char* filename, Int n_filename,
1432 UInt* linenum );
1433
1434/* Succeeds only if we find from debug info that 'a' is the address of the
1435 first instruction in a function -- as opposed to VG_(get_fnname) which
1436 succeeds if we find from debug info that 'a' is the address of any
1437 instruction in a function. Use this to instrument the start of
njnd5bb0a52002-09-27 10:24:48 +00001438 a particular function. Nb: if an executable/shared object is stripped
njn25e49d8e72002-09-23 09:36:25 +00001439 of its symbols, this function will not be able to recognise function
1440 entry points within it. */
njn497ec3f2003-05-19 08:38:23 +00001441extern Bool VG_(get_fnname_if_entry) ( Addr a, Char* fnname, Int n_fnname );
njn25e49d8e72002-09-23 09:36:25 +00001442
1443/* Succeeds if the address is within a shared object or the main executable.
1444 It doesn't matter if debug info is present or not. */
1445extern Bool VG_(get_objname) ( Addr a, Char* objname, Int n_objname );
1446
njn6c846552003-09-16 07:41:43 +00001447/* Puts into 'buf' info about the code address %eip: the address, function
1448 name (if known) and filename/line number (if known), like this:
1449
1450 0x4001BF05: realloc (vg_replace_malloc.c:339)
1451
1452 'n_buf' gives length of 'buf'. Returns 'buf'.
1453*/
1454extern Char* VG_(describe_eip)(Addr eip, Char* buf, Int n_buf);
1455
jsgfcb1d1c02003-10-14 21:55:10 +00001456/* Returns a string containing an expression for the given
1457 address. String is malloced with VG_(malloc)() */
1458Char *VG_(describe_addr)(ThreadId, Addr);
1459
sewardj47104382002-10-20 18:35:48 +00001460/* A way to get information about what segments are mapped */
1461typedef struct _SegInfo SegInfo;
1462
njnb877d492003-01-28 20:40:57 +00001463/* Returns NULL if the SegInfo isn't found. It doesn't matter if debug info
1464 is present or not. */
1465extern SegInfo* VG_(get_obj) ( Addr a );
1466
1467extern const SegInfo* VG_(next_seginfo) ( const SegInfo *seg );
1468extern Addr VG_(seg_start) ( const SegInfo *seg );
1469extern UInt VG_(seg_size) ( const SegInfo *seg );
1470extern const UChar* VG_(seg_filename) ( const SegInfo *seg );
1471extern UInt VG_(seg_sym_offset)( const SegInfo *seg );
sewardj47104382002-10-20 18:35:48 +00001472
1473typedef
1474 enum {
1475 Vg_SectUnknown,
1476 Vg_SectText,
sewardj8fe15a32002-10-20 19:29:21 +00001477 Vg_SectData,
1478 Vg_SectBSS,
sewardj47104382002-10-20 18:35:48 +00001479 Vg_SectGOT,
sewardj8fe15a32002-10-20 19:29:21 +00001480 Vg_SectPLT,
sewardj47104382002-10-20 18:35:48 +00001481 }
1482 VgSectKind;
1483
1484extern VgSectKind VG_(seg_sect_kind)(Addr);
1485
njn25e49d8e72002-09-23 09:36:25 +00001486
1487/*====================================================================*/
njn3e884182003-04-15 13:03:23 +00001488/*=== Generic hash table ===*/
njn25e49d8e72002-09-23 09:36:25 +00001489/*====================================================================*/
1490
njn3e884182003-04-15 13:03:23 +00001491/* Generic type for a separately-chained hash table. Via a kind of dodgy
1492 C-as-C++ style inheritance, skins can extend the VgHashNode type, so long
1493 as the first two fields match the sizes of these two fields. Requires
1494 a bit of casting by the skin. */
njn25e49d8e72002-09-23 09:36:25 +00001495typedef
njn3e884182003-04-15 13:03:23 +00001496 struct _VgHashNode {
1497 struct _VgHashNode * next;
1498 UInt key;
1499 }
1500 VgHashNode;
njn25e49d8e72002-09-23 09:36:25 +00001501
njn3e884182003-04-15 13:03:23 +00001502typedef
1503 VgHashNode**
1504 VgHashTable;
njn810086f2002-11-14 12:42:47 +00001505
njn3e884182003-04-15 13:03:23 +00001506/* Make a new table. */
1507extern VgHashTable VG_(HT_construct) ( void );
1508
njn69c06872003-09-30 15:43:51 +00001509/* Count the number of nodes in a table. */
1510extern Int VG_(HT_count_nodes) ( VgHashTable table );
1511
njn3e884182003-04-15 13:03:23 +00001512/* Add a node to the table. */
1513extern void VG_(HT_add_node) ( VgHashTable t, VgHashNode* node );
1514
daywalker5d945de2003-09-26 00:32:53 +00001515/* Looks up a node in the hash table. Also returns the address of the
njn3e884182003-04-15 13:03:23 +00001516 previous node's `next' pointer which allows it to be removed from the
1517 list later without having to look it up again. */
1518extern VgHashNode* VG_(HT_get_node) ( VgHashTable t, UInt key,
1519 /*OUT*/VgHashNode*** next_ptr );
1520
njn06072ec2003-09-30 15:35:13 +00001521/* Allocates an array of pointers to all the shadow chunks of malloc'd
1522 blocks. Must be freed with VG_(free)(). */
1523extern VgHashNode** VG_(HT_to_array) ( VgHashTable t, /*OUT*/ UInt* n_shadows );
njn3e884182003-04-15 13:03:23 +00001524
1525/* Returns first node that matches predicate `p', or NULL if none do.
1526 Extra arguments can be implicitly passed to `p' using nested functions;
1527 see memcheck/mc_errcontext.c for an example. */
1528extern VgHashNode* VG_(HT_first_match) ( VgHashTable t,
1529 Bool (*p)(VgHashNode*) );
1530
1531/* Applies a function f() once to each node. Again, nested functions
1532 can be very useful. */
1533extern void VG_(HT_apply_to_all_nodes)( VgHashTable t, void (*f)(VgHashNode*) );
1534
1535/* Destroy a table. */
1536extern void VG_(HT_destruct) ( VgHashTable t );
njn810086f2002-11-14 12:42:47 +00001537
1538
njn3e884182003-04-15 13:03:23 +00001539/*====================================================================*/
njnd3040452003-05-19 15:04:06 +00001540/*=== Functions for shadow registers ===*/
1541/*====================================================================*/
1542
1543/* Nb: make sure the shadow_regs 'need' is set before using these! */
1544
1545/* This one lets you override the shadow of the return value register for a
1546 syscall. Call it from SK_(post_syscall)() (not SK_(pre_syscall)()!) to
1547 override the default shadow register value. */
daywalker5d945de2003-09-26 00:32:53 +00001548extern void VG_(set_return_from_syscall_shadow) ( ThreadId tid,
njnd3040452003-05-19 15:04:06 +00001549 UInt ret_shadow );
1550
1551/* This can be called from SK_(fini)() to find the shadow of the argument
1552 to exit(), ie. the shadow of the program's return value. */
1553extern UInt VG_(get_exit_status_shadow) ( void );
1554
1555
1556/*====================================================================*/
njn3e884182003-04-15 13:03:23 +00001557/*=== General stuff for replacing functions ===*/
1558/*====================================================================*/
njn25e49d8e72002-09-23 09:36:25 +00001559
njn3e884182003-04-15 13:03:23 +00001560/* Some skins need to replace the standard definitions of some functions. */
njn25e49d8e72002-09-23 09:36:25 +00001561
njn3e884182003-04-15 13:03:23 +00001562/* ------------------------------------------------------------------ */
1563/* General stuff, for replacing any functions */
njn25e49d8e72002-09-23 09:36:25 +00001564
daywalker5d945de2003-09-26 00:32:53 +00001565/* Is the client running on the simulated CPU or the real one?
njn25e49d8e72002-09-23 09:36:25 +00001566
njn3e884182003-04-15 13:03:23 +00001567 Nb: If it is, and you want to call a function to be run on the real CPU,
njn057c65f2003-04-21 13:30:55 +00001568 use one of the VALGRIND_NON_SIMD_CALL[123] macros in valgrind.h to call it.
njn25e49d8e72002-09-23 09:36:25 +00001569
daywalker5d945de2003-09-26 00:32:53 +00001570 Nb: don't forget the function parentheses when using this in a
njn3e884182003-04-15 13:03:23 +00001571 condition... write this:
1572
1573 if (VG_(is_running_on_simd_CPU)()) { ... } // calls function
1574
1575 not this:
daywalker5d945de2003-09-26 00:32:53 +00001576
njn3e884182003-04-15 13:03:23 +00001577 if (VG_(is_running_on_simd_CPU)) { ... } // address of var!
1578*/
daywalker5d945de2003-09-26 00:32:53 +00001579extern Bool VG_(is_running_on_simd_CPU) ( void );
njn3e884182003-04-15 13:03:23 +00001580
1581
1582/*====================================================================*/
1583/*=== Specific stuff for replacing malloc() and friends ===*/
1584/*====================================================================*/
1585
njn3e884182003-04-15 13:03:23 +00001586/* If a skin replaces malloc() et al, the easiest way to do so is to link
1587 with coregrind/vg_replace_malloc.c, and follow the following instructions.
1588 You can do it from scratch, though, if you enjoy that sort of thing. */
1589
1590/* Arena size for valgrind's own malloc(); default value is 0, but can
1591 be overridden by skin -- but must be done so *statically*, eg:
daywalker5d945de2003-09-26 00:32:53 +00001592
njn3e884182003-04-15 13:03:23 +00001593 Int VG_(vg_malloc_redzone_szB) = 4;
daywalker5d945de2003-09-26 00:32:53 +00001594
njn3e884182003-04-15 13:03:23 +00001595 It can't be done from a function like SK_(pre_clo_init)(). So it can't,
1596 for example, be controlled with a command line option, unfortunately. */
1597extern UInt VG_(vg_malloc_redzone_szB);
1598
1599/* If a skin links with vg_replace_malloc.c, the following functions will be
1600 called appropriately when malloc() et al are called. */
njn72718642003-07-24 08:45:32 +00001601extern void* SK_(malloc) ( Int n );
1602extern void* SK_(__builtin_new) ( Int n );
1603extern void* SK_(__builtin_vec_new) ( Int n );
1604extern void* SK_(memalign) ( Int align, Int n );
1605extern void* SK_(calloc) ( Int nmemb, Int n );
1606extern void SK_(free) ( void* p );
1607extern void SK_(__builtin_delete) ( void* p );
1608extern void SK_(__builtin_vec_delete) ( void* p );
1609extern void* SK_(realloc) ( void* p, Int size );
njn3e884182003-04-15 13:03:23 +00001610
1611/* Can be called from SK_(malloc) et al to do the actual alloc/freeing. */
daywalker5d945de2003-09-26 00:32:53 +00001612extern void* VG_(cli_malloc) ( UInt align, Int nbytes );
njn3e884182003-04-15 13:03:23 +00001613extern void VG_(cli_free) ( void* p );
1614
1615/* Check if an address is within a range, allowing for redzones at edges */
1616extern Bool VG_(addr_is_in_block)( Addr a, Addr start, UInt size );
1617
1618/* ------------------------------------------------------------------ */
daywalker5d945de2003-09-26 00:32:53 +00001619/* Some options that can be used by a skin if malloc() et al are replaced.
njnd3040452003-05-19 15:04:06 +00001620 The skin should call the functions in the appropriate places to give
1621 control over these aspects of Valgrind's version of malloc(). */
njn3e884182003-04-15 13:03:23 +00001622
1623/* Round malloc sizes upwards to integral number of words? default: NO */
1624extern Bool VG_(clo_sloppy_malloc);
1625/* DEBUG: print malloc details? default: NO */
1626extern Bool VG_(clo_trace_malloc);
1627/* Minimum alignment in functions that don't specify alignment explicitly.
1628 default: 0, i.e. use default of the machine (== 4) */
1629extern Int VG_(clo_alignment);
1630
1631extern Bool VG_(replacement_malloc_process_cmd_line_option) ( Char* arg );
1632extern void VG_(replacement_malloc_print_usage) ( void );
1633extern void VG_(replacement_malloc_print_debug_usage) ( void );
sewardja4495682002-10-21 07:29:59 +00001634
1635
njn25e49d8e72002-09-23 09:36:25 +00001636/*====================================================================*/
1637/*=== Skin-specific stuff ===*/
1638/*====================================================================*/
1639
njnd04b7c62002-10-03 14:05:52 +00001640/* ------------------------------------------------------------------ */
1641/* Details */
njnd04b7c62002-10-03 14:05:52 +00001642
njn120281f2003-02-03 12:20:07 +00001643/* Default value for avg_translations_sizeB (in bytes), indicating typical
1644 code expansion of about 6:1. */
1645#define VG_DEFAULT_TRANS_SIZEB 100
1646
njn810086f2002-11-14 12:42:47 +00001647/* Information used in the startup message. `name' also determines the
1648 string used for identifying suppressions in a suppression file as
1649 belonging to this skin. `version' can be NULL, in which case (not
1650 surprisingly) no version info is printed; this mechanism is designed for
1651 skins distributed with Valgrind that share a version number with
1652 Valgrind. Other skins not distributed as part of Valgrind should
sewardjc0d8f682002-11-30 00:49:43 +00001653 probably have their own version number. */
1654extern void VG_(details_name) ( Char* name );
1655extern void VG_(details_version) ( Char* version );
1656extern void VG_(details_description) ( Char* description );
1657extern void VG_(details_copyright_author) ( Char* copyright_author );
1658
1659/* Average size of a translation, in bytes, so that the translation
njn120281f2003-02-03 12:20:07 +00001660 storage machinery can allocate memory appropriately. Not critical,
daywalker5d945de2003-09-26 00:32:53 +00001661 setting is optional. */
njn120281f2003-02-03 12:20:07 +00001662extern void VG_(details_avg_translation_sizeB) ( UInt size );
njnd04b7c62002-10-03 14:05:52 +00001663
njn810086f2002-11-14 12:42:47 +00001664/* String printed if an `sk_assert' assertion fails or VG_(skin_panic)
1665 is called. Should probably be an email address. */
1666extern void VG_(details_bug_reports_to) ( Char* bug_reports_to );
njnd04b7c62002-10-03 14:05:52 +00001667
1668/* ------------------------------------------------------------------ */
1669/* Needs */
1670
njn810086f2002-11-14 12:42:47 +00001671/* Booleans that decide core behaviour, but don't require extra
1672 operations to be defined if `True' */
njnd5bb0a52002-09-27 10:24:48 +00001673
njn810086f2002-11-14 12:42:47 +00001674/* Should __libc_freeres() be run? Bugs in it can crash the skin. */
1675extern void VG_(needs_libc_freeres) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001676
njn810086f2002-11-14 12:42:47 +00001677/* Want to have errors detected by Valgrind's core reported? Includes:
1678 - pthread API errors (many; eg. unlocking a non-locked mutex)
njn810086f2002-11-14 12:42:47 +00001679 - invalid file descriptors to blocking syscalls read() and write()
1680 - bad signal numbers passed to sigaction()
daywalker5d945de2003-09-26 00:32:53 +00001681 - attempt to install signal handler for SIGKILL or SIGSTOP */
njn810086f2002-11-14 12:42:47 +00001682extern void VG_(needs_core_errors) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001683
njn810086f2002-11-14 12:42:47 +00001684/* Booleans that indicate extra operations are defined; if these are True,
1685 the corresponding template functions (given below) must be defined. A
1686 lot like being a member of a type class. */
njn25e49d8e72002-09-23 09:36:25 +00001687
njn810086f2002-11-14 12:42:47 +00001688/* Want to report errors from skin? This implies use of suppressions, too. */
1689extern void VG_(needs_skin_errors) ( void );
njnd5bb0a52002-09-27 10:24:48 +00001690
njn810086f2002-11-14 12:42:47 +00001691/* Is information kept about specific individual basic blocks? (Eg. for
1692 cachegrind there are cost-centres for every instruction, stored at a
1693 basic block level.) If so, it sometimes has to be discarded, because
1694 .so mmap/munmap-ping or self-modifying code (informed by the
1695 DISCARD_TRANSLATIONS user request) can cause one instruction address
1696 to be used for more than one instruction in one program run... */
1697extern void VG_(needs_basic_block_discards) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001698
njn810086f2002-11-14 12:42:47 +00001699/* Skin maintains information about each register? */
1700extern void VG_(needs_shadow_regs) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001701
njn810086f2002-11-14 12:42:47 +00001702/* Skin defines its own command line options? */
1703extern void VG_(needs_command_line_options) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001704
njn810086f2002-11-14 12:42:47 +00001705/* Skin defines its own client requests? */
1706extern void VG_(needs_client_requests) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001707
njn810086f2002-11-14 12:42:47 +00001708/* Skin defines its own UInstrs? */
1709extern void VG_(needs_extended_UCode) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001710
njn810086f2002-11-14 12:42:47 +00001711/* Skin does stuff before and/or after system calls? */
1712extern void VG_(needs_syscall_wrapper) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001713
njn810086f2002-11-14 12:42:47 +00001714/* Are skin-state sanity checks performed? */
1715extern void VG_(needs_sanity_checks) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001716
njn810086f2002-11-14 12:42:47 +00001717/* Do we need to see data symbols? */
1718extern void VG_(needs_data_syms) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001719
1720/* ------------------------------------------------------------------ */
1721/* Core events to track */
1722
1723/* Part of the core from which this call was made. Useful for determining
njnd5bb0a52002-09-27 10:24:48 +00001724 what kind of error message should be emitted. */
daywalker5d945de2003-09-26 00:32:53 +00001725typedef
njn25e49d8e72002-09-23 09:36:25 +00001726 enum { Vg_CorePThread, Vg_CoreSignal, Vg_CoreSysCall, Vg_CoreTranslate }
1727 CorePart;
1728
njn810086f2002-11-14 12:42:47 +00001729#define EV extern void
njn25e49d8e72002-09-23 09:36:25 +00001730
njn810086f2002-11-14 12:42:47 +00001731/* Events happening in core to track. To be notified, pass a callback
1732 function to the appropriate function. To ignore an event, don't do
daywalker5d945de2003-09-26 00:32:53 +00001733 anything (default is for events to be ignored).
1734
njn72718642003-07-24 08:45:32 +00001735 Note that most events aren't passed a ThreadId. To find out the ThreadId
1736 of the affected thread, use VG_(get_current_or_recent_tid)(). For the
1737 ones passed a ThreadId, use that instead, since
1738 VG_(get_current_or_recent_tid)() might not give the right ThreadId in
1739 that case.
1740*/
njn810086f2002-11-14 12:42:47 +00001741
njn810086f2002-11-14 12:42:47 +00001742
njn3e884182003-04-15 13:03:23 +00001743/* Memory events (Nb: to track heap allocation/freeing, a skin must replace
1744 malloc() et al. See above how to do this.) */
1745
1746/* These ones occur at startup, upon some signals, and upon some syscalls */
daywalker5d945de2003-09-26 00:32:53 +00001747EV VG_(track_new_mem_startup) ( void (*f)(Addr a, UInt len,
njn810086f2002-11-14 12:42:47 +00001748 Bool rr, Bool ww, Bool xx) );
njn810086f2002-11-14 12:42:47 +00001749EV VG_(track_new_mem_stack_signal) ( void (*f)(Addr a, UInt len) );
1750EV VG_(track_new_mem_brk) ( void (*f)(Addr a, UInt len) );
1751EV VG_(track_new_mem_mmap) ( void (*f)(Addr a, UInt len,
1752 Bool rr, Bool ww, Bool xx) );
1753
njn3e884182003-04-15 13:03:23 +00001754EV VG_(track_copy_mem_remap) ( void (*f)(Addr from, Addr to, UInt len) );
1755EV VG_(track_change_mem_mprotect) ( void (*f)(Addr a, UInt len,
1756 Bool rr, Bool ww, Bool xx) );
1757EV VG_(track_die_mem_stack_signal) ( void (*f)(Addr a, UInt len) );
1758EV VG_(track_die_mem_brk) ( void (*f)(Addr a, UInt len) );
1759EV VG_(track_die_mem_munmap) ( void (*f)(Addr a, UInt len) );
1760
1761
1762/* These ones are called when %esp changes. A skin could track these itself
1763 (except for ban_mem_stack) but it's much easier to use the core's help.
daywalker5d945de2003-09-26 00:32:53 +00001764
njn3e884182003-04-15 13:03:23 +00001765 The specialised ones are called in preference to the general one, if they
njn9b007f62003-04-07 14:40:25 +00001766 are defined. These functions are called a lot if they are used, so
1767 specialising can optimise things significantly. If any of the
daywalker5d945de2003-09-26 00:32:53 +00001768 specialised cases are defined, the general case must be defined too.
1769
njn9b007f62003-04-07 14:40:25 +00001770 Nb: they must all use the __attribute__((regparm(n))) attribute. */
1771EV VG_(track_new_mem_stack_4) ( void (*f)(Addr new_ESP) );
1772EV VG_(track_new_mem_stack_8) ( void (*f)(Addr new_ESP) );
1773EV VG_(track_new_mem_stack_12) ( void (*f)(Addr new_ESP) );
1774EV VG_(track_new_mem_stack_16) ( void (*f)(Addr new_ESP) );
1775EV VG_(track_new_mem_stack_32) ( void (*f)(Addr new_ESP) );
1776EV VG_(track_new_mem_stack) ( void (*f)(Addr a, UInt len) );
1777
njn9b007f62003-04-07 14:40:25 +00001778EV VG_(track_die_mem_stack_4) ( void (*f)(Addr die_ESP) );
1779EV VG_(track_die_mem_stack_8) ( void (*f)(Addr die_ESP) );
1780EV VG_(track_die_mem_stack_12) ( void (*f)(Addr die_ESP) );
1781EV VG_(track_die_mem_stack_16) ( void (*f)(Addr die_ESP) );
1782EV VG_(track_die_mem_stack_32) ( void (*f)(Addr die_ESP) );
1783EV VG_(track_die_mem_stack) ( void (*f)(Addr a, UInt len) );
1784
njn3e884182003-04-15 13:03:23 +00001785/* Used for redzone at end of thread stacks */
1786EV VG_(track_ban_mem_stack) ( void (*f)(Addr a, UInt len) );
njn25e49d8e72002-09-23 09:36:25 +00001787
njn3e884182003-04-15 13:03:23 +00001788/* These ones occur around syscalls, signal handling, etc */
njn72718642003-07-24 08:45:32 +00001789EV VG_(track_pre_mem_read) ( void (*f)(CorePart part, ThreadId tid,
njn810086f2002-11-14 12:42:47 +00001790 Char* s, Addr a, UInt size) );
njn72718642003-07-24 08:45:32 +00001791EV VG_(track_pre_mem_read_asciiz) ( void (*f)(CorePart part, ThreadId tid,
njn810086f2002-11-14 12:42:47 +00001792 Char* s, Addr a) );
njn72718642003-07-24 08:45:32 +00001793EV VG_(track_pre_mem_write) ( void (*f)(CorePart part, ThreadId tid,
njn810086f2002-11-14 12:42:47 +00001794 Char* s, Addr a, UInt size) );
1795/* Not implemented yet -- have to add in lots of places, which is a
1796 pain. Won't bother unless/until there's a need. */
daywalker5d945de2003-09-26 00:32:53 +00001797/* EV VG_(track_post_mem_read) ( void (*f)(ThreadId tid, Char* s,
njn810086f2002-11-14 12:42:47 +00001798 Addr a, UInt size) ); */
1799EV VG_(track_post_mem_write) ( void (*f)(Addr a, UInt size) );
njn25e49d8e72002-09-23 09:36:25 +00001800
1801
njnd3040452003-05-19 15:04:06 +00001802/* Register events -- if `shadow_regs' need is set, all should probably be
1803 used. Use VG_(set_thread_shadow_archreg)() to set the shadow of the
1804 changed register. */
1805
1806/* Use VG_(set_shadow_archreg)() to set the eight general purpose regs,
1807 and use VG_(set_shadow_eflags)() to set eflags. */
daywalker5d945de2003-09-26 00:32:53 +00001808EV VG_(track_post_regs_write_init) ( void (*f)() );
njnd3040452003-05-19 15:04:06 +00001809
daywalker5d945de2003-09-26 00:32:53 +00001810/* Use VG_(set_thread_shadow_archreg)() to set the shadow regs for these
njnd3040452003-05-19 15:04:06 +00001811 events. */
daywalker5d945de2003-09-26 00:32:53 +00001812EV VG_(track_post_reg_write_syscall_return)
njnd3040452003-05-19 15:04:06 +00001813 ( void (*f)(ThreadId tid, UInt reg) );
1814EV VG_(track_post_reg_write_deliver_signal)
1815 ( void (*f)(ThreadId tid, UInt reg) );
1816EV VG_(track_post_reg_write_pthread_return)
1817 ( void (*f)(ThreadId tid, UInt reg) );
1818EV VG_(track_post_reg_write_clientreq_return)
1819 ( void (*f)(ThreadId tid, UInt reg) );
1820 /* This one is called for malloc() et al if they are replaced by a skin. */
1821EV VG_(track_post_reg_write_clientcall_return)
1822 ( void (*f)(ThreadId tid, UInt reg,
1823 Addr called_function) );
1824
1825
njn810086f2002-11-14 12:42:47 +00001826/* Scheduler events (not exhaustive) */
njn25e49d8e72002-09-23 09:36:25 +00001827
njn810086f2002-11-14 12:42:47 +00001828EV VG_(track_thread_run) ( void (*f)(ThreadId tid) );
njn25e49d8e72002-09-23 09:36:25 +00001829
njn810086f2002-11-14 12:42:47 +00001830/* Thread events (not exhaustive) */
sewardjdca84112002-11-13 22:29:34 +00001831
njn810086f2002-11-14 12:42:47 +00001832/* Called during thread create, before the new thread has run any
1833 instructions (or touched any memory). */
1834EV VG_(track_post_thread_create)( void (*f)(ThreadId tid, ThreadId child) );
1835/* Called once the joinee thread is terminated and the joining thread is
1836 about to resume. */
1837EV VG_(track_post_thread_join) ( void (*f)(ThreadId joiner, ThreadId joinee) );
njn25e49d8e72002-09-23 09:36:25 +00001838
daywalker5d945de2003-09-26 00:32:53 +00001839
njn810086f2002-11-14 12:42:47 +00001840/* Mutex events (not exhaustive) */
njn25e49d8e72002-09-23 09:36:25 +00001841
njn810086f2002-11-14 12:42:47 +00001842/* Called before a thread can block while waiting for a mutex (called
1843 regardless of whether the thread will block or not). */
daywalker5d945de2003-09-26 00:32:53 +00001844EV VG_(track_pre_mutex_lock) ( void (*f)(ThreadId tid,
njn810086f2002-11-14 12:42:47 +00001845 void* /*pthread_mutex_t* */ mutex) );
1846/* Called once the thread actually holds the mutex (always paired with
1847 pre_mutex_lock). */
daywalker5d945de2003-09-26 00:32:53 +00001848EV VG_(track_post_mutex_lock) ( void (*f)(ThreadId tid,
njn810086f2002-11-14 12:42:47 +00001849 void* /*pthread_mutex_t* */ mutex) );
1850/* Called after a thread has released a mutex (no need for a corresponding
1851 pre_mutex_unlock, because unlocking can't block). */
daywalker5d945de2003-09-26 00:32:53 +00001852EV VG_(track_post_mutex_unlock) ( void (*f)(ThreadId tid,
njn810086f2002-11-14 12:42:47 +00001853 void* /*pthread_mutex_t* */ mutex) );
njn25e49d8e72002-09-23 09:36:25 +00001854
njn1045b0a2003-02-24 10:42:47 +00001855
1856/* Signal events (not exhaustive) */
1857
njn7b456f52003-05-19 11:16:50 +00001858/* ... pre_send_signal, post_send_signal ... */
1859
njn1045b0a2003-02-24 10:42:47 +00001860/* Called before a signal is delivered; `alt_stack' indicates if it is
1861 delivered on an alternative stack. */
1862EV VG_(track_pre_deliver_signal) ( void (*f)(ThreadId tid, Int sigNum,
1863 Bool alt_stack) );
njn7b456f52003-05-19 11:16:50 +00001864/* Called after a signal is delivered. Nb: unfortunately, if the signal
1865 handler longjmps, this won't be called. */
njn1045b0a2003-02-24 10:42:47 +00001866EV VG_(track_post_deliver_signal) ( void (*f)(ThreadId tid, Int sigNum ) );
1867
1868
1869/* Others... condition variables... */
njn810086f2002-11-14 12:42:47 +00001870/* ... */
1871
1872#undef EV
njn25e49d8e72002-09-23 09:36:25 +00001873
1874/* ------------------------------------------------------------------ */
1875/* Template functions */
1876
1877/* These are the parameterised functions in the core. The default definitions
njnd5bb0a52002-09-27 10:24:48 +00001878 are overridden by LD_PRELOADed skin version. At the very least, a skin
1879 must define the fundamental template functions. Depending on what needs
1880 are set, extra template functions will be used too. Functions are
1881 grouped under the needs that govern their use. */
njn25e49d8e72002-09-23 09:36:25 +00001882
1883
1884/* ------------------------------------------------------------------ */
1885/* Fundamental template functions */
1886
1887/* Initialise skin. Must do the following:
njn810086f2002-11-14 12:42:47 +00001888 - initialise the `details' struct, via the VG_(details_*)() functions
njn25e49d8e72002-09-23 09:36:25 +00001889 - register any helpers called by generated code
daywalker5d945de2003-09-26 00:32:53 +00001890
njn25e49d8e72002-09-23 09:36:25 +00001891 May do the following:
njn810086f2002-11-14 12:42:47 +00001892 - initialise the `needs' struct to indicate certain requirements, via
1893 the VG_(needs_*)() functions
1894 - initialise the `track' struct to indicate core events of interest, via
1895 the VG_(track_*)() functions
njn25e49d8e72002-09-23 09:36:25 +00001896 - register any skin-specific profiling events
1897 - any other skin-specific initialisation
1898*/
njn810086f2002-11-14 12:42:47 +00001899extern void SK_(pre_clo_init) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001900
njnd5bb0a52002-09-27 10:24:48 +00001901/* Do initialisation that can only be done after command line processing. */
njn25e49d8e72002-09-23 09:36:25 +00001902extern void SK_(post_clo_init)( void );
1903
1904/* Instrument a basic block. Must be a true function, ie. the same input
1905 always results in the same output, because basic blocks can be
1906 retranslated. Unless you're doing something really strange...
1907 'orig_addr' is the address of the first instruction in the block. */
1908extern UCodeBlock* SK_(instrument) ( UCodeBlock* cb, Addr orig_addr );
1909
njn7d9f94d2003-04-22 21:41:40 +00001910/* Finish up, print out any results, etc. `exitcode' is program's exit
1911 code. The shadow (if the `shadow_regs' need is set) can be found with
1912 VG_(get_shadow_archreg)(R_EBX), since %ebx holds the argument to the
1913 exit() syscall. */
1914extern void SK_(fini) ( Int exitcode );
njn25e49d8e72002-09-23 09:36:25 +00001915
1916
1917/* ------------------------------------------------------------------ */
njn6a230532003-07-21 10:38:23 +00001918/* VG_(needs).core_errors */
1919
1920/* (none needed) */
1921
1922/* ------------------------------------------------------------------ */
1923/* VG_(needs).skin_errors */
njn25e49d8e72002-09-23 09:36:25 +00001924
1925/* Identify if two errors are equal, or equal enough. `res' indicates how
1926 close is "close enough". `res' should be passed on as necessary, eg. if
njn810086f2002-11-14 12:42:47 +00001927 the Error's `extra' part contains an ExeContext, `res' should be
njn25e49d8e72002-09-23 09:36:25 +00001928 passed to VG_(eq_ExeContext)() if the ExeContexts are considered. Other
1929 than that, probably don't worry about it unless you have lots of very
1930 similar errors occurring.
1931 */
njn810086f2002-11-14 12:42:47 +00001932extern Bool SK_(eq_SkinError) ( VgRes res, Error* e1, Error* e2 );
njn25e49d8e72002-09-23 09:36:25 +00001933
njn43c799e2003-04-08 00:08:52 +00001934/* Print error context. */
1935extern void SK_(pp_SkinError) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001936
njn43c799e2003-04-08 00:08:52 +00001937/* Should fill in any details that could be postponed until after the
njn810086f2002-11-14 12:42:47 +00001938 decision whether to ignore the error (ie. details not affecting the
1939 result of SK_(eq_SkinError)()). This saves time when errors are ignored.
njn25e49d8e72002-09-23 09:36:25 +00001940 Yuk.
njn43c799e2003-04-08 00:08:52 +00001941
1942 Return value: must be the size of the `extra' part in bytes -- used by
1943 the core to make a copy.
njn25e49d8e72002-09-23 09:36:25 +00001944*/
njn43c799e2003-04-08 00:08:52 +00001945extern UInt SK_(update_extra) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001946
njn810086f2002-11-14 12:42:47 +00001947/* Return value indicates recognition. If recognised, must set skind using
1948 VG_(set_supp_kind)(). */
1949extern Bool SK_(recognised_suppression) ( Char* name, Supp* su );
njn25e49d8e72002-09-23 09:36:25 +00001950
njn810086f2002-11-14 12:42:47 +00001951/* Read any extra info for this suppression kind. Most likely for filling
1952 in the `extra' and `string' parts (with VG_(set_supp_{extra,string})())
daywalker5d945de2003-09-26 00:32:53 +00001953 of a suppression if necessary. Should return False if a syntax error
njn810086f2002-11-14 12:42:47 +00001954 occurred, True otherwise. */
1955extern Bool SK_(read_extra_suppression_info) ( Int fd, Char* buf, Int nBuf,
1956 Supp* su );
njn25e49d8e72002-09-23 09:36:25 +00001957
1958/* This should just check the kinds match and maybe some stuff in the
njn810086f2002-11-14 12:42:47 +00001959 `string' and `extra' field if appropriate (using VG_(get_supp_*)() to
1960 get the relevant suppression parts). */
njn43c799e2003-04-08 00:08:52 +00001961extern Bool SK_(error_matches_suppression) ( Error* err, Supp* su );
1962
1963/* This should return the suppression name, for --gen-suppressions, or NULL
1964 if that error type cannot be suppressed. This is the inverse of
1965 SK_(recognised_suppression)(). */
1966extern Char* SK_(get_error_name) ( Error* err );
1967
1968/* This should print any extra info for the error, for --gen-suppressions,
1969 including the newline. This is the inverse of
1970 SK_(read_extra_suppression_info)(). */
1971extern void SK_(print_extra_suppression_info) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001972
1973
1974/* ------------------------------------------------------------------ */
1975/* VG_(needs).basic_block_discards */
1976
njnd5bb0a52002-09-27 10:24:48 +00001977/* Should discard any information that pertains to specific basic blocks
1978 or instructions within the address range given. */
njn25e49d8e72002-09-23 09:36:25 +00001979extern void SK_(discard_basic_block_info) ( Addr a, UInt size );
1980
1981
1982/* ------------------------------------------------------------------ */
1983/* VG_(needs).shadow_regs */
1984
njnd3040452003-05-19 15:04:06 +00001985/* No functions must be defined, but the post_reg[s]_write_* events should
1986 be tracked. */
njn25e49d8e72002-09-23 09:36:25 +00001987
1988/* ------------------------------------------------------------------ */
1989/* VG_(needs).command_line_options */
1990
njnd5bb0a52002-09-27 10:24:48 +00001991/* Return True if option was recognised. Presumably sets some state to
1992 record the option as well. */
1993extern Bool SK_(process_cmd_line_option) ( Char* argv );
njn25e49d8e72002-09-23 09:36:25 +00001994
njn3e884182003-04-15 13:03:23 +00001995/* Print out command line usage for options for normal skin operation. */
1996extern void SK_(print_usage) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001997
njn3e884182003-04-15 13:03:23 +00001998/* Print out command line usage for options for debugging the skin. */
1999extern void SK_(print_debug_usage) ( void );
njn25e49d8e72002-09-23 09:36:25 +00002000
2001/* ------------------------------------------------------------------ */
2002/* VG_(needs).client_requests */
2003
njnd3040452003-05-19 15:04:06 +00002004/* If using client requests, the number of the first request should be equal
2005 to VG_USERREQ_SKIN_BASE('X','Y'), where 'X' and 'Y' form a suitable two
2006 character identification for the string. The second and subsequent
2007 requests should follow. */
2008
2009/* This function should use the VG_IS_SKIN_USERREQ macro (in
2010 include/valgrind.h) to first check if it's a request for this skin. Then
2011 should handle it if it's recognised (and return True), or return False if
2012 not recognised. arg_block[0] holds the request number, any further args
2013 from the request are in arg_block[1..]. 'ret' is for the return value...
2014 it should probably be filled, if only with 0. */
njn72718642003-07-24 08:45:32 +00002015extern Bool SK_(handle_client_request) ( ThreadId tid, UInt* arg_block,
njnd3040452003-05-19 15:04:06 +00002016 UInt *ret );
njn25e49d8e72002-09-23 09:36:25 +00002017
2018
2019/* ------------------------------------------------------------------ */
2020/* VG_(needs).extends_UCode */
2021
njn4ba5a792002-09-30 10:23:54 +00002022/* Useful to use in VG_(get_Xreg_usage)() */
njn810086f2002-11-14 12:42:47 +00002023#define VG_UINSTR_READS_REG(ono,regs,isWrites) \
njn25e49d8e72002-09-23 09:36:25 +00002024 { if (mycat(u->tag,ono) == tag) \
njn810086f2002-11-14 12:42:47 +00002025 { regs[n] = mycat(u->val,ono); \
2026 isWrites[n] = False; \
njn25e49d8e72002-09-23 09:36:25 +00002027 n++; \
2028 } \
2029 }
njn810086f2002-11-14 12:42:47 +00002030#define VG_UINSTR_WRITES_REG(ono,regs,isWrites) \
njnd5bb0a52002-09-27 10:24:48 +00002031 { if (mycat(u->tag,ono) == tag) \
njn810086f2002-11-14 12:42:47 +00002032 { regs[n] = mycat(u->val,ono); \
2033 isWrites[n] = True; \
njnd5bb0a52002-09-27 10:24:48 +00002034 n++; \
2035 } \
njn25e49d8e72002-09-23 09:36:25 +00002036 }
2037
njn4ba5a792002-09-30 10:23:54 +00002038/* 'X' prefix indicates eXtended UCode. */
njn810086f2002-11-14 12:42:47 +00002039extern Int SK_(get_Xreg_usage) ( UInstr* u, Tag tag, Int* regs,
2040 Bool* isWrites );
njn4ba5a792002-09-30 10:23:54 +00002041extern void SK_(emit_XUInstr) ( UInstr* u, RRegSet regs_live_before );
2042extern Bool SK_(sane_XUInstr) ( Bool beforeRA, Bool beforeLiveness,
njn25e49d8e72002-09-23 09:36:25 +00002043 UInstr* u );
njn4ba5a792002-09-30 10:23:54 +00002044extern Char* SK_(name_XUOpcode) ( Opcode opc );
2045extern void SK_(pp_XUInstr) ( UInstr* u );
njn25e49d8e72002-09-23 09:36:25 +00002046
2047
2048/* ------------------------------------------------------------------ */
2049/* VG_(needs).syscall_wrapper */
2050
2051/* If either of the pre_ functions malloc() something to return, the
daywalker5d945de2003-09-26 00:32:53 +00002052 * corresponding post_ function had better free() it!
2053 */
njn25e49d8e72002-09-23 09:36:25 +00002054extern void* SK_( pre_syscall) ( ThreadId tid, UInt syscallno,
2055 Bool is_blocking );
2056extern void SK_(post_syscall) ( ThreadId tid, UInt syscallno,
2057 void* pre_result, Int res,
2058 Bool is_blocking );
2059
njnd5bb0a52002-09-27 10:24:48 +00002060
njn25e49d8e72002-09-23 09:36:25 +00002061/* ---------------------------------------------------------------------
2062 VG_(needs).sanity_checks */
2063
njnd5bb0a52002-09-27 10:24:48 +00002064/* Can be useful for ensuring a skin's correctness. SK_(cheap_sanity_check)
2065 is called very frequently; SK_(expensive_sanity_check) is called less
2066 frequently and can be more involved. */
njn25e49d8e72002-09-23 09:36:25 +00002067extern Bool SK_(cheap_sanity_check) ( void );
2068extern Bool SK_(expensive_sanity_check) ( void );
2069
2070
2071#endif /* NDEF __VG_SKIN_H */
2072
2073/*--------------------------------------------------------------------*/
2074/*--- end vg_skin.h ---*/
2075/*--------------------------------------------------------------------*/
2076