149d3bc91SRichard Lowe /*
207dc1947SRichard Lowe   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.
5*4d9fdb46SRobert 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.
10*4d9fdb46SRobert 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.
15*4d9fdb46SRobert 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.
23*4d9fdb46SRobert 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.
2849d3bc91SRichard Lowe 
29*4d9fdb46SRobert Mustacchi */
3049d3bc91SRichard Lowe 
31*4d9fdb46SRobert Mustacchi #include "config.h"
32*4d9fdb46SRobert Mustacchi #include <stdio.h>
33*4d9fdb46SRobert Mustacchi #include <stdlib.h>
34*4d9fdb46SRobert Mustacchi #include <time.h>
3549d3bc91SRichard Lowe 
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"
40*4d9fdb46SRobert Mustacchi #include "dwarf_line.h"
41*4d9fdb46SRobert Mustacchi #include "dwarfstring.h"
4249d3bc91SRichard Lowe 
43*4d9fdb46SRobert Mustacchi #define PRINTING_DETAILS 1
4449d3bc91SRichard Lowe 
45*4d9fdb46SRobert 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)
49*4d9fdb46SRobert 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 }
72*4d9fdb46SRobert Mustacchi }
7349d3bc91SRichard Lowe 
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. */
8249d3bc91SRichard Lowe 
83*4d9fdb46SRobert 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,
87*4d9fdb46SRobert 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)
91*4d9fdb46SRobert Mustacchi {
92*4d9fdb46SRobert Mustacchi     dwarfstring m1;
93*4d9fdb46SRobert 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);
189*4d9fdb46SRobert Mustacchi }
19049d3bc91SRichard Lowe 
19107dc1947SRichard Lowe 
192*4d9fdb46SRobert Mustacchi #include "dwarf_line_table_reader_common.h"
19349d3bc91SRichard Lowe 
19449d3bc91SRichard Lowe 
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)
199*4d9fdb46SRobert 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);
24149d3bc91SRichard Lowe 
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 }
26149d3bc91SRichard Lowe 
26249d3bc91SRichard Lowe 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)
26549d3bc91SRichard Lowe {
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);
34749d3bc91SRichard Lowe }
34849d3bc91SRichard Lowe 
34949d3bc91SRichard Lowe 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)
35349d3bc91SRichard Lowe {
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     }
40049d3bc91SRichard Lowe 
40149d3bc91SRichard Lowe }
40249d3bc91SRichard Lowe 
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 }
43549d3bc91SRichard Lowe 
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)
46549d3bc91SRichard Lowe {
466*4d9fdb46SRobert Mustacchi     /*  This pointer is used to scan the portion of the .debug_line
467*4d9fdb46SRobert Mustacchi         section for the current cu. */
46807dc1947SRichard Lowe     Dwarf_Small *line_ptr = 0;
46907dc1947SRichard Lowe     Dwarf_Small *orig_line_ptr = 0;
47049d3bc91SRichard Lowe 
471*4d9fdb46SRobert Mustacchi     /*  Pointer to a DW_AT_stmt_list attribute in case it exists in the
472*4d9fdb46SRobert Mustacchi         die. */
47307dc1947SRichard Lowe     Dwarf_Attribute stmt_list_attr = 0;
47449d3bc91SRichard Lowe 
475*4d9fdb46SRobert Mustacchi     /*  Pointer to DW_AT_comp_dir attribute in die. */
47607dc1947SRichard Lowe     Dwarf_Attribute comp_dir_attr = 0;
47749d3bc91SRichard Lowe 
478*4d9fdb46SRobert Mustacchi     /*  Pointer to name of compilation directory. */
47949d3bc91SRichard Lowe     Dwarf_Small *comp_dir = NULL;
48049d3bc91SRichard Lowe 
481*4d9fdb46SRobert Mustacchi     /*  Offset into .debug_line specified by a DW_AT_stmt_list
482*4d9fdb46SRobert Mustacchi         attribute. */
48307dc1947SRichard Lowe     Dwarf_Unsigned line_offset = 0;
48449d3bc91SRichard Lowe 
485*4d9fdb46SRobert Mustacchi     /*  These variables are used to decode leb128 numbers. Leb128_num
486*4d9fdb46SRobert Mustacchi         holds the decoded number, and leb128_length is its length in
487*4d9fdb46SRobert Mustacchi         bytes. */
48807dc1947SRichard Lowe     Dwarf_Half attrform = 0;
489*4d9fdb46SRobert Mustacchi 
490*4d9fdb46SRobert 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.  */
49307dc1947SRichard Lowe     Dwarf_Small* bogus_bytes_ptr = 0;
49407dc1947SRichard Lowe     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;
49849d3bc91SRichard Lowe 
49949d3bc91SRichard Lowe 
50007dc1947SRichard Lowe     /* The Dwarf_Debug this die belongs to. */
501*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
502*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context = 0;
503*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context = 0;
50407dc1947SRichard Lowe     int resattr = DW_DLV_ERROR;
50507dc1947SRichard Lowe     int lres =    DW_DLV_ERROR;
50607dc1947SRichard Lowe     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;
51049d3bc91SRichard Lowe 
51149d3bc91SRichard Lowe     /* ***** BEGIN CODE ***** */
51249d3bc91SRichard Lowe 
51307dc1947SRichard Lowe     if (error != NULL) {
51407dc1947SRichard Lowe         *error = NULL;
51507dc1947SRichard Lowe     }
51649d3bc91SRichard Lowe 
51707dc1947SRichard Lowe     CHECK_DIE(die, DW_DLV_ERROR);
518*4d9fdb46SRobert Mustacchi     cu_context = die->di_cu_context;
519*4d9fdb46SRobert Mustacchi     dbg = cu_context->cc_dbg;
52049d3bc91SRichard Lowe 
52107dc1947SRichard Lowe     res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
52249d3bc91SRichard Lowe     if (res != DW_DLV_OK) {
52307dc1947SRichard Lowe         return res;
52449d3bc91SRichard Lowe     }
525*4d9fdb46SRobert Mustacchi     if (!dbg->de_debug_line.dss_size) {
526*4d9fdb46SRobert Mustacchi         return (DW_DLV_NO_ENTRY);
527*4d9fdb46SRobert Mustacchi     }
52849d3bc91SRichard Lowe 
529*4d9fdb46SRobert Mustacchi     address_size = _dwarf_get_address_size(dbg, die);
53049d3bc91SRichard Lowe     resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
53149d3bc91SRichard Lowe     if (resattr != DW_DLV_OK) {
53207dc1947SRichard Lowe         return resattr;
53349d3bc91SRichard Lowe     }
534*4d9fdb46SRobert Mustacchi     /*  The list of relevant FORMs is small.
535*4d9fdb46SRobert Mustacchi         DW_FORM_data4, DW_FORM_data8, DW_FORM_sec_offset
53607dc1947SRichard Lowe     */
53707dc1947SRichard Lowe     lres = dwarf_whatform(stmt_list_attr,&attrform,error);
53849d3bc91SRichard Lowe     if (lres != DW_DLV_OK) {
539*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg,stmt_list_attr, DW_DLA_ATTR);
54007dc1947SRichard Lowe         return lres;
54107dc1947SRichard Lowe     }
54207dc1947SRichard Lowe     if (attrform != DW_FORM_data4 && attrform != DW_FORM_data8 &&
54307dc1947SRichard Lowe         attrform != DW_FORM_sec_offset ) {
544*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg,stmt_list_attr, DW_DLA_ATTR);
54507dc1947SRichard Lowe         _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
54607dc1947SRichard Lowe         return (DW_DLV_ERROR);
54707dc1947SRichard Lowe     }
54807dc1947SRichard Lowe     lres = dwarf_global_formref(stmt_list_attr, &line_offset, error);
54907dc1947SRichard Lowe     if (lres != DW_DLV_OK) {
550*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg,stmt_list_attr, DW_DLA_ATTR);
55107dc1947SRichard Lowe         return lres;
55249d3bc91SRichard Lowe     }
55349d3bc91SRichard Lowe 
55407dc1947SRichard Lowe     if (line_offset >= dbg->de_debug_line.dss_size) {
555*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg,stmt_list_attr, DW_DLA_ATTR);
55607dc1947SRichard Lowe         _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
55707dc1947SRichard Lowe         return (DW_DLV_ERROR);
55849d3bc91SRichard Lowe     }
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;
57249d3bc91SRichard Lowe     dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
57349d3bc91SRichard Lowe 
574*4d9fdb46SRobert Mustacchi     /*  If die has DW_AT_comp_dir attribute, get the string that names
575*4d9fdb46SRobert Mustacchi         the compilation directory. */
57649d3bc91SRichard Lowe     resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error);
57749d3bc91SRichard Lowe     if (resattr == DW_DLV_ERROR) {
57807dc1947SRichard Lowe         return resattr;
57949d3bc91SRichard Lowe     }
58049d3bc91SRichard Lowe     if (resattr == DW_DLV_OK) {
58107dc1947SRichard Lowe         int cres = DW_DLV_ERROR;
58207dc1947SRichard Lowe         char *cdir = 0;
58307dc1947SRichard Lowe 
58407dc1947SRichard Lowe         cres = dwarf_formstring(comp_dir_attr, &cdir, error);
58507dc1947SRichard Lowe         if (cres == DW_DLV_ERROR) {
58607dc1947SRichard Lowe             return cres;
58707dc1947SRichard Lowe         } else if (cres == DW_DLV_OK) {
58807dc1947SRichard Lowe             comp_dir = (Dwarf_Small *) cdir;
58907dc1947SRichard Lowe         }
59049d3bc91SRichard Lowe     }
59149d3bc91SRichard Lowe     if (resattr == DW_DLV_OK) {
59207dc1947SRichard Lowe         dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR);
59349d3bc91SRichard Lowe     }
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     }
60007dc1947SRichard Lowe     {
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,
60907dc1947SRichard Lowe             &bogus_bytes_ptr,
61007dc1947SRichard Lowe             &bogus_bytes_count,
61107dc1947SRichard Lowe             error,
61207dc1947SRichard Lowe             err_count_out);
61307dc1947SRichard Lowe         if (dres == DW_DLV_ERROR) {
614*4d9fdb46SRobert Mustacchi             dwarf_srclines_dealloc_b(line_context);
61507dc1947SRichard Lowe             return dres;
61607dc1947SRichard Lowe         }
61707dc1947SRichard Lowe         if (dres == DW_DLV_NO_ENTRY) {
618*4d9fdb46SRobert Mustacchi             dwarf_srclines_dealloc_b(line_context);
61907dc1947SRichard Lowe             return dres;
62007dc1947SRichard Lowe         }
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;
62607dc1947SRichard Lowe         }
627*4d9fdb46SRobert Mustacchi     }
628*4d9fdb46SRobert Mustacchi     line_version = line_context->lc_version_number;
629*4d9fdb46SRobert Mustacchi     line_context->lc_compilation_directory = comp_dir;
630*4d9fdb46SRobert Mustacchi     if (only_line_header) {
631*4d9fdb46SRobert 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 }
65449d3bc91SRichard Lowe 
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 }
75949d3bc91SRichard Lowe 
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);
76649d3bc91SRichard Lowe     }
767*4d9fdb46SRobert Mustacchi }
76849d3bc91SRichard Lowe 
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);
81549d3bc91SRichard Lowe 
81607dc1947SRichard Lowe     {
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;
83907dc1947SRichard Lowe             }
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);
84907dc1947SRichard Lowe             }
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;
88307dc1947SRichard Lowe                 }
88407dc1947SRichard Lowe             }
88507dc1947SRichard Lowe         }
88649d3bc91SRichard Lowe     }
887*4d9fdb46SRobert Mustacchi     dwarfstring_destructor(&m8);
888*4d9fdb46SRobert Mustacchi     dwarf_srclines_dealloc_b(line_context);
889*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
89049d3bc91SRichard Lowe }
89149d3bc91SRichard Lowe 
892*4d9fdb46SRobert Mustacchi 
893*4d9fdb46SRobert Mustacchi 
894*4d9fdb46SRobert Mustacchi /*  This is support for dwarfdump: making it possible
895*4d9fdb46SRobert Mustacchi     for clients wanting line detail info on stdout
896*4d9fdb46SRobert Mustacchi     to get that detail without including internal libdwarf
897*4d9fdb46SRobert Mustacchi     header information.
898*4d9fdb46SRobert Mustacchi     Caller passes in compilation unit DIE.
899*4d9fdb46SRobert Mustacchi     The _dwarf_ version is obsolete (though supported for
900*4d9fdb46SRobert Mustacchi     compatibility).
901*4d9fdb46SRobert Mustacchi     The dwarf_ version is preferred.
902*4d9fdb46SRobert Mustacchi     The functions are intentionally identical: having
903*4d9fdb46SRobert Mustacchi     _dwarf_print_lines call dwarf_print_lines might
904*4d9fdb46SRobert Mustacchi     better emphasize they are intentionally identical, but
905*4d9fdb46SRobert Mustacchi     that seemed slightly silly given how short the functions are.
906*4d9fdb46SRobert 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. */
91349d3bc91SRichard Lowe 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)
91707dc1947SRichard Lowe {
91807dc1947SRichard Lowe     int only_line_header = 0;
919*4d9fdb46SRobert Mustacchi     int res = _dwarf_internal_printlines(die,
92007dc1947SRichard Lowe         error_count,
921*4d9fdb46SRobert Mustacchi         only_line_header,error);
92207dc1947SRichard Lowe     return res;
92307dc1947SRichard Lowe }
92407dc1947SRichard Lowe int
_dwarf_print_lines(Dwarf_Die die,Dwarf_Error * error)92549d3bc91SRichard Lowe _dwarf_print_lines(Dwarf_Die die, Dwarf_Error * error)
92649d3bc91SRichard Lowe {
92707dc1947SRichard Lowe     int only_line_header = 0;
92807dc1947SRichard Lowe     int err_count = 0;
929*4d9fdb46SRobert Mustacchi     int res = _dwarf_internal_printlines(die,
93007dc1947SRichard Lowe         &err_count,
931*4d9fdb46SRobert Mustacchi         only_line_header,error);
93207dc1947SRichard Lowe     /* No way to get error count back in this interface */
93349d3bc91SRichard Lowe     return res;
93449d3bc91SRichard Lowe }
93507dc1947SRichard Lowe 
93607dc1947SRichard Lowe /* The check is in case we are not printing full line data,
93707dc1947SRichard Lowe    this gets some of the issues noted with .debug_line,
93807dc1947SRichard Lowe    but not all. Call dwarf_print_lines() to get all issues.
93907dc1947SRichard Lowe    Intended for apps like dwarfdump.
940*4d9fdb46SRobert Mustacchi    dwarf_check_lineheader_b() new 14 April 2020.
94107dc1947SRichard Lowe */
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. */
95607dc1947SRichard Lowe void
dwarf_check_lineheader(Dwarf_Die die,int * err_count_out)95707dc1947SRichard Lowe dwarf_check_lineheader(Dwarf_Die die, int *err_count_out)
95807dc1947SRichard Lowe {
959*4d9fdb46SRobert Mustacchi     int res = 0;
960*4d9fdb46SRobert Mustacchi     Dwarf_Error err = 0;
961*4d9fdb46SRobert Mustacchi 
96207dc1947SRichard Lowe     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) {
971*4d9fdb46SRobert Mustacchi             return;
972*4d9fdb46SRobert 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     }
97707dc1947SRichard Lowe }
978