blob: 4ef7a638d42937fe033ae0196a1f6d51f8ce1d8b [file] [log] [blame]
nethercotebb1c9912004-01-04 16:43:23 +00001
njn25e49d8e72002-09-23 09:36:25 +00002/*--------------------------------------------------------------------*/
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
nethercotebb1c9912004-01-04 16:43:23 +000011 Copyright (C) 2000-2004 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
nethercote421281e2003-11-20 16:20:55 +000041/* ---------------------------------------------------------------------
42 Where to send bug reports to.
43 ------------------------------------------------------------------ */
44
45#define VG_BUGS_TO "valgrind.kde.org"
46
47
njn25e49d8e72002-09-23 09:36:25 +000048/*====================================================================*/
49/*=== Build options and table sizes. ===*/
50/*====================================================================*/
51
daywalker5d945de2003-09-26 00:32:53 +000052/* You should be able to change these options or sizes, recompile, and
njn25e49d8e72002-09-23 09:36:25 +000053 still have a working system. */
54
55/* The maximum number of pthreads that we support. This is
56 deliberately not very high since our implementation of some of the
57 scheduler algorithms is surely O(N) in the number of threads, since
58 that's simple, at least. And (in practice) we hope that most
59 programs do not need many threads. */
sewardj989dad92003-07-06 01:52:32 +000060#define VG_N_THREADS 100
njn25e49d8e72002-09-23 09:36:25 +000061
62/* Maximum number of pthread keys available. Again, we start low until
63 the need for a higher number presents itself. */
64#define VG_N_THREAD_KEYS 50
65
66/* Total number of integer registers available for allocation -- all of
67 them except %esp, %ebp. %ebp permanently points at VG_(baseBlock).
daywalker5d945de2003-09-26 00:32:53 +000068
njn211b6ad2003-02-03 12:33:31 +000069 If you increase this you'll have to also change at least these:
njn4ba5a792002-09-30 10:23:54 +000070 - VG_(rank_to_realreg)()
71 - VG_(realreg_to_rank)()
njn25e49d8e72002-09-23 09:36:25 +000072 - ppRegsLiveness()
73 - the RegsLive type (maybe -- RegsLive type must have more than
74 VG_MAX_REALREGS bits)
njn211b6ad2003-02-03 12:33:31 +000075
76 You can decrease it, and performance will drop because more spills will
77 occur. If you decrease it too much, everything will fall over.
daywalker5d945de2003-09-26 00:32:53 +000078
njn25e49d8e72002-09-23 09:36:25 +000079 Do not change this unless you really know what you are doing! */
80#define VG_MAX_REALREGS 6
81
82
83/*====================================================================*/
njn1a1dd8b2002-09-27 10:42:20 +000084/*=== Basic types, useful macros ===*/
njn25e49d8e72002-09-23 09:36:25 +000085/*====================================================================*/
86
njn25e49d8e72002-09-23 09:36:25 +000087typedef unsigned char UChar;
88typedef unsigned short UShort;
89typedef unsigned int UInt;
90typedef unsigned long long int ULong;
91
92typedef signed char Char;
93typedef signed short Short;
94typedef signed int Int;
95typedef signed long long int Long;
96
97typedef unsigned int Addr;
98
99typedef unsigned char Bool;
100#define False ((Bool)0)
101#define True ((Bool)1)
102
103
njn1a1dd8b2002-09-27 10:42:20 +0000104#define mycat_wrk(aaa,bbb) aaa##bbb
105#define mycat(aaa,bbb) mycat_wrk(aaa,bbb)
106
107/* No, really. I _am_ that strange. */
108#define OINK(nnn) VG_(message)(Vg_DebugMsg, "OINK %d",nnn)
109
njn25e49d8e72002-09-23 09:36:25 +0000110/* ---------------------------------------------------------------------
111 Now the basic types are set up, we can haul in the kernel-interface
112 definitions.
113 ------------------------------------------------------------------ */
114
njn78adbf42003-07-24 19:35:00 +0000115#include "vg_kerneliface.h"
njn25e49d8e72002-09-23 09:36:25 +0000116
117
118/*====================================================================*/
njn27f1a382002-11-08 15:48:16 +0000119/*=== Core/skin interface version ===*/
120/*====================================================================*/
121
122/* The major version number indicates binary-incompatible changes to the
123 interface; if the core and skin major versions don't match, Valgrind
124 will abort. The minor version indicates binary-compatible changes.
njn27f1a382002-11-08 15:48:16 +0000125*/
jseward157689b2003-11-05 23:59:21 +0000126#define VG_CORE_INTERFACE_MAJOR_VERSION 5
njn9b007f62003-04-07 14:40:25 +0000127#define VG_CORE_INTERFACE_MINOR_VERSION 0
njn27f1a382002-11-08 15:48:16 +0000128
fitzhardinge98abfc72003-12-16 02:05:15 +0000129typedef struct _ToolInfo {
130 Int sizeof_ToolInfo;
131 Int interface_major_version;
132 Int interface_minor_version;
133
134 /* Initialise skin. Must do the following:
135 - initialise the `details' struct, via the VG_(details_*)() functions
136 - register any helpers called by generated code
137
138 May do the following:
139 - initialise the `needs' struct to indicate certain requirements, via
140 the VG_(needs_*)() functions
141 - initialize all the tool's entrypoints via the VG_(init_*)() functions
142 - register any skin-specific profiling events
143 - any other skin-specific initialisation
144 */
145 void (*sk_pre_clo_init) ( void );
146
147 /* Specifies how big the shadow segment should be as a ratio to the
148 client address space. 0 for no shadow segment. */
149 float shadow_ratio;
150} ToolInfo;
njn27f1a382002-11-08 15:48:16 +0000151
njn563f96f2003-02-03 11:17:46 +0000152/* Every skin must include this macro somewhere, exactly once. */
fitzhardinge98abfc72003-12-16 02:05:15 +0000153#define VG_DETERMINE_INTERFACE_VERSION(pre_clo_init, shadow) \
154 const ToolInfo SK_(tool_info) = { \
155 .sizeof_ToolInfo = sizeof(ToolInfo), \
156 .interface_major_version = VG_CORE_INTERFACE_MAJOR_VERSION, \
157 .interface_minor_version = VG_CORE_INTERFACE_MINOR_VERSION, \
158 .sk_pre_clo_init = pre_clo_init, \
159 .shadow_ratio = shadow, \
160 };
njn211b6ad2003-02-03 12:33:31 +0000161
njn27f1a382002-11-08 15:48:16 +0000162/*====================================================================*/
njn25e49d8e72002-09-23 09:36:25 +0000163/*=== Command-line options ===*/
164/*====================================================================*/
165
njn43c799e2003-04-08 00:08:52 +0000166/* Use this for normal null-termination-style string comparison */
167#define VG_STREQ(s1,s2) (s1 != NULL && s2 != NULL \
168 && VG_(strcmp)((s1),(s2))==0)
169
170/* Use these for recognising skin command line options -- stops comparing
171 once whitespace is reached. */
172# define VG_CLO_STREQ(s1,s2) (0==VG_(strcmp_ws)((s1),(s2)))
173# define VG_CLO_STREQN(nn,s1,s2) (0==VG_(strncmp_ws)((s1),(s2),(nn)))
174
njn25e49d8e72002-09-23 09:36:25 +0000175/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
176extern Int VG_(clo_verbosity);
177
178/* Profile? */
179extern Bool VG_(clo_profile);
180
njn25e49d8e72002-09-23 09:36:25 +0000181/* Call this if a recognised option was bad for some reason.
182 Note: don't use it just because an option was unrecognised -- return 'False'
183 from SKN_(process_cmd_line_option) to indicate that. */
184extern void VG_(bad_option) ( Char* opt );
185
186/* Client args */
187extern Int VG_(client_argc);
188extern Char** VG_(client_argv);
189
njnd5bb0a52002-09-27 10:24:48 +0000190/* Client environment. Can be inspected with VG_(getenv)() */
njn25e49d8e72002-09-23 09:36:25 +0000191extern Char** VG_(client_envp);
192
193
194/*====================================================================*/
195/*=== Printing messages for the user ===*/
196/*====================================================================*/
197
198/* Print a message prefixed by "??<pid>?? "; '?' depends on the VgMsgKind.
199 Should be used for all user output. */
200
201typedef
202 enum { Vg_UserMsg, /* '?' == '=' */
203 Vg_DebugMsg, /* '?' == '-' */
fitzhardinge39de4b42003-10-31 07:12:21 +0000204 Vg_DebugExtraMsg, /* '?' == '+' */
205 Vg_ClientMsg, /* '?' == '*' */
njn25e49d8e72002-09-23 09:36:25 +0000206 }
207 VgMsgKind;
208
209/* Functions for building a message from multiple parts. */
fitzhardinge39de4b42003-10-31 07:12:21 +0000210extern int VG_(start_msg) ( VgMsgKind kind );
211extern int VG_(add_to_msg) ( Char* format, ... );
njn25e49d8e72002-09-23 09:36:25 +0000212/* Ends and prints the message. Appends a newline. */
fitzhardinge39de4b42003-10-31 07:12:21 +0000213extern int VG_(end_msg) ( void );
njn25e49d8e72002-09-23 09:36:25 +0000214
njnd5bb0a52002-09-27 10:24:48 +0000215/* Send a single-part message. Appends a newline. */
fitzhardinge39de4b42003-10-31 07:12:21 +0000216extern int VG_(message) ( VgMsgKind kind, Char* format, ... );
217extern int VG_(vmessage) ( VgMsgKind kind, Char* format, va_list vargs );
njn25e49d8e72002-09-23 09:36:25 +0000218
219
220/*====================================================================*/
221/*=== Profiling ===*/
222/*====================================================================*/
223
224/* Nb: VGP_(register_profile_event)() relies on VgpUnc being the first one */
225#define VGP_CORE_LIST \
226 /* These ones depend on the core */ \
227 VGP_PAIR(VgpUnc, "unclassified"), \
228 VGP_PAIR(VgpRun, "running"), \
229 VGP_PAIR(VgpSched, "scheduler"), \
230 VGP_PAIR(VgpMalloc, "low-lev malloc/free"), \
231 VGP_PAIR(VgpCliMalloc, "client malloc/free"), \
njn25e49d8e72002-09-23 09:36:25 +0000232 VGP_PAIR(VgpTranslate, "translate-main"), \
233 VGP_PAIR(VgpToUCode, "to-ucode"), \
234 VGP_PAIR(VgpFromUcode, "from-ucode"), \
235 VGP_PAIR(VgpImprove, "improve"), \
njn9b007f62003-04-07 14:40:25 +0000236 VGP_PAIR(VgpESPUpdate, "ESP-update"), \
njn25e49d8e72002-09-23 09:36:25 +0000237 VGP_PAIR(VgpRegAlloc, "reg-alloc"), \
238 VGP_PAIR(VgpLiveness, "liveness-analysis"), \
239 VGP_PAIR(VgpDoLRU, "do-lru"), \
240 VGP_PAIR(VgpSlowFindT, "slow-search-transtab"), \
241 VGP_PAIR(VgpInitMem, "init-memory"), \
242 VGP_PAIR(VgpExeContext, "exe-context"), \
243 VGP_PAIR(VgpReadSyms, "read-syms"), \
244 VGP_PAIR(VgpSearchSyms, "search-syms"), \
245 VGP_PAIR(VgpAddToT, "add-to-transtab"), \
246 VGP_PAIR(VgpCoreSysWrap, "core-syscall-wrapper"), \
247 VGP_PAIR(VgpDemangle, "demangle"), \
njn37cea302002-09-30 11:24:00 +0000248 VGP_PAIR(VgpCoreCheapSanity, "core-cheap-sanity"), \
249 VGP_PAIR(VgpCoreExpensiveSanity, "core-expensive-sanity"), \
njn25e49d8e72002-09-23 09:36:25 +0000250 /* These ones depend on the skin */ \
251 VGP_PAIR(VgpPreCloInit, "pre-clo-init"), \
252 VGP_PAIR(VgpPostCloInit, "post-clo-init"), \
253 VGP_PAIR(VgpInstrument, "instrument"), \
254 VGP_PAIR(VgpSkinSysWrap, "skin-syscall-wrapper"), \
njn37cea302002-09-30 11:24:00 +0000255 VGP_PAIR(VgpSkinCheapSanity, "skin-cheap-sanity"), \
256 VGP_PAIR(VgpSkinExpensiveSanity, "skin-expensive-sanity"), \
njn25e49d8e72002-09-23 09:36:25 +0000257 VGP_PAIR(VgpFini, "fini")
258
259#define VGP_PAIR(n,name) n
260typedef enum { VGP_CORE_LIST } VgpCoreCC;
261#undef VGP_PAIR
262
263/* When registering skin profiling events, ensure that the 'n' value is in
264 * the range (VgpFini+1..) */
265extern void VGP_(register_profile_event) ( Int n, Char* name );
266
267extern void VGP_(pushcc) ( UInt cc );
268extern void VGP_(popcc) ( UInt cc );
269
270/* Define them only if they haven't already been defined by vg_profile.c */
271#ifndef VGP_PUSHCC
272# define VGP_PUSHCC(x)
273#endif
274#ifndef VGP_POPCC
275# define VGP_POPCC(x)
276#endif
277
278
279/*====================================================================*/
280/*=== Useful stuff to call from generated code ===*/
281/*====================================================================*/
282
283/* ------------------------------------------------------------------ */
284/* General stuff */
285
njn41557122002-10-14 09:25:37 +0000286/* 64-bit counter for the number of basic blocks done. */
287extern ULong VG_(bbs_done);
288
njn25e49d8e72002-09-23 09:36:25 +0000289/* Get the simulated %esp */
290extern Addr VG_(get_stack_pointer) ( void );
291
sewardjecf8e102003-07-12 12:11:39 +0000292/* Detect if an address is within Valgrind's stack, Valgrind's
293 m_state_static, or the VG_(threads) array. This is useful for
294 memory leak detectors to rule out spurious pointers to a block. */
njn25e49d8e72002-09-23 09:36:25 +0000295extern Bool VG_(within_stack)(Addr a);
sewardjecf8e102003-07-12 12:11:39 +0000296extern Bool VG_(within_m_state_static_OR_threads)(Addr a);
njn25e49d8e72002-09-23 09:36:25 +0000297
298/* Check if an address is 4-byte aligned */
299#define IS_ALIGNED4_ADDR(aaa_p) (0 == (((UInt)(aaa_p)) & 3))
njn9b007f62003-04-07 14:40:25 +0000300#define IS_ALIGNED8_ADDR(aaa_p) (0 == (((UInt)(aaa_p)) & 7))
njn25e49d8e72002-09-23 09:36:25 +0000301
302
303/* ------------------------------------------------------------------ */
304/* Thread-related stuff */
305
306/* Special magic value for an invalid ThreadId. It corresponds to
307 LinuxThreads using zero as the initial value for
308 pthread_mutex_t.__m_owner and pthread_cond_t.__c_waiting. */
309#define VG_INVALID_THREADID ((ThreadId)(0))
310
njn72718642003-07-24 08:45:32 +0000311/* ThreadIds are simply indices into the VG_(threads)[] array. */
daywalker5d945de2003-09-26 00:32:53 +0000312typedef
313 UInt
njn25e49d8e72002-09-23 09:36:25 +0000314 ThreadId;
315
njn72718642003-07-24 08:45:32 +0000316/* When looking for the current ThreadId, this is the safe option and
317 probably the one you want.
daywalker5d945de2003-09-26 00:32:53 +0000318
njn72718642003-07-24 08:45:32 +0000319 Details: Use this one from non-generated code, eg. from functions called
320 on events like 'new_mem_heap'. In such a case, the "current" thread is
321 temporarily suspended as Valgrind's dispatcher is running. This function
322 is also suitable to be called from generated code (ie. from UCode, or a C
323 function called directly from UCode).
daywalker5d945de2003-09-26 00:32:53 +0000324
njn72718642003-07-24 08:45:32 +0000325 If you use VG_(get_current_tid)() from non-generated code, it will return
326 0 signifying the invalid thread, which is probably not what you want. */
327extern ThreadId VG_(get_current_or_recent_tid) ( void );
njn25e49d8e72002-09-23 09:36:25 +0000328
njn72718642003-07-24 08:45:32 +0000329/* When looking for the current ThreadId, only use this one if you know what
330 you are doing.
daywalker5d945de2003-09-26 00:32:53 +0000331
njn72718642003-07-24 08:45:32 +0000332 Details: Use this one from generated code, eg. from C functions called
333 from UCode. (VG_(get_current_or_recent_tid)() is also suitable in that
334 case.) If you use this function from non-generated code, it will return
335 0 signifying the invalid thread, which is probably not what you want. */
336extern ThreadId VG_(get_current_tid) ( void );
njn25e49d8e72002-09-23 09:36:25 +0000337
njn3e884182003-04-15 13:03:23 +0000338/* Searches through all thread's stacks to see if any match. Returns
njn72718642003-07-24 08:45:32 +0000339 VG_INVALID_THREADID if none match. */
njn3e884182003-04-15 13:03:23 +0000340extern ThreadId VG_(first_matching_thread_stack)
341 ( Bool (*p) ( Addr stack_min, Addr stack_max ));
342
njn25e49d8e72002-09-23 09:36:25 +0000343
344/*====================================================================*/
345/*=== Valgrind's version of libc ===*/
346/*====================================================================*/
347
348/* Valgrind doesn't use libc at all, for good reasons (trust us). So here
349 are its own versions of C library functions, but with VG_ prefixes. Note
350 that the types of some are slightly different to the real ones. Some
njnf4ce3d32003-02-10 10:17:26 +0000351 additional useful functions are provided too; descriptions of how they
352 work are given below. */
njn25e49d8e72002-09-23 09:36:25 +0000353
354#if !defined(NULL)
355# define NULL ((void*)0)
356#endif
357
358
359/* ------------------------------------------------------------------ */
360/* stdio.h
361 *
362 * Note that they all output to the file descriptor given by the
363 * --logfile-fd=N argument, which defaults to 2 (stderr). Hence no
daywalker5d945de2003-09-26 00:32:53 +0000364 * need for VG_(fprintf)().
njn25e49d8e72002-09-23 09:36:25 +0000365 */
sewardj78e3cd92002-10-22 04:45:48 +0000366extern UInt VG_(printf) ( const char *format, ... );
njn25e49d8e72002-09-23 09:36:25 +0000367/* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */
sewardj78e3cd92002-10-22 04:45:48 +0000368extern UInt VG_(sprintf) ( Char* buf, Char *format, ... );
daywalker5d945de2003-09-26 00:32:53 +0000369extern UInt VG_(vprintf) ( void(*send)(Char),
njn25e49d8e72002-09-23 09:36:25 +0000370 const Char *format, va_list vargs );
371
njn41557122002-10-14 09:25:37 +0000372extern Int VG_(rename) ( Char* old_name, Char* new_name );
373
njn25e49d8e72002-09-23 09:36:25 +0000374/* ------------------------------------------------------------------ */
375/* stdlib.h */
376
377extern void* VG_(malloc) ( Int nbytes );
njnd5bb0a52002-09-27 10:24:48 +0000378extern void VG_(free) ( void* p );
379extern void* VG_(calloc) ( Int n, Int nbytes );
380extern void* VG_(realloc) ( void* p, Int size );
381extern void* VG_(malloc_aligned) ( Int align_bytes, Int nbytes );
njn25e49d8e72002-09-23 09:36:25 +0000382
383extern void VG_(print_malloc_stats) ( void );
384
385
386extern void VG_(exit)( Int status )
387 __attribute__ ((__noreturn__));
njne427a662002-10-02 11:08:25 +0000388/* Prints a panic message (a constant string), appends newline and bug
389 reporting info, aborts. */
390__attribute__ ((__noreturn__))
391extern void VG_(skin_panic) ( Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000392
njnd5bb0a52002-09-27 10:24:48 +0000393/* Looks up VG_(client_envp) */
njn25e49d8e72002-09-23 09:36:25 +0000394extern Char* VG_(getenv) ( Char* name );
395
rjwalshf5f536f2003-11-17 17:45:00 +0000396/* Get client resource limit*/
397extern Int VG_(getrlimit) ( Int resource, struct vki_rlimit *rlim );
398
fitzhardingef0046f22003-12-18 02:39:22 +0000399/* Set client resource limit*/
400extern Int VG_(setrlimit) ( Int resource, struct vki_rlimit *rlim );
401
njn25e49d8e72002-09-23 09:36:25 +0000402/* Crude stand-in for the glibc system() call. */
403extern Int VG_(system) ( Char* cmd );
404
njnd5bb0a52002-09-27 10:24:48 +0000405extern Long VG_(atoll) ( Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000406
rjwalsh8b426722004-01-04 23:15:22 +0000407/* Like atoll(), but converts a number of base 16 */
408extern Long VG_(atoll16) ( Char* str );
409
njn25e49d8e72002-09-23 09:36:25 +0000410/* Like atoll(), but converts a number of base 2..36 */
411extern Long VG_(atoll36) ( UInt base, Char* str );
412
njne36543a2003-09-30 15:37:24 +0000413/* Like qsort(), but does shell-sort. The size==1/2/4 cases are specialised. */
njnd3b0c5f2003-09-30 14:43:54 +0000414extern void VG_(ssort)( void* base, UInt nmemb, UInt size,
415 Int (*compar)(void*, void*) );
416
njn25e49d8e72002-09-23 09:36:25 +0000417
418/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000419/* ctype.h */
njn25e49d8e72002-09-23 09:36:25 +0000420extern Bool VG_(isspace) ( Char c );
421extern Bool VG_(isdigit) ( Char c );
422extern Char VG_(toupper) ( Char c );
423
424
425/* ------------------------------------------------------------------ */
426/* string.h */
427extern Int VG_(strlen) ( const Char* str );
428extern Char* VG_(strcat) ( Char* dest, const Char* src );
429extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n );
430extern Char* VG_(strpbrk) ( const Char* s, const Char* accept );
431extern Char* VG_(strcpy) ( Char* dest, const Char* src );
432extern Char* VG_(strncpy) ( Char* dest, const Char* src, Int ndest );
433extern Int VG_(strcmp) ( const Char* s1, const Char* s2 );
434extern Int VG_(strncmp) ( const Char* s1, const Char* s2, Int nmax );
435extern Char* VG_(strstr) ( const Char* haystack, Char* needle );
436extern Char* VG_(strchr) ( const Char* s, Char c );
437extern Char* VG_(strdup) ( const Char* s);
sewardj7ab2aca2002-10-20 19:40:32 +0000438extern void* VG_(memcpy) ( void *d, const void *s, Int sz );
439extern void* VG_(memset) ( void *s, Int c, Int sz );
njn6d68e792003-02-24 10:49:08 +0000440extern Int VG_(memcmp) ( const void* s1, const void* s2, Int n );
njn25e49d8e72002-09-23 09:36:25 +0000441
njnd5bb0a52002-09-27 10:24:48 +0000442/* Like strcmp() and strncmp(), but stop comparing at any whitespace. */
njn25e49d8e72002-09-23 09:36:25 +0000443extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
njn25e49d8e72002-09-23 09:36:25 +0000444extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, Int nmax );
445
daywalker5d945de2003-09-26 00:32:53 +0000446/* Like strncpy(), but if 'src' is longer than 'ndest' inserts a '\0' as the
njnd5bb0a52002-09-27 10:24:48 +0000447 last character. */
njn25e49d8e72002-09-23 09:36:25 +0000448extern void VG_(strncpy_safely) ( Char* dest, const Char* src, Int ndest );
449
450/* Mini-regexp function. Searches for 'pat' in 'str'. Supports
451 * meta-symbols '*' and '?'. '\' escapes meta-symbols. */
fitzhardinge98abfc72003-12-16 02:05:15 +0000452extern Bool VG_(string_match) ( const Char* pat, const Char* str );
njn25e49d8e72002-09-23 09:36:25 +0000453
454
455/* ------------------------------------------------------------------ */
456/* math.h */
njnd5bb0a52002-09-27 10:24:48 +0000457/* Returns the base-2 logarithm of x. */
njn25e49d8e72002-09-23 09:36:25 +0000458extern Int VG_(log2) ( Int x );
459
460
461/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +0000462/* unistd.h, fcntl.h, sys/stat.h */
rjwalshf5f536f2003-11-17 17:45:00 +0000463extern Int VG_(getdents)( UInt fd, struct vki_dirent *dirp, UInt count );
464extern Int VG_(readlink)( Char* path, Char* buf, UInt bufsize );
sewardj4cf05692002-10-27 20:28:29 +0000465extern Int VG_(getpid) ( void );
466extern Int VG_(getppid) ( void );
jsgf855d93d2003-10-13 22:26:55 +0000467extern Int VG_(getpgrp) ( void );
468extern Int VG_(gettid) ( void );
469extern Int VG_(setpgid) ( Int pid, Int pgrp );
njnd5bb0a52002-09-27 10:24:48 +0000470
njn4aca2d22002-10-04 10:29:38 +0000471extern Int VG_(open) ( const Char* pathname, Int flags, Int mode );
472extern Int VG_(read) ( Int fd, void* buf, Int count);
jsgf855d93d2003-10-13 22:26:55 +0000473extern Int VG_(write) ( Int fd, const void* buf, Int count);
rjwalshf5f536f2003-11-17 17:45:00 +0000474extern Int VG_(lseek) ( Int fd, Long offset, Int whence);
njn4aca2d22002-10-04 10:29:38 +0000475extern void VG_(close) ( Int fd );
njnd5bb0a52002-09-27 10:24:48 +0000476
jsgf855d93d2003-10-13 22:26:55 +0000477extern Int VG_(pipe) ( Int fd[2] );
478
njn41557122002-10-14 09:25:37 +0000479/* Nb: VG_(rename)() declared in stdio.h section above */
njn4aca2d22002-10-04 10:29:38 +0000480extern Int VG_(unlink) ( Char* file_name );
481extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
njnc9d4ba72003-10-15 10:34:03 +0000482extern Int VG_(fstat) ( Int fd, struct vki_stat* buf );
fitzhardingee1c06d82003-10-30 07:21:44 +0000483extern Int VG_(dup2) ( Int oldfd, Int newfd );
njn25e49d8e72002-09-23 09:36:25 +0000484
njn13f02932003-04-30 20:23:58 +0000485extern Char* VG_(getcwd) ( Char* buf, Int size );
486
njn99ccf082003-09-30 13:51:23 +0000487/* Easier to use than VG_(getcwd)() -- does the buffer fiddling itself.
488 String put into 'cwd' is VG_(malloc)'d, and should be VG_(free)'d.
489 Returns False if it fails. Will fail if the pathname is > 65535 bytes. */
490extern Bool VG_(getcwd_alloc) ( Char** cwd );
njn25e49d8e72002-09-23 09:36:25 +0000491
492/* ------------------------------------------------------------------ */
493/* assert.h */
494/* Asserts permanently enabled -- no turning off with NDEBUG. Hurrah! */
495#define VG__STRING(__str) #__str
496
njne427a662002-10-02 11:08:25 +0000497#define sk_assert(expr) \
njn25e49d8e72002-09-23 09:36:25 +0000498 ((void) ((expr) ? 0 : \
njne427a662002-10-02 11:08:25 +0000499 (VG_(skin_assert_fail) (VG__STRING(expr), \
500 __FILE__, __LINE__, \
501 __PRETTY_FUNCTION__), 0)))
njn25e49d8e72002-09-23 09:36:25 +0000502
njne427a662002-10-02 11:08:25 +0000503__attribute__ ((__noreturn__))
daywalker5d945de2003-09-26 00:32:53 +0000504extern void VG_(skin_assert_fail) ( const Char* expr, const Char* file,
daywalkerdf9ae422003-09-18 01:41:48 +0000505 Int line, const Char* fn );
njn25e49d8e72002-09-23 09:36:25 +0000506
507
508/* ------------------------------------------------------------------ */
njn25e49d8e72002-09-23 09:36:25 +0000509/* Get memory by anonymous mmap. */
510extern void* VG_(get_memory_from_mmap) ( Int nBytes, Char* who );
511
fitzhardinge98abfc72003-12-16 02:05:15 +0000512extern Bool VG_(is_client_addr) (Addr a);
513extern Addr VG_(get_client_base)(void);
514extern Addr VG_(get_client_end) (void);
515extern Addr VG_(get_client_size)(void);
516
517extern Bool VG_(is_shadow_addr) (Addr a);
518extern Addr VG_(get_shadow_base)(void);
519extern Addr VG_(get_shadow_end) (void);
520extern Addr VG_(get_shadow_size)(void);
521
522extern void *VG_(shadow_alloc)(UInt size);
523
524extern Bool VG_(is_addressable)(Addr p, Int sz);
525
526extern Addr VG_(client_alloc)(Addr base, UInt len, UInt prot, UInt flags);
527extern void VG_(client_free)(Addr addr);
528
529extern Bool VG_(is_valgrind_addr)(Addr a);
530
531/* initialize shadow pages in the range [p, p+sz) This calls
532 init_shadow_page for each one. It should be a lot more efficient
533 for bulk-initializing shadow pages than faulting on each one.
534*/
535extern void VG_(init_shadow_range)(Addr p, UInt sz, Bool call_init);
njn25e49d8e72002-09-23 09:36:25 +0000536
537/* ------------------------------------------------------------------ */
daywalker5d945de2003-09-26 00:32:53 +0000538/* signal.h.
539
njn25e49d8e72002-09-23 09:36:25 +0000540 Note that these use the vk_ (kernel) structure
541 definitions, which are different in places from those that glibc
542 defines -- hence the 'k' prefix. Since we're operating right at the
543 kernel interface, glibc's view of the world is entirely irrelevant. */
544
545/* --- Signal set ops --- */
njnd5bb0a52002-09-27 10:24:48 +0000546extern Int VG_(ksigfillset) ( vki_ksigset_t* set );
547extern Int VG_(ksigemptyset) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000548
njnd5bb0a52002-09-27 10:24:48 +0000549extern Bool VG_(kisfullsigset) ( vki_ksigset_t* set );
550extern Bool VG_(kisemptysigset) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000551
njnd5bb0a52002-09-27 10:24:48 +0000552extern Int VG_(ksigaddset) ( vki_ksigset_t* set, Int signum );
553extern Int VG_(ksigdelset) ( vki_ksigset_t* set, Int signum );
njn25e49d8e72002-09-23 09:36:25 +0000554extern Int VG_(ksigismember) ( vki_ksigset_t* set, Int signum );
555
njnd5bb0a52002-09-27 10:24:48 +0000556extern void VG_(ksigaddset_from_set) ( vki_ksigset_t* dst, vki_ksigset_t* src );
557extern void VG_(ksigdelset_from_set) ( vki_ksigset_t* dst, vki_ksigset_t* src );
njn25e49d8e72002-09-23 09:36:25 +0000558
559/* --- Mess with the kernel's sig state --- */
daywalker5d945de2003-09-26 00:32:53 +0000560extern Int VG_(ksigprocmask) ( Int how, const vki_ksigset_t* set,
njn25e49d8e72002-09-23 09:36:25 +0000561 vki_ksigset_t* oldset );
daywalker5d945de2003-09-26 00:32:53 +0000562extern Int VG_(ksigaction) ( Int signum,
563 const vki_ksigaction* act,
njnd5bb0a52002-09-27 10:24:48 +0000564 vki_ksigaction* oldact );
njn25e49d8e72002-09-23 09:36:25 +0000565
jsgf855d93d2003-10-13 22:26:55 +0000566extern Int VG_(ksigtimedwait)( const vki_ksigset_t *, vki_ksiginfo_t *,
567 const struct vki_timespec * );
568
njnd5bb0a52002-09-27 10:24:48 +0000569extern Int VG_(ksignal) ( Int signum, void (*sighandler)(Int) );
570extern Int VG_(ksigaltstack) ( const vki_kstack_t* ss, vki_kstack_t* oss );
njn25e49d8e72002-09-23 09:36:25 +0000571
sewardjdcaf3122002-09-30 23:12:33 +0000572extern Int VG_(kkill) ( Int pid, Int signo );
jsgf855d93d2003-10-13 22:26:55 +0000573extern Int VG_(ktkill) ( Int pid, Int signo );
sewardjdcaf3122002-09-30 23:12:33 +0000574extern Int VG_(ksigpending) ( vki_ksigset_t* set );
njn25e49d8e72002-09-23 09:36:25 +0000575
jsgf855d93d2003-10-13 22:26:55 +0000576extern Int VG_(waitpid) ( Int pid, Int *status, Int options );
njn25e49d8e72002-09-23 09:36:25 +0000577
njne7442cf2003-09-30 14:03:21 +0000578/* ------------------------------------------------------------------ */
rjwalshf5f536f2003-11-17 17:45:00 +0000579/* socket.h. */
580
581extern Int VG_(getsockname) ( Int sd, struct vki_sockaddr *name, Int *namelen);
582extern Int VG_(getpeername) ( Int sd, struct vki_sockaddr *name, Int *namelen);
583extern Int VG_(getsockopt) ( Int sd, Int level, Int optname, void *optval,
584 Int *optlen);
585
586/* ------------------------------------------------------------------ */
njne7442cf2003-09-30 14:03:21 +0000587/* other, randomly useful functions */
588extern UInt VG_(read_millisecond_timer) ( void );
589
njn25e49d8e72002-09-23 09:36:25 +0000590/*====================================================================*/
591/*=== UCode definition ===*/
592/*====================================================================*/
593
sewardje1042472002-09-30 12:33:11 +0000594/* Tags which describe what operands are. Must fit into 4 bits, which
595 they clearly do. */
njn25e49d8e72002-09-23 09:36:25 +0000596typedef
sewardje1042472002-09-30 12:33:11 +0000597enum { TempReg =0, /* virtual temp-reg */
598 ArchReg =1, /* simulated integer reg */
599 ArchRegS =2, /* simulated segment reg */
600 RealReg =3, /* real machine's real reg */
601 SpillNo =4, /* spill slot location */
602 Literal =5, /* literal; .lit32 field has actual value */
603 Lit16 =6, /* literal; .val[123] field has actual value */
604 NoValue =7 /* operand not in use */
605 }
606 Tag;
njn25e49d8e72002-09-23 09:36:25 +0000607
njnd5bb0a52002-09-27 10:24:48 +0000608/* Invalid register numbers (can't be negative) */
njn25e49d8e72002-09-23 09:36:25 +0000609#define INVALID_TEMPREG 999999999
610#define INVALID_REALREG 999999999
611
612/* Microinstruction opcodes. */
613typedef
614 enum {
njnd5bb0a52002-09-27 10:24:48 +0000615 NOP, /* Null op */
njn25e49d8e72002-09-23 09:36:25 +0000616
daywalker7e73e5f2003-07-04 16:18:15 +0000617 LOCK, /* Indicate the existence of a LOCK prefix (functionally NOP) */
sewardj7a5ebcf2002-11-13 22:42:13 +0000618
njnd5bb0a52002-09-27 10:24:48 +0000619 /* Moving values around */
620 GET, PUT, /* simulated register <--> TempReg */
621 GETF, PUTF, /* simulated %eflags <--> TempReg */
622 LOAD, STORE, /* memory <--> TempReg */
623 MOV, /* TempReg <--> TempReg */
624 CMOV, /* Used for cmpxchg and cmov */
njn25e49d8e72002-09-23 09:36:25 +0000625
njnd5bb0a52002-09-27 10:24:48 +0000626 /* Arithmetic/logical ops */
jsgf5efa4fd2003-10-14 21:49:11 +0000627 MUL, UMUL, /* Multiply */
njnd5bb0a52002-09-27 10:24:48 +0000628 ADD, ADC, SUB, SBB, /* Add/subtract (w/wo carry) */
629 AND, OR, XOR, NOT, /* Boolean ops */
630 SHL, SHR, SAR, ROL, ROR, RCL, RCR, /* Shift/rotate (w/wo carry) */
631 NEG, /* Negate */
632 INC, DEC, /* Increment/decrement */
633 BSWAP, /* Big-endian <--> little-endian */
634 CC2VAL, /* Condition code --> 0 or 1 */
635 WIDEN, /* Signed or unsigned widening */
njn25e49d8e72002-09-23 09:36:25 +0000636
njnd5bb0a52002-09-27 10:24:48 +0000637 /* Conditional or unconditional jump */
daywalker5d945de2003-09-26 00:32:53 +0000638 JMP,
njnd5bb0a52002-09-27 10:24:48 +0000639
640 /* FPU ops */
641 FPU, /* Doesn't touch memory */
642 FPU_R, FPU_W, /* Reads/writes memory */
643
sewardj3d7c9c82003-03-26 21:08:13 +0000644 /* ------------ MMX ops ------------ */
sewardj8cec6ee2003-05-18 11:56:39 +0000645 /* In this and the SSE encoding, bytes at higher addresses are
646 held in bits [7:0] in these 16-bit words. I guess this means
647 it is a big-endian encoding. */
sewardj3d7c9c82003-03-26 21:08:13 +0000648
649 /* 1 byte, no memrefs, no iregdefs, copy exactly to the
650 output. Held in val1[7:0]. */
651 MMX1,
652
653 /* 2 bytes, no memrefs, no iregdefs, copy exactly to the
654 output. Held in val1[15:0]. */
655 MMX2,
656
657 /* 3 bytes, no memrefs, no iregdefs, copy exactly to the
658 output. Held in val1[15:0] and val2[7:0]. */
659 MMX3,
660
661 /* 2 bytes, reads/writes mem. Insns of the form
662 bbbbbbbb:mod mmxreg r/m.
663 Held in val1[15:0], and mod and rm are to be replaced
daywalker5d945de2003-09-26 00:32:53 +0000664 at codegen time by a reference to the Temp/RealReg holding
sewardj3d7c9c82003-03-26 21:08:13 +0000665 the address. Arg2 holds this Temp/Real Reg.
666 Transfer is always at size 8.
667 */
668 MMX2_MemRd,
669 MMX2_MemWr,
670
sewardj4fbe6e92003-06-15 21:54:34 +0000671 /* 2 bytes, reads/writes an integer ("E") register. Insns of the form
sewardj3d7c9c82003-03-26 21:08:13 +0000672 bbbbbbbb:11 mmxreg ireg.
673 Held in val1[15:0], and ireg is to be replaced
674 at codegen time by a reference to the relevant RealReg.
675 Transfer is always at size 4. Arg2 holds this Temp/Real Reg.
676 */
sewardj4fbe6e92003-06-15 21:54:34 +0000677 MMX2_ERegRd,
678 MMX2_ERegWr,
sewardj3d7c9c82003-03-26 21:08:13 +0000679
sewardj8cec6ee2003-05-18 11:56:39 +0000680 /* ------------ SSE/SSE2 ops ------------ */
681 /* In the following:
682
sewardjfebaa3b2003-05-25 01:07:34 +0000683 a digit N indicates the next N bytes are to be copied exactly
684 to the output.
sewardj8cec6ee2003-05-18 11:56:39 +0000685
686 'a' indicates a mod-xmmreg-rm byte, where the mod-rm part is
687 to be replaced at codegen time to a Temp/RealReg holding the
688 address.
689
sewardj4fbe6e92003-06-15 21:54:34 +0000690 'e' indicates a byte of the form '11 xmmreg ireg', where ireg
691 is read or written, and is to be replaced at codegen time by
692 a reference to the relevant RealReg. 'e' because it's the E
693 reg in Intel encoding parlance.
sewardj8cec6ee2003-05-18 11:56:39 +0000694
sewardj4fbe6e92003-06-15 21:54:34 +0000695 'g' indicates a byte of the form '11 ireg xmmreg', where ireg
696 is read or written, and is to be replaced at codegen time by
697 a reference to the relevant RealReg. 'g' because it's called
698 G in Intel parlance. */
sewardj8cec6ee2003-05-18 11:56:39 +0000699
700 /* 3 bytes, no memrefs, no iregdefs, copy exactly to the
701 output. Held in val1[15:0] and val2[7:0]. */
702 SSE3,
703
704 /* 3 bytes, reads/writes mem. Insns of the form
705 bbbbbbbb:bbbbbbbb:mod mmxreg r/m.
706 Held in val1[15:0] and val2[7:0], and mod and rm are to be
707 replaced at codegen time by a reference to the Temp/RealReg
708 holding the address. Arg3 holds this Temp/Real Reg.
sewardjfebaa3b2003-05-25 01:07:34 +0000709 Transfer is usually, but not always, at size 16. */
sewardj8cec6ee2003-05-18 11:56:39 +0000710 SSE2a_MemRd,
711 SSE2a_MemWr,
712
713 /* 4 bytes, no memrefs, no iregdefs, copy exactly to the
714 output. Held in val1[15:0] and val2[15:0]. */
715 SSE4,
716
717 /* 4 bytes, reads/writes mem. Insns of the form
718 bbbbbbbb:bbbbbbbb:bbbbbbbb:mod mmxreg r/m.
719 Held in val1[15:0] and val2[15:0], and mod and rm are to be
720 replaced at codegen time by a reference to the Temp/RealReg
721 holding the address. Arg3 holds this Temp/Real Reg.
sewardj9dd209f2003-06-18 23:30:52 +0000722 Transfer is at stated size. */
sewardj8cec6ee2003-05-18 11:56:39 +0000723 SSE3a_MemRd,
724 SSE3a_MemWr,
725
726 /* 4 bytes, reads/writes mem. Insns of the form
727 bbbbbbbb:bbbbbbbb:mod mmxreg r/m:bbbbbbbb
728 Held in val1[15:0] and val2[15:0], and mod and rm are to be
729 replaced at codegen time by a reference to the Temp/RealReg
730 holding the address. Arg3 holds this Temp/Real Reg.
sewardj9dd209f2003-06-18 23:30:52 +0000731 Transfer is at stated size. */
sewardj8cec6ee2003-05-18 11:56:39 +0000732 SSE2a1_MemRd,
sewardj77d30a22003-10-19 08:18:52 +0000733
sewardj8cec6ee2003-05-18 11:56:39 +0000734 /* 4 bytes, writes an integer register. Insns of the form
sewardj4fbe6e92003-06-15 21:54:34 +0000735 bbbbbbbb:bbbbbbbb:bbbbbbbb:11 ireg bbb.
sewardj8cec6ee2003-05-18 11:56:39 +0000736 Held in val1[15:0] and val2[15:0], and ireg is to be replaced
737 at codegen time by a reference to the relevant RealReg.
738 Transfer is always at size 4. Arg3 holds this Temp/Real Reg.
739 */
740 SSE3g_RegWr,
741
sewardjb31b06d2003-06-13 00:26:02 +0000742 /* 5 bytes, writes an integer register. Insns of the form
743 bbbbbbbb:bbbbbbbb:bbbbbbbb: 11 ireg bbb :bbbbbbbb. Held in
744 val1[15:0] and val2[15:0] and lit32[7:0], and ireg is to be
745 replaced at codegen time by a reference to the relevant
746 RealReg. Transfer is always at size 4. Arg3 holds this
747 Temp/Real Reg.
748 */
749 SSE3g1_RegWr,
750
sewardj4fbe6e92003-06-15 21:54:34 +0000751 /* 4 bytes, reads an integer register. Insns of the form
752 bbbbbbbb:bbbbbbbb:bbbbbbbb:11 bbb ireg.
753 Held in val1[15:0] and val2[15:0], and ireg is to be replaced
754 at codegen time by a reference to the relevant RealReg.
755 Transfer is always at size 4. Arg3 holds this Temp/Real Reg.
756 */
757 SSE3e_RegRd,
sewardjabf8bf82003-06-15 22:28:05 +0000758 SSE3e_RegWr, /* variant that writes Ereg, not reads it */
sewardj4fbe6e92003-06-15 21:54:34 +0000759
sewardjb31b06d2003-06-13 00:26:02 +0000760 /* 5 bytes, reads an integer register. Insns of the form
761 bbbbbbbb:bbbbbbbb:bbbbbbbb: 11 bbb ireg :bbbbbbbb. Held in
762 val1[15:0] and val2[15:0] and lit32[7:0], and ireg is to be
763 replaced at codegen time by a reference to the relevant
764 RealReg. Transfer is always at size 4. Arg3 holds this
765 Temp/Real Reg.
766 */
sewardj4fbe6e92003-06-15 21:54:34 +0000767 SSE3e1_RegRd,
sewardj8cec6ee2003-05-18 11:56:39 +0000768
sewardj02af6bc2003-06-12 00:56:06 +0000769 /* 4 bytes, reads memory, writes an integer register, but is
770 nevertheless an SSE insn. The insn is of the form
771 bbbbbbbb:bbbbbbbb:bbbbbbbb:mod ireg rm where mod indicates
772 memory (ie is not 11b) and ireg is the int reg written. The
sewardje3891fa2003-06-15 03:13:48 +0000773 first 4 bytes are held in lit32[31:0] since there is
sewardj02af6bc2003-06-12 00:56:06 +0000774 insufficient space elsewhere. mod and rm are to be replaced
775 at codegen time by a reference to the Temp/RealReg holding
776 the address. Arg1 holds this Temp/RealReg. ireg is to be
777 replaced at codegen time by a reference to the relevant
778 RealReg in which the answer is to be written. Arg2 holds
779 this Temp/RealReg. Transfer to the destination reg is always
780 at size 4. However the memory read can be at sizes 4 or 8
sewardje3891fa2003-06-15 03:13:48 +0000781 and so this is what the sz field holds. Note that the 4th
782 byte of the instruction (the modrm byte) is redundant, but we
783 store it anyway so as to be consistent with all other SSE
784 uinstrs.
sewardj02af6bc2003-06-12 00:56:06 +0000785 */
786 SSE3ag_MemRd_RegWr,
sewardje3891fa2003-06-15 03:13:48 +0000787
sewardj8cec6ee2003-05-18 11:56:39 +0000788 /* 5 bytes, no memrefs, no iregdefs, copy exactly to the
789 output. Held in val1[15:0], val2[15:0] and val3[7:0]. */
790 SSE5,
sewardj77d30a22003-10-19 08:18:52 +0000791
sewardj8cec6ee2003-05-18 11:56:39 +0000792 /* 5 bytes, reads/writes mem. Insns of the form
793 bbbbbbbb:bbbbbbbb:bbbbbbbb:mod mmxreg r/m:bbbbbbbb
daywalker5d945de2003-09-26 00:32:53 +0000794 Held in val1[15:0], val2[15:0], lit32[7:0].
795 mod and rm are to be replaced at codegen time by a reference
796 to the Temp/RealReg holding the address. Arg3 holds this
sewardj8cec6ee2003-05-18 11:56:39 +0000797 Temp/Real Reg. Transfer is always at size 16. */
798 SSE3a1_MemRd,
sewardj77d30a22003-10-19 08:18:52 +0000799
sewardj3d7c9c82003-03-26 21:08:13 +0000800 /* ------------------------ */
801
njnd5bb0a52002-09-27 10:24:48 +0000802 /* Not strictly needed, but improve address calculation translations. */
njn25e49d8e72002-09-23 09:36:25 +0000803 LEA1, /* reg2 := const + reg1 */
804 LEA2, /* reg3 := const + reg1 + reg2 * 1,2,4 or 8 */
805
sewardj8cec6ee2003-05-18 11:56:39 +0000806 /* Hack for x86 REP insns. Jump to literal if TempReg/RealReg
807 is zero. */
njnd5bb0a52002-09-27 10:24:48 +0000808 JIFZ,
njn25e49d8e72002-09-23 09:36:25 +0000809
njnd5bb0a52002-09-27 10:24:48 +0000810 /* Advance the simulated %eip by some small (< 128) number. */
811 INCEIP,
njn25e49d8e72002-09-23 09:36:25 +0000812
sewardje1042472002-09-30 12:33:11 +0000813 /* Dealing with segment registers */
814 GETSEG, PUTSEG, /* simulated segment register <--> TempReg */
815 USESEG, /* (LDT/GDT index, virtual addr) --> linear addr */
816
njnd5bb0a52002-09-27 10:24:48 +0000817 /* Not for translating x86 calls -- only to call helpers */
818 CALLM_S, CALLM_E, /* Mark start/end of CALLM push/pop sequence */
819 PUSH, POP, CLEAR, /* Add/remove/zap args for helpers */
820 CALLM, /* Call assembly-code helper */
821
822 /* Not for translating x86 calls -- only to call C helper functions of
823 up to three arguments (or two if the functions has a return value).
824 Arguments and return value must be word-sized. More arguments can
825 be faked with global variables (eg. use VG_(set_global_var)()).
826
827 Seven possibilities: 'arg[123]' show where args go, 'ret' shows
828 where return value goes (if present).
daywalker5d945de2003-09-26 00:32:53 +0000829
njn25e49d8e72002-09-23 09:36:25 +0000830 CCALL(-, -, - ) void f(void)
831 CCALL(arg1, -, - ) void f(UInt arg1)
832 CCALL(arg1, arg2, - ) void f(UInt arg1, UInt arg2)
833 CCALL(arg1, arg2, arg3) void f(UInt arg1, UInt arg2, UInt arg3)
834 CCALL(-, -, ret ) UInt f(UInt)
835 CCALL(arg1, -, ret ) UInt f(UInt arg1)
njnd5bb0a52002-09-27 10:24:48 +0000836 CCALL(arg1, arg2, ret ) UInt f(UInt arg1, UInt arg2) */
njn25e49d8e72002-09-23 09:36:25 +0000837 CCALL,
838
njnd5bb0a52002-09-27 10:24:48 +0000839 /* This opcode makes it easy for skins that extend UCode to do this to
840 avoid opcode overlap:
njn25e49d8e72002-09-23 09:36:25 +0000841
daywalker5d945de2003-09-26 00:32:53 +0000842 enum { EU_OP1 = DUMMY_FINAL_UOPCODE + 1, ... }
843
njn25e49d8e72002-09-23 09:36:25 +0000844 WARNING: Do not add new opcodes after this one! They can be added
845 before, though. */
846 DUMMY_FINAL_UOPCODE
847 }
848 Opcode;
849
850
njnd5bb0a52002-09-27 10:24:48 +0000851/* Condition codes, using the Intel encoding. CondAlways is an extra. */
njn25e49d8e72002-09-23 09:36:25 +0000852typedef
853 enum {
854 CondO = 0, /* overflow */
855 CondNO = 1, /* no overflow */
856 CondB = 2, /* below */
857 CondNB = 3, /* not below */
858 CondZ = 4, /* zero */
859 CondNZ = 5, /* not zero */
860 CondBE = 6, /* below or equal */
861 CondNBE = 7, /* not below or equal */
862 CondS = 8, /* negative */
sewardje1042472002-09-30 12:33:11 +0000863 CondNS = 9, /* not negative */
njn25e49d8e72002-09-23 09:36:25 +0000864 CondP = 10, /* parity even */
865 CondNP = 11, /* not parity even */
866 CondL = 12, /* jump less */
867 CondNL = 13, /* not less */
868 CondLE = 14, /* less or equal */
869 CondNLE = 15, /* not less or equal */
870 CondAlways = 16 /* Jump always */
daywalker5d945de2003-09-26 00:32:53 +0000871 }
njn25e49d8e72002-09-23 09:36:25 +0000872 Condcode;
873
874
875/* Descriptions of additional properties of *unconditional* jumps. */
876typedef
877 enum {
878 JmpBoring=0, /* boring unconditional jump */
879 JmpCall=1, /* jump due to an x86 call insn */
880 JmpRet=2, /* jump due to an x86 ret insn */
881 JmpSyscall=3, /* do a system call, then jump */
fitzhardingea02f8812003-12-18 09:06:09 +0000882 JmpClientReq=4,/* do a client request, then jump */
883 JmpYield=5 /* do a yield, then jump */
njn25e49d8e72002-09-23 09:36:25 +0000884 }
885 JmpKind;
886
887
888/* Flags. User-level code can only read/write O(verflow), S(ign),
889 Z(ero), A(ux-carry), C(arry), P(arity), and may also write
890 D(irection). That's a total of 7 flags. A FlagSet is a bitset,
daywalker5d945de2003-09-26 00:32:53 +0000891 thusly:
njn25e49d8e72002-09-23 09:36:25 +0000892 76543210
893 DOSZACP
894 and bit 7 must always be zero since it is unused.
sewardj2370f3b2002-11-30 15:01:01 +0000895
896 Note: these Flag? values are **not** the positions in the actual
897 %eflags register. */
898
njn25e49d8e72002-09-23 09:36:25 +0000899typedef UChar FlagSet;
900
901#define FlagD (1<<6)
902#define FlagO (1<<5)
903#define FlagS (1<<4)
904#define FlagZ (1<<3)
905#define FlagA (1<<2)
906#define FlagC (1<<1)
907#define FlagP (1<<0)
908
909#define FlagsOSZACP (FlagO | FlagS | FlagZ | FlagA | FlagC | FlagP)
910#define FlagsOSZAP (FlagO | FlagS | FlagZ | FlagA | FlagP)
911#define FlagsOSZCP (FlagO | FlagS | FlagZ | FlagC | FlagP)
912#define FlagsOSACP (FlagO | FlagS | FlagA | FlagC | FlagP)
913#define FlagsSZACP ( FlagS | FlagZ | FlagA | FlagC | FlagP)
914#define FlagsSZAP ( FlagS | FlagZ | FlagA | FlagP)
915#define FlagsZCP ( FlagZ | FlagC | FlagP)
916#define FlagsOC (FlagO | FlagC )
917#define FlagsAC ( FlagA | FlagC )
918
919#define FlagsALL (FlagsOSZACP | FlagD)
920#define FlagsEmpty (FlagSet)0
921
922
sewardj2370f3b2002-11-30 15:01:01 +0000923/* flag positions in eflags */
924#define EFlagC (1 << 0) /* carry */
925#define EFlagP (1 << 2) /* parity */
sewardjfa492d42002-12-08 18:20:01 +0000926#define EFlagA (1 << 4) /* aux carry */
sewardj2370f3b2002-11-30 15:01:01 +0000927#define EFlagZ (1 << 6) /* zero */
928#define EFlagS (1 << 7) /* sign */
sewardjfa492d42002-12-08 18:20:01 +0000929#define EFlagD (1 << 10) /* direction */
sewardj2370f3b2002-11-30 15:01:01 +0000930#define EFlagO (1 << 11) /* overflow */
931
njn25e49d8e72002-09-23 09:36:25 +0000932/* Liveness of general purpose registers, useful for code generation.
933 Reg rank order 0..N-1 corresponds to bits 0..N-1, ie. first
934 reg's liveness in bit 0, last reg's in bit N-1. Note that
935 these rankings don't match the Intel register ordering. */
936typedef UInt RRegSet;
937
938#define ALL_RREGS_DEAD 0 /* 0000...00b */
njne7c258c2002-10-03 08:57:01 +0000939#define ALL_RREGS_LIVE ((1 << VG_MAX_REALREGS)-1) /* 0011...11b */
njn25e49d8e72002-09-23 09:36:25 +0000940#define UNIT_RREGSET(rank) (1 << (rank))
941
942#define IS_RREG_LIVE(rank,rregs_live) (rregs_live & UNIT_RREGSET(rank))
943#define SET_RREG_LIVENESS(rank,rregs_live,b) \
944 do { RRegSet unit = UNIT_RREGSET(rank); \
945 if (b) rregs_live |= unit; \
946 else rregs_live &= ~unit; \
947 } while(0)
948
949
950/* A Micro (u)-instruction. */
951typedef
952 struct {
953 /* word 1 */
954 UInt lit32; /* 32-bit literal */
955
956 /* word 2 */
957 UShort val1; /* first operand */
958 UShort val2; /* second operand */
959
960 /* word 3 */
961 UShort val3; /* third operand */
962 UChar opcode; /* opcode */
963 UChar size; /* data transfer size */
964
965 /* word 4 */
966 FlagSet flags_r; /* :: FlagSet */
967 FlagSet flags_w; /* :: FlagSet */
968 UChar tag1:4; /* first operand tag */
969 UChar tag2:4; /* second operand tag */
970 UChar tag3:4; /* third operand tag */
971 UChar extra4b:4; /* Spare field, used by WIDEN for src
972 -size, and by LEA2 for scale (1,2,4 or 8),
973 and by JMPs for original x86 instr size */
974
975 /* word 5 */
976 UChar cond; /* condition, for jumps */
977 Bool signed_widen:1; /* signed or unsigned WIDEN ? */
978 JmpKind jmpkind:3; /* additional properties of unconditional JMP */
979
daywalker5d945de2003-09-26 00:32:53 +0000980 /* Additional properties for UInstrs that call C functions:
njn25e49d8e72002-09-23 09:36:25 +0000981 - CCALL
982 - PUT (when %ESP is the target)
983 - possibly skin-specific UInstrs
984 */
985 UChar argc:2; /* Number of args, max 3 */
986 UChar regparms_n:2; /* Number of args passed in registers */
987 Bool has_ret_val:1; /* Function has return value? */
988
989 /* RealReg liveness; only sensical after reg alloc and liveness
990 analysis done. This info is a little bit arch-specific --
991 VG_MAX_REALREGS can vary on different architectures. Note that
992 to use this information requires converting between register ranks
njn4ba5a792002-09-30 10:23:54 +0000993 and the Intel register numbers, using VG_(realreg_to_rank)()
994 and/or VG_(rank_to_realreg)() */
daywalker5d945de2003-09-26 00:32:53 +0000995 RRegSet regs_live_after:VG_MAX_REALREGS;
njn25e49d8e72002-09-23 09:36:25 +0000996 }
997 UInstr;
998
999
daywalker5d945de2003-09-26 00:32:53 +00001000typedef
njn810086f2002-11-14 12:42:47 +00001001 struct _UCodeBlock
njn25e49d8e72002-09-23 09:36:25 +00001002 UCodeBlock;
1003
njn810086f2002-11-14 12:42:47 +00001004extern Int VG_(get_num_instrs) (UCodeBlock* cb);
1005extern Int VG_(get_num_temps) (UCodeBlock* cb);
njn25e49d8e72002-09-23 09:36:25 +00001006
njn810086f2002-11-14 12:42:47 +00001007extern UInstr* VG_(get_instr) (UCodeBlock* cb, Int i);
1008extern UInstr* VG_(get_last_instr) (UCodeBlock* cb);
daywalker5d945de2003-09-26 00:32:53 +00001009
njn211b6ad2003-02-03 12:33:31 +00001010
njn25e49d8e72002-09-23 09:36:25 +00001011/*====================================================================*/
1012/*=== Instrumenting UCode ===*/
1013/*====================================================================*/
1014
njnf4ce3d32003-02-10 10:17:26 +00001015/* Maximum number of registers read or written by a single UInstruction. */
1016#define VG_MAX_REGS_USED 3
njn25e49d8e72002-09-23 09:36:25 +00001017
njnf4ce3d32003-02-10 10:17:26 +00001018/* Find what this instruction does to its regs, useful for
1019 analysis/optimisation passes. `tag' indicates whether we're considering
1020 TempRegs (pre-reg-alloc) or RealRegs (post-reg-alloc). `regs' is filled
1021 with the affected register numbers, `isWrites' parallels it and indicates
1022 if the reg is read or written. If a reg is read and written, it will
1023 appear twice in `regs'. `regs' and `isWrites' must be able to fit
1024 VG_MAX_REGS_USED elements. */
njn810086f2002-11-14 12:42:47 +00001025extern Int VG_(get_reg_usage) ( UInstr* u, Tag tag, Int* regs, Bool* isWrites );
njn25e49d8e72002-09-23 09:36:25 +00001026
1027
njnd5bb0a52002-09-27 10:24:48 +00001028/* Used to register helper functions to be called from generated code. A
1029 limited number of compact helpers can be registered; the code generated
1030 to call them is slightly shorter -- so register the mostly frequently
1031 called helpers as compact. */
njn25e49d8e72002-09-23 09:36:25 +00001032extern void VG_(register_compact_helper) ( Addr a );
1033extern void VG_(register_noncompact_helper) ( Addr a );
1034
1035
1036/* ------------------------------------------------------------------ */
1037/* Virtual register allocation */
1038
1039/* Get a new virtual register */
njn4ba5a792002-09-30 10:23:54 +00001040extern Int VG_(get_new_temp) ( UCodeBlock* cb );
njn25e49d8e72002-09-23 09:36:25 +00001041
1042/* Get a new virtual shadow register */
njn4ba5a792002-09-30 10:23:54 +00001043extern Int VG_(get_new_shadow) ( UCodeBlock* cb );
njn25e49d8e72002-09-23 09:36:25 +00001044
1045/* Get a virtual register's corresponding virtual shadow register */
1046#define SHADOW(tempreg) ((tempreg)+1)
1047
1048
1049/* ------------------------------------------------------------------ */
1050/* Low-level UInstr builders */
njn4ba5a792002-09-30 10:23:54 +00001051extern void VG_(new_NOP) ( UInstr* u );
1052extern void VG_(new_UInstr0) ( UCodeBlock* cb, Opcode opcode, Int sz );
1053extern void VG_(new_UInstr1) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +00001054 Tag tag1, UInt val1 );
njn4ba5a792002-09-30 10:23:54 +00001055extern void VG_(new_UInstr2) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +00001056 Tag tag1, UInt val1,
1057 Tag tag2, UInt val2 );
njn4ba5a792002-09-30 10:23:54 +00001058extern void VG_(new_UInstr3) ( UCodeBlock* cb, Opcode opcode, Int sz,
njn25e49d8e72002-09-23 09:36:25 +00001059 Tag tag1, UInt val1,
1060 Tag tag2, UInt val2,
1061 Tag tag3, UInt val3 );
njn25e49d8e72002-09-23 09:36:25 +00001062
daywalker5d945de2003-09-26 00:32:53 +00001063/* Set read/write/undefined flags. Undefined flags are treaten as written,
njn810086f2002-11-14 12:42:47 +00001064 but it's worth keeping them logically distinct. */
1065extern void VG_(set_flag_fields) ( UCodeBlock* cb, FlagSet fr, FlagSet fw,
1066 FlagSet fu);
njn4ba5a792002-09-30 10:23:54 +00001067extern void VG_(set_lit_field) ( UCodeBlock* cb, UInt lit32 );
1068extern void VG_(set_ccall_fields) ( UCodeBlock* cb, Addr fn, UChar argc,
1069 UChar regparms_n, Bool has_ret_val );
njn810086f2002-11-14 12:42:47 +00001070extern void VG_(set_cond_field) ( UCodeBlock* cb, Condcode code );
njn25e49d8e72002-09-23 09:36:25 +00001071
njn4ba5a792002-09-30 10:23:54 +00001072extern void VG_(copy_UInstr) ( UCodeBlock* cb, UInstr* instr );
1073
1074extern Bool VG_(any_flag_use)( UInstr* u );
njn25e49d8e72002-09-23 09:36:25 +00001075
njnac6c1762002-10-04 14:34:15 +00001076/* Macro versions of the above; just shorter to type. */
1077#define uInstr0 VG_(new_UInstr0)
1078#define uInstr1 VG_(new_UInstr1)
1079#define uInstr2 VG_(new_UInstr2)
1080#define uInstr3 VG_(new_UInstr3)
1081#define uLiteral VG_(set_lit_field)
1082#define uCCall VG_(set_ccall_fields)
njn810086f2002-11-14 12:42:47 +00001083#define uCond VG_(set_cond_field)
1084#define uFlagsRWU VG_(set_flag_fields)
njnac6c1762002-10-04 14:34:15 +00001085#define newTemp VG_(get_new_temp)
1086#define newShadow VG_(get_new_shadow)
1087
njn25e49d8e72002-09-23 09:36:25 +00001088/* Refer to `the last instruction stuffed in' (can be lvalue). */
1089#define LAST_UINSTR(cb) (cb)->instrs[(cb)->used-1]
1090
1091
1092/* ------------------------------------------------------------------ */
1093/* Higher-level UInstr sequence builders */
njn4ba5a792002-09-30 10:23:54 +00001094extern void VG_(call_helper_0_0) ( UCodeBlock* cb, Addr f);
1095extern void VG_(call_helper_1_0) ( UCodeBlock* cb, Addr f, UInt arg1,
1096 UInt regparms_n);
1097extern void VG_(call_helper_2_0) ( UCodeBlock* cb, Addr f, UInt arg1, UInt arg2,
1098 UInt regparms_n);
njn25e49d8e72002-09-23 09:36:25 +00001099
1100/* One way around the 3-arg C function limit is to pass args via global
njn6fefa1b2003-02-24 10:32:51 +00001101 * variables... ugly, but it works. This one puts a literal in there. */
njn4ba5a792002-09-30 10:23:54 +00001102extern void VG_(set_global_var) ( UCodeBlock* cb, Addr globvar_ptr, UInt val);
njn25e49d8e72002-09-23 09:36:25 +00001103
njn6fefa1b2003-02-24 10:32:51 +00001104/* This one puts the contents of a TempReg in the global variable. */
1105extern void VG_(set_global_var_tempreg) ( UCodeBlock* cb, Addr globvar_ptr,
1106 UInt t_val);
1107
njn25e49d8e72002-09-23 09:36:25 +00001108/* ------------------------------------------------------------------ */
njnd5bb0a52002-09-27 10:24:48 +00001109/* Allocating/freeing basic blocks of UCode */
njn810086f2002-11-14 12:42:47 +00001110extern UCodeBlock* VG_(setup_UCodeBlock) ( UCodeBlock* cb );
njn4ba5a792002-09-30 10:23:54 +00001111extern void VG_(free_UCodeBlock) ( UCodeBlock* cb );
njnd5bb0a52002-09-27 10:24:48 +00001112
1113/* ------------------------------------------------------------------ */
daywalker5d945de2003-09-26 00:32:53 +00001114/* UCode pretty/ugly printing. Probably only useful to call from a skin
njn25e49d8e72002-09-23 09:36:25 +00001115 if VG_(needs).extended_UCode == True. */
1116
1117/* When True, all generated code is/should be printed. */
1118extern Bool VG_(print_codegen);
1119
njn4ba5a792002-09-30 10:23:54 +00001120/* Pretty/ugly printing functions */
1121extern void VG_(pp_UCodeBlock) ( UCodeBlock* cb, Char* title );
1122extern void VG_(pp_UInstr) ( Int instrNo, UInstr* u );
1123extern void VG_(pp_UInstr_regs) ( Int instrNo, UInstr* u );
1124extern void VG_(up_UInstr) ( Int instrNo, UInstr* u );
1125extern Char* VG_(name_UOpcode) ( Bool upper, Opcode opc );
njn563f96f2003-02-03 11:17:46 +00001126extern Char* VG_(name_UCondcode) ( Condcode cond );
daywalker5d945de2003-09-26 00:32:53 +00001127extern void VG_(pp_UOperand) ( UInstr* u, Int operandNo,
njn4ba5a792002-09-30 10:23:54 +00001128 Int sz, Bool parens );
njn25e49d8e72002-09-23 09:36:25 +00001129
njnb93d1782003-02-03 12:03:22 +00001130/* ------------------------------------------------------------------ */
njnf4ce3d32003-02-10 10:17:26 +00001131/* Accessing archregs and their shadows */
1132extern UInt VG_(get_archreg) ( UInt archreg );
1133extern UInt VG_(get_thread_archreg) ( ThreadId tid, UInt archreg );
1134
njnb93d1782003-02-03 12:03:22 +00001135extern UInt VG_(get_shadow_archreg) ( UInt archreg );
1136extern void VG_(set_shadow_archreg) ( UInt archreg, UInt val );
njnd3040452003-05-19 15:04:06 +00001137extern void VG_(set_shadow_eflags) ( UInt val );
njnb93d1782003-02-03 12:03:22 +00001138extern Addr VG_(shadow_archreg_address) ( UInt archreg );
njn25e49d8e72002-09-23 09:36:25 +00001139
njnf4ce3d32003-02-10 10:17:26 +00001140extern UInt VG_(get_thread_shadow_archreg) ( ThreadId tid, UInt archreg );
1141extern void VG_(set_thread_shadow_archreg) ( ThreadId tid, UInt archreg,
1142 UInt val );
njn211b6ad2003-02-03 12:33:31 +00001143
1144/* ------------------------------------------------------------------ */
1145/* Offsets of addresses of helper functions. A "helper" function is one
1146 which is called from generated code via CALLM. */
1147
1148extern Int VGOFF_(helper_idiv_64_32);
1149extern Int VGOFF_(helper_div_64_32);
1150extern Int VGOFF_(helper_idiv_32_16);
1151extern Int VGOFF_(helper_div_32_16);
1152extern Int VGOFF_(helper_idiv_16_8);
1153extern Int VGOFF_(helper_div_16_8);
1154
1155extern Int VGOFF_(helper_imul_32_64);
1156extern Int VGOFF_(helper_mul_32_64);
1157extern Int VGOFF_(helper_imul_16_32);
1158extern Int VGOFF_(helper_mul_16_32);
1159extern Int VGOFF_(helper_imul_8_16);
1160extern Int VGOFF_(helper_mul_8_16);
1161
1162extern Int VGOFF_(helper_CLD);
1163extern Int VGOFF_(helper_STD);
1164extern Int VGOFF_(helper_get_dirflag);
1165
1166extern Int VGOFF_(helper_CLC);
1167extern Int VGOFF_(helper_STC);
1168
1169extern Int VGOFF_(helper_shldl);
1170extern Int VGOFF_(helper_shldw);
1171extern Int VGOFF_(helper_shrdl);
1172extern Int VGOFF_(helper_shrdw);
1173
1174extern Int VGOFF_(helper_RDTSC);
1175extern Int VGOFF_(helper_CPUID);
1176
daywalkerb18d2532003-09-27 20:15:01 +00001177extern Int VGOFF_(helper_IN);
1178extern Int VGOFF_(helper_OUT);
1179
njn211b6ad2003-02-03 12:33:31 +00001180extern Int VGOFF_(helper_bsf);
1181extern Int VGOFF_(helper_bsr);
1182
1183extern Int VGOFF_(helper_fstsw_AX);
1184extern Int VGOFF_(helper_SAHF);
njnd6251f12003-06-03 13:38:51 +00001185extern Int VGOFF_(helper_LAHF);
njn211b6ad2003-02-03 12:33:31 +00001186extern Int VGOFF_(helper_DAS);
1187extern Int VGOFF_(helper_DAA);
1188
muellerf217c732004-01-02 22:42:29 +00001189extern Int VGOFF_(helper_cmpxchg8b);
1190
njn211b6ad2003-02-03 12:33:31 +00001191
njn25e49d8e72002-09-23 09:36:25 +00001192/*====================================================================*/
njnd5bb0a52002-09-27 10:24:48 +00001193/*=== Generating x86 code from UCode ===*/
njn25e49d8e72002-09-23 09:36:25 +00001194/*====================================================================*/
1195
njnd5bb0a52002-09-27 10:24:48 +00001196/* All this only necessary for skins with VG_(needs).extends_UCode == True. */
njn25e49d8e72002-09-23 09:36:25 +00001197
sewardje1042472002-09-30 12:33:11 +00001198/* This is the Intel register encoding -- integer regs. */
njn25e49d8e72002-09-23 09:36:25 +00001199#define R_EAX 0
1200#define R_ECX 1
1201#define R_EDX 2
1202#define R_EBX 3
1203#define R_ESP 4
1204#define R_EBP 5
1205#define R_ESI 6
1206#define R_EDI 7
1207
1208#define R_AL (0+R_EAX)
1209#define R_CL (0+R_ECX)
1210#define R_DL (0+R_EDX)
1211#define R_BL (0+R_EBX)
1212#define R_AH (4+R_EAX)
1213#define R_CH (4+R_ECX)
1214#define R_DH (4+R_EDX)
1215#define R_BH (4+R_EBX)
1216
sewardje1042472002-09-30 12:33:11 +00001217/* This is the Intel register encoding -- segment regs. */
1218#define R_ES 0
1219#define R_CS 1
1220#define R_SS 2
1221#define R_DS 3
1222#define R_FS 4
1223#define R_GS 5
1224
njn25e49d8e72002-09-23 09:36:25 +00001225/* For pretty printing x86 code */
daywalker5d945de2003-09-26 00:32:53 +00001226extern const Char* VG_(name_of_mmx_gran) ( UChar gran );
1227extern const Char* VG_(name_of_mmx_reg) ( Int mmxreg );
1228extern const Char* VG_(name_of_seg_reg) ( Int sreg );
1229extern const Char* VG_(name_of_int_reg) ( Int size, Int reg );
1230extern const Char VG_(name_of_int_size) ( Int size );
njn25e49d8e72002-09-23 09:36:25 +00001231
njnac6c1762002-10-04 14:34:15 +00001232/* Shorter macros for convenience */
sewardj3d7c9c82003-03-26 21:08:13 +00001233#define nameIReg VG_(name_of_int_reg)
1234#define nameISize VG_(name_of_int_size)
1235#define nameSReg VG_(name_of_seg_reg)
1236#define nameMMXReg VG_(name_of_mmx_reg)
1237#define nameMMXGran VG_(name_of_mmx_gran)
sewardjfebaa3b2003-05-25 01:07:34 +00001238#define nameXMMReg VG_(name_of_xmm_reg)
njnac6c1762002-10-04 14:34:15 +00001239
njn25e49d8e72002-09-23 09:36:25 +00001240/* Randomly useful things */
1241extern UInt VG_(extend_s_8to32) ( UInt x );
1242
1243/* Code emitters */
njn4ba5a792002-09-30 10:23:54 +00001244extern void VG_(emitB) ( UInt b );
1245extern void VG_(emitW) ( UInt w );
1246extern void VG_(emitL) ( UInt l );
sewardjfa492d42002-12-08 18:20:01 +00001247extern void VG_(new_emit) ( Bool upd_cc, FlagSet uses_flags, FlagSet sets_flags );
njn25e49d8e72002-09-23 09:36:25 +00001248
1249/* Finding offsets */
njn4ba5a792002-09-30 10:23:54 +00001250extern Int VG_(helper_offset) ( Addr a );
1251extern Int VG_(shadow_reg_offset) ( Int arch );
1252extern Int VG_(shadow_flags_offset) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001253
njnd5bb0a52002-09-27 10:24:48 +00001254/* Convert reg ranks <-> Intel register ordering, for using register
1255 liveness information. */
njn4ba5a792002-09-30 10:23:54 +00001256extern Int VG_(realreg_to_rank) ( Int realreg );
1257extern Int VG_(rank_to_realreg) ( Int rank );
njn25e49d8e72002-09-23 09:36:25 +00001258
njnd5bb0a52002-09-27 10:24:48 +00001259/* Call a subroutine. Does no argument passing, stack manipulations, etc. */
daywalker5d945de2003-09-26 00:32:53 +00001260extern void VG_(synth_call) ( Bool ensure_shortform, Int word_offset,
sewardjfa492d42002-12-08 18:20:01 +00001261 Bool upd_cc, FlagSet use_flags, FlagSet set_flags );
njn25e49d8e72002-09-23 09:36:25 +00001262
njnd5bb0a52002-09-27 10:24:48 +00001263/* For calling C functions -- saves caller save regs, pushes args, calls,
1264 clears the stack, restores caller save regs. `fn' must be registered in
1265 the baseBlock first. Acceptable tags are RealReg and Literal. Optimises
1266 things, eg. by not preserving non-live caller-save registers.
njn25e49d8e72002-09-23 09:36:25 +00001267
njnd5bb0a52002-09-27 10:24:48 +00001268 WARNING: a UInstr should *not* be translated with synth_ccall() followed
1269 by some other x86 assembly code; this will invalidate the results of
1270 vg_realreg_liveness_analysis() and everything will fall over. */
njn4ba5a792002-09-30 10:23:54 +00001271extern void VG_(synth_ccall) ( Addr fn, Int argc, Int regparms_n, UInt argv[],
daywalker5d945de2003-09-26 00:32:53 +00001272 Tag tagv[], Int ret_reg,
njn4ba5a792002-09-30 10:23:54 +00001273 RRegSet regs_live_before,
1274 RRegSet regs_live_after );
njn25e49d8e72002-09-23 09:36:25 +00001275
1276/* Addressing modes */
njn4ba5a792002-09-30 10:23:54 +00001277extern void VG_(emit_amode_offregmem_reg)( Int off, Int regmem, Int reg );
1278extern void VG_(emit_amode_ereg_greg) ( Int e_reg, Int g_reg );
njn25e49d8e72002-09-23 09:36:25 +00001279
1280/* v-size (4, or 2 with OSO) insn emitters */
njn4ba5a792002-09-30 10:23:54 +00001281extern void VG_(emit_movv_offregmem_reg) ( Int sz, Int off, Int areg, Int reg );
1282extern void VG_(emit_movv_reg_offregmem) ( Int sz, Int reg, Int off, Int areg );
1283extern void VG_(emit_movv_reg_reg) ( Int sz, Int reg1, Int reg2 );
sewardjfa492d42002-12-08 18:20:01 +00001284extern void VG_(emit_nonshiftopv_lit_reg)( Bool upd_cc, Int sz, Opcode opc, UInt lit,
njn4ba5a792002-09-30 10:23:54 +00001285 Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001286extern void VG_(emit_shiftopv_lit_reg) ( Bool upd_cc, Int sz, Opcode opc, UInt lit,
njn4ba5a792002-09-30 10:23:54 +00001287 Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001288extern void VG_(emit_nonshiftopv_reg_reg)( Bool upd_cc, Int sz, Opcode opc,
njn4ba5a792002-09-30 10:23:54 +00001289 Int reg1, Int reg2 );
1290extern void VG_(emit_movv_lit_reg) ( Int sz, UInt lit, Int reg );
sewardjfa492d42002-12-08 18:20:01 +00001291extern void VG_(emit_unaryopv_reg) ( Bool upd_cc, Int sz, Opcode opc, Int reg );
njn4ba5a792002-09-30 10:23:54 +00001292extern void VG_(emit_pushv_reg) ( Int sz, Int reg );
1293extern void VG_(emit_popv_reg) ( Int sz, Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001294
njn4ba5a792002-09-30 10:23:54 +00001295extern void VG_(emit_pushl_lit32) ( UInt int32 );
1296extern void VG_(emit_pushl_lit8) ( Int lit8 );
sewardjfa492d42002-12-08 18:20:01 +00001297extern void VG_(emit_cmpl_zero_reg) ( Bool upd_cc, Int reg );
njn4ba5a792002-09-30 10:23:54 +00001298extern void VG_(emit_swapl_reg_EAX) ( Int reg );
1299extern void VG_(emit_movv_lit_offregmem) ( Int sz, UInt lit, Int off,
1300 Int memreg );
njn25e49d8e72002-09-23 09:36:25 +00001301
1302/* b-size (1 byte) instruction emitters */
njn4ba5a792002-09-30 10:23:54 +00001303extern void VG_(emit_movb_lit_offregmem) ( UInt lit, Int off, Int memreg );
1304extern void VG_(emit_movb_reg_offregmem) ( Int reg, Int off, Int areg );
sewardjfa492d42002-12-08 18:20:01 +00001305extern void VG_(emit_unaryopb_reg) ( Bool upd_cc, Opcode opc, Int reg );
1306extern void VG_(emit_testb_lit_reg) ( Bool upd_cc, UInt lit, Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001307
1308/* zero-extended load emitters */
fitzhardinge98abfc72003-12-16 02:05:15 +00001309extern void VG_(emit_movzbl_offregmem_reg) ( Bool bounds, Int off, Int regmem, Int reg );
1310extern void VG_(emit_movzwl_offregmem_reg) ( Bool bounds, Int off, Int areg, Int reg );
1311extern void VG_(emit_movzwl_regmem_reg) ( Bool bounds, Int reg1, Int reg2 );
njn25e49d8e72002-09-23 09:36:25 +00001312
1313/* misc instruction emitters */
njn4ba5a792002-09-30 10:23:54 +00001314extern void VG_(emit_call_reg) ( Int reg );
1315extern void VG_(emit_add_lit_to_esp) ( Int lit );
njn4ba5a792002-09-30 10:23:54 +00001316extern void VG_(emit_pushal) ( void );
1317extern void VG_(emit_popal) ( void );
1318extern void VG_(emit_AMD_prefetch_reg) ( Int reg );
njn25e49d8e72002-09-23 09:36:25 +00001319
sewardja2113f92002-12-12 23:42:48 +00001320/* jump emitters */
1321extern void VG_(init_target) ( Int *tgt );
1322
1323extern void VG_(target_back) ( Int *tgt );
1324extern void VG_(target_forward) ( Int *tgt );
1325extern void VG_(emit_target_delta) ( Int *tgt );
1326
fitzhardinge462f4f92003-12-18 02:10:54 +00001327typedef enum {
1328 JP_NONE, /* no prediction */
1329 JP_TAKEN, /* predict taken */
1330 JP_NOT_TAKEN, /* predict not taken */
1331} JumpPred;
1332
1333extern void VG_(emit_jcondshort_delta) ( Bool simd_cc, Condcode cond, Int delta, JumpPred );
1334extern void VG_(emit_jcondshort_target)( Bool simd_cc, Condcode cond, Int *tgt, JumpPred );
sewardja2113f92002-12-12 23:42:48 +00001335
njn25e49d8e72002-09-23 09:36:25 +00001336
1337/*====================================================================*/
1338/*=== Execution contexts ===*/
1339/*====================================================================*/
1340
1341/* Generic resolution type used in a few different ways, such as deciding
1342 how closely to compare two errors for equality. */
daywalker5d945de2003-09-26 00:32:53 +00001343typedef
1344 enum { Vg_LowRes, Vg_MedRes, Vg_HighRes }
njn25e49d8e72002-09-23 09:36:25 +00001345 VgRes;
1346
1347typedef
1348 struct _ExeContext
1349 ExeContext;
1350
daywalker5d945de2003-09-26 00:32:53 +00001351/* Compare two ExeContexts. Number of callers considered depends on `res':
1352 Vg_LowRes: 2
1353 Vg_MedRes: 4
njnd5bb0a52002-09-27 10:24:48 +00001354 Vg_HighRes: all */
njn25e49d8e72002-09-23 09:36:25 +00001355extern Bool VG_(eq_ExeContext) ( VgRes res,
1356 ExeContext* e1, ExeContext* e2 );
1357
1358/* Print an ExeContext. */
1359extern void VG_(pp_ExeContext) ( ExeContext* );
1360
1361/* Take a snapshot of the client's stack. Search our collection of
1362 ExeContexts to see if we already have it, and if not, allocate a
njn6c846552003-09-16 07:41:43 +00001363 new one. Either way, return a pointer to the context. Context size
1364 controlled by --num-callers option.
daywalker5d945de2003-09-26 00:32:53 +00001365
njn72718642003-07-24 08:45:32 +00001366 If called from generated code, use VG_(get_current_tid)() to get the
1367 current ThreadId. If called from non-generated code, the current
daywalker5d945de2003-09-26 00:32:53 +00001368 ThreadId should be passed in by the core.
njn7b456f52003-05-19 11:16:50 +00001369*/
njn72718642003-07-24 08:45:32 +00001370extern ExeContext* VG_(get_ExeContext) ( ThreadId tid );
njn25e49d8e72002-09-23 09:36:25 +00001371
njn6c846552003-09-16 07:41:43 +00001372/* Get the nth EIP from the ExeContext. 0 is the EIP of the top function, 1
1373 is its caller, etc. Returns 0 if there isn't one, or if n is greater
1374 than VG_(clo_backtrace_size), set by the --num-callers option. */
1375extern Addr VG_(get_EIP_from_ExeContext) ( ExeContext* e, UInt n );
1376
sewardj499e3de2002-11-13 22:22:25 +00001377/* Just grab the client's EIP, as a much smaller and cheaper
njn72718642003-07-24 08:45:32 +00001378 indication of where they are. Use is basically same as for
daywalker5d945de2003-09-26 00:32:53 +00001379 VG_(get_ExeContext)() above.
njn72718642003-07-24 08:45:32 +00001380*/
1381extern Addr VG_(get_EIP)( ThreadId tid );
njn25e49d8e72002-09-23 09:36:25 +00001382
njn6c846552003-09-16 07:41:43 +00001383/* For skins needing more control over stack traces: walks the stack to get
1384 %eips from the top stack frames for thread 'tid'. Maximum of 'n_eips'
1385 addresses put into 'eips'; 0 is the top of the stack, 1 is its caller,
1386 etc. */
1387extern UInt VG_(stack_snapshot) ( ThreadId tid, Addr* eips, UInt n_eips );
1388
1389/* Does the same thing as VG_(pp_ExeContext)(), just with slightly
1390 different input. */
1391extern void VG_(mini_stack_dump) ( Addr eips[], UInt n_eips );
1392
njn211b6ad2003-02-03 12:33:31 +00001393
njn25e49d8e72002-09-23 09:36:25 +00001394/*====================================================================*/
1395/*=== Error reporting ===*/
1396/*====================================================================*/
1397
1398/* ------------------------------------------------------------------ */
daywalker5d945de2003-09-26 00:32:53 +00001399/* Suppressions describe errors which we want to suppress, ie, not
njn25e49d8e72002-09-23 09:36:25 +00001400 show the user, usually because it is caused by a problem in a library
daywalker5d945de2003-09-26 00:32:53 +00001401 which we can't fix, replace or work around. Suppressions are read from
njnd5bb0a52002-09-27 10:24:48 +00001402 a file at startup time. This gives flexibility so that new
njn25e49d8e72002-09-23 09:36:25 +00001403 suppressions can be added to the file as and when needed.
1404*/
1405
1406typedef
1407 Int /* Do not make this unsigned! */
1408 SuppKind;
1409
njn810086f2002-11-14 12:42:47 +00001410/* The skin-relevant parts of a suppression are:
1411 kind: what kind of suppression; must be in the range (0..)
1412 string: use is optional. NULL by default.
1413 extra: use is optional. NULL by default. void* so it's extensible.
njn25e49d8e72002-09-23 09:36:25 +00001414*/
1415typedef
njn810086f2002-11-14 12:42:47 +00001416 struct _Supp
1417 Supp;
1418
1419/* Useful in SK_(error_matches_suppression)() */
1420SuppKind VG_(get_supp_kind) ( Supp* su );
1421Char* VG_(get_supp_string) ( Supp* su );
1422void* VG_(get_supp_extra) ( Supp* su );
1423
1424/* Must be used in VG_(recognised_suppression)() */
1425void VG_(set_supp_kind) ( Supp* su, SuppKind suppkind );
1426/* May be used in VG_(read_extra_suppression_info)() */
1427void VG_(set_supp_string) ( Supp* su, Char* string );
1428void VG_(set_supp_extra) ( Supp* su, void* extra );
njn25e49d8e72002-09-23 09:36:25 +00001429
1430
1431/* ------------------------------------------------------------------ */
1432/* Error records contain enough info to generate an error report. The idea
1433 is that (typically) the same few points in the program generate thousands
njnd5bb0a52002-09-27 10:24:48 +00001434 of errors, and we don't want to spew out a fresh error message for each
1435 one. Instead, we use these structures to common up duplicates.
njn25e49d8e72002-09-23 09:36:25 +00001436*/
1437
1438typedef
1439 Int /* Do not make this unsigned! */
1440 ErrorKind;
1441
njn810086f2002-11-14 12:42:47 +00001442/* The skin-relevant parts of an Error are:
1443 kind: what kind of error; must be in the range (0..)
1444 addr: use is optional. 0 by default.
1445 string: use is optional. NULL by default.
1446 extra: use is optional. NULL by default. void* so it's extensible.
njn25e49d8e72002-09-23 09:36:25 +00001447*/
1448typedef
njn810086f2002-11-14 12:42:47 +00001449 struct _Error
1450 Error;
njn25e49d8e72002-09-23 09:36:25 +00001451
njn810086f2002-11-14 12:42:47 +00001452/* Useful in SK_(error_matches_suppression)(), SK_(pp_SkinError)(), etc */
njnb877d492003-01-28 20:40:57 +00001453ExeContext* VG_(get_error_where) ( Error* err );
1454SuppKind VG_(get_error_kind) ( Error* err );
1455Addr VG_(get_error_address) ( Error* err );
1456Char* VG_(get_error_string) ( Error* err );
1457void* VG_(get_error_extra) ( Error* err );
njn25e49d8e72002-09-23 09:36:25 +00001458
njnd5bb0a52002-09-27 10:24:48 +00001459/* Call this when an error occurs. It will be recorded if it hasn't been
njn25e49d8e72002-09-23 09:36:25 +00001460 seen before. If it has, the existing error record will have its count
daywalker5d945de2003-09-26 00:32:53 +00001461 incremented.
1462
njn72718642003-07-24 08:45:32 +00001463 'tid' can be found as for VG_(get_ExeContext)(). The `extra' field can
1464 be stack-allocated; it will be copied by the core if needed (but it
1465 won't be copied if it's NULL).
njnd5bb0a52002-09-27 10:24:48 +00001466
1467 If no 'a', 's' or 'extra' of interest needs to be recorded, just use
njn3e884182003-04-15 13:03:23 +00001468 NULL for them. */
daywalker5d945de2003-09-26 00:32:53 +00001469extern void VG_(maybe_record_error) ( ThreadId tid, ErrorKind ekind,
njn25e49d8e72002-09-23 09:36:25 +00001470 Addr a, Char* s, void* extra );
1471
njn43c799e2003-04-08 00:08:52 +00001472/* Similar to VG_(maybe_record_error)(), except this one doesn't record the
1473 error -- useful for errors that can only happen once. The errors can be
1474 suppressed, though. Return value is True if it was suppressed.
daywalker5d945de2003-09-26 00:32:53 +00001475 `print_error' dictates whether to print the error, which is a bit of a
njn43c799e2003-04-08 00:08:52 +00001476 hack that's useful sometimes if you just want to know if the error would
daywalker5d945de2003-09-26 00:32:53 +00001477 be suppressed without possibly printing it. `count_error' dictates
njn47363ab2003-04-21 13:24:40 +00001478 whether to add the error in the error total count (another mild hack). */
njn72718642003-07-24 08:45:32 +00001479extern Bool VG_(unique_error) ( ThreadId tid, ErrorKind ekind,
njn43c799e2003-04-08 00:08:52 +00001480 Addr a, Char* s, void* extra,
njn3e884182003-04-15 13:03:23 +00001481 ExeContext* where, Bool print_error,
njn47363ab2003-04-21 13:24:40 +00001482 Bool allow_GDB_attach, Bool count_error );
njn43c799e2003-04-08 00:08:52 +00001483
njn25e49d8e72002-09-23 09:36:25 +00001484/* Gets a non-blank, non-comment line of at most nBuf chars from fd.
daywalker5d945de2003-09-26 00:32:53 +00001485 Skips leading spaces on the line. Returns True if EOF was hit instead.
njn3e884182003-04-15 13:03:23 +00001486 Useful for reading in extra skin-specific suppression lines. */
njn4ba5a792002-09-30 10:23:54 +00001487extern Bool VG_(get_line) ( Int fd, Char* buf, Int nBuf );
njn25e49d8e72002-09-23 09:36:25 +00001488
1489
1490/*====================================================================*/
1491/*=== Obtaining debug information ===*/
1492/*====================================================================*/
1493
sewardj6e008cb2002-12-15 13:11:39 +00001494/* Get the file/function/line number of the instruction at address
1495 'a'. For these four, if debug info for the address is found, it
1496 copies the info into the buffer/UInt and returns True. If not, it
1497 returns False and nothing is copied. VG_(get_fnname) always
1498 demangles C++ function names. VG_(get_fnname_w_offset) is the
njn3e884182003-04-15 13:03:23 +00001499 same, except it appends "+N" to symbol names to indicate offsets. */
njn25e49d8e72002-09-23 09:36:25 +00001500extern Bool VG_(get_filename) ( Addr a, Char* filename, Int n_filename );
1501extern Bool VG_(get_fnname) ( Addr a, Char* fnname, Int n_fnname );
1502extern Bool VG_(get_linenum) ( Addr a, UInt* linenum );
daywalker5d945de2003-09-26 00:32:53 +00001503extern Bool VG_(get_fnname_w_offset)
sewardj6e008cb2002-12-15 13:11:39 +00001504 ( Addr a, Char* fnname, Int n_fnname );
njn25e49d8e72002-09-23 09:36:25 +00001505
1506/* This one is more efficient if getting both filename and line number,
1507 because the two lookups are done together. */
daywalker5d945de2003-09-26 00:32:53 +00001508extern Bool VG_(get_filename_linenum)
njn25e49d8e72002-09-23 09:36:25 +00001509 ( Addr a, Char* filename, Int n_filename,
1510 UInt* linenum );
1511
1512/* Succeeds only if we find from debug info that 'a' is the address of the
1513 first instruction in a function -- as opposed to VG_(get_fnname) which
1514 succeeds if we find from debug info that 'a' is the address of any
1515 instruction in a function. Use this to instrument the start of
njnd5bb0a52002-09-27 10:24:48 +00001516 a particular function. Nb: if an executable/shared object is stripped
njn25e49d8e72002-09-23 09:36:25 +00001517 of its symbols, this function will not be able to recognise function
1518 entry points within it. */
njn497ec3f2003-05-19 08:38:23 +00001519extern Bool VG_(get_fnname_if_entry) ( Addr a, Char* fnname, Int n_fnname );
njn25e49d8e72002-09-23 09:36:25 +00001520
1521/* Succeeds if the address is within a shared object or the main executable.
1522 It doesn't matter if debug info is present or not. */
1523extern Bool VG_(get_objname) ( Addr a, Char* objname, Int n_objname );
1524
njn6c846552003-09-16 07:41:43 +00001525/* Puts into 'buf' info about the code address %eip: the address, function
1526 name (if known) and filename/line number (if known), like this:
1527
1528 0x4001BF05: realloc (vg_replace_malloc.c:339)
1529
1530 'n_buf' gives length of 'buf'. Returns 'buf'.
1531*/
1532extern Char* VG_(describe_eip)(Addr eip, Char* buf, Int n_buf);
1533
jsgfcb1d1c02003-10-14 21:55:10 +00001534/* Returns a string containing an expression for the given
1535 address. String is malloced with VG_(malloc)() */
1536Char *VG_(describe_addr)(ThreadId, Addr);
1537
sewardj47104382002-10-20 18:35:48 +00001538/* A way to get information about what segments are mapped */
1539typedef struct _SegInfo SegInfo;
1540
njnb877d492003-01-28 20:40:57 +00001541/* Returns NULL if the SegInfo isn't found. It doesn't matter if debug info
1542 is present or not. */
1543extern SegInfo* VG_(get_obj) ( Addr a );
1544
1545extern const SegInfo* VG_(next_seginfo) ( const SegInfo *seg );
1546extern Addr VG_(seg_start) ( const SegInfo *seg );
1547extern UInt VG_(seg_size) ( const SegInfo *seg );
1548extern const UChar* VG_(seg_filename) ( const SegInfo *seg );
1549extern UInt VG_(seg_sym_offset)( const SegInfo *seg );
sewardj47104382002-10-20 18:35:48 +00001550
1551typedef
1552 enum {
1553 Vg_SectUnknown,
1554 Vg_SectText,
sewardj8fe15a32002-10-20 19:29:21 +00001555 Vg_SectData,
1556 Vg_SectBSS,
sewardj47104382002-10-20 18:35:48 +00001557 Vg_SectGOT,
sewardj8fe15a32002-10-20 19:29:21 +00001558 Vg_SectPLT,
sewardj47104382002-10-20 18:35:48 +00001559 }
1560 VgSectKind;
1561
1562extern VgSectKind VG_(seg_sect_kind)(Addr);
1563
njn25e49d8e72002-09-23 09:36:25 +00001564
1565/*====================================================================*/
njn3e884182003-04-15 13:03:23 +00001566/*=== Generic hash table ===*/
njn25e49d8e72002-09-23 09:36:25 +00001567/*====================================================================*/
1568
njn3e884182003-04-15 13:03:23 +00001569/* Generic type for a separately-chained hash table. Via a kind of dodgy
1570 C-as-C++ style inheritance, skins can extend the VgHashNode type, so long
1571 as the first two fields match the sizes of these two fields. Requires
1572 a bit of casting by the skin. */
njn25e49d8e72002-09-23 09:36:25 +00001573typedef
njn3e884182003-04-15 13:03:23 +00001574 struct _VgHashNode {
1575 struct _VgHashNode * next;
1576 UInt key;
1577 }
1578 VgHashNode;
njn25e49d8e72002-09-23 09:36:25 +00001579
njn3e884182003-04-15 13:03:23 +00001580typedef
1581 VgHashNode**
1582 VgHashTable;
njn810086f2002-11-14 12:42:47 +00001583
njn3e884182003-04-15 13:03:23 +00001584/* Make a new table. */
1585extern VgHashTable VG_(HT_construct) ( void );
1586
njn69c06872003-09-30 15:43:51 +00001587/* Count the number of nodes in a table. */
1588extern Int VG_(HT_count_nodes) ( VgHashTable table );
1589
njn3e884182003-04-15 13:03:23 +00001590/* Add a node to the table. */
1591extern void VG_(HT_add_node) ( VgHashTable t, VgHashNode* node );
1592
daywalker5d945de2003-09-26 00:32:53 +00001593/* Looks up a node in the hash table. Also returns the address of the
njn3e884182003-04-15 13:03:23 +00001594 previous node's `next' pointer which allows it to be removed from the
1595 list later without having to look it up again. */
1596extern VgHashNode* VG_(HT_get_node) ( VgHashTable t, UInt key,
1597 /*OUT*/VgHashNode*** next_ptr );
1598
njn06072ec2003-09-30 15:35:13 +00001599/* Allocates an array of pointers to all the shadow chunks of malloc'd
1600 blocks. Must be freed with VG_(free)(). */
1601extern VgHashNode** VG_(HT_to_array) ( VgHashTable t, /*OUT*/ UInt* n_shadows );
njn3e884182003-04-15 13:03:23 +00001602
1603/* Returns first node that matches predicate `p', or NULL if none do.
1604 Extra arguments can be implicitly passed to `p' using nested functions;
1605 see memcheck/mc_errcontext.c for an example. */
1606extern VgHashNode* VG_(HT_first_match) ( VgHashTable t,
1607 Bool (*p)(VgHashNode*) );
1608
1609/* Applies a function f() once to each node. Again, nested functions
1610 can be very useful. */
1611extern void VG_(HT_apply_to_all_nodes)( VgHashTable t, void (*f)(VgHashNode*) );
1612
1613/* Destroy a table. */
1614extern void VG_(HT_destruct) ( VgHashTable t );
njn810086f2002-11-14 12:42:47 +00001615
1616
njn3e884182003-04-15 13:03:23 +00001617/*====================================================================*/
fitzhardinge98abfc72003-12-16 02:05:15 +00001618/*=== A generic skiplist ===*/
1619/*====================================================================*/
1620
1621/*
1622 The idea here is that the skiplist puts its per-element data at the
1623 end of the structure. When you initialize the skiplist, you tell
1624 it what structure your list elements are going to be. Then you
1625 should allocate them with VG_(SkipNode_Alloc), which will allocate
1626 enough memory for the extra bits.
1627 */
1628#include <stddef.h> /* for offsetof */
1629
1630typedef struct _SkipList SkipList;
1631typedef struct _SkipNode SkipNode;
1632
1633typedef Int (*SkipCmp_t)(const void *key1, const void *key2);
1634
1635struct _SkipList {
1636 const Short arena; /* allocation arena */
1637 const UShort size; /* structure size (not including SkipNode) */
1638 const UShort keyoff; /* key offset */
1639 const SkipCmp_t cmp; /* compare two keys */
1640 Char * (*strkey)(void *); /* stringify a key (for debugging) */
1641 SkipNode *head; /* list head */
1642};
1643
1644/* Use this macro to initialize your skiplist head. The arguments are pretty self explanitory:
1645 _type is the type of your element structure
1646 _key is the field within that type which you want to use as the key
1647 _cmp is the comparison function for keys - it gets two typeof(_key) pointers as args
1648 _strkey is a function which can return a string of your key - it's only used for debugging
1649 _arena is the arena to use for allocation - -1 is the default
1650 */
1651#define SKIPLIST_INIT(_type, _key, _cmp, _strkey, _arena) \
1652 { \
1653 .arena = _arena, \
1654 .size = sizeof(_type), \
1655 .keyoff = offsetof(_type, _key), \
1656 .cmp = _cmp, \
1657 .strkey = _strkey, \
1658 .head = NULL, \
1659 }
1660
1661/* List operations:
1662 SkipList_Find searchs a list. If it can't find an exact match, it either returns NULL
1663 or a pointer to the element before where k would go
1664 SkipList_Insert inserts a new element into the list. Duplicates are forbidden.
1665 SkipList_Remove removes an element from the list and returns it. It doesn't free the memory.
1666 */
1667extern void *VG_(SkipList_Find) (const SkipList *l, void *key);
1668extern void VG_(SkipList_Insert)( SkipList *l, void *data);
1669extern void *VG_(SkipList_Remove)( SkipList *l, void *key);
1670
1671/* Node (element) operations:
1672 SkipNode_Alloc: allocate memory for a new element on the list
1673 SkipNode_Free: free memory allocated above
1674 SkipNode_First: return the first element on the list
1675 SkipNode_Next: return the next element after "data" on the list -
1676 NULL for none
1677 */
1678extern void *VG_(SkipNode_Alloc) (const SkipList *l);
1679extern void VG_(SkipNode_Free) (const SkipList *l, void *p);
1680extern void *VG_(SkipNode_First) (const SkipList *l);
1681extern void *VG_(SkipNode_Next) (const SkipList *l, void *data);
1682
1683/*====================================================================*/
njnd3040452003-05-19 15:04:06 +00001684/*=== Functions for shadow registers ===*/
1685/*====================================================================*/
1686
1687/* Nb: make sure the shadow_regs 'need' is set before using these! */
1688
1689/* This one lets you override the shadow of the return value register for a
1690 syscall. Call it from SK_(post_syscall)() (not SK_(pre_syscall)()!) to
1691 override the default shadow register value. */
daywalker5d945de2003-09-26 00:32:53 +00001692extern void VG_(set_return_from_syscall_shadow) ( ThreadId tid,
njnd3040452003-05-19 15:04:06 +00001693 UInt ret_shadow );
1694
1695/* This can be called from SK_(fini)() to find the shadow of the argument
1696 to exit(), ie. the shadow of the program's return value. */
1697extern UInt VG_(get_exit_status_shadow) ( void );
1698
1699
1700/*====================================================================*/
njn3e884182003-04-15 13:03:23 +00001701/*=== General stuff for replacing functions ===*/
1702/*====================================================================*/
njn25e49d8e72002-09-23 09:36:25 +00001703
njn3e884182003-04-15 13:03:23 +00001704/* Some skins need to replace the standard definitions of some functions. */
njn25e49d8e72002-09-23 09:36:25 +00001705
njn3e884182003-04-15 13:03:23 +00001706/* ------------------------------------------------------------------ */
1707/* General stuff, for replacing any functions */
njn25e49d8e72002-09-23 09:36:25 +00001708
daywalker5d945de2003-09-26 00:32:53 +00001709/* Is the client running on the simulated CPU or the real one?
njn25e49d8e72002-09-23 09:36:25 +00001710
njn3e884182003-04-15 13:03:23 +00001711 Nb: If it is, and you want to call a function to be run on the real CPU,
njn057c65f2003-04-21 13:30:55 +00001712 use one of the VALGRIND_NON_SIMD_CALL[123] macros in valgrind.h to call it.
njn25e49d8e72002-09-23 09:36:25 +00001713
daywalker5d945de2003-09-26 00:32:53 +00001714 Nb: don't forget the function parentheses when using this in a
njn3e884182003-04-15 13:03:23 +00001715 condition... write this:
1716
1717 if (VG_(is_running_on_simd_CPU)()) { ... } // calls function
1718
1719 not this:
daywalker5d945de2003-09-26 00:32:53 +00001720
njn3e884182003-04-15 13:03:23 +00001721 if (VG_(is_running_on_simd_CPU)) { ... } // address of var!
1722*/
daywalker5d945de2003-09-26 00:32:53 +00001723extern Bool VG_(is_running_on_simd_CPU) ( void );
njn3e884182003-04-15 13:03:23 +00001724
1725
1726/*====================================================================*/
1727/*=== Specific stuff for replacing malloc() and friends ===*/
1728/*====================================================================*/
1729
fitzhardinge98abfc72003-12-16 02:05:15 +00001730/* If a skin replaces malloc() et al, the easiest way to do so is to
1731 link with vg_replace_malloc.o into its vgpreload_*.so file, and
1732 follow the following instructions. You can do it from scratch,
1733 though, if you enjoy that sort of thing. */
njn3e884182003-04-15 13:03:23 +00001734
1735/* Arena size for valgrind's own malloc(); default value is 0, but can
1736 be overridden by skin -- but must be done so *statically*, eg:
daywalker5d945de2003-09-26 00:32:53 +00001737
njn3e884182003-04-15 13:03:23 +00001738 Int VG_(vg_malloc_redzone_szB) = 4;
daywalker5d945de2003-09-26 00:32:53 +00001739
njn3e884182003-04-15 13:03:23 +00001740 It can't be done from a function like SK_(pre_clo_init)(). So it can't,
1741 for example, be controlled with a command line option, unfortunately. */
1742extern UInt VG_(vg_malloc_redzone_szB);
1743
njn3e884182003-04-15 13:03:23 +00001744/* Can be called from SK_(malloc) et al to do the actual alloc/freeing. */
daywalker5d945de2003-09-26 00:32:53 +00001745extern void* VG_(cli_malloc) ( UInt align, Int nbytes );
njn3e884182003-04-15 13:03:23 +00001746extern void VG_(cli_free) ( void* p );
1747
1748/* Check if an address is within a range, allowing for redzones at edges */
1749extern Bool VG_(addr_is_in_block)( Addr a, Addr start, UInt size );
1750
1751/* ------------------------------------------------------------------ */
daywalker5d945de2003-09-26 00:32:53 +00001752/* Some options that can be used by a skin if malloc() et al are replaced.
njnd3040452003-05-19 15:04:06 +00001753 The skin should call the functions in the appropriate places to give
1754 control over these aspects of Valgrind's version of malloc(). */
njn3e884182003-04-15 13:03:23 +00001755
1756/* Round malloc sizes upwards to integral number of words? default: NO */
1757extern Bool VG_(clo_sloppy_malloc);
1758/* DEBUG: print malloc details? default: NO */
1759extern Bool VG_(clo_trace_malloc);
1760/* Minimum alignment in functions that don't specify alignment explicitly.
1761 default: 0, i.e. use default of the machine (== 4) */
1762extern Int VG_(clo_alignment);
1763
1764extern Bool VG_(replacement_malloc_process_cmd_line_option) ( Char* arg );
1765extern void VG_(replacement_malloc_print_usage) ( void );
1766extern void VG_(replacement_malloc_print_debug_usage) ( void );
sewardja4495682002-10-21 07:29:59 +00001767
1768
njn25e49d8e72002-09-23 09:36:25 +00001769/*====================================================================*/
1770/*=== Skin-specific stuff ===*/
1771/*====================================================================*/
1772
njnd04b7c62002-10-03 14:05:52 +00001773/* ------------------------------------------------------------------ */
1774/* Details */
njnd04b7c62002-10-03 14:05:52 +00001775
njn120281f2003-02-03 12:20:07 +00001776/* Default value for avg_translations_sizeB (in bytes), indicating typical
1777 code expansion of about 6:1. */
1778#define VG_DEFAULT_TRANS_SIZEB 100
1779
njn810086f2002-11-14 12:42:47 +00001780/* Information used in the startup message. `name' also determines the
1781 string used for identifying suppressions in a suppression file as
1782 belonging to this skin. `version' can be NULL, in which case (not
1783 surprisingly) no version info is printed; this mechanism is designed for
1784 skins distributed with Valgrind that share a version number with
1785 Valgrind. Other skins not distributed as part of Valgrind should
sewardjc0d8f682002-11-30 00:49:43 +00001786 probably have their own version number. */
1787extern void VG_(details_name) ( Char* name );
1788extern void VG_(details_version) ( Char* version );
1789extern void VG_(details_description) ( Char* description );
1790extern void VG_(details_copyright_author) ( Char* copyright_author );
1791
1792/* Average size of a translation, in bytes, so that the translation
njn120281f2003-02-03 12:20:07 +00001793 storage machinery can allocate memory appropriately. Not critical,
daywalker5d945de2003-09-26 00:32:53 +00001794 setting is optional. */
njn120281f2003-02-03 12:20:07 +00001795extern void VG_(details_avg_translation_sizeB) ( UInt size );
njnd04b7c62002-10-03 14:05:52 +00001796
njn810086f2002-11-14 12:42:47 +00001797/* String printed if an `sk_assert' assertion fails or VG_(skin_panic)
1798 is called. Should probably be an email address. */
1799extern void VG_(details_bug_reports_to) ( Char* bug_reports_to );
njnd04b7c62002-10-03 14:05:52 +00001800
1801/* ------------------------------------------------------------------ */
1802/* Needs */
1803
njn810086f2002-11-14 12:42:47 +00001804/* Booleans that decide core behaviour, but don't require extra
1805 operations to be defined if `True' */
njnd5bb0a52002-09-27 10:24:48 +00001806
njn810086f2002-11-14 12:42:47 +00001807/* Should __libc_freeres() be run? Bugs in it can crash the skin. */
1808extern void VG_(needs_libc_freeres) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001809
njn810086f2002-11-14 12:42:47 +00001810/* Want to have errors detected by Valgrind's core reported? Includes:
1811 - pthread API errors (many; eg. unlocking a non-locked mutex)
njn810086f2002-11-14 12:42:47 +00001812 - invalid file descriptors to blocking syscalls read() and write()
1813 - bad signal numbers passed to sigaction()
daywalker5d945de2003-09-26 00:32:53 +00001814 - attempt to install signal handler for SIGKILL or SIGSTOP */
njn810086f2002-11-14 12:42:47 +00001815extern void VG_(needs_core_errors) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001816
njn810086f2002-11-14 12:42:47 +00001817/* Booleans that indicate extra operations are defined; if these are True,
1818 the corresponding template functions (given below) must be defined. A
1819 lot like being a member of a type class. */
njn25e49d8e72002-09-23 09:36:25 +00001820
njn810086f2002-11-14 12:42:47 +00001821/* Want to report errors from skin? This implies use of suppressions, too. */
1822extern void VG_(needs_skin_errors) ( void );
njnd5bb0a52002-09-27 10:24:48 +00001823
njn810086f2002-11-14 12:42:47 +00001824/* Is information kept about specific individual basic blocks? (Eg. for
1825 cachegrind there are cost-centres for every instruction, stored at a
1826 basic block level.) If so, it sometimes has to be discarded, because
1827 .so mmap/munmap-ping or self-modifying code (informed by the
1828 DISCARD_TRANSLATIONS user request) can cause one instruction address
1829 to be used for more than one instruction in one program run... */
1830extern void VG_(needs_basic_block_discards) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001831
njn810086f2002-11-14 12:42:47 +00001832/* Skin maintains information about each register? */
1833extern void VG_(needs_shadow_regs) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001834
njn810086f2002-11-14 12:42:47 +00001835/* Skin defines its own command line options? */
1836extern void VG_(needs_command_line_options) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001837
njn810086f2002-11-14 12:42:47 +00001838/* Skin defines its own client requests? */
1839extern void VG_(needs_client_requests) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001840
njn810086f2002-11-14 12:42:47 +00001841/* Skin defines its own UInstrs? */
1842extern void VG_(needs_extended_UCode) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001843
njn810086f2002-11-14 12:42:47 +00001844/* Skin does stuff before and/or after system calls? */
1845extern void VG_(needs_syscall_wrapper) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001846
njn810086f2002-11-14 12:42:47 +00001847/* Are skin-state sanity checks performed? */
1848extern void VG_(needs_sanity_checks) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001849
njn810086f2002-11-14 12:42:47 +00001850/* Do we need to see data symbols? */
1851extern void VG_(needs_data_syms) ( void );
njn25e49d8e72002-09-23 09:36:25 +00001852
fitzhardinge98abfc72003-12-16 02:05:15 +00001853/* Does the skin need shadow memory allocated (if you set this, you must also statically initialize
1854 float SK_(shadow_ratio) = n./m;
1855 to define how many shadow bits you need per client address space bit.
1856*/
1857extern void VG_(needs_shadow_memory)( void );
1858extern float SK_(shadow_ratio);
1859
njn25e49d8e72002-09-23 09:36:25 +00001860/* ------------------------------------------------------------------ */
1861/* Core events to track */
1862
1863/* Part of the core from which this call was made. Useful for determining
njnd5bb0a52002-09-27 10:24:48 +00001864 what kind of error message should be emitted. */
daywalker5d945de2003-09-26 00:32:53 +00001865typedef
njn25e49d8e72002-09-23 09:36:25 +00001866 enum { Vg_CorePThread, Vg_CoreSignal, Vg_CoreSysCall, Vg_CoreTranslate }
1867 CorePart;
1868
njn4ba5a792002-09-30 10:23:54 +00001869/* Useful to use in VG_(get_Xreg_usage)() */
njn810086f2002-11-14 12:42:47 +00001870#define VG_UINSTR_READS_REG(ono,regs,isWrites) \
njn25e49d8e72002-09-23 09:36:25 +00001871 { if (mycat(u->tag,ono) == tag) \
njn810086f2002-11-14 12:42:47 +00001872 { regs[n] = mycat(u->val,ono); \
1873 isWrites[n] = False; \
njn25e49d8e72002-09-23 09:36:25 +00001874 n++; \
1875 } \
1876 }
njn810086f2002-11-14 12:42:47 +00001877#define VG_UINSTR_WRITES_REG(ono,regs,isWrites) \
njnd5bb0a52002-09-27 10:24:48 +00001878 { if (mycat(u->tag,ono) == tag) \
njn810086f2002-11-14 12:42:47 +00001879 { regs[n] = mycat(u->val,ono); \
1880 isWrites[n] = True; \
njnd5bb0a52002-09-27 10:24:48 +00001881 n++; \
1882 } \
njn25e49d8e72002-09-23 09:36:25 +00001883 }
1884
fitzhardinge98abfc72003-12-16 02:05:15 +00001885#endif /* NDEF __VG_SKIN_H */
njn25e49d8e72002-09-23 09:36:25 +00001886
fitzhardinge98abfc72003-12-16 02:05:15 +00001887/* gen_toolint.pl will put the VG_(init_*)() functions here: */