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(&regs,
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, &regs,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, &regs,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,&regs,
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(&regs,
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                     &regs.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