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