1*f3e7f55eSRobert Mustacchi #ifndef DWARF_UTIL_H 2*f3e7f55eSRobert Mustacchi #define DWARF_UTIL_H 3*f3e7f55eSRobert Mustacchi /* 4*f3e7f55eSRobert Mustacchi 5*f3e7f55eSRobert Mustacchi Copyright (C) 2000,2003,2004 Silicon Graphics, Inc. All Rights Reserved. 6*f3e7f55eSRobert Mustacchi Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. 7*f3e7f55eSRobert Mustacchi 8*f3e7f55eSRobert Mustacchi This program is free software; you can redistribute it and/or modify it 9*f3e7f55eSRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License 10*f3e7f55eSRobert Mustacchi as published by the Free Software Foundation. 11*f3e7f55eSRobert Mustacchi 12*f3e7f55eSRobert Mustacchi This program is distributed in the hope that it would be useful, but 13*f3e7f55eSRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of 14*f3e7f55eSRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 15*f3e7f55eSRobert Mustacchi 16*f3e7f55eSRobert Mustacchi Further, this software is distributed without any warranty that it is 17*f3e7f55eSRobert Mustacchi free of the rightful claim of any third person regarding infringement 18*f3e7f55eSRobert Mustacchi or the like. Any license provided herein, whether implied or 19*f3e7f55eSRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if 20*f3e7f55eSRobert Mustacchi any, provided herein do not apply to combinations of this program with 21*f3e7f55eSRobert Mustacchi other software, or any other product whatsoever. 22*f3e7f55eSRobert Mustacchi 23*f3e7f55eSRobert Mustacchi You should have received a copy of the GNU Lesser General Public 24*f3e7f55eSRobert Mustacchi License along with this program; if not, write the Free Software 25*f3e7f55eSRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, 26*f3e7f55eSRobert Mustacchi USA. 27*f3e7f55eSRobert Mustacchi 28*f3e7f55eSRobert Mustacchi Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, 29*f3e7f55eSRobert Mustacchi Mountain View, CA 94043, or: 30*f3e7f55eSRobert Mustacchi 31*f3e7f55eSRobert Mustacchi http://www.sgi.com 32*f3e7f55eSRobert Mustacchi 33*f3e7f55eSRobert Mustacchi For further information regarding this notice, see: 34*f3e7f55eSRobert Mustacchi 35*f3e7f55eSRobert Mustacchi http://oss.sgi.com/projects/GenInfo/NoticeExplan 36*f3e7f55eSRobert Mustacchi 37*f3e7f55eSRobert Mustacchi */ 38*f3e7f55eSRobert Mustacchi /* The address of the Free Software Foundation is 39*f3e7f55eSRobert Mustacchi Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 40*f3e7f55eSRobert Mustacchi Boston, MA 02110-1301, USA. 41*f3e7f55eSRobert Mustacchi SGI has moved from the Crittenden Lane address. 42*f3e7f55eSRobert Mustacchi */ 43*f3e7f55eSRobert Mustacchi 44*f3e7f55eSRobert Mustacchi 45*f3e7f55eSRobert Mustacchi 46*f3e7f55eSRobert Mustacchi 47*f3e7f55eSRobert Mustacchi /* 48*f3e7f55eSRobert Mustacchi Decodes unsigned leb128 encoded numbers. 49*f3e7f55eSRobert Mustacchi Make sure ptr is a pointer to a 1-byte type. 50*f3e7f55eSRobert Mustacchi In 2003 and earlier this was a hand-inlined 51*f3e7f55eSRobert Mustacchi version of _dwarf_decode_u_leb128() which did 52*f3e7f55eSRobert Mustacchi not work correctly if Dwarf_Word was 64 bits. 53*f3e7f55eSRobert Mustacchi */ 54*f3e7f55eSRobert Mustacchi #define DECODE_LEB128_UWORD(ptr, value) \ 55*f3e7f55eSRobert Mustacchi do { \ 56*f3e7f55eSRobert Mustacchi Dwarf_Word uleblen; \ 57*f3e7f55eSRobert Mustacchi value = _dwarf_decode_u_leb128(ptr,&uleblen); \ 58*f3e7f55eSRobert Mustacchi ptr += uleblen; \ 59*f3e7f55eSRobert Mustacchi } while (0) 60*f3e7f55eSRobert Mustacchi 61*f3e7f55eSRobert Mustacchi /* 62*f3e7f55eSRobert Mustacchi Decodes signed leb128 encoded numbers. 63*f3e7f55eSRobert Mustacchi Make sure ptr is a pointer to a 1-byte type. 64*f3e7f55eSRobert Mustacchi In 2003 and earlier this was a hand-inlined 65*f3e7f55eSRobert Mustacchi version of _dwarf_decode_s_leb128() which did 66*f3e7f55eSRobert Mustacchi not work correctly if Dwarf_Word was 64 bits. 67*f3e7f55eSRobert Mustacchi 68*f3e7f55eSRobert Mustacchi */ 69*f3e7f55eSRobert Mustacchi #define DECODE_LEB128_SWORD(ptr, value) \ 70*f3e7f55eSRobert Mustacchi do { \ 71*f3e7f55eSRobert Mustacchi Dwarf_Word sleblen; \ 72*f3e7f55eSRobert Mustacchi value = _dwarf_decode_s_leb128(ptr,&sleblen); \ 73*f3e7f55eSRobert Mustacchi ptr += sleblen; \ 74*f3e7f55eSRobert Mustacchi } while(0) 75*f3e7f55eSRobert Mustacchi 76*f3e7f55eSRobert Mustacchi 77*f3e7f55eSRobert Mustacchi /* 78*f3e7f55eSRobert Mustacchi Skips leb128_encoded numbers that are guaranteed 79*f3e7f55eSRobert Mustacchi to be no more than 4 bytes long. Same for both 80*f3e7f55eSRobert Mustacchi signed and unsigned numbers. 81*f3e7f55eSRobert Mustacchi */ 82*f3e7f55eSRobert Mustacchi #define SKIP_LEB128_WORD(ptr) \ 83*f3e7f55eSRobert Mustacchi do{ if ((*(ptr++) & 0x80) != 0) { \ 84*f3e7f55eSRobert Mustacchi if ((*(ptr++) & 0x80) != 0) { \ 85*f3e7f55eSRobert Mustacchi if ((*(ptr++) & 0x80) != 0) { \ 86*f3e7f55eSRobert Mustacchi if ((*(ptr++) & 0x80) != 0) { \ 87*f3e7f55eSRobert Mustacchi } \ 88*f3e7f55eSRobert Mustacchi } \ 89*f3e7f55eSRobert Mustacchi } \ 90*f3e7f55eSRobert Mustacchi } } while (0) 91*f3e7f55eSRobert Mustacchi 92*f3e7f55eSRobert Mustacchi 93*f3e7f55eSRobert Mustacchi #define CHECK_DIE(die, error_ret_value) \ 94*f3e7f55eSRobert Mustacchi do {if (die == NULL) { \ 95*f3e7f55eSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DIE_NULL); \ 96*f3e7f55eSRobert Mustacchi return(error_ret_value); \ 97*f3e7f55eSRobert Mustacchi } \ 98*f3e7f55eSRobert Mustacchi if (die->di_cu_context == NULL) { \ 99*f3e7f55eSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DIE_NO_CU_CONTEXT); \ 100*f3e7f55eSRobert Mustacchi return(error_ret_value); \ 101*f3e7f55eSRobert Mustacchi } \ 102*f3e7f55eSRobert Mustacchi if (die->di_cu_context->cc_dbg == NULL) { \ 103*f3e7f55eSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DBG_NULL); \ 104*f3e7f55eSRobert Mustacchi return(error_ret_value); \ 105*f3e7f55eSRobert Mustacchi } \ 106*f3e7f55eSRobert Mustacchi } while (0) 107*f3e7f55eSRobert Mustacchi 108*f3e7f55eSRobert Mustacchi 109*f3e7f55eSRobert Mustacchi /* 110*f3e7f55eSRobert Mustacchi Reads 'source' for 'length' bytes from unaligned addr. 111*f3e7f55eSRobert Mustacchi 112*f3e7f55eSRobert Mustacchi Avoids any constant-in-conditional warnings and 113*f3e7f55eSRobert Mustacchi avoids a test in the generated code (for non-const cases, 114*f3e7f55eSRobert Mustacchi which are in the majority.) 115*f3e7f55eSRobert Mustacchi Uses a temp to avoid the test. 116*f3e7f55eSRobert Mustacchi The decl here should avoid any problem of size in the temp. 117*f3e7f55eSRobert Mustacchi This code is ENDIAN DEPENDENT 118*f3e7f55eSRobert Mustacchi The memcpy args are the endian issue. 119*f3e7f55eSRobert Mustacchi */ 120*f3e7f55eSRobert Mustacchi typedef Dwarf_Unsigned BIGGEST_UINT; 121*f3e7f55eSRobert Mustacchi 122*f3e7f55eSRobert Mustacchi #ifdef WORDS_BIGENDIAN 123*f3e7f55eSRobert Mustacchi #define READ_UNALIGNED(dbg,dest,desttype, source, length) \ 124*f3e7f55eSRobert Mustacchi do { \ 125*f3e7f55eSRobert Mustacchi BIGGEST_UINT _ltmp = 0; \ 126*f3e7f55eSRobert Mustacchi dbg->de_copy_word( (((char *)(&_ltmp)) + sizeof(_ltmp) - length), \ 127*f3e7f55eSRobert Mustacchi source, length) ; \ 128*f3e7f55eSRobert Mustacchi dest = (desttype)_ltmp; \ 129*f3e7f55eSRobert Mustacchi } while (0) 130*f3e7f55eSRobert Mustacchi 131*f3e7f55eSRobert Mustacchi 132*f3e7f55eSRobert Mustacchi /* 133*f3e7f55eSRobert Mustacchi This macro sign-extends a variable depending on the length. 134*f3e7f55eSRobert Mustacchi It fills the bytes between the size of the destination and 135*f3e7f55eSRobert Mustacchi the length with appropriate padding. 136*f3e7f55eSRobert Mustacchi This code is ENDIAN DEPENDENT but dependent only 137*f3e7f55eSRobert Mustacchi on host endianness, not object file endianness. 138*f3e7f55eSRobert Mustacchi The memcpy args are the issue. 139*f3e7f55eSRobert Mustacchi */ 140*f3e7f55eSRobert Mustacchi #define SIGN_EXTEND(dest, length) \ 141*f3e7f55eSRobert Mustacchi do {if (*(Dwarf_Sbyte *)((char *)&dest + sizeof(dest) - length) < 0) {\ 142*f3e7f55eSRobert Mustacchi memcpy((char *)&dest, "\xff\xff\xff\xff\xff\xff\xff\xff", \ 143*f3e7f55eSRobert Mustacchi sizeof(dest) - length); \ 144*f3e7f55eSRobert Mustacchi } \ 145*f3e7f55eSRobert Mustacchi } while (0) 146*f3e7f55eSRobert Mustacchi #else /* LITTLE ENDIAN */ 147*f3e7f55eSRobert Mustacchi 148*f3e7f55eSRobert Mustacchi #define READ_UNALIGNED(dbg,dest,desttype, source, length) \ 149*f3e7f55eSRobert Mustacchi do { \ 150*f3e7f55eSRobert Mustacchi BIGGEST_UINT _ltmp = 0; \ 151*f3e7f55eSRobert Mustacchi dbg->de_copy_word( (char *)(&_ltmp) , \ 152*f3e7f55eSRobert Mustacchi source, length) ; \ 153*f3e7f55eSRobert Mustacchi dest = (desttype)_ltmp; \ 154*f3e7f55eSRobert Mustacchi } while (0) 155*f3e7f55eSRobert Mustacchi 156*f3e7f55eSRobert Mustacchi 157*f3e7f55eSRobert Mustacchi /* 158*f3e7f55eSRobert Mustacchi This macro sign-extends a variable depending on the length. 159*f3e7f55eSRobert Mustacchi It fills the bytes between the size of the destination and 160*f3e7f55eSRobert Mustacchi the length with appropriate padding. 161*f3e7f55eSRobert Mustacchi This code is ENDIAN DEPENDENT but dependent only 162*f3e7f55eSRobert Mustacchi on host endianness, not object file endianness. 163*f3e7f55eSRobert Mustacchi The memcpy args are the issue. 164*f3e7f55eSRobert Mustacchi */ 165*f3e7f55eSRobert Mustacchi #define SIGN_EXTEND(dest, length) \ 166*f3e7f55eSRobert Mustacchi do {if (*(Dwarf_Sbyte *)((char *)&dest + (length-1)) < 0) {\ 167*f3e7f55eSRobert Mustacchi memcpy((char *)&dest+length, \ 168*f3e7f55eSRobert Mustacchi "\xff\xff\xff\xff\xff\xff\xff\xff", \ 169*f3e7f55eSRobert Mustacchi sizeof(dest) - length); \ 170*f3e7f55eSRobert Mustacchi } \ 171*f3e7f55eSRobert Mustacchi } while (0) 172*f3e7f55eSRobert Mustacchi 173*f3e7f55eSRobert Mustacchi #endif /* ! LITTLE_ENDIAN */ 174*f3e7f55eSRobert Mustacchi 175*f3e7f55eSRobert Mustacchi 176*f3e7f55eSRobert Mustacchi 177*f3e7f55eSRobert Mustacchi /* 178*f3e7f55eSRobert Mustacchi READ_AREA LENGTH reads the length (the older way 179*f3e7f55eSRobert Mustacchi of pure 32 or 64 bit 180*f3e7f55eSRobert Mustacchi or the new proposed dwarfv2.1 64bit-extension way) 181*f3e7f55eSRobert Mustacchi 182*f3e7f55eSRobert Mustacchi It reads the bits from where rw_src_data_p points to 183*f3e7f55eSRobert Mustacchi and updates the rw_src_data_p to point past what was just read. 184*f3e7f55eSRobert Mustacchi 185*f3e7f55eSRobert Mustacchi It updates w_length_size (to the size of an offset, either 4 or 8) 186*f3e7f55eSRobert Mustacchi and w_exten_size (set 0 unless this frame has the DWARF3,4 64bit 187*f3e7f55eSRobert Mustacchi extension, in which case w_exten_size is set to 4). 188*f3e7f55eSRobert Mustacchi 189*f3e7f55eSRobert Mustacchi r_dbg is just the current dbg pointer. 190*f3e7f55eSRobert Mustacchi w_target is the output length field. 191*f3e7f55eSRobert Mustacchi r_targtype is the output type. Always Dwarf_Unsigned so far. 192*f3e7f55eSRobert Mustacchi 193*f3e7f55eSRobert Mustacchi */ 194*f3e7f55eSRobert Mustacchi /* This one handles the v2.1 64bit extension 195*f3e7f55eSRobert Mustacchi and 32bit (and MIPS fixed 64 bit via the 196*f3e7f55eSRobert Mustacchi dwarf_init-set r_dbg->de_length_size).. 197*f3e7f55eSRobert Mustacchi It does not recognize any but the one distingushed value 198*f3e7f55eSRobert Mustacchi (the only one with defined meaning). 199*f3e7f55eSRobert Mustacchi It assumes that no CU will have a length 200*f3e7f55eSRobert Mustacchi 0xffffffxx (32bit length) 201*f3e7f55eSRobert Mustacchi or 202*f3e7f55eSRobert Mustacchi 0xffffffxx xxxxxxxx (64bit length) 203*f3e7f55eSRobert Mustacchi which makes possible auto-detection of the extension. 204*f3e7f55eSRobert Mustacchi 205*f3e7f55eSRobert Mustacchi This depends on knowing that only a non-zero length 206*f3e7f55eSRobert Mustacchi is legitimate (AFAICT), and for IRIX non-standard -64 207*f3e7f55eSRobert Mustacchi dwarf that the first 32 bits of the 64bit offset will be 208*f3e7f55eSRobert Mustacchi zero (because the compiler could not handle a truly large 209*f3e7f55eSRobert Mustacchi value as of Jan 2003 and because no app has that much debug 210*f3e7f55eSRobert Mustacchi info anyway, at least not in the IRIX case). 211*f3e7f55eSRobert Mustacchi 212*f3e7f55eSRobert Mustacchi At present not testing for '64bit elf' here as that 213*f3e7f55eSRobert Mustacchi does not seem necessary (none of the 64bit length seems 214*f3e7f55eSRobert Mustacchi appropriate unless it's ident[EI_CLASS] == ELFCLASS64). 215*f3e7f55eSRobert Mustacchi */ 216*f3e7f55eSRobert Mustacchi # define READ_AREA_LENGTH(r_dbg,w_target,r_targtype, \ 217*f3e7f55eSRobert Mustacchi rw_src_data_p,w_length_size,w_exten_size) \ 218*f3e7f55eSRobert Mustacchi do { READ_UNALIGNED(r_dbg,w_target,r_targtype, \ 219*f3e7f55eSRobert Mustacchi rw_src_data_p, ORIGINAL_DWARF_OFFSET_SIZE); \ 220*f3e7f55eSRobert Mustacchi if(w_target == DISTINGUISHED_VALUE) { \ 221*f3e7f55eSRobert Mustacchi /* dwarf3 64bit extension */ \ 222*f3e7f55eSRobert Mustacchi w_length_size = DISTINGUISHED_VALUE_OFFSET_SIZE; \ 223*f3e7f55eSRobert Mustacchi rw_src_data_p += ORIGINAL_DWARF_OFFSET_SIZE; \ 224*f3e7f55eSRobert Mustacchi w_exten_size = ORIGINAL_DWARF_OFFSET_SIZE; \ 225*f3e7f55eSRobert Mustacchi READ_UNALIGNED(r_dbg,w_target,r_targtype, \ 226*f3e7f55eSRobert Mustacchi rw_src_data_p, DISTINGUISHED_VALUE_OFFSET_SIZE);\ 227*f3e7f55eSRobert Mustacchi rw_src_data_p += DISTINGUISHED_VALUE_OFFSET_SIZE; \ 228*f3e7f55eSRobert Mustacchi } else { \ 229*f3e7f55eSRobert Mustacchi if(w_target == 0 && r_dbg->de_big_endian_object) { \ 230*f3e7f55eSRobert Mustacchi /* IRIX 64 bit, big endian. This test */ \ 231*f3e7f55eSRobert Mustacchi /* is not a truly precise test, a precise test */ \ 232*f3e7f55eSRobert Mustacchi /* would check if the target was IRIX. */ \ 233*f3e7f55eSRobert Mustacchi READ_UNALIGNED(r_dbg,w_target,r_targtype, \ 234*f3e7f55eSRobert Mustacchi rw_src_data_p, DISTINGUISHED_VALUE_OFFSET_SIZE); \ 235*f3e7f55eSRobert Mustacchi w_length_size = DISTINGUISHED_VALUE_OFFSET_SIZE; \ 236*f3e7f55eSRobert Mustacchi rw_src_data_p += DISTINGUISHED_VALUE_OFFSET_SIZE; \ 237*f3e7f55eSRobert Mustacchi w_exten_size = 0; \ 238*f3e7f55eSRobert Mustacchi } else { \ 239*f3e7f55eSRobert Mustacchi /* standard 32 bit dwarf2/dwarf3 */ \ 240*f3e7f55eSRobert Mustacchi w_exten_size = 0; \ 241*f3e7f55eSRobert Mustacchi w_length_size = ORIGINAL_DWARF_OFFSET_SIZE; \ 242*f3e7f55eSRobert Mustacchi rw_src_data_p += w_length_size; \ 243*f3e7f55eSRobert Mustacchi } \ 244*f3e7f55eSRobert Mustacchi } } while(0) 245*f3e7f55eSRobert Mustacchi 246*f3e7f55eSRobert Mustacchi Dwarf_Unsigned 247*f3e7f55eSRobert Mustacchi _dwarf_decode_u_leb128(Dwarf_Small * leb128, 248*f3e7f55eSRobert Mustacchi Dwarf_Word * leb128_length); 249*f3e7f55eSRobert Mustacchi 250*f3e7f55eSRobert Mustacchi Dwarf_Signed 251*f3e7f55eSRobert Mustacchi _dwarf_decode_s_leb128(Dwarf_Small * leb128, 252*f3e7f55eSRobert Mustacchi Dwarf_Word * leb128_length); 253*f3e7f55eSRobert Mustacchi 254*f3e7f55eSRobert Mustacchi Dwarf_Unsigned 255*f3e7f55eSRobert Mustacchi _dwarf_get_size_of_val(Dwarf_Debug dbg, 256*f3e7f55eSRobert Mustacchi Dwarf_Unsigned form, 257*f3e7f55eSRobert Mustacchi Dwarf_Half address_size, 258*f3e7f55eSRobert Mustacchi Dwarf_Small * val_ptr, 259*f3e7f55eSRobert Mustacchi int v_length_size); 260*f3e7f55eSRobert Mustacchi 261*f3e7f55eSRobert Mustacchi struct Dwarf_Hash_Table_Entry_s; 262*f3e7f55eSRobert Mustacchi /* This single struct is the base for the hash table. 263*f3e7f55eSRobert Mustacchi The intent is that once the total_abbrev_count across 264*f3e7f55eSRobert Mustacchi all the entries is greater than 10*current_table_entry_count 265*f3e7f55eSRobert Mustacchi one should build a new Dwarf_Hash_Table_Base_s, rehash 266*f3e7f55eSRobert Mustacchi all the existing entries, and delete the old table and entries. 267*f3e7f55eSRobert Mustacchi (10 is a heuristic, nothing magic about it, but once the 268*f3e7f55eSRobert Mustacchi count gets to 30 or 40 times current_table_entry_count 269*f3e7f55eSRobert Mustacchi things really slow down a lot. One (500MB) application had 270*f3e7f55eSRobert Mustacchi 127000 abbreviations in one compilation unit) 271*f3e7f55eSRobert Mustacchi The incoming 'code' is an abbrev number and those simply 272*f3e7f55eSRobert Mustacchi increase linearly so the hashing is perfect always. 273*f3e7f55eSRobert Mustacchi */ 274*f3e7f55eSRobert Mustacchi struct Dwarf_Hash_Table_s { 275*f3e7f55eSRobert Mustacchi unsigned long tb_table_entry_count; 276*f3e7f55eSRobert Mustacchi unsigned long tb_total_abbrev_count; 277*f3e7f55eSRobert Mustacchi /* Each table entry is a list of abbreviations. */ 278*f3e7f55eSRobert Mustacchi struct Dwarf_Hash_Table_Entry_s *tb_entries; 279*f3e7f55eSRobert Mustacchi }; 280*f3e7f55eSRobert Mustacchi 281*f3e7f55eSRobert Mustacchi /* 282*f3e7f55eSRobert Mustacchi This struct is used to build a hash table for the 283*f3e7f55eSRobert Mustacchi abbreviation codes for a compile-unit. 284*f3e7f55eSRobert Mustacchi */ 285*f3e7f55eSRobert Mustacchi struct Dwarf_Hash_Table_Entry_s { 286*f3e7f55eSRobert Mustacchi Dwarf_Abbrev_List at_head; 287*f3e7f55eSRobert Mustacchi }; 288*f3e7f55eSRobert Mustacchi 289*f3e7f55eSRobert Mustacchi 290*f3e7f55eSRobert Mustacchi 291*f3e7f55eSRobert Mustacchi Dwarf_Abbrev_List 292*f3e7f55eSRobert Mustacchi _dwarf_get_abbrev_for_code(Dwarf_CU_Context cu_context, 293*f3e7f55eSRobert Mustacchi Dwarf_Unsigned code); 294*f3e7f55eSRobert Mustacchi 295*f3e7f55eSRobert Mustacchi 296*f3e7f55eSRobert Mustacchi /* return 1 if string ends before 'endptr' else 297*f3e7f55eSRobert Mustacchi ** return 0 meaning string is not properly terminated. 298*f3e7f55eSRobert Mustacchi ** Presumption is the 'endptr' pts to end of some dwarf section data. 299*f3e7f55eSRobert Mustacchi */ 300*f3e7f55eSRobert Mustacchi int _dwarf_string_valid(void *startptr, void *endptr); 301*f3e7f55eSRobert Mustacchi 302*f3e7f55eSRobert Mustacchi Dwarf_Unsigned _dwarf_length_of_cu_header(Dwarf_Debug, 303*f3e7f55eSRobert Mustacchi Dwarf_Unsigned offset); 304*f3e7f55eSRobert Mustacchi Dwarf_Unsigned _dwarf_length_of_cu_header_simple(Dwarf_Debug); 305*f3e7f55eSRobert Mustacchi 306*f3e7f55eSRobert Mustacchi int _dwarf_load_debug_info(Dwarf_Debug dbg, Dwarf_Error *error); 307*f3e7f55eSRobert Mustacchi void _dwarf_free_abbrev_hash_table_contents(Dwarf_Debug dbg, 308*f3e7f55eSRobert Mustacchi struct Dwarf_Hash_Table_s* hash_table); 309*f3e7f55eSRobert Mustacchi int _dwarf_get_address_size(Dwarf_Debug dbg, Dwarf_Die die); 310*f3e7f55eSRobert Mustacchi 311*f3e7f55eSRobert Mustacchi #endif /* DWARF_UTIL_H */ 312