xref: /illumos-gate/usr/src/lib/libdwarf/common/dwarf_macro5.c (revision 4d9fdb46b215739778ebc12079842c9905586999)
1*4d9fdb46SRobert Mustacchi /*
2*4d9fdb46SRobert Mustacchi   Copyright (C) 2015-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 #include <limits.h>
29*4d9fdb46SRobert Mustacchi #ifdef HAVE_STDLIB_H
30*4d9fdb46SRobert Mustacchi #include <stdlib.h>
31*4d9fdb46SRobert Mustacchi #endif /* HAVE_STDLIB_H */
32*4d9fdb46SRobert Mustacchi #ifdef HAVE_MALLOC_H
33*4d9fdb46SRobert Mustacchi /* Useful include for some Windows compilers. */
34*4d9fdb46SRobert Mustacchi #include <malloc.h>
35*4d9fdb46SRobert Mustacchi #endif /* HAVE_MALLOC_H */
36*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
37*4d9fdb46SRobert Mustacchi #include "dwarf_alloc.h"
38*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
39*4d9fdb46SRobert Mustacchi #include "dwarf_util.h"
40*4d9fdb46SRobert Mustacchi #include "dwarf_macro5.h"
41*4d9fdb46SRobert Mustacchi 
42*4d9fdb46SRobert Mustacchi #define TRUE 1
43*4d9fdb46SRobert Mustacchi #define FALSE 0
44*4d9fdb46SRobert Mustacchi 
45*4d9fdb46SRobert Mustacchi /*  Section 6.3: Macro Information:
46*4d9fdb46SRobert Mustacchi     Each macro unit ends with an entry
47*4d9fdb46SRobert Mustacchi     containing an opcode of 0. */
48*4d9fdb46SRobert Mustacchi 
49*4d9fdb46SRobert Mustacchi static const Dwarf_Small dwarf_udata_string_form[]  = {DW_FORM_udata,DW_FORM_string};
50*4d9fdb46SRobert Mustacchi static const Dwarf_Small dwarf_udata_udata_form[]   = {DW_FORM_udata,DW_FORM_udata};
51*4d9fdb46SRobert Mustacchi static const Dwarf_Small dwarf_udata_strp_form[]    = {DW_FORM_udata,DW_FORM_strp};
52*4d9fdb46SRobert Mustacchi static const Dwarf_Small dwarf_udata_strp_sup_form[] = {DW_FORM_udata,DW_FORM_strp_sup};
53*4d9fdb46SRobert Mustacchi static const Dwarf_Small dwarf_secoffset_form[]     = {DW_FORM_sec_offset};
54*4d9fdb46SRobert Mustacchi static const Dwarf_Small dwarf_udata_strx_form[]    = {DW_FORM_udata,DW_FORM_strx};
55*4d9fdb46SRobert Mustacchi 
56*4d9fdb46SRobert Mustacchi struct Dwarf_Macro_Forms_s dw5formsarray[] = {
57*4d9fdb46SRobert Mustacchi     {0,0,0},
58*4d9fdb46SRobert Mustacchi     {DW_MACRO_define,2,dwarf_udata_string_form},
59*4d9fdb46SRobert Mustacchi     {DW_MACRO_undef,2,dwarf_udata_string_form},
60*4d9fdb46SRobert Mustacchi     {DW_MACRO_start_file,2,dwarf_udata_udata_form},
61*4d9fdb46SRobert Mustacchi     {DW_MACRO_end_file,0,0},
62*4d9fdb46SRobert Mustacchi 
63*4d9fdb46SRobert Mustacchi     {DW_MACRO_define_strp,2,dwarf_udata_strp_form},
64*4d9fdb46SRobert Mustacchi     {DW_MACRO_undef_strp,2,dwarf_udata_strp_form},
65*4d9fdb46SRobert Mustacchi     {DW_MACRO_import,1,dwarf_secoffset_form},
66*4d9fdb46SRobert Mustacchi 
67*4d9fdb46SRobert Mustacchi     {DW_MACRO_define_sup,2,dwarf_udata_strp_sup_form},
68*4d9fdb46SRobert Mustacchi     {DW_MACRO_undef_sup,2,dwarf_udata_strp_sup_form},
69*4d9fdb46SRobert Mustacchi     {DW_MACRO_import_sup,1,dwarf_secoffset_form},
70*4d9fdb46SRobert Mustacchi 
71*4d9fdb46SRobert Mustacchi     {DW_MACRO_define_strx,2,dwarf_udata_strx_form},
72*4d9fdb46SRobert Mustacchi     {DW_MACRO_undef_strx,2,dwarf_udata_strx_form},
73*4d9fdb46SRobert Mustacchi };
74*4d9fdb46SRobert Mustacchi 
75*4d9fdb46SRobert Mustacchi 
76*4d9fdb46SRobert Mustacchi 
77*4d9fdb46SRobert Mustacchi /* Represents DWARF 5 macro info */
78*4d9fdb46SRobert Mustacchi /* .debug_macro predefined, in order by value  */
79*4d9fdb46SRobert Mustacchi static const struct Dwarf_Macro_OperationsList_s dwarf_default_macro_opslist = {
80*4d9fdb46SRobert Mustacchi 13, dw5formsarray
81*4d9fdb46SRobert Mustacchi };
82*4d9fdb46SRobert Mustacchi 
83*4d9fdb46SRobert Mustacchi 
84*4d9fdb46SRobert Mustacchi static int _dwarf_internal_macro_context_by_offset(Dwarf_Debug dbg,
85*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset,
86*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  * version_out,
87*4d9fdb46SRobert Mustacchi     Dwarf_Macro_Context * macro_context_out,
88*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *macro_ops_count_out,
89*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *macro_ops_data_length,
90*4d9fdb46SRobert Mustacchi     char **srcfiles,
91*4d9fdb46SRobert Mustacchi     Dwarf_Signed srcfilescount,
92*4d9fdb46SRobert Mustacchi     const char *comp_dir,
93*4d9fdb46SRobert Mustacchi     const char *comp_name,
94*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context,
95*4d9fdb46SRobert Mustacchi     Dwarf_Error * error);
96*4d9fdb46SRobert Mustacchi 
97*4d9fdb46SRobert Mustacchi static int _dwarf_internal_macro_context(Dwarf_Die die,
98*4d9fdb46SRobert Mustacchi     Dwarf_Bool offset_specified,
99*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset,
100*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  * version_out,
101*4d9fdb46SRobert Mustacchi     Dwarf_Macro_Context * macro_context_out,
102*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *macro_unit_offset_out,
103*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *macro_ops_count_out,
104*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *macro_ops_data_length,
105*4d9fdb46SRobert Mustacchi     Dwarf_Error * error);
106*4d9fdb46SRobert Mustacchi 
107*4d9fdb46SRobert Mustacchi static int
is_std_moperator(Dwarf_Small op)108*4d9fdb46SRobert Mustacchi is_std_moperator(Dwarf_Small op)
109*4d9fdb46SRobert Mustacchi {
110*4d9fdb46SRobert Mustacchi     if (op >= 1 && op <= DW_MACRO_undef_strx) {
111*4d9fdb46SRobert Mustacchi         return TRUE;
112*4d9fdb46SRobert Mustacchi     }
113*4d9fdb46SRobert Mustacchi     return FALSE;
114*4d9fdb46SRobert Mustacchi }
115*4d9fdb46SRobert Mustacchi 
116*4d9fdb46SRobert Mustacchi static int
_dwarf_skim_forms(Dwarf_Debug dbg,Dwarf_Macro_Context mcontext,Dwarf_Small * mdata_start,unsigned formcount,const Dwarf_Small * forms,Dwarf_Small * section_end,Dwarf_Unsigned * forms_length,Dwarf_Error * error)117*4d9fdb46SRobert Mustacchi _dwarf_skim_forms(Dwarf_Debug dbg,
118*4d9fdb46SRobert Mustacchi     Dwarf_Macro_Context mcontext,
119*4d9fdb46SRobert Mustacchi     Dwarf_Small *mdata_start,
120*4d9fdb46SRobert Mustacchi     unsigned formcount,
121*4d9fdb46SRobert Mustacchi     const Dwarf_Small *forms,
122*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_end,
123*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *forms_length,
124*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
125*4d9fdb46SRobert Mustacchi {
126*4d9fdb46SRobert Mustacchi     unsigned i = 0;
127*4d9fdb46SRobert Mustacchi     Dwarf_Small curform = 0 ;
128*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned totallen = 0;
129*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned v = 0;
130*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned ret_value = 0;
131*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned length;
132*4d9fdb46SRobert Mustacchi     Dwarf_Small *mdata = mdata_start;
133*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned leb128_length = 0;
134*4d9fdb46SRobert Mustacchi 
135*4d9fdb46SRobert Mustacchi     for( ; i < formcount; ++i) {
136*4d9fdb46SRobert Mustacchi         curform = forms[i];
137*4d9fdb46SRobert Mustacchi         if (mdata >= section_end) {
138*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_MACRO_OFFSET_BAD);
139*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
140*4d9fdb46SRobert Mustacchi         }
141*4d9fdb46SRobert Mustacchi         switch(curform) {
142*4d9fdb46SRobert Mustacchi         default:
143*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,
144*4d9fdb46SRobert Mustacchi                 DW_DLE_DEBUG_FORM_HANDLING_INCOMPLETE);
145*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
146*4d9fdb46SRobert Mustacchi         case DW_FORM_block1:
147*4d9fdb46SRobert Mustacchi             v =  *(Dwarf_Small *) mdata;
148*4d9fdb46SRobert Mustacchi             totallen += v+1;
149*4d9fdb46SRobert Mustacchi             mdata += v+1;
150*4d9fdb46SRobert Mustacchi             break;
151*4d9fdb46SRobert Mustacchi         case DW_FORM_block2:
152*4d9fdb46SRobert Mustacchi             READ_UNALIGNED_CK(dbg, ret_value, Dwarf_Unsigned,
153*4d9fdb46SRobert Mustacchi                 mdata, DWARF_HALF_SIZE,
154*4d9fdb46SRobert Mustacchi                 error,section_end);
155*4d9fdb46SRobert Mustacchi             v = ret_value + DWARF_HALF_SIZE;
156*4d9fdb46SRobert Mustacchi             totallen += v;
157*4d9fdb46SRobert Mustacchi             mdata += v;
158*4d9fdb46SRobert Mustacchi             break;
159*4d9fdb46SRobert Mustacchi         case DW_FORM_block4:
160*4d9fdb46SRobert Mustacchi             READ_UNALIGNED_CK(dbg, ret_value, Dwarf_Unsigned,
161*4d9fdb46SRobert Mustacchi                 mdata, DWARF_32BIT_SIZE,
162*4d9fdb46SRobert Mustacchi                 error,section_end);
163*4d9fdb46SRobert Mustacchi             v = ret_value + DWARF_32BIT_SIZE;
164*4d9fdb46SRobert Mustacchi             totallen += v;
165*4d9fdb46SRobert Mustacchi             mdata += v;
166*4d9fdb46SRobert Mustacchi             break;
167*4d9fdb46SRobert Mustacchi         case DW_FORM_data1:
168*4d9fdb46SRobert Mustacchi             v = 1;
169*4d9fdb46SRobert Mustacchi             totallen += v;
170*4d9fdb46SRobert Mustacchi             mdata += v;
171*4d9fdb46SRobert Mustacchi             break;
172*4d9fdb46SRobert Mustacchi         case DW_FORM_data2:
173*4d9fdb46SRobert Mustacchi             v = 2;
174*4d9fdb46SRobert Mustacchi             totallen += v;
175*4d9fdb46SRobert Mustacchi             mdata += v;
176*4d9fdb46SRobert Mustacchi             break;
177*4d9fdb46SRobert Mustacchi         case DW_FORM_data4:
178*4d9fdb46SRobert Mustacchi             v = 4;
179*4d9fdb46SRobert Mustacchi             totallen += v;
180*4d9fdb46SRobert Mustacchi             mdata += v;
181*4d9fdb46SRobert Mustacchi             break;
182*4d9fdb46SRobert Mustacchi         case DW_FORM_data8:
183*4d9fdb46SRobert Mustacchi             v = 8;
184*4d9fdb46SRobert Mustacchi             totallen += v;
185*4d9fdb46SRobert Mustacchi             mdata += v;
186*4d9fdb46SRobert Mustacchi             break;
187*4d9fdb46SRobert Mustacchi         case DW_FORM_data16:
188*4d9fdb46SRobert Mustacchi             v = 8;
189*4d9fdb46SRobert Mustacchi             totallen += v;
190*4d9fdb46SRobert Mustacchi             mdata += v;
191*4d9fdb46SRobert Mustacchi             break;
192*4d9fdb46SRobert Mustacchi         case DW_FORM_string: {
193*4d9fdb46SRobert Mustacchi             int res = _dwarf_check_string_valid(dbg,
194*4d9fdb46SRobert Mustacchi                 mdata,mdata, section_end,
195*4d9fdb46SRobert Mustacchi                 DW_DLE_MACRO_STRING_BAD,error);
196*4d9fdb46SRobert Mustacchi             if(res != DW_DLV_OK) {
197*4d9fdb46SRobert Mustacchi                 return res;
198*4d9fdb46SRobert Mustacchi             }
199*4d9fdb46SRobert Mustacchi             v = strlen((char *) mdata) + 1;
200*4d9fdb46SRobert Mustacchi             totallen += v;
201*4d9fdb46SRobert Mustacchi             mdata += v;
202*4d9fdb46SRobert Mustacchi             }
203*4d9fdb46SRobert Mustacchi             break;
204*4d9fdb46SRobert Mustacchi         case DW_FORM_block:
205*4d9fdb46SRobert Mustacchi             DECODE_LEB128_UWORD_LEN_CK(mdata,length,leb128_length,
206*4d9fdb46SRobert Mustacchi                 dbg, error,section_end);
207*4d9fdb46SRobert Mustacchi             v = length + leb128_length;
208*4d9fdb46SRobert Mustacchi             totallen += v;
209*4d9fdb46SRobert Mustacchi             break;
210*4d9fdb46SRobert Mustacchi         case DW_FORM_flag:
211*4d9fdb46SRobert Mustacchi             v = 1;
212*4d9fdb46SRobert Mustacchi             totallen += v;
213*4d9fdb46SRobert Mustacchi             mdata += v;
214*4d9fdb46SRobert Mustacchi             break;
215*4d9fdb46SRobert Mustacchi         case DW_FORM_sec_offset:
216*4d9fdb46SRobert Mustacchi             /* If 32bit dwarf, is 4. Else is 64bit dwarf and is 8. */
217*4d9fdb46SRobert Mustacchi             v = mcontext->mc_offset_size;
218*4d9fdb46SRobert Mustacchi             totallen += v;
219*4d9fdb46SRobert Mustacchi             mdata += v;
220*4d9fdb46SRobert Mustacchi             break;
221*4d9fdb46SRobert Mustacchi         case DW_FORM_sdata:
222*4d9fdb46SRobert Mustacchi             /*  Discard the decoded value, we just want the length
223*4d9fdb46SRobert Mustacchi                 of the value. */
224*4d9fdb46SRobert Mustacchi             DECODE_LEB128_UWORD_LEN_CK(mdata,length,leb128_length,
225*4d9fdb46SRobert Mustacchi                 dbg, error,section_end);
226*4d9fdb46SRobert Mustacchi             totallen += v;
227*4d9fdb46SRobert Mustacchi             break;
228*4d9fdb46SRobert Mustacchi         case DW_FORM_strx:
229*4d9fdb46SRobert Mustacchi             DECODE_LEB128_UWORD_LEN_CK(mdata,length,leb128_length,
230*4d9fdb46SRobert Mustacchi                 dbg, error,section_end);
231*4d9fdb46SRobert Mustacchi             totallen += leb128_length;;
232*4d9fdb46SRobert Mustacchi             break;
233*4d9fdb46SRobert Mustacchi         case DW_FORM_strp:
234*4d9fdb46SRobert Mustacchi             v = mcontext->mc_offset_size;
235*4d9fdb46SRobert Mustacchi             mdata += v;
236*4d9fdb46SRobert Mustacchi             totallen += v;
237*4d9fdb46SRobert Mustacchi             break;
238*4d9fdb46SRobert Mustacchi         case DW_FORM_udata:
239*4d9fdb46SRobert Mustacchi             /*  Discard the decoded value, we just want the length
240*4d9fdb46SRobert Mustacchi                 of the value. */
241*4d9fdb46SRobert Mustacchi             DECODE_LEB128_UWORD_LEN_CK(mdata,length,leb128_length,
242*4d9fdb46SRobert Mustacchi                 dbg, error,section_end);
243*4d9fdb46SRobert Mustacchi             totallen += leb128_length;
244*4d9fdb46SRobert Mustacchi             break;
245*4d9fdb46SRobert Mustacchi         }
246*4d9fdb46SRobert Mustacchi     }
247*4d9fdb46SRobert Mustacchi     if (mdata > section_end) {
248*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_MACRO_OFFSET_BAD);
249*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
250*4d9fdb46SRobert Mustacchi     }
251*4d9fdb46SRobert Mustacchi     *forms_length = totallen;
252*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
253*4d9fdb46SRobert Mustacchi }
254*4d9fdb46SRobert Mustacchi 
255*4d9fdb46SRobert Mustacchi #if 0 /* FOR DEBUGGING */
256*4d9fdb46SRobert Mustacchi static void
257*4d9fdb46SRobert Mustacchi dump_bytes(Dwarf_Small * start, long len)
258*4d9fdb46SRobert Mustacchi {
259*4d9fdb46SRobert Mustacchi     Dwarf_Small *end = start + len;
260*4d9fdb46SRobert Mustacchi     Dwarf_Small *cur = start;
261*4d9fdb46SRobert Mustacchi     unsigned pos = 0;
262*4d9fdb46SRobert Mustacchi 
263*4d9fdb46SRobert Mustacchi     printf("dump %ld bytes, start at 0x%lx\n",len,(unsigned long)start);
264*4d9fdb46SRobert Mustacchi     printf("0x");
265*4d9fdb46SRobert Mustacchi     for (; cur < end;pos++, cur++) {
266*4d9fdb46SRobert Mustacchi         if (!(pos %4)) {
267*4d9fdb46SRobert Mustacchi             printf(" ");
268*4d9fdb46SRobert Mustacchi         }
269*4d9fdb46SRobert Mustacchi         printf("%02x",*cur);
270*4d9fdb46SRobert Mustacchi     }
271*4d9fdb46SRobert Mustacchi     printf("\n");
272*4d9fdb46SRobert Mustacchi }
273*4d9fdb46SRobert Mustacchi Dwarf_Bool
274*4d9fdb46SRobert Mustacchi is_defundef(unsigned op)
275*4d9fdb46SRobert Mustacchi {
276*4d9fdb46SRobert Mustacchi     switch(op){
277*4d9fdb46SRobert Mustacchi     case DW_MACRO_define:
278*4d9fdb46SRobert Mustacchi     case DW_MACRO_undef:
279*4d9fdb46SRobert Mustacchi     case DW_MACRO_define_strp:
280*4d9fdb46SRobert Mustacchi     case DW_MACRO_undef_strp:
281*4d9fdb46SRobert Mustacchi     case DW_MACRO_define_strx:
282*4d9fdb46SRobert Mustacchi     case DW_MACRO_undef_strx:
283*4d9fdb46SRobert Mustacchi     case DW_MACRO_define_sup:
284*4d9fdb46SRobert Mustacchi     case DW_MACRO_undef_sup:
285*4d9fdb46SRobert Mustacchi         return TRUE;
286*4d9fdb46SRobert Mustacchi     }
287*4d9fdb46SRobert Mustacchi     return FALSE;
288*4d9fdb46SRobert Mustacchi }
289*4d9fdb46SRobert Mustacchi #endif /* FOR DEBUGGING */
290*4d9fdb46SRobert Mustacchi 
291*4d9fdb46SRobert Mustacchi 
292*4d9fdb46SRobert Mustacchi /*  On first call (for this macro_context),
293*4d9fdb46SRobert Mustacchi     build_ops_array is FALSE. On second,
294*4d9fdb46SRobert Mustacchi     it is TRUE and we know the count so we allocate and fill in
295*4d9fdb46SRobert Mustacchi     the ops array. */
296*4d9fdb46SRobert Mustacchi static int
_dwarf_get_macro_ops_count_internal(Dwarf_Macro_Context macro_context,Dwarf_Bool build_ops_array,Dwarf_Error * error)297*4d9fdb46SRobert Mustacchi _dwarf_get_macro_ops_count_internal(Dwarf_Macro_Context macro_context,
298*4d9fdb46SRobert Mustacchi     Dwarf_Bool build_ops_array,
299*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
300*4d9fdb46SRobert Mustacchi {
301*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
302*4d9fdb46SRobert Mustacchi     Dwarf_Small *mdata = 0;
303*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_end = 0;
304*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_base = 0;
305*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned opcount = 0;
306*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned known_ops_count = 0;
307*4d9fdb46SRobert Mustacchi     struct Dwarf_Macro_Operator_s *opsarray = 0;
308*4d9fdb46SRobert Mustacchi     struct Dwarf_Macro_Operator_s *curopsentry = 0;
309*4d9fdb46SRobert Mustacchi     int res = 0;
310*4d9fdb46SRobert Mustacchi 
311*4d9fdb46SRobert Mustacchi     dbg = macro_context->mc_dbg;
312*4d9fdb46SRobert Mustacchi     if (build_ops_array) {
313*4d9fdb46SRobert Mustacchi         known_ops_count = macro_context->mc_macro_ops_count;
314*4d9fdb46SRobert Mustacchi         opsarray = (struct Dwarf_Macro_Operator_s *)
315*4d9fdb46SRobert Mustacchi             calloc(known_ops_count,sizeof(struct Dwarf_Macro_Operator_s));
316*4d9fdb46SRobert Mustacchi         if(!opsarray) {
317*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
318*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
319*4d9fdb46SRobert Mustacchi         }
320*4d9fdb46SRobert Mustacchi         curopsentry = opsarray;
321*4d9fdb46SRobert Mustacchi         macro_context->mc_ops = opsarray;
322*4d9fdb46SRobert Mustacchi     }
323*4d9fdb46SRobert Mustacchi     section_base = dbg->de_debug_macro.dss_data;
324*4d9fdb46SRobert Mustacchi     section_end = section_base + dbg->de_debug_macro.dss_size;
325*4d9fdb46SRobert Mustacchi     mdata = macro_context->mc_macro_ops;
326*4d9fdb46SRobert Mustacchi 
327*4d9fdb46SRobert Mustacchi     while (mdata < section_end) {
328*4d9fdb46SRobert Mustacchi         Dwarf_Small op = 0;
329*4d9fdb46SRobert Mustacchi 
330*4d9fdb46SRobert Mustacchi         op = *mdata;
331*4d9fdb46SRobert Mustacchi         ++opcount;
332*4d9fdb46SRobert Mustacchi         ++mdata;
333*4d9fdb46SRobert Mustacchi         if (!op) {
334*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned opslen = 0;
335*4d9fdb46SRobert Mustacchi             /*  End of ops, this is terminator, count the ending 0
336*4d9fdb46SRobert Mustacchi                 as an operator so dwarfdump can print it.  */
337*4d9fdb46SRobert Mustacchi             opslen = mdata - macro_context->mc_macro_ops;
338*4d9fdb46SRobert Mustacchi             macro_context->mc_macro_ops_count = opcount;
339*4d9fdb46SRobert Mustacchi             macro_context->mc_ops_data_length = opslen;
340*4d9fdb46SRobert Mustacchi             macro_context->mc_total_length = opslen +
341*4d9fdb46SRobert Mustacchi                 macro_context->mc_macro_header_length;
342*4d9fdb46SRobert Mustacchi             return DW_DLV_OK;
343*4d9fdb46SRobert Mustacchi         }
344*4d9fdb46SRobert Mustacchi         if (is_std_moperator(op)) {
345*4d9fdb46SRobert Mustacchi             struct Dwarf_Macro_Forms_s * ourform =
346*4d9fdb46SRobert Mustacchi                 dw5formsarray + op;
347*4d9fdb46SRobert Mustacchi             /* ASSERT: op == ourform->mf_code */
348*4d9fdb46SRobert Mustacchi             unsigned formcount = ourform->mf_formcount;
349*4d9fdb46SRobert Mustacchi             const Dwarf_Small *forms = ourform->mf_formbytes;
350*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned forms_length = 0;
351*4d9fdb46SRobert Mustacchi 
352*4d9fdb46SRobert Mustacchi             res = _dwarf_skim_forms(dbg,macro_context,mdata,
353*4d9fdb46SRobert Mustacchi                 formcount,forms,
354*4d9fdb46SRobert Mustacchi                 section_end,
355*4d9fdb46SRobert Mustacchi                 &forms_length,error);
356*4d9fdb46SRobert Mustacchi             if ( res != DW_DLV_OK) {
357*4d9fdb46SRobert Mustacchi                 return res;
358*4d9fdb46SRobert Mustacchi             }
359*4d9fdb46SRobert Mustacchi             if(build_ops_array) {
360*4d9fdb46SRobert Mustacchi                 curopsentry->mo_opcode = op;
361*4d9fdb46SRobert Mustacchi                 curopsentry->mo_form = ourform;
362*4d9fdb46SRobert Mustacchi                 curopsentry->mo_data = mdata;
363*4d9fdb46SRobert Mustacchi             }
364*4d9fdb46SRobert Mustacchi             mdata += forms_length;
365*4d9fdb46SRobert Mustacchi         } else {
366*4d9fdb46SRobert Mustacchi             /* FIXME Add support for user defined ops. */
367*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_MACRO_OP_UNHANDLED);
368*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
369*4d9fdb46SRobert Mustacchi         }
370*4d9fdb46SRobert Mustacchi         if (mdata > section_end)  {
371*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_MACRO_PAST_END);
372*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
373*4d9fdb46SRobert Mustacchi         }
374*4d9fdb46SRobert Mustacchi         if (build_ops_array) {
375*4d9fdb46SRobert Mustacchi             curopsentry++;
376*4d9fdb46SRobert Mustacchi         }
377*4d9fdb46SRobert Mustacchi     }
378*4d9fdb46SRobert Mustacchi     _dwarf_error(dbg, error, DW_DLE_MACRO_PAST_END);
379*4d9fdb46SRobert Mustacchi     return DW_DLV_ERROR;
380*4d9fdb46SRobert Mustacchi }
381*4d9fdb46SRobert Mustacchi 
382*4d9fdb46SRobert Mustacchi int
dwarf_get_macro_op(Dwarf_Macro_Context macro_context,Dwarf_Unsigned op_number,Dwarf_Unsigned * op_start_section_offset,Dwarf_Half * macro_operator,Dwarf_Half * forms_count,const Dwarf_Small ** formcode_array,Dwarf_Error * error)383*4d9fdb46SRobert Mustacchi dwarf_get_macro_op(Dwarf_Macro_Context macro_context,
384*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned op_number,
385*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * op_start_section_offset,
386*4d9fdb46SRobert Mustacchi     Dwarf_Half    * macro_operator,
387*4d9fdb46SRobert Mustacchi     Dwarf_Half    * forms_count,
388*4d9fdb46SRobert Mustacchi     const Dwarf_Small **   formcode_array,
389*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
390*4d9fdb46SRobert Mustacchi {
391*4d9fdb46SRobert Mustacchi     struct Dwarf_Macro_Operator_s *curop = 0;
392*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
393*4d9fdb46SRobert Mustacchi     if (!macro_context || macro_context->mc_sentinel != 0xada) {
394*4d9fdb46SRobert Mustacchi         if(macro_context) {
395*4d9fdb46SRobert Mustacchi             dbg = macro_context->mc_dbg;
396*4d9fdb46SRobert Mustacchi         }
397*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,DW_DLE_BAD_MACRO_HEADER_POINTER);
398*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
399*4d9fdb46SRobert Mustacchi     }
400*4d9fdb46SRobert Mustacchi     dbg = macro_context->mc_dbg;
401*4d9fdb46SRobert Mustacchi     if (op_number >= macro_context->mc_macro_ops_count) {
402*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,DW_DLE_BAD_MACRO_INDEX);
403*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
404*4d9fdb46SRobert Mustacchi     }
405*4d9fdb46SRobert Mustacchi     curop = macro_context->mc_ops + op_number;
406*4d9fdb46SRobert Mustacchi 
407*4d9fdb46SRobert Mustacchi     /*  ASSERT: *op_start_section_offset ==
408*4d9fdb46SRobert Mustacchi         (curop->mo_data -1) - dbg->de_debug_macro.dss_data  */
409*4d9fdb46SRobert Mustacchi     *op_start_section_offset =
410*4d9fdb46SRobert Mustacchi         ((curop->mo_data -1) - macro_context->mc_macro_header) +
411*4d9fdb46SRobert Mustacchi         macro_context->mc_section_offset;
412*4d9fdb46SRobert Mustacchi     *macro_operator = curop->mo_opcode;
413*4d9fdb46SRobert Mustacchi     if (curop->mo_form) {
414*4d9fdb46SRobert Mustacchi         *forms_count  = curop->mo_form->mf_formcount;
415*4d9fdb46SRobert Mustacchi         *formcode_array = curop->mo_form->mf_formbytes;
416*4d9fdb46SRobert Mustacchi     } else {
417*4d9fdb46SRobert Mustacchi         /* ASSERT: macro_operator == 0 */
418*4d9fdb46SRobert Mustacchi         *forms_count  = 0;
419*4d9fdb46SRobert Mustacchi         *formcode_array = 0;
420*4d9fdb46SRobert Mustacchi     }
421*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
422*4d9fdb46SRobert Mustacchi }
423*4d9fdb46SRobert Mustacchi 
424*4d9fdb46SRobert Mustacchi 
425*4d9fdb46SRobert Mustacchi /*  Here a DW_DLV_NO_ENTRY return means the macro operator
426*4d9fdb46SRobert Mustacchi     is not a def/undef operator. */
427*4d9fdb46SRobert Mustacchi int
dwarf_get_macro_defundef(Dwarf_Macro_Context macro_context,Dwarf_Unsigned op_number,Dwarf_Unsigned * line_number,Dwarf_Unsigned * index,Dwarf_Unsigned * offset,Dwarf_Half * forms_count,const char ** macro_string,Dwarf_Error * error)428*4d9fdb46SRobert Mustacchi dwarf_get_macro_defundef(Dwarf_Macro_Context macro_context,
429*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned op_number,
430*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * line_number,
431*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * index,
432*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * offset,
433*4d9fdb46SRobert Mustacchi     Dwarf_Half     * forms_count,
434*4d9fdb46SRobert Mustacchi     const char     ** macro_string,
435*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
436*4d9fdb46SRobert Mustacchi {
437*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
438*4d9fdb46SRobert Mustacchi     Dwarf_Small *mdata = 0;
439*4d9fdb46SRobert Mustacchi     int res = 0;
440*4d9fdb46SRobert Mustacchi     Dwarf_Small *startptr = 0;
441*4d9fdb46SRobert Mustacchi     Dwarf_Small *endptr = 0;
442*4d9fdb46SRobert Mustacchi     Dwarf_Half lformscount = 0;
443*4d9fdb46SRobert Mustacchi     struct Dwarf_Macro_Operator_s *curop = 0;
444*4d9fdb46SRobert Mustacchi     unsigned macop = 0;
445*4d9fdb46SRobert Mustacchi 
446*4d9fdb46SRobert Mustacchi     if (!macro_context || macro_context->mc_sentinel != 0xada) {
447*4d9fdb46SRobert Mustacchi         if(macro_context) {
448*4d9fdb46SRobert Mustacchi             dbg = macro_context->mc_dbg;
449*4d9fdb46SRobert Mustacchi         }
450*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,DW_DLE_BAD_MACRO_HEADER_POINTER);
451*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
452*4d9fdb46SRobert Mustacchi     }
453*4d9fdb46SRobert Mustacchi     dbg = macro_context->mc_dbg;
454*4d9fdb46SRobert Mustacchi     if (op_number >= macro_context->mc_macro_ops_count) {
455*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,DW_DLE_BAD_MACRO_INDEX);
456*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
457*4d9fdb46SRobert Mustacchi     }
458*4d9fdb46SRobert Mustacchi     curop = macro_context->mc_ops + op_number;
459*4d9fdb46SRobert Mustacchi     macop = curop->mo_opcode;
460*4d9fdb46SRobert Mustacchi     startptr = macro_context->mc_macro_header;
461*4d9fdb46SRobert Mustacchi     endptr = startptr + macro_context->mc_total_length;
462*4d9fdb46SRobert Mustacchi     mdata = curop->mo_data;
463*4d9fdb46SRobert Mustacchi     lformscount = curop->mo_form->mf_formcount;
464*4d9fdb46SRobert Mustacchi     if (lformscount != 2) {
465*4d9fdb46SRobert Mustacchi         /*_dwarf_error(dbg, error,DW_DLE_MACRO_OPCODE_FORM_BAD);*/
466*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
467*4d9fdb46SRobert Mustacchi     }
468*4d9fdb46SRobert Mustacchi     switch(macop){
469*4d9fdb46SRobert Mustacchi     case DW_MACRO_define:
470*4d9fdb46SRobert Mustacchi     case DW_MACRO_undef: {
471*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned linenum = 0;
472*4d9fdb46SRobert Mustacchi         const char * content = 0;
473*4d9fdb46SRobert Mustacchi 
474*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(mdata,linenum,
475*4d9fdb46SRobert Mustacchi             dbg, error,endptr);
476*4d9fdb46SRobert Mustacchi         content = (const char *)mdata;
477*4d9fdb46SRobert Mustacchi         res = _dwarf_check_string_valid(dbg,
478*4d9fdb46SRobert Mustacchi             startptr,mdata, endptr,
479*4d9fdb46SRobert Mustacchi             DW_DLE_MACRO_STRING_BAD,error);
480*4d9fdb46SRobert Mustacchi         if(res != DW_DLV_OK) {
481*4d9fdb46SRobert Mustacchi             return res;
482*4d9fdb46SRobert Mustacchi         }
483*4d9fdb46SRobert Mustacchi         *line_number = linenum;
484*4d9fdb46SRobert Mustacchi         *index = 0;
485*4d9fdb46SRobert Mustacchi         *offset = 0;
486*4d9fdb46SRobert Mustacchi         *forms_count = lformscount;
487*4d9fdb46SRobert Mustacchi         *macro_string = content;
488*4d9fdb46SRobert Mustacchi         }
489*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
490*4d9fdb46SRobert Mustacchi     case DW_MACRO_define_strp:
491*4d9fdb46SRobert Mustacchi     case DW_MACRO_undef_strp: {
492*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned linenum = 0;
493*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned stringoffset = 0;
494*4d9fdb46SRobert Mustacchi         Dwarf_Small form1 =  curop->mo_form->mf_formbytes[1];
495*4d9fdb46SRobert Mustacchi         char * localstr = 0;
496*4d9fdb46SRobert Mustacchi 
497*4d9fdb46SRobert Mustacchi 
498*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(mdata,linenum,
499*4d9fdb46SRobert Mustacchi             dbg, error,endptr);
500*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg,stringoffset,Dwarf_Unsigned,
501*4d9fdb46SRobert Mustacchi             mdata,macro_context->mc_offset_size,
502*4d9fdb46SRobert Mustacchi             error,endptr);
503*4d9fdb46SRobert Mustacchi         res = _dwarf_extract_local_debug_str_string_given_offset(dbg,
504*4d9fdb46SRobert Mustacchi             form1,
505*4d9fdb46SRobert Mustacchi             stringoffset,
506*4d9fdb46SRobert Mustacchi             &localstr,
507*4d9fdb46SRobert Mustacchi             error);
508*4d9fdb46SRobert Mustacchi         *index = 0;
509*4d9fdb46SRobert Mustacchi         *line_number = linenum;
510*4d9fdb46SRobert Mustacchi         *offset = stringoffset;
511*4d9fdb46SRobert Mustacchi         *forms_count = lformscount;
512*4d9fdb46SRobert Mustacchi         if (res == DW_DLV_ERROR) {
513*4d9fdb46SRobert Mustacchi             *macro_string = "<Error: getting local .debug_str>";
514*4d9fdb46SRobert Mustacchi             return res;
515*4d9fdb46SRobert Mustacchi         } else if (res == DW_DLV_NO_ENTRY) {
516*4d9fdb46SRobert Mustacchi             *macro_string = "<Error: NO_ENTRY on .debug_string (strp)>";
517*4d9fdb46SRobert Mustacchi         } else {
518*4d9fdb46SRobert Mustacchi             *macro_string = (const char *)localstr;
519*4d9fdb46SRobert Mustacchi         }
520*4d9fdb46SRobert Mustacchi         }
521*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
522*4d9fdb46SRobert Mustacchi     case DW_MACRO_define_strx:
523*4d9fdb46SRobert Mustacchi     case DW_MACRO_undef_strx: {
524*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned linenum = 0;
525*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned stringindex = 0;
526*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned offsettostr= 0;
527*4d9fdb46SRobert Mustacchi         int ress = 0;
528*4d9fdb46SRobert Mustacchi         Dwarf_Byte_Ptr mdata_copy = 0;
529*4d9fdb46SRobert Mustacchi         Dwarf_Small form1 =  curop->mo_form->mf_formbytes[1];
530*4d9fdb46SRobert Mustacchi 
531*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(mdata,linenum, dbg, error,endptr);
532*4d9fdb46SRobert Mustacchi         *line_number = linenum;
533*4d9fdb46SRobert Mustacchi         mdata_copy = mdata;
534*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(mdata_copy,stringindex, dbg, error,endptr);
535*4d9fdb46SRobert Mustacchi         /* mdata_copy is for call below */
536*4d9fdb46SRobert Mustacchi 
537*4d9fdb46SRobert Mustacchi 
538*4d9fdb46SRobert Mustacchi         *index = stringindex;
539*4d9fdb46SRobert Mustacchi         *forms_count = lformscount;
540*4d9fdb46SRobert Mustacchi 
541*4d9fdb46SRobert Mustacchi         /* Redoes the index-getting. Gets offset. */
542*4d9fdb46SRobert Mustacchi         ress = _dwarf_extract_string_offset_via_str_offsets(dbg,
543*4d9fdb46SRobert Mustacchi             mdata_copy,
544*4d9fdb46SRobert Mustacchi             endptr,
545*4d9fdb46SRobert Mustacchi             DW_AT_macros, /*arbitrary, unused by called routine. */
546*4d9fdb46SRobert Mustacchi             form1,
547*4d9fdb46SRobert Mustacchi             macro_context->mc_cu_context,
548*4d9fdb46SRobert Mustacchi             &offsettostr,
549*4d9fdb46SRobert Mustacchi             error);
550*4d9fdb46SRobert Mustacchi         if (ress  == DW_DLV_ERROR) {
551*4d9fdb46SRobert Mustacchi             return ress;
552*4d9fdb46SRobert Mustacchi         }
553*4d9fdb46SRobert Mustacchi         if (ress == DW_DLV_OK) {
554*4d9fdb46SRobert Mustacchi             char *localstr = 0;
555*4d9fdb46SRobert Mustacchi 
556*4d9fdb46SRobert Mustacchi             *index = stringindex;
557*4d9fdb46SRobert Mustacchi             *offset = offsettostr;
558*4d9fdb46SRobert Mustacchi             ress = _dwarf_extract_local_debug_str_string_given_offset(dbg,
559*4d9fdb46SRobert Mustacchi                 form1,
560*4d9fdb46SRobert Mustacchi                 offsettostr,
561*4d9fdb46SRobert Mustacchi                 &localstr,
562*4d9fdb46SRobert Mustacchi                 error);
563*4d9fdb46SRobert Mustacchi             if(ress == DW_DLV_ERROR) {
564*4d9fdb46SRobert Mustacchi                 return ress;
565*4d9fdb46SRobert Mustacchi             } else if (ress == DW_DLV_NO_ENTRY){
566*4d9fdb46SRobert Mustacchi                 *macro_string = "<:No string available>";
567*4d9fdb46SRobert Mustacchi             } else {
568*4d9fdb46SRobert Mustacchi                 *macro_string = (const char *)localstr;
569*4d9fdb46SRobert Mustacchi                 /* All is ok. */
570*4d9fdb46SRobert Mustacchi             }
571*4d9fdb46SRobert Mustacchi         } else {
572*4d9fdb46SRobert Mustacchi             *index = stringindex;
573*4d9fdb46SRobert Mustacchi             *offset = 0;
574*4d9fdb46SRobert Mustacchi             *macro_string = "<.debug_str_offsets not available>";
575*4d9fdb46SRobert Mustacchi         }
576*4d9fdb46SRobert Mustacchi         }
577*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
578*4d9fdb46SRobert Mustacchi     case DW_MACRO_define_sup:
579*4d9fdb46SRobert Mustacchi     case DW_MACRO_undef_sup: {
580*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned linenum = 0;
581*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned supoffset = 0;
582*4d9fdb46SRobert Mustacchi         char *localstring = 0;
583*4d9fdb46SRobert Mustacchi         int resup = 0;
584*4d9fdb46SRobert Mustacchi         Dwarf_Error lerr = 0;
585*4d9fdb46SRobert Mustacchi 
586*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(mdata,linenum,
587*4d9fdb46SRobert Mustacchi             dbg, error,endptr);
588*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg,supoffset,Dwarf_Unsigned,
589*4d9fdb46SRobert Mustacchi             mdata,macro_context->mc_offset_size,
590*4d9fdb46SRobert Mustacchi             error,endptr);
591*4d9fdb46SRobert Mustacchi         *line_number = linenum;
592*4d9fdb46SRobert Mustacchi         *index = 0;
593*4d9fdb46SRobert Mustacchi         *offset = supoffset;
594*4d9fdb46SRobert Mustacchi         *forms_count = lformscount;
595*4d9fdb46SRobert Mustacchi         resup = _dwarf_get_string_from_tied(dbg, supoffset,
596*4d9fdb46SRobert Mustacchi             &localstring, &lerr);
597*4d9fdb46SRobert Mustacchi         if (resup != DW_DLV_OK) {
598*4d9fdb46SRobert Mustacchi             if (resup == DW_DLV_ERROR) {
599*4d9fdb46SRobert Mustacchi                 int myerrno = dwarf_errno(lerr);
600*4d9fdb46SRobert Mustacchi                 if(myerrno == DW_DLE_NO_TIED_FILE_AVAILABLE) {
601*4d9fdb46SRobert Mustacchi                     *macro_string =
602*4d9fdb46SRobert Mustacchi                         (char *)"<DW_FORM_str_sup-no-tied_file>";
603*4d9fdb46SRobert Mustacchi                 } else {
604*4d9fdb46SRobert Mustacchi                     _dwarf_error(dbg,error,myerrno);
605*4d9fdb46SRobert Mustacchi                     *macro_string =
606*4d9fdb46SRobert Mustacchi                         (char *)"<Error: DW_FORM_str_sup-got-error>";
607*4d9fdb46SRobert Mustacchi                 }
608*4d9fdb46SRobert Mustacchi                 dwarf_dealloc(dbg,lerr,DW_DLA_ERROR);
609*4d9fdb46SRobert Mustacchi             } else {
610*4d9fdb46SRobert Mustacchi                 *macro_string = "<DW_FORM_str_sup-no-entry>";
611*4d9fdb46SRobert Mustacchi             }
612*4d9fdb46SRobert Mustacchi             return resup;
613*4d9fdb46SRobert Mustacchi         }
614*4d9fdb46SRobert Mustacchi         *macro_string = (const char *)localstring;
615*4d9fdb46SRobert Mustacchi         /*  If NO ENTRY available, return DW_DLV_NO_ENTRY.
616*4d9fdb46SRobert Mustacchi             We suspect this is better than DW_DLV_OK.  */
617*4d9fdb46SRobert Mustacchi         return resup;
618*4d9fdb46SRobert Mustacchi         }
619*4d9fdb46SRobert Mustacchi     default:
620*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,DW_DLE_MACRO_OP_UNHANDLED);
621*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
622*4d9fdb46SRobert Mustacchi     }
623*4d9fdb46SRobert Mustacchi     return DW_DLV_NO_ENTRY;
624*4d9fdb46SRobert Mustacchi }
625*4d9fdb46SRobert Mustacchi 
626*4d9fdb46SRobert Mustacchi /*  ASSERT: we elsewhere guarantee room to copy into.
627*4d9fdb46SRobert Mustacchi     If trimtarg ==1, trim trailing slash in targ.
628*4d9fdb46SRobert Mustacchi     Caller should not pass in 'src'
629*4d9fdb46SRobert Mustacchi     with leading /  */
630*4d9fdb46SRobert Mustacchi static void
specialcat(char * targ,char * src,int trimtarg)631*4d9fdb46SRobert Mustacchi specialcat(char *targ,char *src,int trimtarg)
632*4d9fdb46SRobert Mustacchi {
633*4d9fdb46SRobert Mustacchi     char *last = 0;
634*4d9fdb46SRobert Mustacchi 
635*4d9fdb46SRobert Mustacchi     while( *targ) {
636*4d9fdb46SRobert Mustacchi         last = targ;
637*4d9fdb46SRobert Mustacchi         targ++;
638*4d9fdb46SRobert Mustacchi     }
639*4d9fdb46SRobert Mustacchi     /* TARG now points at terminating NUL */
640*4d9fdb46SRobert Mustacchi     /* LAST points at final character in targ. */
641*4d9fdb46SRobert Mustacchi     if (trimtarg ) {
642*4d9fdb46SRobert Mustacchi         if(last && *last == '/') {
643*4d9fdb46SRobert Mustacchi             /* Truncate. */
644*4d9fdb46SRobert Mustacchi             *last = 0;
645*4d9fdb46SRobert Mustacchi             targ = last;
646*4d9fdb46SRobert Mustacchi             /* TARG again points at terminating NUL */
647*4d9fdb46SRobert Mustacchi         }
648*4d9fdb46SRobert Mustacchi     }
649*4d9fdb46SRobert Mustacchi     while (*src) {
650*4d9fdb46SRobert Mustacchi         *targ = *src;
651*4d9fdb46SRobert Mustacchi         targ++;
652*4d9fdb46SRobert Mustacchi         src++;
653*4d9fdb46SRobert Mustacchi     }
654*4d9fdb46SRobert Mustacchi     *targ = 0;
655*4d9fdb46SRobert Mustacchi }
656*4d9fdb46SRobert Mustacchi 
657*4d9fdb46SRobert Mustacchi /* If returns NULL caller must handle it. */
658*4d9fdb46SRobert Mustacchi static const char *
construct_from_dir_and_name(const char * dir,const char * name)659*4d9fdb46SRobert Mustacchi construct_from_dir_and_name(const char *dir,
660*4d9fdb46SRobert Mustacchi    const char *name)
661*4d9fdb46SRobert Mustacchi {
662*4d9fdb46SRobert Mustacchi     int truelen = 0;
663*4d9fdb46SRobert Mustacchi     char *final = 0;
664*4d9fdb46SRobert Mustacchi 
665*4d9fdb46SRobert Mustacchi     /* Allow for NUL char and added /  */
666*4d9fdb46SRobert Mustacchi     truelen = strlen(dir) + strlen(name) + 1 +1;
667*4d9fdb46SRobert Mustacchi     final = (char *)malloc(truelen);
668*4d9fdb46SRobert Mustacchi     if(!final) {
669*4d9fdb46SRobert Mustacchi         return NULL;
670*4d9fdb46SRobert Mustacchi     }
671*4d9fdb46SRobert Mustacchi     final[0] = 0;
672*4d9fdb46SRobert Mustacchi     specialcat(final,(char *)dir,1);
673*4d9fdb46SRobert Mustacchi     strcat(final,"/");
674*4d9fdb46SRobert Mustacchi     specialcat(final,(char *)name,0);
675*4d9fdb46SRobert Mustacchi     return final;
676*4d9fdb46SRobert Mustacchi }
677*4d9fdb46SRobert Mustacchi 
678*4d9fdb46SRobert Mustacchi /* If returns NULL caller must handle it. */
679*4d9fdb46SRobert Mustacchi static const char *
construct_at_path_from_parts(Dwarf_Macro_Context mc)680*4d9fdb46SRobert Mustacchi construct_at_path_from_parts(Dwarf_Macro_Context mc)
681*4d9fdb46SRobert Mustacchi {
682*4d9fdb46SRobert Mustacchi     if (mc->mc_file_path) {
683*4d9fdb46SRobert Mustacchi         return mc->mc_file_path;
684*4d9fdb46SRobert Mustacchi     }
685*4d9fdb46SRobert Mustacchi     if(!mc->mc_at_comp_dir || !mc->mc_at_comp_dir[0]) {
686*4d9fdb46SRobert Mustacchi         return mc->mc_at_name;
687*4d9fdb46SRobert Mustacchi     }
688*4d9fdb46SRobert Mustacchi     if (!mc->mc_at_name || !mc->mc_at_name[0]) {
689*4d9fdb46SRobert Mustacchi         return NULL;
690*4d9fdb46SRobert Mustacchi     }
691*4d9fdb46SRobert Mustacchi     if(_dwarf_file_name_is_full_path((Dwarf_Small *)mc->mc_at_name)) {
692*4d9fdb46SRobert Mustacchi         return mc->mc_at_name;
693*4d9fdb46SRobert Mustacchi     }
694*4d9fdb46SRobert Mustacchi     /* Dwarf_Macro_Context destructor will free this. */
695*4d9fdb46SRobert Mustacchi     mc->mc_file_path = construct_from_dir_and_name(
696*4d9fdb46SRobert Mustacchi         mc->mc_at_comp_dir,mc->mc_at_name);
697*4d9fdb46SRobert Mustacchi     return mc->mc_file_path;
698*4d9fdb46SRobert Mustacchi }
699*4d9fdb46SRobert Mustacchi 
700*4d9fdb46SRobert Mustacchi 
701*4d9fdb46SRobert Mustacchi int
dwarf_get_macro_startend_file(Dwarf_Macro_Context macro_context,Dwarf_Unsigned op_number,Dwarf_Unsigned * line_number,Dwarf_Unsigned * name_index_to_line_tab,const char ** src_file_name,Dwarf_Error * error)702*4d9fdb46SRobert Mustacchi dwarf_get_macro_startend_file(Dwarf_Macro_Context macro_context,
703*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned op_number,
704*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * line_number,
705*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * name_index_to_line_tab,
706*4d9fdb46SRobert Mustacchi     const char     ** src_file_name,
707*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
708*4d9fdb46SRobert Mustacchi {
709*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
710*4d9fdb46SRobert Mustacchi     Dwarf_Small *mdata = 0;
711*4d9fdb46SRobert Mustacchi     unsigned macop = 0;
712*4d9fdb46SRobert Mustacchi     struct Dwarf_Macro_Operator_s *curop = 0;
713*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr startptr =  0;
714*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr endptr =  0;
715*4d9fdb46SRobert Mustacchi 
716*4d9fdb46SRobert Mustacchi     if (!macro_context || macro_context->mc_sentinel != 0xada) {
717*4d9fdb46SRobert Mustacchi         if(macro_context) {
718*4d9fdb46SRobert Mustacchi             dbg = macro_context->mc_dbg;
719*4d9fdb46SRobert Mustacchi         }
720*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,DW_DLE_BAD_MACRO_HEADER_POINTER);
721*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
722*4d9fdb46SRobert Mustacchi     }
723*4d9fdb46SRobert Mustacchi     dbg = macro_context->mc_dbg;
724*4d9fdb46SRobert Mustacchi     if (op_number >= macro_context->mc_macro_ops_count) {
725*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,DW_DLE_BAD_MACRO_INDEX);
726*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
727*4d9fdb46SRobert Mustacchi     }
728*4d9fdb46SRobert Mustacchi     startptr = macro_context->mc_macro_header;
729*4d9fdb46SRobert Mustacchi     endptr = startptr + macro_context->mc_total_length;
730*4d9fdb46SRobert Mustacchi 
731*4d9fdb46SRobert Mustacchi     curop = macro_context->mc_ops + op_number;
732*4d9fdb46SRobert Mustacchi     macop = curop->mo_opcode;
733*4d9fdb46SRobert Mustacchi     mdata = curop->mo_data;
734*4d9fdb46SRobert Mustacchi     if (macop != DW_MACRO_start_file && macop != DW_MACRO_end_file) {
735*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
736*4d9fdb46SRobert Mustacchi     }
737*4d9fdb46SRobert Mustacchi     if (macop == DW_MACRO_start_file) {
738*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned linenum = 0;
739*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned srcindex = 0;
740*4d9fdb46SRobert Mustacchi         Dwarf_Signed trueindex = 0;
741*4d9fdb46SRobert Mustacchi 
742*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(mdata,linenum, dbg, error,endptr);
743*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(mdata,srcindex, dbg, error,endptr);
744*4d9fdb46SRobert Mustacchi         *line_number = linenum;
745*4d9fdb46SRobert Mustacchi         *name_index_to_line_tab = srcindex;
746*4d9fdb46SRobert Mustacchi         /*  For DWARF 2,3,4, decrement by 1.
747*4d9fdb46SRobert Mustacchi             FOR DWARF 5 do not decrement. */
748*4d9fdb46SRobert Mustacchi         if(macro_context->mc_version_number >= 5) {
749*4d9fdb46SRobert Mustacchi             trueindex = srcindex;
750*4d9fdb46SRobert Mustacchi             if (trueindex < 0) {
751*4d9fdb46SRobert Mustacchi                 *src_file_name = "<source-file-index-low-no-name-available>";
752*4d9fdb46SRobert Mustacchi                 return DW_DLV_OK;
753*4d9fdb46SRobert Mustacchi             }
754*4d9fdb46SRobert Mustacchi             if (trueindex < macro_context->mc_srcfiles_count) {
755*4d9fdb46SRobert Mustacchi                 *src_file_name = macro_context->mc_srcfiles[trueindex];
756*4d9fdb46SRobert Mustacchi                 return DW_DLV_OK;
757*4d9fdb46SRobert Mustacchi             } else {
758*4d9fdb46SRobert Mustacchi                 *src_file_name =
759*4d9fdb46SRobert Mustacchi                     "<src-index-high-no-source-file-name-available>";
760*4d9fdb46SRobert Mustacchi                 return DW_DLV_OK;
761*4d9fdb46SRobert Mustacchi             }
762*4d9fdb46SRobert Mustacchi         } else {
763*4d9fdb46SRobert Mustacchi             /* Unsigned to signed here. */
764*4d9fdb46SRobert Mustacchi             trueindex = srcindex;
765*4d9fdb46SRobert Mustacchi             /* Protects against crazy big srcindex, overflow territory. */
766*4d9fdb46SRobert Mustacchi             if (trueindex < 0 ) {
767*4d9fdb46SRobert Mustacchi                 /* Something insane here. */
768*4d9fdb46SRobert Mustacchi                 *src_file_name = "<source-file-index-low-no-name-available>";
769*4d9fdb46SRobert Mustacchi                 return DW_DLV_OK;
770*4d9fdb46SRobert Mustacchi             }
771*4d9fdb46SRobert Mustacchi             /* Protects against crazy big srcindex, overflow territory. */
772*4d9fdb46SRobert Mustacchi             if (trueindex > (macro_context->mc_srcfiles_count+1)) {
773*4d9fdb46SRobert Mustacchi                 /* Something insane here. */
774*4d9fdb46SRobert Mustacchi                 *src_file_name =
775*4d9fdb46SRobert Mustacchi                     "<source-file-index-high-no-name-available>";
776*4d9fdb46SRobert Mustacchi                 return DW_DLV_OK;
777*4d9fdb46SRobert Mustacchi             }
778*4d9fdb46SRobert Mustacchi             --trueindex;
779*4d9fdb46SRobert Mustacchi             if (trueindex > macro_context->mc_srcfiles_count) {
780*4d9fdb46SRobert Mustacchi                 *src_file_name =
781*4d9fdb46SRobert Mustacchi                     "<adjusted-source-file-index-high-no-name-available>";
782*4d9fdb46SRobert Mustacchi             }
783*4d9fdb46SRobert Mustacchi             if (srcindex > 0 &&
784*4d9fdb46SRobert Mustacchi                 trueindex < macro_context->mc_srcfiles_count) {
785*4d9fdb46SRobert Mustacchi                 *src_file_name = macro_context->mc_srcfiles[trueindex];
786*4d9fdb46SRobert Mustacchi             } else {
787*4d9fdb46SRobert Mustacchi                 const char *mcatcomp = construct_at_path_from_parts(
788*4d9fdb46SRobert Mustacchi                     macro_context);
789*4d9fdb46SRobert Mustacchi                 if(mcatcomp) {
790*4d9fdb46SRobert Mustacchi                     *src_file_name = mcatcomp;
791*4d9fdb46SRobert Mustacchi                 } else {
792*4d9fdb46SRobert Mustacchi                     *src_file_name = "<no-source-file-name-available>";
793*4d9fdb46SRobert Mustacchi                 }
794*4d9fdb46SRobert Mustacchi             }
795*4d9fdb46SRobert Mustacchi         }
796*4d9fdb46SRobert Mustacchi     } else {
797*4d9fdb46SRobert Mustacchi         /* DW_MACRO_end_file. No operands. */
798*4d9fdb46SRobert Mustacchi     }
799*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
800*4d9fdb46SRobert Mustacchi }
801*4d9fdb46SRobert Mustacchi 
802*4d9fdb46SRobert Mustacchi /*  Target_offset is the offset in a .debug_macro section,
803*4d9fdb46SRobert Mustacchi     of a macro unit header.
804*4d9fdb46SRobert Mustacchi     Returns DW_DLV_NO_ENTRY if the macro operator is not
805*4d9fdb46SRobert Mustacchi     one of the import operators.  */
806*4d9fdb46SRobert Mustacchi int
dwarf_get_macro_import(Dwarf_Macro_Context macro_context,Dwarf_Unsigned op_number,Dwarf_Unsigned * target_offset,Dwarf_Error * error)807*4d9fdb46SRobert Mustacchi dwarf_get_macro_import(Dwarf_Macro_Context macro_context,
808*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   op_number,
809*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * target_offset,
810*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
811*4d9fdb46SRobert Mustacchi {
812*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned supoffset = 0;
813*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
814*4d9fdb46SRobert Mustacchi     unsigned macop = 0;
815*4d9fdb46SRobert Mustacchi     struct Dwarf_Macro_Operator_s *curop = 0;
816*4d9fdb46SRobert Mustacchi     Dwarf_Small *mdata = 0;
817*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr startptr =  0;
818*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr endptr =  0;
819*4d9fdb46SRobert Mustacchi 
820*4d9fdb46SRobert Mustacchi     if (!macro_context || macro_context->mc_sentinel != 0xada) {
821*4d9fdb46SRobert Mustacchi         if(macro_context) {
822*4d9fdb46SRobert Mustacchi             dbg = macro_context->mc_dbg;
823*4d9fdb46SRobert Mustacchi         }
824*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,DW_DLE_BAD_MACRO_HEADER_POINTER);
825*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
826*4d9fdb46SRobert Mustacchi     }
827*4d9fdb46SRobert Mustacchi     startptr = macro_context->mc_macro_header;
828*4d9fdb46SRobert Mustacchi     endptr = startptr + macro_context->mc_total_length;
829*4d9fdb46SRobert Mustacchi     dbg = macro_context->mc_dbg;
830*4d9fdb46SRobert Mustacchi     if (op_number >= macro_context->mc_macro_ops_count) {
831*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,DW_DLE_BAD_MACRO_INDEX);
832*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
833*4d9fdb46SRobert Mustacchi     }
834*4d9fdb46SRobert Mustacchi     curop = macro_context->mc_ops + op_number;
835*4d9fdb46SRobert Mustacchi     macop = curop->mo_opcode;
836*4d9fdb46SRobert Mustacchi     mdata = curop->mo_data;
837*4d9fdb46SRobert Mustacchi     if (macop != DW_MACRO_import && macop != DW_MACRO_import_sup) {
838*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
839*4d9fdb46SRobert Mustacchi     }
840*4d9fdb46SRobert Mustacchi     READ_UNALIGNED_CK(dbg,supoffset,Dwarf_Unsigned,
841*4d9fdb46SRobert Mustacchi         mdata,macro_context->mc_offset_size,
842*4d9fdb46SRobert Mustacchi         error,endptr);
843*4d9fdb46SRobert Mustacchi     *target_offset = supoffset;
844*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
845*4d9fdb46SRobert Mustacchi }
846*4d9fdb46SRobert Mustacchi 
847*4d9fdb46SRobert Mustacchi /* */
848*4d9fdb46SRobert Mustacchi static int
valid_macro_form(Dwarf_Half form)849*4d9fdb46SRobert Mustacchi valid_macro_form(Dwarf_Half form)
850*4d9fdb46SRobert Mustacchi {
851*4d9fdb46SRobert Mustacchi     switch(form) {
852*4d9fdb46SRobert Mustacchi     case DW_FORM_block:
853*4d9fdb46SRobert Mustacchi     case DW_FORM_block1:
854*4d9fdb46SRobert Mustacchi     case DW_FORM_block2:
855*4d9fdb46SRobert Mustacchi     case DW_FORM_block4:
856*4d9fdb46SRobert Mustacchi     case DW_FORM_data1:
857*4d9fdb46SRobert Mustacchi     case DW_FORM_data2:
858*4d9fdb46SRobert Mustacchi     case DW_FORM_data4:
859*4d9fdb46SRobert Mustacchi     case DW_FORM_data8:
860*4d9fdb46SRobert Mustacchi     case DW_FORM_data16:
861*4d9fdb46SRobert Mustacchi     case DW_FORM_sdata:
862*4d9fdb46SRobert Mustacchi     case DW_FORM_udata:
863*4d9fdb46SRobert Mustacchi     case DW_FORM_flag:
864*4d9fdb46SRobert Mustacchi     case DW_FORM_sec_offset:
865*4d9fdb46SRobert Mustacchi     case DW_FORM_string:
866*4d9fdb46SRobert Mustacchi     case DW_FORM_strp:
867*4d9fdb46SRobert Mustacchi     case DW_FORM_strx:
868*4d9fdb46SRobert Mustacchi         return TRUE;
869*4d9fdb46SRobert Mustacchi     }
870*4d9fdb46SRobert Mustacchi     return FALSE;
871*4d9fdb46SRobert Mustacchi }
872*4d9fdb46SRobert Mustacchi 
873*4d9fdb46SRobert Mustacchi static int
validate_opcode(Dwarf_Debug dbg,struct Dwarf_Macro_Forms_s * curform,Dwarf_Error * error)874*4d9fdb46SRobert Mustacchi validate_opcode(Dwarf_Debug dbg,
875*4d9fdb46SRobert Mustacchi    struct Dwarf_Macro_Forms_s *curform,
876*4d9fdb46SRobert Mustacchi    Dwarf_Error * error)
877*4d9fdb46SRobert Mustacchi {
878*4d9fdb46SRobert Mustacchi     unsigned i = 0;
879*4d9fdb46SRobert Mustacchi     struct Dwarf_Macro_Forms_s *stdfptr = 0;
880*4d9fdb46SRobert Mustacchi     if (curform->mf_code >= DW_MACRO_lo_user) {
881*4d9fdb46SRobert Mustacchi         /* Nothing to check. user level. */
882*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
883*4d9fdb46SRobert Mustacchi     }
884*4d9fdb46SRobert Mustacchi     if (curform->mf_code > DW_MACRO_undef_strx) {
885*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_MACRO_OPCODE_BAD);
886*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
887*4d9fdb46SRobert Mustacchi     }
888*4d9fdb46SRobert Mustacchi     if (!curform->mf_code){
889*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_MACRO_OPCODE_BAD);
890*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
891*4d9fdb46SRobert Mustacchi     }
892*4d9fdb46SRobert Mustacchi     stdfptr = &dwarf_default_macro_opslist.mol_data[curform->mf_code];
893*4d9fdb46SRobert Mustacchi 
894*4d9fdb46SRobert Mustacchi     if (curform->mf_formcount != stdfptr->mf_formcount) {
895*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_MACRO_OPCODE_FORM_BAD);
896*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
897*4d9fdb46SRobert Mustacchi     }
898*4d9fdb46SRobert Mustacchi     for(i = 0; i < curform->mf_formcount; ++i) {
899*4d9fdb46SRobert Mustacchi         if (curform->mf_formbytes[i] != stdfptr->mf_formbytes[1]) {
900*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_MACRO_OPCODE_FORM_BAD);
901*4d9fdb46SRobert Mustacchi             return (DW_DLV_ERROR);
902*4d9fdb46SRobert Mustacchi         }
903*4d9fdb46SRobert Mustacchi     }
904*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
905*4d9fdb46SRobert Mustacchi }
906*4d9fdb46SRobert Mustacchi 
907*4d9fdb46SRobert Mustacchi static int
read_operands_table(Dwarf_Macro_Context macro_context,Dwarf_Small * macro_header,Dwarf_Small * macro_data,Dwarf_Small * section_base,Dwarf_Unsigned section_size,Dwarf_Unsigned * table_size_out,Dwarf_Error * error)908*4d9fdb46SRobert Mustacchi read_operands_table(Dwarf_Macro_Context macro_context,
909*4d9fdb46SRobert Mustacchi     Dwarf_Small * macro_header,
910*4d9fdb46SRobert Mustacchi     Dwarf_Small * macro_data,
911*4d9fdb46SRobert Mustacchi     Dwarf_Small * section_base,
912*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned section_size,
913*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *table_size_out,
914*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
915*4d9fdb46SRobert Mustacchi {
916*4d9fdb46SRobert Mustacchi     Dwarf_Small* table_data_start = macro_data;
917*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned local_size = 0;
918*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cur_offset = 0;
919*4d9fdb46SRobert Mustacchi     Dwarf_Small operand_table_count = 0;
920*4d9fdb46SRobert Mustacchi     unsigned i = 0;
921*4d9fdb46SRobert Mustacchi     struct Dwarf_Macro_Forms_s *curformentry = 0;
922*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
923*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr startptr = 0;
924*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr endptr = 0;
925*4d9fdb46SRobert Mustacchi 
926*4d9fdb46SRobert Mustacchi     if (!macro_context || macro_context->mc_sentinel != 0xada) {
927*4d9fdb46SRobert Mustacchi         if(macro_context) {
928*4d9fdb46SRobert Mustacchi             dbg = macro_context->mc_dbg;
929*4d9fdb46SRobert Mustacchi         }
930*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,DW_DLE_BAD_MACRO_HEADER_POINTER);
931*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
932*4d9fdb46SRobert Mustacchi     }
933*4d9fdb46SRobert Mustacchi 
934*4d9fdb46SRobert Mustacchi     dbg = macro_context->mc_dbg;
935*4d9fdb46SRobert Mustacchi     cur_offset = (1+ macro_data) - macro_header;
936*4d9fdb46SRobert Mustacchi     if (cur_offset >= section_size) {
937*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_MACRO_OFFSET_BAD);
938*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
939*4d9fdb46SRobert Mustacchi     }
940*4d9fdb46SRobert Mustacchi 
941*4d9fdb46SRobert Mustacchi     startptr = macro_context->mc_macro_header;
942*4d9fdb46SRobert Mustacchi     endptr = startptr + macro_context->mc_total_length;
943*4d9fdb46SRobert Mustacchi     READ_UNALIGNED_CK(dbg,operand_table_count,Dwarf_Small,
944*4d9fdb46SRobert Mustacchi         macro_data,sizeof(Dwarf_Small),error,endptr);
945*4d9fdb46SRobert Mustacchi     macro_data += sizeof(Dwarf_Small);
946*4d9fdb46SRobert Mustacchi     /* Estimating minimum size */
947*4d9fdb46SRobert Mustacchi     local_size = operand_table_count * 4;
948*4d9fdb46SRobert Mustacchi 
949*4d9fdb46SRobert Mustacchi     cur_offset = (local_size+ macro_data) - section_base;
950*4d9fdb46SRobert Mustacchi     if (cur_offset >= section_size) {
951*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_MACRO_OFFSET_BAD);
952*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
953*4d9fdb46SRobert Mustacchi     }
954*4d9fdb46SRobert Mustacchi     /* first, get size of table. */
955*4d9fdb46SRobert Mustacchi     table_data_start = macro_data;
956*4d9fdb46SRobert Mustacchi     for (i = 0; i < operand_table_count; ++i) {
957*4d9fdb46SRobert Mustacchi         /*  Compiler warning about unused opcode_number
958*4d9fdb46SRobert Mustacchi             variable should be ignored. */
959*4d9fdb46SRobert Mustacchi         UNUSEDARG Dwarf_Small opcode_number = 0;
960*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned formcount = 0;
961*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg,opcode_number,Dwarf_Small,
962*4d9fdb46SRobert Mustacchi             macro_data,sizeof(Dwarf_Small),error,endptr);
963*4d9fdb46SRobert Mustacchi         macro_data += sizeof(Dwarf_Small);
964*4d9fdb46SRobert Mustacchi 
965*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(macro_data,formcount,
966*4d9fdb46SRobert Mustacchi             dbg, error, endptr);
967*4d9fdb46SRobert Mustacchi         cur_offset = (formcount+ macro_data) - section_base;
968*4d9fdb46SRobert Mustacchi         if (cur_offset >= section_size) {
969*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_MACRO_OFFSET_BAD);
970*4d9fdb46SRobert Mustacchi             return (DW_DLV_ERROR);
971*4d9fdb46SRobert Mustacchi         }
972*4d9fdb46SRobert Mustacchi         /* The 1 ubyte forms follow. Step past them. */
973*4d9fdb46SRobert Mustacchi         macro_data += formcount;
974*4d9fdb46SRobert Mustacchi     }
975*4d9fdb46SRobert Mustacchi     /* reset for reread. */
976*4d9fdb46SRobert Mustacchi     macro_data = table_data_start;
977*4d9fdb46SRobert Mustacchi     /* allocate table */
978*4d9fdb46SRobert Mustacchi     macro_context->mc_opcode_forms =  (struct Dwarf_Macro_Forms_s *)
979*4d9fdb46SRobert Mustacchi         calloc(operand_table_count,
980*4d9fdb46SRobert Mustacchi             sizeof(struct Dwarf_Macro_Forms_s));
981*4d9fdb46SRobert Mustacchi     macro_context->mc_opcode_count = operand_table_count;
982*4d9fdb46SRobert Mustacchi     if(!macro_context->mc_opcode_forms) {
983*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
984*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
985*4d9fdb46SRobert Mustacchi     }
986*4d9fdb46SRobert Mustacchi 
987*4d9fdb46SRobert Mustacchi     curformentry = macro_context->mc_opcode_forms;
988*4d9fdb46SRobert Mustacchi     for (i = 0; i < operand_table_count; ++i,++curformentry) {
989*4d9fdb46SRobert Mustacchi         Dwarf_Small opcode_number = 0;
990*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned formcount = 0;
991*4d9fdb46SRobert Mustacchi         int res = 0;
992*4d9fdb46SRobert Mustacchi 
993*4d9fdb46SRobert Mustacchi         cur_offset = (2 + macro_data) - section_base;
994*4d9fdb46SRobert Mustacchi         if (cur_offset >= section_size) {
995*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_MACRO_OFFSET_BAD);
996*4d9fdb46SRobert Mustacchi             return (DW_DLV_ERROR);
997*4d9fdb46SRobert Mustacchi         }
998*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg,opcode_number,Dwarf_Small,
999*4d9fdb46SRobert Mustacchi             macro_data,sizeof(Dwarf_Small),
1000*4d9fdb46SRobert Mustacchi             error,endptr);
1001*4d9fdb46SRobert Mustacchi         macro_data += sizeof(Dwarf_Small);
1002*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(macro_data,formcount,
1003*4d9fdb46SRobert Mustacchi             dbg, error, endptr);
1004*4d9fdb46SRobert Mustacchi 
1005*4d9fdb46SRobert Mustacchi         curformentry->mf_code = opcode_number;
1006*4d9fdb46SRobert Mustacchi         curformentry->mf_formcount = formcount;
1007*4d9fdb46SRobert Mustacchi 
1008*4d9fdb46SRobert Mustacchi         cur_offset = (formcount+ macro_data) - section_base;
1009*4d9fdb46SRobert Mustacchi         if (cur_offset >= section_size) {
1010*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_MACRO_OFFSET_BAD);
1011*4d9fdb46SRobert Mustacchi             return (DW_DLV_ERROR);
1012*4d9fdb46SRobert Mustacchi         }
1013*4d9fdb46SRobert Mustacchi         curformentry->mf_formbytes = macro_data;
1014*4d9fdb46SRobert Mustacchi         macro_data += formcount;
1015*4d9fdb46SRobert Mustacchi         if (opcode_number  > DW_MACRO_undef_strx ) {
1016*4d9fdb46SRobert Mustacchi             Dwarf_Half k = 0;
1017*4d9fdb46SRobert Mustacchi             for(k = 0; k < formcount; ++k) {
1018*4d9fdb46SRobert Mustacchi                 if (!valid_macro_form(curformentry->mf_formbytes[k])) {
1019*4d9fdb46SRobert Mustacchi                     _dwarf_error(dbg, error, DW_DLE_MACRO_OP_UNHANDLED);
1020*4d9fdb46SRobert Mustacchi                     return (DW_DLV_ERROR);
1021*4d9fdb46SRobert Mustacchi                 }
1022*4d9fdb46SRobert Mustacchi             }
1023*4d9fdb46SRobert Mustacchi         }
1024*4d9fdb46SRobert Mustacchi         res = validate_opcode(macro_context->mc_dbg,curformentry, error);
1025*4d9fdb46SRobert Mustacchi         if(res != DW_DLV_OK) {
1026*4d9fdb46SRobert Mustacchi             return res;
1027*4d9fdb46SRobert Mustacchi         }
1028*4d9fdb46SRobert Mustacchi     }
1029*4d9fdb46SRobert Mustacchi     *table_size_out = macro_data - table_data_start;
1030*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1031*4d9fdb46SRobert Mustacchi }
1032*4d9fdb46SRobert Mustacchi 
1033*4d9fdb46SRobert Mustacchi /*  This is not the normal srcfiles from dwarf_srcfiles.
1034*4d9fdb46SRobert Mustacchi     See translate translate_srcfiles_to_srcfiles2().
1035*4d9fdb46SRobert Mustacchi     It is a list, but the contents were directly malloc,
1036*4d9fdb46SRobert Mustacchi     not _dwarf_get_alloc.
1037*4d9fdb46SRobert Mustacchi */
1038*4d9fdb46SRobert Mustacchi static void
dealloc_macro_srcfiles(char ** srcfiles,Dwarf_Signed srcfiles_count)1039*4d9fdb46SRobert Mustacchi dealloc_macro_srcfiles(char ** srcfiles,
1040*4d9fdb46SRobert Mustacchi     Dwarf_Signed srcfiles_count)
1041*4d9fdb46SRobert Mustacchi {
1042*4d9fdb46SRobert Mustacchi     Dwarf_Signed i = 0;
1043*4d9fdb46SRobert Mustacchi     if (!srcfiles || !srcfiles_count) {
1044*4d9fdb46SRobert Mustacchi         return;
1045*4d9fdb46SRobert Mustacchi     }
1046*4d9fdb46SRobert Mustacchi     for (i = 0; i < srcfiles_count; ++i) {
1047*4d9fdb46SRobert Mustacchi         if (srcfiles[i]) {
1048*4d9fdb46SRobert Mustacchi             free(srcfiles[i]);
1049*4d9fdb46SRobert Mustacchi             srcfiles[i] = 0;
1050*4d9fdb46SRobert Mustacchi         }
1051*4d9fdb46SRobert Mustacchi     }
1052*4d9fdb46SRobert Mustacchi     free(srcfiles);
1053*4d9fdb46SRobert Mustacchi }
1054*4d9fdb46SRobert Mustacchi 
1055*4d9fdb46SRobert Mustacchi /*  This makes the macro context safe from
1056*4d9fdb46SRobert Mustacchi     duplicate frees in case of error. */
1057*4d9fdb46SRobert Mustacchi static int
translate_srcfiles_to_srcfiles2(char ** srcfiles,Dwarf_Signed srcfiles_count,char ** srcfiles2)1058*4d9fdb46SRobert Mustacchi translate_srcfiles_to_srcfiles2(char **srcfiles,
1059*4d9fdb46SRobert Mustacchi    Dwarf_Signed srcfiles_count,
1060*4d9fdb46SRobert Mustacchi    char **srcfiles2)
1061*4d9fdb46SRobert Mustacchi {
1062*4d9fdb46SRobert Mustacchi     Dwarf_Signed i = 0;
1063*4d9fdb46SRobert Mustacchi 
1064*4d9fdb46SRobert Mustacchi     for(i = 0; i < srcfiles_count; ++i) {
1065*4d9fdb46SRobert Mustacchi         char * ostr = 0;
1066*4d9fdb46SRobert Mustacchi         char * newstr = 0;
1067*4d9fdb46SRobert Mustacchi         size_t slen = 0;
1068*4d9fdb46SRobert Mustacchi 
1069*4d9fdb46SRobert Mustacchi         ostr = srcfiles[i];
1070*4d9fdb46SRobert Mustacchi         slen = strlen(ostr);
1071*4d9fdb46SRobert Mustacchi         newstr =  calloc(1,slen+1);
1072*4d9fdb46SRobert Mustacchi         if (!newstr) {
1073*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
1074*4d9fdb46SRobert Mustacchi         }
1075*4d9fdb46SRobert Mustacchi         strcpy(newstr,ostr);
1076*4d9fdb46SRobert Mustacchi         srcfiles2[i] = newstr;
1077*4d9fdb46SRobert Mustacchi     }
1078*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1079*4d9fdb46SRobert Mustacchi }
1080*4d9fdb46SRobert Mustacchi 
1081*4d9fdb46SRobert Mustacchi static void
drop_srcfiles(Dwarf_Debug dbg,char ** srcfiles,Dwarf_Signed srcfiles_count)1082*4d9fdb46SRobert Mustacchi drop_srcfiles(Dwarf_Debug dbg,char ** srcfiles,
1083*4d9fdb46SRobert Mustacchi     Dwarf_Signed srcfiles_count)
1084*4d9fdb46SRobert Mustacchi {
1085*4d9fdb46SRobert Mustacchi     Dwarf_Signed i = 0;
1086*4d9fdb46SRobert Mustacchi     for (i = 0; i < srcfiles_count; ++i) {
1087*4d9fdb46SRobert Mustacchi         if(srcfiles[i]) {
1088*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg, srcfiles[i], DW_DLA_STRING);
1089*4d9fdb46SRobert Mustacchi         }
1090*4d9fdb46SRobert Mustacchi     }
1091*4d9fdb46SRobert Mustacchi     dwarf_dealloc(dbg, srcfiles, DW_DLA_LIST);
1092*4d9fdb46SRobert Mustacchi }
1093*4d9fdb46SRobert Mustacchi 
1094*4d9fdb46SRobert Mustacchi 
1095*4d9fdb46SRobert Mustacchi static int
_dwarf_internal_macro_context(Dwarf_Die die,Dwarf_Bool offset_specified,Dwarf_Unsigned offset_in,Dwarf_Unsigned * version_out,Dwarf_Macro_Context * macro_context_out,Dwarf_Unsigned * macro_unit_offset_out,Dwarf_Unsigned * macro_ops_count_out,Dwarf_Unsigned * macro_ops_data_length,Dwarf_Error * error)1096*4d9fdb46SRobert Mustacchi _dwarf_internal_macro_context(Dwarf_Die die,
1097*4d9fdb46SRobert Mustacchi     Dwarf_Bool        offset_specified,
1098*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned    offset_in,
1099*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  * version_out,
1100*4d9fdb46SRobert Mustacchi     Dwarf_Macro_Context * macro_context_out,
1101*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      * macro_unit_offset_out,
1102*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      * macro_ops_count_out,
1103*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      * macro_ops_data_length,
1104*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1105*4d9fdb46SRobert Mustacchi {
1106*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context   cu_context = 0;
1107*4d9fdb46SRobert Mustacchi 
1108*4d9fdb46SRobert Mustacchi     /*  The Dwarf_Debug this die belongs to. */
1109*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
1110*4d9fdb46SRobert Mustacchi     int resattr = DW_DLV_ERROR;
1111*4d9fdb46SRobert Mustacchi     int lres = DW_DLV_ERROR;
1112*4d9fdb46SRobert Mustacchi     int res = DW_DLV_ERROR;
1113*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned macro_offset = 0;
1114*4d9fdb46SRobert Mustacchi     Dwarf_Attribute macro_attr = 0;
1115*4d9fdb46SRobert Mustacchi     Dwarf_Signed srcfiles_count = 0;
1116*4d9fdb46SRobert Mustacchi     Dwarf_Signed srcfiles2_count = 0;
1117*4d9fdb46SRobert Mustacchi     char ** srcfiles = 0;
1118*4d9fdb46SRobert Mustacchi 
1119*4d9fdb46SRobert Mustacchi     /*  srcfiles uses dwarf_get_alloc for strings
1120*4d9fdb46SRobert Mustacchi         so dealloc_macro_srcfiles() here will result in double-dealloc
1121*4d9fdb46SRobert Mustacchi         when dwarf_finish() happens to see the string deallocs
1122*4d9fdb46SRobert Mustacchi         before the macro context dealloc (the context dealloc
1123*4d9fdb46SRobert Mustacchi         will call dealloc_macro_srcfiles() !).
1124*4d9fdb46SRobert Mustacchi 
1125*4d9fdb46SRobert Mustacchi         Also see the comment at _dwarf_macro_destructor() here.
1126*4d9fdb46SRobert Mustacchi     */
1127*4d9fdb46SRobert Mustacchi     char ** srcfiles2 = 0;
1128*4d9fdb46SRobert Mustacchi 
1129*4d9fdb46SRobert Mustacchi     const char *comp_dir = 0;
1130*4d9fdb46SRobert Mustacchi     const char *comp_name = 0;
1131*4d9fdb46SRobert Mustacchi 
1132*4d9fdb46SRobert Mustacchi     /*  ***** BEGIN CODE ***** */
1133*4d9fdb46SRobert Mustacchi     if (error != NULL) {
1134*4d9fdb46SRobert Mustacchi         *error = NULL;
1135*4d9fdb46SRobert Mustacchi     }
1136*4d9fdb46SRobert Mustacchi 
1137*4d9fdb46SRobert Mustacchi     CHECK_DIE(die, DW_DLV_ERROR);
1138*4d9fdb46SRobert Mustacchi     cu_context = die->di_cu_context;
1139*4d9fdb46SRobert Mustacchi     dbg = cu_context->cc_dbg;
1140*4d9fdb46SRobert Mustacchi 
1141*4d9fdb46SRobert Mustacchi     /*  Doing the load here results in duplication of the
1142*4d9fdb46SRobert Mustacchi         section-load call  (in the by_offset
1143*4d9fdb46SRobert Mustacchi         interface below) but detects the missing section
1144*4d9fdb46SRobert Mustacchi         quickly. */
1145*4d9fdb46SRobert Mustacchi     res = _dwarf_load_section(dbg, &dbg->de_debug_macro,error);
1146*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1147*4d9fdb46SRobert Mustacchi         return res;
1148*4d9fdb46SRobert Mustacchi     }
1149*4d9fdb46SRobert Mustacchi     if (!dbg->de_debug_macro.dss_size) {
1150*4d9fdb46SRobert Mustacchi         return (DW_DLV_NO_ENTRY);
1151*4d9fdb46SRobert Mustacchi     }
1152*4d9fdb46SRobert Mustacchi     resattr = dwarf_attr(die, DW_AT_macros, &macro_attr, error);
1153*4d9fdb46SRobert Mustacchi     if (resattr == DW_DLV_NO_ENTRY) {
1154*4d9fdb46SRobert Mustacchi         resattr = dwarf_attr(die, DW_AT_GNU_macros, &macro_attr, error);
1155*4d9fdb46SRobert Mustacchi     }
1156*4d9fdb46SRobert Mustacchi     if (resattr != DW_DLV_OK) {
1157*4d9fdb46SRobert Mustacchi         return resattr;
1158*4d9fdb46SRobert Mustacchi     }
1159*4d9fdb46SRobert Mustacchi     if (!offset_specified) {
1160*4d9fdb46SRobert Mustacchi         lres = dwarf_global_formref(macro_attr, &macro_offset, error);
1161*4d9fdb46SRobert Mustacchi         if (lres != DW_DLV_OK) {
1162*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg,macro_attr,DW_DLA_ATTR);
1163*4d9fdb46SRobert Mustacchi             return lres;
1164*4d9fdb46SRobert Mustacchi         }
1165*4d9fdb46SRobert Mustacchi     } else {
1166*4d9fdb46SRobert Mustacchi         macro_offset = offset_in;
1167*4d9fdb46SRobert Mustacchi     }
1168*4d9fdb46SRobert Mustacchi     lres = dwarf_srcfiles(die,&srcfiles,&srcfiles_count, error);
1169*4d9fdb46SRobert Mustacchi     if (lres == DW_DLV_ERROR) {
1170*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg,macro_attr,DW_DLA_ATTR);
1171*4d9fdb46SRobert Mustacchi         return lres;
1172*4d9fdb46SRobert Mustacchi     }
1173*4d9fdb46SRobert Mustacchi     lres = _dwarf_internal_get_die_comp_dir(die, &comp_dir,
1174*4d9fdb46SRobert Mustacchi         &comp_name,error);
1175*4d9fdb46SRobert Mustacchi     if (lres == DW_DLV_ERROR) {
1176*4d9fdb46SRobert Mustacchi         drop_srcfiles(dbg,srcfiles,srcfiles_count);
1177*4d9fdb46SRobert Mustacchi         srcfiles = 0;
1178*4d9fdb46SRobert Mustacchi         srcfiles_count = 0;
1179*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg,macro_attr,DW_DLA_ATTR);
1180*4d9fdb46SRobert Mustacchi         srcfiles = 0;
1181*4d9fdb46SRobert Mustacchi         return lres;
1182*4d9fdb46SRobert Mustacchi     }
1183*4d9fdb46SRobert Mustacchi     *macro_unit_offset_out = macro_offset;
1184*4d9fdb46SRobert Mustacchi     /*  We cannot use space allocated by
1185*4d9fdb46SRobert Mustacchi         _dwarf_get_alloc() in the macro_context
1186*4d9fdb46SRobert Mustacchi         we will allocate shortly.
1187*4d9fdb46SRobert Mustacchi         So copy from what we have to a similar data set
1188*4d9fdb46SRobert Mustacchi         but malloc space directly. */
1189*4d9fdb46SRobert Mustacchi 
1190*4d9fdb46SRobert Mustacchi     if (srcfiles_count > 0) {
1191*4d9fdb46SRobert Mustacchi         srcfiles2 = (char **) calloc(srcfiles_count, sizeof(char *));
1192*4d9fdb46SRobert Mustacchi         if (!srcfiles2) {
1193*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg,macro_attr,DW_DLA_ATTR);
1194*4d9fdb46SRobert Mustacchi             drop_srcfiles(dbg,srcfiles,srcfiles_count);
1195*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
1196*4d9fdb46SRobert Mustacchi             return (DW_DLV_ERROR);
1197*4d9fdb46SRobert Mustacchi         }
1198*4d9fdb46SRobert Mustacchi         lres  = translate_srcfiles_to_srcfiles2(srcfiles,
1199*4d9fdb46SRobert Mustacchi             srcfiles_count,srcfiles2);
1200*4d9fdb46SRobert Mustacchi         drop_srcfiles(dbg,srcfiles,srcfiles_count);
1201*4d9fdb46SRobert Mustacchi         srcfiles2_count = srcfiles_count;
1202*4d9fdb46SRobert Mustacchi         srcfiles = 0;
1203*4d9fdb46SRobert Mustacchi         srcfiles_count = 0;
1204*4d9fdb46SRobert Mustacchi         if (lres != DW_DLV_OK) {
1205*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg,macro_attr,DW_DLA_ATTR);
1206*4d9fdb46SRobert Mustacchi             dealloc_macro_srcfiles(srcfiles2, srcfiles2_count);
1207*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
1208*4d9fdb46SRobert Mustacchi             return lres;
1209*4d9fdb46SRobert Mustacchi         }
1210*4d9fdb46SRobert Mustacchi     } else {
1211*4d9fdb46SRobert Mustacchi         drop_srcfiles(dbg,srcfiles,srcfiles_count);
1212*4d9fdb46SRobert Mustacchi         srcfiles = 0;
1213*4d9fdb46SRobert Mustacchi         srcfiles_count = 0;
1214*4d9fdb46SRobert Mustacchi     }
1215*4d9fdb46SRobert Mustacchi 
1216*4d9fdb46SRobert Mustacchi     dwarf_dealloc(dbg,macro_attr,DW_DLA_ATTR);
1217*4d9fdb46SRobert Mustacchi     /*  NO ENTRY or OK we accept, though NO ENTRY means there
1218*4d9fdb46SRobert Mustacchi         are no source files available. */
1219*4d9fdb46SRobert Mustacchi     lres = _dwarf_internal_macro_context_by_offset(dbg,
1220*4d9fdb46SRobert Mustacchi         macro_offset,version_out,macro_context_out,
1221*4d9fdb46SRobert Mustacchi         macro_ops_count_out,
1222*4d9fdb46SRobert Mustacchi         macro_ops_data_length,
1223*4d9fdb46SRobert Mustacchi         srcfiles2,srcfiles2_count,
1224*4d9fdb46SRobert Mustacchi         comp_dir,
1225*4d9fdb46SRobert Mustacchi         comp_name,
1226*4d9fdb46SRobert Mustacchi         cu_context,
1227*4d9fdb46SRobert Mustacchi         error);
1228*4d9fdb46SRobert Mustacchi     /*  In case of ERROR or NO_ENTRY srcfiles2 is already freed. */
1229*4d9fdb46SRobert Mustacchi     return lres;
1230*4d9fdb46SRobert Mustacchi }
1231*4d9fdb46SRobert Mustacchi 
1232*4d9fdb46SRobert Mustacchi static int
_dwarf_internal_macro_context_by_offset(Dwarf_Debug dbg,Dwarf_Unsigned offset,Dwarf_Unsigned * version_out,Dwarf_Macro_Context * macro_context_out,Dwarf_Unsigned * macro_ops_count_out,Dwarf_Unsigned * macro_ops_data_length,char ** srcfiles,Dwarf_Signed srcfilescount,const char * comp_dir,const char * comp_name,Dwarf_CU_Context cu_context,Dwarf_Error * error)1233*4d9fdb46SRobert Mustacchi _dwarf_internal_macro_context_by_offset(Dwarf_Debug dbg,
1234*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset,
1235*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  * version_out,
1236*4d9fdb46SRobert Mustacchi     Dwarf_Macro_Context * macro_context_out,
1237*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      * macro_ops_count_out,
1238*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      * macro_ops_data_length,
1239*4d9fdb46SRobert Mustacchi     char **srcfiles,
1240*4d9fdb46SRobert Mustacchi     Dwarf_Signed srcfilescount,
1241*4d9fdb46SRobert Mustacchi     const char *comp_dir,
1242*4d9fdb46SRobert Mustacchi     const char *comp_name,
1243*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context,
1244*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1245*4d9fdb46SRobert Mustacchi {
1246*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned line_table_offset = 0;
1247*4d9fdb46SRobert Mustacchi     Dwarf_Small * macro_header = 0;
1248*4d9fdb46SRobert Mustacchi     Dwarf_Small * macro_data = 0;
1249*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned version = 0;
1250*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned flags = 0;
1251*4d9fdb46SRobert Mustacchi     Dwarf_Small offset_size = 4;
1252*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cur_offset = 0;
1253*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned section_size = 0;
1254*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_base = 0;
1255*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_end = 0;
1256*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned optablesize = 0;
1257*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned macro_offset = offset;
1258*4d9fdb46SRobert Mustacchi     int res = 0;
1259*4d9fdb46SRobert Mustacchi     Dwarf_Macro_Context macro_context = 0;
1260*4d9fdb46SRobert Mustacchi     Dwarf_Bool build_ops_array = FALSE;
1261*4d9fdb46SRobert Mustacchi 
1262*4d9fdb46SRobert Mustacchi     res = _dwarf_load_section(dbg, &dbg->de_debug_macro,error);
1263*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1264*4d9fdb46SRobert Mustacchi         dealloc_macro_srcfiles(srcfiles,srcfilescount);
1265*4d9fdb46SRobert Mustacchi         return res;
1266*4d9fdb46SRobert Mustacchi     }
1267*4d9fdb46SRobert Mustacchi     if (!dbg->de_debug_macro.dss_size) {
1268*4d9fdb46SRobert Mustacchi         dealloc_macro_srcfiles(srcfiles,srcfilescount);
1269*4d9fdb46SRobert Mustacchi         return (DW_DLV_NO_ENTRY);
1270*4d9fdb46SRobert Mustacchi     }
1271*4d9fdb46SRobert Mustacchi 
1272*4d9fdb46SRobert Mustacchi     section_base = dbg->de_debug_macro.dss_data;
1273*4d9fdb46SRobert Mustacchi     section_size = dbg->de_debug_macro.dss_size;
1274*4d9fdb46SRobert Mustacchi     /*  The '3'  ensures the header initial bytes present too. */
1275*4d9fdb46SRobert Mustacchi     if ((3+macro_offset) >= section_size) {
1276*4d9fdb46SRobert Mustacchi         dealloc_macro_srcfiles(srcfiles,srcfilescount);
1277*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_MACRO_OFFSET_BAD);
1278*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1279*4d9fdb46SRobert Mustacchi     }
1280*4d9fdb46SRobert Mustacchi     macro_header = macro_offset + section_base;
1281*4d9fdb46SRobert Mustacchi     macro_data = macro_header;
1282*4d9fdb46SRobert Mustacchi     section_end = section_base +section_size;
1283*4d9fdb46SRobert Mustacchi 
1284*4d9fdb46SRobert Mustacchi 
1285*4d9fdb46SRobert Mustacchi     macro_context = (Dwarf_Macro_Context)
1286*4d9fdb46SRobert Mustacchi         _dwarf_get_alloc(dbg,DW_DLA_MACRO_CONTEXT,1);
1287*4d9fdb46SRobert Mustacchi     if (!macro_context) {
1288*4d9fdb46SRobert Mustacchi         dealloc_macro_srcfiles(srcfiles,srcfilescount);
1289*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
1290*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1291*4d9fdb46SRobert Mustacchi     }
1292*4d9fdb46SRobert Mustacchi 
1293*4d9fdb46SRobert Mustacchi     if ((section_base + DWARF_HALF_SIZE + sizeof(Dwarf_Small)) >                     section_end ) {
1294*4d9fdb46SRobert Mustacchi         dealloc_macro_srcfiles(srcfiles,srcfilescount);
1295*4d9fdb46SRobert Mustacchi         dwarf_dealloc_macro_context(macro_context);
1296*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_MACRO_OFFSET_BAD);
1297*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1298*4d9fdb46SRobert Mustacchi     }
1299*4d9fdb46SRobert Mustacchi     /* Note here so if error return we get these freed eventually. */
1300*4d9fdb46SRobert Mustacchi     macro_context->mc_srcfiles = srcfiles;
1301*4d9fdb46SRobert Mustacchi     macro_context->mc_srcfiles_count = srcfilescount;
1302*4d9fdb46SRobert Mustacchi     macro_context->mc_cu_context =  cu_context;
1303*4d9fdb46SRobert Mustacchi 
1304*4d9fdb46SRobert Mustacchi     res = _dwarf_read_unaligned_ck_wrapper(dbg,
1305*4d9fdb46SRobert Mustacchi         &version,macro_data,DWARF_HALF_SIZE,section_end,
1306*4d9fdb46SRobert Mustacchi         error);
1307*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1308*4d9fdb46SRobert Mustacchi         dwarf_dealloc_macro_context(macro_context);
1309*4d9fdb46SRobert Mustacchi         return res;
1310*4d9fdb46SRobert Mustacchi     }
1311*4d9fdb46SRobert Mustacchi     macro_data +=  DWARF_HALF_SIZE;
1312*4d9fdb46SRobert Mustacchi     res = _dwarf_read_unaligned_ck_wrapper(dbg,
1313*4d9fdb46SRobert Mustacchi         &flags,macro_data,sizeof(Dwarf_Small),section_end,
1314*4d9fdb46SRobert Mustacchi         error);
1315*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1316*4d9fdb46SRobert Mustacchi         dwarf_dealloc_macro_context(macro_context);
1317*4d9fdb46SRobert Mustacchi         return res;
1318*4d9fdb46SRobert Mustacchi     }
1319*4d9fdb46SRobert Mustacchi     macro_data += sizeof(Dwarf_Small);
1320*4d9fdb46SRobert Mustacchi 
1321*4d9fdb46SRobert Mustacchi     macro_context->mc_at_comp_dir = comp_dir;
1322*4d9fdb46SRobert Mustacchi     macro_context->mc_at_name = comp_name;
1323*4d9fdb46SRobert Mustacchi     macro_context->mc_macro_header = macro_header;
1324*4d9fdb46SRobert Mustacchi     macro_context->mc_section_offset = macro_offset;
1325*4d9fdb46SRobert Mustacchi     macro_context->mc_version_number = version;
1326*4d9fdb46SRobert Mustacchi     macro_context->mc_flags = flags;
1327*4d9fdb46SRobert Mustacchi     macro_context->mc_dbg = dbg;
1328*4d9fdb46SRobert Mustacchi     macro_context->mc_offset_size_flag =
1329*4d9fdb46SRobert Mustacchi         flags& MACRO_OFFSET_SIZE_FLAG?TRUE:FALSE;
1330*4d9fdb46SRobert Mustacchi     macro_context->mc_debug_line_offset_flag =
1331*4d9fdb46SRobert Mustacchi         flags& MACRO_LINE_OFFSET_FLAG?TRUE:FALSE;
1332*4d9fdb46SRobert Mustacchi     macro_context->mc_operands_table_flag =
1333*4d9fdb46SRobert Mustacchi         flags& MACRO_OP_TABLE_FLAG?TRUE:FALSE;
1334*4d9fdb46SRobert Mustacchi     offset_size = macro_context->mc_offset_size_flag?8:4;
1335*4d9fdb46SRobert Mustacchi     macro_context->mc_offset_size = offset_size;
1336*4d9fdb46SRobert Mustacchi     if (macro_context->mc_debug_line_offset_flag) {
1337*4d9fdb46SRobert Mustacchi         cur_offset = (offset_size+ macro_data) - section_base;
1338*4d9fdb46SRobert Mustacchi         if (cur_offset >= section_size) {
1339*4d9fdb46SRobert Mustacchi             dwarf_dealloc_macro_context(macro_context);
1340*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_MACRO_OFFSET_BAD);
1341*4d9fdb46SRobert Mustacchi             return (DW_DLV_ERROR);
1342*4d9fdb46SRobert Mustacchi         }
1343*4d9fdb46SRobert Mustacchi         res = _dwarf_read_unaligned_ck_wrapper(dbg,
1344*4d9fdb46SRobert Mustacchi             &line_table_offset,macro_data,
1345*4d9fdb46SRobert Mustacchi             offset_size,section_end,
1346*4d9fdb46SRobert Mustacchi             error);
1347*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
1348*4d9fdb46SRobert Mustacchi             dwarf_dealloc_macro_context(macro_context);
1349*4d9fdb46SRobert Mustacchi             return res;
1350*4d9fdb46SRobert Mustacchi         }
1351*4d9fdb46SRobert Mustacchi         macro_data += offset_size;
1352*4d9fdb46SRobert Mustacchi         macro_context->mc_debug_line_offset = line_table_offset;
1353*4d9fdb46SRobert Mustacchi     }
1354*4d9fdb46SRobert Mustacchi     if (macro_context->mc_operands_table_flag) {
1355*4d9fdb46SRobert Mustacchi         res = read_operands_table(macro_context,
1356*4d9fdb46SRobert Mustacchi             macro_header,
1357*4d9fdb46SRobert Mustacchi             macro_data,
1358*4d9fdb46SRobert Mustacchi             section_base,
1359*4d9fdb46SRobert Mustacchi             section_size,
1360*4d9fdb46SRobert Mustacchi             &optablesize,
1361*4d9fdb46SRobert Mustacchi             error);
1362*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
1363*4d9fdb46SRobert Mustacchi             dwarf_dealloc_macro_context(macro_context);
1364*4d9fdb46SRobert Mustacchi             return res;
1365*4d9fdb46SRobert Mustacchi         }
1366*4d9fdb46SRobert Mustacchi     }
1367*4d9fdb46SRobert Mustacchi 
1368*4d9fdb46SRobert Mustacchi     macro_data += optablesize;
1369*4d9fdb46SRobert Mustacchi     macro_context->mc_macro_ops = macro_data;
1370*4d9fdb46SRobert Mustacchi     macro_context->mc_macro_header_length =macro_data - macro_header;
1371*4d9fdb46SRobert Mustacchi 
1372*4d9fdb46SRobert Mustacchi     build_ops_array = FALSE;
1373*4d9fdb46SRobert Mustacchi     res = _dwarf_get_macro_ops_count_internal(macro_context,
1374*4d9fdb46SRobert Mustacchi         build_ops_array,
1375*4d9fdb46SRobert Mustacchi         error);
1376*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1377*4d9fdb46SRobert Mustacchi         dwarf_dealloc_macro_context(macro_context);
1378*4d9fdb46SRobert Mustacchi         return res;
1379*4d9fdb46SRobert Mustacchi     }
1380*4d9fdb46SRobert Mustacchi     build_ops_array = TRUE;
1381*4d9fdb46SRobert Mustacchi     res = _dwarf_get_macro_ops_count_internal(macro_context,
1382*4d9fdb46SRobert Mustacchi         build_ops_array,
1383*4d9fdb46SRobert Mustacchi         error);
1384*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1385*4d9fdb46SRobert Mustacchi         dwarf_dealloc_macro_context(macro_context);
1386*4d9fdb46SRobert Mustacchi         return res;
1387*4d9fdb46SRobert Mustacchi     }
1388*4d9fdb46SRobert Mustacchi     *macro_ops_count_out = macro_context->mc_macro_ops_count;
1389*4d9fdb46SRobert Mustacchi     *macro_ops_data_length = macro_context->mc_ops_data_length;
1390*4d9fdb46SRobert Mustacchi     *version_out = version;
1391*4d9fdb46SRobert Mustacchi     *macro_context_out = macro_context;
1392*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1393*4d9fdb46SRobert Mustacchi }
1394*4d9fdb46SRobert Mustacchi 
dwarf_macro_context_head(Dwarf_Macro_Context head,Dwarf_Half * version,Dwarf_Unsigned * mac_offset,Dwarf_Unsigned * mac_len,Dwarf_Unsigned * mac_header_len,unsigned * flags,Dwarf_Bool * has_line_offset,Dwarf_Unsigned * line_offset,Dwarf_Bool * has_offset_size_64,Dwarf_Bool * has_operands_table,Dwarf_Half * opcode_count,Dwarf_Error * error)1395*4d9fdb46SRobert Mustacchi int dwarf_macro_context_head(Dwarf_Macro_Context head,
1396*4d9fdb46SRobert Mustacchi     Dwarf_Half     * version,
1397*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * mac_offset,
1398*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * mac_len,
1399*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * mac_header_len,
1400*4d9fdb46SRobert Mustacchi     unsigned *       flags,
1401*4d9fdb46SRobert Mustacchi     Dwarf_Bool *     has_line_offset,
1402*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * line_offset,
1403*4d9fdb46SRobert Mustacchi     Dwarf_Bool *     has_offset_size_64,
1404*4d9fdb46SRobert Mustacchi     Dwarf_Bool *     has_operands_table,
1405*4d9fdb46SRobert Mustacchi     Dwarf_Half *     opcode_count,
1406*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
1407*4d9fdb46SRobert Mustacchi {
1408*4d9fdb46SRobert Mustacchi     if (!head || head->mc_sentinel != 0xada) {
1409*4d9fdb46SRobert Mustacchi         Dwarf_Debug dbg = 0;
1410*4d9fdb46SRobert Mustacchi         if(head) {
1411*4d9fdb46SRobert Mustacchi             dbg = head->mc_dbg;
1412*4d9fdb46SRobert Mustacchi         }
1413*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,DW_DLE_BAD_MACRO_HEADER_POINTER);
1414*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1415*4d9fdb46SRobert Mustacchi     }
1416*4d9fdb46SRobert Mustacchi     *version = head->mc_version_number;
1417*4d9fdb46SRobert Mustacchi     *mac_offset = head->mc_section_offset;
1418*4d9fdb46SRobert Mustacchi     *mac_len    = head->mc_total_length;
1419*4d9fdb46SRobert Mustacchi     *mac_header_len = head->mc_macro_header_length;
1420*4d9fdb46SRobert Mustacchi     *flags = head->mc_flags;
1421*4d9fdb46SRobert Mustacchi     *line_offset = head->mc_debug_line_offset;
1422*4d9fdb46SRobert Mustacchi     *has_line_offset = head->mc_debug_line_offset_flag;
1423*4d9fdb46SRobert Mustacchi     *has_offset_size_64 = head->mc_offset_size_flag;
1424*4d9fdb46SRobert Mustacchi     *has_operands_table = head->mc_operands_table_flag;
1425*4d9fdb46SRobert Mustacchi     *opcode_count = head->mc_opcode_count;
1426*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1427*4d9fdb46SRobert Mustacchi }
dwarf_macro_operands_table(Dwarf_Macro_Context head,Dwarf_Half index,Dwarf_Half * opcode_number,Dwarf_Half * operand_count,const Dwarf_Small ** operand_array,Dwarf_Error * error)1428*4d9fdb46SRobert Mustacchi int dwarf_macro_operands_table(Dwarf_Macro_Context head,
1429*4d9fdb46SRobert Mustacchi     Dwarf_Half  index, /* 0 to opcode_count -1 */
1430*4d9fdb46SRobert Mustacchi     Dwarf_Half  *opcode_number,
1431*4d9fdb46SRobert Mustacchi     Dwarf_Half  *operand_count,
1432*4d9fdb46SRobert Mustacchi     const Dwarf_Small **operand_array,
1433*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
1434*4d9fdb46SRobert Mustacchi {
1435*4d9fdb46SRobert Mustacchi     struct Dwarf_Macro_Forms_s * ops = 0;
1436*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
1437*4d9fdb46SRobert Mustacchi     if (!head || head->mc_sentinel != 0xada) {
1438*4d9fdb46SRobert Mustacchi         if(head) {
1439*4d9fdb46SRobert Mustacchi             dbg = head->mc_dbg;
1440*4d9fdb46SRobert Mustacchi         }
1441*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error,DW_DLE_BAD_MACRO_HEADER_POINTER);
1442*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1443*4d9fdb46SRobert Mustacchi     }
1444*4d9fdb46SRobert Mustacchi     dbg = head->mc_dbg;
1445*4d9fdb46SRobert Mustacchi     if (index >= head->mc_opcode_count) {
1446*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_BAD_MACRO_INDEX);
1447*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1448*4d9fdb46SRobert Mustacchi     }
1449*4d9fdb46SRobert Mustacchi     ops = head->mc_opcode_forms + index;
1450*4d9fdb46SRobert Mustacchi     *opcode_number = ops->mf_code;
1451*4d9fdb46SRobert Mustacchi     *operand_count = ops->mf_formcount;
1452*4d9fdb46SRobert Mustacchi     *operand_array = ops->mf_formbytes;
1453*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1454*4d9fdb46SRobert Mustacchi }
1455*4d9fdb46SRobert Mustacchi 
1456*4d9fdb46SRobert Mustacchi /*  The base interface to the .debug_macro section data
1457*4d9fdb46SRobert Mustacchi     for a specific CU.
1458*4d9fdb46SRobert Mustacchi 
1459*4d9fdb46SRobert Mustacchi     The version number passed back by *version_out
1460*4d9fdb46SRobert Mustacchi     may be 4 (a gnu extension of DWARF)  or 5. */
1461*4d9fdb46SRobert Mustacchi int
dwarf_get_macro_context(Dwarf_Die cu_die,Dwarf_Unsigned * version_out,Dwarf_Macro_Context * macro_context,Dwarf_Unsigned * macro_unit_offset_out,Dwarf_Unsigned * macro_ops_count_out,Dwarf_Unsigned * macro_ops_data_length,Dwarf_Error * error)1462*4d9fdb46SRobert Mustacchi dwarf_get_macro_context(Dwarf_Die cu_die,
1463*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      * version_out,
1464*4d9fdb46SRobert Mustacchi     Dwarf_Macro_Context * macro_context,
1465*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      * macro_unit_offset_out,
1466*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      * macro_ops_count_out,
1467*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      * macro_ops_data_length,
1468*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1469*4d9fdb46SRobert Mustacchi {
1470*4d9fdb46SRobert Mustacchi     int res = 0;
1471*4d9fdb46SRobert Mustacchi     Dwarf_Bool offset_specified = FALSE;
1472*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset = 0;
1473*4d9fdb46SRobert Mustacchi 
1474*4d9fdb46SRobert Mustacchi     res =  _dwarf_internal_macro_context(cu_die,
1475*4d9fdb46SRobert Mustacchi         offset_specified,
1476*4d9fdb46SRobert Mustacchi         offset,
1477*4d9fdb46SRobert Mustacchi         version_out,
1478*4d9fdb46SRobert Mustacchi         macro_context,
1479*4d9fdb46SRobert Mustacchi         macro_unit_offset_out,
1480*4d9fdb46SRobert Mustacchi         macro_ops_count_out,
1481*4d9fdb46SRobert Mustacchi         macro_ops_data_length,
1482*4d9fdb46SRobert Mustacchi         error);
1483*4d9fdb46SRobert Mustacchi     return res;
1484*4d9fdb46SRobert Mustacchi }
1485*4d9fdb46SRobert Mustacchi 
1486*4d9fdb46SRobert Mustacchi /*  Like  dwarf_get_macro_context but
1487*4d9fdb46SRobert Mustacchi     here we use a specfied offset  instead  of
1488*4d9fdb46SRobert Mustacchi     the offset in the cu_die. */
1489*4d9fdb46SRobert Mustacchi int
dwarf_get_macro_context_by_offset(Dwarf_Die cu_die,Dwarf_Unsigned offset,Dwarf_Unsigned * version_out,Dwarf_Macro_Context * macro_context,Dwarf_Unsigned * macro_ops_count_out,Dwarf_Unsigned * macro_ops_data_length,Dwarf_Error * error)1490*4d9fdb46SRobert Mustacchi dwarf_get_macro_context_by_offset(Dwarf_Die cu_die,
1491*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset,
1492*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      * version_out,
1493*4d9fdb46SRobert Mustacchi     Dwarf_Macro_Context * macro_context,
1494*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      * macro_ops_count_out,
1495*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      * macro_ops_data_length,
1496*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1497*4d9fdb46SRobert Mustacchi {
1498*4d9fdb46SRobert Mustacchi     int res = 0;
1499*4d9fdb46SRobert Mustacchi     Dwarf_Bool offset_specified = TRUE;
1500*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned macro_unit_offset_out = 0;
1501*4d9fdb46SRobert Mustacchi 
1502*4d9fdb46SRobert Mustacchi     res = _dwarf_internal_macro_context(cu_die,
1503*4d9fdb46SRobert Mustacchi         offset_specified,
1504*4d9fdb46SRobert Mustacchi         offset,
1505*4d9fdb46SRobert Mustacchi         version_out,
1506*4d9fdb46SRobert Mustacchi         macro_context,
1507*4d9fdb46SRobert Mustacchi         &macro_unit_offset_out,
1508*4d9fdb46SRobert Mustacchi         macro_ops_count_out,
1509*4d9fdb46SRobert Mustacchi         macro_ops_data_length,
1510*4d9fdb46SRobert Mustacchi         error);
1511*4d9fdb46SRobert Mustacchi     return res;
1512*4d9fdb46SRobert Mustacchi }
1513*4d9fdb46SRobert Mustacchi 
dwarf_get_macro_section_name(Dwarf_Debug dbg,const char ** sec_name_out,UNUSEDARG Dwarf_Error * error)1514*4d9fdb46SRobert Mustacchi int dwarf_get_macro_section_name(Dwarf_Debug dbg,
1515*4d9fdb46SRobert Mustacchi    const char **sec_name_out,
1516*4d9fdb46SRobert Mustacchi    UNUSEDARG Dwarf_Error *error)
1517*4d9fdb46SRobert Mustacchi {
1518*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s *sec = 0;
1519*4d9fdb46SRobert Mustacchi 
1520*4d9fdb46SRobert Mustacchi     sec = &dbg->de_debug_macro;
1521*4d9fdb46SRobert Mustacchi     if (sec->dss_size == 0) {
1522*4d9fdb46SRobert Mustacchi         /* We don't have such a  section at all. */
1523*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
1524*4d9fdb46SRobert Mustacchi     }
1525*4d9fdb46SRobert Mustacchi     *sec_name_out = sec->dss_name;
1526*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1527*4d9fdb46SRobert Mustacchi }
1528*4d9fdb46SRobert Mustacchi 
1529*4d9fdb46SRobert Mustacchi void
dwarf_dealloc_macro_context(Dwarf_Macro_Context mc)1530*4d9fdb46SRobert Mustacchi dwarf_dealloc_macro_context(Dwarf_Macro_Context mc)
1531*4d9fdb46SRobert Mustacchi {
1532*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
1533*4d9fdb46SRobert Mustacchi 
1534*4d9fdb46SRobert Mustacchi     if (!mc) {
1535*4d9fdb46SRobert Mustacchi         return;
1536*4d9fdb46SRobert Mustacchi     }
1537*4d9fdb46SRobert Mustacchi     dbg = mc->mc_dbg;
1538*4d9fdb46SRobert Mustacchi     /* See _dwarf_macro_destructor() here */
1539*4d9fdb46SRobert Mustacchi     dwarf_dealloc(dbg,mc,DW_DLA_MACRO_CONTEXT);
1540*4d9fdb46SRobert Mustacchi }
1541*4d9fdb46SRobert Mustacchi 
1542*4d9fdb46SRobert Mustacchi int
_dwarf_macro_constructor(Dwarf_Debug dbg,void * m)1543*4d9fdb46SRobert Mustacchi _dwarf_macro_constructor(Dwarf_Debug dbg, void *m)
1544*4d9fdb46SRobert Mustacchi {
1545*4d9fdb46SRobert Mustacchi     /* Nothing to do, the space is zeroed out */
1546*4d9fdb46SRobert Mustacchi     Dwarf_Macro_Context mc= (Dwarf_Macro_Context)m;
1547*4d9fdb46SRobert Mustacchi     /* Arbitrary sentinel. For debugging. */
1548*4d9fdb46SRobert Mustacchi     mc->mc_sentinel = 0xada;
1549*4d9fdb46SRobert Mustacchi     mc->mc_dbg = dbg;
1550*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1551*4d9fdb46SRobert Mustacchi }
1552*4d9fdb46SRobert Mustacchi 
1553*4d9fdb46SRobert Mustacchi /*  Here we free various fields of Dwarf_Macro_Context.
1554*4d9fdb46SRobert Mustacchi     The fields do not get dealloc'd.
1555*4d9fdb46SRobert Mustacchi     If we had a separate destructor for hand-calling
1556*4d9fdb46SRobert Mustacchi     (meaning when an error is detected during creation
1557*4d9fdb46SRobert Mustacchi     of a  Dwarf_Macro_Context)
1558*4d9fdb46SRobert Mustacchi     and one for calling by dwarf_dealloc() then
1559*4d9fdb46SRobert Mustacchi     we could have the hand-calling dwarf_dealloc the fields
1560*4d9fdb46SRobert Mustacchi     and the one called on the dealloc of a  Dwarf_Macro_Context
1561*4d9fdb46SRobert Mustacchi     could leave the _dwarf_get_alloc() fields for for
1562*4d9fdb46SRobert Mustacchi     normal dwarf_finish() cleanup.
1563*4d9fdb46SRobert Mustacchi 
1564*4d9fdb46SRobert Mustacchi     But for now we share this destructor for both purposes
1565*4d9fdb46SRobert Mustacchi     so no fields are _dwarf_get_alloc() and all are free-d
1566*4d9fdb46SRobert Mustacchi     here..
1567*4d9fdb46SRobert Mustacchi */
1568*4d9fdb46SRobert Mustacchi void
_dwarf_macro_destructor(void * m)1569*4d9fdb46SRobert Mustacchi _dwarf_macro_destructor(void *m)
1570*4d9fdb46SRobert Mustacchi {
1571*4d9fdb46SRobert Mustacchi     Dwarf_Macro_Context mc= (Dwarf_Macro_Context)m;
1572*4d9fdb46SRobert Mustacchi 
1573*4d9fdb46SRobert Mustacchi     dealloc_macro_srcfiles(mc->mc_srcfiles, mc->mc_srcfiles_count);
1574*4d9fdb46SRobert Mustacchi     mc->mc_srcfiles = 0;
1575*4d9fdb46SRobert Mustacchi     mc->mc_srcfiles_count = 0;
1576*4d9fdb46SRobert Mustacchi     free((void *)mc->mc_file_path);
1577*4d9fdb46SRobert Mustacchi     mc->mc_file_path = 0;
1578*4d9fdb46SRobert Mustacchi     free(mc->mc_ops);
1579*4d9fdb46SRobert Mustacchi     mc->mc_ops = 0;
1580*4d9fdb46SRobert Mustacchi     free(mc->mc_opcode_forms);
1581*4d9fdb46SRobert Mustacchi     mc->mc_opcode_forms = 0;
1582*4d9fdb46SRobert Mustacchi     memset(mc,0,sizeof(*mc));
1583*4d9fdb46SRobert Mustacchi     /* Just a recognizable sentinel. For debugging.  No real meaning. */
1584*4d9fdb46SRobert Mustacchi     mc->mc_sentinel = 0xdeadbeef;
1585*4d9fdb46SRobert Mustacchi }
1586