xref: /illumos-gate/usr/src/lib/libdwarf/common/dwarf_print_lines.c (revision 4d9fdb46b215739778ebc12079842c9905586999)
1bc1f688bSRobert Mustacchi /*
2bc1f688bSRobert Mustacchi   Copyright (C) 2000,2002,2004,2005,2006 Silicon Graphics, Inc.  All Rights Reserved.
3*4d9fdb46SRobert Mustacchi   Portions Copyright (C) 2007-2020 David Anderson. All Rights Reserved.
4*4d9fdb46SRobert Mustacchi   Portions Copyright 2012 SN Systems Ltd. All rights reserved.
5bc1f688bSRobert Mustacchi 
6*4d9fdb46SRobert Mustacchi   This program is free software; you can redistribute it
7*4d9fdb46SRobert Mustacchi   and/or modify it under the terms of version 2.1 of the
8*4d9fdb46SRobert Mustacchi   GNU Lesser General Public License as published by the Free
9*4d9fdb46SRobert Mustacchi   Software Foundation.
10bc1f688bSRobert Mustacchi 
11*4d9fdb46SRobert Mustacchi   This program is distributed in the hope that it would be
12*4d9fdb46SRobert Mustacchi   useful, but WITHOUT ANY WARRANTY; without even the implied
13*4d9fdb46SRobert Mustacchi   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14*4d9fdb46SRobert Mustacchi   PURPOSE.
15bc1f688bSRobert Mustacchi 
16*4d9fdb46SRobert Mustacchi   Further, this software is distributed without any warranty
17*4d9fdb46SRobert Mustacchi   that it is free of the rightful claim of any third person
18*4d9fdb46SRobert Mustacchi   regarding infringement or the like.  Any license provided
19*4d9fdb46SRobert Mustacchi   herein, whether implied or otherwise, applies only to this
20*4d9fdb46SRobert Mustacchi   software file.  Patent licenses, if any, provided herein
21*4d9fdb46SRobert Mustacchi   do not apply to combinations of this program with other
22*4d9fdb46SRobert Mustacchi   software, or any other product whatsoever.
23bc1f688bSRobert Mustacchi 
24*4d9fdb46SRobert Mustacchi   You should have received a copy of the GNU Lesser General
25*4d9fdb46SRobert Mustacchi   Public License along with this program; if not, write the
26*4d9fdb46SRobert Mustacchi   Free Software Foundation, Inc., 51 Franklin Street - Fifth
27*4d9fdb46SRobert Mustacchi   Floor, Boston MA 02110-1301, USA.
28bc1f688bSRobert Mustacchi 
29bc1f688bSRobert Mustacchi */
30bc1f688bSRobert Mustacchi 
31bc1f688bSRobert Mustacchi #include "config.h"
32bc1f688bSRobert Mustacchi #include <stdio.h>
33*4d9fdb46SRobert Mustacchi #include <stdlib.h>
34bc1f688bSRobert Mustacchi #include <time.h>
35*4d9fdb46SRobert Mustacchi 
36*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
37*4d9fdb46SRobert Mustacchi #include "dwarf_alloc.h"
38*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
39*4d9fdb46SRobert Mustacchi #include "dwarf_util.h"
40bc1f688bSRobert Mustacchi #include "dwarf_line.h"
41*4d9fdb46SRobert Mustacchi #include "dwarfstring.h"
42bc1f688bSRobert Mustacchi 
43*4d9fdb46SRobert Mustacchi #define PRINTING_DETAILS 1
44*4d9fdb46SRobert Mustacchi 
45bc1f688bSRobert Mustacchi static void
print_line_header(Dwarf_Debug dbg,Dwarf_Bool is_single_tab,Dwarf_Bool is_actuals_tab)46*4d9fdb46SRobert Mustacchi print_line_header(Dwarf_Debug dbg,
47*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_single_tab,
48*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_actuals_tab)
49bc1f688bSRobert Mustacchi {
50*4d9fdb46SRobert Mustacchi if (!is_single_tab) {
51*4d9fdb46SRobert Mustacchi     /* Ugly indenting follows, it makes lines shorter to see them better.
52*4d9fdb46SRobert Mustacchi         Best to use a wider text window to really see how it looks.*/
53*4d9fdb46SRobert Mustacchi if (is_actuals_tab) {
54*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,"\nActuals Table\n");
55*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,
56*4d9fdb46SRobert Mustacchi "                                                         be\n"
57*4d9fdb46SRobert Mustacchi "                                                         ls\n"
58*4d9fdb46SRobert Mustacchi "                                                         ce\n"
59*4d9fdb46SRobert Mustacchi " section    op                                           kq\n"
60*4d9fdb46SRobert Mustacchi " offset     code                address/index    row isa ??\n");
61*4d9fdb46SRobert Mustacchi     return;
62*4d9fdb46SRobert Mustacchi } else {
63*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,"\nLogicals Table\n");
64*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,
65*4d9fdb46SRobert Mustacchi "                                                                              s pe\n"
66*4d9fdb46SRobert Mustacchi "                                                                              tirp\n"
67*4d9fdb46SRobert Mustacchi "                                                                              msoi\n"
68*4d9fdb46SRobert Mustacchi " section          op                                                          tall\n"
69*4d9fdb46SRobert Mustacchi " offset      row  code                address/indx fil lne col disc cntx subp ????\n");
70*4d9fdb46SRobert Mustacchi     return;
71*4d9fdb46SRobert Mustacchi }
72bc1f688bSRobert Mustacchi }
73bc1f688bSRobert Mustacchi 
74*4d9fdb46SRobert Mustacchi /* Single level table */
75*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,
76*4d9fdb46SRobert Mustacchi "                                                         s b e p e i d\n"
77*4d9fdb46SRobert Mustacchi "                                                         t l s r p s i\n"
78*4d9fdb46SRobert Mustacchi "                                                         m c e o i a s\n"
79*4d9fdb46SRobert Mustacchi " section    op                                       col t k q l l   c\n"
80*4d9fdb46SRobert Mustacchi " offset     code               address     file line umn ? ? ? ? ?\n");
81*4d9fdb46SRobert Mustacchi } /* End of function with ugly indenting. */
82*4d9fdb46SRobert Mustacchi 
83bc1f688bSRobert Mustacchi static void
print_line_detail(Dwarf_Debug dbg,const char * prefix,int opcode,unsigned curr_line,struct Dwarf_Line_Registers_s * regs,Dwarf_Bool is_single_table,Dwarf_Bool is_actuals_table)84*4d9fdb46SRobert Mustacchi print_line_detail(
85*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg,
86*4d9fdb46SRobert Mustacchi     const char *prefix,
87bc1f688bSRobert Mustacchi     int opcode,
88*4d9fdb46SRobert Mustacchi     unsigned curr_line,
89*4d9fdb46SRobert Mustacchi     struct Dwarf_Line_Registers_s * regs,
90*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_single_table, Dwarf_Bool is_actuals_table)
91bc1f688bSRobert Mustacchi {
92*4d9fdb46SRobert Mustacchi     dwarfstring m1;
93bc1f688bSRobert Mustacchi 
94*4d9fdb46SRobert Mustacchi     dwarfstring_constructor(&m1);
95*4d9fdb46SRobert Mustacchi     if(!is_single_table && is_actuals_table) {
96*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_s(&m1,"%-15s ",(char *)prefix);
97*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m1,"%3d ",opcode);
98*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m1,"0x%" DW_PR_XZEROS DW_PR_DUx ,
99*4d9fdb46SRobert Mustacchi             regs->lr_address);
100*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m1,"/%01u",regs->lr_op_index);
101*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m1," %5lu", regs->lr_line);
102*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m1," %3d",regs->lr_isa);
103*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m1,"   %1d", regs->lr_basic_block);
104*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m1,"%1d\n",  regs->lr_end_sequence);
105*4d9fdb46SRobert Mustacchi         _dwarf_printf(dbg,dwarfstring_string(&m1));
106*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&m1);
107*4d9fdb46SRobert Mustacchi         return;
108*4d9fdb46SRobert Mustacchi     }
109*4d9fdb46SRobert Mustacchi     if(!is_single_table && !is_actuals_table) {
110*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m1,
111*4d9fdb46SRobert Mustacchi             "[%3d] "  /* row number */, curr_line);
112*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_s(&m1,
113*4d9fdb46SRobert Mustacchi             "%-15s ",(char *)prefix);
114*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m1,
115*4d9fdb46SRobert Mustacchi             "%3d ",opcode);
116*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m1,
117*4d9fdb46SRobert Mustacchi             "x%" DW_PR_XZEROS DW_PR_DUx, regs->lr_address);
118*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m1,
119*4d9fdb46SRobert Mustacchi             "/%01u", regs->lr_op_index);
120*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m1," %2lu ",regs->lr_file);
121*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m1,"%4lu  ",regs->lr_line);
122*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m1,"%1lu",regs->lr_column);
123*4d9fdb46SRobert Mustacchi         if (regs->lr_discriminator ||
124*4d9fdb46SRobert Mustacchi             regs->lr_prologue_end ||
125*4d9fdb46SRobert Mustacchi             regs->lr_epilogue_begin ||
126*4d9fdb46SRobert Mustacchi             regs->lr_isa ||
127*4d9fdb46SRobert Mustacchi             regs->lr_is_stmt ||
128*4d9fdb46SRobert Mustacchi             regs->lr_call_context ||
129*4d9fdb46SRobert Mustacchi             regs->lr_subprogram) {
130*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m1,
131*4d9fdb46SRobert Mustacchi                 "   x%02" DW_PR_DUx ,
132*4d9fdb46SRobert Mustacchi                 regs->lr_discriminator); /* DWARF4 */
133*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m1,
134*4d9fdb46SRobert Mustacchi                 "  x%02" DW_PR_DUx , regs->lr_call_context); /* EXPERIMENTAL */
135*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m1,
136*4d9fdb46SRobert Mustacchi                 "  x%02" DW_PR_DUx , regs->lr_subprogram); /* EXPERIMENTAL */
137*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_i(&m1,
138*4d9fdb46SRobert Mustacchi                 "  %1d", regs->lr_is_stmt);
139*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_i(&m1,
140*4d9fdb46SRobert Mustacchi                 "%1d", (int) regs->lr_isa);
141*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_i(&m1,
142*4d9fdb46SRobert Mustacchi                 "%1d", regs->lr_prologue_end); /* DWARF3 */
143*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_i(&m1,
144*4d9fdb46SRobert Mustacchi                 "%1d", regs->lr_epilogue_begin); /* DWARF3 */
145*4d9fdb46SRobert Mustacchi         }
146*4d9fdb46SRobert Mustacchi         dwarfstring_append(&m1,"\n");
147*4d9fdb46SRobert Mustacchi         _dwarf_printf(dbg,dwarfstring_string(&m1));
148*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&m1);
149*4d9fdb46SRobert Mustacchi         return;
150*4d9fdb46SRobert Mustacchi     }
151*4d9fdb46SRobert Mustacchi     /*  In the first quoted line below:
152*4d9fdb46SRobert Mustacchi         3d looks better than 2d, but best to do that as separate
153*4d9fdb46SRobert Mustacchi         change and test from two-level-line-tables.  */
154*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_s(&m1,
155*4d9fdb46SRobert Mustacchi         "%-15s ",(char *)prefix);
156*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m1,
157*4d9fdb46SRobert Mustacchi         "%2d ",opcode);
158*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_u(&m1,
159*4d9fdb46SRobert Mustacchi         "0x%" DW_PR_XZEROS DW_PR_DUx " ",
160*4d9fdb46SRobert Mustacchi         regs->lr_address);
161*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_u(&m1,
162*4d9fdb46SRobert Mustacchi         "%2lu   ", regs->lr_file);
163*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_u(&m1,
164*4d9fdb46SRobert Mustacchi         "%4lu ", regs->lr_line);
165*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_u(&m1,
166*4d9fdb46SRobert Mustacchi         "%2lu   ", regs->lr_column);
167*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m1,
168*4d9fdb46SRobert Mustacchi         "%1d ",regs->lr_is_stmt);
169*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m1,
170*4d9fdb46SRobert Mustacchi         "%1d ", regs->lr_basic_block);
171*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m1,
172*4d9fdb46SRobert Mustacchi         "%1d",regs->lr_end_sequence);
173*4d9fdb46SRobert Mustacchi     if (regs->lr_discriminator ||
174*4d9fdb46SRobert Mustacchi         regs->lr_prologue_end ||
175*4d9fdb46SRobert Mustacchi         regs->lr_epilogue_begin ||
176*4d9fdb46SRobert Mustacchi         regs->lr_isa) {
177*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m1,
178*4d9fdb46SRobert Mustacchi             " %1d", regs->lr_prologue_end); /* DWARF3 */
179*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m1,
180*4d9fdb46SRobert Mustacchi             " %1d", regs->lr_epilogue_begin); /* DWARF3 */
181*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m1,
182*4d9fdb46SRobert Mustacchi             " %1d", regs->lr_isa); /* DWARF3 */
183*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m1,
184*4d9fdb46SRobert Mustacchi             " 0x%" DW_PR_DUx , regs->lr_discriminator); /* DWARF4 */
185*4d9fdb46SRobert Mustacchi     }
186*4d9fdb46SRobert Mustacchi     dwarfstring_append(&m1, "\n");
187*4d9fdb46SRobert Mustacchi     _dwarf_printf(dbg,dwarfstring_string(&m1));
188*4d9fdb46SRobert Mustacchi     dwarfstring_destructor(&m1);
189bc1f688bSRobert Mustacchi }
190bc1f688bSRobert Mustacchi 
191bc1f688bSRobert Mustacchi 
192*4d9fdb46SRobert Mustacchi #include "dwarf_line_table_reader_common.h"
193*4d9fdb46SRobert Mustacchi 
194*4d9fdb46SRobert Mustacchi 
195*4d9fdb46SRobert Mustacchi static void
print_include_directory_details(Dwarf_Debug dbg,unsigned int line_version,Dwarf_Line_Context line_context)196*4d9fdb46SRobert Mustacchi print_include_directory_details(Dwarf_Debug dbg,
197*4d9fdb46SRobert Mustacchi     unsigned int line_version,
198*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context)
199bc1f688bSRobert Mustacchi {
200*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned u = 0;
201*4d9fdb46SRobert Mustacchi     dwarfstring m4;
202*4d9fdb46SRobert Mustacchi 
203*4d9fdb46SRobert Mustacchi     dwarfstring_constructor(&m4);
204*4d9fdb46SRobert Mustacchi     if (line_version == DW_LINE_VERSION5) {
205*4d9fdb46SRobert Mustacchi         unsigned i = 0;
206*4d9fdb46SRobert Mustacchi         unsigned dfcount = line_context->lc_directory_entry_format_count;
207*4d9fdb46SRobert Mustacchi         dwarfstring_constructor(&m4);
208*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m4,
209*4d9fdb46SRobert Mustacchi             "  directory entry format count %u\n",dfcount);
210*4d9fdb46SRobert Mustacchi         _dwarf_printf(dbg,dwarfstring_string(&m4));
211*4d9fdb46SRobert Mustacchi         dwarfstring_reset(&m4);
212*4d9fdb46SRobert Mustacchi         for ( ; i < dfcount;++i) {
213*4d9fdb46SRobert Mustacchi             struct Dwarf_Unsigned_Pair_s *valpair = 0;
214*4d9fdb46SRobert Mustacchi             const char *tname = 0;
215*4d9fdb46SRobert Mustacchi             const char *fname = 0;
216*4d9fdb46SRobert Mustacchi             int res;
217*4d9fdb46SRobert Mustacchi 
218*4d9fdb46SRobert Mustacchi             valpair = line_context->lc_directory_format_values +i;
219*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m4,
220*4d9fdb46SRobert Mustacchi                 "  format [%2u] ",i);
221*4d9fdb46SRobert Mustacchi             res = dwarf_get_LNCT_name(valpair->up_first,
222*4d9fdb46SRobert Mustacchi                 &tname);
223*4d9fdb46SRobert Mustacchi             if ( res != DW_DLV_OK) {
224*4d9fdb46SRobert Mustacchi                 tname = "<unknown type>";
225*4d9fdb46SRobert Mustacchi             }
226*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u (&m4,
227*4d9fdb46SRobert Mustacchi                 " type 0x%" DW_PR_XZEROS DW_PR_DUx ,valpair->up_first);
228*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_s (&m4,
229*4d9fdb46SRobert Mustacchi                 " %-20s\n",(char *)tname);
230*4d9fdb46SRobert Mustacchi             res = dwarf_get_FORM_name(valpair->up_second,&fname);
231*4d9fdb46SRobert Mustacchi             if ( res != DW_DLV_OK) {
232*4d9fdb46SRobert Mustacchi                 fname = "<unknown form>";
233*4d9fdb46SRobert Mustacchi             }
234*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m4,
235*4d9fdb46SRobert Mustacchi                 "               code 0x%" DW_PR_XZEROS DW_PR_DUx ,
236*4d9fdb46SRobert Mustacchi                 valpair->up_second);
237*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_s(&m4,
238*4d9fdb46SRobert Mustacchi                 " %-20s\n", (char *)fname);
239*4d9fdb46SRobert Mustacchi             _dwarf_printf(dbg,dwarfstring_string(&m4));
240*4d9fdb46SRobert Mustacchi             dwarfstring_reset(&m4);
241*4d9fdb46SRobert Mustacchi 
242*4d9fdb46SRobert Mustacchi         }
243*4d9fdb46SRobert Mustacchi     }
244*4d9fdb46SRobert Mustacchi     /* common print of the files */
245*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m4,
246*4d9fdb46SRobert Mustacchi         "  include directories count %d\n",
247*4d9fdb46SRobert Mustacchi         (int) line_context->lc_include_directories_count);
248*4d9fdb46SRobert Mustacchi     _dwarf_printf(dbg,dwarfstring_string(&m4));
249*4d9fdb46SRobert Mustacchi     dwarfstring_reset(&m4);
250*4d9fdb46SRobert Mustacchi     for (u = 0; u < line_context->lc_include_directories_count; ++u) {
251*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m4,
252*4d9fdb46SRobert Mustacchi             "  include dir[%u] ",u);
253*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_s(&m4,
254*4d9fdb46SRobert Mustacchi             "%s\n",
255*4d9fdb46SRobert Mustacchi             (char *)line_context->lc_include_directories[u]);
256*4d9fdb46SRobert Mustacchi         _dwarf_printf(dbg,dwarfstring_string(&m4));
257*4d9fdb46SRobert Mustacchi         dwarfstring_reset(&m4);
258*4d9fdb46SRobert Mustacchi     }
259*4d9fdb46SRobert Mustacchi     dwarfstring_destructor(&m4);
260*4d9fdb46SRobert Mustacchi }
261*4d9fdb46SRobert Mustacchi 
262*4d9fdb46SRobert Mustacchi static void
print_just_file_entry_details(Dwarf_Debug dbg,Dwarf_Line_Context line_context)263*4d9fdb46SRobert Mustacchi print_just_file_entry_details(Dwarf_Debug dbg,
264*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context)
265*4d9fdb46SRobert Mustacchi {
266*4d9fdb46SRobert Mustacchi     unsigned fiu = 0;
267*4d9fdb46SRobert Mustacchi     Dwarf_File_Entry fe = line_context->lc_file_entries;
268*4d9fdb46SRobert Mustacchi     Dwarf_File_Entry fe2 = fe;
269*4d9fdb46SRobert Mustacchi     dwarfstring m3;
270*4d9fdb46SRobert Mustacchi 
271*4d9fdb46SRobert Mustacchi     dwarfstring_constructor(&m3);
272*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m3,
273*4d9fdb46SRobert Mustacchi         "  file names count      %d\n",
274*4d9fdb46SRobert Mustacchi         line_context->lc_file_entry_count);
275*4d9fdb46SRobert Mustacchi     _dwarf_printf(dbg,dwarfstring_string(&m3));
276*4d9fdb46SRobert Mustacchi     dwarfstring_reset(&m3);
277*4d9fdb46SRobert Mustacchi     for (fiu = 0 ; fe2 ; fe2 = fe->fi_next,++fiu ) {
278*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned tlm2 = 0;
279*4d9fdb46SRobert Mustacchi         unsigned filenum = 0;
280*4d9fdb46SRobert Mustacchi 
281*4d9fdb46SRobert Mustacchi         fe = fe2;
282*4d9fdb46SRobert Mustacchi         tlm2 = fe->fi_time_last_mod;
283*4d9fdb46SRobert Mustacchi         filenum = fiu+1;
284*4d9fdb46SRobert Mustacchi 
285*4d9fdb46SRobert Mustacchi         /*  The space character at the end of line is silly,
286*4d9fdb46SRobert Mustacchi             but lets leave it there for the moment to avoid
287*4d9fdb46SRobert Mustacchi             changing output.  */
288*4d9fdb46SRobert Mustacchi         if (line_context->lc_file_entry_count > 9) {
289*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m3,
290*4d9fdb46SRobert Mustacchi                 "  file[%2u] ",fiu);
291*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_s(&m3,
292*4d9fdb46SRobert Mustacchi                 "%-20s ",
293*4d9fdb46SRobert Mustacchi                 (char *) fe->fi_file_name);
294*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m3,
295*4d9fdb46SRobert Mustacchi                 "(file-number: %u)\n",
296*4d9fdb46SRobert Mustacchi                 filenum);
297*4d9fdb46SRobert Mustacchi         } else {
298*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m3,
299*4d9fdb46SRobert Mustacchi                 "  file[%u]  ", fiu);
300*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_s(&m3,
301*4d9fdb46SRobert Mustacchi                 "%-20s ",(char *)fe->fi_file_name);
302*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m3,
303*4d9fdb46SRobert Mustacchi                 "(file-number: %u)\n",filenum);
304*4d9fdb46SRobert Mustacchi         }
305*4d9fdb46SRobert Mustacchi         _dwarf_printf(dbg,dwarfstring_string(&m3));
306*4d9fdb46SRobert Mustacchi         dwarfstring_reset(&m3);
307*4d9fdb46SRobert Mustacchi         if (fe->fi_dir_index_present) {
308*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned di = 0;
309*4d9fdb46SRobert Mustacchi             di = fe->fi_dir_index;
310*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_i(&m3,
311*4d9fdb46SRobert Mustacchi                 "    dir index %d\n", di);
312*4d9fdb46SRobert Mustacchi         }
313*4d9fdb46SRobert Mustacchi         if (fe->fi_time_last_mod_present) {
314*4d9fdb46SRobert Mustacchi             time_t tt = (time_t) tlm2;
315*4d9fdb46SRobert Mustacchi 
316*4d9fdb46SRobert Mustacchi             /* ctime supplies newline */
317*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m3,
318*4d9fdb46SRobert Mustacchi                 "    last time 0x%x ",tlm2);
319*4d9fdb46SRobert Mustacchi             dwarfstring_append(&m3,(char *)ctime(&tt));
320*4d9fdb46SRobert Mustacchi         }
321*4d9fdb46SRobert Mustacchi         if (fe->fi_file_length_present) {
322*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned fl = 0;
323*4d9fdb46SRobert Mustacchi 
324*4d9fdb46SRobert Mustacchi             fl = fe->fi_file_length;
325*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_i(&m3,
326*4d9fdb46SRobert Mustacchi                 "    file length %ld ",fl);
327*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m3,
328*4d9fdb46SRobert Mustacchi                 "0x%lx\n",fl);
329*4d9fdb46SRobert Mustacchi         }
330*4d9fdb46SRobert Mustacchi         if (fe->fi_md5_present) {
331*4d9fdb46SRobert Mustacchi             char *c = (char *)&fe->fi_md5_value;
332*4d9fdb46SRobert Mustacchi             char *end = c+sizeof(fe->fi_md5_value);
333*4d9fdb46SRobert Mustacchi             dwarfstring_append(&m3, "    file md5 value 0x");
334*4d9fdb46SRobert Mustacchi             while(c < end) {
335*4d9fdb46SRobert Mustacchi                 dwarfstring_append_printf_u(&m3,
336*4d9fdb46SRobert Mustacchi                     "%02x",0xff&*c);
337*4d9fdb46SRobert Mustacchi                 ++c;
338*4d9fdb46SRobert Mustacchi             }
339*4d9fdb46SRobert Mustacchi             dwarfstring_append(&m3,"\n");
340*4d9fdb46SRobert Mustacchi         }
341*4d9fdb46SRobert Mustacchi         if (dwarfstring_strlen(&m3)) {
342*4d9fdb46SRobert Mustacchi             _dwarf_printf(dbg,dwarfstring_string(&m3));
343*4d9fdb46SRobert Mustacchi             dwarfstring_reset(&m3);
344*4d9fdb46SRobert Mustacchi         }
345*4d9fdb46SRobert Mustacchi     }
346*4d9fdb46SRobert Mustacchi     dwarfstring_destructor(&m3);
347*4d9fdb46SRobert Mustacchi }
348*4d9fdb46SRobert Mustacchi 
349*4d9fdb46SRobert Mustacchi static void
print_file_entry_details(Dwarf_Debug dbg,unsigned int line_version,Dwarf_Line_Context line_context)350*4d9fdb46SRobert Mustacchi print_file_entry_details(Dwarf_Debug dbg,
351*4d9fdb46SRobert Mustacchi     unsigned int line_version,
352*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context)
353*4d9fdb46SRobert Mustacchi {
354*4d9fdb46SRobert Mustacchi     dwarfstring m5;
355*4d9fdb46SRobert Mustacchi 
356*4d9fdb46SRobert Mustacchi     dwarfstring_constructor(&m5);
357*4d9fdb46SRobert Mustacchi     if (line_version == DW_LINE_VERSION5) {
358*4d9fdb46SRobert Mustacchi         unsigned i = 0;
359*4d9fdb46SRobert Mustacchi         unsigned dfcount = line_context->lc_file_name_format_count;
360*4d9fdb46SRobert Mustacchi 
361*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m5,
362*4d9fdb46SRobert Mustacchi             "  file entry format count      %u\n",dfcount);
363*4d9fdb46SRobert Mustacchi         for ( ; i < dfcount;++i) {
364*4d9fdb46SRobert Mustacchi             struct Dwarf_Unsigned_Pair_s *valpair = 0;
365*4d9fdb46SRobert Mustacchi             const char *tname = 0;
366*4d9fdb46SRobert Mustacchi             const char *fname = 0;
367*4d9fdb46SRobert Mustacchi             int res;
368*4d9fdb46SRobert Mustacchi 
369*4d9fdb46SRobert Mustacchi             valpair = line_context->lc_file_format_values +i;
370*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m5,
371*4d9fdb46SRobert Mustacchi                 "  format [%2u] ",i);
372*4d9fdb46SRobert Mustacchi             res = dwarf_get_LNCT_name(valpair->up_first,&tname);
373*4d9fdb46SRobert Mustacchi             if ( res != DW_DLV_OK) {
374*4d9fdb46SRobert Mustacchi                 tname = "<unknown type>";
375*4d9fdb46SRobert Mustacchi             }
376*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m5,
377*4d9fdb46SRobert Mustacchi                 " type 0x%" DW_PR_XZEROS DW_PR_DUx,
378*4d9fdb46SRobert Mustacchi                 valpair->up_first);
379*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_s(&m5,
380*4d9fdb46SRobert Mustacchi                 " %-20s\n",(char *)tname);
381*4d9fdb46SRobert Mustacchi             res = dwarf_get_FORM_name(valpair->up_second,&fname);
382*4d9fdb46SRobert Mustacchi             if ( res != DW_DLV_OK) {
383*4d9fdb46SRobert Mustacchi                 fname = "<unknown form>";
384*4d9fdb46SRobert Mustacchi             }
385*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m5,
386*4d9fdb46SRobert Mustacchi                 "               code 0x%"
387*4d9fdb46SRobert Mustacchi                 DW_PR_XZEROS DW_PR_DUx,
388*4d9fdb46SRobert Mustacchi                 valpair->up_second);
389*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_s(&m5, " %-20s\n",
390*4d9fdb46SRobert Mustacchi                 (char *)fname);
391*4d9fdb46SRobert Mustacchi             _dwarf_printf(dbg,dwarfstring_string(&m5));
392*4d9fdb46SRobert Mustacchi             dwarfstring_reset(&m5);
393*4d9fdb46SRobert Mustacchi         }
394*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&m5);
395*4d9fdb46SRobert Mustacchi         print_just_file_entry_details(dbg,line_context);
396*4d9fdb46SRobert Mustacchi     } else {
397*4d9fdb46SRobert Mustacchi         print_just_file_entry_details(dbg,line_context);
398*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&m5);
399*4d9fdb46SRobert Mustacchi     }
400*4d9fdb46SRobert Mustacchi 
401*4d9fdb46SRobert Mustacchi }
402*4d9fdb46SRobert Mustacchi 
403*4d9fdb46SRobert Mustacchi static void
print_experimental_subprograms_list(Dwarf_Debug dbg,Dwarf_Line_Context line_context)404*4d9fdb46SRobert Mustacchi print_experimental_subprograms_list(Dwarf_Debug dbg,
405*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context)
406*4d9fdb46SRobert Mustacchi {
407*4d9fdb46SRobert Mustacchi     /*  Print the subprograms list. */
408*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned count = line_context->lc_subprogs_count;
409*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned exu = 0;
410*4d9fdb46SRobert Mustacchi     Dwarf_Subprog_Entry sub = line_context->lc_subprogs;
411*4d9fdb46SRobert Mustacchi     dwarfstring m6;
412*4d9fdb46SRobert Mustacchi 
413*4d9fdb46SRobert Mustacchi     dwarfstring_constructor(&m6);
414*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_u(&m6,
415*4d9fdb46SRobert Mustacchi         "  subprograms count %" DW_PR_DUu "\n",count);
416*4d9fdb46SRobert Mustacchi     if (count > 0) {
417*4d9fdb46SRobert Mustacchi         dwarfstring_append(&m6,"    indx  file   line   name\n");
418*4d9fdb46SRobert Mustacchi     }
419*4d9fdb46SRobert Mustacchi     _dwarf_printf(dbg,dwarfstring_string(&m6));
420*4d9fdb46SRobert Mustacchi     dwarfstring_reset(&m6);
421*4d9fdb46SRobert Mustacchi     for (exu = 0 ; exu < count ; exu++,sub++) {
422*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m6,
423*4d9fdb46SRobert Mustacchi             "    [%2" DW_PR_DUu,exu+1);
424*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m6,
425*4d9fdb46SRobert Mustacchi             "] %4" DW_PR_DUu,sub->ds_decl_file);
426*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m6,
427*4d9fdb46SRobert Mustacchi             "    %4" DW_PR_DUu ,sub->ds_decl_line);
428*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_s(&m6,
429*4d9fdb46SRobert Mustacchi             " %s\n",(char *)sub->ds_subprog_name);
430*4d9fdb46SRobert Mustacchi         _dwarf_printf(dbg,dwarfstring_string(&m6));
431*4d9fdb46SRobert Mustacchi         dwarfstring_reset(&m6);
432*4d9fdb46SRobert Mustacchi     }
433*4d9fdb46SRobert Mustacchi     dwarfstring_destructor(&m6);
434*4d9fdb46SRobert Mustacchi }
435*4d9fdb46SRobert Mustacchi 
436*4d9fdb46SRobert Mustacchi static void
437*4d9fdb46SRobert Mustacchi do_line_print_now(Dwarf_Debug dbg,int line_version,
438*4d9fdb46SRobert Mustacchi     Dwarf_Small * comp_dir,
439*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context) ;
440*4d9fdb46SRobert Mustacchi static void print_experimental_counts(Dwarf_Debug dbg,
441*4d9fdb46SRobert Mustacchi     int line_version,
442*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context);
443*4d9fdb46SRobert Mustacchi 
444*4d9fdb46SRobert Mustacchi static int print_actuals_and_locals(Dwarf_Debug dbg,
445*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context,
446*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned bogus_bytes_count,
447*4d9fdb46SRobert Mustacchi     Dwarf_Small *bogus_bytes_ptr,
448*4d9fdb46SRobert Mustacchi     Dwarf_Small *orig_line_ptr,
449*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_ptr,
450*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_start,
451*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_ptr_actuals,
452*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_ptr_end,
453*4d9fdb46SRobert Mustacchi     Dwarf_Half   address_size,
454*4d9fdb46SRobert Mustacchi     int *        err_count_out,
455*4d9fdb46SRobert Mustacchi     Dwarf_Error *err);
456*4d9fdb46SRobert Mustacchi 
457*4d9fdb46SRobert Mustacchi /*  return DW_DLV_OK if ok. else DW_DLV_NO_ENTRY or DW_DLV_ERROR
458*4d9fdb46SRobert Mustacchi     If err_count_out is non-NULL, this is a special 'check'
459*4d9fdb46SRobert Mustacchi     call.  */
460*4d9fdb46SRobert Mustacchi static int
_dwarf_internal_printlines(Dwarf_Die die,int * err_count_out,int only_line_header,Dwarf_Error * error)461*4d9fdb46SRobert Mustacchi _dwarf_internal_printlines(Dwarf_Die die,
462*4d9fdb46SRobert Mustacchi     int * err_count_out,
463*4d9fdb46SRobert Mustacchi     int only_line_header,
464*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
465*4d9fdb46SRobert Mustacchi {
466*4d9fdb46SRobert Mustacchi     /*  This pointer is used to scan the portion of the .debug_line
467bc1f688bSRobert Mustacchi         section for the current cu. */
468bc1f688bSRobert Mustacchi     Dwarf_Small *line_ptr = 0;
469bc1f688bSRobert Mustacchi     Dwarf_Small *orig_line_ptr = 0;
470bc1f688bSRobert Mustacchi 
471*4d9fdb46SRobert Mustacchi     /*  Pointer to a DW_AT_stmt_list attribute in case it exists in the
472bc1f688bSRobert Mustacchi         die. */
473bc1f688bSRobert Mustacchi     Dwarf_Attribute stmt_list_attr = 0;
474bc1f688bSRobert Mustacchi 
475bc1f688bSRobert Mustacchi     /*  Pointer to DW_AT_comp_dir attribute in die. */
476bc1f688bSRobert Mustacchi     Dwarf_Attribute comp_dir_attr = 0;
477bc1f688bSRobert Mustacchi 
478bc1f688bSRobert Mustacchi     /*  Pointer to name of compilation directory. */
479bc1f688bSRobert Mustacchi     Dwarf_Small *comp_dir = NULL;
480bc1f688bSRobert Mustacchi 
481*4d9fdb46SRobert Mustacchi     /*  Offset into .debug_line specified by a DW_AT_stmt_list
482bc1f688bSRobert Mustacchi         attribute. */
483bc1f688bSRobert Mustacchi     Dwarf_Unsigned line_offset = 0;
484bc1f688bSRobert Mustacchi 
485*4d9fdb46SRobert Mustacchi     /*  These variables are used to decode leb128 numbers. Leb128_num
486bc1f688bSRobert Mustacchi         holds the decoded number, and leb128_length is its length in
487bc1f688bSRobert Mustacchi         bytes. */
488bc1f688bSRobert Mustacchi     Dwarf_Half attrform = 0;
489bc1f688bSRobert Mustacchi 
490bc1f688bSRobert Mustacchi     /*  In case there are wierd bytes 'after' the line table
491*4d9fdb46SRobert Mustacchi         prologue this lets us print something. This is a gcc
492*4d9fdb46SRobert Mustacchi         compiler bug and we expect the bytes count to be 12.  */
493bc1f688bSRobert Mustacchi     Dwarf_Small* bogus_bytes_ptr = 0;
494bc1f688bSRobert Mustacchi     Dwarf_Unsigned bogus_bytes_count = 0;
495*4d9fdb46SRobert Mustacchi     Dwarf_Half address_size = 0;
496*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned fission_offset = 0;
497*4d9fdb46SRobert Mustacchi     unsigned line_version = 0;
498bc1f688bSRobert Mustacchi 
499bc1f688bSRobert Mustacchi 
500bc1f688bSRobert Mustacchi     /* The Dwarf_Debug this die belongs to. */
501bc1f688bSRobert Mustacchi     Dwarf_Debug dbg = 0;
502*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context = 0;
503*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context = 0;
504bc1f688bSRobert Mustacchi     int resattr = DW_DLV_ERROR;
505bc1f688bSRobert Mustacchi     int lres =    DW_DLV_ERROR;
506bc1f688bSRobert Mustacchi     int res  =    DW_DLV_ERROR;
507*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_ptr_actuals  = 0;
508*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_ptr_end = 0;
509*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_start = 0;
510bc1f688bSRobert Mustacchi 
511bc1f688bSRobert Mustacchi     /* ***** BEGIN CODE ***** */
512bc1f688bSRobert Mustacchi 
513bc1f688bSRobert Mustacchi     if (error != NULL) {
514bc1f688bSRobert Mustacchi         *error = NULL;
515bc1f688bSRobert Mustacchi     }
516bc1f688bSRobert Mustacchi 
517bc1f688bSRobert Mustacchi     CHECK_DIE(die, DW_DLV_ERROR);
518*4d9fdb46SRobert Mustacchi     cu_context = die->di_cu_context;
519*4d9fdb46SRobert Mustacchi     dbg = cu_context->cc_dbg;
520bc1f688bSRobert Mustacchi 
521bc1f688bSRobert Mustacchi     res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
522bc1f688bSRobert Mustacchi     if (res != DW_DLV_OK) {
523bc1f688bSRobert Mustacchi         return res;
524bc1f688bSRobert Mustacchi     }
525*4d9fdb46SRobert Mustacchi     if (!dbg->de_debug_line.dss_size) {
526*4d9fdb46SRobert Mustacchi         return (DW_DLV_NO_ENTRY);
527*4d9fdb46SRobert Mustacchi     }
528bc1f688bSRobert Mustacchi 
529*4d9fdb46SRobert Mustacchi     address_size = _dwarf_get_address_size(dbg, die);
530bc1f688bSRobert Mustacchi     resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
531bc1f688bSRobert Mustacchi     if (resattr != DW_DLV_OK) {
532bc1f688bSRobert Mustacchi         return resattr;
533bc1f688bSRobert Mustacchi     }
534bc1f688bSRobert Mustacchi     /*  The list of relevant FORMs is small.
535bc1f688bSRobert Mustacchi         DW_FORM_data4, DW_FORM_data8, DW_FORM_sec_offset
536bc1f688bSRobert Mustacchi     */
537bc1f688bSRobert Mustacchi     lres = dwarf_whatform(stmt_list_attr,&attrform,error);
538bc1f688bSRobert Mustacchi     if (lres != DW_DLV_OK) {
539*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg,stmt_list_attr, DW_DLA_ATTR);
540bc1f688bSRobert Mustacchi         return lres;
541bc1f688bSRobert Mustacchi     }
542bc1f688bSRobert Mustacchi     if (attrform != DW_FORM_data4 && attrform != DW_FORM_data8 &&
543bc1f688bSRobert Mustacchi         attrform != DW_FORM_sec_offset ) {
544*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg,stmt_list_attr, DW_DLA_ATTR);
545bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
546bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
547bc1f688bSRobert Mustacchi     }
548bc1f688bSRobert Mustacchi     lres = dwarf_global_formref(stmt_list_attr, &line_offset, error);
549bc1f688bSRobert Mustacchi     if (lres != DW_DLV_OK) {
550*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg,stmt_list_attr, DW_DLA_ATTR);
551bc1f688bSRobert Mustacchi         return lres;
552bc1f688bSRobert Mustacchi     }
553bc1f688bSRobert Mustacchi 
554bc1f688bSRobert Mustacchi     if (line_offset >= dbg->de_debug_line.dss_size) {
555*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg,stmt_list_attr, DW_DLA_ATTR);
556bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
557bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
558bc1f688bSRobert Mustacchi     }
559*4d9fdb46SRobert Mustacchi     section_start =  dbg->de_debug_line.dss_data;
560*4d9fdb46SRobert Mustacchi     {
561*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned fission_size = 0;
562*4d9fdb46SRobert Mustacchi         int resfis = _dwarf_get_fission_addition_die(die, DW_SECT_LINE,
563*4d9fdb46SRobert Mustacchi             &fission_offset,&fission_size,error);
564*4d9fdb46SRobert Mustacchi         if(resfis != DW_DLV_OK) {
565*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg,stmt_list_attr, DW_DLA_ATTR);
566*4d9fdb46SRobert Mustacchi             return resfis;
567*4d9fdb46SRobert Mustacchi         }
568*4d9fdb46SRobert Mustacchi     }
569*4d9fdb46SRobert Mustacchi 
570*4d9fdb46SRobert Mustacchi     orig_line_ptr = section_start + line_offset + fission_offset;
571*4d9fdb46SRobert Mustacchi     line_ptr = orig_line_ptr;
572bc1f688bSRobert Mustacchi     dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
573bc1f688bSRobert Mustacchi 
574*4d9fdb46SRobert Mustacchi     /*  If die has DW_AT_comp_dir attribute, get the string that names
575bc1f688bSRobert Mustacchi         the compilation directory. */
576bc1f688bSRobert Mustacchi     resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error);
577bc1f688bSRobert Mustacchi     if (resattr == DW_DLV_ERROR) {
578bc1f688bSRobert Mustacchi         return resattr;
579bc1f688bSRobert Mustacchi     }
580bc1f688bSRobert Mustacchi     if (resattr == DW_DLV_OK) {
581bc1f688bSRobert Mustacchi         int cres = DW_DLV_ERROR;
582bc1f688bSRobert Mustacchi         char *cdir = 0;
583bc1f688bSRobert Mustacchi 
584bc1f688bSRobert Mustacchi         cres = dwarf_formstring(comp_dir_attr, &cdir, error);
585bc1f688bSRobert Mustacchi         if (cres == DW_DLV_ERROR) {
586bc1f688bSRobert Mustacchi             return cres;
587bc1f688bSRobert Mustacchi         } else if (cres == DW_DLV_OK) {
588bc1f688bSRobert Mustacchi             comp_dir = (Dwarf_Small *) cdir;
589bc1f688bSRobert Mustacchi         }
590bc1f688bSRobert Mustacchi     }
591bc1f688bSRobert Mustacchi     if (resattr == DW_DLV_OK) {
592bc1f688bSRobert Mustacchi         dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR);
593bc1f688bSRobert Mustacchi     }
594*4d9fdb46SRobert Mustacchi     line_context = (Dwarf_Line_Context)
595*4d9fdb46SRobert Mustacchi         _dwarf_get_alloc(dbg, DW_DLA_LINE_CONTEXT, 1);
596*4d9fdb46SRobert Mustacchi     if (line_context == NULL) {
597*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
598*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
599*4d9fdb46SRobert Mustacchi     }
600bc1f688bSRobert Mustacchi     {
601*4d9fdb46SRobert Mustacchi         Dwarf_Small *newlinep = 0;
602*4d9fdb46SRobert Mustacchi         int dres = _dwarf_read_line_table_header(dbg,
603*4d9fdb46SRobert Mustacchi             cu_context,
604*4d9fdb46SRobert Mustacchi             section_start,
605*4d9fdb46SRobert Mustacchi             line_ptr,
606*4d9fdb46SRobert Mustacchi             dbg->de_debug_line.dss_size,
607*4d9fdb46SRobert Mustacchi             &newlinep,
608*4d9fdb46SRobert Mustacchi             line_context,
609bc1f688bSRobert Mustacchi             &bogus_bytes_ptr,
610bc1f688bSRobert Mustacchi             &bogus_bytes_count,
611bc1f688bSRobert Mustacchi             error,
612bc1f688bSRobert Mustacchi             err_count_out);
613bc1f688bSRobert Mustacchi         if (dres == DW_DLV_ERROR) {
614*4d9fdb46SRobert Mustacchi             dwarf_srclines_dealloc_b(line_context);
615bc1f688bSRobert Mustacchi             return dres;
616bc1f688bSRobert Mustacchi         }
617bc1f688bSRobert Mustacchi         if (dres == DW_DLV_NO_ENTRY) {
618*4d9fdb46SRobert Mustacchi             dwarf_srclines_dealloc_b(line_context);
619bc1f688bSRobert Mustacchi             return dres;
620bc1f688bSRobert Mustacchi         }
621*4d9fdb46SRobert Mustacchi         line_ptr_end = line_context->lc_line_ptr_end;
622*4d9fdb46SRobert Mustacchi         line_ptr = newlinep;
623*4d9fdb46SRobert Mustacchi         if (line_context->lc_actuals_table_offset > 0) {
624*4d9fdb46SRobert Mustacchi             line_ptr_actuals = line_context->lc_line_prologue_start +
625*4d9fdb46SRobert Mustacchi                 line_context->lc_actuals_table_offset;
626bc1f688bSRobert Mustacchi         }
627*4d9fdb46SRobert Mustacchi     }
628*4d9fdb46SRobert Mustacchi     line_version = line_context->lc_version_number;
629*4d9fdb46SRobert Mustacchi     line_context->lc_compilation_directory = comp_dir;
630bc1f688bSRobert Mustacchi     if (only_line_header) {
631bc1f688bSRobert Mustacchi         /* Just checking for header errors, nothing more here.*/
632*4d9fdb46SRobert Mustacchi         dwarf_srclines_dealloc_b(line_context);
633*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
634*4d9fdb46SRobert Mustacchi     }
635*4d9fdb46SRobert Mustacchi     do_line_print_now(dbg,line_version,comp_dir,line_context);
636*4d9fdb46SRobert Mustacchi     print_include_directory_details(dbg,line_version,line_context);
637*4d9fdb46SRobert Mustacchi     print_file_entry_details(dbg,line_version,line_context);
638*4d9fdb46SRobert Mustacchi     print_experimental_counts(dbg, line_version,line_context);
639*4d9fdb46SRobert Mustacchi     res = print_actuals_and_locals(dbg, line_context,
640*4d9fdb46SRobert Mustacchi         bogus_bytes_count,bogus_bytes_ptr,
641*4d9fdb46SRobert Mustacchi         orig_line_ptr,
642*4d9fdb46SRobert Mustacchi         line_ptr,
643*4d9fdb46SRobert Mustacchi         section_start,
644*4d9fdb46SRobert Mustacchi         line_ptr_actuals,
645*4d9fdb46SRobert Mustacchi         line_ptr_end,
646*4d9fdb46SRobert Mustacchi         address_size,
647*4d9fdb46SRobert Mustacchi         err_count_out,
648*4d9fdb46SRobert Mustacchi         error);
649*4d9fdb46SRobert Mustacchi     if (res  !=  DW_DLV_OK) {
650*4d9fdb46SRobert Mustacchi         return res;
651*4d9fdb46SRobert Mustacchi     }
652*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
653*4d9fdb46SRobert Mustacchi }
654*4d9fdb46SRobert Mustacchi 
655*4d9fdb46SRobert Mustacchi static void
do_line_print_now(Dwarf_Debug dbg,int line_version,Dwarf_Small * comp_dir,Dwarf_Line_Context line_context)656*4d9fdb46SRobert Mustacchi do_line_print_now(Dwarf_Debug dbg,
657*4d9fdb46SRobert Mustacchi     int line_version,
658*4d9fdb46SRobert Mustacchi     Dwarf_Small *comp_dir,
659*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context)
660*4d9fdb46SRobert Mustacchi {
661*4d9fdb46SRobert Mustacchi     dwarfstring m7;
662*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned i = 0;
663*4d9fdb46SRobert Mustacchi 
664*4d9fdb46SRobert Mustacchi     dwarfstring_constructor(&m7);
665*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m7,
666*4d9fdb46SRobert Mustacchi         "total line info length %ld bytes,",
667*4d9fdb46SRobert Mustacchi         line_context->lc_total_length);
668*4d9fdb46SRobert Mustacchi 
669*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_u(&m7,
670*4d9fdb46SRobert Mustacchi         " line offset 0x%" DW_PR_XZEROS DW_PR_DUx,
671*4d9fdb46SRobert Mustacchi         line_context->lc_section_offset);
672*4d9fdb46SRobert Mustacchi 
673*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_u(&m7,
674*4d9fdb46SRobert Mustacchi         " %" DW_PR_DUu "\n",
675*4d9fdb46SRobert Mustacchi         line_context->lc_section_offset);
676*4d9fdb46SRobert Mustacchi 
677*4d9fdb46SRobert Mustacchi     if (line_version <= DW_LINE_VERSION5) {
678*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m7,
679*4d9fdb46SRobert Mustacchi             "  line table version     %d\n",
680*4d9fdb46SRobert Mustacchi         (int) line_context->lc_version_number);
681*4d9fdb46SRobert Mustacchi     } else {
682*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m7,
683*4d9fdb46SRobert Mustacchi             "  line table version 0x%x\n",
684*4d9fdb46SRobert Mustacchi             (int) line_context->lc_version_number);
685*4d9fdb46SRobert Mustacchi     }
686*4d9fdb46SRobert Mustacchi     if (line_version == DW_LINE_VERSION5) {
687*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m7,
688*4d9fdb46SRobert Mustacchi             "  address size          %d\n",
689*4d9fdb46SRobert Mustacchi             line_context->lc_address_size);
690*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m7,
691*4d9fdb46SRobert Mustacchi             "  segment selector size %d\n",
692*4d9fdb46SRobert Mustacchi             line_context->lc_segment_selector_size);
693*4d9fdb46SRobert Mustacchi     }
694*4d9fdb46SRobert Mustacchi     _dwarf_printf(dbg,dwarfstring_string(&m7));
695*4d9fdb46SRobert Mustacchi     dwarfstring_reset(&m7);
696*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m7,
697*4d9fdb46SRobert Mustacchi         "  line table length field length %d\n",
698*4d9fdb46SRobert Mustacchi         line_context->lc_length_field_length);
699*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m7,
700*4d9fdb46SRobert Mustacchi         "  prologue length       %d\n",
701*4d9fdb46SRobert Mustacchi         line_context->lc_prologue_length);
702*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_s(&m7,
703*4d9fdb46SRobert Mustacchi         "  compilation_directory %s\n",
704*4d9fdb46SRobert Mustacchi         comp_dir ? ((char *) comp_dir) : "");
705*4d9fdb46SRobert Mustacchi 
706*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m7,
707*4d9fdb46SRobert Mustacchi         "  min instruction length %d\n",
708*4d9fdb46SRobert Mustacchi         line_context->lc_minimum_instruction_length);
709*4d9fdb46SRobert Mustacchi     _dwarf_printf(dbg,dwarfstring_string(&m7));
710*4d9fdb46SRobert Mustacchi     dwarfstring_reset(&m7);
711*4d9fdb46SRobert Mustacchi     if (line_version == DW_LINE_VERSION5 ||
712*4d9fdb46SRobert Mustacchi         line_version == DW_LINE_VERSION4 ||
713*4d9fdb46SRobert Mustacchi         line_version == EXPERIMENTAL_LINE_TABLES_VERSION) {
714*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m7,
715*4d9fdb46SRobert Mustacchi             "  maximum ops per instruction %u\n",
716*4d9fdb46SRobert Mustacchi             line_context->lc_maximum_ops_per_instruction);
717*4d9fdb46SRobert Mustacchi         _dwarf_printf(dbg,dwarfstring_string(&m7));
718*4d9fdb46SRobert Mustacchi         dwarfstring_reset(&m7);
719*4d9fdb46SRobert Mustacchi     }
720*4d9fdb46SRobert Mustacchi     if (line_version == EXPERIMENTAL_LINE_TABLES_VERSION) {
721*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m7, "  actuals table offset "
722*4d9fdb46SRobert Mustacchi             "0x%" DW_PR_XZEROS DW_PR_DUx "\n",
723*4d9fdb46SRobert Mustacchi             line_context->lc_actuals_table_offset);
724*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m7,"  logicals table offset "
725*4d9fdb46SRobert Mustacchi             "0x%" DW_PR_XZEROS DW_PR_DUx "\n",
726*4d9fdb46SRobert Mustacchi             line_context->lc_logicals_table_offset);
727*4d9fdb46SRobert Mustacchi         _dwarf_printf(dbg,dwarfstring_string(&m7));
728*4d9fdb46SRobert Mustacchi         dwarfstring_reset(&m7);
729*4d9fdb46SRobert Mustacchi     }
730*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m7,
731*4d9fdb46SRobert Mustacchi         "  default is stmt        %d\n",
732*4d9fdb46SRobert Mustacchi         (int)line_context->lc_default_is_stmt);
733*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m7,
734*4d9fdb46SRobert Mustacchi         "  line base              %d\n",
735*4d9fdb46SRobert Mustacchi         (int)line_context->lc_line_base);
736*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m7,
737*4d9fdb46SRobert Mustacchi         "  line_range             %d\n",
738*4d9fdb46SRobert Mustacchi         (int)line_context->lc_line_range);
739*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m7,
740*4d9fdb46SRobert Mustacchi         "  opcode base            %d\n",
741*4d9fdb46SRobert Mustacchi         (int)line_context->lc_opcode_base);
742*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_i(&m7,
743*4d9fdb46SRobert Mustacchi         "  standard opcode count  %d\n",
744*4d9fdb46SRobert Mustacchi         (int)line_context->lc_std_op_count);
745*4d9fdb46SRobert Mustacchi     _dwarf_printf(dbg,dwarfstring_string(&m7));
746*4d9fdb46SRobert Mustacchi     dwarfstring_reset(&m7);
747*4d9fdb46SRobert Mustacchi 
748*4d9fdb46SRobert Mustacchi     for (i = 1; i < line_context->lc_opcode_base; i++) {
749*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m7,
750*4d9fdb46SRobert Mustacchi             "  opcode[%2d] length", (int) i);
751*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m7,
752*4d9fdb46SRobert Mustacchi             "  %d\n",
753*4d9fdb46SRobert Mustacchi             (int) line_context->lc_opcode_length_table[i - 1]);
754*4d9fdb46SRobert Mustacchi         _dwarf_printf(dbg,dwarfstring_string(&m7));
755*4d9fdb46SRobert Mustacchi         dwarfstring_reset(&m7);
756*4d9fdb46SRobert Mustacchi     }
757*4d9fdb46SRobert Mustacchi     dwarfstring_destructor(&m7);
758*4d9fdb46SRobert Mustacchi }
759*4d9fdb46SRobert Mustacchi 
760*4d9fdb46SRobert Mustacchi static void
print_experimental_counts(Dwarf_Debug dbg,int line_version,Dwarf_Line_Context line_context)761*4d9fdb46SRobert Mustacchi print_experimental_counts(Dwarf_Debug dbg, int line_version,
762*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context)
763*4d9fdb46SRobert Mustacchi {
764*4d9fdb46SRobert Mustacchi     if (line_version == EXPERIMENTAL_LINE_TABLES_VERSION) {
765*4d9fdb46SRobert Mustacchi         print_experimental_subprograms_list(dbg,line_context);
766*4d9fdb46SRobert Mustacchi     }
767*4d9fdb46SRobert Mustacchi }
768*4d9fdb46SRobert Mustacchi 
769*4d9fdb46SRobert Mustacchi static int
print_actuals_and_locals(Dwarf_Debug dbg,Dwarf_Line_Context line_context,Dwarf_Unsigned bogus_bytes_count,Dwarf_Small * bogus_bytes_ptr,Dwarf_Small * orig_line_ptr,Dwarf_Small * line_ptr,Dwarf_Small * section_start,Dwarf_Small * line_ptr_actuals,Dwarf_Small * line_ptr_end,Dwarf_Half address_size,int * err_count_out,Dwarf_Error * error)770*4d9fdb46SRobert Mustacchi print_actuals_and_locals(Dwarf_Debug dbg,
771*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context,
772*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned bogus_bytes_count,
773*4d9fdb46SRobert Mustacchi     Dwarf_Small *bogus_bytes_ptr,
774*4d9fdb46SRobert Mustacchi     Dwarf_Small *orig_line_ptr,
775*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_ptr,
776*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_start,
777*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_ptr_actuals,
778*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_ptr_end,
779*4d9fdb46SRobert Mustacchi     Dwarf_Half   address_size,
780*4d9fdb46SRobert Mustacchi     int *        err_count_out,
781*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
782*4d9fdb46SRobert Mustacchi {
783*4d9fdb46SRobert Mustacchi     int res = 0;
784*4d9fdb46SRobert Mustacchi     dwarfstring m8;
785*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset = 0;
786*4d9fdb46SRobert Mustacchi 
787*4d9fdb46SRobert Mustacchi     dwarfstring_constructor(&m8);
788*4d9fdb46SRobert Mustacchi     if (bogus_bytes_count > 0) {
789*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned wcount = bogus_bytes_count;
790*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned boffset = bogus_bytes_ptr - section_start;
791*4d9fdb46SRobert Mustacchi 
792*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m8,
793*4d9fdb46SRobert Mustacchi             "*** DWARF CHECK: the line table prologue  header_length "
794*4d9fdb46SRobert Mustacchi             " is %" DW_PR_DUu " too high, we pretend it is smaller.",
795*4d9fdb46SRobert Mustacchi             wcount);
796*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m8,
797*4d9fdb46SRobert Mustacchi             "Section offset: 0x%"
798*4d9fdb46SRobert Mustacchi             DW_PR_XZEROS DW_PR_DUx,
799*4d9fdb46SRobert Mustacchi             boffset);
800*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m8,
801*4d9fdb46SRobert Mustacchi             " (%" DW_PR_DUu ") ***\n",
802*4d9fdb46SRobert Mustacchi             boffset);
803*4d9fdb46SRobert Mustacchi         *err_count_out += 1;
804*4d9fdb46SRobert Mustacchi     }
805*4d9fdb46SRobert Mustacchi     offset = line_ptr - section_start;
806*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_u(&m8,
807*4d9fdb46SRobert Mustacchi         "  statement prog offset in section: 0x%"
808*4d9fdb46SRobert Mustacchi         DW_PR_XZEROS DW_PR_DUx,
809*4d9fdb46SRobert Mustacchi         offset);
810*4d9fdb46SRobert Mustacchi     dwarfstring_append_printf_u(&m8,
811*4d9fdb46SRobert Mustacchi         " (%" DW_PR_DUu ")\n",
812*4d9fdb46SRobert Mustacchi         offset);
813*4d9fdb46SRobert Mustacchi     _dwarf_printf(dbg,dwarfstring_string(&m8));
814*4d9fdb46SRobert Mustacchi     dwarfstring_reset(&m8);
815*4d9fdb46SRobert Mustacchi 
816*4d9fdb46SRobert Mustacchi     {
817*4d9fdb46SRobert Mustacchi         Dwarf_Bool doaddrs = false;
818*4d9fdb46SRobert Mustacchi         Dwarf_Bool dolines = true;
819*4d9fdb46SRobert Mustacchi 
820*4d9fdb46SRobert Mustacchi         if (!line_ptr_actuals) {
821*4d9fdb46SRobert Mustacchi             /* Normal single level line table. */
822*4d9fdb46SRobert Mustacchi 
823*4d9fdb46SRobert Mustacchi             Dwarf_Bool is_single_table = true;
824*4d9fdb46SRobert Mustacchi             Dwarf_Bool is_actuals_table = false;
825*4d9fdb46SRobert Mustacchi             print_line_header(dbg, is_single_table, is_actuals_table);
826*4d9fdb46SRobert Mustacchi             res = read_line_table_program(dbg,
827*4d9fdb46SRobert Mustacchi                 line_ptr, line_ptr_end, orig_line_ptr,
828*4d9fdb46SRobert Mustacchi                 section_start,
829*4d9fdb46SRobert Mustacchi                 line_context,
830*4d9fdb46SRobert Mustacchi                 address_size, doaddrs, dolines,
831*4d9fdb46SRobert Mustacchi                 is_single_table,
832*4d9fdb46SRobert Mustacchi                 is_actuals_table,
833*4d9fdb46SRobert Mustacchi                 error,
834*4d9fdb46SRobert Mustacchi                 err_count_out);
835*4d9fdb46SRobert Mustacchi             if (res != DW_DLV_OK) {
836*4d9fdb46SRobert Mustacchi                 dwarfstring_destructor(&m8);
837*4d9fdb46SRobert Mustacchi                 dwarf_srclines_dealloc_b(line_context);
838*4d9fdb46SRobert Mustacchi                 return res;
839*4d9fdb46SRobert Mustacchi             }
840*4d9fdb46SRobert Mustacchi         } else {
841*4d9fdb46SRobert Mustacchi             Dwarf_Bool is_single_table = false;
842*4d9fdb46SRobert Mustacchi             Dwarf_Bool is_actuals_table = false;
843*4d9fdb46SRobert Mustacchi             if (line_context->lc_version_number !=
844*4d9fdb46SRobert Mustacchi                 EXPERIMENTAL_LINE_TABLES_VERSION) {
845*4d9fdb46SRobert Mustacchi                 dwarf_srclines_dealloc_b(line_context);
846*4d9fdb46SRobert Mustacchi                 dwarfstring_destructor(&m8);
847*4d9fdb46SRobert Mustacchi                 _dwarf_error(dbg, error, DW_DLE_VERSION_STAMP_ERROR);
848*4d9fdb46SRobert Mustacchi                 return (DW_DLV_ERROR);
849*4d9fdb46SRobert Mustacchi             }
850*4d9fdb46SRobert Mustacchi             /* Read Logicals */
851*4d9fdb46SRobert Mustacchi             print_line_header(dbg, is_single_table, is_actuals_table);
852*4d9fdb46SRobert Mustacchi             res = read_line_table_program(dbg,
853*4d9fdb46SRobert Mustacchi                 line_ptr, line_ptr_actuals, orig_line_ptr,
854*4d9fdb46SRobert Mustacchi                 section_start,
855*4d9fdb46SRobert Mustacchi                 line_context,
856*4d9fdb46SRobert Mustacchi                 address_size, doaddrs, dolines,
857*4d9fdb46SRobert Mustacchi                 is_single_table,
858*4d9fdb46SRobert Mustacchi                 is_actuals_table,
859*4d9fdb46SRobert Mustacchi                 error,err_count_out);
860*4d9fdb46SRobert Mustacchi             if (res != DW_DLV_OK) {
861*4d9fdb46SRobert Mustacchi                 dwarfstring_destructor(&m8);
862*4d9fdb46SRobert Mustacchi                 dwarf_srclines_dealloc_b(line_context);
863*4d9fdb46SRobert Mustacchi                 return res;
864*4d9fdb46SRobert Mustacchi             }
865*4d9fdb46SRobert Mustacchi             if (line_context->lc_actuals_table_offset > 0) {
866*4d9fdb46SRobert Mustacchi                 is_actuals_table = true;
867*4d9fdb46SRobert Mustacchi                 /* Read Actuals */
868*4d9fdb46SRobert Mustacchi 
869*4d9fdb46SRobert Mustacchi                 print_line_header(dbg, is_single_table, is_actuals_table);
870*4d9fdb46SRobert Mustacchi                 res = read_line_table_program(dbg,
871*4d9fdb46SRobert Mustacchi                     line_ptr_actuals, line_ptr_end, orig_line_ptr,
872*4d9fdb46SRobert Mustacchi                     section_start,
873*4d9fdb46SRobert Mustacchi                     line_context,
874*4d9fdb46SRobert Mustacchi                     address_size, doaddrs, dolines,
875*4d9fdb46SRobert Mustacchi                     is_single_table,
876*4d9fdb46SRobert Mustacchi                     is_actuals_table,
877*4d9fdb46SRobert Mustacchi                     error,
878*4d9fdb46SRobert Mustacchi                     err_count_out);
879*4d9fdb46SRobert Mustacchi                 if (res != DW_DLV_OK) {
880*4d9fdb46SRobert Mustacchi                     dwarfstring_destructor(&m8);
881*4d9fdb46SRobert Mustacchi                     dwarf_srclines_dealloc_b(line_context);
882*4d9fdb46SRobert Mustacchi                     return res;
883*4d9fdb46SRobert Mustacchi                 }
884*4d9fdb46SRobert Mustacchi             }
885*4d9fdb46SRobert Mustacchi         }
886*4d9fdb46SRobert Mustacchi     }
887*4d9fdb46SRobert Mustacchi     dwarfstring_destructor(&m8);
888*4d9fdb46SRobert Mustacchi     dwarf_srclines_dealloc_b(line_context);
889bc1f688bSRobert Mustacchi     return DW_DLV_OK;
890bc1f688bSRobert Mustacchi }
891bc1f688bSRobert Mustacchi 
892bc1f688bSRobert Mustacchi 
893bc1f688bSRobert Mustacchi 
894*4d9fdb46SRobert Mustacchi /*  This is support for dwarfdump: making it possible
895bc1f688bSRobert Mustacchi     for clients wanting line detail info on stdout
896bc1f688bSRobert Mustacchi     to get that detail without including internal libdwarf
897bc1f688bSRobert Mustacchi     header information.
898bc1f688bSRobert Mustacchi     Caller passes in compilation unit DIE.
899bc1f688bSRobert Mustacchi     The _dwarf_ version is obsolete (though supported for
900bc1f688bSRobert Mustacchi     compatibility).
901bc1f688bSRobert Mustacchi     The dwarf_ version is preferred.
902bc1f688bSRobert Mustacchi     The functions are intentionally identical: having
903bc1f688bSRobert Mustacchi     _dwarf_print_lines call dwarf_print_lines might
904bc1f688bSRobert Mustacchi     better emphasize they are intentionally identical, but
905bc1f688bSRobert Mustacchi     that seemed slightly silly given how short the functions are.
906bc1f688bSRobert Mustacchi     Interface adds error_count (output value) February 2009.
907*4d9fdb46SRobert Mustacchi 
908*4d9fdb46SRobert Mustacchi     These *print_lines() functions print two-level tables in full
909*4d9fdb46SRobert Mustacchi     even when the user is not asking for both (ie, when
910*4d9fdb46SRobert Mustacchi     the caller asked for dwarf_srclines().
911*4d9fdb46SRobert Mustacchi     It was an accident, but after a short reflection
912*4d9fdb46SRobert Mustacchi     this seems like a good idea for -vvv. */
913bc1f688bSRobert Mustacchi int
dwarf_print_lines(Dwarf_Die die,Dwarf_Error * error,int * error_count)914*4d9fdb46SRobert Mustacchi dwarf_print_lines(Dwarf_Die die,
915*4d9fdb46SRobert Mustacchi     Dwarf_Error * error,
916*4d9fdb46SRobert Mustacchi     int *error_count)
917bc1f688bSRobert Mustacchi {
918bc1f688bSRobert Mustacchi     int only_line_header = 0;
919*4d9fdb46SRobert Mustacchi     int res = _dwarf_internal_printlines(die,
920bc1f688bSRobert Mustacchi         error_count,
921*4d9fdb46SRobert Mustacchi         only_line_header,error);
922bc1f688bSRobert Mustacchi     return res;
923bc1f688bSRobert Mustacchi }
924bc1f688bSRobert Mustacchi int
_dwarf_print_lines(Dwarf_Die die,Dwarf_Error * error)925bc1f688bSRobert Mustacchi _dwarf_print_lines(Dwarf_Die die, Dwarf_Error * error)
926bc1f688bSRobert Mustacchi {
927bc1f688bSRobert Mustacchi     int only_line_header = 0;
928bc1f688bSRobert Mustacchi     int err_count = 0;
929*4d9fdb46SRobert Mustacchi     int res = _dwarf_internal_printlines(die,
930bc1f688bSRobert Mustacchi         &err_count,
931*4d9fdb46SRobert Mustacchi         only_line_header,error);
932bc1f688bSRobert Mustacchi     /* No way to get error count back in this interface */
933bc1f688bSRobert Mustacchi     return res;
934bc1f688bSRobert Mustacchi }
935bc1f688bSRobert Mustacchi 
936bc1f688bSRobert Mustacchi /* The check is in case we are not printing full line data,
937bc1f688bSRobert Mustacchi    this gets some of the issues noted with .debug_line,
938bc1f688bSRobert Mustacchi    but not all. Call dwarf_print_lines() to get all issues.
939bc1f688bSRobert Mustacchi    Intended for apps like dwarfdump.
940*4d9fdb46SRobert Mustacchi    dwarf_check_lineheader_b() new 14 April 2020.
941bc1f688bSRobert Mustacchi */
942*4d9fdb46SRobert Mustacchi int
dwarf_check_lineheader_b(Dwarf_Die die,int * err_count_out,Dwarf_Error * err)943*4d9fdb46SRobert Mustacchi dwarf_check_lineheader_b(Dwarf_Die die, int *err_count_out,
944*4d9fdb46SRobert Mustacchi     Dwarf_Error *err)
945*4d9fdb46SRobert Mustacchi {
946*4d9fdb46SRobert Mustacchi     int res = 0;
947*4d9fdb46SRobert Mustacchi 
948*4d9fdb46SRobert Mustacchi     int only_line_header = 1;
949*4d9fdb46SRobert Mustacchi     res = _dwarf_internal_printlines(die,err_count_out,
950*4d9fdb46SRobert Mustacchi         only_line_header,err);
951*4d9fdb46SRobert Mustacchi     return res;
952*4d9fdb46SRobert Mustacchi }
953*4d9fdb46SRobert Mustacchi 
954*4d9fdb46SRobert Mustacchi /*  This is ugly, no way to detect errors. They get ignored.
955*4d9fdb46SRobert Mustacchi     see dwarf_check_lineheader_b() above. */
956bc1f688bSRobert Mustacchi void
dwarf_check_lineheader(Dwarf_Die die,int * err_count_out)957bc1f688bSRobert Mustacchi dwarf_check_lineheader(Dwarf_Die die, int *err_count_out)
958bc1f688bSRobert Mustacchi {
959*4d9fdb46SRobert Mustacchi     int res = 0;
960*4d9fdb46SRobert Mustacchi     Dwarf_Error err = 0;
961*4d9fdb46SRobert Mustacchi 
962bc1f688bSRobert Mustacchi     int only_line_header = 1;
963*4d9fdb46SRobert Mustacchi     res = _dwarf_internal_printlines(die,err_count_out,
964*4d9fdb46SRobert Mustacchi         only_line_header,&err);
965*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_ERROR) {
966*4d9fdb46SRobert Mustacchi         Dwarf_CU_Context c = 0;
967*4d9fdb46SRobert Mustacchi         Dwarf_Debug dbg = 0;
968*4d9fdb46SRobert Mustacchi 
969*4d9fdb46SRobert Mustacchi         c = die->di_cu_context;
970*4d9fdb46SRobert Mustacchi         if (!c) {
971bc1f688bSRobert Mustacchi             return;
972bc1f688bSRobert Mustacchi         }
973*4d9fdb46SRobert Mustacchi         dbg = c->cc_dbg;
974*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg,err,DW_DLA_ERROR);
975*4d9fdb46SRobert Mustacchi         err = 0;
976*4d9fdb46SRobert Mustacchi     }
977*4d9fdb46SRobert Mustacchi }
978