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