xref: /titanic_50/usr/src/lib/libdwarf/common/dwarf_print_lines.c (revision f3e7f55e73a39377d55a030f124cc86b3b66a9cc)
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