1*f3e7f55eSRobert Mustacchi /*
2*f3e7f55eSRobert Mustacchi
3*f3e7f55eSRobert Mustacchi Copyright (C) 2000,2002,2004,2005,2006 Silicon Graphics, Inc. All Rights Reserved.
4*f3e7f55eSRobert Mustacchi Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved.
5*f3e7f55eSRobert Mustacchi
6*f3e7f55eSRobert Mustacchi This program is free software; you can redistribute it and/or modify it
7*f3e7f55eSRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License
8*f3e7f55eSRobert Mustacchi as published by the Free Software Foundation.
9*f3e7f55eSRobert Mustacchi
10*f3e7f55eSRobert Mustacchi This program is distributed in the hope that it would be useful, but
11*f3e7f55eSRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of
12*f3e7f55eSRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13*f3e7f55eSRobert Mustacchi
14*f3e7f55eSRobert Mustacchi Further, this software is distributed without any warranty that it is
15*f3e7f55eSRobert Mustacchi free of the rightful claim of any third person regarding infringement
16*f3e7f55eSRobert Mustacchi or the like. Any license provided herein, whether implied or
17*f3e7f55eSRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if
18*f3e7f55eSRobert Mustacchi any, provided herein do not apply to combinations of this program with
19*f3e7f55eSRobert Mustacchi other software, or any other product whatsoever.
20*f3e7f55eSRobert Mustacchi
21*f3e7f55eSRobert Mustacchi You should have received a copy of the GNU Lesser General Public
22*f3e7f55eSRobert Mustacchi License along with this program; if not, write the Free Software
23*f3e7f55eSRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
24*f3e7f55eSRobert Mustacchi USA.
25*f3e7f55eSRobert Mustacchi
26*f3e7f55eSRobert Mustacchi Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
27*f3e7f55eSRobert Mustacchi Mountain View, CA 94043, or:
28*f3e7f55eSRobert Mustacchi
29*f3e7f55eSRobert Mustacchi http://www.sgi.com
30*f3e7f55eSRobert Mustacchi
31*f3e7f55eSRobert Mustacchi For further information regarding this notice, see:
32*f3e7f55eSRobert Mustacchi
33*f3e7f55eSRobert Mustacchi http://oss.sgi.com/projects/GenInfo/NoticeExplan
34*f3e7f55eSRobert Mustacchi
35*f3e7f55eSRobert Mustacchi */
36*f3e7f55eSRobert Mustacchi /* The address of the Free Software Foundation is
37*f3e7f55eSRobert Mustacchi Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
38*f3e7f55eSRobert Mustacchi Boston, MA 02110-1301, USA.
39*f3e7f55eSRobert Mustacchi SGI has moved from the Crittenden Lane address.
40*f3e7f55eSRobert Mustacchi */
41*f3e7f55eSRobert Mustacchi
42*f3e7f55eSRobert Mustacchi
43*f3e7f55eSRobert Mustacchi
44*f3e7f55eSRobert Mustacchi
45*f3e7f55eSRobert Mustacchi #include "config.h"
46*f3e7f55eSRobert Mustacchi #include "dwarf_incl.h"
47*f3e7f55eSRobert Mustacchi #include <stdio.h>
48*f3e7f55eSRobert Mustacchi #include <time.h>
49*f3e7f55eSRobert Mustacchi #include "dwarf_line.h"
50*f3e7f55eSRobert Mustacchi
51*f3e7f55eSRobert Mustacchi /* FIXME Need to add prologue_end epilogue_begin isa fields. */
52*f3e7f55eSRobert Mustacchi static void
print_line_header(void)53*f3e7f55eSRobert Mustacchi print_line_header(void)
54*f3e7f55eSRobert Mustacchi {
55*f3e7f55eSRobert Mustacchi printf
56*f3e7f55eSRobert Mustacchi (" s b e\n"
57*f3e7f55eSRobert Mustacchi " t l s\n"
58*f3e7f55eSRobert Mustacchi " m c e\n"
59*f3e7f55eSRobert Mustacchi " section op col t k q\n"
60*f3e7f55eSRobert Mustacchi " offset code address file line umn ? ? ?\n");
61*f3e7f55eSRobert Mustacchi }
62*f3e7f55eSRobert Mustacchi
63*f3e7f55eSRobert Mustacchi /* FIXME: print new line values: prologue_end epilogue_begin isa */
64*f3e7f55eSRobert Mustacchi static void
print_line_detail(char * prefix,int opcode,Dwarf_Unsigned address,unsigned long file,unsigned long line,unsigned long column,int is_stmt,int basic_block,int end_sequence,int prologue_end,int epilogue_begin,int isa)65*f3e7f55eSRobert Mustacchi print_line_detail(char *prefix,
66*f3e7f55eSRobert Mustacchi int opcode,
67*f3e7f55eSRobert Mustacchi Dwarf_Unsigned address,
68*f3e7f55eSRobert Mustacchi unsigned long file,
69*f3e7f55eSRobert Mustacchi unsigned long line,
70*f3e7f55eSRobert Mustacchi unsigned long column,
71*f3e7f55eSRobert Mustacchi int is_stmt, int basic_block, int end_sequence,
72*f3e7f55eSRobert Mustacchi int prologue_end, int epilogue_begin, int isa)
73*f3e7f55eSRobert Mustacchi {
74*f3e7f55eSRobert Mustacchi printf("%-15s %2d 0x%08" DW_PR_DUx " "
75*f3e7f55eSRobert Mustacchi "%2lu %4lu %2lu %1d %1d %1d\n",
76*f3e7f55eSRobert Mustacchi prefix,
77*f3e7f55eSRobert Mustacchi (int) opcode,
78*f3e7f55eSRobert Mustacchi (Dwarf_Unsigned) address,
79*f3e7f55eSRobert Mustacchi (unsigned long) file,
80*f3e7f55eSRobert Mustacchi (unsigned long) line,
81*f3e7f55eSRobert Mustacchi (unsigned long) column,
82*f3e7f55eSRobert Mustacchi (int) is_stmt, (int) basic_block, (int) end_sequence);
83*f3e7f55eSRobert Mustacchi
84*f3e7f55eSRobert Mustacchi }
85*f3e7f55eSRobert Mustacchi
86*f3e7f55eSRobert Mustacchi
87*f3e7f55eSRobert Mustacchi /*
88*f3e7f55eSRobert Mustacchi return DW_DLV_OK if ok. else DW_DLV_NO_ENTRY or DW_DLV_ERROR
89*f3e7f55eSRobert Mustacchi If err_count_out is non-NULL, this is a special 'check'
90*f3e7f55eSRobert Mustacchi call.
91*f3e7f55eSRobert Mustacchi */
92*f3e7f55eSRobert Mustacchi int
_dwarf_internal_printlines(Dwarf_Die die,Dwarf_Error * error,int * err_count_out,int only_line_header)93*f3e7f55eSRobert Mustacchi _dwarf_internal_printlines(Dwarf_Die die, Dwarf_Error * error,
94*f3e7f55eSRobert Mustacchi int * err_count_out, int only_line_header)
95*f3e7f55eSRobert Mustacchi {
96*f3e7f55eSRobert Mustacchi /*
97*f3e7f55eSRobert Mustacchi This pointer is used to scan the portion of the .debug_line
98*f3e7f55eSRobert Mustacchi section for the current cu. */
99*f3e7f55eSRobert Mustacchi Dwarf_Small *line_ptr = 0;
100*f3e7f55eSRobert Mustacchi Dwarf_Small *orig_line_ptr = 0;
101*f3e7f55eSRobert Mustacchi
102*f3e7f55eSRobert Mustacchi /*
103*f3e7f55eSRobert Mustacchi This points to the last byte of the .debug_line portion for the
104*f3e7f55eSRobert Mustacchi current cu. */
105*f3e7f55eSRobert Mustacchi Dwarf_Small *line_ptr_end = 0;
106*f3e7f55eSRobert Mustacchi
107*f3e7f55eSRobert Mustacchi /*
108*f3e7f55eSRobert Mustacchi Pointer to a DW_AT_stmt_list attribute in case it exists in the
109*f3e7f55eSRobert Mustacchi die. */
110*f3e7f55eSRobert Mustacchi Dwarf_Attribute stmt_list_attr = 0;
111*f3e7f55eSRobert Mustacchi
112*f3e7f55eSRobert Mustacchi /* Pointer to DW_AT_comp_dir attribute in die. */
113*f3e7f55eSRobert Mustacchi Dwarf_Attribute comp_dir_attr = 0;
114*f3e7f55eSRobert Mustacchi
115*f3e7f55eSRobert Mustacchi /* Pointer to name of compilation directory. */
116*f3e7f55eSRobert Mustacchi Dwarf_Small *comp_dir = NULL;
117*f3e7f55eSRobert Mustacchi
118*f3e7f55eSRobert Mustacchi /*
119*f3e7f55eSRobert Mustacchi Offset into .debug_line specified by a DW_AT_stmt_list
120*f3e7f55eSRobert Mustacchi attribute. */
121*f3e7f55eSRobert Mustacchi Dwarf_Unsigned line_offset = 0;
122*f3e7f55eSRobert Mustacchi
123*f3e7f55eSRobert Mustacchi struct Line_Table_Prefix_s prefix;
124*f3e7f55eSRobert Mustacchi
125*f3e7f55eSRobert Mustacchi
126*f3e7f55eSRobert Mustacchi /* These are the state machine state variables. */
127*f3e7f55eSRobert Mustacchi Dwarf_Addr address = 0;
128*f3e7f55eSRobert Mustacchi Dwarf_Word file = 1;
129*f3e7f55eSRobert Mustacchi Dwarf_Word line = 1;
130*f3e7f55eSRobert Mustacchi Dwarf_Word column = 0;
131*f3e7f55eSRobert Mustacchi Dwarf_Bool is_stmt = false;
132*f3e7f55eSRobert Mustacchi Dwarf_Bool basic_block = false;
133*f3e7f55eSRobert Mustacchi Dwarf_Bool end_sequence = false;
134*f3e7f55eSRobert Mustacchi Dwarf_Bool prologue_end = false;
135*f3e7f55eSRobert Mustacchi Dwarf_Bool epilogue_begin = false;
136*f3e7f55eSRobert Mustacchi Dwarf_Small isa = 0;
137*f3e7f55eSRobert Mustacchi
138*f3e7f55eSRobert Mustacchi
139*f3e7f55eSRobert Mustacchi Dwarf_Sword i=0;
140*f3e7f55eSRobert Mustacchi
141*f3e7f55eSRobert Mustacchi /*
142*f3e7f55eSRobert Mustacchi This is the current opcode read from the statement program. */
143*f3e7f55eSRobert Mustacchi Dwarf_Small opcode=0;
144*f3e7f55eSRobert Mustacchi
145*f3e7f55eSRobert Mustacchi
146*f3e7f55eSRobert Mustacchi /*
147*f3e7f55eSRobert Mustacchi These variables are used to decode leb128 numbers. Leb128_num
148*f3e7f55eSRobert Mustacchi holds the decoded number, and leb128_length is its length in
149*f3e7f55eSRobert Mustacchi bytes. */
150*f3e7f55eSRobert Mustacchi Dwarf_Word leb128_num=0;
151*f3e7f55eSRobert Mustacchi Dwarf_Word leb128_length=0;
152*f3e7f55eSRobert Mustacchi Dwarf_Sword advance_line=0;
153*f3e7f55eSRobert Mustacchi Dwarf_Half attrform = 0;
154*f3e7f55eSRobert Mustacchi /*
155*f3e7f55eSRobert Mustacchi This is the operand of the latest fixed_advance_pc extended
156*f3e7f55eSRobert Mustacchi opcode. */
157*f3e7f55eSRobert Mustacchi Dwarf_Half fixed_advance_pc=0;
158*f3e7f55eSRobert Mustacchi
159*f3e7f55eSRobert Mustacchi /* In case there are wierd bytes 'after' the line table
160*f3e7f55eSRobert Mustacchi * prologue this lets us print something. This is a gcc
161*f3e7f55eSRobert Mustacchi * compiler bug and we expect the bytes count to be 12.
162*f3e7f55eSRobert Mustacchi */
163*f3e7f55eSRobert Mustacchi Dwarf_Small* bogus_bytes_ptr = 0;
164*f3e7f55eSRobert Mustacchi Dwarf_Unsigned bogus_bytes_count = 0;
165*f3e7f55eSRobert Mustacchi
166*f3e7f55eSRobert Mustacchi
167*f3e7f55eSRobert Mustacchi /* The Dwarf_Debug this die belongs to. */
168*f3e7f55eSRobert Mustacchi Dwarf_Debug dbg=0;
169*f3e7f55eSRobert Mustacchi int resattr = DW_DLV_ERROR;
170*f3e7f55eSRobert Mustacchi int lres = DW_DLV_ERROR;
171*f3e7f55eSRobert Mustacchi int res = DW_DLV_ERROR;
172*f3e7f55eSRobert Mustacchi
173*f3e7f55eSRobert Mustacchi /* ***** BEGIN CODE ***** */
174*f3e7f55eSRobert Mustacchi
175*f3e7f55eSRobert Mustacchi if (error != NULL) {
176*f3e7f55eSRobert Mustacchi *error = NULL;
177*f3e7f55eSRobert Mustacchi }
178*f3e7f55eSRobert Mustacchi
179*f3e7f55eSRobert Mustacchi CHECK_DIE(die, DW_DLV_ERROR);
180*f3e7f55eSRobert Mustacchi dbg = die->di_cu_context->cc_dbg;
181*f3e7f55eSRobert Mustacchi
182*f3e7f55eSRobert Mustacchi res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
183*f3e7f55eSRobert Mustacchi if (res != DW_DLV_OK) {
184*f3e7f55eSRobert Mustacchi return res;
185*f3e7f55eSRobert Mustacchi }
186*f3e7f55eSRobert Mustacchi
187*f3e7f55eSRobert Mustacchi resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
188*f3e7f55eSRobert Mustacchi if (resattr != DW_DLV_OK) {
189*f3e7f55eSRobert Mustacchi return resattr;
190*f3e7f55eSRobert Mustacchi }
191*f3e7f55eSRobert Mustacchi
192*f3e7f55eSRobert Mustacchi
193*f3e7f55eSRobert Mustacchi /* The list of relevant FORMs is small.
194*f3e7f55eSRobert Mustacchi DW_FORM_data4, DW_FORM_data8, DW_FORM_sec_offset
195*f3e7f55eSRobert Mustacchi */
196*f3e7f55eSRobert Mustacchi lres = dwarf_whatform(stmt_list_attr,&attrform,error);
197*f3e7f55eSRobert Mustacchi if (lres != DW_DLV_OK) {
198*f3e7f55eSRobert Mustacchi return lres;
199*f3e7f55eSRobert Mustacchi }
200*f3e7f55eSRobert Mustacchi if (attrform != DW_FORM_data4 && attrform != DW_FORM_data8 &&
201*f3e7f55eSRobert Mustacchi attrform != DW_FORM_sec_offset ) {
202*f3e7f55eSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
203*f3e7f55eSRobert Mustacchi return (DW_DLV_ERROR);
204*f3e7f55eSRobert Mustacchi }
205*f3e7f55eSRobert Mustacchi lres = dwarf_global_formref(stmt_list_attr, &line_offset, error);
206*f3e7f55eSRobert Mustacchi if (lres != DW_DLV_OK) {
207*f3e7f55eSRobert Mustacchi return lres;
208*f3e7f55eSRobert Mustacchi }
209*f3e7f55eSRobert Mustacchi
210*f3e7f55eSRobert Mustacchi if (line_offset >= dbg->de_debug_line.dss_size) {
211*f3e7f55eSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
212*f3e7f55eSRobert Mustacchi return (DW_DLV_ERROR);
213*f3e7f55eSRobert Mustacchi }
214*f3e7f55eSRobert Mustacchi orig_line_ptr = dbg->de_debug_line.dss_data;
215*f3e7f55eSRobert Mustacchi line_ptr = dbg->de_debug_line.dss_data + line_offset;
216*f3e7f55eSRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
217*f3e7f55eSRobert Mustacchi
218*f3e7f55eSRobert Mustacchi /*
219*f3e7f55eSRobert Mustacchi If die has DW_AT_comp_dir attribute, get the string that names
220*f3e7f55eSRobert Mustacchi the compilation directory. */
221*f3e7f55eSRobert Mustacchi resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error);
222*f3e7f55eSRobert Mustacchi if (resattr == DW_DLV_ERROR) {
223*f3e7f55eSRobert Mustacchi return resattr;
224*f3e7f55eSRobert Mustacchi }
225*f3e7f55eSRobert Mustacchi if (resattr == DW_DLV_OK) {
226*f3e7f55eSRobert Mustacchi int cres = DW_DLV_ERROR;
227*f3e7f55eSRobert Mustacchi char *cdir = 0;
228*f3e7f55eSRobert Mustacchi
229*f3e7f55eSRobert Mustacchi cres = dwarf_formstring(comp_dir_attr, &cdir, error);
230*f3e7f55eSRobert Mustacchi if (cres == DW_DLV_ERROR) {
231*f3e7f55eSRobert Mustacchi return cres;
232*f3e7f55eSRobert Mustacchi } else if (cres == DW_DLV_OK) {
233*f3e7f55eSRobert Mustacchi comp_dir = (Dwarf_Small *) cdir;
234*f3e7f55eSRobert Mustacchi }
235*f3e7f55eSRobert Mustacchi }
236*f3e7f55eSRobert Mustacchi if (resattr == DW_DLV_OK) {
237*f3e7f55eSRobert Mustacchi dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR);
238*f3e7f55eSRobert Mustacchi }
239*f3e7f55eSRobert Mustacchi
240*f3e7f55eSRobert Mustacchi dwarf_init_line_table_prefix(&prefix);
241*f3e7f55eSRobert Mustacchi {
242*f3e7f55eSRobert Mustacchi Dwarf_Small *line_ptr_out = 0;
243*f3e7f55eSRobert Mustacchi int dres = dwarf_read_line_table_prefix(dbg,
244*f3e7f55eSRobert Mustacchi line_ptr,dbg->de_debug_line.dss_size - line_offset,
245*f3e7f55eSRobert Mustacchi &line_ptr_out,
246*f3e7f55eSRobert Mustacchi &prefix,
247*f3e7f55eSRobert Mustacchi &bogus_bytes_ptr,
248*f3e7f55eSRobert Mustacchi &bogus_bytes_count,
249*f3e7f55eSRobert Mustacchi error,
250*f3e7f55eSRobert Mustacchi err_count_out);
251*f3e7f55eSRobert Mustacchi if (dres == DW_DLV_ERROR) {
252*f3e7f55eSRobert Mustacchi dwarf_free_line_table_prefix(&prefix);
253*f3e7f55eSRobert Mustacchi return dres;
254*f3e7f55eSRobert Mustacchi }
255*f3e7f55eSRobert Mustacchi if (dres == DW_DLV_NO_ENTRY) {
256*f3e7f55eSRobert Mustacchi dwarf_free_line_table_prefix(&prefix);
257*f3e7f55eSRobert Mustacchi return dres;
258*f3e7f55eSRobert Mustacchi }
259*f3e7f55eSRobert Mustacchi line_ptr_end = prefix.pf_line_ptr_end;
260*f3e7f55eSRobert Mustacchi line_ptr = line_ptr_out;
261*f3e7f55eSRobert Mustacchi }
262*f3e7f55eSRobert Mustacchi if(only_line_header) {
263*f3e7f55eSRobert Mustacchi /* Just checking for header errors, nothing more here.*/
264*f3e7f55eSRobert Mustacchi dwarf_free_line_table_prefix(&prefix);
265*f3e7f55eSRobert Mustacchi return DW_DLV_OK;
266*f3e7f55eSRobert Mustacchi }
267*f3e7f55eSRobert Mustacchi
268*f3e7f55eSRobert Mustacchi
269*f3e7f55eSRobert Mustacchi printf("total line info length %ld bytes, "
270*f3e7f55eSRobert Mustacchi "line offset 0x%" DW_PR_DUx " %" DW_PR_DSd "\n",
271*f3e7f55eSRobert Mustacchi (long) prefix.pf_total_length,
272*f3e7f55eSRobert Mustacchi (Dwarf_Unsigned) line_offset,
273*f3e7f55eSRobert Mustacchi (Dwarf_Signed) line_offset);
274*f3e7f55eSRobert Mustacchi printf("line table version %d\n",(int) prefix.pf_version);
275*f3e7f55eSRobert Mustacchi printf("line table length field length %d prologue length %d\n",
276*f3e7f55eSRobert Mustacchi (int)prefix.pf_length_field_length,
277*f3e7f55eSRobert Mustacchi (int)prefix.pf_prologue_length);
278*f3e7f55eSRobert Mustacchi printf("compilation_directory %s\n",
279*f3e7f55eSRobert Mustacchi comp_dir ? ((char *) comp_dir) : "");
280*f3e7f55eSRobert Mustacchi
281*f3e7f55eSRobert Mustacchi printf(" min instruction length %d\n",
282*f3e7f55eSRobert Mustacchi (int) prefix.pf_minimum_instruction_length);
283*f3e7f55eSRobert Mustacchi printf(" default is stmt %d\n", (int)
284*f3e7f55eSRobert Mustacchi prefix.pf_default_is_stmt);
285*f3e7f55eSRobert Mustacchi printf(" line base %d\n", (int)
286*f3e7f55eSRobert Mustacchi prefix.pf_line_base);
287*f3e7f55eSRobert Mustacchi printf(" line_range %d\n", (int)
288*f3e7f55eSRobert Mustacchi prefix.pf_line_range);
289*f3e7f55eSRobert Mustacchi printf(" opcode base %d\n", (int)
290*f3e7f55eSRobert Mustacchi prefix.pf_opcode_base);
291*f3e7f55eSRobert Mustacchi printf(" standard opcode count %d\n", (int)
292*f3e7f55eSRobert Mustacchi prefix.pf_std_op_count);
293*f3e7f55eSRobert Mustacchi
294*f3e7f55eSRobert Mustacchi for (i = 1; i < prefix.pf_opcode_base; i++) {
295*f3e7f55eSRobert Mustacchi printf(" opcode[%2d] length %d\n", (int) i,
296*f3e7f55eSRobert Mustacchi (int) prefix.pf_opcode_length_table[i - 1]);
297*f3e7f55eSRobert Mustacchi }
298*f3e7f55eSRobert Mustacchi printf(" include directories count %d\n", (int)
299*f3e7f55eSRobert Mustacchi prefix.pf_include_directories_count);
300*f3e7f55eSRobert Mustacchi
301*f3e7f55eSRobert Mustacchi
302*f3e7f55eSRobert Mustacchi for (i = 0; i < prefix.pf_include_directories_count; ++i) {
303*f3e7f55eSRobert Mustacchi printf(" include dir[%d] %s\n",
304*f3e7f55eSRobert Mustacchi (int) i, prefix.pf_include_directories[i]);
305*f3e7f55eSRobert Mustacchi }
306*f3e7f55eSRobert Mustacchi printf(" files count %d\n", (int)
307*f3e7f55eSRobert Mustacchi prefix.pf_files_count);
308*f3e7f55eSRobert Mustacchi
309*f3e7f55eSRobert Mustacchi for (i = 0; i < prefix.pf_files_count; ++i) {
310*f3e7f55eSRobert Mustacchi struct Line_Table_File_Entry_s *lfile =
311*f3e7f55eSRobert Mustacchi prefix.pf_line_table_file_entries + i;
312*f3e7f55eSRobert Mustacchi
313*f3e7f55eSRobert Mustacchi Dwarf_Unsigned tlm2 = lfile->lte_last_modification_time;
314*f3e7f55eSRobert Mustacchi Dwarf_Unsigned di = lfile->lte_directory_index;
315*f3e7f55eSRobert Mustacchi Dwarf_Unsigned fl = lfile->lte_length_of_file;
316*f3e7f55eSRobert Mustacchi
317*f3e7f55eSRobert Mustacchi printf(" file[%d] %s (file-number: %d) \n",
318*f3e7f55eSRobert Mustacchi (int) i, (char *) lfile->lte_filename,
319*f3e7f55eSRobert Mustacchi (int)(i+1));
320*f3e7f55eSRobert Mustacchi
321*f3e7f55eSRobert Mustacchi printf(" dir index %d\n", (int) di);
322*f3e7f55eSRobert Mustacchi {
323*f3e7f55eSRobert Mustacchi time_t tt = (time_t) tlm2;
324*f3e7f55eSRobert Mustacchi
325*f3e7f55eSRobert Mustacchi printf(" last time 0x%x %s", /* ctime supplies
326*f3e7f55eSRobert Mustacchi newline */
327*f3e7f55eSRobert Mustacchi (unsigned) tlm2, ctime(&tt));
328*f3e7f55eSRobert Mustacchi }
329*f3e7f55eSRobert Mustacchi printf(" file length %ld 0x%lx\n",
330*f3e7f55eSRobert Mustacchi (long) fl, (unsigned long) fl);
331*f3e7f55eSRobert Mustacchi
332*f3e7f55eSRobert Mustacchi
333*f3e7f55eSRobert Mustacchi }
334*f3e7f55eSRobert Mustacchi
335*f3e7f55eSRobert Mustacchi
336*f3e7f55eSRobert Mustacchi {
337*f3e7f55eSRobert Mustacchi Dwarf_Unsigned offset = 0;
338*f3e7f55eSRobert Mustacchi if(bogus_bytes_count > 0) {
339*f3e7f55eSRobert Mustacchi Dwarf_Unsigned wcount = bogus_bytes_count;
340*f3e7f55eSRobert Mustacchi Dwarf_Unsigned boffset = bogus_bytes_ptr - orig_line_ptr;
341*f3e7f55eSRobert Mustacchi printf("*** DWARF CHECK: the line table prologue header_length "
342*f3e7f55eSRobert Mustacchi " is %" DW_PR_DUu " too high, we pretend it is smaller."
343*f3e7f55eSRobert Mustacchi "Section offset: %" DW_PR_DUu " (0x%" DW_PR_DUx ") ***\n",
344*f3e7f55eSRobert Mustacchi wcount, boffset,boffset);
345*f3e7f55eSRobert Mustacchi *err_count_out += 1;
346*f3e7f55eSRobert Mustacchi }
347*f3e7f55eSRobert Mustacchi offset = line_ptr - orig_line_ptr;
348*f3e7f55eSRobert Mustacchi
349*f3e7f55eSRobert Mustacchi printf(" statement prog offset in section: %" DW_PR_DUu " 0x%" DW_PR_DUx "\n",
350*f3e7f55eSRobert Mustacchi offset, offset);
351*f3e7f55eSRobert Mustacchi }
352*f3e7f55eSRobert Mustacchi
353*f3e7f55eSRobert Mustacchi /* Initialize the part of the state machine dependent on the
354*f3e7f55eSRobert Mustacchi prefix. */
355*f3e7f55eSRobert Mustacchi is_stmt = prefix.pf_default_is_stmt;
356*f3e7f55eSRobert Mustacchi
357*f3e7f55eSRobert Mustacchi
358*f3e7f55eSRobert Mustacchi print_line_header();
359*f3e7f55eSRobert Mustacchi /* Start of statement program. */
360*f3e7f55eSRobert Mustacchi while (line_ptr < line_ptr_end) {
361*f3e7f55eSRobert Mustacchi int type = 0;
362*f3e7f55eSRobert Mustacchi
363*f3e7f55eSRobert Mustacchi printf(" [0x%06" DW_PR_DSx "] ",
364*f3e7f55eSRobert Mustacchi (Dwarf_Signed) (line_ptr - orig_line_ptr));
365*f3e7f55eSRobert Mustacchi opcode = *(Dwarf_Small *) line_ptr;
366*f3e7f55eSRobert Mustacchi line_ptr++;
367*f3e7f55eSRobert Mustacchi /* 'type' is the output */
368*f3e7f55eSRobert Mustacchi WHAT_IS_OPCODE(type, opcode, prefix.pf_opcode_base,
369*f3e7f55eSRobert Mustacchi prefix.pf_opcode_length_table, line_ptr,
370*f3e7f55eSRobert Mustacchi prefix.pf_std_op_count);
371*f3e7f55eSRobert Mustacchi
372*f3e7f55eSRobert Mustacchi if (type == LOP_DISCARD) {
373*f3e7f55eSRobert Mustacchi int oc;
374*f3e7f55eSRobert Mustacchi int opcnt = prefix.pf_opcode_length_table[opcode];
375*f3e7f55eSRobert Mustacchi
376*f3e7f55eSRobert Mustacchi printf("*** DWARF CHECK: DISCARD standard opcode %d "
377*f3e7f55eSRobert Mustacchi "with %d operands: "
378*f3e7f55eSRobert Mustacchi "not understood.", opcode, opcnt);
379*f3e7f55eSRobert Mustacchi *err_count_out += 1;
380*f3e7f55eSRobert Mustacchi for (oc = 0; oc < opcnt; oc++) {
381*f3e7f55eSRobert Mustacchi /*
382*f3e7f55eSRobert Mustacchi * Read and discard operands we don't
383*f3e7f55eSRobert Mustacchi * understand.
384*f3e7f55eSRobert Mustacchi * Arbitrary choice of unsigned read.
385*f3e7f55eSRobert Mustacchi * Signed read would work as well.
386*f3e7f55eSRobert Mustacchi */
387*f3e7f55eSRobert Mustacchi Dwarf_Unsigned utmp2;
388*f3e7f55eSRobert Mustacchi
389*f3e7f55eSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2);
390*f3e7f55eSRobert Mustacchi printf(" %" DW_PR_DUu " (0x%" DW_PR_DUx ")",
391*f3e7f55eSRobert Mustacchi (Dwarf_Unsigned) utmp2,
392*f3e7f55eSRobert Mustacchi (Dwarf_Unsigned) utmp2);
393*f3e7f55eSRobert Mustacchi }
394*f3e7f55eSRobert Mustacchi
395*f3e7f55eSRobert Mustacchi printf("***\n");
396*f3e7f55eSRobert Mustacchi /* do nothing, necessary ops done */
397*f3e7f55eSRobert Mustacchi } else if (type == LOP_SPECIAL) {
398*f3e7f55eSRobert Mustacchi /* This op code is a special op in the object, no matter
399*f3e7f55eSRobert Mustacchi that it might fall into the standard op range in this
400*f3e7f55eSRobert Mustacchi compile Thatis, these are special opcodes between
401*f3e7f55eSRobert Mustacchi special_opcode_base and MAX_LINE_OP_CODE. (including
402*f3e7f55eSRobert Mustacchi special_opcode_base and MAX_LINE_OP_CODE) */
403*f3e7f55eSRobert Mustacchi char special[50];
404*f3e7f55eSRobert Mustacchi unsigned origop = opcode;
405*f3e7f55eSRobert Mustacchi
406*f3e7f55eSRobert Mustacchi opcode = opcode - prefix.pf_opcode_base;
407*f3e7f55eSRobert Mustacchi address = address + prefix.pf_minimum_instruction_length *
408*f3e7f55eSRobert Mustacchi (opcode / prefix.pf_line_range);
409*f3e7f55eSRobert Mustacchi line =
410*f3e7f55eSRobert Mustacchi line + prefix.pf_line_base +
411*f3e7f55eSRobert Mustacchi opcode % prefix.pf_line_range;
412*f3e7f55eSRobert Mustacchi
413*f3e7f55eSRobert Mustacchi sprintf(special, "Specialop %3u", origop);
414*f3e7f55eSRobert Mustacchi print_line_detail(special,
415*f3e7f55eSRobert Mustacchi opcode, address, (int) file, line, column,
416*f3e7f55eSRobert Mustacchi is_stmt, basic_block, end_sequence,
417*f3e7f55eSRobert Mustacchi prologue_end, epilogue_begin, isa);
418*f3e7f55eSRobert Mustacchi
419*f3e7f55eSRobert Mustacchi basic_block = false;
420*f3e7f55eSRobert Mustacchi
421*f3e7f55eSRobert Mustacchi } else if (type == LOP_STANDARD) {
422*f3e7f55eSRobert Mustacchi switch (opcode) {
423*f3e7f55eSRobert Mustacchi
424*f3e7f55eSRobert Mustacchi case DW_LNS_copy:{
425*f3e7f55eSRobert Mustacchi
426*f3e7f55eSRobert Mustacchi print_line_detail("DW_LNS_copy",
427*f3e7f55eSRobert Mustacchi opcode, address, file, line,
428*f3e7f55eSRobert Mustacchi column, is_stmt, basic_block,
429*f3e7f55eSRobert Mustacchi end_sequence, prologue_end,
430*f3e7f55eSRobert Mustacchi epilogue_begin, isa);
431*f3e7f55eSRobert Mustacchi
432*f3e7f55eSRobert Mustacchi basic_block = false;
433*f3e7f55eSRobert Mustacchi break;
434*f3e7f55eSRobert Mustacchi }
435*f3e7f55eSRobert Mustacchi
436*f3e7f55eSRobert Mustacchi case DW_LNS_advance_pc:{
437*f3e7f55eSRobert Mustacchi Dwarf_Unsigned utmp2;
438*f3e7f55eSRobert Mustacchi
439*f3e7f55eSRobert Mustacchi
440*f3e7f55eSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2);
441*f3e7f55eSRobert Mustacchi printf("DW_LNS_advance_pc val %" DW_PR_DSd " 0x%" DW_PR_DUx "\n",
442*f3e7f55eSRobert Mustacchi (Dwarf_Signed) (Dwarf_Word) utmp2,
443*f3e7f55eSRobert Mustacchi (Dwarf_Unsigned) (Dwarf_Word) utmp2);
444*f3e7f55eSRobert Mustacchi leb128_num = (Dwarf_Word) utmp2;
445*f3e7f55eSRobert Mustacchi address =
446*f3e7f55eSRobert Mustacchi address +
447*f3e7f55eSRobert Mustacchi prefix.pf_minimum_instruction_length *
448*f3e7f55eSRobert Mustacchi leb128_num;
449*f3e7f55eSRobert Mustacchi break;
450*f3e7f55eSRobert Mustacchi }
451*f3e7f55eSRobert Mustacchi
452*f3e7f55eSRobert Mustacchi case DW_LNS_advance_line:{
453*f3e7f55eSRobert Mustacchi Dwarf_Signed stmp;
454*f3e7f55eSRobert Mustacchi
455*f3e7f55eSRobert Mustacchi
456*f3e7f55eSRobert Mustacchi DECODE_LEB128_SWORD(line_ptr, stmp);
457*f3e7f55eSRobert Mustacchi advance_line = (Dwarf_Sword) stmp;
458*f3e7f55eSRobert Mustacchi printf("DW_LNS_advance_line val %" DW_PR_DSd " 0x%" DW_PR_DSx "\n",
459*f3e7f55eSRobert Mustacchi (Dwarf_Signed) advance_line,
460*f3e7f55eSRobert Mustacchi (Dwarf_Signed) advance_line);
461*f3e7f55eSRobert Mustacchi line = line + advance_line;
462*f3e7f55eSRobert Mustacchi break;
463*f3e7f55eSRobert Mustacchi }
464*f3e7f55eSRobert Mustacchi
465*f3e7f55eSRobert Mustacchi case DW_LNS_set_file:{
466*f3e7f55eSRobert Mustacchi Dwarf_Unsigned utmp2;
467*f3e7f55eSRobert Mustacchi
468*f3e7f55eSRobert Mustacchi
469*f3e7f55eSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2);
470*f3e7f55eSRobert Mustacchi file = (Dwarf_Word) utmp2;
471*f3e7f55eSRobert Mustacchi printf("DW_LNS_set_file %ld\n", (long) file);
472*f3e7f55eSRobert Mustacchi break;
473*f3e7f55eSRobert Mustacchi }
474*f3e7f55eSRobert Mustacchi
475*f3e7f55eSRobert Mustacchi case DW_LNS_set_column:{
476*f3e7f55eSRobert Mustacchi Dwarf_Unsigned utmp2;
477*f3e7f55eSRobert Mustacchi
478*f3e7f55eSRobert Mustacchi
479*f3e7f55eSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2);
480*f3e7f55eSRobert Mustacchi column = (Dwarf_Word) utmp2;
481*f3e7f55eSRobert Mustacchi printf("DW_LNS_set_column val %" DW_PR_DSd " 0x%" DW_PR_DSx "\n",
482*f3e7f55eSRobert Mustacchi (Dwarf_Signed) column, (Dwarf_Signed) column);
483*f3e7f55eSRobert Mustacchi break;
484*f3e7f55eSRobert Mustacchi }
485*f3e7f55eSRobert Mustacchi
486*f3e7f55eSRobert Mustacchi case DW_LNS_negate_stmt:{
487*f3e7f55eSRobert Mustacchi is_stmt = !is_stmt;
488*f3e7f55eSRobert Mustacchi printf("DW_LNS_negate_stmt\n");
489*f3e7f55eSRobert Mustacchi break;
490*f3e7f55eSRobert Mustacchi }
491*f3e7f55eSRobert Mustacchi
492*f3e7f55eSRobert Mustacchi case DW_LNS_set_basic_block:{
493*f3e7f55eSRobert Mustacchi
494*f3e7f55eSRobert Mustacchi printf("DW_LNS_set_basic_block\n");
495*f3e7f55eSRobert Mustacchi basic_block = true;
496*f3e7f55eSRobert Mustacchi break;
497*f3e7f55eSRobert Mustacchi }
498*f3e7f55eSRobert Mustacchi
499*f3e7f55eSRobert Mustacchi case DW_LNS_const_add_pc:{
500*f3e7f55eSRobert Mustacchi opcode = MAX_LINE_OP_CODE - prefix.pf_opcode_base;
501*f3e7f55eSRobert Mustacchi address =
502*f3e7f55eSRobert Mustacchi address +
503*f3e7f55eSRobert Mustacchi prefix.pf_minimum_instruction_length * (opcode /
504*f3e7f55eSRobert Mustacchi prefix.
505*f3e7f55eSRobert Mustacchi pf_line_range);
506*f3e7f55eSRobert Mustacchi
507*f3e7f55eSRobert Mustacchi printf("DW_LNS_const_add_pc new address 0x%" DW_PR_DSx "\n",
508*f3e7f55eSRobert Mustacchi (Dwarf_Signed) address);
509*f3e7f55eSRobert Mustacchi break;
510*f3e7f55eSRobert Mustacchi }
511*f3e7f55eSRobert Mustacchi
512*f3e7f55eSRobert Mustacchi case DW_LNS_fixed_advance_pc:{
513*f3e7f55eSRobert Mustacchi
514*f3e7f55eSRobert Mustacchi READ_UNALIGNED(dbg, fixed_advance_pc, Dwarf_Half,
515*f3e7f55eSRobert Mustacchi line_ptr, sizeof(Dwarf_Half));
516*f3e7f55eSRobert Mustacchi line_ptr += sizeof(Dwarf_Half);
517*f3e7f55eSRobert Mustacchi address = address + fixed_advance_pc;
518*f3e7f55eSRobert Mustacchi printf("DW_LNS_fixed_advance_pc val %" DW_PR_DSd
519*f3e7f55eSRobert Mustacchi " 0x%" DW_PR_DSx " new address 0x%" DW_PR_DSx "\n",
520*f3e7f55eSRobert Mustacchi (Dwarf_Signed) fixed_advance_pc,
521*f3e7f55eSRobert Mustacchi (Dwarf_Signed) fixed_advance_pc,
522*f3e7f55eSRobert Mustacchi (Dwarf_Signed) address);
523*f3e7f55eSRobert Mustacchi break;
524*f3e7f55eSRobert Mustacchi }
525*f3e7f55eSRobert Mustacchi case DW_LNS_set_prologue_end:{
526*f3e7f55eSRobert Mustacchi
527*f3e7f55eSRobert Mustacchi prologue_end = true;
528*f3e7f55eSRobert Mustacchi printf("DW_LNS_set_prologue_end set true.\n");
529*f3e7f55eSRobert Mustacchi break;
530*f3e7f55eSRobert Mustacchi
531*f3e7f55eSRobert Mustacchi
532*f3e7f55eSRobert Mustacchi }
533*f3e7f55eSRobert Mustacchi /* New in DWARF3 */
534*f3e7f55eSRobert Mustacchi case DW_LNS_set_epilogue_begin:{
535*f3e7f55eSRobert Mustacchi epilogue_begin = true;
536*f3e7f55eSRobert Mustacchi printf("DW_LNS_set_epilogue_begin set true.\n");
537*f3e7f55eSRobert Mustacchi break;
538*f3e7f55eSRobert Mustacchi }
539*f3e7f55eSRobert Mustacchi
540*f3e7f55eSRobert Mustacchi /* New in DWARF3 */
541*f3e7f55eSRobert Mustacchi case DW_LNS_set_isa:{
542*f3e7f55eSRobert Mustacchi Dwarf_Unsigned utmp2;
543*f3e7f55eSRobert Mustacchi
544*f3e7f55eSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2);
545*f3e7f55eSRobert Mustacchi isa = utmp2;
546*f3e7f55eSRobert Mustacchi printf("DW_LNS_set_isa new value 0x%" DW_PR_DUx ".\n",
547*f3e7f55eSRobert Mustacchi (Dwarf_Unsigned) utmp2);
548*f3e7f55eSRobert Mustacchi if (isa != utmp2) {
549*f3e7f55eSRobert Mustacchi /* The value of the isa did not fit in our
550*f3e7f55eSRobert Mustacchi local so we record it wrong. declare an
551*f3e7f55eSRobert Mustacchi error. */
552*f3e7f55eSRobert Mustacchi dwarf_free_line_table_prefix(&prefix);
553*f3e7f55eSRobert Mustacchi
554*f3e7f55eSRobert Mustacchi _dwarf_error(dbg, error,
555*f3e7f55eSRobert Mustacchi DW_DLE_LINE_NUM_OPERANDS_BAD);
556*f3e7f55eSRobert Mustacchi return (DW_DLV_ERROR);
557*f3e7f55eSRobert Mustacchi }
558*f3e7f55eSRobert Mustacchi break;
559*f3e7f55eSRobert Mustacchi }
560*f3e7f55eSRobert Mustacchi }
561*f3e7f55eSRobert Mustacchi
562*f3e7f55eSRobert Mustacchi
563*f3e7f55eSRobert Mustacchi } else if (type == LOP_EXTENDED) {
564*f3e7f55eSRobert Mustacchi Dwarf_Unsigned utmp3 = 0;
565*f3e7f55eSRobert Mustacchi Dwarf_Word instr_length = 0;
566*f3e7f55eSRobert Mustacchi Dwarf_Small ext_opcode = 0;
567*f3e7f55eSRobert Mustacchi
568*f3e7f55eSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp3);
569*f3e7f55eSRobert Mustacchi instr_length = (Dwarf_Word) utmp3;
570*f3e7f55eSRobert Mustacchi ext_opcode = *(Dwarf_Small *) line_ptr;
571*f3e7f55eSRobert Mustacchi line_ptr++;
572*f3e7f55eSRobert Mustacchi switch (ext_opcode) {
573*f3e7f55eSRobert Mustacchi
574*f3e7f55eSRobert Mustacchi case DW_LNE_end_sequence:{
575*f3e7f55eSRobert Mustacchi end_sequence = true;
576*f3e7f55eSRobert Mustacchi
577*f3e7f55eSRobert Mustacchi print_line_detail("DW_LNE_end_sequence extended",
578*f3e7f55eSRobert Mustacchi opcode, address, file, line,
579*f3e7f55eSRobert Mustacchi column, is_stmt, basic_block,
580*f3e7f55eSRobert Mustacchi end_sequence, prologue_end,
581*f3e7f55eSRobert Mustacchi epilogue_begin, isa);
582*f3e7f55eSRobert Mustacchi
583*f3e7f55eSRobert Mustacchi address = 0;
584*f3e7f55eSRobert Mustacchi file = 1;
585*f3e7f55eSRobert Mustacchi line = 1;
586*f3e7f55eSRobert Mustacchi column = 0;
587*f3e7f55eSRobert Mustacchi is_stmt = prefix.pf_default_is_stmt;
588*f3e7f55eSRobert Mustacchi basic_block = false;
589*f3e7f55eSRobert Mustacchi end_sequence = false;
590*f3e7f55eSRobert Mustacchi prologue_end = false;
591*f3e7f55eSRobert Mustacchi epilogue_begin = false;
592*f3e7f55eSRobert Mustacchi
593*f3e7f55eSRobert Mustacchi
594*f3e7f55eSRobert Mustacchi break;
595*f3e7f55eSRobert Mustacchi }
596*f3e7f55eSRobert Mustacchi
597*f3e7f55eSRobert Mustacchi case DW_LNE_set_address:{
598*f3e7f55eSRobert Mustacchi {
599*f3e7f55eSRobert Mustacchi READ_UNALIGNED(dbg, address, Dwarf_Addr,
600*f3e7f55eSRobert Mustacchi line_ptr,
601*f3e7f55eSRobert Mustacchi die->di_cu_context->cc_address_size);
602*f3e7f55eSRobert Mustacchi
603*f3e7f55eSRobert Mustacchi line_ptr += die->di_cu_context->cc_address_size;
604*f3e7f55eSRobert Mustacchi printf("DW_LNE_set_address address 0x%" DW_PR_DUx "\n",
605*f3e7f55eSRobert Mustacchi (Dwarf_Unsigned) address);
606*f3e7f55eSRobert Mustacchi }
607*f3e7f55eSRobert Mustacchi
608*f3e7f55eSRobert Mustacchi break;
609*f3e7f55eSRobert Mustacchi }
610*f3e7f55eSRobert Mustacchi
611*f3e7f55eSRobert Mustacchi case DW_LNE_define_file:{
612*f3e7f55eSRobert Mustacchi Dwarf_Unsigned di = 0;
613*f3e7f55eSRobert Mustacchi Dwarf_Unsigned tlm = 0;
614*f3e7f55eSRobert Mustacchi Dwarf_Unsigned fl = 0;
615*f3e7f55eSRobert Mustacchi
616*f3e7f55eSRobert Mustacchi Dwarf_Small *fn = (Dwarf_Small *) line_ptr;
617*f3e7f55eSRobert Mustacchi line_ptr = line_ptr + strlen((char *) line_ptr) + 1;
618*f3e7f55eSRobert Mustacchi
619*f3e7f55eSRobert Mustacchi di = _dwarf_decode_u_leb128(line_ptr,
620*f3e7f55eSRobert Mustacchi &leb128_length);
621*f3e7f55eSRobert Mustacchi line_ptr = line_ptr + leb128_length;
622*f3e7f55eSRobert Mustacchi
623*f3e7f55eSRobert Mustacchi tlm = _dwarf_decode_u_leb128(line_ptr,
624*f3e7f55eSRobert Mustacchi &leb128_length);
625*f3e7f55eSRobert Mustacchi line_ptr = line_ptr + leb128_length;
626*f3e7f55eSRobert Mustacchi
627*f3e7f55eSRobert Mustacchi fl = _dwarf_decode_u_leb128(line_ptr,
628*f3e7f55eSRobert Mustacchi &leb128_length);
629*f3e7f55eSRobert Mustacchi line_ptr = line_ptr + leb128_length;
630*f3e7f55eSRobert Mustacchi
631*f3e7f55eSRobert Mustacchi
632*f3e7f55eSRobert Mustacchi printf("DW_LNE_define_file %s \n", fn);
633*f3e7f55eSRobert Mustacchi printf(" dir index %d\n", (int) di);
634*f3e7f55eSRobert Mustacchi {
635*f3e7f55eSRobert Mustacchi time_t tt3 = (time_t) tlm;
636*f3e7f55eSRobert Mustacchi
637*f3e7f55eSRobert Mustacchi /* ctime supplies newline */
638*f3e7f55eSRobert Mustacchi printf(" last time 0x%x %s",
639*f3e7f55eSRobert Mustacchi (unsigned) tlm, ctime(&tt3));
640*f3e7f55eSRobert Mustacchi }
641*f3e7f55eSRobert Mustacchi printf(" file length %ld 0x%lx\n",
642*f3e7f55eSRobert Mustacchi (long) fl, (unsigned long) fl);
643*f3e7f55eSRobert Mustacchi
644*f3e7f55eSRobert Mustacchi break;
645*f3e7f55eSRobert Mustacchi }
646*f3e7f55eSRobert Mustacchi
647*f3e7f55eSRobert Mustacchi default:{
648*f3e7f55eSRobert Mustacchi /* This is an extended op code we do not know about,
649*f3e7f55eSRobert Mustacchi other than we know now many bytes it is
650*f3e7f55eSRobert Mustacchi (and the op code and the bytes of operand). */
651*f3e7f55eSRobert Mustacchi
652*f3e7f55eSRobert Mustacchi Dwarf_Unsigned remaining_bytes = instr_length -1;
653*f3e7f55eSRobert Mustacchi if(instr_length < 1 || remaining_bytes > DW_LNE_LEN_MAX) {
654*f3e7f55eSRobert Mustacchi dwarf_free_line_table_prefix(&prefix);
655*f3e7f55eSRobert Mustacchi _dwarf_error(dbg, error,
656*f3e7f55eSRobert Mustacchi DW_DLE_LINE_EXT_OPCODE_BAD);
657*f3e7f55eSRobert Mustacchi return (DW_DLV_ERROR);
658*f3e7f55eSRobert Mustacchi }
659*f3e7f55eSRobert Mustacchi printf("DW_LNE extended op 0x%x ",ext_opcode);
660*f3e7f55eSRobert Mustacchi printf("Bytecount: " DW_PR_DUu , instr_length);
661*f3e7f55eSRobert Mustacchi if(remaining_bytes > 0) {
662*f3e7f55eSRobert Mustacchi printf(" linedata: 0x");
663*f3e7f55eSRobert Mustacchi while (remaining_bytes > 0) {
664*f3e7f55eSRobert Mustacchi printf("%02x",(unsigned char)(*(line_ptr)));
665*f3e7f55eSRobert Mustacchi line_ptr++;
666*f3e7f55eSRobert Mustacchi remaining_bytes--;
667*f3e7f55eSRobert Mustacchi }
668*f3e7f55eSRobert Mustacchi }
669*f3e7f55eSRobert Mustacchi printf("\n");
670*f3e7f55eSRobert Mustacchi }
671*f3e7f55eSRobert Mustacchi break;
672*f3e7f55eSRobert Mustacchi }
673*f3e7f55eSRobert Mustacchi
674*f3e7f55eSRobert Mustacchi }
675*f3e7f55eSRobert Mustacchi }
676*f3e7f55eSRobert Mustacchi
677*f3e7f55eSRobert Mustacchi dwarf_free_line_table_prefix(&prefix);
678*f3e7f55eSRobert Mustacchi return (DW_DLV_OK);
679*f3e7f55eSRobert Mustacchi }
680*f3e7f55eSRobert Mustacchi
681*f3e7f55eSRobert Mustacchi /*
682*f3e7f55eSRobert Mustacchi This is support for dwarfdump: making it possible
683*f3e7f55eSRobert Mustacchi for clients wanting line detail info on stdout
684*f3e7f55eSRobert Mustacchi to get that detail without including internal libdwarf
685*f3e7f55eSRobert Mustacchi header information.
686*f3e7f55eSRobert Mustacchi Caller passes in compilation unit DIE.
687*f3e7f55eSRobert Mustacchi The _dwarf_ version is obsolete (though supported for
688*f3e7f55eSRobert Mustacchi compatibility).
689*f3e7f55eSRobert Mustacchi The dwarf_ version is preferred.
690*f3e7f55eSRobert Mustacchi The functions are intentionally identical: having
691*f3e7f55eSRobert Mustacchi _dwarf_print_lines call dwarf_print_lines might
692*f3e7f55eSRobert Mustacchi better emphasize they are intentionally identical, but
693*f3e7f55eSRobert Mustacchi that seemed slightly silly given how short the functions are.
694*f3e7f55eSRobert Mustacchi Interface adds error_count (output value) February 2009.
695*f3e7f55eSRobert Mustacchi */
696*f3e7f55eSRobert Mustacchi int
dwarf_print_lines(Dwarf_Die die,Dwarf_Error * error,int * error_count)697*f3e7f55eSRobert Mustacchi dwarf_print_lines(Dwarf_Die die, Dwarf_Error * error,int *error_count)
698*f3e7f55eSRobert Mustacchi {
699*f3e7f55eSRobert Mustacchi int only_line_header = 0;
700*f3e7f55eSRobert Mustacchi int res = _dwarf_internal_printlines(die, error,
701*f3e7f55eSRobert Mustacchi error_count,
702*f3e7f55eSRobert Mustacchi only_line_header);
703*f3e7f55eSRobert Mustacchi if (res != DW_DLV_OK) {
704*f3e7f55eSRobert Mustacchi return res;
705*f3e7f55eSRobert Mustacchi }
706*f3e7f55eSRobert Mustacchi return res;
707*f3e7f55eSRobert Mustacchi }
708*f3e7f55eSRobert Mustacchi int
_dwarf_print_lines(Dwarf_Die die,Dwarf_Error * error)709*f3e7f55eSRobert Mustacchi _dwarf_print_lines(Dwarf_Die die, Dwarf_Error * error)
710*f3e7f55eSRobert Mustacchi {
711*f3e7f55eSRobert Mustacchi int only_line_header = 0;
712*f3e7f55eSRobert Mustacchi int err_count = 0;
713*f3e7f55eSRobert Mustacchi int res = _dwarf_internal_printlines(die, error,
714*f3e7f55eSRobert Mustacchi &err_count,
715*f3e7f55eSRobert Mustacchi only_line_header);
716*f3e7f55eSRobert Mustacchi /* No way to get error count back in this interface */
717*f3e7f55eSRobert Mustacchi if (res != DW_DLV_OK) {
718*f3e7f55eSRobert Mustacchi return res;
719*f3e7f55eSRobert Mustacchi }
720*f3e7f55eSRobert Mustacchi return res;
721*f3e7f55eSRobert Mustacchi }
722*f3e7f55eSRobert Mustacchi
723*f3e7f55eSRobert Mustacchi /* The check is in case we are not printing full line data,
724*f3e7f55eSRobert Mustacchi this gets some of the issues noted with .debug_line,
725*f3e7f55eSRobert Mustacchi but not all. Call dwarf_print_lines() to get all issues.
726*f3e7f55eSRobert Mustacchi Intended for apps like dwarfdump.
727*f3e7f55eSRobert Mustacchi */
728*f3e7f55eSRobert Mustacchi void
dwarf_check_lineheader(Dwarf_Die die,int * err_count_out)729*f3e7f55eSRobert Mustacchi dwarf_check_lineheader(Dwarf_Die die, int *err_count_out)
730*f3e7f55eSRobert Mustacchi {
731*f3e7f55eSRobert Mustacchi Dwarf_Error err;
732*f3e7f55eSRobert Mustacchi int only_line_header = 1;
733*f3e7f55eSRobert Mustacchi _dwarf_internal_printlines(die, &err,err_count_out,
734*f3e7f55eSRobert Mustacchi only_line_header);
735*f3e7f55eSRobert Mustacchi return;
736*f3e7f55eSRobert Mustacchi }
737*f3e7f55eSRobert Mustacchi
738