blob: 1a36f158aac92843cd2a011c85b73669c4be4c7f [file] [log] [blame]
njn43b9a8a2005-05-10 04:37:01 +00001
2/*--------------------------------------------------------------------*/
3/*--- The core/tool interface. pub_tool_tooliface.h ---*/
4/*--------------------------------------------------------------------*/
5
6/*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
njn9f207462009-03-10 22:02:09 +000010 Copyright (C) 2000-2009 Julian Seward
njn43b9a8a2005-05-10 04:37:01 +000011 jseward@acm.org
12
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 02111-1307, USA.
27
28 The GNU General Public License is contained in the file COPYING.
29*/
30
31#ifndef __PUB_TOOL_TOOLIFACE_H
32#define __PUB_TOOL_TOOLIFACE_H
33
njnacd885a2005-05-16 20:40:51 +000034#include "pub_tool_errormgr.h" // for Error, Supp
njn0fc5cbd2006-10-18 21:50:26 +000035#include "libvex.h" // for all Vex stuff
njnacd885a2005-05-16 20:40:51 +000036
njn43b9a8a2005-05-10 04:37:01 +000037/* ------------------------------------------------------------------ */
38/* The interface version */
39
njn08ce7b32009-02-27 03:38:28 +000040/* Initialise tool. Must do the following:
41 - initialise the `details' struct, via the VG_(details_*)() functions
42 - register the basic tool functions, via VG_(basic_tool_funcs)().
43 May do the following:
44 - initialise the `needs' struct to indicate certain requirements, via
45 the VG_(needs_*)() functions
46 - any other tool-specific initialisation
47*/
48extern void (*VG_(tl_pre_clo_init)) ( void );
njn43b9a8a2005-05-10 04:37:01 +000049
njn08ce7b32009-02-27 03:38:28 +000050/* Every tool must include this macro somewhere, exactly once. The
51 interface version is no longer relevant, but we kept the same name
52 to avoid requiring changes to tools.
53*/
54#define VG_DETERMINE_INTERFACE_VERSION(pre_clo_init) \
55 void (*VG_(tl_pre_clo_init)) ( void ) = pre_clo_init;
njn43b9a8a2005-05-10 04:37:01 +000056
57/* ------------------------------------------------------------------ */
58/* Basic tool functions */
59
sewardj461df9c2006-01-17 02:06:39 +000060/* The tool_instrument function is passed as a callback to
sewardj7ce62392006-10-15 12:48:18 +000061 LibVEX_Translate. VgCallbackClosure carries additional info
sewardj461df9c2006-01-17 02:06:39 +000062 which the instrumenter might like to know, but which is opaque to
63 Vex.
64*/
65typedef
66 struct {
67 Addr64 nraddr; /* non-redirected guest address */
68 Addr64 readdr; /* redirected guest address */
69 ThreadId tid; /* tid requesting translation */
70 }
71 VgCallbackClosure;
72
njn43b9a8a2005-05-10 04:37:01 +000073extern void VG_(basic_tool_funcs)(
74 // Do any initialisation that can only be done after command line
75 // processing.
76 void (*post_clo_init)(void),
77
sewardj4ba057c2005-10-18 12:04:18 +000078 // Instrument a basic block. Must be a true function, ie. the same
79 // input always results in the same output, because basic blocks
sewardj7ce62392006-10-15 12:48:18 +000080 // can be retranslated, unless you're doing something really
81 // strange. Anyway, the arguments. Mostly they are straightforward
82 // except for the distinction between redirected and non-redirected
83 // guest code addresses, which is important to understand.
84 //
85 // VgCallBackClosure* closure contains extra arguments passed
86 // from Valgrind to the instrumenter, which Vex doesn't know about.
87 // You are free to look inside this structure.
88 //
89 // * closure->tid is the ThreadId of the thread requesting the
90 // translation. Not sure why this is here; perhaps callgrind
91 // uses it.
92 //
93 // * closure->nraddr is the non-redirected guest address of the
94 // start of the translation. In other words, the translation is
95 // being constructed because the guest program jumped to
96 // closure->nraddr but no translation of it was found.
97 //
98 // * closure->readdr is the redirected guest address, from which
99 // the translation was really made.
100 //
101 // To clarify this, consider what happens when, in Memcheck, the
102 // first call to malloc() happens. The guest program will be
103 // trying to jump to malloc() in libc; hence ->nraddr will contain
104 // that address. However, Memcheck intercepts and replaces
105 // malloc, hence ->readdr will be the address of Memcheck's
106 // malloc replacement in
107 // coregrind/m_replacemalloc/vg_replacemalloc.c. It follows
108 // that the first IMark in the translation will be labelled as
109 // from ->readdr rather than ->nraddr.
110 //
111 // Since most functions are not redirected, the majority of the
112 // time ->nraddr will be the same as ->readdr. However, you
113 // cannot assume this: if your tool has metadata associated
114 // with code addresses it will get into deep trouble if it does
115 // make this assumption.
116 //
sewardj0b9d74a2006-12-24 02:24:11 +0000117 // IRSB* sb_in is the incoming superblock to be instrumented,
118 // in flat IR form.
sewardj7ce62392006-10-15 12:48:18 +0000119 //
120 // VexGuestLayout* layout contains limited info on the layout of
121 // the guest state: where the stack pointer and program counter
122 // are, and which fields should be regarded as 'always defined'.
123 // Memcheck uses this.
124 //
125 // VexGuestExtents* vge points to a structure which states the
126 // precise byte ranges of original code from which this translation
127 // was made (there may be up to three different ranges involved).
128 // Note again that these are the real addresses from which the code
129 // came. And so it should be the case that closure->readdr is the
130 // same as vge->base[0]; indeed Cachegrind contains this assertion.
131 //
132 // Tools which associate shadow data with code addresses
133 // (cachegrind, callgrind) need to be particularly clear about
134 // whether they are making the association with redirected or
135 // non-redirected code addresses. Both approaches are viable
136 // but you do need to understand what's going on. See comments
137 // below on discard_basic_block_info().
138 //
139 // IRType gWordTy and IRType hWordTy contain the types of native
140 // words on the guest (simulated) and host (real) CPUs. They will
141 // by either Ity_I32 or Ity_I64. So far we have never built a
142 // cross-architecture Valgrind so they should always be the same.
143 //
sewardjc87b5ec2006-10-15 13:46:18 +0000144 /* --- Further comments about the IR that your --- */
145 /* --- instrumentation function will receive. --- */
146 /*
njna3cc29f2007-02-05 23:23:55 +0000147 In the incoming IRSB, the IR for each instruction begins with an
sewardjc87b5ec2006-10-15 13:46:18 +0000148 IRStmt_IMark, which states the address and length of the
149 instruction from which this IR came. This makes it easy for
150 profiling-style tools to know precisely which guest code
151 addresses are being executed.
152
153 However, before the first IRStmt_IMark, there may be other IR
154 statements -- a preamble. In most cases this preamble is empty,
155 but when it isn't, what it contains is some supporting IR that
156 the JIT uses to ensure control flow works correctly. This
157 preamble does not modify any architecturally defined guest state
158 (registers or memory) and so does not contain anything that will
159 be of interest to your tool.
160
161 You should therefore
162
163 (1) copy any IR preceding the first IMark verbatim to the start
njna3cc29f2007-02-05 23:23:55 +0000164 of the output IRSB.
sewardjc87b5ec2006-10-15 13:46:18 +0000165
166 (2) not try to instrument it or modify it in any way.
167
168 For the record, stuff that may be in the preamble at
169 present is:
170
171 - A self-modifying-code check has been requested for this block.
172 The preamble will contain instructions to checksum the block,
173 compare against the expected value, and exit the dispatcher
174 requesting a discard (hence forcing a retranslation) if they
175 don't match.
176
177 - This block is known to be the entry point of a wrapper of some
sewardj358ebea2006-10-15 13:47:43 +0000178 function F. In this case the preamble contains code to write
sewardjc87b5ec2006-10-15 13:46:18 +0000179 the address of the original F (the fn being wrapped) into a
180 'hidden' guest state register _NRADDR. The wrapper can later
181 read this register using a client request and make a
182 non-redirected call to it using another client-request-like
183 magic macro.
184
185 - For platforms that use the AIX ABI (including ppc64-linux), it
sewardj358ebea2006-10-15 13:47:43 +0000186 is necessary to have a preamble even for replacement functions
187 (not just for wrappers), because it is necessary to switch the
188 R2 register (constant-pool pointer) to a different value when
189 swizzling the program counter.
sewardjc87b5ec2006-10-15 13:46:18 +0000190
191 Hence the preamble pushes both R2 and LR (the return address)
192 on a small 16-entry stack in the guest state and sets R2 to an
193 appropriate value for the wrapper/replacement fn. LR is then
194 set so that the wrapper/replacement fn returns to a magic IR
195 stub which restores R2 and LR and returns.
196
197 It's all hugely ugly and fragile. And it places a stringent
198 requirement on m_debuginfo to find out the correct R2 (toc
199 pointer) value for the wrapper/replacement function. So much
200 so that m_redir will refuse to honour a redirect-to-me request
201 if it cannot find (by asking m_debuginfo) a plausible R2 value
202 for 'me'.
203
204 Because this mechanism maintains a shadow stack of (R2,LR)
205 pairs in the guest state, it will fail if the
206 wrapper/redirection function, or anything it calls, longjumps
207 out past the wrapper, because then the magic return stub will
208 not be run and so the shadow stack will not be popped. So it
209 will quickly fill up. Fortunately none of this applies to
210 {x86,amd64,ppc32}-linux; on those platforms, wrappers can
211 longjump and recurse arbitrarily and everything should work
212 fine.
sewardjf1962d32006-10-19 13:22:16 +0000213
214 Note that copying the preamble verbatim may cause complications
215 for your instrumenter if you shadow IR temporaries. See big
216 comment in MC_(instrument) in memcheck/mc_translate.c for
217 details.
sewardjc87b5ec2006-10-15 13:46:18 +0000218 */
sewardj0b9d74a2006-12-24 02:24:11 +0000219 IRSB*(*instrument)(VgCallbackClosure* closure,
220 IRSB* sb_in,
sewardj7ce62392006-10-15 12:48:18 +0000221 VexGuestLayout* layout,
222 VexGuestExtents* vge,
223 IRType gWordTy,
224 IRType hWordTy),
njn43b9a8a2005-05-10 04:37:01 +0000225
226 // Finish up, print out any results, etc. `exitcode' is program's exit
227 // code. The shadow can be found with VG_(get_exit_status_shadow)().
228 void (*fini)(Int)
229);
230
231/* ------------------------------------------------------------------ */
232/* Details */
233
234/* Default value for avg_translations_sizeB (in bytes), indicating typical
235 code expansion of about 6:1. */
sewardj9644cfd2006-10-17 02:25:50 +0000236#define VG_DEFAULT_TRANS_SIZEB 172
njn43b9a8a2005-05-10 04:37:01 +0000237
238/* Information used in the startup message. `name' also determines the
239 string used for identifying suppressions in a suppression file as
240 belonging to this tool. `version' can be NULL, in which case (not
241 surprisingly) no version info is printed; this mechanism is designed for
242 tools distributed with Valgrind that share a version number with
243 Valgrind. Other tools not distributed as part of Valgrind should
244 probably have their own version number. */
245extern void VG_(details_name) ( Char* name );
246extern void VG_(details_version) ( Char* version );
247extern void VG_(details_description) ( Char* description );
248extern void VG_(details_copyright_author) ( Char* copyright_author );
249
250/* Average size of a translation, in bytes, so that the translation
251 storage machinery can allocate memory appropriately. Not critical,
252 setting is optional. */
253extern void VG_(details_avg_translation_sizeB) ( UInt size );
254
255/* String printed if an `tl_assert' assertion fails or VG_(tool_panic)
256 is called. Should probably be an email address. */
257extern void VG_(details_bug_reports_to) ( Char* bug_reports_to );
258
259/* ------------------------------------------------------------------ */
260/* Needs */
261
njn43b9a8a2005-05-10 04:37:01 +0000262/* Should __libc_freeres() be run? Bugs in it can crash the tool. */
263extern void VG_(needs_libc_freeres) ( void );
264
265/* Want to have errors detected by Valgrind's core reported? Includes:
njn0087c502005-07-01 04:15:36 +0000266 - pthread API errors (many; eg. unlocking a non-locked mutex)
267 [currently disabled]
268 - invalid file descriptors to syscalls like read() and write()
njn43b9a8a2005-05-10 04:37:01 +0000269 - bad signal numbers passed to sigaction()
270 - attempt to install signal handler for SIGKILL or SIGSTOP */
271extern void VG_(needs_core_errors) ( void );
272
273/* Booleans that indicate extra operations are defined; if these are True,
274 the corresponding template functions (given below) must be defined. A
275 lot like being a member of a type class. */
276
277/* Want to report errors from tool? This implies use of suppressions, too. */
278extern void VG_(needs_tool_errors) (
279 // Identify if two errors are equal, or equal enough. `res' indicates how
280 // close is "close enough". `res' should be passed on as necessary, eg. if
281 // the Error's `extra' part contains an ExeContext, `res' should be
282 // passed to VG_(eq_ExeContext)() if the ExeContexts are considered. Other
283 // than that, probably don't worry about it unless you have lots of very
284 // similar errors occurring.
285 Bool (*eq_Error)(VgRes res, Error* e1, Error* e2),
286
sewardj5d9dc752009-07-15 14:52:18 +0000287 // We give tools a chance to have a look at errors
288 // just before they are printed. That is, before_pp_Error is
289 // called just before pp_Error itself. This gives the tool a
290 // chance to look at the just-about-to-be-printed error, so as to
291 // emit any arbitrary output if wants to, before the error itself
292 // is printed. This functionality was added to allow Helgrind to
293 // print thread-announcement messages immediately before the
294 // errors that refer to them.
295 void (*before_pp_Error)(Error* err),
296
njn43b9a8a2005-05-10 04:37:01 +0000297 // Print error context.
298 void (*pp_Error)(Error* err),
299
sewardjadb102f2007-11-09 23:21:44 +0000300 // Should the core indicate which ThreadId each error comes from?
301 Bool show_ThreadIDs_for_errors,
302
njn43b9a8a2005-05-10 04:37:01 +0000303 // Should fill in any details that could be postponed until after the
304 // decision whether to ignore the error (ie. details not affecting the
305 // result of VG_(tdict).tool_eq_Error()). This saves time when errors
306 // are ignored.
307 // Yuk.
308 // Return value: must be the size of the `extra' part in bytes -- used by
309 // the core to make a copy.
310 UInt (*update_extra)(Error* err),
311
312 // Return value indicates recognition. If recognised, must set skind using
313 // VG_(set_supp_kind)().
314 Bool (*recognised_suppression)(Char* name, Supp* su),
315
316 // Read any extra info for this suppression kind. Most likely for filling
317 // in the `extra' and `string' parts (with VG_(set_supp_{extra, string})())
318 // of a suppression if necessary. Should return False if a syntax error
njn35db56c2009-07-24 07:38:29 +0000319 // occurred, True otherwise. bufpp and nBufp are the same as for
320 // VG_(get_line).
321 Bool (*read_extra_suppression_info)(Int fd, Char** bufpp, SizeT* nBufp,
322 Supp* su),
njn43b9a8a2005-05-10 04:37:01 +0000323
324 // This should just check the kinds match and maybe some stuff in the
325 // `string' and `extra' field if appropriate (using VG_(get_supp_*)() to
326 // get the relevant suppression parts).
327 Bool (*error_matches_suppression)(Error* err, Supp* su),
328
329 // This should return the suppression name, for --gen-suppressions, or NULL
330 // if that error type cannot be suppressed. This is the inverse of
331 // VG_(tdict).tool_recognised_suppression().
332 Char* (*get_error_name)(Error* err),
333
334 // This should print any extra info for the error, for --gen-suppressions,
335 // including the newline. This is the inverse of
336 // VG_(tdict).tool_read_extra_suppression_info().
337 void (*print_extra_suppression_info)(Error* err)
338);
339
sewardj5155dec2005-10-12 10:09:23 +0000340/* Is information kept by the tool about specific instructions or
341 translations? (Eg. for cachegrind there are cost-centres for every
342 instruction, stored in a per-translation fashion.) If so, the info
343 may have to be discarded when translations are unloaded (eg. due to
344 .so unloading, or otherwise at the discretion of m_transtab, eg
345 when the table becomes too full) to avoid stale information being
346 reused for new translations. */
sewardj0b9d74a2006-12-24 02:24:11 +0000347extern void VG_(needs_superblock_discards) (
sewardj5155dec2005-10-12 10:09:23 +0000348 // Discard any information that pertains to specific translations
sewardj4ba057c2005-10-18 12:04:18 +0000349 // or instructions within the address range given. There are two
350 // possible approaches.
351 // - If info is being stored at a per-translation level, use orig_addr
352 // to identify which translation is being discarded. Each translation
353 // will be discarded exactly once.
sewardj7ce62392006-10-15 12:48:18 +0000354 // This orig_addr will match the closure->nraddr which was passed to
355 // to instrument() (see extensive comments above) when this
356 // translation was made. Note that orig_addr won't necessarily be
357 // the same as the first address in "extents".
sewardj5155dec2005-10-12 10:09:23 +0000358 // - If info is being stored at a per-instruction level, you can get
359 // the address range(s) being discarded by stepping through "extents".
360 // Note that any single instruction may belong to more than one
361 // translation, and so could be covered by the "extents" of more than
362 // one call to this function.
363 // Doing it the first way (as eg. Cachegrind does) is probably easier.
sewardj0b9d74a2006-12-24 02:24:11 +0000364 void (*discard_superblock_info)(Addr64 orig_addr, VexGuestExtents extents)
njn43b9a8a2005-05-10 04:37:01 +0000365);
366
367/* Tool defines its own command line options? */
368extern void VG_(needs_command_line_options) (
369 // Return True if option was recognised. Presumably sets some state to
njna0078592007-03-27 06:46:03 +0000370 // record the option as well. Nb: tools can assume that the argv will
371 // never disappear. So they can, for example, store a pointer to a string
372 // within an option, rather than having to make a copy.
njn43b9a8a2005-05-10 04:37:01 +0000373 Bool (*process_cmd_line_option)(Char* argv),
374
375 // Print out command line usage for options for normal tool operation.
376 void (*print_usage)(void),
377
378 // Print out command line usage for options for debugging the tool.
379 void (*print_debug_usage)(void)
380);
381
382/* Tool defines its own client requests? */
383extern void VG_(needs_client_requests) (
384 // If using client requests, the number of the first request should be equal
385 // to VG_USERREQ_TOOL_BASE('X', 'Y'), where 'X' and 'Y' form a suitable two
386 // character identification for the string. The second and subsequent
387 // requests should follow.
388 //
389 // This function should use the VG_IS_TOOL_USERREQ macro (in
390 // include/valgrind.h) to first check if it's a request for this tool. Then
391 // should handle it if it's recognised (and return True), or return False if
392 // not recognised. arg_block[0] holds the request number, any further args
393 // from the request are in arg_block[1..]. 'ret' is for the return value...
394 // it should probably be filled, if only with 0.
395 Bool (*handle_client_request)(ThreadId tid, UWord* arg_block, UWord* ret)
396);
397
398/* Tool does stuff before and/or after system calls? */
399// Nb: If either of the pre_ functions malloc() something to return, the
400// corresponding post_ function had better free() it!
sewardj1c0ce7a2009-07-01 08:10:49 +0000401// Also, the args are the 'original args' -- that is, it may be
402// that the syscall pre-wrapper will modify the args before the
403// syscall happens. So these args are the original, un-modified
404// args. Finally, nArgs merely indicates the length of args[..],
405// it does not indicate how many of those values are actually
406// relevant to the syscall. args[0 .. nArgs-1] is guaranteed
407// to be defined and to contain all the args for this syscall,
408// possibly including some trailing zeroes.
njn43b9a8a2005-05-10 04:37:01 +0000409extern void VG_(needs_syscall_wrapper) (
sewardj1c0ce7a2009-07-01 08:10:49 +0000410 void (* pre_syscall)(ThreadId tid, UInt syscallno,
411 UWord* args, UInt nArgs),
412 void (*post_syscall)(ThreadId tid, UInt syscallno,
413 UWord* args, UInt nArgs, SysRes res)
njn43b9a8a2005-05-10 04:37:01 +0000414);
415
416/* Are tool-state sanity checks performed? */
417// Can be useful for ensuring a tool's correctness. cheap_sanity_check()
418// is called very frequently; expensive_sanity_check() is called less
419// frequently and can be more involved.
420extern void VG_(needs_sanity_checks) (
421 Bool(*cheap_sanity_check)(void),
422 Bool(*expensive_sanity_check)(void)
423);
424
sewardjb8b79ad2008-03-03 01:35:41 +0000425/* Do we need to see variable type and location information? */
426extern void VG_(needs_var_info) ( void );
njn43b9a8a2005-05-10 04:37:01 +0000427
njn09ca09b2005-10-16 17:48:09 +0000428/* Does the tool replace malloc() and friends with its own versions?
429 This has to be combined with the use of a vgpreload_<tool>.so module
430 or it won't work. See massif/Makefile.am for how to build it. */
njn43b9a8a2005-05-10 04:37:01 +0000431// The 'p' prefix avoids GCC complaints about overshadowing global names.
njnfc51f8d2005-06-21 03:20:17 +0000432extern void VG_(needs_malloc_replacement)(
njn43b9a8a2005-05-10 04:37:01 +0000433 void* (*pmalloc) ( ThreadId tid, SizeT n ),
434 void* (*p__builtin_new) ( ThreadId tid, SizeT n ),
435 void* (*p__builtin_vec_new) ( ThreadId tid, SizeT n ),
436 void* (*pmemalign) ( ThreadId tid, SizeT align, SizeT n ),
437 void* (*pcalloc) ( ThreadId tid, SizeT nmemb, SizeT size1 ),
438 void (*pfree) ( ThreadId tid, void* p ),
439 void (*p__builtin_delete) ( ThreadId tid, void* p ),
440 void (*p__builtin_vec_delete) ( ThreadId tid, void* p ),
441 void* (*prealloc) ( ThreadId tid, void* p, SizeT new_size ),
njn8b140de2009-02-17 04:31:18 +0000442 SizeT (*pmalloc_usable_size) ( ThreadId tid, void* p),
njn43b9a8a2005-05-10 04:37:01 +0000443 SizeT client_malloc_redzone_szB
444);
445
njnca54af32006-04-16 10:25:43 +0000446/* Can the tool do XML output? This is a slight misnomer, because the tool
447 * is not requesting the core to do anything, rather saying "I can handle
448 * it". */
sewardj5d9dc752009-07-15 14:52:18 +0000449extern void VG_(needs_xml_output) ( void );
njnca54af32006-04-16 10:25:43 +0000450
sewardj81651dc2007-08-28 06:05:20 +0000451/* Does the tool want to have one final pass over the IR after tree
452 building but before instruction selection? If so specify the
453 function here. */
454extern void VG_(needs_final_IR_tidy_pass) ( IRSB*(*final_tidy)(IRSB*) );
455
456
njn43b9a8a2005-05-10 04:37:01 +0000457/* ------------------------------------------------------------------ */
458/* Core events to track */
459
460/* Part of the core from which this call was made. Useful for determining
461 what kind of error message should be emitted. */
462typedef
sewardj9c606bd2008-09-18 18:12:50 +0000463 enum { Vg_CoreStartup=1, Vg_CoreSignal, Vg_CoreSysCall,
njnf76d27a2009-05-28 01:53:07 +0000464 // This is for platforms where syscall args are passed on the
465 // stack; although pre_mem_read is the callback that will be
466 // called, such an arg should be treated (with respect to
467 // presenting information to the user) as if it was passed in a
468 // register, ie. like pre_reg_read.
469 Vg_CoreSysCallArgInMem,
470 Vg_CoreTranslate, Vg_CoreClientReq
471 } CorePart;
njn43b9a8a2005-05-10 04:37:01 +0000472
473/* Events happening in core to track. To be notified, pass a callback
474 function to the appropriate function. To ignore an event, don't do
475 anything (the default is for events to be ignored).
476
477 Note that most events aren't passed a ThreadId. If the event is one called
478 from generated code (eg. new_mem_stack_*), you can use
479 VG_(get_running_tid)() to find it. Otherwise, it has to be passed in,
480 as in pre_mem_read, and so the event signature will require changing.
481
482 Memory events (Nb: to track heap allocation/freeing, a tool must replace
483 malloc() et al. See above how to do this.)
484
sewardj7cf4e6b2008-05-01 20:24:26 +0000485 These ones occur at startup, upon some signals, and upon some syscalls.
486
sewardj9c606bd2008-09-18 18:12:50 +0000487 For new_mem_brk and new_mem_stack_signal, the supplied ThreadId
sewardj7cf4e6b2008-05-01 20:24:26 +0000488 indicates the thread for whom the new memory is being allocated.
sewardj9c606bd2008-09-18 18:12:50 +0000489
490 For new_mem_startup and new_mem_mmap, the di_handle argument is a
491 handle which can be used to retrieve debug info associated with the
492 mapping or allocation (because it is of a file that Valgrind has
493 decided to read debug info from). If the value is zero, there is
494 no associated debug info. If the value exceeds zero, it can be
495 supplied as an argument to selected queries in m_debuginfo.
sewardj7cf4e6b2008-05-01 20:24:26 +0000496*/
njn43b9a8a2005-05-10 04:37:01 +0000497void VG_(track_new_mem_startup) (void(*f)(Addr a, SizeT len,
sewardj9c606bd2008-09-18 18:12:50 +0000498 Bool rr, Bool ww, Bool xx,
499 ULong di_handle));
sewardj7cf4e6b2008-05-01 20:24:26 +0000500void VG_(track_new_mem_stack_signal)(void(*f)(Addr a, SizeT len, ThreadId tid));
501void VG_(track_new_mem_brk) (void(*f)(Addr a, SizeT len, ThreadId tid));
njn43b9a8a2005-05-10 04:37:01 +0000502void VG_(track_new_mem_mmap) (void(*f)(Addr a, SizeT len,
sewardj9c606bd2008-09-18 18:12:50 +0000503 Bool rr, Bool ww, Bool xx,
504 ULong di_handle));
njn43b9a8a2005-05-10 04:37:01 +0000505
506void VG_(track_copy_mem_remap) (void(*f)(Addr from, Addr to, SizeT len));
507void VG_(track_change_mem_mprotect) (void(*f)(Addr a, SizeT len,
508 Bool rr, Bool ww, Bool xx));
509void VG_(track_die_mem_stack_signal)(void(*f)(Addr a, SizeT len));
510void VG_(track_die_mem_brk) (void(*f)(Addr a, SizeT len));
511void VG_(track_die_mem_munmap) (void(*f)(Addr a, SizeT len));
512
513/* These ones are called when SP changes. A tool could track these itself
514 (except for ban_mem_stack) but it's much easier to use the core's help.
515
516 The specialised ones are called in preference to the general one, if they
517 are defined. These functions are called a lot if they are used, so
518 specialising can optimise things significantly. If any of the
519 specialised cases are defined, the general case must be defined too.
520
njnaf839f52005-06-23 03:27:57 +0000521 Nb: all the specialised ones must use the VG_REGPARM(n) attribute.
sewardj7cf4e6b2008-05-01 20:24:26 +0000522
523 For the _new functions, a tool may specify with with-ECU
524 (ExeContext Unique) or without-ECU version for each size, but not
525 both. If the with-ECU version is supplied, then the core will
526 arrange to pass, as the ecu argument, a 32-bit int which uniquely
527 identifies the instruction moving the stack pointer down. This
528 32-bit value is as obtained from VG_(get_ECU_from_ExeContext).
529 VG_(get_ExeContext_from_ECU) can then be used to retrieve the
530 associated depth-1 ExeContext for the location. All this
531 complexity is provided to support origin tracking in Memcheck.
532*/
533void VG_(track_new_mem_stack_4_w_ECU) (VG_REGPARM(2) void(*f)(Addr new_ESP, UInt ecu));
534void VG_(track_new_mem_stack_8_w_ECU) (VG_REGPARM(2) void(*f)(Addr new_ESP, UInt ecu));
535void VG_(track_new_mem_stack_12_w_ECU) (VG_REGPARM(2) void(*f)(Addr new_ESP, UInt ecu));
536void VG_(track_new_mem_stack_16_w_ECU) (VG_REGPARM(2) void(*f)(Addr new_ESP, UInt ecu));
537void VG_(track_new_mem_stack_32_w_ECU) (VG_REGPARM(2) void(*f)(Addr new_ESP, UInt ecu));
538void VG_(track_new_mem_stack_112_w_ECU)(VG_REGPARM(2) void(*f)(Addr new_ESP, UInt ecu));
539void VG_(track_new_mem_stack_128_w_ECU)(VG_REGPARM(2) void(*f)(Addr new_ESP, UInt ecu));
540void VG_(track_new_mem_stack_144_w_ECU)(VG_REGPARM(2) void(*f)(Addr new_ESP, UInt ecu));
541void VG_(track_new_mem_stack_160_w_ECU)(VG_REGPARM(2) void(*f)(Addr new_ESP, UInt ecu));
542void VG_(track_new_mem_stack_w_ECU) (void(*f)(Addr a, SizeT len,
543 UInt ecu));
544
sewardjf5c8e372006-02-12 15:42:20 +0000545void VG_(track_new_mem_stack_4) (VG_REGPARM(1) void(*f)(Addr new_ESP));
546void VG_(track_new_mem_stack_8) (VG_REGPARM(1) void(*f)(Addr new_ESP));
547void VG_(track_new_mem_stack_12) (VG_REGPARM(1) void(*f)(Addr new_ESP));
548void VG_(track_new_mem_stack_16) (VG_REGPARM(1) void(*f)(Addr new_ESP));
549void VG_(track_new_mem_stack_32) (VG_REGPARM(1) void(*f)(Addr new_ESP));
550void VG_(track_new_mem_stack_112)(VG_REGPARM(1) void(*f)(Addr new_ESP));
551void VG_(track_new_mem_stack_128)(VG_REGPARM(1) void(*f)(Addr new_ESP));
552void VG_(track_new_mem_stack_144)(VG_REGPARM(1) void(*f)(Addr new_ESP));
553void VG_(track_new_mem_stack_160)(VG_REGPARM(1) void(*f)(Addr new_ESP));
554void VG_(track_new_mem_stack) (void(*f)(Addr a, SizeT len));
njn43b9a8a2005-05-10 04:37:01 +0000555
sewardjf5c8e372006-02-12 15:42:20 +0000556void VG_(track_die_mem_stack_4) (VG_REGPARM(1) void(*f)(Addr die_ESP));
557void VG_(track_die_mem_stack_8) (VG_REGPARM(1) void(*f)(Addr die_ESP));
558void VG_(track_die_mem_stack_12) (VG_REGPARM(1) void(*f)(Addr die_ESP));
559void VG_(track_die_mem_stack_16) (VG_REGPARM(1) void(*f)(Addr die_ESP));
560void VG_(track_die_mem_stack_32) (VG_REGPARM(1) void(*f)(Addr die_ESP));
561void VG_(track_die_mem_stack_112)(VG_REGPARM(1) void(*f)(Addr die_ESP));
562void VG_(track_die_mem_stack_128)(VG_REGPARM(1) void(*f)(Addr die_ESP));
563void VG_(track_die_mem_stack_144)(VG_REGPARM(1) void(*f)(Addr die_ESP));
564void VG_(track_die_mem_stack_160)(VG_REGPARM(1) void(*f)(Addr die_ESP));
565void VG_(track_die_mem_stack) (void(*f)(Addr a, SizeT len));
njn43b9a8a2005-05-10 04:37:01 +0000566
567/* Used for redzone at end of thread stacks */
568void VG_(track_ban_mem_stack) (void(*f)(Addr a, SizeT len));
569
570/* These ones occur around syscalls, signal handling, etc */
571void VG_(track_pre_mem_read) (void(*f)(CorePart part, ThreadId tid,
572 Char* s, Addr a, SizeT size));
573void VG_(track_pre_mem_read_asciiz)(void(*f)(CorePart part, ThreadId tid,
574 Char* s, Addr a));
575void VG_(track_pre_mem_write) (void(*f)(CorePart part, ThreadId tid,
576 Char* s, Addr a, SizeT size));
577void VG_(track_post_mem_write) (void(*f)(CorePart part, ThreadId tid,
578 Addr a, SizeT size));
579
580/* Register events. Use VG_(set_shadow_state_area)() to set the shadow regs
581 for these events. */
582void VG_(track_pre_reg_read) (void(*f)(CorePart part, ThreadId tid,
njnc4431bf2009-01-15 21:29:24 +0000583 Char* s, PtrdiffT guest_state_offset,
njn43b9a8a2005-05-10 04:37:01 +0000584 SizeT size));
585void VG_(track_post_reg_write)(void(*f)(CorePart part, ThreadId tid,
njnc4431bf2009-01-15 21:29:24 +0000586 PtrdiffT guest_state_offset,
njn43b9a8a2005-05-10 04:37:01 +0000587 SizeT size));
588
589/* This one is called for malloc() et al if they are replaced by a tool. */
590void VG_(track_post_reg_write_clientcall_return)(
njnc4431bf2009-01-15 21:29:24 +0000591 void(*f)(ThreadId tid, PtrdiffT guest_state_offset, SizeT size, Addr f));
njn43b9a8a2005-05-10 04:37:01 +0000592
593
594/* Scheduler events (not exhaustive) */
sewardj97561812006-12-23 01:21:12 +0000595
596/* Called when 'tid' starts or stops running client code blocks.
sewardjadb102f2007-11-09 23:21:44 +0000597 Gives the total dispatched block count at that event. Note, this
598 is not the same as 'tid' holding the BigLock (the lock that ensures
599 that only one thread runs at a time): a thread can hold the lock
600 for other purposes (making translations, etc) yet not be running
601 client blocks. Obviously though, a thread must hold the lock in
602 order to run client code blocks, so the times bracketed by
603 'start_client_code'..'stop_client_code' are a subset of the times
604 when thread 'tid' holds the cpu lock.
sewardj97561812006-12-23 01:21:12 +0000605*/
njn3e32c872006-12-24 07:51:17 +0000606void VG_(track_start_client_code)(
607 void(*f)(ThreadId tid, ULong blocks_dispatched)
608 );
609void VG_(track_stop_client_code)(
610 void(*f)(ThreadId tid, ULong blocks_dispatched)
sewardj97561812006-12-23 01:21:12 +0000611 );
njn43b9a8a2005-05-10 04:37:01 +0000612
613
614/* Thread events (not exhaustive)
615
sewardjadb102f2007-11-09 23:21:44 +0000616 ll_create: low level thread creation. Called before the new thread
617 has run any instructions (or touched any memory). In fact, called
618 immediately before the new thread has come into existence; the new
619 thread can be assumed to exist when notified by this call.
620
621 ll_exit: low level thread exit. Called after the exiting thread
622 has run its last instruction.
sewardj29d68f72007-11-10 22:13:03 +0000623
624 The _ll_ part makes it clear these events are not to do with
625 pthread_create or pthread_exit/pthread_join (etc), which are a
sewardj391ddf82007-11-10 22:19:42 +0000626 higher level abstraction synthesised by libpthread. What you can
627 be sure of from _ll_create/_ll_exit is the absolute limits of each
sewardj29d68f72007-11-10 22:13:03 +0000628 thread's lifetime, and hence be assured that all memory references
629 made by the thread fall inside the _ll_create/_ll_exit pair. This
630 is important for tools that need a 100% accurate account of which
631 thread is responsible for every memory reference in the process.
632
sewardj391ddf82007-11-10 22:19:42 +0000633 pthread_create/join/exit do not give this property. Calls/returns
634 to/from them happen arbitrarily far away from the relevant
635 low-level thread create/quit event. In general a few hundred
636 instructions; hence a few hundred(ish) memory references could get
637 misclassified each time.
sewardj7a387ea2007-11-25 14:06:06 +0000638
639 pre_thread_first_insn: is called when the thread is all set up and
640 ready to go (stack in place, etc) but has not executed its first
641 instruction yet. Gives threading tools a chance to ask questions
642 about the thread (eg, what is its initial client stack pointer)
643 that are not easily answered at pre_thread_ll_create time.
644
645 For a given thread, the call sequence is:
646 ll_create (in the parent's context)
647 first_insn (in the child's context)
648 ll_exit (in the child's context)
sewardjadb102f2007-11-09 23:21:44 +0000649*/
sewardj7a387ea2007-11-25 14:06:06 +0000650void VG_(track_pre_thread_ll_create) (void(*f)(ThreadId tid, ThreadId child));
651void VG_(track_pre_thread_first_insn)(void(*f)(ThreadId tid));
652void VG_(track_pre_thread_ll_exit) (void(*f)(ThreadId tid));
njn43b9a8a2005-05-10 04:37:01 +0000653
njn3e32c872006-12-24 07:51:17 +0000654
njn43b9a8a2005-05-10 04:37:01 +0000655/* Signal events (not exhaustive)
656
657 ... pre_send_signal, post_send_signal ...
658
659 Called before a signal is delivered; `alt_stack' indicates if it is
660 delivered on an alternative stack. */
661void VG_(track_pre_deliver_signal) (void(*f)(ThreadId tid, Int sigNo,
662 Bool alt_stack));
663/* Called after a signal is delivered. Nb: unfortunately, if the signal
664 handler longjmps, this won't be called. */
665void VG_(track_post_deliver_signal)(void(*f)(ThreadId tid, Int sigNo));
666
njn43b9a8a2005-05-10 04:37:01 +0000667#endif // __PUB_TOOL_TOOLIFACE_H
668
669/*--------------------------------------------------------------------*/
670/*--- end ---*/
671/*--------------------------------------------------------------------*/