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@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