1*4d9fdb46SRobert Mustacchi /*
2*4d9fdb46SRobert Mustacchi Copyright (C) 2000-2006 Silicon Graphics, Inc. All Rights Reserved.
3*4d9fdb46SRobert Mustacchi Portions Copyright (C) 2007-2018 David Anderson. All Rights Reserved.
4*4d9fdb46SRobert Mustacchi Portions Copyright (C) 2010-2012 SN Systems Ltd. All Rights Reserved.
5*4d9fdb46SRobert Mustacchi Portions Copyright (C) 2015-2015 Google, Inc. All Rights Reserved.
6*4d9fdb46SRobert Mustacchi
7*4d9fdb46SRobert Mustacchi This program is free software; you can redistribute it
8*4d9fdb46SRobert Mustacchi and/or modify it under the terms of version 2.1 of the
9*4d9fdb46SRobert Mustacchi GNU Lesser General Public License as published by the Free
10*4d9fdb46SRobert Mustacchi Software Foundation.
11*4d9fdb46SRobert Mustacchi
12*4d9fdb46SRobert Mustacchi This program is distributed in the hope that it would be
13*4d9fdb46SRobert Mustacchi useful, but WITHOUT ANY WARRANTY; without even the implied
14*4d9fdb46SRobert Mustacchi warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15*4d9fdb46SRobert Mustacchi PURPOSE.
16*4d9fdb46SRobert Mustacchi
17*4d9fdb46SRobert Mustacchi Further, this software is distributed without any warranty
18*4d9fdb46SRobert Mustacchi that it is free of the rightful claim of any third person
19*4d9fdb46SRobert Mustacchi regarding infringement or the like. Any license provided
20*4d9fdb46SRobert Mustacchi herein, whether implied or otherwise, applies only to this
21*4d9fdb46SRobert Mustacchi software file. Patent licenses, if any, provided herein
22*4d9fdb46SRobert Mustacchi do not apply to combinations of this program with other
23*4d9fdb46SRobert Mustacchi software, or any other product whatsoever.
24*4d9fdb46SRobert Mustacchi
25*4d9fdb46SRobert Mustacchi You should have received a copy of the GNU Lesser General
26*4d9fdb46SRobert Mustacchi Public License along with this program; if not, write
27*4d9fdb46SRobert Mustacchi the Free Software Foundation, Inc., 51 Franklin Street -
28*4d9fdb46SRobert Mustacchi Fifth Floor, Boston MA 02110-1301, USA.
29*4d9fdb46SRobert Mustacchi
30*4d9fdb46SRobert Mustacchi */
31*4d9fdb46SRobert Mustacchi
32*4d9fdb46SRobert Mustacchi /* This is #included twice. Once for
33*4d9fdb46SRobert Mustacchi libdwarf callers and one for dwarfdump which prints
34*4d9fdb46SRobert Mustacchi the internals.
35*4d9fdb46SRobert Mustacchi
36*4d9fdb46SRobert Mustacchi This way we have just one blob of code that reads
37*4d9fdb46SRobert Mustacchi the table operations. */
38*4d9fdb46SRobert Mustacchi
39*4d9fdb46SRobert Mustacchi #define TRUE 1
40*4d9fdb46SRobert Mustacchi #define FALSE 0
41*4d9fdb46SRobert Mustacchi
42*4d9fdb46SRobert Mustacchi static unsigned char
43*4d9fdb46SRobert Mustacchi dwarf_standard_opcode_operand_count[STANDARD_OPERAND_COUNT_TWO_LEVEL] = {
44*4d9fdb46SRobert Mustacchi /* DWARF2 */
45*4d9fdb46SRobert Mustacchi 0,
46*4d9fdb46SRobert Mustacchi 1, 1, 1, 1,
47*4d9fdb46SRobert Mustacchi 0, 0, 0,
48*4d9fdb46SRobert Mustacchi 1,
49*4d9fdb46SRobert Mustacchi /* Following are new for DWARF3. */
50*4d9fdb46SRobert Mustacchi 0, 0, 1,
51*4d9fdb46SRobert Mustacchi /* Experimental opcodes. */
52*4d9fdb46SRobert Mustacchi 1, 2, 0,
53*4d9fdb46SRobert Mustacchi };
54*4d9fdb46SRobert Mustacchi
55*4d9fdb46SRobert Mustacchi /* We have a normal standard opcode base, but
56*4d9fdb46SRobert Mustacchi an arm compiler emitted a non-standard table!
57*4d9fdb46SRobert Mustacchi This could lead to problems...
58*4d9fdb46SRobert Mustacchi ARM C/C++ Compiler, RVCT4.0 [Build 4
59*4d9fdb46SRobert Mustacchi 00] seems to get the table wrong . */
60*4d9fdb46SRobert Mustacchi static unsigned char
61*4d9fdb46SRobert Mustacchi dwarf_arm_standard_opcode_operand_count[STANDARD_OPERAND_COUNT_DWARF3] = {
62*4d9fdb46SRobert Mustacchi /* DWARF2 */
63*4d9fdb46SRobert Mustacchi 0,
64*4d9fdb46SRobert Mustacchi 1, 1, 1, 1,
65*4d9fdb46SRobert Mustacchi 0, 0, 0,
66*4d9fdb46SRobert Mustacchi 0, /* <<< --- this is wrong */
67*4d9fdb46SRobert Mustacchi /* Following are new for DWARF3. */
68*4d9fdb46SRobert Mustacchi 0, 0, 1
69*4d9fdb46SRobert Mustacchi };
70*4d9fdb46SRobert Mustacchi
71*4d9fdb46SRobert Mustacchi /* Rather like memcmp but identifies which value pair
72*4d9fdb46SRobert Mustacchi mismatches (the return value is non-zero if mismatch,
73*4d9fdb46SRobert Mustacchi zero if match)..
74*4d9fdb46SRobert Mustacchi mismatch_entry returns the table index that mismatches.
75*4d9fdb46SRobert Mustacchi tabval returns the table byte value.
76*4d9fdb46SRobert Mustacchi lineval returns the value from the line table header. */
77*4d9fdb46SRobert Mustacchi static int
operandmismatch(unsigned char * table,unsigned table_length,unsigned char * linetable,unsigned check_count,unsigned * mismatch_entry,unsigned * tabval,unsigned * lineval)78*4d9fdb46SRobert Mustacchi operandmismatch(unsigned char * table,unsigned table_length,
79*4d9fdb46SRobert Mustacchi unsigned char *linetable,
80*4d9fdb46SRobert Mustacchi unsigned check_count,
81*4d9fdb46SRobert Mustacchi unsigned * mismatch_entry, unsigned * tabval,unsigned *lineval)
82*4d9fdb46SRobert Mustacchi {
83*4d9fdb46SRobert Mustacchi unsigned i = 0;
84*4d9fdb46SRobert Mustacchi
85*4d9fdb46SRobert Mustacchi /* check_count better be <= table_length */
86*4d9fdb46SRobert Mustacchi for (i = 0; i<check_count; ++i) {
87*4d9fdb46SRobert Mustacchi if (i > table_length) {
88*4d9fdb46SRobert Mustacchi *mismatch_entry = i;
89*4d9fdb46SRobert Mustacchi *lineval = linetable[i];
90*4d9fdb46SRobert Mustacchi *tabval = 0; /* No entry present. */
91*4d9fdb46SRobert Mustacchi /* A kind of mismatch */
92*4d9fdb46SRobert Mustacchi return TRUE;
93*4d9fdb46SRobert Mustacchi }
94*4d9fdb46SRobert Mustacchi if (table[i] == linetable[i]) {
95*4d9fdb46SRobert Mustacchi continue;
96*4d9fdb46SRobert Mustacchi }
97*4d9fdb46SRobert Mustacchi *mismatch_entry = i;
98*4d9fdb46SRobert Mustacchi *tabval = table[i];
99*4d9fdb46SRobert Mustacchi *lineval = linetable[i];
100*4d9fdb46SRobert Mustacchi return TRUE;
101*4d9fdb46SRobert Mustacchi }
102*4d9fdb46SRobert Mustacchi /* Matches. */
103*4d9fdb46SRobert Mustacchi return FALSE;
104*4d9fdb46SRobert Mustacchi }
105*4d9fdb46SRobert Mustacchi
106*4d9fdb46SRobert Mustacchi /* Encapsulates DECODE_LEB128_UWORD_CK
107*4d9fdb46SRobert Mustacchi so the caller can free resources
108*4d9fdb46SRobert Mustacchi in case of problems. */
109*4d9fdb46SRobert Mustacchi static int
read_uword_de(Dwarf_Small ** lp,Dwarf_Unsigned * out_p,Dwarf_Debug dbg,Dwarf_Error * err,Dwarf_Small * lpend)110*4d9fdb46SRobert Mustacchi read_uword_de(Dwarf_Small **lp,
111*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *out_p,
112*4d9fdb46SRobert Mustacchi Dwarf_Debug dbg,
113*4d9fdb46SRobert Mustacchi Dwarf_Error *err,
114*4d9fdb46SRobert Mustacchi Dwarf_Small *lpend)
115*4d9fdb46SRobert Mustacchi {
116*4d9fdb46SRobert Mustacchi Dwarf_Small *inptr = *lp;
117*4d9fdb46SRobert Mustacchi Dwarf_Unsigned out = 0;
118*4d9fdb46SRobert Mustacchi DECODE_LEB128_UWORD_CK(inptr,
119*4d9fdb46SRobert Mustacchi out,
120*4d9fdb46SRobert Mustacchi dbg,err,lpend);
121*4d9fdb46SRobert Mustacchi *lp = inptr;
122*4d9fdb46SRobert Mustacchi *out_p = out;
123*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
124*4d9fdb46SRobert Mustacchi }
125*4d9fdb46SRobert Mustacchi static int
read_sword_de(Dwarf_Small ** lp,Dwarf_Signed * out_p,Dwarf_Debug dbg,Dwarf_Error * err,Dwarf_Small * lpend)126*4d9fdb46SRobert Mustacchi read_sword_de(Dwarf_Small **lp,
127*4d9fdb46SRobert Mustacchi Dwarf_Signed *out_p,
128*4d9fdb46SRobert Mustacchi Dwarf_Debug dbg,
129*4d9fdb46SRobert Mustacchi Dwarf_Error *err,
130*4d9fdb46SRobert Mustacchi Dwarf_Small *lpend)
131*4d9fdb46SRobert Mustacchi {
132*4d9fdb46SRobert Mustacchi Dwarf_Small *inptr = *lp;
133*4d9fdb46SRobert Mustacchi Dwarf_Signed out = 0;
134*4d9fdb46SRobert Mustacchi DECODE_LEB128_SWORD_CK(inptr,
135*4d9fdb46SRobert Mustacchi out,
136*4d9fdb46SRobert Mustacchi dbg,err,lpend);
137*4d9fdb46SRobert Mustacchi *lp = inptr;
138*4d9fdb46SRobert Mustacchi *out_p = out;
139*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
140*4d9fdb46SRobert Mustacchi }
141*4d9fdb46SRobert Mustacchi
142*4d9fdb46SRobert Mustacchi
143*4d9fdb46SRobert Mustacchi /* Common line table header reading code.
144*4d9fdb46SRobert Mustacchi Returns DW_DLV_OK, DW_DLV_ERROR.
145*4d9fdb46SRobert Mustacchi DW_DLV_NO_ENTRY cannot be returned, but callers should
146*4d9fdb46SRobert Mustacchi assume it is possible.
147*4d9fdb46SRobert Mustacchi
148*4d9fdb46SRobert Mustacchi The line_context area must be initialized properly before calling this.
149*4d9fdb46SRobert Mustacchi
150*4d9fdb46SRobert Mustacchi Has the side effect of allocating arrays which
151*4d9fdb46SRobert Mustacchi must be freed (see the Line_Table_Context which
152*4d9fdb46SRobert Mustacchi holds the pointers to space we allocate here).
153*4d9fdb46SRobert Mustacchi
154*4d9fdb46SRobert Mustacchi bogus_bytes_ptr and bogus_bytes are output values which
155*4d9fdb46SRobert Mustacchi let a print-program notify the user of some surprising bytes
156*4d9fdb46SRobert Mustacchi after a line table header and before the line table instructions.
157*4d9fdb46SRobert Mustacchi These can be ignored unless one is printing.
158*4d9fdb46SRobert Mustacchi And are ignored if NULL passed as the pointer.
159*4d9fdb46SRobert Mustacchi
160*4d9fdb46SRobert Mustacchi err_count_out may be NULL, in which case we
161*4d9fdb46SRobert Mustacchi make no attempt to count checking-type errors.
162*4d9fdb46SRobert Mustacchi Checking-type errors do not stop us, we just report them.
163*4d9fdb46SRobert Mustacchi
164*4d9fdb46SRobert Mustacchi See dw-linetableheader.txt for the ordering of text fields
165*4d9fdb46SRobert Mustacchi across the various dwarf versions. The code
166*4d9fdb46SRobert Mustacchi follows this ordering closely.
167*4d9fdb46SRobert Mustacchi
168*4d9fdb46SRobert Mustacchi Some of the arguments remaining are in line_context
169*4d9fdb46SRobert Mustacchi so can be deleted from the
170*4d9fdb46SRobert Mustacchi argument list (after a close look for correctness).
171*4d9fdb46SRobert Mustacchi */
172*4d9fdb46SRobert Mustacchi static int
_dwarf_read_line_table_header(Dwarf_Debug dbg,Dwarf_CU_Context cu_context,Dwarf_Small * section_start,Dwarf_Small * data_start,Dwarf_Unsigned section_length,Dwarf_Small ** updated_data_start_out,Dwarf_Line_Context line_context,Dwarf_Small ** bogus_bytes_ptr,Dwarf_Unsigned * bogus_bytes,Dwarf_Error * err,int * err_count_out)173*4d9fdb46SRobert Mustacchi _dwarf_read_line_table_header(Dwarf_Debug dbg,
174*4d9fdb46SRobert Mustacchi Dwarf_CU_Context cu_context,
175*4d9fdb46SRobert Mustacchi Dwarf_Small * section_start,
176*4d9fdb46SRobert Mustacchi Dwarf_Small * data_start,
177*4d9fdb46SRobert Mustacchi Dwarf_Unsigned section_length,
178*4d9fdb46SRobert Mustacchi Dwarf_Small ** updated_data_start_out,
179*4d9fdb46SRobert Mustacchi Dwarf_Line_Context line_context,
180*4d9fdb46SRobert Mustacchi Dwarf_Small ** bogus_bytes_ptr,
181*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *bogus_bytes,
182*4d9fdb46SRobert Mustacchi Dwarf_Error * err,
183*4d9fdb46SRobert Mustacchi int *err_count_out)
184*4d9fdb46SRobert Mustacchi {
185*4d9fdb46SRobert Mustacchi Dwarf_Small *line_ptr = data_start;
186*4d9fdb46SRobert Mustacchi Dwarf_Small *starting_line_ptr = data_start;
187*4d9fdb46SRobert Mustacchi Dwarf_Unsigned total_length = 0;
188*4d9fdb46SRobert Mustacchi int local_length_size = 0;
189*4d9fdb46SRobert Mustacchi int local_extension_size = 0;
190*4d9fdb46SRobert Mustacchi Dwarf_Unsigned prologue_length = 0;
191*4d9fdb46SRobert Mustacchi Dwarf_Half version = 0;
192*4d9fdb46SRobert Mustacchi Dwarf_Small *section_end = section_start + section_length;
193*4d9fdb46SRobert Mustacchi Dwarf_Small *line_ptr_end = 0;
194*4d9fdb46SRobert Mustacchi Dwarf_Small *lp_begin = 0;
195*4d9fdb46SRobert Mustacchi int res = 0;
196*4d9fdb46SRobert Mustacchi Dwarf_Unsigned htmp = 0;
197*4d9fdb46SRobert Mustacchi
198*4d9fdb46SRobert Mustacchi if (bogus_bytes_ptr) *bogus_bytes_ptr = 0;
199*4d9fdb46SRobert Mustacchi if (bogus_bytes) *bogus_bytes= 0;
200*4d9fdb46SRobert Mustacchi
201*4d9fdb46SRobert Mustacchi line_context->lc_line_ptr_start = starting_line_ptr;
202*4d9fdb46SRobert Mustacchi /* READ_AREA_LENGTH updates line_ptr for consumed bytes */
203*4d9fdb46SRobert Mustacchi READ_AREA_LENGTH_CK(dbg, total_length, Dwarf_Unsigned,
204*4d9fdb46SRobert Mustacchi line_ptr, local_length_size, local_extension_size,
205*4d9fdb46SRobert Mustacchi err, section_length,section_end);
206*4d9fdb46SRobert Mustacchi line_ptr_end = line_ptr + total_length;
207*4d9fdb46SRobert Mustacchi line_context->lc_line_ptr_end = line_ptr_end;
208*4d9fdb46SRobert Mustacchi line_context->lc_length_field_length = local_length_size +
209*4d9fdb46SRobert Mustacchi local_extension_size;
210*4d9fdb46SRobert Mustacchi line_context->lc_section_offset = starting_line_ptr -
211*4d9fdb46SRobert Mustacchi dbg->de_debug_line.dss_data;
212*4d9fdb46SRobert Mustacchi /* ASSERT: line_context->lc_length_field_length == line_ptr
213*4d9fdb46SRobert Mustacchi -line_context->lc_line_ptr_start; */
214*4d9fdb46SRobert Mustacchi if (line_ptr_end > section_end) {
215*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD);
216*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
217*4d9fdb46SRobert Mustacchi }
218*4d9fdb46SRobert Mustacchi line_context->lc_total_length = total_length;
219*4d9fdb46SRobert Mustacchi
220*4d9fdb46SRobert Mustacchi /* READ_UNALIGNED_CK(dbg, version, Dwarf_Half,
221*4d9fdb46SRobert Mustacchi line_ptr, DWARF_HALF_SIZE,
222*4d9fdb46SRobert Mustacchi err,line_ptr_end); */
223*4d9fdb46SRobert Mustacchi res = _dwarf_read_unaligned_ck_wrapper(dbg,
224*4d9fdb46SRobert Mustacchi &htmp,line_ptr,DWARF_HALF_SIZE,line_ptr_end,err);
225*4d9fdb46SRobert Mustacchi if (res == DW_DLV_ERROR) {
226*4d9fdb46SRobert Mustacchi return res;
227*4d9fdb46SRobert Mustacchi }
228*4d9fdb46SRobert Mustacchi version = htmp;
229*4d9fdb46SRobert Mustacchi
230*4d9fdb46SRobert Mustacchi line_context->lc_version_number = version;
231*4d9fdb46SRobert Mustacchi line_ptr += DWARF_HALF_SIZE;
232*4d9fdb46SRobert Mustacchi if (version != DW_LINE_VERSION2 &&
233*4d9fdb46SRobert Mustacchi version != DW_LINE_VERSION3 &&
234*4d9fdb46SRobert Mustacchi version != DW_LINE_VERSION4 &&
235*4d9fdb46SRobert Mustacchi version != DW_LINE_VERSION5 &&
236*4d9fdb46SRobert Mustacchi version != EXPERIMENTAL_LINE_TABLES_VERSION) {
237*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_VERSION_STAMP_ERROR);
238*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
239*4d9fdb46SRobert Mustacchi }
240*4d9fdb46SRobert Mustacchi if (version == DW_LINE_VERSION5) {
241*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
242*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD);
243*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
244*4d9fdb46SRobert Mustacchi }
245*4d9fdb46SRobert Mustacchi line_context->lc_address_size = *(unsigned char *) line_ptr;
246*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small);
247*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
248*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD);
249*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
250*4d9fdb46SRobert Mustacchi }
251*4d9fdb46SRobert Mustacchi line_context->lc_segment_selector_size =
252*4d9fdb46SRobert Mustacchi *(unsigned char *) line_ptr;
253*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small);
254*4d9fdb46SRobert Mustacchi } else {
255*4d9fdb46SRobert Mustacchi line_context->lc_address_size = cu_context->cc_address_size;
256*4d9fdb46SRobert Mustacchi line_context->lc_segment_selector_size =
257*4d9fdb46SRobert Mustacchi cu_context->cc_segment_selector_size;
258*4d9fdb46SRobert Mustacchi }
259*4d9fdb46SRobert Mustacchi
260*4d9fdb46SRobert Mustacchi READ_UNALIGNED_CK(dbg, prologue_length, Dwarf_Unsigned,
261*4d9fdb46SRobert Mustacchi line_ptr, local_length_size,
262*4d9fdb46SRobert Mustacchi err,line_ptr_end);
263*4d9fdb46SRobert Mustacchi line_context->lc_prologue_length = prologue_length;
264*4d9fdb46SRobert Mustacchi line_ptr += local_length_size;
265*4d9fdb46SRobert Mustacchi line_context->lc_line_prologue_start = line_ptr;
266*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
267*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD);
268*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
269*4d9fdb46SRobert Mustacchi }
270*4d9fdb46SRobert Mustacchi line_context->lc_minimum_instruction_length =
271*4d9fdb46SRobert Mustacchi *(unsigned char *) line_ptr;
272*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small);
273*4d9fdb46SRobert Mustacchi
274*4d9fdb46SRobert Mustacchi if (version == DW_LINE_VERSION4 ||
275*4d9fdb46SRobert Mustacchi version == DW_LINE_VERSION5 ||
276*4d9fdb46SRobert Mustacchi version == EXPERIMENTAL_LINE_TABLES_VERSION) {
277*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
278*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD);
279*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
280*4d9fdb46SRobert Mustacchi }
281*4d9fdb46SRobert Mustacchi line_context->lc_maximum_ops_per_instruction =
282*4d9fdb46SRobert Mustacchi *(unsigned char *) line_ptr;
283*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small);
284*4d9fdb46SRobert Mustacchi }
285*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
286*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD);
287*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
288*4d9fdb46SRobert Mustacchi }
289*4d9fdb46SRobert Mustacchi line_context->lc_default_is_stmt = *(unsigned char *) line_ptr;
290*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small);
291*4d9fdb46SRobert Mustacchi
292*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
293*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD);
294*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
295*4d9fdb46SRobert Mustacchi }
296*4d9fdb46SRobert Mustacchi line_context->lc_line_base = *(signed char *) line_ptr;
297*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Sbyte);
298*4d9fdb46SRobert Mustacchi if(line_ptr >= line_ptr_end) {
299*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_OFFSET_BAD);
300*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
301*4d9fdb46SRobert Mustacchi }
302*4d9fdb46SRobert Mustacchi line_context->lc_line_range = *(unsigned char *) line_ptr;
303*4d9fdb46SRobert Mustacchi if (!line_context->lc_line_range) {
304*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_RANGE_ZERO);
305*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
306*4d9fdb46SRobert Mustacchi }
307*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small);
308*4d9fdb46SRobert Mustacchi if(line_ptr >= line_ptr_end) {
309*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_OFFSET_BAD);
310*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
311*4d9fdb46SRobert Mustacchi }
312*4d9fdb46SRobert Mustacchi line_context->lc_opcode_base = *(unsigned char *) line_ptr;
313*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small);
314*4d9fdb46SRobert Mustacchi /* Set up the array of standard opcode lengths. */
315*4d9fdb46SRobert Mustacchi /* We think this works ok even for cross-endian processing of
316*4d9fdb46SRobert Mustacchi objects. It might be wrong, we might need to specially process
317*4d9fdb46SRobert Mustacchi the array of ubyte into host order. */
318*4d9fdb46SRobert Mustacchi line_context->lc_opcode_length_table = line_ptr;
319*4d9fdb46SRobert Mustacchi
320*4d9fdb46SRobert Mustacchi /* lc_opcode_base is one greater than the size of the array. */
321*4d9fdb46SRobert Mustacchi line_ptr += line_context->lc_opcode_base - 1;
322*4d9fdb46SRobert Mustacchi line_context->lc_std_op_count = line_context->lc_opcode_base -1;
323*4d9fdb46SRobert Mustacchi if(line_ptr >= line_ptr_end) {
324*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_OFFSET_BAD);
325*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
326*4d9fdb46SRobert Mustacchi }
327*4d9fdb46SRobert Mustacchi {
328*4d9fdb46SRobert Mustacchi /* Determine (as best we can) whether the
329*4d9fdb46SRobert Mustacchi lc_opcode_length_table holds 9 or 12 standard-conforming
330*4d9fdb46SRobert Mustacchi entries. gcc4 upped to DWARF3's 12 without updating the
331*4d9fdb46SRobert Mustacchi version number.
332*4d9fdb46SRobert Mustacchi EXPERIMENTAL_LINE_TABLES_VERSION upped to 15. */
333*4d9fdb46SRobert Mustacchi unsigned check_count = line_context->lc_std_op_count;
334*4d9fdb46SRobert Mustacchi unsigned tab_count = sizeof(dwarf_standard_opcode_operand_count);
335*4d9fdb46SRobert Mustacchi
336*4d9fdb46SRobert Mustacchi int operand_ck_fail = true;
337*4d9fdb46SRobert Mustacchi if (line_context->lc_std_op_count > tab_count) {
338*4d9fdb46SRobert Mustacchi _dwarf_print_header_issue(dbg,
339*4d9fdb46SRobert Mustacchi "Too many standard operands in linetable header: ",
340*4d9fdb46SRobert Mustacchi data_start,
341*4d9fdb46SRobert Mustacchi line_context->lc_std_op_count,
342*4d9fdb46SRobert Mustacchi 0,0,0,
343*4d9fdb46SRobert Mustacchi err_count_out);
344*4d9fdb46SRobert Mustacchi check_count = tab_count;
345*4d9fdb46SRobert Mustacchi }
346*4d9fdb46SRobert Mustacchi {
347*4d9fdb46SRobert Mustacchi unsigned entrynum = 0;
348*4d9fdb46SRobert Mustacchi unsigned tabv = 0;
349*4d9fdb46SRobert Mustacchi unsigned linetabv = 0;
350*4d9fdb46SRobert Mustacchi
351*4d9fdb46SRobert Mustacchi int mismatch = operandmismatch(
352*4d9fdb46SRobert Mustacchi dwarf_standard_opcode_operand_count,
353*4d9fdb46SRobert Mustacchi tab_count,
354*4d9fdb46SRobert Mustacchi line_context->lc_opcode_length_table,
355*4d9fdb46SRobert Mustacchi check_count,&entrynum,&tabv,&linetabv);
356*4d9fdb46SRobert Mustacchi if (mismatch) {
357*4d9fdb46SRobert Mustacchi if (err_count_out) {
358*4d9fdb46SRobert Mustacchi _dwarf_print_header_issue(dbg,
359*4d9fdb46SRobert Mustacchi "standard-operands did not match, checked",
360*4d9fdb46SRobert Mustacchi data_start,
361*4d9fdb46SRobert Mustacchi check_count,
362*4d9fdb46SRobert Mustacchi entrynum,tabv,linetabv,err_count_out);
363*4d9fdb46SRobert Mustacchi }
364*4d9fdb46SRobert Mustacchi if (check_count >
365*4d9fdb46SRobert Mustacchi sizeof(dwarf_arm_standard_opcode_operand_count)) {
366*4d9fdb46SRobert Mustacchi check_count =
367*4d9fdb46SRobert Mustacchi sizeof(dwarf_arm_standard_opcode_operand_count);
368*4d9fdb46SRobert Mustacchi }
369*4d9fdb46SRobert Mustacchi mismatch = operandmismatch(
370*4d9fdb46SRobert Mustacchi dwarf_arm_standard_opcode_operand_count,
371*4d9fdb46SRobert Mustacchi sizeof(dwarf_arm_standard_opcode_operand_count),
372*4d9fdb46SRobert Mustacchi line_context->lc_opcode_length_table,
373*4d9fdb46SRobert Mustacchi check_count,&entrynum,&tabv,&linetabv);
374*4d9fdb46SRobert Mustacchi if (!mismatch && err_count_out) {
375*4d9fdb46SRobert Mustacchi _dwarf_print_header_issue(dbg,
376*4d9fdb46SRobert Mustacchi "arm (incorrect) operands in use: ",
377*4d9fdb46SRobert Mustacchi data_start,
378*4d9fdb46SRobert Mustacchi check_count,
379*4d9fdb46SRobert Mustacchi entrynum,tabv,linetabv,err_count_out);
380*4d9fdb46SRobert Mustacchi }
381*4d9fdb46SRobert Mustacchi }
382*4d9fdb46SRobert Mustacchi if (!mismatch) {
383*4d9fdb46SRobert Mustacchi if (version == 2) {
384*4d9fdb46SRobert Mustacchi if (line_context->lc_std_op_count ==
385*4d9fdb46SRobert Mustacchi STANDARD_OPERAND_COUNT_DWARF3) {
386*4d9fdb46SRobert Mustacchi _dwarf_print_header_issue(dbg,
387*4d9fdb46SRobert Mustacchi "standard DWARF3 operands matched,"
388*4d9fdb46SRobert Mustacchi " but is DWARF2 linetable: count",
389*4d9fdb46SRobert Mustacchi data_start,
390*4d9fdb46SRobert Mustacchi check_count,
391*4d9fdb46SRobert Mustacchi 0,0,0, err_count_out);
392*4d9fdb46SRobert Mustacchi }
393*4d9fdb46SRobert Mustacchi }
394*4d9fdb46SRobert Mustacchi operand_ck_fail = false;
395*4d9fdb46SRobert Mustacchi }
396*4d9fdb46SRobert Mustacchi }
397*4d9fdb46SRobert Mustacchi if (operand_ck_fail) {
398*4d9fdb46SRobert Mustacchi /* Here we are not sure what the lc_std_op_count is. */
399*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUM_OPERANDS_BAD);
400*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
401*4d9fdb46SRobert Mustacchi }
402*4d9fdb46SRobert Mustacchi }
403*4d9fdb46SRobert Mustacchi /* At this point we no longer need to check operand counts. */
404*4d9fdb46SRobert Mustacchi if(line_ptr >= line_ptr_end) {
405*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_OFFSET_BAD);
406*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
407*4d9fdb46SRobert Mustacchi }
408*4d9fdb46SRobert Mustacchi
409*4d9fdb46SRobert Mustacchi if (version < DW_LINE_VERSION5){
410*4d9fdb46SRobert Mustacchi Dwarf_Unsigned directories_count = 0;
411*4d9fdb46SRobert Mustacchi Dwarf_Unsigned directories_malloc = 5;
412*4d9fdb46SRobert Mustacchi line_context->lc_include_directories =
413*4d9fdb46SRobert Mustacchi malloc(sizeof(Dwarf_Small *) * directories_malloc);
414*4d9fdb46SRobert Mustacchi if (line_context->lc_include_directories == NULL) {
415*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
416*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
417*4d9fdb46SRobert Mustacchi }
418*4d9fdb46SRobert Mustacchi memset(line_context->lc_include_directories, 0,
419*4d9fdb46SRobert Mustacchi sizeof(Dwarf_Small *) * directories_malloc);
420*4d9fdb46SRobert Mustacchi
421*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
422*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
423*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
424*4d9fdb46SRobert Mustacchi }
425*4d9fdb46SRobert Mustacchi while ((*(char *) line_ptr) != '\0') {
426*4d9fdb46SRobert Mustacchi if (directories_count >= directories_malloc) {
427*4d9fdb46SRobert Mustacchi Dwarf_Unsigned expand = 2 * directories_malloc;
428*4d9fdb46SRobert Mustacchi Dwarf_Unsigned bytesalloc = sizeof(Dwarf_Small *) * expand;
429*4d9fdb46SRobert Mustacchi Dwarf_Small **newdirs =
430*4d9fdb46SRobert Mustacchi realloc(line_context->lc_include_directories,
431*4d9fdb46SRobert Mustacchi bytesalloc);
432*4d9fdb46SRobert Mustacchi
433*4d9fdb46SRobert Mustacchi if (!newdirs) {
434*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
435*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
436*4d9fdb46SRobert Mustacchi }
437*4d9fdb46SRobert Mustacchi /* Doubled size, zero out second half. */
438*4d9fdb46SRobert Mustacchi memset(newdirs + directories_malloc, 0,
439*4d9fdb46SRobert Mustacchi sizeof(Dwarf_Small *) * directories_malloc);
440*4d9fdb46SRobert Mustacchi directories_malloc = expand;
441*4d9fdb46SRobert Mustacchi line_context->lc_include_directories = newdirs;
442*4d9fdb46SRobert Mustacchi }
443*4d9fdb46SRobert Mustacchi line_context->lc_include_directories[directories_count] =
444*4d9fdb46SRobert Mustacchi line_ptr;
445*4d9fdb46SRobert Mustacchi res = _dwarf_check_string_valid(dbg,
446*4d9fdb46SRobert Mustacchi data_start,line_ptr,line_ptr_end,
447*4d9fdb46SRobert Mustacchi DW_DLE_LINE_STRING_BAD,err);
448*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
449*4d9fdb46SRobert Mustacchi return res;
450*4d9fdb46SRobert Mustacchi }
451*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + strlen((char *) line_ptr) + 1;
452*4d9fdb46SRobert Mustacchi directories_count++;
453*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
454*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
455*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
456*4d9fdb46SRobert Mustacchi }
457*4d9fdb46SRobert Mustacchi }
458*4d9fdb46SRobert Mustacchi line_ptr++;
459*4d9fdb46SRobert Mustacchi line_context->lc_include_directories_count = directories_count;
460*4d9fdb46SRobert Mustacchi } else if (version == EXPERIMENTAL_LINE_TABLES_VERSION) {
461*4d9fdb46SRobert Mustacchi /* Empty old style dir entry list. */
462*4d9fdb46SRobert Mustacchi line_ptr++;
463*4d9fdb46SRobert Mustacchi } else if (version == DW_LINE_VERSION5) {
464*4d9fdb46SRobert Mustacchi /* handled below */
465*4d9fdb46SRobert Mustacchi } else {
466*4d9fdb46SRobert Mustacchi /* No old style directory entries. */
467*4d9fdb46SRobert Mustacchi }
468*4d9fdb46SRobert Mustacchi if(line_ptr > line_ptr_end) {
469*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_OFFSET_BAD);
470*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
471*4d9fdb46SRobert Mustacchi }
472*4d9fdb46SRobert Mustacchi if (version < DW_LINE_VERSION5) {
473*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
474*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
475*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
476*4d9fdb46SRobert Mustacchi }
477*4d9fdb46SRobert Mustacchi while (*(char *) line_ptr != '\0') {
478*4d9fdb46SRobert Mustacchi Dwarf_Unsigned utmp;
479*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dir_index = 0;
480*4d9fdb46SRobert Mustacchi Dwarf_Unsigned lastmod = 0;
481*4d9fdb46SRobert Mustacchi Dwarf_Unsigned file_length = 0;
482*4d9fdb46SRobert Mustacchi int resl = 0;
483*4d9fdb46SRobert Mustacchi Dwarf_File_Entry currfile = 0;
484*4d9fdb46SRobert Mustacchi
485*4d9fdb46SRobert Mustacchi currfile = (Dwarf_File_Entry)
486*4d9fdb46SRobert Mustacchi malloc(sizeof(struct Dwarf_File_Entry_s));
487*4d9fdb46SRobert Mustacchi if (currfile == NULL) {
488*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
489*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
490*4d9fdb46SRobert Mustacchi }
491*4d9fdb46SRobert Mustacchi memset(currfile,0,sizeof(struct Dwarf_File_Entry_s));
492*4d9fdb46SRobert Mustacchi /* Insert early so in case of error we can find
493*4d9fdb46SRobert Mustacchi and free the record. */
494*4d9fdb46SRobert Mustacchi _dwarf_add_to_files_list(line_context,currfile);
495*4d9fdb46SRobert Mustacchi
496*4d9fdb46SRobert Mustacchi currfile->fi_file_name = line_ptr;
497*4d9fdb46SRobert Mustacchi resl = _dwarf_check_string_valid(dbg,
498*4d9fdb46SRobert Mustacchi data_start,line_ptr,line_ptr_end,
499*4d9fdb46SRobert Mustacchi DW_DLE_LINE_STRING_BAD,err);
500*4d9fdb46SRobert Mustacchi if (resl != DW_DLV_OK) {
501*4d9fdb46SRobert Mustacchi return resl;
502*4d9fdb46SRobert Mustacchi }
503*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + strlen((char *) line_ptr) + 1;
504*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr, utmp,dbg,
505*4d9fdb46SRobert Mustacchi err,line_ptr_end); */
506*4d9fdb46SRobert Mustacchi res = read_uword_de(&line_ptr,&utmp,
507*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end);
508*4d9fdb46SRobert Mustacchi if (res == DW_DLV_ERROR) {
509*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
510*4d9fdb46SRobert Mustacchi }
511*4d9fdb46SRobert Mustacchi dir_index = (Dwarf_Unsigned) utmp;
512*4d9fdb46SRobert Mustacchi if (dir_index >
513*4d9fdb46SRobert Mustacchi line_context->lc_include_directories_count) {
514*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_DIR_INDEX_BAD);
515*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
516*4d9fdb46SRobert Mustacchi }
517*4d9fdb46SRobert Mustacchi currfile->fi_dir_index = dir_index;
518*4d9fdb46SRobert Mustacchi currfile->fi_dir_index_present = TRUE;
519*4d9fdb46SRobert Mustacchi
520*4d9fdb46SRobert Mustacchi /*DECODE_LEB128_UWORD_CK(line_ptr,lastmod,
521*4d9fdb46SRobert Mustacchi dbg,err, line_ptr_end); */
522*4d9fdb46SRobert Mustacchi res = read_uword_de( &line_ptr,&lastmod,
523*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end);
524*4d9fdb46SRobert Mustacchi if (res == DW_DLV_ERROR) {
525*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
526*4d9fdb46SRobert Mustacchi }
527*4d9fdb46SRobert Mustacchi
528*4d9fdb46SRobert Mustacchi
529*4d9fdb46SRobert Mustacchi currfile->fi_time_last_mod = lastmod;
530*4d9fdb46SRobert Mustacchi currfile->fi_time_last_mod_present = TRUE;
531*4d9fdb46SRobert Mustacchi
532*4d9fdb46SRobert Mustacchi DECODE_LEB128_UWORD_CK(line_ptr,file_length,
533*4d9fdb46SRobert Mustacchi dbg,err, line_ptr_end);
534*4d9fdb46SRobert Mustacchi currfile->fi_file_length = file_length;
535*4d9fdb46SRobert Mustacchi currfile->fi_file_length_present = TRUE;
536*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
537*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
538*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
539*4d9fdb46SRobert Mustacchi }
540*4d9fdb46SRobert Mustacchi }
541*4d9fdb46SRobert Mustacchi /* Skip trailing nul byte */
542*4d9fdb46SRobert Mustacchi ++line_ptr;
543*4d9fdb46SRobert Mustacchi } else if (version == EXPERIMENTAL_LINE_TABLES_VERSION) {
544*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
545*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
546*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
547*4d9fdb46SRobert Mustacchi }
548*4d9fdb46SRobert Mustacchi if (*line_ptr != 0) {
549*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
550*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
551*4d9fdb46SRobert Mustacchi }
552*4d9fdb46SRobert Mustacchi line_ptr++;
553*4d9fdb46SRobert Mustacchi } else if (version == 5) {
554*4d9fdb46SRobert Mustacchi /* handled below */
555*4d9fdb46SRobert Mustacchi } else {
556*4d9fdb46SRobert Mustacchi /* No old style filenames entries. */
557*4d9fdb46SRobert Mustacchi }
558*4d9fdb46SRobert Mustacchi if(line_ptr > line_ptr_end) {
559*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_OFFSET_BAD);
560*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
561*4d9fdb46SRobert Mustacchi }
562*4d9fdb46SRobert Mustacchi
563*4d9fdb46SRobert Mustacchi if (version == EXPERIMENTAL_LINE_TABLES_VERSION) {
564*4d9fdb46SRobert Mustacchi static unsigned char expbytes[5] = {0,0xff,0xff,0x7f, 0x7f };
565*4d9fdb46SRobert Mustacchi Dwarf_Unsigned logicals_table_offset = 0;
566*4d9fdb46SRobert Mustacchi Dwarf_Unsigned actuals_table_offset = 0;
567*4d9fdb46SRobert Mustacchi unsigned i = 0;
568*4d9fdb46SRobert Mustacchi
569*4d9fdb46SRobert Mustacchi for ( ; i < 5; ++i) {
570*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
571*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
572*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
573*4d9fdb46SRobert Mustacchi }
574*4d9fdb46SRobert Mustacchi if (*line_ptr != expbytes[i]) {
575*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
576*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
577*4d9fdb46SRobert Mustacchi }
578*4d9fdb46SRobert Mustacchi line_ptr++;
579*4d9fdb46SRobert Mustacchi }
580*4d9fdb46SRobert Mustacchi READ_UNALIGNED_CK(dbg, logicals_table_offset, Dwarf_Unsigned,
581*4d9fdb46SRobert Mustacchi line_ptr, local_length_size,err,line_ptr_end);
582*4d9fdb46SRobert Mustacchi line_context->lc_logicals_table_offset = logicals_table_offset;
583*4d9fdb46SRobert Mustacchi line_ptr += local_length_size;
584*4d9fdb46SRobert Mustacchi READ_UNALIGNED_CK(dbg, actuals_table_offset, Dwarf_Unsigned,
585*4d9fdb46SRobert Mustacchi line_ptr, local_length_size,err,line_ptr_end);
586*4d9fdb46SRobert Mustacchi line_context->lc_actuals_table_offset = actuals_table_offset;
587*4d9fdb46SRobert Mustacchi line_ptr += local_length_size;
588*4d9fdb46SRobert Mustacchi if(line_ptr > line_ptr_end) {
589*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_OFFSET_BAD);
590*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
591*4d9fdb46SRobert Mustacchi }
592*4d9fdb46SRobert Mustacchi }
593*4d9fdb46SRobert Mustacchi
594*4d9fdb46SRobert Mustacchi if (version == DW_LINE_VERSION5 ||
595*4d9fdb46SRobert Mustacchi version == EXPERIMENTAL_LINE_TABLES_VERSION) {
596*4d9fdb46SRobert Mustacchi /* DWARF 5. directory names.*/
597*4d9fdb46SRobert Mustacchi Dwarf_Unsigned directory_format_count = 0;
598*4d9fdb46SRobert Mustacchi struct Dwarf_Unsigned_Pair_s * format_values = 0;
599*4d9fdb46SRobert Mustacchi Dwarf_Unsigned directories_count = 0;
600*4d9fdb46SRobert Mustacchi Dwarf_Unsigned i = 0;
601*4d9fdb46SRobert Mustacchi Dwarf_Unsigned j = 0;
602*4d9fdb46SRobert Mustacchi int dres = 0;
603*4d9fdb46SRobert Mustacchi
604*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
605*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
606*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
607*4d9fdb46SRobert Mustacchi }
608*4d9fdb46SRobert Mustacchi directory_format_count = *(unsigned char *) line_ptr;
609*4d9fdb46SRobert Mustacchi line_context->lc_directory_entry_format_count =
610*4d9fdb46SRobert Mustacchi directory_format_count;
611*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small);
612*4d9fdb46SRobert Mustacchi if (directory_format_count > 0) {
613*4d9fdb46SRobert Mustacchi format_values = malloc(sizeof(struct Dwarf_Unsigned_Pair_s) *
614*4d9fdb46SRobert Mustacchi directory_format_count);
615*4d9fdb46SRobert Mustacchi if (format_values == NULL) {
616*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
617*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
618*4d9fdb46SRobert Mustacchi }
619*4d9fdb46SRobert Mustacchi for (i = 0; i < directory_format_count; i++) {
620*4d9fdb46SRobert Mustacchi dres=read_uword_de(&line_ptr,
621*4d9fdb46SRobert Mustacchi &format_values[i].up_first,
622*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end);
623*4d9fdb46SRobert Mustacchi if (dres != DW_DLV_OK) {
624*4d9fdb46SRobert Mustacchi free(format_values);
625*4d9fdb46SRobert Mustacchi format_values = 0;
626*4d9fdb46SRobert Mustacchi return dres;
627*4d9fdb46SRobert Mustacchi }
628*4d9fdb46SRobert Mustacchi dres=read_uword_de(&line_ptr,
629*4d9fdb46SRobert Mustacchi &format_values[i].up_second,
630*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end);
631*4d9fdb46SRobert Mustacchi if (dres != DW_DLV_OK) {
632*4d9fdb46SRobert Mustacchi free(format_values);
633*4d9fdb46SRobert Mustacchi format_values = 0;
634*4d9fdb46SRobert Mustacchi return dres;
635*4d9fdb46SRobert Mustacchi }
636*4d9fdb46SRobert Mustacchi }
637*4d9fdb46SRobert Mustacchi }
638*4d9fdb46SRobert Mustacchi dres = read_uword_de(&line_ptr,&directories_count,
639*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end);
640*4d9fdb46SRobert Mustacchi if (dres != DW_DLV_OK) {
641*4d9fdb46SRobert Mustacchi free(format_values);
642*4d9fdb46SRobert Mustacchi format_values = 0;
643*4d9fdb46SRobert Mustacchi return dres;
644*4d9fdb46SRobert Mustacchi }
645*4d9fdb46SRobert Mustacchi line_context->lc_include_directories =
646*4d9fdb46SRobert Mustacchi malloc(sizeof(Dwarf_Small *) * directories_count);
647*4d9fdb46SRobert Mustacchi if (line_context->lc_include_directories == NULL) {
648*4d9fdb46SRobert Mustacchi free(format_values);
649*4d9fdb46SRobert Mustacchi format_values = 0;
650*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
651*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
652*4d9fdb46SRobert Mustacchi }
653*4d9fdb46SRobert Mustacchi if (directory_format_count == 0 &&
654*4d9fdb46SRobert Mustacchi directories_count > 0) {
655*4d9fdb46SRobert Mustacchi free(format_values);
656*4d9fdb46SRobert Mustacchi format_values = 0;
657*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, err,
658*4d9fdb46SRobert Mustacchi DW_DLE_DIRECTORY_FORMAT_COUNT_VS_DIRECTORIES_MISMATCH,
659*4d9fdb46SRobert Mustacchi "DW_DLE_DIRECTORY_FORMAT_COUNT_VS_DIRECTORIES_MISMATCH"
660*4d9fdb46SRobert Mustacchi ": format count is zero yet directories count > 0");
661*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
662*4d9fdb46SRobert Mustacchi }
663*4d9fdb46SRobert Mustacchi memset(line_context->lc_include_directories, 0,
664*4d9fdb46SRobert Mustacchi sizeof(Dwarf_Small *) * directories_count);
665*4d9fdb46SRobert Mustacchi
666*4d9fdb46SRobert Mustacchi for(i = 0; i < directories_count; i++) {
667*4d9fdb46SRobert Mustacchi for (j = 0; j < directory_format_count; j++) {
668*4d9fdb46SRobert Mustacchi
669*4d9fdb46SRobert Mustacchi switch (format_values[j].up_first) {
670*4d9fdb46SRobert Mustacchi case DW_LNCT_path: {
671*4d9fdb46SRobert Mustacchi char *inc_dir_ptr = 0;
672*4d9fdb46SRobert Mustacchi res = _dwarf_decode_line_string_form(dbg,
673*4d9fdb46SRobert Mustacchi format_values[j].up_second,
674*4d9fdb46SRobert Mustacchi local_length_size,
675*4d9fdb46SRobert Mustacchi &line_ptr,
676*4d9fdb46SRobert Mustacchi line_ptr_end,
677*4d9fdb46SRobert Mustacchi &inc_dir_ptr,
678*4d9fdb46SRobert Mustacchi err);
679*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
680*4d9fdb46SRobert Mustacchi free(format_values);
681*4d9fdb46SRobert Mustacchi format_values = 0;
682*4d9fdb46SRobert Mustacchi return res;
683*4d9fdb46SRobert Mustacchi }
684*4d9fdb46SRobert Mustacchi line_context->lc_include_directories[i] =
685*4d9fdb46SRobert Mustacchi (unsigned char *)inc_dir_ptr;
686*4d9fdb46SRobert Mustacchi break;
687*4d9fdb46SRobert Mustacchi }
688*4d9fdb46SRobert Mustacchi default:
689*4d9fdb46SRobert Mustacchi free(format_values);
690*4d9fdb46SRobert Mustacchi format_values = 0;
691*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
692*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
693*4d9fdb46SRobert Mustacchi }
694*4d9fdb46SRobert Mustacchi }
695*4d9fdb46SRobert Mustacchi if (line_ptr > line_ptr_end) {
696*4d9fdb46SRobert Mustacchi free(format_values);
697*4d9fdb46SRobert Mustacchi format_values = 0;
698*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err,
699*4d9fdb46SRobert Mustacchi DW_DLE_LINE_NUMBER_HEADER_ERROR);
700*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
701*4d9fdb46SRobert Mustacchi }
702*4d9fdb46SRobert Mustacchi }
703*4d9fdb46SRobert Mustacchi line_context->lc_directory_format_values = format_values;
704*4d9fdb46SRobert Mustacchi format_values = 0;
705*4d9fdb46SRobert Mustacchi line_context->lc_include_directories_count = directories_count;
706*4d9fdb46SRobert Mustacchi }
707*4d9fdb46SRobert Mustacchi
708*4d9fdb46SRobert Mustacchi if (version == DW_LINE_VERSION5 ||
709*4d9fdb46SRobert Mustacchi version == EXPERIMENTAL_LINE_TABLES_VERSION) {
710*4d9fdb46SRobert Mustacchi /* DWARF 5. file names.*/
711*4d9fdb46SRobert Mustacchi struct Dwarf_Unsigned_Pair_s * filename_entry_pairs = 0;
712*4d9fdb46SRobert Mustacchi Dwarf_Unsigned filename_format_count = 0;
713*4d9fdb46SRobert Mustacchi Dwarf_Unsigned files_count = 0;
714*4d9fdb46SRobert Mustacchi Dwarf_Unsigned i = 0;
715*4d9fdb46SRobert Mustacchi Dwarf_Unsigned j = 0;
716*4d9fdb46SRobert Mustacchi int dres = 0;
717*4d9fdb46SRobert Mustacchi
718*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
719*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
720*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
721*4d9fdb46SRobert Mustacchi }
722*4d9fdb46SRobert Mustacchi filename_format_count = *(unsigned char *) line_ptr;
723*4d9fdb46SRobert Mustacchi line_context->lc_file_name_format_count =
724*4d9fdb46SRobert Mustacchi filename_format_count;
725*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small);
726*4d9fdb46SRobert Mustacchi filename_entry_pairs = malloc(
727*4d9fdb46SRobert Mustacchi sizeof(struct Dwarf_Unsigned_Pair_s) *
728*4d9fdb46SRobert Mustacchi filename_format_count);
729*4d9fdb46SRobert Mustacchi if (!filename_entry_pairs) {
730*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
731*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
732*4d9fdb46SRobert Mustacchi }
733*4d9fdb46SRobert Mustacchi for (i = 0; i < filename_format_count; i++) {
734*4d9fdb46SRobert Mustacchi dres=read_uword_de(&line_ptr,&filename_entry_pairs[i].up_first,
735*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end);
736*4d9fdb46SRobert Mustacchi if (dres != DW_DLV_OK) {
737*4d9fdb46SRobert Mustacchi free(filename_entry_pairs);
738*4d9fdb46SRobert Mustacchi return dres;
739*4d9fdb46SRobert Mustacchi }
740*4d9fdb46SRobert Mustacchi dres=read_uword_de(&line_ptr,&filename_entry_pairs[i].up_second,
741*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end);
742*4d9fdb46SRobert Mustacchi if (dres != DW_DLV_OK) {
743*4d9fdb46SRobert Mustacchi free(filename_entry_pairs);
744*4d9fdb46SRobert Mustacchi return dres;
745*4d9fdb46SRobert Mustacchi }
746*4d9fdb46SRobert Mustacchi }
747*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr, files_count,
748*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end); */
749*4d9fdb46SRobert Mustacchi dres=read_uword_de(&line_ptr,&files_count,
750*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end);
751*4d9fdb46SRobert Mustacchi if (dres != DW_DLV_OK) {
752*4d9fdb46SRobert Mustacchi free(filename_entry_pairs);
753*4d9fdb46SRobert Mustacchi return dres;
754*4d9fdb46SRobert Mustacchi }
755*4d9fdb46SRobert Mustacchi
756*4d9fdb46SRobert Mustacchi for (i = 0; i < files_count; i++) {
757*4d9fdb46SRobert Mustacchi Dwarf_File_Entry curline = 0;
758*4d9fdb46SRobert Mustacchi curline = (Dwarf_File_Entry)
759*4d9fdb46SRobert Mustacchi malloc(sizeof(struct Dwarf_File_Entry_s));
760*4d9fdb46SRobert Mustacchi if (curline == NULL) {
761*4d9fdb46SRobert Mustacchi free(filename_entry_pairs);
762*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
763*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
764*4d9fdb46SRobert Mustacchi }
765*4d9fdb46SRobert Mustacchi memset(curline,0,sizeof(*curline));
766*4d9fdb46SRobert Mustacchi _dwarf_add_to_files_list(line_context,curline);
767*4d9fdb46SRobert Mustacchi for(j = 0; j < filename_format_count; j++) {
768*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dirindex = 0;
769*4d9fdb46SRobert Mustacchi switch (filename_entry_pairs[j].up_first) {
770*4d9fdb46SRobert Mustacchi case DW_LNCT_path:
771*4d9fdb46SRobert Mustacchi res = _dwarf_decode_line_string_form(dbg,
772*4d9fdb46SRobert Mustacchi filename_entry_pairs[j].up_second,
773*4d9fdb46SRobert Mustacchi local_length_size,
774*4d9fdb46SRobert Mustacchi &line_ptr,
775*4d9fdb46SRobert Mustacchi line_ptr_end,
776*4d9fdb46SRobert Mustacchi (char **)&curline->fi_file_name,
777*4d9fdb46SRobert Mustacchi err);
778*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
779*4d9fdb46SRobert Mustacchi free(filename_entry_pairs);
780*4d9fdb46SRobert Mustacchi return res;
781*4d9fdb46SRobert Mustacchi }
782*4d9fdb46SRobert Mustacchi break;
783*4d9fdb46SRobert Mustacchi case DW_LNCT_directory_index:
784*4d9fdb46SRobert Mustacchi res = _dwarf_decode_line_udata_form(dbg,
785*4d9fdb46SRobert Mustacchi filename_entry_pairs[j].up_second,
786*4d9fdb46SRobert Mustacchi &line_ptr,
787*4d9fdb46SRobert Mustacchi &dirindex,
788*4d9fdb46SRobert Mustacchi line_ptr_end,
789*4d9fdb46SRobert Mustacchi err);
790*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
791*4d9fdb46SRobert Mustacchi free(filename_entry_pairs);
792*4d9fdb46SRobert Mustacchi return res;
793*4d9fdb46SRobert Mustacchi }
794*4d9fdb46SRobert Mustacchi curline->fi_dir_index = dirindex;
795*4d9fdb46SRobert Mustacchi curline->fi_dir_index_present = TRUE;
796*4d9fdb46SRobert Mustacchi break;
797*4d9fdb46SRobert Mustacchi case DW_LNCT_timestamp:
798*4d9fdb46SRobert Mustacchi res = _dwarf_decode_line_udata_form(dbg,
799*4d9fdb46SRobert Mustacchi filename_entry_pairs[j].up_second,
800*4d9fdb46SRobert Mustacchi &line_ptr,
801*4d9fdb46SRobert Mustacchi &curline->fi_time_last_mod,
802*4d9fdb46SRobert Mustacchi line_ptr_end,
803*4d9fdb46SRobert Mustacchi err);
804*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
805*4d9fdb46SRobert Mustacchi free(filename_entry_pairs);
806*4d9fdb46SRobert Mustacchi return res;
807*4d9fdb46SRobert Mustacchi }
808*4d9fdb46SRobert Mustacchi curline->fi_time_last_mod_present = TRUE;
809*4d9fdb46SRobert Mustacchi break;
810*4d9fdb46SRobert Mustacchi case DW_LNCT_size:
811*4d9fdb46SRobert Mustacchi res = _dwarf_decode_line_udata_form(dbg,
812*4d9fdb46SRobert Mustacchi filename_entry_pairs[j].up_second,
813*4d9fdb46SRobert Mustacchi &line_ptr,
814*4d9fdb46SRobert Mustacchi &curline->fi_file_length,
815*4d9fdb46SRobert Mustacchi line_ptr_end,
816*4d9fdb46SRobert Mustacchi err);
817*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
818*4d9fdb46SRobert Mustacchi free(filename_entry_pairs);
819*4d9fdb46SRobert Mustacchi return res;
820*4d9fdb46SRobert Mustacchi }
821*4d9fdb46SRobert Mustacchi curline->fi_file_length_present = TRUE;
822*4d9fdb46SRobert Mustacchi break;
823*4d9fdb46SRobert Mustacchi case DW_LNCT_MD5: { /* form DW_FORM_data16 */
824*4d9fdb46SRobert Mustacchi if (filename_entry_pairs[j].up_second !=
825*4d9fdb46SRobert Mustacchi DW_FORM_data16) {
826*4d9fdb46SRobert Mustacchi free(filename_entry_pairs);
827*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err,DW_DLE_LNCT_MD5_WRONG_FORM);
828*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
829*4d9fdb46SRobert Mustacchi }
830*4d9fdb46SRobert Mustacchi res = _dwarf_extract_data16(dbg,
831*4d9fdb46SRobert Mustacchi line_ptr,
832*4d9fdb46SRobert Mustacchi line_ptr,
833*4d9fdb46SRobert Mustacchi line_ptr_end,
834*4d9fdb46SRobert Mustacchi &curline->fi_md5_value,
835*4d9fdb46SRobert Mustacchi err);
836*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
837*4d9fdb46SRobert Mustacchi free(filename_entry_pairs);
838*4d9fdb46SRobert Mustacchi return res;
839*4d9fdb46SRobert Mustacchi }
840*4d9fdb46SRobert Mustacchi curline->fi_md5_present = TRUE;
841*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + sizeof(curline->fi_md5_value);
842*4d9fdb46SRobert Mustacchi }
843*4d9fdb46SRobert Mustacchi break;
844*4d9fdb46SRobert Mustacchi
845*4d9fdb46SRobert Mustacchi default:
846*4d9fdb46SRobert Mustacchi free(filename_entry_pairs);
847*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err,DW_DLE_LINE_NUMBER_HEADER_ERROR);
848*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
849*4d9fdb46SRobert Mustacchi }
850*4d9fdb46SRobert Mustacchi if (line_ptr > line_ptr_end) {
851*4d9fdb46SRobert Mustacchi free(filename_entry_pairs);
852*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
853*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
854*4d9fdb46SRobert Mustacchi }
855*4d9fdb46SRobert Mustacchi }
856*4d9fdb46SRobert Mustacchi }
857*4d9fdb46SRobert Mustacchi line_context->lc_file_format_values = filename_entry_pairs;
858*4d9fdb46SRobert Mustacchi filename_entry_pairs = 0;
859*4d9fdb46SRobert Mustacchi }
860*4d9fdb46SRobert Mustacchi /* For two-level line tables, read the subprograms table. */
861*4d9fdb46SRobert Mustacchi if (version == EXPERIMENTAL_LINE_TABLES_VERSION) {
862*4d9fdb46SRobert Mustacchi Dwarf_Unsigned subprog_format_count = 0;
863*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *subprog_entry_types = 0;
864*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *subprog_entry_forms = 0;
865*4d9fdb46SRobert Mustacchi Dwarf_Unsigned subprogs_count = 0;
866*4d9fdb46SRobert Mustacchi Dwarf_Unsigned i = 0;
867*4d9fdb46SRobert Mustacchi Dwarf_Unsigned j = 0;
868*4d9fdb46SRobert Mustacchi int dres = 0;
869*4d9fdb46SRobert Mustacchi
870*4d9fdb46SRobert Mustacchi if (line_ptr > line_ptr_end) {
871*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
872*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
873*4d9fdb46SRobert Mustacchi }
874*4d9fdb46SRobert Mustacchi subprog_format_count = *(unsigned char *) line_ptr;
875*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small);
876*4d9fdb46SRobert Mustacchi subprog_entry_types = malloc(sizeof(Dwarf_Unsigned) *
877*4d9fdb46SRobert Mustacchi subprog_format_count);
878*4d9fdb46SRobert Mustacchi if (subprog_entry_types == NULL) {
879*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
880*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
881*4d9fdb46SRobert Mustacchi }
882*4d9fdb46SRobert Mustacchi subprog_entry_forms = malloc(sizeof(Dwarf_Unsigned) *
883*4d9fdb46SRobert Mustacchi subprog_format_count);
884*4d9fdb46SRobert Mustacchi if (subprog_entry_forms == NULL) {
885*4d9fdb46SRobert Mustacchi free(subprog_entry_types);
886*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
887*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
888*4d9fdb46SRobert Mustacchi }
889*4d9fdb46SRobert Mustacchi
890*4d9fdb46SRobert Mustacchi for (i = 0; i < subprog_format_count; i++) {
891*4d9fdb46SRobert Mustacchi
892*4d9fdb46SRobert Mustacchi dres=read_uword_de(&line_ptr,subprog_entry_types+i,
893*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end);
894*4d9fdb46SRobert Mustacchi if (dres != DW_DLV_OK) {
895*4d9fdb46SRobert Mustacchi free(subprog_entry_types);
896*4d9fdb46SRobert Mustacchi free(subprog_entry_forms);
897*4d9fdb46SRobert Mustacchi return dres;
898*4d9fdb46SRobert Mustacchi }
899*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr, subprog_entry_types[i],
900*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end); */
901*4d9fdb46SRobert Mustacchi dres=read_uword_de(&line_ptr,subprog_entry_forms+i,
902*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end);
903*4d9fdb46SRobert Mustacchi if (dres != DW_DLV_OK) {
904*4d9fdb46SRobert Mustacchi free(subprog_entry_types);
905*4d9fdb46SRobert Mustacchi free(subprog_entry_forms);
906*4d9fdb46SRobert Mustacchi return dres;
907*4d9fdb46SRobert Mustacchi }
908*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr, subprog_entry_forms[i],
909*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end); */
910*4d9fdb46SRobert Mustacchi }
911*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr, subprogs_count,
912*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end); */
913*4d9fdb46SRobert Mustacchi dres=read_uword_de(&line_ptr,&subprogs_count,
914*4d9fdb46SRobert Mustacchi dbg,err,line_ptr_end);
915*4d9fdb46SRobert Mustacchi if (dres != DW_DLV_OK) {
916*4d9fdb46SRobert Mustacchi free(subprog_entry_types);
917*4d9fdb46SRobert Mustacchi free(subprog_entry_forms);
918*4d9fdb46SRobert Mustacchi return dres;
919*4d9fdb46SRobert Mustacchi }
920*4d9fdb46SRobert Mustacchi line_context->lc_subprogs =
921*4d9fdb46SRobert Mustacchi malloc(sizeof(struct Dwarf_Subprog_Entry_s) * subprogs_count);
922*4d9fdb46SRobert Mustacchi if (line_context->lc_subprogs == NULL) {
923*4d9fdb46SRobert Mustacchi free(subprog_entry_types);
924*4d9fdb46SRobert Mustacchi free(subprog_entry_forms);
925*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
926*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
927*4d9fdb46SRobert Mustacchi }
928*4d9fdb46SRobert Mustacchi memset(line_context->lc_subprogs, 0,
929*4d9fdb46SRobert Mustacchi sizeof(struct Dwarf_Subprog_Entry_s) * subprogs_count);
930*4d9fdb46SRobert Mustacchi for (i = 0; i < subprogs_count; i++) {
931*4d9fdb46SRobert Mustacchi struct Dwarf_Subprog_Entry_s *curline =
932*4d9fdb46SRobert Mustacchi line_context->lc_subprogs + i;
933*4d9fdb46SRobert Mustacchi for (j = 0; j < subprog_format_count; j++) {
934*4d9fdb46SRobert Mustacchi switch (subprog_entry_types[j]) {
935*4d9fdb46SRobert Mustacchi case DW_LNCT_GNU_subprogram_name:
936*4d9fdb46SRobert Mustacchi res = _dwarf_decode_line_string_form(dbg,
937*4d9fdb46SRobert Mustacchi subprog_entry_forms[j],
938*4d9fdb46SRobert Mustacchi local_length_size,
939*4d9fdb46SRobert Mustacchi &line_ptr,
940*4d9fdb46SRobert Mustacchi line_ptr_end,
941*4d9fdb46SRobert Mustacchi (char **)&curline->ds_subprog_name,
942*4d9fdb46SRobert Mustacchi err);
943*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
944*4d9fdb46SRobert Mustacchi free(subprog_entry_types);
945*4d9fdb46SRobert Mustacchi free(subprog_entry_forms);
946*4d9fdb46SRobert Mustacchi return res;
947*4d9fdb46SRobert Mustacchi }
948*4d9fdb46SRobert Mustacchi break;
949*4d9fdb46SRobert Mustacchi case DW_LNCT_GNU_decl_file:
950*4d9fdb46SRobert Mustacchi res = _dwarf_decode_line_udata_form(dbg,
951*4d9fdb46SRobert Mustacchi subprog_entry_forms[j],
952*4d9fdb46SRobert Mustacchi &line_ptr,
953*4d9fdb46SRobert Mustacchi &curline->ds_decl_file,
954*4d9fdb46SRobert Mustacchi line_ptr_end,
955*4d9fdb46SRobert Mustacchi err);
956*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
957*4d9fdb46SRobert Mustacchi free(subprog_entry_forms);
958*4d9fdb46SRobert Mustacchi free(subprog_entry_types);
959*4d9fdb46SRobert Mustacchi return res;
960*4d9fdb46SRobert Mustacchi }
961*4d9fdb46SRobert Mustacchi break;
962*4d9fdb46SRobert Mustacchi case DW_LNCT_GNU_decl_line:
963*4d9fdb46SRobert Mustacchi res = _dwarf_decode_line_udata_form(dbg,
964*4d9fdb46SRobert Mustacchi subprog_entry_forms[j],
965*4d9fdb46SRobert Mustacchi &line_ptr,
966*4d9fdb46SRobert Mustacchi &curline->ds_decl_line,
967*4d9fdb46SRobert Mustacchi line_ptr_end,
968*4d9fdb46SRobert Mustacchi err);
969*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
970*4d9fdb46SRobert Mustacchi free(subprog_entry_forms);
971*4d9fdb46SRobert Mustacchi free(subprog_entry_types);
972*4d9fdb46SRobert Mustacchi return res;
973*4d9fdb46SRobert Mustacchi }
974*4d9fdb46SRobert Mustacchi break;
975*4d9fdb46SRobert Mustacchi default:
976*4d9fdb46SRobert Mustacchi free(subprog_entry_forms);
977*4d9fdb46SRobert Mustacchi free(subprog_entry_types);
978*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
979*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
980*4d9fdb46SRobert Mustacchi }
981*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
982*4d9fdb46SRobert Mustacchi free(subprog_entry_types);
983*4d9fdb46SRobert Mustacchi free(subprog_entry_forms);
984*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUMBER_HEADER_ERROR);
985*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
986*4d9fdb46SRobert Mustacchi }
987*4d9fdb46SRobert Mustacchi }
988*4d9fdb46SRobert Mustacchi }
989*4d9fdb46SRobert Mustacchi
990*4d9fdb46SRobert Mustacchi free(subprog_entry_types);
991*4d9fdb46SRobert Mustacchi free(subprog_entry_forms);
992*4d9fdb46SRobert Mustacchi line_context->lc_subprogs_count = subprogs_count;
993*4d9fdb46SRobert Mustacchi }
994*4d9fdb46SRobert Mustacchi if (version == EXPERIMENTAL_LINE_TABLES_VERSION) {
995*4d9fdb46SRobert Mustacchi lp_begin = line_context->lc_line_prologue_start +
996*4d9fdb46SRobert Mustacchi line_context->lc_logicals_table_offset;
997*4d9fdb46SRobert Mustacchi } else {
998*4d9fdb46SRobert Mustacchi lp_begin = line_context->lc_line_prologue_start +
999*4d9fdb46SRobert Mustacchi line_context->lc_prologue_length;
1000*4d9fdb46SRobert Mustacchi }
1001*4d9fdb46SRobert Mustacchi if(line_ptr > line_ptr_end) {
1002*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_OFFSET_BAD);
1003*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1004*4d9fdb46SRobert Mustacchi }
1005*4d9fdb46SRobert Mustacchi if (line_ptr != lp_begin) {
1006*4d9fdb46SRobert Mustacchi if (line_ptr > lp_begin) {
1007*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_PROLOG_LENGTH_BAD);
1008*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1009*4d9fdb46SRobert Mustacchi } else {
1010*4d9fdb46SRobert Mustacchi /* Bug in compiler. These
1011*4d9fdb46SRobert Mustacchi bytes are really part of the instruction
1012*4d9fdb46SRobert Mustacchi stream. The line_context->lc_prologue_length is
1013*4d9fdb46SRobert Mustacchi wrong (12 too high). */
1014*4d9fdb46SRobert Mustacchi if (bogus_bytes_ptr) {
1015*4d9fdb46SRobert Mustacchi *bogus_bytes_ptr = line_ptr;
1016*4d9fdb46SRobert Mustacchi }
1017*4d9fdb46SRobert Mustacchi if (bogus_bytes) {
1018*4d9fdb46SRobert Mustacchi /* How far off things are. We expect the
1019*4d9fdb46SRobert Mustacchi value 12 ! */
1020*4d9fdb46SRobert Mustacchi *bogus_bytes = (lp_begin - line_ptr);
1021*4d9fdb46SRobert Mustacchi }
1022*4d9fdb46SRobert Mustacchi }
1023*4d9fdb46SRobert Mustacchi /* Ignore the lp_begin calc. Assume line_ptr right.
1024*4d9fdb46SRobert Mustacchi Making up for compiler bug. */
1025*4d9fdb46SRobert Mustacchi lp_begin = line_ptr;
1026*4d9fdb46SRobert Mustacchi }
1027*4d9fdb46SRobert Mustacchi line_context->lc_line_ptr_start = lp_begin;
1028*4d9fdb46SRobert Mustacchi if (line_context->lc_actuals_table_offset) {
1029*4d9fdb46SRobert Mustacchi /* This means two tables. */
1030*4d9fdb46SRobert Mustacchi line_context->lc_table_count = 2;
1031*4d9fdb46SRobert Mustacchi } else {
1032*4d9fdb46SRobert Mustacchi if (line_context->lc_line_ptr_end > lp_begin) {
1033*4d9fdb46SRobert Mustacchi line_context->lc_table_count = 1;
1034*4d9fdb46SRobert Mustacchi } else {
1035*4d9fdb46SRobert Mustacchi line_context->lc_table_count = 0;
1036*4d9fdb46SRobert Mustacchi }
1037*4d9fdb46SRobert Mustacchi }
1038*4d9fdb46SRobert Mustacchi *updated_data_start_out = lp_begin;
1039*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1040*4d9fdb46SRobert Mustacchi }
1041*4d9fdb46SRobert Mustacchi
1042*4d9fdb46SRobert Mustacchi
1043*4d9fdb46SRobert Mustacchi /* Read one line table program. For two-level line tables, this
1044*4d9fdb46SRobert Mustacchi function is called once for each table. */
1045*4d9fdb46SRobert Mustacchi static int
read_line_table_program(Dwarf_Debug dbg,Dwarf_Small * line_ptr,Dwarf_Small * line_ptr_end,UNUSEDARG Dwarf_Small * orig_line_ptr,Dwarf_Small * section_start,Dwarf_Line_Context line_context,Dwarf_Half address_size,Dwarf_Bool doaddrs,Dwarf_Bool dolines,Dwarf_Bool is_single_table,Dwarf_Bool is_actuals_table,Dwarf_Error * error,UNUSEDARG int * err_count_out)1046*4d9fdb46SRobert Mustacchi read_line_table_program(Dwarf_Debug dbg,
1047*4d9fdb46SRobert Mustacchi Dwarf_Small *line_ptr,
1048*4d9fdb46SRobert Mustacchi Dwarf_Small *line_ptr_end,
1049*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Small *orig_line_ptr,
1050*4d9fdb46SRobert Mustacchi Dwarf_Small *section_start,
1051*4d9fdb46SRobert Mustacchi Dwarf_Line_Context line_context,
1052*4d9fdb46SRobert Mustacchi Dwarf_Half address_size,
1053*4d9fdb46SRobert Mustacchi Dwarf_Bool doaddrs, /* Only true if SGI IRIX rqs calling. */
1054*4d9fdb46SRobert Mustacchi Dwarf_Bool dolines,
1055*4d9fdb46SRobert Mustacchi Dwarf_Bool is_single_table,
1056*4d9fdb46SRobert Mustacchi Dwarf_Bool is_actuals_table,
1057*4d9fdb46SRobert Mustacchi Dwarf_Error *error,
1058*4d9fdb46SRobert Mustacchi UNUSEDARG int *err_count_out)
1059*4d9fdb46SRobert Mustacchi {
1060*4d9fdb46SRobert Mustacchi Dwarf_Unsigned i = 0;
1061*4d9fdb46SRobert Mustacchi Dwarf_File_Entry cur_file_entry = 0;
1062*4d9fdb46SRobert Mustacchi Dwarf_Line *logicals = line_context->lc_linebuf_logicals;
1063*4d9fdb46SRobert Mustacchi Dwarf_Unsigned logicals_count = line_context->lc_linecount_logicals;
1064*4d9fdb46SRobert Mustacchi
1065*4d9fdb46SRobert Mustacchi struct Dwarf_Line_Registers_s regs;
1066*4d9fdb46SRobert Mustacchi
1067*4d9fdb46SRobert Mustacchi /* This is a pointer to the current line being added to the line
1068*4d9fdb46SRobert Mustacchi matrix. */
1069*4d9fdb46SRobert Mustacchi Dwarf_Line curr_line = 0;
1070*4d9fdb46SRobert Mustacchi
1071*4d9fdb46SRobert Mustacchi /* These variables are used to decode leb128 numbers. Leb128_num
1072*4d9fdb46SRobert Mustacchi holds the decoded number, and leb128_length is its length in
1073*4d9fdb46SRobert Mustacchi bytes. */
1074*4d9fdb46SRobert Mustacchi Dwarf_Unsigned leb128_num = 0;
1075*4d9fdb46SRobert Mustacchi Dwarf_Signed advance_line = 0;
1076*4d9fdb46SRobert Mustacchi
1077*4d9fdb46SRobert Mustacchi /* This is the operand of the latest fixed_advance_pc extended
1078*4d9fdb46SRobert Mustacchi opcode. */
1079*4d9fdb46SRobert Mustacchi Dwarf_Half fixed_advance_pc = 0;
1080*4d9fdb46SRobert Mustacchi
1081*4d9fdb46SRobert Mustacchi /* Counts the number of lines in the line matrix. */
1082*4d9fdb46SRobert Mustacchi Dwarf_Unsigned line_count = 0;
1083*4d9fdb46SRobert Mustacchi
1084*4d9fdb46SRobert Mustacchi /* This is the length of an extended opcode instr. */
1085*4d9fdb46SRobert Mustacchi Dwarf_Unsigned instr_length = 0;
1086*4d9fdb46SRobert Mustacchi
1087*4d9fdb46SRobert Mustacchi
1088*4d9fdb46SRobert Mustacchi /* Used to chain together pointers to line table entries that are
1089*4d9fdb46SRobert Mustacchi later used to create a block of Dwarf_Line entries. */
1090*4d9fdb46SRobert Mustacchi Dwarf_Chain chain_line = NULL;
1091*4d9fdb46SRobert Mustacchi Dwarf_Chain head_chain = NULL;
1092*4d9fdb46SRobert Mustacchi Dwarf_Chain curr_chain = NULL;
1093*4d9fdb46SRobert Mustacchi
1094*4d9fdb46SRobert Mustacchi /* This points to a block of Dwarf_Lines, a pointer to which is
1095*4d9fdb46SRobert Mustacchi returned in linebuf. */
1096*4d9fdb46SRobert Mustacchi Dwarf_Line *block_line = 0;
1097*4d9fdb46SRobert Mustacchi
1098*4d9fdb46SRobert Mustacchi /* Mark a line record as being DW_LNS_set_address */
1099*4d9fdb46SRobert Mustacchi Dwarf_Bool is_addr_set = false;
1100*4d9fdb46SRobert Mustacchi
1101*4d9fdb46SRobert Mustacchi
1102*4d9fdb46SRobert Mustacchi /* Initialize the one state machine variable that depends on the
1103*4d9fdb46SRobert Mustacchi prefix. */
1104*4d9fdb46SRobert Mustacchi _dwarf_set_line_table_regs_default_values(®s,
1105*4d9fdb46SRobert Mustacchi line_context->lc_version_number,
1106*4d9fdb46SRobert Mustacchi line_context->lc_default_is_stmt);
1107*4d9fdb46SRobert Mustacchi
1108*4d9fdb46SRobert Mustacchi /* Start of statement program. */
1109*4d9fdb46SRobert Mustacchi while (line_ptr < line_ptr_end) {
1110*4d9fdb46SRobert Mustacchi int type = 0;
1111*4d9fdb46SRobert Mustacchi Dwarf_Small opcode = 0;
1112*4d9fdb46SRobert Mustacchi
1113*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1114*4d9fdb46SRobert Mustacchi {
1115*4d9fdb46SRobert Mustacchi dwarfstring m9a;
1116*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&m9a);
1117*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m9a,
1118*4d9fdb46SRobert Mustacchi " [0x%06" DW_PR_DSx "] ",
1119*4d9fdb46SRobert Mustacchi (line_ptr - section_start));
1120*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&m9a));
1121*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&m9a);
1122*4d9fdb46SRobert Mustacchi }
1123*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1124*4d9fdb46SRobert Mustacchi opcode = *(Dwarf_Small *) line_ptr;
1125*4d9fdb46SRobert Mustacchi line_ptr++;
1126*4d9fdb46SRobert Mustacchi /* 'type' is the output */
1127*4d9fdb46SRobert Mustacchi WHAT_IS_OPCODE(type, opcode, line_context->lc_opcode_base,
1128*4d9fdb46SRobert Mustacchi line_context->lc_opcode_length_table, line_ptr,
1129*4d9fdb46SRobert Mustacchi line_context->lc_std_op_count);
1130*4d9fdb46SRobert Mustacchi
1131*4d9fdb46SRobert Mustacchi if (type == LOP_DISCARD) {
1132*4d9fdb46SRobert Mustacchi int oc = 0;
1133*4d9fdb46SRobert Mustacchi int opcnt = line_context->lc_opcode_length_table[opcode];
1134*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1135*4d9fdb46SRobert Mustacchi {
1136*4d9fdb46SRobert Mustacchi dwarfstring m9b;
1137*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&m9b);
1138*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&m9b,
1139*4d9fdb46SRobert Mustacchi "*** DWARF CHECK: DISCARD standard opcode %d ",
1140*4d9fdb46SRobert Mustacchi opcode);
1141*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&m9b,
1142*4d9fdb46SRobert Mustacchi "with %d operands: not understood.", opcnt);
1143*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&m9b));
1144*4d9fdb46SRobert Mustacchi *err_count_out += 1;
1145*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&m9b);
1146*4d9fdb46SRobert Mustacchi }
1147*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1148*4d9fdb46SRobert Mustacchi for (oc = 0; oc < opcnt; oc++) {
1149*4d9fdb46SRobert Mustacchi int ocres = 0;
1150*4d9fdb46SRobert Mustacchi /* Read and discard operands we don't
1151*4d9fdb46SRobert Mustacchi understand.
1152*4d9fdb46SRobert Mustacchi arbitrary choice of unsigned read.
1153*4d9fdb46SRobert Mustacchi signed read would work as well. */
1154*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Unsigned utmp2 = 0;
1155*4d9fdb46SRobert Mustacchi
1156*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr, utmp2,
1157*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
1158*4d9fdb46SRobert Mustacchi ocres = read_uword_de( &line_ptr,&utmp2,
1159*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
1160*4d9fdb46SRobert Mustacchi if (ocres == DW_DLV_ERROR) {
1161*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1162*4d9fdb46SRobert Mustacchi line_count);
1163*4d9fdb46SRobert Mustacchi if(curr_line) {
1164*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1165*4d9fdb46SRobert Mustacchi curr_line = 0;
1166*4d9fdb46SRobert Mustacchi }
1167*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1168*4d9fdb46SRobert Mustacchi }
1169*4d9fdb46SRobert Mustacchi
1170*4d9fdb46SRobert Mustacchi
1171*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1172*4d9fdb46SRobert Mustacchi {
1173*4d9fdb46SRobert Mustacchi dwarfstring m9e;
1174*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&m9e);
1175*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m9e,
1176*4d9fdb46SRobert Mustacchi " %" DW_PR_DUu,
1177*4d9fdb46SRobert Mustacchi utmp2);
1178*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m9e,
1179*4d9fdb46SRobert Mustacchi " (0x%" DW_PR_XZEROS DW_PR_DUx ")",
1180*4d9fdb46SRobert Mustacchi utmp2);
1181*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&m9e));
1182*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&m9e);
1183*4d9fdb46SRobert Mustacchi }
1184*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1185*4d9fdb46SRobert Mustacchi }
1186*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1187*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,"***\n");
1188*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1189*4d9fdb46SRobert Mustacchi } else if (type == LOP_SPECIAL) {
1190*4d9fdb46SRobert Mustacchi /* This op code is a special op in the object, no matter
1191*4d9fdb46SRobert Mustacchi that it might fall into the standard op range in this
1192*4d9fdb46SRobert Mustacchi compile. That is, these are special opcodes between
1193*4d9fdb46SRobert Mustacchi opcode_base and MAX_LINE_OP_CODE. (including
1194*4d9fdb46SRobert Mustacchi opcode_base and MAX_LINE_OP_CODE) */
1195*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1196*4d9fdb46SRobert Mustacchi unsigned origop = opcode;
1197*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1198*4d9fdb46SRobert Mustacchi Dwarf_Unsigned operation_advance = 0;
1199*4d9fdb46SRobert Mustacchi
1200*4d9fdb46SRobert Mustacchi opcode = opcode - line_context->lc_opcode_base;
1201*4d9fdb46SRobert Mustacchi operation_advance = (opcode / line_context->lc_line_range);
1202*4d9fdb46SRobert Mustacchi
1203*4d9fdb46SRobert Mustacchi if (line_context->lc_maximum_ops_per_instruction < 2) {
1204*4d9fdb46SRobert Mustacchi regs.lr_address = regs.lr_address + (operation_advance *
1205*4d9fdb46SRobert Mustacchi line_context->lc_minimum_instruction_length);
1206*4d9fdb46SRobert Mustacchi } else {
1207*4d9fdb46SRobert Mustacchi regs.lr_address = regs.lr_address +
1208*4d9fdb46SRobert Mustacchi (line_context->lc_minimum_instruction_length *
1209*4d9fdb46SRobert Mustacchi ((regs.lr_op_index + operation_advance)/
1210*4d9fdb46SRobert Mustacchi line_context->lc_maximum_ops_per_instruction));
1211*4d9fdb46SRobert Mustacchi regs.lr_op_index = (regs.lr_op_index +operation_advance)%
1212*4d9fdb46SRobert Mustacchi line_context->lc_maximum_ops_per_instruction;
1213*4d9fdb46SRobert Mustacchi }
1214*4d9fdb46SRobert Mustacchi
1215*4d9fdb46SRobert Mustacchi regs.lr_line = regs.lr_line + line_context->lc_line_base +
1216*4d9fdb46SRobert Mustacchi opcode % line_context->lc_line_range;
1217*4d9fdb46SRobert Mustacchi if ((Dwarf_Signed)regs.lr_line < 0) {
1218*4d9fdb46SRobert Mustacchi /* Something is badly wrong */
1219*4d9fdb46SRobert Mustacchi dwarfstring m;
1220*4d9fdb46SRobert Mustacchi
1221*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&m);
1222*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&m,
1223*4d9fdb46SRobert Mustacchi "\nERROR: DW_DLE_LINE_TABLE_LINENO_ERROR "
1224*4d9fdb46SRobert Mustacchi "The line number computes as %d "
1225*4d9fdb46SRobert Mustacchi "and negative line numbers "
1226*4d9fdb46SRobert Mustacchi "are not correct.",(Dwarf_Signed)regs.lr_line);
1227*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, error,
1228*4d9fdb46SRobert Mustacchi DW_DLE_LINE_TABLE_LINENO_ERROR,
1229*4d9fdb46SRobert Mustacchi dwarfstring_string(&m));
1230*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&m);
1231*4d9fdb46SRobert Mustacchi regs.lr_line = 0;
1232*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1233*4d9fdb46SRobert Mustacchi }
1234*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1235*4d9fdb46SRobert Mustacchi {
1236*4d9fdb46SRobert Mustacchi dwarfstring ma;
1237*4d9fdb46SRobert Mustacchi dwarfstring mb;
1238*4d9fdb46SRobert Mustacchi
1239*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&ma);
1240*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mb);
1241*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,"Specialop %3u", origop);
1242*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&ma));
1243*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&ma);
1244*4d9fdb46SRobert Mustacchi print_line_detail(dbg,dwarfstring_string(&mb),
1245*4d9fdb46SRobert Mustacchi opcode,line_count+1, ®s,is_single_table, is_actuals_table);
1246*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mb);
1247*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&ma);
1248*4d9fdb46SRobert Mustacchi }
1249*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1250*4d9fdb46SRobert Mustacchi
1251*4d9fdb46SRobert Mustacchi if (dolines) {
1252*4d9fdb46SRobert Mustacchi curr_line =
1253*4d9fdb46SRobert Mustacchi (Dwarf_Line) _dwarf_get_alloc(dbg, DW_DLA_LINE, 1);
1254*4d9fdb46SRobert Mustacchi if (curr_line == NULL) {
1255*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
1256*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
1257*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1258*4d9fdb46SRobert Mustacchi }
1259*4d9fdb46SRobert Mustacchi
1260*4d9fdb46SRobert Mustacchi /* Mark a line record as being DW_LNS_set_address */
1261*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_is_addr_set =
1262*4d9fdb46SRobert Mustacchi is_addr_set;
1263*4d9fdb46SRobert Mustacchi is_addr_set = false;
1264*4d9fdb46SRobert Mustacchi curr_line->li_address = regs.lr_address;
1265*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_file =
1266*4d9fdb46SRobert Mustacchi (Dwarf_Signed) regs.lr_file;
1267*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_line =
1268*4d9fdb46SRobert Mustacchi (Dwarf_Signed) regs.lr_line;
1269*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_column =
1270*4d9fdb46SRobert Mustacchi (Dwarf_Half) regs.lr_column;
1271*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_is_stmt =
1272*4d9fdb46SRobert Mustacchi regs.lr_is_stmt;
1273*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_basic_block =
1274*4d9fdb46SRobert Mustacchi regs.lr_basic_block;
1275*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_end_sequence =
1276*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.
1277*4d9fdb46SRobert Mustacchi li_epilogue_begin = regs.lr_epilogue_begin;
1278*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_prologue_end =
1279*4d9fdb46SRobert Mustacchi regs.lr_prologue_end;
1280*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_isa = regs.lr_isa;
1281*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_discriminator =
1282*4d9fdb46SRobert Mustacchi regs.lr_discriminator;
1283*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_call_context =
1284*4d9fdb46SRobert Mustacchi regs.lr_call_context;
1285*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_subprogram =
1286*4d9fdb46SRobert Mustacchi regs.lr_subprogram;
1287*4d9fdb46SRobert Mustacchi curr_line->li_context = line_context;
1288*4d9fdb46SRobert Mustacchi curr_line->li_is_actuals_table = is_actuals_table;
1289*4d9fdb46SRobert Mustacchi line_count++;
1290*4d9fdb46SRobert Mustacchi
1291*4d9fdb46SRobert Mustacchi chain_line = (Dwarf_Chain)
1292*4d9fdb46SRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
1293*4d9fdb46SRobert Mustacchi if (chain_line == NULL) {
1294*4d9fdb46SRobert Mustacchi if(curr_line) {
1295*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1296*4d9fdb46SRobert Mustacchi }
1297*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
1298*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
1299*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1300*4d9fdb46SRobert Mustacchi }
1301*4d9fdb46SRobert Mustacchi chain_line->ch_itemtype = DW_DLA_LINE;
1302*4d9fdb46SRobert Mustacchi chain_line->ch_item = curr_line;
1303*4d9fdb46SRobert Mustacchi _dwarf_update_chain_list(chain_line,&head_chain,&curr_chain);
1304*4d9fdb46SRobert Mustacchi curr_line = 0;
1305*4d9fdb46SRobert Mustacchi }
1306*4d9fdb46SRobert Mustacchi
1307*4d9fdb46SRobert Mustacchi regs.lr_basic_block = false;
1308*4d9fdb46SRobert Mustacchi regs.lr_prologue_end = false;
1309*4d9fdb46SRobert Mustacchi regs.lr_epilogue_begin = false;
1310*4d9fdb46SRobert Mustacchi regs.lr_discriminator = 0;
1311*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1312*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1313*4d9fdb46SRobert Mustacchi } else if (type == LOP_STANDARD) {
1314*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1315*4d9fdb46SRobert Mustacchi dwarfstring mb;
1316*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1317*4d9fdb46SRobert Mustacchi
1318*4d9fdb46SRobert Mustacchi switch (opcode) {
1319*4d9fdb46SRobert Mustacchi
1320*4d9fdb46SRobert Mustacchi case DW_LNS_copy:{
1321*4d9fdb46SRobert Mustacchi
1322*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1323*4d9fdb46SRobert Mustacchi print_line_detail(dbg,"DW_LNS_copy",
1324*4d9fdb46SRobert Mustacchi opcode,line_count+1, ®s,is_single_table, is_actuals_table);
1325*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1326*4d9fdb46SRobert Mustacchi if (dolines) {
1327*4d9fdb46SRobert Mustacchi curr_line = (Dwarf_Line) _dwarf_get_alloc(dbg,
1328*4d9fdb46SRobert Mustacchi DW_DLA_LINE, 1);
1329*4d9fdb46SRobert Mustacchi if (curr_line == NULL) {
1330*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
1331*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
1332*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1333*4d9fdb46SRobert Mustacchi }
1334*4d9fdb46SRobert Mustacchi
1335*4d9fdb46SRobert Mustacchi /* Mark a line record as DW_LNS_set_address */
1336*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_is_addr_set =
1337*4d9fdb46SRobert Mustacchi is_addr_set;
1338*4d9fdb46SRobert Mustacchi is_addr_set = false;
1339*4d9fdb46SRobert Mustacchi
1340*4d9fdb46SRobert Mustacchi curr_line->li_address = regs.lr_address;
1341*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_file =
1342*4d9fdb46SRobert Mustacchi (Dwarf_Signed) regs.lr_file;
1343*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_line =
1344*4d9fdb46SRobert Mustacchi (Dwarf_Signed) regs.lr_line;
1345*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_column =
1346*4d9fdb46SRobert Mustacchi (Dwarf_Half) regs.lr_column;
1347*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_is_stmt =
1348*4d9fdb46SRobert Mustacchi regs.lr_is_stmt;
1349*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.
1350*4d9fdb46SRobert Mustacchi li_basic_block = regs.lr_basic_block;
1351*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.
1352*4d9fdb46SRobert Mustacchi li_end_sequence = regs.lr_end_sequence;
1353*4d9fdb46SRobert Mustacchi curr_line->li_context = line_context;
1354*4d9fdb46SRobert Mustacchi curr_line->li_is_actuals_table = is_actuals_table;
1355*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.
1356*4d9fdb46SRobert Mustacchi li_epilogue_begin = regs.lr_epilogue_begin;
1357*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.
1358*4d9fdb46SRobert Mustacchi li_prologue_end = regs.lr_prologue_end;
1359*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_isa = regs.lr_isa;
1360*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_discriminator =
1361*4d9fdb46SRobert Mustacchi regs.lr_discriminator;
1362*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_call_context =
1363*4d9fdb46SRobert Mustacchi regs.lr_call_context;
1364*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_subprogram =
1365*4d9fdb46SRobert Mustacchi regs.lr_subprogram;
1366*4d9fdb46SRobert Mustacchi line_count++;
1367*4d9fdb46SRobert Mustacchi
1368*4d9fdb46SRobert Mustacchi chain_line = (Dwarf_Chain)
1369*4d9fdb46SRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
1370*4d9fdb46SRobert Mustacchi if (chain_line == NULL) {
1371*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1372*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1373*4d9fdb46SRobert Mustacchi line_count);
1374*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
1375*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1376*4d9fdb46SRobert Mustacchi }
1377*4d9fdb46SRobert Mustacchi chain_line->ch_itemtype = DW_DLA_LINE;
1378*4d9fdb46SRobert Mustacchi chain_line->ch_item = curr_line;
1379*4d9fdb46SRobert Mustacchi _dwarf_update_chain_list(chain_line,&head_chain,
1380*4d9fdb46SRobert Mustacchi &curr_chain);
1381*4d9fdb46SRobert Mustacchi curr_line = 0;
1382*4d9fdb46SRobert Mustacchi }
1383*4d9fdb46SRobert Mustacchi
1384*4d9fdb46SRobert Mustacchi regs.lr_basic_block = false;
1385*4d9fdb46SRobert Mustacchi regs.lr_prologue_end = false;
1386*4d9fdb46SRobert Mustacchi regs.lr_epilogue_begin = false;
1387*4d9fdb46SRobert Mustacchi regs.lr_discriminator = 0;
1388*4d9fdb46SRobert Mustacchi }
1389*4d9fdb46SRobert Mustacchi break;
1390*4d9fdb46SRobert Mustacchi case DW_LNS_advance_pc:{
1391*4d9fdb46SRobert Mustacchi Dwarf_Unsigned utmp2 = 0;
1392*4d9fdb46SRobert Mustacchi int advres = 0;
1393*4d9fdb46SRobert Mustacchi
1394*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr, utmp2,
1395*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
1396*4d9fdb46SRobert Mustacchi advres = read_uword_de( &line_ptr,&utmp2,
1397*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
1398*4d9fdb46SRobert Mustacchi if (advres == DW_DLV_ERROR) {
1399*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1400*4d9fdb46SRobert Mustacchi line_count);
1401*4d9fdb46SRobert Mustacchi if(curr_line) {
1402*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1403*4d9fdb46SRobert Mustacchi }
1404*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1405*4d9fdb46SRobert Mustacchi }
1406*4d9fdb46SRobert Mustacchi
1407*4d9fdb46SRobert Mustacchi
1408*4d9fdb46SRobert Mustacchi
1409*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1410*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mb);
1411*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&mb,
1412*4d9fdb46SRobert Mustacchi "DW_LNS_advance_pc val %" DW_PR_DSd,
1413*4d9fdb46SRobert Mustacchi utmp2);
1414*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1415*4d9fdb46SRobert Mustacchi " 0x%" DW_PR_XZEROS DW_PR_DUx "\n",
1416*4d9fdb46SRobert Mustacchi utmp2);
1417*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&mb));
1418*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mb);
1419*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1420*4d9fdb46SRobert Mustacchi leb128_num = utmp2;
1421*4d9fdb46SRobert Mustacchi regs.lr_address = regs.lr_address +
1422*4d9fdb46SRobert Mustacchi line_context->lc_minimum_instruction_length *
1423*4d9fdb46SRobert Mustacchi leb128_num;
1424*4d9fdb46SRobert Mustacchi }
1425*4d9fdb46SRobert Mustacchi break;
1426*4d9fdb46SRobert Mustacchi case DW_LNS_advance_line:{
1427*4d9fdb46SRobert Mustacchi Dwarf_Signed stmp = 0;
1428*4d9fdb46SRobert Mustacchi int alres = 0;
1429*4d9fdb46SRobert Mustacchi
1430*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_SWORD_CK(line_ptr, stmp,
1431*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
1432*4d9fdb46SRobert Mustacchi alres = read_sword_de( &line_ptr,&stmp,
1433*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
1434*4d9fdb46SRobert Mustacchi if (alres == DW_DLV_ERROR) {
1435*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1436*4d9fdb46SRobert Mustacchi line_count);
1437*4d9fdb46SRobert Mustacchi if(curr_line) {
1438*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1439*4d9fdb46SRobert Mustacchi }
1440*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1441*4d9fdb46SRobert Mustacchi }
1442*4d9fdb46SRobert Mustacchi advance_line = (Dwarf_Signed) stmp;
1443*4d9fdb46SRobert Mustacchi
1444*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1445*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mb);
1446*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&mb,
1447*4d9fdb46SRobert Mustacchi "DW_LNS_advance_line val %" DW_PR_DSd,
1448*4d9fdb46SRobert Mustacchi advance_line);
1449*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1450*4d9fdb46SRobert Mustacchi " 0x%" DW_PR_XZEROS DW_PR_DSx "\n",
1451*4d9fdb46SRobert Mustacchi advance_line);
1452*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&mb));
1453*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mb);
1454*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1455*4d9fdb46SRobert Mustacchi regs.lr_line = regs.lr_line + advance_line;
1456*4d9fdb46SRobert Mustacchi if ((Dwarf_Signed)regs.lr_line < 0) {
1457*4d9fdb46SRobert Mustacchi dwarfstring m;
1458*4d9fdb46SRobert Mustacchi
1459*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&m);
1460*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&m,
1461*4d9fdb46SRobert Mustacchi "\nERROR: DW_DLE_LINE_TABLE_LINENO_ERROR"
1462*4d9fdb46SRobert Mustacchi " The line number is %d "
1463*4d9fdb46SRobert Mustacchi "and negative line numbers after "
1464*4d9fdb46SRobert Mustacchi "DW_LNS_ADVANCE_LINE ",
1465*4d9fdb46SRobert Mustacchi (Dwarf_Signed)regs.lr_line);
1466*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&m,
1467*4d9fdb46SRobert Mustacchi " of %d "
1468*4d9fdb46SRobert Mustacchi "are not correct.",stmp);
1469*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, error,
1470*4d9fdb46SRobert Mustacchi DW_DLE_LINE_TABLE_LINENO_ERROR,
1471*4d9fdb46SRobert Mustacchi dwarfstring_string(&m));
1472*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&m);
1473*4d9fdb46SRobert Mustacchi regs.lr_line = 0;
1474*4d9fdb46SRobert Mustacchi if(curr_line) {
1475*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1476*4d9fdb46SRobert Mustacchi }
1477*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
1478*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1479*4d9fdb46SRobert Mustacchi }
1480*4d9fdb46SRobert Mustacchi }
1481*4d9fdb46SRobert Mustacchi break;
1482*4d9fdb46SRobert Mustacchi case DW_LNS_set_file:{
1483*4d9fdb46SRobert Mustacchi Dwarf_Unsigned utmp2 = 0;
1484*4d9fdb46SRobert Mustacchi int sfres = 0;
1485*4d9fdb46SRobert Mustacchi
1486*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr, utmp2,
1487*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
1488*4d9fdb46SRobert Mustacchi sfres = read_uword_de( &line_ptr,&utmp2,
1489*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
1490*4d9fdb46SRobert Mustacchi if (sfres == DW_DLV_ERROR) {
1491*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1492*4d9fdb46SRobert Mustacchi line_count);
1493*4d9fdb46SRobert Mustacchi if(curr_line) {
1494*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1495*4d9fdb46SRobert Mustacchi }
1496*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1497*4d9fdb46SRobert Mustacchi }
1498*4d9fdb46SRobert Mustacchi
1499*4d9fdb46SRobert Mustacchi regs.lr_file = utmp2;
1500*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1501*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mb);
1502*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&mb,
1503*4d9fdb46SRobert Mustacchi "DW_LNS_set_file %ld\n",
1504*4d9fdb46SRobert Mustacchi regs.lr_file);
1505*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&mb));
1506*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mb);
1507*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1508*4d9fdb46SRobert Mustacchi }
1509*4d9fdb46SRobert Mustacchi break;
1510*4d9fdb46SRobert Mustacchi case DW_LNS_set_column:{
1511*4d9fdb46SRobert Mustacchi Dwarf_Unsigned utmp2 = 0;
1512*4d9fdb46SRobert Mustacchi int scres = 0;
1513*4d9fdb46SRobert Mustacchi
1514*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr, utmp2,
1515*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
1516*4d9fdb46SRobert Mustacchi scres = read_uword_de( &line_ptr,&utmp2,
1517*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
1518*4d9fdb46SRobert Mustacchi if (scres == DW_DLV_ERROR) {
1519*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1520*4d9fdb46SRobert Mustacchi line_count);
1521*4d9fdb46SRobert Mustacchi if(curr_line) {
1522*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1523*4d9fdb46SRobert Mustacchi }
1524*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1525*4d9fdb46SRobert Mustacchi }
1526*4d9fdb46SRobert Mustacchi
1527*4d9fdb46SRobert Mustacchi regs.lr_column = utmp2;
1528*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1529*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mb);
1530*4d9fdb46SRobert Mustacchi
1531*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&mb,
1532*4d9fdb46SRobert Mustacchi "DW_LNS_set_column val %" DW_PR_DSd ,
1533*4d9fdb46SRobert Mustacchi regs.lr_column);
1534*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1535*4d9fdb46SRobert Mustacchi " 0x%" DW_PR_XZEROS DW_PR_DSx "\n",
1536*4d9fdb46SRobert Mustacchi regs.lr_column);
1537*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&mb));
1538*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mb);
1539*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1540*4d9fdb46SRobert Mustacchi }
1541*4d9fdb46SRobert Mustacchi break;
1542*4d9fdb46SRobert Mustacchi case DW_LNS_negate_stmt:{
1543*4d9fdb46SRobert Mustacchi regs.lr_is_stmt = !regs.lr_is_stmt;
1544*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1545*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg, "DW_LNS_negate_stmt\n");
1546*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1547*4d9fdb46SRobert Mustacchi }
1548*4d9fdb46SRobert Mustacchi break;
1549*4d9fdb46SRobert Mustacchi case DW_LNS_set_basic_block:{
1550*4d9fdb46SRobert Mustacchi regs.lr_basic_block = true;
1551*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1552*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,
1553*4d9fdb46SRobert Mustacchi "DW_LNS_set_basic_block\n");
1554*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1555*4d9fdb46SRobert Mustacchi }
1556*4d9fdb46SRobert Mustacchi break;
1557*4d9fdb46SRobert Mustacchi
1558*4d9fdb46SRobert Mustacchi case DW_LNS_const_add_pc:{
1559*4d9fdb46SRobert Mustacchi opcode = MAX_LINE_OP_CODE -
1560*4d9fdb46SRobert Mustacchi line_context->lc_opcode_base;
1561*4d9fdb46SRobert Mustacchi if (line_context->lc_maximum_ops_per_instruction < 2) {
1562*4d9fdb46SRobert Mustacchi Dwarf_Unsigned operation_advance =
1563*4d9fdb46SRobert Mustacchi (opcode / line_context->lc_line_range);
1564*4d9fdb46SRobert Mustacchi regs.lr_address = regs.lr_address +
1565*4d9fdb46SRobert Mustacchi line_context->lc_minimum_instruction_length *
1566*4d9fdb46SRobert Mustacchi operation_advance;
1567*4d9fdb46SRobert Mustacchi } else {
1568*4d9fdb46SRobert Mustacchi Dwarf_Unsigned operation_advance =
1569*4d9fdb46SRobert Mustacchi (opcode / line_context->lc_line_range);
1570*4d9fdb46SRobert Mustacchi regs.lr_address = regs.lr_address +
1571*4d9fdb46SRobert Mustacchi line_context->lc_minimum_instruction_length *
1572*4d9fdb46SRobert Mustacchi ((regs.lr_op_index + operation_advance)/
1573*4d9fdb46SRobert Mustacchi line_context->lc_maximum_ops_per_instruction);
1574*4d9fdb46SRobert Mustacchi regs.lr_op_index = (regs.lr_op_index +operation_advance)%
1575*4d9fdb46SRobert Mustacchi line_context->lc_maximum_ops_per_instruction;
1576*4d9fdb46SRobert Mustacchi }
1577*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1578*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mb);
1579*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1580*4d9fdb46SRobert Mustacchi "DW_LNS_const_add_pc new address 0x%"
1581*4d9fdb46SRobert Mustacchi DW_PR_XZEROS DW_PR_DSx "\n",
1582*4d9fdb46SRobert Mustacchi regs.lr_address);
1583*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&mb));
1584*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mb);
1585*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1586*4d9fdb46SRobert Mustacchi }
1587*4d9fdb46SRobert Mustacchi break;
1588*4d9fdb46SRobert Mustacchi case DW_LNS_fixed_advance_pc:{
1589*4d9fdb46SRobert Mustacchi Dwarf_Unsigned fpc = 0;
1590*4d9fdb46SRobert Mustacchi int apres = 0;
1591*4d9fdb46SRobert Mustacchi /*READ_UNALIGNED_CK(dbg, fixed_advance_pc,
1592*4d9fdb46SRobert Mustacchi Dwarf_Half, line_ptr,
1593*4d9fdb46SRobert Mustacchi DWARF_HALF_SIZE,error,line_ptr_end); */
1594*4d9fdb46SRobert Mustacchi apres = _dwarf_read_unaligned_ck_wrapper(dbg,
1595*4d9fdb46SRobert Mustacchi &fpc,line_ptr,DWARF_HALF_SIZE,line_ptr_end,
1596*4d9fdb46SRobert Mustacchi error);
1597*4d9fdb46SRobert Mustacchi fixed_advance_pc = fpc;
1598*4d9fdb46SRobert Mustacchi if (apres == DW_DLV_ERROR) {
1599*4d9fdb46SRobert Mustacchi if(curr_line) {
1600*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1601*4d9fdb46SRobert Mustacchi }
1602*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1603*4d9fdb46SRobert Mustacchi line_count);
1604*4d9fdb46SRobert Mustacchi return apres;
1605*4d9fdb46SRobert Mustacchi }
1606*4d9fdb46SRobert Mustacchi line_ptr += DWARF_HALF_SIZE;
1607*4d9fdb46SRobert Mustacchi if (line_ptr > line_ptr_end) {
1608*4d9fdb46SRobert Mustacchi dwarfstring g;
1609*4d9fdb46SRobert Mustacchi ptrdiff_t d = 0;
1610*4d9fdb46SRobert Mustacchi
1611*4d9fdb46SRobert Mustacchi d = line_ptr - section_start;
1612*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&g);
1613*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&g,
1614*4d9fdb46SRobert Mustacchi "DW_DLE_LINE_TABLE_BAD reading "
1615*4d9fdb46SRobert Mustacchi "DW_LNS_fixed_advance_pc we are "
1616*4d9fdb46SRobert Mustacchi "off this line table at section "
1617*4d9fdb46SRobert Mustacchi "offset. 0x%x .",
1618*4d9fdb46SRobert Mustacchi d);
1619*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, error,
1620*4d9fdb46SRobert Mustacchi DW_DLE_LINE_TABLE_BAD,
1621*4d9fdb46SRobert Mustacchi dwarfstring_string(&g));
1622*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&g);
1623*4d9fdb46SRobert Mustacchi if(curr_line) {
1624*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1625*4d9fdb46SRobert Mustacchi }
1626*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
1627*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1628*4d9fdb46SRobert Mustacchi }
1629*4d9fdb46SRobert Mustacchi regs.lr_address = regs.lr_address + fixed_advance_pc;
1630*4d9fdb46SRobert Mustacchi regs.lr_op_index = 0;
1631*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1632*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mb);
1633*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&mb,
1634*4d9fdb46SRobert Mustacchi "DW_LNS_fixed_advance_pc val %"
1635*4d9fdb46SRobert Mustacchi DW_PR_DSd, fixed_advance_pc);
1636*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1637*4d9fdb46SRobert Mustacchi " 0x%" DW_PR_XZEROS DW_PR_DSx,
1638*4d9fdb46SRobert Mustacchi fixed_advance_pc);
1639*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1640*4d9fdb46SRobert Mustacchi " new address 0x%"
1641*4d9fdb46SRobert Mustacchi DW_PR_XZEROS DW_PR_DSx "\n",
1642*4d9fdb46SRobert Mustacchi regs.lr_address);
1643*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,
1644*4d9fdb46SRobert Mustacchi dwarfstring_string(&mb));
1645*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mb);
1646*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1647*4d9fdb46SRobert Mustacchi }
1648*4d9fdb46SRobert Mustacchi break;
1649*4d9fdb46SRobert Mustacchi
1650*4d9fdb46SRobert Mustacchi /* New in DWARF3 */
1651*4d9fdb46SRobert Mustacchi case DW_LNS_set_prologue_end:{
1652*4d9fdb46SRobert Mustacchi regs.lr_prologue_end = true;
1653*4d9fdb46SRobert Mustacchi }
1654*4d9fdb46SRobert Mustacchi break;
1655*4d9fdb46SRobert Mustacchi /* New in DWARF3 */
1656*4d9fdb46SRobert Mustacchi case DW_LNS_set_epilogue_begin:{
1657*4d9fdb46SRobert Mustacchi regs.lr_epilogue_begin = true;
1658*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1659*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,
1660*4d9fdb46SRobert Mustacchi "DW_LNS_set_prologue_end set true.\n");
1661*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1662*4d9fdb46SRobert Mustacchi }
1663*4d9fdb46SRobert Mustacchi break;
1664*4d9fdb46SRobert Mustacchi
1665*4d9fdb46SRobert Mustacchi /* New in DWARF3 */
1666*4d9fdb46SRobert Mustacchi case DW_LNS_set_isa:{
1667*4d9fdb46SRobert Mustacchi Dwarf_Unsigned utmp2 = 0;
1668*4d9fdb46SRobert Mustacchi int sires = 0;
1669*4d9fdb46SRobert Mustacchi
1670*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr, utmp2,
1671*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
1672*4d9fdb46SRobert Mustacchi sires = read_uword_de( &line_ptr,&utmp2,
1673*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
1674*4d9fdb46SRobert Mustacchi if (sires == DW_DLV_ERROR) {
1675*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1676*4d9fdb46SRobert Mustacchi line_count);
1677*4d9fdb46SRobert Mustacchi if(curr_line) {
1678*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1679*4d9fdb46SRobert Mustacchi }
1680*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1681*4d9fdb46SRobert Mustacchi }
1682*4d9fdb46SRobert Mustacchi
1683*4d9fdb46SRobert Mustacchi regs.lr_isa = utmp2;
1684*4d9fdb46SRobert Mustacchi
1685*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1686*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mb);
1687*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1688*4d9fdb46SRobert Mustacchi "DW_LNS_set_isa new value 0x%"
1689*4d9fdb46SRobert Mustacchi DW_PR_XZEROS DW_PR_DUx ".\n",
1690*4d9fdb46SRobert Mustacchi utmp2);
1691*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&mb));
1692*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mb);
1693*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1694*4d9fdb46SRobert Mustacchi if (regs.lr_isa != utmp2) {
1695*4d9fdb46SRobert Mustacchi /* The value of the isa did
1696*4d9fdb46SRobert Mustacchi not fit in our
1697*4d9fdb46SRobert Mustacchi local so we record it wrong.
1698*4d9fdb46SRobert Mustacchi declare an error. */
1699*4d9fdb46SRobert Mustacchi if(curr_line) {
1700*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1701*4d9fdb46SRobert Mustacchi }
1702*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
1703*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error,
1704*4d9fdb46SRobert Mustacchi DW_DLE_LINE_NUM_OPERANDS_BAD);
1705*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1706*4d9fdb46SRobert Mustacchi }
1707*4d9fdb46SRobert Mustacchi }
1708*4d9fdb46SRobert Mustacchi break;
1709*4d9fdb46SRobert Mustacchi
1710*4d9fdb46SRobert Mustacchi /* Experimental two-level line tables */
1711*4d9fdb46SRobert Mustacchi /* DW_LNS_set_address_from_logical and
1712*4d9fdb46SRobert Mustacchi DW_LNS_set_subprogram
1713*4d9fdb46SRobert Mustacchi share the same opcode. Disambiguate by checking
1714*4d9fdb46SRobert Mustacchi is_actuals_table. */
1715*4d9fdb46SRobert Mustacchi case DW_LNS_set_subprogram:
1716*4d9fdb46SRobert Mustacchi
1717*4d9fdb46SRobert Mustacchi if (is_actuals_table) {
1718*4d9fdb46SRobert Mustacchi /* DW_LNS_set_address_from_logical */
1719*4d9fdb46SRobert Mustacchi Dwarf_Signed stmp = 0;
1720*4d9fdb46SRobert Mustacchi int atres = 0;
1721*4d9fdb46SRobert Mustacchi
1722*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_SWORD_CK(line_ptr, stmp,
1723*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
1724*4d9fdb46SRobert Mustacchi atres = read_sword_de( &line_ptr,&stmp,
1725*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
1726*4d9fdb46SRobert Mustacchi if (atres == DW_DLV_ERROR) {
1727*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1728*4d9fdb46SRobert Mustacchi line_count);
1729*4d9fdb46SRobert Mustacchi if(curr_line) {
1730*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1731*4d9fdb46SRobert Mustacchi }
1732*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1733*4d9fdb46SRobert Mustacchi }
1734*4d9fdb46SRobert Mustacchi advance_line = (Dwarf_Signed) stmp;
1735*4d9fdb46SRobert Mustacchi regs.lr_line = regs.lr_line + advance_line;
1736*4d9fdb46SRobert Mustacchi if ((Dwarf_Signed)regs.lr_line < 0) {
1737*4d9fdb46SRobert Mustacchi dwarfstring m;
1738*4d9fdb46SRobert Mustacchi
1739*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&m);
1740*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&m,
1741*4d9fdb46SRobert Mustacchi "\nERROR: DW_DLE_LINE_TABLE_LINENO_ERROR"
1742*4d9fdb46SRobert Mustacchi " The line number is %d "
1743*4d9fdb46SRobert Mustacchi "and negative line numbers after "
1744*4d9fdb46SRobert Mustacchi "DW_LNS_set_subprogram ",
1745*4d9fdb46SRobert Mustacchi (Dwarf_Signed)regs.lr_line);
1746*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&m,
1747*4d9fdb46SRobert Mustacchi " of %d applied "
1748*4d9fdb46SRobert Mustacchi "are not correct.",stmp);
1749*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, error,
1750*4d9fdb46SRobert Mustacchi DW_DLE_LINE_TABLE_LINENO_ERROR,
1751*4d9fdb46SRobert Mustacchi dwarfstring_string(&m));
1752*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&m);
1753*4d9fdb46SRobert Mustacchi regs.lr_line = 0;
1754*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
1755*4d9fdb46SRobert Mustacchi if(curr_line) {
1756*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1757*4d9fdb46SRobert Mustacchi }
1758*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1759*4d9fdb46SRobert Mustacchi
1760*4d9fdb46SRobert Mustacchi }
1761*4d9fdb46SRobert Mustacchi if (regs.lr_line >= 1 &&
1762*4d9fdb46SRobert Mustacchi regs.lr_line - 1 < logicals_count) {
1763*4d9fdb46SRobert Mustacchi regs.lr_address =
1764*4d9fdb46SRobert Mustacchi logicals[regs.lr_line - 1]->li_address;
1765*4d9fdb46SRobert Mustacchi regs.lr_op_index = 0;
1766*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS /* block 1 print */
1767*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mb);
1768*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&mb,
1769*4d9fdb46SRobert Mustacchi "DW_LNS_set_address_from"
1770*4d9fdb46SRobert Mustacchi "_logical "
1771*4d9fdb46SRobert Mustacchi "%" DW_PR_DSd,
1772*4d9fdb46SRobert Mustacchi stmp);
1773*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1774*4d9fdb46SRobert Mustacchi " 0x%" DW_PR_XZEROS DW_PR_DSx,
1775*4d9fdb46SRobert Mustacchi stmp);
1776*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1777*4d9fdb46SRobert Mustacchi " newaddr="
1778*4d9fdb46SRobert Mustacchi " 0x%" DW_PR_XZEROS DW_PR_DUx ".\n",
1779*4d9fdb46SRobert Mustacchi regs.lr_address);
1780*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,
1781*4d9fdb46SRobert Mustacchi dwarfstring_string(&mb));
1782*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mb);
1783*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1784*4d9fdb46SRobert Mustacchi } else {
1785*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS /* block 2 print */
1786*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mb);
1787*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&mb,
1788*4d9fdb46SRobert Mustacchi "DW_LNS_set_address_from_logical line"
1789*4d9fdb46SRobert Mustacchi " is %" DW_PR_DSd ,
1790*4d9fdb46SRobert Mustacchi regs.lr_line);
1791*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1792*4d9fdb46SRobert Mustacchi " 0x%" DW_PR_XZEROS DW_PR_DSx ".\n",
1793*4d9fdb46SRobert Mustacchi regs.lr_line);
1794*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,
1795*4d9fdb46SRobert Mustacchi dwarfstring_string(&mb));
1796*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mb);
1797*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1798*4d9fdb46SRobert Mustacchi }
1799*4d9fdb46SRobert Mustacchi } else {
1800*4d9fdb46SRobert Mustacchi /* DW_LNS_set_subprogram,
1801*4d9fdb46SRobert Mustacchi building logicals table. */
1802*4d9fdb46SRobert Mustacchi Dwarf_Unsigned utmp2 = 0;
1803*4d9fdb46SRobert Mustacchi int spres = 0;
1804*4d9fdb46SRobert Mustacchi
1805*4d9fdb46SRobert Mustacchi regs.lr_call_context = 0;
1806*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr, utmp2,
1807*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
1808*4d9fdb46SRobert Mustacchi spres = read_uword_de( &line_ptr,&utmp2,
1809*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
1810*4d9fdb46SRobert Mustacchi if (spres == DW_DLV_ERROR) {
1811*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1812*4d9fdb46SRobert Mustacchi line_count);
1813*4d9fdb46SRobert Mustacchi if(curr_line) {
1814*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1815*4d9fdb46SRobert Mustacchi }
1816*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1817*4d9fdb46SRobert Mustacchi }
1818*4d9fdb46SRobert Mustacchi regs.lr_subprogram = utmp2;
1819*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS /* block 3 print */
1820*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mb);
1821*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&mb,
1822*4d9fdb46SRobert Mustacchi "DW_LNS_set_subprogram "
1823*4d9fdb46SRobert Mustacchi "%" DW_PR_DSd,
1824*4d9fdb46SRobert Mustacchi utmp2);
1825*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1826*4d9fdb46SRobert Mustacchi " 0x%" DW_PR_XZEROS DW_PR_DSx "\n",
1827*4d9fdb46SRobert Mustacchi utmp2);
1828*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,
1829*4d9fdb46SRobert Mustacchi dwarfstring_string(&mb));
1830*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1831*4d9fdb46SRobert Mustacchi }
1832*4d9fdb46SRobert Mustacchi break;
1833*4d9fdb46SRobert Mustacchi /* Experimental two-level line tables */
1834*4d9fdb46SRobert Mustacchi case DW_LNS_inlined_call: {
1835*4d9fdb46SRobert Mustacchi Dwarf_Signed stmp = 0;
1836*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ilcuw = 0;
1837*4d9fdb46SRobert Mustacchi int icres = 0;
1838*4d9fdb46SRobert Mustacchi
1839*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_SWORD_CK(line_ptr, stmp,
1840*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
1841*4d9fdb46SRobert Mustacchi icres = read_sword_de( &line_ptr,&stmp,
1842*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
1843*4d9fdb46SRobert Mustacchi if (icres == DW_DLV_ERROR) {
1844*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1845*4d9fdb46SRobert Mustacchi line_count);
1846*4d9fdb46SRobert Mustacchi if(curr_line) {
1847*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1848*4d9fdb46SRobert Mustacchi }
1849*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1850*4d9fdb46SRobert Mustacchi }
1851*4d9fdb46SRobert Mustacchi regs.lr_call_context = line_count + stmp;
1852*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr,
1853*4d9fdb46SRobert Mustacchi regs.lr_subprogram,
1854*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
1855*4d9fdb46SRobert Mustacchi icres = read_uword_de(&line_ptr,&ilcuw,
1856*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
1857*4d9fdb46SRobert Mustacchi regs.lr_subprogram = ilcuw;
1858*4d9fdb46SRobert Mustacchi if (icres == DW_DLV_ERROR) {
1859*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1860*4d9fdb46SRobert Mustacchi line_count);
1861*4d9fdb46SRobert Mustacchi if(curr_line) {
1862*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1863*4d9fdb46SRobert Mustacchi }
1864*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1865*4d9fdb46SRobert Mustacchi }
1866*4d9fdb46SRobert Mustacchi
1867*4d9fdb46SRobert Mustacchi
1868*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1869*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mb);
1870*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&mb,
1871*4d9fdb46SRobert Mustacchi "DW_LNS_inlined_call "
1872*4d9fdb46SRobert Mustacchi "%" DW_PR_DSd ,stmp);
1873*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1874*4d9fdb46SRobert Mustacchi " (0x%" DW_PR_XZEROS DW_PR_DSx "),",
1875*4d9fdb46SRobert Mustacchi stmp);
1876*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&mb,
1877*4d9fdb46SRobert Mustacchi "%" DW_PR_DSd,
1878*4d9fdb46SRobert Mustacchi regs.lr_subprogram);
1879*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1880*4d9fdb46SRobert Mustacchi " (0x%" DW_PR_XZEROS DW_PR_DSx ")",
1881*4d9fdb46SRobert Mustacchi regs.lr_subprogram);
1882*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&mb,
1883*4d9fdb46SRobert Mustacchi " callcontext=" "%" DW_PR_DSd ,
1884*4d9fdb46SRobert Mustacchi regs.lr_call_context);
1885*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mb,
1886*4d9fdb46SRobert Mustacchi " (0x%" DW_PR_XZEROS DW_PR_DSx ")\n",
1887*4d9fdb46SRobert Mustacchi regs.lr_call_context);
1888*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,
1889*4d9fdb46SRobert Mustacchi dwarfstring_string(&mb));
1890*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mb);
1891*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1892*4d9fdb46SRobert Mustacchi }
1893*4d9fdb46SRobert Mustacchi break;
1894*4d9fdb46SRobert Mustacchi
1895*4d9fdb46SRobert Mustacchi /* Experimental two-level line tables */
1896*4d9fdb46SRobert Mustacchi case DW_LNS_pop_context: {
1897*4d9fdb46SRobert Mustacchi Dwarf_Unsigned logical_num = regs.lr_call_context;
1898*4d9fdb46SRobert Mustacchi Dwarf_Chain logical_chain = head_chain;
1899*4d9fdb46SRobert Mustacchi Dwarf_Line logical_line = 0;
1900*4d9fdb46SRobert Mustacchi
1901*4d9fdb46SRobert Mustacchi if (logical_num > 0 && logical_num <= line_count) {
1902*4d9fdb46SRobert Mustacchi for (i = 1; i < logical_num; i++) {
1903*4d9fdb46SRobert Mustacchi logical_chain = logical_chain->ch_next;
1904*4d9fdb46SRobert Mustacchi }
1905*4d9fdb46SRobert Mustacchi logical_line = (Dwarf_Line) logical_chain->ch_item;
1906*4d9fdb46SRobert Mustacchi regs.lr_file =
1907*4d9fdb46SRobert Mustacchi logical_line->li_addr_line.li_l_data.li_file;
1908*4d9fdb46SRobert Mustacchi regs.lr_line =
1909*4d9fdb46SRobert Mustacchi logical_line->li_addr_line.li_l_data.li_line;
1910*4d9fdb46SRobert Mustacchi regs.lr_column =
1911*4d9fdb46SRobert Mustacchi logical_line->li_addr_line.li_l_data.li_column;
1912*4d9fdb46SRobert Mustacchi regs.lr_discriminator =
1913*4d9fdb46SRobert Mustacchi logical_line->li_addr_line.li_l_data.li_discriminator;
1914*4d9fdb46SRobert Mustacchi regs.lr_is_stmt =
1915*4d9fdb46SRobert Mustacchi logical_line->li_addr_line.li_l_data.li_is_stmt;
1916*4d9fdb46SRobert Mustacchi regs.lr_call_context =
1917*4d9fdb46SRobert Mustacchi logical_line->li_addr_line.li_l_data.li_call_context;
1918*4d9fdb46SRobert Mustacchi regs.lr_subprogram =
1919*4d9fdb46SRobert Mustacchi logical_line->li_addr_line.li_l_data.li_subprogram;
1920*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
1921*4d9fdb46SRobert Mustacchi {
1922*4d9fdb46SRobert Mustacchi dwarfstring pcon;
1923*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&pcon);
1924*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&pcon,
1925*4d9fdb46SRobert Mustacchi "DW_LNS_pop_context set"
1926*4d9fdb46SRobert Mustacchi " from logical "
1927*4d9fdb46SRobert Mustacchi "%" DW_PR_DUu ,logical_num);
1928*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&pcon,
1929*4d9fdb46SRobert Mustacchi " (0x%" DW_PR_XZEROS DW_PR_DUx ")\n",
1930*4d9fdb46SRobert Mustacchi logical_num);
1931*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,
1932*4d9fdb46SRobert Mustacchi dwarfstring_string(&pcon));
1933*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&pcon);
1934*4d9fdb46SRobert Mustacchi }
1935*4d9fdb46SRobert Mustacchi } else {
1936*4d9fdb46SRobert Mustacchi dwarfstring pcon;
1937*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&pcon);
1938*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&pcon,
1939*4d9fdb46SRobert Mustacchi "DW_LNS_pop_context does nothing, logical"
1940*4d9fdb46SRobert Mustacchi "%" DW_PR_DUu ,
1941*4d9fdb46SRobert Mustacchi logical_num);
1942*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&pcon,
1943*4d9fdb46SRobert Mustacchi " (0x%" DW_PR_XZEROS DW_PR_DUx ")\n",
1944*4d9fdb46SRobert Mustacchi logical_num);
1945*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,
1946*4d9fdb46SRobert Mustacchi dwarfstring_string(&pcon));
1947*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&pcon);
1948*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
1949*4d9fdb46SRobert Mustacchi }
1950*4d9fdb46SRobert Mustacchi }
1951*4d9fdb46SRobert Mustacchi break;
1952*4d9fdb46SRobert Mustacchi } /* End switch (opcode) */
1953*4d9fdb46SRobert Mustacchi
1954*4d9fdb46SRobert Mustacchi } else if (type == LOP_EXTENDED) {
1955*4d9fdb46SRobert Mustacchi Dwarf_Unsigned utmp3 = 0;
1956*4d9fdb46SRobert Mustacchi Dwarf_Small ext_opcode = 0;
1957*4d9fdb46SRobert Mustacchi int leres = 0;
1958*4d9fdb46SRobert Mustacchi
1959*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr, utmp3,
1960*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
1961*4d9fdb46SRobert Mustacchi leres = read_uword_de( &line_ptr,&utmp3,
1962*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
1963*4d9fdb46SRobert Mustacchi if (leres == DW_DLV_ERROR) {
1964*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
1965*4d9fdb46SRobert Mustacchi line_count);
1966*4d9fdb46SRobert Mustacchi if(curr_line) {
1967*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1968*4d9fdb46SRobert Mustacchi }
1969*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1970*4d9fdb46SRobert Mustacchi }
1971*4d9fdb46SRobert Mustacchi
1972*4d9fdb46SRobert Mustacchi instr_length = utmp3;
1973*4d9fdb46SRobert Mustacchi /* Dwarf_Small is a ubyte and the extended opcode is a
1974*4d9fdb46SRobert Mustacchi ubyte, though not stated as clearly in the
1975*4d9fdb46SRobert Mustacchi 2.0.0 spec as one might hope. */
1976*4d9fdb46SRobert Mustacchi if (line_ptr >= line_ptr_end) {
1977*4d9fdb46SRobert Mustacchi dwarfstring g;
1978*4d9fdb46SRobert Mustacchi ptrdiff_t d = 0;
1979*4d9fdb46SRobert Mustacchi
1980*4d9fdb46SRobert Mustacchi d = line_ptr - section_start;
1981*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&g);
1982*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&g,
1983*4d9fdb46SRobert Mustacchi "DW_DLE_LINE_TABLE_BAD reading "
1984*4d9fdb46SRobert Mustacchi "extended op we are "
1985*4d9fdb46SRobert Mustacchi "off this line table at section "
1986*4d9fdb46SRobert Mustacchi "offset 0x%x .",
1987*4d9fdb46SRobert Mustacchi d);
1988*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, error,
1989*4d9fdb46SRobert Mustacchi DW_DLE_LINE_TABLE_BAD,
1990*4d9fdb46SRobert Mustacchi dwarfstring_string(&g));
1991*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&g);
1992*4d9fdb46SRobert Mustacchi if(curr_line) {
1993*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
1994*4d9fdb46SRobert Mustacchi }
1995*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
1996*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1997*4d9fdb46SRobert Mustacchi }
1998*4d9fdb46SRobert Mustacchi ext_opcode = *(Dwarf_Small *) line_ptr;
1999*4d9fdb46SRobert Mustacchi line_ptr++;
2000*4d9fdb46SRobert Mustacchi if (line_ptr > line_ptr_end) {
2001*4d9fdb46SRobert Mustacchi dwarfstring g;
2002*4d9fdb46SRobert Mustacchi ptrdiff_t d = 0;
2003*4d9fdb46SRobert Mustacchi
2004*4d9fdb46SRobert Mustacchi d = line_ptr - section_start;
2005*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&g);
2006*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&g,
2007*4d9fdb46SRobert Mustacchi "DW_DLE_LINE_TABLE_BAD reading "
2008*4d9fdb46SRobert Mustacchi "extended op opcode we are "
2009*4d9fdb46SRobert Mustacchi "off this line table at section "
2010*4d9fdb46SRobert Mustacchi "offset 0x%x .",
2011*4d9fdb46SRobert Mustacchi d);
2012*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, error,
2013*4d9fdb46SRobert Mustacchi DW_DLE_LINE_TABLE_BAD,
2014*4d9fdb46SRobert Mustacchi dwarfstring_string(&g));
2015*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&g);
2016*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
2017*4d9fdb46SRobert Mustacchi if(curr_line) {
2018*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2019*4d9fdb46SRobert Mustacchi }
2020*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
2021*4d9fdb46SRobert Mustacchi }
2022*4d9fdb46SRobert Mustacchi switch (ext_opcode) {
2023*4d9fdb46SRobert Mustacchi
2024*4d9fdb46SRobert Mustacchi case DW_LNE_end_sequence:{
2025*4d9fdb46SRobert Mustacchi regs.lr_end_sequence = true;
2026*4d9fdb46SRobert Mustacchi if (dolines) {
2027*4d9fdb46SRobert Mustacchi curr_line = (Dwarf_Line)
2028*4d9fdb46SRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_LINE, 1);
2029*4d9fdb46SRobert Mustacchi if (!curr_line) {
2030*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
2031*4d9fdb46SRobert Mustacchi line_count);
2032*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
2033*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
2034*4d9fdb46SRobert Mustacchi }
2035*4d9fdb46SRobert Mustacchi
2036*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
2037*4d9fdb46SRobert Mustacchi print_line_detail(dbg,
2038*4d9fdb46SRobert Mustacchi "DW_LNE_end_sequence extended",
2039*4d9fdb46SRobert Mustacchi ext_opcode, line_count+1,®s,
2040*4d9fdb46SRobert Mustacchi is_single_table, is_actuals_table);
2041*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
2042*4d9fdb46SRobert Mustacchi curr_line->li_address = regs.lr_address;
2043*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_file =
2044*4d9fdb46SRobert Mustacchi (Dwarf_Signed) regs.lr_file;
2045*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_line =
2046*4d9fdb46SRobert Mustacchi (Dwarf_Signed) regs.lr_line;
2047*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_column =
2048*4d9fdb46SRobert Mustacchi (Dwarf_Half) regs.lr_column;
2049*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_is_stmt =
2050*4d9fdb46SRobert Mustacchi regs.lr_is_stmt;
2051*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.
2052*4d9fdb46SRobert Mustacchi li_basic_block = regs.lr_basic_block;
2053*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.
2054*4d9fdb46SRobert Mustacchi li_end_sequence = regs.lr_end_sequence;
2055*4d9fdb46SRobert Mustacchi curr_line->li_context = line_context;
2056*4d9fdb46SRobert Mustacchi curr_line->li_is_actuals_table = is_actuals_table;
2057*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.
2058*4d9fdb46SRobert Mustacchi li_epilogue_begin = regs.lr_epilogue_begin;
2059*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.
2060*4d9fdb46SRobert Mustacchi li_prologue_end = regs.lr_prologue_end;
2061*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_isa = regs.lr_isa;
2062*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_discriminator =
2063*4d9fdb46SRobert Mustacchi regs.lr_discriminator;
2064*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_call_context =
2065*4d9fdb46SRobert Mustacchi regs.lr_call_context;
2066*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_subprogram =
2067*4d9fdb46SRobert Mustacchi regs.lr_subprogram;
2068*4d9fdb46SRobert Mustacchi line_count++;
2069*4d9fdb46SRobert Mustacchi chain_line = (Dwarf_Chain)
2070*4d9fdb46SRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
2071*4d9fdb46SRobert Mustacchi if (chain_line == NULL) {
2072*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2073*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
2074*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
2075*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
2076*4d9fdb46SRobert Mustacchi }
2077*4d9fdb46SRobert Mustacchi chain_line->ch_itemtype = DW_DLA_LINE;
2078*4d9fdb46SRobert Mustacchi chain_line->ch_item = curr_line;
2079*4d9fdb46SRobert Mustacchi _dwarf_update_chain_list(chain_line,
2080*4d9fdb46SRobert Mustacchi &head_chain,&curr_chain);
2081*4d9fdb46SRobert Mustacchi curr_line = 0;
2082*4d9fdb46SRobert Mustacchi }
2083*4d9fdb46SRobert Mustacchi _dwarf_set_line_table_regs_default_values(®s,
2084*4d9fdb46SRobert Mustacchi line_context->lc_version_number,
2085*4d9fdb46SRobert Mustacchi line_context->lc_default_is_stmt);
2086*4d9fdb46SRobert Mustacchi }
2087*4d9fdb46SRobert Mustacchi break;
2088*4d9fdb46SRobert Mustacchi
2089*4d9fdb46SRobert Mustacchi case DW_LNE_set_address:{
2090*4d9fdb46SRobert Mustacchi int sares = 0;
2091*4d9fdb46SRobert Mustacchi /* READ_UNALIGNED_CK(dbg, regs.lr_address,
2092*4d9fdb46SRobert Mustacchi Dwarf_Addr,
2093*4d9fdb46SRobert Mustacchi line_ptr, address_size,error,line_ptr_end); */
2094*4d9fdb46SRobert Mustacchi sares = _dwarf_read_unaligned_ck_wrapper(dbg,
2095*4d9fdb46SRobert Mustacchi ®s.lr_address,line_ptr,
2096*4d9fdb46SRobert Mustacchi address_size,line_ptr_end,
2097*4d9fdb46SRobert Mustacchi error);
2098*4d9fdb46SRobert Mustacchi if (sares == DW_DLV_ERROR) {
2099*4d9fdb46SRobert Mustacchi if(curr_line) {
2100*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2101*4d9fdb46SRobert Mustacchi }
2102*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
2103*4d9fdb46SRobert Mustacchi line_count);
2104*4d9fdb46SRobert Mustacchi return sares;
2105*4d9fdb46SRobert Mustacchi }
2106*4d9fdb46SRobert Mustacchi
2107*4d9fdb46SRobert Mustacchi /* Mark a line record as being DW_LNS_set_address */
2108*4d9fdb46SRobert Mustacchi is_addr_set = true;
2109*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
2110*4d9fdb46SRobert Mustacchi {
2111*4d9fdb46SRobert Mustacchi dwarfstring sadd;
2112*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&sadd);
2113*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&sadd,
2114*4d9fdb46SRobert Mustacchi "DW_LNE_set_address address 0x%"
2115*4d9fdb46SRobert Mustacchi DW_PR_XZEROS DW_PR_DUx "\n",
2116*4d9fdb46SRobert Mustacchi regs.lr_address);
2117*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&sadd));
2118*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&sadd);
2119*4d9fdb46SRobert Mustacchi }
2120*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
2121*4d9fdb46SRobert Mustacchi if (doaddrs) {
2122*4d9fdb46SRobert Mustacchi /* SGI IRIX rqs processing only. */
2123*4d9fdb46SRobert Mustacchi curr_line = (Dwarf_Line) _dwarf_get_alloc(dbg,
2124*4d9fdb46SRobert Mustacchi DW_DLA_LINE, 1);
2125*4d9fdb46SRobert Mustacchi if (!curr_line) {
2126*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
2127*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
2128*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
2129*4d9fdb46SRobert Mustacchi }
2130*4d9fdb46SRobert Mustacchi
2131*4d9fdb46SRobert Mustacchi /* Mark a line record as being DW_LNS_set_address */
2132*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_l_data.li_is_addr_set =
2133*4d9fdb46SRobert Mustacchi is_addr_set;
2134*4d9fdb46SRobert Mustacchi is_addr_set = false;
2135*4d9fdb46SRobert Mustacchi curr_line->li_address = regs.lr_address;
2136*4d9fdb46SRobert Mustacchi #ifdef __sgi /* SGI IRIX ONLY */
2137*4d9fdb46SRobert Mustacchi curr_line->li_addr_line.li_offset =
2138*4d9fdb46SRobert Mustacchi line_ptr - dbg->de_debug_line.dss_data;
2139*4d9fdb46SRobert Mustacchi #endif /* __sgi */
2140*4d9fdb46SRobert Mustacchi line_count++;
2141*4d9fdb46SRobert Mustacchi chain_line = (Dwarf_Chain)
2142*4d9fdb46SRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
2143*4d9fdb46SRobert Mustacchi if (chain_line == NULL) {
2144*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2145*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
2146*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
2147*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
2148*4d9fdb46SRobert Mustacchi }
2149*4d9fdb46SRobert Mustacchi chain_line->ch_itemtype = DW_DLA_LINE;
2150*4d9fdb46SRobert Mustacchi chain_line->ch_item = curr_line;
2151*4d9fdb46SRobert Mustacchi _dwarf_update_chain_list(chain_line,&head_chain,&curr_chain);
2152*4d9fdb46SRobert Mustacchi curr_line = 0;
2153*4d9fdb46SRobert Mustacchi }
2154*4d9fdb46SRobert Mustacchi regs.lr_op_index = 0;
2155*4d9fdb46SRobert Mustacchi line_ptr += address_size;
2156*4d9fdb46SRobert Mustacchi if (line_ptr > line_ptr_end) {
2157*4d9fdb46SRobert Mustacchi dwarfstring g;
2158*4d9fdb46SRobert Mustacchi ptrdiff_t d = 0;
2159*4d9fdb46SRobert Mustacchi
2160*4d9fdb46SRobert Mustacchi d = line_ptr - section_start;
2161*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&g);
2162*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&g,
2163*4d9fdb46SRobert Mustacchi "DW_DLE_LINE_TABLE_BAD reading "
2164*4d9fdb46SRobert Mustacchi "DW_LNE_set_address we are "
2165*4d9fdb46SRobert Mustacchi "off this line table at section "
2166*4d9fdb46SRobert Mustacchi "offset 0x%x .",
2167*4d9fdb46SRobert Mustacchi d);
2168*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, error,
2169*4d9fdb46SRobert Mustacchi DW_DLE_LINE_TABLE_BAD,
2170*4d9fdb46SRobert Mustacchi dwarfstring_string(&g));
2171*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&g);
2172*4d9fdb46SRobert Mustacchi if(curr_line) {
2173*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2174*4d9fdb46SRobert Mustacchi }
2175*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
2176*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
2177*4d9fdb46SRobert Mustacchi }
2178*4d9fdb46SRobert Mustacchi }
2179*4d9fdb46SRobert Mustacchi break;
2180*4d9fdb46SRobert Mustacchi
2181*4d9fdb46SRobert Mustacchi case DW_LNE_define_file:
2182*4d9fdb46SRobert Mustacchi if (dolines) {
2183*4d9fdb46SRobert Mustacchi int dlres = 0;
2184*4d9fdb46SRobert Mustacchi Dwarf_Unsigned value = 0;
2185*4d9fdb46SRobert Mustacchi
2186*4d9fdb46SRobert Mustacchi cur_file_entry = (Dwarf_File_Entry)
2187*4d9fdb46SRobert Mustacchi malloc(sizeof(struct Dwarf_File_Entry_s));
2188*4d9fdb46SRobert Mustacchi if (cur_file_entry == NULL) {
2189*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
2190*4d9fdb46SRobert Mustacchi if(curr_line) {
2191*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2192*4d9fdb46SRobert Mustacchi }
2193*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
2194*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
2195*4d9fdb46SRobert Mustacchi }
2196*4d9fdb46SRobert Mustacchi memset(cur_file_entry,0,
2197*4d9fdb46SRobert Mustacchi sizeof(struct Dwarf_File_Entry_s));
2198*4d9fdb46SRobert Mustacchi _dwarf_add_to_files_list(line_context,
2199*4d9fdb46SRobert Mustacchi cur_file_entry);
2200*4d9fdb46SRobert Mustacchi cur_file_entry->fi_file_name =
2201*4d9fdb46SRobert Mustacchi (Dwarf_Small *) line_ptr;
2202*4d9fdb46SRobert Mustacchi dlres = _dwarf_check_string_valid(dbg,
2203*4d9fdb46SRobert Mustacchi line_ptr,line_ptr,line_ptr_end,
2204*4d9fdb46SRobert Mustacchi DW_DLE_DEFINE_FILE_STRING_BAD,error);
2205*4d9fdb46SRobert Mustacchi if (dlres != DW_DLV_OK) {
2206*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
2207*4d9fdb46SRobert Mustacchi line_count);
2208*4d9fdb46SRobert Mustacchi if(curr_line) {
2209*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2210*4d9fdb46SRobert Mustacchi }
2211*4d9fdb46SRobert Mustacchi return dlres;
2212*4d9fdb46SRobert Mustacchi }
2213*4d9fdb46SRobert Mustacchi line_ptr = line_ptr + strlen((char *) line_ptr)
2214*4d9fdb46SRobert Mustacchi + 1;
2215*4d9fdb46SRobert Mustacchi /*DECODE_LEB128_UWORD_CK(line_ptr,value,
2216*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
2217*4d9fdb46SRobert Mustacchi dlres = read_uword_de( &line_ptr,&value,
2218*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
2219*4d9fdb46SRobert Mustacchi if (dlres == DW_DLV_ERROR) {
2220*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
2221*4d9fdb46SRobert Mustacchi line_count);
2222*4d9fdb46SRobert Mustacchi if(curr_line) {
2223*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2224*4d9fdb46SRobert Mustacchi }
2225*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
2226*4d9fdb46SRobert Mustacchi }
2227*4d9fdb46SRobert Mustacchi cur_file_entry->fi_dir_index = (Dwarf_Signed)value;
2228*4d9fdb46SRobert Mustacchi cur_file_entry->fi_dir_index_present = TRUE;
2229*4d9fdb46SRobert Mustacchi /* DECODE_LEB128_UWORD_CK(line_ptr,value,
2230*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
2231*4d9fdb46SRobert Mustacchi dlres = read_uword_de( &line_ptr,&value,
2232*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
2233*4d9fdb46SRobert Mustacchi if (dlres == DW_DLV_ERROR) {
2234*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
2235*4d9fdb46SRobert Mustacchi line_count);
2236*4d9fdb46SRobert Mustacchi if(curr_line) {
2237*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2238*4d9fdb46SRobert Mustacchi }
2239*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
2240*4d9fdb46SRobert Mustacchi }
2241*4d9fdb46SRobert Mustacchi cur_file_entry->fi_time_last_mod = value;
2242*4d9fdb46SRobert Mustacchi /*DECODE_LEB128_UWORD_CK(line_ptr,value,
2243*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
2244*4d9fdb46SRobert Mustacchi dlres = read_uword_de( &line_ptr,&value,
2245*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
2246*4d9fdb46SRobert Mustacchi if (dlres == DW_DLV_ERROR) {
2247*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
2248*4d9fdb46SRobert Mustacchi line_count);
2249*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2250*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
2251*4d9fdb46SRobert Mustacchi }
2252*4d9fdb46SRobert Mustacchi cur_file_entry->fi_file_length = value;
2253*4d9fdb46SRobert Mustacchi cur_file_entry->fi_dir_index_present = TRUE;
2254*4d9fdb46SRobert Mustacchi cur_file_entry->fi_time_last_mod_present = TRUE;
2255*4d9fdb46SRobert Mustacchi cur_file_entry->fi_file_length_present = TRUE;
2256*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
2257*4d9fdb46SRobert Mustacchi {
2258*4d9fdb46SRobert Mustacchi dwarfstring m9c;
2259*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&m9c);
2260*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_s(&m9c,
2261*4d9fdb46SRobert Mustacchi "DW_LNE_define_file %s \n",
2262*4d9fdb46SRobert Mustacchi (char *)cur_file_entry->fi_file_name);
2263*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&m9c,
2264*4d9fdb46SRobert Mustacchi " dir index %d\n",
2265*4d9fdb46SRobert Mustacchi (int) cur_file_entry->fi_dir_index);
2266*4d9fdb46SRobert Mustacchi
2267*4d9fdb46SRobert Mustacchi {
2268*4d9fdb46SRobert Mustacchi time_t tt3 = (time_t) cur_file_entry->
2269*4d9fdb46SRobert Mustacchi fi_time_last_mod;
2270*4d9fdb46SRobert Mustacchi
2271*4d9fdb46SRobert Mustacchi /* ctime supplies newline */
2272*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m9c,
2273*4d9fdb46SRobert Mustacchi " last time 0x%x ",
2274*4d9fdb46SRobert Mustacchi (Dwarf_Unsigned)tt3);
2275*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_s(&m9c,
2276*4d9fdb46SRobert Mustacchi "%s",
2277*4d9fdb46SRobert Mustacchi ctime(&tt3));
2278*4d9fdb46SRobert Mustacchi }
2279*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&m9c,
2280*4d9fdb46SRobert Mustacchi " file length %ld ",
2281*4d9fdb46SRobert Mustacchi cur_file_entry->fi_file_length);
2282*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m9c,
2283*4d9fdb46SRobert Mustacchi "0x%lx\n",
2284*4d9fdb46SRobert Mustacchi cur_file_entry->fi_file_length);
2285*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&m9c));
2286*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&m9c);
2287*4d9fdb46SRobert Mustacchi }
2288*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
2289*4d9fdb46SRobert Mustacchi }
2290*4d9fdb46SRobert Mustacchi break;
2291*4d9fdb46SRobert Mustacchi case DW_LNE_set_discriminator:{
2292*4d9fdb46SRobert Mustacchi /* New in DWARF4 */
2293*4d9fdb46SRobert Mustacchi int sdres = 0;
2294*4d9fdb46SRobert Mustacchi Dwarf_Unsigned utmp2 = 0;
2295*4d9fdb46SRobert Mustacchi
2296*4d9fdb46SRobert Mustacchi /*DECODE_LEB128_UWORD_CK(line_ptr, utmp2,
2297*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end); */
2298*4d9fdb46SRobert Mustacchi sdres = read_uword_de( &line_ptr,&utmp2,
2299*4d9fdb46SRobert Mustacchi dbg,error,line_ptr_end);
2300*4d9fdb46SRobert Mustacchi if (sdres == DW_DLV_ERROR) {
2301*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
2302*4d9fdb46SRobert Mustacchi line_count);
2303*4d9fdb46SRobert Mustacchi if(curr_line) {
2304*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2305*4d9fdb46SRobert Mustacchi }
2306*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
2307*4d9fdb46SRobert Mustacchi }
2308*4d9fdb46SRobert Mustacchi regs.lr_discriminator = utmp2;
2309*4d9fdb46SRobert Mustacchi
2310*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
2311*4d9fdb46SRobert Mustacchi {
2312*4d9fdb46SRobert Mustacchi dwarfstring mk;
2313*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mk);
2314*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mk,
2315*4d9fdb46SRobert Mustacchi "DW_LNE_set_discriminator 0x%"
2316*4d9fdb46SRobert Mustacchi DW_PR_XZEROS DW_PR_DUx "\n",
2317*4d9fdb46SRobert Mustacchi utmp2);
2318*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&mk));
2319*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mk);
2320*4d9fdb46SRobert Mustacchi }
2321*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
2322*4d9fdb46SRobert Mustacchi }
2323*4d9fdb46SRobert Mustacchi break;
2324*4d9fdb46SRobert Mustacchi default:{
2325*4d9fdb46SRobert Mustacchi /* This is an extended op code we do not know about,
2326*4d9fdb46SRobert Mustacchi other than we know now many bytes it is
2327*4d9fdb46SRobert Mustacchi and the op code and the bytes of operand. */
2328*4d9fdb46SRobert Mustacchi Dwarf_Unsigned remaining_bytes = instr_length -1;
2329*4d9fdb46SRobert Mustacchi
2330*4d9fdb46SRobert Mustacchi if (instr_length < 1 ||
2331*4d9fdb46SRobert Mustacchi remaining_bytes > DW_LNE_LEN_MAX) {
2332*4d9fdb46SRobert Mustacchi dwarfstring g;
2333*4d9fdb46SRobert Mustacchi ptrdiff_t d = 0;
2334*4d9fdb46SRobert Mustacchi
2335*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,
2336*4d9fdb46SRobert Mustacchi line_count);
2337*4d9fdb46SRobert Mustacchi d = line_ptr - section_start;
2338*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&g);
2339*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&g,
2340*4d9fdb46SRobert Mustacchi "DW_DLE_LINE_TABLE_BAD reading "
2341*4d9fdb46SRobert Mustacchi "unknown DW_LNE_extended op opcode 0x%x ",
2342*4d9fdb46SRobert Mustacchi ext_opcode);
2343*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&g,
2344*4d9fdb46SRobert Mustacchi "we are "
2345*4d9fdb46SRobert Mustacchi "off this line table at section "
2346*4d9fdb46SRobert Mustacchi "offset 0x%x and ",
2347*4d9fdb46SRobert Mustacchi d);
2348*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&g,"instruction length"
2349*4d9fdb46SRobert Mustacchi "%u.",instr_length);
2350*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, error,
2351*4d9fdb46SRobert Mustacchi DW_DLE_LINE_TABLE_BAD,
2352*4d9fdb46SRobert Mustacchi dwarfstring_string(&g));
2353*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&g);
2354*4d9fdb46SRobert Mustacchi if(curr_line) {
2355*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2356*4d9fdb46SRobert Mustacchi }
2357*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
2358*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
2359*4d9fdb46SRobert Mustacchi }
2360*4d9fdb46SRobert Mustacchi
2361*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
2362*4d9fdb46SRobert Mustacchi {
2363*4d9fdb46SRobert Mustacchi dwarfstring m9d;
2364*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&m9d);
2365*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m9d,
2366*4d9fdb46SRobert Mustacchi "DW_LNE extended op 0x%x ",
2367*4d9fdb46SRobert Mustacchi ext_opcode);
2368*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m9d,
2369*4d9fdb46SRobert Mustacchi "Bytecount: %" DW_PR_DUu ,
2370*4d9fdb46SRobert Mustacchi (Dwarf_Unsigned)instr_length);
2371*4d9fdb46SRobert Mustacchi if (remaining_bytes > 0) {
2372*4d9fdb46SRobert Mustacchi dwarfstring_append(&m9d," linedata: 0x");
2373*4d9fdb46SRobert Mustacchi while (remaining_bytes > 0) {
2374*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m9d,
2375*4d9fdb46SRobert Mustacchi "%02x",
2376*4d9fdb46SRobert Mustacchi (unsigned char)(*(line_ptr)));
2377*4d9fdb46SRobert Mustacchi line_ptr++;
2378*4d9fdb46SRobert Mustacchi if (line_ptr > line_ptr_end) {
2379*4d9fdb46SRobert Mustacchi dwarfstring g;
2380*4d9fdb46SRobert Mustacchi ptrdiff_t d = 0;
2381*4d9fdb46SRobert Mustacchi
2382*4d9fdb46SRobert Mustacchi d = line_ptr - section_start;
2383*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&g);
2384*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&g,
2385*4d9fdb46SRobert Mustacchi "DW_DLE_LINE_TABLE_BAD reading "
2386*4d9fdb46SRobert Mustacchi "DW_LNE extended op remaining bytes "
2387*4d9fdb46SRobert Mustacchi "we are "
2388*4d9fdb46SRobert Mustacchi "off this line table at section "
2389*4d9fdb46SRobert Mustacchi "offset 0x%x .",
2390*4d9fdb46SRobert Mustacchi d);
2391*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, error,
2392*4d9fdb46SRobert Mustacchi DW_DLE_LINE_TABLE_BAD,
2393*4d9fdb46SRobert Mustacchi dwarfstring_string(&g));
2394*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&g);
2395*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&m9d);
2396*4d9fdb46SRobert Mustacchi if(curr_line) {
2397*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2398*4d9fdb46SRobert Mustacchi }
2399*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
2400*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
2401*4d9fdb46SRobert Mustacchi }
2402*4d9fdb46SRobert Mustacchi remaining_bytes--;
2403*4d9fdb46SRobert Mustacchi }
2404*4d9fdb46SRobert Mustacchi }
2405*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&m9d));
2406*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&m9d);
2407*4d9fdb46SRobert Mustacchi }
2408*4d9fdb46SRobert Mustacchi #else /* ! PRINTING_DETAILS */
2409*4d9fdb46SRobert Mustacchi line_ptr += remaining_bytes;
2410*4d9fdb46SRobert Mustacchi if (line_ptr > line_ptr_end) {
2411*4d9fdb46SRobert Mustacchi dwarfstring g;
2412*4d9fdb46SRobert Mustacchi ptrdiff_t d = 0;
2413*4d9fdb46SRobert Mustacchi
2414*4d9fdb46SRobert Mustacchi d = line_ptr - section_start;
2415*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&g);
2416*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&g,
2417*4d9fdb46SRobert Mustacchi "DW_DLE_LINE_TABLE_BAD reading "
2418*4d9fdb46SRobert Mustacchi "DW_LNE extended op remaining bytes "
2419*4d9fdb46SRobert Mustacchi "we are "
2420*4d9fdb46SRobert Mustacchi "off this line table at section "
2421*4d9fdb46SRobert Mustacchi "offset 0x%x .",
2422*4d9fdb46SRobert Mustacchi d);
2423*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, error,
2424*4d9fdb46SRobert Mustacchi DW_DLE_LINE_TABLE_BAD,
2425*4d9fdb46SRobert Mustacchi dwarfstring_string(&g));
2426*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&g);
2427*4d9fdb46SRobert Mustacchi if(curr_line) {
2428*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2429*4d9fdb46SRobert Mustacchi }
2430*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
2431*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
2432*4d9fdb46SRobert Mustacchi }
2433*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
2434*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,"\n");
2435*4d9fdb46SRobert Mustacchi }
2436*4d9fdb46SRobert Mustacchi break;
2437*4d9fdb46SRobert Mustacchi } /* End switch. */
2438*4d9fdb46SRobert Mustacchi }
2439*4d9fdb46SRobert Mustacchi }
2440*4d9fdb46SRobert Mustacchi block_line = (Dwarf_Line *)
2441*4d9fdb46SRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_LIST, line_count);
2442*4d9fdb46SRobert Mustacchi if (block_line == NULL) {
2443*4d9fdb46SRobert Mustacchi curr_chain = head_chain;
2444*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(dbg,head_chain,line_count);
2445*4d9fdb46SRobert Mustacchi if(curr_line) {
2446*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,curr_line,DW_DLA_LINE);
2447*4d9fdb46SRobert Mustacchi curr_line = 0;
2448*4d9fdb46SRobert Mustacchi }
2449*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
2450*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
2451*4d9fdb46SRobert Mustacchi }
2452*4d9fdb46SRobert Mustacchi
2453*4d9fdb46SRobert Mustacchi curr_chain = head_chain;
2454*4d9fdb46SRobert Mustacchi for (i = 0; i < line_count; i++) {
2455*4d9fdb46SRobert Mustacchi Dwarf_Chain t = 0;
2456*4d9fdb46SRobert Mustacchi *(block_line + i) = curr_chain->ch_item;
2457*4d9fdb46SRobert Mustacchi curr_chain->ch_item = 0;
2458*4d9fdb46SRobert Mustacchi curr_chain->ch_itemtype = 0;
2459*4d9fdb46SRobert Mustacchi t = curr_chain;
2460*4d9fdb46SRobert Mustacchi curr_chain = curr_chain->ch_next;
2461*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, t, DW_DLA_CHAIN);
2462*4d9fdb46SRobert Mustacchi }
2463*4d9fdb46SRobert Mustacchi
2464*4d9fdb46SRobert Mustacchi if (is_single_table || !is_actuals_table) {
2465*4d9fdb46SRobert Mustacchi line_context->lc_linebuf_logicals = block_line;
2466*4d9fdb46SRobert Mustacchi line_context->lc_linecount_logicals = line_count;
2467*4d9fdb46SRobert Mustacchi } else {
2468*4d9fdb46SRobert Mustacchi line_context->lc_linebuf_actuals = block_line;
2469*4d9fdb46SRobert Mustacchi line_context->lc_linecount_actuals = line_count;
2470*4d9fdb46SRobert Mustacchi }
2471*4d9fdb46SRobert Mustacchi #ifdef PRINTING_DETAILS
2472*4d9fdb46SRobert Mustacchi {
2473*4d9fdb46SRobert Mustacchi dwarfstring mc;
2474*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&mc);
2475*4d9fdb46SRobert Mustacchi if (is_single_table) {
2476*4d9fdb46SRobert Mustacchi if(!line_count) {
2477*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mc,
2478*4d9fdb46SRobert Mustacchi " Line table is present (offset 0x%"
2479*4d9fdb46SRobert Mustacchi DW_PR_XZEROS DW_PR_DUx
2480*4d9fdb46SRobert Mustacchi ") but no lines present\n",
2481*4d9fdb46SRobert Mustacchi line_context->lc_section_offset);
2482*4d9fdb46SRobert Mustacchi }
2483*4d9fdb46SRobert Mustacchi } else if (is_actuals_table) {
2484*4d9fdb46SRobert Mustacchi if(!line_count) {
2485*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mc,
2486*4d9fdb46SRobert Mustacchi " Line table present (offset 0x%"
2487*4d9fdb46SRobert Mustacchi DW_PR_XZEROS DW_PR_DUx
2488*4d9fdb46SRobert Mustacchi ") but no actuals lines present\n",
2489*4d9fdb46SRobert Mustacchi line_context->lc_section_offset);
2490*4d9fdb46SRobert Mustacchi }
2491*4d9fdb46SRobert Mustacchi } else {
2492*4d9fdb46SRobert Mustacchi if(!line_count) {
2493*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&mc,
2494*4d9fdb46SRobert Mustacchi " Line table present (offset 0x%"
2495*4d9fdb46SRobert Mustacchi DW_PR_XZEROS DW_PR_DUx
2496*4d9fdb46SRobert Mustacchi ") but no logicals lines present\n",
2497*4d9fdb46SRobert Mustacchi line_context->lc_section_offset);
2498*4d9fdb46SRobert Mustacchi }
2499*4d9fdb46SRobert Mustacchi }
2500*4d9fdb46SRobert Mustacchi if (dwarfstring_strlen(&mc)) {
2501*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&mc));
2502*4d9fdb46SRobert Mustacchi }
2503*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&mc);
2504*4d9fdb46SRobert Mustacchi }
2505*4d9fdb46SRobert Mustacchi #endif /* PRINTING_DETAILS */
2506*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
2507*4d9fdb46SRobert Mustacchi }
2508