blob: bdfca566850a5e4f6cf1bb9dd3412c5726a23df2 [file] [log] [blame]
njn25e49d8e72002-09-23 09:36:25 +00001
2/*--------------------------------------------------------------------*/
3/*--- The only header your skin will ever need to #include... ---*/
4/*--- vg_skin.h ---*/
5/*--------------------------------------------------------------------*/
6
7/*
njnc9539842002-10-02 13:26:35 +00008 This file is part of Valgrind, an extensible x86 protected-mode
9 emulator for monitoring program execution on x86-Unixes.
njn25e49d8e72002-09-23 09:36:25 +000010
njn0e1b5142003-04-15 14:58:06 +000011 Copyright (C) 2000-2003 Julian Seward
njn25e49d8e72002-09-23 09:36:25 +000012 jseward@acm.org
13
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation; either version 2 of the
17 License, or (at your option) any later version.
18
19 This program is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27 02111-1307, USA.
28
29 The GNU General Public License is contained in the file COPYING.
30*/
31
32#ifndef __VG_SKIN_H
33#define __VG_SKIN_H
34
35#include <stdarg.h> /* ANSI varargs stuff */
36#include <setjmp.h> /* for jmp_buf */
37
38#include "vg_constants_skin.h"
39
40
41/*====================================================================*/
42/*=== Build options and table sizes. ===*/
43/*====================================================================*/
44
45/* You should be able to change these options or sizes, recompile, and
46 still have a working system. */
47
48/* The maximum number of pthreads that we support. This is
49 deliberately not very high since our implementation of some of the
50 scheduler algorithms is surely O(N) in the number of threads, since
51 that's simple, at least. And (in practice) we hope that most
52 programs do not need many threads. */
53#define VG_N_THREADS 50
54
55/* Maximum number of pthread keys available. Again, we start low until
56 the need for a higher number presents itself. */
57#define VG_N_THREAD_KEYS 50
58
59/* Total number of integer registers available for allocation -- all of
60 them except %esp, %ebp. %ebp permanently points at VG_(baseBlock).
61
njn211b6ad2003-02-03 12:33:31 +000062 If you increase this you'll have to also change at least these:
njn4ba5a792002-09-30 10:23:54 +000063 - VG_(rank_to_realreg)()
64 - VG_(realreg_to_rank)()
njn25e49d8e72002-09-23 09:36:25 +000065 - ppRegsLiveness()
66 - the RegsLive type (maybe -- RegsLive type must have more than
67 VG_MAX_REALREGS bits)
njn211b6ad2003-02-03 12:33:31 +000068
69 You can decrease it, and performance will drop because more spills will
70 occur. If you decrease it too much, everything will fall over.
njn25e49d8e72002-09-23 09:36:25 +000071
72 Do not change this unless you really know what you are doing! */
73#define VG_MAX_REALREGS 6
74
75
76/*====================================================================*/
njn1a1dd8b2002-09-27 10:42:20 +000077/*=== Basic types, useful macros ===*/
njn25e49d8e72002-09-23 09:36:25 +000078/*====================================================================*/
79
njn25e49d8e72002-09-23 09:36:25 +000080typedef unsigned char UChar;
81typedef unsigned short UShort;
82typedef unsigned int UInt;
83typedef unsigned long long int ULong;
84
85typedef signed char Char;
86typedef signed short Short;
87typedef signed int Int;
88typedef signed long long int Long;
89
90typedef unsigned int Addr;
91
92typedef unsigned char Bool;
93#define False ((Bool)0)
94#define True ((Bool)1)
95
96
njn1a1dd8b2002-09-27 10:42:20 +000097#define mycat_wrk(aaa,bbb) aaa##bbb
98#define mycat(aaa,bbb) mycat_wrk(aaa,bbb)
99
100/* No, really. I _am_ that strange. */
101#define OINK(nnn) VG_(message)(Vg_DebugMsg, "OINK %d",nnn)
102
njn25e49d8e72002-09-23 09:36:25 +0000103/* ---------------------------------------------------------------------
104 Now the basic types are set up, we can haul in the kernel-interface
105 definitions.
106 ------------------------------------------------------------------ */
107
njn2574bb4762002-09-24 11:23:50 +0000108#include "../coregrind/vg_kerneliface.h"
njn25e49d8e72002-09-23 09:36:25 +0000109
110
111/*====================================================================*/
njn27f1a382002-11-08 15:48:16 +0000112/*=== Core/skin interface version ===*/
113/*====================================================================*/
114
115/* The major version number indicates binary-incompatible changes to the
116 interface; if the core and skin major versions don't match, Valgrind
117 will abort. The minor version indicates binary-compatible changes.
njn27f1a382002-11-08 15:48:16 +0000118*/
njn9b007f62003-04-07 14:40:25 +0000119#define VG_CORE_INTERFACE_MAJOR_VERSION 2
120#define VG_CORE_INTERFACE_MINOR_VERSION 0
njn27f1a382002-11-08 15:48:16 +0000121
122extern const Int VG_(skin_interface_major_version);
123extern const Int VG_(skin_interface_minor_version);
124
njn563f96f2003-02-03 11:17:46 +0000125/* Every skin must include this macro somewhere, exactly once. */
njn27f1a382002-11-08 15:48:16 +0000126#define VG_DETERMINE_INTERFACE_VERSION \
127const Int VG_(skin_interface_major_version) = VG_CORE_INTERFACE_MAJOR_VERSION; \
128const Int VG_(skin_interface_minor_version) = VG_CORE_INTERFACE_MINOR_VERSION;
129
njn211b6ad2003-02-03 12:33:31 +0000130
njn27f1a382002-11-08 15:48:16 +0000131/*====================================================================*/
njn25e49d8e72002-09-23 09:36:25 +0000132/*=== Command-line options ===*/
133/*====================================================================*/
134
njn43c799e2003-04-08 00:08:52 +0000135/* Use this for normal null-termination-style string comparison */
136#define VG_STREQ(s1,s2) (s1 != NULL && s2 != NULL \
137 && VG_(strcmp)((s1),(s2))==0)
138
139/* Use these for recognising skin command line options -- stops comparing
140 once whitespace is reached. */
141# define VG_CLO_STREQ(s1,s2) (0==VG_(strcmp_ws)((s1),(s2)))
142# define VG_CLO_STREQN(nn,s1,s2) (0==VG_(strncmp_ws)((s1),(s2),(nn)))
143
njn25e49d8e72002-09-23 09:36:25 +0000144/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
145extern Int VG_(clo_verbosity);
146
147/* Profile? */
148extern Bool VG_(clo_profile);
149
njn25e49d8e72002-09-23 09:36:25 +0000150/* Call this if a recognised option was bad for some reason.
151 Note: don't use it just because an option was unrecognised -- return 'False'
152 from SKN_(process_cmd_line_option) to indicate that. */
153extern void VG_(bad_option) ( Char* opt );
154
155/* Client args */
156extern Int VG_(client_argc);
157extern Char** VG_(client_argv);
158
njnd5bb0a52002-09-27 10:24:48 +0000159/* Client environment. Can be inspected with VG_(getenv)() */
njn25e49d8e72002-09-23 09:36:25 +0000160extern Char** VG_(client_envp);
161
162
163/*====================================================================*/
164/*=== Printing messages for the user ===*/
165/*====================================================================*/
166
167/* Print a message prefixed by "??<pid>?? "; '?' depends on the VgMsgKind.
168 Should be used for all user output. */
169
170typedef
171 enum { Vg_UserMsg, /* '?' == '=' */
172 Vg_DebugMsg, /* '?' == '-' */
173 Vg_DebugExtraMsg /* '?' == '+' */
174 }
175 VgMsgKind;
176
177/* Functions for building a message from multiple parts. */
178extern void VG_(start_msg) ( VgMsgKind kind );
179extern void VG_(add_to_msg) ( Char* format, ... );
180/* Ends and prints the message. Appends a newline. */
181extern void VG_(end_msg) ( void );
182
njnd5bb0a52002-09-27 10:24:48 +0000183/* Send a single-part message. Appends a newline. */
njn25e49d8e72002-09-23 09:36:25 +0000184extern void VG_(message) ( VgMsgKind kind, Char* format, ... );
185
186
187/*====================================================================*/
188/*=== Profiling ===*/
189/*====================================================================*/
190
191/* Nb: VGP_(register_profile_event)() relies on VgpUnc being the first one */
192#define VGP_CORE_LIST \
193 /* These ones depend on the core */ \
194 VGP_PAIR(VgpUnc, "unclassified"), \
195 VGP_PAIR(VgpRun, "running"), \
196 VGP_PAIR(VgpSched, "scheduler"), \
197 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
198 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
njn25e49d8e72002-09-23 09:36:25 +0000199 VGP_PAIR(VgpTranslate, "translate-main"), \
200 VGP_PAIR(VgpToUCode, "to-ucode"), \
201 VGP_PAIR(VgpFromUcode, "from-ucode"), \
202 VGP_PAIR(VgpImprove, "improve"), \
njn9b007f62003-04-07 14:40:25 +0000203 VGP_PAIR(VgpESPUpdate, "ESP-update"), \
njn25e49d8e72002-09-23 09:36:25 +0000204 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
205 VGP_PAIR(VgpLiveness, "liveness-analysis"), \
206 VGP_PAIR(VgpDoLRU, "do-lru"), \
207 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
208 VGP_PAIR(VgpInitMem, "init-memory"), \
209 VGP_PAIR(VgpExeContext, "exe-context"), \
210 VGP_PAIR(VgpReadSyms, "read-syms"), \
211 VGP_PAIR(VgpSearchSyms, "search-syms"), \
212 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
213 VGP_PAIR(VgpCoreSysWrap, "core-syscall-wrapper"), \
214 VGP_PAIR(VgpDemangle, "demangle"), \
njn37cea302002-09-30 11:24:00 +0000215 VGP_PAIR(VgpCoreCheapSanity, "core-cheap-sanity"), \
216 VGP_PAIR(VgpCoreExpensiveSanity, "core-expensive-sanity"), \
njn25e49d8e72002-09-23 09:36:25 +0000217 /* These ones depend on the skin */ \
218 VGP_PAIR(VgpPreCloInit, "pre-clo-init"), \
219 VGP_PAIR(VgpPostCloInit, "post-clo-init"), \
220 VGP_PAIR(VgpInstrument, "instrument"), \
221 VGP_PAIR(VgpSkinSysWrap, "skin-syscall-wrapper"), \
njn37cea302002-09-30 11:24:00 +0000222 VGP_PAIR(VgpSkinCheapSanity, "skin-cheap-sanity"), \
223 VGP_PAIR(VgpSkinExpensiveSanity, "skin-expensive-sanity"), \
njn25e49d8e72002-09-23 09:36:25 +0000224 VGP_PAIR(VgpFini, "fini")
225
226#define VGP_PAIR(n,name) n
227typedef enum { VGP_CORE_LIST } VgpCoreCC;
228#undef VGP_PAIR
229
230/* When registering skin profiling events, ensure that the 'n' value is in
231 * the range (VgpFini+1..) */
232extern void VGP_(register_profile_event) ( Int n, Char* name );
233
234extern void VGP_(pushcc) ( UInt cc );
235extern void VGP_(popcc) ( UInt cc );
236
237/* Define them only if they haven't already been defined by vg_profile.c */
238#ifndef VGP_PUSHCC
239# define VGP_PUSHCC(x)
240#endif
241#ifndef VGP_POPCC
242# define VGP_POPCC(x)
243#endif
244
245
246/*====================================================================*/
247/*=== Useful stuff to call from generated code ===*/
248/*====================================================================*/
249
250/* ------------------------------------------------------------------ */
251/* General stuff */
252
njn41557122002-10-14 09:25:37 +0000253/* 64-bit counter for the number of basic blocks done. */
254extern ULong VG_(bbs_done);
255
njn25e49d8e72002-09-23 09:36:25 +0000256/* Get the simulated %esp */
257extern Addr VG_(get_stack_pointer) ( void );
258
njnd5bb0a52002-09-27 10:24:48 +0000259/* Detect if an address is within Valgrind's stack or Valgrind's
260 m_state_static; useful for memory leak detectors to tell if a block
261 is used by Valgrind (and thus can be ignored). */
njn25e49d8e72002-09-23 09:36:25 +0000262extern Bool VG_(within_stack)(Addr a);
njn25e49d8e72002-09-23 09:36:25 +0000263extern Bool VG_(within_m_state_static)(Addr a);
264
265/* Check if an address is 4-byte aligned */
266#define IS_ALIGNED4_ADDR(aaa_p) (0 == (((UInt)(aaa_p)) & 3))
njn9b007f62003-04-07 14:40:25 +0000267#define IS_ALIGNED8_ADDR(aaa_p) (0 == (((UInt)(aaa_p)) & 7))
njn25e49d8e72002-09-23 09:36:25 +0000268
269
270/* ------------------------------------------------------------------ */
271/* Thread-related stuff */
272
273/* Special magic value for an invalid ThreadId. It corresponds to
274 LinuxThreads using zero as the initial value for
275 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
276#define VG_INVALID_THREADID ((ThreadId)(0))
277
278/* ThreadIds are simply indices into the vg_threads[] array. */
279typedef
280 UInt
281 ThreadId;
282
njnd5bb0a52002-09-27 10:24:48 +0000283/* struct _ThreadState defined elsewhere; ThreadState is abstract as its
284 definition is not important for skins. */
njn25e49d8e72002-09-23 09:36:25 +0000285typedef
286 struct _ThreadState
287 ThreadState;
288
sewardj7ab2aca2002-10-20 19:40:32 +0000289extern ThreadId VG_(get_current_tid) ( void );
sewardjb52a1b02002-10-23 21:38:22 +0000290extern ThreadId VG_(get_current_or_recent_tid) ( void );
sewardj7ab2aca2002-10-20 19:40:32 +0000291extern ThreadId VG_(get_tid_from_ThreadState) ( ThreadState* );
njn25e49d8e72002-09-23 09:36:25 +0000292extern ThreadState* VG_(get_ThreadState) ( ThreadId tid );
293
njn3e884182003-04-15 13:03:23 +0000294/* Searches through all thread's stacks to see if any match. Returns
295 * VG_INVALID_THREADID if none match. */
296extern ThreadId VG_(first_matching_thread_stack)
297 ( Bool (*p) ( Addr stack_min, Addr stack_max ));
298
njn25e49d8e72002-09-23 09:36:25 +0000299
300/*====================================================================*/
301/*=== Valgrind's version of libc ===*/
302/*====================================================================*/
303
304/* Valgrind doesn't use libc at all, for good reasons (trust us). So here
305 are its own versions of C library functions, but with VG_ prefixes. Note
306 that the types of some are slightly different to the real ones. Some
njnf4ce3d32003-02-10 10:17:26 +0000307 additional useful functions are provided too; descriptions of how they
308 work are given below. */
njn25e49d8e72002-09-23 09:36:25 +0000309
310#if !defined(NULL)
311# define NULL ((void*)0)
312#endif
313
314
315/* ------------------------------------------------------------------ */
316/* stdio.h
317 *
318 * Note that they all output to the file descriptor given by the
319 * --logfile-fd=N argument, which defaults to 2 (stderr). Hence no
320 * need for VG_(fprintf)().
njn25e49d8e72002-09-23 09:36:25 +0000321 */
sewardj78e3cd92002-10-22 04:45:48 +0000322extern UInt VG_(printf) ( const char *format, ... );
njn25e49d8e72002-09-23 09:36:25 +0000323/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
sewardj78e3cd92002-10-22 04:45:48 +0000324extern UInt VG_(sprintf) ( Char* buf, Char *format, ... );
325extern UInt VG_(vprintf) ( void(*send)(Char),
njn25e49d8e72002-09-23 09:36:25 +0000326 const Char *format, va_list vargs );
327
njn41557122002-10-14 09:25:37 +0000328extern Int VG_(rename) ( Char* old_name, Char* new_name );
329
njn25e49d8e72002-09-23 09:36:25 +0000330/* ------------------------------------------------------------------ */
331/* stdlib.h */
332
333extern void* VG_(malloc) ( Int nbytes );
njnd5bb0a52002-09-27 10:24:48 +0000334extern void VG_(free) ( void* p );
335extern void* VG_(calloc) ( Int n, Int nbytes );
336extern void* VG_(realloc) ( void* p, Int size );
337extern void* VG_(malloc_aligned) ( Int align_bytes, Int nbytes );
njn25e49d8e72002-09-23 09:36:25 +0000338
339extern void VG_(print_malloc_stats) ( void );
340
341
342extern void VG_(exit)( Int status )
343 __attribute__ ((__noreturn__));
njne427a662002-10-02 11:08:25 +0000344/* Prints a panic message (a constant string), appends newline and bug
345 reporting info, aborts. */
346__attribute__ ((__noreturn__))
347extern void VG_(skin_panic) ( Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000348
njnd5bb0a52002-09-27 10:24:48 +0000349/* Looks up VG_(client_envp) */
njn25e49d8e72002-09-23 09:36:25 +0000350extern Char* VG_(getenv) ( Char* name );
351
352/* Crude stand-in for the glibc system() call. */
353extern Int VG_(system) ( Char* cmd );
354
njnd5bb0a52002-09-27 10:24:48 +0000355extern Long VG_(atoll) ( Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000356
357/* Like atoll(), but converts a number of base 2..36 */
358extern Long VG_(atoll36) ( UInt base, Char* str );
359
360
361/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000362/* ctype.h */
njn25e49d8e72002-09-23 09:36:25 +0000363extern Bool VG_(isspace) ( Char c );
364extern Bool VG_(isdigit) ( Char c );
365extern Char VG_(toupper) ( Char c );
366
367
368/* ------------------------------------------------------------------ */
369/* string.h */
370extern Int VG_(strlen) ( const Char* str );
371extern Char* VG_(strcat) ( Char* dest, const Char* src );
372extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
373extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
374extern Char* VG_(strcpy) ( Char* dest, const Char* src );
375extern Char* VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
376extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
377extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
378extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
379extern Char* VG_(strchr) ( const Char* s, Char c );
380extern Char* VG_(strdup) ( const Char* s);
sewardj7ab2aca2002-10-20 19:40:32 +0000381extern void* VG_(memcpy) ( void *d, const void *s, Int sz );
382extern void* VG_(memset) ( void *s, Int c, Int sz );
njn6d68e792003-02-24 10:49:08 +0000383extern Int VG_(memcmp) ( const void* s1, const void* s2, Int n );
njn25e49d8e72002-09-23 09:36:25 +0000384
njnd5bb0a52002-09-27 10:24:48 +0000385/* Like strcmp() and strncmp(), but stop comparing at any whitespace. */
njn25e49d8e72002-09-23 09:36:25 +0000386extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
njn25e49d8e72002-09-23 09:36:25 +0000387extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
388
njnd5bb0a52002-09-27 10:24:48 +0000389/* Like strncpy(), but if 'src' is longer than 'ndest' inserts a '\0' as the
390 last character. */
njn25e49d8e72002-09-23 09:36:25 +0000391extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
392
393/* Mini-regexp function. Searches for 'pat' in 'str'. Supports
394 * meta-symbols '*' and '?'. '\' escapes meta-symbols. */
njn4ba5a792002-09-30 10:23:54 +0000395extern Bool VG_(string_match) ( Char* pat, Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000396
397
398/* ------------------------------------------------------------------ */
399/* math.h */
njnd5bb0a52002-09-27 10:24:48 +0000400/* Returns the base-2 logarithm of x. */
njn25e49d8e72002-09-23 09:36:25 +0000401extern Int VG_(log2) ( Int x );
402
403
404/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000405/* unistd.h, fcntl.h, sys/stat.h */
sewardj4cf05692002-10-27 20:28:29 +0000406extern Int VG_(getpid) ( void );
407extern Int VG_(getppid) ( void );
njnd5bb0a52002-09-27 10:24:48 +0000408
njn4aca2d22002-10-04 10:29:38 +0000409extern Int VG_(open) ( const Char* pathname, Int flags, Int mode );
410extern Int VG_(read) ( Int fd, void* buf, Int count);
411extern Int VG_(write) ( Int fd, void* buf, Int count);
412extern void VG_(close) ( Int fd );
njnd5bb0a52002-09-27 10:24:48 +0000413
njn41557122002-10-14 09:25:37 +0000414/* Nb: VG_(rename)() declared in stdio.h section above */
njn4aca2d22002-10-04 10:29:38 +0000415extern Int VG_(unlink) ( Char* file_name );
416extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
njn25e49d8e72002-09-23 09:36:25 +0000417
njn13f02932003-04-30 20:23:58 +0000418extern Char* VG_(getcwd) ( Char* buf, Int size );
419
njn25e49d8e72002-09-23 09:36:25 +0000420
421/* ------------------------------------------------------------------ */
422/* assert.h */
423/* Asserts permanently enabled -- no turning off with NDEBUG. Hurrah! */
424#define VG__STRING(__str) #__str
425
njne427a662002-10-02 11:08:25 +0000426#define sk_assert(expr) \
njn25e49d8e72002-09-23 09:36:25 +0000427 ((void) ((expr) ? 0 : \
njne427a662002-10-02 11:08:25 +0000428 (VG_(skin_assert_fail) (VG__STRING(expr), \
429 __FILE__, __LINE__, \
430 __PRETTY_FUNCTION__), 0)))
njn25e49d8e72002-09-23 09:36:25 +0000431
njne427a662002-10-02 11:08:25 +0000432__attribute__ ((__noreturn__))
433extern void VG_(skin_assert_fail) ( Char* expr, Char* file,
434 Int line, Char* fn );
njn25e49d8e72002-09-23 09:36:25 +0000435
436
437/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000438/* system/mman.h */
njn25e49d8e72002-09-23 09:36:25 +0000439extern void* VG_(mmap)( void* start, UInt length,
440 UInt prot, UInt flags, UInt fd, UInt offset );
441extern Int VG_(munmap)( void* start, Int length );
442
443/* Get memory by anonymous mmap. */
444extern void* VG_(get_memory_from_mmap) ( Int nBytes, Char* who );
445
446
447/* ------------------------------------------------------------------ */
448/* signal.h.
449
450 Note that these use the vk_ (kernel) structure
451 definitions, which are different in places from those that glibc
452 defines -- hence the 'k' prefix. Since we're operating right at the
453 kernel interface, glibc's view of the world is entirely irrelevant. */
454
455/* --- Signal set ops --- */
njnd5bb0a52002-09-27 10:24:48 +0000456extern Int VG_(ksigfillset) ( vki_ksigset_t* set );
457extern Int VG_(ksigemptyset) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000458
njnd5bb0a52002-09-27 10:24:48 +0000459extern Bool VG_(kisfullsigset) ( vki_ksigset_t* set );
460extern Bool VG_(kisemptysigset) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000461
njnd5bb0a52002-09-27 10:24:48 +0000462extern Int VG_(ksigaddset) ( vki_ksigset_t* set, Int signum );
463extern Int VG_(ksigdelset) ( vki_ksigset_t* set, Int signum );
njn25e49d8e72002-09-23 09:36:25 +0000464extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
465
njnd5bb0a52002-09-27 10:24:48 +0000466extern void VG_(ksigaddset_from_set) ( vki_ksigset_t* dst, vki_ksigset_t* src );
467extern void VG_(ksigdelset_from_set) ( vki_ksigset_t* dst, vki_ksigset_t* src );
njn25e49d8e72002-09-23 09:36:25 +0000468
469/* --- Mess with the kernel's sig state --- */
njnd5bb0a52002-09-27 10:24:48 +0000470extern Int VG_(ksigprocmask) ( Int how, const vki_ksigset_t* set,
njn25e49d8e72002-09-23 09:36:25 +0000471 vki_ksigset_t* oldset );
njnd5bb0a52002-09-27 10:24:48 +0000472extern Int VG_(ksigaction) ( Int signum,
473 const vki_ksigaction* act,
474 vki_ksigaction* oldact );
njn25e49d8e72002-09-23 09:36:25 +0000475
njnd5bb0a52002-09-27 10:24:48 +0000476extern Int VG_(ksignal) ( Int signum, void (*sighandler)(Int) );
477extern Int VG_(ksigaltstack) ( const vki_kstack_t* ss, vki_kstack_t* oss );
njn25e49d8e72002-09-23 09:36:25 +0000478
sewardjdcaf3122002-09-30 23:12:33 +0000479extern Int VG_(kkill) ( Int pid, Int signo );
480extern Int VG_(ksigpending) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000481
482
483/*====================================================================*/
484/*=== UCode definition ===*/
485/*====================================================================*/
486
sewardje1042472002-09-30 12:33:11 +0000487/* Tags which describe what operands are. Must fit into 4 bits, which
488 they clearly do. */
njn25e49d8e72002-09-23 09:36:25 +0000489typedef
sewardje1042472002-09-30 12:33:11 +0000490enum { TempReg =0, /* virtual temp-reg */
491 ArchReg =1, /* simulated integer reg */
492 ArchRegS =2, /* simulated segment reg */
493 RealReg =3, /* real machine's real reg */
494 SpillNo =4, /* spill slot location */
495 Literal =5, /* literal; .lit32 field has actual value */
496 Lit16 =6, /* literal; .val[123] field has actual value */
497 NoValue =7 /* operand not in use */
498 }
499 Tag;
njn25e49d8e72002-09-23 09:36:25 +0000500
njnd5bb0a52002-09-27 10:24:48 +0000501/* Invalid register numbers (can't be negative) */
njn25e49d8e72002-09-23 09:36:25 +0000502#define INVALID_TEMPREG 999999999
503#define INVALID_REALREG 999999999
504
505/* Microinstruction opcodes. */
506typedef
507 enum {
njnd5bb0a52002-09-27 10:24:48 +0000508 NOP, /* Null op */
njn25e49d8e72002-09-23 09:36:25 +0000509
sewardj7a5ebcf2002-11-13 22:42:13 +0000510 LOCK, /* Indicate the existance of a LOCK prefix (functionally NOP) */
511
njnd5bb0a52002-09-27 10:24:48 +0000512 /* Moving values around */
513 GET, PUT, /* simulated register <--> TempReg */
514 GETF, PUTF, /* simulated %eflags <--> TempReg */
515 LOAD, STORE, /* memory <--> TempReg */
516 MOV, /* TempReg <--> TempReg */
517 CMOV, /* Used for cmpxchg and cmov */
njn25e49d8e72002-09-23 09:36:25 +0000518
njnd5bb0a52002-09-27 10:24:48 +0000519 /* Arithmetic/logical ops */
520 ADD, ADC, SUB, SBB, /* Add/subtract (w/wo carry) */
521 AND, OR, XOR, NOT, /* Boolean ops */
522 SHL, SHR, SAR, ROL, ROR, RCL, RCR, /* Shift/rotate (w/wo carry) */
523 NEG, /* Negate */
524 INC, DEC, /* Increment/decrement */
525 BSWAP, /* Big-endian <--> little-endian */
526 CC2VAL, /* Condition code --> 0 or 1 */
527 WIDEN, /* Signed or unsigned widening */
njn25e49d8e72002-09-23 09:36:25 +0000528
njnd5bb0a52002-09-27 10:24:48 +0000529 /* Conditional or unconditional jump */
530 JMP,
531
532 /* FPU ops */
533 FPU, /* Doesn't touch memory */
534 FPU_R, FPU_W, /* Reads/writes memory */
535
sewardj3d7c9c82003-03-26 21:08:13 +0000536 /* ------------ MMX ops ------------ */
sewardj8cec6ee2003-05-18 11:56:39 +0000537 /* In this and the SSE encoding, bytes at higher addresses are
538 held in bits [7:0] in these 16-bit words. I guess this means
539 it is a big-endian encoding. */
sewardj3d7c9c82003-03-26 21:08:13 +0000540
541 /* 1 byte, no memrefs, no iregdefs, copy exactly to the
542 output. Held in val1[7:0]. */
543 MMX1,
544
545 /* 2 bytes, no memrefs, no iregdefs, copy exactly to the
546 output. Held in val1[15:0]. */
547 MMX2,
548
549 /* 3 bytes, no memrefs, no iregdefs, copy exactly to the
550 output. Held in val1[15:0] and val2[7:0]. */
551 MMX3,
552
553 /* 2 bytes, reads/writes mem. Insns of the form
554 bbbbbbbb:mod mmxreg r/m.
555 Held in val1[15:0], and mod and rm are to be replaced
556 at codegen time by a reference to the Temp/RealReg holding
557 the address. Arg2 holds this Temp/Real Reg.
558 Transfer is always at size 8.
559 */
560 MMX2_MemRd,
561 MMX2_MemWr,
562
563 /* 2 bytes, reads/writes an integer register. Insns of the form
564 bbbbbbbb:11 mmxreg ireg.
565 Held in val1[15:0], and ireg is to be replaced
566 at codegen time by a reference to the relevant RealReg.
567 Transfer is always at size 4. Arg2 holds this Temp/Real Reg.
568 */
569 MMX2_RegRd,
570 MMX2_RegWr,
571
sewardj8cec6ee2003-05-18 11:56:39 +0000572 /* ------------ SSE/SSE2 ops ------------ */
573 /* In the following:
574
575 a digit N indicates the next N bytes are to be copied exactly to the
576 output.
577
578 'a' indicates a mod-xmmreg-rm byte, where the mod-rm part is
579 to be replaced at codegen time to a Temp/RealReg holding the
580 address.
581
582 'g' indicates a byte of the form '11 xmmreg ireg', where ireg
583 is written, and is to be replaced at codegen time by a
584 reference to the relevant RealReg.
585
586 'h' indicates a byte of the form '11 ireg xmmreg', where ireg
587 is read, and is to be replaced at codegen time by a reference
588 to the relevant RealReg. */
589
590 /* 3 bytes, no memrefs, no iregdefs, copy exactly to the
591 output. Held in val1[15:0] and val2[7:0]. */
592 SSE3,
593
594 /* 3 bytes, reads/writes mem. Insns of the form
595 bbbbbbbb:bbbbbbbb:mod mmxreg r/m.
596 Held in val1[15:0] and val2[7:0], and mod and rm are to be
597 replaced at codegen time by a reference to the Temp/RealReg
598 holding the address. Arg3 holds this Temp/Real Reg.
599 Transfer is always at size 16. */
600 SSE2a_MemRd,
601 SSE2a_MemWr,
602
603 /* 4 bytes, no memrefs, no iregdefs, copy exactly to the
604 output. Held in val1[15:0] and val2[15:0]. */
605 SSE4,
606
607 /* 4 bytes, reads/writes mem. Insns of the form
608 bbbbbbbb:bbbbbbbb:bbbbbbbb:mod mmxreg r/m.
609 Held in val1[15:0] and val2[15:0], and mod and rm are to be
610 replaced at codegen time by a reference to the Temp/RealReg
611 holding the address. Arg3 holds this Temp/Real Reg.
612 Transfer is always at size 16. */
613 SSE3a_MemRd,
614 SSE3a_MemWr,
615
616 /* 4 bytes, reads/writes mem. Insns of the form
617 bbbbbbbb:bbbbbbbb:mod mmxreg r/m:bbbbbbbb
618 Held in val1[15:0] and val2[15:0], and mod and rm are to be
619 replaced at codegen time by a reference to the Temp/RealReg
620 holding the address. Arg3 holds this Temp/Real Reg.
621 Transfer is always at size 16. */
622 SSE2a1_MemRd,
623 SSE2a1_MemWr,
624
625 /* 4 bytes, writes an integer register. Insns of the form
626 bbbbbbbb:bbbbbbbb:bbbbbbbb:11 xmmreg ireg.
627 Held in val1[15:0] and val2[15:0], and ireg is to be replaced
628 at codegen time by a reference to the relevant RealReg.
629 Transfer is always at size 4. Arg3 holds this Temp/Real Reg.
630 */
631 SSE3g_RegWr,
632
633 /* 4 bytes, reads an integer register. Insns of the form
634 bbbbbbbb:bbbbbbbb:bbbbbbbb:11 ireg xmmreg.
635 Held in val1[15:0] and val2[15:0], and ireg is to be replaced
636 at codegen time by a reference to the relevant RealReg.
637 Transfer is always at size 4. Arg3 holds this Temp/Real Reg.
638 */
639 SSE3h_RegRd,
640
641 /* 5 bytes, no memrefs, no iregdefs, copy exactly to the
642 output. Held in val1[15:0], val2[15:0] and val3[7:0]. */
643 SSE5,
644
645 /* 5 bytes, reads/writes mem. Insns of the form
646 bbbbbbbb:bbbbbbbb:bbbbbbbb:mod mmxreg r/m:bbbbbbbb
647 Held in val1[15:0], val2[15:0], lit32[7:0].
648 mod and rm are to be replaced at codegen time by a reference
649 to the Temp/RealReg holding the address. Arg3 holds this
650 Temp/Real Reg. Transfer is always at size 16. */
651 SSE3a1_MemRd,
652 SSE3a1_MemWr,
653
sewardj3d7c9c82003-03-26 21:08:13 +0000654 /* ------------------------ */
655
njnd5bb0a52002-09-27 10:24:48 +0000656 /* Not strictly needed, but improve address calculation translations. */
njn25e49d8e72002-09-23 09:36:25 +0000657 LEA1, /* reg2 := const + reg1 */
658 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
659
sewardj8cec6ee2003-05-18 11:56:39 +0000660 /* Hack for x86 REP insns. Jump to literal if TempReg/RealReg
661 is zero. */
njnd5bb0a52002-09-27 10:24:48 +0000662 JIFZ,
njn25e49d8e72002-09-23 09:36:25 +0000663
njnd5bb0a52002-09-27 10:24:48 +0000664 /* Advance the simulated %eip by some small (< 128) number. */
665 INCEIP,
njn25e49d8e72002-09-23 09:36:25 +0000666
sewardje1042472002-09-30 12:33:11 +0000667 /* Dealing with segment registers */
668 GETSEG, PUTSEG, /* simulated segment register <--> TempReg */
669 USESEG, /* (LDT/GDT index, virtual addr) --> linear addr */
670
njnd5bb0a52002-09-27 10:24:48 +0000671 /* Not for translating x86 calls -- only to call helpers */
672 CALLM_S, CALLM_E, /* Mark start/end of CALLM push/pop sequence */
673 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers */
674 CALLM, /* Call assembly-code helper */
675
676 /* Not for translating x86 calls -- only to call C helper functions of
677 up to three arguments (or two if the functions has a return value).
678 Arguments and return value must be word-sized. More arguments can
679 be faked with global variables (eg. use VG_(set_global_var)()).
680
681 Seven possibilities: 'arg[123]' show where args go, 'ret' shows
682 where return value goes (if present).
njn25e49d8e72002-09-23 09:36:25 +0000683
684 CCALL(-, -, - ) void f(void)
685 CCALL(arg1, -, - ) void f(UInt arg1)
686 CCALL(arg1, arg2, - ) void f(UInt arg1, UInt arg2)
687 CCALL(arg1, arg2, arg3) void f(UInt arg1, UInt arg2, UInt arg3)
688 CCALL(-, -, ret ) UInt f(UInt)
689 CCALL(arg1, -, ret ) UInt f(UInt arg1)
njnd5bb0a52002-09-27 10:24:48 +0000690 CCALL(arg1, arg2, ret ) UInt f(UInt arg1, UInt arg2) */
njn25e49d8e72002-09-23 09:36:25 +0000691 CCALL,
692
njnd5bb0a52002-09-27 10:24:48 +0000693 /* This opcode makes it easy for skins that extend UCode to do this to
694 avoid opcode overlap:
njn25e49d8e72002-09-23 09:36:25 +0000695
njnd5bb0a52002-09-27 10:24:48 +0000696 enum { EU_OP1 = DUMMY_FINAL_UOPCODE + 1, ... }
njn25e49d8e72002-09-23 09:36:25 +0000697
698 WARNING: Do not add new opcodes after this one! They can be added
699 before, though. */
700 DUMMY_FINAL_UOPCODE
701 }
702 Opcode;
703
704
njnd5bb0a52002-09-27 10:24:48 +0000705/* Condition codes, using the Intel encoding. CondAlways is an extra. */
njn25e49d8e72002-09-23 09:36:25 +0000706typedef
707 enum {
708 CondO = 0, /* overflow */
709 CondNO = 1, /* no overflow */
710 CondB = 2, /* below */
711 CondNB = 3, /* not below */
712 CondZ = 4, /* zero */
713 CondNZ = 5, /* not zero */
714 CondBE = 6, /* below or equal */
715 CondNBE = 7, /* not below or equal */
716 CondS = 8, /* negative */
sewardje1042472002-09-30 12:33:11 +0000717 CondNS = 9, /* not negative */
njn25e49d8e72002-09-23 09:36:25 +0000718 CondP = 10, /* parity even */
719 CondNP = 11, /* not parity even */
720 CondL = 12, /* jump less */
721 CondNL = 13, /* not less */
722 CondLE = 14, /* less or equal */
723 CondNLE = 15, /* not less or equal */
724 CondAlways = 16 /* Jump always */
725 }
726 Condcode;
727
728
729/* Descriptions of additional properties of *unconditional* jumps. */
730typedef
731 enum {
732 JmpBoring=0, /* boring unconditional jump */
733 JmpCall=1, /* jump due to an x86 call insn */
734 JmpRet=2, /* jump due to an x86 ret insn */
735 JmpSyscall=3, /* do a system call, then jump */
736 JmpClientReq=4 /* do a client request, then jump */
737 }
738 JmpKind;
739
740
741/* Flags. User-level code can only read/write O(verflow), S(ign),
742 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
743 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
744 thusly:
745 76543210
746 DOSZACP
747 and bit 7 must always be zero since it is unused.
sewardj2370f3b2002-11-30 15:01:01 +0000748
749 Note: these Flag? values are **not** the positions in the actual
750 %eflags register. */
751
njn25e49d8e72002-09-23 09:36:25 +0000752typedef UChar FlagSet;
753
754#define FlagD (1<<6)
755#define FlagO (1<<5)
756#define FlagS (1<<4)
757#define FlagZ (1<<3)
758#define FlagA (1<<2)
759#define FlagC (1<<1)
760#define FlagP (1<<0)
761
762#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
763#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
764#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
765#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
766#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
767#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
768#define FlagsZCP ( FlagZ | FlagC | FlagP)
769#define FlagsOC (FlagO | FlagC )
770#define FlagsAC ( FlagA | FlagC )
771
772#define FlagsALL (FlagsOSZACP | FlagD)
773#define FlagsEmpty (FlagSet)0
774
775
sewardj2370f3b2002-11-30 15:01:01 +0000776/* flag positions in eflags */
777#define EFlagC (1 << 0) /* carry */
778#define EFlagP (1 << 2) /* parity */
sewardjfa492d42002-12-08 18:20:01 +0000779#define EFlagA (1 << 4) /* aux carry */
sewardj2370f3b2002-11-30 15:01:01 +0000780#define EFlagZ (1 << 6) /* zero */
781#define EFlagS (1 << 7) /* sign */
sewardjfa492d42002-12-08 18:20:01 +0000782#define EFlagD (1 << 10) /* direction */
sewardj2370f3b2002-11-30 15:01:01 +0000783#define EFlagO (1 << 11) /* overflow */
784
njn25e49d8e72002-09-23 09:36:25 +0000785/* Liveness of general purpose registers, useful for code generation.
786 Reg rank order 0..N-1 corresponds to bits 0..N-1, ie. first
787 reg's liveness in bit 0, last reg's in bit N-1. Note that
788 these rankings don't match the Intel register ordering. */
789typedef UInt RRegSet;
790
791#define ALL_RREGS_DEAD 0 /* 0000...00b */
njne7c258c2002-10-03 08:57:01 +0000792#define ALL_RREGS_LIVE ((1 << VG_MAX_REALREGS)-1) /* 0011...11b */
njn25e49d8e72002-09-23 09:36:25 +0000793#define UNIT_RREGSET(rank) (1 << (rank))
794
795#define IS_RREG_LIVE(rank,rregs_live) (rregs_live & UNIT_RREGSET(rank))
796#define SET_RREG_LIVENESS(rank,rregs_live,b) \
797 do { RRegSet unit = UNIT_RREGSET(rank); \
798 if (b) rregs_live |= unit; \
799 else rregs_live &= ~unit; \
800 } while(0)
801
802
803/* A Micro (u)-instruction. */
804typedef
805 struct {
806 /* word 1 */
807 UInt lit32; /* 32-bit literal */
808
809 /* word 2 */
810 UShort val1; /* first operand */
811 UShort val2; /* second operand */
812
813 /* word 3 */
814 UShort val3; /* third operand */
815 UChar opcode; /* opcode */
816 UChar size; /* data transfer size */
817
818 /* word 4 */
819 FlagSet flags_r; /* :: FlagSet */
820 FlagSet flags_w; /* :: FlagSet */
821 UChar tag1:4; /* first operand tag */
822 UChar tag2:4; /* second operand tag */
823 UChar tag3:4; /* third operand tag */
824 UChar extra4b:4; /* Spare field, used by WIDEN for src
825 -size, and by LEA2 for scale (1,2,4 or 8),
826 and by JMPs for original x86 instr size */
827
828 /* word 5 */
829 UChar cond; /* condition, for jumps */
830 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
831 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
832
833 /* Additional properties for UInstrs that call C functions:
834 - CCALL
835 - PUT (when %ESP is the target)
836 - possibly skin-specific UInstrs
837 */
838 UChar argc:2; /* Number of args, max 3 */
839 UChar regparms_n:2; /* Number of args passed in registers */
840 Bool has_ret_val:1; /* Function has return value? */
841
842 /* RealReg liveness; only sensical after reg alloc and liveness
843 analysis done. This info is a little bit arch-specific --
844 VG_MAX_REALREGS can vary on different architectures. Note that
845 to use this information requires converting between register ranks
njn4ba5a792002-09-30 10:23:54 +0000846 and the Intel register numbers, using VG_(realreg_to_rank)()
847 and/or VG_(rank_to_realreg)() */
njn25e49d8e72002-09-23 09:36:25 +0000848 RRegSet regs_live_after:VG_MAX_REALREGS;
849 }
850 UInstr;
851
852
njn25e49d8e72002-09-23 09:36:25 +0000853typedef
njn810086f2002-11-14 12:42:47 +0000854 struct _UCodeBlock
njn25e49d8e72002-09-23 09:36:25 +0000855 UCodeBlock;
856
njn810086f2002-11-14 12:42:47 +0000857extern Int VG_(get_num_instrs) (UCodeBlock* cb);
858extern Int VG_(get_num_temps) (UCodeBlock* cb);
njn25e49d8e72002-09-23 09:36:25 +0000859
njn810086f2002-11-14 12:42:47 +0000860extern UInstr* VG_(get_instr) (UCodeBlock* cb, Int i);
861extern UInstr* VG_(get_last_instr) (UCodeBlock* cb);
862
njn211b6ad2003-02-03 12:33:31 +0000863
njn25e49d8e72002-09-23 09:36:25 +0000864/*====================================================================*/
865/*=== Instrumenting UCode ===*/
866/*====================================================================*/
867
njnf4ce3d32003-02-10 10:17:26 +0000868/* Maximum number of registers read or written by a single UInstruction. */
869#define VG_MAX_REGS_USED 3
njn25e49d8e72002-09-23 09:36:25 +0000870
njnf4ce3d32003-02-10 10:17:26 +0000871/* Find what this instruction does to its regs, useful for
872 analysis/optimisation passes. `tag' indicates whether we're considering
873 TempRegs (pre-reg-alloc) or RealRegs (post-reg-alloc). `regs' is filled
874 with the affected register numbers, `isWrites' parallels it and indicates
875 if the reg is read or written. If a reg is read and written, it will
876 appear twice in `regs'. `regs' and `isWrites' must be able to fit
877 VG_MAX_REGS_USED elements. */
njn810086f2002-11-14 12:42:47 +0000878extern Int VG_(get_reg_usage) ( UInstr* u, Tag tag, Int* regs, Bool* isWrites );
njn25e49d8e72002-09-23 09:36:25 +0000879
880
njnd5bb0a52002-09-27 10:24:48 +0000881/* Used to register helper functions to be called from generated code. A
882 limited number of compact helpers can be registered; the code generated
883 to call them is slightly shorter -- so register the mostly frequently
884 called helpers as compact. */
njn25e49d8e72002-09-23 09:36:25 +0000885extern void VG_(register_compact_helper) ( Addr a );
886extern void VG_(register_noncompact_helper) ( Addr a );
887
888
889/* ------------------------------------------------------------------ */
890/* Virtual register allocation */
891
892/* Get a new virtual register */
njn4ba5a792002-09-30 10:23:54 +0000893extern Int VG_(get_new_temp) ( UCodeBlock* cb );
njn25e49d8e72002-09-23 09:36:25 +0000894
895/* Get a new virtual shadow register */
njn4ba5a792002-09-30 10:23:54 +0000896extern Int VG_(get_new_shadow) ( UCodeBlock* cb );
njn25e49d8e72002-09-23 09:36:25 +0000897
898/* Get a virtual register's corresponding virtual shadow register */
899#define SHADOW(tempreg) ((tempreg)+1)
900
901
902/* ------------------------------------------------------------------ */
903/* Low-level UInstr builders */
njn4ba5a792002-09-30 10:23:54 +0000904extern void VG_(new_NOP) ( UInstr* u );
905extern void VG_(new_UInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
906extern void VG_(new_UInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000907 Tag tag1, UInt val1 );
njn4ba5a792002-09-30 10:23:54 +0000908extern void VG_(new_UInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000909 Tag tag1, UInt val1,
910 Tag tag2, UInt val2 );
njn4ba5a792002-09-30 10:23:54 +0000911extern void VG_(new_UInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +0000912 Tag tag1, UInt val1,
913 Tag tag2, UInt val2,
914 Tag tag3, UInt val3 );
njn25e49d8e72002-09-23 09:36:25 +0000915
njn810086f2002-11-14 12:42:47 +0000916/* Set read/write/undefined flags. Undefined flags are treaten as written,
917 but it's worth keeping them logically distinct. */
918extern void VG_(set_flag_fields) ( UCodeBlock* cb, FlagSet fr, FlagSet fw,
919 FlagSet fu);
njn4ba5a792002-09-30 10:23:54 +0000920extern void VG_(set_lit_field) ( UCodeBlock* cb, UInt lit32 );
921extern void VG_(set_ccall_fields) ( UCodeBlock* cb, Addr fn, UChar argc,
922 UChar regparms_n, Bool has_ret_val );
njn810086f2002-11-14 12:42:47 +0000923extern void VG_(set_cond_field) ( UCodeBlock* cb, Condcode code );
njn25e49d8e72002-09-23 09:36:25 +0000924
njn4ba5a792002-09-30 10:23:54 +0000925extern void VG_(copy_UInstr) ( UCodeBlock* cb, UInstr* instr );
926
927extern Bool VG_(any_flag_use)( UInstr* u );
njn25e49d8e72002-09-23 09:36:25 +0000928
njnac6c1762002-10-04 14:34:15 +0000929/* Macro versions of the above; just shorter to type. */
930#define uInstr0 VG_(new_UInstr0)
931#define uInstr1 VG_(new_UInstr1)
932#define uInstr2 VG_(new_UInstr2)
933#define uInstr3 VG_(new_UInstr3)
934#define uLiteral VG_(set_lit_field)
935#define uCCall VG_(set_ccall_fields)
njn810086f2002-11-14 12:42:47 +0000936#define uCond VG_(set_cond_field)
937#define uFlagsRWU VG_(set_flag_fields)
njnac6c1762002-10-04 14:34:15 +0000938#define newTemp VG_(get_new_temp)
939#define newShadow VG_(get_new_shadow)
940
njn25e49d8e72002-09-23 09:36:25 +0000941/* Refer to `the last instruction stuffed in' (can be lvalue). */
942#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
943
944
945/* ------------------------------------------------------------------ */
946/* Higher-level UInstr sequence builders */
njn4ba5a792002-09-30 10:23:54 +0000947extern void VG_(call_helper_0_0) ( UCodeBlock* cb, Addr f);
948extern void VG_(call_helper_1_0) ( UCodeBlock* cb, Addr f, UInt arg1,
949 UInt regparms_n);
950extern void VG_(call_helper_2_0) ( UCodeBlock* cb, Addr f, UInt arg1, UInt arg2,
951 UInt regparms_n);
njn25e49d8e72002-09-23 09:36:25 +0000952
953/* One way around the 3-arg C function limit is to pass args via global
njn6fefa1b2003-02-24 10:32:51 +0000954 * variables... ugly, but it works. This one puts a literal in there. */
njn4ba5a792002-09-30 10:23:54 +0000955extern void VG_(set_global_var) ( UCodeBlock* cb, Addr globvar_ptr, UInt val);
njn25e49d8e72002-09-23 09:36:25 +0000956
njn6fefa1b2003-02-24 10:32:51 +0000957/* This one puts the contents of a TempReg in the global variable. */
958extern void VG_(set_global_var_tempreg) ( UCodeBlock* cb, Addr globvar_ptr,
959 UInt t_val);
960
njn25e49d8e72002-09-23 09:36:25 +0000961/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000962/* Allocating/freeing basic blocks of UCode */
njn810086f2002-11-14 12:42:47 +0000963extern UCodeBlock* VG_(setup_UCodeBlock) ( UCodeBlock* cb );
njn4ba5a792002-09-30 10:23:54 +0000964extern void VG_(free_UCodeBlock) ( UCodeBlock* cb );
njnd5bb0a52002-09-27 10:24:48 +0000965
966/* ------------------------------------------------------------------ */
967/* UCode pretty/ugly printing. Probably only useful to call from a skin
njn25e49d8e72002-09-23 09:36:25 +0000968 if VG_(needs).extended_UCode == True. */
969
970/* When True, all generated code is/should be printed. */
971extern Bool VG_(print_codegen);
972
njn4ba5a792002-09-30 10:23:54 +0000973/* Pretty/ugly printing functions */
974extern void VG_(pp_UCodeBlock) ( UCodeBlock* cb, Char* title );
975extern void VG_(pp_UInstr) ( Int instrNo, UInstr* u );
976extern void VG_(pp_UInstr_regs) ( Int instrNo, UInstr* u );
977extern void VG_(up_UInstr) ( Int instrNo, UInstr* u );
978extern Char* VG_(name_UOpcode) ( Bool upper, Opcode opc );
njn563f96f2003-02-03 11:17:46 +0000979extern Char* VG_(name_UCondcode) ( Condcode cond );
njn4ba5a792002-09-30 10:23:54 +0000980extern void VG_(pp_UOperand) ( UInstr* u, Int operandNo,
981 Int sz, Bool parens );
njn25e49d8e72002-09-23 09:36:25 +0000982
njnb93d1782003-02-03 12:03:22 +0000983/* ------------------------------------------------------------------ */
njnf4ce3d32003-02-10 10:17:26 +0000984/* Accessing archregs and their shadows */
985extern UInt VG_(get_archreg) ( UInt archreg );
986extern UInt VG_(get_thread_archreg) ( ThreadId tid, UInt archreg );
987
njnb93d1782003-02-03 12:03:22 +0000988extern UInt VG_(get_shadow_archreg) ( UInt archreg );
989extern void VG_(set_shadow_archreg) ( UInt archreg, UInt val );
990extern Addr VG_(shadow_archreg_address) ( UInt archreg );
njn25e49d8e72002-09-23 09:36:25 +0000991
njnf4ce3d32003-02-10 10:17:26 +0000992extern UInt VG_(get_thread_shadow_archreg) ( ThreadId tid, UInt archreg );
993extern void VG_(set_thread_shadow_archreg) ( ThreadId tid, UInt archreg,
994 UInt val );
njn211b6ad2003-02-03 12:33:31 +0000995
996/* ------------------------------------------------------------------ */
997/* Offsets of addresses of helper functions. A "helper" function is one
998 which is called from generated code via CALLM. */
999
1000extern Int VGOFF_(helper_idiv_64_32);
1001extern Int VGOFF_(helper_div_64_32);
1002extern Int VGOFF_(helper_idiv_32_16);
1003extern Int VGOFF_(helper_div_32_16);
1004extern Int VGOFF_(helper_idiv_16_8);
1005extern Int VGOFF_(helper_div_16_8);
1006
1007extern Int VGOFF_(helper_imul_32_64);
1008extern Int VGOFF_(helper_mul_32_64);
1009extern Int VGOFF_(helper_imul_16_32);
1010extern Int VGOFF_(helper_mul_16_32);
1011extern Int VGOFF_(helper_imul_8_16);
1012extern Int VGOFF_(helper_mul_8_16);
1013
1014extern Int VGOFF_(helper_CLD);
1015extern Int VGOFF_(helper_STD);
1016extern Int VGOFF_(helper_get_dirflag);
1017
1018extern Int VGOFF_(helper_CLC);
1019extern Int VGOFF_(helper_STC);
1020
1021extern Int VGOFF_(helper_shldl);
1022extern Int VGOFF_(helper_shldw);
1023extern Int VGOFF_(helper_shrdl);
1024extern Int VGOFF_(helper_shrdw);
1025
1026extern Int VGOFF_(helper_RDTSC);
1027extern Int VGOFF_(helper_CPUID);
1028
1029extern Int VGOFF_(helper_bsf);
1030extern Int VGOFF_(helper_bsr);
1031
1032extern Int VGOFF_(helper_fstsw_AX);
1033extern Int VGOFF_(helper_SAHF);
1034extern Int VGOFF_(helper_DAS);
1035extern Int VGOFF_(helper_DAA);
1036
1037
njn25e49d8e72002-09-23 09:36:25 +00001038/*====================================================================*/
njnd5bb0a52002-09-27 10:24:48 +00001039/*=== Generating x86 code from UCode ===*/
njn25e49d8e72002-09-23 09:36:25 +00001040/*====================================================================*/
1041
njnd5bb0a52002-09-27 10:24:48 +00001042/* All this only necessary for skins with VG_(needs).extends_UCode == True. */
njn25e49d8e72002-09-23 09:36:25 +00001043
sewardje1042472002-09-30 12:33:11 +00001044/* This is the Intel register encoding -- integer regs. */
njn25e49d8e72002-09-23 09:36:25 +00001045#define R_EAX 0
1046#define R_ECX 1
1047#define R_EDX 2
1048#define R_EBX 3
1049#define R_ESP 4
1050#define R_EBP 5
1051#define R_ESI 6
1052#define R_EDI 7
1053
1054#define R_AL (0+R_EAX)
1055#define R_CL (0+R_ECX)
1056#define R_DL (0+R_EDX)
1057#define R_BL (0+R_EBX)
1058#define R_AH (4+R_EAX)
1059#define R_CH (4+R_ECX)
1060#define R_DH (4+R_EDX)
1061#define R_BH (4+R_EBX)
1062
sewardje1042472002-09-30 12:33:11 +00001063/* This is the Intel register encoding -- segment regs. */
1064#define R_ES 0
1065#define R_CS 1
1066#define R_SS 2
1067#define R_DS 3
1068#define R_FS 4
1069#define R_GS 5
1070
njn25e49d8e72002-09-23 09:36:25 +00001071/* For pretty printing x86 code */
sewardj3d7c9c82003-03-26 21:08:13 +00001072extern Char* VG_(name_of_mmx_gran) ( UChar gran );
1073extern Char* VG_(name_of_mmx_reg) ( Int mmxreg );
sewardje1042472002-09-30 12:33:11 +00001074extern Char* VG_(name_of_seg_reg) ( Int sreg );
njn4ba5a792002-09-30 10:23:54 +00001075extern Char* VG_(name_of_int_reg) ( Int size, Int reg );
1076extern Char VG_(name_of_int_size) ( Int size );
njn25e49d8e72002-09-23 09:36:25 +00001077
njnac6c1762002-10-04 14:34:15 +00001078/* Shorter macros for convenience */
sewardj3d7c9c82003-03-26 21:08:13 +00001079#define nameIReg VG_(name_of_int_reg)
1080#define nameISize VG_(name_of_int_size)
1081#define nameSReg VG_(name_of_seg_reg)
1082#define nameMMXReg VG_(name_of_mmx_reg)
1083#define nameMMXGran VG_(name_of_mmx_gran)
njnac6c1762002-10-04 14:34:15 +00001084
njn25e49d8e72002-09-23 09:36:25 +00001085/* Randomly useful things */
1086extern UInt VG_(extend_s_8to32) ( UInt x );
1087
1088/* Code emitters */
njn4ba5a792002-09-30 10:23:54 +00001089extern void VG_(emitB) ( UInt b );
1090extern void VG_(emitW) ( UInt w );
1091extern void VG_(emitL) ( UInt l );
sewardjfa492d42002-12-08 18:20:01 +00001092extern void VG_(new_emit) ( Bool upd_cc, FlagSet uses_flags, FlagSet sets_flags );
njn25e49d8e72002-09-23 09:36:25 +00001093
1094/* Finding offsets */
njn4ba5a792002-09-30 10:23:54 +00001095extern Int VG_(helper_offset) ( Addr a );
1096extern Int VG_(shadow_reg_offset) ( Int arch );
1097extern Int VG_(shadow_flags_offset) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001098
njnd5bb0a52002-09-27 10:24:48 +00001099/* Convert reg ranks <-> Intel register ordering, for using register
1100 liveness information. */
njn4ba5a792002-09-30 10:23:54 +00001101extern Int VG_(realreg_to_rank) ( Int realreg );
1102extern Int VG_(rank_to_realreg) ( Int rank );
njn25e49d8e72002-09-23 09:36:25 +00001103
njnd5bb0a52002-09-27 10:24:48 +00001104/* Call a subroutine. Does no argument passing, stack manipulations, etc. */
sewardjfa492d42002-12-08 18:20:01 +00001105extern void VG_(synth_call) ( Bool ensure_shortform, Int word_offset,
1106 Bool upd_cc, FlagSet use_flags, FlagSet set_flags );
njn25e49d8e72002-09-23 09:36:25 +00001107
njnd5bb0a52002-09-27 10:24:48 +00001108/* For calling C functions -- saves caller save regs, pushes args, calls,
1109 clears the stack, restores caller save regs. `fn' must be registered in
1110 the baseBlock first. Acceptable tags are RealReg and Literal. Optimises
1111 things, eg. by not preserving non-live caller-save registers.
njn25e49d8e72002-09-23 09:36:25 +00001112
njnd5bb0a52002-09-27 10:24:48 +00001113 WARNING: a UInstr should *not* be translated with synth_ccall() followed
1114 by some other x86 assembly code; this will invalidate the results of
1115 vg_realreg_liveness_analysis() and everything will fall over. */
njn4ba5a792002-09-30 10:23:54 +00001116extern void VG_(synth_ccall) ( Addr fn, Int argc, Int regparms_n, UInt argv[],
1117 Tag tagv[], Int ret_reg,
1118 RRegSet regs_live_before,
1119 RRegSet regs_live_after );
njn25e49d8e72002-09-23 09:36:25 +00001120
1121/* Addressing modes */
njn4ba5a792002-09-30 10:23:54 +00001122extern void VG_(emit_amode_offregmem_reg)( Int off, Int regmem, Int reg );
1123extern void VG_(emit_amode_ereg_greg) ( Int e_reg, Int g_reg );
njn25e49d8e72002-09-23 09:36:25 +00001124
1125/* v-size (4, or 2 with OSO) insn emitters */
njn4ba5a792002-09-30 10:23:54 +00001126extern void VG_(emit_movv_offregmem_reg) ( Int sz, Int off, Int areg, Int reg );
1127extern void VG_(emit_movv_reg_offregmem) ( Int sz, Int reg, Int off, Int areg );
1128extern void VG_(emit_movv_reg_reg) ( Int sz, Int reg1, Int reg2 );
sewardjfa492d42002-12-08 18:20:01 +00001129extern void VG_(emit_nonshiftopv_lit_reg)( Bool upd_cc, Int sz, Opcode opc, UInt lit,
njn4ba5a792002-09-30 10:23:54 +00001130 Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001131extern void VG_(emit_shiftopv_lit_reg) ( Bool upd_cc, Int sz, Opcode opc, UInt lit,
njn4ba5a792002-09-30 10:23:54 +00001132 Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001133extern void VG_(emit_nonshiftopv_reg_reg)( Bool upd_cc, Int sz, Opcode opc,
njn4ba5a792002-09-30 10:23:54 +00001134 Int reg1, Int reg2 );
1135extern void VG_(emit_movv_lit_reg) ( Int sz, UInt lit, Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001136extern void VG_(emit_unaryopv_reg) ( Bool upd_cc, Int sz, Opcode opc, Int reg );
njn4ba5a792002-09-30 10:23:54 +00001137extern void VG_(emit_pushv_reg) ( Int sz, Int reg );
1138extern void VG_(emit_popv_reg) ( Int sz, Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001139
njn4ba5a792002-09-30 10:23:54 +00001140extern void VG_(emit_pushl_lit32) ( UInt int32 );
1141extern void VG_(emit_pushl_lit8) ( Int lit8 );
sewardjfa492d42002-12-08 18:20:01 +00001142extern void VG_(emit_cmpl_zero_reg) ( Bool upd_cc, Int reg );
njn4ba5a792002-09-30 10:23:54 +00001143extern void VG_(emit_swapl_reg_EAX) ( Int reg );
1144extern void VG_(emit_movv_lit_offregmem) ( Int sz, UInt lit, Int off,
1145 Int memreg );
njn25e49d8e72002-09-23 09:36:25 +00001146
1147/* b-size (1 byte) instruction emitters */
njn4ba5a792002-09-30 10:23:54 +00001148extern void VG_(emit_movb_lit_offregmem) ( UInt lit, Int off, Int memreg );
1149extern void VG_(emit_movb_reg_offregmem) ( Int reg, Int off, Int areg );
sewardjfa492d42002-12-08 18:20:01 +00001150extern void VG_(emit_unaryopb_reg) ( Bool upd_cc, Opcode opc, Int reg );
1151extern void VG_(emit_testb_lit_reg) ( Bool upd_cc, UInt lit, Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001152
1153/* zero-extended load emitters */
njn4ba5a792002-09-30 10:23:54 +00001154extern void VG_(emit_movzbl_offregmem_reg) ( Int off, Int regmem, Int reg );
1155extern void VG_(emit_movzwl_offregmem_reg) ( Int off, Int areg, Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001156
1157/* misc instruction emitters */
njn4ba5a792002-09-30 10:23:54 +00001158extern void VG_(emit_call_reg) ( Int reg );
1159extern void VG_(emit_add_lit_to_esp) ( Int lit );
njn4ba5a792002-09-30 10:23:54 +00001160extern void VG_(emit_pushal) ( void );
1161extern void VG_(emit_popal) ( void );
1162extern void VG_(emit_AMD_prefetch_reg) ( Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001163
sewardja2113f92002-12-12 23:42:48 +00001164/* jump emitters */
1165extern void VG_(init_target) ( Int *tgt );
1166
1167extern void VG_(target_back) ( Int *tgt );
1168extern void VG_(target_forward) ( Int *tgt );
1169extern void VG_(emit_target_delta) ( Int *tgt );
1170
1171extern void VG_(emit_jcondshort_delta) ( Bool simd_cc, Condcode cond, Int delta );
1172extern void VG_(emit_jcondshort_target)( Bool simd_cc, Condcode cond, Int *tgt );
1173
njn25e49d8e72002-09-23 09:36:25 +00001174
1175/*====================================================================*/
1176/*=== Execution contexts ===*/
1177/*====================================================================*/
1178
1179/* Generic resolution type used in a few different ways, such as deciding
1180 how closely to compare two errors for equality. */
1181typedef
1182 enum { Vg_LowRes, Vg_MedRes, Vg_HighRes }
1183 VgRes;
1184
1185typedef
1186 struct _ExeContext
1187 ExeContext;
1188
njnd5bb0a52002-09-27 10:24:48 +00001189/* Compare two ExeContexts. Number of callers considered depends on `res':
1190 Vg_LowRes: 2
1191 Vg_MedRes: 4
1192 Vg_HighRes: all */
njn25e49d8e72002-09-23 09:36:25 +00001193extern Bool VG_(eq_ExeContext) ( VgRes res,
1194 ExeContext* e1, ExeContext* e2 );
1195
1196/* Print an ExeContext. */
1197extern void VG_(pp_ExeContext) ( ExeContext* );
1198
1199/* Take a snapshot of the client's stack. Search our collection of
1200 ExeContexts to see if we already have it, and if not, allocate a
1201 new one. Either way, return a pointer to the context. */
1202extern ExeContext* VG_(get_ExeContext) ( ThreadState *tst );
1203
sewardj499e3de2002-11-13 22:22:25 +00001204/* Just grab the client's EIP, as a much smaller and cheaper
1205 indication of where they are. */
1206extern Addr VG_(get_EIP)( ThreadState *tst );
njn25e49d8e72002-09-23 09:36:25 +00001207
njn211b6ad2003-02-03 12:33:31 +00001208
njn25e49d8e72002-09-23 09:36:25 +00001209/*====================================================================*/
1210/*=== Error reporting ===*/
1211/*====================================================================*/
1212
1213/* ------------------------------------------------------------------ */
1214/* Suppressions describe errors which we want to suppress, ie, not
1215 show the user, usually because it is caused by a problem in a library
1216 which we can't fix, replace or work around. Suppressions are read from
njnd5bb0a52002-09-27 10:24:48 +00001217 a file at startup time. This gives flexibility so that new
njn25e49d8e72002-09-23 09:36:25 +00001218 suppressions can be added to the file as and when needed.
1219*/
1220
1221typedef
1222 Int /* Do not make this unsigned! */
1223 SuppKind;
1224
njn810086f2002-11-14 12:42:47 +00001225/* The skin-relevant parts of a suppression are:
1226 kind: what kind of suppression; must be in the range (0..)
1227 string: use is optional. NULL by default.
1228 extra: use is optional. NULL by default. void* so it's extensible.
njn25e49d8e72002-09-23 09:36:25 +00001229*/
1230typedef
njn810086f2002-11-14 12:42:47 +00001231 struct _Supp
1232 Supp;
1233
1234/* Useful in SK_(error_matches_suppression)() */
1235SuppKind VG_(get_supp_kind) ( Supp* su );
1236Char* VG_(get_supp_string) ( Supp* su );
1237void* VG_(get_supp_extra) ( Supp* su );
1238
1239/* Must be used in VG_(recognised_suppression)() */
1240void VG_(set_supp_kind) ( Supp* su, SuppKind suppkind );
1241/* May be used in VG_(read_extra_suppression_info)() */
1242void VG_(set_supp_string) ( Supp* su, Char* string );
1243void VG_(set_supp_extra) ( Supp* su, void* extra );
njn25e49d8e72002-09-23 09:36:25 +00001244
1245
1246/* ------------------------------------------------------------------ */
1247/* Error records contain enough info to generate an error report. The idea
1248 is that (typically) the same few points in the program generate thousands
njnd5bb0a52002-09-27 10:24:48 +00001249 of errors, and we don't want to spew out a fresh error message for each
1250 one. Instead, we use these structures to common up duplicates.
njn25e49d8e72002-09-23 09:36:25 +00001251*/
1252
1253typedef
1254 Int /* Do not make this unsigned! */
1255 ErrorKind;
1256
njn810086f2002-11-14 12:42:47 +00001257/* The skin-relevant parts of an Error are:
1258 kind: what kind of error; must be in the range (0..)
1259 addr: use is optional. 0 by default.
1260 string: use is optional. NULL by default.
1261 extra: use is optional. NULL by default. void* so it's extensible.
njn25e49d8e72002-09-23 09:36:25 +00001262*/
1263typedef
njn810086f2002-11-14 12:42:47 +00001264 struct _Error
1265 Error;
njn25e49d8e72002-09-23 09:36:25 +00001266
njn810086f2002-11-14 12:42:47 +00001267/* Useful in SK_(error_matches_suppression)(), SK_(pp_SkinError)(), etc */
njnb877d492003-01-28 20:40:57 +00001268ExeContext* VG_(get_error_where) ( Error* err );
1269SuppKind VG_(get_error_kind) ( Error* err );
1270Addr VG_(get_error_address) ( Error* err );
1271Char* VG_(get_error_string) ( Error* err );
1272void* VG_(get_error_extra) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001273
njnd5bb0a52002-09-27 10:24:48 +00001274/* Call this when an error occurs. It will be recorded if it hasn't been
njn25e49d8e72002-09-23 09:36:25 +00001275 seen before. If it has, the existing error record will have its count
1276 incremented.
1277
1278 If the error occurs in generated code, 'tst' should be NULL. If the
1279 error occurs in non-generated code, 'tst' should be non-NULL. The
njn43c799e2003-04-08 00:08:52 +00001280 `extra' field can be stack-allocated; it will be copied by the core
1281 if needed. But it won't be copied if it's NULL.
njnd5bb0a52002-09-27 10:24:48 +00001282
1283 If no 'a', 's' or 'extra' of interest needs to be recorded, just use
njn3e884182003-04-15 13:03:23 +00001284 NULL for them. */
njn25e49d8e72002-09-23 09:36:25 +00001285extern void VG_(maybe_record_error) ( ThreadState* tst, ErrorKind ekind,
1286 Addr a, Char* s, void* extra );
1287
njn43c799e2003-04-08 00:08:52 +00001288/* Similar to VG_(maybe_record_error)(), except this one doesn't record the
1289 error -- useful for errors that can only happen once. The errors can be
1290 suppressed, though. Return value is True if it was suppressed.
1291 `print_error' dictates whether to print the error, which is a bit of a
1292 hack that's useful sometimes if you just want to know if the error would
njn47363ab2003-04-21 13:24:40 +00001293 be suppressed without possibly printing it. `count_error' dictates
1294 whether to add the error in the error total count (another mild hack). */
njn43c799e2003-04-08 00:08:52 +00001295extern Bool VG_(unique_error) ( ThreadState* tst, ErrorKind ekind,
1296 Addr a, Char* s, void* extra,
njn3e884182003-04-15 13:03:23 +00001297 ExeContext* where, Bool print_error,
njn47363ab2003-04-21 13:24:40 +00001298 Bool allow_GDB_attach, Bool count_error );
njn43c799e2003-04-08 00:08:52 +00001299
njn25e49d8e72002-09-23 09:36:25 +00001300/* Gets a non-blank, non-comment line of at most nBuf chars from fd.
1301 Skips leading spaces on the line. Returns True if EOF was hit instead.
njn3e884182003-04-15 13:03:23 +00001302 Useful for reading in extra skin-specific suppression lines. */
njn4ba5a792002-09-30 10:23:54 +00001303extern Bool VG_(get_line) ( Int fd, Char* buf, Int nBuf );
njn25e49d8e72002-09-23 09:36:25 +00001304
1305
1306/*====================================================================*/
1307/*=== Obtaining debug information ===*/
1308/*====================================================================*/
1309
sewardj6e008cb2002-12-15 13:11:39 +00001310/* Get the file/function/line number of the instruction at address
1311 'a'. For these four, if debug info for the address is found, it
1312 copies the info into the buffer/UInt and returns True. If not, it
1313 returns False and nothing is copied. VG_(get_fnname) always
1314 demangles C++ function names. VG_(get_fnname_w_offset) is the
njn3e884182003-04-15 13:03:23 +00001315 same, except it appends "+N" to symbol names to indicate offsets. */
njn25e49d8e72002-09-23 09:36:25 +00001316extern Bool VG_(get_filename) ( Addr a, Char* filename, Int n_filename );
1317extern Bool VG_(get_fnname) ( Addr a, Char* fnname, Int n_fnname );
1318extern Bool VG_(get_linenum) ( Addr a, UInt* linenum );
sewardj6e008cb2002-12-15 13:11:39 +00001319extern Bool VG_(get_fnname_w_offset)
1320 ( Addr a, Char* fnname, Int n_fnname );
njn25e49d8e72002-09-23 09:36:25 +00001321
1322/* This one is more efficient if getting both filename and line number,
1323 because the two lookups are done together. */
1324extern Bool VG_(get_filename_linenum)
1325 ( Addr a, Char* filename, Int n_filename,
1326 UInt* linenum );
1327
1328/* Succeeds only if we find from debug info that 'a' is the address of the
1329 first instruction in a function -- as opposed to VG_(get_fnname) which
1330 succeeds if we find from debug info that 'a' is the address of any
1331 instruction in a function. Use this to instrument the start of
njnd5bb0a52002-09-27 10:24:48 +00001332 a particular function. Nb: if an executable/shared object is stripped
njn25e49d8e72002-09-23 09:36:25 +00001333 of its symbols, this function will not be able to recognise function
1334 entry points within it. */
njn497ec3f2003-05-19 08:38:23 +00001335extern Bool VG_(get_fnname_if_entry) ( Addr a, Char* fnname, Int n_fnname );
njn25e49d8e72002-09-23 09:36:25 +00001336
1337/* Succeeds if the address is within a shared object or the main executable.
1338 It doesn't matter if debug info is present or not. */
1339extern Bool VG_(get_objname) ( Addr a, Char* objname, Int n_objname );
1340
sewardj47104382002-10-20 18:35:48 +00001341/* A way to get information about what segments are mapped */
1342typedef struct _SegInfo SegInfo;
1343
njnb877d492003-01-28 20:40:57 +00001344/* Returns NULL if the SegInfo isn't found. It doesn't matter if debug info
1345 is present or not. */
1346extern SegInfo* VG_(get_obj) ( Addr a );
1347
1348extern const SegInfo* VG_(next_seginfo) ( const SegInfo *seg );
1349extern Addr VG_(seg_start) ( const SegInfo *seg );
1350extern UInt VG_(seg_size) ( const SegInfo *seg );
1351extern const UChar* VG_(seg_filename) ( const SegInfo *seg );
1352extern UInt VG_(seg_sym_offset)( const SegInfo *seg );
sewardj47104382002-10-20 18:35:48 +00001353
1354typedef
1355 enum {
1356 Vg_SectUnknown,
1357 Vg_SectText,
sewardj8fe15a32002-10-20 19:29:21 +00001358 Vg_SectData,
1359 Vg_SectBSS,
sewardj47104382002-10-20 18:35:48 +00001360 Vg_SectGOT,
sewardj8fe15a32002-10-20 19:29:21 +00001361 Vg_SectPLT,
sewardj47104382002-10-20 18:35:48 +00001362 }
1363 VgSectKind;
1364
1365extern VgSectKind VG_(seg_sect_kind)(Addr);
1366
njn25e49d8e72002-09-23 09:36:25 +00001367
1368/*====================================================================*/
njn4c791212003-05-02 17:53:54 +00001369/*=== Calling functions from the sim'd CPU ===*/
1370/*====================================================================*/
1371
1372#define VG_USERREQ__CLIENT_tstCALL0 0x2101
1373#define VG_USERREQ__CLIENT_tstCALL1 0x2102
1374#define VG_USERREQ__CLIENT_tstCALL2 0x2103
1375#define VG_USERREQ__CLIENT_tstCALL3 0x2104
1376
1377/* These requests are like VALGRIND_NON_SIMD_CALL[0123] in valgrind.h,
1378 except they insert the current ThreadState as the first argument to the
1379 called function. */
1380#define VALGRIND_NON_SIMD_tstCALL0(_qyy_fn) \
1381 ({unsigned int _qyy_res; \
1382 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
1383 VG_USERREQ__CLIENT_tstCALL0, \
1384 _qyy_fn, \
1385 0, 0, 0); \
1386 _qyy_res; \
1387 })
1388
1389#define VALGRIND_NON_SIMD_tstCALL1(_qyy_fn, _qyy_arg1) \
1390 ({unsigned int _qyy_res; \
1391 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
1392 VG_USERREQ__CLIENT_tstCALL1, \
1393 _qyy_fn, \
1394 _qyy_arg1, 0, 0); \
1395 _qyy_res; \
1396 })
1397
1398#define VALGRIND_NON_SIMD_tstCALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
1399 ({unsigned int _qyy_res; \
1400 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
1401 VG_USERREQ__CLIENT_tstCALL2, \
1402 _qyy_fn, \
1403 _qyy_arg1, _qyy_arg2, 0); \
1404 _qyy_res; \
1405 })
1406
1407#define VALGRIND_NON_SIMD_tstCALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
1408 ({unsigned int _qyy_res; \
1409 VALGRIND_MAGIC_SEQUENCE(_qyy_res, 0 /* default return */, \
1410 VG_USERREQ__CLIENT_tstCALL3, \
1411 _qyy_fn, \
1412 _qyy_arg1, _qyy_arg2, _qyy_arg3); \
1413 _qyy_res; \
1414 })
1415
1416
1417/*====================================================================*/
njn3e884182003-04-15 13:03:23 +00001418/*=== Generic hash table ===*/
njn25e49d8e72002-09-23 09:36:25 +00001419/*====================================================================*/
1420
njn3e884182003-04-15 13:03:23 +00001421/* Generic type for a separately-chained hash table. Via a kind of dodgy
1422 C-as-C++ style inheritance, skins can extend the VgHashNode type, so long
1423 as the first two fields match the sizes of these two fields. Requires
1424 a bit of casting by the skin. */
njn25e49d8e72002-09-23 09:36:25 +00001425typedef
njn3e884182003-04-15 13:03:23 +00001426 struct _VgHashNode {
1427 struct _VgHashNode * next;
1428 UInt key;
1429 }
1430 VgHashNode;
njn25e49d8e72002-09-23 09:36:25 +00001431
njn3e884182003-04-15 13:03:23 +00001432typedef
1433 VgHashNode**
1434 VgHashTable;
njn810086f2002-11-14 12:42:47 +00001435
njn3e884182003-04-15 13:03:23 +00001436/* Make a new table. */
1437extern VgHashTable VG_(HT_construct) ( void );
1438
1439/* Add a node to the table. */
1440extern void VG_(HT_add_node) ( VgHashTable t, VgHashNode* node );
1441
1442/* Looks up a node in the hash table. Also returns the address of the
1443 previous node's `next' pointer which allows it to be removed from the
1444 list later without having to look it up again. */
1445extern VgHashNode* VG_(HT_get_node) ( VgHashTable t, UInt key,
1446 /*OUT*/VgHashNode*** next_ptr );
1447
1448/* Allocates a sorted array of pointers to all the shadow chunks of malloc'd
1449 blocks. */
1450extern VgHashNode** VG_(HT_to_sorted_array) ( VgHashTable t,
1451 /*OUT*/ UInt* n_shadows );
1452
1453/* Returns first node that matches predicate `p', or NULL if none do.
1454 Extra arguments can be implicitly passed to `p' using nested functions;
1455 see memcheck/mc_errcontext.c for an example. */
1456extern VgHashNode* VG_(HT_first_match) ( VgHashTable t,
1457 Bool (*p)(VgHashNode*) );
1458
1459/* Applies a function f() once to each node. Again, nested functions
1460 can be very useful. */
1461extern void VG_(HT_apply_to_all_nodes)( VgHashTable t, void (*f)(VgHashNode*) );
1462
1463/* Destroy a table. */
1464extern void VG_(HT_destruct) ( VgHashTable t );
njn810086f2002-11-14 12:42:47 +00001465
1466
njn3e884182003-04-15 13:03:23 +00001467/*====================================================================*/
1468/*=== General stuff for replacing functions ===*/
1469/*====================================================================*/
njn25e49d8e72002-09-23 09:36:25 +00001470
njn3e884182003-04-15 13:03:23 +00001471/* Some skins need to replace the standard definitions of some functions. */
njn25e49d8e72002-09-23 09:36:25 +00001472
njn3e884182003-04-15 13:03:23 +00001473/* ------------------------------------------------------------------ */
1474/* General stuff, for replacing any functions */
njn25e49d8e72002-09-23 09:36:25 +00001475
njn3e884182003-04-15 13:03:23 +00001476/* Is the client running on the simulated CPU or the real one?
njn25e49d8e72002-09-23 09:36:25 +00001477
njn3e884182003-04-15 13:03:23 +00001478 Nb: If it is, and you want to call a function to be run on the real CPU,
njn057c65f2003-04-21 13:30:55 +00001479 use one of the VALGRIND_NON_SIMD_CALL[123] macros in valgrind.h to call it.
njn25e49d8e72002-09-23 09:36:25 +00001480
njn3e884182003-04-15 13:03:23 +00001481 Nb: don't forget the function parentheses when using this in a
1482 condition... write this:
1483
1484 if (VG_(is_running_on_simd_CPU)()) { ... } // calls function
1485
1486 not this:
1487
1488 if (VG_(is_running_on_simd_CPU)) { ... } // address of var!
1489*/
1490extern Bool VG_(is_running_on_simd_CPU) ( void );
1491
1492
1493/*====================================================================*/
1494/*=== Specific stuff for replacing malloc() and friends ===*/
1495/*====================================================================*/
1496
1497/* ------------------------------------------------------------------ */
1498/* Replacing malloc() and friends */
1499
1500/* If a skin replaces malloc() et al, the easiest way to do so is to link
1501 with coregrind/vg_replace_malloc.c, and follow the following instructions.
1502 You can do it from scratch, though, if you enjoy that sort of thing. */
1503
1504/* Arena size for valgrind's own malloc(); default value is 0, but can
1505 be overridden by skin -- but must be done so *statically*, eg:
1506
1507 Int VG_(vg_malloc_redzone_szB) = 4;
1508
1509 It can't be done from a function like SK_(pre_clo_init)(). So it can't,
1510 for example, be controlled with a command line option, unfortunately. */
1511extern UInt VG_(vg_malloc_redzone_szB);
1512
1513/* If a skin links with vg_replace_malloc.c, the following functions will be
1514 called appropriately when malloc() et al are called. */
1515extern void* SK_(malloc) ( ThreadState* tst, Int n );
1516extern void* SK_(__builtin_new) ( ThreadState* tst, Int n );
1517extern void* SK_(__builtin_vec_new) ( ThreadState* tst, Int n );
1518extern void* SK_(memalign) ( ThreadState* tst, Int align, Int n );
1519extern void* SK_(calloc) ( ThreadState* tst, Int nmemb, Int n );
1520extern void SK_(free) ( ThreadState* tst, void* p );
1521extern void SK_(__builtin_delete) ( ThreadState* tst, void* p );
1522extern void SK_(__builtin_vec_delete) ( ThreadState* tst, void* p );
1523extern void* SK_(realloc) ( ThreadState* tst, void* p, Int size );
1524
1525/* Can be called from SK_(malloc) et al to do the actual alloc/freeing. */
1526extern void* VG_(cli_malloc) ( UInt align, Int nbytes );
1527extern void VG_(cli_free) ( void* p );
1528
1529/* Check if an address is within a range, allowing for redzones at edges */
1530extern Bool VG_(addr_is_in_block)( Addr a, Addr start, UInt size );
1531
1532/* ------------------------------------------------------------------ */
1533/* Some options that can be used by a skin if malloc() et al are replaced.
1534 The skin should use the VG_(process...)() and VG_(print...)() functions
1535 to give control over these aspects of Valgrind's version of malloc(). */
1536
1537/* Round malloc sizes upwards to integral number of words? default: NO */
1538extern Bool VG_(clo_sloppy_malloc);
1539/* DEBUG: print malloc details? default: NO */
1540extern Bool VG_(clo_trace_malloc);
1541/* Minimum alignment in functions that don't specify alignment explicitly.
1542 default: 0, i.e. use default of the machine (== 4) */
1543extern Int VG_(clo_alignment);
1544
1545extern Bool VG_(replacement_malloc_process_cmd_line_option) ( Char* arg );
1546extern void VG_(replacement_malloc_print_usage) ( void );
1547extern void VG_(replacement_malloc_print_debug_usage) ( void );
sewardja4495682002-10-21 07:29:59 +00001548
1549
njn25e49d8e72002-09-23 09:36:25 +00001550/*====================================================================*/
1551/*=== Skin-specific stuff ===*/
1552/*====================================================================*/
1553
njnd04b7c62002-10-03 14:05:52 +00001554/* ------------------------------------------------------------------ */
1555/* Details */
njnd04b7c62002-10-03 14:05:52 +00001556
njn120281f2003-02-03 12:20:07 +00001557/* Default value for avg_translations_sizeB (in bytes), indicating typical
1558 code expansion of about 6:1. */
1559#define VG_DEFAULT_TRANS_SIZEB 100
1560
njn810086f2002-11-14 12:42:47 +00001561/* Information used in the startup message. `name' also determines the
1562 string used for identifying suppressions in a suppression file as
1563 belonging to this skin. `version' can be NULL, in which case (not
1564 surprisingly) no version info is printed; this mechanism is designed for
1565 skins distributed with Valgrind that share a version number with
1566 Valgrind. Other skins not distributed as part of Valgrind should
sewardjc0d8f682002-11-30 00:49:43 +00001567 probably have their own version number. */
1568extern void VG_(details_name) ( Char* name );
1569extern void VG_(details_version) ( Char* version );
1570extern void VG_(details_description) ( Char* description );
1571extern void VG_(details_copyright_author) ( Char* copyright_author );
1572
1573/* Average size of a translation, in bytes, so that the translation
njn120281f2003-02-03 12:20:07 +00001574 storage machinery can allocate memory appropriately. Not critical,
1575 setting is optional. */
1576extern void VG_(details_avg_translation_sizeB) ( UInt size );
njnd04b7c62002-10-03 14:05:52 +00001577
njn810086f2002-11-14 12:42:47 +00001578/* String printed if an `sk_assert' assertion fails or VG_(skin_panic)
1579 is called. Should probably be an email address. */
1580extern void VG_(details_bug_reports_to) ( Char* bug_reports_to );
njnd04b7c62002-10-03 14:05:52 +00001581
1582/* ------------------------------------------------------------------ */
1583/* Needs */
1584
njn810086f2002-11-14 12:42:47 +00001585/* Booleans that decide core behaviour, but don't require extra
1586 operations to be defined if `True' */
njnd5bb0a52002-09-27 10:24:48 +00001587
njn810086f2002-11-14 12:42:47 +00001588/* Should __libc_freeres() be run? Bugs in it can crash the skin. */
1589extern void VG_(needs_libc_freeres) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001590
njn810086f2002-11-14 12:42:47 +00001591/* Want to have errors detected by Valgrind's core reported? Includes:
1592 - pthread API errors (many; eg. unlocking a non-locked mutex)
njn810086f2002-11-14 12:42:47 +00001593 - invalid file descriptors to blocking syscalls read() and write()
1594 - bad signal numbers passed to sigaction()
1595 - attempt to install signal handler for SIGKILL or SIGSTOP */
1596extern void VG_(needs_core_errors) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001597
njn810086f2002-11-14 12:42:47 +00001598/* Booleans that indicate extra operations are defined; if these are True,
1599 the corresponding template functions (given below) must be defined. A
1600 lot like being a member of a type class. */
njn25e49d8e72002-09-23 09:36:25 +00001601
njn810086f2002-11-14 12:42:47 +00001602/* Want to report errors from skin? This implies use of suppressions, too. */
1603extern void VG_(needs_skin_errors) ( void );
njnd5bb0a52002-09-27 10:24:48 +00001604
njn810086f2002-11-14 12:42:47 +00001605/* Is information kept about specific individual basic blocks? (Eg. for
1606 cachegrind there are cost-centres for every instruction, stored at a
1607 basic block level.) If so, it sometimes has to be discarded, because
1608 .so mmap/munmap-ping or self-modifying code (informed by the
1609 DISCARD_TRANSLATIONS user request) can cause one instruction address
1610 to be used for more than one instruction in one program run... */
1611extern void VG_(needs_basic_block_discards) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001612
njn810086f2002-11-14 12:42:47 +00001613/* Skin maintains information about each register? */
1614extern void VG_(needs_shadow_regs) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001615
njn810086f2002-11-14 12:42:47 +00001616/* Skin defines its own command line options? */
1617extern void VG_(needs_command_line_options) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001618
njn810086f2002-11-14 12:42:47 +00001619/* Skin defines its own client requests? */
1620extern void VG_(needs_client_requests) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001621
njn810086f2002-11-14 12:42:47 +00001622/* Skin defines its own UInstrs? */
1623extern void VG_(needs_extended_UCode) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001624
njn810086f2002-11-14 12:42:47 +00001625/* Skin does stuff before and/or after system calls? */
1626extern void VG_(needs_syscall_wrapper) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001627
njn810086f2002-11-14 12:42:47 +00001628/* Are skin-state sanity checks performed? */
1629extern void VG_(needs_sanity_checks) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001630
njn810086f2002-11-14 12:42:47 +00001631/* Do we need to see data symbols? */
1632extern void VG_(needs_data_syms) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001633
1634/* ------------------------------------------------------------------ */
1635/* Core events to track */
1636
1637/* Part of the core from which this call was made. Useful for determining
njnd5bb0a52002-09-27 10:24:48 +00001638 what kind of error message should be emitted. */
njn25e49d8e72002-09-23 09:36:25 +00001639typedef
1640 enum { Vg_CorePThread, Vg_CoreSignal, Vg_CoreSysCall, Vg_CoreTranslate }
1641 CorePart;
1642
njn810086f2002-11-14 12:42:47 +00001643#define EV extern void
njn25e49d8e72002-09-23 09:36:25 +00001644
njn810086f2002-11-14 12:42:47 +00001645/* Events happening in core to track. To be notified, pass a callback
1646 function to the appropriate function. To ignore an event, don't do
1647 anything (default is for events to be ignored). */
1648
njn810086f2002-11-14 12:42:47 +00001649
njn3e884182003-04-15 13:03:23 +00001650/* Memory events (Nb: to track heap allocation/freeing, a skin must replace
1651 malloc() et al. See above how to do this.) */
1652
1653/* These ones occur at startup, upon some signals, and upon some syscalls */
njn810086f2002-11-14 12:42:47 +00001654EV VG_(track_new_mem_startup) ( void (*f)(Addr a, UInt len,
1655 Bool rr, Bool ww, Bool xx) );
njn810086f2002-11-14 12:42:47 +00001656EV VG_(track_new_mem_stack_signal) ( void (*f)(Addr a, UInt len) );
1657EV VG_(track_new_mem_brk) ( void (*f)(Addr a, UInt len) );
1658EV VG_(track_new_mem_mmap) ( void (*f)(Addr a, UInt len,
1659 Bool rr, Bool ww, Bool xx) );
1660
njn3e884182003-04-15 13:03:23 +00001661EV VG_(track_copy_mem_remap) ( void (*f)(Addr from, Addr to, UInt len) );
1662EV VG_(track_change_mem_mprotect) ( void (*f)(Addr a, UInt len,
1663 Bool rr, Bool ww, Bool xx) );
1664EV VG_(track_die_mem_stack_signal) ( void (*f)(Addr a, UInt len) );
1665EV VG_(track_die_mem_brk) ( void (*f)(Addr a, UInt len) );
1666EV VG_(track_die_mem_munmap) ( void (*f)(Addr a, UInt len) );
1667
1668
1669/* These ones are called when %esp changes. A skin could track these itself
1670 (except for ban_mem_stack) but it's much easier to use the core's help.
1671
1672 The specialised ones are called in preference to the general one, if they
njn9b007f62003-04-07 14:40:25 +00001673 are defined. These functions are called a lot if they are used, so
1674 specialising can optimise things significantly. If any of the
1675 specialised cases are defined, the general case must be defined too.
1676
1677 Nb: they must all use the __attribute__((regparm(n))) attribute. */
1678EV VG_(track_new_mem_stack_4) ( void (*f)(Addr new_ESP) );
1679EV VG_(track_new_mem_stack_8) ( void (*f)(Addr new_ESP) );
1680EV VG_(track_new_mem_stack_12) ( void (*f)(Addr new_ESP) );
1681EV VG_(track_new_mem_stack_16) ( void (*f)(Addr new_ESP) );
1682EV VG_(track_new_mem_stack_32) ( void (*f)(Addr new_ESP) );
1683EV VG_(track_new_mem_stack) ( void (*f)(Addr a, UInt len) );
1684
njn9b007f62003-04-07 14:40:25 +00001685EV VG_(track_die_mem_stack_4) ( void (*f)(Addr die_ESP) );
1686EV VG_(track_die_mem_stack_8) ( void (*f)(Addr die_ESP) );
1687EV VG_(track_die_mem_stack_12) ( void (*f)(Addr die_ESP) );
1688EV VG_(track_die_mem_stack_16) ( void (*f)(Addr die_ESP) );
1689EV VG_(track_die_mem_stack_32) ( void (*f)(Addr die_ESP) );
1690EV VG_(track_die_mem_stack) ( void (*f)(Addr a, UInt len) );
1691
njn3e884182003-04-15 13:03:23 +00001692/* Used for redzone at end of thread stacks */
1693EV VG_(track_ban_mem_stack) ( void (*f)(Addr a, UInt len) );
njn25e49d8e72002-09-23 09:36:25 +00001694
njn3e884182003-04-15 13:03:23 +00001695/* These ones occur around syscalls, signal handling, etc */
njn810086f2002-11-14 12:42:47 +00001696EV VG_(track_pre_mem_read) ( void (*f)(CorePart part, ThreadState* tst,
1697 Char* s, Addr a, UInt size) );
1698EV VG_(track_pre_mem_read_asciiz) ( void (*f)(CorePart part, ThreadState* tst,
1699 Char* s, Addr a) );
1700EV VG_(track_pre_mem_write) ( void (*f)(CorePart part, ThreadState* tst,
1701 Char* s, Addr a, UInt size) );
1702/* Not implemented yet -- have to add in lots of places, which is a
1703 pain. Won't bother unless/until there's a need. */
1704/* EV VG_(track_post_mem_read) ( void (*f)(ThreadState* tst, Char* s,
1705 Addr a, UInt size) ); */
1706EV VG_(track_post_mem_write) ( void (*f)(Addr a, UInt size) );
njn25e49d8e72002-09-23 09:36:25 +00001707
1708
njn810086f2002-11-14 12:42:47 +00001709/* Scheduler events (not exhaustive) */
njn25e49d8e72002-09-23 09:36:25 +00001710
njn810086f2002-11-14 12:42:47 +00001711EV VG_(track_thread_run) ( void (*f)(ThreadId tid) );
njn25e49d8e72002-09-23 09:36:25 +00001712
njn810086f2002-11-14 12:42:47 +00001713/* Thread events (not exhaustive) */
sewardjdca84112002-11-13 22:29:34 +00001714
njn810086f2002-11-14 12:42:47 +00001715/* Called during thread create, before the new thread has run any
1716 instructions (or touched any memory). */
1717EV VG_(track_post_thread_create)( void (*f)(ThreadId tid, ThreadId child) );
1718/* Called once the joinee thread is terminated and the joining thread is
1719 about to resume. */
1720EV VG_(track_post_thread_join) ( void (*f)(ThreadId joiner, ThreadId joinee) );
njn25e49d8e72002-09-23 09:36:25 +00001721
njnd5bb0a52002-09-27 10:24:48 +00001722
njn810086f2002-11-14 12:42:47 +00001723/* Mutex events (not exhaustive) */
njn25e49d8e72002-09-23 09:36:25 +00001724
njn810086f2002-11-14 12:42:47 +00001725/* Called before a thread can block while waiting for a mutex (called
1726 regardless of whether the thread will block or not). */
1727EV VG_(track_pre_mutex_lock) ( void (*f)(ThreadId tid,
1728 void* /*pthread_mutex_t* */ mutex) );
1729/* Called once the thread actually holds the mutex (always paired with
1730 pre_mutex_lock). */
1731EV VG_(track_post_mutex_lock) ( void (*f)(ThreadId tid,
1732 void* /*pthread_mutex_t* */ mutex) );
1733/* Called after a thread has released a mutex (no need for a corresponding
1734 pre_mutex_unlock, because unlocking can't block). */
1735EV VG_(track_post_mutex_unlock) ( void (*f)(ThreadId tid,
1736 void* /*pthread_mutex_t* */ mutex) );
njn25e49d8e72002-09-23 09:36:25 +00001737
njn1045b0a2003-02-24 10:42:47 +00001738
1739/* Signal events (not exhaustive) */
1740
1741/* Called before a signal is delivered; `alt_stack' indicates if it is
1742 delivered on an alternative stack. */
1743EV VG_(track_pre_deliver_signal) ( void (*f)(ThreadId tid, Int sigNum,
1744 Bool alt_stack) );
1745/* Called after a signal is delivered. */
1746EV VG_(track_post_deliver_signal) ( void (*f)(ThreadId tid, Int sigNum ) );
1747
1748
1749/* Others... condition variables... */
njn810086f2002-11-14 12:42:47 +00001750/* ... */
1751
1752#undef EV
njn25e49d8e72002-09-23 09:36:25 +00001753
1754/* ------------------------------------------------------------------ */
1755/* Template functions */
1756
1757/* These are the parameterised functions in the core. The default definitions
njnd5bb0a52002-09-27 10:24:48 +00001758 are overridden by LD_PRELOADed skin version. At the very least, a skin
1759 must define the fundamental template functions. Depending on what needs
1760 are set, extra template functions will be used too. Functions are
1761 grouped under the needs that govern their use. */
njn25e49d8e72002-09-23 09:36:25 +00001762
1763
1764/* ------------------------------------------------------------------ */
1765/* Fundamental template functions */
1766
1767/* Initialise skin. Must do the following:
njn810086f2002-11-14 12:42:47 +00001768 - initialise the `details' struct, via the VG_(details_*)() functions
njn25e49d8e72002-09-23 09:36:25 +00001769 - register any helpers called by generated code
1770
1771 May do the following:
njn810086f2002-11-14 12:42:47 +00001772 - initialise the `needs' struct to indicate certain requirements, via
1773 the VG_(needs_*)() functions
1774 - initialise the `track' struct to indicate core events of interest, via
1775 the VG_(track_*)() functions
njn25e49d8e72002-09-23 09:36:25 +00001776 - register any skin-specific profiling events
1777 - any other skin-specific initialisation
1778*/
njn810086f2002-11-14 12:42:47 +00001779extern void SK_(pre_clo_init) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001780
njnd5bb0a52002-09-27 10:24:48 +00001781/* Do initialisation that can only be done after command line processing. */
njn25e49d8e72002-09-23 09:36:25 +00001782extern void SK_(post_clo_init)( void );
1783
1784/* Instrument a basic block. Must be a true function, ie. the same input
1785 always results in the same output, because basic blocks can be
1786 retranslated. Unless you're doing something really strange...
1787 'orig_addr' is the address of the first instruction in the block. */
1788extern UCodeBlock* SK_(instrument) ( UCodeBlock* cb, Addr orig_addr );
1789
njn7d9f94d2003-04-22 21:41:40 +00001790/* Finish up, print out any results, etc. `exitcode' is program's exit
1791 code. The shadow (if the `shadow_regs' need is set) can be found with
1792 VG_(get_shadow_archreg)(R_EBX), since %ebx holds the argument to the
1793 exit() syscall. */
1794extern void SK_(fini) ( Int exitcode );
njn25e49d8e72002-09-23 09:36:25 +00001795
1796
1797/* ------------------------------------------------------------------ */
1798/* VG_(needs).report_errors */
1799
1800/* Identify if two errors are equal, or equal enough. `res' indicates how
1801 close is "close enough". `res' should be passed on as necessary, eg. if
njn810086f2002-11-14 12:42:47 +00001802 the Error's `extra' part contains an ExeContext, `res' should be
njn25e49d8e72002-09-23 09:36:25 +00001803 passed to VG_(eq_ExeContext)() if the ExeContexts are considered. Other
1804 than that, probably don't worry about it unless you have lots of very
1805 similar errors occurring.
1806 */
njn810086f2002-11-14 12:42:47 +00001807extern Bool SK_(eq_SkinError) ( VgRes res, Error* e1, Error* e2 );
njn25e49d8e72002-09-23 09:36:25 +00001808
njn43c799e2003-04-08 00:08:52 +00001809/* Print error context. */
1810extern void SK_(pp_SkinError) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001811
njn43c799e2003-04-08 00:08:52 +00001812/* Should fill in any details that could be postponed until after the
njn810086f2002-11-14 12:42:47 +00001813 decision whether to ignore the error (ie. details not affecting the
1814 result of SK_(eq_SkinError)()). This saves time when errors are ignored.
njn25e49d8e72002-09-23 09:36:25 +00001815 Yuk.
njn43c799e2003-04-08 00:08:52 +00001816
1817 Return value: must be the size of the `extra' part in bytes -- used by
1818 the core to make a copy.
njn25e49d8e72002-09-23 09:36:25 +00001819*/
njn43c799e2003-04-08 00:08:52 +00001820extern UInt SK_(update_extra) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001821
njn810086f2002-11-14 12:42:47 +00001822/* Return value indicates recognition. If recognised, must set skind using
1823 VG_(set_supp_kind)(). */
1824extern Bool SK_(recognised_suppression) ( Char* name, Supp* su );
njn25e49d8e72002-09-23 09:36:25 +00001825
njn810086f2002-11-14 12:42:47 +00001826/* Read any extra info for this suppression kind. Most likely for filling
1827 in the `extra' and `string' parts (with VG_(set_supp_{extra,string})())
1828 of a suppression if necessary. Should return False if a syntax error
1829 occurred, True otherwise. */
1830extern Bool SK_(read_extra_suppression_info) ( Int fd, Char* buf, Int nBuf,
1831 Supp* su );
njn25e49d8e72002-09-23 09:36:25 +00001832
1833/* This should just check the kinds match and maybe some stuff in the
njn810086f2002-11-14 12:42:47 +00001834 `string' and `extra' field if appropriate (using VG_(get_supp_*)() to
1835 get the relevant suppression parts). */
njn43c799e2003-04-08 00:08:52 +00001836extern Bool SK_(error_matches_suppression) ( Error* err, Supp* su );
1837
1838/* This should return the suppression name, for --gen-suppressions, or NULL
1839 if that error type cannot be suppressed. This is the inverse of
1840 SK_(recognised_suppression)(). */
1841extern Char* SK_(get_error_name) ( Error* err );
1842
1843/* This should print any extra info for the error, for --gen-suppressions,
1844 including the newline. This is the inverse of
1845 SK_(read_extra_suppression_info)(). */
1846extern void SK_(print_extra_suppression_info) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001847
1848
1849/* ------------------------------------------------------------------ */
1850/* VG_(needs).basic_block_discards */
1851
njnd5bb0a52002-09-27 10:24:48 +00001852/* Should discard any information that pertains to specific basic blocks
1853 or instructions within the address range given. */
njn25e49d8e72002-09-23 09:36:25 +00001854extern void SK_(discard_basic_block_info) ( Addr a, UInt size );
1855
1856
1857/* ------------------------------------------------------------------ */
1858/* VG_(needs).shadow_regs */
1859
1860/* Valid values for general registers and EFLAGS register, for initialising
1861 and updating registers when written in certain places in core. */
1862extern void SK_(written_shadow_regs_values) ( UInt* gen_reg, UInt* eflags );
1863
1864
1865/* ------------------------------------------------------------------ */
1866/* VG_(needs).command_line_options */
1867
njnd5bb0a52002-09-27 10:24:48 +00001868/* Return True if option was recognised. Presumably sets some state to
1869 record the option as well. */
1870extern Bool SK_(process_cmd_line_option) ( Char* argv );
njn25e49d8e72002-09-23 09:36:25 +00001871
njn3e884182003-04-15 13:03:23 +00001872/* Print out command line usage for options for normal skin operation. */
1873extern void SK_(print_usage) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001874
njn3e884182003-04-15 13:03:23 +00001875/* Print out command line usage for options for debugging the skin. */
1876extern void SK_(print_debug_usage) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001877
1878/* ------------------------------------------------------------------ */
1879/* VG_(needs).client_requests */
1880
sewardj34042512002-10-22 04:14:35 +00001881extern Bool SK_(handle_client_request) ( ThreadState* tst, UInt* arg_block, UInt *ret );
njn25e49d8e72002-09-23 09:36:25 +00001882
1883
1884/* ------------------------------------------------------------------ */
1885/* VG_(needs).extends_UCode */
1886
njn4ba5a792002-09-30 10:23:54 +00001887/* Useful to use in VG_(get_Xreg_usage)() */
njn810086f2002-11-14 12:42:47 +00001888#define VG_UINSTR_READS_REG(ono,regs,isWrites) \
njn25e49d8e72002-09-23 09:36:25 +00001889 { if (mycat(u->tag,ono) == tag) \
njn810086f2002-11-14 12:42:47 +00001890 { regs[n] = mycat(u->val,ono); \
1891 isWrites[n] = False; \
njn25e49d8e72002-09-23 09:36:25 +00001892 n++; \
1893 } \
1894 }
njn810086f2002-11-14 12:42:47 +00001895#define VG_UINSTR_WRITES_REG(ono,regs,isWrites) \
njnd5bb0a52002-09-27 10:24:48 +00001896 { if (mycat(u->tag,ono) == tag) \
njn810086f2002-11-14 12:42:47 +00001897 { regs[n] = mycat(u->val,ono); \
1898 isWrites[n] = True; \
njnd5bb0a52002-09-27 10:24:48 +00001899 n++; \
1900 } \
njn25e49d8e72002-09-23 09:36:25 +00001901 }
1902
njn4ba5a792002-09-30 10:23:54 +00001903/* 'X' prefix indicates eXtended UCode. */
njn810086f2002-11-14 12:42:47 +00001904extern Int SK_(get_Xreg_usage) ( UInstr* u, Tag tag, Int* regs,
1905 Bool* isWrites );
njn4ba5a792002-09-30 10:23:54 +00001906extern void SK_(emit_XUInstr) ( UInstr* u, RRegSet regs_live_before );
1907extern Bool SK_(sane_XUInstr) ( Bool beforeRA, Bool beforeLiveness,
njn25e49d8e72002-09-23 09:36:25 +00001908 UInstr* u );
njn4ba5a792002-09-30 10:23:54 +00001909extern Char* SK_(name_XUOpcode) ( Opcode opc );
1910extern void SK_(pp_XUInstr) ( UInstr* u );
njn25e49d8e72002-09-23 09:36:25 +00001911
1912
1913/* ------------------------------------------------------------------ */
1914/* VG_(needs).syscall_wrapper */
1915
1916/* If either of the pre_ functions malloc() something to return, the
1917 * corresponding post_ function had better free() it!
1918 */
1919extern void* SK_( pre_syscall) ( ThreadId tid, UInt syscallno,
1920 Bool is_blocking );
1921extern void SK_(post_syscall) ( ThreadId tid, UInt syscallno,
1922 void* pre_result, Int res,
1923 Bool is_blocking );
1924
njnd5bb0a52002-09-27 10:24:48 +00001925
njn25e49d8e72002-09-23 09:36:25 +00001926/* ---------------------------------------------------------------------
1927 VG_(needs).sanity_checks */
1928
njnd5bb0a52002-09-27 10:24:48 +00001929/* Can be useful for ensuring a skin's correctness. SK_(cheap_sanity_check)
1930 is called very frequently; SK_(expensive_sanity_check) is called less
1931 frequently and can be more involved. */
njn25e49d8e72002-09-23 09:36:25 +00001932extern Bool SK_(cheap_sanity_check) ( void );
1933extern Bool SK_(expensive_sanity_check) ( void );
1934
1935
1936#endif /* NDEF __VG_SKIN_H */
1937
1938/*--------------------------------------------------------------------*/
1939/*--- end vg_skin.h ---*/
1940/*--------------------------------------------------------------------*/
1941