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