| |
| /*--------------------------------------------------------------------*/ |
| /*--- The core/tool interface. pub_core_tooliface.h ---*/ |
| /*--------------------------------------------------------------------*/ |
| |
| /* |
| This file is part of Valgrind, a dynamic binary instrumentation |
| framework. |
| |
| Copyright (C) 2000-2015 Julian Seward |
| jseward@acm.org |
| |
| This program is free software; you can redistribute it and/or |
| modify it under the terms of the GNU General Public License as |
| published by the Free Software Foundation; either version 2 of the |
| License, or (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; if not, write to the Free Software |
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
| 02111-1307, USA. |
| |
| The GNU General Public License is contained in the file COPYING. |
| */ |
| |
| #ifndef __PUB_CORE_TOOLIFACE_H |
| #define __PUB_CORE_TOOLIFACE_H |
| |
| #include "pub_tool_tooliface.h" |
| |
| //-------------------------------------------------------------------- |
| // PURPOSE: This module encapsulates the key parts of the core/tool |
| // interface: 'details', 'needs' and 'trackable events'. |
| //-------------------------------------------------------------------- |
| |
| // Note the use of C's comma operator here -- it means that we execute both |
| // statements, and the rvalue of the whole thing is the rvalue of the last |
| // statement. This lets us say "x = VG_TDICT_CALL(...)" in the required |
| // places, while still checking the assertion. |
| #define VG_TDICT_CALL(fn, args...) \ |
| ( vg_assert2(VG_(tdict).fn, \ |
| "you forgot to set VgToolInterface function '" #fn "'"), \ |
| VG_(tdict).fn(args) ) |
| |
| #define VG_TRACK(fn, args...) \ |
| do { \ |
| if (VG_(tdict).track_##fn) \ |
| VG_(tdict).track_##fn(args); \ |
| } while(0) |
| |
| /* These structs are not exposed to tools to mitigate possibility of |
| binary-incompatibilities when the core/tool interface changes. Instead, |
| set functions are provided (see include/pub_tool_tooliface.h). */ |
| |
| /* --------------------------------------------------------------------- |
| 'Details' |
| ------------------------------------------------------------------ */ |
| |
| typedef |
| struct { |
| const HChar* name; |
| const HChar* version; |
| const HChar* description; |
| const HChar* copyright_author; |
| const HChar* bug_reports_to; |
| UInt avg_translation_sizeB; |
| } |
| VgDetails; |
| |
| extern VgDetails VG_(details); |
| |
| /* --------------------------------------------------------------------- |
| 'Needs' |
| ------------------------------------------------------------------ */ |
| |
| typedef |
| struct { |
| Bool libc_freeres; |
| Bool core_errors; |
| Bool tool_errors; |
| Bool superblock_discards; |
| Bool command_line_options; |
| Bool client_requests; |
| Bool syscall_wrapper; |
| Bool sanity_checks; |
| Bool print_stats; |
| Bool info_location; |
| Bool var_info; |
| Bool malloc_replacement; |
| Bool xml_output; |
| Bool final_IR_tidy_pass; |
| } |
| VgNeeds; |
| |
| extern VgNeeds VG_(needs); |
| |
| /* --------------------------------------------------------------------- |
| The dictionary of callable tool functions |
| ------------------------------------------------------------------ */ |
| |
| typedef struct { |
| // -- 'Needs'-related functions ---------------------------------- |
| // Basic functions |
| void (*tool_pre_clo_init) (void); |
| void (*tool_post_clo_init)(void); |
| IRSB* (*tool_instrument) (VgCallbackClosure*, |
| IRSB*, |
| const VexGuestLayout*, const VexGuestExtents*, |
| const VexArchInfo*, IRType, IRType); |
| void (*tool_fini) (Int); |
| |
| // VG_(needs).core_errors |
| // (none) |
| |
| // VG_(needs).tool_errors |
| Bool (*tool_eq_Error) (VgRes, const Error*, const Error*); |
| void (*tool_before_pp_Error) (const Error*); |
| void (*tool_pp_Error) (const Error*); |
| Bool tool_show_ThreadIDs_for_errors; |
| UInt (*tool_update_extra) (const Error*); |
| Bool (*tool_recognised_suppression) (const HChar*, Supp*); |
| Bool (*tool_read_extra_suppression_info) (Int, HChar**, SizeT*, Int*, |
| Supp*); |
| Bool (*tool_error_matches_suppression) (const Error*, const Supp*); |
| const HChar* (*tool_get_error_name) (const Error*); |
| SizeT (*tool_get_extra_suppression_info) (const Error*,/*OUT*/HChar*,Int); |
| SizeT (*tool_print_extra_suppression_use) (const Supp*,/*OUT*/HChar*,Int); |
| void (*tool_update_extra_suppression_use) (const Error*, const Supp*); |
| |
| // VG_(needs).superblock_discards |
| void (*tool_discard_superblock_info)(Addr, VexGuestExtents); |
| |
| // VG_(needs).command_line_options |
| Bool (*tool_process_cmd_line_option)(const HChar*); |
| void (*tool_print_usage) (void); |
| void (*tool_print_debug_usage) (void); |
| |
| // VG_(needs).client_requests |
| Bool (*tool_handle_client_request)(ThreadId, UWord*, UWord*); |
| |
| // VG_(needs).syscall_wrapper |
| void (*tool_pre_syscall) (ThreadId, UInt, UWord*, UInt); |
| void (*tool_post_syscall)(ThreadId, UInt, UWord*, UInt, SysRes); |
| |
| // VG_(needs).sanity_checks |
| Bool (*tool_cheap_sanity_check)(void); |
| Bool (*tool_expensive_sanity_check)(void); |
| |
| // VG_(needs).print_stats |
| void (*tool_print_stats)(void); |
| |
| // VG_(needs).info_location |
| void (*tool_info_location)(Addr a); |
| |
| // VG_(needs).malloc_replacement |
| void* (*tool_malloc) (ThreadId, SizeT); |
| void* (*tool___builtin_new) (ThreadId, SizeT); |
| void* (*tool___builtin_vec_new) (ThreadId, SizeT); |
| void* (*tool_memalign) (ThreadId, SizeT, SizeT); |
| void* (*tool_calloc) (ThreadId, SizeT, SizeT); |
| void (*tool_free) (ThreadId, void*); |
| void (*tool___builtin_delete) (ThreadId, void*); |
| void (*tool___builtin_vec_delete)(ThreadId, void*); |
| void* (*tool_realloc) (ThreadId, void*, SizeT); |
| SizeT (*tool_malloc_usable_size) (ThreadId, void*); |
| SizeT tool_client_redzone_szB; |
| |
| // VG_(needs).final_IR_tidy_pass |
| IRSB* (*tool_final_IR_tidy_pass) (IRSB*); |
| |
| // VG_(needs).xml_output |
| // (none) |
| |
| // -- Event tracking functions ------------------------------------ |
| void (*track_new_mem_startup) (Addr, SizeT, Bool, Bool, Bool, ULong); |
| void (*track_new_mem_stack_signal)(Addr, SizeT, ThreadId); |
| void (*track_new_mem_brk) (Addr, SizeT, ThreadId); |
| void (*track_new_mem_mmap) (Addr, SizeT, Bool, Bool, Bool, ULong); |
| |
| void (*track_copy_mem_remap) (Addr src, Addr dst, SizeT); |
| void (*track_change_mem_mprotect) (Addr, SizeT, Bool, Bool, Bool); |
| void (*track_die_mem_stack_signal)(Addr, SizeT); |
| void (*track_die_mem_brk) (Addr, SizeT); |
| void (*track_die_mem_munmap) (Addr, SizeT); |
| |
| void VG_REGPARM(2) (*track_new_mem_stack_4_w_ECU) (Addr,UInt); |
| void VG_REGPARM(2) (*track_new_mem_stack_8_w_ECU) (Addr,UInt); |
| void VG_REGPARM(2) (*track_new_mem_stack_12_w_ECU) (Addr,UInt); |
| void VG_REGPARM(2) (*track_new_mem_stack_16_w_ECU) (Addr,UInt); |
| void VG_REGPARM(2) (*track_new_mem_stack_32_w_ECU) (Addr,UInt); |
| void VG_REGPARM(2) (*track_new_mem_stack_112_w_ECU)(Addr,UInt); |
| void VG_REGPARM(2) (*track_new_mem_stack_128_w_ECU)(Addr,UInt); |
| void VG_REGPARM(2) (*track_new_mem_stack_144_w_ECU)(Addr,UInt); |
| void VG_REGPARM(2) (*track_new_mem_stack_160_w_ECU)(Addr,UInt); |
| void (*track_new_mem_stack_w_ECU)(Addr,SizeT,UInt); |
| |
| void VG_REGPARM(1) (*track_new_mem_stack_4) (Addr); |
| void VG_REGPARM(1) (*track_new_mem_stack_8) (Addr); |
| void VG_REGPARM(1) (*track_new_mem_stack_12) (Addr); |
| void VG_REGPARM(1) (*track_new_mem_stack_16) (Addr); |
| void VG_REGPARM(1) (*track_new_mem_stack_32) (Addr); |
| void VG_REGPARM(1) (*track_new_mem_stack_112)(Addr); |
| void VG_REGPARM(1) (*track_new_mem_stack_128)(Addr); |
| void VG_REGPARM(1) (*track_new_mem_stack_144)(Addr); |
| void VG_REGPARM(1) (*track_new_mem_stack_160)(Addr); |
| void (*track_new_mem_stack)(Addr,SizeT); |
| |
| void VG_REGPARM(1) (*track_die_mem_stack_4) (Addr); |
| void VG_REGPARM(1) (*track_die_mem_stack_8) (Addr); |
| void VG_REGPARM(1) (*track_die_mem_stack_12) (Addr); |
| void VG_REGPARM(1) (*track_die_mem_stack_16) (Addr); |
| void VG_REGPARM(1) (*track_die_mem_stack_32) (Addr); |
| void VG_REGPARM(1) (*track_die_mem_stack_112)(Addr); |
| void VG_REGPARM(1) (*track_die_mem_stack_128)(Addr); |
| void VG_REGPARM(1) (*track_die_mem_stack_144)(Addr); |
| void VG_REGPARM(1) (*track_die_mem_stack_160)(Addr); |
| void (*track_die_mem_stack)(Addr, SizeT); |
| |
| void (*track_ban_mem_stack)(Addr, SizeT); |
| |
| void (*track_pre_mem_read) (CorePart, ThreadId, const HChar*, Addr, SizeT); |
| void (*track_pre_mem_read_asciiz)(CorePart, ThreadId, const HChar*, Addr); |
| void (*track_pre_mem_write) (CorePart, ThreadId, const HChar*, Addr, SizeT); |
| void (*track_post_mem_write) (CorePart, ThreadId, Addr, SizeT); |
| |
| void (*track_pre_reg_read) (CorePart, ThreadId, const HChar*, PtrdiffT, SizeT); |
| void (*track_post_reg_write)(CorePart, ThreadId, PtrdiffT, SizeT); |
| void (*track_post_reg_write_clientcall_return)(ThreadId, PtrdiffT, SizeT, |
| Addr); |
| |
| void (*track_copy_mem_to_reg)(CorePart, ThreadId, Addr, PtrdiffT, SizeT); |
| void (*track_copy_reg_to_mem)(CorePart, ThreadId, PtrdiffT, Addr, SizeT); |
| |
| void (*track_start_client_code)(ThreadId, ULong); |
| void (*track_stop_client_code) (ThreadId, ULong); |
| |
| void (*track_pre_thread_ll_create)(ThreadId, ThreadId); |
| void (*track_pre_thread_first_insn)(ThreadId); |
| void (*track_pre_thread_ll_exit) (ThreadId); |
| |
| void (*track_pre_deliver_signal) (ThreadId, Int sigNo, Bool); |
| void (*track_post_deliver_signal)(ThreadId, Int sigNo); |
| |
| } VgToolInterface; |
| |
| extern VgToolInterface VG_(tdict); |
| |
| /* --------------------------------------------------------------------- |
| Miscellaneous functions |
| ------------------------------------------------------------------ */ |
| |
| Bool VG_(sanity_check_needs) ( const HChar** failmsg ); |
| |
| #endif // __PUB_CORE_TOOLIFACE_H |
| |
| /*--------------------------------------------------------------------*/ |
| /*--- end ---*/ |
| /*--------------------------------------------------------------------*/ |