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