xref: /titanic_50/usr/src/lib/libdwarf/common/dwarf_line.h (revision f3e7f55e73a39377d55a030f124cc86b3b66a9cc)
1*f3e7f55eSRobert Mustacchi /*
2*f3e7f55eSRobert Mustacchi 
3*f3e7f55eSRobert Mustacchi   Copyright (C) 2000, 2004, 2006 Silicon Graphics, Inc.  All Rights Reserved.
4*f3e7f55eSRobert Mustacchi   Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved.
5*f3e7f55eSRobert Mustacchi 
6*f3e7f55eSRobert Mustacchi   This program is free software; you can redistribute it and/or modify it
7*f3e7f55eSRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
8*f3e7f55eSRobert Mustacchi   as published by the Free Software Foundation.
9*f3e7f55eSRobert Mustacchi 
10*f3e7f55eSRobert Mustacchi   This program is distributed in the hope that it would be useful, but
11*f3e7f55eSRobert Mustacchi   WITHOUT ANY WARRANTY; without even the implied warranty of
12*f3e7f55eSRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13*f3e7f55eSRobert Mustacchi 
14*f3e7f55eSRobert Mustacchi   Further, this software is distributed without any warranty that it is
15*f3e7f55eSRobert Mustacchi   free of the rightful claim of any third person regarding infringement
16*f3e7f55eSRobert Mustacchi   or the like.  Any license provided herein, whether implied or
17*f3e7f55eSRobert Mustacchi   otherwise, applies only to this software file.  Patent licenses, if
18*f3e7f55eSRobert Mustacchi   any, provided herein do not apply to combinations of this program with
19*f3e7f55eSRobert Mustacchi   other software, or any other product whatsoever.
20*f3e7f55eSRobert Mustacchi 
21*f3e7f55eSRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
22*f3e7f55eSRobert Mustacchi   License along with this program; if not, write the Free Software
23*f3e7f55eSRobert Mustacchi   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
24*f3e7f55eSRobert Mustacchi   USA.
25*f3e7f55eSRobert Mustacchi 
26*f3e7f55eSRobert Mustacchi   Contact information:  Silicon Graphics, Inc., 1500 Crittenden Lane,
27*f3e7f55eSRobert Mustacchi   Mountain View, CA 94043, or:
28*f3e7f55eSRobert Mustacchi 
29*f3e7f55eSRobert Mustacchi   http://www.sgi.com
30*f3e7f55eSRobert Mustacchi 
31*f3e7f55eSRobert Mustacchi   For further information regarding this notice, see:
32*f3e7f55eSRobert Mustacchi 
33*f3e7f55eSRobert Mustacchi   http://oss.sgi.com/projects/GenInfo/NoticeExplan
34*f3e7f55eSRobert Mustacchi 
35*f3e7f55eSRobert Mustacchi */
36*f3e7f55eSRobert Mustacchi 
37*f3e7f55eSRobert Mustacchi 
38*f3e7f55eSRobert Mustacchi 
39*f3e7f55eSRobert Mustacchi #define DW_EXTENDED_OPCODE	0
40*f3e7f55eSRobert Mustacchi 
41*f3e7f55eSRobert Mustacchi /*
42*f3e7f55eSRobert Mustacchi     This is used as the starting value for an algorithm
43*f3e7f55eSRobert Mustacchi     to get the minimum difference between 2 values.
44*f3e7f55eSRobert Mustacchi     UINT_MAX is used as our approximation to infinity.
45*f3e7f55eSRobert Mustacchi */
46*f3e7f55eSRobert Mustacchi #define MAX_LINE_DIFF       UINT_MAX
47*f3e7f55eSRobert Mustacchi 
48*f3e7f55eSRobert Mustacchi /* This is for a sanity check on line
49*f3e7f55eSRobert Mustacchi    table extended opcodes.
50*f3e7f55eSRobert Mustacchi    It is entirely arbitrary, and 100 is surely too small if
51*f3e7f55eSRobert Mustacchi    someone was inserting strings in the opcode. */
52*f3e7f55eSRobert Mustacchi #define DW_LNE_LEN_MAX   100
53*f3e7f55eSRobert Mustacchi 
54*f3e7f55eSRobert Mustacchi 
55*f3e7f55eSRobert Mustacchi /*
56*f3e7f55eSRobert Mustacchi     This structure is used to build a list of all the
57*f3e7f55eSRobert Mustacchi     files that are used in the current compilation unit.
58*f3e7f55eSRobert Mustacchi     All of the fields execpt fi_next have meanings that
59*f3e7f55eSRobert Mustacchi     are obvious from section 6.2.4 of the Libdwarf Doc.
60*f3e7f55eSRobert Mustacchi */
61*f3e7f55eSRobert Mustacchi struct Dwarf_File_Entry_s {
62*f3e7f55eSRobert Mustacchi     /* Points to string naming the file. */
63*f3e7f55eSRobert Mustacchi     Dwarf_Small *fi_file_name;
64*f3e7f55eSRobert Mustacchi 
65*f3e7f55eSRobert Mustacchi     /*
66*f3e7f55eSRobert Mustacchi        Index into the list of directories of the directory in which
67*f3e7f55eSRobert Mustacchi        this file exits. */
68*f3e7f55eSRobert Mustacchi     Dwarf_Sword fi_dir_index;
69*f3e7f55eSRobert Mustacchi 
70*f3e7f55eSRobert Mustacchi     /* Time of last modification of the file. */
71*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned fi_time_last_mod;
72*f3e7f55eSRobert Mustacchi 
73*f3e7f55eSRobert Mustacchi     /* Length in bytes of the file. */
74*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned fi_file_length;
75*f3e7f55eSRobert Mustacchi 
76*f3e7f55eSRobert Mustacchi     /* Pointer for chaining file entries. */
77*f3e7f55eSRobert Mustacchi     Dwarf_File_Entry fi_next;
78*f3e7f55eSRobert Mustacchi };
79*f3e7f55eSRobert Mustacchi 
80*f3e7f55eSRobert Mustacchi 
81*f3e7f55eSRobert Mustacchi typedef struct Dwarf_Line_Context_s *Dwarf_Line_Context;
82*f3e7f55eSRobert Mustacchi 
83*f3e7f55eSRobert Mustacchi /*
84*f3e7f55eSRobert Mustacchi     This structure provides the context in which the fields of
85*f3e7f55eSRobert Mustacchi     a Dwarf_Line structure are interpreted.  They come from the
86*f3e7f55eSRobert Mustacchi     statement program prologue.  **Updated by dwarf_srclines in
87*f3e7f55eSRobert Mustacchi     dwarf_line.c.
88*f3e7f55eSRobert Mustacchi */
89*f3e7f55eSRobert Mustacchi struct Dwarf_Line_Context_s {
90*f3e7f55eSRobert Mustacchi     /*
91*f3e7f55eSRobert Mustacchi        Points to a chain of entries providing info about source files
92*f3e7f55eSRobert Mustacchi        for the current set of Dwarf_Line structures. File number
93*f3e7f55eSRobert Mustacchi        'li_file 1' is last on the list, the first list entry is the
94*f3e7f55eSRobert Mustacchi        file numbered lc_file_entry_count. The numbering of the file
95*f3e7f55eSRobert Mustacchi        names matches the dwarf2/3 line table specification file table
96*f3e7f55eSRobert Mustacchi        and DW_LNE_define_file numbering rules.  */
97*f3e7f55eSRobert Mustacchi     Dwarf_File_Entry lc_file_entries;
98*f3e7f55eSRobert Mustacchi     /*
99*f3e7f55eSRobert Mustacchi        Count of number of source files for this set of Dwarf_Line
100*f3e7f55eSRobert Mustacchi        structures. */
101*f3e7f55eSRobert Mustacchi     Dwarf_Sword lc_file_entry_count;
102*f3e7f55eSRobert Mustacchi     /*
103*f3e7f55eSRobert Mustacchi        Points to the portion of .debug_line section that contains a
104*f3e7f55eSRobert Mustacchi        list of strings naming the included directories. */
105*f3e7f55eSRobert Mustacchi     Dwarf_Small *lc_include_directories;
106*f3e7f55eSRobert Mustacchi 
107*f3e7f55eSRobert Mustacchi     /* Count of the number of included directories. */
108*f3e7f55eSRobert Mustacchi     Dwarf_Sword lc_include_directories_count;
109*f3e7f55eSRobert Mustacchi 
110*f3e7f55eSRobert Mustacchi     /* Count of the number of lines for this cu. */
111*f3e7f55eSRobert Mustacchi     Dwarf_Sword lc_line_count;
112*f3e7f55eSRobert Mustacchi 
113*f3e7f55eSRobert Mustacchi     /* Points to name of compilation directory. */
114*f3e7f55eSRobert Mustacchi     Dwarf_Small *lc_compilation_directory;
115*f3e7f55eSRobert Mustacchi 
116*f3e7f55eSRobert Mustacchi     Dwarf_Debug lc_dbg;
117*f3e7f55eSRobert Mustacchi 
118*f3e7f55eSRobert Mustacchi     Dwarf_Half lc_version_number;	/* DWARF2/3 version number, 2
119*f3e7f55eSRobert Mustacchi 					   for DWARF2, 3 for DWARF3. */
120*f3e7f55eSRobert Mustacchi };
121*f3e7f55eSRobert Mustacchi 
122*f3e7f55eSRobert Mustacchi 
123*f3e7f55eSRobert Mustacchi /*
124*f3e7f55eSRobert Mustacchi     This structure defines a row of the line table.
125*f3e7f55eSRobert Mustacchi     All of the fields except li_offset have the exact
126*f3e7f55eSRobert Mustacchi     same meaning that is defined in Section 6.2.2
127*f3e7f55eSRobert Mustacchi     of the Libdwarf Document.
128*f3e7f55eSRobert Mustacchi 
129*f3e7f55eSRobert Mustacchi     li_offset is used by _dwarf_addr_finder() which is called
130*f3e7f55eSRobert Mustacchi     by rqs(1), an sgi utility for 'moving' shared libraries
131*f3e7f55eSRobert Mustacchi     as if the static linker (ld) had linked the shared library
132*f3e7f55eSRobert Mustacchi     at the newly-specified address.  Most libdwarf-using
133*f3e7f55eSRobert Mustacchi     apps will ignore li_offset and _dwarf_addr_finder().
134*f3e7f55eSRobert Mustacchi 
135*f3e7f55eSRobert Mustacchi */
136*f3e7f55eSRobert Mustacchi struct Dwarf_Line_s {
137*f3e7f55eSRobert Mustacchi     Dwarf_Addr li_address;	/* pc value of machine instr */
138*f3e7f55eSRobert Mustacchi     union addr_or_line_s {
139*f3e7f55eSRobert Mustacchi 	struct li_inner_s {
140*f3e7f55eSRobert Mustacchi 	    Dwarf_Sword li_file;	/* int identifying src file */
141*f3e7f55eSRobert Mustacchi 	    /* li_file is a number 1-N, indexing into a conceptual
142*f3e7f55eSRobert Mustacchi 	       source file table as described in dwarf2/3 spec line
143*f3e7f55eSRobert Mustacchi 	       table doc. (see Dwarf_File_Entry lc_file_entries; and
144*f3e7f55eSRobert Mustacchi 	       Dwarf_Sword lc_file_entry_count;) */
145*f3e7f55eSRobert Mustacchi 
146*f3e7f55eSRobert Mustacchi 	    Dwarf_Sword li_line;	/* source file line number. */
147*f3e7f55eSRobert Mustacchi 	    Dwarf_Half li_column;	/* source file column number */
148*f3e7f55eSRobert Mustacchi 	    Dwarf_Small li_isa;
149*f3e7f55eSRobert Mustacchi 
150*f3e7f55eSRobert Mustacchi 	    /* To save space, use bit flags. */
151*f3e7f55eSRobert Mustacchi 	    /* indicate start of stmt */
152*f3e7f55eSRobert Mustacchi 	    unsigned char li_is_stmt:1;
153*f3e7f55eSRobert Mustacchi 
154*f3e7f55eSRobert Mustacchi 	    /* indicate start basic block */
155*f3e7f55eSRobert Mustacchi 	    unsigned char li_basic_block:1;
156*f3e7f55eSRobert Mustacchi 
157*f3e7f55eSRobert Mustacchi 	    /* first post sequence instr */
158*f3e7f55eSRobert Mustacchi 	    unsigned char li_end_sequence:1;
159*f3e7f55eSRobert Mustacchi 
160*f3e7f55eSRobert Mustacchi 	    unsigned char li_prologue_end:1;
161*f3e7f55eSRobert Mustacchi 	    unsigned char li_epilogue_begin:1;
162*f3e7f55eSRobert Mustacchi 	} li_l_data;
163*f3e7f55eSRobert Mustacchi 	Dwarf_Off li_offset;	/* for rqs */
164*f3e7f55eSRobert Mustacchi     } li_addr_line;
165*f3e7f55eSRobert Mustacchi     Dwarf_Line_Context li_context;	/* assoc Dwarf_Line_Context_s */
166*f3e7f55eSRobert Mustacchi };
167*f3e7f55eSRobert Mustacchi 
168*f3e7f55eSRobert Mustacchi 
169*f3e7f55eSRobert Mustacchi int _dwarf_line_address_offsets(Dwarf_Debug dbg,
170*f3e7f55eSRobert Mustacchi 				Dwarf_Die die,
171*f3e7f55eSRobert Mustacchi 				Dwarf_Addr ** addrs,
172*f3e7f55eSRobert Mustacchi 				Dwarf_Off ** offs,
173*f3e7f55eSRobert Mustacchi 				Dwarf_Unsigned * returncount,
174*f3e7f55eSRobert Mustacchi 				Dwarf_Error * err);
175*f3e7f55eSRobert Mustacchi int _dwarf_internal_srclines(Dwarf_Die die,
176*f3e7f55eSRobert Mustacchi 			     Dwarf_Line ** linebuf,
177*f3e7f55eSRobert Mustacchi 			     Dwarf_Signed * count,
178*f3e7f55eSRobert Mustacchi 			     Dwarf_Bool doaddrs,
179*f3e7f55eSRobert Mustacchi 			     Dwarf_Bool dolines, Dwarf_Error * error);
180*f3e7f55eSRobert Mustacchi 
181*f3e7f55eSRobert Mustacchi 
182*f3e7f55eSRobert Mustacchi 
183*f3e7f55eSRobert Mustacchi /* The LOP, WHAT_IS_OPCODE stuff is here so it can
184*f3e7f55eSRobert Mustacchi    be reused in 3 places.  Seemed hard to keep
185*f3e7f55eSRobert Mustacchi    the 3 places the same without an inline func or
186*f3e7f55eSRobert Mustacchi    a macro.
187*f3e7f55eSRobert Mustacchi 
188*f3e7f55eSRobert Mustacchi    Handling the line section where the header and the
189*f3e7f55eSRobert Mustacchi    file being processed do not match (unusual, but
190*f3e7f55eSRobert Mustacchi    planned for in the  design of .debug_line)
191*f3e7f55eSRobert Mustacchi    is too tricky to recode this several times and keep
192*f3e7f55eSRobert Mustacchi    it right.
193*f3e7f55eSRobert Mustacchi 
194*f3e7f55eSRobert Mustacchi    As it is the code starting up line-reading is duplicated
195*f3e7f55eSRobert Mustacchi    and that is just wrong to do. FIXME!
196*f3e7f55eSRobert Mustacchi */
197*f3e7f55eSRobert Mustacchi #define LOP_EXTENDED 1
198*f3e7f55eSRobert Mustacchi #define LOP_DISCARD  2
199*f3e7f55eSRobert Mustacchi #define LOP_STANDARD 3
200*f3e7f55eSRobert Mustacchi #define LOP_SPECIAL  4
201*f3e7f55eSRobert Mustacchi 
202*f3e7f55eSRobert Mustacchi #define WHAT_IS_OPCODE(type,opcode,base,opcode_length,line_ptr,highest_std) \
203*f3e7f55eSRobert Mustacchi         if( (opcode) < (base) ) {                          \
204*f3e7f55eSRobert Mustacchi            /* we know we must treat as a standard op       \
205*f3e7f55eSRobert Mustacchi                 or a special case.                         \
206*f3e7f55eSRobert Mustacchi            */                                              \
207*f3e7f55eSRobert Mustacchi            if((opcode) == DW_EXTENDED_OPCODE) {            \
208*f3e7f55eSRobert Mustacchi                 type = LOP_EXTENDED;                       \
209*f3e7f55eSRobert Mustacchi            } else  if( ((highest_std)+1) >=  (base)) {     \
210*f3e7f55eSRobert Mustacchi                 /* == Standard case: compile of            \
211*f3e7f55eSRobert Mustacchi                    dwarf_line.c and object                 \
212*f3e7f55eSRobert Mustacchi                    have same standard op codes set.        \
213*f3e7f55eSRobert Mustacchi                                                            \
214*f3e7f55eSRobert Mustacchi                    >  Special case: compile of dwarf_line.c\
215*f3e7f55eSRobert Mustacchi                    has things in standard op codes list    \
216*f3e7f55eSRobert Mustacchi                    in dwarf.h header not                   \
217*f3e7f55eSRobert Mustacchi                    in the object: handle this as a standard\
218*f3e7f55eSRobert Mustacchi                    op code in switch below.                \
219*f3e7f55eSRobert Mustacchi                    The header special ops overlap the      \
220*f3e7f55eSRobert Mustacchi                    object standard ops.                    \
221*f3e7f55eSRobert Mustacchi                    The new standard op codes will not      \
222*f3e7f55eSRobert Mustacchi                    appear in the object.                   \
223*f3e7f55eSRobert Mustacchi                 */                                         \
224*f3e7f55eSRobert Mustacchi                 type = LOP_STANDARD;                       \
225*f3e7f55eSRobert Mustacchi            } else  {                                       \
226*f3e7f55eSRobert Mustacchi                 /* These are standard opcodes in the object\
227*f3e7f55eSRobert Mustacchi                 ** that were not defined  in the header    \
228*f3e7f55eSRobert Mustacchi                 ** at the time dwarf_line.c                \
229*f3e7f55eSRobert Mustacchi                 ** was compiled. Provides the ability of   \
230*f3e7f55eSRobert Mustacchi                 ** out-of-date dwarf reader to read newer  \
231*f3e7f55eSRobert Mustacchi                 ** line table data transparently.          \
232*f3e7f55eSRobert Mustacchi                 */                                         \
233*f3e7f55eSRobert Mustacchi                 type = LOP_DISCARD;                         \
234*f3e7f55eSRobert Mustacchi            }                                                \
235*f3e7f55eSRobert Mustacchi                                                             \
236*f3e7f55eSRobert Mustacchi         } else {                                            \
237*f3e7f55eSRobert Mustacchi 	   /* Is  a special op code.                        \
238*f3e7f55eSRobert Mustacchi 	   */                                               \
239*f3e7f55eSRobert Mustacchi            type =  LOP_SPECIAL;                             \
240*f3e7f55eSRobert Mustacchi         }
241*f3e7f55eSRobert Mustacchi 
242*f3e7f55eSRobert Mustacchi /* The following is from  the dwarf definition of 'ubyte'
243*f3e7f55eSRobert Mustacchi    and is specifically  mentioned in section  6.2.5.1, page 54
244*f3e7f55eSRobert Mustacchi    of the Rev 2.0.0 dwarf specification.
245*f3e7f55eSRobert Mustacchi */
246*f3e7f55eSRobert Mustacchi 
247*f3e7f55eSRobert Mustacchi #define MAX_LINE_OP_CODE  255
248*f3e7f55eSRobert Mustacchi 
249*f3e7f55eSRobert Mustacchi 
250*f3e7f55eSRobert Mustacchi /* The following structs (Line_Table_File_Entry_s,Line_Table_Prefix_s)
251*f3e7f55eSRobert Mustacchi    and functions allow refactoring common code into a single
252*f3e7f55eSRobert Mustacchi    reader routine.
253*f3e7f55eSRobert Mustacchi */
254*f3e7f55eSRobert Mustacchi /* There can be zero of more of these needed for 1 line prologue. */
255*f3e7f55eSRobert Mustacchi struct Line_Table_File_Entry_s {
256*f3e7f55eSRobert Mustacchi     Dwarf_Small *lte_filename;
257*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned lte_directory_index;
258*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned lte_last_modification_time;
259*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned lte_length_of_file;
260*f3e7f55eSRobert Mustacchi };
261*f3e7f55eSRobert Mustacchi 
262*f3e7f55eSRobert Mustacchi /* Data  picked up from the line table prologue for a single
263*f3e7f55eSRobert Mustacchi CU. */
264*f3e7f55eSRobert Mustacchi struct Line_Table_Prefix_s {
265*f3e7f55eSRobert Mustacchi 
266*f3e7f55eSRobert Mustacchi     /* pf_total_length is the value of the length field for the line
267*f3e7f55eSRobert Mustacchi        table of this CU. So it does not count the length of itself (the
268*f3e7f55eSRobert Mustacchi        length value) for consistency with the say lenghts recorded in
269*f3e7f55eSRobert Mustacchi        DWARF2/3. */
270*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned pf_total_length;
271*f3e7f55eSRobert Mustacchi 
272*f3e7f55eSRobert Mustacchi     /* Length of the initial length field itself. */
273*f3e7f55eSRobert Mustacchi     Dwarf_Half pf_length_field_length;
274*f3e7f55eSRobert Mustacchi 
275*f3e7f55eSRobert Mustacchi     /* The version is 2 for DWARF2, 3 for DWARF3 */
276*f3e7f55eSRobert Mustacchi     Dwarf_Half pf_version;
277*f3e7f55eSRobert Mustacchi 
278*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned pf_prologue_length;
279*f3e7f55eSRobert Mustacchi     Dwarf_Small pf_minimum_instruction_length;
280*f3e7f55eSRobert Mustacchi 
281*f3e7f55eSRobert Mustacchi     /* Start and end of this CU line area. pf_line_ptr_start +
282*f3e7f55eSRobert Mustacchi        pf_total_length + pf_length_field_length == pf_line_ptr_end.
283*f3e7f55eSRobert Mustacchi        Meaning pf_line_ptr_start is before the length info. */
284*f3e7f55eSRobert Mustacchi     Dwarf_Small *pf_line_ptr_start;
285*f3e7f55eSRobert Mustacchi     Dwarf_Small *pf_line_ptr_end;
286*f3e7f55eSRobert Mustacchi 
287*f3e7f55eSRobert Mustacchi     /* Used to check that decoding of the line prologue is done right. */
288*f3e7f55eSRobert Mustacchi     Dwarf_Small *pf_line_prologue_start;
289*f3e7f55eSRobert Mustacchi 
290*f3e7f55eSRobert Mustacchi     Dwarf_Small pf_default_is_stmt;
291*f3e7f55eSRobert Mustacchi     Dwarf_Sbyte pf_line_base;
292*f3e7f55eSRobert Mustacchi     Dwarf_Small pf_line_range;
293*f3e7f55eSRobert Mustacchi 
294*f3e7f55eSRobert Mustacchi     /* Highest std opcode (+1).  */
295*f3e7f55eSRobert Mustacchi     Dwarf_Small pf_opcode_base;
296*f3e7f55eSRobert Mustacchi 
297*f3e7f55eSRobert Mustacchi     /* pf_opcode_base -1 entries (each a count, normally the value of
298*f3e7f55eSRobert Mustacchi        each entry is 0 or 1). */
299*f3e7f55eSRobert Mustacchi     Dwarf_Small *pf_opcode_length_table;
300*f3e7f55eSRobert Mustacchi 
301*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned pf_include_directories_count;
302*f3e7f55eSRobert Mustacchi     /* Array of pointers to dir strings. pf_include_directories_count
303*f3e7f55eSRobert Mustacchi        entriesin the array. */
304*f3e7f55eSRobert Mustacchi     Dwarf_Small **pf_include_directories;
305*f3e7f55eSRobert Mustacchi 
306*f3e7f55eSRobert Mustacchi     /* Count of entries in line_table_file_entries array. */
307*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned pf_files_count;
308*f3e7f55eSRobert Mustacchi     struct Line_Table_File_Entry_s *pf_line_table_file_entries;
309*f3e7f55eSRobert Mustacchi 
310*f3e7f55eSRobert Mustacchi     /* The number to treat as standard ops. This is a special
311*f3e7f55eSRobert Mustacchi        accomodation of gcc using the new standard opcodes but not
312*f3e7f55eSRobert Mustacchi        updating the version number. It's legal dwarf2, but much better
313*f3e7f55eSRobert Mustacchi        for the user to understand as dwarf3 when 'it looks ok'. */
314*f3e7f55eSRobert Mustacchi     Dwarf_Bool pf_std_op_count;
315*f3e7f55eSRobert Mustacchi 
316*f3e7f55eSRobert Mustacchi };
317*f3e7f55eSRobert Mustacchi 
318*f3e7f55eSRobert Mustacchi void dwarf_init_line_table_prefix(struct Line_Table_Prefix_s *pf);
319*f3e7f55eSRobert Mustacchi void dwarf_free_line_table_prefix(struct Line_Table_Prefix_s *pf);
320*f3e7f55eSRobert Mustacchi 
321*f3e7f55eSRobert Mustacchi int dwarf_read_line_table_prefix(Dwarf_Debug dbg,
322*f3e7f55eSRobert Mustacchi     Dwarf_Small * data_start,
323*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned data_length,
324*f3e7f55eSRobert Mustacchi     Dwarf_Small ** updated_data_start_out,
325*f3e7f55eSRobert Mustacchi     struct Line_Table_Prefix_s *prefix_out,
326*f3e7f55eSRobert Mustacchi     /* The following 2 arguments are solely for warning users
327*f3e7f55eSRobert Mustacchi      * when there is a surprising 'gap' in the .debug_line info. */
328*f3e7f55eSRobert Mustacchi     Dwarf_Small ** bogus_bytes_ptr,
329*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned * bogus_bytes_count,
330*f3e7f55eSRobert Mustacchi     Dwarf_Error * err,
331*f3e7f55eSRobert Mustacchi     int * err_count_out);
332