blob: 6242d04f8cef941aaa18811cc51204bf2d7c967a [file] [log] [blame]
Ulrich Drepperb08d5a82005-07-26 05:00:05 +00001/* Interfaces for libdw.
Roland McGrath43da9892007-04-16 23:13:37 +00002 Copyright (C) 2002, 2004, 2005, 2006, 2007 Red Hat, Inc.
Ulrich Drepper361df7d2006-04-04 21:38:57 +00003 This file is part of Red Hat elfutils.
Ulrich Drepperb08d5a82005-07-26 05:00:05 +00004
Ulrich Drepper361df7d2006-04-04 21:38:57 +00005 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.
Ulrich Drepperb08d5a82005-07-26 05:00:05 +00008
Ulrich Drepper361df7d2006-04-04 21:38:57 +00009 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,
Ulrich Drepper1e9ef502006-04-04 22:29:06 +000016 Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
Ulrich Drepper361df7d2006-04-04 21:38:57 +000017
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>. */
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000049
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__)))
Roland McGrathe4c22ea2007-10-23 13:07:39 +000060# define __deprecated_attribute__ __attribute__ ((__deprecated__))
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000061#else
62# define __nonnull_attribute__(args...)
Roland McGrathe4c22ea2007-10-23 13:07:39 +000063# define __deprecated_attribute__
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000064#endif
65
Roland McGrathe4c22ea2007-10-23 13:07:39 +000066
Roland McGrath87d47802007-07-16 22:23:37 +000067#ifdef __GNUC_STDC_INLINE__
Ulrich Drepperb597dfa2007-10-16 05:21:27 +000068# define __libdw_extern_inline extern __inline __attribute__ ((__gnu_inline__))
Roland McGrath87d47802007-07-16 22:23:37 +000069#else
Ulrich Drepperb597dfa2007-10-16 05:21:27 +000070# define __libdw_extern_inline extern __inline
Roland McGrath87d47802007-07-16 22:23:37 +000071#endif
72
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000073
74/* Mode for the session. */
75typedef enum
76 {
77 DWARF_C_READ, /* Read .. */
78 DWARF_C_RDWR, /* Read and write .. */
79 DWARF_C_WRITE, /* Write .. */
80 }
81Dwarf_Cmd;
82
83
84/* Callback results. */
85enum
86{
87 DWARF_CB_OK = 0,
88 DWARF_CB_ABORT
89};
90
91
92/* Error values. */
93enum
94 {
95 DW_TAG_invalid = 0
96#define DW_TAG_invalid DW_TAG_invalid
97 };
98
99
100/* Type for offset in DWARF file. */
101typedef GElf_Off Dwarf_Off;
102
103/* Type for address in DWARF file. */
104typedef GElf_Addr Dwarf_Addr;
105
106/* Integer types. Big enough to hold any numeric value. */
107typedef GElf_Xword Dwarf_Word;
108typedef GElf_Sxword Dwarf_Sword;
109/* For the times we know we do not need that much. */
110typedef GElf_Half Dwarf_Half;
111
112
113/* DWARF abbreviation record. */
114typedef 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. */
120typedef struct Dwarf_Lines_s Dwarf_Lines;
121
122/* One source code line information. */
123typedef struct Dwarf_Line_s Dwarf_Line;
124
125/* Source file information. */
126typedef struct Dwarf_Files_s Dwarf_Files;
127
128/* One address range record. */
129typedef struct Dwarf_Arange_s Dwarf_Arange;
130
131/* Address ranges of a file. */
132typedef struct Dwarf_Aranges_s Dwarf_Aranges;
133
134/* CU representation. */
135struct Dwarf_CU;
136
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000137/* Macro information. */
138typedef struct Dwarf_Macro_s Dwarf_Macro;
139
140/* Attribute representation. */
141typedef 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. */
151typedef struct
152{
153 Dwarf_Word length;
154 unsigned char *data;
155} Dwarf_Block;
156
157
158/* DIE information. */
159typedef 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} 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. */
174typedef struct
175{
176 Dwarf_Off cu_offset;
177 Dwarf_Off die_offset;
178 const char *name;
179} Dwarf_Global;
180
181
Roland McGrath6724c902005-10-28 07:07:19 +0000182/* One operation in a DWARF location expression.
183 A location expression is an array of these. */
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000184typedef 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 */
Roland McGrath6724c902005-10-28 07:07:19 +0000190} Dwarf_Op;
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000191
192
193/* Handle for debug sessions. */
194typedef struct Dwarf Dwarf;
195
196
197/* Out-Of-Memory handler. */
198#if __GNUC__ < 4
199typedef void (*Dwarf_OOM) (void);
200#else
201typedef void (*__attribute__ ((noreturn)) Dwarf_OOM) (void);
202#endif
203
204
Ulrich Drepper3be74472006-05-27 18:15:40 +0000205#ifdef __cplusplus
206extern "C" {
207#endif
208
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000209/* Create a handle for a new debug session. */
210extern Dwarf *dwarf_begin (int fildes, Dwarf_Cmd cmd);
211
212/* Create a handle for a new debug session for an ELF file. */
213extern Dwarf *dwarf_begin_elf (Elf *elf, Dwarf_Cmd cmd, Elf_Scn *scngrp);
214
215/* Retrieve ELF descriptor used for DWARF access. */
216extern Elf *dwarf_getelf (Dwarf *dwarf);
217
218/* Release debugging handling context. */
219extern int dwarf_end (Dwarf *dwarf);
220
221
222/* Get the data block for the .debug_info section. */
223extern Elf_Data *dwarf_getscn_info (Dwarf *dwarf);
224
225/* Read the header for the DWARF CU header. */
226extern 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. */
233extern Dwarf_Die *dwarf_offdie (Dwarf *dbg, Dwarf_Off offset,
234 Dwarf_Die *result) __nonnull_attribute__ (3);
235
236/* Return offset of DIE. */
237extern Dwarf_Off dwarf_dieoffset (Dwarf_Die *die);
238
239/* Return offset of DIE in CU. */
240extern Dwarf_Off dwarf_cuoffset (Dwarf_Die *die);
241
Roland McGrath07d4f2f2005-10-28 06:56:24 +0000242/* Return CU DIE containing given DIE. */
243extern Dwarf_Die *dwarf_diecu (Dwarf_Die *die, Dwarf_Die *result,
Roland McGrathc373d852006-10-10 00:25:21 +0000244 uint8_t *address_sizep, uint8_t *offset_sizep)
245 __nonnull_attribute__ (2);
Roland McGrath07d4f2f2005-10-28 06:56:24 +0000246
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000247/* Return CU DIE containing given address. */
248extern Dwarf_Die *dwarf_addrdie (Dwarf *dbg, Dwarf_Addr addr,
249 Dwarf_Die *result) __nonnull_attribute__ (3);
250
251/* Return child of current DIE. */
252extern int dwarf_child (Dwarf_Die *die, Dwarf_Die *result)
Roland McGrathc373d852006-10-10 00:25:21 +0000253 __nonnull_attribute__ (2);
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000254
255/* Return sibling of given DIE. */
256extern int dwarf_siblingof (Dwarf_Die *die, Dwarf_Die *result)
257 __nonnull_attribute__ (2);
258
259/* Check whether the DIE has children. */
Ulrich Drepper4f3d2a22006-05-22 01:30:56 +0000260extern int dwarf_haschildren (Dwarf_Die *die) __nonnull_attribute__ (1);
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000261
262/* Get attributes of the DIE. */
263extern ptrdiff_t dwarf_getattrs (Dwarf_Die *die,
264 int (*callback) (Dwarf_Attribute *, void *),
Ulrich Drepper4f3d2a22006-05-22 01:30:56 +0000265 void *arg, ptrdiff_t offset)
266 __nonnull_attribute__ (2);
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000267
268/* Return tag of given DIE. */
Ulrich Drepper4f3d2a22006-05-22 01:30:56 +0000269extern int dwarf_tag (Dwarf_Die *die) __nonnull_attribute__ (1);
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000270
271
272/* Return specific attribute of DIE. */
273extern Dwarf_Attribute *dwarf_attr (Dwarf_Die *die, unsigned int search_name,
274 Dwarf_Attribute *result)
275 __nonnull_attribute__ (3);
276
277/* Check whether given DIE has specific attribute. */
278extern int dwarf_hasattr (Dwarf_Die *die, unsigned int search_name);
279
280/* These are the same as dwarf_attr and dwarf_hasattr, respectively,
281 but they resolve an indirect attribute through DW_AT_abstract_origin. */
282extern Dwarf_Attribute *dwarf_attr_integrate (Dwarf_Die *die,
283 unsigned int search_name,
284 Dwarf_Attribute *result)
285 __nonnull_attribute__ (3);
286extern int dwarf_hasattr_integrate (Dwarf_Die *die, unsigned int search_name);
287
288
289
290
291/* Check whether given attribute has specific form. */
292extern int dwarf_hasform (Dwarf_Attribute *attr, unsigned int search_form);
293
294/* Return attribute code of given attribute. */
295extern unsigned int dwarf_whatattr (Dwarf_Attribute *attr);
296
297/* Return form code of given attribute. */
298extern unsigned int dwarf_whatform (Dwarf_Attribute *attr);
299
300
301/* Return string associated with given attribute. */
302extern const char *dwarf_formstring (Dwarf_Attribute *attrp);
303
304/* Return unsigned constant represented by attribute. */
305extern int dwarf_formudata (Dwarf_Attribute *attr, Dwarf_Word *return_uval)
306 __nonnull_attribute__ (2);
307
308/* Return signed constant represented by attribute. */
309extern int dwarf_formsdata (Dwarf_Attribute *attr, Dwarf_Sword *return_uval)
310 __nonnull_attribute__ (2);
311
312/* Return address represented by attribute. */
313extern int dwarf_formaddr (Dwarf_Attribute *attr, Dwarf_Addr *return_addr)
314 __nonnull_attribute__ (2);
315
Roland McGrathe4c22ea2007-10-23 13:07:39 +0000316/* This function is deprecated. Always use dwarf_formref_die instead.
317 Return reference offset represented by attribute. */
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000318extern int dwarf_formref (Dwarf_Attribute *attr, Dwarf_Off *return_offset)
Roland McGrathe4c22ea2007-10-23 13:07:39 +0000319 __nonnull_attribute__ (2) __deprecated_attribute__;
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000320
321/* Look up the DIE in a reference-form attribute. */
322extern Dwarf_Die *dwarf_formref_die (Dwarf_Attribute *attr, Dwarf_Die *die_mem)
323 __nonnull_attribute__ (2);
324
325/* Return block represented by attribute. */
326extern int dwarf_formblock (Dwarf_Attribute *attr, Dwarf_Block *return_block)
327 __nonnull_attribute__ (2);
328
329/* Return flag represented by attribute. */
330extern int dwarf_formflag (Dwarf_Attribute *attr, bool *return_bool)
331 __nonnull_attribute__ (2);
332
333
334/* Simplified attribute value access functions. */
335
336/* Return string in name attribute of DIE. */
337extern const char *dwarf_diename (Dwarf_Die *die);
338
339/* Return high PC attribute of DIE. */
340extern int dwarf_highpc (Dwarf_Die *die, Dwarf_Addr *return_addr)
341 __nonnull_attribute__ (2);
342
343/* Return low PC attribute of DIE. */
344extern int dwarf_lowpc (Dwarf_Die *die, Dwarf_Addr *return_addr)
345 __nonnull_attribute__ (2);
346
Roland McGrath07d4f2f2005-10-28 06:56:24 +0000347/* Return entry_pc or low_pc attribute of DIE. */
348extern int dwarf_entrypc (Dwarf_Die *die, Dwarf_Addr *return_addr)
349 __nonnull_attribute__ (2);
350
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000351/* Return 1 if DIE's lowpc/highpc or ranges attributes match the PC address,
352 0 if not, or -1 for errors. */
353extern int dwarf_haspc (Dwarf_Die *die, Dwarf_Addr pc);
354
Roland McGrath07d4f2f2005-10-28 06:56:24 +0000355/* Enumerate the PC address ranges covered by this DIE, covering all
356 addresses where dwarf_haspc returns true. In the first call OFFSET
357 should be zero and *BASEP need not be initialized. Returns -1 for
358 errors, zero when there are no more address ranges to report, or a
359 nonzero OFFSET value to pass to the next call. Each subsequent call
360 must preserve *BASEP from the prior call. Successful calls fill in
361 *STARTP and *ENDP with a contiguous address range. */
362extern ptrdiff_t dwarf_ranges (Dwarf_Die *die,
363 ptrdiff_t offset, Dwarf_Addr *basep,
364 Dwarf_Addr *startp, Dwarf_Addr *endp);
365
366
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000367/* Return byte size attribute of DIE. */
368extern int dwarf_bytesize (Dwarf_Die *die);
369
370/* Return bit size attribute of DIE. */
371extern int dwarf_bitsize (Dwarf_Die *die);
372
373/* Return bit offset attribute of DIE. */
374extern int dwarf_bitoffset (Dwarf_Die *die);
375
376/* Return array order attribute of DIE. */
377extern int dwarf_arrayorder (Dwarf_Die *die);
378
379/* Return source language attribute of DIE. */
380extern int dwarf_srclang (Dwarf_Die *die);
381
382
383/* Get abbreviation at given offset for given DIE. */
384extern Dwarf_Abbrev *dwarf_getabbrev (Dwarf_Die *die, Dwarf_Off offset,
385 size_t *lengthp);
386
387/* Get abbreviation at given offset in .debug_abbrev section. */
388extern int dwarf_offabbrev (Dwarf *dbg, Dwarf_Off offset, size_t *lengthp,
389 Dwarf_Abbrev *abbrevp)
390 __nonnull_attribute__ (4);
391
392/* Get abbreviation code. */
393extern unsigned int dwarf_getabbrevcode (Dwarf_Abbrev *abbrev);
394
395/* Get abbreviation tag. */
396extern unsigned int dwarf_getabbrevtag (Dwarf_Abbrev *abbrev);
397
398/* Return true if abbreviation is children flag set. */
399extern int dwarf_abbrevhaschildren (Dwarf_Abbrev *abbrev);
400
401/* Get number of attributes of abbreviation. */
402extern int dwarf_getattrcnt (Dwarf_Abbrev *abbrev, size_t *attrcntp)
403 __nonnull_attribute__ (2);
404
405/* Get specific attribute of abbreviation. */
406extern int dwarf_getabbrevattr (Dwarf_Abbrev *abbrev, size_t idx,
407 unsigned int *namep, unsigned int *formp,
408 Dwarf_Off *offset);
409
410
411/* Get string from-debug_str section. */
412extern const char *dwarf_getstring (Dwarf *dbg, Dwarf_Off offset,
413 size_t *lenp);
414
415
416/* Get public symbol information. */
417extern ptrdiff_t dwarf_getpubnames (Dwarf *dbg,
418 int (*callback) (Dwarf *, Dwarf_Global *,
419 void *),
420 void *arg, ptrdiff_t offset)
421 __nonnull_attribute__ (2);
422
423
424/* Get source file information for CU. */
425extern int dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines,
426 size_t *nlines) __nonnull_attribute__ (2, 3);
427
428/* Return one of the source lines of the CU. */
429extern Dwarf_Line *dwarf_onesrcline (Dwarf_Lines *lines, size_t idx);
430
431/* Get the file source files used in the CU. */
432extern int dwarf_getsrcfiles (Dwarf_Die *cudie, Dwarf_Files **files,
433 size_t *nfiles)
434 __nonnull_attribute__ (2);
435
436
437/* Get source for address in CU. */
438extern Dwarf_Line *dwarf_getsrc_die (Dwarf_Die *cudie, Dwarf_Addr addr);
439
440/* Get source for file and line number. */
441extern int dwarf_getsrc_file (Dwarf *dbg, const char *fname, int line, int col,
442 Dwarf_Line ***srcsp, size_t *nsrcs)
443 __nonnull_attribute__ (2, 5, 6);
444
445
446/* Return line address. */
447extern int dwarf_lineaddr (Dwarf_Line *line, Dwarf_Addr *addrp);
448
449/* Return line number. */
450extern int dwarf_lineno (Dwarf_Line *line, int *linep)
451 __nonnull_attribute__ (2);
452
453/* Return column in line. */
454extern int dwarf_linecol (Dwarf_Line *line, int *colp)
455 __nonnull_attribute__ (2);
456
457/* Return true if record is for beginning of a statement. */
458extern int dwarf_linebeginstatement (Dwarf_Line *line, bool *flagp)
459 __nonnull_attribute__ (2);
460
461/* Return true if record is for end of sequence. */
462extern int dwarf_lineendsequence (Dwarf_Line *line, bool *flagp)
463 __nonnull_attribute__ (2);
464
465/* Return true if record is for beginning of a basic block. */
466extern int dwarf_lineblock (Dwarf_Line *line, bool *flagp)
467 __nonnull_attribute__ (2);
468
469/* Return true if record is for end of prologue. */
470extern int dwarf_lineprologueend (Dwarf_Line *line, bool *flagp)
471 __nonnull_attribute__ (2);
472
473/* Return true if record is for beginning of epilogue. */
474extern int dwarf_lineepiloguebegin (Dwarf_Line *line, bool *flagp)
475 __nonnull_attribute__ (2);
476
477
478/* Find line information for address. */
479extern const char *dwarf_linesrc (Dwarf_Line *line,
480 Dwarf_Word *mtime, Dwarf_Word *length);
481
482/* Return file information. */
483extern const char *dwarf_filesrc (Dwarf_Files *file, size_t idx,
484 Dwarf_Word *mtime, Dwarf_Word *length);
485
Roland McGrath43da9892007-04-16 23:13:37 +0000486/* Return the directory list used in the file information extracted.
487 (*RESULT)[0] is the CU's DW_AT_comp_dir value, and may be null.
488 (*RESULT)[0..*NDIRS-1] are the compile-time include directory path
489 encoded by the compiler. */
490extern int dwarf_getsrcdirs (Dwarf_Files *files,
491 const char *const **result, size_t *ndirs)
492 __nonnull_attribute__ (2, 3);
493
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000494
Roland McGrath6724c902005-10-28 07:07:19 +0000495/* Return location expression, decoded as a list of operations. */
496extern int dwarf_getlocation (Dwarf_Attribute *attr, Dwarf_Op **expr,
497 size_t *exprlen) __nonnull_attribute__ (2, 3);
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000498
Roland McGrath6724c902005-10-28 07:07:19 +0000499/* Return location expressions. If the attribute uses a location list,
500 ADDRESS selects the relevant location expressions from the list.
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000501 There can be multiple matches, resulting in multiple expressions to
Roland McGrath6724c902005-10-28 07:07:19 +0000502 return. EXPRS and EXPRLENS are parallel arrays of NLOCS slots to
503 fill in. Returns the number of locations filled in, or -1 for
504 errors. If EXPRS is a null pointer, stores nothing and returns the
505 total number of locations. A return value of zero means that the
506 location list indicated no value is accessible. */
507extern int dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address,
508 Dwarf_Op **exprs, size_t *exprlens,
509 size_t nlocs);
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000510
511
512/* Return scope DIEs containing PC address.
513 Sets *SCOPES to a malloc'd array of Dwarf_Die structures,
514 and returns the number of elements in the array.
515 (*SCOPES)[0] is the DIE for the innermost scope containing PC,
516 (*SCOPES)[1] is the DIE for the scope containing that scope, and so on.
517 Returns -1 for errors or 0 if no scopes match PC. */
518extern int dwarf_getscopes (Dwarf_Die *cudie, Dwarf_Addr pc,
519 Dwarf_Die **scopes);
520
Roland McGrath71e15a02005-08-27 10:33:26 +0000521/* Return scope DIEs containing the given DIE.
522 Sets *SCOPES to a malloc'd array of Dwarf_Die structures,
523 and returns the number of elements in the array.
524 (*SCOPES)[0] is a copy of DIE.
525 (*SCOPES)[1] is the DIE for the scope containing that scope, and so on.
526 Returns -1 for errors or 0 if DIE is not found in any scope entry. */
527extern int dwarf_getscopes_die (Dwarf_Die *die, Dwarf_Die **scopes);
528
529
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000530/* Search SCOPES[0..NSCOPES-1] for a variable called NAME.
531 Ignore the first SKIP_SHADOWS scopes that match the name.
532 If MATCH_FILE is not null, accept only declaration in that source file;
533 if MATCH_LINENO or MATCH_LINECOL are also nonzero, accept only declaration
534 at that line and column.
535
536 If successful, fill in *RESULT with the DIE of the variable found,
537 and return N where SCOPES[N] is the scope defining the variable.
538 Return -1 for errors or -2 for no matching variable found. */
539extern int dwarf_getscopevar (Dwarf_Die *scopes, int nscopes,
540 const char *name, int skip_shadows,
541 const char *match_file,
542 int match_lineno, int match_linecol,
543 Dwarf_Die *result);
544
545
546
547/* Return list address ranges. */
548extern int dwarf_getaranges (Dwarf *dbg, Dwarf_Aranges **aranges,
549 size_t *naranges)
550 __nonnull_attribute__ (2);
551
552/* Return one of the address range entries. */
553extern Dwarf_Arange *dwarf_onearange (Dwarf_Aranges *aranges, size_t idx);
554
555/* Return information in address range record. */
556extern int dwarf_getarangeinfo (Dwarf_Arange *arange, Dwarf_Addr *addrp,
557 Dwarf_Word *lengthp, Dwarf_Off *offsetp);
558
559/* Get address range which includes given address. */
560extern Dwarf_Arange *dwarf_getarange_addr (Dwarf_Aranges *aranges,
561 Dwarf_Addr addr);
562
563
564
565/* Get functions in CUDIE. */
566extern ptrdiff_t dwarf_getfuncs (Dwarf_Die *cudie,
Roland McGrath6724c902005-10-28 07:07:19 +0000567 int (*callback) (Dwarf_Die *, void *),
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000568 void *arg, ptrdiff_t offset);
569
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000570
Roland McGrath6724c902005-10-28 07:07:19 +0000571/* Return file name containing definition of the given declaration. */
572extern const char *dwarf_decl_file (Dwarf_Die *decl);
573
574/* Get line number of beginning of given declaration. */
575extern int dwarf_decl_line (Dwarf_Die *decl, int *linep)
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000576 __nonnull_attribute__ (2);
577
Roland McGrath6724c902005-10-28 07:07:19 +0000578/* Get column number of beginning of given declaration. */
579extern int dwarf_decl_column (Dwarf_Die *decl, int *colp)
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000580 __nonnull_attribute__ (2);
581
Roland McGrath1ecb6062005-08-15 09:53:04 +0000582
583/* Return nonzero if given function is an abstract inline definition. */
Roland McGrath6724c902005-10-28 07:07:19 +0000584extern int dwarf_func_inline (Dwarf_Die *func);
Roland McGrath1ecb6062005-08-15 09:53:04 +0000585
586/* Find each concrete inlined instance of the abstract inline definition. */
Roland McGrath6724c902005-10-28 07:07:19 +0000587extern int dwarf_func_inline_instances (Dwarf_Die *func,
Roland McGrath1ecb6062005-08-15 09:53:04 +0000588 int (*callback) (Dwarf_Die *, void *),
589 void *arg);
590
591
Roland McGrath07d4f2f2005-10-28 06:56:24 +0000592/* Find the appropriate PC location or locations for function entry
593 breakpoints for the given DW_TAG_subprogram DIE. Returns -1 for errors.
594 On success, returns the number of breakpoint locations (never zero)
595 and sets *BKPTS to a malloc'd vector of addresses. */
596extern int dwarf_entry_breakpoints (Dwarf_Die *die, Dwarf_Addr **bkpts);
597
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000598
599/* Call callback function for each of the macro information entry for
600 the CU. */
601extern ptrdiff_t dwarf_getmacros (Dwarf_Die *cudie,
602 int (*callback) (Dwarf_Macro *, void *),
603 void *arg, ptrdiff_t offset)
604 __nonnull_attribute__ (2);
605
606/* Return macro opcode. */
607extern int dwarf_macro_opcode (Dwarf_Macro *macro, unsigned int *opcodep)
608 __nonnull_attribute__ (2);
609
610/* Return first macro parameter. */
611extern int dwarf_macro_param1 (Dwarf_Macro *macro, Dwarf_Word *paramp)
612 __nonnull_attribute__ (2);
613
614/* Return second macro parameter. */
615extern int dwarf_macro_param2 (Dwarf_Macro *macro, Dwarf_Word *paramp,
616 const char **strp);
617
618
619/* Return error code of last failing function call. This value is kept
620 separately for each thread. */
621extern int dwarf_errno (void);
622
623/* Return error string for ERROR. If ERROR is zero, return error string
624 for most recent error or NULL is none occurred. If ERROR is -1 the
625 behaviour is similar to the last case except that not NULL but a legal
626 string is returned. */
627extern const char *dwarf_errmsg (int err);
628
629
630/* Register new Out-Of-Memory handler. The old handler is returned. */
631extern Dwarf_OOM dwarf_new_oom_handler (Dwarf *dbg, Dwarf_OOM handler);
632
633
634/* Inline optimizations. */
635#ifdef __OPTIMIZE__
636/* Return attribute code of given attribute. */
Ulrich Drepperb597dfa2007-10-16 05:21:27 +0000637__libdw_extern_inline unsigned int
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000638dwarf_whatattr (Dwarf_Attribute *attr)
639{
640 return attr == NULL ? 0 : attr->code;
641}
642
643/* Return attribute code of given attribute. */
Ulrich Drepperb597dfa2007-10-16 05:21:27 +0000644__libdw_extern_inline unsigned int
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000645dwarf_whatform (Dwarf_Attribute *attr)
646{
647 return attr == NULL ? 0 : attr->form;
648}
649#endif /* Optimize. */
650
Ulrich Drepper3be74472006-05-27 18:15:40 +0000651#ifdef __cplusplus
652}
653#endif
654
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000655#endif /* libdw.h */