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