Home | History | Annotate | Download | only in coregrind
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- Debug info.                             pub_core_debuginfo.h ---*/
      4 /*--------------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright (C) 2000-2013 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_DEBUGINFO_H
     32 #define __PUB_CORE_DEBUGINFO_H
     33 
     34 //--------------------------------------------------------------------
     35 // PURPOSE: This module deals with reading debug info and symbol tables
     36 // to get file and function names, line numbers, variable types, and
     37 // to help stack unwinding.
     38 //--------------------------------------------------------------------
     39 
     40 #include "pub_tool_debuginfo.h"
     41 
     42 /* Initialise the entire module.  Must be called first of all. */
     43 extern void VG_(di_initialise) ( void );
     44 
     45 /* LINUX: Notify the debuginfo system about a new mapping, or the
     46    disappearance of such, or a permissions change on an existing
     47    mapping.  This is the way new debug information gets loaded.  If
     48    allow_SkFileV is True, it will try load debug info if the mapping
     49    at 'a' belongs to Valgrind; whereas normally (False) it will not do
     50    that.  This allows us to carefully control when the thing will read
     51    symbols from the Valgrind executable itself.
     52 
     53    If a call to VG_(di_notify_mmap) causes debug info to be read, then
     54    the returned ULong is an abstract handle which can later be used to
     55    refer to the debuginfo read as a result of this specific mapping,
     56    in later queries to m_debuginfo.  In this case the handle value
     57    will be one or above.  If the returned value is zero, no debug info
     58    was read.
     59 
     60    For VG_(di_notify_mmap), if use_fd is not -1, that is used instead
     61    of the filename; this avoids perturbing fcntl locks, which are
     62    released by simply re-opening and closing the same file (even via
     63    different fd!).
     64 */
     65 #if defined(VGO_linux) || defined(VGO_darwin)
     66 extern ULong VG_(di_notify_mmap)( Addr a, Bool allow_SkFileV, Int use_fd );
     67 
     68 extern void VG_(di_notify_munmap)( Addr a, SizeT len );
     69 
     70 extern void VG_(di_notify_mprotect)( Addr a, SizeT len, UInt prot );
     71 
     72 /* this should really return ULong, as per VG_(di_notify_mmap). */
     73 extern void VG_(di_notify_pdb_debuginfo)( Int fd, Addr avma,
     74                                           SizeT total_size,
     75                                           PtrdiffT bias );
     76 
     77 /* this should also really return ULong */
     78 extern void VG_(di_notify_vm_protect)( Addr a, SizeT len, UInt prot );
     79 #endif
     80 
     81 extern void VG_(di_discard_ALL_debuginfo)( void );
     82 
     83 /* Like VG_(get_fnname), but it does not do C++ demangling nor Z-demangling
     84  * nor below-main renaming.
     85  * It should not be used for any names that will be shown to users.
     86  * It should only be used in cases where the names of interest will have
     87  * particular (ie. non-mangled) forms, or the mangled form is acceptable. */
     88 extern
     89 Bool VG_(get_fnname_raw) ( Addr a, const HChar** buf );
     90 
     91 /* Like VG_(get_fnname), but without C++ demangling.  (But it does
     92  Z-demangling and below-main renaming.)
     93  iipc argument: same usage as in VG_(describe_IP) in pub_tool_debuginfo.h. */
     94 extern
     95 Bool VG_(get_fnname_no_cxx_demangle) ( Addr a, const HChar** buf,
     96                                        const InlIPCursor* iipc );
     97 
     98 /* mips-linux only: find the offset of current address. This is needed for
     99    stack unwinding for MIPS.
    100 */
    101 extern
    102 Bool VG_(get_inst_offset_in_function)( Addr a, /*OUT*/PtrdiffT* offset );
    103 
    104 
    105 /* Use DWARF2/3 CFA information to do one step of stack unwinding.
    106    D3UnwindRegs holds the current register values, and is
    107    arch-specific.  Note that the x86 and amd64 definitions are shared
    108    and so the regs are named 'xip' etc rather than 'eip' and 'rip'. */
    109 #if defined(VGA_amd64) || defined(VGA_x86)
    110 typedef
    111    struct { Addr xip; Addr xsp; Addr xbp; }
    112    D3UnwindRegs;
    113 #elif defined(VGA_arm)
    114 typedef
    115    struct { Addr r15; Addr r14; Addr r13; Addr r12; Addr r11; Addr r7; }
    116    D3UnwindRegs;
    117 #elif defined(VGA_arm64)
    118 typedef
    119    struct { Addr pc; Addr sp; Addr x30; Addr x29; } /* PC, SP, LR, FP */
    120    D3UnwindRegs;
    121 #elif defined(VGA_ppc32) || defined(VGA_ppc64be) || defined(VGA_ppc64le)
    122 typedef
    123    UChar  /* should be void, but gcc complains at use points */
    124    D3UnwindRegs;
    125 #elif defined(VGA_s390x)
    126 typedef
    127    struct { Addr ia; Addr sp; Addr fp; Addr lr;}
    128    D3UnwindRegs;
    129 #elif defined(VGA_mips32) || defined(VGA_mips64)
    130 typedef
    131    struct { Addr pc; Addr sp; Addr fp; Addr ra; }
    132    D3UnwindRegs;
    133 #elif defined(VGA_tilegx)
    134 typedef
    135    struct { Addr pc; Addr sp; Addr fp; Addr lr; }
    136    D3UnwindRegs;
    137 #else
    138 #  error "Unsupported arch"
    139 #endif
    140 
    141 extern Bool VG_(use_CF_info) ( /*MOD*/D3UnwindRegs* uregs,
    142                                Addr min_accessible,
    143                                Addr max_accessible );
    144 
    145 /* returns the "generation" of the CF info.
    146    Each time some debuginfo is changed (e.g. loaded or unloaded),
    147    the VG_(CF_info_generation) value returned will be increased.
    148    This can be used to flush cached information derived from the CF info. */
    149 extern UInt VG_(CF_info_generation) (void);
    150 
    151 
    152 
    153 /* Use MSVC FPO data to do one step of stack unwinding. */
    154 extern Bool VG_(use_FPO_info) ( /*MOD*/Addr* ipP,
    155                                 /*MOD*/Addr* spP,
    156                                 /*MOD*/Addr* fpP,
    157                                 Addr min_accessible,
    158                                 Addr max_accessible );
    159 
    160 /* AVMAs for a symbol. Usually only the lowest address of the entity.
    161    On ppc64 platforms, also contains tocptr and local_ep.
    162    These fields should only be accessed using the macros
    163    GET_TOCPTR_AVMA/SET_TOCPTR_AVMA/GET_LOCAL_EP_AVMA/SET_LOCAL_EP_AVMA. */
    164 typedef
    165    struct {
    166       Addr main;      /* lowest address of entity */
    167 #     if defined(VGA_ppc64be) || defined(VGA_ppc64le)
    168       Addr tocptr;    /* ppc64be/le-linux only: value that R2 should have */
    169 #     endif
    170 #     if defined(VGA_ppc64le)
    171       Addr local_ep;  /* address for local entry point, ppc64le only */
    172 #     endif
    173    }
    174    SymAVMAs;
    175 
    176 #if defined(VGA_ppc64be) || defined(VGA_ppc64le)
    177 # define GET_TOCPTR_AVMA(_sym_avmas)          (_sym_avmas).tocptr
    178 # define SET_TOCPTR_AVMA(_sym_avmas, _val)    (_sym_avmas).tocptr = (_val)
    179 #else
    180 # define GET_TOCPTR_AVMA(_sym_avmas)          ((Addr)0)
    181 # define SET_TOCPTR_AVMA(_sym_avmas, _val)    /* */
    182 #endif
    183 
    184 #if defined(VGA_ppc64le)
    185 # define GET_LOCAL_EP_AVMA(_sym_avmas)        (_sym_avmas).local_ep
    186 # define SET_LOCAL_EP_AVMA(_sym_avmas, _val)  (_sym_avmas).local_ep = (_val)
    187 #else
    188 # define GET_LOCAL_EP_AVMA(_sym_avmas)        ((Addr)0)
    189 # define SET_LOCAL_EP_AVMA(_sym_avmas, _val)  /* */
    190 #endif
    191 
    192 /* Functions for traversing all the symbols in a DebugInfo.  _howmany
    193    tells how many symbol table entries there are.  _getidx retrieves
    194    the n'th entry, for n in 0 .. _howmany-1.  You may not modify the
    195    function names thereby acquired; if you want to do so, first strdup
    196    them.  The primary name is returned in *pri_name, and *sec_names is
    197    set either to NULL or to a NULL terminated vector containing
    198    pointers to the secondary names. */
    199 Int  VG_(DebugInfo_syms_howmany) ( const DebugInfo *di );
    200 void VG_(DebugInfo_syms_getidx)  ( const DebugInfo *di,
    201                                    Int idx,
    202                                    /*OUT*/SymAVMAs* ad,
    203                                    /*OUT*/UInt*     size,
    204                                    /*OUT*/const HChar**   pri_name,
    205                                    /*OUT*/const HChar***  sec_names,
    206                                    /*OUT*/Bool*     isText,
    207                                    /*OUT*/Bool*     isIFunc );
    208 /* ppc64-linux only: find the TOC pointer (R2 value) that should be in
    209    force at the entry point address of the function containing
    210    guest_code_addr.  Returns 0 if not known. */
    211 extern Addr VG_(get_tocptr) ( Addr guest_code_addr );
    212 
    213 /* Map a function name to its SymAVMAs.  Is done by
    214    sequential search of all symbol tables, so is very slow.  To
    215    mitigate the worst performance effects, you may specify a soname
    216    pattern, and only objects matching that pattern are searched.
    217    Therefore specify "*" to search all the objects.  On TOC-afflicted
    218    platforms, a symbol is deemed to be found only if it has a nonzero
    219    TOC pointer.  */
    220 extern
    221 Bool VG_(lookup_symbol_SLOW)(const HChar* sopatt, const HChar* name,
    222                              SymAVMAs* avmas);
    223 
    224 #endif   // __PUB_CORE_DEBUGINFO_H
    225 
    226 /*--------------------------------------------------------------------*/
    227 /*--- end                                                          ---*/
    228 /*--------------------------------------------------------------------*/
    229