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