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