m_tooliface.c revision e739ac0589b4fb43561f801c4faba8c1b89f8680
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*--------------------------------------------------------------------*/
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*--- Stuff relating to tool data structures.                      ---*/
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*---                                                m_tooliface.c ---*/
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/*--------------------------------------------------------------------*/
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/*
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   This file is part of Valgrind, a dynamic binary instrumentation
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   framework.
105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)
115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)   Copyright (C) 2000-2010 Nicholas Nethercote
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      njn@valgrind.org
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   This program is free software; you can redistribute it and/or
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   modify it under the terms of the GNU General Public License as
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   published by the Free Software Foundation; either version 2 of the
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   License, or (at your option) any later version.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)   This program is distributed in the hope that it will be useful, but
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   WITHOUT ANY WARRANTY; without even the implied warranty of
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   General Public License for more details.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   You should have received a copy of the GNU General Public License
25b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)   along with this program; if not, write to the Free Software
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   02111-1307, USA.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   The GNU General Public License is contained in the file COPYING.
30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch*/
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "pub_core_basics.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "pub_core_tooliface.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The core/tool dictionary of functions (initially zeroed, as we want it)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VgToolInterface VG_(tdict);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)/*--------------------------------------------------------------------*/
39b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)/* Setting basic functions */
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VG_(basic_tool_funcs)(
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   void(*post_clo_init)(void),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IRSB*(*instrument)(VgCallbackClosure*, IRSB*,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      VexGuestLayout*, VexGuestExtents*, IRType, IRType),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void(*fini)(Int)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles))
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   VG_(tdict).tool_post_clo_init = post_clo_init;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VG_(tdict).tool_instrument    = instrument;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VG_(tdict).tool_fini          = fini;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*--------------------------------------------------------------------*/
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Setting details */
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Init with default values. */
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)VgDetails VG_(details) = {
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .name                  = NULL,
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .version               = NULL,
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .description           = NULL,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   .copyright_author      = NULL,
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .bug_reports_to        = NULL,
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .avg_translation_sizeB = VG_DEFAULT_TRANS_SIZEB,
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* Use macro because they're so repetitive */
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define DETAILS(type, detail)                       \
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   extern void VG_(details_##detail)(type detail)   \
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   {                                                \
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      VG_(details).detail = detail;                 \
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   }
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DETAILS(Char*, name)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DETAILS(Char*, version)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DETAILS(Char*, description)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DETAILS(Char*, copyright_author)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DETAILS(Char*, bug_reports_to)
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DETAILS(UInt,  avg_translation_sizeB)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/*--------------------------------------------------------------------*/
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* Setting needs */
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)VgNeeds VG_(needs) = {
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .core_errors          = False,
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .tool_errors          = False,
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   .libc_freeres         = False,
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .superblock_discards  = False,
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .command_line_options = False,
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .client_requests      = False,
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .syscall_wrapper      = False,
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .sanity_checks        = False,
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .var_info	         = False,
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .malloc_replacement   = False,
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .xml_output           = False,
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   .final_IR_tidy_pass   = False
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* static */
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Bool VG_(sanity_check_needs)(Char** failmsg)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   Bool any_new_mem_stack_N, any_new_mem_stack_N_w_ECU;
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   Bool any_new_mem_stack_w_conflicting_otags;
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   Bool any_die_mem_stack_N;
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHECK_NOT(var, value)                                  \
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   if ((var)==(value)) {                                       \
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      *failmsg = "Tool error: '" #var "' not initialised\n";   \
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return False;                                            \
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   }
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   /* Ones that must be set */
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   CHECK_NOT(VG_(details).name,             NULL);
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   /* Nb: .version can be NULL */
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   CHECK_NOT(VG_(details).description,      NULL);
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   CHECK_NOT(VG_(details).copyright_author, NULL);
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   CHECK_NOT(VG_(details).bug_reports_to,   NULL);
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   /* Check that new_mem_stack is defined if any new_mem_stack_N
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      are. */
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   any_new_mem_stack_N
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      = VG_(tdict).track_new_mem_stack_4   ||
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_8   ||
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_12  ||
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_16  ||
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_32  ||
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_112 ||
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_128 ||
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_144 ||
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_160;
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   if (any_new_mem_stack_N && ! VG_(tdict).track_new_mem_stack) {
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      *failmsg = "Tool error: one of the specialised 'new_mem_stack_N'\n"
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 "   events tracked, but not the generic 'new_mem_stack' one.\n"
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 "   'new_mem_stack' should be defined\n";
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return False;
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   }
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   /* Check that new_mem_stack_w_ECU is defined if any
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_mem_stack_N_w_ECU are. */
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   any_new_mem_stack_N_w_ECU
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      = VG_(tdict).track_new_mem_stack_4_w_ECU   ||
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_8_w_ECU   ||
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_12_w_ECU  ||
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_16_w_ECU  ||
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_32_w_ECU  ||
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_112_w_ECU ||
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_128_w_ECU ||
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_144_w_ECU ||
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_new_mem_stack_160_w_ECU;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (any_new_mem_stack_N_w_ECU && ! VG_(tdict).track_new_mem_stack_w_ECU) {
154e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      *failmsg = "Tool error: one of the specialised 'new_mem_stack_N_w_ECU'\n"
155e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                 "   events tracked, but not the generic 'new_mem_stack_w_ECU' one.\n"
156e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                 "   'new_mem_stack_w_ECU' should be defined\n";
157e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      return False;
158e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch   }
159e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch   /* Check that in no cases are both with- and without-otag versions of the
161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      same new_mem_stack_ function defined. */
162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch   any_new_mem_stack_w_conflicting_otags
163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      = (VG_(tdict).track_new_mem_stack_4   && VG_(tdict).track_new_mem_stack_4_w_ECU)   ||
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (VG_(tdict).track_new_mem_stack_8   && VG_(tdict).track_new_mem_stack_8_w_ECU)   ||
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (VG_(tdict).track_new_mem_stack_12  && VG_(tdict).track_new_mem_stack_12_w_ECU)  ||
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (VG_(tdict).track_new_mem_stack_16  && VG_(tdict).track_new_mem_stack_16_w_ECU)  ||
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (VG_(tdict).track_new_mem_stack_32  && VG_(tdict).track_new_mem_stack_32_w_ECU)  ||
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (VG_(tdict).track_new_mem_stack_112 && VG_(tdict).track_new_mem_stack_112_w_ECU) ||
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        (VG_(tdict).track_new_mem_stack_128 && VG_(tdict).track_new_mem_stack_128_w_ECU) ||
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        (VG_(tdict).track_new_mem_stack_144 && VG_(tdict).track_new_mem_stack_144_w_ECU) ||
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        (VG_(tdict).track_new_mem_stack_160 && VG_(tdict).track_new_mem_stack_160_w_ECU) ||
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (VG_(tdict).track_new_mem_stack     && VG_(tdict).track_new_mem_stack_w_ECU);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (any_new_mem_stack_w_conflicting_otags) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *failmsg = "Tool error: tool supplies both a 'new_mem_stack_N' and a\n"
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "   'new_mem_stack_N_w_ECU' function for some N (or none),\n"
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "   but you can only have one or the other (not both)\n";
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return False;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Check that die_mem_stack is defined if any die_mem_stack_N
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      are. */
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   any_die_mem_stack_N
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      = VG_(tdict).track_die_mem_stack_4   ||
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        VG_(tdict).track_die_mem_stack_8   ||
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        VG_(tdict).track_die_mem_stack_12  ||
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        VG_(tdict).track_die_mem_stack_16  ||
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        VG_(tdict).track_die_mem_stack_32  ||
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VG_(tdict).track_die_mem_stack_112 ||
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        VG_(tdict).track_die_mem_stack_128 ||
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        VG_(tdict).track_die_mem_stack_144 ||
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        VG_(tdict).track_die_mem_stack_160;
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (any_die_mem_stack_N && ! VG_(tdict).track_die_mem_stack) {
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      *failmsg = "Tool error: one of the specialised 'die_mem_stack_N'\n"
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 "   events tracked, but not the generic 'die_mem_stack' one.\n"
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 "   'die_mem_stack' should be defined\n";
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return False;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return True;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#undef CHECK_NOT
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/* Use macro because they're so repetitive */
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define NEEDS(need)  \
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   extern void VG_(needs_##need)(void) \
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {                                   \
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VG_(needs).need = True;          \
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These ones don't require any tool-supplied functions
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NEEDS(libc_freeres)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NEEDS(core_errors)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NEEDS(var_info)
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void VG_(needs_superblock_discards)(
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   void (*discard)(Addr64, VexGuestExtents)
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles))
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   VG_(needs).superblock_discards = True;
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   VG_(tdict).tool_discard_superblock_info = discard;
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void VG_(needs_tool_errors)(
227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   Bool (*eq)         (VgRes, Error*, Error*),
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   void (*before_pp)  (Error*),
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   void (*pp)         (Error*),
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   Bool show_TIDs,
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   UInt (*update)     (Error*),
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   Bool (*recog)      (Char*, Supp*),
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   Bool (*read_extra) (Int, Char**, SizeT*, Supp*),
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   Bool (*matches)    (Error*, Supp*),
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   Char* (*name)      (Error*),
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   Bool (*get_xtra_si)(Error*,/*OUT*/Char*,Int)
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles))
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   VG_(needs).tool_errors = True;
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   VG_(tdict).tool_eq_Error                     = eq;
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   VG_(tdict).tool_before_pp_Error              = before_pp;
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   VG_(tdict).tool_pp_Error                     = pp;
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   VG_(tdict).tool_show_ThreadIDs_for_errors    = show_TIDs;
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   VG_(tdict).tool_update_extra                 = update;
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   VG_(tdict).tool_recognised_suppression       = recog;
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   VG_(tdict).tool_read_extra_suppression_info  = read_extra;
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   VG_(tdict).tool_error_matches_suppression    = matches;
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   VG_(tdict).tool_get_error_name               = name;
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   VG_(tdict).tool_get_extra_suppression_info   = get_xtra_si;
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void VG_(needs_command_line_options)(
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   Bool (*process)(Char*),
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   void (*usage)(void),
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   void (*debug_usage)(void)
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles))
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   VG_(needs).command_line_options = True;
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   VG_(tdict).tool_process_cmd_line_option = process;
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   VG_(tdict).tool_print_usage             = usage;
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   VG_(tdict).tool_print_debug_usage       = debug_usage;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VG_(needs_client_requests)(
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Bool (*handle)(ThreadId, UWord*, UWord*)
2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch)
2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch{
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   VG_(needs).client_requests = True;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VG_(tdict).tool_handle_client_request = handle;
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VG_(needs_syscall_wrapper)(
2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   void(*pre) (ThreadId, UInt, UWord*, UInt),
2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   void(*post)(ThreadId, UInt, UWord*, UInt, SysRes res)
2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch)
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch{
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   VG_(needs).syscall_wrapper = True;
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   VG_(tdict).tool_pre_syscall  = pre;
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   VG_(tdict).tool_post_syscall = post;
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void VG_(needs_sanity_checks)(
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   Bool(*cheap)(void),
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   Bool(*expen)(void)
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles))
28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles){
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   VG_(needs).sanity_checks = True;
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   VG_(tdict).tool_cheap_sanity_check     = cheap;
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   VG_(tdict).tool_expensive_sanity_check = expen;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VG_(needs_malloc_replacement)(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void* (*malloc)               ( ThreadId, SizeT ),
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void* (*__builtin_new)        ( ThreadId, SizeT ),
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void* (*__builtin_vec_new)    ( ThreadId, SizeT ),
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   void* (*memalign)             ( ThreadId, SizeT, SizeT ),
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   void* (*calloc)               ( ThreadId, SizeT, SizeT ),
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void  (*free)                 ( ThreadId, void* ),
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void  (*__builtin_delete)     ( ThreadId, void* ),
3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   void  (*__builtin_vec_delete) ( ThreadId, void* ),
3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   void* (*realloc)              ( ThreadId, void*, SizeT ),
3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   SizeT (*malloc_usable_size)   ( ThreadId, void* ),
3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   SizeT client_malloc_redzone_szB
3047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch)
3057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch{
3067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   VG_(needs).malloc_replacement        = True;
3077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   VG_(tdict).tool_malloc               = malloc;
3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   VG_(tdict).tool___builtin_new        = __builtin_new;
3097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   VG_(tdict).tool___builtin_vec_new    = __builtin_vec_new;
3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   VG_(tdict).tool_memalign             = memalign;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VG_(tdict).tool_calloc               = calloc;
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   VG_(tdict).tool_free                 = free;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VG_(tdict).tool___builtin_delete     = __builtin_delete;
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   VG_(tdict).tool___builtin_vec_delete = __builtin_vec_delete;
3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   VG_(tdict).tool_realloc              = realloc;
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   VG_(tdict).tool_malloc_usable_size   = malloc_usable_size;
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   VG_(tdict).tool_client_redzone_szB   = client_malloc_redzone_szB;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VG_(needs_xml_output)( void )
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   VG_(needs).xml_output = True;
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void VG_(needs_final_IR_tidy_pass)(
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   IRSB*(*final_tidy)(IRSB*)
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles))
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles){
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   VG_(needs).final_IR_tidy_pass = True;
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   VG_(tdict).tool_final_IR_tidy_pass = final_tidy;
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*--------------------------------------------------------------------*/
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Tracked events.  Digit 'n' on DEFn is the REGPARMness. */
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEF0(fn, args...) \
3377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid VG_(fn)(void(*f)(args)) { \
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   VG_(tdict).fn = f; \
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define DEF1(fn, args...) \
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void VG_(fn)(VG_REGPARM(1) void(*f)(args)) { \
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   VG_(tdict).fn = f; \
34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEF2(fn, args...) \
34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void VG_(fn)(VG_REGPARM(2) void(*f)(args)) { \
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   VG_(tdict).fn = f; \
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DEF0(track_new_mem_startup,       Addr, SizeT, Bool, Bool, Bool, ULong)
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DEF0(track_new_mem_stack_signal,  Addr, SizeT, UInt)
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DEF0(track_new_mem_brk,           Addr, SizeT, UInt)
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DEF0(track_new_mem_mmap,          Addr, SizeT, Bool, Bool, Bool, ULong)
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_copy_mem_remap,        Addr, Addr, SizeT)
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_change_mem_mprotect,   Addr, SizeT, Bool, Bool, Bool)
358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_die_mem_stack_signal,  Addr, SizeT)
359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_die_mem_brk,           Addr, SizeT)
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_die_mem_munmap,        Addr, SizeT)
361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF2(track_new_mem_stack_4_w_ECU,    Addr, UInt)
363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF2(track_new_mem_stack_8_w_ECU,    Addr, UInt)
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF2(track_new_mem_stack_12_w_ECU,   Addr, UInt)
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF2(track_new_mem_stack_16_w_ECU,   Addr, UInt)
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF2(track_new_mem_stack_32_w_ECU,   Addr, UInt)
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF2(track_new_mem_stack_112_w_ECU,  Addr, UInt)
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF2(track_new_mem_stack_128_w_ECU,  Addr, UInt)
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF2(track_new_mem_stack_144_w_ECU,  Addr, UInt)
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF2(track_new_mem_stack_160_w_ECU,  Addr, UInt)
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_new_mem_stack_w_ECU,      Addr, SizeT, UInt)
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_new_mem_stack_4,       Addr)
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_new_mem_stack_8,       Addr)
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_new_mem_stack_12,      Addr)
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_new_mem_stack_16,      Addr)
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_new_mem_stack_32,      Addr)
378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_new_mem_stack_112,     Addr)
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_new_mem_stack_128,     Addr)
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_new_mem_stack_144,     Addr)
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_new_mem_stack_160,     Addr)
382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_new_mem_stack,         Addr, SizeT)
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_die_mem_stack_4,       Addr)
385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_die_mem_stack_8,       Addr)
386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_die_mem_stack_12,      Addr)
387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_die_mem_stack_16,      Addr)
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_die_mem_stack_32,      Addr)
389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_die_mem_stack_112,     Addr)
390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_die_mem_stack_128,     Addr)
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_die_mem_stack_144,     Addr)
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF1(track_die_mem_stack_160,     Addr)
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_die_mem_stack,         Addr, SizeT)
394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_ban_mem_stack,         Addr, SizeT)
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_pre_mem_read,          CorePart, ThreadId, Char*, Addr, SizeT)
398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_pre_mem_read_asciiz,   CorePart, ThreadId, Char*, Addr)
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_pre_mem_write,         CorePart, ThreadId, Char*, Addr, SizeT)
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_post_mem_write,        CorePart, ThreadId, Addr, SizeT)
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_pre_reg_read,          CorePart, ThreadId, Char*, PtrdiffT, SizeT)
403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_post_reg_write,        CorePart, ThreadId,        PtrdiffT, SizeT)
404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_post_reg_write_clientcall_return, ThreadId, PtrdiffT, SizeT, Addr)
406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_start_client_code,     ThreadId, ULong)
408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_stop_client_code,      ThreadId, ULong)
409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_pre_thread_ll_create,  ThreadId, ThreadId)
411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_pre_thread_first_insn, ThreadId)
412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_pre_thread_ll_exit,    ThreadId)
413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_pre_deliver_signal,    ThreadId, Int sigNo, Bool)
415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DEF0(track_post_deliver_signal,   ThreadId, Int sigNo)
416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/*--------------------------------------------------------------------*/
418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/*--- end                                                          ---*/
419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/*--------------------------------------------------------------------*/
420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)