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