libdwP.h revision c0d2a0b3a38bfb5164c1cf822d50e46cfad9c071
1/* Internal definitions for libdwarf. 2 Copyright (C) 2002-2011, 2013 Red Hat, Inc. 3 This file is part of elfutils. 4 Written by Ulrich Drepper <drepper@redhat.com>, 2002. 5 6 This file is free software; you can redistribute it and/or modify 7 it under the terms of either 8 9 * the GNU Lesser General Public License as published by the Free 10 Software Foundation; either version 3 of the License, or (at 11 your option) any later version 12 13 or 14 15 * the GNU General Public License as published by the Free 16 Software Foundation; either version 2 of the License, or (at 17 your option) any later version 18 19 or both in parallel, as here. 20 21 elfutils is distributed in the hope that it will be useful, but 22 WITHOUT ANY WARRANTY; without even the implied warranty of 23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 24 General Public License for more details. 25 26 You should have received copies of the GNU General Public License and 27 the GNU Lesser General Public License along with this program. If 28 not, see <http://www.gnu.org/licenses/>. */ 29 30#ifndef _LIBDWP_H 31#define _LIBDWP_H 1 32 33#include <libintl.h> 34#include <stdbool.h> 35 36#include <libdw.h> 37#include <dwarf.h> 38 39 40/* gettext helper macros. */ 41#define _(Str) dgettext ("elfutils", Str) 42 43 44/* Known location expressions already decoded. */ 45struct loc_s 46{ 47 void *addr; 48 Dwarf_Op *loc; 49 size_t nloc; 50}; 51 52/* Known DW_OP_implicit_value blocks already decoded. 53 This overlaps struct loc_s exactly, but only the 54 first member really has to match. */ 55struct loc_block_s 56{ 57 void *addr; 58 unsigned char *data; 59 size_t length; 60}; 61 62/* Valid indeces for the section data. */ 63enum 64 { 65 IDX_debug_info = 0, 66 IDX_debug_types, 67 IDX_debug_abbrev, 68 IDX_debug_aranges, 69 IDX_debug_line, 70 IDX_debug_frame, 71 IDX_debug_loc, 72 IDX_debug_pubnames, 73 IDX_debug_str, 74 IDX_debug_macinfo, 75 IDX_debug_macro, 76 IDX_debug_ranges, 77 IDX_last 78 }; 79 80 81/* Error values. */ 82enum 83{ 84 DWARF_E_NOERROR = 0, 85 DWARF_E_UNKNOWN_ERROR, 86 DWARF_E_INVALID_ACCESS, 87 DWARF_E_NO_REGFILE, 88 DWARF_E_IO_ERROR, 89 DWARF_E_INVALID_ELF, 90 DWARF_E_NO_DWARF, 91 DWARF_E_NOELF, 92 DWARF_E_GETEHDR_ERROR, 93 DWARF_E_NOMEM, 94 DWARF_E_UNIMPL, 95 DWARF_E_INVALID_CMD, 96 DWARF_E_INVALID_VERSION, 97 DWARF_E_INVALID_FILE, 98 DWARF_E_NO_ENTRY, 99 DWARF_E_INVALID_DWARF, 100 DWARF_E_NO_STRING, 101 DWARF_E_NO_ADDR, 102 DWARF_E_NO_CONSTANT, 103 DWARF_E_NO_REFERENCE, 104 DWARF_E_INVALID_REFERENCE, 105 DWARF_E_NO_DEBUG_LINE, 106 DWARF_E_INVALID_DEBUG_LINE, 107 DWARF_E_TOO_BIG, 108 DWARF_E_VERSION, 109 DWARF_E_INVALID_DIR_IDX, 110 DWARF_E_ADDR_OUTOFRANGE, 111 DWARF_E_NO_LOCLIST, 112 DWARF_E_NO_BLOCK, 113 DWARF_E_INVALID_LINE_IDX, 114 DWARF_E_INVALID_ARANGE_IDX, 115 DWARF_E_NO_MATCH, 116 DWARF_E_NO_FLAG, 117 DWARF_E_INVALID_OFFSET, 118 DWARF_E_NO_DEBUG_RANGES, 119 DWARF_E_INVALID_CFI, 120 DWARF_E_NO_ALT_DEBUGLINK 121}; 122 123 124#include "dwarf_sig8_hash.h" 125 126/* This is the structure representing the debugging state. */ 127struct Dwarf 128{ 129 /* The underlying ELF file. */ 130 Elf *elf; 131 132 /* dwz alternate DWARF file. */ 133 Dwarf *alt_dwarf; 134 135 /* The section data. */ 136 Elf_Data *sectiondata[IDX_last]; 137 138#if USE_ZLIB 139 /* The 1 << N bit is set if sectiondata[N] is malloc'd decompressed data. */ 140 unsigned int sectiondata_gzip_mask:IDX_last; 141#endif 142 143 /* True if the file has a byte order different from the host. */ 144 bool other_byte_order; 145 146 /* If true, we allocated the ELF descriptor ourselves. */ 147 bool free_elf; 148 149 /* If true, we allocated the Dwarf descriptor for alt_dwarf ourselves. */ 150 bool free_alt; 151 152 /* Information for traversing the .debug_pubnames section. This is 153 an array and separately allocated with malloc. */ 154 struct pubnames_s 155 { 156 Dwarf_Off cu_offset; 157 Dwarf_Off set_start; 158 unsigned int cu_header_size; 159 int address_len; 160 } *pubnames_sets; 161 size_t pubnames_nsets; 162 163 /* Search tree for the CUs. */ 164 void *cu_tree; 165 Dwarf_Off next_cu_offset; 166 167 /* Search tree and sig8 hash table for .debug_types type units. */ 168 void *tu_tree; 169 Dwarf_Off next_tu_offset; 170 Dwarf_Sig8_Hash sig8_hash; 171 172 /* Address ranges. */ 173 Dwarf_Aranges *aranges; 174 175 /* Cached info from the CFI section. */ 176 struct Dwarf_CFI_s *cfi; 177 178 /* Internal memory handling. This is basically a simplified 179 reimplementation of obstacks. Unfortunately the standard obstack 180 implementation is not usable in libraries. */ 181 struct libdw_memblock 182 { 183 size_t size; 184 size_t remaining; 185 struct libdw_memblock *prev; 186 char mem[0]; 187 } *mem_tail; 188 189 /* Default size of allocated memory blocks. */ 190 size_t mem_default_size; 191 192 /* Registered OOM handler. */ 193 Dwarf_OOM oom_handler; 194}; 195 196 197/* Abbreviation representation. */ 198struct Dwarf_Abbrev 199{ 200 Dwarf_Off offset; 201 unsigned char *attrp; 202 unsigned int attrcnt; 203 unsigned int code; 204 unsigned int tag; 205 bool has_children; 206}; 207 208#include "dwarf_abbrev_hash.h" 209 210 211/* Files in line information records. */ 212struct Dwarf_Files_s 213 { 214 struct Dwarf_CU *cu; 215 unsigned int ndirs; 216 unsigned int nfiles; 217 struct Dwarf_Fileinfo_s 218 { 219 char *name; 220 Dwarf_Word mtime; 221 Dwarf_Word length; 222 } info[0]; 223 /* nfiles of those, followed by char *[ndirs]. */ 224 }; 225typedef struct Dwarf_Fileinfo_s Dwarf_Fileinfo; 226 227 228/* Representation of a row in the line table. */ 229 230struct Dwarf_Line_s 231{ 232 Dwarf_Files *files; 233 234 Dwarf_Addr addr; 235 unsigned int file; 236 int line; 237 unsigned short int column; 238 unsigned int is_stmt:1; 239 unsigned int basic_block:1; 240 unsigned int end_sequence:1; 241 unsigned int prologue_end:1; 242 unsigned int epilogue_begin:1; 243 /* The remaining bit fields are not flags, but hold values presumed to be 244 small. All the flags and other bit fields should add up to 48 bits 245 to give the whole struct a nice round size. */ 246 unsigned int op_index:8; 247 unsigned int isa:8; 248 unsigned int discriminator:24; 249}; 250 251struct Dwarf_Lines_s 252{ 253 size_t nlines; 254 struct Dwarf_Line_s info[0]; 255}; 256 257/* Representation of address ranges. */ 258struct Dwarf_Aranges_s 259{ 260 Dwarf *dbg; 261 size_t naranges; 262 263 struct Dwarf_Arange_s 264 { 265 Dwarf_Addr addr; 266 Dwarf_Word length; 267 Dwarf_Off offset; 268 } info[0]; 269}; 270 271 272/* CU representation. */ 273struct Dwarf_CU 274{ 275 Dwarf *dbg; 276 Dwarf_Off start; 277 Dwarf_Off end; 278 uint8_t address_size; 279 uint8_t offset_size; 280 uint16_t version; 281 282 /* Zero if this is a normal CU. Nonzero if it is a type unit. */ 283 size_t type_offset; 284 uint64_t type_sig8; 285 286 /* Hash table for the abbreviations. */ 287 Dwarf_Abbrev_Hash abbrev_hash; 288 /* Offset of the first abbreviation. */ 289 size_t orig_abbrev_offset; 290 /* Offset past last read abbreviation. */ 291 size_t last_abbrev_offset; 292 293 /* The srcline information. */ 294 Dwarf_Lines *lines; 295 296 /* The source file information. */ 297 Dwarf_Files *files; 298 299 /* Known location lists. */ 300 void *locs; 301}; 302 303/* Compute the offset of a CU's first DIE from its offset. This 304 is either: 305 LEN VER OFFSET ADDR 306 4-bytes + 2-bytes + 4-bytes + 1-byte for 32-bit dwarf 307 12-bytes + 2-bytes + 8-bytes + 1-byte for 64-bit dwarf 308 or in .debug_types, SIGNATURE TYPE-OFFSET 309 4-bytes + 2-bytes + 4-bytes + 1-byte + 8-bytes + 4-bytes for 32-bit 310 12-bytes + 2-bytes + 8-bytes + 1-byte + 8-bytes + 8-bytes for 64-bit 311 312 Note the trick in the computation. If the offset_size is 4 313 the '- 4' term changes the '3 *' into a '2 *'. If the 314 offset_size is 8 it accounts for the 4-byte escape value 315 used at the start of the length. */ 316#define DIE_OFFSET_FROM_CU_OFFSET(cu_offset, offset_size, type_unit) \ 317 ((type_unit) ? ((cu_offset) + 4 * (offset_size) - 4 + 3 + 8) \ 318 : ((cu_offset) + 3 * (offset_size) - 4 + 3)) 319 320#define CUDIE(fromcu) \ 321 ((Dwarf_Die) \ 322 { \ 323 .cu = (fromcu), \ 324 .addr = ((char *) cu_data (fromcu)->d_buf \ 325 + DIE_OFFSET_FROM_CU_OFFSET ((fromcu)->start, \ 326 (fromcu)->offset_size, \ 327 (fromcu)->type_offset != 0)) \ 328 }) \ 329 330 331/* Macro information. */ 332struct Dwarf_Macro_s 333{ 334 unsigned int opcode; 335 Dwarf_Word param1; 336 union 337 { 338 Dwarf_Word u; 339 const char *s; 340 } param2; 341}; 342 343 344/* We have to include the file at this point because the inline 345 functions access internals of the Dwarf structure. */ 346#include "memory-access.h" 347 348 349/* Set error value. */ 350extern void __libdw_seterrno (int value) internal_function; 351 352 353/* Memory handling, the easy parts. This macro does not do any locking. */ 354#define libdw_alloc(dbg, type, tsize, cnt) \ 355 ({ struct libdw_memblock *_tail = (dbg)->mem_tail; \ 356 size_t _required = (tsize) * (cnt); \ 357 type *_result = (type *) (_tail->mem + (_tail->size - _tail->remaining));\ 358 size_t _padding = ((__alignof (type) \ 359 - ((uintptr_t) _result & (__alignof (type) - 1))) \ 360 & (__alignof (type) - 1)); \ 361 if (unlikely (_tail->remaining < _required + _padding)) \ 362 _result = (type *) __libdw_allocate (dbg, _required, __alignof (type));\ 363 else \ 364 { \ 365 _required += _padding; \ 366 _result = (type *) ((char *) _result + _padding); \ 367 _tail->remaining -= _required; \ 368 } \ 369 _result; }) 370 371#define libdw_typed_alloc(dbg, type) \ 372 libdw_alloc (dbg, type, sizeof (type), 1) 373 374/* Callback to allocate more. */ 375extern void *__libdw_allocate (Dwarf *dbg, size_t minsize, size_t align) 376 __attribute__ ((__malloc__)) __nonnull_attribute__ (1); 377 378/* Default OOM handler. */ 379extern void __libdw_oom (void) __attribute ((noreturn, visibility ("hidden"))); 380 381#if USE_ZLIB 382extern void __libdw_free_zdata (Dwarf *dwarf) internal_function; 383#else 384# define __libdw_free_zdata(dwarf) ((void) (dwarf)) 385#endif 386 387/* Allocate the internal data for a unit not seen before. */ 388extern struct Dwarf_CU *__libdw_intern_next_unit (Dwarf *dbg, bool debug_types) 389 __nonnull_attribute__ (1) internal_function; 390 391/* Find CU for given offset. */ 392extern struct Dwarf_CU *__libdw_findcu (Dwarf *dbg, Dwarf_Off offset, bool tu) 393 __nonnull_attribute__ (1) internal_function; 394 395/* Return tag of given DIE. */ 396extern Dwarf_Abbrev *__libdw_findabbrev (struct Dwarf_CU *cu, 397 unsigned int code) 398 __nonnull_attribute__ (1) internal_function; 399 400/* Get abbreviation at given offset. */ 401extern Dwarf_Abbrev *__libdw_getabbrev (Dwarf *dbg, struct Dwarf_CU *cu, 402 Dwarf_Off offset, size_t *lengthp, 403 Dwarf_Abbrev *result) 404 __nonnull_attribute__ (1) internal_function; 405 406/* Helper functions for form handling. */ 407extern size_t __libdw_form_val_compute_len (Dwarf *dbg, struct Dwarf_CU *cu, 408 unsigned int form, 409 const unsigned char *valp) 410 __nonnull_attribute__ (1, 2, 4) internal_function; 411 412/* Find the length of a form attribute. */ 413static inline size_t 414__nonnull_attribute__ (1, 2, 4) 415__libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu, 416 unsigned int form, const unsigned char *valp) 417{ 418 /* Small lookup table of forms with fixed lengths. Absent indexes are 419 initialized 0, so any truly desired 0 is set to 0x80 and masked. */ 420 static const uint8_t form_lengths[] = 421 { 422 [DW_FORM_flag_present] = 0x80, 423 [DW_FORM_data1] = 1, [DW_FORM_ref1] = 1, [DW_FORM_flag] = 1, 424 [DW_FORM_data2] = 2, [DW_FORM_ref2] = 2, 425 [DW_FORM_data4] = 4, [DW_FORM_ref4] = 4, 426 [DW_FORM_data8] = 8, [DW_FORM_ref8] = 8, [DW_FORM_ref_sig8] = 8, 427 }; 428 429 /* Return immediately for forms with fixed lengths. */ 430 if (form < sizeof form_lengths / sizeof form_lengths[0]) 431 { 432 uint8_t len = form_lengths[form]; 433 if (len != 0) 434 return len & 0x7f; /* Mask to allow 0x80 -> 0. */ 435 } 436 437 /* Other forms require some computation. */ 438 return __libdw_form_val_compute_len (dbg, cu, form, valp); 439} 440 441/* Helper function for DW_FORM_ref* handling. */ 442extern int __libdw_formref (Dwarf_Attribute *attr, Dwarf_Off *return_offset) 443 __nonnull_attribute__ (1, 2) internal_function; 444 445 446/* Helper function to locate attribute. */ 447extern unsigned char *__libdw_find_attr (Dwarf_Die *die, 448 unsigned int search_name, 449 unsigned int *codep, 450 unsigned int *formp) 451 __nonnull_attribute__ (1) internal_function; 452 453/* Helper function to access integer attribute. */ 454extern int __libdw_attr_intval (Dwarf_Die *die, int *valp, int attval) 455 __nonnull_attribute__ (1, 2) internal_function; 456 457/* Helper function to walk scopes. */ 458struct Dwarf_Die_Chain 459{ 460 Dwarf_Die die; 461 struct Dwarf_Die_Chain *parent; 462 bool prune; /* The PREVISIT function can set this. */ 463}; 464extern int __libdw_visit_scopes (unsigned int depth, 465 struct Dwarf_Die_Chain *root, 466 int (*previsit) (unsigned int depth, 467 struct Dwarf_Die_Chain *, 468 void *arg), 469 int (*postvisit) (unsigned int depth, 470 struct Dwarf_Die_Chain *, 471 void *arg), 472 void *arg) 473 __nonnull_attribute__ (2, 3) internal_function; 474 475/* Parse a DWARF Dwarf_Block into an array of Dwarf_Op's, 476 and cache the result (via tsearch). */ 477extern int __libdw_intern_expression (Dwarf *dbg, 478 bool other_byte_order, 479 unsigned int address_size, 480 unsigned int ref_size, 481 void **cache, const Dwarf_Block *block, 482 bool cfap, bool valuep, 483 Dwarf_Op **llbuf, size_t *listlen, 484 int sec_index) 485 __nonnull_attribute__ (5, 6, 9, 10) internal_function; 486 487extern Dwarf_Die *__libdw_offdie (Dwarf *dbg, Dwarf_Off offset, 488 Dwarf_Die *result, bool debug_types) 489 internal_function; 490 491 492/* Return error code of last failing function call. This value is kept 493 separately for each thread. */ 494extern int __dwarf_errno_internal (void); 495 496 497/* Reader hooks. */ 498 499/* Relocation hooks return -1 on error (in that case the error code 500 must already have been set), 0 if there is no relocation and 1 if a 501 relocation was present.*/ 502 503static inline int 504__libdw_relocate_address (Dwarf *dbg __attribute__ ((unused)), 505 int sec_index __attribute__ ((unused)), 506 const void *addr __attribute__ ((unused)), 507 int width __attribute__ ((unused)), 508 Dwarf_Addr *val __attribute__ ((unused))) 509{ 510 return 0; 511} 512 513static inline int 514__libdw_relocate_offset (Dwarf *dbg __attribute__ ((unused)), 515 int sec_index __attribute__ ((unused)), 516 const void *addr __attribute__ ((unused)), 517 int width __attribute__ ((unused)), 518 Dwarf_Off *val __attribute__ ((unused))) 519{ 520 return 0; 521} 522 523static inline Elf_Data * 524__libdw_checked_get_data (Dwarf *dbg, int sec_index) 525{ 526 Elf_Data *data = dbg->sectiondata[sec_index]; 527 if (unlikely (data == NULL) 528 || unlikely (data->d_buf == NULL)) 529 { 530 __libdw_seterrno (DWARF_E_INVALID_DWARF); 531 return NULL; 532 } 533 return data; 534} 535 536static inline int 537__libdw_offset_in_section (Dwarf *dbg, int sec_index, 538 Dwarf_Off offset, size_t size) 539{ 540 Elf_Data *data = __libdw_checked_get_data (dbg, sec_index); 541 if (data == NULL) 542 return -1; 543 if (unlikely (offset > data->d_size) 544 || unlikely (data->d_size - offset < size)) 545 { 546 __libdw_seterrno (DWARF_E_INVALID_OFFSET); 547 return -1; 548 } 549 550 return 0; 551} 552 553static inline bool 554__libdw_in_section (Dwarf *dbg, int sec_index, 555 const void *addr, size_t size) 556{ 557 Elf_Data *data = __libdw_checked_get_data (dbg, sec_index); 558 if (data == NULL) 559 return false; 560 if (unlikely (addr < data->d_buf) 561 || unlikely (data->d_size - (addr - data->d_buf) < size)) 562 { 563 __libdw_seterrno (DWARF_E_INVALID_OFFSET); 564 return false; 565 } 566 567 return true; 568} 569 570#define READ_AND_RELOCATE(RELOC_HOOK, VAL) \ 571 ({ \ 572 if (!__libdw_in_section (dbg, sec_index, addr, width)) \ 573 return -1; \ 574 \ 575 const unsigned char *orig_addr = addr; \ 576 if (width == 4) \ 577 VAL = read_4ubyte_unaligned_inc (dbg, addr); \ 578 else \ 579 VAL = read_8ubyte_unaligned_inc (dbg, addr); \ 580 \ 581 int status = RELOC_HOOK (dbg, sec_index, orig_addr, width, &VAL); \ 582 if (status < 0) \ 583 return status; \ 584 status > 0; \ 585 }) 586 587static inline int 588__libdw_read_address_inc (Dwarf *dbg, 589 int sec_index, const unsigned char **addrp, 590 int width, Dwarf_Addr *ret) 591{ 592 const unsigned char *addr = *addrp; 593 READ_AND_RELOCATE (__libdw_relocate_address, (*ret)); 594 *addrp = addr; 595 return 0; 596} 597 598static inline int 599__libdw_read_address (Dwarf *dbg, 600 int sec_index, const unsigned char *addr, 601 int width, Dwarf_Addr *ret) 602{ 603 READ_AND_RELOCATE (__libdw_relocate_address, (*ret)); 604 return 0; 605} 606 607static inline int 608__libdw_read_offset_inc (Dwarf *dbg, 609 int sec_index, const unsigned char **addrp, 610 int width, Dwarf_Off *ret, int sec_ret, 611 size_t size) 612{ 613 const unsigned char *addr = *addrp; 614 READ_AND_RELOCATE (__libdw_relocate_offset, (*ret)); 615 *addrp = addr; 616 return __libdw_offset_in_section (dbg, sec_ret, *ret, size); 617} 618 619static inline int 620__libdw_read_offset (Dwarf *dbg, Dwarf *dbg_ret, 621 int sec_index, const unsigned char *addr, 622 int width, Dwarf_Off *ret, int sec_ret, 623 size_t size) 624{ 625 READ_AND_RELOCATE (__libdw_relocate_offset, (*ret)); 626 return __libdw_offset_in_section (dbg_ret, sec_ret, *ret, size); 627} 628 629static inline size_t 630cu_sec_idx (struct Dwarf_CU *cu) 631{ 632 return cu->type_offset == 0 ? IDX_debug_info : IDX_debug_types; 633} 634 635static inline Elf_Data * 636cu_data (struct Dwarf_CU *cu) 637{ 638 return cu->dbg->sectiondata[cu_sec_idx (cu)]; 639} 640 641/* Read up begin/end pair and increment read pointer. 642 - If it's normal range record, set up *BEGINP and *ENDP and return 0. 643 - If it's base address selection record, set up *BASEP and return 1. 644 - If it's end of rangelist, don't set anything and return 2 645 - If an error occurs, don't set anything and return <0. */ 646int __libdw_read_begin_end_pair_inc (Dwarf *dbg, int sec_index, 647 unsigned char **addr, int width, 648 Dwarf_Addr *beginp, Dwarf_Addr *endp, 649 Dwarf_Addr *basep) 650 internal_function; 651 652unsigned char * __libdw_formptr (Dwarf_Attribute *attr, int sec_index, 653 int err_nodata, unsigned char **endpp, 654 Dwarf_Off *offsetp) 655 internal_function; 656 657#ifdef ENABLE_DWZ 658/* Checks that the build_id of the underlying Elf matches the expected. 659 Returns zero on match, -1 on error or no build_id found or 1 when 660 build_id doesn't match. */ 661int __check_build_id (Dwarf *dw, const uint8_t *build_id, const size_t id_len) 662 internal_function; 663#endif /* ENABLE_DWZ */ 664 665/* Fills in the given attribute to point at an empty location expression. */ 666void __libdw_empty_loc_attr (Dwarf_Attribute *attr, struct Dwarf_CU *cu) 667 internal_function; 668 669 670/* Aliases to avoid PLTs. */ 671INTDECL (dwarf_aggregate_size) 672INTDECL (dwarf_attr) 673INTDECL (dwarf_attr_integrate) 674INTDECL (dwarf_begin) 675INTDECL (dwarf_begin_elf) 676INTDECL (dwarf_child) 677INTDECL (dwarf_dieoffset) 678INTDECL (dwarf_diename) 679INTDECL (dwarf_end) 680INTDECL (dwarf_entrypc) 681INTDECL (dwarf_errmsg) 682INTDECL (dwarf_formaddr) 683INTDECL (dwarf_formblock) 684INTDECL (dwarf_formref_die) 685INTDECL (dwarf_formsdata) 686INTDECL (dwarf_formstring) 687INTDECL (dwarf_formudata) 688INTDECL (dwarf_getarange_addr) 689INTDECL (dwarf_getarangeinfo) 690INTDECL (dwarf_getaranges) 691INTDECL (dwarf_getlocation_die) 692INTDECL (dwarf_getsrcfiles) 693INTDECL (dwarf_getsrclines) 694INTDECL (dwarf_hasattr) 695INTDECL (dwarf_haschildren) 696INTDECL (dwarf_haspc) 697INTDECL (dwarf_highpc) 698INTDECL (dwarf_lowpc) 699INTDECL (dwarf_nextcu) 700INTDECL (dwarf_next_unit) 701INTDECL (dwarf_offdie) 702INTDECL (dwarf_ranges) 703INTDECL (dwarf_siblingof) 704INTDECL (dwarf_srclang) 705INTDECL (dwarf_tag) 706 707#endif /* libdwP.h */ 708