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