blob: 056d173535133d017d4e52bea6af05fb7160b761 [file] [log] [blame]
njn43b9a8a2005-05-10 04:37:01 +00001
2/*--------------------------------------------------------------------*/
3/*--- The core/tool interface. pub_core_tooliface.h ---*/
4/*--------------------------------------------------------------------*/
5
6/*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
sewardj03f8d3f2012-08-05 15:46:46 +000010 Copyright (C) 2000-2012 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_CORE_TOOLIFACE_H
32#define __PUB_CORE_TOOLIFACE_H
33
34#include "pub_tool_tooliface.h"
35
36//--------------------------------------------------------------------
37// PURPOSE: This module encapsulates the key parts of the core/tool
38// interface: 'details', 'needs' and 'trackable events'.
39//--------------------------------------------------------------------
40
41// Note the use of C's comma operator here -- it means that we execute both
42// statements, and the rvalue of the whole thing is the rvalue of the last
43// statement. This lets us say "x = VG_TDICT_CALL(...)" in the required
44// places, while still checking the assertion.
45#define VG_TDICT_CALL(fn, args...) \
46 ( tl_assert2(VG_(tdict).fn, \
47 "you forgot to set VgToolInterface function '" #fn "'"), \
48 VG_(tdict).fn(args) )
49
50#define VG_TRACK(fn, args...) \
51 do { \
52 if (VG_(tdict).track_##fn) \
53 VG_(tdict).track_##fn(args); \
54 } while(0)
55
56/* These structs are not exposed to tools to mitigate possibility of
57 binary-incompatibilities when the core/tool interface changes. Instead,
njnc7561b92005-06-19 01:24:32 +000058 set functions are provided (see include/pub_tool_tooliface.h). */
njn43b9a8a2005-05-10 04:37:01 +000059
60/* ---------------------------------------------------------------------
61 'Details'
62 ------------------------------------------------------------------ */
63
64typedef
65 struct {
florian2b8059a2012-10-14 16:45:23 +000066 const HChar* name;
67 const HChar* version;
68 const HChar* description;
69 const HChar* copyright_author;
70 const HChar* bug_reports_to;
njn43b9a8a2005-05-10 04:37:01 +000071 UInt avg_translation_sizeB;
72 }
73 VgDetails;
74
75extern VgDetails VG_(details);
76
77/* ---------------------------------------------------------------------
78 'Needs'
79 ------------------------------------------------------------------ */
80
81typedef
82 struct {
83 Bool libc_freeres;
84 Bool core_errors;
85 Bool tool_errors;
sewardj0b9d74a2006-12-24 02:24:11 +000086 Bool superblock_discards;
njn43b9a8a2005-05-10 04:37:01 +000087 Bool command_line_options;
88 Bool client_requests;
njn43b9a8a2005-05-10 04:37:01 +000089 Bool syscall_wrapper;
90 Bool sanity_checks;
sewardjb8b79ad2008-03-03 01:35:41 +000091 Bool var_info;
njnfc51f8d2005-06-21 03:20:17 +000092 Bool malloc_replacement;
njnca54af32006-04-16 10:25:43 +000093 Bool xml_output;
sewardj81651dc2007-08-28 06:05:20 +000094 Bool final_IR_tidy_pass;
njn43b9a8a2005-05-10 04:37:01 +000095 }
96 VgNeeds;
97
98extern VgNeeds VG_(needs);
99
100/* ---------------------------------------------------------------------
101 The dictionary of callable tool functions
102 ------------------------------------------------------------------ */
103
104typedef struct {
105 // -- 'Needs'-related functions ----------------------------------
106 // Basic functions
107 void (*tool_pre_clo_init) (void);
108 void (*tool_post_clo_init)(void);
sewardj0b9d74a2006-12-24 02:24:11 +0000109 IRSB* (*tool_instrument) (VgCallbackClosure*,
110 IRSB*,
sewardj461df9c2006-01-17 02:06:39 +0000111 VexGuestLayout*, VexGuestExtents*,
florianca503be2012-10-07 21:59:42 +0000112 VexArchInfo*, IRType, IRType);
njn43b9a8a2005-05-10 04:37:01 +0000113 void (*tool_fini) (Int);
114
115 // VG_(needs).core_errors
116 // (none)
117
118 // VG_(needs).tool_errors
119 Bool (*tool_eq_Error) (VgRes, Error*, Error*);
sewardj738856f2009-07-15 14:48:32 +0000120 void (*tool_before_pp_Error) (Error*);
njn43b9a8a2005-05-10 04:37:01 +0000121 void (*tool_pp_Error) (Error*);
sewardjadb102f2007-11-09 23:21:44 +0000122 Bool tool_show_ThreadIDs_for_errors;
njn43b9a8a2005-05-10 04:37:01 +0000123 UInt (*tool_update_extra) (Error*);
florian19f91bb2012-11-10 22:29:54 +0000124 Bool (*tool_recognised_suppression) (const HChar*, Supp*);
125 Bool (*tool_read_extra_suppression_info) (Int, HChar**, SizeT*, Supp*);
njn43b9a8a2005-05-10 04:37:01 +0000126 Bool (*tool_error_matches_suppression) (Error*, Supp*);
floriane543f302012-10-21 19:43:43 +0000127 const HChar* (*tool_get_error_name) (Error*);
floriandbb35842012-10-27 18:39:11 +0000128 Bool (*tool_get_extra_suppression_info) (Error*,/*OUT*/HChar*,Int);
njn43b9a8a2005-05-10 04:37:01 +0000129
sewardj0b9d74a2006-12-24 02:24:11 +0000130 // VG_(needs).superblock_discards
131 void (*tool_discard_superblock_info)(Addr64, VexGuestExtents);
njn43b9a8a2005-05-10 04:37:01 +0000132
133 // VG_(needs).command_line_options
florian19f91bb2012-11-10 22:29:54 +0000134 Bool (*tool_process_cmd_line_option)(const HChar*);
njn43b9a8a2005-05-10 04:37:01 +0000135 void (*tool_print_usage) (void);
136 void (*tool_print_debug_usage) (void);
137
138 // VG_(needs).client_requests
139 Bool (*tool_handle_client_request)(ThreadId, UWord*, UWord*);
140
141 // VG_(needs).syscall_wrapper
sewardj1c0ce7a2009-07-01 08:10:49 +0000142 void (*tool_pre_syscall) (ThreadId, UInt, UWord*, UInt);
143 void (*tool_post_syscall)(ThreadId, UInt, UWord*, UInt, SysRes);
njn43b9a8a2005-05-10 04:37:01 +0000144
145 // VG_(needs).sanity_checks
146 Bool (*tool_cheap_sanity_check)(void);
147 Bool (*tool_expensive_sanity_check)(void);
148
njnfc51f8d2005-06-21 03:20:17 +0000149 // VG_(needs).malloc_replacement
150 void* (*tool_malloc) (ThreadId, SizeT);
151 void* (*tool___builtin_new) (ThreadId, SizeT);
152 void* (*tool___builtin_vec_new) (ThreadId, SizeT);
153 void* (*tool_memalign) (ThreadId, SizeT, SizeT);
154 void* (*tool_calloc) (ThreadId, SizeT, SizeT);
155 void (*tool_free) (ThreadId, void*);
156 void (*tool___builtin_delete) (ThreadId, void*);
157 void (*tool___builtin_vec_delete)(ThreadId, void*);
158 void* (*tool_realloc) (ThreadId, void*, SizeT);
njn8b140de2009-02-17 04:31:18 +0000159 SizeT (*tool_malloc_usable_size) (ThreadId, void*);
njnfc51f8d2005-06-21 03:20:17 +0000160 SizeT tool_client_redzone_szB;
161
sewardj81651dc2007-08-28 06:05:20 +0000162 // VG_(needs).final_IR_tidy_pass
163 IRSB* (*tool_final_IR_tidy_pass) (IRSB*);
164
sewardj738856f2009-07-15 14:48:32 +0000165 // VG_(needs).xml_output
166 // (none)
167
njn43b9a8a2005-05-10 04:37:01 +0000168 // -- Event tracking functions ------------------------------------
sewardj9c606bd2008-09-18 18:12:50 +0000169 void (*track_new_mem_startup) (Addr, SizeT, Bool, Bool, Bool, ULong);
sewardj7cf4e6b2008-05-01 20:24:26 +0000170 void (*track_new_mem_stack_signal)(Addr, SizeT, ThreadId);
171 void (*track_new_mem_brk) (Addr, SizeT, ThreadId);
sewardj9c606bd2008-09-18 18:12:50 +0000172 void (*track_new_mem_mmap) (Addr, SizeT, Bool, Bool, Bool, ULong);
njn43b9a8a2005-05-10 04:37:01 +0000173
sewardj45f4e7c2005-09-27 19:20:21 +0000174 void (*track_copy_mem_remap) (Addr src, Addr dst, SizeT);
njn43b9a8a2005-05-10 04:37:01 +0000175 void (*track_change_mem_mprotect) (Addr, SizeT, Bool, Bool, Bool);
176 void (*track_die_mem_stack_signal)(Addr, SizeT);
177 void (*track_die_mem_brk) (Addr, SizeT);
178 void (*track_die_mem_munmap) (Addr, SizeT);
179
sewardj7cf4e6b2008-05-01 20:24:26 +0000180 void VG_REGPARM(2) (*track_new_mem_stack_4_w_ECU) (Addr,UInt);
181 void VG_REGPARM(2) (*track_new_mem_stack_8_w_ECU) (Addr,UInt);
182 void VG_REGPARM(2) (*track_new_mem_stack_12_w_ECU) (Addr,UInt);
183 void VG_REGPARM(2) (*track_new_mem_stack_16_w_ECU) (Addr,UInt);
184 void VG_REGPARM(2) (*track_new_mem_stack_32_w_ECU) (Addr,UInt);
185 void VG_REGPARM(2) (*track_new_mem_stack_112_w_ECU)(Addr,UInt);
186 void VG_REGPARM(2) (*track_new_mem_stack_128_w_ECU)(Addr,UInt);
187 void VG_REGPARM(2) (*track_new_mem_stack_144_w_ECU)(Addr,UInt);
188 void VG_REGPARM(2) (*track_new_mem_stack_160_w_ECU)(Addr,UInt);
189 void (*track_new_mem_stack_w_ECU)(Addr,SizeT,UInt);
190
sewardjf5c8e372006-02-12 15:42:20 +0000191 void VG_REGPARM(1) (*track_new_mem_stack_4) (Addr);
192 void VG_REGPARM(1) (*track_new_mem_stack_8) (Addr);
193 void VG_REGPARM(1) (*track_new_mem_stack_12) (Addr);
194 void VG_REGPARM(1) (*track_new_mem_stack_16) (Addr);
195 void VG_REGPARM(1) (*track_new_mem_stack_32) (Addr);
196 void VG_REGPARM(1) (*track_new_mem_stack_112)(Addr);
197 void VG_REGPARM(1) (*track_new_mem_stack_128)(Addr);
198 void VG_REGPARM(1) (*track_new_mem_stack_144)(Addr);
199 void VG_REGPARM(1) (*track_new_mem_stack_160)(Addr);
sewardj7cf4e6b2008-05-01 20:24:26 +0000200 void (*track_new_mem_stack)(Addr,SizeT);
njn43b9a8a2005-05-10 04:37:01 +0000201
sewardjf5c8e372006-02-12 15:42:20 +0000202 void VG_REGPARM(1) (*track_die_mem_stack_4) (Addr);
203 void VG_REGPARM(1) (*track_die_mem_stack_8) (Addr);
204 void VG_REGPARM(1) (*track_die_mem_stack_12) (Addr);
205 void VG_REGPARM(1) (*track_die_mem_stack_16) (Addr);
206 void VG_REGPARM(1) (*track_die_mem_stack_32) (Addr);
207 void VG_REGPARM(1) (*track_die_mem_stack_112)(Addr);
208 void VG_REGPARM(1) (*track_die_mem_stack_128)(Addr);
209 void VG_REGPARM(1) (*track_die_mem_stack_144)(Addr);
210 void VG_REGPARM(1) (*track_die_mem_stack_160)(Addr);
njn43b9a8a2005-05-10 04:37:01 +0000211 void (*track_die_mem_stack)(Addr, SizeT);
212
213 void (*track_ban_mem_stack)(Addr, SizeT);
214
floriane543f302012-10-21 19:43:43 +0000215 void (*track_pre_mem_read) (CorePart, ThreadId, const HChar*, Addr, SizeT);
216 void (*track_pre_mem_read_asciiz)(CorePart, ThreadId, const HChar*, Addr);
217 void (*track_pre_mem_write) (CorePart, ThreadId, const HChar*, Addr, SizeT);
njn43b9a8a2005-05-10 04:37:01 +0000218 void (*track_post_mem_write) (CorePart, ThreadId, Addr, SizeT);
219
floriane543f302012-10-21 19:43:43 +0000220 void (*track_pre_reg_read) (CorePart, ThreadId, const HChar*, PtrdiffT, SizeT);
221 void (*track_post_reg_write)(CorePart, ThreadId, PtrdiffT, SizeT);
njnc4431bf2009-01-15 21:29:24 +0000222 void (*track_post_reg_write_clientcall_return)(ThreadId, PtrdiffT, SizeT,
223 Addr);
njn43b9a8a2005-05-10 04:37:01 +0000224
njn3e32c872006-12-24 07:51:17 +0000225 void (*track_start_client_code)(ThreadId, ULong);
226 void (*track_stop_client_code) (ThreadId, ULong);
njn43b9a8a2005-05-10 04:37:01 +0000227
sewardjadb102f2007-11-09 23:21:44 +0000228 void (*track_pre_thread_ll_create)(ThreadId, ThreadId);
sewardj7a387ea2007-11-25 14:06:06 +0000229 void (*track_pre_thread_first_insn)(ThreadId);
sewardjadb102f2007-11-09 23:21:44 +0000230 void (*track_pre_thread_ll_exit) (ThreadId);
njn43b9a8a2005-05-10 04:37:01 +0000231
njn43b9a8a2005-05-10 04:37:01 +0000232 void (*track_pre_deliver_signal) (ThreadId, Int sigNo, Bool);
233 void (*track_post_deliver_signal)(ThreadId, Int sigNo);
234
njn43b9a8a2005-05-10 04:37:01 +0000235} VgToolInterface;
236
237extern VgToolInterface VG_(tdict);
238
239/* ---------------------------------------------------------------------
240 Miscellaneous functions
241 ------------------------------------------------------------------ */
242
florian2b8059a2012-10-14 16:45:23 +0000243Bool VG_(sanity_check_needs) ( const HChar** failmsg );
njn43b9a8a2005-05-10 04:37:01 +0000244
245#endif // __PUB_CORE_TOOLIFACE_H
246
247/*--------------------------------------------------------------------*/
248/*--- end ---*/
249/*--------------------------------------------------------------------*/