149d3bc91SRichard Lowe /*
207dc1947SRichard Lowe   Copyright (C) 2000,2002,2004,2005 Silicon Graphics, Inc. All Rights Reserved.
307dc1947SRichard Lowe   Portions Copyright 2007-2010 Sun Microsystems, Inc. All rights reserved.
4*4d9fdb46SRobert Mustacchi   Portions Copyright 2008-2018 David Anderson. All rights reserved.
5*4d9fdb46SRobert Mustacchi   Portions Copyright 2010-2012 SN Systems Ltd. All rights reserved.
649d3bc91SRichard Lowe 
749d3bc91SRichard Lowe   This program is free software; you can redistribute it and/or modify it
8*4d9fdb46SRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
949d3bc91SRichard Lowe   as published by the Free Software Foundation.
1049d3bc91SRichard Lowe 
1149d3bc91SRichard Lowe   This program is distributed in the hope that it would be useful, but
1249d3bc91SRichard Lowe   WITHOUT ANY WARRANTY; without even the implied warranty of
13*4d9fdb46SRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1449d3bc91SRichard Lowe 
1549d3bc91SRichard Lowe   Further, this software is distributed without any warranty that it is
16*4d9fdb46SRobert Mustacchi   free of the rightful claim of any third person regarding infringement
17*4d9fdb46SRobert Mustacchi   or the like.  Any license provided herein, whether implied or
1849d3bc91SRichard Lowe   otherwise, applies only to this software file.  Patent licenses, if
19*4d9fdb46SRobert Mustacchi   any, provided herein do not apply to combinations of this program with
20*4d9fdb46SRobert Mustacchi   other software, or any other product whatsoever.
2149d3bc91SRichard Lowe 
22*4d9fdb46SRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
23*4d9fdb46SRobert Mustacchi   License along with this program; if not, write the Free Software
2407dc1947SRichard Lowe   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
2549d3bc91SRichard Lowe   USA.
2649d3bc91SRichard Lowe 
2749d3bc91SRichard Lowe */
2849d3bc91SRichard Lowe 
2949d3bc91SRichard Lowe #include "config.h"
30*4d9fdb46SRobert Mustacchi #include <stdio.h>
3149d3bc91SRichard Lowe #include "dwarf_incl.h"
32*4d9fdb46SRobert Mustacchi #include "dwarf_alloc.h"
33*4d9fdb46SRobert Mustacchi #include "dwarfstring.h"
34*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
35*4d9fdb46SRobert Mustacchi #include "dwarf_util.h"
3649d3bc91SRichard Lowe #include "dwarf_die_deliv.h"
37*4d9fdb46SRobert Mustacchi #include "dwarfstring.h"
38*4d9fdb46SRobert Mustacchi 
39*4d9fdb46SRobert Mustacchi #define TRUE 1
40*4d9fdb46SRobert Mustacchi #define FALSE 0
41*4d9fdb46SRobert Mustacchi 
42*4d9fdb46SRobert Mustacchi /*  It is necessary at times to cause errors of this sort
43*4d9fdb46SRobert Mustacchi     in determining what we really have.  So best to avoid
44*4d9fdb46SRobert Mustacchi     too much malloc and free, hence the static constructor
45*4d9fdb46SRobert Mustacchi     dwarfstring will use malloc if we guess too-small
46*4d9fdb46SRobert Mustacchi     for the size of mbuf. */
47*4d9fdb46SRobert Mustacchi static void
generate_form_error(Dwarf_Debug dbg,Dwarf_Error * error,unsigned form,int err_code,const char * errname,const char * funcname)48*4d9fdb46SRobert Mustacchi generate_form_error(Dwarf_Debug dbg,
49*4d9fdb46SRobert Mustacchi     Dwarf_Error *error,
50*4d9fdb46SRobert Mustacchi     unsigned form,
51*4d9fdb46SRobert Mustacchi     int err_code,
52*4d9fdb46SRobert Mustacchi     const char *errname,
53*4d9fdb46SRobert Mustacchi     const char *funcname)
5449d3bc91SRichard Lowe {
55*4d9fdb46SRobert Mustacchi     dwarfstring m;
56*4d9fdb46SRobert Mustacchi     char mbuf[DWARFSTRING_ALLOC_SIZE];
57*4d9fdb46SRobert Mustacchi     const char * defaultname = "<unknown form>";
58*4d9fdb46SRobert Mustacchi 
59*4d9fdb46SRobert Mustacchi     dwarfstring_constructor_static(&m,mbuf,
60*4d9fdb46SRobert Mustacchi         sizeof(mbuf));
61*4d9fdb46SRobert Mustacchi     dwarfstring_append(&m,(char *)errname);
62*4d9fdb46SRobert Mustacchi     dwarfstring_append(&m,": In function ");
63*4d9fdb46SRobert Mustacchi     dwarfstring_append(&m,(char *)funcname);
64*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_u(&m,
65*4d9fdb46SRobert Mustacchi         " on seeing form  0x%x ",form);
66*4d9fdb46SRobert Mustacchi     dwarf_get_FORM_name(form,&defaultname);
67*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_s(&m,
68*4d9fdb46SRobert Mustacchi         " (%s)",(char *)defaultname);
69*4d9fdb46SRobert Mustacchi     _dwarf_error_string(dbg,error,err_code,
70*4d9fdb46SRobert Mustacchi         dwarfstring_string(&m));
71*4d9fdb46SRobert Mustacchi     dwarfstring_destructor(&m);
72*4d9fdb46SRobert Mustacchi }
7349d3bc91SRichard Lowe 
74*4d9fdb46SRobert Mustacchi /* This code was repeated many times, now it
75*4d9fdb46SRobert Mustacchi    is all in one place. */
76*4d9fdb46SRobert Mustacchi static int
get_attr_dbg(Dwarf_Debug * dbg,Dwarf_CU_Context * cu_context,Dwarf_Attribute attr,Dwarf_Error * error)77*4d9fdb46SRobert Mustacchi get_attr_dbg(Dwarf_Debug *dbg,
78*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context * cu_context,
79*4d9fdb46SRobert Mustacchi     Dwarf_Attribute attr,
80*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
81*4d9fdb46SRobert Mustacchi {
82*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cup;
8349d3bc91SRichard Lowe     if (attr == NULL) {
8407dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
8507dc1947SRichard Lowe         return (DW_DLV_ERROR);
8649d3bc91SRichard Lowe     }
8749d3bc91SRichard Lowe 
88*4d9fdb46SRobert Mustacchi     cup = attr->ar_cu_context;
89*4d9fdb46SRobert Mustacchi     if (cup == NULL) {
9007dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
9107dc1947SRichard Lowe         return (DW_DLV_ERROR);
9249d3bc91SRichard Lowe     }
9349d3bc91SRichard Lowe 
94*4d9fdb46SRobert Mustacchi     if (cup->cc_dbg == NULL) {
9507dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
9607dc1947SRichard Lowe         return (DW_DLV_ERROR);
9749d3bc91SRichard Lowe     }
98*4d9fdb46SRobert Mustacchi     *cu_context = cup;
99*4d9fdb46SRobert Mustacchi     *dbg = cup->cc_dbg;
100*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
10149d3bc91SRichard Lowe 
102*4d9fdb46SRobert Mustacchi }
103*4d9fdb46SRobert Mustacchi 
104*4d9fdb46SRobert Mustacchi int
dwarf_hasform(Dwarf_Attribute attr,Dwarf_Half form,Dwarf_Bool * return_bool,Dwarf_Error * error)105*4d9fdb46SRobert Mustacchi dwarf_hasform(Dwarf_Attribute attr,
106*4d9fdb46SRobert Mustacchi     Dwarf_Half form,
107*4d9fdb46SRobert Mustacchi     Dwarf_Bool * return_bool, Dwarf_Error * error)
108*4d9fdb46SRobert Mustacchi {
109*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
110*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context = 0;
111*4d9fdb46SRobert Mustacchi 
112*4d9fdb46SRobert Mustacchi     int res  =get_attr_dbg(&dbg,&cu_context, attr,error);
113*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
114*4d9fdb46SRobert Mustacchi         return res;
115*4d9fdb46SRobert Mustacchi     }
11649d3bc91SRichard Lowe     *return_bool = (attr->ar_attribute_form == form);
11749d3bc91SRichard Lowe     return DW_DLV_OK;
11849d3bc91SRichard Lowe }
11949d3bc91SRichard Lowe 
12049d3bc91SRichard Lowe /* Not often called, we do not worry about efficiency here.
12149d3bc91SRichard Lowe    The dwarf_whatform() call does the sanity checks for us.
12249d3bc91SRichard Lowe */
12349d3bc91SRichard Lowe int
dwarf_whatform_direct(Dwarf_Attribute attr,Dwarf_Half * return_form,Dwarf_Error * error)12449d3bc91SRichard Lowe dwarf_whatform_direct(Dwarf_Attribute attr,
125*4d9fdb46SRobert Mustacchi     Dwarf_Half * return_form, Dwarf_Error * error)
12649d3bc91SRichard Lowe {
12749d3bc91SRichard Lowe     int res = dwarf_whatform(attr, return_form, error);
12849d3bc91SRichard Lowe 
12949d3bc91SRichard Lowe     if (res != DW_DLV_OK) {
13007dc1947SRichard Lowe         return res;
13149d3bc91SRichard Lowe     }
13249d3bc91SRichard Lowe 
13349d3bc91SRichard Lowe     *return_form = attr->ar_attribute_form_direct;
13449d3bc91SRichard Lowe     return (DW_DLV_OK);
13549d3bc91SRichard Lowe }
136*4d9fdb46SRobert Mustacchi 
137*4d9fdb46SRobert Mustacchi /*  Pass in the content of a block and the length of that
138*4d9fdb46SRobert Mustacchi     content. On success return DW_DLV_OK and set *value_count
139*4d9fdb46SRobert Mustacchi     to the size of the array returned through value_array. */
140*4d9fdb46SRobert Mustacchi int
dwarf_uncompress_integer_block_a(Dwarf_Debug dbg,Dwarf_Unsigned input_length_in_bytes,void * input_block,Dwarf_Unsigned * value_count,Dwarf_Signed ** value_array,Dwarf_Error * error)141*4d9fdb46SRobert Mustacchi dwarf_uncompress_integer_block_a(Dwarf_Debug dbg,
142*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned     input_length_in_bytes,
143*4d9fdb46SRobert Mustacchi     void             * input_block,
144*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   * value_count,
145*4d9fdb46SRobert Mustacchi     Dwarf_Signed    ** value_array,
146*4d9fdb46SRobert Mustacchi     Dwarf_Error      * error)
147*4d9fdb46SRobert Mustacchi {
148*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned output_length_in_units = 0;
149*4d9fdb46SRobert Mustacchi     Dwarf_Signed * output_block = 0;
150*4d9fdb46SRobert Mustacchi     unsigned i = 0;
151*4d9fdb46SRobert Mustacchi     char * ptr = 0;
152*4d9fdb46SRobert Mustacchi     int remain = 0;
153*4d9fdb46SRobert Mustacchi     Dwarf_Signed * array = 0;
154*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr endptr = (Dwarf_Byte_Ptr)input_block+
155*4d9fdb46SRobert Mustacchi         input_length_in_bytes;
156*4d9fdb46SRobert Mustacchi 
157*4d9fdb46SRobert Mustacchi     output_length_in_units = 0;
158*4d9fdb46SRobert Mustacchi     remain = input_length_in_bytes;
159*4d9fdb46SRobert Mustacchi     ptr = input_block;
160*4d9fdb46SRobert Mustacchi     while (remain > 0) {
161*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned len = 0;
162*4d9fdb46SRobert Mustacchi         Dwarf_Signed value = 0;
163*4d9fdb46SRobert Mustacchi         int rres = 0;
164*4d9fdb46SRobert Mustacchi 
165*4d9fdb46SRobert Mustacchi         rres = _dwarf_decode_s_leb128_chk((unsigned char *)ptr,
166*4d9fdb46SRobert Mustacchi             &len, &value,endptr);
167*4d9fdb46SRobert Mustacchi         if (rres != DW_DLV_OK) {
168*4d9fdb46SRobert Mustacchi             _dwarf_error(NULL, error, DW_DLE_LEB_IMPROPER);
169*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
170*4d9fdb46SRobert Mustacchi         }
171*4d9fdb46SRobert Mustacchi         ptr += len;
172*4d9fdb46SRobert Mustacchi         remain -= len;
173*4d9fdb46SRobert Mustacchi         output_length_in_units++;
174*4d9fdb46SRobert Mustacchi     }
175*4d9fdb46SRobert Mustacchi     if (remain != 0) {
176*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL);
177*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
178*4d9fdb46SRobert Mustacchi     }
179*4d9fdb46SRobert Mustacchi 
180*4d9fdb46SRobert Mustacchi     output_block = (Dwarf_Signed*)
181*4d9fdb46SRobert Mustacchi         _dwarf_get_alloc(dbg,
182*4d9fdb46SRobert Mustacchi             DW_DLA_STRING,
183*4d9fdb46SRobert Mustacchi             output_length_in_units * sizeof(Dwarf_Signed));
184*4d9fdb46SRobert Mustacchi     if (!output_block) {
185*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
186*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
187*4d9fdb46SRobert Mustacchi     }
188*4d9fdb46SRobert Mustacchi     array = output_block;
189*4d9fdb46SRobert Mustacchi     remain = input_length_in_bytes;
190*4d9fdb46SRobert Mustacchi     ptr = input_block;
191*4d9fdb46SRobert Mustacchi     for (i=0; i<output_length_in_units && remain>0; i++) {
192*4d9fdb46SRobert Mustacchi         Dwarf_Signed num;
193*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned len;
194*4d9fdb46SRobert Mustacchi         int sres = 0;
195*4d9fdb46SRobert Mustacchi 
196*4d9fdb46SRobert Mustacchi         sres = _dwarf_decode_s_leb128_chk((unsigned char *)ptr,
197*4d9fdb46SRobert Mustacchi             &len, &num,endptr);
198*4d9fdb46SRobert Mustacchi         if (sres != DW_DLV_OK) {
199*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg,output_block,DW_DLA_STRING);
200*4d9fdb46SRobert Mustacchi             _dwarf_error(NULL, error, DW_DLE_LEB_IMPROPER);
201*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
202*4d9fdb46SRobert Mustacchi         }
203*4d9fdb46SRobert Mustacchi         ptr += len;
204*4d9fdb46SRobert Mustacchi         remain -= len;
205*4d9fdb46SRobert Mustacchi         array[i] = num;
206*4d9fdb46SRobert Mustacchi     }
207*4d9fdb46SRobert Mustacchi 
208*4d9fdb46SRobert Mustacchi     if (remain != 0) {
209*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, (unsigned char *)output_block,
210*4d9fdb46SRobert Mustacchi             DW_DLA_STRING);
211*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
212*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
213*4d9fdb46SRobert Mustacchi     }
214*4d9fdb46SRobert Mustacchi 
215*4d9fdb46SRobert Mustacchi     *value_count = output_length_in_units;
216*4d9fdb46SRobert Mustacchi     *value_array = output_block;
217*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
218*4d9fdb46SRobert Mustacchi }
219*4d9fdb46SRobert Mustacchi 
220*4d9fdb46SRobert Mustacchi /*  This code was contributed around 2007
221*4d9fdb46SRobert Mustacchi     and the return value is in the wrong form.
222*4d9fdb46SRobert Mustacchi     See dwarf_uncompress_integer_block_a() above.
223*4d9fdb46SRobert Mustacchi 
224*4d9fdb46SRobert Mustacchi     As of 2019 it is not clear that Sun Sparc
225*4d9fdb46SRobert Mustacchi     compilers are in current use, nor whether
226*4d9fdb46SRobert Mustacchi     there is a reason to make reads of
227*4d9fdb46SRobert Mustacchi     this data format safe from corrupted object files.
228*4d9fdb46SRobert Mustacchi */
22907dc1947SRichard Lowe void *
dwarf_uncompress_integer_block(Dwarf_Debug dbg,Dwarf_Bool unit_is_signed,Dwarf_Small unit_length_in_bits,void * input_block,Dwarf_Unsigned input_length_in_bytes,Dwarf_Unsigned * output_length_in_units_ptr,Dwarf_Error * error)23007dc1947SRichard Lowe dwarf_uncompress_integer_block(
23107dc1947SRichard Lowe     Dwarf_Debug      dbg,
23207dc1947SRichard Lowe     Dwarf_Bool       unit_is_signed,
23307dc1947SRichard Lowe     Dwarf_Small      unit_length_in_bits,
23407dc1947SRichard Lowe     void*            input_block,
23507dc1947SRichard Lowe     Dwarf_Unsigned   input_length_in_bytes,
23607dc1947SRichard Lowe     Dwarf_Unsigned*  output_length_in_units_ptr,
23707dc1947SRichard Lowe     Dwarf_Error*     error
23807dc1947SRichard Lowe )
23907dc1947SRichard Lowe {
24007dc1947SRichard Lowe     Dwarf_Unsigned output_length_in_units = 0;
24107dc1947SRichard Lowe     void * output_block = 0;
242*4d9fdb46SRobert Mustacchi     unsigned i = 0;
24307dc1947SRichard Lowe     char * ptr = 0;
24407dc1947SRichard Lowe     int remain = 0;
245*4d9fdb46SRobert Mustacchi     /*  This only applies to Sun and there an unsigned
246*4d9fdb46SRobert Mustacchi         is 4 bytes so this works.  As with
247*4d9fdb46SRobert Mustacchi         most linux. */
248*4d9fdb46SRobert Mustacchi     unsigned * array = 0;
249*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr endptr = (Dwarf_Byte_Ptr)input_block+
250*4d9fdb46SRobert Mustacchi         input_length_in_bytes;
25107dc1947SRichard Lowe 
25207dc1947SRichard Lowe     if (dbg == NULL) {
25307dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_DBG_NULL);
25407dc1947SRichard Lowe         return((void *)DW_DLV_BADADDR);
25507dc1947SRichard Lowe     }
256*4d9fdb46SRobert Mustacchi 
257*4d9fdb46SRobert Mustacchi 
25807dc1947SRichard Lowe     if (unit_is_signed == false ||
25907dc1947SRichard Lowe         unit_length_in_bits != 32 ||
26007dc1947SRichard Lowe         input_block == NULL ||
26107dc1947SRichard Lowe         input_length_in_bytes == 0 ||
26207dc1947SRichard Lowe         output_length_in_units_ptr == NULL) {
263*4d9fdb46SRobert Mustacchi 
26407dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_BADBITC);
26507dc1947SRichard Lowe         return ((void *) DW_DLV_BADADDR);
26607dc1947SRichard Lowe     }
26707dc1947SRichard Lowe 
26807dc1947SRichard Lowe     /* At this point we assume the format is: signed 32 bit */
26907dc1947SRichard Lowe 
27007dc1947SRichard Lowe     /* first uncompress everything to find the total size. */
27107dc1947SRichard Lowe 
27207dc1947SRichard Lowe     output_length_in_units = 0;
27307dc1947SRichard Lowe     remain = input_length_in_bytes;
27407dc1947SRichard Lowe     ptr = input_block;
27507dc1947SRichard Lowe     while (remain > 0) {
276*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned len = 0;
277*4d9fdb46SRobert Mustacchi         Dwarf_Signed value = 0;
278*4d9fdb46SRobert Mustacchi         int rres = 0;
279*4d9fdb46SRobert Mustacchi 
280*4d9fdb46SRobert Mustacchi         rres = _dwarf_decode_s_leb128_chk((unsigned char *)ptr,
281*4d9fdb46SRobert Mustacchi             &len, &value,endptr);
282*4d9fdb46SRobert Mustacchi         if (rres != DW_DLV_OK) {
283*4d9fdb46SRobert Mustacchi             return ((void *)DW_DLV_BADADDR);
284*4d9fdb46SRobert Mustacchi         }
28507dc1947SRichard Lowe         ptr += len;
28607dc1947SRichard Lowe         remain -= len;
28707dc1947SRichard Lowe         output_length_in_units++;
28807dc1947SRichard Lowe     }
28907dc1947SRichard Lowe 
29007dc1947SRichard Lowe     if (remain != 0) {
29107dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL);
29207dc1947SRichard Lowe         return((void *)DW_DLV_BADADDR);
29307dc1947SRichard Lowe     }
294*4d9fdb46SRobert Mustacchi 
29507dc1947SRichard Lowe     /* then alloc */
29607dc1947SRichard Lowe 
29707dc1947SRichard Lowe     output_block = (void *)
29807dc1947SRichard Lowe         _dwarf_get_alloc(dbg,
299*4d9fdb46SRobert Mustacchi             DW_DLA_STRING,
300*4d9fdb46SRobert Mustacchi             output_length_in_units * (unit_length_in_bits / 8));
30107dc1947SRichard Lowe     if (output_block == NULL) {
30207dc1947SRichard Lowe         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
30307dc1947SRichard Lowe         return((void*)DW_DLV_BADADDR);
30407dc1947SRichard Lowe     }
305*4d9fdb46SRobert Mustacchi 
30607dc1947SRichard Lowe     /* then uncompress again and copy into new buffer */
30707dc1947SRichard Lowe 
308*4d9fdb46SRobert Mustacchi     array = (unsigned *) output_block;
30907dc1947SRichard Lowe     remain = input_length_in_bytes;
31007dc1947SRichard Lowe     ptr = input_block;
31107dc1947SRichard Lowe     for (i=0; i<output_length_in_units && remain>0; i++) {
31207dc1947SRichard Lowe         Dwarf_Signed num;
313*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned len;
314*4d9fdb46SRobert Mustacchi         int sres = 0;
315*4d9fdb46SRobert Mustacchi 
316*4d9fdb46SRobert Mustacchi         sres = _dwarf_decode_s_leb128_chk((unsigned char *)ptr,
317*4d9fdb46SRobert Mustacchi             &len, &num,endptr);
318*4d9fdb46SRobert Mustacchi         if (sres != DW_DLV_OK) {
319*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg,output_block,DW_DLA_STRING);
320*4d9fdb46SRobert Mustacchi             return ((void *) DW_DLV_BADADDR);
321*4d9fdb46SRobert Mustacchi         }
32207dc1947SRichard Lowe         ptr += len;
32307dc1947SRichard Lowe         remain -= len;
32407dc1947SRichard Lowe         array[i] = num;
32507dc1947SRichard Lowe     }
32607dc1947SRichard Lowe 
32707dc1947SRichard Lowe     if (remain != 0) {
32807dc1947SRichard Lowe         dwarf_dealloc(dbg, (unsigned char *)output_block, DW_DLA_STRING);
32907dc1947SRichard Lowe         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
33007dc1947SRichard Lowe         return((Dwarf_P_Attribute)DW_DLV_BADADDR);
33107dc1947SRichard Lowe     }
33207dc1947SRichard Lowe 
33307dc1947SRichard Lowe     *output_length_in_units_ptr = output_length_in_units;
33407dc1947SRichard Lowe     return output_block;
33507dc1947SRichard Lowe }
33607dc1947SRichard Lowe 
33707dc1947SRichard Lowe void
dwarf_dealloc_uncompressed_block(Dwarf_Debug dbg,void * space)33807dc1947SRichard Lowe dwarf_dealloc_uncompressed_block(Dwarf_Debug dbg, void * space)
33907dc1947SRichard Lowe {
34007dc1947SRichard Lowe     dwarf_dealloc(dbg, space, DW_DLA_STRING);
34107dc1947SRichard Lowe }
34207dc1947SRichard Lowe 
34349d3bc91SRichard Lowe 
34449d3bc91SRichard Lowe int
dwarf_whatform(Dwarf_Attribute attr,Dwarf_Half * return_form,Dwarf_Error * error)34549d3bc91SRichard Lowe dwarf_whatform(Dwarf_Attribute attr,
346*4d9fdb46SRobert Mustacchi     Dwarf_Half * return_form, Dwarf_Error * error)
34749d3bc91SRichard Lowe {
34807dc1947SRichard Lowe     Dwarf_CU_Context cu_context = 0;
349*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
35049d3bc91SRichard Lowe 
351*4d9fdb46SRobert Mustacchi     int res  =get_attr_dbg(&dbg,&cu_context, attr,error);
352*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
353*4d9fdb46SRobert Mustacchi         return res;
35449d3bc91SRichard Lowe     }
35549d3bc91SRichard Lowe     *return_form = attr->ar_attribute_form;
35649d3bc91SRichard Lowe     return (DW_DLV_OK);
35749d3bc91SRichard Lowe }
35849d3bc91SRichard Lowe 
35949d3bc91SRichard Lowe 
36049d3bc91SRichard Lowe /*
36149d3bc91SRichard Lowe     This function is analogous to dwarf_whatform.
36249d3bc91SRichard Lowe     It returns the attribute in attr instead of
36349d3bc91SRichard Lowe     the form.
36449d3bc91SRichard Lowe */
36549d3bc91SRichard Lowe int
dwarf_whatattr(Dwarf_Attribute attr,Dwarf_Half * return_attr,Dwarf_Error * error)36649d3bc91SRichard Lowe dwarf_whatattr(Dwarf_Attribute attr,
367*4d9fdb46SRobert Mustacchi     Dwarf_Half * return_attr, Dwarf_Error * error)
36849d3bc91SRichard Lowe {
36907dc1947SRichard Lowe     Dwarf_CU_Context cu_context = 0;
370*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
37149d3bc91SRichard Lowe 
372*4d9fdb46SRobert Mustacchi     int res  =get_attr_dbg(&dbg,&cu_context, attr,error);
373*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
374*4d9fdb46SRobert Mustacchi         return res;
37549d3bc91SRichard Lowe     }
376*4d9fdb46SRobert Mustacchi     *return_attr = (attr->ar_attribute);
377*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
378*4d9fdb46SRobert Mustacchi }
37949d3bc91SRichard Lowe 
380*4d9fdb46SRobert Mustacchi 
381*4d9fdb46SRobert Mustacchi /*  Convert an offset within the local CU into a section-relative
382*4d9fdb46SRobert Mustacchi     debug_info (or debug_types) offset.
383*4d9fdb46SRobert Mustacchi     See dwarf_global_formref() and dwarf_formref()
384*4d9fdb46SRobert Mustacchi     for additional information on conversion rules.
385*4d9fdb46SRobert Mustacchi */
386*4d9fdb46SRobert Mustacchi int
dwarf_convert_to_global_offset(Dwarf_Attribute attr,Dwarf_Off offset,Dwarf_Off * ret_offset,Dwarf_Error * error)387*4d9fdb46SRobert Mustacchi dwarf_convert_to_global_offset(Dwarf_Attribute attr,
388*4d9fdb46SRobert Mustacchi     Dwarf_Off offset, Dwarf_Off * ret_offset, Dwarf_Error * error)
389*4d9fdb46SRobert Mustacchi {
390*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
391*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context = 0;
392*4d9fdb46SRobert Mustacchi     int res = 0;
393*4d9fdb46SRobert Mustacchi 
394*4d9fdb46SRobert Mustacchi     res  = get_attr_dbg(&dbg,&cu_context,attr,error);
395*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
396*4d9fdb46SRobert Mustacchi         return res;
39749d3bc91SRichard Lowe     }
398*4d9fdb46SRobert Mustacchi     switch (attr->ar_attribute_form) {
399*4d9fdb46SRobert Mustacchi     case DW_FORM_ref1:
400*4d9fdb46SRobert Mustacchi     case DW_FORM_ref2:
401*4d9fdb46SRobert Mustacchi     case DW_FORM_ref4:
402*4d9fdb46SRobert Mustacchi     case DW_FORM_ref8:
403*4d9fdb46SRobert Mustacchi     case DW_FORM_ref_udata:
404*4d9fdb46SRobert Mustacchi         /*  It is a cu-local offset. Convert to section-global. */
405*4d9fdb46SRobert Mustacchi         /*  It would be nice to put some code to check
406*4d9fdb46SRobert Mustacchi             legality of the offset */
407*4d9fdb46SRobert Mustacchi         /*  cc_debug_offset always has any DWP Package File
408*4d9fdb46SRobert Mustacchi             offset included (when the cu_context created)
409*4d9fdb46SRobert Mustacchi             so there is no extra work for DWP.
410*4d9fdb46SRobert Mustacchi             Globalize the offset */
411*4d9fdb46SRobert Mustacchi         offset += cu_context->cc_debug_offset;
41249d3bc91SRichard Lowe 
413*4d9fdb46SRobert Mustacchi         break;
414*4d9fdb46SRobert Mustacchi 
415*4d9fdb46SRobert Mustacchi     case DW_FORM_ref_addr:
416*4d9fdb46SRobert Mustacchi         /*  This offset is defined to be debug_info global already, so
417*4d9fdb46SRobert Mustacchi             use this value unaltered.
418*4d9fdb46SRobert Mustacchi 
419*4d9fdb46SRobert Mustacchi             Since a DWP package file is not relocated there
420*4d9fdb46SRobert Mustacchi             is no way that this reference offset to an address in
421*4d9fdb46SRobert Mustacchi             any other CU can be correct for a DWP Package File offset
422*4d9fdb46SRobert Mustacchi             */
423*4d9fdb46SRobert Mustacchi         break;
424*4d9fdb46SRobert Mustacchi     default: {
425*4d9fdb46SRobert Mustacchi         dwarfstring m;
426*4d9fdb46SRobert Mustacchi 
427*4d9fdb46SRobert Mustacchi         dwarfstring_constructor(&m);
428*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m,
429*4d9fdb46SRobert Mustacchi             "DW_DLE_BAD_REF_FORM. The form "
430*4d9fdb46SRobert Mustacchi             "code is 0x%x which cannot be converted to a global "
431*4d9fdb46SRobert Mustacchi             " offset by "
432*4d9fdb46SRobert Mustacchi             "dwarf_convert_to_global_offset()",
433*4d9fdb46SRobert Mustacchi             attr->ar_attribute_form);
434*4d9fdb46SRobert Mustacchi         _dwarf_error_string(dbg, error, DW_DLE_BAD_REF_FORM,
435*4d9fdb46SRobert Mustacchi             dwarfstring_string(&m));
436*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&m);
437*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
438*4d9fdb46SRobert Mustacchi         }
43949d3bc91SRichard Lowe     }
44049d3bc91SRichard Lowe 
441*4d9fdb46SRobert Mustacchi     *ret_offset = (offset);
44249d3bc91SRichard Lowe     return DW_DLV_OK;
44349d3bc91SRichard Lowe }
44449d3bc91SRichard Lowe 
44549d3bc91SRichard Lowe 
446*4d9fdb46SRobert Mustacchi /*  A global offset cannot be returned by this interface:
44707dc1947SRichard Lowe     see dwarf_global_formref().
44807dc1947SRichard Lowe 
449*4d9fdb46SRobert Mustacchi     DW_FORM_ref_addr is considered an incorrect form
450*4d9fdb46SRobert Mustacchi     for this call because DW_FORM_ref_addr is a global-offset into
45107dc1947SRichard Lowe     the debug_info section.
45207dc1947SRichard Lowe 
45307dc1947SRichard Lowe     For the same reason DW_FORM_data4/data8 are not returned
45407dc1947SRichard Lowe     from this function.
45507dc1947SRichard Lowe 
45607dc1947SRichard Lowe     For the same reason DW_FORM_sec_offset is not returned
457*4d9fdb46SRobert Mustacchi     from this function, DW_FORM_sec_offset is a global offset
45807dc1947SRichard Lowe     (to various sections, not a CU relative offset.
45907dc1947SRichard Lowe 
46007dc1947SRichard Lowe     DW_FORM_ref_addr has a value which was documented in
46107dc1947SRichard Lowe     DWARF2 as address-size but which was always an offset
46207dc1947SRichard Lowe     so should have always been offset size (wording
463*4d9fdb46SRobert Mustacchi     corrected in DWARF3).
464*4d9fdb46SRobert Mustacchi     The dwarfstd.org FAQ "How big is a DW_FORM_ref_addr?"
465*4d9fdb46SRobert Mustacchi     suggested all should use offset-size, but that suggestion
466*4d9fdb46SRobert Mustacchi     seems to have been ignored in favor of doing what the
467*4d9fdb46SRobert Mustacchi     DWARF2 and 3 standards actually say.
468*4d9fdb46SRobert Mustacchi 
469*4d9fdb46SRobert Mustacchi     November, 2010: *ret_offset is always set now.
470*4d9fdb46SRobert Mustacchi     Even in case of error.
471*4d9fdb46SRobert Mustacchi     Set to zero for most errors, but for
472*4d9fdb46SRobert Mustacchi         DW_DLE_ATTR_FORM_OFFSET_BAD
473*4d9fdb46SRobert Mustacchi     *ret_offset is set to the bad offset.
474*4d9fdb46SRobert Mustacchi 
475*4d9fdb46SRobert Mustacchi     DW_FORM_addrx
476*4d9fdb46SRobert Mustacchi     DW_FORM_strx
477*4d9fdb46SRobert Mustacchi     DW_FORM_rnglistx
478*4d9fdb46SRobert Mustacchi     DW_FORM_GNU_addr_index
479*4d9fdb46SRobert Mustacchi     DW_FORM_GNU_str_index
480*4d9fdb46SRobert Mustacchi     are not references to .debug_info/.debug_types,
481*4d9fdb46SRobert Mustacchi     so they are not allowed here. */
482*4d9fdb46SRobert Mustacchi 
48349d3bc91SRichard Lowe 
48449d3bc91SRichard Lowe int
dwarf_formref(Dwarf_Attribute attr,Dwarf_Off * ret_offset,Dwarf_Error * error)48549d3bc91SRichard Lowe dwarf_formref(Dwarf_Attribute attr,
486*4d9fdb46SRobert Mustacchi    Dwarf_Off * ret_offset,
487*4d9fdb46SRobert Mustacchi    Dwarf_Error * error)
48849d3bc91SRichard Lowe {
48907dc1947SRichard Lowe     Dwarf_Debug dbg = 0;
49007dc1947SRichard Lowe     Dwarf_Unsigned offset = 0;
49107dc1947SRichard Lowe     Dwarf_CU_Context cu_context = 0;
492*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned maximumoffset = 0;
493*4d9fdb46SRobert Mustacchi     int res = DW_DLV_ERROR;
494*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr section_end = 0;
49549d3bc91SRichard Lowe 
496*4d9fdb46SRobert Mustacchi     *ret_offset = 0;
497*4d9fdb46SRobert Mustacchi     res  = get_attr_dbg(&dbg,&cu_context,attr,error);
498*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
499*4d9fdb46SRobert Mustacchi         return res;
50049d3bc91SRichard Lowe     }
501*4d9fdb46SRobert Mustacchi     section_end =
502*4d9fdb46SRobert Mustacchi         _dwarf_calculate_info_section_end_ptr(cu_context);
50349d3bc91SRichard Lowe 
50449d3bc91SRichard Lowe     switch (attr->ar_attribute_form) {
50549d3bc91SRichard Lowe 
50649d3bc91SRichard Lowe     case DW_FORM_ref1:
507*4d9fdb46SRobert Mustacchi         offset = *(Dwarf_Small *) attr->ar_debug_ptr;
50807dc1947SRichard Lowe         break;
50949d3bc91SRichard Lowe 
51049d3bc91SRichard Lowe     case DW_FORM_ref2:
511*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
512*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr, DWARF_HALF_SIZE,
513*4d9fdb46SRobert Mustacchi             error,section_end);
51407dc1947SRichard Lowe         break;
51549d3bc91SRichard Lowe 
51649d3bc91SRichard Lowe     case DW_FORM_ref4:
517*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
518*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr, DWARF_32BIT_SIZE,
519*4d9fdb46SRobert Mustacchi             error,section_end);
52007dc1947SRichard Lowe         break;
52149d3bc91SRichard Lowe 
52249d3bc91SRichard Lowe     case DW_FORM_ref8:
523*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
524*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr, DWARF_64BIT_SIZE,
525*4d9fdb46SRobert Mustacchi             error,section_end);
52607dc1947SRichard Lowe         break;
52749d3bc91SRichard Lowe 
528*4d9fdb46SRobert Mustacchi     case DW_FORM_ref_udata: {
529*4d9fdb46SRobert Mustacchi         Dwarf_Byte_Ptr ptr = attr->ar_debug_ptr;
530*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned localoffset = 0;
53149d3bc91SRichard Lowe 
532*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(ptr,localoffset,
533*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
534*4d9fdb46SRobert Mustacchi         offset = localoffset;
535*4d9fdb46SRobert Mustacchi         break;
53649d3bc91SRichard Lowe     }
537*4d9fdb46SRobert Mustacchi     case DW_FORM_ref_sig8:
538*4d9fdb46SRobert Mustacchi         /*  We cannot handle this here.
539*4d9fdb46SRobert Mustacchi             The reference is to .debug_types
540*4d9fdb46SRobert Mustacchi             not a .debug_info CU local offset. */
541*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_REF_SIG8_NOT_HANDLED);
54207dc1947SRichard Lowe         return (DW_DLV_ERROR);
543*4d9fdb46SRobert Mustacchi     default: {
544*4d9fdb46SRobert Mustacchi         dwarfstring m;
545*4d9fdb46SRobert Mustacchi 
546*4d9fdb46SRobert Mustacchi         dwarfstring_constructor(&m);
547*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m,
548*4d9fdb46SRobert Mustacchi             "DW_DLE_BAD_REF_FORM. The form "
549*4d9fdb46SRobert Mustacchi             "code is 0x%x which does not have an offset "
550*4d9fdb46SRobert Mustacchi             " for "
551*4d9fdb46SRobert Mustacchi             "dwarf_formref() to return.",
552*4d9fdb46SRobert Mustacchi             attr->ar_attribute_form);
553*4d9fdb46SRobert Mustacchi         _dwarf_error_string(dbg, error, DW_DLE_BAD_REF_FORM,
554*4d9fdb46SRobert Mustacchi             dwarfstring_string(&m));
555*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&m);
556*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
557*4d9fdb46SRobert Mustacchi         }
55849d3bc91SRichard Lowe     }
55949d3bc91SRichard Lowe 
560*4d9fdb46SRobert Mustacchi     /*  Check that offset is within current
561*4d9fdb46SRobert Mustacchi         cu portion of .debug_info. */
562*4d9fdb46SRobert Mustacchi 
563*4d9fdb46SRobert Mustacchi     maximumoffset = cu_context->cc_length +
564*4d9fdb46SRobert Mustacchi         cu_context->cc_length_size +
565*4d9fdb46SRobert Mustacchi         cu_context->cc_extension_size;
566*4d9fdb46SRobert Mustacchi     if (offset >= maximumoffset) {
567*4d9fdb46SRobert Mustacchi         /*  For the DW_TAG_compile_unit is legal to have the
568*4d9fdb46SRobert Mustacchi             DW_AT_sibling attribute outside the current cu portion of
569*4d9fdb46SRobert Mustacchi             .debug_info.
570*4d9fdb46SRobert Mustacchi             In other words, sibling points to the end of the CU.
571*4d9fdb46SRobert Mustacchi             It is used for precompiled headers.
572*4d9fdb46SRobert Mustacchi             The valid condition will be: 'offset == maximumoffset'. */
573*4d9fdb46SRobert Mustacchi         Dwarf_Half tag = 0;
574*4d9fdb46SRobert Mustacchi         int tres = dwarf_tag(attr->ar_die,&tag,error);
575*4d9fdb46SRobert Mustacchi         if (tres != DW_DLV_OK) {
576*4d9fdb46SRobert Mustacchi             if (tres == DW_DLV_NO_ENTRY) {
577*4d9fdb46SRobert Mustacchi                 _dwarf_error(dbg, error, DW_DLE_NO_TAG_FOR_DIE);
578*4d9fdb46SRobert Mustacchi                 return DW_DLV_ERROR;
579*4d9fdb46SRobert Mustacchi             }
580*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
581*4d9fdb46SRobert Mustacchi         }
582*4d9fdb46SRobert Mustacchi 
583*4d9fdb46SRobert Mustacchi         if (DW_TAG_compile_unit != tag &&
584*4d9fdb46SRobert Mustacchi             DW_AT_sibling != attr->ar_attribute &&
585*4d9fdb46SRobert Mustacchi             offset > maximumoffset) {
586*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_OFFSET_BAD);
587*4d9fdb46SRobert Mustacchi             /* Return the incorrect offset for better error reporting */
588*4d9fdb46SRobert Mustacchi             *ret_offset = (offset);
589*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
590*4d9fdb46SRobert Mustacchi         }
591*4d9fdb46SRobert Mustacchi     }
59249d3bc91SRichard Lowe     *ret_offset = (offset);
59349d3bc91SRichard Lowe     return DW_DLV_OK;
59449d3bc91SRichard Lowe }
59549d3bc91SRichard Lowe 
596*4d9fdb46SRobert Mustacchi static int
_dwarf_formsig8_internal(Dwarf_Attribute attr,int formexpected,int formerrnum,Dwarf_Sig8 * returned_sig_bytes,Dwarf_Error * error)597*4d9fdb46SRobert Mustacchi _dwarf_formsig8_internal(Dwarf_Attribute attr,
598*4d9fdb46SRobert Mustacchi     int formexpected,
599*4d9fdb46SRobert Mustacchi     int formerrnum,
60007dc1947SRichard Lowe     Dwarf_Sig8 * returned_sig_bytes,
60107dc1947SRichard Lowe     Dwarf_Error*     error)
60207dc1947SRichard Lowe {
60307dc1947SRichard Lowe     Dwarf_Debug dbg = 0;
60407dc1947SRichard Lowe     Dwarf_CU_Context cu_context = 0;
605*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr  field_end = 0;
606*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr  section_end = 0;
60707dc1947SRichard Lowe 
608*4d9fdb46SRobert Mustacchi     int res  = get_attr_dbg(&dbg,&cu_context,attr,error);
609*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
610*4d9fdb46SRobert Mustacchi         return res;
61107dc1947SRichard Lowe     }
61207dc1947SRichard Lowe 
613*4d9fdb46SRobert Mustacchi     if (attr->ar_attribute_form != formexpected ) {
614*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, formerrnum);
61507dc1947SRichard Lowe         return (DW_DLV_ERROR);
61607dc1947SRichard Lowe     }
617*4d9fdb46SRobert Mustacchi     section_end =
618*4d9fdb46SRobert Mustacchi         _dwarf_calculate_info_section_end_ptr(cu_context);
619*4d9fdb46SRobert Mustacchi     field_end = attr->ar_debug_ptr + sizeof(Dwarf_Sig8);
620*4d9fdb46SRobert Mustacchi     if (field_end > section_end) {
62107dc1947SRichard Lowe         _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_OFFSET_BAD);
62207dc1947SRichard Lowe         return (DW_DLV_ERROR);
62307dc1947SRichard Lowe     }
624*4d9fdb46SRobert Mustacchi 
625*4d9fdb46SRobert Mustacchi     memcpy(returned_sig_bytes, attr->ar_debug_ptr,
62607dc1947SRichard Lowe         sizeof(Dwarf_Sig8));
62707dc1947SRichard Lowe     return DW_DLV_OK;
62807dc1947SRichard Lowe }
62907dc1947SRichard Lowe 
630*4d9fdb46SRobert Mustacchi int
dwarf_formsig8_const(Dwarf_Attribute attr,Dwarf_Sig8 * returned_sig_bytes,Dwarf_Error * error)631*4d9fdb46SRobert Mustacchi dwarf_formsig8_const(Dwarf_Attribute attr,
632*4d9fdb46SRobert Mustacchi     Dwarf_Sig8 * returned_sig_bytes,
633*4d9fdb46SRobert Mustacchi     Dwarf_Error* error)
634*4d9fdb46SRobert Mustacchi {
635*4d9fdb46SRobert Mustacchi     int res  =_dwarf_formsig8_internal(attr, DW_FORM_data8,
636*4d9fdb46SRobert Mustacchi         DW_DLE_ATTR_FORM_NOT_DATA8,
637*4d9fdb46SRobert Mustacchi         returned_sig_bytes,error);
638*4d9fdb46SRobert Mustacchi     return res;
639*4d9fdb46SRobert Mustacchi }
640*4d9fdb46SRobert Mustacchi 
641*4d9fdb46SRobert Mustacchi /*  dwarf_formsig8 returns in the caller-provided 8 byte area
642*4d9fdb46SRobert Mustacchi     the 8 bytes of a DW_FORM_ref_sig8 (copying the bytes
643*4d9fdb46SRobert Mustacchi     directly to the caller).  Not a string, an 8 byte
644*4d9fdb46SRobert Mustacchi     MD5 hash.  This function is new in DWARF4 libdwarf.
645*4d9fdb46SRobert Mustacchi */
646*4d9fdb46SRobert Mustacchi int
dwarf_formsig8(Dwarf_Attribute attr,Dwarf_Sig8 * returned_sig_bytes,Dwarf_Error * error)647*4d9fdb46SRobert Mustacchi dwarf_formsig8(Dwarf_Attribute attr,
648*4d9fdb46SRobert Mustacchi     Dwarf_Sig8 * returned_sig_bytes,
649*4d9fdb46SRobert Mustacchi     Dwarf_Error* error)
650*4d9fdb46SRobert Mustacchi {
651*4d9fdb46SRobert Mustacchi     int res  = _dwarf_formsig8_internal(attr, DW_FORM_ref_sig8,
652*4d9fdb46SRobert Mustacchi         DW_DLE_BAD_REF_SIG8_FORM,
653*4d9fdb46SRobert Mustacchi         returned_sig_bytes,error);
654*4d9fdb46SRobert Mustacchi     return res;
655*4d9fdb46SRobert Mustacchi }
656*4d9fdb46SRobert Mustacchi 
657*4d9fdb46SRobert Mustacchi 
658*4d9fdb46SRobert Mustacchi 
65907dc1947SRichard Lowe 
660*4d9fdb46SRobert Mustacchi /*  Since this returns section-relative debug_info offsets,
66107dc1947SRichard Lowe     this can represent all REFERENCE forms correctly
66207dc1947SRichard Lowe     and allows all applicable forms.
66307dc1947SRichard Lowe 
66407dc1947SRichard Lowe     DW_FORM_ref_addr has a value which was documented in
66507dc1947SRichard Lowe     DWARF2 as address-size but which was always an offset
66607dc1947SRichard Lowe     so should have always been offset size (wording
66707dc1947SRichard Lowe     corrected in DWARF3).
668*4d9fdb46SRobert Mustacchi     gcc and Go and libdwarf producer code
669*4d9fdb46SRobert Mustacchi     define the length of the value of DW_FORM_ref_addr
670*4d9fdb46SRobert Mustacchi     per the version. So for V2 it is address-size and V3 and later
671*4d9fdb46SRobert Mustacchi     it is offset-size.
67207dc1947SRichard Lowe 
67307dc1947SRichard Lowe     See the DWARF4 document for the 3 cases fitting
67407dc1947SRichard Lowe     reference forms.  The caller must determine which section the
675*4d9fdb46SRobert Mustacchi     reference 'points' to.  The function added in November 2009,
67607dc1947SRichard Lowe     dwarf_get_form_class(), helps in this regard.
677*4d9fdb46SRobert Mustacchi 
678*4d9fdb46SRobert Mustacchi     unlike dwarf_formref(), this allows references to
679*4d9fdb46SRobert Mustacchi     sections other than just .debug_info/.debug_types.
680*4d9fdb46SRobert Mustacchi     See case DW_FORM_sec_offset:
681*4d9fdb46SRobert Mustacchi     case DW_FORM_GNU_ref_alt:   2013 GNU extension
682*4d9fdb46SRobert Mustacchi     case DW_FORM_GNU_strp_alt:  2013 GNU extension
683*4d9fdb46SRobert Mustacchi     case DW_FORM_strp_sup:      DWARF5, sup string section
684*4d9fdb46SRobert Mustacchi     case DW_FORM_line_strp:     DWARF5, .debug_line_str section
68549d3bc91SRichard Lowe */
686*4d9fdb46SRobert Mustacchi 
68749d3bc91SRichard Lowe int
dwarf_global_formref(Dwarf_Attribute attr,Dwarf_Off * ret_offset,Dwarf_Error * error)68849d3bc91SRichard Lowe dwarf_global_formref(Dwarf_Attribute attr,
689*4d9fdb46SRobert Mustacchi     Dwarf_Off * ret_offset, Dwarf_Error * error)
69049d3bc91SRichard Lowe {
69107dc1947SRichard Lowe     Dwarf_Debug dbg = 0;
69207dc1947SRichard Lowe     Dwarf_Unsigned offset = 0;
69307dc1947SRichard Lowe     Dwarf_CU_Context cu_context = 0;
69407dc1947SRichard Lowe     Dwarf_Half context_version = 0;
695*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr section_end = 0;
69649d3bc91SRichard Lowe 
697*4d9fdb46SRobert Mustacchi     int res  = get_attr_dbg(&dbg,&cu_context,attr,error);
698*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
699*4d9fdb46SRobert Mustacchi         return res;
70049d3bc91SRichard Lowe     }
701*4d9fdb46SRobert Mustacchi     section_end =
702*4d9fdb46SRobert Mustacchi         _dwarf_calculate_info_section_end_ptr(cu_context);
70307dc1947SRichard Lowe     context_version = cu_context->cc_version_stamp;
70449d3bc91SRichard Lowe     switch (attr->ar_attribute_form) {
70549d3bc91SRichard Lowe 
70649d3bc91SRichard Lowe     case DW_FORM_ref1:
707*4d9fdb46SRobert Mustacchi         offset = *(Dwarf_Small *) attr->ar_debug_ptr;
70807dc1947SRichard Lowe         goto fixoffset;
70949d3bc91SRichard Lowe 
71049d3bc91SRichard Lowe     case DW_FORM_ref2:
711*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
712*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr, DWARF_HALF_SIZE,
713*4d9fdb46SRobert Mustacchi             error,section_end);
71407dc1947SRichard Lowe         goto fixoffset;
71549d3bc91SRichard Lowe 
71649d3bc91SRichard Lowe     case DW_FORM_ref4:
717*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
718*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr, DWARF_32BIT_SIZE,
719*4d9fdb46SRobert Mustacchi             error,section_end);
72007dc1947SRichard Lowe         goto fixoffset;
72149d3bc91SRichard Lowe 
72249d3bc91SRichard Lowe     case DW_FORM_ref8:
723*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
724*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr, DWARF_64BIT_SIZE,
725*4d9fdb46SRobert Mustacchi             error,section_end);
72607dc1947SRichard Lowe         goto fixoffset;
72749d3bc91SRichard Lowe 
72849d3bc91SRichard Lowe     case DW_FORM_ref_udata:
729*4d9fdb46SRobert Mustacchi         {
730*4d9fdb46SRobert Mustacchi         Dwarf_Byte_Ptr ptr = attr->ar_debug_ptr;
731*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned localoffset = 0;
73207dc1947SRichard Lowe 
733*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(ptr,localoffset,
734*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
735*4d9fdb46SRobert Mustacchi         offset = localoffset;
736*4d9fdb46SRobert Mustacchi 
737*4d9fdb46SRobert Mustacchi         fixoffset: /* we have a local offset, make it global */
73807dc1947SRichard Lowe 
73907dc1947SRichard Lowe         /* check legality of offset */
74007dc1947SRichard Lowe         if (offset >= cu_context->cc_length +
74107dc1947SRichard Lowe             cu_context->cc_length_size +
74207dc1947SRichard Lowe             cu_context->cc_extension_size) {
74307dc1947SRichard Lowe             _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_OFFSET_BAD);
74407dc1947SRichard Lowe             return (DW_DLV_ERROR);
74507dc1947SRichard Lowe         }
74607dc1947SRichard Lowe 
74707dc1947SRichard Lowe         /* globalize the offset */
748*4d9fdb46SRobert Mustacchi         offset += cu_context->cc_debug_offset;
749*4d9fdb46SRobert Mustacchi         }
75007dc1947SRichard Lowe         break;
751*4d9fdb46SRobert Mustacchi 
752*4d9fdb46SRobert Mustacchi     /*  The DWARF2 document did not make clear that
753*4d9fdb46SRobert Mustacchi         DW_FORM_data4( and 8) were references with
754*4d9fdb46SRobert Mustacchi         global offsets to some section.
755*4d9fdb46SRobert Mustacchi         That was first clearly documented in DWARF3.
756*4d9fdb46SRobert Mustacchi         In DWARF4 these two forms are no longer references. */
75707dc1947SRichard Lowe     case DW_FORM_data4:
758*4d9fdb46SRobert Mustacchi         if (context_version >= DW_CU_VERSION4) {
75907dc1947SRichard Lowe             _dwarf_error(dbg, error, DW_DLE_NOT_REF_FORM);
76007dc1947SRichard Lowe             return (DW_DLV_ERROR);
76107dc1947SRichard Lowe         }
762*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
763*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr, DWARF_32BIT_SIZE,
764*4d9fdb46SRobert Mustacchi             error, section_end);
76507dc1947SRichard Lowe         /* The offset is global. */
76607dc1947SRichard Lowe         break;
76707dc1947SRichard Lowe     case DW_FORM_data8:
768*4d9fdb46SRobert Mustacchi         if (context_version >= DW_CU_VERSION4) {
76907dc1947SRichard Lowe             _dwarf_error(dbg, error, DW_DLE_NOT_REF_FORM);
77007dc1947SRichard Lowe             return (DW_DLV_ERROR);
77107dc1947SRichard Lowe         }
772*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
773*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr, DWARF_64BIT_SIZE,
774*4d9fdb46SRobert Mustacchi             error,section_end);
77507dc1947SRichard Lowe         /* The offset is global. */
77607dc1947SRichard Lowe         break;
77749d3bc91SRichard Lowe     case DW_FORM_ref_addr:
778*4d9fdb46SRobert Mustacchi         {
779*4d9fdb46SRobert Mustacchi             /*  In Dwarf V2 DW_FORM_ref_addr was defined
780*4d9fdb46SRobert Mustacchi                 as address-size even though it is a .debug_info
781*4d9fdb46SRobert Mustacchi                 offset.  Fixed in Dwarf V3 to be offset-size.
782*4d9fdb46SRobert Mustacchi                 */
783*4d9fdb46SRobert Mustacchi             unsigned length_size = 0;
784*4d9fdb46SRobert Mustacchi             if (context_version == 2) {
785*4d9fdb46SRobert Mustacchi                 length_size = cu_context->cc_address_size;
786*4d9fdb46SRobert Mustacchi             } else {
787*4d9fdb46SRobert Mustacchi                 length_size = cu_context->cc_length_size;
788*4d9fdb46SRobert Mustacchi             }
789*4d9fdb46SRobert Mustacchi             if (length_size == 4) {
790*4d9fdb46SRobert Mustacchi                 READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
791*4d9fdb46SRobert Mustacchi                     attr->ar_debug_ptr, DWARF_32BIT_SIZE,
792*4d9fdb46SRobert Mustacchi                     error,section_end);
793*4d9fdb46SRobert Mustacchi             } else if (length_size == 8) {
794*4d9fdb46SRobert Mustacchi                 READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
795*4d9fdb46SRobert Mustacchi                     attr->ar_debug_ptr, DWARF_64BIT_SIZE,
796*4d9fdb46SRobert Mustacchi                     error,section_end);
797*4d9fdb46SRobert Mustacchi             } else {
798*4d9fdb46SRobert Mustacchi                 _dwarf_error(dbg, error, DW_DLE_FORM_SEC_OFFSET_LENGTH_BAD);
799*4d9fdb46SRobert Mustacchi                 return (DW_DLV_ERROR);
800*4d9fdb46SRobert Mustacchi             }
801*4d9fdb46SRobert Mustacchi         }
802*4d9fdb46SRobert Mustacchi         break;
803*4d9fdb46SRobert Mustacchi     /*  Index into .debug_rnglist section.
804*4d9fdb46SRobert Mustacchi         Return the index itself. */
805*4d9fdb46SRobert Mustacchi     case DW_FORM_rnglistx: {
806*4d9fdb46SRobert Mustacchi         unsigned length_size = cu_context->cc_length_size;
807*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
808*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr, length_size,
809*4d9fdb46SRobert Mustacchi             error,section_end);
810*4d9fdb46SRobert Mustacchi         }
811*4d9fdb46SRobert Mustacchi         break;
81207dc1947SRichard Lowe     case DW_FORM_sec_offset:
813*4d9fdb46SRobert Mustacchi     case DW_FORM_GNU_ref_alt:  /* 2013 GNU extension */
814*4d9fdb46SRobert Mustacchi     case DW_FORM_GNU_strp_alt: /* 2013 GNU extension */
815*4d9fdb46SRobert Mustacchi     case DW_FORM_strp_sup:     /* DWARF5, sup string section */
816*4d9fdb46SRobert Mustacchi     case DW_FORM_line_strp:    /* DWARF5, .debug_line_str section */
81707dc1947SRichard Lowe         {
818*4d9fdb46SRobert Mustacchi             /*  DW_FORM_sec_offset first exists in DWARF4.*/
819*4d9fdb46SRobert Mustacchi             /*  It is up to the caller to know what the offset
820*4d9fdb46SRobert Mustacchi                 of DW_FORM_sec_offset, DW_FORM_strp_sup
821*4d9fdb46SRobert Mustacchi                 or DW_FORM_GNU_strp_alt etc refer to,
822*4d9fdb46SRobert Mustacchi                 the offset is not going to refer to .debug_info! */
82307dc1947SRichard Lowe             unsigned length_size = cu_context->cc_length_size;
824*4d9fdb46SRobert Mustacchi             if (length_size == 4) {
825*4d9fdb46SRobert Mustacchi                 READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
826*4d9fdb46SRobert Mustacchi                     attr->ar_debug_ptr, DWARF_32BIT_SIZE,
827*4d9fdb46SRobert Mustacchi                     error,section_end);
82807dc1947SRichard Lowe             } else if (length_size == 8) {
829*4d9fdb46SRobert Mustacchi                 READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
830*4d9fdb46SRobert Mustacchi                     attr->ar_debug_ptr, DWARF_64BIT_SIZE,
831*4d9fdb46SRobert Mustacchi                     error,section_end);
83207dc1947SRichard Lowe             } else {
83307dc1947SRichard Lowe                 _dwarf_error(dbg, error, DW_DLE_FORM_SEC_OFFSET_LENGTH_BAD);
83407dc1947SRichard Lowe                 return (DW_DLV_ERROR);
83507dc1947SRichard Lowe             }
83607dc1947SRichard Lowe         }
83707dc1947SRichard Lowe         break;
838*4d9fdb46SRobert Mustacchi     case DW_FORM_ref_sig8: /* FIXME */
839*4d9fdb46SRobert Mustacchi         /*  We cannot handle this yet.
840*4d9fdb46SRobert Mustacchi             The reference is to .debug_types, and
841*4d9fdb46SRobert Mustacchi             this function only returns an offset in
842*4d9fdb46SRobert Mustacchi             .debug_info at this point. */
843*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_REF_SIG8_NOT_HANDLED);
84407dc1947SRichard Lowe         return (DW_DLV_ERROR);
845*4d9fdb46SRobert Mustacchi     default: {
846*4d9fdb46SRobert Mustacchi         dwarfstring m;
847*4d9fdb46SRobert Mustacchi         int formcode = attr->ar_attribute_form;
848*4d9fdb46SRobert Mustacchi         int fcres = 0;
849*4d9fdb46SRobert Mustacchi         const char *name = 0;
850*4d9fdb46SRobert Mustacchi 
851*4d9fdb46SRobert Mustacchi         dwarfstring_constructor(&m);
852*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m,
853*4d9fdb46SRobert Mustacchi             "DW_DLE_BAD_REF_FORM: The form code is 0x%x ",
854*4d9fdb46SRobert Mustacchi             formcode);
855*4d9fdb46SRobert Mustacchi         fcres  = dwarf_get_FORM_name (formcode,&name);
856*4d9fdb46SRobert Mustacchi         if (fcres != DW_DLV_OK) {
857*4d9fdb46SRobert Mustacchi             name="<UnknownFormCode>";
858*4d9fdb46SRobert Mustacchi         }
859*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_s(&m,
860*4d9fdb46SRobert Mustacchi             " %s.",(char *)name);
861*4d9fdb46SRobert Mustacchi         _dwarf_error_string(dbg, error, DW_DLE_BAD_REF_FORM,
862*4d9fdb46SRobert Mustacchi             dwarfstring_string(&m));
863*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&m);
864*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
865*4d9fdb46SRobert Mustacchi         }
86649d3bc91SRichard Lowe     }
86749d3bc91SRichard Lowe 
868*4d9fdb46SRobert Mustacchi     /*  We do not know what section the offset refers to, so
869*4d9fdb46SRobert Mustacchi         we have no way to check it for correctness. */
87007dc1947SRichard Lowe     *ret_offset = offset;
87149d3bc91SRichard Lowe     return DW_DLV_OK;
87249d3bc91SRichard Lowe }
87349d3bc91SRichard Lowe 
874*4d9fdb46SRobert Mustacchi /*  Part of DebugFission.  So a consumer can get the index when
875*4d9fdb46SRobert Mustacchi     the object with the actual debug_addr  is
876*4d9fdb46SRobert Mustacchi     elsewhere.  New May 2014*/
87749d3bc91SRichard Lowe 
87849d3bc91SRichard Lowe int
_dwarf_get_addr_index_itself(int theform,Dwarf_Small * info_ptr,Dwarf_Debug dbg,Dwarf_CU_Context cu_context,Dwarf_Unsigned * val_out,Dwarf_Error * error)879*4d9fdb46SRobert Mustacchi _dwarf_get_addr_index_itself(int theform,
880*4d9fdb46SRobert Mustacchi     Dwarf_Small *info_ptr,
881*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg,
882*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context,
883*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *val_out,
884*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
88549d3bc91SRichard Lowe {
886*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned index = 0;
887*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr section_end = 0;
888*4d9fdb46SRobert Mustacchi 
889*4d9fdb46SRobert Mustacchi     section_end =
890*4d9fdb46SRobert Mustacchi         _dwarf_calculate_info_section_end_ptr(cu_context);
891*4d9fdb46SRobert Mustacchi     switch(theform){
892*4d9fdb46SRobert Mustacchi     case DW_FORM_GNU_addr_index:
893*4d9fdb46SRobert Mustacchi     case DW_FORM_addrx:
894*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(info_ptr,index,
895*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
896*4d9fdb46SRobert Mustacchi         break;
897*4d9fdb46SRobert Mustacchi     case DW_FORM_addrx1:
898*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, index, Dwarf_Unsigned,
899*4d9fdb46SRobert Mustacchi             info_ptr, 1,
900*4d9fdb46SRobert Mustacchi             error,section_end);
901*4d9fdb46SRobert Mustacchi         break;
902*4d9fdb46SRobert Mustacchi     case DW_FORM_addrx2:
903*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, index, Dwarf_Unsigned,
904*4d9fdb46SRobert Mustacchi             info_ptr, 2,
905*4d9fdb46SRobert Mustacchi             error,section_end);
906*4d9fdb46SRobert Mustacchi         break;
907*4d9fdb46SRobert Mustacchi     case DW_FORM_addrx3:
908*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, index, Dwarf_Unsigned,
909*4d9fdb46SRobert Mustacchi             info_ptr, 3,
910*4d9fdb46SRobert Mustacchi             error,section_end);
911*4d9fdb46SRobert Mustacchi         break;
912*4d9fdb46SRobert Mustacchi     case DW_FORM_addrx4:
913*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, index, Dwarf_Unsigned,
914*4d9fdb46SRobert Mustacchi             info_ptr, 4,
915*4d9fdb46SRobert Mustacchi             error,section_end);
916*4d9fdb46SRobert Mustacchi         break;
917*4d9fdb46SRobert Mustacchi     default:
918*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_NOT_ADDR_INDEX);
919*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
92049d3bc91SRichard Lowe     }
921*4d9fdb46SRobert Mustacchi     *val_out = index;
922*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
923*4d9fdb46SRobert Mustacchi }
92449d3bc91SRichard Lowe 
925*4d9fdb46SRobert Mustacchi int
dwarf_get_debug_addr_index(Dwarf_Attribute attr,Dwarf_Unsigned * return_index,Dwarf_Error * error)926*4d9fdb46SRobert Mustacchi dwarf_get_debug_addr_index(Dwarf_Attribute attr,
927*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * return_index,
928*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
929*4d9fdb46SRobert Mustacchi {
930*4d9fdb46SRobert Mustacchi     int theform = 0;
931*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context = 0;
932*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
933*4d9fdb46SRobert Mustacchi 
934*4d9fdb46SRobert Mustacchi     int res  = get_attr_dbg(&dbg,&cu_context,attr,error);
935*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
936*4d9fdb46SRobert Mustacchi         return res;
93749d3bc91SRichard Lowe     }
938*4d9fdb46SRobert Mustacchi     theform = attr->ar_attribute_form;
939*4d9fdb46SRobert Mustacchi     if (dwarf_addr_form_is_indexed(theform)) {
940*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned index = 0;
94149d3bc91SRichard Lowe 
942*4d9fdb46SRobert Mustacchi         res = _dwarf_get_addr_index_itself(theform,
943*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr,dbg,cu_context,&index,error);
944*4d9fdb46SRobert Mustacchi         *return_index = index;
945*4d9fdb46SRobert Mustacchi         return res;
94649d3bc91SRichard Lowe     }
94749d3bc91SRichard Lowe 
948*4d9fdb46SRobert Mustacchi     _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_NOT_ADDR_INDEX);
949*4d9fdb46SRobert Mustacchi     return DW_DLV_ERROR;
950*4d9fdb46SRobert Mustacchi }
95107dc1947SRichard Lowe 
952*4d9fdb46SRobert Mustacchi static int
dw_read_index_val_itself(Dwarf_Debug dbg,unsigned theform,Dwarf_Small * info_ptr,Dwarf_Small * section_end,Dwarf_Unsigned * return_index,Dwarf_Error * error)953*4d9fdb46SRobert Mustacchi dw_read_index_val_itself(Dwarf_Debug dbg,
954*4d9fdb46SRobert Mustacchi    unsigned theform,
955*4d9fdb46SRobert Mustacchi    Dwarf_Small *info_ptr,
956*4d9fdb46SRobert Mustacchi    Dwarf_Small *section_end,
957*4d9fdb46SRobert Mustacchi    Dwarf_Unsigned *return_index,
958*4d9fdb46SRobert Mustacchi    Dwarf_Error *error)
959*4d9fdb46SRobert Mustacchi {
960*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned index = 0;
961*4d9fdb46SRobert Mustacchi 
962*4d9fdb46SRobert Mustacchi     switch(theform) {
963*4d9fdb46SRobert Mustacchi     case DW_FORM_strx:
964*4d9fdb46SRobert Mustacchi     case DW_FORM_GNU_str_index:
965*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(info_ptr,index,
966*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
967*4d9fdb46SRobert Mustacchi         break;
968*4d9fdb46SRobert Mustacchi     case DW_FORM_strx1:
969*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, index, Dwarf_Unsigned,
970*4d9fdb46SRobert Mustacchi             info_ptr, 1,
971*4d9fdb46SRobert Mustacchi             error,section_end);
972*4d9fdb46SRobert Mustacchi         break;
973*4d9fdb46SRobert Mustacchi     case DW_FORM_strx2:
974*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, index, Dwarf_Unsigned,
975*4d9fdb46SRobert Mustacchi             info_ptr, 2,
976*4d9fdb46SRobert Mustacchi             error,section_end);
977*4d9fdb46SRobert Mustacchi         break;
978*4d9fdb46SRobert Mustacchi     case DW_FORM_strx3:
979*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, index, Dwarf_Unsigned,
980*4d9fdb46SRobert Mustacchi             info_ptr, 3,
981*4d9fdb46SRobert Mustacchi             error,section_end);
982*4d9fdb46SRobert Mustacchi         break;
983*4d9fdb46SRobert Mustacchi     case DW_FORM_strx4:
984*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, index, Dwarf_Unsigned,
985*4d9fdb46SRobert Mustacchi             info_ptr, 4,
986*4d9fdb46SRobert Mustacchi             error,section_end);
987*4d9fdb46SRobert Mustacchi         break;
988*4d9fdb46SRobert Mustacchi     default:
989*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_NOT_STR_INDEX);
990*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
99149d3bc91SRichard Lowe     }
992*4d9fdb46SRobert Mustacchi     *return_index = index;
993*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
994*4d9fdb46SRobert Mustacchi }
99549d3bc91SRichard Lowe 
996*4d9fdb46SRobert Mustacchi /*  Part of DebugFission.  So a dwarf dumper application
997*4d9fdb46SRobert Mustacchi     can get the index and print it for the user.
998*4d9fdb46SRobert Mustacchi     A convenience function.  New May 2014
999*4d9fdb46SRobert Mustacchi     Also used with DWARF5 forms.  */
1000*4d9fdb46SRobert Mustacchi int
dwarf_get_debug_str_index(Dwarf_Attribute attr,Dwarf_Unsigned * return_index,Dwarf_Error * error)1001*4d9fdb46SRobert Mustacchi dwarf_get_debug_str_index(Dwarf_Attribute attr,
1002*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *return_index,
1003*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
1004*4d9fdb46SRobert Mustacchi {
1005*4d9fdb46SRobert Mustacchi     int theform = attr->ar_attribute_form;
1006*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context = 0;
1007*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
1008*4d9fdb46SRobert Mustacchi     int res  = 0;
1009*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr section_end =  0;
1010*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned index = 0;
1011*4d9fdb46SRobert Mustacchi     Dwarf_Small *info_ptr = 0;
1012*4d9fdb46SRobert Mustacchi     int indxres = 0;
1013*4d9fdb46SRobert Mustacchi 
1014*4d9fdb46SRobert Mustacchi     res = get_attr_dbg(&dbg,&cu_context,attr,error);
1015*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1016*4d9fdb46SRobert Mustacchi         return res;
1017*4d9fdb46SRobert Mustacchi     }
1018*4d9fdb46SRobert Mustacchi     section_end =
1019*4d9fdb46SRobert Mustacchi         _dwarf_calculate_info_section_end_ptr(cu_context);
1020*4d9fdb46SRobert Mustacchi     info_ptr = attr->ar_debug_ptr;
1021*4d9fdb46SRobert Mustacchi 
1022*4d9fdb46SRobert Mustacchi     indxres = dw_read_index_val_itself(dbg, theform, info_ptr,
1023*4d9fdb46SRobert Mustacchi         section_end, &index,error);
1024*4d9fdb46SRobert Mustacchi     if (indxres == DW_DLV_OK) {
1025*4d9fdb46SRobert Mustacchi         *return_index = index;
1026*4d9fdb46SRobert Mustacchi         return indxres;
1027*4d9fdb46SRobert Mustacchi     }
1028*4d9fdb46SRobert Mustacchi     return indxres;
102949d3bc91SRichard Lowe }
103049d3bc91SRichard Lowe 
103149d3bc91SRichard Lowe 
103249d3bc91SRichard Lowe int
_dwarf_extract_data16(Dwarf_Debug dbg,Dwarf_Small * data,Dwarf_Small * section_start,Dwarf_Small * section_end,Dwarf_Form_Data16 * returned_val,Dwarf_Error * error)1033*4d9fdb46SRobert Mustacchi _dwarf_extract_data16(Dwarf_Debug dbg,
1034*4d9fdb46SRobert Mustacchi     Dwarf_Small *data,
1035*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_start,
1036*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_end,
1037*4d9fdb46SRobert Mustacchi     Dwarf_Form_Data16  * returned_val,
1038*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
103949d3bc91SRichard Lowe {
1040*4d9fdb46SRobert Mustacchi     Dwarf_Small *data16end = 0;
1041*4d9fdb46SRobert Mustacchi 
1042*4d9fdb46SRobert Mustacchi     data16end = data + sizeof(Dwarf_Form_Data16);
1043*4d9fdb46SRobert Mustacchi     if (data  < section_start ||
1044*4d9fdb46SRobert Mustacchi         section_end < data16end) {
1045*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,DW_DLE_DATA16_OUTSIDE_SECTION);
1046*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1047*4d9fdb46SRobert Mustacchi     }
1048*4d9fdb46SRobert Mustacchi     memcpy(returned_val, data, sizeof(Dwarf_Form_Data16));
1049*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1050*4d9fdb46SRobert Mustacchi 
1051*4d9fdb46SRobert Mustacchi }
1052*4d9fdb46SRobert Mustacchi 
1053*4d9fdb46SRobert Mustacchi int
dwarf_formdata16(Dwarf_Attribute attr,Dwarf_Form_Data16 * returned_val,Dwarf_Error * error)1054*4d9fdb46SRobert Mustacchi dwarf_formdata16(Dwarf_Attribute attr,
1055*4d9fdb46SRobert Mustacchi     Dwarf_Form_Data16  * returned_val,
1056*4d9fdb46SRobert Mustacchi     Dwarf_Error*     error)
1057*4d9fdb46SRobert Mustacchi {
1058*4d9fdb46SRobert Mustacchi     Dwarf_Half attrform = 0;
105907dc1947SRichard Lowe     Dwarf_CU_Context cu_context = 0;
1060*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
1061*4d9fdb46SRobert Mustacchi     int res  = 0;
1062*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_end = 0;
1063*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned section_length = 0;
1064*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_start = 0;
106549d3bc91SRichard Lowe 
106649d3bc91SRichard Lowe     if (attr == NULL) {
106707dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
1068*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1069*4d9fdb46SRobert Mustacchi     }
1070*4d9fdb46SRobert Mustacchi     if (returned_val == NULL) {
1071*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
1072*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1073*4d9fdb46SRobert Mustacchi     }
1074*4d9fdb46SRobert Mustacchi     attrform = attr->ar_attribute_form;
1075*4d9fdb46SRobert Mustacchi     if (attrform != DW_FORM_data16) {
1076*4d9fdb46SRobert Mustacchi         generate_form_error(dbg,error,attrform,
1077*4d9fdb46SRobert Mustacchi             DW_DLE_ATTR_FORM_BAD,
1078*4d9fdb46SRobert Mustacchi             "DW_DLE_ATTR_FORM_BAD",
1079*4d9fdb46SRobert Mustacchi             "dwarf_formdata16");
1080*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
108149d3bc91SRichard Lowe     }
1082*4d9fdb46SRobert Mustacchi     res  = get_attr_dbg(&dbg,&cu_context,attr,error);
1083*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1084*4d9fdb46SRobert Mustacchi         return res;
1085*4d9fdb46SRobert Mustacchi     }
1086*4d9fdb46SRobert Mustacchi     section_start = _dwarf_calculate_info_section_start_ptr(
1087*4d9fdb46SRobert Mustacchi         cu_context,&section_length);
1088*4d9fdb46SRobert Mustacchi     section_end = section_start + section_length;
1089*4d9fdb46SRobert Mustacchi 
1090*4d9fdb46SRobert Mustacchi     res = _dwarf_extract_data16(dbg, attr->ar_debug_ptr,
1091*4d9fdb46SRobert Mustacchi         section_start, section_end,
1092*4d9fdb46SRobert Mustacchi         returned_val,  error);
1093*4d9fdb46SRobert Mustacchi     return res;
1094*4d9fdb46SRobert Mustacchi }
109549d3bc91SRichard Lowe 
1096*4d9fdb46SRobert Mustacchi /*  The *addrx are DWARF5 standard.
1097*4d9fdb46SRobert Mustacchi     The GNU form was non-standard gcc DWARF4 */
1098*4d9fdb46SRobert Mustacchi Dwarf_Bool
dwarf_addr_form_is_indexed(int form)1099*4d9fdb46SRobert Mustacchi dwarf_addr_form_is_indexed(int form)
1100*4d9fdb46SRobert Mustacchi {
1101*4d9fdb46SRobert Mustacchi     if (form == DW_FORM_addrx ||
1102*4d9fdb46SRobert Mustacchi         form == DW_FORM_addrx1 ||
1103*4d9fdb46SRobert Mustacchi         form == DW_FORM_addrx2 ||
1104*4d9fdb46SRobert Mustacchi         form == DW_FORM_addrx3 ||
1105*4d9fdb46SRobert Mustacchi         form == DW_FORM_addrx4 ||
1106*4d9fdb46SRobert Mustacchi         form == DW_FORM_GNU_addr_index) {
1107*4d9fdb46SRobert Mustacchi         return TRUE;
110849d3bc91SRichard Lowe     }
1109*4d9fdb46SRobert Mustacchi     return FALSE;
1110*4d9fdb46SRobert Mustacchi }
111149d3bc91SRichard Lowe 
1112*4d9fdb46SRobert Mustacchi int
dwarf_formaddr(Dwarf_Attribute attr,Dwarf_Addr * return_addr,Dwarf_Error * error)1113*4d9fdb46SRobert Mustacchi dwarf_formaddr(Dwarf_Attribute attr,
1114*4d9fdb46SRobert Mustacchi     Dwarf_Addr * return_addr, Dwarf_Error * error)
1115*4d9fdb46SRobert Mustacchi {
1116*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
1117*4d9fdb46SRobert Mustacchi     Dwarf_Addr ret_addr = 0;
1118*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context = 0;
1119*4d9fdb46SRobert Mustacchi     Dwarf_Half attrform = 0;
1120*4d9fdb46SRobert Mustacchi 
1121*4d9fdb46SRobert Mustacchi     int res  = get_attr_dbg(&dbg,&cu_context,attr,error);
1122*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1123*4d9fdb46SRobert Mustacchi         return res;
112407dc1947SRichard Lowe     }
1125*4d9fdb46SRobert Mustacchi     attrform = attr->ar_attribute_form;
1126*4d9fdb46SRobert Mustacchi     if (dwarf_addr_form_is_indexed(attrform)) {
1127*4d9fdb46SRobert Mustacchi         res = _dwarf_look_in_local_and_tied(
1128*4d9fdb46SRobert Mustacchi             attrform,
1129*4d9fdb46SRobert Mustacchi             cu_context,
1130*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr,
1131*4d9fdb46SRobert Mustacchi             return_addr,
1132*4d9fdb46SRobert Mustacchi             error);
1133*4d9fdb46SRobert Mustacchi         return res;
113449d3bc91SRichard Lowe     }
1135*4d9fdb46SRobert Mustacchi     if (attrform == DW_FORM_addr
1136*4d9fdb46SRobert Mustacchi         /*  || attrform == DW_FORM_ref_addr Allowance of
1137*4d9fdb46SRobert Mustacchi             DW_FORM_ref_addr was a mistake. The value returned in that
1138*4d9fdb46SRobert Mustacchi             case is NOT an address it is a global debug_info offset (ie,
1139*4d9fdb46SRobert Mustacchi             not CU-relative offset within the CU in debug_info). The
1140*4d9fdb46SRobert Mustacchi             DWARF2 document refers to it as an address (misleadingly) in
1141*4d9fdb46SRobert Mustacchi             sec 6.5.4 where it describes the reference form. It is
1142*4d9fdb46SRobert Mustacchi             address-sized so that the linker can easily update it, but
1143*4d9fdb46SRobert Mustacchi             it is a reference inside the debug_info section. No longer
1144*4d9fdb46SRobert Mustacchi             allowed. */
1145*4d9fdb46SRobert Mustacchi         ) {
1146*4d9fdb46SRobert Mustacchi         Dwarf_Small *section_end =
1147*4d9fdb46SRobert Mustacchi             _dwarf_calculate_info_section_end_ptr(cu_context);
114849d3bc91SRichard Lowe 
1149*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, ret_addr, Dwarf_Addr,
1150*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr,
1151*4d9fdb46SRobert Mustacchi             cu_context->cc_address_size,
1152*4d9fdb46SRobert Mustacchi             error,section_end);
1153*4d9fdb46SRobert Mustacchi         *return_addr = ret_addr;
115407dc1947SRichard Lowe         return (DW_DLV_OK);
115549d3bc91SRichard Lowe     }
1156*4d9fdb46SRobert Mustacchi     generate_form_error(dbg,error,attrform,
1157*4d9fdb46SRobert Mustacchi         DW_DLE_ATTR_FORM_BAD,
1158*4d9fdb46SRobert Mustacchi         "DW_DLE_ATTR_FORM_BAD",
1159*4d9fdb46SRobert Mustacchi         "dwarf_formaddr");
1160*4d9fdb46SRobert Mustacchi     return DW_DLV_ERROR;
116149d3bc91SRichard Lowe }
116249d3bc91SRichard Lowe 
116349d3bc91SRichard Lowe 
116449d3bc91SRichard Lowe int
dwarf_formflag(Dwarf_Attribute attr,Dwarf_Bool * ret_bool,Dwarf_Error * error)1165*4d9fdb46SRobert Mustacchi dwarf_formflag(Dwarf_Attribute attr,
1166*4d9fdb46SRobert Mustacchi     Dwarf_Bool * ret_bool, Dwarf_Error * error)
116749d3bc91SRichard Lowe {
116807dc1947SRichard Lowe     Dwarf_CU_Context cu_context = 0;
1169*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
117049d3bc91SRichard Lowe 
117149d3bc91SRichard Lowe     if (attr == NULL) {
117207dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
117307dc1947SRichard Lowe         return (DW_DLV_ERROR);
117449d3bc91SRichard Lowe     }
117549d3bc91SRichard Lowe 
117649d3bc91SRichard Lowe     cu_context = attr->ar_cu_context;
117749d3bc91SRichard Lowe     if (cu_context == NULL) {
117807dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
117907dc1947SRichard Lowe         return (DW_DLV_ERROR);
118049d3bc91SRichard Lowe     }
118149d3bc91SRichard Lowe     dbg = cu_context->cc_dbg;
1182*4d9fdb46SRobert Mustacchi 
118349d3bc91SRichard Lowe     if (dbg == NULL) {
118407dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
118507dc1947SRichard Lowe         return (DW_DLV_ERROR);
118649d3bc91SRichard Lowe     }
1187*4d9fdb46SRobert Mustacchi     if (attr->ar_attribute_form == DW_FORM_flag_present) {
1188*4d9fdb46SRobert Mustacchi         /*  Implicit means we don't read any data at all. Just
1189*4d9fdb46SRobert Mustacchi             the existence of the Form does it. DWARF4. */
1190*4d9fdb46SRobert Mustacchi         *ret_bool = 1;
1191*4d9fdb46SRobert Mustacchi         return (DW_DLV_OK);
1192*4d9fdb46SRobert Mustacchi     }
119349d3bc91SRichard Lowe 
1194*4d9fdb46SRobert Mustacchi     if (attr->ar_attribute_form == DW_FORM_flag) {
1195*4d9fdb46SRobert Mustacchi         *ret_bool = *(Dwarf_Small *)(attr->ar_debug_ptr);
1196*4d9fdb46SRobert Mustacchi         return (DW_DLV_OK);
1197*4d9fdb46SRobert Mustacchi     }
1198*4d9fdb46SRobert Mustacchi     generate_form_error(dbg,error,attr->ar_attribute_form,
1199*4d9fdb46SRobert Mustacchi         DW_DLE_ATTR_FORM_BAD,
1200*4d9fdb46SRobert Mustacchi         "DW_DLE_ATTR_FORM_BAD",
1201*4d9fdb46SRobert Mustacchi         "dwarf_formflat");
1202*4d9fdb46SRobert Mustacchi     return (DW_DLV_ERROR);
1203*4d9fdb46SRobert Mustacchi }
120449d3bc91SRichard Lowe 
1205*4d9fdb46SRobert Mustacchi Dwarf_Bool
_dwarf_allow_formudata(unsigned form)1206*4d9fdb46SRobert Mustacchi _dwarf_allow_formudata(unsigned form)
1207*4d9fdb46SRobert Mustacchi {
1208*4d9fdb46SRobert Mustacchi     switch(form) {
120949d3bc91SRichard Lowe     case DW_FORM_data1:
1210*4d9fdb46SRobert Mustacchi     case DW_FORM_data2:
1211*4d9fdb46SRobert Mustacchi     case DW_FORM_data4:
1212*4d9fdb46SRobert Mustacchi     case DW_FORM_data8:
1213*4d9fdb46SRobert Mustacchi     case DW_FORM_udata:
1214*4d9fdb46SRobert Mustacchi     case DW_FORM_loclistx:
1215*4d9fdb46SRobert Mustacchi     case DW_FORM_rnglistx:
1216*4d9fdb46SRobert Mustacchi     return TRUE;
1217*4d9fdb46SRobert Mustacchi     }
1218*4d9fdb46SRobert Mustacchi     return FALSE;
1219*4d9fdb46SRobert Mustacchi }
1220*4d9fdb46SRobert Mustacchi /*  If the form is DW_FORM_constx and the .debug_addr section
1221*4d9fdb46SRobert Mustacchi     is missing, this returns DW_DLV_ERROR and the error number
1222*4d9fdb46SRobert Mustacchi     in the Dwarf_Error is  DW_DLE_MISSING_NEEDED_DEBUG_ADDR_SECTION.
1223*4d9fdb46SRobert Mustacchi     When that arises, a consumer should call
1224*4d9fdb46SRobert Mustacchi     dwarf_get_debug_addr_index() and use that on the appropriate
1225*4d9fdb46SRobert Mustacchi     .debug_addr section in the executable or another object. */
1226*4d9fdb46SRobert Mustacchi 
1227*4d9fdb46SRobert Mustacchi int
_dwarf_formudata_internal(Dwarf_Debug dbg,unsigned form,Dwarf_Byte_Ptr data,Dwarf_Byte_Ptr section_end,Dwarf_Unsigned * return_uval,Dwarf_Unsigned * bytes_read,Dwarf_Error * error)1228*4d9fdb46SRobert Mustacchi _dwarf_formudata_internal(Dwarf_Debug dbg,
1229*4d9fdb46SRobert Mustacchi     unsigned form,
1230*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr data,
1231*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr section_end,
1232*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *return_uval,
1233*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *bytes_read,
1234*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
1235*4d9fdb46SRobert Mustacchi {
1236*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned ret_value = 0;
1237*4d9fdb46SRobert Mustacchi 
1238*4d9fdb46SRobert Mustacchi     switch (form) {
1239*4d9fdb46SRobert Mustacchi     case DW_FORM_data1:
1240*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, ret_value, Dwarf_Unsigned,
1241*4d9fdb46SRobert Mustacchi             data, sizeof(Dwarf_Small),
1242*4d9fdb46SRobert Mustacchi             error,section_end);
124307dc1947SRichard Lowe         *return_uval = ret_value;
1244*4d9fdb46SRobert Mustacchi         *bytes_read = 1;
124507dc1947SRichard Lowe         return DW_DLV_OK;
124607dc1947SRichard Lowe 
1247*4d9fdb46SRobert Mustacchi     /*  READ_UNALIGNED does the right thing as it reads
1248*4d9fdb46SRobert Mustacchi         the right number bits and generates host order.
1249*4d9fdb46SRobert Mustacchi         So we can just assign to *return_uval. */
125049d3bc91SRichard Lowe     case DW_FORM_data2:{
1251*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, ret_value, Dwarf_Unsigned,
1252*4d9fdb46SRobert Mustacchi             data, DWARF_HALF_SIZE,
1253*4d9fdb46SRobert Mustacchi             error,section_end);
1254*4d9fdb46SRobert Mustacchi         *return_uval = ret_value;
1255*4d9fdb46SRobert Mustacchi         *bytes_read = 2;
1256*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
125707dc1947SRichard Lowe         }
125849d3bc91SRichard Lowe 
125949d3bc91SRichard Lowe     case DW_FORM_data4:{
1260*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, ret_value, Dwarf_Unsigned,
1261*4d9fdb46SRobert Mustacchi             data,
1262*4d9fdb46SRobert Mustacchi             DWARF_32BIT_SIZE,
1263*4d9fdb46SRobert Mustacchi             error,section_end);
1264*4d9fdb46SRobert Mustacchi         *return_uval = ret_value;
1265*4d9fdb46SRobert Mustacchi         *bytes_read = DWARF_32BIT_SIZE;;
1266*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
126707dc1947SRichard Lowe         }
126849d3bc91SRichard Lowe 
126949d3bc91SRichard Lowe     case DW_FORM_data8:{
1270*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, ret_value, Dwarf_Unsigned,
1271*4d9fdb46SRobert Mustacchi             data,
1272*4d9fdb46SRobert Mustacchi             DWARF_64BIT_SIZE,
1273*4d9fdb46SRobert Mustacchi             error,section_end);
1274*4d9fdb46SRobert Mustacchi         *return_uval = ret_value;
1275*4d9fdb46SRobert Mustacchi         *bytes_read = DWARF_64BIT_SIZE;
1276*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
127707dc1947SRichard Lowe         }
127807dc1947SRichard Lowe         break;
1279*4d9fdb46SRobert Mustacchi     /* real udata */
1280*4d9fdb46SRobert Mustacchi     case DW_FORM_loclistx:
1281*4d9fdb46SRobert Mustacchi     case DW_FORM_rnglistx:
1282*4d9fdb46SRobert Mustacchi     case DW_FORM_udata: {
1283*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned leblen = 0;
1284*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(data, ret_value,leblen,
1285*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
128607dc1947SRichard Lowe         *return_uval = ret_value;
1287*4d9fdb46SRobert Mustacchi         *bytes_read = leblen;
128807dc1947SRichard Lowe         return DW_DLV_OK;
1289*4d9fdb46SRobert Mustacchi     }
1290*4d9fdb46SRobert Mustacchi         /*  IRIX bug 583450. We do not allow reading
1291*4d9fdb46SRobert Mustacchi             sdata from a udata
1292*4d9fdb46SRobert Mustacchi             value. Caller can retry, calling sdata */
129349d3bc91SRichard Lowe     default:
129407dc1947SRichard Lowe         break;
129549d3bc91SRichard Lowe     }
1296*4d9fdb46SRobert Mustacchi     generate_form_error(dbg,error,form,
1297*4d9fdb46SRobert Mustacchi         DW_DLE_ATTR_FORM_BAD,
1298*4d9fdb46SRobert Mustacchi         "DW_DLE_ATTR_FORM_BAD",
1299*4d9fdb46SRobert Mustacchi         "formudata (internal function)");
130049d3bc91SRichard Lowe     return (DW_DLV_ERROR);
130149d3bc91SRichard Lowe }
130249d3bc91SRichard Lowe 
130349d3bc91SRichard Lowe int
dwarf_formudata(Dwarf_Attribute attr,Dwarf_Unsigned * return_uval,Dwarf_Error * error)1304*4d9fdb46SRobert Mustacchi dwarf_formudata(Dwarf_Attribute attr,
1305*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * return_uval, Dwarf_Error * error)
130649d3bc91SRichard Lowe {
130707dc1947SRichard Lowe     Dwarf_Debug dbg = 0;
130807dc1947SRichard Lowe     Dwarf_CU_Context cu_context = 0;
1309*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr section_end = 0;
1310*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned bytes_read = 0;
1311*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr data =  attr->ar_debug_ptr;
1312*4d9fdb46SRobert Mustacchi     unsigned form = 0;
131349d3bc91SRichard Lowe 
1314*4d9fdb46SRobert Mustacchi     int res  = get_attr_dbg(&dbg,&cu_context,attr,error);
1315*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1316*4d9fdb46SRobert Mustacchi         return res;
131749d3bc91SRichard Lowe     }
1318*4d9fdb46SRobert Mustacchi     section_end =
1319*4d9fdb46SRobert Mustacchi         _dwarf_calculate_info_section_end_ptr(cu_context);
1320*4d9fdb46SRobert Mustacchi     form = attr->ar_attribute_form;
1321*4d9fdb46SRobert Mustacchi 
1322*4d9fdb46SRobert Mustacchi     res = _dwarf_formudata_internal(dbg,
1323*4d9fdb46SRobert Mustacchi         form, data, section_end, return_uval,
1324*4d9fdb46SRobert Mustacchi         &bytes_read, error);
1325*4d9fdb46SRobert Mustacchi     return res;
1326*4d9fdb46SRobert Mustacchi }
132749d3bc91SRichard Lowe 
132849d3bc91SRichard Lowe 
1329*4d9fdb46SRobert Mustacchi int
dwarf_formsdata(Dwarf_Attribute attr,Dwarf_Signed * return_sval,Dwarf_Error * error)1330*4d9fdb46SRobert Mustacchi dwarf_formsdata(Dwarf_Attribute attr,
1331*4d9fdb46SRobert Mustacchi     Dwarf_Signed * return_sval, Dwarf_Error * error)
1332*4d9fdb46SRobert Mustacchi {
1333*4d9fdb46SRobert Mustacchi     Dwarf_Signed ret_value = 0;
1334*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
1335*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context = 0;
1336*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr section_end = 0;
133749d3bc91SRichard Lowe 
1338*4d9fdb46SRobert Mustacchi     int res  = get_attr_dbg(&dbg,&cu_context,attr,error);
1339*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1340*4d9fdb46SRobert Mustacchi         return res;
1341*4d9fdb46SRobert Mustacchi     }
1342*4d9fdb46SRobert Mustacchi     section_end =
1343*4d9fdb46SRobert Mustacchi         _dwarf_calculate_info_section_end_ptr(cu_context);
134449d3bc91SRichard Lowe     switch (attr->ar_attribute_form) {
134549d3bc91SRichard Lowe 
134649d3bc91SRichard Lowe     case DW_FORM_data1:
1347*4d9fdb46SRobert Mustacchi         if ( attr->ar_debug_ptr >= section_end) {
1348*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_DIE_BAD);
1349*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
1350*4d9fdb46SRobert Mustacchi         }
1351*4d9fdb46SRobert Mustacchi         *return_sval = (*(Dwarf_Sbyte *) attr->ar_debug_ptr);
135207dc1947SRichard Lowe         return DW_DLV_OK;
135349d3bc91SRichard Lowe 
1354*4d9fdb46SRobert Mustacchi     /*  READ_UNALIGNED does not sign extend.
1355*4d9fdb46SRobert Mustacchi         So we have to use a cast to get the
1356*4d9fdb46SRobert Mustacchi         value sign extended in the right way for each case. */
135749d3bc91SRichard Lowe     case DW_FORM_data2:{
1358*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, ret_value, Dwarf_Signed,
1359*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr,
1360*4d9fdb46SRobert Mustacchi             DWARF_HALF_SIZE,
1361*4d9fdb46SRobert Mustacchi             error,section_end);
1362*4d9fdb46SRobert Mustacchi         *return_sval = (Dwarf_Shalf) ret_value;
1363*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
136449d3bc91SRichard Lowe 
136507dc1947SRichard Lowe         }
136649d3bc91SRichard Lowe 
136749d3bc91SRichard Lowe     case DW_FORM_data4:{
1368*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, ret_value, Dwarf_Signed,
1369*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr,
1370*4d9fdb46SRobert Mustacchi             DWARF_32BIT_SIZE,
1371*4d9fdb46SRobert Mustacchi             error,section_end);
1372*4d9fdb46SRobert Mustacchi         SIGN_EXTEND(ret_value,DWARF_32BIT_SIZE);
1373*4d9fdb46SRobert Mustacchi         *return_sval = (Dwarf_Signed) ret_value;
1374*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
137507dc1947SRichard Lowe         }
137649d3bc91SRichard Lowe 
137749d3bc91SRichard Lowe     case DW_FORM_data8:{
1378*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, ret_value, Dwarf_Signed,
1379*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr,
1380*4d9fdb46SRobert Mustacchi             DWARF_64BIT_SIZE,
1381*4d9fdb46SRobert Mustacchi             error,section_end);
1382*4d9fdb46SRobert Mustacchi         /* No SIGN_EXTEND needed, we are filling all bytes already.*/
1383*4d9fdb46SRobert Mustacchi         *return_sval = (Dwarf_Signed) ret_value;
1384*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
138507dc1947SRichard Lowe         }
138649d3bc91SRichard Lowe 
1387*4d9fdb46SRobert Mustacchi     /*  DW_FORM_implicit_const  is a value in the
1388*4d9fdb46SRobert Mustacchi         abbreviations, not in the DIEs. */
1389*4d9fdb46SRobert Mustacchi     case DW_FORM_implicit_const:
1390*4d9fdb46SRobert Mustacchi         *return_sval = attr->ar_implicit_const;
139107dc1947SRichard Lowe         return DW_DLV_OK;
139249d3bc91SRichard Lowe 
1393*4d9fdb46SRobert Mustacchi     case DW_FORM_sdata: {
1394*4d9fdb46SRobert Mustacchi         Dwarf_Byte_Ptr tmp = attr->ar_debug_ptr;
1395*4d9fdb46SRobert Mustacchi 
1396*4d9fdb46SRobert Mustacchi         DECODE_LEB128_SWORD_CK(tmp, ret_value,
1397*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
1398*4d9fdb46SRobert Mustacchi         *return_sval = ret_value;
1399*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
140049d3bc91SRichard Lowe 
1401*4d9fdb46SRobert Mustacchi     }
140249d3bc91SRichard Lowe 
1403*4d9fdb46SRobert Mustacchi         /* IRIX bug 583450. We do not allow reading sdata from a udata
1404*4d9fdb46SRobert Mustacchi             value. Caller can retry, calling udata */
140549d3bc91SRichard Lowe 
140649d3bc91SRichard Lowe     default:
140707dc1947SRichard Lowe         break;
140849d3bc91SRichard Lowe     }
1409*4d9fdb46SRobert Mustacchi     generate_form_error(dbg,error,attr->ar_attribute_form,
1410*4d9fdb46SRobert Mustacchi         DW_DLE_ATTR_FORM_BAD,
1411*4d9fdb46SRobert Mustacchi         "DW_DLE_ATTR_FORM_BAD",
1412*4d9fdb46SRobert Mustacchi         "dwarf_formsdata");
1413*4d9fdb46SRobert Mustacchi     return DW_DLV_ERROR;
141449d3bc91SRichard Lowe }
141549d3bc91SRichard Lowe 
141649d3bc91SRichard Lowe int
_dwarf_formblock_internal(Dwarf_Debug dbg,Dwarf_Attribute attr,Dwarf_CU_Context cu_context,Dwarf_Block * return_block,Dwarf_Error * error)1417*4d9fdb46SRobert Mustacchi _dwarf_formblock_internal(Dwarf_Debug dbg,
1418*4d9fdb46SRobert Mustacchi     Dwarf_Attribute attr,
1419*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context,
1420*4d9fdb46SRobert Mustacchi     Dwarf_Block * return_block,
1421*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
142249d3bc91SRichard Lowe {
1423*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_start = 0;
1424*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_end = 0;
1425*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned section_length = 0;
142607dc1947SRichard Lowe     Dwarf_Unsigned length = 0;
142707dc1947SRichard Lowe     Dwarf_Small *data = 0;
142849d3bc91SRichard Lowe 
1429*4d9fdb46SRobert Mustacchi     section_end =
1430*4d9fdb46SRobert Mustacchi         _dwarf_calculate_info_section_end_ptr(cu_context);
1431*4d9fdb46SRobert Mustacchi     section_start =
1432*4d9fdb46SRobert Mustacchi         _dwarf_calculate_info_section_start_ptr(cu_context,
1433*4d9fdb46SRobert Mustacchi         &section_length);
143449d3bc91SRichard Lowe 
143549d3bc91SRichard Lowe     switch (attr->ar_attribute_form) {
143649d3bc91SRichard Lowe 
143749d3bc91SRichard Lowe     case DW_FORM_block1:
1438*4d9fdb46SRobert Mustacchi         length = *(Dwarf_Small *) attr->ar_debug_ptr;
1439*4d9fdb46SRobert Mustacchi         data = attr->ar_debug_ptr + sizeof(Dwarf_Small);
144007dc1947SRichard Lowe         break;
144149d3bc91SRichard Lowe 
144249d3bc91SRichard Lowe     case DW_FORM_block2:
1443*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, length, Dwarf_Unsigned,
1444*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr, DWARF_HALF_SIZE,
1445*4d9fdb46SRobert Mustacchi             error,section_end);
1446*4d9fdb46SRobert Mustacchi         data = attr->ar_debug_ptr + DWARF_HALF_SIZE;
144707dc1947SRichard Lowe         break;
144849d3bc91SRichard Lowe 
144949d3bc91SRichard Lowe     case DW_FORM_block4:
1450*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, length, Dwarf_Unsigned,
1451*4d9fdb46SRobert Mustacchi             attr->ar_debug_ptr, DWARF_32BIT_SIZE,
1452*4d9fdb46SRobert Mustacchi             error,section_end);
1453*4d9fdb46SRobert Mustacchi         data = attr->ar_debug_ptr + DWARF_32BIT_SIZE;
145407dc1947SRichard Lowe         break;
145549d3bc91SRichard Lowe 
1456*4d9fdb46SRobert Mustacchi     case DW_FORM_block: {
1457*4d9fdb46SRobert Mustacchi         Dwarf_Byte_Ptr tmp = attr->ar_debug_ptr;
1458*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned leblen = 0;
145949d3bc91SRichard Lowe 
1460*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(tmp, length, leblen,
1461*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
1462*4d9fdb46SRobert Mustacchi         data = attr->ar_debug_ptr + leblen;
1463*4d9fdb46SRobert Mustacchi         break;
1464*4d9fdb46SRobert Mustacchi         }
146549d3bc91SRichard Lowe     default:
1466*4d9fdb46SRobert Mustacchi         generate_form_error(dbg,error,attr->ar_attribute_form,
1467*4d9fdb46SRobert Mustacchi             DW_DLE_ATTR_FORM_BAD,
1468*4d9fdb46SRobert Mustacchi             "DW_DLE_ATTR_FORM_BAD",
1469*4d9fdb46SRobert Mustacchi             "dwarf_formblock");
1470*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
147149d3bc91SRichard Lowe     }
1472*4d9fdb46SRobert Mustacchi     /*  We have the data. Check for errors. */
1473*4d9fdb46SRobert Mustacchi     if (length >= section_length) {
1474*4d9fdb46SRobert Mustacchi         /*  Sanity test looking for wraparound:
1475*4d9fdb46SRobert Mustacchi             when length actually added in
1476*4d9fdb46SRobert Mustacchi             it would not be caught.
1477*4d9fdb46SRobert Mustacchi             Test could be just >, but >= ok here too.*/
1478*4d9fdb46SRobert Mustacchi         _dwarf_error_string(dbg, error,
1479*4d9fdb46SRobert Mustacchi             DW_DLE_FORM_BLOCK_LENGTH_ERROR,
1480*4d9fdb46SRobert Mustacchi             "DW_DLE_FORM_BLOCK_LENGTH_ERROR: "
1481*4d9fdb46SRobert Mustacchi             "The length of the block is greater "
1482*4d9fdb46SRobert Mustacchi             "than the section length! Corrupt Dwarf.");
1483*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1484*4d9fdb46SRobert Mustacchi     }
1485*4d9fdb46SRobert Mustacchi     if ((attr->ar_debug_ptr + length) > section_end) {
1486*4d9fdb46SRobert Mustacchi         _dwarf_error_string(dbg, error,
1487*4d9fdb46SRobert Mustacchi             DW_DLE_FORM_BLOCK_LENGTH_ERROR,
1488*4d9fdb46SRobert Mustacchi             "DW_DLE_FORM_BLOCK_LENGTH_ERROR: "
1489*4d9fdb46SRobert Mustacchi             "The block length means the block "
1490*4d9fdb46SRobert Mustacchi             "runs off the end of the section length!"
1491*4d9fdb46SRobert Mustacchi             " Corrupt Dwarf.");
1492*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1493*4d9fdb46SRobert Mustacchi     }
1494*4d9fdb46SRobert Mustacchi     if (data > section_end) {
1495*4d9fdb46SRobert Mustacchi         _dwarf_error_string(dbg, error,
1496*4d9fdb46SRobert Mustacchi             DW_DLE_FORM_BLOCK_LENGTH_ERROR,
1497*4d9fdb46SRobert Mustacchi             "DW_DLE_FORM_BLOCK_LENGTH_ERROR: "
1498*4d9fdb46SRobert Mustacchi             "The block content is "
1499*4d9fdb46SRobert Mustacchi             "past the end of the section!"
1500*4d9fdb46SRobert Mustacchi             " Corrupt Dwarf.");
1501*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_FORM_BLOCK_LENGTH_ERROR);
1502*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1503*4d9fdb46SRobert Mustacchi     }
1504*4d9fdb46SRobert Mustacchi     if ((data + length) > section_end) {
1505*4d9fdb46SRobert Mustacchi         _dwarf_error_string(dbg, error,
1506*4d9fdb46SRobert Mustacchi             DW_DLE_FORM_BLOCK_LENGTH_ERROR,
1507*4d9fdb46SRobert Mustacchi             "DW_DLE_FORM_BLOCK_LENGTH_ERROR: "
1508*4d9fdb46SRobert Mustacchi             "The end of the block content is "
1509*4d9fdb46SRobert Mustacchi             "past the end of the section!"
1510*4d9fdb46SRobert Mustacchi             " Corrupt Dwarf.");
1511*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
151249d3bc91SRichard Lowe     }
1513*4d9fdb46SRobert Mustacchi     return_block->bl_len = length;
1514*4d9fdb46SRobert Mustacchi     return_block->bl_data = data;
1515*4d9fdb46SRobert Mustacchi     /*  This struct is public so use the old name instead
1516*4d9fdb46SRobert Mustacchi         of what we now would call it:  bl_kind  */
1517*4d9fdb46SRobert Mustacchi     return_block->bl_from_loclist =  DW_LKIND_expression;
1518*4d9fdb46SRobert Mustacchi     return_block->bl_section_offset =  data - section_start;
1519*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1520*4d9fdb46SRobert Mustacchi }
152149d3bc91SRichard Lowe 
1522*4d9fdb46SRobert Mustacchi int
dwarf_formblock(Dwarf_Attribute attr,Dwarf_Block ** return_block,Dwarf_Error * error)1523*4d9fdb46SRobert Mustacchi dwarf_formblock(Dwarf_Attribute attr,
1524*4d9fdb46SRobert Mustacchi     Dwarf_Block ** return_block, Dwarf_Error * error)
1525*4d9fdb46SRobert Mustacchi {
1526*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context = 0;
1527*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
1528*4d9fdb46SRobert Mustacchi     Dwarf_Block local_block;
1529*4d9fdb46SRobert Mustacchi     Dwarf_Block *out_block = 0;
1530*4d9fdb46SRobert Mustacchi     int res = 0;
1531*4d9fdb46SRobert Mustacchi 
1532*4d9fdb46SRobert Mustacchi     memset(&local_block,0,sizeof(local_block));
1533*4d9fdb46SRobert Mustacchi     res  = get_attr_dbg(&dbg,&cu_context,attr,error);
1534*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1535*4d9fdb46SRobert Mustacchi         return res;
1536*4d9fdb46SRobert Mustacchi     }
1537*4d9fdb46SRobert Mustacchi     res = _dwarf_formblock_internal(dbg,attr,
1538*4d9fdb46SRobert Mustacchi         cu_context, &local_block, error);
1539*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1540*4d9fdb46SRobert Mustacchi         return res;
1541*4d9fdb46SRobert Mustacchi     }
1542*4d9fdb46SRobert Mustacchi     out_block = (Dwarf_Block *)
1543*4d9fdb46SRobert Mustacchi         _dwarf_get_alloc(dbg, DW_DLA_BLOCK, 1);
1544*4d9fdb46SRobert Mustacchi     if (out_block == NULL) {
154507dc1947SRichard Lowe         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
1546*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
154749d3bc91SRichard Lowe     }
1548*4d9fdb46SRobert Mustacchi     *out_block = local_block;
1549*4d9fdb46SRobert Mustacchi     *return_block = out_block;
1550*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1551*4d9fdb46SRobert Mustacchi }
155249d3bc91SRichard Lowe 
1553*4d9fdb46SRobert Mustacchi int
_dwarf_extract_string_offset_via_str_offsets(Dwarf_Debug dbg,Dwarf_Small * data_ptr,Dwarf_Small * end_data_ptr,UNUSEDARG Dwarf_Half attrnum,Dwarf_Half attrform,Dwarf_CU_Context cu_context,Dwarf_Unsigned * str_sect_offset_out,Dwarf_Error * error)1554*4d9fdb46SRobert Mustacchi _dwarf_extract_string_offset_via_str_offsets(Dwarf_Debug dbg,
1555*4d9fdb46SRobert Mustacchi     Dwarf_Small *data_ptr,
1556*4d9fdb46SRobert Mustacchi     Dwarf_Small *end_data_ptr,
1557*4d9fdb46SRobert Mustacchi     UNUSEDARG Dwarf_Half   attrnum,
1558*4d9fdb46SRobert Mustacchi     Dwarf_Half   attrform,
1559*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context,
1560*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *str_sect_offset_out,
1561*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
1562*4d9fdb46SRobert Mustacchi {
1563*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset_base = 0;
1564*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned index_to_offset_entry = 0;
1565*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offsetintable = 0;
1566*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned end_offsetintable = 0;
1567*4d9fdb46SRobert Mustacchi     int res = 0;
1568*4d9fdb46SRobert Mustacchi     int idxres = 0;
1569*4d9fdb46SRobert Mustacchi 
1570*4d9fdb46SRobert Mustacchi     res = _dwarf_load_section(dbg, &dbg->de_debug_str_offsets,error);
1571*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1572*4d9fdb46SRobert Mustacchi         return res;
1573*4d9fdb46SRobert Mustacchi     }
1574*4d9fdb46SRobert Mustacchi     idxres = dw_read_index_val_itself(dbg,
1575*4d9fdb46SRobert Mustacchi         attrform,data_ptr,end_data_ptr,&index_to_offset_entry,error);
1576*4d9fdb46SRobert Mustacchi     if ( idxres != DW_DLV_OK) {
1577*4d9fdb46SRobert Mustacchi         return idxres;
1578*4d9fdb46SRobert Mustacchi     }
157949d3bc91SRichard Lowe 
1580*4d9fdb46SRobert Mustacchi     /*  DW_FORM_GNU_str_index has no 'base' value.
1581*4d9fdb46SRobert Mustacchi         DW_FORM_strx* has a base value
1582*4d9fdb46SRobert Mustacchi         for the offset table */
1583*4d9fdb46SRobert Mustacchi     if( attrform != DW_FORM_GNU_str_index) {
1584*4d9fdb46SRobert Mustacchi         res = _dwarf_get_string_base_attr_value(dbg,cu_context,
1585*4d9fdb46SRobert Mustacchi             &offset_base,error);
1586*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
1587*4d9fdb46SRobert Mustacchi             /*  DW_DLV_NO_ENTRY could be acceptable when
1588*4d9fdb46SRobert Mustacchi                 a producer knows that the base offset will be zero.
1589*4d9fdb46SRobert Mustacchi                 Hence DW_AT_str_offsets_base missing.
1590*4d9fdb46SRobert Mustacchi                 DWARF5 draft as of September 2015 allows the attribute
1591*4d9fdb46SRobert Mustacchi                 to be missing (it's up to the compilation tools to
1592*4d9fdb46SRobert Mustacchi                 make sure that has the correct effect).
1593*4d9fdb46SRobert Mustacchi             */
1594*4d9fdb46SRobert Mustacchi             return res;
1595*4d9fdb46SRobert Mustacchi         }
1596*4d9fdb46SRobert Mustacchi     }
159749d3bc91SRichard Lowe 
1598*4d9fdb46SRobert Mustacchi     offsetintable = (index_to_offset_entry*cu_context->cc_length_size )
1599*4d9fdb46SRobert Mustacchi         + offset_base;
1600*4d9fdb46SRobert Mustacchi     {
1601*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned fissoff = 0;
1602*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned size = 0;
1603*4d9fdb46SRobert Mustacchi         fissoff = _dwarf_get_dwp_extra_offset(&cu_context->cc_dwp_offsets,
1604*4d9fdb46SRobert Mustacchi             DW_SECT_STR_OFFSETS, &size);
1605*4d9fdb46SRobert Mustacchi         offsetintable += fissoff;
1606*4d9fdb46SRobert Mustacchi     }
1607*4d9fdb46SRobert Mustacchi     end_offsetintable = offsetintable + cu_context->cc_length_size;
1608*4d9fdb46SRobert Mustacchi     /*  The offsets table is a series of offset-size entries.
1609*4d9fdb46SRobert Mustacchi         The == case in the test applies when we are at the last table
1610*4d9fdb46SRobert Mustacchi         entry, so == is not an error, hence only test >
1611*4d9fdb46SRobert Mustacchi     */
1612*4d9fdb46SRobert Mustacchi     if (end_offsetintable > dbg->de_debug_str_offsets.dss_size ) {
1613*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_SIZE_BAD);
1614*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1615*4d9fdb46SRobert Mustacchi     }
1616*4d9fdb46SRobert Mustacchi 
1617*4d9fdb46SRobert Mustacchi     {
1618*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned offsettostr = 0;
1619*4d9fdb46SRobert Mustacchi         Dwarf_Small *offsets_start = dbg->de_debug_str_offsets.dss_data;
1620*4d9fdb46SRobert Mustacchi         Dwarf_Small *offsets_end   = offsets_start +
1621*4d9fdb46SRobert Mustacchi             dbg->de_debug_str_offsets.dss_size;
1622*4d9fdb46SRobert Mustacchi         /* Now read the string offset from the offset table. */
1623*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg,offsettostr,Dwarf_Unsigned,
1624*4d9fdb46SRobert Mustacchi             offsets_start+ offsetintable,
1625*4d9fdb46SRobert Mustacchi             cu_context->cc_length_size,error,offsets_end);
1626*4d9fdb46SRobert Mustacchi         *str_sect_offset_out = offsettostr;
1627*4d9fdb46SRobert Mustacchi     }
1628*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
162949d3bc91SRichard Lowe }
163049d3bc91SRichard Lowe 
1631*4d9fdb46SRobert Mustacchi int
_dwarf_extract_local_debug_str_string_given_offset(Dwarf_Debug dbg,unsigned attrform,Dwarf_Unsigned offset,char ** return_str,Dwarf_Error * error)1632*4d9fdb46SRobert Mustacchi _dwarf_extract_local_debug_str_string_given_offset(Dwarf_Debug dbg,
1633*4d9fdb46SRobert Mustacchi     unsigned attrform,
1634*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset,
1635*4d9fdb46SRobert Mustacchi     char ** return_str,
1636*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1637*4d9fdb46SRobert Mustacchi {
1638*4d9fdb46SRobert Mustacchi     if (attrform == DW_FORM_strp ||
1639*4d9fdb46SRobert Mustacchi         attrform == DW_FORM_line_strp ||
1640*4d9fdb46SRobert Mustacchi         attrform == DW_FORM_GNU_str_index ||
1641*4d9fdb46SRobert Mustacchi         attrform == DW_FORM_strx1 ||
1642*4d9fdb46SRobert Mustacchi         attrform == DW_FORM_strx2 ||
1643*4d9fdb46SRobert Mustacchi         attrform == DW_FORM_strx3 ||
1644*4d9fdb46SRobert Mustacchi         attrform == DW_FORM_strx4 ||
1645*4d9fdb46SRobert Mustacchi         attrform == DW_FORM_strx) {
1646*4d9fdb46SRobert Mustacchi         /*  The 'offset' into .debug_str or .debug_line_str is given,
1647*4d9fdb46SRobert Mustacchi             here we turn that into a pointer. */
1648*4d9fdb46SRobert Mustacchi         Dwarf_Small   *secend = 0;
1649*4d9fdb46SRobert Mustacchi         Dwarf_Small   *secbegin = 0;
1650*4d9fdb46SRobert Mustacchi         Dwarf_Small   *strbegin = 0;
1651*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned secsize = 0;
1652*4d9fdb46SRobert Mustacchi         int errcode = 0;
1653*4d9fdb46SRobert Mustacchi         int res = 0;
1654*4d9fdb46SRobert Mustacchi 
1655*4d9fdb46SRobert Mustacchi         if(attrform == DW_FORM_line_strp) {
1656*4d9fdb46SRobert Mustacchi             res = _dwarf_load_section(dbg, &dbg->de_debug_line_str,error);
1657*4d9fdb46SRobert Mustacchi             if (res != DW_DLV_OK) {
1658*4d9fdb46SRobert Mustacchi                 return res;
1659*4d9fdb46SRobert Mustacchi             }
1660*4d9fdb46SRobert Mustacchi             errcode = DW_DLE_STRP_OFFSET_BAD;
1661*4d9fdb46SRobert Mustacchi             secsize = dbg->de_debug_line_str.dss_size;
1662*4d9fdb46SRobert Mustacchi             secbegin = dbg->de_debug_line_str.dss_data;
1663*4d9fdb46SRobert Mustacchi             strbegin= dbg->de_debug_line_str.dss_data + offset;
1664*4d9fdb46SRobert Mustacchi         } else {
1665*4d9fdb46SRobert Mustacchi             /* DW_FORM_strp  etc */
1666*4d9fdb46SRobert Mustacchi             res = _dwarf_load_section(dbg, &dbg->de_debug_str,error);
1667*4d9fdb46SRobert Mustacchi             if (res != DW_DLV_OK) {
1668*4d9fdb46SRobert Mustacchi                 return res;
1669*4d9fdb46SRobert Mustacchi             }
1670*4d9fdb46SRobert Mustacchi             errcode = DW_DLE_STRING_OFFSET_BAD;
1671*4d9fdb46SRobert Mustacchi             secsize = dbg->de_debug_str.dss_size;
1672*4d9fdb46SRobert Mustacchi             secbegin = dbg->de_debug_str.dss_data;
1673*4d9fdb46SRobert Mustacchi             strbegin= dbg->de_debug_str.dss_data + offset;
1674*4d9fdb46SRobert Mustacchi             secend = dbg->de_debug_str.dss_data + secsize;
1675*4d9fdb46SRobert Mustacchi         }
1676*4d9fdb46SRobert Mustacchi         if (offset >= secsize) {
1677*4d9fdb46SRobert Mustacchi             /*  Badly damaged DWARF here. */
1678*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, errcode);
1679*4d9fdb46SRobert Mustacchi             return (DW_DLV_ERROR);
1680*4d9fdb46SRobert Mustacchi         }
1681*4d9fdb46SRobert Mustacchi         res= _dwarf_check_string_valid(dbg,secbegin,strbegin, secend,
1682*4d9fdb46SRobert Mustacchi             errcode,error);
1683*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
1684*4d9fdb46SRobert Mustacchi             return res;
1685*4d9fdb46SRobert Mustacchi         }
1686*4d9fdb46SRobert Mustacchi 
1687*4d9fdb46SRobert Mustacchi         *return_str = (char *)strbegin;
1688*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
1689*4d9fdb46SRobert Mustacchi     }
1690*4d9fdb46SRobert Mustacchi     generate_form_error(dbg,error,attrform,
1691*4d9fdb46SRobert Mustacchi         DW_DLE_ATTR_FORM_BAD,
1692*4d9fdb46SRobert Mustacchi         "DW_DLE_ATTR_FORM_BAD",
1693*4d9fdb46SRobert Mustacchi         "extract debug_str string");
1694*4d9fdb46SRobert Mustacchi     return (DW_DLV_ERROR);
1695*4d9fdb46SRobert Mustacchi }
169649d3bc91SRichard Lowe 
1697*4d9fdb46SRobert Mustacchi /* Contrary to pre-2005 documentation,
169807dc1947SRichard Lowe    The string pointer returned thru return_str must
169907dc1947SRichard Lowe    never have dwarf_dealloc() applied to it.
170007dc1947SRichard Lowe    Documentation fixed July 2005.
170107dc1947SRichard Lowe */
170249d3bc91SRichard Lowe int
dwarf_formstring(Dwarf_Attribute attr,char ** return_str,Dwarf_Error * error)170349d3bc91SRichard Lowe dwarf_formstring(Dwarf_Attribute attr,
1704*4d9fdb46SRobert Mustacchi     char **return_str, Dwarf_Error * error)
170549d3bc91SRichard Lowe {
170607dc1947SRichard Lowe     Dwarf_CU_Context cu_context = 0;
170707dc1947SRichard Lowe     Dwarf_Debug dbg = 0;
170807dc1947SRichard Lowe     Dwarf_Unsigned offset = 0;
170907dc1947SRichard Lowe     int res = DW_DLV_ERROR;
1710*4d9fdb46SRobert Mustacchi     Dwarf_Small *secdataptr = 0;
1711*4d9fdb46SRobert Mustacchi     Dwarf_Small *secend = 0;
1712*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned secdatalen = 0;
1713*4d9fdb46SRobert Mustacchi     Dwarf_Small *infoptr = attr->ar_debug_ptr;
1714*4d9fdb46SRobert Mustacchi     Dwarf_Small *contextend = 0;
171549d3bc91SRichard Lowe 
1716*4d9fdb46SRobert Mustacchi     res  = get_attr_dbg(&dbg,&cu_context,attr,error);
1717*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1718*4d9fdb46SRobert Mustacchi         return res;
171949d3bc91SRichard Lowe     }
1720*4d9fdb46SRobert Mustacchi     if (cu_context->cc_is_info) {
1721*4d9fdb46SRobert Mustacchi         secdataptr = (Dwarf_Small *)dbg->de_debug_info.dss_data;
1722*4d9fdb46SRobert Mustacchi         secdatalen = dbg->de_debug_info.dss_size;
1723*4d9fdb46SRobert Mustacchi     } else {
1724*4d9fdb46SRobert Mustacchi         secdataptr = (Dwarf_Small *)dbg->de_debug_types.dss_data;
1725*4d9fdb46SRobert Mustacchi         secdatalen = dbg->de_debug_types.dss_size;
172649d3bc91SRichard Lowe     }
1727*4d9fdb46SRobert Mustacchi     contextend = secdataptr +
1728*4d9fdb46SRobert Mustacchi         cu_context->cc_debug_offset +
1729*4d9fdb46SRobert Mustacchi         cu_context->cc_length +
1730*4d9fdb46SRobert Mustacchi         cu_context->cc_length_size +
1731*4d9fdb46SRobert Mustacchi         cu_context->cc_extension_size;
1732*4d9fdb46SRobert Mustacchi     secend = secdataptr + secdatalen;
1733*4d9fdb46SRobert Mustacchi     if (contextend < secend) {
1734*4d9fdb46SRobert Mustacchi         secend = contextend;
173549d3bc91SRichard Lowe     }
1736*4d9fdb46SRobert Mustacchi     switch(attr->ar_attribute_form) {
1737*4d9fdb46SRobert Mustacchi     case DW_FORM_string: {
1738*4d9fdb46SRobert Mustacchi         Dwarf_Small *begin = attr->ar_debug_ptr;
173949d3bc91SRichard Lowe 
1740*4d9fdb46SRobert Mustacchi         res= _dwarf_check_string_valid(dbg,secdataptr,begin, secend,
1741*4d9fdb46SRobert Mustacchi             DW_DLE_FORM_STRING_BAD_STRING,error);
1742*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
1743*4d9fdb46SRobert Mustacchi             return res;
174407dc1947SRichard Lowe         }
174507dc1947SRichard Lowe         *return_str = (char *) (begin);
174607dc1947SRichard Lowe         return DW_DLV_OK;
174749d3bc91SRichard Lowe     }
1748*4d9fdb46SRobert Mustacchi     case DW_FORM_GNU_strp_alt:
1749*4d9fdb46SRobert Mustacchi     case DW_FORM_strp_sup:  {
1750*4d9fdb46SRobert Mustacchi         Dwarf_Error alterr = 0;
1751*4d9fdb46SRobert Mustacchi         /*  See dwarfstd.org issue 120604.1
1752*4d9fdb46SRobert Mustacchi             This is the offset in the .debug_str section
1753*4d9fdb46SRobert Mustacchi             of another object file.
1754*4d9fdb46SRobert Mustacchi             The 'tied' file notion should apply.
1755*4d9fdb46SRobert Mustacchi             It is not clear whether both a supplementary
1756*4d9fdb46SRobert Mustacchi             and a split object might be needed at the same time
1757*4d9fdb46SRobert Mustacchi             (hence two 'tied' files simultaneously). */
1758*4d9fdb46SRobert Mustacchi         Dwarf_Off soffset = 0;
1759*4d9fdb46SRobert Mustacchi 
1760*4d9fdb46SRobert Mustacchi         res = dwarf_global_formref(attr, &soffset,error);
176107dc1947SRichard Lowe         if (res != DW_DLV_OK) {
176207dc1947SRichard Lowe             return res;
176307dc1947SRichard Lowe         }
1764*4d9fdb46SRobert Mustacchi         res = _dwarf_get_string_from_tied(dbg, soffset,
1765*4d9fdb46SRobert Mustacchi             return_str, &alterr);
1766*4d9fdb46SRobert Mustacchi         if (res == DW_DLV_ERROR) {
1767*4d9fdb46SRobert Mustacchi             if (dwarf_errno(alterr) == DW_DLE_NO_TIED_FILE_AVAILABLE) {
1768*4d9fdb46SRobert Mustacchi                 dwarf_dealloc(dbg,alterr,DW_DLA_ERROR);
1769*4d9fdb46SRobert Mustacchi                 if( attr->ar_attribute_form == DW_FORM_GNU_strp_alt) {
1770*4d9fdb46SRobert Mustacchi                     *return_str =
1771*4d9fdb46SRobert Mustacchi                         (char *)"<DW_FORM_GNU_strp_alt-no-tied-file>";
1772*4d9fdb46SRobert Mustacchi                 } else {
1773*4d9fdb46SRobert Mustacchi                     *return_str =
1774*4d9fdb46SRobert Mustacchi                         (char *)"<DW_FORM_strp_sup-no-tied-file>";
1775*4d9fdb46SRobert Mustacchi                 }
1776*4d9fdb46SRobert Mustacchi                 return DW_DLV_OK;
1777*4d9fdb46SRobert Mustacchi             }
1778*4d9fdb46SRobert Mustacchi             if (error) {
1779*4d9fdb46SRobert Mustacchi                 *error = alterr;
178007dc1947SRichard Lowe             }
1781*4d9fdb46SRobert Mustacchi             return res;
178207dc1947SRichard Lowe         }
1783*4d9fdb46SRobert Mustacchi         if (res == DW_DLV_NO_ENTRY) {
1784*4d9fdb46SRobert Mustacchi             if( attr->ar_attribute_form == DW_FORM_GNU_strp_alt) {
1785*4d9fdb46SRobert Mustacchi                 *return_str =
1786*4d9fdb46SRobert Mustacchi                     (char *)"<DW_FORM_GNU_strp_alt-no-tied-file>";
1787*4d9fdb46SRobert Mustacchi             }else {
1788*4d9fdb46SRobert Mustacchi                 *return_str =
1789*4d9fdb46SRobert Mustacchi                     (char *)"<DW_FORM_strp_sup-no-tied-file>";
1790*4d9fdb46SRobert Mustacchi             }
1791*4d9fdb46SRobert Mustacchi         }
1792*4d9fdb46SRobert Mustacchi         return res;
1793*4d9fdb46SRobert Mustacchi     }
1794*4d9fdb46SRobert Mustacchi     case DW_FORM_GNU_str_index:
1795*4d9fdb46SRobert Mustacchi     case DW_FORM_strx:
1796*4d9fdb46SRobert Mustacchi     case DW_FORM_strx1:
1797*4d9fdb46SRobert Mustacchi     case DW_FORM_strx2:
1798*4d9fdb46SRobert Mustacchi     case DW_FORM_strx3:
1799*4d9fdb46SRobert Mustacchi     case DW_FORM_strx4: {
1800*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned offsettostr= 0;
1801*4d9fdb46SRobert Mustacchi         res = _dwarf_extract_string_offset_via_str_offsets(dbg,
1802*4d9fdb46SRobert Mustacchi             infoptr,
1803*4d9fdb46SRobert Mustacchi             secend,
1804*4d9fdb46SRobert Mustacchi             attr->ar_attribute,
1805*4d9fdb46SRobert Mustacchi             attr->ar_attribute_form,
1806*4d9fdb46SRobert Mustacchi             cu_context,
1807*4d9fdb46SRobert Mustacchi             &offsettostr,
1808*4d9fdb46SRobert Mustacchi             error);
1809*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
1810*4d9fdb46SRobert Mustacchi             return res;
1811*4d9fdb46SRobert Mustacchi         }
1812*4d9fdb46SRobert Mustacchi         offset = offsettostr;
1813*4d9fdb46SRobert Mustacchi         break;
181407dc1947SRichard Lowe     }
1815*4d9fdb46SRobert Mustacchi     case DW_FORM_strp:
1816*4d9fdb46SRobert Mustacchi     case DW_FORM_line_strp:{
1817*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
1818*4d9fdb46SRobert Mustacchi             infoptr,
1819*4d9fdb46SRobert Mustacchi             cu_context->cc_length_size,error,secend);
1820*4d9fdb46SRobert Mustacchi         break;
1821*4d9fdb46SRobert Mustacchi     }
1822*4d9fdb46SRobert Mustacchi     default:
1823*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_STRING_FORM_IMPROPER);
1824*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1825*4d9fdb46SRobert Mustacchi     }
1826*4d9fdb46SRobert Mustacchi     /*  Now we have offset so read the string from
1827*4d9fdb46SRobert Mustacchi         debug_str or debug_line_str. */
1828*4d9fdb46SRobert Mustacchi     res = _dwarf_extract_local_debug_str_string_given_offset(dbg,
1829*4d9fdb46SRobert Mustacchi         attr->ar_attribute_form,
1830*4d9fdb46SRobert Mustacchi         offset,
1831*4d9fdb46SRobert Mustacchi         return_str,
1832*4d9fdb46SRobert Mustacchi         error);
1833*4d9fdb46SRobert Mustacchi     return res;
1834*4d9fdb46SRobert Mustacchi }
183549d3bc91SRichard Lowe 
1836*4d9fdb46SRobert Mustacchi 
1837*4d9fdb46SRobert Mustacchi int
_dwarf_get_string_from_tied(Dwarf_Debug dbg,Dwarf_Unsigned offset,char ** return_str,Dwarf_Error * error)1838*4d9fdb46SRobert Mustacchi _dwarf_get_string_from_tied(Dwarf_Debug dbg,
1839*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset,
1840*4d9fdb46SRobert Mustacchi     char **return_str,
1841*4d9fdb46SRobert Mustacchi     Dwarf_Error*error)
1842*4d9fdb46SRobert Mustacchi {
1843*4d9fdb46SRobert Mustacchi     Dwarf_Debug tieddbg = 0;
1844*4d9fdb46SRobert Mustacchi     Dwarf_Small *secend = 0;
1845*4d9fdb46SRobert Mustacchi     Dwarf_Small *secbegin = 0;
1846*4d9fdb46SRobert Mustacchi     Dwarf_Small *strbegin = 0;
1847*4d9fdb46SRobert Mustacchi     int res = DW_DLV_ERROR;
1848*4d9fdb46SRobert Mustacchi     Dwarf_Error localerror = 0;
1849*4d9fdb46SRobert Mustacchi 
1850*4d9fdb46SRobert Mustacchi     /* Attach errors to dbg, not tieddbg. */
1851*4d9fdb46SRobert Mustacchi     tieddbg = dbg->de_tied_data.td_tied_object;
1852*4d9fdb46SRobert Mustacchi     if (!tieddbg) {
1853*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_NO_TIED_FILE_AVAILABLE);
1854*4d9fdb46SRobert Mustacchi         return  DW_DLV_ERROR;
1855*4d9fdb46SRobert Mustacchi     }
1856*4d9fdb46SRobert Mustacchi     /* The 'offset' into .debug_str is set. */
1857*4d9fdb46SRobert Mustacchi     res = _dwarf_load_section(tieddbg, &tieddbg->de_debug_str,&localerror);
1858*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_ERROR) {
1859*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned lerrno = dwarf_errno(localerror);
1860*4d9fdb46SRobert Mustacchi         dwarf_dealloc(tieddbg,localerror,DW_DLA_ERROR);
1861*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,lerrno);
1862*4d9fdb46SRobert Mustacchi         return res;
1863*4d9fdb46SRobert Mustacchi     } else if (res == DW_DLV_NO_ENTRY) {
1864*4d9fdb46SRobert Mustacchi         return res;
1865*4d9fdb46SRobert Mustacchi     }
1866*4d9fdb46SRobert Mustacchi     if (offset >= tieddbg->de_debug_str.dss_size) {
1867*4d9fdb46SRobert Mustacchi         /*  Badly damaged DWARF here. */
1868*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,  DW_DLE_NO_TIED_STRING_AVAILABLE);
1869*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1870*4d9fdb46SRobert Mustacchi     }
1871*4d9fdb46SRobert Mustacchi     secbegin = tieddbg->de_debug_str.dss_data;
1872*4d9fdb46SRobert Mustacchi     strbegin= tieddbg->de_debug_str.dss_data + offset;
1873*4d9fdb46SRobert Mustacchi     secend = tieddbg->de_debug_str.dss_data +
1874*4d9fdb46SRobert Mustacchi         tieddbg->de_debug_str.dss_size;
1875*4d9fdb46SRobert Mustacchi 
1876*4d9fdb46SRobert Mustacchi     /*  Ensure the offset lies within the .debug_str */
1877*4d9fdb46SRobert Mustacchi     if (offset >= tieddbg->de_debug_str.dss_size) {
1878*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,  DW_DLE_NO_TIED_STRING_AVAILABLE);
1879*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1880*4d9fdb46SRobert Mustacchi     }
1881*4d9fdb46SRobert Mustacchi     res= _dwarf_check_string_valid(tieddbg,secbegin,strbegin, secend,
1882*4d9fdb46SRobert Mustacchi         DW_DLE_NO_TIED_STRING_AVAILABLE,
1883*4d9fdb46SRobert Mustacchi         &localerror);
1884*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_ERROR) {
1885*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned lerrno = dwarf_errno(localerror);
1886*4d9fdb46SRobert Mustacchi         dwarf_dealloc(tieddbg,localerror,DW_DLA_ERROR);
1887*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,lerrno);
1888*4d9fdb46SRobert Mustacchi         return res;
1889*4d9fdb46SRobert Mustacchi     } else if (res == DW_DLV_NO_ENTRY) {
1890*4d9fdb46SRobert Mustacchi         return res;
1891*4d9fdb46SRobert Mustacchi     }
1892*4d9fdb46SRobert Mustacchi     *return_str = (char *) (tieddbg->de_debug_str.dss_data + offset);
1893*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
189407dc1947SRichard Lowe }
189549d3bc91SRichard Lowe 
1896*4d9fdb46SRobert Mustacchi 
1897*4d9fdb46SRobert Mustacchi 
1898*4d9fdb46SRobert Mustacchi 
189907dc1947SRichard Lowe int
dwarf_formexprloc(Dwarf_Attribute attr,Dwarf_Unsigned * return_exprlen,Dwarf_Ptr * block_ptr,Dwarf_Error * error)190007dc1947SRichard Lowe dwarf_formexprloc(Dwarf_Attribute attr,
1901*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * return_exprlen,
190207dc1947SRichard Lowe     Dwarf_Ptr  * block_ptr,
190307dc1947SRichard Lowe     Dwarf_Error * error)
190407dc1947SRichard Lowe {
190507dc1947SRichard Lowe     Dwarf_Debug dbg = 0;
190607dc1947SRichard Lowe     Dwarf_CU_Context cu_context = 0;
190707dc1947SRichard Lowe 
1908*4d9fdb46SRobert Mustacchi     int res  = get_attr_dbg(&dbg,&cu_context,attr,error);
1909*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1910*4d9fdb46SRobert Mustacchi         return res;
191107dc1947SRichard Lowe     }
191207dc1947SRichard Lowe     if (dbg == NULL) {
191307dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
191407dc1947SRichard Lowe         return (DW_DLV_ERROR);
191507dc1947SRichard Lowe     }
191607dc1947SRichard Lowe     if (attr->ar_attribute_form == DW_FORM_exprloc ) {
1917*4d9fdb46SRobert Mustacchi         Dwarf_Die die = 0;
1918*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned leb_len = 0;
1919*4d9fdb46SRobert Mustacchi         Dwarf_Byte_Ptr section_start = 0;
1920*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned section_len = 0;
1921*4d9fdb46SRobert Mustacchi         Dwarf_Byte_Ptr section_end = 0;
1922*4d9fdb46SRobert Mustacchi         Dwarf_Byte_Ptr info_ptr = 0;
1923*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned exprlen = 0;
1924*4d9fdb46SRobert Mustacchi         Dwarf_Small * addr = attr->ar_debug_ptr;
1925*4d9fdb46SRobert Mustacchi 
1926*4d9fdb46SRobert Mustacchi         info_ptr = addr;
1927*4d9fdb46SRobert Mustacchi         section_start =
1928*4d9fdb46SRobert Mustacchi             _dwarf_calculate_info_section_start_ptr(cu_context,
1929*4d9fdb46SRobert Mustacchi             &section_len);
1930*4d9fdb46SRobert Mustacchi         section_end = section_start + section_len;
1931*4d9fdb46SRobert Mustacchi 
1932*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(info_ptr, exprlen, leb_len,
1933*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
1934*4d9fdb46SRobert Mustacchi         if (exprlen > section_len) {
1935*4d9fdb46SRobert Mustacchi             /* Corrupted dwarf!  */
1936*4d9fdb46SRobert Mustacchi             dwarfstring m;
1937*4d9fdb46SRobert Mustacchi 
1938*4d9fdb46SRobert Mustacchi             dwarfstring_constructor(&m);
1939*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m,
1940*4d9fdb46SRobert Mustacchi                 "DW_DLE_ATTR_OUTSIDE_SECTION: "
1941*4d9fdb46SRobert Mustacchi                 "The expression length is %u,",exprlen);
1942*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m,
1943*4d9fdb46SRobert Mustacchi                 " but the section length is just %u. "
1944*4d9fdb46SRobert Mustacchi                 "Corrupt Dwarf.",section_len);
1945*4d9fdb46SRobert Mustacchi             _dwarf_error_string(dbg, error,
1946*4d9fdb46SRobert Mustacchi                 DW_DLE_ATTR_OUTSIDE_SECTION,
1947*4d9fdb46SRobert Mustacchi                 dwarfstring_string(&m));
1948*4d9fdb46SRobert Mustacchi             dwarfstring_destructor(&m);
1949*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
1950*4d9fdb46SRobert Mustacchi         }
1951*4d9fdb46SRobert Mustacchi         die = attr->ar_die;
1952*4d9fdb46SRobert Mustacchi         /*  Is the block entirely in the section, or is
1953*4d9fdb46SRobert Mustacchi             there bug somewhere?
1954*4d9fdb46SRobert Mustacchi             Here the final addr may be 1 past end of section. */
1955*4d9fdb46SRobert Mustacchi         if (_dwarf_reference_outside_section(die,
1956*4d9fdb46SRobert Mustacchi             (Dwarf_Small *)addr,
1957*4d9fdb46SRobert Mustacchi             ((Dwarf_Small *)addr)+exprlen +leb_len)) {
1958*4d9fdb46SRobert Mustacchi             dwarfstring m;
1959*4d9fdb46SRobert Mustacchi 
1960*4d9fdb46SRobert Mustacchi             dwarfstring_constructor(&m);
1961*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m,
1962*4d9fdb46SRobert Mustacchi                 "DW_DLE_ATTR_OUTSIDE_SECTION: "
1963*4d9fdb46SRobert Mustacchi                 "The expression length %u,",exprlen);
1964*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m,
1965*4d9fdb46SRobert Mustacchi                 " plus the leb value length of "
1966*4d9fdb46SRobert Mustacchi                 "%u ",leb_len);
1967*4d9fdb46SRobert Mustacchi             dwarfstring_append(&m,
1968*4d9fdb46SRobert Mustacchi                 " runs past the end of the section. "
1969*4d9fdb46SRobert Mustacchi                 "Corrupt Dwarf.");
1970*4d9fdb46SRobert Mustacchi             _dwarf_error_string(dbg, error,
1971*4d9fdb46SRobert Mustacchi                 DW_DLE_ATTR_OUTSIDE_SECTION,
1972*4d9fdb46SRobert Mustacchi                 dwarfstring_string(&m));
1973*4d9fdb46SRobert Mustacchi             dwarfstring_destructor(&m);
1974*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
1975*4d9fdb46SRobert Mustacchi         }
197607dc1947SRichard Lowe         *return_exprlen = exprlen;
1977*4d9fdb46SRobert Mustacchi         *block_ptr = addr + leb_len;
197807dc1947SRichard Lowe         return DW_DLV_OK;
197907dc1947SRichard Lowe 
198007dc1947SRichard Lowe     }
1981*4d9fdb46SRobert Mustacchi     {
1982*4d9fdb46SRobert Mustacchi         dwarfstring m;
1983*4d9fdb46SRobert Mustacchi         const char *name = "<name not known>";
1984*4d9fdb46SRobert Mustacchi         unsigned  mform = attr->ar_attribute_form;
1985*4d9fdb46SRobert Mustacchi 
1986*4d9fdb46SRobert Mustacchi         dwarfstring_constructor(&m);
1987*4d9fdb46SRobert Mustacchi 
1988*4d9fdb46SRobert Mustacchi         dwarf_get_FORM_name (mform,&name);
1989*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m,
1990*4d9fdb46SRobert Mustacchi             "DW_DLE_ATTR_EXPRLOC_FORM_BAD: "
1991*4d9fdb46SRobert Mustacchi             "The form is 0x%x ", mform);
1992*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_s(&m,
1993*4d9fdb46SRobert Mustacchi             "(%s) but should be DW_FORM_exprloc. "
1994*4d9fdb46SRobert Mustacchi             "Corrupt Dwarf.",(char *)name);
1995*4d9fdb46SRobert Mustacchi         _dwarf_error_string(dbg, error, DW_DLE_ATTR_EXPRLOC_FORM_BAD,
1996*4d9fdb46SRobert Mustacchi             dwarfstring_string(&m));
1997*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&m);
1998*4d9fdb46SRobert Mustacchi     }
1999*4d9fdb46SRobert Mustacchi     return DW_DLV_ERROR;
200049d3bc91SRichard Lowe }
2001