1*4d9fdb46SRobert Mustacchi /*
2*4d9fdb46SRobert Mustacchi Copyright (C) 2016-2019 David Anderson. All Rights Reserved.
3*4d9fdb46SRobert Mustacchi
4*4d9fdb46SRobert Mustacchi This program is free software; you can redistribute it and/or modify it
5*4d9fdb46SRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License
6*4d9fdb46SRobert Mustacchi as published by the Free Software Foundation.
7*4d9fdb46SRobert Mustacchi
8*4d9fdb46SRobert Mustacchi This program is distributed in the hope that it would be useful, but
9*4d9fdb46SRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of
10*4d9fdb46SRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11*4d9fdb46SRobert Mustacchi
12*4d9fdb46SRobert Mustacchi Further, this software is distributed without any warranty that it is
13*4d9fdb46SRobert Mustacchi free of the rightful claim of any third person regarding infringement
14*4d9fdb46SRobert Mustacchi or the like. Any license provided herein, whether implied or
15*4d9fdb46SRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if
16*4d9fdb46SRobert Mustacchi any, provided herein do not apply to combinations of this program with
17*4d9fdb46SRobert Mustacchi other software, or any other product whatsoever.
18*4d9fdb46SRobert Mustacchi
19*4d9fdb46SRobert Mustacchi You should have received a copy of the GNU Lesser General Public
20*4d9fdb46SRobert Mustacchi License along with this program; if not, write the Free Software
21*4d9fdb46SRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
22*4d9fdb46SRobert Mustacchi USA.
23*4d9fdb46SRobert Mustacchi
24*4d9fdb46SRobert Mustacchi */
25*4d9fdb46SRobert Mustacchi
26*4d9fdb46SRobert Mustacchi #include "config.h"
27*4d9fdb46SRobert Mustacchi #include <stdio.h>
28*4d9fdb46SRobert Mustacchi #ifdef HAVE_STDLIB_H
29*4d9fdb46SRobert Mustacchi #include <stdlib.h>
30*4d9fdb46SRobert Mustacchi #endif
31*4d9fdb46SRobert Mustacchi #ifdef HAVE_MALLOC_H
32*4d9fdb46SRobert Mustacchi /* Useful include for some Windows compilers. */
33*4d9fdb46SRobert Mustacchi #include <malloc.h>
34*4d9fdb46SRobert Mustacchi #endif /* HAVE_MALLOC_H */
35*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
36*4d9fdb46SRobert Mustacchi #include "dwarf_alloc.h"
37*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
38*4d9fdb46SRobert Mustacchi #include "dwarf_util.h"
39*4d9fdb46SRobert Mustacchi #include "dwarf_dsc.h"
40*4d9fdb46SRobert Mustacchi
41*4d9fdb46SRobert Mustacchi #define FALSE 0
42*4d9fdb46SRobert Mustacchi #define TRUE 1
43*4d9fdb46SRobert Mustacchi
44*4d9fdb46SRobert Mustacchi /* When called with ary and *arraycount 0
45*4d9fdb46SRobert Mustacchi this just counts the elements found.
46*4d9fdb46SRobert Mustacchi Otherwise it records the values in ary and
47*4d9fdb46SRobert Mustacchi recounts. The arraycount pointer must be
48*4d9fdb46SRobert Mustacchi passed-in non-null always. */
49*4d9fdb46SRobert Mustacchi static int
get_dsc_leb_entries(Dwarf_Debug dbg,Dwarf_Small * blockpointer,Dwarf_Unsigned blocklen,int dounsigned,struct Dwarf_Dsc_Entry_s * ary,size_t * arraycount,Dwarf_Error * error)50*4d9fdb46SRobert Mustacchi get_dsc_leb_entries(Dwarf_Debug dbg,
51*4d9fdb46SRobert Mustacchi Dwarf_Small * blockpointer,
52*4d9fdb46SRobert Mustacchi Dwarf_Unsigned blocklen,
53*4d9fdb46SRobert Mustacchi int dounsigned,
54*4d9fdb46SRobert Mustacchi struct Dwarf_Dsc_Entry_s *ary,
55*4d9fdb46SRobert Mustacchi size_t * arraycount,
56*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
57*4d9fdb46SRobert Mustacchi {
58*4d9fdb46SRobert Mustacchi Dwarf_Small *p = blockpointer;
59*4d9fdb46SRobert Mustacchi Dwarf_Small *endp = blockpointer + blocklen;
60*4d9fdb46SRobert Mustacchi size_t larraycount = 0;
61*4d9fdb46SRobert Mustacchi size_t iarraycount = *arraycount;
62*4d9fdb46SRobert Mustacchi
63*4d9fdb46SRobert Mustacchi if (!ary) {
64*4d9fdb46SRobert Mustacchi if (iarraycount) {
65*4d9fdb46SRobert Mustacchi /* Internal botch calling this static function. */
66*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_DISCR_ARRAY_ERROR);
67*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
68*4d9fdb46SRobert Mustacchi }
69*4d9fdb46SRobert Mustacchi } else {
70*4d9fdb46SRobert Mustacchi if (!iarraycount) {
71*4d9fdb46SRobert Mustacchi /* Internal botch calling this static function. */
72*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_DISCR_ARRAY_ERROR);
73*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
74*4d9fdb46SRobert Mustacchi }
75*4d9fdb46SRobert Mustacchi }
76*4d9fdb46SRobert Mustacchi if (dounsigned) {
77*4d9fdb46SRobert Mustacchi while (p < endp) {
78*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dsc = 0;
79*4d9fdb46SRobert Mustacchi Dwarf_Unsigned low = 0;
80*4d9fdb46SRobert Mustacchi Dwarf_Unsigned high = 0;
81*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Unsigned leblen = 0;
82*4d9fdb46SRobert Mustacchi
83*4d9fdb46SRobert Mustacchi if (ary && (larraycount >= iarraycount)) {
84*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_DISCR_ARRAY_ERROR);
85*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
86*4d9fdb46SRobert Mustacchi }
87*4d9fdb46SRobert Mustacchi DECODE_LEB128_UWORD_LEN_CK(p,dsc,
88*4d9fdb46SRobert Mustacchi leblen,dbg,error,endp);
89*4d9fdb46SRobert Mustacchi if (!dsc) {
90*4d9fdb46SRobert Mustacchi DECODE_LEB128_UWORD_LEN_CK(p,low,
91*4d9fdb46SRobert Mustacchi leblen, dbg,error,endp);
92*4d9fdb46SRobert Mustacchi } else {
93*4d9fdb46SRobert Mustacchi DECODE_LEB128_UWORD_LEN_CK(p,low,
94*4d9fdb46SRobert Mustacchi leblen, dbg,error,endp);
95*4d9fdb46SRobert Mustacchi DECODE_LEB128_UWORD_LEN_CK(p,high,
96*4d9fdb46SRobert Mustacchi leblen, dbg,error,endp);
97*4d9fdb46SRobert Mustacchi }
98*4d9fdb46SRobert Mustacchi if(ary) {
99*4d9fdb46SRobert Mustacchi struct Dwarf_Dsc_Entry_s *arye =
100*4d9fdb46SRobert Mustacchi ary+larraycount;
101*4d9fdb46SRobert Mustacchi
102*4d9fdb46SRobert Mustacchi /* type reads the same as uleb and leb because
103*4d9fdb46SRobert Mustacchi it is only zero or one. */
104*4d9fdb46SRobert Mustacchi arye->dsc_type = dsc;
105*4d9fdb46SRobert Mustacchi arye->dsc_low_u = low;
106*4d9fdb46SRobert Mustacchi arye->dsc_high_u = high;
107*4d9fdb46SRobert Mustacchi }
108*4d9fdb46SRobert Mustacchi larraycount++;
109*4d9fdb46SRobert Mustacchi }
110*4d9fdb46SRobert Mustacchi } else {
111*4d9fdb46SRobert Mustacchi while (p < endp) {
112*4d9fdb46SRobert Mustacchi Dwarf_Signed dsc = 0;
113*4d9fdb46SRobert Mustacchi Dwarf_Signed low = 0;
114*4d9fdb46SRobert Mustacchi Dwarf_Signed high = 0;
115*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Unsigned leblen = 0;
116*4d9fdb46SRobert Mustacchi
117*4d9fdb46SRobert Mustacchi if (ary && (larraycount >= iarraycount)) {
118*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_DISCR_ARRAY_ERROR);
119*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
120*4d9fdb46SRobert Mustacchi }
121*4d9fdb46SRobert Mustacchi DECODE_LEB128_SWORD_LEN_CK(p,dsc,
122*4d9fdb46SRobert Mustacchi leblen,dbg,error,endp);
123*4d9fdb46SRobert Mustacchi if (!dsc) {
124*4d9fdb46SRobert Mustacchi DECODE_LEB128_SWORD_LEN_CK(p,low,
125*4d9fdb46SRobert Mustacchi leblen,dbg,error,endp);
126*4d9fdb46SRobert Mustacchi } else {
127*4d9fdb46SRobert Mustacchi DECODE_LEB128_SWORD_LEN_CK(p,low,
128*4d9fdb46SRobert Mustacchi leblen,dbg,error,endp);
129*4d9fdb46SRobert Mustacchi DECODE_LEB128_SWORD_LEN_CK(p,high,
130*4d9fdb46SRobert Mustacchi leblen,dbg,error,endp);
131*4d9fdb46SRobert Mustacchi }
132*4d9fdb46SRobert Mustacchi if(ary) {
133*4d9fdb46SRobert Mustacchi struct Dwarf_Dsc_Entry_s *arye =
134*4d9fdb46SRobert Mustacchi ary+larraycount;
135*4d9fdb46SRobert Mustacchi
136*4d9fdb46SRobert Mustacchi /* type reads the same as uleb and leb because
137*4d9fdb46SRobert Mustacchi it is only zero or one. */
138*4d9fdb46SRobert Mustacchi arye->dsc_type = (Dwarf_Unsigned)dsc;
139*4d9fdb46SRobert Mustacchi arye->dsc_low_s = low;
140*4d9fdb46SRobert Mustacchi arye->dsc_high_s = high;
141*4d9fdb46SRobert Mustacchi }
142*4d9fdb46SRobert Mustacchi larraycount++;
143*4d9fdb46SRobert Mustacchi }
144*4d9fdb46SRobert Mustacchi }
145*4d9fdb46SRobert Mustacchi if (ary) {
146*4d9fdb46SRobert Mustacchi /* Just verify this recount matches original */
147*4d9fdb46SRobert Mustacchi if(iarraycount != larraycount) {
148*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_DISCR_ARRAY_ERROR);
149*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
150*4d9fdb46SRobert Mustacchi }
151*4d9fdb46SRobert Mustacchi } else {
152*4d9fdb46SRobert Mustacchi /* This matters for first call with
153*4d9fdb46SRobert Mustacchi ary 0 and iarraycount 0 as we are generating the
154*4d9fdb46SRobert Mustacchi count. */
155*4d9fdb46SRobert Mustacchi *arraycount = larraycount;
156*4d9fdb46SRobert Mustacchi }
157*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
158*4d9fdb46SRobert Mustacchi }
159*4d9fdb46SRobert Mustacchi
160*4d9fdb46SRobert Mustacchi
dwarf_discr_list(Dwarf_Debug dbg,Dwarf_Small * blockpointer,Dwarf_Unsigned blocklen,Dwarf_Dsc_Head * dsc_head_out,Dwarf_Unsigned * dsc_array_length_out,Dwarf_Error * error)161*4d9fdb46SRobert Mustacchi int dwarf_discr_list(Dwarf_Debug dbg,
162*4d9fdb46SRobert Mustacchi Dwarf_Small * blockpointer,
163*4d9fdb46SRobert Mustacchi Dwarf_Unsigned blocklen,
164*4d9fdb46SRobert Mustacchi Dwarf_Dsc_Head * dsc_head_out,
165*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * dsc_array_length_out,
166*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
167*4d9fdb46SRobert Mustacchi {
168*4d9fdb46SRobert Mustacchi Dwarf_Dsc_Head h = 0;
169*4d9fdb46SRobert Mustacchi int res = 0;
170*4d9fdb46SRobert Mustacchi size_t arraycount = 0;
171*4d9fdb46SRobert Mustacchi struct Dwarf_Dsc_Entry_s *ary = 0;
172*4d9fdb46SRobert Mustacchi Dwarf_Small * dscblockp = 0;
173*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dscblocklen = 0;
174*4d9fdb46SRobert Mustacchi
175*4d9fdb46SRobert Mustacchi if (!dbg){
176*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DBG_NULL); \
177*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
178*4d9fdb46SRobert Mustacchi }
179*4d9fdb46SRobert Mustacchi if (blocklen == 0) {
180*4d9fdb46SRobert Mustacchi return DW_DLV_NO_ENTRY;
181*4d9fdb46SRobert Mustacchi }
182*4d9fdb46SRobert Mustacchi dscblockp = (Dwarf_Small *)calloc(blocklen,sizeof(Dwarf_Small));
183*4d9fdb46SRobert Mustacchi if(!dscblockp) {
184*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
185*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
186*4d9fdb46SRobert Mustacchi }
187*4d9fdb46SRobert Mustacchi dscblocklen = blocklen;
188*4d9fdb46SRobert Mustacchi memcpy(dscblockp,blockpointer,blocklen);
189*4d9fdb46SRobert Mustacchi
190*4d9fdb46SRobert Mustacchi res = get_dsc_leb_entries(dbg,dscblockp,dscblocklen,
191*4d9fdb46SRobert Mustacchi /* TRUE or FALSE here is not important, the arraycount
192*4d9fdb46SRobert Mustacchi returned to us will be identical either way. */
193*4d9fdb46SRobert Mustacchi FALSE, 0, &arraycount,error);
194*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
195*4d9fdb46SRobert Mustacchi free(dscblockp);
196*4d9fdb46SRobert Mustacchi return res;
197*4d9fdb46SRobert Mustacchi }
198*4d9fdb46SRobert Mustacchi
199*4d9fdb46SRobert Mustacchi h = (Dwarf_Dsc_Head)_dwarf_get_alloc(dbg,DW_DLA_DSC_HEAD,1);
200*4d9fdb46SRobert Mustacchi if(!h) {
201*4d9fdb46SRobert Mustacchi free(dscblockp);
202*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
203*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
204*4d9fdb46SRobert Mustacchi }
205*4d9fdb46SRobert Mustacchi
206*4d9fdb46SRobert Mustacchi h->dsh_block = dscblockp;
207*4d9fdb46SRobert Mustacchi h->dsh_block_len = dscblocklen;
208*4d9fdb46SRobert Mustacchi h->dsh_debug = dbg;
209*4d9fdb46SRobert Mustacchi /* Now the destructor for h will deal with block malloc space. */
210*4d9fdb46SRobert Mustacchi
211*4d9fdb46SRobert Mustacchi ary = (struct Dwarf_Dsc_Entry_s *)calloc(arraycount,
212*4d9fdb46SRobert Mustacchi sizeof(struct Dwarf_Dsc_Entry_s));
213*4d9fdb46SRobert Mustacchi if(!ary) {
214*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,h,DW_DLA_DSC_HEAD);
215*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
216*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
217*4d9fdb46SRobert Mustacchi }
218*4d9fdb46SRobert Mustacchi h->dsh_count = arraycount;
219*4d9fdb46SRobert Mustacchi h->dsh_array = ary;
220*4d9fdb46SRobert Mustacchi h->dsh_set_unsigned = 0;
221*4d9fdb46SRobert Mustacchi h->dsh_set_signed = 0;
222*4d9fdb46SRobert Mustacchi
223*4d9fdb46SRobert Mustacchi *dsc_head_out = h;
224*4d9fdb46SRobert Mustacchi *dsc_array_length_out = arraycount;
225*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
226*4d9fdb46SRobert Mustacchi }
227*4d9fdb46SRobert Mustacchi
228*4d9fdb46SRobert Mustacchi /* NEW September 2016. Allows easy access to DW_AT_discr_list
229*4d9fdb46SRobert Mustacchi entry. Callers must know which is the appropriate
230*4d9fdb46SRobert Mustacchi one of the following two interfaces, though both
231*4d9fdb46SRobert Mustacchi will work. */
dwarf_discr_entry_u(Dwarf_Dsc_Head dsh,Dwarf_Unsigned entrynum,Dwarf_Half * out_type,Dwarf_Unsigned * out_discr_low,Dwarf_Unsigned * out_discr_high,UNUSEDARG Dwarf_Error * error)232*4d9fdb46SRobert Mustacchi int dwarf_discr_entry_u(Dwarf_Dsc_Head dsh ,
233*4d9fdb46SRobert Mustacchi Dwarf_Unsigned entrynum,
234*4d9fdb46SRobert Mustacchi Dwarf_Half * out_type,
235*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * out_discr_low,
236*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * out_discr_high,
237*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Error * error)
238*4d9fdb46SRobert Mustacchi {
239*4d9fdb46SRobert Mustacchi struct Dwarf_Dsc_Entry_s *dse = 0;
240*4d9fdb46SRobert Mustacchi
241*4d9fdb46SRobert Mustacchi if (entrynum >= dsh->dsh_count) {
242*4d9fdb46SRobert Mustacchi return DW_DLV_NO_ENTRY;
243*4d9fdb46SRobert Mustacchi }
244*4d9fdb46SRobert Mustacchi if (!dsh->dsh_set_unsigned) {
245*4d9fdb46SRobert Mustacchi int res =0;
246*4d9fdb46SRobert Mustacchi int dounsigned = 1;
247*4d9fdb46SRobert Mustacchi size_t count = dsh->dsh_count;
248*4d9fdb46SRobert Mustacchi
249*4d9fdb46SRobert Mustacchi res = get_dsc_leb_entries(dsh->dsh_debug,
250*4d9fdb46SRobert Mustacchi dsh->dsh_block,
251*4d9fdb46SRobert Mustacchi dsh->dsh_block_len,
252*4d9fdb46SRobert Mustacchi dounsigned,
253*4d9fdb46SRobert Mustacchi dsh->dsh_array,
254*4d9fdb46SRobert Mustacchi &count,
255*4d9fdb46SRobert Mustacchi error);
256*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
257*4d9fdb46SRobert Mustacchi return res;
258*4d9fdb46SRobert Mustacchi }
259*4d9fdb46SRobert Mustacchi dsh->dsh_set_unsigned = TRUE;
260*4d9fdb46SRobert Mustacchi }
261*4d9fdb46SRobert Mustacchi if (!dsh->dsh_array) {
262*4d9fdb46SRobert Mustacchi _dwarf_error(dsh->dsh_debug, error, DW_DLE_DISCR_ARRAY_ERROR);
263*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
264*4d9fdb46SRobert Mustacchi }
265*4d9fdb46SRobert Mustacchi dse = dsh->dsh_array + entrynum;
266*4d9fdb46SRobert Mustacchi *out_type = dse->dsc_type;
267*4d9fdb46SRobert Mustacchi *out_discr_low = dse->dsc_low_u;
268*4d9fdb46SRobert Mustacchi *out_discr_high = dse->dsc_high_u;
269*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
270*4d9fdb46SRobert Mustacchi }
271*4d9fdb46SRobert Mustacchi
272*4d9fdb46SRobert Mustacchi /* NEW September 2016. Allows easy access to DW_AT_discr_list
273*4d9fdb46SRobert Mustacchi entry. */
dwarf_discr_entry_s(Dwarf_Dsc_Head dsh,Dwarf_Unsigned entrynum,Dwarf_Half * out_type,Dwarf_Signed * out_discr_low,Dwarf_Signed * out_discr_high,UNUSEDARG Dwarf_Error * error)274*4d9fdb46SRobert Mustacchi int dwarf_discr_entry_s(Dwarf_Dsc_Head dsh,
275*4d9fdb46SRobert Mustacchi Dwarf_Unsigned entrynum,
276*4d9fdb46SRobert Mustacchi Dwarf_Half * out_type,
277*4d9fdb46SRobert Mustacchi Dwarf_Signed * out_discr_low,
278*4d9fdb46SRobert Mustacchi Dwarf_Signed * out_discr_high,
279*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Error * error)
280*4d9fdb46SRobert Mustacchi {
281*4d9fdb46SRobert Mustacchi struct Dwarf_Dsc_Entry_s *dse = 0;
282*4d9fdb46SRobert Mustacchi
283*4d9fdb46SRobert Mustacchi if (entrynum >= dsh->dsh_count) {
284*4d9fdb46SRobert Mustacchi return DW_DLV_NO_ENTRY;
285*4d9fdb46SRobert Mustacchi }
286*4d9fdb46SRobert Mustacchi if (!dsh->dsh_set_signed) {
287*4d9fdb46SRobert Mustacchi int res =0;
288*4d9fdb46SRobert Mustacchi int dounsigned = 0;
289*4d9fdb46SRobert Mustacchi size_t count = dsh->dsh_count;
290*4d9fdb46SRobert Mustacchi
291*4d9fdb46SRobert Mustacchi res = get_dsc_leb_entries(dsh->dsh_debug,
292*4d9fdb46SRobert Mustacchi dsh->dsh_block,
293*4d9fdb46SRobert Mustacchi dsh->dsh_block_len,
294*4d9fdb46SRobert Mustacchi dounsigned,
295*4d9fdb46SRobert Mustacchi dsh->dsh_array,
296*4d9fdb46SRobert Mustacchi &count,
297*4d9fdb46SRobert Mustacchi error);
298*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
299*4d9fdb46SRobert Mustacchi return res;
300*4d9fdb46SRobert Mustacchi }
301*4d9fdb46SRobert Mustacchi dsh->dsh_set_signed = TRUE;
302*4d9fdb46SRobert Mustacchi }
303*4d9fdb46SRobert Mustacchi if (!dsh->dsh_array) {
304*4d9fdb46SRobert Mustacchi _dwarf_error(dsh->dsh_debug, error, DW_DLE_DISCR_ARRAY_ERROR);
305*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
306*4d9fdb46SRobert Mustacchi }
307*4d9fdb46SRobert Mustacchi dse = dsh->dsh_array + entrynum;
308*4d9fdb46SRobert Mustacchi *out_type = dse->dsc_type;
309*4d9fdb46SRobert Mustacchi *out_discr_low = dse->dsc_low_s;
310*4d9fdb46SRobert Mustacchi *out_discr_high = dse->dsc_high_s;
311*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
312*4d9fdb46SRobert Mustacchi }
313*4d9fdb46SRobert Mustacchi
314*4d9fdb46SRobert Mustacchi void
_dwarf_dsc_destructor(void * m)315*4d9fdb46SRobert Mustacchi _dwarf_dsc_destructor(void *m)
316*4d9fdb46SRobert Mustacchi {
317*4d9fdb46SRobert Mustacchi Dwarf_Dsc_Head h = (Dwarf_Dsc_Head) m;
318*4d9fdb46SRobert Mustacchi
319*4d9fdb46SRobert Mustacchi free(h->dsh_array);
320*4d9fdb46SRobert Mustacchi h->dsh_array = 0;
321*4d9fdb46SRobert Mustacchi free(h->dsh_block);
322*4d9fdb46SRobert Mustacchi h->dsh_block = 0;
323*4d9fdb46SRobert Mustacchi h->dsh_count = 0;
324*4d9fdb46SRobert Mustacchi }
325