1*4d9fdb46SRobert Mustacchi /*
2*4d9fdb46SRobert Mustacchi 
3*4d9fdb46SRobert Mustacchi   Copyright (C) 2014-2019 David Anderson. All Rights Reserved.
4*4d9fdb46SRobert Mustacchi 
5*4d9fdb46SRobert Mustacchi   This program is free software; you can redistribute it and/or modify it
6*4d9fdb46SRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
7*4d9fdb46SRobert Mustacchi   as published by the Free Software Foundation.
8*4d9fdb46SRobert Mustacchi 
9*4d9fdb46SRobert Mustacchi   This program is distributed in the hope that it would be useful, but
10*4d9fdb46SRobert Mustacchi   WITHOUT ANY WARRANTY; without even the implied warranty of
11*4d9fdb46SRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12*4d9fdb46SRobert Mustacchi 
13*4d9fdb46SRobert Mustacchi   Further, this software is distributed without any warranty that it is
14*4d9fdb46SRobert Mustacchi   free of the rightful claim of any third person regarding infringement
15*4d9fdb46SRobert Mustacchi   or the like.  Any license provided herein, whether implied or
16*4d9fdb46SRobert Mustacchi   otherwise, applies only to this software file.  Patent licenses, if
17*4d9fdb46SRobert Mustacchi   any, provided herein do not apply to combinations of this program with
18*4d9fdb46SRobert Mustacchi   other software, or any other product whatsoever.
19*4d9fdb46SRobert Mustacchi 
20*4d9fdb46SRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
21*4d9fdb46SRobert Mustacchi   License along with this program; if not, write the Free Software
22*4d9fdb46SRobert Mustacchi   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
23*4d9fdb46SRobert Mustacchi   USA.
24*4d9fdb46SRobert Mustacchi 
25*4d9fdb46SRobert Mustacchi */
26*4d9fdb46SRobert Mustacchi 
27*4d9fdb46SRobert Mustacchi #include "config.h"
28*4d9fdb46SRobert Mustacchi #include <stdio.h>
29*4d9fdb46SRobert Mustacchi #ifdef HAVE_STDLIB_H
30*4d9fdb46SRobert Mustacchi #include <stdlib.h>
31*4d9fdb46SRobert Mustacchi #endif /* HAVE_STDLIB_H */
32*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
33*4d9fdb46SRobert Mustacchi #include "dwarf_alloc.h"
34*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
35*4d9fdb46SRobert Mustacchi #include "dwarf_util.h"
36*4d9fdb46SRobert Mustacchi #include "memcpy_swap.h"
37*4d9fdb46SRobert Mustacchi #include "dwarf_gdbindex.h"
38*4d9fdb46SRobert Mustacchi 
39*4d9fdb46SRobert Mustacchi #define TRUE 1
40*4d9fdb46SRobert Mustacchi #define FALSE 0
41*4d9fdb46SRobert Mustacchi 
42*4d9fdb46SRobert Mustacchi /*  The dwarf_util macro READ_UNALIGNED
43*4d9fdb46SRobert Mustacchi     cannot be directly used because
44*4d9fdb46SRobert Mustacchi     gdb defines the section contents of
45*4d9fdb46SRobert Mustacchi     .gdb_index as little-endian always.
46*4d9fdb46SRobert Mustacchi */
47*4d9fdb46SRobert Mustacchi 
48*4d9fdb46SRobert Mustacchi #if WORDS_BIGENDIAN   /* meaning on this host */
49*4d9fdb46SRobert Mustacchi #define READ_GDBINDEX(dest,desttype, source, length)                     \
50*4d9fdb46SRobert Mustacchi     do {                                                                 \
51*4d9fdb46SRobert Mustacchi         BIGGEST_UINT _ltmp = 0;                                          \
52*4d9fdb46SRobert Mustacchi         _dwarf_memcpy_swap_bytes((((char *)(&_ltmp)) + sizeof(_ltmp) - length), \
53*4d9fdb46SRobert Mustacchi             source, length) ;                                            \
54*4d9fdb46SRobert Mustacchi         dest = (desttype)_ltmp;                                          \
55*4d9fdb46SRobert Mustacchi     } while (0)
56*4d9fdb46SRobert Mustacchi #else /* little-endian on this host */
57*4d9fdb46SRobert Mustacchi #define READ_GDBINDEX(dest,desttype, source, length)                     \
58*4d9fdb46SRobert Mustacchi     do {                                                                 \
59*4d9fdb46SRobert Mustacchi         BIGGEST_UINT _ltmp = 0;                                          \
60*4d9fdb46SRobert Mustacchi         memcpy(((char *)(&_ltmp)) ,            \
61*4d9fdb46SRobert Mustacchi             source, length) ;                                            \
62*4d9fdb46SRobert Mustacchi         dest = (desttype)_ltmp;                                          \
63*4d9fdb46SRobert Mustacchi     } while (0)
64*4d9fdb46SRobert Mustacchi 
65*4d9fdb46SRobert Mustacchi #endif
66*4d9fdb46SRobert Mustacchi 
67*4d9fdb46SRobert Mustacchi 
68*4d9fdb46SRobert Mustacchi struct gi_fileheader_s {
69*4d9fdb46SRobert Mustacchi     char gfs [4][6];
70*4d9fdb46SRobert Mustacchi };
71*4d9fdb46SRobert Mustacchi 
72*4d9fdb46SRobert Mustacchi struct dwarf_64bitpair {
73*4d9fdb46SRobert Mustacchi     gdbindex_64 offset;
74*4d9fdb46SRobert Mustacchi     gdbindex_64 length;
75*4d9fdb46SRobert Mustacchi };
76*4d9fdb46SRobert Mustacchi 
77*4d9fdb46SRobert Mustacchi static int
set_base(Dwarf_Debug dbg,struct Dwarf_Gdbindex_array_instance_s * hdr,Dwarf_Small * start,Dwarf_Small * end,Dwarf_Unsigned entrylen,Dwarf_Unsigned fieldlen,enum gdbindex_type_e type,Dwarf_Error * err)78*4d9fdb46SRobert Mustacchi set_base(Dwarf_Debug dbg,
79*4d9fdb46SRobert Mustacchi     struct Dwarf_Gdbindex_array_instance_s * hdr,
80*4d9fdb46SRobert Mustacchi     Dwarf_Small *start,
81*4d9fdb46SRobert Mustacchi     Dwarf_Small *end,
82*4d9fdb46SRobert Mustacchi     /* entrylen is the length of a single struct as seen in the object. */
83*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned entrylen,
84*4d9fdb46SRobert Mustacchi     /* The size of each field in the struct in the object. */
85*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned fieldlen,
86*4d9fdb46SRobert Mustacchi     enum gdbindex_type_e type,
87*4d9fdb46SRobert Mustacchi     Dwarf_Error * err)
88*4d9fdb46SRobert Mustacchi {
89*4d9fdb46SRobert Mustacchi 
90*4d9fdb46SRobert Mustacchi     if (type == git_std || type == git_cuvec) {
91*4d9fdb46SRobert Mustacchi         /*  cuvec is sort of a fake as a simple
92*4d9fdb46SRobert Mustacchi             section, but a useful one. */
93*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned count = 0;
94*4d9fdb46SRobert Mustacchi         if( end < start) {
95*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, err,DW_DLE_GDB_INDEX_COUNT_ERROR);
96*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
97*4d9fdb46SRobert Mustacchi         }
98*4d9fdb46SRobert Mustacchi         count = end - start;
99*4d9fdb46SRobert Mustacchi         count = count / entrylen;
100*4d9fdb46SRobert Mustacchi         hdr->dg_type = type;
101*4d9fdb46SRobert Mustacchi         hdr->dg_base = start;
102*4d9fdb46SRobert Mustacchi         hdr->dg_count = count;
103*4d9fdb46SRobert Mustacchi         hdr->dg_entry_length = entrylen;
104*4d9fdb46SRobert Mustacchi         hdr->dg_fieldlen = fieldlen;
105*4d9fdb46SRobert Mustacchi     } else {
106*4d9fdb46SRobert Mustacchi         /* address area. */
107*4d9fdb46SRobert Mustacchi         /* 64bit, 64bit, offset. Then 32bit pad. */
108*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned count = 0;
109*4d9fdb46SRobert Mustacchi         hdr->dg_base = start;
110*4d9fdb46SRobert Mustacchi         if( end < start) {
111*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, err,DW_DLE_GDB_INDEX_COUNT_ADDR_ERROR);
112*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
113*4d9fdb46SRobert Mustacchi         }
114*4d9fdb46SRobert Mustacchi         /* entry length includes pad. */
115*4d9fdb46SRobert Mustacchi         hdr->dg_entry_length = 2*sizeof(gdbindex_64) +
116*4d9fdb46SRobert Mustacchi             DWARF_32BIT_SIZE;
117*4d9fdb46SRobert Mustacchi         count = end - start;
118*4d9fdb46SRobert Mustacchi         count = count / hdr->dg_entry_length;
119*4d9fdb46SRobert Mustacchi         hdr->dg_count = count;
120*4d9fdb46SRobert Mustacchi         /*  The dg_fieldlen is a fake, the fields are not
121*4d9fdb46SRobert Mustacchi             all the same length. */
122*4d9fdb46SRobert Mustacchi         hdr->dg_fieldlen = DWARF_32BIT_SIZE;
123*4d9fdb46SRobert Mustacchi         hdr->dg_type = type;
124*4d9fdb46SRobert Mustacchi     }
125*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
126*4d9fdb46SRobert Mustacchi }
127*4d9fdb46SRobert Mustacchi 
128*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_header(Dwarf_Debug dbg,Dwarf_Gdbindex * gdbindexptr,Dwarf_Unsigned * version,Dwarf_Unsigned * cu_list_offset,Dwarf_Unsigned * types_cu_list_offset,Dwarf_Unsigned * address_area_offset,Dwarf_Unsigned * symbol_table_offset,Dwarf_Unsigned * constant_pool_offset,Dwarf_Unsigned * section_size,Dwarf_Unsigned * unused_reserved,const char ** section_name,Dwarf_Error * error)129*4d9fdb46SRobert Mustacchi dwarf_gdbindex_header(Dwarf_Debug dbg,
130*4d9fdb46SRobert Mustacchi     Dwarf_Gdbindex * gdbindexptr,
131*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * version,
132*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * cu_list_offset,
133*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * types_cu_list_offset,
134*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * address_area_offset,
135*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * symbol_table_offset,
136*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * constant_pool_offset,
137*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * section_size,
138*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * unused_reserved,
139*4d9fdb46SRobert Mustacchi     const char    ** section_name,
140*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error)
141*4d9fdb46SRobert Mustacchi {
142*4d9fdb46SRobert Mustacchi 
143*4d9fdb46SRobert Mustacchi     struct gi_fileheader_s header;
144*4d9fdb46SRobert Mustacchi     Dwarf_Gdbindex indexptr = 0;
145*4d9fdb46SRobert Mustacchi     int res = DW_DLV_ERROR;
146*4d9fdb46SRobert Mustacchi 
147*4d9fdb46SRobert Mustacchi     if (!dbg->de_debug_gdbindex.dss_size) {
148*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
149*4d9fdb46SRobert Mustacchi     }
150*4d9fdb46SRobert Mustacchi     if (!dbg->de_debug_gdbindex.dss_data) {
151*4d9fdb46SRobert Mustacchi         res = _dwarf_load_section(dbg, &dbg->de_debug_gdbindex,error);
152*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
153*4d9fdb46SRobert Mustacchi             return res;
154*4d9fdb46SRobert Mustacchi         }
155*4d9fdb46SRobert Mustacchi     }
156*4d9fdb46SRobert Mustacchi 
157*4d9fdb46SRobert Mustacchi     if (dbg->de_debug_gdbindex.dss_size <
158*4d9fdb46SRobert Mustacchi         sizeof(struct gi_fileheader_s) ) {
159*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ERRONEOUS_GDB_INDEX_SECTION);
160*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
161*4d9fdb46SRobert Mustacchi     }
162*4d9fdb46SRobert Mustacchi     memcpy(&header,dbg->de_debug_gdbindex.dss_data,
163*4d9fdb46SRobert Mustacchi         sizeof(struct gi_fileheader_s));
164*4d9fdb46SRobert Mustacchi     indexptr = (Dwarf_Gdbindex)_dwarf_get_alloc(dbg,DW_DLA_GDBINDEX,1);
165*4d9fdb46SRobert Mustacchi     if (indexptr == NULL) {
166*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
167*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
168*4d9fdb46SRobert Mustacchi     }
169*4d9fdb46SRobert Mustacchi 
170*4d9fdb46SRobert Mustacchi     indexptr->gi_dbg = dbg;
171*4d9fdb46SRobert Mustacchi     indexptr->gi_section_data = dbg->de_debug_gdbindex.dss_data;
172*4d9fdb46SRobert Mustacchi     indexptr->gi_section_length = dbg->de_debug_gdbindex.dss_size;
173*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(indexptr->gi_version ,Dwarf_Unsigned,
174*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data,
175*4d9fdb46SRobert Mustacchi         DWARF_32BIT_SIZE);
176*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(indexptr->gi_cu_list_offset ,Dwarf_Unsigned,
177*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + DWARF_32BIT_SIZE,
178*4d9fdb46SRobert Mustacchi         DWARF_32BIT_SIZE);
179*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(indexptr->gi_types_cu_list_offset ,Dwarf_Unsigned,
180*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + 2*DWARF_32BIT_SIZE,
181*4d9fdb46SRobert Mustacchi         DWARF_32BIT_SIZE);
182*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(indexptr->gi_address_area_offset ,Dwarf_Unsigned,
183*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + 3*DWARF_32BIT_SIZE,
184*4d9fdb46SRobert Mustacchi         DWARF_32BIT_SIZE);
185*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(indexptr->gi_symbol_table_offset ,Dwarf_Unsigned,
186*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + 4*DWARF_32BIT_SIZE,
187*4d9fdb46SRobert Mustacchi         DWARF_32BIT_SIZE);
188*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(indexptr->gi_constant_pool_offset ,Dwarf_Unsigned,
189*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + 5*DWARF_32BIT_SIZE,
190*4d9fdb46SRobert Mustacchi         DWARF_32BIT_SIZE);
191*4d9fdb46SRobert Mustacchi 
192*4d9fdb46SRobert Mustacchi     res = set_base(dbg,&indexptr->gi_culisthdr,
193*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + indexptr->gi_cu_list_offset,
194*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + indexptr->gi_types_cu_list_offset,
195*4d9fdb46SRobert Mustacchi         2*sizeof(gdbindex_64),
196*4d9fdb46SRobert Mustacchi         sizeof(gdbindex_64),
197*4d9fdb46SRobert Mustacchi         git_std,error);
198*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_ERROR) {
199*4d9fdb46SRobert Mustacchi         return res;
200*4d9fdb46SRobert Mustacchi     }
201*4d9fdb46SRobert Mustacchi     res = set_base(dbg,&indexptr->gi_typesculisthdr,
202*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + indexptr->gi_types_cu_list_offset,
203*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + indexptr->gi_address_area_offset,
204*4d9fdb46SRobert Mustacchi         3*sizeof(gdbindex_64),
205*4d9fdb46SRobert Mustacchi         sizeof(gdbindex_64),
206*4d9fdb46SRobert Mustacchi         git_std,error);
207*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_ERROR) {
208*4d9fdb46SRobert Mustacchi         return res;
209*4d9fdb46SRobert Mustacchi     }
210*4d9fdb46SRobert Mustacchi     res = set_base(dbg,&indexptr->gi_addressareahdr,
211*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + indexptr->gi_address_area_offset,
212*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + indexptr->gi_symbol_table_offset,
213*4d9fdb46SRobert Mustacchi         3*sizeof(gdbindex_64),
214*4d9fdb46SRobert Mustacchi         sizeof(gdbindex_64),
215*4d9fdb46SRobert Mustacchi         git_address,error);
216*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_ERROR) {
217*4d9fdb46SRobert Mustacchi         return res;
218*4d9fdb46SRobert Mustacchi     }
219*4d9fdb46SRobert Mustacchi     res = set_base(dbg,&indexptr->gi_symboltablehdr,
220*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + indexptr->gi_symbol_table_offset,
221*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + indexptr->gi_constant_pool_offset,
222*4d9fdb46SRobert Mustacchi         2*DWARF_32BIT_SIZE,
223*4d9fdb46SRobert Mustacchi         DWARF_32BIT_SIZE,
224*4d9fdb46SRobert Mustacchi         git_std,error);
225*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_ERROR) {
226*4d9fdb46SRobert Mustacchi         return res;
227*4d9fdb46SRobert Mustacchi     }
228*4d9fdb46SRobert Mustacchi     res = set_base(dbg,&indexptr->gi_cuvectorhdr,
229*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + indexptr->gi_constant_pool_offset,
230*4d9fdb46SRobert Mustacchi         /*  There is no real single vector size.
231*4d9fdb46SRobert Mustacchi             but we'll use the entire rest as if there was. */
232*4d9fdb46SRobert Mustacchi         dbg->de_debug_gdbindex.dss_data + indexptr->gi_section_length,
233*4d9fdb46SRobert Mustacchi         DWARF_32BIT_SIZE,
234*4d9fdb46SRobert Mustacchi         DWARF_32BIT_SIZE,
235*4d9fdb46SRobert Mustacchi         git_cuvec,error);
236*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_ERROR) {
237*4d9fdb46SRobert Mustacchi         return res;
238*4d9fdb46SRobert Mustacchi     }
239*4d9fdb46SRobert Mustacchi 
240*4d9fdb46SRobert Mustacchi     /* Really just pointing to constant pool area. */
241*4d9fdb46SRobert Mustacchi     indexptr->gi_string_pool = dbg->de_debug_gdbindex.dss_data +
242*4d9fdb46SRobert Mustacchi         indexptr->gi_constant_pool_offset;
243*4d9fdb46SRobert Mustacchi     *gdbindexptr          = indexptr;
244*4d9fdb46SRobert Mustacchi     *version              = indexptr->gi_version;
245*4d9fdb46SRobert Mustacchi     *cu_list_offset       = indexptr->gi_cu_list_offset;
246*4d9fdb46SRobert Mustacchi     *types_cu_list_offset = indexptr->gi_types_cu_list_offset;
247*4d9fdb46SRobert Mustacchi     *address_area_offset  = indexptr->gi_address_area_offset;
248*4d9fdb46SRobert Mustacchi     *symbol_table_offset  = indexptr->gi_symbol_table_offset;
249*4d9fdb46SRobert Mustacchi     *constant_pool_offset = indexptr->gi_constant_pool_offset;
250*4d9fdb46SRobert Mustacchi     *section_size         = indexptr->gi_section_length;
251*4d9fdb46SRobert Mustacchi     *unused_reserved = 0;
252*4d9fdb46SRobert Mustacchi     *section_name  =        dbg->de_debug_gdbindex.dss_name;
253*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
254*4d9fdb46SRobert Mustacchi 
255*4d9fdb46SRobert Mustacchi 
256*4d9fdb46SRobert Mustacchi }
257*4d9fdb46SRobert Mustacchi 
258*4d9fdb46SRobert Mustacchi 
259*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_culist_array(Dwarf_Gdbindex gdbindexptr,Dwarf_Unsigned * list_length,UNUSEDARG Dwarf_Error * error)260*4d9fdb46SRobert Mustacchi dwarf_gdbindex_culist_array(Dwarf_Gdbindex gdbindexptr,
261*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned       * list_length,
262*4d9fdb46SRobert Mustacchi     UNUSEDARG Dwarf_Error          * error)
263*4d9fdb46SRobert Mustacchi {
264*4d9fdb46SRobert Mustacchi     *list_length = gdbindexptr->gi_culisthdr.dg_count;
265*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
266*4d9fdb46SRobert Mustacchi }
267*4d9fdb46SRobert Mustacchi 
268*4d9fdb46SRobert Mustacchi /*  entryindex: 0 to list_length-1 */
269*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_culist_entry(Dwarf_Gdbindex gdbindexptr,Dwarf_Unsigned entryindex,Dwarf_Unsigned * cu_offset,Dwarf_Unsigned * cu_length,Dwarf_Error * error)270*4d9fdb46SRobert Mustacchi dwarf_gdbindex_culist_entry(Dwarf_Gdbindex gdbindexptr,
271*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   entryindex,
272*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * cu_offset,
273*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * cu_length,
274*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error)
275*4d9fdb46SRobert Mustacchi {
276*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned max =  gdbindexptr->gi_culisthdr.dg_count;
277*4d9fdb46SRobert Mustacchi     Dwarf_Small * base = 0;
278*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset = 0;
279*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned length = 0;
280*4d9fdb46SRobert Mustacchi     unsigned fieldlen = gdbindexptr->gi_culisthdr.dg_fieldlen;
281*4d9fdb46SRobert Mustacchi 
282*4d9fdb46SRobert Mustacchi     if (entryindex >= max) {
283*4d9fdb46SRobert Mustacchi         _dwarf_error(gdbindexptr->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
284*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
285*4d9fdb46SRobert Mustacchi     }
286*4d9fdb46SRobert Mustacchi     base = gdbindexptr->gi_culisthdr.dg_base;
287*4d9fdb46SRobert Mustacchi     base += entryindex*gdbindexptr->gi_culisthdr.dg_entry_length;
288*4d9fdb46SRobert Mustacchi 
289*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(offset ,Dwarf_Unsigned,
290*4d9fdb46SRobert Mustacchi         base,
291*4d9fdb46SRobert Mustacchi         fieldlen);
292*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(length ,Dwarf_Unsigned,
293*4d9fdb46SRobert Mustacchi         base+ fieldlen,
294*4d9fdb46SRobert Mustacchi         fieldlen);
295*4d9fdb46SRobert Mustacchi     *cu_offset = offset;
296*4d9fdb46SRobert Mustacchi     *cu_length = length;
297*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
298*4d9fdb46SRobert Mustacchi }
299*4d9fdb46SRobert Mustacchi 
300*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_types_culist_array(Dwarf_Gdbindex gdbindexptr,Dwarf_Unsigned * list_length,UNUSEDARG Dwarf_Error * error)301*4d9fdb46SRobert Mustacchi dwarf_gdbindex_types_culist_array(Dwarf_Gdbindex gdbindexptr,
302*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned       * list_length,
303*4d9fdb46SRobert Mustacchi     UNUSEDARG Dwarf_Error          * error)
304*4d9fdb46SRobert Mustacchi {
305*4d9fdb46SRobert Mustacchi     *list_length = gdbindexptr->gi_typesculisthdr.dg_count;
306*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
307*4d9fdb46SRobert Mustacchi }
308*4d9fdb46SRobert Mustacchi 
309*4d9fdb46SRobert Mustacchi /*  entryindex: 0 to list_length-1 */
310*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_types_culist_entry(Dwarf_Gdbindex gdbindexptr,Dwarf_Unsigned entryindex,Dwarf_Unsigned * t_offset,Dwarf_Unsigned * t_length,Dwarf_Unsigned * t_signature,Dwarf_Error * error)311*4d9fdb46SRobert Mustacchi dwarf_gdbindex_types_culist_entry(Dwarf_Gdbindex gdbindexptr,
312*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   entryindex,
313*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * t_offset,
314*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * t_length,
315*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * t_signature,
316*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error)
317*4d9fdb46SRobert Mustacchi {
318*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned max =  gdbindexptr->gi_typesculisthdr.dg_count;
319*4d9fdb46SRobert Mustacchi     Dwarf_Small * base = 0;
320*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset = 0;
321*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned length = 0;
322*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned signature = 0;
323*4d9fdb46SRobert Mustacchi     unsigned fieldlen = gdbindexptr->gi_typesculisthdr.dg_fieldlen;
324*4d9fdb46SRobert Mustacchi 
325*4d9fdb46SRobert Mustacchi     if (entryindex >= max) {
326*4d9fdb46SRobert Mustacchi         _dwarf_error(gdbindexptr->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
327*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
328*4d9fdb46SRobert Mustacchi     }
329*4d9fdb46SRobert Mustacchi     base = gdbindexptr->gi_typesculisthdr.dg_base;
330*4d9fdb46SRobert Mustacchi     base += entryindex*gdbindexptr->gi_typesculisthdr.dg_entry_length;
331*4d9fdb46SRobert Mustacchi 
332*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(offset ,Dwarf_Unsigned,
333*4d9fdb46SRobert Mustacchi         base,
334*4d9fdb46SRobert Mustacchi         fieldlen);
335*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(length ,Dwarf_Unsigned,
336*4d9fdb46SRobert Mustacchi         base+ (1*fieldlen),
337*4d9fdb46SRobert Mustacchi         fieldlen);
338*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(signature ,Dwarf_Unsigned,
339*4d9fdb46SRobert Mustacchi         base+ (2*fieldlen),
340*4d9fdb46SRobert Mustacchi         fieldlen);
341*4d9fdb46SRobert Mustacchi     *t_offset = offset;
342*4d9fdb46SRobert Mustacchi     *t_length = length;
343*4d9fdb46SRobert Mustacchi     *t_signature = signature;
344*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
345*4d9fdb46SRobert Mustacchi }
346*4d9fdb46SRobert Mustacchi 
347*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_addressarea(Dwarf_Gdbindex gdbindexptr,Dwarf_Unsigned * list_length,UNUSEDARG Dwarf_Error * error)348*4d9fdb46SRobert Mustacchi dwarf_gdbindex_addressarea(Dwarf_Gdbindex gdbindexptr,
349*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned            * list_length,
350*4d9fdb46SRobert Mustacchi     UNUSEDARG Dwarf_Error               * error)
351*4d9fdb46SRobert Mustacchi {
352*4d9fdb46SRobert Mustacchi     *list_length = gdbindexptr->gi_addressareahdr.dg_count;
353*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
354*4d9fdb46SRobert Mustacchi }
355*4d9fdb46SRobert Mustacchi 
356*4d9fdb46SRobert Mustacchi /*    entryindex: 0 to addressarea_list_length-1 */
357*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_addressarea_entry(Dwarf_Gdbindex gdbindexptr,Dwarf_Unsigned entryindex,Dwarf_Unsigned * low_address,Dwarf_Unsigned * high_address,Dwarf_Unsigned * cu_index,Dwarf_Error * error)358*4d9fdb46SRobert Mustacchi dwarf_gdbindex_addressarea_entry(
359*4d9fdb46SRobert Mustacchi     Dwarf_Gdbindex   gdbindexptr,
360*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   entryindex,
361*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * low_address,
362*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * high_address,
363*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * cu_index,
364*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error)
365*4d9fdb46SRobert Mustacchi {
366*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned max =  gdbindexptr->gi_addressareahdr.dg_count;
367*4d9fdb46SRobert Mustacchi     Dwarf_Small * base = 0;
368*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lowaddr = 0;
369*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned highaddr = 0;
370*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cuindex = 0;
371*4d9fdb46SRobert Mustacchi 
372*4d9fdb46SRobert Mustacchi     if (entryindex >= max) {
373*4d9fdb46SRobert Mustacchi         _dwarf_error(gdbindexptr->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
374*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
375*4d9fdb46SRobert Mustacchi     }
376*4d9fdb46SRobert Mustacchi     base = gdbindexptr->gi_addressareahdr.dg_base;
377*4d9fdb46SRobert Mustacchi     base += entryindex*gdbindexptr->gi_addressareahdr.dg_entry_length;
378*4d9fdb46SRobert Mustacchi 
379*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(lowaddr ,Dwarf_Unsigned,
380*4d9fdb46SRobert Mustacchi         base,
381*4d9fdb46SRobert Mustacchi         sizeof(gdbindex_64));
382*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(highaddr ,Dwarf_Unsigned,
383*4d9fdb46SRobert Mustacchi         base+ (1*sizeof(gdbindex_64)),
384*4d9fdb46SRobert Mustacchi         sizeof(gdbindex_64));
385*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(cuindex ,Dwarf_Unsigned,
386*4d9fdb46SRobert Mustacchi         base+ (2*sizeof(gdbindex_64)),
387*4d9fdb46SRobert Mustacchi         DWARF_32BIT_SIZE);
388*4d9fdb46SRobert Mustacchi     *low_address = lowaddr;
389*4d9fdb46SRobert Mustacchi     *high_address = highaddr;
390*4d9fdb46SRobert Mustacchi     *cu_index = cuindex;
391*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
392*4d9fdb46SRobert Mustacchi }
393*4d9fdb46SRobert Mustacchi 
394*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_symboltable_array(Dwarf_Gdbindex gdbindexptr,Dwarf_Unsigned * list_length,UNUSEDARG Dwarf_Error * error)395*4d9fdb46SRobert Mustacchi dwarf_gdbindex_symboltable_array(Dwarf_Gdbindex gdbindexptr,
396*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned            * list_length,
397*4d9fdb46SRobert Mustacchi     UNUSEDARG Dwarf_Error               * error)
398*4d9fdb46SRobert Mustacchi {
399*4d9fdb46SRobert Mustacchi     *list_length = gdbindexptr->gi_symboltablehdr.dg_count;
400*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
401*4d9fdb46SRobert Mustacchi }
402*4d9fdb46SRobert Mustacchi 
403*4d9fdb46SRobert Mustacchi /*  entryindex: 0 to symtab_list_length-1 */
404*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_symboltable_entry(Dwarf_Gdbindex gdbindexptr,Dwarf_Unsigned entryindex,Dwarf_Unsigned * string_offset,Dwarf_Unsigned * cu_vector_offset,Dwarf_Error * error)405*4d9fdb46SRobert Mustacchi dwarf_gdbindex_symboltable_entry(
406*4d9fdb46SRobert Mustacchi     Dwarf_Gdbindex   gdbindexptr,
407*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   entryindex,
408*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * string_offset,
409*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * cu_vector_offset,
410*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error)
411*4d9fdb46SRobert Mustacchi {
412*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned max =  gdbindexptr->gi_symboltablehdr.dg_count;
413*4d9fdb46SRobert Mustacchi     Dwarf_Small * base = 0;
414*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned symoffset = 0;
415*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cuoffset = 0;
416*4d9fdb46SRobert Mustacchi     unsigned fieldlen = gdbindexptr->gi_symboltablehdr.dg_fieldlen;
417*4d9fdb46SRobert Mustacchi 
418*4d9fdb46SRobert Mustacchi     if (entryindex >= max) {
419*4d9fdb46SRobert Mustacchi         _dwarf_error(gdbindexptr->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
420*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
421*4d9fdb46SRobert Mustacchi     }
422*4d9fdb46SRobert Mustacchi     base = gdbindexptr->gi_symboltablehdr.dg_base;
423*4d9fdb46SRobert Mustacchi     base += entryindex*gdbindexptr->gi_symboltablehdr.dg_entry_length;
424*4d9fdb46SRobert Mustacchi 
425*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(symoffset ,Dwarf_Unsigned,
426*4d9fdb46SRobert Mustacchi         base,
427*4d9fdb46SRobert Mustacchi         fieldlen);
428*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(cuoffset ,Dwarf_Unsigned,
429*4d9fdb46SRobert Mustacchi         base + fieldlen,
430*4d9fdb46SRobert Mustacchi         fieldlen);
431*4d9fdb46SRobert Mustacchi     *string_offset = symoffset;
432*4d9fdb46SRobert Mustacchi     *cu_vector_offset = cuoffset;
433*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
434*4d9fdb46SRobert Mustacchi }
435*4d9fdb46SRobert Mustacchi 
436*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_cuvector_length(Dwarf_Gdbindex gdbindex,Dwarf_Unsigned cuvector_offset,Dwarf_Unsigned * innercount,Dwarf_Error * error)437*4d9fdb46SRobert Mustacchi dwarf_gdbindex_cuvector_length(Dwarf_Gdbindex gdbindex,
438*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   cuvector_offset,
439*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * innercount,
440*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error)
441*4d9fdb46SRobert Mustacchi {
442*4d9fdb46SRobert Mustacchi     Dwarf_Small *base = gdbindex->gi_cuvectorhdr.dg_base;
443*4d9fdb46SRobert Mustacchi     Dwarf_Small *end = gdbindex->gi_section_data + gdbindex->gi_section_length;
444*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned val = 0;
445*4d9fdb46SRobert Mustacchi     unsigned fieldlen =  gdbindex->gi_cuvectorhdr.dg_entry_length;
446*4d9fdb46SRobert Mustacchi 
447*4d9fdb46SRobert Mustacchi     base += cuvector_offset;
448*4d9fdb46SRobert Mustacchi     if ((base + fieldlen) >= end) {
449*4d9fdb46SRobert Mustacchi         _dwarf_error(gdbindex->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
450*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
451*4d9fdb46SRobert Mustacchi     }
452*4d9fdb46SRobert Mustacchi 
453*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(val,Dwarf_Unsigned,
454*4d9fdb46SRobert Mustacchi         base,
455*4d9fdb46SRobert Mustacchi         fieldlen);
456*4d9fdb46SRobert Mustacchi     *innercount = val;
457*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
458*4d9fdb46SRobert Mustacchi }
459*4d9fdb46SRobert Mustacchi 
460*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_cuvector_inner_attributes(Dwarf_Gdbindex gdbindexptr,Dwarf_Unsigned cuvector_offset,Dwarf_Unsigned innerindex,Dwarf_Unsigned * attributes,Dwarf_Error * error)461*4d9fdb46SRobert Mustacchi dwarf_gdbindex_cuvector_inner_attributes(Dwarf_Gdbindex gdbindexptr,
462*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   cuvector_offset,
463*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   innerindex,
464*4d9fdb46SRobert Mustacchi     /* The attr_value is a field of bits. For expanded version
465*4d9fdb46SRobert Mustacchi         use  dwarf_gdbindex_instance_expand_value() */
466*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * attributes,
467*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error)
468*4d9fdb46SRobert Mustacchi {
469*4d9fdb46SRobert Mustacchi     Dwarf_Small *base = gdbindexptr->gi_cuvectorhdr.dg_base;
470*4d9fdb46SRobert Mustacchi     Dwarf_Small *end = gdbindexptr->gi_section_data +
471*4d9fdb46SRobert Mustacchi         gdbindexptr->gi_section_length;
472*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned val = 0;
473*4d9fdb46SRobert Mustacchi     unsigned fieldlen = gdbindexptr->gi_cuvectorhdr.dg_entry_length;
474*4d9fdb46SRobert Mustacchi 
475*4d9fdb46SRobert Mustacchi     base += cuvector_offset;
476*4d9fdb46SRobert Mustacchi     if ((base+fieldlen) >= end) {
477*4d9fdb46SRobert Mustacchi         _dwarf_error(gdbindexptr->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
478*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
479*4d9fdb46SRobert Mustacchi     }
480*4d9fdb46SRobert Mustacchi     base += fieldlen;
481*4d9fdb46SRobert Mustacchi     base += innerindex*fieldlen;
482*4d9fdb46SRobert Mustacchi 
483*4d9fdb46SRobert Mustacchi     READ_GDBINDEX(val ,Dwarf_Unsigned,
484*4d9fdb46SRobert Mustacchi         base,
485*4d9fdb46SRobert Mustacchi         fieldlen);
486*4d9fdb46SRobert Mustacchi     *attributes = val;
487*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
488*4d9fdb46SRobert Mustacchi }
489*4d9fdb46SRobert Mustacchi 
490*4d9fdb46SRobert Mustacchi 
491*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_cuvector_instance_expand_value(UNUSEDARG Dwarf_Gdbindex gdbindexptr,Dwarf_Unsigned value,Dwarf_Unsigned * cu_index,Dwarf_Unsigned * reserved1,Dwarf_Unsigned * symbol_kind,Dwarf_Unsigned * is_static,UNUSEDARG Dwarf_Error * error)492*4d9fdb46SRobert Mustacchi dwarf_gdbindex_cuvector_instance_expand_value(
493*4d9fdb46SRobert Mustacchi     UNUSEDARG Dwarf_Gdbindex gdbindexptr,
494*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   value,
495*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * cu_index,
496*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * reserved1,
497*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * symbol_kind,
498*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * is_static,
499*4d9fdb46SRobert Mustacchi     UNUSEDARG Dwarf_Error    * error)
500*4d9fdb46SRobert Mustacchi {
501*4d9fdb46SRobert Mustacchi     *cu_index =    value         & 0xffffff;
502*4d9fdb46SRobert Mustacchi     *reserved1 =   (value >> 24) & 0xf;
503*4d9fdb46SRobert Mustacchi     *symbol_kind = (value >> 28) & 0x7;
504*4d9fdb46SRobert Mustacchi     *is_static =   (value >> 31) & 1;
505*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
506*4d9fdb46SRobert Mustacchi }
507*4d9fdb46SRobert Mustacchi 
508*4d9fdb46SRobert Mustacchi 
509*4d9fdb46SRobert Mustacchi /*  The strings in the pool follow (in memory) the cu index
510*4d9fdb46SRobert Mustacchi     set and are NUL terminated. */
511*4d9fdb46SRobert Mustacchi int
dwarf_gdbindex_string_by_offset(Dwarf_Gdbindex gdbindexptr,Dwarf_Unsigned stringoffsetinpool,const char ** string_ptr,UNUSEDARG Dwarf_Error * error)512*4d9fdb46SRobert Mustacchi dwarf_gdbindex_string_by_offset(Dwarf_Gdbindex gdbindexptr,
513*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   stringoffsetinpool,
514*4d9fdb46SRobert Mustacchi     const char    ** string_ptr,
515*4d9fdb46SRobert Mustacchi     UNUSEDARG Dwarf_Error   *  error)
516*4d9fdb46SRobert Mustacchi {
517*4d9fdb46SRobert Mustacchi     Dwarf_Small *pooldata = 0;
518*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_end = 0;
519*4d9fdb46SRobert Mustacchi     Dwarf_Small *stringitself = 0;
520*4d9fdb46SRobert Mustacchi 
521*4d9fdb46SRobert Mustacchi     /*  If gdbindexptr NULL or gdbindexptr->gi_dbg is NULL
522*4d9fdb46SRobert Mustacchi         this is not going to go very well. Ugh. FIXME */
523*4d9fdb46SRobert Mustacchi     pooldata = gdbindexptr->gi_section_data +
524*4d9fdb46SRobert Mustacchi         gdbindexptr->gi_constant_pool_offset;
525*4d9fdb46SRobert Mustacchi     section_end = gdbindexptr->gi_section_data +
526*4d9fdb46SRobert Mustacchi         gdbindexptr->gi_section_length;
527*4d9fdb46SRobert Mustacchi     stringitself = pooldata + stringoffsetinpool;
528*4d9fdb46SRobert Mustacchi     if (stringitself > section_end) {
529*4d9fdb46SRobert Mustacchi         _dwarf_error(gdbindexptr->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
530*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
531*4d9fdb46SRobert Mustacchi     }
532*4d9fdb46SRobert Mustacchi     *string_ptr = (const char *)stringitself;
533*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
534*4d9fdb46SRobert Mustacchi }
535*4d9fdb46SRobert Mustacchi 
536*4d9fdb46SRobert Mustacchi 
537*4d9fdb46SRobert Mustacchi 
538*4d9fdb46SRobert Mustacchi 
539*4d9fdb46SRobert Mustacchi void
dwarf_gdbindex_free(Dwarf_Gdbindex indexptr)540*4d9fdb46SRobert Mustacchi dwarf_gdbindex_free(Dwarf_Gdbindex indexptr)
541*4d9fdb46SRobert Mustacchi {
542*4d9fdb46SRobert Mustacchi     if(indexptr) {
543*4d9fdb46SRobert Mustacchi         Dwarf_Debug dbg = indexptr->gi_dbg;
544*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg,indexptr,DW_DLA_GDBINDEX);
545*4d9fdb46SRobert Mustacchi     }
546*4d9fdb46SRobert Mustacchi }
547