1 /* Internal definitions for libdwarf. 2 Copyright (C) 2002, 2003, 2004 Red Hat, Inc. 3 Written by Ulrich Drepper <drepper@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