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-2015 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) || defined(VGO_solaris) 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 debug info. 146 Each time some debuginfo is changed (e.g. loaded or unloaded), 147 the VG_(debuginfo_generation)() value returned will be increased. 148 This can be used to flush cached information derived from debug 149 info (e.g. CFI info or FPO info or ...). */ 150 extern UInt VG_(debuginfo_generation) (void); 151 152 153 154 /* True if some FPO information is loaded. 155 It is useless to call VG_(use_FPO_info) if this returns False. 156 Note that the return value should preferrably be cached in 157 the stack unwind code, and re-queried when the debug info generation 158 changes. */ 159 extern Bool VG_(FPO_info_present)(void); 160 161 /* Use MSVC FPO data to do one step of stack unwinding. */ 162 extern Bool VG_(use_FPO_info) ( /*MOD*/Addr* ipP, 163 /*MOD*/Addr* spP, 164 /*MOD*/Addr* fpP, 165 Addr min_accessible, 166 Addr max_accessible ); 167 168 /* Print the unwind info (if there is some) for the given address 169 range [from,to]. */ 170 extern void VG_(ppUnwindInfo) (Addr from, Addr to); 171 172 /* AVMAs for a symbol. Usually only the lowest address of the entity. 173 On ppc64 platforms, also contains tocptr and local_ep. 174 These fields should only be accessed using the macros 175 GET_TOCPTR_AVMA/SET_TOCPTR_AVMA/GET_LOCAL_EP_AVMA/SET_LOCAL_EP_AVMA. */ 176 typedef 177 struct { 178 Addr main; /* lowest address of entity */ 179 # if defined(VGA_ppc64be) || defined(VGA_ppc64le) 180 Addr tocptr; /* ppc64be/le-linux only: value that R2 should have */ 181 # endif 182 # if defined(VGA_ppc64le) 183 Addr local_ep; /* address for local entry point, ppc64le only */ 184 # endif 185 } 186 SymAVMAs; 187 188 #if defined(VGA_ppc64be) || defined(VGA_ppc64le) 189 # define GET_TOCPTR_AVMA(_sym_avmas) (_sym_avmas).tocptr 190 # define SET_TOCPTR_AVMA(_sym_avmas, _val) (_sym_avmas).tocptr = (_val) 191 #else 192 # define GET_TOCPTR_AVMA(_sym_avmas) ((Addr)0) 193 # define SET_TOCPTR_AVMA(_sym_avmas, _val) /* */ 194 #endif 195 196 #if defined(VGA_ppc64le) 197 # define GET_LOCAL_EP_AVMA(_sym_avmas) (_sym_avmas).local_ep 198 # define SET_LOCAL_EP_AVMA(_sym_avmas, _val) (_sym_avmas).local_ep = (_val) 199 #else 200 # define GET_LOCAL_EP_AVMA(_sym_avmas) ((Addr)0) 201 # define SET_LOCAL_EP_AVMA(_sym_avmas, _val) /* */ 202 #endif 203 204 /* Functions for traversing all the symbols in a DebugInfo. _howmany 205 tells how many symbol table entries there are. _getidx retrieves 206 the n'th entry, for n in 0 .. _howmany-1. You may not modify the 207 function names thereby acquired; if you want to do so, first strdup 208 them. The primary name is returned in *pri_name, and *sec_names is 209 set either to NULL or to a NULL terminated vector containing 210 pointers to the secondary names. */ 211 Int VG_(DebugInfo_syms_howmany) ( const DebugInfo *di ); 212 void VG_(DebugInfo_syms_getidx) ( const DebugInfo *di, 213 Int idx, 214 /*OUT*/SymAVMAs* ad, 215 /*OUT*/UInt* size, 216 /*OUT*/const HChar** pri_name, 217 /*OUT*/const HChar*** sec_names, 218 /*OUT*/Bool* isText, 219 /*OUT*/Bool* isIFunc ); 220 /* ppc64-linux only: find the TOC pointer (R2 value) that should be in 221 force at the entry point address of the function containing 222 guest_code_addr. Returns 0 if not known. */ 223 extern Addr VG_(get_tocptr) ( Addr guest_code_addr ); 224 225 /* Map a function name to its SymAVMAs. Is done by 226 sequential search of all symbol tables, so is very slow. To 227 mitigate the worst performance effects, you may specify a soname 228 pattern, and only objects matching that pattern are searched. 229 Therefore specify "*" to search all the objects. On TOC-afflicted 230 platforms, a symbol is deemed to be found only if it has a nonzero 231 TOC pointer. */ 232 extern 233 Bool VG_(lookup_symbol_SLOW)(const HChar* sopatt, const HChar* name, 234 SymAVMAs* avmas); 235 236 #endif // __PUB_CORE_DEBUGINFO_H 237 238 /*--------------------------------------------------------------------*/ 239 /*--- end ---*/ 240 /*--------------------------------------------------------------------*/ 241