blob: f5840b570473917db05c414569f78a1c32a00f91 [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
34/* ------------------------------------------------------------------ */
35/* The interface version */
36
37/* The version number indicates binary-incompatible changes to the
38 interface; if the core and tool versions don't match, Valgrind
39 will abort. */
40#define VG_CORE_INTERFACE_VERSION 8
41
42typedef struct _ToolInfo {
43 Int sizeof_ToolInfo;
44 Int interface_version;
45
46 /* Initialise tool. Must do the following:
47 - initialise the `details' struct, via the VG_(details_*)() functions
48 - register any helpers called by generated code
49
50 May do the following:
51 - initialise the `needs' struct to indicate certain requirements, via
52 the VG_(needs_*)() functions
53 - initialize all the tool's entrypoints via the VG_(init_*)() functions
54 - register any tool-specific profiling events
55 - any other tool-specific initialisation
56 */
57 void (*tl_pre_clo_init) ( void );
58
59 /* Specifies how big the shadow segment should be as a ratio to the
60 client address space. 0 for no shadow segment. */
61 float shadow_ratio;
62} ToolInfo;
63
64/* Every tool must include this macro somewhere, exactly once. */
65#define VG_DETERMINE_INTERFACE_VERSION(pre_clo_init, shadow) \
66 const ToolInfo VG_(tool_info) = { \
67 .sizeof_ToolInfo = sizeof(ToolInfo), \
68 .interface_version = VG_CORE_INTERFACE_VERSION, \
69 .tl_pre_clo_init = pre_clo_init, \
70 .shadow_ratio = shadow, \
71 };
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:
130 - pthread API errors (many; eg. unlocking a non-locked mutex)
131 - invalid file descriptors to blocking syscalls read() and write()
132 - bad signal numbers passed to sigaction()
133 - attempt to install signal handler for SIGKILL or SIGSTOP */
134extern void VG_(needs_core_errors) ( void );
135
136/* Booleans that indicate extra operations are defined; if these are True,
137 the corresponding template functions (given below) must be defined. A
138 lot like being a member of a type class. */
139
140/* Want to report errors from tool? This implies use of suppressions, too. */
141extern void VG_(needs_tool_errors) (
142 // Identify if two errors are equal, or equal enough. `res' indicates how
143 // close is "close enough". `res' should be passed on as necessary, eg. if
144 // the Error's `extra' part contains an ExeContext, `res' should be
145 // passed to VG_(eq_ExeContext)() if the ExeContexts are considered. Other
146 // than that, probably don't worry about it unless you have lots of very
147 // similar errors occurring.
148 Bool (*eq_Error)(VgRes res, Error* e1, Error* e2),
149
150 // Print error context.
151 void (*pp_Error)(Error* err),
152
153 // Should fill in any details that could be postponed until after the
154 // decision whether to ignore the error (ie. details not affecting the
155 // result of VG_(tdict).tool_eq_Error()). This saves time when errors
156 // are ignored.
157 // Yuk.
158 // Return value: must be the size of the `extra' part in bytes -- used by
159 // the core to make a copy.
160 UInt (*update_extra)(Error* err),
161
162 // Return value indicates recognition. If recognised, must set skind using
163 // VG_(set_supp_kind)().
164 Bool (*recognised_suppression)(Char* name, Supp* su),
165
166 // Read any extra info for this suppression kind. Most likely for filling
167 // in the `extra' and `string' parts (with VG_(set_supp_{extra, string})())
168 // of a suppression if necessary. Should return False if a syntax error
169 // occurred, True otherwise.
170 Bool (*read_extra_suppression_info)(Int fd, Char* buf, Int nBuf, Supp* su),
171
172 // This should just check the kinds match and maybe some stuff in the
173 // `string' and `extra' field if appropriate (using VG_(get_supp_*)() to
174 // get the relevant suppression parts).
175 Bool (*error_matches_suppression)(Error* err, Supp* su),
176
177 // This should return the suppression name, for --gen-suppressions, or NULL
178 // if that error type cannot be suppressed. This is the inverse of
179 // VG_(tdict).tool_recognised_suppression().
180 Char* (*get_error_name)(Error* err),
181
182 // This should print any extra info for the error, for --gen-suppressions,
183 // including the newline. This is the inverse of
184 // VG_(tdict).tool_read_extra_suppression_info().
185 void (*print_extra_suppression_info)(Error* err)
186);
187
188
189/* Is information kept about specific individual basic blocks? (Eg. for
190 cachegrind there are cost-centres for every instruction, stored at a
191 basic block level.) If so, it sometimes has to be discarded, because
192 .so mmap/munmap-ping or self-modifying code (informed by the
193 DISCARD_TRANSLATIONS user request) can cause one instruction address
194 to be used for more than one instruction in one program run... */
195extern void VG_(needs_basic_block_discards) (
196 // Should discard any information that pertains to specific basic blocks
197 // or instructions within the address range given.
198 void (*discard_basic_block_info)(Addr a, SizeT size)
199);
200
201/* Tool defines its own command line options? */
202extern void VG_(needs_command_line_options) (
203 // Return True if option was recognised. Presumably sets some state to
204 // record the option as well.
205 Bool (*process_cmd_line_option)(Char* argv),
206
207 // Print out command line usage for options for normal tool operation.
208 void (*print_usage)(void),
209
210 // Print out command line usage for options for debugging the tool.
211 void (*print_debug_usage)(void)
212);
213
214/* Tool defines its own client requests? */
215extern void VG_(needs_client_requests) (
216 // If using client requests, the number of the first request should be equal
217 // to VG_USERREQ_TOOL_BASE('X', 'Y'), where 'X' and 'Y' form a suitable two
218 // character identification for the string. The second and subsequent
219 // requests should follow.
220 //
221 // This function should use the VG_IS_TOOL_USERREQ macro (in
222 // include/valgrind.h) to first check if it's a request for this tool. Then
223 // should handle it if it's recognised (and return True), or return False if
224 // not recognised. arg_block[0] holds the request number, any further args
225 // from the request are in arg_block[1..]. 'ret' is for the return value...
226 // it should probably be filled, if only with 0.
227 Bool (*handle_client_request)(ThreadId tid, UWord* arg_block, UWord* ret)
228);
229
230/* Tool does stuff before and/or after system calls? */
231// Nb: If either of the pre_ functions malloc() something to return, the
232// corresponding post_ function had better free() it!
233extern void VG_(needs_syscall_wrapper) (
234 void (* pre_syscall)(ThreadId tid, UInt syscallno),
235 void (*post_syscall)(ThreadId tid, UInt syscallno, Int res)
236);
237
238/* Are tool-state sanity checks performed? */
239// Can be useful for ensuring a tool's correctness. cheap_sanity_check()
240// is called very frequently; expensive_sanity_check() is called less
241// frequently and can be more involved.
242extern void VG_(needs_sanity_checks) (
243 Bool(*cheap_sanity_check)(void),
244 Bool(*expensive_sanity_check)(void)
245);
246
247/* Do we need to see data symbols? */
248extern void VG_(needs_data_syms) ( void );
249
250/* Does the tool need shadow memory allocated? */
251extern void VG_(needs_shadow_memory)( void );
252
253/* ------------------------------------------------------------------ */
254/* Malloc replacement */
255
256// The 'p' prefix avoids GCC complaints about overshadowing global names.
257extern void VG_(malloc_funcs)(
258 void* (*pmalloc) ( ThreadId tid, SizeT n ),
259 void* (*p__builtin_new) ( ThreadId tid, SizeT n ),
260 void* (*p__builtin_vec_new) ( ThreadId tid, SizeT n ),
261 void* (*pmemalign) ( ThreadId tid, SizeT align, SizeT n ),
262 void* (*pcalloc) ( ThreadId tid, SizeT nmemb, SizeT size1 ),
263 void (*pfree) ( ThreadId tid, void* p ),
264 void (*p__builtin_delete) ( ThreadId tid, void* p ),
265 void (*p__builtin_vec_delete) ( ThreadId tid, void* p ),
266 void* (*prealloc) ( ThreadId tid, void* p, SizeT new_size ),
267 SizeT client_malloc_redzone_szB
268);
269
270/* ------------------------------------------------------------------ */
271/* Core events to track */
272
273/* Part of the core from which this call was made. Useful for determining
274 what kind of error message should be emitted. */
275typedef
276 enum { Vg_CoreStartup, Vg_CorePThread, Vg_CoreSignal, Vg_CoreSysCall,
277 Vg_CoreTranslate, Vg_CoreClientReq }
278 CorePart;
279
280/* Events happening in core to track. To be notified, pass a callback
281 function to the appropriate function. To ignore an event, don't do
282 anything (the default is for events to be ignored).
283
284 Note that most events aren't passed a ThreadId. If the event is one called
285 from generated code (eg. new_mem_stack_*), you can use
286 VG_(get_running_tid)() to find it. Otherwise, it has to be passed in,
287 as in pre_mem_read, and so the event signature will require changing.
288
289 Memory events (Nb: to track heap allocation/freeing, a tool must replace
290 malloc() et al. See above how to do this.)
291
292 These ones occur at startup, upon some signals, and upon some syscalls
293 */
294void VG_(track_new_mem_startup) (void(*f)(Addr a, SizeT len,
295 Bool rr, Bool ww, Bool xx));
296void VG_(track_new_mem_stack_signal)(void(*f)(Addr a, SizeT len));
297void VG_(track_new_mem_brk) (void(*f)(Addr a, SizeT len));
298void VG_(track_new_mem_mmap) (void(*f)(Addr a, SizeT len,
299 Bool rr, Bool ww, Bool xx));
300
301void VG_(track_copy_mem_remap) (void(*f)(Addr from, Addr to, SizeT len));
302void VG_(track_change_mem_mprotect) (void(*f)(Addr a, SizeT len,
303 Bool rr, Bool ww, Bool xx));
304void VG_(track_die_mem_stack_signal)(void(*f)(Addr a, SizeT len));
305void VG_(track_die_mem_brk) (void(*f)(Addr a, SizeT len));
306void VG_(track_die_mem_munmap) (void(*f)(Addr a, SizeT len));
307
308/* These ones are called when SP changes. A tool could track these itself
309 (except for ban_mem_stack) but it's much easier to use the core's help.
310
311 The specialised ones are called in preference to the general one, if they
312 are defined. These functions are called a lot if they are used, so
313 specialising can optimise things significantly. If any of the
314 specialised cases are defined, the general case must be defined too.
315
316 Nb: all the specialised ones must use the VGA_REGPARM(n) attribute.
317 */
318void VG_(track_new_mem_stack_4) (VGA_REGPARM(1) void(*f)(Addr new_ESP));
319void VG_(track_new_mem_stack_8) (VGA_REGPARM(1) void(*f)(Addr new_ESP));
320void VG_(track_new_mem_stack_12)(VGA_REGPARM(1) void(*f)(Addr new_ESP));
321void VG_(track_new_mem_stack_16)(VGA_REGPARM(1) void(*f)(Addr new_ESP));
322void VG_(track_new_mem_stack_32)(VGA_REGPARM(1) void(*f)(Addr new_ESP));
323void VG_(track_new_mem_stack) (void(*f)(Addr a, SizeT len));
324
325void VG_(track_die_mem_stack_4) (VGA_REGPARM(1) void(*f)(Addr die_ESP));
326void VG_(track_die_mem_stack_8) (VGA_REGPARM(1) void(*f)(Addr die_ESP));
327void VG_(track_die_mem_stack_12)(VGA_REGPARM(1) void(*f)(Addr die_ESP));
328void VG_(track_die_mem_stack_16)(VGA_REGPARM(1) void(*f)(Addr die_ESP));
329void VG_(track_die_mem_stack_32)(VGA_REGPARM(1) void(*f)(Addr die_ESP));
330void VG_(track_die_mem_stack) (void(*f)(Addr a, SizeT len));
331
332/* Used for redzone at end of thread stacks */
333void VG_(track_ban_mem_stack) (void(*f)(Addr a, SizeT len));
334
335/* These ones occur around syscalls, signal handling, etc */
336void VG_(track_pre_mem_read) (void(*f)(CorePart part, ThreadId tid,
337 Char* s, Addr a, SizeT size));
338void VG_(track_pre_mem_read_asciiz)(void(*f)(CorePart part, ThreadId tid,
339 Char* s, Addr a));
340void VG_(track_pre_mem_write) (void(*f)(CorePart part, ThreadId tid,
341 Char* s, Addr a, SizeT size));
342void VG_(track_post_mem_write) (void(*f)(CorePart part, ThreadId tid,
343 Addr a, SizeT size));
344
345/* Register events. Use VG_(set_shadow_state_area)() to set the shadow regs
346 for these events. */
347void VG_(track_pre_reg_read) (void(*f)(CorePart part, ThreadId tid,
348 Char* s, OffT guest_state_offset,
349 SizeT size));
350void VG_(track_post_reg_write)(void(*f)(CorePart part, ThreadId tid,
351 OffT guest_state_offset,
352 SizeT size));
353
354/* This one is called for malloc() et al if they are replaced by a tool. */
355void VG_(track_post_reg_write_clientcall_return)(
356 void(*f)(ThreadId tid, OffT guest_state_offset, SizeT size, Addr f));
357
358
359/* Scheduler events (not exhaustive) */
360void VG_(track_thread_run)(void(*f)(ThreadId tid));
361
362
363/* Thread events (not exhaustive)
364
365 Called during thread create, before the new thread has run any
366 instructions (or touched any memory).
367 */
368void VG_(track_post_thread_create)(void(*f)(ThreadId tid, ThreadId child));
369void VG_(track_post_thread_join) (void(*f)(ThreadId joiner, ThreadId joinee));
370
371/* Mutex events (not exhaustive)
372 "void *mutex" is really a pthread_mutex *
373
374 Called before a thread can block while waiting for a mutex (called
375 regardless of whether the thread will block or not). */
376void VG_(track_pre_mutex_lock)(void(*f)(ThreadId tid, void* mutex));
377
378/* Called once the thread actually holds the mutex (always paired with
379 pre_mutex_lock). */
380void VG_(track_post_mutex_lock)(void(*f)(ThreadId tid, void* mutex));
381
382/* Called after a thread has released a mutex (no need for a corresponding
383 pre_mutex_unlock, because unlocking can't block). */
384void VG_(track_post_mutex_unlock)(void(*f)(ThreadId tid, void* mutex));
385
386/* Signal events (not exhaustive)
387
388 ... pre_send_signal, post_send_signal ...
389
390 Called before a signal is delivered; `alt_stack' indicates if it is
391 delivered on an alternative stack. */
392void VG_(track_pre_deliver_signal) (void(*f)(ThreadId tid, Int sigNo,
393 Bool alt_stack));
394/* Called after a signal is delivered. Nb: unfortunately, if the signal
395 handler longjmps, this won't be called. */
396void VG_(track_post_deliver_signal)(void(*f)(ThreadId tid, Int sigNo));
397
398/* Others... condition variables...
399 ...
400 Shadow memory management
401 */
402void VG_(track_init_shadow_page)(void(*f)(Addr p));
403
404#endif // __PUB_TOOL_TOOLIFACE_H
405
406/*--------------------------------------------------------------------*/
407/*--- end ---*/
408/*--------------------------------------------------------------------*/