1 : /* Interfaces for libdw.
2 : Copyright (C) 2002, 2004, 2005, 2006, 2007 Red Hat, Inc.
3 : This file is part of Red Hat elfutils.
4 :
5 : Red Hat elfutils is free software; you can redistribute it and/or modify
6 : it under the terms of the GNU General Public License as published by the
7 : Free Software Foundation; version 2 of the License.
8 :
9 : Red Hat elfutils is distributed in the hope that it will be useful, but
10 : WITHOUT ANY WARRANTY; without even the implied warranty of
11 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 : General Public License for more details.
13 :
14 : You should have received a copy of the GNU General Public License along
15 : with Red Hat elfutils; if not, write to the Free Software Foundation,
16 : Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
17 :
18 : In addition, as a special exception, Red Hat, Inc. gives You the
19 : additional right to link the code of Red Hat elfutils with code licensed
20 : under any Open Source Initiative certified open source license
21 : (http://www.opensource.org/licenses/index.php) which requires the
22 : distribution of source code with any binary distribution and to
23 : distribute linked combinations of the two. Non-GPL Code permitted under
24 : this exception must only link to the code of Red Hat elfutils through
25 : those well defined interfaces identified in the file named EXCEPTION
26 : found in the source code files (the "Approved Interfaces"). The files
27 : of Non-GPL Code may instantiate templates or use macros or inline
28 : functions from the Approved Interfaces without causing the resulting
29 : work to be covered by the GNU General Public License. Only Red Hat,
30 : Inc. may make changes or additions to the list of Approved Interfaces.
31 : Red Hat's grant of this exception is conditioned upon your not adding
32 : any new exceptions. If you wish to add a new Approved Interface or
33 : exception, please contact Red Hat. You must obey the GNU General Public
34 : License in all respects for all of the Red Hat elfutils code and other
35 : code used in conjunction with Red Hat elfutils except the Non-GPL Code
36 : covered by this exception. If you modify this file, you may extend this
37 : exception to your version of the file, but you are not obligated to do
38 : so. If you do not wish to provide this exception without modification,
39 : you must delete this exception statement from your version and license
40 : this file solely under the GPL without exception.
41 :
42 : Red Hat elfutils is an included package of the Open Invention Network.
43 : An included package of the Open Invention Network is a package for which
44 : Open Invention Network licensees cross-license their patents. No patent
45 : license is granted, either expressly or impliedly, by designation as an
46 : included package. Should you wish to participate in the Open Invention
47 : Network licensing program, please visit www.openinventionnetwork.com
48 : <http://www.openinventionnetwork.com>. */
49 :
50 : #ifndef _LIBDW_H
51 : #define _LIBDW_H 1
52 :
53 : #include <gelf.h>
54 : #include <stdbool.h>
55 : #include <stddef.h>
56 :
57 :
58 : #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)
59 : # define __nonnull_attribute__(...) __attribute__ ((__nonnull__ (__VA_ARGS__)))
60 : # define __deprecated_attribute__ __attribute__ ((__deprecated__))
61 : #else
62 : # define __nonnull_attribute__(args...)
63 : # define __deprecated_attribute__
64 : #endif
65 :
66 :
67 : #ifdef __GNUC_STDC_INLINE__
68 : # define __libdw_extern_inline extern __inline __attribute__ ((__gnu_inline__))
69 : #else
70 : # define __libdw_extern_inline extern __inline
71 : #endif
72 :
73 :
74 : /* Mode for the session. */
75 : typedef enum
76 : {
77 : DWARF_C_READ, /* Read .. */
78 : DWARF_C_RDWR, /* Read and write .. */
79 : DWARF_C_WRITE, /* Write .. */
80 : }
81 : Dwarf_Cmd;
82 :
83 :
84 : /* Callback results. */
85 : enum
86 : {
87 : DWARF_CB_OK = 0,
88 : DWARF_CB_ABORT
89 : };
90 :
91 :
92 : /* Error values. */
93 : enum
94 : {
95 : DW_TAG_invalid = 0
96 : #define DW_TAG_invalid DW_TAG_invalid
97 : };
98 :
99 :
100 : /* Type for offset in DWARF file. */
101 : typedef GElf_Off Dwarf_Off;
102 :
103 : /* Type for address in DWARF file. */
104 : typedef GElf_Addr Dwarf_Addr;
105 :
106 : /* Integer types. Big enough to hold any numeric value. */
107 : typedef GElf_Xword Dwarf_Word;
108 : typedef GElf_Sxword Dwarf_Sword;
109 : /* For the times we know we do not need that much. */
110 : typedef GElf_Half Dwarf_Half;
111 :
112 :
113 : /* DWARF abbreviation record. */
114 : typedef struct Dwarf_Abbrev Dwarf_Abbrev;
115 :
116 : /* Returned to show the last DIE has be returned. */
117 : #define DWARF_END_ABBREV ((Dwarf_Abbrev *) -1l)
118 :
119 : /* Source code line information for CU. */
120 : typedef struct Dwarf_Lines_s Dwarf_Lines;
121 :
122 : /* One source code line information. */
123 : typedef struct Dwarf_Line_s Dwarf_Line;
124 :
125 : /* Source file information. */
126 : typedef struct Dwarf_Files_s Dwarf_Files;
127 :
128 : /* One address range record. */
129 : typedef struct Dwarf_Arange_s Dwarf_Arange;
130 :
131 : /* Address ranges of a file. */
132 : typedef struct Dwarf_Aranges_s Dwarf_Aranges;
133 :
134 : /* CU representation. */
135 : struct Dwarf_CU;
136 :
137 : /* Macro information. */
138 : typedef struct Dwarf_Macro_s Dwarf_Macro;
139 :
140 : /* Attribute representation. */
141 : typedef struct
142 : {
143 : unsigned int code;
144 : unsigned int form;
145 : unsigned char *valp;
146 : struct Dwarf_CU *cu;
147 : } Dwarf_Attribute;
148 :
149 :
150 : /* Data block representation. */
151 : typedef struct
152 : {
153 : Dwarf_Word length;
154 : unsigned char *data;
155 : } Dwarf_Block;
156 :
157 :
158 : /* DIE information. */
159 : typedef struct
160 : {
161 : /* The offset can be computed from the address. */
162 : void *addr;
163 : struct Dwarf_CU *cu;
164 : Dwarf_Abbrev *abbrev;
165 : // XXX We'll see what other information will be needed.
166 : long int padding__;
167 7431635 : } Dwarf_Die;
168 :
169 : /* Returned to show the last DIE has be returned. */
170 : #define DWARF_END_DIE ((Dwarf_Die *) -1l)
171 :
172 :
173 : /* Global symbol information. */
174 : typedef struct
175 : {
176 : Dwarf_Off cu_offset;
177 : Dwarf_Off die_offset;
178 : const char *name;
179 : } Dwarf_Global;
180 :
181 :
182 : /* One operation in a DWARF location expression.
183 : A location expression is an array of these. */
184 : typedef struct
185 : {
186 : uint8_t atom; /* Operation */
187 : Dwarf_Word number; /* Operand */
188 : Dwarf_Word number2; /* Possible second operand */
189 : Dwarf_Word offset; /* Offset in location expression */
190 : } Dwarf_Op;
191 :
192 :
193 : /* Handle for debug sessions. */
194 : typedef struct Dwarf Dwarf;
195 :
196 :
197 : /* Out-Of-Memory handler. */
198 : #if __GNUC__ < 4
199 : typedef void (*Dwarf_OOM) (void);
200 : #else
201 : typedef void (*__attribute__ ((noreturn)) Dwarf_OOM) (void);
202 : #endif
203 :
204 :
205 : #ifdef __cplusplus
206 : extern "C" {
207 : #endif
208 :
209 : /* Create a handle for a new debug session. */
210 : extern Dwarf *dwarf_begin (int fildes, Dwarf_Cmd cmd);
211 :
212 : /* Create a handle for a new debug session for an ELF file. */
213 : extern Dwarf *dwarf_begin_elf (Elf *elf, Dwarf_Cmd cmd, Elf_Scn *scngrp);
214 :
215 : /* Retrieve ELF descriptor used for DWARF access. */
216 : extern Elf *dwarf_getelf (Dwarf *dwarf);
217 :
218 : /* Release debugging handling context. */
219 : extern int dwarf_end (Dwarf *dwarf);
220 :
221 :
222 : /* Get the data block for the .debug_info section. */
223 : extern Elf_Data *dwarf_getscn_info (Dwarf *dwarf);
224 :
225 : /* Read the header for the DWARF CU header. */
226 : extern int dwarf_nextcu (Dwarf *dwarf, Dwarf_Off off, Dwarf_Off *next_off,
227 : size_t *header_sizep, Dwarf_Off *abbrev_offsetp,
228 : uint8_t *address_sizep, uint8_t *offset_sizep)
229 : __nonnull_attribute__ (3);
230 :
231 :
232 : /* Return DIE at given offset. */
233 : extern Dwarf_Die *dwarf_offdie (Dwarf *dbg, Dwarf_Off offset,
234 : Dwarf_Die *result) __nonnull_attribute__ (3);
235 :
236 : /* Return offset of DIE. */
237 : extern Dwarf_Off dwarf_dieoffset (Dwarf_Die *die);
238 :
239 : /* Return offset of DIE in CU. */
240 : extern Dwarf_Off dwarf_cuoffset (Dwarf_Die *die);
241 :
242 : /* Return CU DIE containing given DIE. */
243 : extern Dwarf_Die *dwarf_diecu (Dwarf_Die *die, Dwarf_Die *result,
244 : uint8_t *address_sizep, uint8_t *offset_sizep)
245 : __nonnull_attribute__ (2);
246 :
247 : /* Return CU DIE containing given address. */
248 : extern Dwarf_Die *dwarf_addrdie (Dwarf *dbg, Dwarf_Addr addr,
249 : Dwarf_Die *result) __nonnull_attribute__ (3);
250 :
251 : /* Return child of current DIE. */
252 : extern int dwarf_child (Dwarf_Die *die, Dwarf_Die *result)
253 : __nonnull_attribute__ (2);
254 :
255 : /* Locates the first sibling of DIE and places it in RESULT.
256 : Returns 0 if a sibling was found, -1 if something went wrong.
257 : Returns 1 if no sibling could be found and, if RESULT is not
258 : the same as DIE, it sets RESULT->addr to the address of the
259 : (non-sibling) DIE that follows this one, or NULL if this DIE
260 : was the last one in the cokmpilation unit. */
261 : extern int dwarf_siblingof (Dwarf_Die *die, Dwarf_Die *result)
262 : __nonnull_attribute__ (2);
263 :
264 : /* Check whether the DIE has children. */
265 : extern int dwarf_haschildren (Dwarf_Die *die) __nonnull_attribute__ (1);
266 :
267 : /* Walks the attributes of DIE, starting at the one OFFSET bytes in,
268 : calling the CALLBACK function for each one. Stops if the callback
269 : function ever returns a value other than DWARF_CB_OK and returns the
270 : offset of the offending attribute. If the end of the attributes
271 : is reached 1 is returned. If something goes wrong -1 is returned and
272 : the dwarf error number is set. */
273 : extern ptrdiff_t dwarf_getattrs (Dwarf_Die *die,
274 : int (*callback) (Dwarf_Attribute *, void *),
275 : void *arg, ptrdiff_t offset)
276 : __nonnull_attribute__ (2);
277 :
278 : /* Return tag of given DIE. */
279 : extern int dwarf_tag (Dwarf_Die *die) __nonnull_attribute__ (1);
280 :
281 :
282 : /* Return specific attribute of DIE. */
283 : extern Dwarf_Attribute *dwarf_attr (Dwarf_Die *die, unsigned int search_name,
284 : Dwarf_Attribute *result)
285 : __nonnull_attribute__ (3);
286 :
287 : /* Check whether given DIE has specific attribute. */
288 : extern int dwarf_hasattr (Dwarf_Die *die, unsigned int search_name);
289 :
290 : /* These are the same as dwarf_attr and dwarf_hasattr, respectively,
291 : but they resolve an indirect attribute through DW_AT_abstract_origin. */
292 : extern Dwarf_Attribute *dwarf_attr_integrate (Dwarf_Die *die,
293 : unsigned int search_name,
294 : Dwarf_Attribute *result)
295 : __nonnull_attribute__ (3);
296 : extern int dwarf_hasattr_integrate (Dwarf_Die *die, unsigned int search_name);
297 :
298 :
299 :
300 :
301 : /* Check whether given attribute has specific form. */
302 : extern int dwarf_hasform (Dwarf_Attribute *attr, unsigned int search_form);
303 :
304 : /* Return attribute code of given attribute. */
305 : extern unsigned int dwarf_whatattr (Dwarf_Attribute *attr);
306 :
307 : /* Return form code of given attribute. */
308 : extern unsigned int dwarf_whatform (Dwarf_Attribute *attr);
309 :
310 :
311 : /* Return string associated with given attribute. */
312 : extern const char *dwarf_formstring (Dwarf_Attribute *attrp);
313 :
314 : /* Return unsigned constant represented by attribute. */
315 : extern int dwarf_formudata (Dwarf_Attribute *attr, Dwarf_Word *return_uval)
316 : __nonnull_attribute__ (2);
317 :
318 : /* Return signed constant represented by attribute. */
319 : extern int dwarf_formsdata (Dwarf_Attribute *attr, Dwarf_Sword *return_uval)
320 : __nonnull_attribute__ (2);
321 :
322 : /* Return address represented by attribute. */
323 : extern int dwarf_formaddr (Dwarf_Attribute *attr, Dwarf_Addr *return_addr)
324 : __nonnull_attribute__ (2);
325 :
326 : /* This function is deprecated. Always use dwarf_formref_die instead.
327 : Return reference offset represented by attribute. */
328 : extern int dwarf_formref (Dwarf_Attribute *attr, Dwarf_Off *return_offset)
329 : __nonnull_attribute__ (2) __deprecated_attribute__;
330 :
331 : /* Look up the DIE in a reference-form attribute. */
332 : extern Dwarf_Die *dwarf_formref_die (Dwarf_Attribute *attr, Dwarf_Die *die_mem)
333 : __nonnull_attribute__ (2);
334 :
335 : /* Return block represented by attribute. */
336 : extern int dwarf_formblock (Dwarf_Attribute *attr, Dwarf_Block *return_block)
337 : __nonnull_attribute__ (2);
338 :
339 : /* Return flag represented by attribute. */
340 : extern int dwarf_formflag (Dwarf_Attribute *attr, bool *return_bool)
341 : __nonnull_attribute__ (2);
342 :
343 :
344 : /* Simplified attribute value access functions. */
345 :
346 : /* Return string in name attribute of DIE. */
347 : extern const char *dwarf_diename (Dwarf_Die *die);
348 :
349 : /* Return high PC attribute of DIE. */
350 : extern int dwarf_highpc (Dwarf_Die *die, Dwarf_Addr *return_addr)
351 : __nonnull_attribute__ (2);
352 :
353 : /* Return low PC attribute of DIE. */
354 : extern int dwarf_lowpc (Dwarf_Die *die, Dwarf_Addr *return_addr)
355 : __nonnull_attribute__ (2);
356 :
357 : /* Return entry_pc or low_pc attribute of DIE. */
358 : extern int dwarf_entrypc (Dwarf_Die *die, Dwarf_Addr *return_addr)
359 : __nonnull_attribute__ (2);
360 :
361 : /* Return 1 if DIE's lowpc/highpc or ranges attributes match the PC address,
362 : 0 if not, or -1 for errors. */
363 : extern int dwarf_haspc (Dwarf_Die *die, Dwarf_Addr pc);
364 :
365 : /* Enumerate the PC address ranges covered by this DIE, covering all
366 : addresses where dwarf_haspc returns true. In the first call OFFSET
367 : should be zero and *BASEP need not be initialized. Returns -1 for
368 : errors, zero when there are no more address ranges to report, or a
369 : nonzero OFFSET value to pass to the next call. Each subsequent call
370 : must preserve *BASEP from the prior call. Successful calls fill in
371 : *STARTP and *ENDP with a contiguous address range. */
372 : extern ptrdiff_t dwarf_ranges (Dwarf_Die *die,
373 : ptrdiff_t offset, Dwarf_Addr *basep,
374 : Dwarf_Addr *startp, Dwarf_Addr *endp);
375 :
376 :
377 : /* Return byte size attribute of DIE. */
378 : extern int dwarf_bytesize (Dwarf_Die *die);
379 :
380 : /* Return bit size attribute of DIE. */
381 : extern int dwarf_bitsize (Dwarf_Die *die);
382 :
383 : /* Return bit offset attribute of DIE. */
384 : extern int dwarf_bitoffset (Dwarf_Die *die);
385 :
386 : /* Return array order attribute of DIE. */
387 : extern int dwarf_arrayorder (Dwarf_Die *die);
388 :
389 : /* Return source language attribute of DIE. */
390 : extern int dwarf_srclang (Dwarf_Die *die);
391 :
392 :
393 : /* Get abbreviation at given offset for given DIE. */
394 : extern Dwarf_Abbrev *dwarf_getabbrev (Dwarf_Die *die, Dwarf_Off offset,
395 : size_t *lengthp);
396 :
397 : /* Get abbreviation at given offset in .debug_abbrev section. */
398 : extern int dwarf_offabbrev (Dwarf *dbg, Dwarf_Off offset, size_t *lengthp,
399 : Dwarf_Abbrev *abbrevp)
400 : __nonnull_attribute__ (4);
401 :
402 : /* Get abbreviation code. */
403 : extern unsigned int dwarf_getabbrevcode (Dwarf_Abbrev *abbrev);
404 :
405 : /* Get abbreviation tag. */
406 : extern unsigned int dwarf_getabbrevtag (Dwarf_Abbrev *abbrev);
407 :
408 : /* Return true if abbreviation is children flag set. */
409 : extern int dwarf_abbrevhaschildren (Dwarf_Abbrev *abbrev);
410 :
411 : /* Get number of attributes of abbreviation. */
412 : extern int dwarf_getattrcnt (Dwarf_Abbrev *abbrev, size_t *attrcntp)
413 : __nonnull_attribute__ (2);
414 :
415 : /* Get specific attribute of abbreviation. */
416 : extern int dwarf_getabbrevattr (Dwarf_Abbrev *abbrev, size_t idx,
417 : unsigned int *namep, unsigned int *formp,
418 : Dwarf_Off *offset);
419 :
420 :
421 : /* Get string from-debug_str section. */
422 : extern const char *dwarf_getstring (Dwarf *dbg, Dwarf_Off offset,
423 : size_t *lenp);
424 :
425 :
426 : /* Get public symbol information. */
427 : extern ptrdiff_t dwarf_getpubnames (Dwarf *dbg,
428 : int (*callback) (Dwarf *, Dwarf_Global *,
429 : void *),
430 : void *arg, ptrdiff_t offset)
431 : __nonnull_attribute__ (2);
432 :
433 :
434 : /* Get source file information for CU. */
435 : extern int dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines,
436 : size_t *nlines) __nonnull_attribute__ (2, 3);
437 :
438 : /* Return one of the source lines of the CU. */
439 : extern Dwarf_Line *dwarf_onesrcline (Dwarf_Lines *lines, size_t idx);
440 :
441 : /* Get the file source files used in the CU. */
442 : extern int dwarf_getsrcfiles (Dwarf_Die *cudie, Dwarf_Files **files,
443 : size_t *nfiles)
444 : __nonnull_attribute__ (2);
445 :
446 :
447 : /* Get source for address in CU. */
448 : extern Dwarf_Line *dwarf_getsrc_die (Dwarf_Die *cudie, Dwarf_Addr addr);
449 :
450 : /* Get source for file and line number. */
451 : extern int dwarf_getsrc_file (Dwarf *dbg, const char *fname, int line, int col,
452 : Dwarf_Line ***srcsp, size_t *nsrcs)
453 : __nonnull_attribute__ (2, 5, 6);
454 :
455 :
456 : /* Return line address. */
457 : extern int dwarf_lineaddr (Dwarf_Line *line, Dwarf_Addr *addrp);
458 :
459 : /* Return line number. */
460 : extern int dwarf_lineno (Dwarf_Line *line, int *linep)
461 : __nonnull_attribute__ (2);
462 :
463 : /* Return column in line. */
464 : extern int dwarf_linecol (Dwarf_Line *line, int *colp)
465 : __nonnull_attribute__ (2);
466 :
467 : /* Return true if record is for beginning of a statement. */
468 : extern int dwarf_linebeginstatement (Dwarf_Line *line, bool *flagp)
469 : __nonnull_attribute__ (2);
470 :
471 : /* Return true if record is for end of sequence. */
472 : extern int dwarf_lineendsequence (Dwarf_Line *line, bool *flagp)
473 : __nonnull_attribute__ (2);
474 :
475 : /* Return true if record is for beginning of a basic block. */
476 : extern int dwarf_lineblock (Dwarf_Line *line, bool *flagp)
477 : __nonnull_attribute__ (2);
478 :
479 : /* Return true if record is for end of prologue. */
480 : extern int dwarf_lineprologueend (Dwarf_Line *line, bool *flagp)
481 : __nonnull_attribute__ (2);
482 :
483 : /* Return true if record is for beginning of epilogue. */
484 : extern int dwarf_lineepiloguebegin (Dwarf_Line *line, bool *flagp)
485 : __nonnull_attribute__ (2);
486 :
487 :
488 : /* Find line information for address. */
489 : extern const char *dwarf_linesrc (Dwarf_Line *line,
490 : Dwarf_Word *mtime, Dwarf_Word *length);
491 :
492 : /* Return file information. */
493 : extern const char *dwarf_filesrc (Dwarf_Files *file, size_t idx,
494 : Dwarf_Word *mtime, Dwarf_Word *length);
495 :
496 : /* Return the directory list used in the file information extracted.
497 : (*RESULT)[0] is the CU's DW_AT_comp_dir value, and may be null.
498 : (*RESULT)[0..*NDIRS-1] are the compile-time include directory path
499 : encoded by the compiler. */
500 : extern int dwarf_getsrcdirs (Dwarf_Files *files,
501 : const char *const **result, size_t *ndirs)
502 : __nonnull_attribute__ (2, 3);
503 :
504 :
505 : /* Return location expression, decoded as a list of operations. */
506 : extern int dwarf_getlocation (Dwarf_Attribute *attr, Dwarf_Op **expr,
507 : size_t *exprlen) __nonnull_attribute__ (2, 3);
508 :
509 : /* Return location expressions. If the attribute uses a location list,
510 : ADDRESS selects the relevant location expressions from the list.
511 : There can be multiple matches, resulting in multiple expressions to
512 : return. EXPRS and EXPRLENS are parallel arrays of NLOCS slots to
513 : fill in. Returns the number of locations filled in, or -1 for
514 : errors. If EXPRS is a null pointer, stores nothing and returns the
515 : total number of locations. A return value of zero means that the
516 : location list indicated no value is accessible. */
517 : extern int dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address,
518 : Dwarf_Op **exprs, size_t *exprlens,
519 : size_t nlocs);
520 :
521 :
522 : /* Return scope DIEs containing PC address.
523 : Sets *SCOPES to a malloc'd array of Dwarf_Die structures,
524 : and returns the number of elements in the array.
525 : (*SCOPES)[0] is the DIE for the innermost scope containing PC,
526 : (*SCOPES)[1] is the DIE for the scope containing that scope, and so on.
527 : Returns -1 for errors or 0 if no scopes match PC. */
528 : extern int dwarf_getscopes (Dwarf_Die *cudie, Dwarf_Addr pc,
529 : Dwarf_Die **scopes);
530 :
531 : /* Return scope DIEs containing the given DIE.
532 : Sets *SCOPES to a malloc'd array of Dwarf_Die structures,
533 : and returns the number of elements in the array.
534 : (*SCOPES)[0] is a copy of DIE.
535 : (*SCOPES)[1] is the DIE for the scope containing that scope, and so on.
536 : Returns -1 for errors or 0 if DIE is not found in any scope entry. */
537 : extern int dwarf_getscopes_die (Dwarf_Die *die, Dwarf_Die **scopes);
538 :
539 :
540 : /* Search SCOPES[0..NSCOPES-1] for a variable called NAME.
541 : Ignore the first SKIP_SHADOWS scopes that match the name.
542 : If MATCH_FILE is not null, accept only declaration in that source file;
543 : if MATCH_LINENO or MATCH_LINECOL are also nonzero, accept only declaration
544 : at that line and column.
545 :
546 : If successful, fill in *RESULT with the DIE of the variable found,
547 : and return N where SCOPES[N] is the scope defining the variable.
548 : Return -1 for errors or -2 for no matching variable found. */
549 : extern int dwarf_getscopevar (Dwarf_Die *scopes, int nscopes,
550 : const char *name, int skip_shadows,
551 : const char *match_file,
552 : int match_lineno, int match_linecol,
553 : Dwarf_Die *result);
554 :
555 :
556 :
557 : /* Return list address ranges. */
558 : extern int dwarf_getaranges (Dwarf *dbg, Dwarf_Aranges **aranges,
559 : size_t *naranges)
560 : __nonnull_attribute__ (2);
561 :
562 : /* Return one of the address range entries. */
563 : extern Dwarf_Arange *dwarf_onearange (Dwarf_Aranges *aranges, size_t idx);
564 :
565 : /* Return information in address range record. */
566 : extern int dwarf_getarangeinfo (Dwarf_Arange *arange, Dwarf_Addr *addrp,
567 : Dwarf_Word *lengthp, Dwarf_Off *offsetp);
568 :
569 : /* Get address range which includes given address. */
570 : extern Dwarf_Arange *dwarf_getarange_addr (Dwarf_Aranges *aranges,
571 : Dwarf_Addr addr);
572 :
573 :
574 :
575 : /* Get functions in CUDIE. */
576 : extern ptrdiff_t dwarf_getfuncs (Dwarf_Die *cudie,
577 : int (*callback) (Dwarf_Die *, void *),
578 : void *arg, ptrdiff_t offset);
579 :
580 :
581 : /* Return file name containing definition of the given declaration. */
582 : extern const char *dwarf_decl_file (Dwarf_Die *decl);
583 :
584 : /* Get line number of beginning of given declaration. */
585 : extern int dwarf_decl_line (Dwarf_Die *decl, int *linep)
586 : __nonnull_attribute__ (2);
587 :
588 : /* Get column number of beginning of given declaration. */
589 : extern int dwarf_decl_column (Dwarf_Die *decl, int *colp)
590 : __nonnull_attribute__ (2);
591 :
592 :
593 : /* Return nonzero if given function is an abstract inline definition. */
594 : extern int dwarf_func_inline (Dwarf_Die *func);
595 :
596 : /* Find each concrete inlined instance of the abstract inline definition. */
597 : extern int dwarf_func_inline_instances (Dwarf_Die *func,
598 : int (*callback) (Dwarf_Die *, void *),
599 : void *arg);
600 :
601 :
602 : /* Find the appropriate PC location or locations for function entry
603 : breakpoints for the given DW_TAG_subprogram DIE. Returns -1 for errors.
604 : On success, returns the number of breakpoint locations (never zero)
605 : and sets *BKPTS to a malloc'd vector of addresses. */
606 : extern int dwarf_entry_breakpoints (Dwarf_Die *die, Dwarf_Addr **bkpts);
607 :
608 :
609 : /* Call callback function for each of the macro information entry for
610 : the CU. */
611 : extern ptrdiff_t dwarf_getmacros (Dwarf_Die *cudie,
612 : int (*callback) (Dwarf_Macro *, void *),
613 : void *arg, ptrdiff_t offset)
614 : __nonnull_attribute__ (2);
615 :
616 : /* Return macro opcode. */
617 : extern int dwarf_macro_opcode (Dwarf_Macro *macro, unsigned int *opcodep)
618 : __nonnull_attribute__ (2);
619 :
620 : /* Return first macro parameter. */
621 : extern int dwarf_macro_param1 (Dwarf_Macro *macro, Dwarf_Word *paramp)
622 : __nonnull_attribute__ (2);
623 :
624 : /* Return second macro parameter. */
625 : extern int dwarf_macro_param2 (Dwarf_Macro *macro, Dwarf_Word *paramp,
626 : const char **strp);
627 :
628 :
629 : /* Return error code of last failing function call. This value is kept
630 : separately for each thread. */
631 : extern int dwarf_errno (void);
632 :
633 : /* Return error string for ERROR. If ERROR is zero, return error string
634 : for most recent error or NULL is none occurred. If ERROR is -1 the
635 : behaviour is similar to the last case except that not NULL but a legal
636 : string is returned. */
637 : extern const char *dwarf_errmsg (int err);
638 :
639 :
640 : /* Register new Out-Of-Memory handler. The old handler is returned. */
641 : extern Dwarf_OOM dwarf_new_oom_handler (Dwarf *dbg, Dwarf_OOM handler);
642 :
643 :
644 : /* Inline optimizations. */
645 : #ifdef __OPTIMIZE__
646 : /* Return attribute code of given attribute. */
647 : __libdw_extern_inline unsigned int
648 : dwarf_whatattr (Dwarf_Attribute *attr)
649 : {
650 : return attr == NULL ? 0 : attr->code;
651 : }
652 :
653 : /* Return attribute code of given attribute. */
654 : __libdw_extern_inline unsigned int
655 : dwarf_whatform (Dwarf_Attribute *attr)
656 : {
657 : return attr == NULL ? 0 : attr->form;
658 : }
659 : #endif /* Optimize. */
660 :
661 : #ifdef __cplusplus
662 : }
663 : #endif
664 :
665 : #endif /* libdw.h */
|