Home | History | Annotate | Download | only in coregrind
      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-2017 Julian Seward
     11       jseward (at) 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    ( vg_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 
     64 typedef
     65    struct {
     66       const HChar* name;
     67       const HChar* version;
     68       const HChar* description;
     69       const HChar* copyright_author;
     70       const HChar* bug_reports_to;
     71       UInt  avg_translation_sizeB;
     72    }
     73    VgDetails;
     74 
     75 extern VgDetails VG_(details);
     76 
     77 /* ---------------------------------------------------------------------
     78    'Needs'
     79    ------------------------------------------------------------------ */
     80 
     81 typedef
     82    struct {
     83       Bool libc_freeres;
     84       Bool cxx_freeres;
     85       Bool core_errors;
     86       Bool tool_errors;
     87       Bool superblock_discards;
     88       Bool command_line_options;
     89       Bool client_requests;
     90       Bool syscall_wrapper;
     91       Bool sanity_checks;
     92       Bool print_stats;
     93       Bool info_location;
     94       Bool var_info;
     95       Bool malloc_replacement;
     96       Bool xml_output;
     97       Bool final_IR_tidy_pass;
     98    }
     99    VgNeeds;
    100 
    101 extern VgNeeds VG_(needs);
    102 
    103 /* ---------------------------------------------------------------------
    104    The dictionary of callable tool functions
    105    ------------------------------------------------------------------ */
    106 
    107 typedef struct {
    108    // -- 'Needs'-related functions ----------------------------------
    109    // Basic functions
    110    void  (*tool_pre_clo_init) (void);
    111    void  (*tool_post_clo_init)(void);
    112    IRSB* (*tool_instrument)   (VgCallbackClosure*,
    113                                IRSB*,
    114                                const VexGuestLayout*, const VexGuestExtents*,
    115                                const VexArchInfo*, IRType, IRType);
    116    void  (*tool_fini)         (Int);
    117 
    118    // VG_(needs).core_errors
    119    // (none)
    120 
    121    // VG_(needs).tool_errors
    122    Bool  (*tool_eq_Error)                  (VgRes, const Error*, const Error*);
    123    void  (*tool_before_pp_Error)           (const Error*);
    124    void  (*tool_pp_Error)                  (const Error*);
    125    Bool  tool_show_ThreadIDs_for_errors;
    126    UInt  (*tool_update_extra)                (const Error*);
    127    Bool  (*tool_recognised_suppression)      (const HChar*, Supp*);
    128    Bool  (*tool_read_extra_suppression_info) (Int, HChar**, SizeT*, Int*,
    129                                               Supp*);
    130    Bool  (*tool_error_matches_suppression)   (const Error*, const Supp*);
    131    const HChar* (*tool_get_error_name)       (const Error*);
    132    SizeT (*tool_get_extra_suppression_info)  (const Error*,/*OUT*/HChar*,Int);
    133    SizeT (*tool_print_extra_suppression_use) (const Supp*,/*OUT*/HChar*,Int);
    134    void  (*tool_update_extra_suppression_use) (const Error*, const Supp*);
    135 
    136    // VG_(needs).superblock_discards
    137    void (*tool_discard_superblock_info)(Addr, VexGuestExtents);
    138 
    139    // VG_(needs).command_line_options
    140    Bool (*tool_process_cmd_line_option)(const HChar*);
    141    void (*tool_print_usage)            (void);
    142    void (*tool_print_debug_usage)      (void);
    143 
    144    // VG_(needs).client_requests
    145    Bool (*tool_handle_client_request)(ThreadId, UWord*, UWord*);
    146 
    147    // VG_(needs).syscall_wrapper
    148    void (*tool_pre_syscall) (ThreadId, UInt, UWord*, UInt);
    149    void (*tool_post_syscall)(ThreadId, UInt, UWord*, UInt, SysRes);
    150 
    151    // VG_(needs).sanity_checks
    152    Bool (*tool_cheap_sanity_check)(void);
    153    Bool (*tool_expensive_sanity_check)(void);
    154 
    155    // VG_(needs).print_stats
    156    void (*tool_print_stats)(void);
    157 
    158    // VG_(needs).info_location
    159    void (*tool_info_location)(Addr a);
    160 
    161    // VG_(needs).malloc_replacement
    162    void* (*tool_malloc)              (ThreadId, SizeT);
    163    void* (*tool___builtin_new)       (ThreadId, SizeT);
    164    void* (*tool___builtin_vec_new)   (ThreadId, SizeT);
    165    void* (*tool_memalign)            (ThreadId, SizeT, SizeT);
    166    void* (*tool_calloc)              (ThreadId, SizeT, SizeT);
    167    void  (*tool_free)                (ThreadId, void*);
    168    void  (*tool___builtin_delete)    (ThreadId, void*);
    169    void  (*tool___builtin_vec_delete)(ThreadId, void*);
    170    void* (*tool_realloc)             (ThreadId, void*, SizeT);
    171    SizeT (*tool_malloc_usable_size)  (ThreadId, void*);
    172    SizeT tool_client_redzone_szB;
    173 
    174    // VG_(needs).final_IR_tidy_pass
    175    IRSB* (*tool_final_IR_tidy_pass)  (IRSB*);
    176 
    177    // VG_(needs).xml_output
    178    // (none)
    179 
    180    // -- Event tracking functions ------------------------------------
    181    void (*track_new_mem_startup)     (Addr, SizeT, Bool, Bool, Bool, ULong);
    182    void (*track_new_mem_stack_signal)(Addr, SizeT, ThreadId);
    183    void (*track_new_mem_brk)         (Addr, SizeT, ThreadId);
    184    void (*track_new_mem_mmap)        (Addr, SizeT, Bool, Bool, Bool, ULong);
    185 
    186    void (*track_copy_mem_remap)      (Addr src, Addr dst, SizeT);
    187    void (*track_change_mem_mprotect) (Addr, SizeT, Bool, Bool, Bool);
    188    void (*track_die_mem_stack_signal)(Addr, SizeT);
    189    void (*track_die_mem_brk)         (Addr, SizeT);
    190    void (*track_die_mem_munmap)      (Addr, SizeT);
    191 
    192    void VG_REGPARM(2) (*track_new_mem_stack_4_w_ECU)  (Addr,UInt);
    193    void VG_REGPARM(2) (*track_new_mem_stack_8_w_ECU)  (Addr,UInt);
    194    void VG_REGPARM(2) (*track_new_mem_stack_12_w_ECU) (Addr,UInt);
    195    void VG_REGPARM(2) (*track_new_mem_stack_16_w_ECU) (Addr,UInt);
    196    void VG_REGPARM(2) (*track_new_mem_stack_32_w_ECU) (Addr,UInt);
    197    void VG_REGPARM(2) (*track_new_mem_stack_112_w_ECU)(Addr,UInt);
    198    void VG_REGPARM(2) (*track_new_mem_stack_128_w_ECU)(Addr,UInt);
    199    void VG_REGPARM(2) (*track_new_mem_stack_144_w_ECU)(Addr,UInt);
    200    void VG_REGPARM(2) (*track_new_mem_stack_160_w_ECU)(Addr,UInt);
    201    void (*track_new_mem_stack_w_ECU)(Addr,SizeT,UInt);
    202 
    203    void VG_REGPARM(1) (*track_new_mem_stack_4)  (Addr);
    204    void VG_REGPARM(1) (*track_new_mem_stack_8)  (Addr);
    205    void VG_REGPARM(1) (*track_new_mem_stack_12) (Addr);
    206    void VG_REGPARM(1) (*track_new_mem_stack_16) (Addr);
    207    void VG_REGPARM(1) (*track_new_mem_stack_32) (Addr);
    208    void VG_REGPARM(1) (*track_new_mem_stack_112)(Addr);
    209    void VG_REGPARM(1) (*track_new_mem_stack_128)(Addr);
    210    void VG_REGPARM(1) (*track_new_mem_stack_144)(Addr);
    211    void VG_REGPARM(1) (*track_new_mem_stack_160)(Addr);
    212    void (*track_new_mem_stack)(Addr,SizeT);
    213 
    214    void VG_REGPARM(1) (*track_die_mem_stack_4)  (Addr);
    215    void VG_REGPARM(1) (*track_die_mem_stack_8)  (Addr);
    216    void VG_REGPARM(1) (*track_die_mem_stack_12) (Addr);
    217    void VG_REGPARM(1) (*track_die_mem_stack_16) (Addr);
    218    void VG_REGPARM(1) (*track_die_mem_stack_32) (Addr);
    219    void VG_REGPARM(1) (*track_die_mem_stack_112)(Addr);
    220    void VG_REGPARM(1) (*track_die_mem_stack_128)(Addr);
    221    void VG_REGPARM(1) (*track_die_mem_stack_144)(Addr);
    222    void VG_REGPARM(1) (*track_die_mem_stack_160)(Addr);
    223    void (*track_die_mem_stack)(Addr, SizeT);
    224 
    225    void (*track_ban_mem_stack)(Addr, SizeT);
    226 
    227    void (*track_pre_mem_read)       (CorePart, ThreadId, const HChar*, Addr, SizeT);
    228    void (*track_pre_mem_read_asciiz)(CorePart, ThreadId, const HChar*, Addr);
    229    void (*track_pre_mem_write)      (CorePart, ThreadId, const HChar*, Addr, SizeT);
    230    void (*track_post_mem_write)     (CorePart, ThreadId, Addr, SizeT);
    231 
    232    void (*track_pre_reg_read)  (CorePart, ThreadId, const HChar*, PtrdiffT, SizeT);
    233    void (*track_post_reg_write)(CorePart, ThreadId,               PtrdiffT, SizeT);
    234    void (*track_post_reg_write_clientcall_return)(ThreadId, PtrdiffT, SizeT,
    235                                                   Addr);
    236 
    237    void (*track_copy_mem_to_reg)(CorePart, ThreadId, Addr, PtrdiffT, SizeT);
    238    void (*track_copy_reg_to_mem)(CorePart, ThreadId, PtrdiffT, Addr, SizeT);
    239 
    240    void (*track_start_client_code)(ThreadId, ULong);
    241    void (*track_stop_client_code) (ThreadId, ULong);
    242 
    243    void (*track_pre_thread_ll_create)(ThreadId, ThreadId);
    244    void (*track_pre_thread_first_insn)(ThreadId);
    245    void (*track_pre_thread_ll_exit)  (ThreadId);
    246 
    247    void (*track_pre_deliver_signal) (ThreadId, Int sigNo, Bool);
    248    void (*track_post_deliver_signal)(ThreadId, Int sigNo);
    249 
    250 } VgToolInterface;
    251 
    252 extern VgToolInterface VG_(tdict);
    253 
    254 /* ---------------------------------------------------------------------
    255    Miscellaneous functions
    256    ------------------------------------------------------------------ */
    257 
    258 Bool VG_(sanity_check_needs) ( const HChar** failmsg );
    259 
    260 #endif   // __PUB_CORE_TOOLIFACE_H
    261 
    262 /*--------------------------------------------------------------------*/
    263 /*--- end                                                          ---*/
    264 /*--------------------------------------------------------------------*/
    265