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, ¯o_attr, error);
1153*4d9fdb46SRobert Mustacchi if (resattr == DW_DLV_NO_ENTRY) {
1154*4d9fdb46SRobert Mustacchi resattr = dwarf_attr(die, DW_AT_GNU_macros, ¯o_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, ¯o_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 ¯o_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