blob: ba23074e3a91e2e90aee8d83cd3010f06c32f037 [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*/
jseward157689b2003-11-05 23:59:21 +0000119#define VG_CORE_INTERFACE_MAJOR_VERSION 5
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, /* '?' == '-' */
fitzhardinge39de4b42003-10-31 07:12:21 +0000173 Vg_DebugExtraMsg, /* '?' == '+' */
174 Vg_ClientMsg, /* '?' == '*' */
njn25e49d8e72002-09-23 09:36:25 +0000175 }
176 VgMsgKind;
177
178/* Functions for building a message from multiple parts. */
fitzhardinge39de4b42003-10-31 07:12:21 +0000179extern int VG_(start_msg) ( VgMsgKind kind );
180extern int VG_(add_to_msg) ( Char* format, ... );
njn25e49d8e72002-09-23 09:36:25 +0000181/* Ends and prints the message. Appends a newline. */
fitzhardinge39de4b42003-10-31 07:12:21 +0000182extern int VG_(end_msg) ( void );
njn25e49d8e72002-09-23 09:36:25 +0000183
njnd5bb0a52002-09-27 10:24:48 +0000184/* Send a single-part message. Appends a newline. */
fitzhardinge39de4b42003-10-31 07:12:21 +0000185extern int VG_(message) ( VgMsgKind kind, Char* format, ... );
186extern int VG_(vmessage) ( VgMsgKind kind, Char* format, va_list vargs );
njn25e49d8e72002-09-23 09:36:25 +0000187
188
189/*====================================================================*/
190/*=== Profiling ===*/
191/*====================================================================*/
192
193/* Nb: VGP_(register_profile_event)() relies on VgpUnc being the first one */
194#define VGP_CORE_LIST \
195 /* These ones depend on the core */ \
196 VGP_PAIR(VgpUnc, "unclassified"), \
197 VGP_PAIR(VgpRun, "running"), \
198 VGP_PAIR(VgpSched, "scheduler"), \
199 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
200 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
njn25e49d8e72002-09-23 09:36:25 +0000201 VGP_PAIR(VgpTranslate, "translate-main"), \
202 VGP_PAIR(VgpToUCode, "to-ucode"), \
203 VGP_PAIR(VgpFromUcode, "from-ucode"), \
204 VGP_PAIR(VgpImprove, "improve"), \
njn9b007f62003-04-07 14:40:25 +0000205 VGP_PAIR(VgpESPUpdate, "ESP-update"), \
njn25e49d8e72002-09-23 09:36:25 +0000206 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
207 VGP_PAIR(VgpLiveness, "liveness-analysis"), \
208 VGP_PAIR(VgpDoLRU, "do-lru"), \
209 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
210 VGP_PAIR(VgpInitMem, "init-memory"), \
211 VGP_PAIR(VgpExeContext, "exe-context"), \
212 VGP_PAIR(VgpReadSyms, "read-syms"), \
213 VGP_PAIR(VgpSearchSyms, "search-syms"), \
214 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
215 VGP_PAIR(VgpCoreSysWrap, "core-syscall-wrapper"), \
216 VGP_PAIR(VgpDemangle, "demangle"), \
njn37cea302002-09-30 11:24:00 +0000217 VGP_PAIR(VgpCoreCheapSanity, "core-cheap-sanity"), \
218 VGP_PAIR(VgpCoreExpensiveSanity, "core-expensive-sanity"), \
njn25e49d8e72002-09-23 09:36:25 +0000219 /* These ones depend on the skin */ \
220 VGP_PAIR(VgpPreCloInit, "pre-clo-init"), \
221 VGP_PAIR(VgpPostCloInit, "post-clo-init"), \
222 VGP_PAIR(VgpInstrument, "instrument"), \
223 VGP_PAIR(VgpSkinSysWrap, "skin-syscall-wrapper"), \
njn37cea302002-09-30 11:24:00 +0000224 VGP_PAIR(VgpSkinCheapSanity, "skin-cheap-sanity"), \
225 VGP_PAIR(VgpSkinExpensiveSanity, "skin-expensive-sanity"), \
njn25e49d8e72002-09-23 09:36:25 +0000226 VGP_PAIR(VgpFini, "fini")
227
228#define VGP_PAIR(n,name) n
229typedef enum { VGP_CORE_LIST } VgpCoreCC;
230#undef VGP_PAIR
231
232/* When registering skin profiling events, ensure that the 'n' value is in
233 * the range (VgpFini+1..) */
234extern void VGP_(register_profile_event) ( Int n, Char* name );
235
236extern void VGP_(pushcc) ( UInt cc );
237extern void VGP_(popcc) ( UInt cc );
238
239/* Define them only if they haven't already been defined by vg_profile.c */
240#ifndef VGP_PUSHCC
241# define VGP_PUSHCC(x)
242#endif
243#ifndef VGP_POPCC
244# define VGP_POPCC(x)
245#endif
246
247
248/*====================================================================*/
249/*=== Useful stuff to call from generated code ===*/
250/*====================================================================*/
251
252/* ------------------------------------------------------------------ */
253/* General stuff */
254
njn41557122002-10-14 09:25:37 +0000255/* 64-bit counter for the number of basic blocks done. */
256extern ULong VG_(bbs_done);
257
njn25e49d8e72002-09-23 09:36:25 +0000258/* Get the simulated %esp */
259extern Addr VG_(get_stack_pointer) ( void );
260
sewardjecf8e102003-07-12 12:11:39 +0000261/* Detect if an address is within Valgrind's stack, Valgrind's
262 m_state_static, or the VG_(threads) array. This is useful for
263 memory leak detectors to rule out spurious pointers to a block. */
njn25e49d8e72002-09-23 09:36:25 +0000264extern Bool VG_(within_stack)(Addr a);
sewardjecf8e102003-07-12 12:11:39 +0000265extern Bool VG_(within_m_state_static_OR_threads)(Addr a);
njn25e49d8e72002-09-23 09:36:25 +0000266
267/* Check if an address is 4-byte aligned */
268#define IS_ALIGNED4_ADDR(aaa_p) (0 == (((UInt)(aaa_p)) & 3))
njn9b007f62003-04-07 14:40:25 +0000269#define IS_ALIGNED8_ADDR(aaa_p) (0 == (((UInt)(aaa_p)) & 7))
njn25e49d8e72002-09-23 09:36:25 +0000270
271
272/* ------------------------------------------------------------------ */
273/* Thread-related stuff */
274
275/* Special magic value for an invalid ThreadId. It corresponds to
276 LinuxThreads using zero as the initial value for
277 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
278#define VG_INVALID_THREADID ((ThreadId)(0))
279
njn72718642003-07-24 08:45:32 +0000280/* ThreadIds are simply indices into the VG_(threads)[] array. */
daywalker5d945de2003-09-26 00:32:53 +0000281typedef
282 UInt
njn25e49d8e72002-09-23 09:36:25 +0000283 ThreadId;
284
njn72718642003-07-24 08:45:32 +0000285/* When looking for the current ThreadId, this is the safe option and
286 probably the one you want.
daywalker5d945de2003-09-26 00:32:53 +0000287
njn72718642003-07-24 08:45:32 +0000288 Details: Use this one from non-generated code, eg. from functions called
289 on events like 'new_mem_heap'. In such a case, the "current" thread is
290 temporarily suspended as Valgrind's dispatcher is running. This function
291 is also suitable to be called from generated code (ie. from UCode, or a C
292 function called directly from UCode).
daywalker5d945de2003-09-26 00:32:53 +0000293
njn72718642003-07-24 08:45:32 +0000294 If you use VG_(get_current_tid)() from non-generated code, it will return
295 0 signifying the invalid thread, which is probably not what you want. */
296extern ThreadId VG_(get_current_or_recent_tid) ( void );
njn25e49d8e72002-09-23 09:36:25 +0000297
njn72718642003-07-24 08:45:32 +0000298/* When looking for the current ThreadId, only use this one if you know what
299 you are doing.
daywalker5d945de2003-09-26 00:32:53 +0000300
njn72718642003-07-24 08:45:32 +0000301 Details: Use this one from generated code, eg. from C functions called
302 from UCode. (VG_(get_current_or_recent_tid)() is also suitable in that
303 case.) If you use this function from non-generated code, it will return
304 0 signifying the invalid thread, which is probably not what you want. */
305extern ThreadId VG_(get_current_tid) ( void );
njn25e49d8e72002-09-23 09:36:25 +0000306
njn3e884182003-04-15 13:03:23 +0000307/* Searches through all thread's stacks to see if any match. Returns
njn72718642003-07-24 08:45:32 +0000308 VG_INVALID_THREADID if none match. */
njn3e884182003-04-15 13:03:23 +0000309extern ThreadId VG_(first_matching_thread_stack)
310 ( Bool (*p) ( Addr stack_min, Addr stack_max ));
311
njn25e49d8e72002-09-23 09:36:25 +0000312
313/*====================================================================*/
314/*=== Valgrind's version of libc ===*/
315/*====================================================================*/
316
317/* Valgrind doesn't use libc at all, for good reasons (trust us). So here
318 are its own versions of C library functions, but with VG_ prefixes. Note
319 that the types of some are slightly different to the real ones. Some
njnf4ce3d32003-02-10 10:17:26 +0000320 additional useful functions are provided too; descriptions of how they
321 work are given below. */
njn25e49d8e72002-09-23 09:36:25 +0000322
323#if !defined(NULL)
324# define NULL ((void*)0)
325#endif
326
327
328/* ------------------------------------------------------------------ */
329/* stdio.h
330 *
331 * Note that they all output to the file descriptor given by the
332 * --logfile-fd=N argument, which defaults to 2 (stderr). Hence no
daywalker5d945de2003-09-26 00:32:53 +0000333 * need for VG_(fprintf)().
njn25e49d8e72002-09-23 09:36:25 +0000334 */
sewardj78e3cd92002-10-22 04:45:48 +0000335extern UInt VG_(printf) ( const char *format, ... );
njn25e49d8e72002-09-23 09:36:25 +0000336/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
sewardj78e3cd92002-10-22 04:45:48 +0000337extern UInt VG_(sprintf) ( Char* buf, Char *format, ... );
daywalker5d945de2003-09-26 00:32:53 +0000338extern UInt VG_(vprintf) ( void(*send)(Char),
njn25e49d8e72002-09-23 09:36:25 +0000339 const Char *format, va_list vargs );
340
njn41557122002-10-14 09:25:37 +0000341extern Int VG_(rename) ( Char* old_name, Char* new_name );
342
njn25e49d8e72002-09-23 09:36:25 +0000343/* ------------------------------------------------------------------ */
344/* stdlib.h */
345
346extern void* VG_(malloc) ( Int nbytes );
njnd5bb0a52002-09-27 10:24:48 +0000347extern void VG_(free) ( void* p );
348extern void* VG_(calloc) ( Int n, Int nbytes );
349extern void* VG_(realloc) ( void* p, Int size );
350extern void* VG_(malloc_aligned) ( Int align_bytes, Int nbytes );
njn25e49d8e72002-09-23 09:36:25 +0000351
352extern void VG_(print_malloc_stats) ( void );
353
354
355extern void VG_(exit)( Int status )
356 __attribute__ ((__noreturn__));
njne427a662002-10-02 11:08:25 +0000357/* Prints a panic message (a constant string), appends newline and bug
358 reporting info, aborts. */
359__attribute__ ((__noreturn__))
360extern void VG_(skin_panic) ( Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000361
njnd5bb0a52002-09-27 10:24:48 +0000362/* Looks up VG_(client_envp) */
njn25e49d8e72002-09-23 09:36:25 +0000363extern Char* VG_(getenv) ( Char* name );
364
rjwalshf5f536f2003-11-17 17:45:00 +0000365/* Get client resource limit*/
366extern Int VG_(getrlimit) ( Int resource, struct vki_rlimit *rlim );
367
njn25e49d8e72002-09-23 09:36:25 +0000368/* Crude stand-in for the glibc system() call. */
369extern Int VG_(system) ( Char* cmd );
370
njnd5bb0a52002-09-27 10:24:48 +0000371extern Long VG_(atoll) ( Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000372
373/* Like atoll(), but converts a number of base 2..36 */
374extern Long VG_(atoll36) ( UInt base, Char* str );
375
njne36543a2003-09-30 15:37:24 +0000376/* Like qsort(), but does shell-sort. The size==1/2/4 cases are specialised. */
njnd3b0c5f2003-09-30 14:43:54 +0000377extern void VG_(ssort)( void* base, UInt nmemb, UInt size,
378 Int (*compar)(void*, void*) );
379
njn25e49d8e72002-09-23 09:36:25 +0000380
381/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000382/* ctype.h */
njn25e49d8e72002-09-23 09:36:25 +0000383extern Bool VG_(isspace) ( Char c );
384extern Bool VG_(isdigit) ( Char c );
385extern Char VG_(toupper) ( Char c );
386
387
388/* ------------------------------------------------------------------ */
389/* string.h */
390extern Int VG_(strlen) ( const Char* str );
391extern Char* VG_(strcat) ( Char* dest, const Char* src );
392extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
393extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
394extern Char* VG_(strcpy) ( Char* dest, const Char* src );
395extern Char* VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
396extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
397extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
398extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
399extern Char* VG_(strchr) ( const Char* s, Char c );
400extern Char* VG_(strdup) ( const Char* s);
sewardj7ab2aca2002-10-20 19:40:32 +0000401extern void* VG_(memcpy) ( void *d, const void *s, Int sz );
402extern void* VG_(memset) ( void *s, Int c, Int sz );
njn6d68e792003-02-24 10:49:08 +0000403extern Int VG_(memcmp) ( const void* s1, const void* s2, Int n );
njn25e49d8e72002-09-23 09:36:25 +0000404
njnd5bb0a52002-09-27 10:24:48 +0000405/* Like strcmp() and strncmp(), but stop comparing at any whitespace. */
njn25e49d8e72002-09-23 09:36:25 +0000406extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
njn25e49d8e72002-09-23 09:36:25 +0000407extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
408
daywalker5d945de2003-09-26 00:32:53 +0000409/* Like strncpy(), but if 'src' is longer than 'ndest' inserts a '\0' as the
njnd5bb0a52002-09-27 10:24:48 +0000410 last character. */
njn25e49d8e72002-09-23 09:36:25 +0000411extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
412
413/* Mini-regexp function. Searches for 'pat' in 'str'. Supports
414 * meta-symbols '*' and '?'. '\' escapes meta-symbols. */
njn4ba5a792002-09-30 10:23:54 +0000415extern Bool VG_(string_match) ( Char* pat, Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000416
417
418/* ------------------------------------------------------------------ */
419/* math.h */
njnd5bb0a52002-09-27 10:24:48 +0000420/* Returns the base-2 logarithm of x. */
njn25e49d8e72002-09-23 09:36:25 +0000421extern Int VG_(log2) ( Int x );
422
423
424/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000425/* unistd.h, fcntl.h, sys/stat.h */
rjwalshf5f536f2003-11-17 17:45:00 +0000426extern Int VG_(getdents)( UInt fd, struct vki_dirent *dirp, UInt count );
427extern Int VG_(readlink)( Char* path, Char* buf, UInt bufsize );
sewardj4cf05692002-10-27 20:28:29 +0000428extern Int VG_(getpid) ( void );
429extern Int VG_(getppid) ( void );
jsgf855d93d2003-10-13 22:26:55 +0000430extern Int VG_(getpgrp) ( void );
431extern Int VG_(gettid) ( void );
432extern Int VG_(setpgid) ( Int pid, Int pgrp );
njnd5bb0a52002-09-27 10:24:48 +0000433
njn4aca2d22002-10-04 10:29:38 +0000434extern Int VG_(open) ( const Char* pathname, Int flags, Int mode );
435extern Int VG_(read) ( Int fd, void* buf, Int count);
jsgf855d93d2003-10-13 22:26:55 +0000436extern Int VG_(write) ( Int fd, const void* buf, Int count);
rjwalshf5f536f2003-11-17 17:45:00 +0000437extern Int VG_(lseek) ( Int fd, Long offset, Int whence);
njn4aca2d22002-10-04 10:29:38 +0000438extern void VG_(close) ( Int fd );
njnd5bb0a52002-09-27 10:24:48 +0000439
jsgf855d93d2003-10-13 22:26:55 +0000440extern Int VG_(pipe) ( Int fd[2] );
441
njn41557122002-10-14 09:25:37 +0000442/* Nb: VG_(rename)() declared in stdio.h section above */
njn4aca2d22002-10-04 10:29:38 +0000443extern Int VG_(unlink) ( Char* file_name );
444extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
njnc9d4ba72003-10-15 10:34:03 +0000445extern Int VG_(fstat) ( Int fd, struct vki_stat* buf );
fitzhardingee1c06d82003-10-30 07:21:44 +0000446extern Int VG_(dup2) ( Int oldfd, Int newfd );
njn25e49d8e72002-09-23 09:36:25 +0000447
njn13f02932003-04-30 20:23:58 +0000448extern Char* VG_(getcwd) ( Char* buf, Int size );
449
njn99ccf082003-09-30 13:51:23 +0000450/* Easier to use than VG_(getcwd)() -- does the buffer fiddling itself.
451 String put into 'cwd' is VG_(malloc)'d, and should be VG_(free)'d.
452 Returns False if it fails. Will fail if the pathname is > 65535 bytes. */
453extern Bool VG_(getcwd_alloc) ( Char** cwd );
njn25e49d8e72002-09-23 09:36:25 +0000454
455/* ------------------------------------------------------------------ */
456/* assert.h */
457/* Asserts permanently enabled -- no turning off with NDEBUG. Hurrah! */
458#define VG__STRING(__str) #__str
459
njne427a662002-10-02 11:08:25 +0000460#define sk_assert(expr) \
njn25e49d8e72002-09-23 09:36:25 +0000461 ((void) ((expr) ? 0 : \
njne427a662002-10-02 11:08:25 +0000462 (VG_(skin_assert_fail) (VG__STRING(expr), \
463 __FILE__, __LINE__, \
464 __PRETTY_FUNCTION__), 0)))
njn25e49d8e72002-09-23 09:36:25 +0000465
njne427a662002-10-02 11:08:25 +0000466__attribute__ ((__noreturn__))
daywalker5d945de2003-09-26 00:32:53 +0000467extern void VG_(skin_assert_fail) ( const Char* expr, const Char* file,
daywalkerdf9ae422003-09-18 01:41:48 +0000468 Int line, const Char* fn );
njn25e49d8e72002-09-23 09:36:25 +0000469
470
471/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000472/* system/mman.h */
daywalker5d945de2003-09-26 00:32:53 +0000473extern void* VG_(mmap)( void* start, UInt length,
njn25e49d8e72002-09-23 09:36:25 +0000474 UInt prot, UInt flags, UInt fd, UInt offset );
475extern Int VG_(munmap)( void* start, Int length );
476
477/* Get memory by anonymous mmap. */
478extern void* VG_(get_memory_from_mmap) ( Int nBytes, Char* who );
479
480
481/* ------------------------------------------------------------------ */
daywalker5d945de2003-09-26 00:32:53 +0000482/* signal.h.
483
njn25e49d8e72002-09-23 09:36:25 +0000484 Note that these use the vk_ (kernel) structure
485 definitions, which are different in places from those that glibc
486 defines -- hence the 'k' prefix. Since we're operating right at the
487 kernel interface, glibc's view of the world is entirely irrelevant. */
488
489/* --- Signal set ops --- */
njnd5bb0a52002-09-27 10:24:48 +0000490extern Int VG_(ksigfillset) ( vki_ksigset_t* set );
491extern Int VG_(ksigemptyset) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000492
njnd5bb0a52002-09-27 10:24:48 +0000493extern Bool VG_(kisfullsigset) ( vki_ksigset_t* set );
494extern Bool VG_(kisemptysigset) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000495
njnd5bb0a52002-09-27 10:24:48 +0000496extern Int VG_(ksigaddset) ( vki_ksigset_t* set, Int signum );
497extern Int VG_(ksigdelset) ( vki_ksigset_t* set, Int signum );
njn25e49d8e72002-09-23 09:36:25 +0000498extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
499
njnd5bb0a52002-09-27 10:24:48 +0000500extern void VG_(ksigaddset_from_set) ( vki_ksigset_t* dst, vki_ksigset_t* src );
501extern void VG_(ksigdelset_from_set) ( vki_ksigset_t* dst, vki_ksigset_t* src );
njn25e49d8e72002-09-23 09:36:25 +0000502
503/* --- Mess with the kernel's sig state --- */
daywalker5d945de2003-09-26 00:32:53 +0000504extern Int VG_(ksigprocmask) ( Int how, const vki_ksigset_t* set,
njn25e49d8e72002-09-23 09:36:25 +0000505 vki_ksigset_t* oldset );
daywalker5d945de2003-09-26 00:32:53 +0000506extern Int VG_(ksigaction) ( Int signum,
507 const vki_ksigaction* act,
njnd5bb0a52002-09-27 10:24:48 +0000508 vki_ksigaction* oldact );
njn25e49d8e72002-09-23 09:36:25 +0000509
jsgf855d93d2003-10-13 22:26:55 +0000510extern Int VG_(ksigtimedwait)( const vki_ksigset_t *, vki_ksiginfo_t *,
511 const struct vki_timespec * );
512
njnd5bb0a52002-09-27 10:24:48 +0000513extern Int VG_(ksignal) ( Int signum, void (*sighandler)(Int) );
514extern Int VG_(ksigaltstack) ( const vki_kstack_t* ss, vki_kstack_t* oss );
njn25e49d8e72002-09-23 09:36:25 +0000515
sewardjdcaf3122002-09-30 23:12:33 +0000516extern Int VG_(kkill) ( Int pid, Int signo );
jsgf855d93d2003-10-13 22:26:55 +0000517extern Int VG_(ktkill) ( Int pid, Int signo );
sewardjdcaf3122002-09-30 23:12:33 +0000518extern Int VG_(ksigpending) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000519
jsgf855d93d2003-10-13 22:26:55 +0000520extern Int VG_(waitpid) ( Int pid, Int *status, Int options );
njn25e49d8e72002-09-23 09:36:25 +0000521
njne7442cf2003-09-30 14:03:21 +0000522/* ------------------------------------------------------------------ */
rjwalshf5f536f2003-11-17 17:45:00 +0000523/* socket.h. */
524
525extern Int VG_(getsockname) ( Int sd, struct vki_sockaddr *name, Int *namelen);
526extern Int VG_(getpeername) ( Int sd, struct vki_sockaddr *name, Int *namelen);
527extern Int VG_(getsockopt) ( Int sd, Int level, Int optname, void *optval,
528 Int *optlen);
529
530/* ------------------------------------------------------------------ */
njne7442cf2003-09-30 14:03:21 +0000531/* other, randomly useful functions */
532extern UInt VG_(read_millisecond_timer) ( void );
533
njn25e49d8e72002-09-23 09:36:25 +0000534/*====================================================================*/
535/*=== UCode definition ===*/
536/*====================================================================*/
537
sewardje1042472002-09-30 12:33:11 +0000538/* Tags which describe what operands are. Must fit into 4 bits, which
539 they clearly do. */
njn25e49d8e72002-09-23 09:36:25 +0000540typedef
sewardje1042472002-09-30 12:33:11 +0000541enum { TempReg =0, /* virtual temp-reg */
542 ArchReg =1, /* simulated integer reg */
543 ArchRegS =2, /* simulated segment reg */
544 RealReg =3, /* real machine's real reg */
545 SpillNo =4, /* spill slot location */
546 Literal =5, /* literal; .lit32 field has actual value */
547 Lit16 =6, /* literal; .val[123] field has actual value */
548 NoValue =7 /* operand not in use */
549 }
550 Tag;
njn25e49d8e72002-09-23 09:36:25 +0000551
njnd5bb0a52002-09-27 10:24:48 +0000552/* Invalid register numbers (can't be negative) */
njn25e49d8e72002-09-23 09:36:25 +0000553#define INVALID_TEMPREG 999999999
554#define INVALID_REALREG 999999999
555
556/* Microinstruction opcodes. */
557typedef
558 enum {
njnd5bb0a52002-09-27 10:24:48 +0000559 NOP, /* Null op */
njn25e49d8e72002-09-23 09:36:25 +0000560
daywalker7e73e5f2003-07-04 16:18:15 +0000561 LOCK, /* Indicate the existence of a LOCK prefix (functionally NOP) */
sewardj7a5ebcf2002-11-13 22:42:13 +0000562
njnd5bb0a52002-09-27 10:24:48 +0000563 /* Moving values around */
564 GET, PUT, /* simulated register <--> TempReg */
565 GETF, PUTF, /* simulated %eflags <--> TempReg */
566 LOAD, STORE, /* memory <--> TempReg */
567 MOV, /* TempReg <--> TempReg */
568 CMOV, /* Used for cmpxchg and cmov */
njn25e49d8e72002-09-23 09:36:25 +0000569
njnd5bb0a52002-09-27 10:24:48 +0000570 /* Arithmetic/logical ops */
jsgf5efa4fd2003-10-14 21:49:11 +0000571 MUL, UMUL, /* Multiply */
njnd5bb0a52002-09-27 10:24:48 +0000572 ADD, ADC, SUB, SBB, /* Add/subtract (w/wo carry) */
573 AND, OR, XOR, NOT, /* Boolean ops */
574 SHL, SHR, SAR, ROL, ROR, RCL, RCR, /* Shift/rotate (w/wo carry) */
575 NEG, /* Negate */
576 INC, DEC, /* Increment/decrement */
577 BSWAP, /* Big-endian <--> little-endian */
578 CC2VAL, /* Condition code --> 0 or 1 */
579 WIDEN, /* Signed or unsigned widening */
njn25e49d8e72002-09-23 09:36:25 +0000580
njnd5bb0a52002-09-27 10:24:48 +0000581 /* Conditional or unconditional jump */
daywalker5d945de2003-09-26 00:32:53 +0000582 JMP,
njnd5bb0a52002-09-27 10:24:48 +0000583
584 /* FPU ops */
585 FPU, /* Doesn't touch memory */
586 FPU_R, FPU_W, /* Reads/writes memory */
587
sewardj3d7c9c82003-03-26 21:08:13 +0000588 /* ------------ MMX ops ------------ */
sewardj8cec6ee2003-05-18 11:56:39 +0000589 /* In this and the SSE encoding, bytes at higher addresses are
590 held in bits [7:0] in these 16-bit words. I guess this means
591 it is a big-endian encoding. */
sewardj3d7c9c82003-03-26 21:08:13 +0000592
593 /* 1 byte, no memrefs, no iregdefs, copy exactly to the
594 output. Held in val1[7:0]. */
595 MMX1,
596
597 /* 2 bytes, no memrefs, no iregdefs, copy exactly to the
598 output. Held in val1[15:0]. */
599 MMX2,
600
601 /* 3 bytes, no memrefs, no iregdefs, copy exactly to the
602 output. Held in val1[15:0] and val2[7:0]. */
603 MMX3,
604
605 /* 2 bytes, reads/writes mem. Insns of the form
606 bbbbbbbb:mod mmxreg r/m.
607 Held in val1[15:0], and mod and rm are to be replaced
daywalker5d945de2003-09-26 00:32:53 +0000608 at codegen time by a reference to the Temp/RealReg holding
sewardj3d7c9c82003-03-26 21:08:13 +0000609 the address. Arg2 holds this Temp/Real Reg.
610 Transfer is always at size 8.
611 */
612 MMX2_MemRd,
613 MMX2_MemWr,
614
sewardj4fbe6e92003-06-15 21:54:34 +0000615 /* 2 bytes, reads/writes an integer ("E") register. Insns of the form
sewardj3d7c9c82003-03-26 21:08:13 +0000616 bbbbbbbb:11 mmxreg ireg.
617 Held in val1[15:0], and ireg is to be replaced
618 at codegen time by a reference to the relevant RealReg.
619 Transfer is always at size 4. Arg2 holds this Temp/Real Reg.
620 */
sewardj4fbe6e92003-06-15 21:54:34 +0000621 MMX2_ERegRd,
622 MMX2_ERegWr,
sewardj3d7c9c82003-03-26 21:08:13 +0000623
sewardj8cec6ee2003-05-18 11:56:39 +0000624 /* ------------ SSE/SSE2 ops ------------ */
625 /* In the following:
626
sewardjfebaa3b2003-05-25 01:07:34 +0000627 a digit N indicates the next N bytes are to be copied exactly
628 to the output.
sewardj8cec6ee2003-05-18 11:56:39 +0000629
630 'a' indicates a mod-xmmreg-rm byte, where the mod-rm part is
631 to be replaced at codegen time to a Temp/RealReg holding the
632 address.
633
sewardj4fbe6e92003-06-15 21:54:34 +0000634 'e' indicates a byte of the form '11 xmmreg ireg', where ireg
635 is read or written, and is to be replaced at codegen time by
636 a reference to the relevant RealReg. 'e' because it's the E
637 reg in Intel encoding parlance.
sewardj8cec6ee2003-05-18 11:56:39 +0000638
sewardj4fbe6e92003-06-15 21:54:34 +0000639 'g' indicates a byte of the form '11 ireg xmmreg', where ireg
640 is read or written, and is to be replaced at codegen time by
641 a reference to the relevant RealReg. 'g' because it's called
642 G in Intel parlance. */
sewardj8cec6ee2003-05-18 11:56:39 +0000643
644 /* 3 bytes, no memrefs, no iregdefs, copy exactly to the
645 output. Held in val1[15:0] and val2[7:0]. */
646 SSE3,
647
648 /* 3 bytes, reads/writes mem. Insns of the form
649 bbbbbbbb:bbbbbbbb:mod mmxreg r/m.
650 Held in val1[15:0] and val2[7:0], and mod and rm are to be
651 replaced at codegen time by a reference to the Temp/RealReg
652 holding the address. Arg3 holds this Temp/Real Reg.
sewardjfebaa3b2003-05-25 01:07:34 +0000653 Transfer is usually, but not always, at size 16. */
sewardj8cec6ee2003-05-18 11:56:39 +0000654 SSE2a_MemRd,
655 SSE2a_MemWr,
656
657 /* 4 bytes, no memrefs, no iregdefs, copy exactly to the
658 output. Held in val1[15:0] and val2[15:0]. */
659 SSE4,
660
661 /* 4 bytes, reads/writes mem. Insns of the form
662 bbbbbbbb:bbbbbbbb:bbbbbbbb:mod mmxreg r/m.
663 Held in val1[15:0] and val2[15:0], and mod and rm are to be
664 replaced at codegen time by a reference to the Temp/RealReg
665 holding the address. Arg3 holds this Temp/Real Reg.
sewardj9dd209f2003-06-18 23:30:52 +0000666 Transfer is at stated size. */
sewardj8cec6ee2003-05-18 11:56:39 +0000667 SSE3a_MemRd,
668 SSE3a_MemWr,
669
670 /* 4 bytes, reads/writes mem. Insns of the form
671 bbbbbbbb:bbbbbbbb:mod mmxreg r/m:bbbbbbbb
672 Held in val1[15:0] and val2[15:0], and mod and rm are to be
673 replaced at codegen time by a reference to the Temp/RealReg
674 holding the address. Arg3 holds this Temp/Real Reg.
sewardj9dd209f2003-06-18 23:30:52 +0000675 Transfer is at stated size. */
sewardj8cec6ee2003-05-18 11:56:39 +0000676 SSE2a1_MemRd,
sewardj77d30a22003-10-19 08:18:52 +0000677
sewardj8cec6ee2003-05-18 11:56:39 +0000678 /* 4 bytes, writes an integer register. Insns of the form
sewardj4fbe6e92003-06-15 21:54:34 +0000679 bbbbbbbb:bbbbbbbb:bbbbbbbb:11 ireg bbb.
sewardj8cec6ee2003-05-18 11:56:39 +0000680 Held in val1[15:0] and val2[15:0], and ireg is to be replaced
681 at codegen time by a reference to the relevant RealReg.
682 Transfer is always at size 4. Arg3 holds this Temp/Real Reg.
683 */
684 SSE3g_RegWr,
685
sewardjb31b06d2003-06-13 00:26:02 +0000686 /* 5 bytes, writes an integer register. Insns of the form
687 bbbbbbbb:bbbbbbbb:bbbbbbbb: 11 ireg bbb :bbbbbbbb. Held in
688 val1[15:0] and val2[15:0] and lit32[7:0], and ireg is to be
689 replaced at codegen time by a reference to the relevant
690 RealReg. Transfer is always at size 4. Arg3 holds this
691 Temp/Real Reg.
692 */
693 SSE3g1_RegWr,
694
sewardj4fbe6e92003-06-15 21:54:34 +0000695 /* 4 bytes, reads an integer register. Insns of the form
696 bbbbbbbb:bbbbbbbb:bbbbbbbb:11 bbb ireg.
697 Held in val1[15:0] and val2[15:0], and ireg is to be replaced
698 at codegen time by a reference to the relevant RealReg.
699 Transfer is always at size 4. Arg3 holds this Temp/Real Reg.
700 */
701 SSE3e_RegRd,
sewardjabf8bf82003-06-15 22:28:05 +0000702 SSE3e_RegWr, /* variant that writes Ereg, not reads it */
sewardj4fbe6e92003-06-15 21:54:34 +0000703
sewardjb31b06d2003-06-13 00:26:02 +0000704 /* 5 bytes, reads an integer register. Insns of the form
705 bbbbbbbb:bbbbbbbb:bbbbbbbb: 11 bbb ireg :bbbbbbbb. Held in
706 val1[15:0] and val2[15:0] and lit32[7:0], and ireg is to be
707 replaced at codegen time by a reference to the relevant
708 RealReg. Transfer is always at size 4. Arg3 holds this
709 Temp/Real Reg.
710 */
sewardj4fbe6e92003-06-15 21:54:34 +0000711 SSE3e1_RegRd,
sewardj8cec6ee2003-05-18 11:56:39 +0000712
sewardj02af6bc2003-06-12 00:56:06 +0000713 /* 4 bytes, reads memory, writes an integer register, but is
714 nevertheless an SSE insn. The insn is of the form
715 bbbbbbbb:bbbbbbbb:bbbbbbbb:mod ireg rm where mod indicates
716 memory (ie is not 11b) and ireg is the int reg written. The
sewardje3891fa2003-06-15 03:13:48 +0000717 first 4 bytes are held in lit32[31:0] since there is
sewardj02af6bc2003-06-12 00:56:06 +0000718 insufficient space elsewhere. mod and rm are to be replaced
719 at codegen time by a reference to the Temp/RealReg holding
720 the address. Arg1 holds this Temp/RealReg. ireg is to be
721 replaced at codegen time by a reference to the relevant
722 RealReg in which the answer is to be written. Arg2 holds
723 this Temp/RealReg. Transfer to the destination reg is always
724 at size 4. However the memory read can be at sizes 4 or 8
sewardje3891fa2003-06-15 03:13:48 +0000725 and so this is what the sz field holds. Note that the 4th
726 byte of the instruction (the modrm byte) is redundant, but we
727 store it anyway so as to be consistent with all other SSE
728 uinstrs.
sewardj02af6bc2003-06-12 00:56:06 +0000729 */
730 SSE3ag_MemRd_RegWr,
sewardje3891fa2003-06-15 03:13:48 +0000731
sewardj8cec6ee2003-05-18 11:56:39 +0000732 /* 5 bytes, no memrefs, no iregdefs, copy exactly to the
733 output. Held in val1[15:0], val2[15:0] and val3[7:0]. */
734 SSE5,
sewardj77d30a22003-10-19 08:18:52 +0000735
sewardj8cec6ee2003-05-18 11:56:39 +0000736 /* 5 bytes, reads/writes mem. Insns of the form
737 bbbbbbbb:bbbbbbbb:bbbbbbbb:mod mmxreg r/m:bbbbbbbb
daywalker5d945de2003-09-26 00:32:53 +0000738 Held in val1[15:0], val2[15:0], lit32[7:0].
739 mod and rm are to be replaced at codegen time by a reference
740 to the Temp/RealReg holding the address. Arg3 holds this
sewardj8cec6ee2003-05-18 11:56:39 +0000741 Temp/Real Reg. Transfer is always at size 16. */
742 SSE3a1_MemRd,
sewardj77d30a22003-10-19 08:18:52 +0000743
sewardj3d7c9c82003-03-26 21:08:13 +0000744 /* ------------------------ */
745
njnd5bb0a52002-09-27 10:24:48 +0000746 /* Not strictly needed, but improve address calculation translations. */
njn25e49d8e72002-09-23 09:36:25 +0000747 LEA1, /* reg2 := const + reg1 */
748 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
749
sewardj8cec6ee2003-05-18 11:56:39 +0000750 /* Hack for x86 REP insns. Jump to literal if TempReg/RealReg
751 is zero. */
njnd5bb0a52002-09-27 10:24:48 +0000752 JIFZ,
njn25e49d8e72002-09-23 09:36:25 +0000753
njnd5bb0a52002-09-27 10:24:48 +0000754 /* Advance the simulated %eip by some small (< 128) number. */
755 INCEIP,
njn25e49d8e72002-09-23 09:36:25 +0000756
sewardje1042472002-09-30 12:33:11 +0000757 /* Dealing with segment registers */
758 GETSEG, PUTSEG, /* simulated segment register <--> TempReg */
759 USESEG, /* (LDT/GDT index, virtual addr) --> linear addr */
760
njnd5bb0a52002-09-27 10:24:48 +0000761 /* Not for translating x86 calls -- only to call helpers */
762 CALLM_S, CALLM_E, /* Mark start/end of CALLM push/pop sequence */
763 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers */
764 CALLM, /* Call assembly-code helper */
765
766 /* Not for translating x86 calls -- only to call C helper functions of
767 up to three arguments (or two if the functions has a return value).
768 Arguments and return value must be word-sized. More arguments can
769 be faked with global variables (eg. use VG_(set_global_var)()).
770
771 Seven possibilities: 'arg[123]' show where args go, 'ret' shows
772 where return value goes (if present).
daywalker5d945de2003-09-26 00:32:53 +0000773
njn25e49d8e72002-09-23 09:36:25 +0000774 CCALL(-, -, - ) void f(void)
775 CCALL(arg1, -, - ) void f(UInt arg1)
776 CCALL(arg1, arg2, - ) void f(UInt arg1, UInt arg2)
777 CCALL(arg1, arg2, arg3) void f(UInt arg1, UInt arg2, UInt arg3)
778 CCALL(-, -, ret ) UInt f(UInt)
779 CCALL(arg1, -, ret ) UInt f(UInt arg1)
njnd5bb0a52002-09-27 10:24:48 +0000780 CCALL(arg1, arg2, ret ) UInt f(UInt arg1, UInt arg2) */
njn25e49d8e72002-09-23 09:36:25 +0000781 CCALL,
782
njnd5bb0a52002-09-27 10:24:48 +0000783 /* This opcode makes it easy for skins that extend UCode to do this to
784 avoid opcode overlap:
njn25e49d8e72002-09-23 09:36:25 +0000785
daywalker5d945de2003-09-26 00:32:53 +0000786 enum { EU_OP1 = DUMMY_FINAL_UOPCODE + 1, ... }
787
njn25e49d8e72002-09-23 09:36:25 +0000788 WARNING: Do not add new opcodes after this one! They can be added
789 before, though. */
790 DUMMY_FINAL_UOPCODE
791 }
792 Opcode;
793
794
njnd5bb0a52002-09-27 10:24:48 +0000795/* Condition codes, using the Intel encoding. CondAlways is an extra. */
njn25e49d8e72002-09-23 09:36:25 +0000796typedef
797 enum {
798 CondO = 0, /* overflow */
799 CondNO = 1, /* no overflow */
800 CondB = 2, /* below */
801 CondNB = 3, /* not below */
802 CondZ = 4, /* zero */
803 CondNZ = 5, /* not zero */
804 CondBE = 6, /* below or equal */
805 CondNBE = 7, /* not below or equal */
806 CondS = 8, /* negative */
sewardje1042472002-09-30 12:33:11 +0000807 CondNS = 9, /* not negative */
njn25e49d8e72002-09-23 09:36:25 +0000808 CondP = 10, /* parity even */
809 CondNP = 11, /* not parity even */
810 CondL = 12, /* jump less */
811 CondNL = 13, /* not less */
812 CondLE = 14, /* less or equal */
813 CondNLE = 15, /* not less or equal */
814 CondAlways = 16 /* Jump always */
daywalker5d945de2003-09-26 00:32:53 +0000815 }
njn25e49d8e72002-09-23 09:36:25 +0000816 Condcode;
817
818
819/* Descriptions of additional properties of *unconditional* jumps. */
820typedef
821 enum {
822 JmpBoring=0, /* boring unconditional jump */
823 JmpCall=1, /* jump due to an x86 call insn */
824 JmpRet=2, /* jump due to an x86 ret insn */
825 JmpSyscall=3, /* do a system call, then jump */
826 JmpClientReq=4 /* do a client request, then jump */
827 }
828 JmpKind;
829
830
831/* Flags. User-level code can only read/write O(verflow), S(ign),
832 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
833 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
daywalker5d945de2003-09-26 00:32:53 +0000834 thusly:
njn25e49d8e72002-09-23 09:36:25 +0000835 76543210
836 DOSZACP
837 and bit 7 must always be zero since it is unused.
sewardj2370f3b2002-11-30 15:01:01 +0000838
839 Note: these Flag? values are **not** the positions in the actual
840 %eflags register. */
841
njn25e49d8e72002-09-23 09:36:25 +0000842typedef UChar FlagSet;
843
844#define FlagD (1<<6)
845#define FlagO (1<<5)
846#define FlagS (1<<4)
847#define FlagZ (1<<3)
848#define FlagA (1<<2)
849#define FlagC (1<<1)
850#define FlagP (1<<0)
851
852#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
853#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
854#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
855#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
856#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
857#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
858#define FlagsZCP ( FlagZ | FlagC | FlagP)
859#define FlagsOC (FlagO | FlagC )
860#define FlagsAC ( FlagA | FlagC )
861
862#define FlagsALL (FlagsOSZACP | FlagD)
863#define FlagsEmpty (FlagSet)0
864
865
sewardj2370f3b2002-11-30 15:01:01 +0000866/* flag positions in eflags */
867#define EFlagC (1 << 0) /* carry */
868#define EFlagP (1 << 2) /* parity */
sewardjfa492d42002-12-08 18:20:01 +0000869#define EFlagA (1 << 4) /* aux carry */
sewardj2370f3b2002-11-30 15:01:01 +0000870#define EFlagZ (1 << 6) /* zero */
871#define EFlagS (1 << 7) /* sign */
sewardjfa492d42002-12-08 18:20:01 +0000872#define EFlagD (1 << 10) /* direction */
sewardj2370f3b2002-11-30 15:01:01 +0000873#define EFlagO (1 << 11) /* overflow */
874
njn25e49d8e72002-09-23 09:36:25 +0000875/* Liveness of general purpose registers, useful for code generation.
876 Reg rank order 0..N-1 corresponds to bits 0..N-1, ie. first
877 reg's liveness in bit 0, last reg's in bit N-1. Note that
878 these rankings don't match the Intel register ordering. */
879typedef UInt RRegSet;
880
881#define ALL_RREGS_DEAD 0 /* 0000...00b */
njne7c258c2002-10-03 08:57:01 +0000882#define ALL_RREGS_LIVE ((1 << VG_MAX_REALREGS)-1) /* 0011...11b */
njn25e49d8e72002-09-23 09:36:25 +0000883#define UNIT_RREGSET(rank) (1 << (rank))
884
885#define IS_RREG_LIVE(rank,rregs_live) (rregs_live & UNIT_RREGSET(rank))
886#define SET_RREG_LIVENESS(rank,rregs_live,b) \
887 do { RRegSet unit = UNIT_RREGSET(rank); \
888 if (b) rregs_live |= unit; \
889 else rregs_live &= ~unit; \
890 } while(0)
891
892
893/* A Micro (u)-instruction. */
894typedef
895 struct {
896 /* word 1 */
897 UInt lit32; /* 32-bit literal */
898
899 /* word 2 */
900 UShort val1; /* first operand */
901 UShort val2; /* second operand */
902
903 /* word 3 */
904 UShort val3; /* third operand */
905 UChar opcode; /* opcode */
906 UChar size; /* data transfer size */
907
908 /* word 4 */
909 FlagSet flags_r; /* :: FlagSet */
910 FlagSet flags_w; /* :: FlagSet */
911 UChar tag1:4; /* first operand tag */
912 UChar tag2:4; /* second operand tag */
913 UChar tag3:4; /* third operand tag */
914 UChar extra4b:4; /* Spare field, used by WIDEN for src
915 -size, and by LEA2 for scale (1,2,4 or 8),
916 and by JMPs for original x86 instr size */
917
918 /* word 5 */
919 UChar cond; /* condition, for jumps */
920 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
921 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
922
daywalker5d945de2003-09-26 00:32:53 +0000923 /* Additional properties for UInstrs that call C functions:
njn25e49d8e72002-09-23 09:36:25 +0000924 - CCALL
925 - PUT (when %ESP is the target)
926 - possibly skin-specific UInstrs
927 */
928 UChar argc:2; /* Number of args, max 3 */
929 UChar regparms_n:2; /* Number of args passed in registers */
930 Bool has_ret_val:1; /* Function has return value? */
931
932 /* RealReg liveness; only sensical after reg alloc and liveness
933 analysis done. This info is a little bit arch-specific --
934 VG_MAX_REALREGS can vary on different architectures. Note that
935 to use this information requires converting between register ranks
njn4ba5a792002-09-30 10:23:54 +0000936 and the Intel register numbers, using VG_(realreg_to_rank)()
937 and/or VG_(rank_to_realreg)() */
daywalker5d945de2003-09-26 00:32:53 +0000938 RRegSet regs_live_after:VG_MAX_REALREGS;
njn25e49d8e72002-09-23 09:36:25 +0000939 }
940 UInstr;
941
942
daywalker5d945de2003-09-26 00:32:53 +0000943typedef
njn810086f2002-11-14 12:42:47 +0000944 struct _UCodeBlock
njn25e49d8e72002-09-23 09:36:25 +0000945 UCodeBlock;
946
njn810086f2002-11-14 12:42:47 +0000947extern Int VG_(get_num_instrs) (UCodeBlock* cb);
948extern Int VG_(get_num_temps) (UCodeBlock* cb);
njn25e49d8e72002-09-23 09:36:25 +0000949
njn810086f2002-11-14 12:42:47 +0000950extern UInstr* VG_(get_instr) (UCodeBlock* cb, Int i);
951extern UInstr* VG_(get_last_instr) (UCodeBlock* cb);
daywalker5d945de2003-09-26 00:32:53 +0000952
njn211b6ad2003-02-03 12:33:31 +0000953
njn25e49d8e72002-09-23 09:36:25 +0000954/*====================================================================*/
955/*=== Instrumenting UCode ===*/
956/*====================================================================*/
957
njnf4ce3d32003-02-10 10:17:26 +0000958/* Maximum number of registers read or written by a single UInstruction. */
959#define VG_MAX_REGS_USED 3
njn25e49d8e72002-09-23 09:36:25 +0000960
njnf4ce3d32003-02-10 10:17:26 +0000961/* Find what this instruction does to its regs, useful for
962 analysis/optimisation passes. `tag' indicates whether we're considering
963 TempRegs (pre-reg-alloc) or RealRegs (post-reg-alloc). `regs' is filled
964 with the affected register numbers, `isWrites' parallels it and indicates
965 if the reg is read or written. If a reg is read and written, it will
966 appear twice in `regs'. `regs' and `isWrites' must be able to fit
967 VG_MAX_REGS_USED elements. */
njn810086f2002-11-14 12:42:47 +0000968extern Int VG_(get_reg_usage) ( UInstr* u, Tag tag, Int* regs, Bool* isWrites );
njn25e49d8e72002-09-23 09:36:25 +0000969
970
njnd5bb0a52002-09-27 10:24:48 +0000971/* Used to register helper functions to be called from generated code. A
972 limited number of compact helpers can be registered; the code generated
973 to call them is slightly shorter -- so register the mostly frequently
974 called helpers as compact. */
njn25e49d8e72002-09-23 09:36:25 +0000975extern void VG_(register_compact_helper) ( Addr a );
976extern void VG_(register_noncompact_helper) ( Addr a );
977
978
979/* ------------------------------------------------------------------ */
980/* Virtual register allocation */
981
982/* Get a new virtual register */
njn4ba5a792002-09-30 10:23:54 +0000983extern Int VG_(get_new_temp) ( UCodeBlock* cb );
njn25e49d8e72002-09-23 09:36:25 +0000984
985/* Get a new virtual shadow register */
njn4ba5a792002-09-30 10:23:54 +0000986extern Int VG_(get_new_shadow) ( UCodeBlock* cb );
njn25e49d8e72002-09-23 09:36:25 +0000987
988/* Get a virtual register's corresponding virtual shadow register */
989#define SHADOW(tempreg) ((tempreg)+1)
990
991
992/* ------------------------------------------------------------------ */
993/* Low-level UInstr builders */
njn4ba5a792002-09-30 10:23:54 +0000994extern void VG_(new_NOP) ( UInstr* u );
995extern void VG_(new_UInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
996extern void VG_(new_UInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000997 Tag tag1, UInt val1 );
njn4ba5a792002-09-30 10:23:54 +0000998extern void VG_(new_UInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000999 Tag tag1, UInt val1,
1000 Tag tag2, UInt val2 );
njn4ba5a792002-09-30 10:23:54 +00001001extern void VG_(new_UInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +00001002 Tag tag1, UInt val1,
1003 Tag tag2, UInt val2,
1004 Tag tag3, UInt val3 );
njn25e49d8e72002-09-23 09:36:25 +00001005
daywalker5d945de2003-09-26 00:32:53 +00001006/* Set read/write/undefined flags. Undefined flags are treaten as written,
njn810086f2002-11-14 12:42:47 +00001007 but it's worth keeping them logically distinct. */
1008extern void VG_(set_flag_fields) ( UCodeBlock* cb, FlagSet fr, FlagSet fw,
1009 FlagSet fu);
njn4ba5a792002-09-30 10:23:54 +00001010extern void VG_(set_lit_field) ( UCodeBlock* cb, UInt lit32 );
1011extern void VG_(set_ccall_fields) ( UCodeBlock* cb, Addr fn, UChar argc,
1012 UChar regparms_n, Bool has_ret_val );
njn810086f2002-11-14 12:42:47 +00001013extern void VG_(set_cond_field) ( UCodeBlock* cb, Condcode code );
njn25e49d8e72002-09-23 09:36:25 +00001014
njn4ba5a792002-09-30 10:23:54 +00001015extern void VG_(copy_UInstr) ( UCodeBlock* cb, UInstr* instr );
1016
1017extern Bool VG_(any_flag_use)( UInstr* u );
njn25e49d8e72002-09-23 09:36:25 +00001018
njnac6c1762002-10-04 14:34:15 +00001019/* Macro versions of the above; just shorter to type. */
1020#define uInstr0 VG_(new_UInstr0)
1021#define uInstr1 VG_(new_UInstr1)
1022#define uInstr2 VG_(new_UInstr2)
1023#define uInstr3 VG_(new_UInstr3)
1024#define uLiteral VG_(set_lit_field)
1025#define uCCall VG_(set_ccall_fields)
njn810086f2002-11-14 12:42:47 +00001026#define uCond VG_(set_cond_field)
1027#define uFlagsRWU VG_(set_flag_fields)
njnac6c1762002-10-04 14:34:15 +00001028#define newTemp VG_(get_new_temp)
1029#define newShadow VG_(get_new_shadow)
1030
njn25e49d8e72002-09-23 09:36:25 +00001031/* Refer to `the last instruction stuffed in' (can be lvalue). */
1032#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
1033
1034
1035/* ------------------------------------------------------------------ */
1036/* Higher-level UInstr sequence builders */
njn4ba5a792002-09-30 10:23:54 +00001037extern void VG_(call_helper_0_0) ( UCodeBlock* cb, Addr f);
1038extern void VG_(call_helper_1_0) ( UCodeBlock* cb, Addr f, UInt arg1,
1039 UInt regparms_n);
1040extern void VG_(call_helper_2_0) ( UCodeBlock* cb, Addr f, UInt arg1, UInt arg2,
1041 UInt regparms_n);
njn25e49d8e72002-09-23 09:36:25 +00001042
1043/* One way around the 3-arg C function limit is to pass args via global
njn6fefa1b2003-02-24 10:32:51 +00001044 * variables... ugly, but it works. This one puts a literal in there. */
njn4ba5a792002-09-30 10:23:54 +00001045extern void VG_(set_global_var) ( UCodeBlock* cb, Addr globvar_ptr, UInt val);
njn25e49d8e72002-09-23 09:36:25 +00001046
njn6fefa1b2003-02-24 10:32:51 +00001047/* This one puts the contents of a TempReg in the global variable. */
1048extern void VG_(set_global_var_tempreg) ( UCodeBlock* cb, Addr globvar_ptr,
1049 UInt t_val);
1050
njn25e49d8e72002-09-23 09:36:25 +00001051/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +00001052/* Allocating/freeing basic blocks of UCode */
njn810086f2002-11-14 12:42:47 +00001053extern UCodeBlock* VG_(setup_UCodeBlock) ( UCodeBlock* cb );
njn4ba5a792002-09-30 10:23:54 +00001054extern void VG_(free_UCodeBlock) ( UCodeBlock* cb );
njnd5bb0a52002-09-27 10:24:48 +00001055
1056/* ------------------------------------------------------------------ */
daywalker5d945de2003-09-26 00:32:53 +00001057/* UCode pretty/ugly printing. Probably only useful to call from a skin
njn25e49d8e72002-09-23 09:36:25 +00001058 if VG_(needs).extended_UCode == True. */
1059
1060/* When True, all generated code is/should be printed. */
1061extern Bool VG_(print_codegen);
1062
njn4ba5a792002-09-30 10:23:54 +00001063/* Pretty/ugly printing functions */
1064extern void VG_(pp_UCodeBlock) ( UCodeBlock* cb, Char* title );
1065extern void VG_(pp_UInstr) ( Int instrNo, UInstr* u );
1066extern void VG_(pp_UInstr_regs) ( Int instrNo, UInstr* u );
1067extern void VG_(up_UInstr) ( Int instrNo, UInstr* u );
1068extern Char* VG_(name_UOpcode) ( Bool upper, Opcode opc );
njn563f96f2003-02-03 11:17:46 +00001069extern Char* VG_(name_UCondcode) ( Condcode cond );
daywalker5d945de2003-09-26 00:32:53 +00001070extern void VG_(pp_UOperand) ( UInstr* u, Int operandNo,
njn4ba5a792002-09-30 10:23:54 +00001071 Int sz, Bool parens );
njn25e49d8e72002-09-23 09:36:25 +00001072
njnb93d1782003-02-03 12:03:22 +00001073/* ------------------------------------------------------------------ */
njnf4ce3d32003-02-10 10:17:26 +00001074/* Accessing archregs and their shadows */
1075extern UInt VG_(get_archreg) ( UInt archreg );
1076extern UInt VG_(get_thread_archreg) ( ThreadId tid, UInt archreg );
1077
njnb93d1782003-02-03 12:03:22 +00001078extern UInt VG_(get_shadow_archreg) ( UInt archreg );
1079extern void VG_(set_shadow_archreg) ( UInt archreg, UInt val );
njnd3040452003-05-19 15:04:06 +00001080extern void VG_(set_shadow_eflags) ( UInt val );
njnb93d1782003-02-03 12:03:22 +00001081extern Addr VG_(shadow_archreg_address) ( UInt archreg );
njn25e49d8e72002-09-23 09:36:25 +00001082
njnf4ce3d32003-02-10 10:17:26 +00001083extern UInt VG_(get_thread_shadow_archreg) ( ThreadId tid, UInt archreg );
1084extern void VG_(set_thread_shadow_archreg) ( ThreadId tid, UInt archreg,
1085 UInt val );
njn211b6ad2003-02-03 12:33:31 +00001086
1087/* ------------------------------------------------------------------ */
1088/* Offsets of addresses of helper functions. A "helper" function is one
1089 which is called from generated code via CALLM. */
1090
1091extern Int VGOFF_(helper_idiv_64_32);
1092extern Int VGOFF_(helper_div_64_32);
1093extern Int VGOFF_(helper_idiv_32_16);
1094extern Int VGOFF_(helper_div_32_16);
1095extern Int VGOFF_(helper_idiv_16_8);
1096extern Int VGOFF_(helper_div_16_8);
1097
1098extern Int VGOFF_(helper_imul_32_64);
1099extern Int VGOFF_(helper_mul_32_64);
1100extern Int VGOFF_(helper_imul_16_32);
1101extern Int VGOFF_(helper_mul_16_32);
1102extern Int VGOFF_(helper_imul_8_16);
1103extern Int VGOFF_(helper_mul_8_16);
1104
1105extern Int VGOFF_(helper_CLD);
1106extern Int VGOFF_(helper_STD);
1107extern Int VGOFF_(helper_get_dirflag);
1108
1109extern Int VGOFF_(helper_CLC);
1110extern Int VGOFF_(helper_STC);
1111
1112extern Int VGOFF_(helper_shldl);
1113extern Int VGOFF_(helper_shldw);
1114extern Int VGOFF_(helper_shrdl);
1115extern Int VGOFF_(helper_shrdw);
1116
1117extern Int VGOFF_(helper_RDTSC);
1118extern Int VGOFF_(helper_CPUID);
1119
daywalkerb18d2532003-09-27 20:15:01 +00001120extern Int VGOFF_(helper_IN);
1121extern Int VGOFF_(helper_OUT);
1122
njn211b6ad2003-02-03 12:33:31 +00001123extern Int VGOFF_(helper_bsf);
1124extern Int VGOFF_(helper_bsr);
1125
1126extern Int VGOFF_(helper_fstsw_AX);
1127extern Int VGOFF_(helper_SAHF);
njnd6251f12003-06-03 13:38:51 +00001128extern Int VGOFF_(helper_LAHF);
njn211b6ad2003-02-03 12:33:31 +00001129extern Int VGOFF_(helper_DAS);
1130extern Int VGOFF_(helper_DAA);
1131
1132
njn25e49d8e72002-09-23 09:36:25 +00001133/*====================================================================*/
njnd5bb0a52002-09-27 10:24:48 +00001134/*=== Generating x86 code from UCode ===*/
njn25e49d8e72002-09-23 09:36:25 +00001135/*====================================================================*/
1136
njnd5bb0a52002-09-27 10:24:48 +00001137/* All this only necessary for skins with VG_(needs).extends_UCode == True. */
njn25e49d8e72002-09-23 09:36:25 +00001138
sewardje1042472002-09-30 12:33:11 +00001139/* This is the Intel register encoding -- integer regs. */
njn25e49d8e72002-09-23 09:36:25 +00001140#define R_EAX 0
1141#define R_ECX 1
1142#define R_EDX 2
1143#define R_EBX 3
1144#define R_ESP 4
1145#define R_EBP 5
1146#define R_ESI 6
1147#define R_EDI 7
1148
1149#define R_AL (0+R_EAX)
1150#define R_CL (0+R_ECX)
1151#define R_DL (0+R_EDX)
1152#define R_BL (0+R_EBX)
1153#define R_AH (4+R_EAX)
1154#define R_CH (4+R_ECX)
1155#define R_DH (4+R_EDX)
1156#define R_BH (4+R_EBX)
1157
sewardje1042472002-09-30 12:33:11 +00001158/* This is the Intel register encoding -- segment regs. */
1159#define R_ES 0
1160#define R_CS 1
1161#define R_SS 2
1162#define R_DS 3
1163#define R_FS 4
1164#define R_GS 5
1165
njn25e49d8e72002-09-23 09:36:25 +00001166/* For pretty printing x86 code */
daywalker5d945de2003-09-26 00:32:53 +00001167extern const Char* VG_(name_of_mmx_gran) ( UChar gran );
1168extern const Char* VG_(name_of_mmx_reg) ( Int mmxreg );
1169extern const Char* VG_(name_of_seg_reg) ( Int sreg );
1170extern const Char* VG_(name_of_int_reg) ( Int size, Int reg );
1171extern const Char VG_(name_of_int_size) ( Int size );
njn25e49d8e72002-09-23 09:36:25 +00001172
njnac6c1762002-10-04 14:34:15 +00001173/* Shorter macros for convenience */
sewardj3d7c9c82003-03-26 21:08:13 +00001174#define nameIReg VG_(name_of_int_reg)
1175#define nameISize VG_(name_of_int_size)
1176#define nameSReg VG_(name_of_seg_reg)
1177#define nameMMXReg VG_(name_of_mmx_reg)
1178#define nameMMXGran VG_(name_of_mmx_gran)
sewardjfebaa3b2003-05-25 01:07:34 +00001179#define nameXMMReg VG_(name_of_xmm_reg)
njnac6c1762002-10-04 14:34:15 +00001180
njn25e49d8e72002-09-23 09:36:25 +00001181/* Randomly useful things */
1182extern UInt VG_(extend_s_8to32) ( UInt x );
1183
1184/* Code emitters */
njn4ba5a792002-09-30 10:23:54 +00001185extern void VG_(emitB) ( UInt b );
1186extern void VG_(emitW) ( UInt w );
1187extern void VG_(emitL) ( UInt l );
sewardjfa492d42002-12-08 18:20:01 +00001188extern void VG_(new_emit) ( Bool upd_cc, FlagSet uses_flags, FlagSet sets_flags );
njn25e49d8e72002-09-23 09:36:25 +00001189
1190/* Finding offsets */
njn4ba5a792002-09-30 10:23:54 +00001191extern Int VG_(helper_offset) ( Addr a );
1192extern Int VG_(shadow_reg_offset) ( Int arch );
1193extern Int VG_(shadow_flags_offset) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001194
njnd5bb0a52002-09-27 10:24:48 +00001195/* Convert reg ranks <-> Intel register ordering, for using register
1196 liveness information. */
njn4ba5a792002-09-30 10:23:54 +00001197extern Int VG_(realreg_to_rank) ( Int realreg );
1198extern Int VG_(rank_to_realreg) ( Int rank );
njn25e49d8e72002-09-23 09:36:25 +00001199
njnd5bb0a52002-09-27 10:24:48 +00001200/* Call a subroutine. Does no argument passing, stack manipulations, etc. */
daywalker5d945de2003-09-26 00:32:53 +00001201extern void VG_(synth_call) ( Bool ensure_shortform, Int word_offset,
sewardjfa492d42002-12-08 18:20:01 +00001202 Bool upd_cc, FlagSet use_flags, FlagSet set_flags );
njn25e49d8e72002-09-23 09:36:25 +00001203
njnd5bb0a52002-09-27 10:24:48 +00001204/* For calling C functions -- saves caller save regs, pushes args, calls,
1205 clears the stack, restores caller save regs. `fn' must be registered in
1206 the baseBlock first. Acceptable tags are RealReg and Literal. Optimises
1207 things, eg. by not preserving non-live caller-save registers.
njn25e49d8e72002-09-23 09:36:25 +00001208
njnd5bb0a52002-09-27 10:24:48 +00001209 WARNING: a UInstr should *not* be translated with synth_ccall() followed
1210 by some other x86 assembly code; this will invalidate the results of
1211 vg_realreg_liveness_analysis() and everything will fall over. */
njn4ba5a792002-09-30 10:23:54 +00001212extern void VG_(synth_ccall) ( Addr fn, Int argc, Int regparms_n, UInt argv[],
daywalker5d945de2003-09-26 00:32:53 +00001213 Tag tagv[], Int ret_reg,
njn4ba5a792002-09-30 10:23:54 +00001214 RRegSet regs_live_before,
1215 RRegSet regs_live_after );
njn25e49d8e72002-09-23 09:36:25 +00001216
1217/* Addressing modes */
njn4ba5a792002-09-30 10:23:54 +00001218extern void VG_(emit_amode_offregmem_reg)( Int off, Int regmem, Int reg );
1219extern void VG_(emit_amode_ereg_greg) ( Int e_reg, Int g_reg );
njn25e49d8e72002-09-23 09:36:25 +00001220
1221/* v-size (4, or 2 with OSO) insn emitters */
njn4ba5a792002-09-30 10:23:54 +00001222extern void VG_(emit_movv_offregmem_reg) ( Int sz, Int off, Int areg, Int reg );
1223extern void VG_(emit_movv_reg_offregmem) ( Int sz, Int reg, Int off, Int areg );
1224extern void VG_(emit_movv_reg_reg) ( Int sz, Int reg1, Int reg2 );
sewardjfa492d42002-12-08 18:20:01 +00001225extern void VG_(emit_nonshiftopv_lit_reg)( Bool upd_cc, Int sz, Opcode opc, UInt lit,
njn4ba5a792002-09-30 10:23:54 +00001226 Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001227extern void VG_(emit_shiftopv_lit_reg) ( Bool upd_cc, Int sz, Opcode opc, UInt lit,
njn4ba5a792002-09-30 10:23:54 +00001228 Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001229extern void VG_(emit_nonshiftopv_reg_reg)( Bool upd_cc, Int sz, Opcode opc,
njn4ba5a792002-09-30 10:23:54 +00001230 Int reg1, Int reg2 );
1231extern void VG_(emit_movv_lit_reg) ( Int sz, UInt lit, Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001232extern void VG_(emit_unaryopv_reg) ( Bool upd_cc, Int sz, Opcode opc, Int reg );
njn4ba5a792002-09-30 10:23:54 +00001233extern void VG_(emit_pushv_reg) ( Int sz, Int reg );
1234extern void VG_(emit_popv_reg) ( Int sz, Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001235
njn4ba5a792002-09-30 10:23:54 +00001236extern void VG_(emit_pushl_lit32) ( UInt int32 );
1237extern void VG_(emit_pushl_lit8) ( Int lit8 );
sewardjfa492d42002-12-08 18:20:01 +00001238extern void VG_(emit_cmpl_zero_reg) ( Bool upd_cc, Int reg );
njn4ba5a792002-09-30 10:23:54 +00001239extern void VG_(emit_swapl_reg_EAX) ( Int reg );
1240extern void VG_(emit_movv_lit_offregmem) ( Int sz, UInt lit, Int off,
1241 Int memreg );
njn25e49d8e72002-09-23 09:36:25 +00001242
1243/* b-size (1 byte) instruction emitters */
njn4ba5a792002-09-30 10:23:54 +00001244extern void VG_(emit_movb_lit_offregmem) ( UInt lit, Int off, Int memreg );
1245extern void VG_(emit_movb_reg_offregmem) ( Int reg, Int off, Int areg );
sewardjfa492d42002-12-08 18:20:01 +00001246extern void VG_(emit_unaryopb_reg) ( Bool upd_cc, Opcode opc, Int reg );
1247extern void VG_(emit_testb_lit_reg) ( Bool upd_cc, UInt lit, Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001248
1249/* zero-extended load emitters */
njn4ba5a792002-09-30 10:23:54 +00001250extern void VG_(emit_movzbl_offregmem_reg) ( Int off, Int regmem, Int reg );
1251extern void VG_(emit_movzwl_offregmem_reg) ( Int off, Int areg, Int reg );
daywalkerf26b2162003-09-30 23:01:50 +00001252extern void VG_(emit_movzwl_regmem_reg) ( Int reg1, Int reg2 );
njn25e49d8e72002-09-23 09:36:25 +00001253
1254/* misc instruction emitters */
njn4ba5a792002-09-30 10:23:54 +00001255extern void VG_(emit_call_reg) ( Int reg );
1256extern void VG_(emit_add_lit_to_esp) ( Int lit );
njn4ba5a792002-09-30 10:23:54 +00001257extern void VG_(emit_pushal) ( void );
1258extern void VG_(emit_popal) ( void );
1259extern void VG_(emit_AMD_prefetch_reg) ( Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001260
sewardja2113f92002-12-12 23:42:48 +00001261/* jump emitters */
1262extern void VG_(init_target) ( Int *tgt );
1263
1264extern void VG_(target_back) ( Int *tgt );
1265extern void VG_(target_forward) ( Int *tgt );
1266extern void VG_(emit_target_delta) ( Int *tgt );
1267
1268extern void VG_(emit_jcondshort_delta) ( Bool simd_cc, Condcode cond, Int delta );
1269extern void VG_(emit_jcondshort_target)( Bool simd_cc, Condcode cond, Int *tgt );
1270
njn25e49d8e72002-09-23 09:36:25 +00001271
1272/*====================================================================*/
1273/*=== Execution contexts ===*/
1274/*====================================================================*/
1275
1276/* Generic resolution type used in a few different ways, such as deciding
1277 how closely to compare two errors for equality. */
daywalker5d945de2003-09-26 00:32:53 +00001278typedef
1279 enum { Vg_LowRes, Vg_MedRes, Vg_HighRes }
njn25e49d8e72002-09-23 09:36:25 +00001280 VgRes;
1281
1282typedef
1283 struct _ExeContext
1284 ExeContext;
1285
daywalker5d945de2003-09-26 00:32:53 +00001286/* Compare two ExeContexts. Number of callers considered depends on `res':
1287 Vg_LowRes: 2
1288 Vg_MedRes: 4
njnd5bb0a52002-09-27 10:24:48 +00001289 Vg_HighRes: all */
njn25e49d8e72002-09-23 09:36:25 +00001290extern Bool VG_(eq_ExeContext) ( VgRes res,
1291 ExeContext* e1, ExeContext* e2 );
1292
1293/* Print an ExeContext. */
1294extern void VG_(pp_ExeContext) ( ExeContext* );
1295
1296/* Take a snapshot of the client's stack. Search our collection of
1297 ExeContexts to see if we already have it, and if not, allocate a
njn6c846552003-09-16 07:41:43 +00001298 new one. Either way, return a pointer to the context. Context size
1299 controlled by --num-callers option.
daywalker5d945de2003-09-26 00:32:53 +00001300
njn72718642003-07-24 08:45:32 +00001301 If called from generated code, use VG_(get_current_tid)() to get the
1302 current ThreadId. If called from non-generated code, the current
daywalker5d945de2003-09-26 00:32:53 +00001303 ThreadId should be passed in by the core.
njn7b456f52003-05-19 11:16:50 +00001304*/
njn72718642003-07-24 08:45:32 +00001305extern ExeContext* VG_(get_ExeContext) ( ThreadId tid );
njn25e49d8e72002-09-23 09:36:25 +00001306
njn6c846552003-09-16 07:41:43 +00001307/* Get the nth EIP from the ExeContext. 0 is the EIP of the top function, 1
1308 is its caller, etc. Returns 0 if there isn't one, or if n is greater
1309 than VG_(clo_backtrace_size), set by the --num-callers option. */
1310extern Addr VG_(get_EIP_from_ExeContext) ( ExeContext* e, UInt n );
1311
sewardj499e3de2002-11-13 22:22:25 +00001312/* Just grab the client's EIP, as a much smaller and cheaper
njn72718642003-07-24 08:45:32 +00001313 indication of where they are. Use is basically same as for
daywalker5d945de2003-09-26 00:32:53 +00001314 VG_(get_ExeContext)() above.
njn72718642003-07-24 08:45:32 +00001315*/
1316extern Addr VG_(get_EIP)( ThreadId tid );
njn25e49d8e72002-09-23 09:36:25 +00001317
njn6c846552003-09-16 07:41:43 +00001318/* For skins needing more control over stack traces: walks the stack to get
1319 %eips from the top stack frames for thread 'tid'. Maximum of 'n_eips'
1320 addresses put into 'eips'; 0 is the top of the stack, 1 is its caller,
1321 etc. */
1322extern UInt VG_(stack_snapshot) ( ThreadId tid, Addr* eips, UInt n_eips );
1323
1324/* Does the same thing as VG_(pp_ExeContext)(), just with slightly
1325 different input. */
1326extern void VG_(mini_stack_dump) ( Addr eips[], UInt n_eips );
1327
njn211b6ad2003-02-03 12:33:31 +00001328
njn25e49d8e72002-09-23 09:36:25 +00001329/*====================================================================*/
1330/*=== Error reporting ===*/
1331/*====================================================================*/
1332
1333/* ------------------------------------------------------------------ */
daywalker5d945de2003-09-26 00:32:53 +00001334/* Suppressions describe errors which we want to suppress, ie, not
njn25e49d8e72002-09-23 09:36:25 +00001335 show the user, usually because it is caused by a problem in a library
daywalker5d945de2003-09-26 00:32:53 +00001336 which we can't fix, replace or work around. Suppressions are read from
njnd5bb0a52002-09-27 10:24:48 +00001337 a file at startup time. This gives flexibility so that new
njn25e49d8e72002-09-23 09:36:25 +00001338 suppressions can be added to the file as and when needed.
1339*/
1340
1341typedef
1342 Int /* Do not make this unsigned! */
1343 SuppKind;
1344
njn810086f2002-11-14 12:42:47 +00001345/* The skin-relevant parts of a suppression are:
1346 kind: what kind of suppression; must be in the range (0..)
1347 string: use is optional. NULL by default.
1348 extra: use is optional. NULL by default. void* so it's extensible.
njn25e49d8e72002-09-23 09:36:25 +00001349*/
1350typedef
njn810086f2002-11-14 12:42:47 +00001351 struct _Supp
1352 Supp;
1353
1354/* Useful in SK_(error_matches_suppression)() */
1355SuppKind VG_(get_supp_kind) ( Supp* su );
1356Char* VG_(get_supp_string) ( Supp* su );
1357void* VG_(get_supp_extra) ( Supp* su );
1358
1359/* Must be used in VG_(recognised_suppression)() */
1360void VG_(set_supp_kind) ( Supp* su, SuppKind suppkind );
1361/* May be used in VG_(read_extra_suppression_info)() */
1362void VG_(set_supp_string) ( Supp* su, Char* string );
1363void VG_(set_supp_extra) ( Supp* su, void* extra );
njn25e49d8e72002-09-23 09:36:25 +00001364
1365
1366/* ------------------------------------------------------------------ */
1367/* Error records contain enough info to generate an error report. The idea
1368 is that (typically) the same few points in the program generate thousands
njnd5bb0a52002-09-27 10:24:48 +00001369 of errors, and we don't want to spew out a fresh error message for each
1370 one. Instead, we use these structures to common up duplicates.
njn25e49d8e72002-09-23 09:36:25 +00001371*/
1372
1373typedef
1374 Int /* Do not make this unsigned! */
1375 ErrorKind;
1376
njn810086f2002-11-14 12:42:47 +00001377/* The skin-relevant parts of an Error are:
1378 kind: what kind of error; must be in the range (0..)
1379 addr: use is optional. 0 by default.
1380 string: use is optional. NULL by default.
1381 extra: use is optional. NULL by default. void* so it's extensible.
njn25e49d8e72002-09-23 09:36:25 +00001382*/
1383typedef
njn810086f2002-11-14 12:42:47 +00001384 struct _Error
1385 Error;
njn25e49d8e72002-09-23 09:36:25 +00001386
njn810086f2002-11-14 12:42:47 +00001387/* Useful in SK_(error_matches_suppression)(), SK_(pp_SkinError)(), etc */
njnb877d492003-01-28 20:40:57 +00001388ExeContext* VG_(get_error_where) ( Error* err );
1389SuppKind VG_(get_error_kind) ( Error* err );
1390Addr VG_(get_error_address) ( Error* err );
1391Char* VG_(get_error_string) ( Error* err );
1392void* VG_(get_error_extra) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001393
njnd5bb0a52002-09-27 10:24:48 +00001394/* Call this when an error occurs. It will be recorded if it hasn't been
njn25e49d8e72002-09-23 09:36:25 +00001395 seen before. If it has, the existing error record will have its count
daywalker5d945de2003-09-26 00:32:53 +00001396 incremented.
1397
njn72718642003-07-24 08:45:32 +00001398 'tid' can be found as for VG_(get_ExeContext)(). The `extra' field can
1399 be stack-allocated; it will be copied by the core if needed (but it
1400 won't be copied if it's NULL).
njnd5bb0a52002-09-27 10:24:48 +00001401
1402 If no 'a', 's' or 'extra' of interest needs to be recorded, just use
njn3e884182003-04-15 13:03:23 +00001403 NULL for them. */
daywalker5d945de2003-09-26 00:32:53 +00001404extern void VG_(maybe_record_error) ( ThreadId tid, ErrorKind ekind,
njn25e49d8e72002-09-23 09:36:25 +00001405 Addr a, Char* s, void* extra );
1406
njn43c799e2003-04-08 00:08:52 +00001407/* Similar to VG_(maybe_record_error)(), except this one doesn't record the
1408 error -- useful for errors that can only happen once. The errors can be
1409 suppressed, though. Return value is True if it was suppressed.
daywalker5d945de2003-09-26 00:32:53 +00001410 `print_error' dictates whether to print the error, which is a bit of a
njn43c799e2003-04-08 00:08:52 +00001411 hack that's useful sometimes if you just want to know if the error would
daywalker5d945de2003-09-26 00:32:53 +00001412 be suppressed without possibly printing it. `count_error' dictates
njn47363ab2003-04-21 13:24:40 +00001413 whether to add the error in the error total count (another mild hack). */
njn72718642003-07-24 08:45:32 +00001414extern Bool VG_(unique_error) ( ThreadId tid, ErrorKind ekind,
njn43c799e2003-04-08 00:08:52 +00001415 Addr a, Char* s, void* extra,
njn3e884182003-04-15 13:03:23 +00001416 ExeContext* where, Bool print_error,
njn47363ab2003-04-21 13:24:40 +00001417 Bool allow_GDB_attach, Bool count_error );
njn43c799e2003-04-08 00:08:52 +00001418
njn25e49d8e72002-09-23 09:36:25 +00001419/* Gets a non-blank, non-comment line of at most nBuf chars from fd.
daywalker5d945de2003-09-26 00:32:53 +00001420 Skips leading spaces on the line. Returns True if EOF was hit instead.
njn3e884182003-04-15 13:03:23 +00001421 Useful for reading in extra skin-specific suppression lines. */
njn4ba5a792002-09-30 10:23:54 +00001422extern Bool VG_(get_line) ( Int fd, Char* buf, Int nBuf );
njn25e49d8e72002-09-23 09:36:25 +00001423
1424
1425/*====================================================================*/
1426/*=== Obtaining debug information ===*/
1427/*====================================================================*/
1428
sewardj6e008cb2002-12-15 13:11:39 +00001429/* Get the file/function/line number of the instruction at address
1430 'a'. For these four, if debug info for the address is found, it
1431 copies the info into the buffer/UInt and returns True. If not, it
1432 returns False and nothing is copied. VG_(get_fnname) always
1433 demangles C++ function names. VG_(get_fnname_w_offset) is the
njn3e884182003-04-15 13:03:23 +00001434 same, except it appends "+N" to symbol names to indicate offsets. */
njn25e49d8e72002-09-23 09:36:25 +00001435extern Bool VG_(get_filename) ( Addr a, Char* filename, Int n_filename );
1436extern Bool VG_(get_fnname) ( Addr a, Char* fnname, Int n_fnname );
1437extern Bool VG_(get_linenum) ( Addr a, UInt* linenum );
daywalker5d945de2003-09-26 00:32:53 +00001438extern Bool VG_(get_fnname_w_offset)
sewardj6e008cb2002-12-15 13:11:39 +00001439 ( Addr a, Char* fnname, Int n_fnname );
njn25e49d8e72002-09-23 09:36:25 +00001440
1441/* This one is more efficient if getting both filename and line number,
1442 because the two lookups are done together. */
daywalker5d945de2003-09-26 00:32:53 +00001443extern Bool VG_(get_filename_linenum)
njn25e49d8e72002-09-23 09:36:25 +00001444 ( Addr a, Char* filename, Int n_filename,
1445 UInt* linenum );
1446
1447/* Succeeds only if we find from debug info that 'a' is the address of the
1448 first instruction in a function -- as opposed to VG_(get_fnname) which
1449 succeeds if we find from debug info that 'a' is the address of any
1450 instruction in a function. Use this to instrument the start of
njnd5bb0a52002-09-27 10:24:48 +00001451 a particular function. Nb: if an executable/shared object is stripped
njn25e49d8e72002-09-23 09:36:25 +00001452 of its symbols, this function will not be able to recognise function
1453 entry points within it. */
njn497ec3f2003-05-19 08:38:23 +00001454extern Bool VG_(get_fnname_if_entry) ( Addr a, Char* fnname, Int n_fnname );
njn25e49d8e72002-09-23 09:36:25 +00001455
1456/* Succeeds if the address is within a shared object or the main executable.
1457 It doesn't matter if debug info is present or not. */
1458extern Bool VG_(get_objname) ( Addr a, Char* objname, Int n_objname );
1459
njn6c846552003-09-16 07:41:43 +00001460/* Puts into 'buf' info about the code address %eip: the address, function
1461 name (if known) and filename/line number (if known), like this:
1462
1463 0x4001BF05: realloc (vg_replace_malloc.c:339)
1464
1465 'n_buf' gives length of 'buf'. Returns 'buf'.
1466*/
1467extern Char* VG_(describe_eip)(Addr eip, Char* buf, Int n_buf);
1468
jsgfcb1d1c02003-10-14 21:55:10 +00001469/* Returns a string containing an expression for the given
1470 address. String is malloced with VG_(malloc)() */
1471Char *VG_(describe_addr)(ThreadId, Addr);
1472
sewardj47104382002-10-20 18:35:48 +00001473/* A way to get information about what segments are mapped */
1474typedef struct _SegInfo SegInfo;
1475
njnb877d492003-01-28 20:40:57 +00001476/* Returns NULL if the SegInfo isn't found. It doesn't matter if debug info
1477 is present or not. */
1478extern SegInfo* VG_(get_obj) ( Addr a );
1479
1480extern const SegInfo* VG_(next_seginfo) ( const SegInfo *seg );
1481extern Addr VG_(seg_start) ( const SegInfo *seg );
1482extern UInt VG_(seg_size) ( const SegInfo *seg );
1483extern const UChar* VG_(seg_filename) ( const SegInfo *seg );
1484extern UInt VG_(seg_sym_offset)( const SegInfo *seg );
sewardj47104382002-10-20 18:35:48 +00001485
1486typedef
1487 enum {
1488 Vg_SectUnknown,
1489 Vg_SectText,
sewardj8fe15a32002-10-20 19:29:21 +00001490 Vg_SectData,
1491 Vg_SectBSS,
sewardj47104382002-10-20 18:35:48 +00001492 Vg_SectGOT,
sewardj8fe15a32002-10-20 19:29:21 +00001493 Vg_SectPLT,
sewardj47104382002-10-20 18:35:48 +00001494 }
1495 VgSectKind;
1496
1497extern VgSectKind VG_(seg_sect_kind)(Addr);
1498
njn25e49d8e72002-09-23 09:36:25 +00001499
1500/*====================================================================*/
njn3e884182003-04-15 13:03:23 +00001501/*=== Generic hash table ===*/
njn25e49d8e72002-09-23 09:36:25 +00001502/*====================================================================*/
1503
njn3e884182003-04-15 13:03:23 +00001504/* Generic type for a separately-chained hash table. Via a kind of dodgy
1505 C-as-C++ style inheritance, skins can extend the VgHashNode type, so long
1506 as the first two fields match the sizes of these two fields. Requires
1507 a bit of casting by the skin. */
njn25e49d8e72002-09-23 09:36:25 +00001508typedef
njn3e884182003-04-15 13:03:23 +00001509 struct _VgHashNode {
1510 struct _VgHashNode * next;
1511 UInt key;
1512 }
1513 VgHashNode;
njn25e49d8e72002-09-23 09:36:25 +00001514
njn3e884182003-04-15 13:03:23 +00001515typedef
1516 VgHashNode**
1517 VgHashTable;
njn810086f2002-11-14 12:42:47 +00001518
njn3e884182003-04-15 13:03:23 +00001519/* Make a new table. */
1520extern VgHashTable VG_(HT_construct) ( void );
1521
njn69c06872003-09-30 15:43:51 +00001522/* Count the number of nodes in a table. */
1523extern Int VG_(HT_count_nodes) ( VgHashTable table );
1524
njn3e884182003-04-15 13:03:23 +00001525/* Add a node to the table. */
1526extern void VG_(HT_add_node) ( VgHashTable t, VgHashNode* node );
1527
daywalker5d945de2003-09-26 00:32:53 +00001528/* Looks up a node in the hash table. Also returns the address of the
njn3e884182003-04-15 13:03:23 +00001529 previous node's `next' pointer which allows it to be removed from the
1530 list later without having to look it up again. */
1531extern VgHashNode* VG_(HT_get_node) ( VgHashTable t, UInt key,
1532 /*OUT*/VgHashNode*** next_ptr );
1533
njn06072ec2003-09-30 15:35:13 +00001534/* Allocates an array of pointers to all the shadow chunks of malloc'd
1535 blocks. Must be freed with VG_(free)(). */
1536extern VgHashNode** VG_(HT_to_array) ( VgHashTable t, /*OUT*/ UInt* n_shadows );
njn3e884182003-04-15 13:03:23 +00001537
1538/* Returns first node that matches predicate `p', or NULL if none do.
1539 Extra arguments can be implicitly passed to `p' using nested functions;
1540 see memcheck/mc_errcontext.c for an example. */
1541extern VgHashNode* VG_(HT_first_match) ( VgHashTable t,
1542 Bool (*p)(VgHashNode*) );
1543
1544/* Applies a function f() once to each node. Again, nested functions
1545 can be very useful. */
1546extern void VG_(HT_apply_to_all_nodes)( VgHashTable t, void (*f)(VgHashNode*) );
1547
1548/* Destroy a table. */
1549extern void VG_(HT_destruct) ( VgHashTable t );
njn810086f2002-11-14 12:42:47 +00001550
1551
njn3e884182003-04-15 13:03:23 +00001552/*====================================================================*/
njnd3040452003-05-19 15:04:06 +00001553/*=== Functions for shadow registers ===*/
1554/*====================================================================*/
1555
1556/* Nb: make sure the shadow_regs 'need' is set before using these! */
1557
1558/* This one lets you override the shadow of the return value register for a
1559 syscall. Call it from SK_(post_syscall)() (not SK_(pre_syscall)()!) to
1560 override the default shadow register value. */
daywalker5d945de2003-09-26 00:32:53 +00001561extern void VG_(set_return_from_syscall_shadow) ( ThreadId tid,
njnd3040452003-05-19 15:04:06 +00001562 UInt ret_shadow );
1563
1564/* This can be called from SK_(fini)() to find the shadow of the argument
1565 to exit(), ie. the shadow of the program's return value. */
1566extern UInt VG_(get_exit_status_shadow) ( void );
1567
1568
1569/*====================================================================*/
njn3e884182003-04-15 13:03:23 +00001570/*=== General stuff for replacing functions ===*/
1571/*====================================================================*/
njn25e49d8e72002-09-23 09:36:25 +00001572
njn3e884182003-04-15 13:03:23 +00001573/* Some skins need to replace the standard definitions of some functions. */
njn25e49d8e72002-09-23 09:36:25 +00001574
njn3e884182003-04-15 13:03:23 +00001575/* ------------------------------------------------------------------ */
1576/* General stuff, for replacing any functions */
njn25e49d8e72002-09-23 09:36:25 +00001577
daywalker5d945de2003-09-26 00:32:53 +00001578/* Is the client running on the simulated CPU or the real one?
njn25e49d8e72002-09-23 09:36:25 +00001579
njn3e884182003-04-15 13:03:23 +00001580 Nb: If it is, and you want to call a function to be run on the real CPU,
njn057c65f2003-04-21 13:30:55 +00001581 use one of the VALGRIND_NON_SIMD_CALL[123] macros in valgrind.h to call it.
njn25e49d8e72002-09-23 09:36:25 +00001582
daywalker5d945de2003-09-26 00:32:53 +00001583 Nb: don't forget the function parentheses when using this in a
njn3e884182003-04-15 13:03:23 +00001584 condition... write this:
1585
1586 if (VG_(is_running_on_simd_CPU)()) { ... } // calls function
1587
1588 not this:
daywalker5d945de2003-09-26 00:32:53 +00001589
njn3e884182003-04-15 13:03:23 +00001590 if (VG_(is_running_on_simd_CPU)) { ... } // address of var!
1591*/
daywalker5d945de2003-09-26 00:32:53 +00001592extern Bool VG_(is_running_on_simd_CPU) ( void );
njn3e884182003-04-15 13:03:23 +00001593
1594
1595/*====================================================================*/
1596/*=== Specific stuff for replacing malloc() and friends ===*/
1597/*====================================================================*/
1598
njn3e884182003-04-15 13:03:23 +00001599/* If a skin replaces malloc() et al, the easiest way to do so is to link
1600 with coregrind/vg_replace_malloc.c, and follow the following instructions.
1601 You can do it from scratch, though, if you enjoy that sort of thing. */
1602
1603/* Arena size for valgrind's own malloc(); default value is 0, but can
1604 be overridden by skin -- but must be done so *statically*, eg:
daywalker5d945de2003-09-26 00:32:53 +00001605
njn3e884182003-04-15 13:03:23 +00001606 Int VG_(vg_malloc_redzone_szB) = 4;
daywalker5d945de2003-09-26 00:32:53 +00001607
njn3e884182003-04-15 13:03:23 +00001608 It can't be done from a function like SK_(pre_clo_init)(). So it can't,
1609 for example, be controlled with a command line option, unfortunately. */
1610extern UInt VG_(vg_malloc_redzone_szB);
1611
1612/* If a skin links with vg_replace_malloc.c, the following functions will be
1613 called appropriately when malloc() et al are called. */
njn72718642003-07-24 08:45:32 +00001614extern void* SK_(malloc) ( Int n );
1615extern void* SK_(__builtin_new) ( Int n );
1616extern void* SK_(__builtin_vec_new) ( Int n );
1617extern void* SK_(memalign) ( Int align, Int n );
1618extern void* SK_(calloc) ( Int nmemb, Int n );
1619extern void SK_(free) ( void* p );
1620extern void SK_(__builtin_delete) ( void* p );
1621extern void SK_(__builtin_vec_delete) ( void* p );
1622extern void* SK_(realloc) ( void* p, Int size );
njn3e884182003-04-15 13:03:23 +00001623
1624/* Can be called from SK_(malloc) et al to do the actual alloc/freeing. */
daywalker5d945de2003-09-26 00:32:53 +00001625extern void* VG_(cli_malloc) ( UInt align, Int nbytes );
njn3e884182003-04-15 13:03:23 +00001626extern void VG_(cli_free) ( void* p );
1627
1628/* Check if an address is within a range, allowing for redzones at edges */
1629extern Bool VG_(addr_is_in_block)( Addr a, Addr start, UInt size );
1630
1631/* ------------------------------------------------------------------ */
daywalker5d945de2003-09-26 00:32:53 +00001632/* Some options that can be used by a skin if malloc() et al are replaced.
njnd3040452003-05-19 15:04:06 +00001633 The skin should call the functions in the appropriate places to give
1634 control over these aspects of Valgrind's version of malloc(). */
njn3e884182003-04-15 13:03:23 +00001635
1636/* Round malloc sizes upwards to integral number of words? default: NO */
1637extern Bool VG_(clo_sloppy_malloc);
1638/* DEBUG: print malloc details? default: NO */
1639extern Bool VG_(clo_trace_malloc);
1640/* Minimum alignment in functions that don't specify alignment explicitly.
1641 default: 0, i.e. use default of the machine (== 4) */
1642extern Int VG_(clo_alignment);
1643
1644extern Bool VG_(replacement_malloc_process_cmd_line_option) ( Char* arg );
1645extern void VG_(replacement_malloc_print_usage) ( void );
1646extern void VG_(replacement_malloc_print_debug_usage) ( void );
sewardja4495682002-10-21 07:29:59 +00001647
1648
njn25e49d8e72002-09-23 09:36:25 +00001649/*====================================================================*/
1650/*=== Skin-specific stuff ===*/
1651/*====================================================================*/
1652
njnd04b7c62002-10-03 14:05:52 +00001653/* ------------------------------------------------------------------ */
1654/* Details */
njnd04b7c62002-10-03 14:05:52 +00001655
njn120281f2003-02-03 12:20:07 +00001656/* Default value for avg_translations_sizeB (in bytes), indicating typical
1657 code expansion of about 6:1. */
1658#define VG_DEFAULT_TRANS_SIZEB 100
1659
njn810086f2002-11-14 12:42:47 +00001660/* Information used in the startup message. `name' also determines the
1661 string used for identifying suppressions in a suppression file as
1662 belonging to this skin. `version' can be NULL, in which case (not
1663 surprisingly) no version info is printed; this mechanism is designed for
1664 skins distributed with Valgrind that share a version number with
1665 Valgrind. Other skins not distributed as part of Valgrind should
sewardjc0d8f682002-11-30 00:49:43 +00001666 probably have their own version number. */
1667extern void VG_(details_name) ( Char* name );
1668extern void VG_(details_version) ( Char* version );
1669extern void VG_(details_description) ( Char* description );
1670extern void VG_(details_copyright_author) ( Char* copyright_author );
1671
1672/* Average size of a translation, in bytes, so that the translation
njn120281f2003-02-03 12:20:07 +00001673 storage machinery can allocate memory appropriately. Not critical,
daywalker5d945de2003-09-26 00:32:53 +00001674 setting is optional. */
njn120281f2003-02-03 12:20:07 +00001675extern void VG_(details_avg_translation_sizeB) ( UInt size );
njnd04b7c62002-10-03 14:05:52 +00001676
njn810086f2002-11-14 12:42:47 +00001677/* String printed if an `sk_assert' assertion fails or VG_(skin_panic)
1678 is called. Should probably be an email address. */
1679extern void VG_(details_bug_reports_to) ( Char* bug_reports_to );
njnd04b7c62002-10-03 14:05:52 +00001680
1681/* ------------------------------------------------------------------ */
1682/* Needs */
1683
njn810086f2002-11-14 12:42:47 +00001684/* Booleans that decide core behaviour, but don't require extra
1685 operations to be defined if `True' */
njnd5bb0a52002-09-27 10:24:48 +00001686
njn810086f2002-11-14 12:42:47 +00001687/* Should __libc_freeres() be run? Bugs in it can crash the skin. */
1688extern void VG_(needs_libc_freeres) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001689
njn810086f2002-11-14 12:42:47 +00001690/* Want to have errors detected by Valgrind's core reported? Includes:
1691 - pthread API errors (many; eg. unlocking a non-locked mutex)
njn810086f2002-11-14 12:42:47 +00001692 - invalid file descriptors to blocking syscalls read() and write()
1693 - bad signal numbers passed to sigaction()
daywalker5d945de2003-09-26 00:32:53 +00001694 - attempt to install signal handler for SIGKILL or SIGSTOP */
njn810086f2002-11-14 12:42:47 +00001695extern void VG_(needs_core_errors) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001696
njn810086f2002-11-14 12:42:47 +00001697/* Booleans that indicate extra operations are defined; if these are True,
1698 the corresponding template functions (given below) must be defined. A
1699 lot like being a member of a type class. */
njn25e49d8e72002-09-23 09:36:25 +00001700
njn810086f2002-11-14 12:42:47 +00001701/* Want to report errors from skin? This implies use of suppressions, too. */
1702extern void VG_(needs_skin_errors) ( void );
njnd5bb0a52002-09-27 10:24:48 +00001703
njn810086f2002-11-14 12:42:47 +00001704/* Is information kept about specific individual basic blocks? (Eg. for
1705 cachegrind there are cost-centres for every instruction, stored at a
1706 basic block level.) If so, it sometimes has to be discarded, because
1707 .so mmap/munmap-ping or self-modifying code (informed by the
1708 DISCARD_TRANSLATIONS user request) can cause one instruction address
1709 to be used for more than one instruction in one program run... */
1710extern void VG_(needs_basic_block_discards) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001711
njn810086f2002-11-14 12:42:47 +00001712/* Skin maintains information about each register? */
1713extern void VG_(needs_shadow_regs) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001714
njn810086f2002-11-14 12:42:47 +00001715/* Skin defines its own command line options? */
1716extern void VG_(needs_command_line_options) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001717
njn810086f2002-11-14 12:42:47 +00001718/* Skin defines its own client requests? */
1719extern void VG_(needs_client_requests) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001720
njn810086f2002-11-14 12:42:47 +00001721/* Skin defines its own UInstrs? */
1722extern void VG_(needs_extended_UCode) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001723
njn810086f2002-11-14 12:42:47 +00001724/* Skin does stuff before and/or after system calls? */
1725extern void VG_(needs_syscall_wrapper) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001726
njn810086f2002-11-14 12:42:47 +00001727/* Are skin-state sanity checks performed? */
1728extern void VG_(needs_sanity_checks) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001729
njn810086f2002-11-14 12:42:47 +00001730/* Do we need to see data symbols? */
1731extern void VG_(needs_data_syms) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001732
1733/* ------------------------------------------------------------------ */
1734/* Core events to track */
1735
1736/* Part of the core from which this call was made. Useful for determining
njnd5bb0a52002-09-27 10:24:48 +00001737 what kind of error message should be emitted. */
daywalker5d945de2003-09-26 00:32:53 +00001738typedef
njn25e49d8e72002-09-23 09:36:25 +00001739 enum { Vg_CorePThread, Vg_CoreSignal, Vg_CoreSysCall, Vg_CoreTranslate }
1740 CorePart;
1741
njn810086f2002-11-14 12:42:47 +00001742#define EV extern void
njn25e49d8e72002-09-23 09:36:25 +00001743
njn810086f2002-11-14 12:42:47 +00001744/* Events happening in core to track. To be notified, pass a callback
1745 function to the appropriate function. To ignore an event, don't do
daywalker5d945de2003-09-26 00:32:53 +00001746 anything (default is for events to be ignored).
1747
njn72718642003-07-24 08:45:32 +00001748 Note that most events aren't passed a ThreadId. To find out the ThreadId
1749 of the affected thread, use VG_(get_current_or_recent_tid)(). For the
1750 ones passed a ThreadId, use that instead, since
1751 VG_(get_current_or_recent_tid)() might not give the right ThreadId in
1752 that case.
1753*/
njn810086f2002-11-14 12:42:47 +00001754
njn810086f2002-11-14 12:42:47 +00001755
njn3e884182003-04-15 13:03:23 +00001756/* Memory events (Nb: to track heap allocation/freeing, a skin must replace
1757 malloc() et al. See above how to do this.) */
1758
1759/* These ones occur at startup, upon some signals, and upon some syscalls */
daywalker5d945de2003-09-26 00:32:53 +00001760EV VG_(track_new_mem_startup) ( void (*f)(Addr a, UInt len,
njn810086f2002-11-14 12:42:47 +00001761 Bool rr, Bool ww, Bool xx) );
njn810086f2002-11-14 12:42:47 +00001762EV VG_(track_new_mem_stack_signal) ( void (*f)(Addr a, UInt len) );
1763EV VG_(track_new_mem_brk) ( void (*f)(Addr a, UInt len) );
1764EV VG_(track_new_mem_mmap) ( void (*f)(Addr a, UInt len,
1765 Bool rr, Bool ww, Bool xx) );
1766
njn3e884182003-04-15 13:03:23 +00001767EV VG_(track_copy_mem_remap) ( void (*f)(Addr from, Addr to, UInt len) );
1768EV VG_(track_change_mem_mprotect) ( void (*f)(Addr a, UInt len,
1769 Bool rr, Bool ww, Bool xx) );
1770EV VG_(track_die_mem_stack_signal) ( void (*f)(Addr a, UInt len) );
1771EV VG_(track_die_mem_brk) ( void (*f)(Addr a, UInt len) );
1772EV VG_(track_die_mem_munmap) ( void (*f)(Addr a, UInt len) );
1773
1774
1775/* These ones are called when %esp changes. A skin could track these itself
1776 (except for ban_mem_stack) but it's much easier to use the core's help.
daywalker5d945de2003-09-26 00:32:53 +00001777
njn3e884182003-04-15 13:03:23 +00001778 The specialised ones are called in preference to the general one, if they
njn9b007f62003-04-07 14:40:25 +00001779 are defined. These functions are called a lot if they are used, so
1780 specialising can optimise things significantly. If any of the
daywalker5d945de2003-09-26 00:32:53 +00001781 specialised cases are defined, the general case must be defined too.
1782
njn9b007f62003-04-07 14:40:25 +00001783 Nb: they must all use the __attribute__((regparm(n))) attribute. */
1784EV VG_(track_new_mem_stack_4) ( void (*f)(Addr new_ESP) );
1785EV VG_(track_new_mem_stack_8) ( void (*f)(Addr new_ESP) );
1786EV VG_(track_new_mem_stack_12) ( void (*f)(Addr new_ESP) );
1787EV VG_(track_new_mem_stack_16) ( void (*f)(Addr new_ESP) );
1788EV VG_(track_new_mem_stack_32) ( void (*f)(Addr new_ESP) );
1789EV VG_(track_new_mem_stack) ( void (*f)(Addr a, UInt len) );
1790
njn9b007f62003-04-07 14:40:25 +00001791EV VG_(track_die_mem_stack_4) ( void (*f)(Addr die_ESP) );
1792EV VG_(track_die_mem_stack_8) ( void (*f)(Addr die_ESP) );
1793EV VG_(track_die_mem_stack_12) ( void (*f)(Addr die_ESP) );
1794EV VG_(track_die_mem_stack_16) ( void (*f)(Addr die_ESP) );
1795EV VG_(track_die_mem_stack_32) ( void (*f)(Addr die_ESP) );
1796EV VG_(track_die_mem_stack) ( void (*f)(Addr a, UInt len) );
1797
njn3e884182003-04-15 13:03:23 +00001798/* Used for redzone at end of thread stacks */
1799EV VG_(track_ban_mem_stack) ( void (*f)(Addr a, UInt len) );
njn25e49d8e72002-09-23 09:36:25 +00001800
njn3e884182003-04-15 13:03:23 +00001801/* These ones occur around syscalls, signal handling, etc */
njn72718642003-07-24 08:45:32 +00001802EV VG_(track_pre_mem_read) ( void (*f)(CorePart part, ThreadId tid,
njn810086f2002-11-14 12:42:47 +00001803 Char* s, Addr a, UInt size) );
njn72718642003-07-24 08:45:32 +00001804EV VG_(track_pre_mem_read_asciiz) ( void (*f)(CorePart part, ThreadId tid,
njn810086f2002-11-14 12:42:47 +00001805 Char* s, Addr a) );
njn72718642003-07-24 08:45:32 +00001806EV VG_(track_pre_mem_write) ( void (*f)(CorePart part, ThreadId tid,
njn810086f2002-11-14 12:42:47 +00001807 Char* s, Addr a, UInt size) );
1808/* Not implemented yet -- have to add in lots of places, which is a
1809 pain. Won't bother unless/until there's a need. */
daywalker5d945de2003-09-26 00:32:53 +00001810/* EV VG_(track_post_mem_read) ( void (*f)(ThreadId tid, Char* s,
njn810086f2002-11-14 12:42:47 +00001811 Addr a, UInt size) ); */
1812EV VG_(track_post_mem_write) ( void (*f)(Addr a, UInt size) );
njn25e49d8e72002-09-23 09:36:25 +00001813
1814
njnd3040452003-05-19 15:04:06 +00001815/* Register events -- if `shadow_regs' need is set, all should probably be
1816 used. Use VG_(set_thread_shadow_archreg)() to set the shadow of the
1817 changed register. */
1818
1819/* Use VG_(set_shadow_archreg)() to set the eight general purpose regs,
1820 and use VG_(set_shadow_eflags)() to set eflags. */
daywalker5d945de2003-09-26 00:32:53 +00001821EV VG_(track_post_regs_write_init) ( void (*f)() );
njnd3040452003-05-19 15:04:06 +00001822
daywalker5d945de2003-09-26 00:32:53 +00001823/* Use VG_(set_thread_shadow_archreg)() to set the shadow regs for these
njnd3040452003-05-19 15:04:06 +00001824 events. */
daywalker5d945de2003-09-26 00:32:53 +00001825EV VG_(track_post_reg_write_syscall_return)
njnd3040452003-05-19 15:04:06 +00001826 ( void (*f)(ThreadId tid, UInt reg) );
1827EV VG_(track_post_reg_write_deliver_signal)
1828 ( void (*f)(ThreadId tid, UInt reg) );
1829EV VG_(track_post_reg_write_pthread_return)
1830 ( void (*f)(ThreadId tid, UInt reg) );
1831EV VG_(track_post_reg_write_clientreq_return)
1832 ( void (*f)(ThreadId tid, UInt reg) );
1833 /* This one is called for malloc() et al if they are replaced by a skin. */
1834EV VG_(track_post_reg_write_clientcall_return)
1835 ( void (*f)(ThreadId tid, UInt reg,
1836 Addr called_function) );
1837
1838
njn810086f2002-11-14 12:42:47 +00001839/* Scheduler events (not exhaustive) */
njn25e49d8e72002-09-23 09:36:25 +00001840
njn810086f2002-11-14 12:42:47 +00001841EV VG_(track_thread_run) ( void (*f)(ThreadId tid) );
njn25e49d8e72002-09-23 09:36:25 +00001842
njn810086f2002-11-14 12:42:47 +00001843/* Thread events (not exhaustive) */
sewardjdca84112002-11-13 22:29:34 +00001844
njn810086f2002-11-14 12:42:47 +00001845/* Called during thread create, before the new thread has run any
1846 instructions (or touched any memory). */
1847EV VG_(track_post_thread_create)( void (*f)(ThreadId tid, ThreadId child) );
1848/* Called once the joinee thread is terminated and the joining thread is
1849 about to resume. */
1850EV VG_(track_post_thread_join) ( void (*f)(ThreadId joiner, ThreadId joinee) );
njn25e49d8e72002-09-23 09:36:25 +00001851
daywalker5d945de2003-09-26 00:32:53 +00001852
njn810086f2002-11-14 12:42:47 +00001853/* Mutex events (not exhaustive) */
njn25e49d8e72002-09-23 09:36:25 +00001854
njn810086f2002-11-14 12:42:47 +00001855/* Called before a thread can block while waiting for a mutex (called
1856 regardless of whether the thread will block or not). */
daywalker5d945de2003-09-26 00:32:53 +00001857EV VG_(track_pre_mutex_lock) ( void (*f)(ThreadId tid,
njn810086f2002-11-14 12:42:47 +00001858 void* /*pthread_mutex_t* */ mutex) );
1859/* Called once the thread actually holds the mutex (always paired with
1860 pre_mutex_lock). */
daywalker5d945de2003-09-26 00:32:53 +00001861EV VG_(track_post_mutex_lock) ( void (*f)(ThreadId tid,
njn810086f2002-11-14 12:42:47 +00001862 void* /*pthread_mutex_t* */ mutex) );
1863/* Called after a thread has released a mutex (no need for a corresponding
1864 pre_mutex_unlock, because unlocking can't block). */
daywalker5d945de2003-09-26 00:32:53 +00001865EV VG_(track_post_mutex_unlock) ( void (*f)(ThreadId tid,
njn810086f2002-11-14 12:42:47 +00001866 void* /*pthread_mutex_t* */ mutex) );
njn25e49d8e72002-09-23 09:36:25 +00001867
njn1045b0a2003-02-24 10:42:47 +00001868
1869/* Signal events (not exhaustive) */
1870
njn7b456f52003-05-19 11:16:50 +00001871/* ... pre_send_signal, post_send_signal ... */
1872
njn1045b0a2003-02-24 10:42:47 +00001873/* Called before a signal is delivered; `alt_stack' indicates if it is
1874 delivered on an alternative stack. */
1875EV VG_(track_pre_deliver_signal) ( void (*f)(ThreadId tid, Int sigNum,
1876 Bool alt_stack) );
njn7b456f52003-05-19 11:16:50 +00001877/* Called after a signal is delivered. Nb: unfortunately, if the signal
1878 handler longjmps, this won't be called. */
njn1045b0a2003-02-24 10:42:47 +00001879EV VG_(track_post_deliver_signal) ( void (*f)(ThreadId tid, Int sigNum ) );
1880
1881
1882/* Others... condition variables... */
njn810086f2002-11-14 12:42:47 +00001883/* ... */
1884
1885#undef EV
njn25e49d8e72002-09-23 09:36:25 +00001886
1887/* ------------------------------------------------------------------ */
1888/* Template functions */
1889
1890/* These are the parameterised functions in the core. The default definitions
njnd5bb0a52002-09-27 10:24:48 +00001891 are overridden by LD_PRELOADed skin version. At the very least, a skin
1892 must define the fundamental template functions. Depending on what needs
1893 are set, extra template functions will be used too. Functions are
1894 grouped under the needs that govern their use. */
njn25e49d8e72002-09-23 09:36:25 +00001895
1896
1897/* ------------------------------------------------------------------ */
1898/* Fundamental template functions */
1899
1900/* Initialise skin. Must do the following:
njn810086f2002-11-14 12:42:47 +00001901 - initialise the `details' struct, via the VG_(details_*)() functions
njn25e49d8e72002-09-23 09:36:25 +00001902 - register any helpers called by generated code
daywalker5d945de2003-09-26 00:32:53 +00001903
njn25e49d8e72002-09-23 09:36:25 +00001904 May do the following:
njn810086f2002-11-14 12:42:47 +00001905 - initialise the `needs' struct to indicate certain requirements, via
1906 the VG_(needs_*)() functions
1907 - initialise the `track' struct to indicate core events of interest, via
1908 the VG_(track_*)() functions
njn25e49d8e72002-09-23 09:36:25 +00001909 - register any skin-specific profiling events
1910 - any other skin-specific initialisation
1911*/
njn810086f2002-11-14 12:42:47 +00001912extern void SK_(pre_clo_init) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001913
njnd5bb0a52002-09-27 10:24:48 +00001914/* Do initialisation that can only be done after command line processing. */
njn25e49d8e72002-09-23 09:36:25 +00001915extern void SK_(post_clo_init)( void );
1916
1917/* Instrument a basic block. Must be a true function, ie. the same input
1918 always results in the same output, because basic blocks can be
1919 retranslated. Unless you're doing something really strange...
1920 'orig_addr' is the address of the first instruction in the block. */
1921extern UCodeBlock* SK_(instrument) ( UCodeBlock* cb, Addr orig_addr );
1922
njn7d9f94d2003-04-22 21:41:40 +00001923/* Finish up, print out any results, etc. `exitcode' is program's exit
1924 code. The shadow (if the `shadow_regs' need is set) can be found with
1925 VG_(get_shadow_archreg)(R_EBX), since %ebx holds the argument to the
1926 exit() syscall. */
1927extern void SK_(fini) ( Int exitcode );
njn25e49d8e72002-09-23 09:36:25 +00001928
1929
1930/* ------------------------------------------------------------------ */
njn6a230532003-07-21 10:38:23 +00001931/* VG_(needs).core_errors */
1932
1933/* (none needed) */
1934
1935/* ------------------------------------------------------------------ */
1936/* VG_(needs).skin_errors */
njn25e49d8e72002-09-23 09:36:25 +00001937
1938/* Identify if two errors are equal, or equal enough. `res' indicates how
1939 close is "close enough". `res' should be passed on as necessary, eg. if
njn810086f2002-11-14 12:42:47 +00001940 the Error's `extra' part contains an ExeContext, `res' should be
njn25e49d8e72002-09-23 09:36:25 +00001941 passed to VG_(eq_ExeContext)() if the ExeContexts are considered. Other
1942 than that, probably don't worry about it unless you have lots of very
1943 similar errors occurring.
1944 */
njn810086f2002-11-14 12:42:47 +00001945extern Bool SK_(eq_SkinError) ( VgRes res, Error* e1, Error* e2 );
njn25e49d8e72002-09-23 09:36:25 +00001946
njn43c799e2003-04-08 00:08:52 +00001947/* Print error context. */
1948extern void SK_(pp_SkinError) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001949
njn43c799e2003-04-08 00:08:52 +00001950/* Should fill in any details that could be postponed until after the
njn810086f2002-11-14 12:42:47 +00001951 decision whether to ignore the error (ie. details not affecting the
1952 result of SK_(eq_SkinError)()). This saves time when errors are ignored.
njn25e49d8e72002-09-23 09:36:25 +00001953 Yuk.
njn43c799e2003-04-08 00:08:52 +00001954
1955 Return value: must be the size of the `extra' part in bytes -- used by
1956 the core to make a copy.
njn25e49d8e72002-09-23 09:36:25 +00001957*/
njn43c799e2003-04-08 00:08:52 +00001958extern UInt SK_(update_extra) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001959
njn810086f2002-11-14 12:42:47 +00001960/* Return value indicates recognition. If recognised, must set skind using
1961 VG_(set_supp_kind)(). */
1962extern Bool SK_(recognised_suppression) ( Char* name, Supp* su );
njn25e49d8e72002-09-23 09:36:25 +00001963
njn810086f2002-11-14 12:42:47 +00001964/* Read any extra info for this suppression kind. Most likely for filling
1965 in the `extra' and `string' parts (with VG_(set_supp_{extra,string})())
daywalker5d945de2003-09-26 00:32:53 +00001966 of a suppression if necessary. Should return False if a syntax error
njn810086f2002-11-14 12:42:47 +00001967 occurred, True otherwise. */
1968extern Bool SK_(read_extra_suppression_info) ( Int fd, Char* buf, Int nBuf,
1969 Supp* su );
njn25e49d8e72002-09-23 09:36:25 +00001970
1971/* This should just check the kinds match and maybe some stuff in the
njn810086f2002-11-14 12:42:47 +00001972 `string' and `extra' field if appropriate (using VG_(get_supp_*)() to
1973 get the relevant suppression parts). */
njn43c799e2003-04-08 00:08:52 +00001974extern Bool SK_(error_matches_suppression) ( Error* err, Supp* su );
1975
1976/* This should return the suppression name, for --gen-suppressions, or NULL
1977 if that error type cannot be suppressed. This is the inverse of
1978 SK_(recognised_suppression)(). */
1979extern Char* SK_(get_error_name) ( Error* err );
1980
1981/* This should print any extra info for the error, for --gen-suppressions,
1982 including the newline. This is the inverse of
1983 SK_(read_extra_suppression_info)(). */
1984extern void SK_(print_extra_suppression_info) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001985
1986
1987/* ------------------------------------------------------------------ */
1988/* VG_(needs).basic_block_discards */
1989
njnd5bb0a52002-09-27 10:24:48 +00001990/* Should discard any information that pertains to specific basic blocks
1991 or instructions within the address range given. */
njn25e49d8e72002-09-23 09:36:25 +00001992extern void SK_(discard_basic_block_info) ( Addr a, UInt size );
1993
1994
1995/* ------------------------------------------------------------------ */
1996/* VG_(needs).shadow_regs */
1997
njnd3040452003-05-19 15:04:06 +00001998/* No functions must be defined, but the post_reg[s]_write_* events should
1999 be tracked. */
njn25e49d8e72002-09-23 09:36:25 +00002000
2001/* ------------------------------------------------------------------ */
2002/* VG_(needs).command_line_options */
2003
njnd5bb0a52002-09-27 10:24:48 +00002004/* Return True if option was recognised. Presumably sets some state to
2005 record the option as well. */
2006extern Bool SK_(process_cmd_line_option) ( Char* argv );
njn25e49d8e72002-09-23 09:36:25 +00002007
njn3e884182003-04-15 13:03:23 +00002008/* Print out command line usage for options for normal skin operation. */
2009extern void SK_(print_usage) ( void );
njn25e49d8e72002-09-23 09:36:25 +00002010
njn3e884182003-04-15 13:03:23 +00002011/* Print out command line usage for options for debugging the skin. */
2012extern void SK_(print_debug_usage) ( void );
njn25e49d8e72002-09-23 09:36:25 +00002013
2014/* ------------------------------------------------------------------ */
2015/* VG_(needs).client_requests */
2016
njnd3040452003-05-19 15:04:06 +00002017/* If using client requests, the number of the first request should be equal
2018 to VG_USERREQ_SKIN_BASE('X','Y'), where 'X' and 'Y' form a suitable two
2019 character identification for the string. The second and subsequent
2020 requests should follow. */
2021
2022/* This function should use the VG_IS_SKIN_USERREQ macro (in
2023 include/valgrind.h) to first check if it's a request for this skin. Then
2024 should handle it if it's recognised (and return True), or return False if
2025 not recognised. arg_block[0] holds the request number, any further args
2026 from the request are in arg_block[1..]. 'ret' is for the return value...
2027 it should probably be filled, if only with 0. */
njn72718642003-07-24 08:45:32 +00002028extern Bool SK_(handle_client_request) ( ThreadId tid, UInt* arg_block,
njnd3040452003-05-19 15:04:06 +00002029 UInt *ret );
njn25e49d8e72002-09-23 09:36:25 +00002030
2031
2032/* ------------------------------------------------------------------ */
2033/* VG_(needs).extends_UCode */
2034
njn4ba5a792002-09-30 10:23:54 +00002035/* Useful to use in VG_(get_Xreg_usage)() */
njn810086f2002-11-14 12:42:47 +00002036#define VG_UINSTR_READS_REG(ono,regs,isWrites) \
njn25e49d8e72002-09-23 09:36:25 +00002037 { if (mycat(u->tag,ono) == tag) \
njn810086f2002-11-14 12:42:47 +00002038 { regs[n] = mycat(u->val,ono); \
2039 isWrites[n] = False; \
njn25e49d8e72002-09-23 09:36:25 +00002040 n++; \
2041 } \
2042 }
njn810086f2002-11-14 12:42:47 +00002043#define VG_UINSTR_WRITES_REG(ono,regs,isWrites) \
njnd5bb0a52002-09-27 10:24:48 +00002044 { if (mycat(u->tag,ono) == tag) \
njn810086f2002-11-14 12:42:47 +00002045 { regs[n] = mycat(u->val,ono); \
2046 isWrites[n] = True; \
njnd5bb0a52002-09-27 10:24:48 +00002047 n++; \
2048 } \
njn25e49d8e72002-09-23 09:36:25 +00002049 }
2050
njn4ba5a792002-09-30 10:23:54 +00002051/* 'X' prefix indicates eXtended UCode. */
njn810086f2002-11-14 12:42:47 +00002052extern Int SK_(get_Xreg_usage) ( UInstr* u, Tag tag, Int* regs,
2053 Bool* isWrites );
njn4ba5a792002-09-30 10:23:54 +00002054extern void SK_(emit_XUInstr) ( UInstr* u, RRegSet regs_live_before );
2055extern Bool SK_(sane_XUInstr) ( Bool beforeRA, Bool beforeLiveness,
njn25e49d8e72002-09-23 09:36:25 +00002056 UInstr* u );
njn4ba5a792002-09-30 10:23:54 +00002057extern Char* SK_(name_XUOpcode) ( Opcode opc );
2058extern void SK_(pp_XUInstr) ( UInstr* u );
njn25e49d8e72002-09-23 09:36:25 +00002059
2060
2061/* ------------------------------------------------------------------ */
2062/* VG_(needs).syscall_wrapper */
2063
2064/* If either of the pre_ functions malloc() something to return, the
daywalker5d945de2003-09-26 00:32:53 +00002065 * corresponding post_ function had better free() it!
2066 */
njn25e49d8e72002-09-23 09:36:25 +00002067extern void* SK_( pre_syscall) ( ThreadId tid, UInt syscallno,
2068 Bool is_blocking );
2069extern void SK_(post_syscall) ( ThreadId tid, UInt syscallno,
2070 void* pre_result, Int res,
2071 Bool is_blocking );
2072
njnd5bb0a52002-09-27 10:24:48 +00002073
njn25e49d8e72002-09-23 09:36:25 +00002074/* ---------------------------------------------------------------------
2075 VG_(needs).sanity_checks */
2076
njnd5bb0a52002-09-27 10:24:48 +00002077/* Can be useful for ensuring a skin's correctness. SK_(cheap_sanity_check)
2078 is called very frequently; SK_(expensive_sanity_check) is called less
2079 frequently and can be more involved. */
njn25e49d8e72002-09-23 09:36:25 +00002080extern Bool SK_(cheap_sanity_check) ( void );
2081extern Bool SK_(expensive_sanity_check) ( void );
2082
2083
2084#endif /* NDEF __VG_SKIN_H */
2085
2086/*--------------------------------------------------------------------*/
2087/*--- end vg_skin.h ---*/
2088/*--------------------------------------------------------------------*/
2089