blob: b698f2c9d817647489b074b9c6f48cfca73dc3ce [file] [log] [blame]
njnea27e462005-05-31 02:38:09 +00001
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
sewardjb3a1e4b2015-08-21 11:32:26 +000010 Copyright (C) 2000-2015 Julian Seward
njnea27e462005-05-31 02:38:09 +000011 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.
njnea27e462005-05-31 02:38:09 +000038//--------------------------------------------------------------------
39
40#include "pub_tool_debuginfo.h"
41
sewardjf98e1c02008-10-25 16:22:41 +000042/* Initialise the entire module. Must be called first of all. */
43extern void VG_(di_initialise) ( void );
44
sewardj811469c2006-10-17 01:36:37 +000045/* 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
sewardj9c606bd2008-09-18 18:12:50 +000051 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
sewardj5f2dcad2011-10-24 08:53:03 +000058 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*/
sewardj8eb8bab2015-07-21 14:44:28 +000065#if defined(VGO_linux) || defined(VGO_darwin) || defined(VGO_solaris)
sewardj5f2dcad2011-10-24 08:53:03 +000066extern ULong VG_(di_notify_mmap)( Addr a, Bool allow_SkFileV, Int use_fd );
sewardjf72cced2005-11-08 00:45:47 +000067
sewardj45f4e7c2005-09-27 19:20:21 +000068extern void VG_(di_notify_munmap)( Addr a, SizeT len );
sewardjf72cced2005-11-08 00:45:47 +000069
sewardj45f4e7c2005-09-27 19:20:21 +000070extern void VG_(di_notify_mprotect)( Addr a, SizeT len, UInt prot );
sewardjc8259b82009-04-22 22:42:10 +000071
72/* this should really return ULong, as per VG_(di_notify_mmap). */
73extern void VG_(di_notify_pdb_debuginfo)( Int fd, Addr avma,
74 SizeT total_size,
sewardj54c45db2012-07-13 12:58:55 +000075 PtrdiffT bias );
sewardj731f9cf2011-09-21 08:43:08 +000076
77/* this should also really return ULong */
78extern void VG_(di_notify_vm_protect)( Addr a, SizeT len, UInt prot );
sewardj811469c2006-10-17 01:36:37 +000079#endif
80
sewardj9c606bd2008-09-18 18:12:50 +000081extern void VG_(di_discard_ALL_debuginfo)( void );
82
njn6b7611b2009-02-11 06:06:10 +000083/* 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. */
88extern
florian46cc0452014-10-25 19:20:38 +000089Bool VG_(get_fnname_raw) ( Addr a, const HChar** buf );
njn6b7611b2009-02-11 06:06:10 +000090
91/* Like VG_(get_fnname), but without C++ demangling. (But it does
philippea0a73932014-06-15 15:42:20 +000092 Z-demangling and below-main renaming.)
93 iipc argument: same usage as in VG_(describe_IP) in pub_tool_debuginfo.h. */
njn6b7611b2009-02-11 06:06:10 +000094extern
florian46cc0452014-10-25 19:20:38 +000095Bool VG_(get_fnname_no_cxx_demangle) ( Addr a, const HChar** buf,
96 const InlIPCursor* iipc );
njnea27e462005-05-31 02:38:09 +000097
sewardj5db15402012-06-07 09:13:21 +000098/* mips-linux only: find the offset of current address. This is needed for
99 stack unwinding for MIPS.
100*/
101extern
102Bool VG_(get_inst_offset_in_function)( Addr a, /*OUT*/PtrdiffT* offset );
103
sewardj3026f712010-01-01 18:46:41 +0000104
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)
110typedef
111 struct { Addr xip; Addr xsp; Addr xbp; }
112 D3UnwindRegs;
113#elif defined(VGA_arm)
114typedef
sewardjfa5ce562010-09-23 22:05:59 +0000115 struct { Addr r15; Addr r14; Addr r13; Addr r12; Addr r11; Addr r7; }
sewardj3026f712010-01-01 18:46:41 +0000116 D3UnwindRegs;
sewardjf0c12502014-01-12 12:54:00 +0000117#elif defined(VGA_arm64)
118typedef
sewardj821283b2014-01-13 00:21:09 +0000119 struct { Addr pc; Addr sp; Addr x30; Addr x29; } /* PC, SP, LR, FP */
sewardjf0c12502014-01-12 12:54:00 +0000120 D3UnwindRegs;
carllcae0cc22014-08-07 23:17:29 +0000121#elif defined(VGA_ppc32) || defined(VGA_ppc64be) || defined(VGA_ppc64le)
sewardj3026f712010-01-01 18:46:41 +0000122typedef
sewardjf5f1e122010-01-02 13:24:58 +0000123 UChar /* should be void, but gcc complains at use points */
sewardj3026f712010-01-01 18:46:41 +0000124 D3UnwindRegs;
sewardjb5b87402011-03-07 16:05:35 +0000125#elif defined(VGA_s390x)
126typedef
127 struct { Addr ia; Addr sp; Addr fp; Addr lr;}
128 D3UnwindRegs;
petarj4df0bfc2013-02-27 23:17:33 +0000129#elif defined(VGA_mips32) || defined(VGA_mips64)
sewardj5db15402012-06-07 09:13:21 +0000130typedef
131 struct { Addr pc; Addr sp; Addr fp; Addr ra; }
132 D3UnwindRegs;
sewardj112711a2015-04-10 12:30:09 +0000133#elif defined(VGA_tilegx)
134typedef
135 struct { Addr pc; Addr sp; Addr fp; Addr lr; }
136 D3UnwindRegs;
sewardj3026f712010-01-01 18:46:41 +0000137#else
138# error "Unsupported arch"
139#endif
140
141extern Bool VG_(use_CF_info) ( /*MOD*/D3UnwindRegs* uregs,
sewardjeadcd862006-04-04 15:12:44 +0000142 Addr min_accessible,
143 Addr max_accessible );
njnea27e462005-05-31 02:38:09 +0000144
philippef7bbd792015-05-26 21:26:39 +0000145/* returns the "generation" of the debug info.
philippe20ede3a2013-01-30 23:18:11 +0000146 Each time some debuginfo is changed (e.g. loaded or unloaded),
philippef7bbd792015-05-26 21:26:39 +0000147 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 ...). */
150extern UInt VG_(debuginfo_generation) (void);
philippe20ede3a2013-01-30 23:18:11 +0000151
152
sewardj3026f712010-01-01 18:46:41 +0000153
philippef7bbd792015-05-26 21:26:39 +0000154/* 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. */
159extern Bool VG_(FPO_info_present)(void);
160
sewardjc8259b82009-04-22 22:42:10 +0000161/* Use MSVC FPO data to do one step of stack unwinding. */
162extern 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
philippe97bfa192015-06-02 22:09:42 +0000168/* Print the unwind info (if there is some) for the given address
169 range [from,to]. */
170extern void VG_(ppUnwindInfo) (Addr from, Addr to);
171
philippe4cace662014-08-13 21:25:45 +0000172/* 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. */
176typedef
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. */
211Int VG_(DebugInfo_syms_howmany) ( const DebugInfo *di );
212void VG_(DebugInfo_syms_getidx) ( const DebugInfo *di,
213 Int idx,
214 /*OUT*/SymAVMAs* ad,
215 /*OUT*/UInt* size,
florian1ef70c62014-10-22 17:42:37 +0000216 /*OUT*/const HChar** pri_name,
217 /*OUT*/const HChar*** sec_names,
philippe4cace662014-08-13 21:25:45 +0000218 /*OUT*/Bool* isText,
219 /*OUT*/Bool* isIFunc );
sewardj40c186c2006-01-17 01:54:16 +0000220/* 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. */
223extern Addr VG_(get_tocptr) ( Addr guest_code_addr );
njnea27e462005-05-31 02:38:09 +0000224
philippe4cace662014-08-13 21:25:45 +0000225/* Map a function name to its SymAVMAs. Is done by
sewardj811469c2006-10-17 01:36:37 +0000226 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. */
232extern
florian518850b2014-10-22 22:25:30 +0000233Bool VG_(lookup_symbol_SLOW)(const HChar* sopatt, const HChar* name,
234 SymAVMAs* avmas);
sewardj811469c2006-10-17 01:36:37 +0000235
njnea27e462005-05-31 02:38:09 +0000236#endif // __PUB_CORE_DEBUGINFO_H
237
238/*--------------------------------------------------------------------*/
239/*--- end ---*/
240/*--------------------------------------------------------------------*/