xref: /titanic_50/usr/src/lib/libdwarf/common/dwarf_macro.c (revision f3e7f55e73a39377d55a030f124cc86b3b66a9cc)
1*f3e7f55eSRobert Mustacchi /*
2*f3e7f55eSRobert Mustacchi 
3*f3e7f55eSRobert Mustacchi   Copyright (C) 2000-2004 Silicon Graphics, Inc.  All Rights Reserved.
4*f3e7f55eSRobert Mustacchi   Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved.
5*f3e7f55eSRobert Mustacchi 
6*f3e7f55eSRobert Mustacchi   This program is free software; you can redistribute it and/or modify it
7*f3e7f55eSRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
8*f3e7f55eSRobert Mustacchi   as published by the Free Software Foundation.
9*f3e7f55eSRobert Mustacchi 
10*f3e7f55eSRobert Mustacchi   This program is distributed in the hope that it would be useful, but
11*f3e7f55eSRobert Mustacchi   WITHOUT ANY WARRANTY; without even the implied warranty of
12*f3e7f55eSRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13*f3e7f55eSRobert Mustacchi 
14*f3e7f55eSRobert Mustacchi   Further, this software is distributed without any warranty that it is
15*f3e7f55eSRobert Mustacchi   free of the rightful claim of any third person regarding infringement
16*f3e7f55eSRobert Mustacchi   or the like.  Any license provided herein, whether implied or
17*f3e7f55eSRobert Mustacchi   otherwise, applies only to this software file.  Patent licenses, if
18*f3e7f55eSRobert Mustacchi   any, provided herein do not apply to combinations of this program with
19*f3e7f55eSRobert Mustacchi   other software, or any other product whatsoever.
20*f3e7f55eSRobert Mustacchi 
21*f3e7f55eSRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
22*f3e7f55eSRobert Mustacchi   License along with this program; if not, write the Free Software
23*f3e7f55eSRobert Mustacchi   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
24*f3e7f55eSRobert Mustacchi   USA.
25*f3e7f55eSRobert Mustacchi 
26*f3e7f55eSRobert Mustacchi   Contact information:  Silicon Graphics, Inc., 1500 Crittenden Lane,
27*f3e7f55eSRobert Mustacchi   Mountain View, CA 94043, or:
28*f3e7f55eSRobert Mustacchi 
29*f3e7f55eSRobert Mustacchi   http://www.sgi.com
30*f3e7f55eSRobert Mustacchi 
31*f3e7f55eSRobert Mustacchi   For further information regarding this notice, see:
32*f3e7f55eSRobert Mustacchi 
33*f3e7f55eSRobert Mustacchi   http://oss.sgi.com/projects/GenInfo/NoticeExplan
34*f3e7f55eSRobert Mustacchi 
35*f3e7f55eSRobert Mustacchi */
36*f3e7f55eSRobert Mustacchi /* The address of the Free Software Foundation is
37*f3e7f55eSRobert Mustacchi    Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
38*f3e7f55eSRobert Mustacchi    Boston, MA 02110-1301, USA.
39*f3e7f55eSRobert Mustacchi    SGI has moved from the Crittenden Lane address.
40*f3e7f55eSRobert Mustacchi */
41*f3e7f55eSRobert Mustacchi 
42*f3e7f55eSRobert Mustacchi 
43*f3e7f55eSRobert Mustacchi 
44*f3e7f55eSRobert Mustacchi 
45*f3e7f55eSRobert Mustacchi #include "config.h"
46*f3e7f55eSRobert Mustacchi #include "dwarf_incl.h"
47*f3e7f55eSRobert Mustacchi #include <stdio.h>
48*f3e7f55eSRobert Mustacchi #include <limits.h>
49*f3e7f55eSRobert Mustacchi #ifdef HAVE_STDLIB_H
50*f3e7f55eSRobert Mustacchi #include <stdlib.h>
51*f3e7f55eSRobert Mustacchi #endif /* HAVE_STDLIB_H */
52*f3e7f55eSRobert Mustacchi #include "dwarf_macro.h"
53*f3e7f55eSRobert Mustacchi 
54*f3e7f55eSRobert Mustacchi 
55*f3e7f55eSRobert Mustacchi #define LEFTPAREN '('
56*f3e7f55eSRobert Mustacchi #define RIGHTPAREN ')'
57*f3e7f55eSRobert Mustacchi #define SPACE ' '
58*f3e7f55eSRobert Mustacchi 
59*f3e7f55eSRobert Mustacchi /*
60*f3e7f55eSRobert Mustacchi         Given the dwarf macro string, return a pointer to
61*f3e7f55eSRobert Mustacchi         the value.  Returns pointer to 0 byte at end of string
62*f3e7f55eSRobert Mustacchi         if no value found (meaning the value is the empty string).
63*f3e7f55eSRobert Mustacchi 
64*f3e7f55eSRobert Mustacchi         Only understands well-formed dwarf macinfo strings.
65*f3e7f55eSRobert Mustacchi */
66*f3e7f55eSRobert Mustacchi char *
dwarf_find_macro_value_start(char * str)67*f3e7f55eSRobert Mustacchi dwarf_find_macro_value_start(char *str)
68*f3e7f55eSRobert Mustacchi {
69*f3e7f55eSRobert Mustacchi     char *lcp;
70*f3e7f55eSRobert Mustacchi     int funclike = 0;
71*f3e7f55eSRobert Mustacchi 
72*f3e7f55eSRobert Mustacchi     for (lcp = str; *lcp; ++lcp) {
73*f3e7f55eSRobert Mustacchi         switch (*lcp) {
74*f3e7f55eSRobert Mustacchi         case LEFTPAREN:
75*f3e7f55eSRobert Mustacchi             funclike = 1;
76*f3e7f55eSRobert Mustacchi             break;
77*f3e7f55eSRobert Mustacchi         case RIGHTPAREN:
78*f3e7f55eSRobert Mustacchi             /* lcp+1 must be a space, and following char is the value */
79*f3e7f55eSRobert Mustacchi             return lcp + 2;
80*f3e7f55eSRobert Mustacchi         case SPACE:
81*f3e7f55eSRobert Mustacchi             /* we allow extraneous spaces inside macro parameter **
82*f3e7f55eSRobert Mustacchi                list, just in case... This is not really needed. */
83*f3e7f55eSRobert Mustacchi             if (!funclike) {
84*f3e7f55eSRobert Mustacchi                 return lcp + 1;
85*f3e7f55eSRobert Mustacchi             }
86*f3e7f55eSRobert Mustacchi             break;
87*f3e7f55eSRobert Mustacchi         }
88*f3e7f55eSRobert Mustacchi     }
89*f3e7f55eSRobert Mustacchi     /* never found value: returns pointer to the 0 byte at end of
90*f3e7f55eSRobert Mustacchi        string */
91*f3e7f55eSRobert Mustacchi     return lcp;
92*f3e7f55eSRobert Mustacchi 
93*f3e7f55eSRobert Mustacchi }
94*f3e7f55eSRobert Mustacchi 
95*f3e7f55eSRobert Mustacchi 
96*f3e7f55eSRobert Mustacchi /*
97*f3e7f55eSRobert Mustacchi    Try to keep fileindex correct in every Macro_Details
98*f3e7f55eSRobert Mustacchi    record by tracking file starts and ends.
99*f3e7f55eSRobert Mustacchi    Uses high water mark: space reused, not freed.
100*f3e7f55eSRobert Mustacchi    Presumption is that this makes sense for most uses.
101*f3e7f55eSRobert Mustacchi    STARTERMAX is set so that the array need not be expanded for
102*f3e7f55eSRobert Mustacchi    most files: it is the initial include file depth.
103*f3e7f55eSRobert Mustacchi */
104*f3e7f55eSRobert Mustacchi struct macro_stack_s {
105*f3e7f55eSRobert Mustacchi     Dwarf_Signed *st_base;
106*f3e7f55eSRobert Mustacchi     long max;
107*f3e7f55eSRobert Mustacchi     long next_to_use;
108*f3e7f55eSRobert Mustacchi     int was_fault;
109*f3e7f55eSRobert Mustacchi };
110*f3e7f55eSRobert Mustacchi 
111*f3e7f55eSRobert Mustacchi static void _dwarf_reset_index_macro_stack(struct macro_stack_s *ms);
112*f3e7f55eSRobert Mustacchi static void
free_macro_stack(Dwarf_Debug dbg,struct macro_stack_s * ms)113*f3e7f55eSRobert Mustacchi free_macro_stack(Dwarf_Debug dbg, struct macro_stack_s *ms)
114*f3e7f55eSRobert Mustacchi {
115*f3e7f55eSRobert Mustacchi     dwarf_dealloc(dbg,ms->st_base,DW_DLA_STRING);
116*f3e7f55eSRobert Mustacchi     _dwarf_reset_index_macro_stack(ms);
117*f3e7f55eSRobert Mustacchi }
118*f3e7f55eSRobert Mustacchi 
119*f3e7f55eSRobert Mustacchi #define STARTERMAX 10
120*f3e7f55eSRobert Mustacchi static void
_dwarf_reset_index_macro_stack(struct macro_stack_s * ms)121*f3e7f55eSRobert Mustacchi _dwarf_reset_index_macro_stack(struct macro_stack_s *ms)
122*f3e7f55eSRobert Mustacchi {
123*f3e7f55eSRobert Mustacchi     ms->st_base = 0;
124*f3e7f55eSRobert Mustacchi     ms->max = 0;
125*f3e7f55eSRobert Mustacchi     ms->next_to_use = 0;
126*f3e7f55eSRobert Mustacchi     ms->was_fault = 0;
127*f3e7f55eSRobert Mustacchi }
128*f3e7f55eSRobert Mustacchi static int
_dwarf_macro_stack_push_index(Dwarf_Debug dbg,Dwarf_Signed indx,struct macro_stack_s * ms)129*f3e7f55eSRobert Mustacchi _dwarf_macro_stack_push_index(Dwarf_Debug dbg, Dwarf_Signed indx,
130*f3e7f55eSRobert Mustacchi     struct macro_stack_s *ms)
131*f3e7f55eSRobert Mustacchi {
132*f3e7f55eSRobert Mustacchi     Dwarf_Signed *newbase;
133*f3e7f55eSRobert Mustacchi 
134*f3e7f55eSRobert Mustacchi     if (ms->next_to_use >= ms->max) {
135*f3e7f55eSRobert Mustacchi         long new_size;
136*f3e7f55eSRobert Mustacchi 
137*f3e7f55eSRobert Mustacchi         if (ms->max == 0) {
138*f3e7f55eSRobert Mustacchi             ms->max = STARTERMAX;
139*f3e7f55eSRobert Mustacchi         }
140*f3e7f55eSRobert Mustacchi         new_size = ms->max * 2;
141*f3e7f55eSRobert Mustacchi         newbase =
142*f3e7f55eSRobert Mustacchi             _dwarf_get_alloc(dbg, DW_DLA_STRING,
143*f3e7f55eSRobert Mustacchi                              new_size * sizeof(Dwarf_Signed));
144*f3e7f55eSRobert Mustacchi         if (newbase == 0) {
145*f3e7f55eSRobert Mustacchi             /* just leave the old array in place */
146*f3e7f55eSRobert Mustacchi             ms->was_fault = 1;
147*f3e7f55eSRobert Mustacchi             return DW_DLV_ERROR;
148*f3e7f55eSRobert Mustacchi         }
149*f3e7f55eSRobert Mustacchi         if(ms->st_base) {
150*f3e7f55eSRobert Mustacchi             memcpy(newbase, ms->st_base,
151*f3e7f55eSRobert Mustacchi                ms->next_to_use * sizeof(Dwarf_Signed));
152*f3e7f55eSRobert Mustacchi             dwarf_dealloc(dbg, ms->st_base, DW_DLA_STRING);
153*f3e7f55eSRobert Mustacchi         }
154*f3e7f55eSRobert Mustacchi         ms->st_base = newbase;
155*f3e7f55eSRobert Mustacchi         ms->max = new_size;
156*f3e7f55eSRobert Mustacchi     }
157*f3e7f55eSRobert Mustacchi     ms->st_base[ms->next_to_use] = indx;
158*f3e7f55eSRobert Mustacchi     ++ms->next_to_use;
159*f3e7f55eSRobert Mustacchi     return DW_DLV_OK;
160*f3e7f55eSRobert Mustacchi }
161*f3e7f55eSRobert Mustacchi 
162*f3e7f55eSRobert Mustacchi static Dwarf_Signed
_dwarf_macro_stack_pop_index(struct macro_stack_s * ms)163*f3e7f55eSRobert Mustacchi _dwarf_macro_stack_pop_index(struct macro_stack_s *ms)
164*f3e7f55eSRobert Mustacchi {
165*f3e7f55eSRobert Mustacchi     if (ms->was_fault) {
166*f3e7f55eSRobert Mustacchi         return -1;
167*f3e7f55eSRobert Mustacchi     }
168*f3e7f55eSRobert Mustacchi     if (ms->next_to_use > 0) {
169*f3e7f55eSRobert Mustacchi         ms->next_to_use--;
170*f3e7f55eSRobert Mustacchi         return (ms->st_base[ms->next_to_use]);
171*f3e7f55eSRobert Mustacchi     } else {
172*f3e7f55eSRobert Mustacchi         ms->was_fault = 1;
173*f3e7f55eSRobert Mustacchi     }
174*f3e7f55eSRobert Mustacchi     return -1;
175*f3e7f55eSRobert Mustacchi }
176*f3e7f55eSRobert Mustacchi 
177*f3e7f55eSRobert Mustacchi /* starting at macro_offset in .debug_macinfo,
178*f3e7f55eSRobert Mustacchi         if maximum_count is 0, treat as if it is infinite.
179*f3e7f55eSRobert Mustacchi         get macro data up thru
180*f3e7f55eSRobert Mustacchi         maximum_count entries or the end of a compilation
181*f3e7f55eSRobert Mustacchi         unit's entries (whichever comes first).
182*f3e7f55eSRobert Mustacchi */
183*f3e7f55eSRobert Mustacchi 
184*f3e7f55eSRobert Mustacchi int
dwarf_get_macro_details(Dwarf_Debug dbg,Dwarf_Off macro_offset,Dwarf_Unsigned maximum_count,Dwarf_Signed * entry_count,Dwarf_Macro_Details ** details,Dwarf_Error * error)185*f3e7f55eSRobert Mustacchi dwarf_get_macro_details(Dwarf_Debug dbg,
186*f3e7f55eSRobert Mustacchi     Dwarf_Off macro_offset,
187*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned maximum_count,
188*f3e7f55eSRobert Mustacchi     Dwarf_Signed * entry_count,
189*f3e7f55eSRobert Mustacchi     Dwarf_Macro_Details ** details,
190*f3e7f55eSRobert Mustacchi     Dwarf_Error * error)
191*f3e7f55eSRobert Mustacchi {
192*f3e7f55eSRobert Mustacchi     Dwarf_Small *macro_base = 0;
193*f3e7f55eSRobert Mustacchi     Dwarf_Small *pnext = 0;
194*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned endloc = 0;
195*f3e7f55eSRobert Mustacchi     unsigned char uc = 0;
196*f3e7f55eSRobert Mustacchi     unsigned long depth = 0;
197*f3e7f55eSRobert Mustacchi         /* By section 6.3.2 Dwarf3 draft 8/9,
198*f3e7f55eSRobert Mustacchi         the base file should appear as
199*f3e7f55eSRobert Mustacchi         DW_MACINFO_start_file. See
200*f3e7f55eSRobert Mustacchi         http://gcc.gnu.org/ml/gcc-bugs/2005-02/msg03442.html
201*f3e7f55eSRobert Mustacchi         on "[Bug debug/20253] New: [3.4/4.0 regression]:
202*f3e7f55eSRobert Mustacchi         Macro debug info broken due to lexer change" for how
203*f3e7f55eSRobert Mustacchi         gcc is broken in some versions. We no longer use
204*f3e7f55eSRobert Mustacchi         depth as a stopping point, it's not needed as a
205*f3e7f55eSRobert Mustacchi         stopping point anyway.  */
206*f3e7f55eSRobert Mustacchi     int res = 0;
207*f3e7f55eSRobert Mustacchi     /* count space used by strings */
208*f3e7f55eSRobert Mustacchi     unsigned long str_space = 0;
209*f3e7f55eSRobert Mustacchi     int done = 0;
210*f3e7f55eSRobert Mustacchi     unsigned long space_needed = 0;
211*f3e7f55eSRobert Mustacchi     unsigned long string_offset = 0;
212*f3e7f55eSRobert Mustacchi     Dwarf_Small *return_data = 0;
213*f3e7f55eSRobert Mustacchi     Dwarf_Small *pdata = 0;
214*f3e7f55eSRobert Mustacchi     unsigned long final_count = 0;
215*f3e7f55eSRobert Mustacchi     Dwarf_Signed fileindex = -1;
216*f3e7f55eSRobert Mustacchi     Dwarf_Small *latest_str_loc = 0;
217*f3e7f55eSRobert Mustacchi     struct macro_stack_s msdata;
218*f3e7f55eSRobert Mustacchi 
219*f3e7f55eSRobert Mustacchi     unsigned long count = 0;
220*f3e7f55eSRobert Mustacchi     unsigned long max_count = (unsigned long) maximum_count;
221*f3e7f55eSRobert Mustacchi 
222*f3e7f55eSRobert Mustacchi     _dwarf_reset_index_macro_stack(&msdata);
223*f3e7f55eSRobert Mustacchi     if (dbg == NULL) {
224*f3e7f55eSRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DBG_NULL);
225*f3e7f55eSRobert Mustacchi         free_macro_stack(dbg,&msdata);
226*f3e7f55eSRobert Mustacchi         return (DW_DLV_ERROR);
227*f3e7f55eSRobert Mustacchi     }
228*f3e7f55eSRobert Mustacchi 
229*f3e7f55eSRobert Mustacchi     res = _dwarf_load_section(dbg, &dbg->de_debug_macinfo,error);
230*f3e7f55eSRobert Mustacchi     if (res != DW_DLV_OK) {
231*f3e7f55eSRobert Mustacchi         free_macro_stack(dbg,&msdata);
232*f3e7f55eSRobert Mustacchi         return res;
233*f3e7f55eSRobert Mustacchi     }
234*f3e7f55eSRobert Mustacchi 
235*f3e7f55eSRobert Mustacchi     macro_base = dbg->de_debug_macinfo.dss_data;
236*f3e7f55eSRobert Mustacchi     if (macro_base == NULL) {
237*f3e7f55eSRobert Mustacchi         free_macro_stack(dbg,&msdata);
238*f3e7f55eSRobert Mustacchi         return (DW_DLV_NO_ENTRY);
239*f3e7f55eSRobert Mustacchi     }
240*f3e7f55eSRobert Mustacchi     if (macro_offset >= dbg->de_debug_macinfo.dss_size) {
241*f3e7f55eSRobert Mustacchi         free_macro_stack(dbg,&msdata);
242*f3e7f55eSRobert Mustacchi         return (DW_DLV_NO_ENTRY);
243*f3e7f55eSRobert Mustacchi     }
244*f3e7f55eSRobert Mustacchi 
245*f3e7f55eSRobert Mustacchi     pnext = macro_base + macro_offset;
246*f3e7f55eSRobert Mustacchi     if (maximum_count == 0) {
247*f3e7f55eSRobert Mustacchi         max_count = ULONG_MAX;
248*f3e7f55eSRobert Mustacchi     }
249*f3e7f55eSRobert Mustacchi 
250*f3e7f55eSRobert Mustacchi 
251*f3e7f55eSRobert Mustacchi     /* how many entries and how much space will they take? */
252*f3e7f55eSRobert Mustacchi 
253*f3e7f55eSRobert Mustacchi     endloc = (pnext - macro_base);
254*f3e7f55eSRobert Mustacchi     if (endloc >= dbg->de_debug_macinfo.dss_size) {
255*f3e7f55eSRobert Mustacchi         if (endloc == dbg->de_debug_macinfo.dss_size) {
256*f3e7f55eSRobert Mustacchi             /* normal: found last entry */
257*f3e7f55eSRobert Mustacchi             free_macro_stack(dbg,&msdata);
258*f3e7f55eSRobert Mustacchi             return DW_DLV_NO_ENTRY;
259*f3e7f55eSRobert Mustacchi         }
260*f3e7f55eSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_LENGTH_BAD);
261*f3e7f55eSRobert Mustacchi         free_macro_stack(dbg,&msdata);
262*f3e7f55eSRobert Mustacchi         return (DW_DLV_ERROR);
263*f3e7f55eSRobert Mustacchi     }
264*f3e7f55eSRobert Mustacchi     for (count = 0; !done && count < max_count; ++count) {
265*f3e7f55eSRobert Mustacchi         unsigned long slen;
266*f3e7f55eSRobert Mustacchi         Dwarf_Word len;
267*f3e7f55eSRobert Mustacchi 
268*f3e7f55eSRobert Mustacchi         uc = *pnext;
269*f3e7f55eSRobert Mustacchi         ++pnext;                /* get past the type code */
270*f3e7f55eSRobert Mustacchi         switch (uc) {
271*f3e7f55eSRobert Mustacchi         case DW_MACINFO_define:
272*f3e7f55eSRobert Mustacchi         case DW_MACINFO_undef:
273*f3e7f55eSRobert Mustacchi             /* line, string */
274*f3e7f55eSRobert Mustacchi         case DW_MACINFO_vendor_ext:
275*f3e7f55eSRobert Mustacchi             /* number, string */
276*f3e7f55eSRobert Mustacchi             (void) _dwarf_decode_u_leb128(pnext, &len);
277*f3e7f55eSRobert Mustacchi 
278*f3e7f55eSRobert Mustacchi             pnext += len;
279*f3e7f55eSRobert Mustacchi             if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) {
280*f3e7f55eSRobert Mustacchi                 free_macro_stack(dbg,&msdata);
281*f3e7f55eSRobert Mustacchi                 _dwarf_error(dbg, error,
282*f3e7f55eSRobert Mustacchi                     DW_DLE_DEBUG_MACRO_INCONSISTENT);
283*f3e7f55eSRobert Mustacchi                 return (DW_DLV_ERROR);
284*f3e7f55eSRobert Mustacchi             }
285*f3e7f55eSRobert Mustacchi             slen = strlen((char *) pnext) + 1;
286*f3e7f55eSRobert Mustacchi             pnext += slen;
287*f3e7f55eSRobert Mustacchi             if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) {
288*f3e7f55eSRobert Mustacchi                 free_macro_stack(dbg,&msdata);
289*f3e7f55eSRobert Mustacchi                 _dwarf_error(dbg, error,
290*f3e7f55eSRobert Mustacchi                     DW_DLE_DEBUG_MACRO_INCONSISTENT);
291*f3e7f55eSRobert Mustacchi                 return (DW_DLV_ERROR);
292*f3e7f55eSRobert Mustacchi             }
293*f3e7f55eSRobert Mustacchi             str_space += slen;
294*f3e7f55eSRobert Mustacchi             break;
295*f3e7f55eSRobert Mustacchi         case DW_MACINFO_start_file:
296*f3e7f55eSRobert Mustacchi             /* line, file index */
297*f3e7f55eSRobert Mustacchi             (void) _dwarf_decode_u_leb128(pnext, &len);
298*f3e7f55eSRobert Mustacchi             pnext += len;
299*f3e7f55eSRobert Mustacchi             if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) {
300*f3e7f55eSRobert Mustacchi                 free_macro_stack(dbg,&msdata);
301*f3e7f55eSRobert Mustacchi                 _dwarf_error(dbg, error,
302*f3e7f55eSRobert Mustacchi                     DW_DLE_DEBUG_MACRO_INCONSISTENT);
303*f3e7f55eSRobert Mustacchi                 return (DW_DLV_ERROR);
304*f3e7f55eSRobert Mustacchi             }
305*f3e7f55eSRobert Mustacchi             (void) _dwarf_decode_u_leb128(pnext, &len);
306*f3e7f55eSRobert Mustacchi             pnext += len;
307*f3e7f55eSRobert Mustacchi             if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) {
308*f3e7f55eSRobert Mustacchi                 free_macro_stack(dbg,&msdata);
309*f3e7f55eSRobert Mustacchi                 _dwarf_error(dbg, error,
310*f3e7f55eSRobert Mustacchi                     DW_DLE_DEBUG_MACRO_INCONSISTENT);
311*f3e7f55eSRobert Mustacchi                 return (DW_DLV_ERROR);
312*f3e7f55eSRobert Mustacchi             }
313*f3e7f55eSRobert Mustacchi             ++depth;
314*f3e7f55eSRobert Mustacchi             break;
315*f3e7f55eSRobert Mustacchi 
316*f3e7f55eSRobert Mustacchi         case DW_MACINFO_end_file:
317*f3e7f55eSRobert Mustacchi             if (--depth == 0) {
318*f3e7f55eSRobert Mustacchi                 /* done = 1; no, do not stop here, at least one gcc had
319*f3e7f55eSRobert Mustacchi                    the wrong depth settings in the gcc 3.4 timeframe. */
320*f3e7f55eSRobert Mustacchi             }
321*f3e7f55eSRobert Mustacchi             break;              /* no string or number here */
322*f3e7f55eSRobert Mustacchi         case 0:
323*f3e7f55eSRobert Mustacchi             /* end of cu's entries */
324*f3e7f55eSRobert Mustacchi             done = 1;
325*f3e7f55eSRobert Mustacchi             break;
326*f3e7f55eSRobert Mustacchi         default:
327*f3e7f55eSRobert Mustacchi             free_macro_stack(dbg,&msdata);
328*f3e7f55eSRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_INCONSISTENT);
329*f3e7f55eSRobert Mustacchi             return (DW_DLV_ERROR);
330*f3e7f55eSRobert Mustacchi             /* bogus macinfo! */
331*f3e7f55eSRobert Mustacchi         }
332*f3e7f55eSRobert Mustacchi 
333*f3e7f55eSRobert Mustacchi         endloc = (pnext - macro_base);
334*f3e7f55eSRobert Mustacchi         if (endloc == dbg->de_debug_macinfo.dss_size) {
335*f3e7f55eSRobert Mustacchi             done = 1;
336*f3e7f55eSRobert Mustacchi         } else if (endloc > dbg->de_debug_macinfo.dss_size) {
337*f3e7f55eSRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_LENGTH_BAD);
338*f3e7f55eSRobert Mustacchi             free_macro_stack(dbg,&msdata);
339*f3e7f55eSRobert Mustacchi             return (DW_DLV_ERROR);
340*f3e7f55eSRobert Mustacchi         }
341*f3e7f55eSRobert Mustacchi     }
342*f3e7f55eSRobert Mustacchi     if (count == 0) {
343*f3e7f55eSRobert Mustacchi         free_macro_stack(dbg,&msdata);
344*f3e7f55eSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_INTERNAL_ERR);
345*f3e7f55eSRobert Mustacchi         return (DW_DLV_ERROR);
346*f3e7f55eSRobert Mustacchi     }
347*f3e7f55eSRobert Mustacchi 
348*f3e7f55eSRobert Mustacchi     /* we have 'count' array entries to allocate and str_space bytes of
349*f3e7f55eSRobert Mustacchi        string space to provide for. */
350*f3e7f55eSRobert Mustacchi 
351*f3e7f55eSRobert Mustacchi     string_offset = count * sizeof(Dwarf_Macro_Details);
352*f3e7f55eSRobert Mustacchi 
353*f3e7f55eSRobert Mustacchi     /* extra 2 not really needed */
354*f3e7f55eSRobert Mustacchi     space_needed = string_offset + str_space + 2;
355*f3e7f55eSRobert Mustacchi     return_data = pdata =
356*f3e7f55eSRobert Mustacchi         _dwarf_get_alloc(dbg, DW_DLA_STRING, space_needed);
357*f3e7f55eSRobert Mustacchi     latest_str_loc = pdata + string_offset;
358*f3e7f55eSRobert Mustacchi     if (pdata == 0) {
359*f3e7f55eSRobert Mustacchi         free_macro_stack(dbg,&msdata);
360*f3e7f55eSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_MALLOC_SPACE);
361*f3e7f55eSRobert Mustacchi         return (DW_DLV_ERROR);
362*f3e7f55eSRobert Mustacchi     }
363*f3e7f55eSRobert Mustacchi     pnext = macro_base + macro_offset;
364*f3e7f55eSRobert Mustacchi 
365*f3e7f55eSRobert Mustacchi     done = 0;
366*f3e7f55eSRobert Mustacchi 
367*f3e7f55eSRobert Mustacchi     /* A series ends with a type code of 0. */
368*f3e7f55eSRobert Mustacchi 
369*f3e7f55eSRobert Mustacchi     for (final_count = 0; !done && final_count < count; ++final_count) {
370*f3e7f55eSRobert Mustacchi         unsigned long slen;
371*f3e7f55eSRobert Mustacchi         Dwarf_Word len;
372*f3e7f55eSRobert Mustacchi         Dwarf_Unsigned v1;
373*f3e7f55eSRobert Mustacchi         Dwarf_Macro_Details *pdmd = (Dwarf_Macro_Details *) (pdata +
374*f3e7f55eSRobert Mustacchi             (final_count * sizeof (Dwarf_Macro_Details)));
375*f3e7f55eSRobert Mustacchi 
376*f3e7f55eSRobert Mustacchi         endloc = (pnext - macro_base);
377*f3e7f55eSRobert Mustacchi         if (endloc > dbg->de_debug_macinfo.dss_size) {
378*f3e7f55eSRobert Mustacchi             free_macro_stack(dbg,&msdata);
379*f3e7f55eSRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_LENGTH_BAD);
380*f3e7f55eSRobert Mustacchi             return (DW_DLV_ERROR);
381*f3e7f55eSRobert Mustacchi         }
382*f3e7f55eSRobert Mustacchi         uc = *pnext;
383*f3e7f55eSRobert Mustacchi         pdmd->dmd_offset = (pnext - macro_base);
384*f3e7f55eSRobert Mustacchi         pdmd->dmd_type = uc;
385*f3e7f55eSRobert Mustacchi         pdmd->dmd_fileindex = fileindex;
386*f3e7f55eSRobert Mustacchi         pdmd->dmd_lineno = 0;
387*f3e7f55eSRobert Mustacchi         pdmd->dmd_macro = 0;
388*f3e7f55eSRobert Mustacchi         ++pnext;                /* get past the type code */
389*f3e7f55eSRobert Mustacchi         switch (uc) {
390*f3e7f55eSRobert Mustacchi         case DW_MACINFO_define:
391*f3e7f55eSRobert Mustacchi         case DW_MACINFO_undef:
392*f3e7f55eSRobert Mustacchi             /* line, string */
393*f3e7f55eSRobert Mustacchi         case DW_MACINFO_vendor_ext:
394*f3e7f55eSRobert Mustacchi             /* number, string */
395*f3e7f55eSRobert Mustacchi             v1 = _dwarf_decode_u_leb128(pnext, &len);
396*f3e7f55eSRobert Mustacchi             pdmd->dmd_lineno = v1;
397*f3e7f55eSRobert Mustacchi 
398*f3e7f55eSRobert Mustacchi             pnext += len;
399*f3e7f55eSRobert Mustacchi             if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) {
400*f3e7f55eSRobert Mustacchi                 free_macro_stack(dbg,&msdata);
401*f3e7f55eSRobert Mustacchi                 dwarf_dealloc(dbg, return_data, DW_DLA_STRING);
402*f3e7f55eSRobert Mustacchi                 _dwarf_error(dbg, error,
403*f3e7f55eSRobert Mustacchi                     DW_DLE_DEBUG_MACRO_INCONSISTENT);
404*f3e7f55eSRobert Mustacchi                 return (DW_DLV_ERROR);
405*f3e7f55eSRobert Mustacchi             }
406*f3e7f55eSRobert Mustacchi             slen = strlen((char *) pnext) + 1;
407*f3e7f55eSRobert Mustacchi             strcpy((char *) latest_str_loc, (char *) pnext);
408*f3e7f55eSRobert Mustacchi             pdmd->dmd_macro = (char *) latest_str_loc;
409*f3e7f55eSRobert Mustacchi             latest_str_loc += slen;
410*f3e7f55eSRobert Mustacchi             pnext += slen;
411*f3e7f55eSRobert Mustacchi             if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) {
412*f3e7f55eSRobert Mustacchi                 free_macro_stack(dbg,&msdata);
413*f3e7f55eSRobert Mustacchi                 dwarf_dealloc(dbg, return_data, DW_DLA_STRING);
414*f3e7f55eSRobert Mustacchi                 _dwarf_error(dbg, error,
415*f3e7f55eSRobert Mustacchi                     DW_DLE_DEBUG_MACRO_INCONSISTENT);
416*f3e7f55eSRobert Mustacchi                 return (DW_DLV_ERROR);
417*f3e7f55eSRobert Mustacchi             }
418*f3e7f55eSRobert Mustacchi             break;
419*f3e7f55eSRobert Mustacchi         case DW_MACINFO_start_file:
420*f3e7f55eSRobert Mustacchi             /* Line, file index */
421*f3e7f55eSRobert Mustacchi             v1 = _dwarf_decode_u_leb128(pnext, &len);
422*f3e7f55eSRobert Mustacchi             pdmd->dmd_lineno = v1;
423*f3e7f55eSRobert Mustacchi             pnext += len;
424*f3e7f55eSRobert Mustacchi             if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) {
425*f3e7f55eSRobert Mustacchi                 free_macro_stack(dbg,&msdata);
426*f3e7f55eSRobert Mustacchi                 dwarf_dealloc(dbg, return_data, DW_DLA_STRING);
427*f3e7f55eSRobert Mustacchi                 _dwarf_error(dbg, error,
428*f3e7f55eSRobert Mustacchi                     DW_DLE_DEBUG_MACRO_INCONSISTENT);
429*f3e7f55eSRobert Mustacchi                 return (DW_DLV_ERROR);
430*f3e7f55eSRobert Mustacchi             }
431*f3e7f55eSRobert Mustacchi             v1 = _dwarf_decode_u_leb128(pnext, &len);
432*f3e7f55eSRobert Mustacchi             pdmd->dmd_fileindex = v1;
433*f3e7f55eSRobert Mustacchi             (void) _dwarf_macro_stack_push_index(dbg, fileindex,
434*f3e7f55eSRobert Mustacchi                                                  &msdata);
435*f3e7f55eSRobert Mustacchi             /* We ignore the error, we just let fileindex ** be -1 when
436*f3e7f55eSRobert Mustacchi                we pop this one. */
437*f3e7f55eSRobert Mustacchi             fileindex = v1;
438*f3e7f55eSRobert Mustacchi             pnext += len;
439*f3e7f55eSRobert Mustacchi             if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) {
440*f3e7f55eSRobert Mustacchi                 free_macro_stack(dbg,&msdata);
441*f3e7f55eSRobert Mustacchi                 dwarf_dealloc(dbg, return_data, DW_DLA_STRING);
442*f3e7f55eSRobert Mustacchi                 _dwarf_error(dbg, error,
443*f3e7f55eSRobert Mustacchi                     DW_DLE_DEBUG_MACRO_INCONSISTENT);
444*f3e7f55eSRobert Mustacchi                 return (DW_DLV_ERROR);
445*f3e7f55eSRobert Mustacchi             }
446*f3e7f55eSRobert Mustacchi             break;
447*f3e7f55eSRobert Mustacchi 
448*f3e7f55eSRobert Mustacchi         case DW_MACINFO_end_file:
449*f3e7f55eSRobert Mustacchi             fileindex = _dwarf_macro_stack_pop_index(&msdata);
450*f3e7f55eSRobert Mustacchi             break;              /* no string or number here */
451*f3e7f55eSRobert Mustacchi         case 0:
452*f3e7f55eSRobert Mustacchi             /* Type code of 0 means the end of cu's entries. */
453*f3e7f55eSRobert Mustacchi             done = 1;
454*f3e7f55eSRobert Mustacchi             break;
455*f3e7f55eSRobert Mustacchi         default:
456*f3e7f55eSRobert Mustacchi             /* Bogus macinfo! */
457*f3e7f55eSRobert Mustacchi             dwarf_dealloc(dbg, return_data, DW_DLA_STRING);
458*f3e7f55eSRobert Mustacchi             free_macro_stack(dbg,&msdata);
459*f3e7f55eSRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_INCONSISTENT);
460*f3e7f55eSRobert Mustacchi             return (DW_DLV_ERROR);
461*f3e7f55eSRobert Mustacchi         }
462*f3e7f55eSRobert Mustacchi     }
463*f3e7f55eSRobert Mustacchi     *entry_count = count;
464*f3e7f55eSRobert Mustacchi     *details = (Dwarf_Macro_Details *) return_data;
465*f3e7f55eSRobert Mustacchi     free_macro_stack(dbg,&msdata);
466*f3e7f55eSRobert Mustacchi     return DW_DLV_OK;
467*f3e7f55eSRobert Mustacchi }
468