blob: eacc49fc21bfbdd712a6f89abacc488386e8f194 [file] [log] [blame]
Ulrich Drepperb08d5a82005-07-26 05:00:05 +00001/* Internal definitions for libdwarf.
Roland McGrathc5acb302009-01-28 18:28:52 -08002 Copyright (C) 2002-2009 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 Written by Ulrich Drepper <drepper@redhat.com>, 2002.
5
Ulrich Drepper361df7d2006-04-04 21:38:57 +00006 Red Hat elfutils is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by the
8 Free Software Foundation; version 2 of the License.
Ulrich Drepperb08d5a82005-07-26 05:00:05 +00009
Ulrich Drepper361df7d2006-04-04 21:38:57 +000010 Red Hat elfutils is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License along
16 with Red Hat elfutils; if not, write to the Free Software Foundation,
Ulrich Drepper1e9ef502006-04-04 22:29:06 +000017 Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
Ulrich Drepper361df7d2006-04-04 21:38:57 +000018
19 In addition, as a special exception, Red Hat, Inc. gives You the
20 additional right to link the code of Red Hat elfutils with code licensed
21 under any Open Source Initiative certified open source license
22 (http://www.opensource.org/licenses/index.php) which requires the
23 distribution of source code with any binary distribution and to
24 distribute linked combinations of the two. Non-GPL Code permitted under
25 this exception must only link to the code of Red Hat elfutils through
26 those well defined interfaces identified in the file named EXCEPTION
27 found in the source code files (the "Approved Interfaces"). The files
28 of Non-GPL Code may instantiate templates or use macros or inline
29 functions from the Approved Interfaces without causing the resulting
30 work to be covered by the GNU General Public License. Only Red Hat,
31 Inc. may make changes or additions to the list of Approved Interfaces.
32 Red Hat's grant of this exception is conditioned upon your not adding
33 any new exceptions. If you wish to add a new Approved Interface or
34 exception, please contact Red Hat. You must obey the GNU General Public
35 License in all respects for all of the Red Hat elfutils code and other
36 code used in conjunction with Red Hat elfutils except the Non-GPL Code
37 covered by this exception. If you modify this file, you may extend this
38 exception to your version of the file, but you are not obligated to do
39 so. If you do not wish to provide this exception without modification,
40 you must delete this exception statement from your version and license
41 this file solely under the GPL without exception.
42
43 Red Hat elfutils is an included package of the Open Invention Network.
44 An included package of the Open Invention Network is a package for which
45 Open Invention Network licensees cross-license their patents. No patent
46 license is granted, either expressly or impliedly, by designation as an
47 included package. Should you wish to participate in the Open Invention
48 Network licensing program, please visit www.openinventionnetwork.com
49 <http://www.openinventionnetwork.com>. */
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000050
51#ifndef _LIBDWP_H
52#define _LIBDWP_H 1
53
54#include <libintl.h>
55#include <stdbool.h>
56
57#include <libdw.h>
58
59
60/* gettext helper macros. */
61#define _(Str) dgettext ("elfutils", Str)
62
63
64/* Version of the DWARF specification we support. */
Ulrich Drepper35f08c42008-01-18 19:59:08 +000065#define DWARF_VERSION 3
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000066
67/* Version of the CIE format. */
68#define CIE_VERSION 1
69
70
Roland McGrath6724c902005-10-28 07:07:19 +000071/* Known location expressions already decoded. */
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000072struct loc_s
73{
74 void *addr;
Roland McGrath6724c902005-10-28 07:07:19 +000075 Dwarf_Op *loc;
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000076 size_t nloc;
77};
78
79/* Valid indeces for the section data. */
80enum
81 {
82 IDX_debug_info = 0,
83 IDX_debug_abbrev,
84 IDX_debug_aranges,
85 IDX_debug_line,
86 IDX_debug_frame,
87 IDX_eh_frame,
88 IDX_debug_loc,
89 IDX_debug_pubnames,
90 IDX_debug_str,
91 IDX_debug_funcnames,
92 IDX_debug_typenames,
93 IDX_debug_varnames,
94 IDX_debug_weaknames,
95 IDX_debug_macinfo,
96 IDX_debug_ranges,
97 IDX_last
98 };
99
100
101/* Error values. */
102enum
103{
104 DWARF_E_NOERROR = 0,
105 DWARF_E_UNKNOWN_ERROR,
106 DWARF_E_INVALID_ACCESS,
107 DWARF_E_NO_REGFILE,
108 DWARF_E_IO_ERROR,
109 DWARF_E_INVALID_ELF,
110 DWARF_E_NO_DWARF,
111 DWARF_E_NOELF,
112 DWARF_E_GETEHDR_ERROR,
113 DWARF_E_NOMEM,
114 DWARF_E_UNIMPL,
115 DWARF_E_INVALID_CMD,
116 DWARF_E_INVALID_VERSION,
117 DWARF_E_INVALID_FILE,
118 DWARF_E_NO_ENTRY,
119 DWARF_E_INVALID_DWARF,
120 DWARF_E_NO_STRING,
121 DWARF_E_NO_ADDR,
122 DWARF_E_NO_CONSTANT,
123 DWARF_E_NO_REFERENCE,
124 DWARF_E_INVALID_REFERENCE,
125 DWARF_E_NO_DEBUG_LINE,
126 DWARF_E_INVALID_DEBUG_LINE,
127 DWARF_E_TOO_BIG,
128 DWARF_E_VERSION,
129 DWARF_E_INVALID_DIR_IDX,
130 DWARF_E_ADDR_OUTOFRANGE,
131 DWARF_E_NO_LOCLIST,
132 DWARF_E_NO_BLOCK,
133 DWARF_E_INVALID_LINE_IDX,
134 DWARF_E_INVALID_ARANGE_IDX,
135 DWARF_E_NO_MATCH,
136 DWARF_E_NO_FLAG,
137 DWARF_E_INVALID_OFFSET,
138 DWARF_E_NO_DEBUG_RANGES,
139};
140
141
142/* This is the structure representing the debugging state. */
143struct Dwarf
144{
145 /* The underlying ELF file. */
146 Elf *elf;
147
148 /* The section data. */
149 Elf_Data *sectiondata[IDX_last];
150
151 /* True if the file has a byte order different from the host. */
152 bool other_byte_order;
153
154 /* If true, we allocated the ELF descriptor ourselves. */
155 bool free_elf;
156
157 /* Information for traversing the .debug_pubnames section. This is
158 an array and separately allocated with malloc. */
159 struct pubnames_s
160 {
161 Dwarf_Off cu_offset;
162 Dwarf_Off set_start;
163 unsigned int cu_header_size;
164 int address_len;
165 } *pubnames_sets;
166 size_t pubnames_nsets;
167
168 /* Search tree for the CUs. */
169 void *cu_tree;
170 Dwarf_Off next_cu_offset;
171
172 /* Address ranges. */
173 Dwarf_Aranges *aranges;
174
175 /* Internal memory handling. This is basically a simplified
176 reimplementation of obstacks. Unfortunately the standard obstack
177 implementation is not usable in libraries. */
178 struct libdw_memblock
179 {
180 size_t size;
181 size_t remaining;
182 struct libdw_memblock *prev;
183 char mem[0];
184 } *mem_tail;
185
186 /* Default size of allocated memory blocks. */
187 size_t mem_default_size;
188
189 /* Registered OOM handler. */
190 Dwarf_OOM oom_handler;
191};
192
193
194/* Abbreviation representation. */
195struct Dwarf_Abbrev
196{
Roland McGrath1f6d2012008-12-31 00:21:04 -0800197 Dwarf_Off offset;
198 unsigned char *attrp;
199 unsigned int attrcnt;
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000200 unsigned int code;
201 unsigned int tag;
Roland McGrath1f6d2012008-12-31 00:21:04 -0800202 bool has_children;
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000203};
204
205#include "dwarf_abbrev_hash.h"
206
207
208/* Files in line information records. */
209struct Dwarf_Files_s
210 {
Roland McGrathc5acb302009-01-28 18:28:52 -0800211 struct Dwarf_CU *cu;
Roland McGrath43da9892007-04-16 23:13:37 +0000212 unsigned int ndirs;
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000213 unsigned int nfiles;
214 struct Dwarf_Fileinfo_s
215 {
216 char *name;
217 Dwarf_Word mtime;
218 Dwarf_Word length;
219 } info[0];
Roland McGrath43da9892007-04-16 23:13:37 +0000220 /* nfiles of those, followed by char *[ndirs]. */
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000221 };
222typedef struct Dwarf_Fileinfo_s Dwarf_Fileinfo;
223
224
225/* Representation of a row in the line table. */
Roland McGrath03288f02009-01-28 22:00:54 -0800226
227struct Dwarf_Line_s
228{
229 Dwarf_Addr addr;
230 unsigned int file;
231 int line;
232 unsigned short int column;
233 unsigned int is_stmt:1;
234 unsigned int basic_block:1;
235 unsigned int end_sequence:1;
236 unsigned int prologue_end:1;
237 unsigned int epilogue_begin:1;
238
239 Dwarf_Files *files;
240};
241
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000242struct Dwarf_Lines_s
Roland McGrath03288f02009-01-28 22:00:54 -0800243{
244 size_t nlines;
245 struct Dwarf_Line_s info[0];
246};
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000247
248/* Representation of address ranges. */
249struct Dwarf_Aranges_s
250{
251 Dwarf *dbg;
252 size_t naranges;
253
254 struct Dwarf_Arange_s
255 {
256 Dwarf_Addr addr;
257 Dwarf_Word length;
258 Dwarf_Off offset;
259 } info[0];
260};
261
262
263/* CU representation. */
264struct Dwarf_CU
265{
266 Dwarf *dbg;
267 Dwarf_Off start;
268 Dwarf_Off end;
269 uint8_t address_size;
270 uint8_t offset_size;
Roland McGrathe4c22ea2007-10-23 13:07:39 +0000271 uint16_t version;
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000272
273 /* Hash table for the abbreviations. */
274 Dwarf_Abbrev_Hash abbrev_hash;
275 /* Offset of the first abbreviation. */
276 size_t orig_abbrev_offset;
277 /* Offset past last read abbreviation. */
278 size_t last_abbrev_offset;
279
280 /* The srcline information. */
281 Dwarf_Lines *lines;
282
283 /* The source file information. */
284 Dwarf_Files *files;
285
286 /* Known location lists. */
287 void *locs;
288};
289
Ulrich Drepper35f08c42008-01-18 19:59:08 +0000290/* Compute the offset of a CU's first DIE from its offset. This
291 is either:
292 LEN VER OFFSET ADDR
293 4-bytes + 2-bytes + 4-bytes + 1-byte for 32-bit dwarf
294 12-bytes + 2-bytes + 8-bytes + 1-byte for 64-bit dwarf
Ulrich Dreppera969d8e2008-01-22 06:15:00 +0000295
Ulrich Drepper35f08c42008-01-18 19:59:08 +0000296 Note the trick in the computation. If the offset_size is 4
297 the '- 4' term changes the '3 *' into a '2 *'. If the
298 offset_size is 8 it accounts for the 4-byte escape value
299 used at the start of the length. */
300#define DIE_OFFSET_FROM_CU_OFFSET(cu_offset, offset_size) \
301 ((cu_offset) + 3 * (offset_size) - 4 + 3)
302
Ulrich Drepperdb1d5432006-10-10 15:34:34 +0000303#define CUDIE(fromcu) \
Roland McGrath6724c902005-10-28 07:07:19 +0000304 ((Dwarf_Die) \
305 { \
306 .cu = (fromcu), \
307 .addr = ((char *) (fromcu)->dbg->sectiondata[IDX_debug_info]->d_buf \
308 + (fromcu)->start + 3 * (fromcu)->offset_size - 4 + 3), \
309 })
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000310
311
312/* Macro information. */
313struct Dwarf_Macro_s
314{
315 unsigned int opcode;
316 Dwarf_Word param1;
317 union
318 {
319 Dwarf_Word u;
320 const char *s;
321 } param2;
322};
323
324
325/* We have to include the file at this point because the inline
326 functions access internals of the Dwarf structure. */
327#include "memory-access.h"
328
329
330/* Set error value. */
331extern void __libdw_seterrno (int value) internal_function;
332
333
334/* Memory handling, the easy parts. This macro does not do any locking. */
Ulrich Drepperdb1d5432006-10-10 15:34:34 +0000335#define libdw_alloc(dbg, type, tsize, cnt) \
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000336 ({ struct libdw_memblock *_tail = (dbg)->mem_tail; \
337 size_t _required = (tsize) * (cnt); \
338 type *_result = (type *) (_tail->mem + (_tail->size - _tail->remaining));\
339 size_t _padding = ((__alignof (type) \
340 - ((uintptr_t) _result & (__alignof (type) - 1))) \
341 & (__alignof (type) - 1)); \
342 if (unlikely (_tail->remaining < _required + _padding)) \
Roland McGrathc373d852006-10-10 00:25:21 +0000343 _result = (type *) __libdw_allocate (dbg, _required, __alignof (type));\
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000344 else \
345 { \
346 _required += _padding; \
347 _result = (type *) ((char *) _result + _padding); \
Roland McGrathc373d852006-10-10 00:25:21 +0000348 _tail->remaining -= _required; \
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000349 } \
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000350 _result; })
351
352#define libdw_typed_alloc(dbg, type) \
353 libdw_alloc (dbg, type, sizeof (type), 1)
354
355/* Callback to allocate more. */
Roland McGrathc373d852006-10-10 00:25:21 +0000356extern void *__libdw_allocate (Dwarf *dbg, size_t minsize, size_t align)
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000357 __attribute__ ((__malloc__)) __nonnull_attribute__ (1);
358
359/* Default OOM handler. */
360extern void __libdw_oom (void) __attribute ((noreturn, visibility ("hidden")));
361
362/* Find CU for given offset. */
363extern struct Dwarf_CU *__libdw_findcu (Dwarf *dbg, Dwarf_Off offset)
364 __nonnull_attribute__ (1) internal_function;
365
366/* Return tag of given DIE. */
367extern Dwarf_Abbrev *__libdw_findabbrev (struct Dwarf_CU *cu,
368 unsigned int code)
369 __nonnull_attribute__ (1) internal_function;
370
371/* Get abbreviation at given offset. */
372extern Dwarf_Abbrev *__libdw_getabbrev (Dwarf *dbg, struct Dwarf_CU *cu,
373 Dwarf_Off offset, size_t *lengthp,
374 Dwarf_Abbrev *result)
375 __nonnull_attribute__ (1) internal_function;
376
377/* Helper functions for form handling. */
378extern size_t __libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu,
379 unsigned int form,
380 const unsigned char *valp)
381 __nonnull_attribute__ (1, 2, 4) internal_function;
382
Roland McGrathe4c22ea2007-10-23 13:07:39 +0000383/* Helper function for DW_FORM_ref* handling. */
384extern int __libdw_formref (Dwarf_Attribute *attr, Dwarf_Off *return_offset)
385 __nonnull_attribute__ (1, 2) internal_function;
386
387
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000388/* Helper function to locate attribute. */
389extern unsigned char *__libdw_find_attr (Dwarf_Die *die,
390 unsigned int search_name,
391 unsigned int *codep,
392 unsigned int *formp)
393 __nonnull_attribute__ (1) internal_function;
394
395/* Helper function to access integer attribute. */
Roland McGrath6724c902005-10-28 07:07:19 +0000396extern int __libdw_attr_intval (Dwarf_Die *die, int *valp, int attval)
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000397 __nonnull_attribute__ (1, 2) internal_function;
398
Roland McGrath1ecb6062005-08-15 09:53:04 +0000399/* Helper function to walk scopes. */
Roland McGrath71e15a02005-08-27 10:33:26 +0000400struct Dwarf_Die_Chain
401{
402 Dwarf_Die die;
403 struct Dwarf_Die_Chain *parent;
404 bool prune; /* The PREVISIT function can set this. */
405};
406extern int __libdw_visit_scopes (unsigned int depth,
407 struct Dwarf_Die_Chain *root,
408 int (*previsit) (unsigned int depth,
409 struct Dwarf_Die_Chain *,
410 void *arg),
411 int (*postvisit) (unsigned int depth,
412 struct Dwarf_Die_Chain *,
413 void *arg),
Roland McGrath1ecb6062005-08-15 09:53:04 +0000414 void *arg)
415 __nonnull_attribute__ (2, 3) internal_function;
416
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000417/* Return error code of last failing function call. This value is kept
418 separately for each thread. */
419extern int __dwarf_errno_internal (void);
420
421
Ulrich Drepper99d23722009-06-14 20:19:45 -0700422/* Reader hooks. */
423
424/* Relocation hooks return -1 on error (in that case the error code
425 must already have been set), 0 if there is no relocation and 1 if a
426 relocation was present.*/
427
428static inline int
429__libdw_relocate_address (Dwarf *dbg __attribute__ ((unused)),
430 int sec_index __attribute__ ((unused)),
431 const void *addr __attribute__ ((unused)),
432 int width __attribute__ ((unused)),
433 Dwarf_Addr *val __attribute__ ((unused)))
434{
435 return 0;
436}
437
438static inline int
439__libdw_relocate_offset (Dwarf *dbg __attribute__ ((unused)),
440 int sec_index __attribute__ ((unused)),
441 const void *addr __attribute__ ((unused)),
442 int width __attribute__ ((unused)),
443 Dwarf_Off *val __attribute__ ((unused)))
444{
445 return 0;
446}
447
448static inline Elf_Data *
449__libdw_checked_get_data (Dwarf *dbg, int sec_index)
450{
451 Elf_Data *data = dbg->sectiondata[sec_index];
452 if (unlikely (data == NULL)
453 || unlikely (data->d_buf == NULL))
454 {
455 __libdw_seterrno (DWARF_E_INVALID_DWARF);
456 return NULL;
457 }
458 return data;
459}
460
461static inline int
462__libdw_offset_in_section (Dwarf *dbg, int sec_index,
463 Dwarf_Off offset, size_t size)
464{
465 Elf_Data *data = __libdw_checked_get_data (dbg, sec_index);
466 if (data == NULL)
467 return -1;
468 if (unlikely (offset > data->d_size)
469 || unlikely (data->d_size - offset < size))
470 {
471 __libdw_seterrno (DWARF_E_INVALID_OFFSET);
472 return -1;
473 }
474
475 return 0;
476}
477
478static inline bool
479__libdw_in_section (Dwarf *dbg, int sec_index,
480 const void *addr, size_t size)
481{
482 Elf_Data *data = __libdw_checked_get_data (dbg, sec_index);
483 if (data == NULL)
484 return false;
485 if (unlikely (addr < data->d_buf)
486 || unlikely (data->d_size - (addr - data->d_buf) < size))
487 {
488 __libdw_seterrno (DWARF_E_INVALID_OFFSET);
489 return false;
490 }
491
492 return true;
493}
494
495#define READ_AND_RELOCATE(RELOC_HOOK, VAL) \
496 ({ \
497 if (!__libdw_in_section (dbg, sec_index, addr, width)) \
498 return -1; \
499 \
500 const unsigned char *orig_addr = addr; \
501 if (width == 4) \
502 VAL = read_4ubyte_unaligned_inc (dbg, addr); \
503 else \
504 VAL = read_8ubyte_unaligned_inc (dbg, addr); \
505 \
506 int status = RELOC_HOOK (dbg, sec_index, orig_addr, width, &VAL); \
507 if (status < 0) \
508 return status; \
509 status > 0; \
510 })
511
512static inline int
513__libdw_read_address_inc (Dwarf *dbg,
Roland McGrath05c4e042009-06-18 13:56:02 -0700514 int sec_index, const unsigned char **addrp,
Ulrich Drepper99d23722009-06-14 20:19:45 -0700515 int width, Dwarf_Addr *ret)
516{
Roland McGrath05c4e042009-06-18 13:56:02 -0700517 const unsigned char *addr = *addrp;
Ulrich Drepper99d23722009-06-14 20:19:45 -0700518 READ_AND_RELOCATE (__libdw_relocate_address, (*ret));
519 *addrp = addr;
520 return 0;
521}
522
523static inline int
524__libdw_read_address (Dwarf *dbg,
525 int sec_index, const unsigned char *addr,
526 int width, Dwarf_Addr *ret)
527{
528 READ_AND_RELOCATE (__libdw_relocate_address, (*ret));
529 return 0;
530}
531
532static inline int
533__libdw_read_offset_inc (Dwarf *dbg,
Roland McGrath05c4e042009-06-18 13:56:02 -0700534 int sec_index, const unsigned char **addrp,
Ulrich Drepper99d23722009-06-14 20:19:45 -0700535 int width, Dwarf_Off *ret, int sec_ret,
536 size_t size)
537{
Roland McGrath05c4e042009-06-18 13:56:02 -0700538 const unsigned char *addr = *addrp;
Ulrich Drepper99d23722009-06-14 20:19:45 -0700539 READ_AND_RELOCATE (__libdw_relocate_offset, (*ret));
540 *addrp = addr;
541 return __libdw_offset_in_section (dbg, sec_ret, *ret, size);
542}
543
544static inline int
545__libdw_read_offset (Dwarf *dbg,
546 int sec_index, const unsigned char *addr,
547 int width, Dwarf_Off *ret, int sec_ret,
548 size_t size)
549{
550 READ_AND_RELOCATE (__libdw_relocate_offset, (*ret));
551 return __libdw_offset_in_section (dbg, sec_ret, *ret, size);
552}
553
554/* Read up begin/end pair and increment read pointer.
555 - If it's normal range record, set up *BEGINP and *ENDP and return 0.
556 - If it's base address selection record, set up *BASEP and return 1.
557 - If it's end of rangelist, don't set anything and return 2
558 - If an error occurs, don't set anything and return <0. */
559int __libdw_read_begin_end_pair_inc (Dwarf *dbg, int sec_index,
560 unsigned char **addr, int width,
561 Dwarf_Addr *beginp, Dwarf_Addr *endp,
562 Dwarf_Addr *basep)
563 internal_function;
564
565unsigned char * __libdw_formptr (Dwarf_Attribute *attr, int sec_index,
566 int err_nodata, unsigned char **endpp,
567 Dwarf_Off *offsetp)
568 internal_function;
569
570
571
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000572/* Aliases to avoid PLTs. */
573INTDECL (dwarf_attr)
574INTDECL (dwarf_attr_integrate)
575INTDECL (dwarf_begin_elf)
576INTDECL (dwarf_child)
577INTDECL (dwarf_dieoffset)
Roland McGrath71e15a02005-08-27 10:33:26 +0000578INTDECL (dwarf_diename)
Roland McGrath4959bf82005-08-09 10:31:08 +0000579INTDECL (dwarf_end)
Roland McGrath07d4f2f2005-10-28 06:56:24 +0000580INTDECL (dwarf_entrypc)
Roland McGrath4959bf82005-08-09 10:31:08 +0000581INTDECL (dwarf_errmsg)
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000582INTDECL (dwarf_formaddr)
583INTDECL (dwarf_formblock)
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000584INTDECL (dwarf_formref_die)
585INTDECL (dwarf_formsdata)
586INTDECL (dwarf_formstring)
587INTDECL (dwarf_formudata)
588INTDECL (dwarf_getarange_addr)
589INTDECL (dwarf_getarangeinfo)
590INTDECL (dwarf_getaranges)
591INTDECL (dwarf_getsrcfiles)
592INTDECL (dwarf_getsrclines)
593INTDECL (dwarf_hasattr)
594INTDECL (dwarf_haschildren)
595INTDECL (dwarf_haspc)
596INTDECL (dwarf_highpc)
597INTDECL (dwarf_lowpc)
598INTDECL (dwarf_nextcu)
599INTDECL (dwarf_offdie)
Roland McGrath07d4f2f2005-10-28 06:56:24 +0000600INTDECL (dwarf_ranges)
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000601INTDECL (dwarf_siblingof)
602INTDECL (dwarf_tag)
603
604#endif /* libdwP.h */