blob: 83758a8697d83d287f01fadb4c33f7d7d0ff68eb [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
sewardjb3a1e4b2015-08-21 11:32:26 +000010 Copyright (C) 2000-2015 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...) \
floriane2800c92014-09-15 20:57:45 +000046 ( vg_assert2(VG_(tdict).fn, \
njn43b9a8a2005-05-10 04:37:01 +000047 "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;
Elliott Hughesa0664b92017-04-18 17:46:52 -070084 Bool cxx_freeres;
njn43b9a8a2005-05-10 04:37:01 +000085 Bool core_errors;
86 Bool tool_errors;
sewardj0b9d74a2006-12-24 02:24:11 +000087 Bool superblock_discards;
njn43b9a8a2005-05-10 04:37:01 +000088 Bool command_line_options;
89 Bool client_requests;
njn43b9a8a2005-05-10 04:37:01 +000090 Bool syscall_wrapper;
91 Bool sanity_checks;
philippe8587b542013-12-15 20:24:43 +000092 Bool print_stats;
philippe07c08522014-05-14 20:39:27 +000093 Bool info_location;
sewardjb8b79ad2008-03-03 01:35:41 +000094 Bool var_info;
njnfc51f8d2005-06-21 03:20:17 +000095 Bool malloc_replacement;
njnca54af32006-04-16 10:25:43 +000096 Bool xml_output;
sewardj81651dc2007-08-28 06:05:20 +000097 Bool final_IR_tidy_pass;
njn43b9a8a2005-05-10 04:37:01 +000098 }
99 VgNeeds;
100
101extern VgNeeds VG_(needs);
102
103/* ---------------------------------------------------------------------
104 The dictionary of callable tool functions
105 ------------------------------------------------------------------ */
106
107typedef struct {
108 // -- 'Needs'-related functions ----------------------------------
109 // Basic functions
110 void (*tool_pre_clo_init) (void);
111 void (*tool_post_clo_init)(void);
sewardj0b9d74a2006-12-24 02:24:11 +0000112 IRSB* (*tool_instrument) (VgCallbackClosure*,
113 IRSB*,
florian3c0c9472014-09-24 12:06:55 +0000114 const VexGuestLayout*, const VexGuestExtents*,
115 const VexArchInfo*, IRType, IRType);
njn43b9a8a2005-05-10 04:37:01 +0000116 void (*tool_fini) (Int);
117
118 // VG_(needs).core_errors
119 // (none)
120
121 // VG_(needs).tool_errors
florian8e3fbb52014-10-20 19:02:38 +0000122 Bool (*tool_eq_Error) (VgRes, const Error*, const Error*);
123 void (*tool_before_pp_Error) (const Error*);
124 void (*tool_pp_Error) (const Error*);
sewardjadb102f2007-11-09 23:21:44 +0000125 Bool tool_show_ThreadIDs_for_errors;
florian8e3fbb52014-10-20 19:02:38 +0000126 UInt (*tool_update_extra) (const Error*);
florian19f91bb2012-11-10 22:29:54 +0000127 Bool (*tool_recognised_suppression) (const HChar*, Supp*);
philippe362441d2013-07-22 22:00:13 +0000128 Bool (*tool_read_extra_suppression_info) (Int, HChar**, SizeT*, Int*,
129 Supp*);
florian8e3fbb52014-10-20 19:02:38 +0000130 Bool (*tool_error_matches_suppression) (const Error*, const Supp*);
131 const HChar* (*tool_get_error_name) (const Error*);
132 SizeT (*tool_get_extra_suppression_info) (const Error*,/*OUT*/HChar*,Int);
133 SizeT (*tool_print_extra_suppression_use) (const Supp*,/*OUT*/HChar*,Int);
134 void (*tool_update_extra_suppression_use) (const Error*, const Supp*);
njn43b9a8a2005-05-10 04:37:01 +0000135
sewardj0b9d74a2006-12-24 02:24:11 +0000136 // VG_(needs).superblock_discards
florianddd61ff2015-01-04 17:20:45 +0000137 void (*tool_discard_superblock_info)(Addr, VexGuestExtents);
njn43b9a8a2005-05-10 04:37:01 +0000138
139 // VG_(needs).command_line_options
florian19f91bb2012-11-10 22:29:54 +0000140 Bool (*tool_process_cmd_line_option)(const HChar*);
njn43b9a8a2005-05-10 04:37:01 +0000141 void (*tool_print_usage) (void);
142 void (*tool_print_debug_usage) (void);
143
144 // VG_(needs).client_requests
145 Bool (*tool_handle_client_request)(ThreadId, UWord*, UWord*);
146
147 // VG_(needs).syscall_wrapper
sewardj1c0ce7a2009-07-01 08:10:49 +0000148 void (*tool_pre_syscall) (ThreadId, UInt, UWord*, UInt);
149 void (*tool_post_syscall)(ThreadId, UInt, UWord*, UInt, SysRes);
njn43b9a8a2005-05-10 04:37:01 +0000150
151 // VG_(needs).sanity_checks
152 Bool (*tool_cheap_sanity_check)(void);
153 Bool (*tool_expensive_sanity_check)(void);
154
philippe8587b542013-12-15 20:24:43 +0000155 // VG_(needs).print_stats
156 void (*tool_print_stats)(void);
157
philippe07c08522014-05-14 20:39:27 +0000158 // VG_(needs).info_location
159 void (*tool_info_location)(Addr a);
160
njnfc51f8d2005-06-21 03:20:17 +0000161 // VG_(needs).malloc_replacement
162 void* (*tool_malloc) (ThreadId, SizeT);
163 void* (*tool___builtin_new) (ThreadId, SizeT);
164 void* (*tool___builtin_vec_new) (ThreadId, SizeT);
165 void* (*tool_memalign) (ThreadId, SizeT, SizeT);
166 void* (*tool_calloc) (ThreadId, SizeT, SizeT);
167 void (*tool_free) (ThreadId, void*);
168 void (*tool___builtin_delete) (ThreadId, void*);
169 void (*tool___builtin_vec_delete)(ThreadId, void*);
170 void* (*tool_realloc) (ThreadId, void*, SizeT);
njn8b140de2009-02-17 04:31:18 +0000171 SizeT (*tool_malloc_usable_size) (ThreadId, void*);
njnfc51f8d2005-06-21 03:20:17 +0000172 SizeT tool_client_redzone_szB;
173
sewardj81651dc2007-08-28 06:05:20 +0000174 // VG_(needs).final_IR_tidy_pass
175 IRSB* (*tool_final_IR_tidy_pass) (IRSB*);
176
sewardj738856f2009-07-15 14:48:32 +0000177 // VG_(needs).xml_output
178 // (none)
179
njn43b9a8a2005-05-10 04:37:01 +0000180 // -- Event tracking functions ------------------------------------
sewardj9c606bd2008-09-18 18:12:50 +0000181 void (*track_new_mem_startup) (Addr, SizeT, Bool, Bool, Bool, ULong);
sewardj7cf4e6b2008-05-01 20:24:26 +0000182 void (*track_new_mem_stack_signal)(Addr, SizeT, ThreadId);
183 void (*track_new_mem_brk) (Addr, SizeT, ThreadId);
sewardj9c606bd2008-09-18 18:12:50 +0000184 void (*track_new_mem_mmap) (Addr, SizeT, Bool, Bool, Bool, ULong);
njn43b9a8a2005-05-10 04:37:01 +0000185
sewardj45f4e7c2005-09-27 19:20:21 +0000186 void (*track_copy_mem_remap) (Addr src, Addr dst, SizeT);
njn43b9a8a2005-05-10 04:37:01 +0000187 void (*track_change_mem_mprotect) (Addr, SizeT, Bool, Bool, Bool);
188 void (*track_die_mem_stack_signal)(Addr, SizeT);
189 void (*track_die_mem_brk) (Addr, SizeT);
190 void (*track_die_mem_munmap) (Addr, SizeT);
191
sewardj7cf4e6b2008-05-01 20:24:26 +0000192 void VG_REGPARM(2) (*track_new_mem_stack_4_w_ECU) (Addr,UInt);
193 void VG_REGPARM(2) (*track_new_mem_stack_8_w_ECU) (Addr,UInt);
194 void VG_REGPARM(2) (*track_new_mem_stack_12_w_ECU) (Addr,UInt);
195 void VG_REGPARM(2) (*track_new_mem_stack_16_w_ECU) (Addr,UInt);
196 void VG_REGPARM(2) (*track_new_mem_stack_32_w_ECU) (Addr,UInt);
197 void VG_REGPARM(2) (*track_new_mem_stack_112_w_ECU)(Addr,UInt);
198 void VG_REGPARM(2) (*track_new_mem_stack_128_w_ECU)(Addr,UInt);
199 void VG_REGPARM(2) (*track_new_mem_stack_144_w_ECU)(Addr,UInt);
200 void VG_REGPARM(2) (*track_new_mem_stack_160_w_ECU)(Addr,UInt);
201 void (*track_new_mem_stack_w_ECU)(Addr,SizeT,UInt);
202
sewardjf5c8e372006-02-12 15:42:20 +0000203 void VG_REGPARM(1) (*track_new_mem_stack_4) (Addr);
204 void VG_REGPARM(1) (*track_new_mem_stack_8) (Addr);
205 void VG_REGPARM(1) (*track_new_mem_stack_12) (Addr);
206 void VG_REGPARM(1) (*track_new_mem_stack_16) (Addr);
207 void VG_REGPARM(1) (*track_new_mem_stack_32) (Addr);
208 void VG_REGPARM(1) (*track_new_mem_stack_112)(Addr);
209 void VG_REGPARM(1) (*track_new_mem_stack_128)(Addr);
210 void VG_REGPARM(1) (*track_new_mem_stack_144)(Addr);
211 void VG_REGPARM(1) (*track_new_mem_stack_160)(Addr);
sewardj7cf4e6b2008-05-01 20:24:26 +0000212 void (*track_new_mem_stack)(Addr,SizeT);
njn43b9a8a2005-05-10 04:37:01 +0000213
sewardjf5c8e372006-02-12 15:42:20 +0000214 void VG_REGPARM(1) (*track_die_mem_stack_4) (Addr);
215 void VG_REGPARM(1) (*track_die_mem_stack_8) (Addr);
216 void VG_REGPARM(1) (*track_die_mem_stack_12) (Addr);
217 void VG_REGPARM(1) (*track_die_mem_stack_16) (Addr);
218 void VG_REGPARM(1) (*track_die_mem_stack_32) (Addr);
219 void VG_REGPARM(1) (*track_die_mem_stack_112)(Addr);
220 void VG_REGPARM(1) (*track_die_mem_stack_128)(Addr);
221 void VG_REGPARM(1) (*track_die_mem_stack_144)(Addr);
222 void VG_REGPARM(1) (*track_die_mem_stack_160)(Addr);
njn43b9a8a2005-05-10 04:37:01 +0000223 void (*track_die_mem_stack)(Addr, SizeT);
224
225 void (*track_ban_mem_stack)(Addr, SizeT);
226
floriane543f302012-10-21 19:43:43 +0000227 void (*track_pre_mem_read) (CorePart, ThreadId, const HChar*, Addr, SizeT);
228 void (*track_pre_mem_read_asciiz)(CorePart, ThreadId, const HChar*, Addr);
229 void (*track_pre_mem_write) (CorePart, ThreadId, const HChar*, Addr, SizeT);
njn43b9a8a2005-05-10 04:37:01 +0000230 void (*track_post_mem_write) (CorePart, ThreadId, Addr, SizeT);
231
floriane543f302012-10-21 19:43:43 +0000232 void (*track_pre_reg_read) (CorePart, ThreadId, const HChar*, PtrdiffT, SizeT);
233 void (*track_post_reg_write)(CorePart, ThreadId, PtrdiffT, SizeT);
njnc4431bf2009-01-15 21:29:24 +0000234 void (*track_post_reg_write_clientcall_return)(ThreadId, PtrdiffT, SizeT,
235 Addr);
njn43b9a8a2005-05-10 04:37:01 +0000236
sewardj8eb8bab2015-07-21 14:44:28 +0000237 void (*track_copy_mem_to_reg)(CorePart, ThreadId, Addr, PtrdiffT, SizeT);
238 void (*track_copy_reg_to_mem)(CorePart, ThreadId, PtrdiffT, Addr, SizeT);
239
njn3e32c872006-12-24 07:51:17 +0000240 void (*track_start_client_code)(ThreadId, ULong);
241 void (*track_stop_client_code) (ThreadId, ULong);
njn43b9a8a2005-05-10 04:37:01 +0000242
sewardjadb102f2007-11-09 23:21:44 +0000243 void (*track_pre_thread_ll_create)(ThreadId, ThreadId);
sewardj7a387ea2007-11-25 14:06:06 +0000244 void (*track_pre_thread_first_insn)(ThreadId);
sewardjadb102f2007-11-09 23:21:44 +0000245 void (*track_pre_thread_ll_exit) (ThreadId);
njn43b9a8a2005-05-10 04:37:01 +0000246
njn43b9a8a2005-05-10 04:37:01 +0000247 void (*track_pre_deliver_signal) (ThreadId, Int sigNo, Bool);
248 void (*track_post_deliver_signal)(ThreadId, Int sigNo);
249
njn43b9a8a2005-05-10 04:37:01 +0000250} VgToolInterface;
251
252extern VgToolInterface VG_(tdict);
253
254/* ---------------------------------------------------------------------
255 Miscellaneous functions
256 ------------------------------------------------------------------ */
257
florian2b8059a2012-10-14 16:45:23 +0000258Bool VG_(sanity_check_needs) ( const HChar** failmsg );
njn43b9a8a2005-05-10 04:37:01 +0000259
260#endif // __PUB_CORE_TOOLIFACE_H
261
262/*--------------------------------------------------------------------*/
263/*--- end ---*/
264/*--------------------------------------------------------------------*/