blob: 31b5f6ce97cdc4b84fa87d03ade0b0d85939df37 [file] [log] [blame]
njn810086f2002-11-14 12:42:47 +00001
2/*--------------------------------------------------------------------*/
nethercote7cc9c232004-01-21 15:08:04 +00003/*--- Stuff relating to tool data structures. ---*/
sewardja7658342005-05-17 13:43:54 +00004/*--- m_tooliface.c ---*/
njn810086f2002-11-14 12:42:47 +00005/*--------------------------------------------------------------------*/
6
7/*
njnb9c427c2004-12-01 14:14:42 +00008 This file is part of Valgrind, a dynamic binary instrumentation
9 framework.
njn810086f2002-11-14 12:42:47 +000010
Elliott Hughesed398002017-06-21 14:41:24 -070011 Copyright (C) 2000-2017 Nicholas Nethercote
njn2bc10122005-05-08 02:10:27 +000012 njn@valgrind.org
njn810086f2002-11-14 12:42:47 +000013
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation; either version 2 of the
17 License, or (at your option) any later version.
18
19 This program is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27 02111-1307, USA.
28
29 The GNU General Public License is contained in the file COPYING.
30*/
31
njnc7561b92005-06-19 01:24:32 +000032#include "pub_core_basics.h"
njn4802b382005-06-11 04:58:29 +000033#include "pub_core_tooliface.h"
florian5f1aeb62015-01-13 17:33:59 +000034#include "pub_core_transtab.h" /* VG_(ok_to_discard_translations) */
njn810086f2002-11-14 12:42:47 +000035
njn51d827b2005-05-09 01:02:08 +000036// The core/tool dictionary of functions (initially zeroed, as we want it)
37VgToolInterface VG_(tdict);
njn810086f2002-11-14 12:42:47 +000038
njn8a97c6d2005-03-31 04:37:24 +000039/*--------------------------------------------------------------------*/
40/* Setting basic functions */
41
42void VG_(basic_tool_funcs)(
43 void(*post_clo_init)(void),
sewardj0b9d74a2006-12-24 02:24:11 +000044 IRSB*(*instrument)(VgCallbackClosure*, IRSB*,
florian3c0c9472014-09-24 12:06:55 +000045 const VexGuestLayout*, const VexGuestExtents*,
46 const VexArchInfo*, IRType, IRType),
njn8a97c6d2005-03-31 04:37:24 +000047 void(*fini)(Int)
48)
49{
njncf81d552005-03-31 04:52:26 +000050 VG_(tdict).tool_post_clo_init = post_clo_init;
51 VG_(tdict).tool_instrument = instrument;
52 VG_(tdict).tool_fini = fini;
njn8a97c6d2005-03-31 04:37:24 +000053}
54
njn51d827b2005-05-09 01:02:08 +000055
njn8a97c6d2005-03-31 04:37:24 +000056/*--------------------------------------------------------------------*/
57/* Setting details */
58
njn810086f2002-11-14 12:42:47 +000059/* Init with default values. */
60VgDetails VG_(details) = {
sewardjc0d8f682002-11-30 00:49:43 +000061 .name = NULL,
62 .version = NULL,
63 .description = NULL,
64 .copyright_author = NULL,
65 .bug_reports_to = NULL,
njn120281f2003-02-03 12:20:07 +000066 .avg_translation_sizeB = VG_DEFAULT_TRANS_SIZEB,
njn810086f2002-11-14 12:42:47 +000067};
68
njn8a97c6d2005-03-31 04:37:24 +000069/* Use macro because they're so repetitive */
70#define DETAILS(type, detail) \
71 extern void VG_(details_##detail)(type detail) \
72 { \
73 VG_(details).detail = detail; \
74 }
75
florian2b8059a2012-10-14 16:45:23 +000076DETAILS(const HChar*, name)
77DETAILS(const HChar*, version)
78DETAILS(const HChar*, description)
79DETAILS(const HChar*, copyright_author)
80DETAILS(const HChar*, bug_reports_to)
njn8a97c6d2005-03-31 04:37:24 +000081DETAILS(UInt, avg_translation_sizeB)
82
njn51d827b2005-05-09 01:02:08 +000083
njn8a97c6d2005-03-31 04:37:24 +000084/*--------------------------------------------------------------------*/
85/* Setting needs */
86
njn810086f2002-11-14 12:42:47 +000087VgNeeds VG_(needs) = {
88 .core_errors = False,
njn95ec8702004-11-22 16:46:13 +000089 .tool_errors = False,
njn810086f2002-11-14 12:42:47 +000090 .libc_freeres = False,
Elliott Hughesa0664b92017-04-18 17:46:52 -070091 .cxx_freeres = False,
sewardj0b9d74a2006-12-24 02:24:11 +000092 .superblock_discards = False,
njn810086f2002-11-14 12:42:47 +000093 .command_line_options = False,
94 .client_requests = False,
njn810086f2002-11-14 12:42:47 +000095 .syscall_wrapper = False,
njn810086f2002-11-14 12:42:47 +000096 .sanity_checks = False,
philippe8587b542013-12-15 20:24:43 +000097 .print_stats = False,
philippe07c08522014-05-14 20:39:27 +000098 .info_location = False,
sewardjb8b79ad2008-03-03 01:35:41 +000099 .var_info = False,
njnfc51f8d2005-06-21 03:20:17 +0000100 .malloc_replacement = False,
njnca54af32006-04-16 10:25:43 +0000101 .xml_output = False,
sewardj81651dc2007-08-28 06:05:20 +0000102 .final_IR_tidy_pass = False
njn810086f2002-11-14 12:42:47 +0000103};
104
105/* static */
florian2b8059a2012-10-14 16:45:23 +0000106Bool VG_(sanity_check_needs)(const HChar** failmsg)
njn810086f2002-11-14 12:42:47 +0000107{
sewardj7cf4e6b2008-05-01 20:24:26 +0000108 Bool any_new_mem_stack_N, any_new_mem_stack_N_w_ECU;
109 Bool any_new_mem_stack_w_conflicting_otags;
110 Bool any_die_mem_stack_N;
111
njn64c83242005-06-21 01:54:38 +0000112#define CHECK_NOT(var, value) \
113 if ((var)==(value)) { \
sewardj7cf4e6b2008-05-01 20:24:26 +0000114 *failmsg = "Tool error: '" #var "' not initialised\n"; \
njn64c83242005-06-21 01:54:38 +0000115 return False; \
njn810086f2002-11-14 12:42:47 +0000116 }
117
njn120281f2003-02-03 12:20:07 +0000118 /* Ones that must be set */
njn810086f2002-11-14 12:42:47 +0000119 CHECK_NOT(VG_(details).name, NULL);
120 /* Nb: .version can be NULL */
121 CHECK_NOT(VG_(details).description, NULL);
122 CHECK_NOT(VG_(details).copyright_author, NULL);
123 CHECK_NOT(VG_(details).bug_reports_to, NULL);
124
sewardj7cf4e6b2008-05-01 20:24:26 +0000125 /* Check that new_mem_stack is defined if any new_mem_stack_N
126 are. */
127 any_new_mem_stack_N
128 = VG_(tdict).track_new_mem_stack_4 ||
129 VG_(tdict).track_new_mem_stack_8 ||
130 VG_(tdict).track_new_mem_stack_12 ||
131 VG_(tdict).track_new_mem_stack_16 ||
132 VG_(tdict).track_new_mem_stack_32 ||
133 VG_(tdict).track_new_mem_stack_112 ||
134 VG_(tdict).track_new_mem_stack_128 ||
135 VG_(tdict).track_new_mem_stack_144 ||
136 VG_(tdict).track_new_mem_stack_160;
137
138 if (any_new_mem_stack_N && ! VG_(tdict).track_new_mem_stack) {
139 *failmsg = "Tool error: one of the specialised 'new_mem_stack_N'\n"
njn64c83242005-06-21 01:54:38 +0000140 " events tracked, but not the generic 'new_mem_stack' one.\n"
141 " 'new_mem_stack' should be defined\n";
142 return False;
njn9b007f62003-04-07 14:40:25 +0000143 }
144
sewardj7cf4e6b2008-05-01 20:24:26 +0000145 /* Check that new_mem_stack_w_ECU is defined if any
146 new_mem_stack_N_w_ECU are. */
147 any_new_mem_stack_N_w_ECU
148 = VG_(tdict).track_new_mem_stack_4_w_ECU ||
149 VG_(tdict).track_new_mem_stack_8_w_ECU ||
150 VG_(tdict).track_new_mem_stack_12_w_ECU ||
151 VG_(tdict).track_new_mem_stack_16_w_ECU ||
152 VG_(tdict).track_new_mem_stack_32_w_ECU ||
153 VG_(tdict).track_new_mem_stack_112_w_ECU ||
154 VG_(tdict).track_new_mem_stack_128_w_ECU ||
155 VG_(tdict).track_new_mem_stack_144_w_ECU ||
156 VG_(tdict).track_new_mem_stack_160_w_ECU;
157
158 if (any_new_mem_stack_N_w_ECU && ! VG_(tdict).track_new_mem_stack_w_ECU) {
159 *failmsg = "Tool error: one of the specialised 'new_mem_stack_N_w_ECU'\n"
160 " events tracked, but not the generic 'new_mem_stack_w_ECU' one.\n"
161 " 'new_mem_stack_w_ECU' should be defined\n";
162 return False;
163 }
164
165 /* Check that in no cases are both with- and without-otag versions of the
166 same new_mem_stack_ function defined. */
167 any_new_mem_stack_w_conflicting_otags
168 = (VG_(tdict).track_new_mem_stack_4 && VG_(tdict).track_new_mem_stack_4_w_ECU) ||
169 (VG_(tdict).track_new_mem_stack_8 && VG_(tdict).track_new_mem_stack_8_w_ECU) ||
170 (VG_(tdict).track_new_mem_stack_12 && VG_(tdict).track_new_mem_stack_12_w_ECU) ||
171 (VG_(tdict).track_new_mem_stack_16 && VG_(tdict).track_new_mem_stack_16_w_ECU) ||
172 (VG_(tdict).track_new_mem_stack_32 && VG_(tdict).track_new_mem_stack_32_w_ECU) ||
173 (VG_(tdict).track_new_mem_stack_112 && VG_(tdict).track_new_mem_stack_112_w_ECU) ||
174 (VG_(tdict).track_new_mem_stack_128 && VG_(tdict).track_new_mem_stack_128_w_ECU) ||
175 (VG_(tdict).track_new_mem_stack_144 && VG_(tdict).track_new_mem_stack_144_w_ECU) ||
176 (VG_(tdict).track_new_mem_stack_160 && VG_(tdict).track_new_mem_stack_160_w_ECU) ||
177 (VG_(tdict).track_new_mem_stack && VG_(tdict).track_new_mem_stack_w_ECU);
178
179 if (any_new_mem_stack_w_conflicting_otags) {
180 *failmsg = "Tool error: tool supplies both a 'new_mem_stack_N' and a\n"
181 " 'new_mem_stack_N_w_ECU' function for some N (or none),\n"
182 " but you can only have one or the other (not both)\n";
183 return False;
184 }
185
186 /* Check that die_mem_stack is defined if any die_mem_stack_N
187 are. */
188 any_die_mem_stack_N
189 = VG_(tdict).track_die_mem_stack_4 ||
190 VG_(tdict).track_die_mem_stack_8 ||
191 VG_(tdict).track_die_mem_stack_12 ||
192 VG_(tdict).track_die_mem_stack_16 ||
193 VG_(tdict).track_die_mem_stack_32 ||
194 VG_(tdict).track_die_mem_stack_112 ||
195 VG_(tdict).track_die_mem_stack_128 ||
196 VG_(tdict).track_die_mem_stack_144 ||
197 VG_(tdict).track_die_mem_stack_160;
198
199 if (any_die_mem_stack_N && ! VG_(tdict).track_die_mem_stack) {
200 *failmsg = "Tool error: one of the specialised 'die_mem_stack_N'\n"
njn64c83242005-06-21 01:54:38 +0000201 " events tracked, but not the generic 'die_mem_stack' one.\n"
202 " 'die_mem_stack' should be defined\n";
203 return False;
njn9b007f62003-04-07 14:40:25 +0000204 }
205
njn64c83242005-06-21 01:54:38 +0000206 return True;
207
njn810086f2002-11-14 12:42:47 +0000208#undef CHECK_NOT
njn810086f2002-11-14 12:42:47 +0000209}
210
njn810086f2002-11-14 12:42:47 +0000211/* Use macro because they're so repetitive */
212#define NEEDS(need) \
213 extern void VG_(needs_##need)(void) \
214 { \
215 VG_(needs).need = True; \
216 }
217
njn8a97c6d2005-03-31 04:37:24 +0000218// These ones don't require any tool-supplied functions
njn810086f2002-11-14 12:42:47 +0000219NEEDS(libc_freeres)
Elliott Hughesa0664b92017-04-18 17:46:52 -0700220NEEDS(cxx_freeres)
njn810086f2002-11-14 12:42:47 +0000221NEEDS(core_errors)
sewardjb8b79ad2008-03-03 01:35:41 +0000222NEEDS(var_info)
njnfdc28af2003-02-24 10:36:48 +0000223
sewardj0b9d74a2006-12-24 02:24:11 +0000224void VG_(needs_superblock_discards)(
florianddd61ff2015-01-04 17:20:45 +0000225 void (*discard)(Addr, VexGuestExtents)
njn8a97c6d2005-03-31 04:37:24 +0000226)
227{
sewardj0b9d74a2006-12-24 02:24:11 +0000228 VG_(needs).superblock_discards = True;
229 VG_(tdict).tool_discard_superblock_info = discard;
njn8a97c6d2005-03-31 04:37:24 +0000230}
231
232void VG_(needs_tool_errors)(
florian8e3fbb52014-10-20 19:02:38 +0000233 Bool (*eq) (VgRes, const Error*, const Error*),
234 void (*before_pp) (const Error*),
235 void (*pp) (const Error*),
sewardjadb102f2007-11-09 23:21:44 +0000236 Bool show_TIDs,
florian8e3fbb52014-10-20 19:02:38 +0000237 UInt (*update) (const Error*),
florian19f91bb2012-11-10 22:29:54 +0000238 Bool (*recog) (const HChar*, Supp*),
philippe362441d2013-07-22 22:00:13 +0000239 Bool (*read_extra) (Int, HChar**, SizeT*, Int*, Supp*),
florian8e3fbb52014-10-20 19:02:38 +0000240 Bool (*matches) (const Error*, const Supp*),
241 const HChar* (*name) (const Error*),
242 SizeT (*get_xtra_si)(const Error*,/*OUT*/HChar*,Int),
243 SizeT (*print_xtra_su)(const Supp*,/*OUT*/HChar*,Int),
244 void (*update_xtra_su)(const Error*, const Supp*)
njn8a97c6d2005-03-31 04:37:24 +0000245)
246{
247 VG_(needs).tool_errors = True;
njncf81d552005-03-31 04:52:26 +0000248 VG_(tdict).tool_eq_Error = eq;
sewardj738856f2009-07-15 14:48:32 +0000249 VG_(tdict).tool_before_pp_Error = before_pp;
njncf81d552005-03-31 04:52:26 +0000250 VG_(tdict).tool_pp_Error = pp;
sewardjadb102f2007-11-09 23:21:44 +0000251 VG_(tdict).tool_show_ThreadIDs_for_errors = show_TIDs;
njncf81d552005-03-31 04:52:26 +0000252 VG_(tdict).tool_update_extra = update;
253 VG_(tdict).tool_recognised_suppression = recog;
254 VG_(tdict).tool_read_extra_suppression_info = read_extra;
255 VG_(tdict).tool_error_matches_suppression = matches;
256 VG_(tdict).tool_get_error_name = name;
sewardj588adef2009-08-15 22:41:51 +0000257 VG_(tdict).tool_get_extra_suppression_info = get_xtra_si;
philippe4e32d672013-10-17 22:10:41 +0000258 VG_(tdict).tool_print_extra_suppression_use = print_xtra_su;
259 VG_(tdict).tool_update_extra_suppression_use = update_xtra_su;
njn8a97c6d2005-03-31 04:37:24 +0000260}
261
262void VG_(needs_command_line_options)(
florian19f91bb2012-11-10 22:29:54 +0000263 Bool (*process)(const HChar*),
njn8a97c6d2005-03-31 04:37:24 +0000264 void (*usage)(void),
265 void (*debug_usage)(void)
266)
267{
268 VG_(needs).command_line_options = True;
njncf81d552005-03-31 04:52:26 +0000269 VG_(tdict).tool_process_cmd_line_option = process;
270 VG_(tdict).tool_print_usage = usage;
271 VG_(tdict).tool_print_debug_usage = debug_usage;
njn8a97c6d2005-03-31 04:37:24 +0000272}
273
florian5f1aeb62015-01-13 17:33:59 +0000274/* The tool's function for handling client requests. */
275static Bool (*tool_handle_client_request_func)(ThreadId, UWord *, UWord *);
276
277static Bool wrap_tool_handle_client_request(ThreadId tid, UWord *arg1,
278 UWord *arg2)
279{
280 Bool ret;
281 VG_(ok_to_discard_translations) = True;
282 ret = tool_handle_client_request_func(tid, arg1, arg2);
283 VG_(ok_to_discard_translations) = False;
284 return ret;
285}
286
njn8a97c6d2005-03-31 04:37:24 +0000287void VG_(needs_client_requests)(
288 Bool (*handle)(ThreadId, UWord*, UWord*)
289)
290{
291 VG_(needs).client_requests = True;
florian5f1aeb62015-01-13 17:33:59 +0000292 tool_handle_client_request_func = handle; /* Stash away */
293 /* Register the wrapper function */
294 VG_(tdict).tool_handle_client_request = wrap_tool_handle_client_request;
njn8a97c6d2005-03-31 04:37:24 +0000295}
296
297void VG_(needs_syscall_wrapper)(
sewardj1c0ce7a2009-07-01 08:10:49 +0000298 void(*pre) (ThreadId, UInt, UWord*, UInt),
299 void(*post)(ThreadId, UInt, UWord*, UInt, SysRes res)
njn8a97c6d2005-03-31 04:37:24 +0000300)
301{
302 VG_(needs).syscall_wrapper = True;
njncf81d552005-03-31 04:52:26 +0000303 VG_(tdict).tool_pre_syscall = pre;
304 VG_(tdict).tool_post_syscall = post;
njn8a97c6d2005-03-31 04:37:24 +0000305}
306
307void VG_(needs_sanity_checks)(
308 Bool(*cheap)(void),
309 Bool(*expen)(void)
310)
311{
312 VG_(needs).sanity_checks = True;
njncf81d552005-03-31 04:52:26 +0000313 VG_(tdict).tool_cheap_sanity_check = cheap;
314 VG_(tdict).tool_expensive_sanity_check = expen;
njn8a97c6d2005-03-31 04:37:24 +0000315}
316
philippe8587b542013-12-15 20:24:43 +0000317void VG_(needs_print_stats) (
318 void (*print_stats)(void)
319)
320{
321 VG_(needs).print_stats = True;
322 VG_(tdict).tool_print_stats = print_stats;
323}
324
philippe07c08522014-05-14 20:39:27 +0000325void VG_(needs_info_location) (
326 void (*info_location)(Addr)
327)
328{
329 VG_(needs).info_location = True;
330 VG_(tdict).tool_info_location = info_location;
331}
332
njnfc51f8d2005-06-21 03:20:17 +0000333void VG_(needs_malloc_replacement)(
njn8a97c6d2005-03-31 04:37:24 +0000334 void* (*malloc) ( ThreadId, SizeT ),
335 void* (*__builtin_new) ( ThreadId, SizeT ),
336 void* (*__builtin_vec_new) ( ThreadId, SizeT ),
337 void* (*memalign) ( ThreadId, SizeT, SizeT ),
338 void* (*calloc) ( ThreadId, SizeT, SizeT ),
339 void (*free) ( ThreadId, void* ),
340 void (*__builtin_delete) ( ThreadId, void* ),
341 void (*__builtin_vec_delete) ( ThreadId, void* ),
342 void* (*realloc) ( ThreadId, void*, SizeT ),
njn8b140de2009-02-17 04:31:18 +0000343 SizeT (*malloc_usable_size) ( ThreadId, void* ),
njn8a97c6d2005-03-31 04:37:24 +0000344 SizeT client_malloc_redzone_szB
345)
346{
njnfc51f8d2005-06-21 03:20:17 +0000347 VG_(needs).malloc_replacement = True;
348 VG_(tdict).tool_malloc = malloc;
349 VG_(tdict).tool___builtin_new = __builtin_new;
350 VG_(tdict).tool___builtin_vec_new = __builtin_vec_new;
351 VG_(tdict).tool_memalign = memalign;
352 VG_(tdict).tool_calloc = calloc;
353 VG_(tdict).tool_free = free;
354 VG_(tdict).tool___builtin_delete = __builtin_delete;
355 VG_(tdict).tool___builtin_vec_delete = __builtin_vec_delete;
356 VG_(tdict).tool_realloc = realloc;
njn8b140de2009-02-17 04:31:18 +0000357 VG_(tdict).tool_malloc_usable_size = malloc_usable_size;
njnfc51f8d2005-06-21 03:20:17 +0000358 VG_(tdict).tool_client_redzone_szB = client_malloc_redzone_szB;
njn8a97c6d2005-03-31 04:37:24 +0000359}
360
sewardj738856f2009-07-15 14:48:32 +0000361void VG_(needs_xml_output)( void )
362{
363 VG_(needs).xml_output = True;
364}
365
sewardj81651dc2007-08-28 06:05:20 +0000366void VG_(needs_final_IR_tidy_pass)(
367 IRSB*(*final_tidy)(IRSB*)
368)
369{
370 VG_(needs).final_IR_tidy_pass = True;
371 VG_(tdict).tool_final_IR_tidy_pass = final_tidy;
372}
njn51d827b2005-05-09 01:02:08 +0000373
njn810086f2002-11-14 12:42:47 +0000374/*--------------------------------------------------------------------*/
sewardj7cf4e6b2008-05-01 20:24:26 +0000375/* Tracked events. Digit 'n' on DEFn is the REGPARMness. */
njn51d827b2005-05-09 01:02:08 +0000376
sewardj7cf4e6b2008-05-01 20:24:26 +0000377#define DEF0(fn, args...) \
378void VG_(fn)(void(*f)(args)) { \
379 VG_(tdict).fn = f; \
380}
381
382#define DEF1(fn, args...) \
383void VG_(fn)(VG_REGPARM(1) void(*f)(args)) { \
njn51d827b2005-05-09 01:02:08 +0000384 VG_(tdict).fn = f; \
385}
386
387#define DEF2(fn, args...) \
sewardj7cf4e6b2008-05-01 20:24:26 +0000388void VG_(fn)(VG_REGPARM(2) void(*f)(args)) { \
njn51d827b2005-05-09 01:02:08 +0000389 VG_(tdict).fn = f; \
390}
391
sewardj9c606bd2008-09-18 18:12:50 +0000392DEF0(track_new_mem_startup, Addr, SizeT, Bool, Bool, Bool, ULong)
sewardj7cf4e6b2008-05-01 20:24:26 +0000393DEF0(track_new_mem_stack_signal, Addr, SizeT, UInt)
394DEF0(track_new_mem_brk, Addr, SizeT, UInt)
sewardj9c606bd2008-09-18 18:12:50 +0000395DEF0(track_new_mem_mmap, Addr, SizeT, Bool, Bool, Bool, ULong)
njn51d827b2005-05-09 01:02:08 +0000396
sewardj7cf4e6b2008-05-01 20:24:26 +0000397DEF0(track_copy_mem_remap, Addr, Addr, SizeT)
398DEF0(track_change_mem_mprotect, Addr, SizeT, Bool, Bool, Bool)
399DEF0(track_die_mem_stack_signal, Addr, SizeT)
400DEF0(track_die_mem_brk, Addr, SizeT)
401DEF0(track_die_mem_munmap, Addr, SizeT)
njn51d827b2005-05-09 01:02:08 +0000402
sewardj7cf4e6b2008-05-01 20:24:26 +0000403DEF2(track_new_mem_stack_4_w_ECU, Addr, UInt)
404DEF2(track_new_mem_stack_8_w_ECU, Addr, UInt)
405DEF2(track_new_mem_stack_12_w_ECU, Addr, UInt)
406DEF2(track_new_mem_stack_16_w_ECU, Addr, UInt)
407DEF2(track_new_mem_stack_32_w_ECU, Addr, UInt)
408DEF2(track_new_mem_stack_112_w_ECU, Addr, UInt)
409DEF2(track_new_mem_stack_128_w_ECU, Addr, UInt)
410DEF2(track_new_mem_stack_144_w_ECU, Addr, UInt)
411DEF2(track_new_mem_stack_160_w_ECU, Addr, UInt)
412DEF0(track_new_mem_stack_w_ECU, Addr, SizeT, UInt)
njn51d827b2005-05-09 01:02:08 +0000413
sewardj7cf4e6b2008-05-01 20:24:26 +0000414DEF1(track_new_mem_stack_4, Addr)
415DEF1(track_new_mem_stack_8, Addr)
416DEF1(track_new_mem_stack_12, Addr)
417DEF1(track_new_mem_stack_16, Addr)
418DEF1(track_new_mem_stack_32, Addr)
419DEF1(track_new_mem_stack_112, Addr)
420DEF1(track_new_mem_stack_128, Addr)
421DEF1(track_new_mem_stack_144, Addr)
422DEF1(track_new_mem_stack_160, Addr)
423DEF0(track_new_mem_stack, Addr, SizeT)
njn51d827b2005-05-09 01:02:08 +0000424
sewardj7cf4e6b2008-05-01 20:24:26 +0000425DEF1(track_die_mem_stack_4, Addr)
426DEF1(track_die_mem_stack_8, Addr)
427DEF1(track_die_mem_stack_12, Addr)
428DEF1(track_die_mem_stack_16, Addr)
429DEF1(track_die_mem_stack_32, Addr)
430DEF1(track_die_mem_stack_112, Addr)
431DEF1(track_die_mem_stack_128, Addr)
432DEF1(track_die_mem_stack_144, Addr)
433DEF1(track_die_mem_stack_160, Addr)
434DEF0(track_die_mem_stack, Addr, SizeT)
njn51d827b2005-05-09 01:02:08 +0000435
sewardj7cf4e6b2008-05-01 20:24:26 +0000436DEF0(track_ban_mem_stack, Addr, SizeT)
njn51d827b2005-05-09 01:02:08 +0000437
floriane543f302012-10-21 19:43:43 +0000438DEF0(track_pre_mem_read, CorePart, ThreadId, const HChar*, Addr, SizeT)
439DEF0(track_pre_mem_read_asciiz, CorePart, ThreadId, const HChar*, Addr)
440DEF0(track_pre_mem_write, CorePart, ThreadId, const HChar*, Addr, SizeT)
sewardj7cf4e6b2008-05-01 20:24:26 +0000441DEF0(track_post_mem_write, CorePart, ThreadId, Addr, SizeT)
njn51d827b2005-05-09 01:02:08 +0000442
floriane543f302012-10-21 19:43:43 +0000443DEF0(track_pre_reg_read, CorePart, ThreadId, const HChar*, PtrdiffT, SizeT)
444DEF0(track_post_reg_write, CorePart, ThreadId, PtrdiffT, SizeT)
njn51d827b2005-05-09 01:02:08 +0000445
sewardj8eb8bab2015-07-21 14:44:28 +0000446DEF0(track_copy_mem_to_reg, CorePart, ThreadId, Addr, PtrdiffT, SizeT)
447DEF0(track_copy_reg_to_mem, CorePart, ThreadId, PtrdiffT, Addr, SizeT)
448
njnc4431bf2009-01-15 21:29:24 +0000449DEF0(track_post_reg_write_clientcall_return, ThreadId, PtrdiffT, SizeT, Addr)
njn51d827b2005-05-09 01:02:08 +0000450
sewardj7cf4e6b2008-05-01 20:24:26 +0000451DEF0(track_start_client_code, ThreadId, ULong)
452DEF0(track_stop_client_code, ThreadId, ULong)
njn51d827b2005-05-09 01:02:08 +0000453
sewardj7cf4e6b2008-05-01 20:24:26 +0000454DEF0(track_pre_thread_ll_create, ThreadId, ThreadId)
455DEF0(track_pre_thread_first_insn, ThreadId)
456DEF0(track_pre_thread_ll_exit, ThreadId)
457
458DEF0(track_pre_deliver_signal, ThreadId, Int sigNo, Bool)
459DEF0(track_post_deliver_signal, ThreadId, Int sigNo)
njn51d827b2005-05-09 01:02:08 +0000460
njn51d827b2005-05-09 01:02:08 +0000461/*--------------------------------------------------------------------*/
462/*--- end ---*/
njn810086f2002-11-14 12:42:47 +0000463/*--------------------------------------------------------------------*/