xref: /titanic_52/usr/src/lib/libdwarf/common/dwarf_util.h (revision 7fd791373689a6af05e27efec3b1ab556e02aa23)
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