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