blob: 1668f89f46316c233104bd5c6dca7745dd985e97 [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
10 Copyright (C) 2000-2005 Julian Seward
11 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
35#include "libvex.h" // for VexGuestLayout
36
njn43b9a8a2005-05-10 04:37:01 +000037/* ------------------------------------------------------------------ */
38/* The interface version */
39
40/* The version number indicates binary-incompatible changes to the
41 interface; if the core and tool versions don't match, Valgrind
42 will abort. */
njn1d0cb0d2005-08-15 01:52:02 +000043#define VG_CORE_INTERFACE_VERSION 9
njn43b9a8a2005-05-10 04:37:01 +000044
45typedef struct _ToolInfo {
46 Int sizeof_ToolInfo;
47 Int interface_version;
48
49 /* Initialise tool. Must do the following:
50 - initialise the `details' struct, via the VG_(details_*)() functions
51 - register any helpers called by generated code
52
53 May do the following:
54 - initialise the `needs' struct to indicate certain requirements, via
55 the VG_(needs_*)() functions
56 - initialize all the tool's entrypoints via the VG_(init_*)() functions
57 - register any tool-specific profiling events
58 - any other tool-specific initialisation
59 */
60 void (*tl_pre_clo_init) ( void );
njn43b9a8a2005-05-10 04:37:01 +000061} ToolInfo;
62
sewardj45f4e7c2005-09-27 19:20:21 +000063extern const ToolInfo VG_(tool_info);
64
njn43b9a8a2005-05-10 04:37:01 +000065/* Every tool must include this macro somewhere, exactly once. */
sewardj45f4e7c2005-09-27 19:20:21 +000066#define VG_DETERMINE_INTERFACE_VERSION(pre_clo_init) \
njn43b9a8a2005-05-10 04:37:01 +000067 const ToolInfo VG_(tool_info) = { \
68 .sizeof_ToolInfo = sizeof(ToolInfo), \
69 .interface_version = VG_CORE_INTERFACE_VERSION, \
70 .tl_pre_clo_init = pre_clo_init, \
njn43b9a8a2005-05-10 04:37:01 +000071 };
72
73/* ------------------------------------------------------------------ */
74/* Basic tool functions */
75
76extern void VG_(basic_tool_funcs)(
77 // Do any initialisation that can only be done after command line
78 // processing.
79 void (*post_clo_init)(void),
80
sewardj4ba057c2005-10-18 12:04:18 +000081 // Instrument a basic block. Must be a true function, ie. the same
82 // input always results in the same output, because basic blocks
83 // can be retranslated. Unless you're doing something really
84 // strange... Note that orig_addr_noredir is not necessarily the
85 // same as the address of the first instruction in the IR, due to
86 // function redirection.
87 IRBB* (*instrument)(IRBB* bb_in, VexGuestLayout* layout,
88 Addr64 orig_addr_noredir, VexGuestExtents* vge,
njn43b9a8a2005-05-10 04:37:01 +000089 IRType gWordTy, IRType hWordTy ),
90
91 // Finish up, print out any results, etc. `exitcode' is program's exit
92 // code. The shadow can be found with VG_(get_exit_status_shadow)().
93 void (*fini)(Int)
94);
95
96/* ------------------------------------------------------------------ */
97/* Details */
98
99/* Default value for avg_translations_sizeB (in bytes), indicating typical
100 code expansion of about 6:1. */
101#define VG_DEFAULT_TRANS_SIZEB 100
102
103/* Information used in the startup message. `name' also determines the
104 string used for identifying suppressions in a suppression file as
105 belonging to this tool. `version' can be NULL, in which case (not
106 surprisingly) no version info is printed; this mechanism is designed for
107 tools distributed with Valgrind that share a version number with
108 Valgrind. Other tools not distributed as part of Valgrind should
109 probably have their own version number. */
110extern void VG_(details_name) ( Char* name );
111extern void VG_(details_version) ( Char* version );
112extern void VG_(details_description) ( Char* description );
113extern void VG_(details_copyright_author) ( Char* copyright_author );
114
115/* Average size of a translation, in bytes, so that the translation
116 storage machinery can allocate memory appropriately. Not critical,
117 setting is optional. */
118extern void VG_(details_avg_translation_sizeB) ( UInt size );
119
120/* String printed if an `tl_assert' assertion fails or VG_(tool_panic)
121 is called. Should probably be an email address. */
122extern void VG_(details_bug_reports_to) ( Char* bug_reports_to );
123
124/* ------------------------------------------------------------------ */
125/* Needs */
126
127/* Booleans that decide core behaviour, but don't require extra
128 operations to be defined if `True' */
129
130/* Should __libc_freeres() be run? Bugs in it can crash the tool. */
131extern void VG_(needs_libc_freeres) ( void );
132
133/* Want to have errors detected by Valgrind's core reported? Includes:
njn0087c502005-07-01 04:15:36 +0000134 - pthread API errors (many; eg. unlocking a non-locked mutex)
135 [currently disabled]
136 - invalid file descriptors to syscalls like read() and write()
njn43b9a8a2005-05-10 04:37:01 +0000137 - bad signal numbers passed to sigaction()
138 - attempt to install signal handler for SIGKILL or SIGSTOP */
139extern void VG_(needs_core_errors) ( void );
140
141/* Booleans that indicate extra operations are defined; if these are True,
142 the corresponding template functions (given below) must be defined. A
143 lot like being a member of a type class. */
144
145/* Want to report errors from tool? This implies use of suppressions, too. */
146extern void VG_(needs_tool_errors) (
147 // Identify if two errors are equal, or equal enough. `res' indicates how
148 // close is "close enough". `res' should be passed on as necessary, eg. if
149 // the Error's `extra' part contains an ExeContext, `res' should be
150 // passed to VG_(eq_ExeContext)() if the ExeContexts are considered. Other
151 // than that, probably don't worry about it unless you have lots of very
152 // similar errors occurring.
153 Bool (*eq_Error)(VgRes res, Error* e1, Error* e2),
154
155 // Print error context.
156 void (*pp_Error)(Error* err),
157
158 // Should fill in any details that could be postponed until after the
159 // decision whether to ignore the error (ie. details not affecting the
160 // result of VG_(tdict).tool_eq_Error()). This saves time when errors
161 // are ignored.
162 // Yuk.
163 // Return value: must be the size of the `extra' part in bytes -- used by
164 // the core to make a copy.
165 UInt (*update_extra)(Error* err),
166
167 // Return value indicates recognition. If recognised, must set skind using
168 // VG_(set_supp_kind)().
169 Bool (*recognised_suppression)(Char* name, Supp* su),
170
171 // Read any extra info for this suppression kind. Most likely for filling
172 // in the `extra' and `string' parts (with VG_(set_supp_{extra, string})())
173 // of a suppression if necessary. Should return False if a syntax error
174 // occurred, True otherwise.
175 Bool (*read_extra_suppression_info)(Int fd, Char* buf, Int nBuf, Supp* su),
176
177 // This should just check the kinds match and maybe some stuff in the
178 // `string' and `extra' field if appropriate (using VG_(get_supp_*)() to
179 // get the relevant suppression parts).
180 Bool (*error_matches_suppression)(Error* err, Supp* su),
181
182 // This should return the suppression name, for --gen-suppressions, or NULL
183 // if that error type cannot be suppressed. This is the inverse of
184 // VG_(tdict).tool_recognised_suppression().
185 Char* (*get_error_name)(Error* err),
186
187 // This should print any extra info for the error, for --gen-suppressions,
188 // including the newline. This is the inverse of
189 // VG_(tdict).tool_read_extra_suppression_info().
190 void (*print_extra_suppression_info)(Error* err)
191);
192
sewardj5155dec2005-10-12 10:09:23 +0000193/* Is information kept by the tool about specific instructions or
194 translations? (Eg. for cachegrind there are cost-centres for every
195 instruction, stored in a per-translation fashion.) If so, the info
196 may have to be discarded when translations are unloaded (eg. due to
197 .so unloading, or otherwise at the discretion of m_transtab, eg
198 when the table becomes too full) to avoid stale information being
199 reused for new translations. */
njn43b9a8a2005-05-10 04:37:01 +0000200extern void VG_(needs_basic_block_discards) (
sewardj5155dec2005-10-12 10:09:23 +0000201 // Discard any information that pertains to specific translations
sewardj4ba057c2005-10-18 12:04:18 +0000202 // or instructions within the address range given. There are two
203 // possible approaches.
204 // - If info is being stored at a per-translation level, use orig_addr
205 // to identify which translation is being discarded. Each translation
206 // will be discarded exactly once.
207 // This orig_addr will match the orig_addr which was passed to
208 // to instrument() when this translation was made. Note that orig_addr
209 // won't necessarily be the same as the first address in "extents".
sewardj5155dec2005-10-12 10:09:23 +0000210 // - If info is being stored at a per-instruction level, you can get
211 // the address range(s) being discarded by stepping through "extents".
212 // Note that any single instruction may belong to more than one
213 // translation, and so could be covered by the "extents" of more than
214 // one call to this function.
215 // Doing it the first way (as eg. Cachegrind does) is probably easier.
sewardj4ba057c2005-10-18 12:04:18 +0000216 void (*discard_basic_block_info)(Addr64 orig_addr, VexGuestExtents extents)
njn43b9a8a2005-05-10 04:37:01 +0000217);
218
219/* Tool defines its own command line options? */
220extern void VG_(needs_command_line_options) (
221 // Return True if option was recognised. Presumably sets some state to
222 // record the option as well.
223 Bool (*process_cmd_line_option)(Char* argv),
224
225 // Print out command line usage for options for normal tool operation.
226 void (*print_usage)(void),
227
228 // Print out command line usage for options for debugging the tool.
229 void (*print_debug_usage)(void)
230);
231
232/* Tool defines its own client requests? */
233extern void VG_(needs_client_requests) (
234 // If using client requests, the number of the first request should be equal
235 // to VG_USERREQ_TOOL_BASE('X', 'Y'), where 'X' and 'Y' form a suitable two
236 // character identification for the string. The second and subsequent
237 // requests should follow.
238 //
239 // This function should use the VG_IS_TOOL_USERREQ macro (in
240 // include/valgrind.h) to first check if it's a request for this tool. Then
241 // should handle it if it's recognised (and return True), or return False if
242 // not recognised. arg_block[0] holds the request number, any further args
243 // from the request are in arg_block[1..]. 'ret' is for the return value...
244 // it should probably be filled, if only with 0.
245 Bool (*handle_client_request)(ThreadId tid, UWord* arg_block, UWord* ret)
246);
247
248/* Tool does stuff before and/or after system calls? */
249// Nb: If either of the pre_ functions malloc() something to return, the
250// corresponding post_ function had better free() it!
251extern void VG_(needs_syscall_wrapper) (
252 void (* pre_syscall)(ThreadId tid, UInt syscallno),
sewardja8d8e232005-06-07 20:04:56 +0000253 void (*post_syscall)(ThreadId tid, UInt syscallno, SysRes res)
njn43b9a8a2005-05-10 04:37:01 +0000254);
255
256/* Are tool-state sanity checks performed? */
257// Can be useful for ensuring a tool's correctness. cheap_sanity_check()
258// is called very frequently; expensive_sanity_check() is called less
259// frequently and can be more involved.
260extern void VG_(needs_sanity_checks) (
261 Bool(*cheap_sanity_check)(void),
262 Bool(*expensive_sanity_check)(void)
263);
264
265/* Do we need to see data symbols? */
266extern void VG_(needs_data_syms) ( void );
267
268/* Does the tool need shadow memory allocated? */
269extern void VG_(needs_shadow_memory)( void );
270
njn09ca09b2005-10-16 17:48:09 +0000271/* Does the tool replace malloc() and friends with its own versions?
272 This has to be combined with the use of a vgpreload_<tool>.so module
273 or it won't work. See massif/Makefile.am for how to build it. */
njn43b9a8a2005-05-10 04:37:01 +0000274// The 'p' prefix avoids GCC complaints about overshadowing global names.
njnfc51f8d2005-06-21 03:20:17 +0000275extern void VG_(needs_malloc_replacement)(
njn43b9a8a2005-05-10 04:37:01 +0000276 void* (*pmalloc) ( ThreadId tid, SizeT n ),
277 void* (*p__builtin_new) ( ThreadId tid, SizeT n ),
278 void* (*p__builtin_vec_new) ( ThreadId tid, SizeT n ),
279 void* (*pmemalign) ( ThreadId tid, SizeT align, SizeT n ),
280 void* (*pcalloc) ( ThreadId tid, SizeT nmemb, SizeT size1 ),
281 void (*pfree) ( ThreadId tid, void* p ),
282 void (*p__builtin_delete) ( ThreadId tid, void* p ),
283 void (*p__builtin_vec_delete) ( ThreadId tid, void* p ),
284 void* (*prealloc) ( ThreadId tid, void* p, SizeT new_size ),
285 SizeT client_malloc_redzone_szB
286);
287
288/* ------------------------------------------------------------------ */
289/* Core events to track */
290
291/* Part of the core from which this call was made. Useful for determining
292 what kind of error message should be emitted. */
293typedef
294 enum { Vg_CoreStartup, Vg_CorePThread, Vg_CoreSignal, Vg_CoreSysCall,
295 Vg_CoreTranslate, Vg_CoreClientReq }
296 CorePart;
297
298/* Events happening in core to track. To be notified, pass a callback
299 function to the appropriate function. To ignore an event, don't do
300 anything (the default is for events to be ignored).
301
302 Note that most events aren't passed a ThreadId. If the event is one called
303 from generated code (eg. new_mem_stack_*), you can use
304 VG_(get_running_tid)() to find it. Otherwise, it has to be passed in,
305 as in pre_mem_read, and so the event signature will require changing.
306
307 Memory events (Nb: to track heap allocation/freeing, a tool must replace
308 malloc() et al. See above how to do this.)
309
310 These ones occur at startup, upon some signals, and upon some syscalls
311 */
312void VG_(track_new_mem_startup) (void(*f)(Addr a, SizeT len,
313 Bool rr, Bool ww, Bool xx));
314void VG_(track_new_mem_stack_signal)(void(*f)(Addr a, SizeT len));
315void VG_(track_new_mem_brk) (void(*f)(Addr a, SizeT len));
316void VG_(track_new_mem_mmap) (void(*f)(Addr a, SizeT len,
317 Bool rr, Bool ww, Bool xx));
318
319void VG_(track_copy_mem_remap) (void(*f)(Addr from, Addr to, SizeT len));
320void VG_(track_change_mem_mprotect) (void(*f)(Addr a, SizeT len,
321 Bool rr, Bool ww, Bool xx));
322void VG_(track_die_mem_stack_signal)(void(*f)(Addr a, SizeT len));
323void VG_(track_die_mem_brk) (void(*f)(Addr a, SizeT len));
324void VG_(track_die_mem_munmap) (void(*f)(Addr a, SizeT len));
325
326/* These ones are called when SP changes. A tool could track these itself
327 (except for ban_mem_stack) but it's much easier to use the core's help.
328
329 The specialised ones are called in preference to the general one, if they
330 are defined. These functions are called a lot if they are used, so
331 specialising can optimise things significantly. If any of the
332 specialised cases are defined, the general case must be defined too.
333
njnaf839f52005-06-23 03:27:57 +0000334 Nb: all the specialised ones must use the VG_REGPARM(n) attribute.
njn43b9a8a2005-05-10 04:37:01 +0000335 */
njnaf839f52005-06-23 03:27:57 +0000336void VG_(track_new_mem_stack_4) (VG_REGPARM(1) void(*f)(Addr new_ESP));
337void VG_(track_new_mem_stack_8) (VG_REGPARM(1) void(*f)(Addr new_ESP));
338void VG_(track_new_mem_stack_12)(VG_REGPARM(1) void(*f)(Addr new_ESP));
339void VG_(track_new_mem_stack_16)(VG_REGPARM(1) void(*f)(Addr new_ESP));
340void VG_(track_new_mem_stack_32)(VG_REGPARM(1) void(*f)(Addr new_ESP));
341void VG_(track_new_mem_stack) (void(*f)(Addr a, SizeT len));
njn43b9a8a2005-05-10 04:37:01 +0000342
njnaf839f52005-06-23 03:27:57 +0000343void VG_(track_die_mem_stack_4) (VG_REGPARM(1) void(*f)(Addr die_ESP));
344void VG_(track_die_mem_stack_8) (VG_REGPARM(1) void(*f)(Addr die_ESP));
345void VG_(track_die_mem_stack_12)(VG_REGPARM(1) void(*f)(Addr die_ESP));
346void VG_(track_die_mem_stack_16)(VG_REGPARM(1) void(*f)(Addr die_ESP));
347void VG_(track_die_mem_stack_32)(VG_REGPARM(1) void(*f)(Addr die_ESP));
348void VG_(track_die_mem_stack) (void(*f)(Addr a, SizeT len));
njn43b9a8a2005-05-10 04:37:01 +0000349
350/* Used for redzone at end of thread stacks */
351void VG_(track_ban_mem_stack) (void(*f)(Addr a, SizeT len));
352
353/* These ones occur around syscalls, signal handling, etc */
354void VG_(track_pre_mem_read) (void(*f)(CorePart part, ThreadId tid,
355 Char* s, Addr a, SizeT size));
356void VG_(track_pre_mem_read_asciiz)(void(*f)(CorePart part, ThreadId tid,
357 Char* s, Addr a));
358void VG_(track_pre_mem_write) (void(*f)(CorePart part, ThreadId tid,
359 Char* s, Addr a, SizeT size));
360void VG_(track_post_mem_write) (void(*f)(CorePart part, ThreadId tid,
361 Addr a, SizeT size));
362
363/* Register events. Use VG_(set_shadow_state_area)() to set the shadow regs
364 for these events. */
365void VG_(track_pre_reg_read) (void(*f)(CorePart part, ThreadId tid,
366 Char* s, OffT guest_state_offset,
367 SizeT size));
368void VG_(track_post_reg_write)(void(*f)(CorePart part, ThreadId tid,
369 OffT guest_state_offset,
370 SizeT size));
371
372/* This one is called for malloc() et al if they are replaced by a tool. */
373void VG_(track_post_reg_write_clientcall_return)(
374 void(*f)(ThreadId tid, OffT guest_state_offset, SizeT size, Addr f));
375
376
377/* Scheduler events (not exhaustive) */
378void VG_(track_thread_run)(void(*f)(ThreadId tid));
379
380
381/* Thread events (not exhaustive)
382
383 Called during thread create, before the new thread has run any
384 instructions (or touched any memory).
385 */
386void VG_(track_post_thread_create)(void(*f)(ThreadId tid, ThreadId child));
387void VG_(track_post_thread_join) (void(*f)(ThreadId joiner, ThreadId joinee));
388
389/* Mutex events (not exhaustive)
390 "void *mutex" is really a pthread_mutex *
391
392 Called before a thread can block while waiting for a mutex (called
393 regardless of whether the thread will block or not). */
394void VG_(track_pre_mutex_lock)(void(*f)(ThreadId tid, void* mutex));
395
396/* Called once the thread actually holds the mutex (always paired with
397 pre_mutex_lock). */
398void VG_(track_post_mutex_lock)(void(*f)(ThreadId tid, void* mutex));
399
400/* Called after a thread has released a mutex (no need for a corresponding
401 pre_mutex_unlock, because unlocking can't block). */
402void VG_(track_post_mutex_unlock)(void(*f)(ThreadId tid, void* mutex));
403
404/* Signal events (not exhaustive)
405
406 ... pre_send_signal, post_send_signal ...
407
408 Called before a signal is delivered; `alt_stack' indicates if it is
409 delivered on an alternative stack. */
410void VG_(track_pre_deliver_signal) (void(*f)(ThreadId tid, Int sigNo,
411 Bool alt_stack));
412/* Called after a signal is delivered. Nb: unfortunately, if the signal
413 handler longjmps, this won't be called. */
414void VG_(track_post_deliver_signal)(void(*f)(ThreadId tid, Int sigNo));
415
416/* Others... condition variables...
417 ...
njn43b9a8a2005-05-10 04:37:01 +0000418 */
njn43b9a8a2005-05-10 04:37:01 +0000419
420#endif // __PUB_TOOL_TOOLIFACE_H
421
422/*--------------------------------------------------------------------*/
423/*--- end ---*/
424/*--------------------------------------------------------------------*/