149d3bc91SRichard Lowe /*
207dc1947SRichard Lowe   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.
549d3bc91SRichard Lowe 
649d3bc91SRichard Lowe   This program is free software; you can redistribute it and/or modify it
7*4d9fdb46SRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
849d3bc91SRichard Lowe   as published by the Free Software Foundation.
949d3bc91SRichard Lowe 
1049d3bc91SRichard Lowe   This program is distributed in the hope that it would be useful, but
1149d3bc91SRichard Lowe   WITHOUT ANY WARRANTY; without even the implied warranty of
12*4d9fdb46SRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1349d3bc91SRichard Lowe 
1449d3bc91SRichard Lowe   Further, this software is distributed without any warranty that it is
15*4d9fdb46SRobert Mustacchi   free of the rightful claim of any third person regarding infringement
16*4d9fdb46SRobert Mustacchi   or the like.  Any license provided herein, whether implied or
1749d3bc91SRichard Lowe   otherwise, applies only to this software file.  Patent licenses, if
18*4d9fdb46SRobert Mustacchi   any, provided herein do not apply to combinations of this program with
19*4d9fdb46SRobert Mustacchi   other software, or any other product whatsoever.
2049d3bc91SRichard Lowe 
21*4d9fdb46SRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
22*4d9fdb46SRobert Mustacchi   License along with this program; if not, write the Free Software
2307dc1947SRichard Lowe   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
2449d3bc91SRichard Lowe   USA.
2549d3bc91SRichard Lowe 
26*4d9fdb46SRobert Mustacchi */
2749d3bc91SRichard Lowe 
28*4d9fdb46SRobert Mustacchi #include "config.h"
29*4d9fdb46SRobert 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"
52*4d9fdb46SRobert Mustacchi #include "dwarf_die_deliv.h"
53*4d9fdb46SRobert Mustacchi #include "dwarfstring.h"
54*4d9fdb46SRobert Mustacchi #include "pro_encode_nm.h"
5549d3bc91SRichard Lowe 
56*4d9fdb46SRobert Mustacchi #ifndef O_BINARY
57*4d9fdb46SRobert Mustacchi #define O_BINARY 0
58*4d9fdb46SRobert Mustacchi #endif /* O_BINARY */
5949d3bc91SRichard Lowe 
6049d3bc91SRichard Lowe 
6107dc1947SRichard Lowe 
62*4d9fdb46SRobert Mustacchi #define MINBUFLEN 1000
63*4d9fdb46SRobert Mustacchi #define TRUE  1
64*4d9fdb46SRobert Mustacchi #define FALSE 0
6507dc1947SRichard Lowe 
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 */
7149d3bc91SRichard Lowe 
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);
7649d3bc91SRichard Lowe 
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 }
8249d3bc91SRichard Lowe 
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;
8949d3bc91SRichard Lowe 
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
9749d3bc91SRichard Lowe 
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 }
10649d3bc91SRichard Lowe 
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
20349d3bc91SRichard Lowe     a value of that form, val_ptr, this function returns
20449d3bc91SRichard Lowe     the length, in bytes, of a value of that form.
20549d3bc91SRichard Lowe     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)20849d3bc91SRichard Lowe _dwarf_get_size_of_val(Dwarf_Debug dbg,
20907dc1947SRichard Lowe     Dwarf_Unsigned form,
210*4d9fdb46SRobert Mustacchi     Dwarf_Half cu_version,
21107dc1947SRichard Lowe     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)
21749d3bc91SRichard Lowe {
21849d3bc91SRichard Lowe     Dwarf_Unsigned length = 0;
219*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned leb128_length = 0;
22049d3bc91SRichard Lowe     Dwarf_Unsigned form_indirect = 0;
22149d3bc91SRichard Lowe     Dwarf_Unsigned ret_value = 0;
22249d3bc91SRichard Lowe 
22349d3bc91SRichard Lowe     switch (form) {
22449d3bc91SRichard Lowe 
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;
24449d3bc91SRichard Lowe 
24549d3bc91SRichard Lowe     case DW_FORM_addr:
246*4d9fdb46SRobert Mustacchi         if (address_size) {
247*4d9fdb46SRobert Mustacchi             *size_out = address_size;
248*4d9fdb46SRobert Mustacchi         } else {
249*4d9fdb46SRobert Mustacchi             /* This should never happen, address_size should be set. */
250*4d9fdb46SRobert Mustacchi             *size_out = dbg->de_pointer_size;
25107dc1947SRichard Lowe         }
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;
25707dc1947SRichard Lowe 
258*4d9fdb46SRobert Mustacchi     /*  DWARF2 was wrong on the size of the attribute for
259*4d9fdb46SRobert Mustacchi         DW_FORM_ref_addr.  We assume compilers are using the
260*4d9fdb46SRobert 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.*/
26549d3bc91SRichard Lowe     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;
27249d3bc91SRichard Lowe 
273*4d9fdb46SRobert Mustacchi     case DW_FORM_block1: {
274*4d9fdb46SRobert Mustacchi         ptrdiff_t sizeasptrdiff = 0;
27549d3bc91SRichard Lowe 
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;
29849d3bc91SRichard Lowe 
299*4d9fdb46SRobert Mustacchi     case DW_FORM_block2: {
300*4d9fdb46SRobert Mustacchi         ptrdiff_t sizeasptrdiff = 0;
301*4d9fdb46SRobert 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;
31749d3bc91SRichard Lowe 
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;
33749d3bc91SRichard Lowe 
33849d3bc91SRichard Lowe     case DW_FORM_data1:
339*4d9fdb46SRobert Mustacchi         *size_out = 1;
340*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
34149d3bc91SRichard Lowe 
34249d3bc91SRichard Lowe     case DW_FORM_data2:
343*4d9fdb46SRobert Mustacchi         *size_out = 2;
344*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
34549d3bc91SRichard Lowe 
34649d3bc91SRichard Lowe     case DW_FORM_data4:
347*4d9fdb46SRobert Mustacchi         *size_out = 4;
348*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
34949d3bc91SRichard Lowe 
35049d3bc91SRichard Lowe     case DW_FORM_data8:
351*4d9fdb46SRobert Mustacchi         *size_out = 8;
352*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
353*4d9fdb46SRobert Mustacchi 
354*4d9fdb46SRobert Mustacchi     case DW_FORM_data16:
355*4d9fdb46SRobert Mustacchi         *size_out = 16;
356*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
35749d3bc91SRichard Lowe 
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;
37149d3bc91SRichard Lowe 
37249d3bc91SRichard Lowe     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     }
37949d3bc91SRichard Lowe 
38007dc1947SRichard Lowe     case DW_FORM_flag_present:
381*4d9fdb46SRobert Mustacchi         *size_out = 0;
382*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
383*4d9fdb46SRobert Mustacchi 
38449d3bc91SRichard Lowe     case DW_FORM_flag:
385*4d9fdb46SRobert Mustacchi         *size_out = 1;
386*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
38707dc1947SRichard Lowe 
38807dc1947SRichard Lowe     case DW_FORM_sec_offset:
38907dc1947SRichard Lowe         /* 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;
39249d3bc91SRichard Lowe 
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     }
40349d3bc91SRichard Lowe 
40449d3bc91SRichard Lowe     case DW_FORM_indirect:
40507dc1947SRichard Lowe         {
406*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned indir_len = 0;
407*4d9fdb46SRobert Mustacchi             int res = 0;
408*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned info_data_len = 0;
40907dc1947SRichard Lowe 
410*4d9fdb46SRobert Mustacchi             DECODE_LEB128_UWORD_LEN_CK(val_ptr,form_indirect,indir_len,
411*4d9fdb46SRobert Mustacchi                 dbg,error,section_end_ptr);
41207dc1947SRichard Lowe             if (form_indirect == DW_FORM_indirect) {
413*4d9fdb46SRobert Mustacchi                 /* We are in big trouble: The true form
414*4d9fdb46SRobert Mustacchi                     of DW_FORM_indirect is
415*4d9fdb46SRobert Mustacchi                     DW_FORM_indirect? Nonsense. Should
416*4d9fdb46SRobert Mustacchi                     never happen. */
417*4d9fdb46SRobert Mustacchi                 _dwarf_error(dbg,error,DW_DLE_NESTED_FORM_INDIRECT_ERROR);
418*4d9fdb46SRobert Mustacchi                 return DW_DLV_ERROR;
41907dc1947SRichard Lowe             }
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,
423*4d9fdb46SRobert Mustacchi                 form_indirect,
424*4d9fdb46SRobert Mustacchi                 cu_version,
425*4d9fdb46SRobert Mustacchi                 address_size,
426*4d9fdb46SRobert 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;
43607dc1947SRichard Lowe         }
43749d3bc91SRichard Lowe 
43849d3bc91SRichard Lowe     case DW_FORM_ref1:
439*4d9fdb46SRobert Mustacchi         *size_out = 1;
440*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
44149d3bc91SRichard Lowe 
44249d3bc91SRichard Lowe     case DW_FORM_ref2:
443*4d9fdb46SRobert Mustacchi         *size_out = 2;
444*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
44549d3bc91SRichard Lowe 
44649d3bc91SRichard Lowe     case DW_FORM_ref4:
447*4d9fdb46SRobert Mustacchi         *size_out = 4;
448*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
44949d3bc91SRichard Lowe 
45049d3bc91SRichard Lowe     case DW_FORM_ref8:
451*4d9fdb46SRobert Mustacchi         *size_out = 8;
452*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
45349d3bc91SRichard Lowe 
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;
460*4d9fdb46SRobert 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;
46549d3bc91SRichard Lowe 
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:
51949d3bc91SRichard Lowe     case DW_FORM_strp:
520*4d9fdb46SRobert Mustacchi         *size_out = v_length_size;
521*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
52249d3bc91SRichard Lowe 
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     }
53349d3bc91SRichard Lowe     }
53449d3bc91SRichard Lowe }
53549d3bc91SRichard Lowe 
536*4d9fdb46SRobert Mustacchi /*  We allow an arbitrary number of HT_MULTIPLE entries
537*4d9fdb46SRobert Mustacchi     before resizing.  It seems up to 20 or 30
538*4d9fdb46SRobert Mustacchi     would work nearly as well.
539*4d9fdb46SRobert Mustacchi     We could have a different resize multiple than 'resize now'
540*4d9fdb46SRobert Mustacchi     test multiple, but for now we don't do that.  */
54107dc1947SRichard Lowe #define HT_MULTIPLE 8
54207dc1947SRichard Lowe 
543*4d9fdb46SRobert Mustacchi /*  Copy the old entries, updating each to be in
544*4d9fdb46SRobert Mustacchi     a new list.  Don't delete anything. Leave the
545*4d9fdb46SRobert Mustacchi     htin with stale data. */
54607dc1947SRichard Lowe static void
copy_abbrev_table_to_new_table(Dwarf_Hash_Table htin,Dwarf_Hash_Table htout)547*4d9fdb46SRobert Mustacchi copy_abbrev_table_to_new_table(Dwarf_Hash_Table htin,
54807dc1947SRichard Lowe   Dwarf_Hash_Table htout)
54907dc1947SRichard Lowe {
55007dc1947SRichard Lowe     Dwarf_Hash_Table_Entry entry_in = htin->tb_entries;
55107dc1947SRichard Lowe     unsigned entry_in_count = htin->tb_table_entry_count;
55207dc1947SRichard Lowe     Dwarf_Hash_Table_Entry entry_out = htout->tb_entries;
55307dc1947SRichard Lowe     unsigned entry_out_count = htout->tb_table_entry_count;
55407dc1947SRichard Lowe     unsigned k = 0;
555*4d9fdb46SRobert Mustacchi     for (; k < entry_in_count; ++k,++entry_in) {
55607dc1947SRichard Lowe         Dwarf_Abbrev_List listent = entry_in->at_head;
55707dc1947SRichard Lowe         Dwarf_Abbrev_List nextlistent = 0;
55807dc1947SRichard Lowe 
559*4d9fdb46SRobert Mustacchi         for (; listent ; listent = nextlistent) {
560*4d9fdb46SRobert Mustacchi             unsigned newtmp = listent->abl_code;
561*4d9fdb46SRobert Mustacchi             unsigned newhash = newtmp%entry_out_count;
562*4d9fdb46SRobert Mustacchi             Dwarf_Hash_Table_Entry e;
563*4d9fdb46SRobert Mustacchi             nextlistent = listent->abl_next;
564*4d9fdb46SRobert Mustacchi             e = entry_out+newhash;
565*4d9fdb46SRobert Mustacchi             /*  Move_entry_to_new_hash. This reverses the
56607dc1947SRichard Lowe                 order of the entries, effectively, but
56707dc1947SRichard Lowe                 that does not seem significant. */
568*4d9fdb46SRobert Mustacchi             listent->abl_next = e->at_head;
569*4d9fdb46SRobert Mustacchi             e->at_head = listent;
57007dc1947SRichard Lowe 
571*4d9fdb46SRobert Mustacchi             htout->tb_total_abbrev_count++;
572*4d9fdb46SRobert Mustacchi         }
57307dc1947SRichard Lowe     }
57407dc1947SRichard Lowe }
57549d3bc91SRichard Lowe 
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
62049d3bc91SRichard Lowe     struct for the abbrev with the given code.  It puts the
62149d3bc91SRichard Lowe     struct on the appropriate hash table.  It also adds all
62249d3bc91SRichard Lowe     the abbrev between the last abbrev added and this one to
62349d3bc91SRichard Lowe     the hash table.  In other words, the .debug_abbrev section
62449d3bc91SRichard Lowe     is scanned sequentially from the top for an abbrev with
625*4d9fdb46SRobert Mustacchi     the given code.  All intervening abbrevs are also put
62649d3bc91SRichard Lowe     into the hash table.
62749d3bc91SRichard Lowe 
62849d3bc91SRichard Lowe     This function hashes the given code, and checks the chain
62949d3bc91SRichard Lowe     at that hash table entry to see if a Dwarf_Abbrev_List_s
63049d3bc91SRichard Lowe     with the given code exists.  If yes, it returns a pointer
63149d3bc91SRichard Lowe     to that struct.  Otherwise, it scans the .debug_abbrev
63249d3bc91SRichard Lowe     section from the last byte scanned for that CU till either
63349d3bc91SRichard Lowe     an abbrev with the given code is found, or an abbrev code
63449d3bc91SRichard Lowe     of 0 is read.  It puts Dwarf_Abbrev_List_s entries for all
63549d3bc91SRichard Lowe     abbrev's read till that point into the hash table.  The
63649d3bc91SRichard Lowe     hash table contains both a head pointer and a tail pointer
63749d3bc91SRichard Lowe     for each entry.
63849d3bc91SRichard Lowe 
63907dc1947SRichard Lowe     While the lists can move and entries can be moved between
64007dc1947SRichard Lowe     lists on reallocation, any given Dwarf_Abbrev_list entry
64107dc1947SRichard Lowe     never moves once allocated, so the pointer is safe to return.
64207dc1947SRichard Lowe 
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)
65149d3bc91SRichard Lowe {
65249d3bc91SRichard Lowe     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;
655*4d9fdb46SRobert Mustacchi     Dwarf_Hash_Table_Entry entry_base = 0;
656*4d9fdb46SRobert Mustacchi     Dwarf_Hash_Table_Entry entry_cur = 0;
657*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned hash_num = 0;
658*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned abbrev_code = 0;
65907dc1947SRichard Lowe     Dwarf_Unsigned abbrev_tag  = 0;
66007dc1947SRichard Lowe     Dwarf_Abbrev_List hash_abbrev_entry = 0;
661*4d9fdb46SRobert Mustacchi     Dwarf_Abbrev_List inner_list_entry = 0;
662*4d9fdb46SRobert Mustacchi     Dwarf_Hash_Table_Entry inner_hash_entry = 0;
66307dc1947SRichard Lowe 
66407dc1947SRichard Lowe     Dwarf_Byte_Ptr abbrev_ptr = 0;
665*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr end_abbrev_ptr = 0;
666*4d9fdb46SRobert Mustacchi     unsigned hashable_val = 0;
667*4d9fdb46SRobert Mustacchi 
668*4d9fdb46SRobert Mustacchi     if (!hash_table_base->tb_entries) {
669*4d9fdb46SRobert Mustacchi         hash_table_base->tb_table_entry_count =  HT_MULTIPLE;
670*4d9fdb46SRobert 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,
673*4d9fdb46SRobert Mustacchi             DW_DLA_HASH_TABLE_ENTRY,
67407dc1947SRichard Lowe             hash_table_base->tb_table_entry_count);
675*4d9fdb46SRobert Mustacchi         if (!hash_table_base->tb_entries) {
676*4d9fdb46SRobert Mustacchi             return DW_DLV_NO_ENTRY;
677*4d9fdb46SRobert Mustacchi         }
67807dc1947SRichard Lowe     } else if (hash_table_base->tb_total_abbrev_count >
679*4d9fdb46SRobert Mustacchi         (hash_table_base->tb_table_entry_count * HT_MULTIPLE)) {
68007dc1947SRichard Lowe         struct Dwarf_Hash_Table_s newht;
681*4d9fdb46SRobert Mustacchi 
682*4d9fdb46SRobert Mustacchi         memset(&newht,0,sizeof(newht));
68307dc1947SRichard Lowe         /* Effectively multiplies by >= HT_MULTIPLE */
684*4d9fdb46SRobert Mustacchi         newht.tb_table_entry_count =
685*4d9fdb46SRobert Mustacchi             hash_table_base->tb_total_abbrev_count;
68607dc1947SRichard Lowe         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,
69007dc1947SRichard Lowe             newht.tb_table_entry_count);
691*4d9fdb46SRobert Mustacchi         if (!newht.tb_entries) {
692*4d9fdb46SRobert Mustacchi             return DW_DLV_NO_ENTRY;
69307dc1947SRichard Lowe         }
694*4d9fdb46SRobert Mustacchi         /*  Copy the existing entries to the new table,
695*4d9fdb46SRobert Mustacchi             rehashing each.  */
69607dc1947SRichard Lowe         copy_abbrev_table_to_new_table(hash_table_base, &newht);
697*4d9fdb46SRobert Mustacchi         /*  Dealloc only the entries hash table array, not the lists
698*4d9fdb46SRobert 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);
70107dc1947SRichard Lowe         hash_table_base->tb_entries = 0;
702*4d9fdb46SRobert Mustacchi         /*  Now overwrite the existing table descriptor with
703*4d9fdb46SRobert Mustacchi             the new, newly valid, contents. */
70407dc1947SRichard Lowe         *hash_table_base = newht;
705*4d9fdb46SRobert Mustacchi     } /* Else is ok as is, add entry */
70607dc1947SRichard Lowe 
70707dc1947SRichard Lowe     hashable_val = code;
708*4d9fdb46SRobert Mustacchi     hash_num = hashable_val %
70907dc1947SRichard Lowe         hash_table_base->tb_table_entry_count;
71007dc1947SRichard Lowe     entry_base = hash_table_base->tb_entries;
71107dc1947SRichard Lowe     entry_cur  = entry_base + hash_num;
712*4d9fdb46SRobert Mustacchi 
71307dc1947SRichard Lowe     /* Determine if the 'code' is the list of synonyms already. */
71407dc1947SRichard Lowe     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;
72207dc1947SRichard Lowe     }
72349d3bc91SRichard Lowe 
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;
732*4d9fdb46SRobert 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     }
75049d3bc91SRichard Lowe 
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. */
76649d3bc91SRichard Lowe     if (*abbrev_ptr == 0) {
767*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
76849d3bc91SRichard Lowe     }
76949d3bc91SRichard Lowe 
77049d3bc91SRichard Lowe     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;
776*4d9fdb46SRobert 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         }
79107dc1947SRichard Lowe         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         }
79807dc1947SRichard Lowe 
79907dc1947SRichard Lowe         new_hashable_val = abbrev_code;
800*4d9fdb46SRobert Mustacchi         hash_num = new_hashable_val %
80107dc1947SRichard Lowe             hash_table_base->tb_table_entry_count;
80207dc1947SRichard Lowe         inner_hash_entry = entry_base + hash_num;
80307dc1947SRichard Lowe         /* Move_entry_to_new_hash */
804*4d9fdb46SRobert Mustacchi         inner_list_entry->abl_next = inner_hash_entry->at_head;
80507dc1947SRichard Lowe         inner_hash_entry->at_head = inner_list_entry;
80607dc1947SRichard Lowe 
80707dc1947SRichard Lowe         hash_table_base->tb_total_abbrev_count++;
80807dc1947SRichard Lowe 
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++;
81549d3bc91SRichard Lowe 
816*4d9fdb46SRobert Mustacchi         /*  Cycle thru the abbrev content,
817*4d9fdb46SRobert Mustacchi             ignoring the content except
818*4d9fdb46SRobert 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);
82849d3bc91SRichard Lowe 
82949d3bc91SRichard Lowe     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;
84049d3bc91SRichard Lowe }
84149d3bc91SRichard Lowe 
84249d3bc91SRichard Lowe 
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
85049d3bc91SRichard Lowe */
85149d3bc91SRichard Lowe 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)
85649d3bc91SRichard Lowe {
857*4d9fdb46SRobert Mustacchi     Dwarf_Small *start = areaptr;
858*4d9fdb46SRobert Mustacchi     Dwarf_Small *p = strptr;
859*4d9fdb46SRobert Mustacchi     Dwarf_Small *end = areaendptr;
86049d3bc91SRichard Lowe 
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;
87707dc1947SRichard Lowe         }
878*4d9fdb46SRobert Mustacchi         ++p;
87949d3bc91SRichard Lowe     }
880*4d9fdb46SRobert Mustacchi     _dwarf_error(dbg,error,DW_DLE_STRING_NOT_TERMINATED);
881*4d9fdb46SRobert Mustacchi     return DW_DLV_ERROR;
88249d3bc91SRichard Lowe }
88349d3bc91SRichard Lowe 
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;
909*4d9fdb46SRobert Mustacchi     }
910*4d9fdb46SRobert Mustacchi     if (startaddr < sec->dss_data) {
911*4d9fdb46SRobert Mustacchi         return 1;
912*4d9fdb46SRobert Mustacchi     }
913*4d9fdb46SRobert Mustacchi     if (pastend > (sec->dss_data + sec->dss_size)) {
914*4d9fdb46SRobert Mustacchi         return 1;
915*4d9fdb46SRobert Mustacchi     }
916*4d9fdb46SRobert Mustacchi     return 0;
917*4d9fdb46SRobert Mustacchi }
918*4d9fdb46SRobert Mustacchi 
919*4d9fdb46SRobert Mustacchi 
92049d3bc91SRichard Lowe /*
92149d3bc91SRichard Lowe   A byte-swapping version of memcpy
92249d3bc91SRichard Lowe   for cross-endian use.
92349d3bc91SRichard Lowe   Only 2,4,8 should be lengths passed in.
92449d3bc91SRichard Lowe */
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)
927*4d9fdb46SRobert 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)
93349d3bc91SRichard Lowe {
93449d3bc91SRichard Lowe     unsigned char *targ = (unsigned char *) s1;
935*4d9fdb46SRobert Mustacchi     const unsigned char *src = (const unsigned char *) s2;
93649d3bc91SRichard Lowe 
93749d3bc91SRichard Lowe     if (len == 4) {
93807dc1947SRichard Lowe         targ[3] = src[0];
93907dc1947SRichard Lowe         targ[2] = src[1];
94007dc1947SRichard Lowe         targ[1] = src[2];
94107dc1947SRichard Lowe         targ[0] = src[3];
94249d3bc91SRichard Lowe     } else if (len == 8) {
94307dc1947SRichard Lowe         targ[7] = src[0];
94407dc1947SRichard Lowe         targ[6] = src[1];
94507dc1947SRichard Lowe         targ[5] = src[2];
94607dc1947SRichard Lowe         targ[4] = src[3];
94707dc1947SRichard Lowe         targ[3] = src[4];
94807dc1947SRichard Lowe         targ[2] = src[5];
94907dc1947SRichard Lowe         targ[1] = src[6];
95007dc1947SRichard Lowe         targ[0] = src[7];
95149d3bc91SRichard Lowe     } else if (len == 2) {
95207dc1947SRichard Lowe         targ[1] = src[0];
95307dc1947SRichard Lowe         targ[0] = src[1];
95449d3bc91SRichard Lowe     }
95549d3bc91SRichard Lowe /* should NOT get below here: is not the intended use */
95649d3bc91SRichard Lowe     else if (len == 1) {
95707dc1947SRichard Lowe         targ[0] = src[0];
95849d3bc91SRichard Lowe     } else {
959*4d9fdb46SRobert Mustacchi         memcpy(s1, s2, (size_t)len);
96049d3bc91SRichard Lowe     }
961*4d9fdb46SRobert Mustacchi     return;
96249d3bc91SRichard Lowe }
96349d3bc91SRichard Lowe 
96449d3bc91SRichard Lowe 
965*4d9fdb46SRobert Mustacchi /*  This calculation used to be sprinkled all over.
966*4d9fdb46SRobert Mustacchi     Now brought to one place.
96749d3bc91SRichard Lowe 
968*4d9fdb46SRobert 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).  */
97149d3bc91SRichard Lowe /* 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)
97949d3bc91SRichard Lowe {
98049d3bc91SRichard Lowe     int local_length_size = 0;
98149d3bc91SRichard Lowe     int local_extension_size = 0;
982*4d9fdb46SRobert Mustacchi     Dwarf_Half version = 0;
98349d3bc91SRichard Lowe     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;
994*4d9fdb46SRobert 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);
998*4d9fdb46SRobert 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 +
1010*4d9fdb46SRobert 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. */
1029*4d9fdb46SRobert Mustacchi             local_length_size  +  /* Size of abbrev offset field. */
1030*4d9fdb46SRobert 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. */
1044*4d9fdb46SRobert Mustacchi     }
104549d3bc91SRichard Lowe 
1046*4d9fdb46SRobert Mustacchi     *area_length_out = final_size;
1047*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
104849d3bc91SRichard Lowe }
104949d3bc91SRichard Lowe 
1050*4d9fdb46SRobert Mustacchi /*  Pretend we know nothing about the CU
1051*4d9fdb46SRobert Mustacchi     and just roughly compute the result.  */
105249d3bc91SRichard Lowe 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)
105549d3bc91SRichard Lowe {
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. */
105907dc1947SRichard Lowe         dbg->de_length_size +   /* Size of abbrev offset field. */
106007dc1947SRichard Lowe         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;
106949d3bc91SRichard Lowe }
107049d3bc91SRichard Lowe 
1071*4d9fdb46SRobert Mustacchi /*  Now that we delay loading .debug_info, we need to do the
1072*4d9fdb46SRobert Mustacchi     load in more places. So putting the load
1073*4d9fdb46SRobert Mustacchi     code in one place now instead of replicating it in multiple
1074*4d9fdb46SRobert Mustacchi     places.  */
107549d3bc91SRichard Lowe int
_dwarf_load_debug_info(Dwarf_Debug dbg,Dwarf_Error * error)107649d3bc91SRichard Lowe _dwarf_load_debug_info(Dwarf_Debug dbg, Dwarf_Error * error)
107749d3bc91SRichard Lowe {
107807dc1947SRichard Lowe     int res = DW_DLV_ERROR;
107907dc1947SRichard Lowe     if (dbg->de_debug_info.dss_data) {
108007dc1947SRichard Lowe         return DW_DLV_OK;
108149d3bc91SRichard Lowe     }
108207dc1947SRichard Lowe     res = _dwarf_load_section(dbg, &dbg->de_debug_abbrev,error);
108349d3bc91SRichard Lowe     if (res != DW_DLV_OK) {
108407dc1947SRichard Lowe         return res;
108549d3bc91SRichard Lowe     }
108607dc1947SRichard Lowe     res = _dwarf_load_section(dbg, &dbg->de_debug_info, error);
1087*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1088*4d9fdb46SRobert 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);
111549d3bc91SRichard Lowe     return res;
111649d3bc91SRichard Lowe }
111707dc1947SRichard Lowe 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)
112007dc1947SRichard Lowe {
1121*4d9fdb46SRobert Mustacchi     /*  A Hash Table is an array with tb_table_entry_count struct
1122*4d9fdb46SRobert 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     }
113207dc1947SRichard Lowe     for (; hashnum < hash_table->tb_table_entry_count; ++hashnum) {
113307dc1947SRichard Lowe         struct Dwarf_Abbrev_List_s *abbrev = 0;
113407dc1947SRichard Lowe         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];
113707dc1947SRichard Lowe 
113807dc1947SRichard Lowe         abbrev = tb->at_head;
113907dc1947SRichard Lowe         for (; abbrev; abbrev = nextabbrev) {
1140*4d9fdb46SRobert Mustacchi             nextabbrev = abbrev->abl_next;
1141*4d9fdb46SRobert Mustacchi             abbrev->abl_next = 0;
114207dc1947SRichard Lowe             dwarf_dealloc(dbg, abbrev, DW_DLA_ABBREV_LIST);
114307dc1947SRichard Lowe         }
1144*4d9fdb46SRobert Mustacchi         tb->at_head = 0;
114507dc1947SRichard Lowe     }
114607dc1947SRichard Lowe     /* Frees all the entries at once: an array. */
114707dc1947SRichard Lowe     dwarf_dealloc(dbg,hash_table->tb_entries,DW_DLA_HASH_TABLE_ENTRY);
1148*4d9fdb46SRobert Mustacchi     hash_table->tb_entries = 0;
114907dc1947SRichard Lowe }
115007dc1947SRichard Lowe 
1151*4d9fdb46SRobert Mustacchi /*
115207dc1947SRichard Lowe     If no die provided the size value returned might be wrong.
1153*4d9fdb46SRobert Mustacchi     If different compilation units have different address sizes
115407dc1947SRichard Lowe     this may not give the correct value in all contexts if the die
1155*4d9fdb46SRobert Mustacchi     pointer is NULL.
1156*4d9fdb46SRobert Mustacchi     If the Elf offset size != address_size
115707dc1947SRichard Lowe     (for example if address_size = 4 but recorded in elf64 object)
115807dc1947SRichard Lowe     this may not give the correct value in all contexts if the die
1159*4d9fdb46SRobert Mustacchi     pointer is NULL.
116007dc1947SRichard Lowe     If the die pointer is non-NULL (in which case it must point to
116107dc1947SRichard Lowe     a valid DIE) this will return the correct size.
116207dc1947SRichard Lowe */
1163*4d9fdb46SRobert Mustacchi int
_dwarf_get_address_size(Dwarf_Debug dbg,Dwarf_Die die)116407dc1947SRichard Lowe _dwarf_get_address_size(Dwarf_Debug dbg, Dwarf_Die die)
116507dc1947SRichard Lowe {
116607dc1947SRichard Lowe     Dwarf_CU_Context context = 0;
116707dc1947SRichard Lowe     Dwarf_Half addrsize = 0;
1168*4d9fdb46SRobert Mustacchi     if (!die) {
116907dc1947SRichard Lowe         return dbg->de_pointer_size;
117007dc1947SRichard Lowe     }
117107dc1947SRichard Lowe     context = die->di_cu_context;
117207dc1947SRichard Lowe     addrsize = context->cc_address_size;
117307dc1947SRichard Lowe     return addrsize;
117407dc1947SRichard Lowe }
117507dc1947SRichard Lowe 
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 }
118307dc1947SRichard Lowe 
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 }
119107dc1947SRichard Lowe 
1192*4d9fdb46SRobert 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