pub_core_tooliface.h revision c7561b931e249acf3768ead77638545b0ccaa8f1
1
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
10   Copyright (C) 2000-2005 Julian Seward
11      jseward@acm.org
12
13   This program is free software; you can redistribute it and/or
14   modify it under the terms of the GNU General Public License as
15   published by the Free Software Foundation; either version 2 of the
16   License, or (at your option) any later version.
17
18   This program is distributed in the hope that it will be useful, but
19   WITHOUT ANY WARRANTY; without even the implied warranty of
20   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21   General Public License for more details.
22
23   You should have received a copy of the GNU General Public License
24   along with this program; if not, write to the Free Software
25   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26   02111-1307, USA.
27
28   The GNU General Public License is contained in the file COPYING.
29*/
30
31#ifndef __PUB_CORE_TOOLIFACE_H
32#define __PUB_CORE_TOOLIFACE_H
33
34#include "pub_tool_tooliface.h"
35
36//--------------------------------------------------------------------
37// PURPOSE: This module encapsulates the key parts of the core/tool
38// interface: 'details', 'needs' and 'trackable events'.
39//--------------------------------------------------------------------
40
41// Note the use of C's comma operator here -- it means that we execute both
42// statements, and the rvalue of the whole thing is the rvalue of the last
43// statement.  This lets us say "x = VG_TDICT_CALL(...)" in the required
44// places, while still checking the assertion.
45#define VG_TDICT_CALL(fn, args...) \
46   ( tl_assert2(VG_(tdict).fn, \
47                "you forgot to set VgToolInterface function '" #fn "'"), \
48     VG_(tdict).fn(args) )
49
50#define VG_TRACK(fn, args...) 			\
51   do {						\
52      if (VG_(tdict).track_##fn)		\
53	 VG_(tdict).track_##fn(args);           \
54   } while(0)
55
56/* These structs are not exposed to tools to mitigate possibility of
57   binary-incompatibilities when the core/tool interface changes.  Instead,
58   set functions are provided (see include/pub_tool_tooliface.h). */
59
60/* ---------------------------------------------------------------------
61   'Details'
62   ------------------------------------------------------------------ */
63
64typedef
65   struct {
66      Char* name;
67      Char* version;
68      Char* description;
69      Char* copyright_author;
70      Char* bug_reports_to;
71      UInt  avg_translation_sizeB;
72   }
73   VgDetails;
74
75extern VgDetails VG_(details);
76
77/* ---------------------------------------------------------------------
78   'Needs'
79   ------------------------------------------------------------------ */
80
81typedef
82   struct {
83      Bool libc_freeres;
84      Bool core_errors;
85      Bool tool_errors;
86      Bool basic_block_discards;
87      Bool no_longer_used_1;     // for backwards compatibility
88      Bool command_line_options;
89      Bool client_requests;
90      Bool no_longer_used_0;     // for backwards compatibility
91      Bool syscall_wrapper;
92      Bool sanity_checks;
93      Bool data_syms;
94      Bool shadow_memory;
95   }
96   VgNeeds;
97
98extern VgNeeds VG_(needs);
99
100/* ---------------------------------------------------------------------
101   The dictionary of callable tool functions
102   ------------------------------------------------------------------ */
103
104typedef struct {
105   // -- 'Needs'-related functions ----------------------------------
106   // Basic functions
107   void  (*tool_pre_clo_init) (void);
108   void  (*tool_post_clo_init)(void);
109   IRBB* (*tool_instrument)   (IRBB*, VexGuestLayout*, IRType, IRType);
110   void  (*tool_fini)         (Int);
111
112   // VG_(needs).core_errors
113   // (none)
114
115   // VG_(needs).tool_errors
116   Bool  (*tool_eq_Error)                    (VgRes, Error*, Error*);
117   void  (*tool_pp_Error)                    (Error*);
118   UInt  (*tool_update_extra)                (Error*);
119   Bool  (*tool_recognised_suppression)      (Char*, Supp*);
120   Bool  (*tool_read_extra_suppression_info) (Int, Char*, Int, Supp*);
121   Bool  (*tool_error_matches_suppression)   (Error*, Supp*);
122   Char* (*tool_get_error_name)              (Error*);
123   void  (*tool_print_extra_suppression_info)(Error*);
124
125   // VG_(needs).basic_block_discards
126   void (*tool_discard_basic_block_info)(Addr, SizeT);
127
128   // VG_(needs).command_line_options
129   Bool (*tool_process_cmd_line_option)(Char*);
130   void (*tool_print_usage)            (void);
131   void (*tool_print_debug_usage)      (void);
132
133   // VG_(needs).client_requests
134   Bool (*tool_handle_client_request)(ThreadId, UWord*, UWord*);
135
136   // VG_(needs).syscall_wrapper
137   void (*tool_pre_syscall) (ThreadId, UInt);
138   void (*tool_post_syscall)(ThreadId, UInt, SysRes);
139
140   // VG_(needs).sanity_checks
141   Bool (*tool_cheap_sanity_check)(void);
142   Bool (*tool_expensive_sanity_check)(void);
143
144   // -- Event tracking functions ------------------------------------
145   void (*track_new_mem_startup)     (Addr, SizeT, Bool, Bool, Bool);
146   void (*track_new_mem_stack_signal)(Addr, SizeT);
147   void (*track_new_mem_brk)         (Addr, SizeT);
148   void (*track_new_mem_mmap)        (Addr, SizeT, Bool, Bool, Bool);
149
150   void (*track_copy_mem_remap)      (Addr, Addr, SizeT);
151   void (*track_change_mem_mprotect) (Addr, SizeT, Bool, Bool, Bool);
152   void (*track_die_mem_stack_signal)(Addr, SizeT);
153   void (*track_die_mem_brk)         (Addr, SizeT);
154   void (*track_die_mem_munmap)      (Addr, SizeT);
155
156   void VGA_REGPARM(1) (*track_new_mem_stack_4) (Addr);
157   void VGA_REGPARM(1) (*track_new_mem_stack_8) (Addr);
158   void VGA_REGPARM(1) (*track_new_mem_stack_12)(Addr);
159   void VGA_REGPARM(1) (*track_new_mem_stack_16)(Addr);
160   void VGA_REGPARM(1) (*track_new_mem_stack_32)(Addr);
161   void (*track_new_mem_stack)(Addr, SizeT);
162
163   void VGA_REGPARM(1) (*track_die_mem_stack_4) (Addr);
164   void VGA_REGPARM(1) (*track_die_mem_stack_8) (Addr);
165   void VGA_REGPARM(1) (*track_die_mem_stack_12)(Addr);
166   void VGA_REGPARM(1) (*track_die_mem_stack_16)(Addr);
167   void VGA_REGPARM(1) (*track_die_mem_stack_32)(Addr);
168   void (*track_die_mem_stack)(Addr, SizeT);
169
170   void (*track_ban_mem_stack)(Addr, SizeT);
171
172   void (*track_pre_mem_read)       (CorePart, ThreadId, Char*, Addr, SizeT);
173   void (*track_pre_mem_read_asciiz)(CorePart, ThreadId, Char*, Addr);
174   void (*track_pre_mem_write)      (CorePart, ThreadId, Char*, Addr, SizeT);
175   void (*track_post_mem_write)     (CorePart, ThreadId, Addr, SizeT);
176
177   void (*track_pre_reg_read)  (CorePart, ThreadId, Char*, OffT, SizeT);
178   void (*track_post_reg_write)(CorePart, ThreadId,        OffT, SizeT);
179   void (*track_post_reg_write_clientcall_return)(ThreadId, OffT, SizeT, Addr);
180
181   void (*track_thread_run)(ThreadId);
182
183   void (*track_post_thread_create)(ThreadId, ThreadId);
184   void (*track_post_thread_join)  (ThreadId, ThreadId);
185
186   void (*track_pre_mutex_lock)   (ThreadId, void*);
187   void (*track_post_mutex_lock)  (ThreadId, void*);
188   void (*track_post_mutex_unlock)(ThreadId, void*);
189
190   void (*track_pre_deliver_signal) (ThreadId, Int sigNo, Bool);
191   void (*track_post_deliver_signal)(ThreadId, Int sigNo);
192
193   void (*track_init_shadow_page)(Addr);
194
195   // -- malloc/free replacements -----------------------------------
196   void* (*malloc_malloc)              (ThreadId, SizeT);
197   void* (*malloc___builtin_new)       (ThreadId, SizeT);
198   void* (*malloc___builtin_vec_new)   (ThreadId, SizeT);
199   void* (*malloc_memalign)            (ThreadId, SizeT, SizeT);
200   void* (*malloc_calloc)              (ThreadId, SizeT, SizeT);
201   void  (*malloc_free)                (ThreadId, void*);
202   void  (*malloc___builtin_delete)    (ThreadId, void*);
203   void  (*malloc___builtin_vec_delete)(ThreadId, void*);
204   void* (*malloc_realloc)             (ThreadId, void*, SizeT);
205
206} VgToolInterface;
207
208extern VgToolInterface VG_(tdict);
209
210/* ---------------------------------------------------------------------
211   Miscellaneous functions
212   ------------------------------------------------------------------ */
213
214void VG_(sanity_check_needs)(void);
215
216#endif   // __PUB_CORE_TOOLIFACE_H
217
218/*--------------------------------------------------------------------*/
219/*--- end                                                          ---*/
220/*--------------------------------------------------------------------*/
221