blob: 4bfbce2af84dc52ee5487831f9b91fa074b12b82 [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
sewardj9eecbbb2010-05-03 21:37:12 +000011 Copyright (C) 2000-2010 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"
njn810086f2002-11-14 12:42:47 +000034
njn51d827b2005-05-09 01:02:08 +000035// The core/tool dictionary of functions (initially zeroed, as we want it)
36VgToolInterface VG_(tdict);
njn810086f2002-11-14 12:42:47 +000037
njn8a97c6d2005-03-31 04:37:24 +000038/*--------------------------------------------------------------------*/
39/* Setting basic functions */
40
41void VG_(basic_tool_funcs)(
42 void(*post_clo_init)(void),
sewardj0b9d74a2006-12-24 02:24:11 +000043 IRSB*(*instrument)(VgCallbackClosure*, IRSB*,
sewardj461df9c2006-01-17 02:06:39 +000044 VexGuestLayout*, VexGuestExtents*, IRType, IRType),
njn8a97c6d2005-03-31 04:37:24 +000045 void(*fini)(Int)
46)
47{
njncf81d552005-03-31 04:52:26 +000048 VG_(tdict).tool_post_clo_init = post_clo_init;
49 VG_(tdict).tool_instrument = instrument;
50 VG_(tdict).tool_fini = fini;
njn8a97c6d2005-03-31 04:37:24 +000051}
52
njn51d827b2005-05-09 01:02:08 +000053
njn8a97c6d2005-03-31 04:37:24 +000054/*--------------------------------------------------------------------*/
55/* Setting details */
56
njn810086f2002-11-14 12:42:47 +000057/* Init with default values. */
58VgDetails VG_(details) = {
sewardjc0d8f682002-11-30 00:49:43 +000059 .name = NULL,
60 .version = NULL,
61 .description = NULL,
62 .copyright_author = NULL,
63 .bug_reports_to = NULL,
njn120281f2003-02-03 12:20:07 +000064 .avg_translation_sizeB = VG_DEFAULT_TRANS_SIZEB,
njn810086f2002-11-14 12:42:47 +000065};
66
njn8a97c6d2005-03-31 04:37:24 +000067/* Use macro because they're so repetitive */
68#define DETAILS(type, detail) \
69 extern void VG_(details_##detail)(type detail) \
70 { \
71 VG_(details).detail = detail; \
72 }
73
74DETAILS(Char*, name)
75DETAILS(Char*, version)
76DETAILS(Char*, description)
77DETAILS(Char*, copyright_author)
78DETAILS(Char*, bug_reports_to)
79DETAILS(UInt, avg_translation_sizeB)
80
njn51d827b2005-05-09 01:02:08 +000081
njn8a97c6d2005-03-31 04:37:24 +000082/*--------------------------------------------------------------------*/
83/* Setting needs */
84
njn810086f2002-11-14 12:42:47 +000085VgNeeds VG_(needs) = {
86 .core_errors = False,
njn95ec8702004-11-22 16:46:13 +000087 .tool_errors = False,
njn810086f2002-11-14 12:42:47 +000088 .libc_freeres = False,
sewardj0b9d74a2006-12-24 02:24:11 +000089 .superblock_discards = False,
njn810086f2002-11-14 12:42:47 +000090 .command_line_options = False,
91 .client_requests = False,
njn810086f2002-11-14 12:42:47 +000092 .syscall_wrapper = False,
njn810086f2002-11-14 12:42:47 +000093 .sanity_checks = False,
sewardjb8b79ad2008-03-03 01:35:41 +000094 .var_info = False,
njnfc51f8d2005-06-21 03:20:17 +000095 .malloc_replacement = False,
njnca54af32006-04-16 10:25:43 +000096 .xml_output = False,
sewardj81651dc2007-08-28 06:05:20 +000097 .final_IR_tidy_pass = False
njn810086f2002-11-14 12:42:47 +000098};
99
100/* static */
sewardj45f4e7c2005-09-27 19:20:21 +0000101Bool VG_(sanity_check_needs)(Char** failmsg)
njn810086f2002-11-14 12:42:47 +0000102{
sewardj7cf4e6b2008-05-01 20:24:26 +0000103 Bool any_new_mem_stack_N, any_new_mem_stack_N_w_ECU;
104 Bool any_new_mem_stack_w_conflicting_otags;
105 Bool any_die_mem_stack_N;
106
njn64c83242005-06-21 01:54:38 +0000107#define CHECK_NOT(var, value) \
108 if ((var)==(value)) { \
sewardj7cf4e6b2008-05-01 20:24:26 +0000109 *failmsg = "Tool error: '" #var "' not initialised\n"; \
njn64c83242005-06-21 01:54:38 +0000110 return False; \
njn810086f2002-11-14 12:42:47 +0000111 }
112
njn120281f2003-02-03 12:20:07 +0000113 /* Ones that must be set */
njn810086f2002-11-14 12:42:47 +0000114 CHECK_NOT(VG_(details).name, NULL);
115 /* Nb: .version can be NULL */
116 CHECK_NOT(VG_(details).description, NULL);
117 CHECK_NOT(VG_(details).copyright_author, NULL);
118 CHECK_NOT(VG_(details).bug_reports_to, NULL);
119
sewardj7cf4e6b2008-05-01 20:24:26 +0000120 /* Check that new_mem_stack is defined if any new_mem_stack_N
121 are. */
122 any_new_mem_stack_N
123 = VG_(tdict).track_new_mem_stack_4 ||
124 VG_(tdict).track_new_mem_stack_8 ||
125 VG_(tdict).track_new_mem_stack_12 ||
126 VG_(tdict).track_new_mem_stack_16 ||
127 VG_(tdict).track_new_mem_stack_32 ||
128 VG_(tdict).track_new_mem_stack_112 ||
129 VG_(tdict).track_new_mem_stack_128 ||
130 VG_(tdict).track_new_mem_stack_144 ||
131 VG_(tdict).track_new_mem_stack_160;
132
133 if (any_new_mem_stack_N && ! VG_(tdict).track_new_mem_stack) {
134 *failmsg = "Tool error: one of the specialised 'new_mem_stack_N'\n"
njn64c83242005-06-21 01:54:38 +0000135 " events tracked, but not the generic 'new_mem_stack' one.\n"
136 " 'new_mem_stack' should be defined\n";
137 return False;
njn9b007f62003-04-07 14:40:25 +0000138 }
139
sewardj7cf4e6b2008-05-01 20:24:26 +0000140 /* Check that new_mem_stack_w_ECU is defined if any
141 new_mem_stack_N_w_ECU are. */
142 any_new_mem_stack_N_w_ECU
143 = VG_(tdict).track_new_mem_stack_4_w_ECU ||
144 VG_(tdict).track_new_mem_stack_8_w_ECU ||
145 VG_(tdict).track_new_mem_stack_12_w_ECU ||
146 VG_(tdict).track_new_mem_stack_16_w_ECU ||
147 VG_(tdict).track_new_mem_stack_32_w_ECU ||
148 VG_(tdict).track_new_mem_stack_112_w_ECU ||
149 VG_(tdict).track_new_mem_stack_128_w_ECU ||
150 VG_(tdict).track_new_mem_stack_144_w_ECU ||
151 VG_(tdict).track_new_mem_stack_160_w_ECU;
152
153 if (any_new_mem_stack_N_w_ECU && ! VG_(tdict).track_new_mem_stack_w_ECU) {
154 *failmsg = "Tool error: one of the specialised 'new_mem_stack_N_w_ECU'\n"
155 " events tracked, but not the generic 'new_mem_stack_w_ECU' one.\n"
156 " 'new_mem_stack_w_ECU' should be defined\n";
157 return False;
158 }
159
160 /* Check that in no cases are both with- and without-otag versions of the
161 same new_mem_stack_ function defined. */
162 any_new_mem_stack_w_conflicting_otags
163 = (VG_(tdict).track_new_mem_stack_4 && VG_(tdict).track_new_mem_stack_4_w_ECU) ||
164 (VG_(tdict).track_new_mem_stack_8 && VG_(tdict).track_new_mem_stack_8_w_ECU) ||
165 (VG_(tdict).track_new_mem_stack_12 && VG_(tdict).track_new_mem_stack_12_w_ECU) ||
166 (VG_(tdict).track_new_mem_stack_16 && VG_(tdict).track_new_mem_stack_16_w_ECU) ||
167 (VG_(tdict).track_new_mem_stack_32 && VG_(tdict).track_new_mem_stack_32_w_ECU) ||
168 (VG_(tdict).track_new_mem_stack_112 && VG_(tdict).track_new_mem_stack_112_w_ECU) ||
169 (VG_(tdict).track_new_mem_stack_128 && VG_(tdict).track_new_mem_stack_128_w_ECU) ||
170 (VG_(tdict).track_new_mem_stack_144 && VG_(tdict).track_new_mem_stack_144_w_ECU) ||
171 (VG_(tdict).track_new_mem_stack_160 && VG_(tdict).track_new_mem_stack_160_w_ECU) ||
172 (VG_(tdict).track_new_mem_stack && VG_(tdict).track_new_mem_stack_w_ECU);
173
174 if (any_new_mem_stack_w_conflicting_otags) {
175 *failmsg = "Tool error: tool supplies both a 'new_mem_stack_N' and a\n"
176 " 'new_mem_stack_N_w_ECU' function for some N (or none),\n"
177 " but you can only have one or the other (not both)\n";
178 return False;
179 }
180
181 /* Check that die_mem_stack is defined if any die_mem_stack_N
182 are. */
183 any_die_mem_stack_N
184 = VG_(tdict).track_die_mem_stack_4 ||
185 VG_(tdict).track_die_mem_stack_8 ||
186 VG_(tdict).track_die_mem_stack_12 ||
187 VG_(tdict).track_die_mem_stack_16 ||
188 VG_(tdict).track_die_mem_stack_32 ||
189 VG_(tdict).track_die_mem_stack_112 ||
190 VG_(tdict).track_die_mem_stack_128 ||
191 VG_(tdict).track_die_mem_stack_144 ||
192 VG_(tdict).track_die_mem_stack_160;
193
194 if (any_die_mem_stack_N && ! VG_(tdict).track_die_mem_stack) {
195 *failmsg = "Tool error: one of the specialised 'die_mem_stack_N'\n"
njn64c83242005-06-21 01:54:38 +0000196 " events tracked, but not the generic 'die_mem_stack' one.\n"
197 " 'die_mem_stack' should be defined\n";
198 return False;
njn9b007f62003-04-07 14:40:25 +0000199 }
200
njn64c83242005-06-21 01:54:38 +0000201 return True;
202
njn810086f2002-11-14 12:42:47 +0000203#undef CHECK_NOT
njn810086f2002-11-14 12:42:47 +0000204}
205
njn810086f2002-11-14 12:42:47 +0000206/* Use macro because they're so repetitive */
207#define NEEDS(need) \
208 extern void VG_(needs_##need)(void) \
209 { \
210 VG_(needs).need = True; \
211 }
212
njn8a97c6d2005-03-31 04:37:24 +0000213// These ones don't require any tool-supplied functions
njn810086f2002-11-14 12:42:47 +0000214NEEDS(libc_freeres)
215NEEDS(core_errors)
sewardjb8b79ad2008-03-03 01:35:41 +0000216NEEDS(var_info)
njnfdc28af2003-02-24 10:36:48 +0000217
sewardj0b9d74a2006-12-24 02:24:11 +0000218void VG_(needs_superblock_discards)(
sewardj4ba057c2005-10-18 12:04:18 +0000219 void (*discard)(Addr64, VexGuestExtents)
njn8a97c6d2005-03-31 04:37:24 +0000220)
221{
sewardj0b9d74a2006-12-24 02:24:11 +0000222 VG_(needs).superblock_discards = True;
223 VG_(tdict).tool_discard_superblock_info = discard;
njn8a97c6d2005-03-31 04:37:24 +0000224}
225
226void VG_(needs_tool_errors)(
227 Bool (*eq) (VgRes, Error*, Error*),
sewardj738856f2009-07-15 14:48:32 +0000228 void (*before_pp) (Error*),
njn8a97c6d2005-03-31 04:37:24 +0000229 void (*pp) (Error*),
sewardjadb102f2007-11-09 23:21:44 +0000230 Bool show_TIDs,
njn8a97c6d2005-03-31 04:37:24 +0000231 UInt (*update) (Error*),
232 Bool (*recog) (Char*, Supp*),
njn35db56c2009-07-24 07:38:29 +0000233 Bool (*read_extra) (Int, Char**, SizeT*, Supp*),
njn8a97c6d2005-03-31 04:37:24 +0000234 Bool (*matches) (Error*, Supp*),
235 Char* (*name) (Error*),
sewardj588adef2009-08-15 22:41:51 +0000236 Bool (*get_xtra_si)(Error*,/*OUT*/Char*,Int)
njn8a97c6d2005-03-31 04:37:24 +0000237)
238{
239 VG_(needs).tool_errors = True;
njncf81d552005-03-31 04:52:26 +0000240 VG_(tdict).tool_eq_Error = eq;
sewardj738856f2009-07-15 14:48:32 +0000241 VG_(tdict).tool_before_pp_Error = before_pp;
njncf81d552005-03-31 04:52:26 +0000242 VG_(tdict).tool_pp_Error = pp;
sewardjadb102f2007-11-09 23:21:44 +0000243 VG_(tdict).tool_show_ThreadIDs_for_errors = show_TIDs;
njncf81d552005-03-31 04:52:26 +0000244 VG_(tdict).tool_update_extra = update;
245 VG_(tdict).tool_recognised_suppression = recog;
246 VG_(tdict).tool_read_extra_suppression_info = read_extra;
247 VG_(tdict).tool_error_matches_suppression = matches;
248 VG_(tdict).tool_get_error_name = name;
sewardj588adef2009-08-15 22:41:51 +0000249 VG_(tdict).tool_get_extra_suppression_info = get_xtra_si;
njn8a97c6d2005-03-31 04:37:24 +0000250}
251
252void VG_(needs_command_line_options)(
253 Bool (*process)(Char*),
254 void (*usage)(void),
255 void (*debug_usage)(void)
256)
257{
258 VG_(needs).command_line_options = True;
njncf81d552005-03-31 04:52:26 +0000259 VG_(tdict).tool_process_cmd_line_option = process;
260 VG_(tdict).tool_print_usage = usage;
261 VG_(tdict).tool_print_debug_usage = debug_usage;
njn8a97c6d2005-03-31 04:37:24 +0000262}
263
264void VG_(needs_client_requests)(
265 Bool (*handle)(ThreadId, UWord*, UWord*)
266)
267{
268 VG_(needs).client_requests = True;
njncf81d552005-03-31 04:52:26 +0000269 VG_(tdict).tool_handle_client_request = handle;
njn8a97c6d2005-03-31 04:37:24 +0000270}
271
272void VG_(needs_syscall_wrapper)(
sewardj1c0ce7a2009-07-01 08:10:49 +0000273 void(*pre) (ThreadId, UInt, UWord*, UInt),
274 void(*post)(ThreadId, UInt, UWord*, UInt, SysRes res)
njn8a97c6d2005-03-31 04:37:24 +0000275)
276{
277 VG_(needs).syscall_wrapper = True;
njncf81d552005-03-31 04:52:26 +0000278 VG_(tdict).tool_pre_syscall = pre;
279 VG_(tdict).tool_post_syscall = post;
njn8a97c6d2005-03-31 04:37:24 +0000280}
281
282void VG_(needs_sanity_checks)(
283 Bool(*cheap)(void),
284 Bool(*expen)(void)
285)
286{
287 VG_(needs).sanity_checks = True;
njncf81d552005-03-31 04:52:26 +0000288 VG_(tdict).tool_cheap_sanity_check = cheap;
289 VG_(tdict).tool_expensive_sanity_check = expen;
njn8a97c6d2005-03-31 04:37:24 +0000290}
291
njnfc51f8d2005-06-21 03:20:17 +0000292void VG_(needs_malloc_replacement)(
njn8a97c6d2005-03-31 04:37:24 +0000293 void* (*malloc) ( ThreadId, SizeT ),
294 void* (*__builtin_new) ( ThreadId, SizeT ),
295 void* (*__builtin_vec_new) ( ThreadId, SizeT ),
296 void* (*memalign) ( ThreadId, SizeT, SizeT ),
297 void* (*calloc) ( ThreadId, SizeT, SizeT ),
298 void (*free) ( ThreadId, void* ),
299 void (*__builtin_delete) ( ThreadId, void* ),
300 void (*__builtin_vec_delete) ( ThreadId, void* ),
301 void* (*realloc) ( ThreadId, void*, SizeT ),
njn8b140de2009-02-17 04:31:18 +0000302 SizeT (*malloc_usable_size) ( ThreadId, void* ),
njn8a97c6d2005-03-31 04:37:24 +0000303 SizeT client_malloc_redzone_szB
304)
305{
njnfc51f8d2005-06-21 03:20:17 +0000306 VG_(needs).malloc_replacement = True;
307 VG_(tdict).tool_malloc = malloc;
308 VG_(tdict).tool___builtin_new = __builtin_new;
309 VG_(tdict).tool___builtin_vec_new = __builtin_vec_new;
310 VG_(tdict).tool_memalign = memalign;
311 VG_(tdict).tool_calloc = calloc;
312 VG_(tdict).tool_free = free;
313 VG_(tdict).tool___builtin_delete = __builtin_delete;
314 VG_(tdict).tool___builtin_vec_delete = __builtin_vec_delete;
315 VG_(tdict).tool_realloc = realloc;
njn8b140de2009-02-17 04:31:18 +0000316 VG_(tdict).tool_malloc_usable_size = malloc_usable_size;
njnfc51f8d2005-06-21 03:20:17 +0000317 VG_(tdict).tool_client_redzone_szB = client_malloc_redzone_szB;
njn8a97c6d2005-03-31 04:37:24 +0000318}
319
sewardj738856f2009-07-15 14:48:32 +0000320void VG_(needs_xml_output)( void )
321{
322 VG_(needs).xml_output = True;
323}
324
sewardj81651dc2007-08-28 06:05:20 +0000325void VG_(needs_final_IR_tidy_pass)(
326 IRSB*(*final_tidy)(IRSB*)
327)
328{
329 VG_(needs).final_IR_tidy_pass = True;
330 VG_(tdict).tool_final_IR_tidy_pass = final_tidy;
331}
njn51d827b2005-05-09 01:02:08 +0000332
njn810086f2002-11-14 12:42:47 +0000333/*--------------------------------------------------------------------*/
sewardj7cf4e6b2008-05-01 20:24:26 +0000334/* Tracked events. Digit 'n' on DEFn is the REGPARMness. */
njn51d827b2005-05-09 01:02:08 +0000335
sewardj7cf4e6b2008-05-01 20:24:26 +0000336#define DEF0(fn, args...) \
337void VG_(fn)(void(*f)(args)) { \
338 VG_(tdict).fn = f; \
339}
340
341#define DEF1(fn, args...) \
342void VG_(fn)(VG_REGPARM(1) void(*f)(args)) { \
njn51d827b2005-05-09 01:02:08 +0000343 VG_(tdict).fn = f; \
344}
345
346#define DEF2(fn, args...) \
sewardj7cf4e6b2008-05-01 20:24:26 +0000347void VG_(fn)(VG_REGPARM(2) void(*f)(args)) { \
njn51d827b2005-05-09 01:02:08 +0000348 VG_(tdict).fn = f; \
349}
350
sewardj9c606bd2008-09-18 18:12:50 +0000351DEF0(track_new_mem_startup, Addr, SizeT, Bool, Bool, Bool, ULong)
sewardj7cf4e6b2008-05-01 20:24:26 +0000352DEF0(track_new_mem_stack_signal, Addr, SizeT, UInt)
353DEF0(track_new_mem_brk, Addr, SizeT, UInt)
sewardj9c606bd2008-09-18 18:12:50 +0000354DEF0(track_new_mem_mmap, Addr, SizeT, Bool, Bool, Bool, ULong)
njn51d827b2005-05-09 01:02:08 +0000355
sewardj7cf4e6b2008-05-01 20:24:26 +0000356DEF0(track_copy_mem_remap, Addr, Addr, SizeT)
357DEF0(track_change_mem_mprotect, Addr, SizeT, Bool, Bool, Bool)
358DEF0(track_die_mem_stack_signal, Addr, SizeT)
359DEF0(track_die_mem_brk, Addr, SizeT)
360DEF0(track_die_mem_munmap, Addr, SizeT)
njn51d827b2005-05-09 01:02:08 +0000361
sewardj7cf4e6b2008-05-01 20:24:26 +0000362DEF2(track_new_mem_stack_4_w_ECU, Addr, UInt)
363DEF2(track_new_mem_stack_8_w_ECU, Addr, UInt)
364DEF2(track_new_mem_stack_12_w_ECU, Addr, UInt)
365DEF2(track_new_mem_stack_16_w_ECU, Addr, UInt)
366DEF2(track_new_mem_stack_32_w_ECU, Addr, UInt)
367DEF2(track_new_mem_stack_112_w_ECU, Addr, UInt)
368DEF2(track_new_mem_stack_128_w_ECU, Addr, UInt)
369DEF2(track_new_mem_stack_144_w_ECU, Addr, UInt)
370DEF2(track_new_mem_stack_160_w_ECU, Addr, UInt)
371DEF0(track_new_mem_stack_w_ECU, Addr, SizeT, UInt)
njn51d827b2005-05-09 01:02:08 +0000372
sewardj7cf4e6b2008-05-01 20:24:26 +0000373DEF1(track_new_mem_stack_4, Addr)
374DEF1(track_new_mem_stack_8, Addr)
375DEF1(track_new_mem_stack_12, Addr)
376DEF1(track_new_mem_stack_16, Addr)
377DEF1(track_new_mem_stack_32, Addr)
378DEF1(track_new_mem_stack_112, Addr)
379DEF1(track_new_mem_stack_128, Addr)
380DEF1(track_new_mem_stack_144, Addr)
381DEF1(track_new_mem_stack_160, Addr)
382DEF0(track_new_mem_stack, Addr, SizeT)
njn51d827b2005-05-09 01:02:08 +0000383
sewardj7cf4e6b2008-05-01 20:24:26 +0000384DEF1(track_die_mem_stack_4, Addr)
385DEF1(track_die_mem_stack_8, Addr)
386DEF1(track_die_mem_stack_12, Addr)
387DEF1(track_die_mem_stack_16, Addr)
388DEF1(track_die_mem_stack_32, Addr)
389DEF1(track_die_mem_stack_112, Addr)
390DEF1(track_die_mem_stack_128, Addr)
391DEF1(track_die_mem_stack_144, Addr)
392DEF1(track_die_mem_stack_160, Addr)
393DEF0(track_die_mem_stack, Addr, SizeT)
njn51d827b2005-05-09 01:02:08 +0000394
sewardj7cf4e6b2008-05-01 20:24:26 +0000395DEF0(track_ban_mem_stack, Addr, SizeT)
njn51d827b2005-05-09 01:02:08 +0000396
sewardj7cf4e6b2008-05-01 20:24:26 +0000397DEF0(track_pre_mem_read, CorePart, ThreadId, Char*, Addr, SizeT)
398DEF0(track_pre_mem_read_asciiz, CorePart, ThreadId, Char*, Addr)
399DEF0(track_pre_mem_write, CorePart, ThreadId, Char*, Addr, SizeT)
400DEF0(track_post_mem_write, CorePart, ThreadId, Addr, SizeT)
njn51d827b2005-05-09 01:02:08 +0000401
njnc4431bf2009-01-15 21:29:24 +0000402DEF0(track_pre_reg_read, CorePart, ThreadId, Char*, PtrdiffT, SizeT)
403DEF0(track_post_reg_write, CorePart, ThreadId, PtrdiffT, SizeT)
njn51d827b2005-05-09 01:02:08 +0000404
njnc4431bf2009-01-15 21:29:24 +0000405DEF0(track_post_reg_write_clientcall_return, ThreadId, PtrdiffT, SizeT, Addr)
njn51d827b2005-05-09 01:02:08 +0000406
sewardj7cf4e6b2008-05-01 20:24:26 +0000407DEF0(track_start_client_code, ThreadId, ULong)
408DEF0(track_stop_client_code, ThreadId, ULong)
njn51d827b2005-05-09 01:02:08 +0000409
sewardj7cf4e6b2008-05-01 20:24:26 +0000410DEF0(track_pre_thread_ll_create, ThreadId, ThreadId)
411DEF0(track_pre_thread_first_insn, ThreadId)
412DEF0(track_pre_thread_ll_exit, ThreadId)
413
414DEF0(track_pre_deliver_signal, ThreadId, Int sigNo, Bool)
415DEF0(track_post_deliver_signal, ThreadId, Int sigNo)
njn51d827b2005-05-09 01:02:08 +0000416
njn51d827b2005-05-09 01:02:08 +0000417/*--------------------------------------------------------------------*/
418/*--- end ---*/
njn810086f2002-11-14 12:42:47 +0000419/*--------------------------------------------------------------------*/