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