xref: /illumos-gate/usr/src/lib/libdwarf/common/dwarf_util.c (revision 4d9fdb46b215739778ebc12079842c9905586999)
1bc1f688bSRobert Mustacchi /*
2bc1f688bSRobert Mustacchi   Copyright (C) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
3*4d9fdb46SRobert Mustacchi   Portions Copyright (C) 2007-2020 David Anderson. All Rights Reserved.
4*4d9fdb46SRobert Mustacchi   Portions Copyright 2012 SN Systems Ltd. All rights reserved.
5bc1f688bSRobert Mustacchi 
6bc1f688bSRobert Mustacchi   This program is free software; you can redistribute it and/or modify it
7bc1f688bSRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
8bc1f688bSRobert Mustacchi   as published by the Free Software Foundation.
9bc1f688bSRobert Mustacchi 
10bc1f688bSRobert Mustacchi   This program is distributed in the hope that it would be useful, but
11bc1f688bSRobert Mustacchi   WITHOUT ANY WARRANTY; without even the implied warranty of
12bc1f688bSRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13bc1f688bSRobert Mustacchi 
14bc1f688bSRobert Mustacchi   Further, this software is distributed without any warranty that it is
15bc1f688bSRobert Mustacchi   free of the rightful claim of any third person regarding infringement
16bc1f688bSRobert Mustacchi   or the like.  Any license provided herein, whether implied or
17bc1f688bSRobert Mustacchi   otherwise, applies only to this software file.  Patent licenses, if
18bc1f688bSRobert Mustacchi   any, provided herein do not apply to combinations of this program with
19bc1f688bSRobert Mustacchi   other software, or any other product whatsoever.
20bc1f688bSRobert Mustacchi 
21bc1f688bSRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
22bc1f688bSRobert Mustacchi   License along with this program; if not, write the Free Software
23bc1f688bSRobert Mustacchi   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
24bc1f688bSRobert Mustacchi   USA.
25bc1f688bSRobert Mustacchi 
26bc1f688bSRobert Mustacchi */
27bc1f688bSRobert Mustacchi 
28bc1f688bSRobert Mustacchi #include "config.h"
29bc1f688bSRobert Mustacchi #include <stdio.h>
30*4d9fdb46SRobert Mustacchi #include <stdarg.h>
31*4d9fdb46SRobert Mustacchi #ifdef HAVE_STDLIB_H
32*4d9fdb46SRobert Mustacchi #include <stdlib.h> /* For free() and emergency abort() */
33*4d9fdb46SRobert Mustacchi #endif /* HAVE_STDLIB_H */
34*4d9fdb46SRobert Mustacchi #ifdef HAVE_MALLOC_H
35*4d9fdb46SRobert Mustacchi /* Useful include for some Windows compilers. */
36*4d9fdb46SRobert Mustacchi #include <malloc.h>
37*4d9fdb46SRobert Mustacchi #endif /* HAVE_MALLOC_H */
38*4d9fdb46SRobert Mustacchi #ifdef HAVE_UNISTD_H
39*4d9fdb46SRobert Mustacchi #include <unistd.h>
40*4d9fdb46SRobert Mustacchi #elif defined(_WIN32) && defined(_MSC_VER)
41*4d9fdb46SRobert Mustacchi #include <io.h>
42*4d9fdb46SRobert Mustacchi #endif /* HAVE_UNISTD_H */
43*4d9fdb46SRobert Mustacchi #include <sys/types.h> /* for open() */
44*4d9fdb46SRobert Mustacchi #include <sys/stat.h> /* for open() */
45*4d9fdb46SRobert Mustacchi #include <fcntl.h> /* for open() */
46*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
47*4d9fdb46SRobert Mustacchi #include "dwarf_alloc.h"
48*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
49*4d9fdb46SRobert Mustacchi #include "dwarf_util.h"
50*4d9fdb46SRobert Mustacchi #include "dwarf_abbrev.h"
51*4d9fdb46SRobert Mustacchi #include "memcpy_swap.h"
52bc1f688bSRobert Mustacchi #include "dwarf_die_deliv.h"
53*4d9fdb46SRobert Mustacchi #include "dwarfstring.h"
54*4d9fdb46SRobert Mustacchi #include "pro_encode_nm.h"
55*4d9fdb46SRobert Mustacchi 
56*4d9fdb46SRobert Mustacchi #ifndef O_BINARY
57*4d9fdb46SRobert Mustacchi #define O_BINARY 0
58*4d9fdb46SRobert Mustacchi #endif /* O_BINARY */
59bc1f688bSRobert Mustacchi 
60bc1f688bSRobert Mustacchi 
61bc1f688bSRobert Mustacchi 
62*4d9fdb46SRobert Mustacchi #define MINBUFLEN 1000
63*4d9fdb46SRobert Mustacchi #define TRUE  1
64*4d9fdb46SRobert Mustacchi #define FALSE 0
65*4d9fdb46SRobert Mustacchi 
66*4d9fdb46SRobert Mustacchi #if _WIN32
67*4d9fdb46SRobert Mustacchi #define NULL_DEVICE_NAME "NUL"
68*4d9fdb46SRobert Mustacchi #else
69*4d9fdb46SRobert Mustacchi #define NULL_DEVICE_NAME "/dev/null"
70*4d9fdb46SRobert Mustacchi #endif /* _WIN32 */
71*4d9fdb46SRobert Mustacchi 
72*4d9fdb46SRobert Mustacchi /*  The function returned allows dwarfdump and other callers to
73*4d9fdb46SRobert Mustacchi     do an endian-sensitive copy-word with a chosen
74*4d9fdb46SRobert Mustacchi     source-length.  */
75*4d9fdb46SRobert Mustacchi typedef void (*endian_funcp_type)(void *, const void *,unsigned long);
76*4d9fdb46SRobert Mustacchi 
77*4d9fdb46SRobert Mustacchi const char *
dwarf_package_version(void)78*4d9fdb46SRobert Mustacchi dwarf_package_version(void)
79*4d9fdb46SRobert Mustacchi {
80*4d9fdb46SRobert Mustacchi     return PACKAGE_VERSION;
81*4d9fdb46SRobert Mustacchi }
82*4d9fdb46SRobert Mustacchi 
83*4d9fdb46SRobert Mustacchi #if 0
84*4d9fdb46SRobert Mustacchi static void
85*4d9fdb46SRobert Mustacchi dump_bytes(char * msg,Dwarf_Small * start, long len)
86*4d9fdb46SRobert Mustacchi {
87*4d9fdb46SRobert Mustacchi     Dwarf_Small *end = start + len;
88*4d9fdb46SRobert Mustacchi     Dwarf_Small *cur = start;
89*4d9fdb46SRobert Mustacchi 
90*4d9fdb46SRobert Mustacchi     printf("%s ",msg);
91*4d9fdb46SRobert Mustacchi     for (; cur < end; cur++) {
92*4d9fdb46SRobert Mustacchi         printf("%02x ", *cur);
93*4d9fdb46SRobert Mustacchi     }
94*4d9fdb46SRobert Mustacchi     printf("\n");
95*4d9fdb46SRobert Mustacchi }
96*4d9fdb46SRobert Mustacchi #endif
97*4d9fdb46SRobert Mustacchi 
98*4d9fdb46SRobert Mustacchi endian_funcp_type
dwarf_get_endian_copy_function(Dwarf_Debug dbg)99*4d9fdb46SRobert Mustacchi dwarf_get_endian_copy_function(Dwarf_Debug dbg)
100*4d9fdb46SRobert Mustacchi {
101*4d9fdb46SRobert Mustacchi     if (dbg) {
102*4d9fdb46SRobert Mustacchi         return dbg->de_copy_word;
103*4d9fdb46SRobert Mustacchi     }
104*4d9fdb46SRobert Mustacchi     return 0;
105*4d9fdb46SRobert Mustacchi }
106*4d9fdb46SRobert Mustacchi 
107*4d9fdb46SRobert Mustacchi 
108*4d9fdb46SRobert Mustacchi Dwarf_Bool
_dwarf_file_has_debug_fission_cu_index(Dwarf_Debug dbg)109*4d9fdb46SRobert Mustacchi _dwarf_file_has_debug_fission_cu_index(Dwarf_Debug dbg)
110*4d9fdb46SRobert Mustacchi {
111*4d9fdb46SRobert Mustacchi     if(!dbg) {
112*4d9fdb46SRobert Mustacchi         return FALSE;
113*4d9fdb46SRobert Mustacchi     }
114*4d9fdb46SRobert Mustacchi     if (dbg->de_cu_hashindex_data) {
115*4d9fdb46SRobert Mustacchi         return TRUE;
116*4d9fdb46SRobert Mustacchi     }
117*4d9fdb46SRobert Mustacchi     return FALSE;
118*4d9fdb46SRobert Mustacchi }
119*4d9fdb46SRobert Mustacchi Dwarf_Bool
_dwarf_file_has_debug_fission_tu_index(Dwarf_Debug dbg)120*4d9fdb46SRobert Mustacchi _dwarf_file_has_debug_fission_tu_index(Dwarf_Debug dbg)
121*4d9fdb46SRobert Mustacchi {
122*4d9fdb46SRobert Mustacchi     if(!dbg) {
123*4d9fdb46SRobert Mustacchi         return FALSE;
124*4d9fdb46SRobert Mustacchi     }
125*4d9fdb46SRobert Mustacchi     if (dbg->de_tu_hashindex_data ) {
126*4d9fdb46SRobert Mustacchi         return TRUE;
127*4d9fdb46SRobert Mustacchi     }
128*4d9fdb46SRobert Mustacchi     return FALSE;
129*4d9fdb46SRobert Mustacchi }
130*4d9fdb46SRobert Mustacchi 
131*4d9fdb46SRobert Mustacchi 
132*4d9fdb46SRobert Mustacchi Dwarf_Bool
_dwarf_file_has_debug_fission_index(Dwarf_Debug dbg)133*4d9fdb46SRobert Mustacchi _dwarf_file_has_debug_fission_index(Dwarf_Debug dbg)
134*4d9fdb46SRobert Mustacchi {
135*4d9fdb46SRobert Mustacchi     if(!dbg) {
136*4d9fdb46SRobert Mustacchi         return FALSE;
137*4d9fdb46SRobert Mustacchi     }
138*4d9fdb46SRobert Mustacchi     if (dbg->de_cu_hashindex_data ||
139*4d9fdb46SRobert Mustacchi         dbg->de_tu_hashindex_data) {
140*4d9fdb46SRobert Mustacchi         return 1;
141*4d9fdb46SRobert Mustacchi     }
142*4d9fdb46SRobert Mustacchi     return FALSE;
143*4d9fdb46SRobert Mustacchi }
144*4d9fdb46SRobert Mustacchi 
145*4d9fdb46SRobert Mustacchi int
_dwarf_internal_get_die_comp_dir(Dwarf_Die die,const char ** compdir_out,const char ** compname_out,Dwarf_Error * error)146*4d9fdb46SRobert Mustacchi _dwarf_internal_get_die_comp_dir(Dwarf_Die die, const char **compdir_out,
147*4d9fdb46SRobert Mustacchi     const char **compname_out,
148*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
149*4d9fdb46SRobert Mustacchi {
150*4d9fdb46SRobert Mustacchi     Dwarf_Attribute comp_dir_attr = 0;
151*4d9fdb46SRobert Mustacchi     Dwarf_Attribute comp_name_attr = 0;
152*4d9fdb46SRobert Mustacchi     int resattr = 0;
153*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
154*4d9fdb46SRobert Mustacchi 
155*4d9fdb46SRobert Mustacchi     dbg = die->di_cu_context->cc_dbg;
156*4d9fdb46SRobert Mustacchi     resattr = dwarf_attr(die, DW_AT_name, &comp_name_attr, error);
157*4d9fdb46SRobert Mustacchi     if (resattr == DW_DLV_ERROR) {
158*4d9fdb46SRobert Mustacchi         return resattr;
159*4d9fdb46SRobert Mustacchi     }
160*4d9fdb46SRobert Mustacchi     if (resattr == DW_DLV_OK) {
161*4d9fdb46SRobert Mustacchi         int cres = DW_DLV_ERROR;
162*4d9fdb46SRobert Mustacchi         char *name = 0;
163*4d9fdb46SRobert Mustacchi 
164*4d9fdb46SRobert Mustacchi         cres = dwarf_formstring(comp_name_attr, &name, error);
165*4d9fdb46SRobert Mustacchi         if (cres == DW_DLV_ERROR) {
166*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg, comp_name_attr, DW_DLA_ATTR);
167*4d9fdb46SRobert Mustacchi             return cres;
168*4d9fdb46SRobert Mustacchi         } else if (cres == DW_DLV_OK) {
169*4d9fdb46SRobert Mustacchi             *compname_out = (const char *)name;
170*4d9fdb46SRobert Mustacchi         } else {
171*4d9fdb46SRobert Mustacchi             /* FALL thru */
172*4d9fdb46SRobert Mustacchi         }
173*4d9fdb46SRobert Mustacchi     }
174*4d9fdb46SRobert Mustacchi     if (resattr == DW_DLV_OK) {
175*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, comp_name_attr, DW_DLA_ATTR);
176*4d9fdb46SRobert Mustacchi     }
177*4d9fdb46SRobert Mustacchi     resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error);
178*4d9fdb46SRobert Mustacchi     if (resattr == DW_DLV_ERROR) {
179*4d9fdb46SRobert Mustacchi         return resattr;
180*4d9fdb46SRobert Mustacchi     }
181*4d9fdb46SRobert Mustacchi     if (resattr == DW_DLV_OK) {
182*4d9fdb46SRobert Mustacchi         int cres = DW_DLV_ERROR;
183*4d9fdb46SRobert Mustacchi         char *cdir = 0;
184*4d9fdb46SRobert Mustacchi 
185*4d9fdb46SRobert Mustacchi         cres = dwarf_formstring(comp_dir_attr, &cdir, error);
186*4d9fdb46SRobert Mustacchi         if (cres == DW_DLV_ERROR) {
187*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR);
188*4d9fdb46SRobert Mustacchi             return cres;
189*4d9fdb46SRobert Mustacchi         } else if (cres == DW_DLV_OK) {
190*4d9fdb46SRobert Mustacchi             *compdir_out = (const char *) cdir;
191*4d9fdb46SRobert Mustacchi         } else {
192*4d9fdb46SRobert Mustacchi             /* FALL thru */
193*4d9fdb46SRobert Mustacchi         }
194*4d9fdb46SRobert Mustacchi     }
195*4d9fdb46SRobert Mustacchi     if (resattr == DW_DLV_OK) {
196*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR);
197*4d9fdb46SRobert Mustacchi     }
198*4d9fdb46SRobert Mustacchi     return resattr;
199*4d9fdb46SRobert Mustacchi }
200*4d9fdb46SRobert Mustacchi 
201*4d9fdb46SRobert Mustacchi 
202*4d9fdb46SRobert Mustacchi /*  Given a form, and a pointer to the bytes encoding
203bc1f688bSRobert Mustacchi     a value of that form, val_ptr, this function returns
204bc1f688bSRobert Mustacchi     the length, in bytes, of a value of that form.
205bc1f688bSRobert Mustacchi     When using this function, check for a return of 0
206*4d9fdb46SRobert Mustacchi     a recursive DW_FORM_INDIRECT value.  */
207*4d9fdb46SRobert Mustacchi int
_dwarf_get_size_of_val(Dwarf_Debug dbg,Dwarf_Unsigned form,Dwarf_Half cu_version,Dwarf_Half address_size,Dwarf_Small * val_ptr,int v_length_size,Dwarf_Unsigned * size_out,Dwarf_Small * section_end_ptr,Dwarf_Error * error)208bc1f688bSRobert Mustacchi _dwarf_get_size_of_val(Dwarf_Debug dbg,
209bc1f688bSRobert Mustacchi     Dwarf_Unsigned form,
210*4d9fdb46SRobert Mustacchi     Dwarf_Half cu_version,
211bc1f688bSRobert Mustacchi     Dwarf_Half address_size,
212*4d9fdb46SRobert Mustacchi     Dwarf_Small * val_ptr,
213*4d9fdb46SRobert Mustacchi     int v_length_size,
214*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *size_out,
215*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_end_ptr,
216*4d9fdb46SRobert Mustacchi     Dwarf_Error*error)
217bc1f688bSRobert Mustacchi {
218bc1f688bSRobert Mustacchi     Dwarf_Unsigned length = 0;
219*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned leb128_length = 0;
220bc1f688bSRobert Mustacchi     Dwarf_Unsigned form_indirect = 0;
221bc1f688bSRobert Mustacchi     Dwarf_Unsigned ret_value = 0;
222bc1f688bSRobert Mustacchi 
223bc1f688bSRobert Mustacchi     switch (form) {
224bc1f688bSRobert Mustacchi 
225*4d9fdb46SRobert Mustacchi     /*  When we encounter a FORM here that
226*4d9fdb46SRobert Mustacchi         we know about but forgot to enter here,
227*4d9fdb46SRobert Mustacchi         we had better not just continue.
228*4d9fdb46SRobert Mustacchi         Usually means we forgot to update this function
229*4d9fdb46SRobert Mustacchi         when implementing form handling of a new FORM.
230*4d9fdb46SRobert Mustacchi         Disaster results from using a bogus value,
231*4d9fdb46SRobert Mustacchi         so generate error. */
232*4d9fdb46SRobert Mustacchi     default:
233*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,DW_DLE_DEBUG_FORM_HANDLING_INCOMPLETE);
234*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
235*4d9fdb46SRobert Mustacchi 
236*4d9fdb46SRobert Mustacchi 
237*4d9fdb46SRobert Mustacchi     case 0:  return DW_DLV_OK;
238*4d9fdb46SRobert Mustacchi 
239*4d9fdb46SRobert Mustacchi     case DW_FORM_GNU_ref_alt:
240*4d9fdb46SRobert Mustacchi     case DW_FORM_GNU_strp_alt:
241*4d9fdb46SRobert Mustacchi     case DW_FORM_strp_sup:
242*4d9fdb46SRobert Mustacchi         *size_out = v_length_size;
243*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
244bc1f688bSRobert Mustacchi 
245bc1f688bSRobert Mustacchi     case DW_FORM_addr:
246bc1f688bSRobert Mustacchi         if (address_size) {
247*4d9fdb46SRobert Mustacchi             *size_out = address_size;
248*4d9fdb46SRobert Mustacchi         } else {
249bc1f688bSRobert Mustacchi             /* This should never happen, address_size should be set. */
250*4d9fdb46SRobert Mustacchi             *size_out = dbg->de_pointer_size;
251*4d9fdb46SRobert Mustacchi         }
252*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
253*4d9fdb46SRobert Mustacchi     case DW_FORM_ref_sig8:
254*4d9fdb46SRobert Mustacchi         *size_out = 8;
255*4d9fdb46SRobert Mustacchi         /* sizeof Dwarf_Sig8 */
256*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
257bc1f688bSRobert Mustacchi 
258bc1f688bSRobert Mustacchi     /*  DWARF2 was wrong on the size of the attribute for
259bc1f688bSRobert Mustacchi         DW_FORM_ref_addr.  We assume compilers are using the
260bc1f688bSRobert Mustacchi         corrected DWARF3 text (for 32bit pointer target objects pointer and
261*4d9fdb46SRobert Mustacchi         offsets are the same size anyway).
262*4d9fdb46SRobert Mustacchi         It is clear (as of 2014) that for 64bit folks used
263*4d9fdb46SRobert Mustacchi         the V2 spec in the way V2 was
264*4d9fdb46SRobert Mustacchi         written, so the ref_addr has to account for that.*/
265bc1f688bSRobert Mustacchi     case DW_FORM_ref_addr:
266*4d9fdb46SRobert Mustacchi         if (cu_version == DW_CU_VERSION2) {
267*4d9fdb46SRobert Mustacchi             *size_out = address_size;
268*4d9fdb46SRobert Mustacchi         } else {
269*4d9fdb46SRobert Mustacchi             *size_out = v_length_size;
270*4d9fdb46SRobert Mustacchi         }
271*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
272bc1f688bSRobert Mustacchi 
273*4d9fdb46SRobert Mustacchi     case DW_FORM_block1: {
274*4d9fdb46SRobert Mustacchi         ptrdiff_t sizeasptrdiff = 0;
275bc1f688bSRobert Mustacchi 
276*4d9fdb46SRobert Mustacchi         if (val_ptr >= section_end_ptr) {
277*4d9fdb46SRobert Mustacchi             _dwarf_error_string(dbg,error,
278*4d9fdb46SRobert Mustacchi                 DW_DLE_FORM_BLOCK_LENGTH_ERROR,
279*4d9fdb46SRobert Mustacchi                 "DW_DLE_FORM_BLOCK_LENGTH_ERROR: DW_FORM_block1"
280*4d9fdb46SRobert Mustacchi                 " itself is off the end of the section."
281*4d9fdb46SRobert Mustacchi                 " Corrupt Dwarf.");
282*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
283*4d9fdb46SRobert Mustacchi         }
284*4d9fdb46SRobert Mustacchi         ret_value =  *(Dwarf_Small *) val_ptr;
285*4d9fdb46SRobert Mustacchi         sizeasptrdiff = (ptrdiff_t)ret_value;
286*4d9fdb46SRobert Mustacchi         if (sizeasptrdiff > (section_end_ptr - val_ptr) ||
287*4d9fdb46SRobert Mustacchi             sizeasptrdiff < 0) {
288*4d9fdb46SRobert Mustacchi             _dwarf_error_string(dbg,error,
289*4d9fdb46SRobert Mustacchi                 DW_DLE_FORM_BLOCK_LENGTH_ERROR,
290*4d9fdb46SRobert Mustacchi                 "DW_DLE_FORM_BLOCK_LENGTH_ERROR: DW_FORM_block1"
291*4d9fdb46SRobert Mustacchi                 " runs off the end of the section."
292*4d9fdb46SRobert Mustacchi                 " Corrupt Dwarf.");
293*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
294*4d9fdb46SRobert Mustacchi         }
295*4d9fdb46SRobert Mustacchi         *size_out = ret_value +1;
296*4d9fdb46SRobert Mustacchi         }
297*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
298bc1f688bSRobert Mustacchi 
299*4d9fdb46SRobert Mustacchi     case DW_FORM_block2: {
300*4d9fdb46SRobert Mustacchi         ptrdiff_t sizeasptrdiff = 0;
301bc1f688bSRobert Mustacchi 
302*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, ret_value, Dwarf_Unsigned,
303*4d9fdb46SRobert Mustacchi             val_ptr, DWARF_HALF_SIZE,error,section_end_ptr);
304*4d9fdb46SRobert Mustacchi         sizeasptrdiff = (ptrdiff_t)ret_value;
305*4d9fdb46SRobert Mustacchi         if (sizeasptrdiff > (section_end_ptr - val_ptr) ||
306*4d9fdb46SRobert Mustacchi             sizeasptrdiff < 0) {
307*4d9fdb46SRobert Mustacchi             _dwarf_error_string(dbg,error,
308*4d9fdb46SRobert Mustacchi                 DW_DLE_FORM_BLOCK_LENGTH_ERROR,
309*4d9fdb46SRobert Mustacchi                 "DW_DLE_FORM_BLOCK_LENGTH_ERROR: DW_FORM_block2"
310*4d9fdb46SRobert Mustacchi                 " runs off the end of the section."
311*4d9fdb46SRobert Mustacchi                 " Corrupt Dwarf.");
312*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
313*4d9fdb46SRobert Mustacchi         }
314*4d9fdb46SRobert Mustacchi         *size_out = ret_value + DWARF_HALF_SIZE;
315*4d9fdb46SRobert Mustacchi         }
316*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
317*4d9fdb46SRobert Mustacchi 
318*4d9fdb46SRobert Mustacchi     case DW_FORM_block4: {
319*4d9fdb46SRobert Mustacchi         ptrdiff_t sizeasptrdiff = 0;
320*4d9fdb46SRobert Mustacchi 
321*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, ret_value, Dwarf_Unsigned,
322*4d9fdb46SRobert Mustacchi             val_ptr, DWARF_32BIT_SIZE,
323*4d9fdb46SRobert Mustacchi             error,section_end_ptr);
324*4d9fdb46SRobert Mustacchi         sizeasptrdiff = (ptrdiff_t)ret_value;
325*4d9fdb46SRobert Mustacchi         if (sizeasptrdiff > (section_end_ptr - val_ptr) ||
326*4d9fdb46SRobert Mustacchi             sizeasptrdiff < 0) {
327*4d9fdb46SRobert Mustacchi             _dwarf_error_string(dbg,error,
328*4d9fdb46SRobert Mustacchi                 DW_DLE_FORM_BLOCK_LENGTH_ERROR,
329*4d9fdb46SRobert Mustacchi                 "DW_DLE_FORM_BLOCK_LENGTH_ERROR: DW_FORM_block4"
330*4d9fdb46SRobert Mustacchi                 " runs off the end of the section."
331*4d9fdb46SRobert Mustacchi                 " Corrupt Dwarf.");
332*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
333*4d9fdb46SRobert Mustacchi         }
334*4d9fdb46SRobert Mustacchi         *size_out = ret_value + DWARF_32BIT_SIZE;
335*4d9fdb46SRobert Mustacchi         }
336*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
337bc1f688bSRobert Mustacchi 
338bc1f688bSRobert Mustacchi     case DW_FORM_data1:
339*4d9fdb46SRobert Mustacchi         *size_out = 1;
340*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
341bc1f688bSRobert Mustacchi 
342bc1f688bSRobert Mustacchi     case DW_FORM_data2:
343*4d9fdb46SRobert Mustacchi         *size_out = 2;
344*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
345bc1f688bSRobert Mustacchi 
346bc1f688bSRobert Mustacchi     case DW_FORM_data4:
347*4d9fdb46SRobert Mustacchi         *size_out = 4;
348*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
349bc1f688bSRobert Mustacchi 
350bc1f688bSRobert Mustacchi     case DW_FORM_data8:
351*4d9fdb46SRobert Mustacchi         *size_out = 8;
352*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
353bc1f688bSRobert Mustacchi 
354*4d9fdb46SRobert Mustacchi     case DW_FORM_data16:
355*4d9fdb46SRobert Mustacchi         *size_out = 16;
356*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
357*4d9fdb46SRobert Mustacchi 
358*4d9fdb46SRobert Mustacchi     case DW_FORM_string: {
359*4d9fdb46SRobert Mustacchi         int res = 0;
360*4d9fdb46SRobert Mustacchi         res = _dwarf_check_string_valid(dbg,val_ptr,
361*4d9fdb46SRobert Mustacchi             val_ptr,
362*4d9fdb46SRobert Mustacchi             section_end_ptr,
363*4d9fdb46SRobert Mustacchi             DW_DLE_FORM_STRING_BAD_STRING,
364*4d9fdb46SRobert Mustacchi             error);
365*4d9fdb46SRobert Mustacchi         if ( res != DW_DLV_OK) {
366*4d9fdb46SRobert Mustacchi             return res;
367*4d9fdb46SRobert Mustacchi         }
368*4d9fdb46SRobert Mustacchi         }
369*4d9fdb46SRobert Mustacchi         *size_out = strlen((char *) val_ptr) + 1;
370*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
371bc1f688bSRobert Mustacchi 
372bc1f688bSRobert Mustacchi     case DW_FORM_block:
373*4d9fdb46SRobert Mustacchi     case DW_FORM_exprloc: {
374*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(val_ptr,length,leb128_length,
375*4d9fdb46SRobert Mustacchi             dbg,error,section_end_ptr);
376*4d9fdb46SRobert Mustacchi         *size_out = length + leb128_length;
377*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;;
378*4d9fdb46SRobert Mustacchi     }
379bc1f688bSRobert Mustacchi 
380bc1f688bSRobert Mustacchi     case DW_FORM_flag_present:
381*4d9fdb46SRobert Mustacchi         *size_out = 0;
382*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
383*4d9fdb46SRobert Mustacchi 
384bc1f688bSRobert Mustacchi     case DW_FORM_flag:
385*4d9fdb46SRobert Mustacchi         *size_out = 1;
386*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
387bc1f688bSRobert Mustacchi 
388bc1f688bSRobert Mustacchi     case DW_FORM_sec_offset:
389bc1f688bSRobert Mustacchi         /* If 32bit dwarf, is 4. Else is 64bit dwarf and is 8. */
390*4d9fdb46SRobert Mustacchi         *size_out = v_length_size;
391*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
392bc1f688bSRobert Mustacchi 
393*4d9fdb46SRobert Mustacchi     case DW_FORM_ref_udata: {
394*4d9fdb46SRobert Mustacchi         UNUSEDARG Dwarf_Unsigned v = 0;
395*4d9fdb46SRobert Mustacchi 
396*4d9fdb46SRobert Mustacchi         /*  Discard the decoded value, we just want the length
397*4d9fdb46SRobert Mustacchi             of the value. */
398*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(val_ptr,v,leb128_length,
399*4d9fdb46SRobert Mustacchi             dbg,error,section_end_ptr);
400*4d9fdb46SRobert Mustacchi         *size_out = leb128_length;
401*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;;
402*4d9fdb46SRobert Mustacchi     }
403bc1f688bSRobert Mustacchi 
404bc1f688bSRobert Mustacchi     case DW_FORM_indirect:
405bc1f688bSRobert Mustacchi         {
406*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned indir_len = 0;
407*4d9fdb46SRobert Mustacchi             int res = 0;
408*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned info_data_len = 0;
409bc1f688bSRobert Mustacchi 
410*4d9fdb46SRobert Mustacchi             DECODE_LEB128_UWORD_LEN_CK(val_ptr,form_indirect,indir_len,
411*4d9fdb46SRobert Mustacchi                 dbg,error,section_end_ptr);
412bc1f688bSRobert Mustacchi             if (form_indirect == DW_FORM_indirect) {
413*4d9fdb46SRobert Mustacchi                 /* We are in big trouble: The true form
414bc1f688bSRobert Mustacchi                     of DW_FORM_indirect is
415bc1f688bSRobert Mustacchi                     DW_FORM_indirect? Nonsense. Should
416bc1f688bSRobert Mustacchi                     never happen. */
417*4d9fdb46SRobert Mustacchi                 _dwarf_error(dbg,error,DW_DLE_NESTED_FORM_INDIRECT_ERROR);
418*4d9fdb46SRobert Mustacchi                 return DW_DLV_ERROR;
419bc1f688bSRobert Mustacchi             }
420*4d9fdb46SRobert Mustacchi             /*  If form_indirect  is DW_FORM_implicit_const then
421*4d9fdb46SRobert Mustacchi                 the following call will set info_data_len 0 */
422*4d9fdb46SRobert Mustacchi             res = _dwarf_get_size_of_val(dbg,
423bc1f688bSRobert Mustacchi                 form_indirect,
424*4d9fdb46SRobert Mustacchi                 cu_version,
425bc1f688bSRobert Mustacchi                 address_size,
426bc1f688bSRobert Mustacchi                 val_ptr + indir_len,
427*4d9fdb46SRobert Mustacchi                 v_length_size,
428*4d9fdb46SRobert Mustacchi                 &info_data_len,
429*4d9fdb46SRobert Mustacchi                 section_end_ptr,
430*4d9fdb46SRobert Mustacchi                 error);
431*4d9fdb46SRobert Mustacchi             if(res != DW_DLV_OK) {
432*4d9fdb46SRobert Mustacchi                 return res;
433*4d9fdb46SRobert Mustacchi             }
434*4d9fdb46SRobert Mustacchi             *size_out = indir_len + info_data_len;
435*4d9fdb46SRobert Mustacchi             return DW_DLV_OK;
436bc1f688bSRobert Mustacchi         }
437bc1f688bSRobert Mustacchi 
438bc1f688bSRobert Mustacchi     case DW_FORM_ref1:
439*4d9fdb46SRobert Mustacchi         *size_out = 1;
440*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
441bc1f688bSRobert Mustacchi 
442bc1f688bSRobert Mustacchi     case DW_FORM_ref2:
443*4d9fdb46SRobert Mustacchi         *size_out = 2;
444*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
445bc1f688bSRobert Mustacchi 
446bc1f688bSRobert Mustacchi     case DW_FORM_ref4:
447*4d9fdb46SRobert Mustacchi         *size_out = 4;
448*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
449bc1f688bSRobert Mustacchi 
450bc1f688bSRobert Mustacchi     case DW_FORM_ref8:
451*4d9fdb46SRobert Mustacchi         *size_out = 8;
452*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
453bc1f688bSRobert Mustacchi 
454*4d9fdb46SRobert Mustacchi     /*  DW_FORM_implicit_const  is a value in the
455*4d9fdb46SRobert Mustacchi         abbreviations, not in the DIEs and this
456*4d9fdb46SRobert Mustacchi         functions measures DIE size. */
457*4d9fdb46SRobert Mustacchi     case DW_FORM_implicit_const:
458*4d9fdb46SRobert Mustacchi         *size_out = 0;
459*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
460bc1f688bSRobert Mustacchi 
461*4d9fdb46SRobert Mustacchi     case DW_FORM_sdata: {
462*4d9fdb46SRobert Mustacchi         /*  Discard the decoded value, we just want the length
463*4d9fdb46SRobert Mustacchi             of the value. */
464*4d9fdb46SRobert Mustacchi         UNUSEDARG Dwarf_Signed v = 0;
465*4d9fdb46SRobert Mustacchi 
466*4d9fdb46SRobert Mustacchi         /*  Discard the decoded value, we just want the length
467*4d9fdb46SRobert Mustacchi             of the value. */
468*4d9fdb46SRobert Mustacchi         DECODE_LEB128_SWORD_LEN_CK(val_ptr,v,leb128_length,
469*4d9fdb46SRobert Mustacchi             dbg,error,section_end_ptr);
470*4d9fdb46SRobert Mustacchi         *size_out = leb128_length;
471*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
472*4d9fdb46SRobert Mustacchi     }
473*4d9fdb46SRobert Mustacchi     case DW_FORM_ref_sup4:
474*4d9fdb46SRobert Mustacchi         *size_out = 4;
475*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
476*4d9fdb46SRobert Mustacchi     case DW_FORM_ref_sup8:
477*4d9fdb46SRobert Mustacchi         *size_out = 8;
478*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
479*4d9fdb46SRobert Mustacchi     case DW_FORM_addrx1:
480*4d9fdb46SRobert Mustacchi         *size_out = 1;
481*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
482*4d9fdb46SRobert Mustacchi     case DW_FORM_addrx2:
483*4d9fdb46SRobert Mustacchi         *size_out = 2;
484*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
485*4d9fdb46SRobert Mustacchi     case DW_FORM_addrx3:
486*4d9fdb46SRobert Mustacchi         *size_out = 4;
487*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
488*4d9fdb46SRobert Mustacchi     case DW_FORM_addrx4:
489*4d9fdb46SRobert Mustacchi         *size_out = 4;
490*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
491*4d9fdb46SRobert Mustacchi     case DW_FORM_strx1:
492*4d9fdb46SRobert Mustacchi         *size_out = 1;
493*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
494*4d9fdb46SRobert Mustacchi     case DW_FORM_strx2:
495*4d9fdb46SRobert Mustacchi         *size_out = 2;
496*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
497*4d9fdb46SRobert Mustacchi     case DW_FORM_strx3:
498*4d9fdb46SRobert Mustacchi         *size_out = 4;
499*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
500*4d9fdb46SRobert Mustacchi     case DW_FORM_strx4:
501*4d9fdb46SRobert Mustacchi         *size_out = 4;
502*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
503*4d9fdb46SRobert Mustacchi 
504*4d9fdb46SRobert Mustacchi     case DW_FORM_loclistx:
505*4d9fdb46SRobert Mustacchi     case DW_FORM_rnglistx:
506*4d9fdb46SRobert Mustacchi     case DW_FORM_addrx:
507*4d9fdb46SRobert Mustacchi     case DW_FORM_GNU_addr_index:
508*4d9fdb46SRobert Mustacchi     case DW_FORM_strx:
509*4d9fdb46SRobert Mustacchi     case DW_FORM_GNU_str_index: {
510*4d9fdb46SRobert Mustacchi         UNUSEDARG Dwarf_Unsigned v = 0;
511*4d9fdb46SRobert Mustacchi 
512*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(val_ptr,v,leb128_length,
513*4d9fdb46SRobert Mustacchi             dbg,error,section_end_ptr);
514*4d9fdb46SRobert Mustacchi         *size_out = leb128_length;
515*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
516*4d9fdb46SRobert Mustacchi     }
517*4d9fdb46SRobert Mustacchi 
518*4d9fdb46SRobert Mustacchi     case DW_FORM_line_strp:
519bc1f688bSRobert Mustacchi     case DW_FORM_strp:
520*4d9fdb46SRobert Mustacchi         *size_out = v_length_size;
521*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
522bc1f688bSRobert Mustacchi 
523*4d9fdb46SRobert Mustacchi     case DW_FORM_udata: {
524*4d9fdb46SRobert Mustacchi         /*  Discard the decoded value, we just want the length
525*4d9fdb46SRobert Mustacchi             of the value. */
526*4d9fdb46SRobert Mustacchi         UNUSEDARG Dwarf_Unsigned v = 0;
527*4d9fdb46SRobert Mustacchi 
528*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(val_ptr,v,leb128_length,
529*4d9fdb46SRobert Mustacchi             dbg,error,section_end_ptr);
530*4d9fdb46SRobert Mustacchi         *size_out = leb128_length;
531*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
532*4d9fdb46SRobert Mustacchi     }
533bc1f688bSRobert Mustacchi     }
534bc1f688bSRobert Mustacchi }
535bc1f688bSRobert Mustacchi 
536bc1f688bSRobert Mustacchi /*  We allow an arbitrary number of HT_MULTIPLE entries
537bc1f688bSRobert Mustacchi     before resizing.  It seems up to 20 or 30
538bc1f688bSRobert Mustacchi     would work nearly as well.
539bc1f688bSRobert Mustacchi     We could have a different resize multiple than 'resize now'
540*4d9fdb46SRobert Mustacchi     test multiple, but for now we don't do that.  */
541bc1f688bSRobert Mustacchi #define HT_MULTIPLE 8
542bc1f688bSRobert Mustacchi 
543bc1f688bSRobert Mustacchi /*  Copy the old entries, updating each to be in
544bc1f688bSRobert Mustacchi     a new list.  Don't delete anything. Leave the
545bc1f688bSRobert Mustacchi     htin with stale data. */
546bc1f688bSRobert Mustacchi static void
copy_abbrev_table_to_new_table(Dwarf_Hash_Table htin,Dwarf_Hash_Table htout)547bc1f688bSRobert Mustacchi copy_abbrev_table_to_new_table(Dwarf_Hash_Table htin,
548bc1f688bSRobert Mustacchi   Dwarf_Hash_Table htout)
549bc1f688bSRobert Mustacchi {
550bc1f688bSRobert Mustacchi     Dwarf_Hash_Table_Entry entry_in = htin->tb_entries;
551bc1f688bSRobert Mustacchi     unsigned entry_in_count = htin->tb_table_entry_count;
552bc1f688bSRobert Mustacchi     Dwarf_Hash_Table_Entry entry_out = htout->tb_entries;
553bc1f688bSRobert Mustacchi     unsigned entry_out_count = htout->tb_table_entry_count;
554bc1f688bSRobert Mustacchi     unsigned k = 0;
555bc1f688bSRobert Mustacchi     for (; k < entry_in_count; ++k,++entry_in) {
556bc1f688bSRobert Mustacchi         Dwarf_Abbrev_List listent = entry_in->at_head;
557bc1f688bSRobert Mustacchi         Dwarf_Abbrev_List nextlistent = 0;
558bc1f688bSRobert Mustacchi 
559bc1f688bSRobert Mustacchi         for (; listent ; listent = nextlistent) {
560*4d9fdb46SRobert Mustacchi             unsigned newtmp = listent->abl_code;
561bc1f688bSRobert Mustacchi             unsigned newhash = newtmp%entry_out_count;
562bc1f688bSRobert Mustacchi             Dwarf_Hash_Table_Entry e;
563*4d9fdb46SRobert Mustacchi             nextlistent = listent->abl_next;
564bc1f688bSRobert Mustacchi             e = entry_out+newhash;
565bc1f688bSRobert Mustacchi             /*  Move_entry_to_new_hash. This reverses the
566bc1f688bSRobert Mustacchi                 order of the entries, effectively, but
567bc1f688bSRobert Mustacchi                 that does not seem significant. */
568*4d9fdb46SRobert Mustacchi             listent->abl_next = e->at_head;
569bc1f688bSRobert Mustacchi             e->at_head = listent;
570bc1f688bSRobert Mustacchi 
571bc1f688bSRobert Mustacchi             htout->tb_total_abbrev_count++;
572bc1f688bSRobert Mustacchi         }
573bc1f688bSRobert Mustacchi     }
574bc1f688bSRobert Mustacchi }
575bc1f688bSRobert Mustacchi 
576*4d9fdb46SRobert Mustacchi /*  We allow zero form here, end of list. */
577*4d9fdb46SRobert Mustacchi int
_dwarf_valid_form_we_know(Dwarf_Unsigned at_form,Dwarf_Unsigned at_name)578*4d9fdb46SRobert Mustacchi _dwarf_valid_form_we_know(Dwarf_Unsigned at_form,
579*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned at_name)
580*4d9fdb46SRobert Mustacchi {
581*4d9fdb46SRobert Mustacchi     if(at_form == 0 && at_name == 0) {
582*4d9fdb46SRobert Mustacchi         return TRUE;
583*4d9fdb46SRobert Mustacchi     }
584*4d9fdb46SRobert Mustacchi     if (at_name == 0) {
585*4d9fdb46SRobert Mustacchi         return FALSE;
586*4d9fdb46SRobert Mustacchi     }
587*4d9fdb46SRobert Mustacchi     if (at_form <= DW_FORM_addrx4 ) {
588*4d9fdb46SRobert Mustacchi         return TRUE;
589*4d9fdb46SRobert Mustacchi     }
590*4d9fdb46SRobert Mustacchi     if (at_form == DW_FORM_GNU_addr_index ||
591*4d9fdb46SRobert Mustacchi         at_form == DW_FORM_GNU_str_index  ||
592*4d9fdb46SRobert Mustacchi         at_form == DW_FORM_GNU_ref_alt ||
593*4d9fdb46SRobert Mustacchi         at_form == DW_FORM_GNU_strp_alt) {
594*4d9fdb46SRobert Mustacchi         return TRUE;
595*4d9fdb46SRobert Mustacchi     }
596*4d9fdb46SRobert Mustacchi     return FALSE;
597*4d9fdb46SRobert Mustacchi }
598*4d9fdb46SRobert Mustacchi 
599*4d9fdb46SRobert Mustacchi int
_dwarf_format_TAG_err_msg(Dwarf_Debug dbg,Dwarf_Unsigned tag,const char * m,Dwarf_Error * errp)600*4d9fdb46SRobert Mustacchi _dwarf_format_TAG_err_msg(Dwarf_Debug dbg,
601*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned tag,
602*4d9fdb46SRobert Mustacchi     const char *m,
603*4d9fdb46SRobert Mustacchi     Dwarf_Error *errp)
604*4d9fdb46SRobert Mustacchi {
605*4d9fdb46SRobert Mustacchi     dwarfstring v;
606*4d9fdb46SRobert Mustacchi 
607*4d9fdb46SRobert Mustacchi     dwarfstring_constructor(&v);
608*4d9fdb46SRobert Mustacchi     dwarfstring_append(&v,(char *)m);
609*4d9fdb46SRobert Mustacchi     dwarfstring_append(&v," The value ");
610*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_u(&v,"0x%" DW_PR_DUx
611*4d9fdb46SRobert Mustacchi         " is outside the valid TAG range.",tag);
612*4d9fdb46SRobert Mustacchi     dwarfstring_append(&v," Corrupt DWARF.");
613*4d9fdb46SRobert Mustacchi     _dwarf_error_string(dbg, errp,DW_DLE_TAG_CORRUPT,
614*4d9fdb46SRobert Mustacchi         dwarfstring_string(&v));
615*4d9fdb46SRobert Mustacchi     dwarfstring_destructor(&v);
616*4d9fdb46SRobert Mustacchi     return DW_DLV_ERROR;
617*4d9fdb46SRobert Mustacchi }
618*4d9fdb46SRobert Mustacchi 
619*4d9fdb46SRobert Mustacchi /*  This function returns a pointer to a Dwarf_Abbrev_List_s
620bc1f688bSRobert Mustacchi     struct for the abbrev with the given code.  It puts the
621bc1f688bSRobert Mustacchi     struct on the appropriate hash table.  It also adds all
622bc1f688bSRobert Mustacchi     the abbrev between the last abbrev added and this one to
623bc1f688bSRobert Mustacchi     the hash table.  In other words, the .debug_abbrev section
624bc1f688bSRobert Mustacchi     is scanned sequentially from the top for an abbrev with
625bc1f688bSRobert Mustacchi     the given code.  All intervening abbrevs are also put
626bc1f688bSRobert Mustacchi     into the hash table.
627bc1f688bSRobert Mustacchi 
628bc1f688bSRobert Mustacchi     This function hashes the given code, and checks the chain
629bc1f688bSRobert Mustacchi     at that hash table entry to see if a Dwarf_Abbrev_List_s
630bc1f688bSRobert Mustacchi     with the given code exists.  If yes, it returns a pointer
631bc1f688bSRobert Mustacchi     to that struct.  Otherwise, it scans the .debug_abbrev
632bc1f688bSRobert Mustacchi     section from the last byte scanned for that CU till either
633bc1f688bSRobert Mustacchi     an abbrev with the given code is found, or an abbrev code
634bc1f688bSRobert Mustacchi     of 0 is read.  It puts Dwarf_Abbrev_List_s entries for all
635bc1f688bSRobert Mustacchi     abbrev's read till that point into the hash table.  The
636bc1f688bSRobert Mustacchi     hash table contains both a head pointer and a tail pointer
637bc1f688bSRobert Mustacchi     for each entry.
638bc1f688bSRobert Mustacchi 
639bc1f688bSRobert Mustacchi     While the lists can move and entries can be moved between
640bc1f688bSRobert Mustacchi     lists on reallocation, any given Dwarf_Abbrev_list entry
641bc1f688bSRobert Mustacchi     never moves once allocated, so the pointer is safe to return.
642bc1f688bSRobert Mustacchi 
643*4d9fdb46SRobert Mustacchi     See also dwarf_get_abbrev() in dwarf_abbrev.c.
644*4d9fdb46SRobert Mustacchi 
645*4d9fdb46SRobert Mustacchi     Returns DW_DLV_ERROR on error.  */
646*4d9fdb46SRobert Mustacchi int
_dwarf_get_abbrev_for_code(Dwarf_CU_Context cu_context,Dwarf_Unsigned code,Dwarf_Abbrev_List * list_out,Dwarf_Error * error)647*4d9fdb46SRobert Mustacchi _dwarf_get_abbrev_for_code(Dwarf_CU_Context cu_context,
648*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned code,
649*4d9fdb46SRobert Mustacchi     Dwarf_Abbrev_List *list_out,
650*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
651bc1f688bSRobert Mustacchi {
652bc1f688bSRobert Mustacchi     Dwarf_Debug dbg = cu_context->cc_dbg;
653*4d9fdb46SRobert Mustacchi     Dwarf_Hash_Table hash_table_base =
654*4d9fdb46SRobert Mustacchi         cu_context->cc_abbrev_hash_table;
655bc1f688bSRobert Mustacchi     Dwarf_Hash_Table_Entry entry_base = 0;
656bc1f688bSRobert Mustacchi     Dwarf_Hash_Table_Entry entry_cur = 0;
657*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned hash_num = 0;
658bc1f688bSRobert Mustacchi     Dwarf_Unsigned abbrev_code = 0;
659bc1f688bSRobert Mustacchi     Dwarf_Unsigned abbrev_tag  = 0;
660bc1f688bSRobert Mustacchi     Dwarf_Abbrev_List hash_abbrev_entry = 0;
661bc1f688bSRobert Mustacchi     Dwarf_Abbrev_List inner_list_entry = 0;
662bc1f688bSRobert Mustacchi     Dwarf_Hash_Table_Entry inner_hash_entry = 0;
663bc1f688bSRobert Mustacchi 
664bc1f688bSRobert Mustacchi     Dwarf_Byte_Ptr abbrev_ptr = 0;
665*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr end_abbrev_ptr = 0;
666*4d9fdb46SRobert Mustacchi     unsigned hashable_val = 0;
667bc1f688bSRobert Mustacchi 
668bc1f688bSRobert Mustacchi     if (!hash_table_base->tb_entries) {
669bc1f688bSRobert Mustacchi         hash_table_base->tb_table_entry_count =  HT_MULTIPLE;
670bc1f688bSRobert Mustacchi         hash_table_base->tb_total_abbrev_count= 0;
671*4d9fdb46SRobert Mustacchi         hash_table_base->tb_entries =
672*4d9fdb46SRobert Mustacchi             (struct  Dwarf_Hash_Table_Entry_s *)_dwarf_get_alloc(dbg,
673bc1f688bSRobert Mustacchi             DW_DLA_HASH_TABLE_ENTRY,
674bc1f688bSRobert Mustacchi             hash_table_base->tb_table_entry_count);
675bc1f688bSRobert Mustacchi         if (!hash_table_base->tb_entries) {
676*4d9fdb46SRobert Mustacchi             return DW_DLV_NO_ENTRY;
677bc1f688bSRobert Mustacchi         }
678bc1f688bSRobert Mustacchi     } else if (hash_table_base->tb_total_abbrev_count >
679bc1f688bSRobert Mustacchi         (hash_table_base->tb_table_entry_count * HT_MULTIPLE)) {
680bc1f688bSRobert Mustacchi         struct Dwarf_Hash_Table_s newht;
681bc1f688bSRobert Mustacchi 
682*4d9fdb46SRobert Mustacchi         memset(&newht,0,sizeof(newht));
683*4d9fdb46SRobert Mustacchi         /* Effectively multiplies by >= HT_MULTIPLE */
684*4d9fdb46SRobert Mustacchi         newht.tb_table_entry_count =
685*4d9fdb46SRobert Mustacchi             hash_table_base->tb_total_abbrev_count;
686*4d9fdb46SRobert Mustacchi         newht.tb_total_abbrev_count = 0;
687*4d9fdb46SRobert Mustacchi         newht.tb_entries =
688*4d9fdb46SRobert Mustacchi             (struct  Dwarf_Hash_Table_Entry_s *)
689*4d9fdb46SRobert Mustacchi             _dwarf_get_alloc(dbg, DW_DLA_HASH_TABLE_ENTRY,
690*4d9fdb46SRobert Mustacchi             newht.tb_table_entry_count);
691bc1f688bSRobert Mustacchi         if (!newht.tb_entries) {
692*4d9fdb46SRobert Mustacchi             return DW_DLV_NO_ENTRY;
693bc1f688bSRobert Mustacchi         }
694bc1f688bSRobert Mustacchi         /*  Copy the existing entries to the new table,
695*4d9fdb46SRobert Mustacchi             rehashing each.  */
696bc1f688bSRobert Mustacchi         copy_abbrev_table_to_new_table(hash_table_base, &newht);
697bc1f688bSRobert Mustacchi         /*  Dealloc only the entries hash table array, not the lists
698bc1f688bSRobert Mustacchi             of things pointed to by a hash table entry array. */
699*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, hash_table_base->tb_entries,
700*4d9fdb46SRobert Mustacchi             DW_DLA_HASH_TABLE_ENTRY);
701bc1f688bSRobert Mustacchi         hash_table_base->tb_entries = 0;
702bc1f688bSRobert Mustacchi         /*  Now overwrite the existing table descriptor with
703bc1f688bSRobert Mustacchi             the new, newly valid, contents. */
704bc1f688bSRobert Mustacchi         *hash_table_base = newht;
705bc1f688bSRobert Mustacchi     } /* Else is ok as is, add entry */
706bc1f688bSRobert Mustacchi 
707bc1f688bSRobert Mustacchi     hashable_val = code;
708bc1f688bSRobert Mustacchi     hash_num = hashable_val %
709bc1f688bSRobert Mustacchi         hash_table_base->tb_table_entry_count;
710bc1f688bSRobert Mustacchi     entry_base = hash_table_base->tb_entries;
711bc1f688bSRobert Mustacchi     entry_cur  = entry_base + hash_num;
712bc1f688bSRobert Mustacchi 
713bc1f688bSRobert Mustacchi     /* Determine if the 'code' is the list of synonyms already. */
714bc1f688bSRobert Mustacchi     for (hash_abbrev_entry = entry_cur->at_head;
715*4d9fdb46SRobert Mustacchi         hash_abbrev_entry != NULL && hash_abbrev_entry->abl_code != code;
716*4d9fdb46SRobert Mustacchi         hash_abbrev_entry = hash_abbrev_entry->abl_next);
717*4d9fdb46SRobert Mustacchi     if (hash_abbrev_entry) {
718*4d9fdb46SRobert Mustacchi         /*  This returns a pointer to an abbrev
719*4d9fdb46SRobert Mustacchi             list entry, not the list itself. */
720*4d9fdb46SRobert Mustacchi         *list_out = hash_abbrev_entry;
721*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
722bc1f688bSRobert Mustacchi     }
723bc1f688bSRobert Mustacchi 
724*4d9fdb46SRobert Mustacchi     if (cu_context->cc_last_abbrev_ptr) {
725*4d9fdb46SRobert Mustacchi         abbrev_ptr = cu_context->cc_last_abbrev_ptr;
726*4d9fdb46SRobert Mustacchi         end_abbrev_ptr = cu_context->cc_last_abbrev_endptr;
727*4d9fdb46SRobert Mustacchi     } else {
728*4d9fdb46SRobert Mustacchi         /*  This is ok because cc_abbrev_offset includes DWP
729*4d9fdb46SRobert Mustacchi             offset if appropriate. */
730*4d9fdb46SRobert Mustacchi         abbrev_ptr = dbg->de_debug_abbrev.dss_data +
731*4d9fdb46SRobert Mustacchi             cu_context->cc_abbrev_offset;
732bc1f688bSRobert Mustacchi 
733*4d9fdb46SRobert Mustacchi         if (cu_context->cc_dwp_offsets.pcu_type)  {
734*4d9fdb46SRobert Mustacchi             /*  In a DWP the abbrevs
735*4d9fdb46SRobert Mustacchi                 for this context are known quite precisely. */
736*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned size = 0;
737*4d9fdb46SRobert Mustacchi 
738*4d9fdb46SRobert Mustacchi             /*  Ignore the offset returned.
739*4d9fdb46SRobert Mustacchi                 Already in cc_abbrev_offset. */
740*4d9fdb46SRobert Mustacchi             _dwarf_get_dwp_extra_offset(
741*4d9fdb46SRobert Mustacchi                 &cu_context->cc_dwp_offsets,
742*4d9fdb46SRobert Mustacchi                 DW_SECT_ABBREV,&size);
743*4d9fdb46SRobert Mustacchi             /*  ASSERT: size != 0 */
744*4d9fdb46SRobert Mustacchi             end_abbrev_ptr = abbrev_ptr + size;
745*4d9fdb46SRobert Mustacchi         } else {
746*4d9fdb46SRobert Mustacchi             end_abbrev_ptr = dbg->de_debug_abbrev.dss_data +
747*4d9fdb46SRobert Mustacchi                 dbg->de_debug_abbrev.dss_size;
748*4d9fdb46SRobert Mustacchi         }
749*4d9fdb46SRobert Mustacchi     }
750*4d9fdb46SRobert Mustacchi 
751*4d9fdb46SRobert Mustacchi     /*  End of abbrev's as we are past the end entirely.
752*4d9fdb46SRobert Mustacchi         This can happen,though it seems wrong.
753*4d9fdb46SRobert Mustacchi         Or we are at the end of the data block,
754*4d9fdb46SRobert Mustacchi         which we also take as
755*4d9fdb46SRobert Mustacchi         meaning done with abbrevs for this CU.
756*4d9fdb46SRobert Mustacchi         An abbreviations table
757*4d9fdb46SRobert Mustacchi         is supposed to end with a zero byte.
758*4d9fdb46SRobert Mustacchi         Not ended by end of data block.
759*4d9fdb46SRobert Mustacchi         But we are allowing what is possibly a bit
760*4d9fdb46SRobert Mustacchi         more flexible end policy here. */
761*4d9fdb46SRobert Mustacchi     if (abbrev_ptr >= end_abbrev_ptr) {
762*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
763*4d9fdb46SRobert Mustacchi     }
764*4d9fdb46SRobert Mustacchi     /*  End of abbrev's for this cu, since abbrev code
765*4d9fdb46SRobert Mustacchi         is 0. */
766bc1f688bSRobert Mustacchi     if (*abbrev_ptr == 0) {
767*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
768bc1f688bSRobert Mustacchi     }
769bc1f688bSRobert Mustacchi 
770bc1f688bSRobert Mustacchi     do {
771*4d9fdb46SRobert Mustacchi         unsigned new_hashable_val = 0;
772*4d9fdb46SRobert Mustacchi         Dwarf_Off  abb_goff = 0;
773*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned atcount = 0;
774*4d9fdb46SRobert Mustacchi         Dwarf_Byte_Ptr abbrev_ptr2 = 0;
775*4d9fdb46SRobert Mustacchi         int res = 0;
776bc1f688bSRobert Mustacchi 
777*4d9fdb46SRobert Mustacchi         abb_goff = abbrev_ptr - dbg->de_debug_abbrev.dss_data;
778*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(abbrev_ptr, abbrev_code,
779*4d9fdb46SRobert Mustacchi             dbg,error,end_abbrev_ptr);
780*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(abbrev_ptr, abbrev_tag,
781*4d9fdb46SRobert Mustacchi             dbg,error,end_abbrev_ptr);
782*4d9fdb46SRobert Mustacchi         if (abbrev_tag > DW_TAG_hi_user) {
783*4d9fdb46SRobert Mustacchi             return _dwarf_format_TAG_err_msg(dbg,
784*4d9fdb46SRobert Mustacchi                 abbrev_tag,"DW_DLE_TAG_CORRUPT",
785*4d9fdb46SRobert Mustacchi                 error);
786*4d9fdb46SRobert Mustacchi         }
787*4d9fdb46SRobert Mustacchi         if (abbrev_ptr >= end_abbrev_ptr) {
788*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_ABBREV_OFF_END);
789*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
790*4d9fdb46SRobert Mustacchi         }
791bc1f688bSRobert Mustacchi         inner_list_entry = (Dwarf_Abbrev_List)
792*4d9fdb46SRobert Mustacchi             _dwarf_get_alloc(cu_context->cc_dbg,
793*4d9fdb46SRobert Mustacchi                 DW_DLA_ABBREV_LIST, 1);
794*4d9fdb46SRobert Mustacchi         if (inner_list_entry == NULL) {
795*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
796*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
797*4d9fdb46SRobert Mustacchi         }
798bc1f688bSRobert Mustacchi 
799bc1f688bSRobert Mustacchi         new_hashable_val = abbrev_code;
800bc1f688bSRobert Mustacchi         hash_num = new_hashable_val %
801bc1f688bSRobert Mustacchi             hash_table_base->tb_table_entry_count;
802bc1f688bSRobert Mustacchi         inner_hash_entry = entry_base + hash_num;
803bc1f688bSRobert Mustacchi         /* Move_entry_to_new_hash */
804*4d9fdb46SRobert Mustacchi         inner_list_entry->abl_next = inner_hash_entry->at_head;
805bc1f688bSRobert Mustacchi         inner_hash_entry->at_head = inner_list_entry;
806bc1f688bSRobert Mustacchi 
807bc1f688bSRobert Mustacchi         hash_table_base->tb_total_abbrev_count++;
808bc1f688bSRobert Mustacchi 
809*4d9fdb46SRobert Mustacchi         inner_list_entry->abl_code = abbrev_code;
810*4d9fdb46SRobert Mustacchi         inner_list_entry->abl_tag = abbrev_tag;
811*4d9fdb46SRobert Mustacchi         inner_list_entry->abl_has_child = *(abbrev_ptr++);
812*4d9fdb46SRobert Mustacchi         inner_list_entry->abl_abbrev_ptr = abbrev_ptr;
813*4d9fdb46SRobert Mustacchi         inner_list_entry->abl_goffset =  abb_goff;
814*4d9fdb46SRobert Mustacchi         hash_table_base->tb_total_abbrev_count++;
815bc1f688bSRobert Mustacchi 
816*4d9fdb46SRobert Mustacchi         /*  Cycle thru the abbrev content,
817*4d9fdb46SRobert Mustacchi             ignoring the content except
818bc1f688bSRobert Mustacchi             to find the end of the content. */
819*4d9fdb46SRobert Mustacchi         res = _dwarf_count_abbrev_entries(dbg,abbrev_ptr,
820*4d9fdb46SRobert Mustacchi             end_abbrev_ptr,&atcount,&abbrev_ptr2,error);
821*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
822*4d9fdb46SRobert Mustacchi             return res;
823*4d9fdb46SRobert Mustacchi         }
824*4d9fdb46SRobert Mustacchi         abbrev_ptr = abbrev_ptr2;
825*4d9fdb46SRobert Mustacchi         inner_list_entry->abl_count = atcount;
826*4d9fdb46SRobert Mustacchi     } while ((abbrev_ptr < end_abbrev_ptr) &&
827*4d9fdb46SRobert Mustacchi         *abbrev_ptr != 0 && abbrev_code != code);
828bc1f688bSRobert Mustacchi 
829bc1f688bSRobert Mustacchi     cu_context->cc_last_abbrev_ptr = abbrev_ptr;
830*4d9fdb46SRobert Mustacchi     cu_context->cc_last_abbrev_endptr = end_abbrev_ptr;
831*4d9fdb46SRobert Mustacchi     if(abbrev_code == code) {
832*4d9fdb46SRobert Mustacchi         *list_out = inner_list_entry;
833*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
834*4d9fdb46SRobert Mustacchi     }
835*4d9fdb46SRobert Mustacchi     /*  We cannot find an abbrev_code  matching code.
836*4d9fdb46SRobert Mustacchi         ERROR will be declared eventually.
837*4d9fdb46SRobert Mustacchi         Might be better to declare
838*4d9fdb46SRobert Mustacchi         specific errors here? */
839*4d9fdb46SRobert Mustacchi     return DW_DLV_NO_ENTRY;
840bc1f688bSRobert Mustacchi }
841bc1f688bSRobert Mustacchi 
842bc1f688bSRobert Mustacchi 
843*4d9fdb46SRobert Mustacchi /*
844*4d9fdb46SRobert Mustacchi     We check that:
845*4d9fdb46SRobert Mustacchi         areaptr <= strptr.
846*4d9fdb46SRobert Mustacchi         a NUL byte (*p) exists at p < end.
847*4d9fdb46SRobert Mustacchi     and return DW_DLV_ERROR if a check fails.
848*4d9fdb46SRobert Mustacchi 
849*4d9fdb46SRobert Mustacchi     de_assume_string_in_bounds
850bc1f688bSRobert Mustacchi */
851bc1f688bSRobert Mustacchi int
_dwarf_check_string_valid(Dwarf_Debug dbg,void * areaptr,void * strptr,void * areaendptr,int suggested_error,Dwarf_Error * error)852*4d9fdb46SRobert Mustacchi _dwarf_check_string_valid(Dwarf_Debug dbg,void *areaptr,
853*4d9fdb46SRobert Mustacchi     void *strptr, void *areaendptr,
854*4d9fdb46SRobert Mustacchi     int suggested_error,
855*4d9fdb46SRobert Mustacchi     Dwarf_Error*error)
856bc1f688bSRobert Mustacchi {
857*4d9fdb46SRobert Mustacchi     Dwarf_Small *start = areaptr;
858*4d9fdb46SRobert Mustacchi     Dwarf_Small *p = strptr;
859*4d9fdb46SRobert Mustacchi     Dwarf_Small *end = areaendptr;
860bc1f688bSRobert Mustacchi 
861*4d9fdb46SRobert Mustacchi     if (p < start) {
862*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,suggested_error);
863*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
864*4d9fdb46SRobert Mustacchi     }
865*4d9fdb46SRobert Mustacchi     if (p >= end) {
866*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,suggested_error);
867*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
868*4d9fdb46SRobert Mustacchi     }
869*4d9fdb46SRobert Mustacchi     if (dbg->de_assume_string_in_bounds) {
870*4d9fdb46SRobert Mustacchi         /* This NOT the default. But folks can choose
871*4d9fdb46SRobert Mustacchi             to live dangerously and just assume strings ok. */
872*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
873*4d9fdb46SRobert Mustacchi     }
874*4d9fdb46SRobert Mustacchi     while (p < end) {
875*4d9fdb46SRobert Mustacchi         if (*p == 0) {
876*4d9fdb46SRobert Mustacchi             return DW_DLV_OK;
877*4d9fdb46SRobert Mustacchi         }
878*4d9fdb46SRobert Mustacchi         ++p;
879*4d9fdb46SRobert Mustacchi     }
880*4d9fdb46SRobert Mustacchi     _dwarf_error(dbg,error,DW_DLE_STRING_NOT_TERMINATED);
881*4d9fdb46SRobert Mustacchi     return DW_DLV_ERROR;
882*4d9fdb46SRobert Mustacchi }
883bc1f688bSRobert Mustacchi 
884*4d9fdb46SRobert Mustacchi 
885*4d9fdb46SRobert Mustacchi /*  Return non-zero if the start/end are not valid for the
886*4d9fdb46SRobert Mustacchi     die's section.
887*4d9fdb46SRobert Mustacchi     If pastend matches the dss_data+dss_size then
888*4d9fdb46SRobert Mustacchi     pastend is a pointer that cannot be dereferenced.
889*4d9fdb46SRobert Mustacchi     But we allow it as valid here, it is normal for
890*4d9fdb46SRobert Mustacchi     a pointer to point one-past-end in
891*4d9fdb46SRobert Mustacchi     various circumstances (one must
892*4d9fdb46SRobert Mustacchi     avoid dereferencing it, of course).
893*4d9fdb46SRobert Mustacchi     Return 0 if valid. Return 1 if invalid. */
894*4d9fdb46SRobert Mustacchi int
_dwarf_reference_outside_section(Dwarf_Die die,Dwarf_Small * startaddr,Dwarf_Small * pastend)895*4d9fdb46SRobert Mustacchi _dwarf_reference_outside_section(Dwarf_Die die,
896*4d9fdb46SRobert Mustacchi     Dwarf_Small * startaddr,
897*4d9fdb46SRobert Mustacchi     Dwarf_Small * pastend)
898*4d9fdb46SRobert Mustacchi {
899*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
900*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context contxt = 0;
901*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s *sec = 0;
902*4d9fdb46SRobert Mustacchi 
903*4d9fdb46SRobert Mustacchi     contxt = die->di_cu_context;
904*4d9fdb46SRobert Mustacchi     dbg = contxt->cc_dbg;
905*4d9fdb46SRobert Mustacchi     if (die->di_is_info) {
906*4d9fdb46SRobert Mustacchi         sec = &dbg->de_debug_info;
907*4d9fdb46SRobert Mustacchi     } else {
908*4d9fdb46SRobert Mustacchi         sec = &dbg->de_debug_types;
909bc1f688bSRobert Mustacchi     }
910*4d9fdb46SRobert Mustacchi     if (startaddr < sec->dss_data) {
911*4d9fdb46SRobert Mustacchi         return 1;
912bc1f688bSRobert Mustacchi     }
913*4d9fdb46SRobert Mustacchi     if (pastend > (sec->dss_data + sec->dss_size)) {
914*4d9fdb46SRobert Mustacchi         return 1;
915bc1f688bSRobert Mustacchi     }
916*4d9fdb46SRobert Mustacchi     return 0;
917*4d9fdb46SRobert Mustacchi }
918*4d9fdb46SRobert Mustacchi 
919bc1f688bSRobert Mustacchi 
920bc1f688bSRobert Mustacchi /*
921bc1f688bSRobert Mustacchi   A byte-swapping version of memcpy
922bc1f688bSRobert Mustacchi   for cross-endian use.
923bc1f688bSRobert Mustacchi   Only 2,4,8 should be lengths passed in.
924bc1f688bSRobert Mustacchi */
925*4d9fdb46SRobert Mustacchi void
_dwarf_memcpy_noswap_bytes(void * s1,const void * s2,unsigned long len)926*4d9fdb46SRobert Mustacchi _dwarf_memcpy_noswap_bytes(void *s1, const void *s2, unsigned long len)
927bc1f688bSRobert Mustacchi {
928*4d9fdb46SRobert Mustacchi     memcpy(s1,s2,(size_t)len);
929*4d9fdb46SRobert Mustacchi     return;
930*4d9fdb46SRobert Mustacchi }
931*4d9fdb46SRobert Mustacchi void
_dwarf_memcpy_swap_bytes(void * s1,const void * s2,unsigned long len)932*4d9fdb46SRobert Mustacchi _dwarf_memcpy_swap_bytes(void *s1, const void *s2, unsigned long len)
933*4d9fdb46SRobert Mustacchi {
934bc1f688bSRobert Mustacchi     unsigned char *targ = (unsigned char *) s1;
935*4d9fdb46SRobert Mustacchi     const unsigned char *src = (const unsigned char *) s2;
936bc1f688bSRobert Mustacchi 
937bc1f688bSRobert Mustacchi     if (len == 4) {
938bc1f688bSRobert Mustacchi         targ[3] = src[0];
939bc1f688bSRobert Mustacchi         targ[2] = src[1];
940bc1f688bSRobert Mustacchi         targ[1] = src[2];
941bc1f688bSRobert Mustacchi         targ[0] = src[3];
942bc1f688bSRobert Mustacchi     } else if (len == 8) {
943bc1f688bSRobert Mustacchi         targ[7] = src[0];
944bc1f688bSRobert Mustacchi         targ[6] = src[1];
945bc1f688bSRobert Mustacchi         targ[5] = src[2];
946bc1f688bSRobert Mustacchi         targ[4] = src[3];
947bc1f688bSRobert Mustacchi         targ[3] = src[4];
948bc1f688bSRobert Mustacchi         targ[2] = src[5];
949bc1f688bSRobert Mustacchi         targ[1] = src[6];
950bc1f688bSRobert Mustacchi         targ[0] = src[7];
951bc1f688bSRobert Mustacchi     } else if (len == 2) {
952bc1f688bSRobert Mustacchi         targ[1] = src[0];
953bc1f688bSRobert Mustacchi         targ[0] = src[1];
954bc1f688bSRobert Mustacchi     }
955bc1f688bSRobert Mustacchi /* should NOT get below here: is not the intended use */
956bc1f688bSRobert Mustacchi     else if (len == 1) {
957bc1f688bSRobert Mustacchi         targ[0] = src[0];
958bc1f688bSRobert Mustacchi     } else {
959*4d9fdb46SRobert Mustacchi         memcpy(s1, s2, (size_t)len);
960bc1f688bSRobert Mustacchi     }
961*4d9fdb46SRobert Mustacchi     return;
962bc1f688bSRobert Mustacchi }
963bc1f688bSRobert Mustacchi 
964bc1f688bSRobert Mustacchi 
965*4d9fdb46SRobert Mustacchi /*  This calculation used to be sprinkled all over.
966bc1f688bSRobert Mustacchi     Now brought to one place.
967bc1f688bSRobert Mustacchi 
968bc1f688bSRobert Mustacchi     We try to accurately compute the size of a cu header
969*4d9fdb46SRobert Mustacchi     given a known cu header location ( an offset in .debug_info
970*4d9fdb46SRobert Mustacchi     or debug_types).  */
971bc1f688bSRobert Mustacchi /* ARGSUSED */
972*4d9fdb46SRobert Mustacchi 
973*4d9fdb46SRobert Mustacchi int
_dwarf_length_of_cu_header(Dwarf_Debug dbg,Dwarf_Unsigned offset,Dwarf_Bool is_info,Dwarf_Unsigned * area_length_out,Dwarf_Error * error)974*4d9fdb46SRobert Mustacchi _dwarf_length_of_cu_header(Dwarf_Debug dbg,
975*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset,
976*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_info,
977*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *area_length_out,
978*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
979bc1f688bSRobert Mustacchi {
980bc1f688bSRobert Mustacchi     int local_length_size = 0;
981bc1f688bSRobert Mustacchi     int local_extension_size = 0;
982*4d9fdb46SRobert Mustacchi     Dwarf_Half version = 0;
983bc1f688bSRobert Mustacchi     Dwarf_Unsigned length = 0;
984*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned final_size = 0;
985*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_start =
986*4d9fdb46SRobert Mustacchi         is_info? dbg->de_debug_info.dss_data:
987*4d9fdb46SRobert Mustacchi             dbg->de_debug_types.dss_data;
988*4d9fdb46SRobert Mustacchi     Dwarf_Small *cuptr = section_start + offset;
989*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned section_length =
990*4d9fdb46SRobert Mustacchi         is_info? dbg->de_debug_info.dss_size:
991*4d9fdb46SRobert Mustacchi             dbg->de_debug_types.dss_size;
992*4d9fdb46SRobert Mustacchi     Dwarf_Small * section_end_ptr =
993*4d9fdb46SRobert Mustacchi         section_start + section_length;
994bc1f688bSRobert Mustacchi 
995*4d9fdb46SRobert Mustacchi     READ_AREA_LENGTH_CK(dbg, length, Dwarf_Unsigned,
996*4d9fdb46SRobert Mustacchi         cuptr, local_length_size, local_extension_size,
997*4d9fdb46SRobert Mustacchi         error,section_length,section_end_ptr);
998bc1f688bSRobert Mustacchi 
999*4d9fdb46SRobert Mustacchi     READ_UNALIGNED_CK(dbg, version, Dwarf_Half,
1000*4d9fdb46SRobert Mustacchi         cuptr, DWARF_HALF_SIZE,error,section_end_ptr);
1001*4d9fdb46SRobert Mustacchi     cuptr += DWARF_HALF_SIZE;
1002*4d9fdb46SRobert Mustacchi     if (version == 5) {
1003*4d9fdb46SRobert Mustacchi         Dwarf_Ubyte unit_type = 0;
1004*4d9fdb46SRobert Mustacchi 
1005*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, unit_type, Dwarf_Ubyte,
1006*4d9fdb46SRobert Mustacchi             cuptr, sizeof(Dwarf_Ubyte),error,section_end_ptr);
1007*4d9fdb46SRobert Mustacchi         switch (unit_type) {
1008*4d9fdb46SRobert Mustacchi         case DW_UT_compile:
1009*4d9fdb46SRobert Mustacchi             final_size = local_extension_size +
1010bc1f688bSRobert Mustacchi                 local_length_size  + /* Size of cu length field. */
1011*4d9fdb46SRobert Mustacchi                 DWARF_HALF_SIZE + /* Size of version stamp field. */
1012*4d9fdb46SRobert Mustacchi                 sizeof(Dwarf_Small)+ /* Size of  unit type field. */
1013*4d9fdb46SRobert Mustacchi                 sizeof(Dwarf_Small)+ /* Size of address size field. */
1014*4d9fdb46SRobert Mustacchi                 local_length_size ;  /* Size of abbrev offset field. */
1015*4d9fdb46SRobert Mustacchi             break;
1016*4d9fdb46SRobert Mustacchi         case DW_UT_type:
1017*4d9fdb46SRobert Mustacchi         case DW_UT_partial:
1018*4d9fdb46SRobert Mustacchi         case DW_UT_skeleton:
1019*4d9fdb46SRobert Mustacchi         case DW_UT_split_compile:
1020*4d9fdb46SRobert Mustacchi         case DW_UT_split_type:
1021*4d9fdb46SRobert Mustacchi         default:
1022*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_UNIT_TYPE_NOT_HANDLED);
1023*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
1024*4d9fdb46SRobert Mustacchi         }
1025*4d9fdb46SRobert Mustacchi     } else if (version == 4) {
1026*4d9fdb46SRobert Mustacchi         final_size = local_extension_size +
1027*4d9fdb46SRobert Mustacchi             local_length_size  +  /* Size of cu length field. */
1028*4d9fdb46SRobert Mustacchi             DWARF_HALF_SIZE +  /* Size of version stamp field. */
1029bc1f688bSRobert Mustacchi             local_length_size  +  /* Size of abbrev offset field. */
1030bc1f688bSRobert Mustacchi             sizeof(Dwarf_Small);  /* Size of address size field. */
1031*4d9fdb46SRobert Mustacchi         if (!is_info) {
1032*4d9fdb46SRobert Mustacchi             final_size +=
1033*4d9fdb46SRobert Mustacchi             /* type signature size */
1034*4d9fdb46SRobert Mustacchi             sizeof (Dwarf_Sig8) +
1035*4d9fdb46SRobert Mustacchi             /* type offset size */
1036*4d9fdb46SRobert Mustacchi             local_length_size;
1037*4d9fdb46SRobert Mustacchi         }
1038*4d9fdb46SRobert Mustacchi     } else if (version < 4) {
1039*4d9fdb46SRobert Mustacchi         final_size = local_extension_size +
1040*4d9fdb46SRobert Mustacchi             local_length_size  +
1041*4d9fdb46SRobert Mustacchi             DWARF_HALF_SIZE +
1042*4d9fdb46SRobert Mustacchi             local_length_size  +
1043*4d9fdb46SRobert Mustacchi             sizeof(Dwarf_Small);  /* Size of address size field. */
1044bc1f688bSRobert Mustacchi     }
1045bc1f688bSRobert Mustacchi 
1046*4d9fdb46SRobert Mustacchi     *area_length_out = final_size;
1047*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1048*4d9fdb46SRobert Mustacchi }
1049*4d9fdb46SRobert Mustacchi 
1050*4d9fdb46SRobert Mustacchi /*  Pretend we know nothing about the CU
1051*4d9fdb46SRobert Mustacchi     and just roughly compute the result.  */
1052bc1f688bSRobert Mustacchi Dwarf_Unsigned
_dwarf_length_of_cu_header_simple(Dwarf_Debug dbg,Dwarf_Bool dinfo)1053*4d9fdb46SRobert Mustacchi _dwarf_length_of_cu_header_simple(Dwarf_Debug dbg,
1054*4d9fdb46SRobert Mustacchi     Dwarf_Bool dinfo)
1055bc1f688bSRobert Mustacchi {
1056*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned finalsize = 0;
1057*4d9fdb46SRobert Mustacchi     finalsize =  dbg->de_length_size + /* Size of cu length field. */
1058*4d9fdb46SRobert Mustacchi         DWARF_HALF_SIZE +    /* Size of version stamp field. */
1059bc1f688bSRobert Mustacchi         dbg->de_length_size +   /* Size of abbrev offset field. */
1060bc1f688bSRobert Mustacchi         sizeof(Dwarf_Small);    /* Size of address size field. */
1061*4d9fdb46SRobert Mustacchi     if (!dinfo) {
1062*4d9fdb46SRobert Mustacchi         finalsize +=
1063*4d9fdb46SRobert Mustacchi             /* type signature size */
1064*4d9fdb46SRobert Mustacchi             sizeof (Dwarf_Sig8) +
1065*4d9fdb46SRobert Mustacchi             /* type offset size */
1066*4d9fdb46SRobert Mustacchi             dbg->de_length_size;
1067*4d9fdb46SRobert Mustacchi     }
1068*4d9fdb46SRobert Mustacchi     return finalsize;
1069bc1f688bSRobert Mustacchi }
1070bc1f688bSRobert Mustacchi 
1071bc1f688bSRobert Mustacchi /*  Now that we delay loading .debug_info, we need to do the
1072bc1f688bSRobert Mustacchi     load in more places. So putting the load
1073bc1f688bSRobert Mustacchi     code in one place now instead of replicating it in multiple
1074*4d9fdb46SRobert Mustacchi     places.  */
1075bc1f688bSRobert Mustacchi int
_dwarf_load_debug_info(Dwarf_Debug dbg,Dwarf_Error * error)1076bc1f688bSRobert Mustacchi _dwarf_load_debug_info(Dwarf_Debug dbg, Dwarf_Error * error)
1077bc1f688bSRobert Mustacchi {
1078bc1f688bSRobert Mustacchi     int res = DW_DLV_ERROR;
1079bc1f688bSRobert Mustacchi     if (dbg->de_debug_info.dss_data) {
1080bc1f688bSRobert Mustacchi         return DW_DLV_OK;
1081bc1f688bSRobert Mustacchi     }
1082bc1f688bSRobert Mustacchi     res = _dwarf_load_section(dbg, &dbg->de_debug_abbrev,error);
1083bc1f688bSRobert Mustacchi     if (res != DW_DLV_OK) {
1084bc1f688bSRobert Mustacchi         return res;
1085bc1f688bSRobert Mustacchi     }
1086bc1f688bSRobert Mustacchi     res = _dwarf_load_section(dbg, &dbg->de_debug_info, error);
1087*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1088bc1f688bSRobert Mustacchi         return res;
1089*4d9fdb46SRobert Mustacchi     }
1090*4d9fdb46SRobert Mustacchi     /*  debug_info won't be meaningful without
1091*4d9fdb46SRobert Mustacchi         .debug_rnglists and .debug_rnglists if there
1092*4d9fdb46SRobert Mustacchi         is one or both such sections. */
1093*4d9fdb46SRobert Mustacchi     res = dwarf_load_rnglists(dbg,0,error);
1094*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_ERROR) {
1095*4d9fdb46SRobert Mustacchi         return res;
1096*4d9fdb46SRobert Mustacchi     }
1097*4d9fdb46SRobert Mustacchi     res = dwarf_load_loclists(dbg,0,error);
1098*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_ERROR) {
1099*4d9fdb46SRobert Mustacchi         return res;
1100*4d9fdb46SRobert Mustacchi     }
1101*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1102*4d9fdb46SRobert Mustacchi }
1103*4d9fdb46SRobert Mustacchi int
_dwarf_load_debug_types(Dwarf_Debug dbg,Dwarf_Error * error)1104*4d9fdb46SRobert Mustacchi _dwarf_load_debug_types(Dwarf_Debug dbg, Dwarf_Error * error)
1105*4d9fdb46SRobert Mustacchi {
1106*4d9fdb46SRobert Mustacchi     int res = DW_DLV_ERROR;
1107*4d9fdb46SRobert Mustacchi     if (dbg->de_debug_types.dss_data) {
1108*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
1109*4d9fdb46SRobert Mustacchi     }
1110*4d9fdb46SRobert Mustacchi     res = _dwarf_load_section(dbg, &dbg->de_debug_abbrev,error);
1111*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1112*4d9fdb46SRobert Mustacchi         return res;
1113*4d9fdb46SRobert Mustacchi     }
1114*4d9fdb46SRobert Mustacchi     res = _dwarf_load_section(dbg, &dbg->de_debug_types, error);
1115*4d9fdb46SRobert Mustacchi     return res;
1116bc1f688bSRobert Mustacchi }
1117bc1f688bSRobert Mustacchi void
_dwarf_free_abbrev_hash_table_contents(Dwarf_Debug dbg,Dwarf_Hash_Table hash_table)1118*4d9fdb46SRobert Mustacchi _dwarf_free_abbrev_hash_table_contents(Dwarf_Debug dbg,
1119*4d9fdb46SRobert Mustacchi     Dwarf_Hash_Table hash_table)
1120bc1f688bSRobert Mustacchi {
1121bc1f688bSRobert Mustacchi     /*  A Hash Table is an array with tb_table_entry_count struct
1122bc1f688bSRobert Mustacchi         Dwarf_Hash_Table_s entries in the array. */
1123*4d9fdb46SRobert Mustacchi     unsigned hashnum = 0;
1124*4d9fdb46SRobert Mustacchi     if(!hash_table) {
1125*4d9fdb46SRobert Mustacchi         /*  Not fully set up yet. There is nothing to do. */
1126*4d9fdb46SRobert Mustacchi         return;
1127*4d9fdb46SRobert Mustacchi     }
1128*4d9fdb46SRobert Mustacchi     if (!hash_table->tb_entries) {
1129*4d9fdb46SRobert Mustacchi         /*  Not fully set up yet. There is nothing to do. */
1130*4d9fdb46SRobert Mustacchi         return;
1131*4d9fdb46SRobert Mustacchi     }
1132bc1f688bSRobert Mustacchi     for (; hashnum < hash_table->tb_table_entry_count; ++hashnum) {
1133bc1f688bSRobert Mustacchi         struct Dwarf_Abbrev_List_s *abbrev = 0;
1134bc1f688bSRobert Mustacchi         struct Dwarf_Abbrev_List_s *nextabbrev = 0;
1135*4d9fdb46SRobert Mustacchi         struct  Dwarf_Hash_Table_Entry_s *tb =
1136*4d9fdb46SRobert Mustacchi             &hash_table->tb_entries[hashnum];
1137bc1f688bSRobert Mustacchi 
1138bc1f688bSRobert Mustacchi         abbrev = tb->at_head;
1139bc1f688bSRobert Mustacchi         for (; abbrev; abbrev = nextabbrev) {
1140*4d9fdb46SRobert Mustacchi             nextabbrev = abbrev->abl_next;
1141*4d9fdb46SRobert Mustacchi             abbrev->abl_next = 0;
1142bc1f688bSRobert Mustacchi             dwarf_dealloc(dbg, abbrev, DW_DLA_ABBREV_LIST);
1143bc1f688bSRobert Mustacchi         }
1144*4d9fdb46SRobert Mustacchi         tb->at_head = 0;
1145bc1f688bSRobert Mustacchi     }
1146bc1f688bSRobert Mustacchi     /* Frees all the entries at once: an array. */
1147bc1f688bSRobert Mustacchi     dwarf_dealloc(dbg,hash_table->tb_entries,DW_DLA_HASH_TABLE_ENTRY);
1148*4d9fdb46SRobert Mustacchi     hash_table->tb_entries = 0;
1149bc1f688bSRobert Mustacchi }
1150bc1f688bSRobert Mustacchi 
1151bc1f688bSRobert Mustacchi /*
1152bc1f688bSRobert Mustacchi     If no die provided the size value returned might be wrong.
1153bc1f688bSRobert Mustacchi     If different compilation units have different address sizes
1154bc1f688bSRobert Mustacchi     this may not give the correct value in all contexts if the die
1155bc1f688bSRobert Mustacchi     pointer is NULL.
1156bc1f688bSRobert Mustacchi     If the Elf offset size != address_size
1157bc1f688bSRobert Mustacchi     (for example if address_size = 4 but recorded in elf64 object)
1158bc1f688bSRobert Mustacchi     this may not give the correct value in all contexts if the die
1159bc1f688bSRobert Mustacchi     pointer is NULL.
1160bc1f688bSRobert Mustacchi     If the die pointer is non-NULL (in which case it must point to
1161bc1f688bSRobert Mustacchi     a valid DIE) this will return the correct size.
1162bc1f688bSRobert Mustacchi */
1163bc1f688bSRobert Mustacchi int
_dwarf_get_address_size(Dwarf_Debug dbg,Dwarf_Die die)1164bc1f688bSRobert Mustacchi _dwarf_get_address_size(Dwarf_Debug dbg, Dwarf_Die die)
1165bc1f688bSRobert Mustacchi {
1166bc1f688bSRobert Mustacchi     Dwarf_CU_Context context = 0;
1167bc1f688bSRobert Mustacchi     Dwarf_Half addrsize = 0;
1168bc1f688bSRobert Mustacchi     if (!die) {
1169bc1f688bSRobert Mustacchi         return dbg->de_pointer_size;
1170bc1f688bSRobert Mustacchi     }
1171bc1f688bSRobert Mustacchi     context = die->di_cu_context;
1172bc1f688bSRobert Mustacchi     addrsize = context->cc_address_size;
1173bc1f688bSRobert Mustacchi     return addrsize;
1174bc1f688bSRobert Mustacchi }
1175bc1f688bSRobert Mustacchi 
1176*4d9fdb46SRobert Mustacchi /* Encode val as an unsigned LEB128. */
dwarf_encode_leb128(Dwarf_Unsigned val,int * nbytes,char * space,int splen)1177*4d9fdb46SRobert Mustacchi int dwarf_encode_leb128(Dwarf_Unsigned val, int *nbytes,
1178*4d9fdb46SRobert Mustacchi     char *space, int splen)
1179*4d9fdb46SRobert Mustacchi {
1180*4d9fdb46SRobert Mustacchi     /* Encode val as an unsigned LEB128. */
1181*4d9fdb46SRobert Mustacchi     return _dwarf_pro_encode_leb128_nm(val,nbytes,space,splen);
1182*4d9fdb46SRobert Mustacchi }
1183*4d9fdb46SRobert Mustacchi 
1184*4d9fdb46SRobert Mustacchi /* Encode val as a signed LEB128. */
dwarf_encode_signed_leb128(Dwarf_Signed val,int * nbytes,char * space,int splen)1185*4d9fdb46SRobert Mustacchi int dwarf_encode_signed_leb128(Dwarf_Signed val, int *nbytes,
1186*4d9fdb46SRobert Mustacchi     char *space, int splen)
1187*4d9fdb46SRobert Mustacchi {
1188*4d9fdb46SRobert Mustacchi     /* Encode val as a signed LEB128. */
1189*4d9fdb46SRobert Mustacchi     return _dwarf_pro_encode_signed_leb128_nm(val,nbytes,space,splen);
1190*4d9fdb46SRobert Mustacchi }
1191bc1f688bSRobert Mustacchi 
1192bc1f688bSRobert Mustacchi 
1193*4d9fdb46SRobert Mustacchi struct  Dwarf_Printf_Callback_Info_s
dwarf_register_printf_callback(Dwarf_Debug dbg,struct Dwarf_Printf_Callback_Info_s * newvalues)1194*4d9fdb46SRobert Mustacchi dwarf_register_printf_callback( Dwarf_Debug dbg,
1195*4d9fdb46SRobert Mustacchi     struct  Dwarf_Printf_Callback_Info_s * newvalues)
1196*4d9fdb46SRobert Mustacchi {
1197*4d9fdb46SRobert Mustacchi     struct  Dwarf_Printf_Callback_Info_s oldval = dbg->de_printf_callback;
1198*4d9fdb46SRobert Mustacchi     if (!newvalues) {
1199*4d9fdb46SRobert Mustacchi         return oldval;
1200*4d9fdb46SRobert Mustacchi     }
1201*4d9fdb46SRobert Mustacchi     if( newvalues->dp_buffer_user_provided) {
1202*4d9fdb46SRobert Mustacchi         if( oldval.dp_buffer_user_provided) {
1203*4d9fdb46SRobert Mustacchi             /* User continues to control the buffer. */
1204*4d9fdb46SRobert Mustacchi             dbg->de_printf_callback = *newvalues;
1205*4d9fdb46SRobert Mustacchi         }else {
1206*4d9fdb46SRobert Mustacchi             /*  Switch from our control of buffer to user
1207*4d9fdb46SRobert Mustacchi                 control.  */
1208*4d9fdb46SRobert Mustacchi             free(oldval.dp_buffer);
1209*4d9fdb46SRobert Mustacchi             oldval.dp_buffer = 0;
1210*4d9fdb46SRobert Mustacchi             dbg->de_printf_callback = *newvalues;
1211*4d9fdb46SRobert Mustacchi         }
1212*4d9fdb46SRobert Mustacchi     } else if (oldval.dp_buffer_user_provided){
1213*4d9fdb46SRobert Mustacchi         /* Switch from user control to our control */
1214*4d9fdb46SRobert Mustacchi         dbg->de_printf_callback = *newvalues;
1215*4d9fdb46SRobert Mustacchi         dbg->de_printf_callback.dp_buffer_len = 0;
1216*4d9fdb46SRobert Mustacchi         dbg->de_printf_callback.dp_buffer= 0;
1217*4d9fdb46SRobert Mustacchi     } else {
1218*4d9fdb46SRobert Mustacchi         /* User does not control the buffer. */
1219*4d9fdb46SRobert Mustacchi         dbg->de_printf_callback = *newvalues;
1220*4d9fdb46SRobert Mustacchi         dbg->de_printf_callback.dp_buffer_len =
1221*4d9fdb46SRobert Mustacchi             oldval.dp_buffer_len;
1222*4d9fdb46SRobert Mustacchi         dbg->de_printf_callback.dp_buffer =
1223*4d9fdb46SRobert Mustacchi             oldval.dp_buffer;
1224*4d9fdb46SRobert Mustacchi     }
1225*4d9fdb46SRobert Mustacchi     return oldval;
1226*4d9fdb46SRobert Mustacchi }
1227*4d9fdb46SRobert Mustacchi 
1228*4d9fdb46SRobert Mustacchi 
1229*4d9fdb46SRobert Mustacchi 
1230*4d9fdb46SRobert Mustacchi /* No varargs required */
1231*4d9fdb46SRobert Mustacchi int
_dwarf_printf(Dwarf_Debug dbg,const char * data)1232*4d9fdb46SRobert Mustacchi _dwarf_printf(Dwarf_Debug dbg,
1233*4d9fdb46SRobert Mustacchi     const char * data)
1234*4d9fdb46SRobert Mustacchi {
1235*4d9fdb46SRobert Mustacchi     int nlen = 0;
1236*4d9fdb46SRobert Mustacchi     struct Dwarf_Printf_Callback_Info_s *bufdata =
1237*4d9fdb46SRobert Mustacchi         &dbg->de_printf_callback;
1238*4d9fdb46SRobert Mustacchi 
1239*4d9fdb46SRobert Mustacchi     dwarf_printf_callback_function_type func = bufdata->dp_fptr;
1240*4d9fdb46SRobert Mustacchi     if (!func) {
1241*4d9fdb46SRobert Mustacchi         return 0;
1242*4d9fdb46SRobert Mustacchi     }
1243*4d9fdb46SRobert Mustacchi     nlen =  strlen(data);
1244*4d9fdb46SRobert Mustacchi     func(bufdata->dp_user_pointer,data);
1245*4d9fdb46SRobert Mustacchi     return nlen;
1246*4d9fdb46SRobert Mustacchi }
1247*4d9fdb46SRobert Mustacchi 
1248*4d9fdb46SRobert Mustacchi /*  Often errs and errt point to the same Dwarf_Error,
1249*4d9fdb46SRobert Mustacchi     So exercise care.
1250*4d9fdb46SRobert Mustacchi     All the arguments MUST be non-null.*/
1251*4d9fdb46SRobert Mustacchi void
_dwarf_error_mv_s_to_t(Dwarf_Debug dbgs,Dwarf_Error * errs,Dwarf_Debug dbgt,Dwarf_Error * errt)1252*4d9fdb46SRobert Mustacchi _dwarf_error_mv_s_to_t(Dwarf_Debug dbgs,Dwarf_Error *errs,
1253*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbgt,Dwarf_Error *errt)
1254*4d9fdb46SRobert Mustacchi {
1255*4d9fdb46SRobert Mustacchi     if (!errt || !errs) {
1256*4d9fdb46SRobert Mustacchi         return;
1257*4d9fdb46SRobert Mustacchi     }
1258*4d9fdb46SRobert Mustacchi     if (!dbgs || !dbgt) {
1259*4d9fdb46SRobert Mustacchi         return;
1260*4d9fdb46SRobert Mustacchi     }
1261*4d9fdb46SRobert Mustacchi     if(dbgs == dbgt) {
1262*4d9fdb46SRobert Mustacchi         if(errs != errt) {
1263*4d9fdb46SRobert Mustacchi             Dwarf_Error ers = *errs;
1264*4d9fdb46SRobert Mustacchi             *errs = 0;
1265*4d9fdb46SRobert Mustacchi             *errt = ers;
1266*4d9fdb46SRobert Mustacchi         }
1267*4d9fdb46SRobert Mustacchi     } else {
1268*4d9fdb46SRobert Mustacchi         /*  Do not stomp on the system errno
1269*4d9fdb46SRobert Mustacchi             variable if there is one! */
1270*4d9fdb46SRobert Mustacchi         int mydw_errno = dwarf_errno(*errs);
1271*4d9fdb46SRobert Mustacchi 
1272*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbgs,*errs, DW_DLA_ERROR);
1273*4d9fdb46SRobert Mustacchi         *errs = 0;
1274*4d9fdb46SRobert Mustacchi         _dwarf_error(dbgt,errt, mydw_errno);
1275*4d9fdb46SRobert Mustacchi     }
1276*4d9fdb46SRobert Mustacchi }
1277*4d9fdb46SRobert Mustacchi 
1278*4d9fdb46SRobert Mustacchi static int
inthissection(struct Dwarf_Section_s * sec,Dwarf_Small * ptr)1279*4d9fdb46SRobert Mustacchi inthissection(struct Dwarf_Section_s *sec,Dwarf_Small *ptr)
1280*4d9fdb46SRobert Mustacchi {
1281*4d9fdb46SRobert Mustacchi     if (!sec->dss_data) {
1282*4d9fdb46SRobert Mustacchi         return FALSE;
1283*4d9fdb46SRobert Mustacchi     }
1284*4d9fdb46SRobert Mustacchi     if (ptr < sec->dss_data ) {
1285*4d9fdb46SRobert Mustacchi         return FALSE;
1286*4d9fdb46SRobert Mustacchi     }
1287*4d9fdb46SRobert Mustacchi     if (ptr >= (sec->dss_data + sec->dss_size) ) {
1288*4d9fdb46SRobert Mustacchi         return FALSE;
1289*4d9fdb46SRobert Mustacchi     }
1290*4d9fdb46SRobert Mustacchi     return TRUE;
1291*4d9fdb46SRobert Mustacchi }
1292*4d9fdb46SRobert Mustacchi 
1293*4d9fdb46SRobert Mustacchi #define FINDSEC(m_s,m_p,n,st,l,e)    \
1294*4d9fdb46SRobert Mustacchi do {                                 \
1295*4d9fdb46SRobert Mustacchi     if (inthissection((m_s),(m_p))) { \
1296*4d9fdb46SRobert Mustacchi         *(n) = (m_s)->dss_name;      \
1297*4d9fdb46SRobert Mustacchi         *(st)= (m_s)->dss_data;      \
1298*4d9fdb46SRobert Mustacchi         *(l) = (m_s)->dss_size;      \
1299*4d9fdb46SRobert Mustacchi         *(e) = (m_s)->dss_data + (m_s)->dss_size; \
1300*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;            \
1301*4d9fdb46SRobert Mustacchi     }                                \
1302*4d9fdb46SRobert Mustacchi } while (0)
1303*4d9fdb46SRobert Mustacchi 
1304*4d9fdb46SRobert Mustacchi 
1305*4d9fdb46SRobert Mustacchi /* So we can know a section end even when we do not
1306*4d9fdb46SRobert Mustacchi     have the section info apriori  It's only
1307*4d9fdb46SRobert Mustacchi     needed for a subset of sections. */
1308*4d9fdb46SRobert Mustacchi int
_dwarf_what_section_are_we(Dwarf_Debug dbg,Dwarf_Small * our_pointer,const char ** section_name_out,Dwarf_Small ** sec_start_ptr_out,Dwarf_Unsigned * sec_len_out,Dwarf_Small ** sec_end_ptr_out,UNUSEDARG Dwarf_Error * error)1309*4d9fdb46SRobert Mustacchi _dwarf_what_section_are_we(Dwarf_Debug dbg,
1310*4d9fdb46SRobert Mustacchi     Dwarf_Small    *  our_pointer,
1311*4d9fdb46SRobert Mustacchi     const char     ** section_name_out,
1312*4d9fdb46SRobert Mustacchi     Dwarf_Small    ** sec_start_ptr_out,
1313*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *  sec_len_out,
1314*4d9fdb46SRobert Mustacchi     Dwarf_Small    ** sec_end_ptr_out,
1315*4d9fdb46SRobert Mustacchi     UNUSEDARG Dwarf_Error    *  error)
1316*4d9fdb46SRobert Mustacchi {
1317*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_info,
1318*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1319*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1320*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_loc,
1321*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1322*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1323*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_loclists,
1324*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1325*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1326*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_rnglists,
1327*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1328*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1329*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_addr,
1330*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1331*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1332*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_line,
1333*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1334*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1335*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_aranges,
1336*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1337*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1338*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_macro,
1339*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1340*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1341*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_ranges,
1342*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1343*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1344*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_str_offsets,
1345*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1346*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1347*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_addr,
1348*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1349*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1350*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_pubtypes,
1351*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1352*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1353*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_gdbindex,
1354*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1355*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1356*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_abbrev,
1357*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1358*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1359*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_cu_index,
1360*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1361*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1362*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_tu_index,
1363*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1364*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1365*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_line_str,
1366*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1367*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1368*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_types,
1369*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1370*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1371*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_sup,
1372*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1373*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1374*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_frame,
1375*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1376*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1377*4d9fdb46SRobert Mustacchi     FINDSEC(&dbg->de_debug_frame_eh_gnu,
1378*4d9fdb46SRobert Mustacchi         our_pointer, section_name_out,
1379*4d9fdb46SRobert Mustacchi         sec_start_ptr_out, sec_len_out, sec_end_ptr_out);
1380*4d9fdb46SRobert Mustacchi     return DW_DLV_NO_ENTRY;
1381*4d9fdb46SRobert Mustacchi }
1382*4d9fdb46SRobert Mustacchi 
1383*4d9fdb46SRobert Mustacchi /* New September 2019. */
dwarf_add_file_path(Dwarf_Debug dbg,const char * file_name,Dwarf_Error * error)1384*4d9fdb46SRobert Mustacchi int  dwarf_add_file_path(
1385*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg,
1386*4d9fdb46SRobert Mustacchi     const char *          file_name,
1387*4d9fdb46SRobert Mustacchi     Dwarf_Error* error)
1388*4d9fdb46SRobert Mustacchi {
1389*4d9fdb46SRobert Mustacchi     if(!dbg || !file_name) {
1390*4d9fdb46SRobert Mustacchi         /*  Pretty much a disaster. Caller error. */
1391*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,DW_DLE_NULL_ARGS_DWARF_ADD_PATH);
1392*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1393*4d9fdb46SRobert Mustacchi     }
1394*4d9fdb46SRobert Mustacchi     if (!dbg->de_path) {
1395*4d9fdb46SRobert Mustacchi         dbg->de_path = strdup(file_name);
1396*4d9fdb46SRobert Mustacchi     }
1397*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1398*4d9fdb46SRobert Mustacchi }
1399*4d9fdb46SRobert Mustacchi 
1400*4d9fdb46SRobert Mustacchi /*  New late April 2020.
1401*4d9fdb46SRobert Mustacchi     All the crucial macros will surely
1402*4d9fdb46SRobert Mustacchi     need  to use wrapper code to ensure we do not leak
1403*4d9fdb46SRobert Mustacchi     memory at certain points.  */
1404*4d9fdb46SRobert Mustacchi int
_dwarf_read_unaligned_ck_wrapper(Dwarf_Debug dbg,Dwarf_Unsigned * out_value,Dwarf_Small * readfrom,int readlength,Dwarf_Small * end_arange,Dwarf_Error * err)1405*4d9fdb46SRobert Mustacchi _dwarf_read_unaligned_ck_wrapper(Dwarf_Debug dbg,
1406*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *out_value,
1407*4d9fdb46SRobert Mustacchi     Dwarf_Small *readfrom,
1408*4d9fdb46SRobert Mustacchi     int          readlength,
1409*4d9fdb46SRobert Mustacchi     Dwarf_Small *end_arange,
1410*4d9fdb46SRobert Mustacchi     Dwarf_Error *err)
1411*4d9fdb46SRobert Mustacchi {
1412*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned val = 0;
1413*4d9fdb46SRobert Mustacchi 
1414*4d9fdb46SRobert Mustacchi     READ_UNALIGNED_CK(dbg,val,Dwarf_Unsigned,
1415*4d9fdb46SRobert Mustacchi         readfrom,readlength,err,end_arange);
1416*4d9fdb46SRobert Mustacchi     *out_value = val;
1417*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1418*4d9fdb46SRobert Mustacchi }
1419*4d9fdb46SRobert Mustacchi 
1420*4d9fdb46SRobert Mustacchi int
_dwarf_read_area_length_ck_wrapper(Dwarf_Debug dbg,Dwarf_Unsigned * out_value,Dwarf_Small ** readfrom,int * length_size_out,int * exten_size_out,Dwarf_Unsigned sectionlength,Dwarf_Small * endsection,Dwarf_Error * err)1421*4d9fdb46SRobert Mustacchi _dwarf_read_area_length_ck_wrapper(Dwarf_Debug dbg,
1422*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *out_value,
1423*4d9fdb46SRobert Mustacchi     Dwarf_Small **readfrom,
1424*4d9fdb46SRobert Mustacchi     int    *  length_size_out,
1425*4d9fdb46SRobert Mustacchi     int    *  exten_size_out,
1426*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned sectionlength,
1427*4d9fdb46SRobert Mustacchi     Dwarf_Small *endsection,
1428*4d9fdb46SRobert Mustacchi     Dwarf_Error *err)
1429*4d9fdb46SRobert Mustacchi {
1430*4d9fdb46SRobert Mustacchi     Dwarf_Small *ptr = *readfrom;
1431*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned val = 0;
1432*4d9fdb46SRobert Mustacchi     int length_size = 0;
1433*4d9fdb46SRobert Mustacchi     int exten_size = 0;
1434*4d9fdb46SRobert Mustacchi 
1435*4d9fdb46SRobert Mustacchi     READ_AREA_LENGTH_CK(dbg,val,Dwarf_Unsigned,
1436*4d9fdb46SRobert Mustacchi         ptr,length_size,exten_size,
1437*4d9fdb46SRobert Mustacchi         err,
1438*4d9fdb46SRobert Mustacchi         sectionlength,endsection);
1439*4d9fdb46SRobert Mustacchi     *readfrom = ptr;
1440*4d9fdb46SRobert Mustacchi     *out_value = val;
1441*4d9fdb46SRobert Mustacchi     *length_size_out = length_size;
1442*4d9fdb46SRobert Mustacchi     *exten_size_out = exten_size;
1443*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1444*4d9fdb46SRobert Mustacchi }
1445*4d9fdb46SRobert Mustacchi /*  New March 2020 */
1446*4d9fdb46SRobert Mustacchi /*  We need to increment startptr for the caller
1447*4d9fdb46SRobert Mustacchi     in these wrappers so the caller passes in
1448*4d9fdb46SRobert Mustacchi     wrappers return either DW_DLV_OK or DW_DLV_ERROR.
1449*4d9fdb46SRobert Mustacchi     Never DW_DLV_NO_ENTRY. */
1450*4d9fdb46SRobert Mustacchi int
_dwarf_leb128_uword_wrapper(Dwarf_Debug dbg,Dwarf_Small ** startptr,Dwarf_Small * endptr,Dwarf_Unsigned * out_value,Dwarf_Error * error)1451*4d9fdb46SRobert Mustacchi _dwarf_leb128_uword_wrapper(Dwarf_Debug dbg,
1452*4d9fdb46SRobert Mustacchi     Dwarf_Small ** startptr,
1453*4d9fdb46SRobert Mustacchi     Dwarf_Small * endptr,
1454*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *out_value,
1455*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1456*4d9fdb46SRobert Mustacchi {
1457*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned utmp2 = 0;
1458*4d9fdb46SRobert Mustacchi     Dwarf_Small * start = *startptr;
1459*4d9fdb46SRobert Mustacchi     DECODE_LEB128_UWORD_CK(start, utmp2,
1460*4d9fdb46SRobert Mustacchi         dbg,error,endptr);
1461*4d9fdb46SRobert Mustacchi     *out_value = utmp2;
1462*4d9fdb46SRobert Mustacchi     *startptr = start;
1463*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1464*4d9fdb46SRobert Mustacchi }
1465*4d9fdb46SRobert Mustacchi int
_dwarf_leb128_sword_wrapper(Dwarf_Debug dbg,Dwarf_Small ** startptr,Dwarf_Small * endptr,Dwarf_Signed * out_value,Dwarf_Error * error)1466*4d9fdb46SRobert Mustacchi _dwarf_leb128_sword_wrapper(Dwarf_Debug dbg,
1467*4d9fdb46SRobert Mustacchi     Dwarf_Small ** startptr,
1468*4d9fdb46SRobert Mustacchi     Dwarf_Small * endptr,
1469*4d9fdb46SRobert Mustacchi     Dwarf_Signed *out_value,
1470*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1471*4d9fdb46SRobert Mustacchi {
1472*4d9fdb46SRobert Mustacchi     Dwarf_Small * start = *startptr;
1473*4d9fdb46SRobert Mustacchi     Dwarf_Signed stmp2 = 0;
1474*4d9fdb46SRobert Mustacchi     DECODE_LEB128_SWORD_CK(start, stmp2,
1475*4d9fdb46SRobert Mustacchi         dbg,error,endptr);
1476*4d9fdb46SRobert Mustacchi     *out_value = stmp2;
1477*4d9fdb46SRobert Mustacchi     *startptr = start;
1478*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1479*4d9fdb46SRobert Mustacchi }
1480