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