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