Home | History | Annotate | Download | only in libdw
      1 /* Internal definitions for libdwarf.
      2    Copyright (C) 2002, 2003, 2004 Red Hat, Inc.
      3    Written by Ulrich Drepper <drepper (at) redhat.com>, 2002.
      4 
      5    This program is Open Source software; you can redistribute it and/or
      6    modify it under the terms of the Open Software License version 1.0 as
      7    published by the Open Source Initiative.
      8 
      9    You should have received a copy of the Open Software License along
     10    with this program; if not, you may obtain a copy of the Open Software
     11    License version 1.0 from http://www.opensource.org/licenses/osl.php or
     12    by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
     13    3001 King Ranch Road, Ukiah, CA 95482.   */
     14 
     15 #ifndef _LIBDWP_H
     16 #define _LIBDWP_H 1
     17 
     18 #include <libintl.h>
     19 #include <stdbool.h>
     20 
     21 #include <libdw.h>
     22 
     23 
     24 /* gettext helper macros.  */
     25 #define _(Str) dgettext ("elfutils", Str)
     26 
     27 
     28 /* Version of the DWARF specification we support.  */
     29 #define DWARF_VERSION 2
     30 
     31 /* Version of the CIE format.  */
     32 #define CIE_VERSION 1
     33 
     34 
     35 /* Known location lists.  */
     36 struct loc_s
     37 {
     38   void *addr;
     39   Dwarf_Loc *loc;
     40   size_t nloc;
     41 };
     42 
     43 /* Valid indeces for the section data.  */
     44 enum
     45   {
     46     IDX_debug_info = 0,
     47     IDX_debug_abbrev,
     48     IDX_debug_aranges,
     49     IDX_debug_line,
     50     IDX_debug_frame,
     51     IDX_eh_frame,
     52     IDX_debug_loc,
     53     IDX_debug_pubnames,
     54     IDX_debug_str,
     55     IDX_debug_funcnames,
     56     IDX_debug_typenames,
     57     IDX_debug_varnames,
     58     IDX_debug_weaknames,
     59     IDX_debug_macinfo,
     60     IDX_last
     61   };
     62 
     63 
     64 /* Error values.  */
     65 enum
     66 {
     67   DWARF_E_NOERROR = 0,
     68   DWARF_E_UNKNOWN_ERROR,
     69   DWARF_E_INVALID_ACCESS,
     70   DWARF_E_NO_REGFILE,
     71   DWARF_E_IO_ERROR,
     72   DWARF_E_INVALID_ELF,
     73   DWARF_E_NO_DWARF,
     74   DWARF_E_NOELF,
     75   DWARF_E_GETEHDR_ERROR,
     76   DWARF_E_NOMEM,
     77   DWARF_E_UNIMPL,
     78   DWARF_E_INVALID_CMD,
     79   DWARF_E_INVALID_VERSION,
     80   DWARF_E_INVALID_FILE,
     81   DWARF_E_NO_ENTRY,
     82   DWARF_E_INVALID_DWARF,
     83   DWARF_E_NO_STRING,
     84   DWARF_E_NO_ADDR,
     85   DWARF_E_NO_CONSTANT,
     86   DWARF_E_NO_REFERENCE,
     87   DWARF_E_INVALID_REFERENCE,
     88   DWARF_E_NO_DEBUG_LINE,
     89   DWARF_E_INVALID_DEBUG_LINE,
     90   DWARF_E_TOO_BIG,
     91   DWARF_E_VERSION,
     92   DWARF_E_INVALID_DIR_IDX,
     93   DWARF_E_ADDR_OUTOFRANGE,
     94   DWARF_E_NO_LOCLIST,
     95   DWARF_E_NO_BLOCK,
     96   DWARF_E_INVALID_LINE_IDX,
     97   DWARF_E_INVALID_ARANGE_IDX,
     98   DWARF_E_NO_MATCH,
     99   DWARF_E_NO_FLAG,
    100 };
    101 
    102 
    103 /* This is the structure representing the debugging state.  */
    104 struct Dwarf
    105 {
    106   /* The underlying ELF file.  */
    107   Elf *elf;
    108 
    109   /* The section data.  */
    110   Elf_Data *sectiondata[IDX_last];
    111 
    112   /* True if the file has a byte order different from the host.  */
    113   bool other_byte_order;
    114 
    115   /* If true, we allocated the ELF descriptor ourselves.  */
    116   bool free_elf;
    117 
    118   /* Information for traversing the .debug_pubnames section.  This is
    119      an array and separately allocated with malloc.  */
    120   struct pubnames_s
    121   {
    122     Dwarf_Off cu_offset;
    123     Dwarf_Off set_start;
    124     unsigned int cu_header_size;
    125     int address_len;
    126   } *pubnames_sets;
    127   size_t pubnames_nsets;
    128 
    129   /* Search tree for the CUs.  */
    130   void *cu_tree;
    131   Dwarf_Off next_cu_offset;
    132 
    133   /* Address ranges.  */
    134   Dwarf_Aranges *aranges;
    135 
    136   /* Internal memory handling.  This is basically a simplified
    137      reimplementation of obstacks.  Unfortunately the standard obstack
    138      implementation is not usable in libraries.  */
    139   struct libdw_memblock
    140   {
    141     size_t size;
    142     size_t remaining;
    143     struct libdw_memblock *prev;
    144     char mem[0];
    145   } *mem_tail;
    146 
    147   /* Default size of allocated memory blocks.  */
    148   size_t mem_default_size;
    149 
    150   /* Registered OOM handler.  */
    151   Dwarf_OOM oom_handler;
    152 };
    153 
    154 
    155 /* Abbreviation representation.  */
    156 struct Dwarf_Abbrev
    157 {
    158   unsigned int code;
    159   unsigned int tag;
    160   int has_children;
    161   unsigned int attrcnt;
    162   unsigned char *attrp;
    163   Dwarf_Off offset;
    164 };
    165 
    166 #include "dwarf_abbrev_hash.h"
    167 
    168 
    169 /* Files in line information records.  */
    170 struct Dwarf_Files_s
    171   {
    172     Dwarf *dbg;
    173     unsigned int nfiles;
    174     struct Dwarf_Fileinfo_s
    175     {
    176       char *name;
    177       Dwarf_Word mtime;
    178       Dwarf_Word length;
    179     } info[0];
    180   };
    181 typedef struct Dwarf_Fileinfo_s Dwarf_Fileinfo;
    182 
    183 
    184 /* Representation of a row in the line table.  */
    185 struct Dwarf_Lines_s
    186   {
    187     size_t nlines;
    188 
    189     struct Dwarf_Line_s
    190     {
    191       Dwarf_Addr addr;
    192       unsigned int file;
    193       int line;
    194       unsigned short int column;
    195       unsigned int is_stmt:1;
    196       unsigned int basic_block:1;
    197       unsigned int end_sequence:1;
    198       unsigned int prologue_end:1;
    199       unsigned int epilogue_begin:1;
    200 
    201       Dwarf_Files *files;
    202     } info[0];
    203   };
    204 
    205 
    206 /* Representation of address ranges.  */
    207 struct Dwarf_Aranges_s
    208 {
    209   Dwarf *dbg;
    210   size_t naranges;
    211 
    212   struct Dwarf_Arange_s
    213   {
    214     Dwarf_Addr addr;
    215     Dwarf_Word length;
    216     Dwarf_Off offset;
    217   } info[0];
    218 };
    219 
    220 
    221 /* CU representation.  */
    222 struct Dwarf_CU
    223 {
    224   Dwarf *dbg;
    225   Dwarf_Off start;
    226   Dwarf_Off end;
    227   uint8_t address_size;
    228   uint8_t offset_size;
    229 
    230   /* Hash table for the abbreviations.  */
    231   Dwarf_Abbrev_Hash abbrev_hash;
    232   /* Offset of the first abbreviation.  */
    233   size_t orig_abbrev_offset;
    234   /* Offset past last read abbreviation.  */
    235   size_t last_abbrev_offset;
    236 
    237   /* The srcline information.  */
    238   Dwarf_Lines *lines;
    239 
    240   /* The source file information.  */
    241   Dwarf_Files *files;
    242 
    243   /* Known location lists.  */
    244   void *locs;
    245 };
    246 
    247 
    248 /* We have to include the file at this point because the inline
    249    functions access internals of the Dwarf structure.  */
    250 #include "memory-access.h"
    251 
    252 
    253 /* Set error value.  */
    254 extern void __libdw_seterrno (int value) internal_function;
    255 
    256 
    257 /* Memory handling, the easy parts.  This macro does not do any locking.  */
    258 #define libdw_alloc(dbg, type, tsize, cnt) \
    259   ({ struct libdw_memblock *_tail = (dbg)->mem_tail;			      \
    260      size_t _required = (tsize) * (cnt);				      \
    261      type *_result = (type *) (_tail->mem + (_tail->size - _tail->remaining));\
    262      size_t _padding = ((__alignof (type)				      \
    263 			 - ((uintptr_t) _result & (__alignof (type) - 1)))    \
    264 			& (__alignof (type) - 1));			      \
    265      if (unlikely (_tail->remaining < _required + _padding))		      \
    266        {								      \
    267 	 _result = (type *) __libdw_allocate (dbg, _required);		      \
    268 	 _tail = (dbg)->mem_tail;					      \
    269        }								      \
    270      else								      \
    271        {								      \
    272 	 _required += _padding;						      \
    273 	 _result = (type *) ((char *) _result + _padding);		      \
    274        }								      \
    275      _tail->remaining -= _required;					      \
    276      _result; })
    277 
    278 #define libdw_typed_alloc(dbg, type) \
    279   libdw_alloc (dbg, type, sizeof (type), 1)
    280 
    281 /* Callback to allocate more.  */
    282 extern void *__libdw_allocate (Dwarf *dbg, size_t minsize)
    283      __attribute__ ((__malloc__)) __nonnull_attribute__ (1);
    284 
    285 /* Default OOM handler.  */
    286 extern void __libdw_oom (void) __attribute ((noreturn, visibility ("hidden")));
    287 
    288 /* Find CU for given offset.  */
    289 extern struct Dwarf_CU *__libdw_findcu (Dwarf *dbg, Dwarf_Off offset)
    290      __nonnull_attribute__ (1) internal_function;
    291 
    292 /* Return tag of given DIE.  */
    293 extern Dwarf_Abbrev *__libdw_findabbrev (struct Dwarf_CU *cu,
    294 					 unsigned int code)
    295      __nonnull_attribute__ (1) internal_function;
    296 
    297 /* Get abbreviation at given offset.  */
    298 extern Dwarf_Abbrev *__libdw_getabbrev (Dwarf *dbg, struct Dwarf_CU *cu,
    299 					Dwarf_Off offset, size_t *lengthp,
    300 					Dwarf_Abbrev *result)
    301      __nonnull_attribute__ (1) internal_function;
    302 
    303 /* Helper functions for form handling.  */
    304 extern size_t __libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu,
    305 				    unsigned int form, unsigned char *valp)
    306      __nonnull_attribute__ (1, 2, 4) internal_function;
    307 
    308 /* Helper function to locate attribute.  */
    309 extern unsigned char *__libdw_find_attr (Dwarf_Die *die,
    310 					 unsigned int search_name,
    311 					 unsigned int *codep,
    312 					 unsigned int *formp)
    313      __nonnull_attribute__ (1) internal_function;
    314 
    315 #endif	/* libdwP.h */
    316