xref: /illumos-gate/usr/src/lib/libdwarf/common/dwarf_line.h (revision 4d9fdb46b215739778ebc12079842c9905586999)
1bc1f688bSRobert Mustacchi /*
2bc1f688bSRobert Mustacchi   Copyright (C) 2000, 2004, 2006 Silicon Graphics, Inc.  All Rights Reserved.
3*4d9fdb46SRobert Mustacchi   Portions Copyright (C) 2009-2015 David Anderson. All Rights Reserved.
4*4d9fdb46SRobert Mustacchi   Portions Copyright (C) 2010-2012 SN Systems Ltd. All Rights Reserved.
5bc1f688bSRobert Mustacchi 
6bc1f688bSRobert Mustacchi   This program is free software; you can redistribute it and/or modify it
7bc1f688bSRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
8bc1f688bSRobert Mustacchi   as published by the Free Software Foundation.
9bc1f688bSRobert Mustacchi 
10bc1f688bSRobert Mustacchi   This program is distributed in the hope that it would be useful, but
11bc1f688bSRobert Mustacchi   WITHOUT ANY WARRANTY; without even the implied warranty of
12bc1f688bSRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13bc1f688bSRobert Mustacchi 
14bc1f688bSRobert Mustacchi   Further, this software is distributed without any warranty that it is
15bc1f688bSRobert Mustacchi   free of the rightful claim of any third person regarding infringement
16bc1f688bSRobert Mustacchi   or the like.  Any license provided herein, whether implied or
17bc1f688bSRobert Mustacchi   otherwise, applies only to this software file.  Patent licenses, if
18bc1f688bSRobert Mustacchi   any, provided herein do not apply to combinations of this program with
19bc1f688bSRobert Mustacchi   other software, or any other product whatsoever.
20bc1f688bSRobert Mustacchi 
21bc1f688bSRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
22bc1f688bSRobert Mustacchi   License along with this program; if not, write the Free Software
23bc1f688bSRobert Mustacchi   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
24bc1f688bSRobert Mustacchi   USA.
25bc1f688bSRobert Mustacchi 
26bc1f688bSRobert Mustacchi */
27bc1f688bSRobert Mustacchi 
28bc1f688bSRobert Mustacchi 
29bc1f688bSRobert Mustacchi 
30bc1f688bSRobert Mustacchi #define DW_EXTENDED_OPCODE   0
31bc1f688bSRobert Mustacchi 
32bc1f688bSRobert Mustacchi /*
33bc1f688bSRobert Mustacchi     This is used as the starting value for an algorithm
34bc1f688bSRobert Mustacchi     to get the minimum difference between 2 values.
35bc1f688bSRobert Mustacchi     UINT_MAX is used as our approximation to infinity.
36bc1f688bSRobert Mustacchi */
37bc1f688bSRobert Mustacchi #define MAX_LINE_DIFF       UINT_MAX
38bc1f688bSRobert Mustacchi 
39bc1f688bSRobert Mustacchi /* This is for a sanity check on line
40bc1f688bSRobert Mustacchi    table extended opcodes.
41bc1f688bSRobert Mustacchi    It is entirely arbitrary, and 100 is surely too small if
42bc1f688bSRobert Mustacchi    someone was inserting strings in the opcode. */
43bc1f688bSRobert Mustacchi #define DW_LNE_LEN_MAX   100
44bc1f688bSRobert Mustacchi 
45bc1f688bSRobert Mustacchi 
46bc1f688bSRobert Mustacchi /*
47bc1f688bSRobert Mustacchi     This structure is used to build a list of all the
48bc1f688bSRobert Mustacchi     files that are used in the current compilation unit.
49bc1f688bSRobert Mustacchi     All of the fields execpt fi_next have meanings that
50bc1f688bSRobert Mustacchi     are obvious from section 6.2.4 of the Libdwarf Doc.
51*4d9fdb46SRobert Mustacchi     Because of DW_LNE_define_file we
52*4d9fdb46SRobert Mustacchi     make this a list, not an array.
53bc1f688bSRobert Mustacchi */
54bc1f688bSRobert Mustacchi struct Dwarf_File_Entry_s {
55*4d9fdb46SRobert Mustacchi     struct Dwarf_File_Entry_s *fi_next;
56*4d9fdb46SRobert Mustacchi 
57bc1f688bSRobert Mustacchi     /* Points to string naming the file. */
58bc1f688bSRobert Mustacchi     Dwarf_Small *fi_file_name;
59bc1f688bSRobert Mustacchi 
60*4d9fdb46SRobert Mustacchi     /*  Index into the list of directories of the directory in which
61bc1f688bSRobert Mustacchi         this file exits. */
62*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned fi_dir_index;
63bc1f688bSRobert Mustacchi 
64bc1f688bSRobert Mustacchi     /* Time of last modification of the file. */
65bc1f688bSRobert Mustacchi     Dwarf_Unsigned fi_time_last_mod;
66bc1f688bSRobert Mustacchi 
67bc1f688bSRobert Mustacchi     /* Length in bytes of the file. */
68bc1f688bSRobert Mustacchi     Dwarf_Unsigned fi_file_length;
69bc1f688bSRobert Mustacchi 
70*4d9fdb46SRobert Mustacchi     Dwarf_Form_Data16   fi_md5_value;
71*4d9fdb46SRobert Mustacchi     char           fi_dir_index_present;
72*4d9fdb46SRobert Mustacchi     char           fi_time_last_mod_present;
73*4d9fdb46SRobert Mustacchi     char           fi_file_length_present;
74*4d9fdb46SRobert Mustacchi     char           fi_md5_present;
75bc1f688bSRobert Mustacchi };
76bc1f688bSRobert Mustacchi 
77*4d9fdb46SRobert Mustacchi /*  Part of two-level line tables support. */
78*4d9fdb46SRobert Mustacchi struct Dwarf_Subprog_Entry_s {
79*4d9fdb46SRobert Mustacchi     Dwarf_Small *ds_subprog_name;
80*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned ds_decl_file;
81*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned ds_decl_line;
82*4d9fdb46SRobert Mustacchi };
83bc1f688bSRobert Mustacchi 
84*4d9fdb46SRobert Mustacchi typedef struct Dwarf_Subprog_Entry_s *Dwarf_Subprog_Entry;
85*4d9fdb46SRobert Mustacchi 
86*4d9fdb46SRobert Mustacchi 
87*4d9fdb46SRobert Mustacchi struct Dwarf_Unsigned_Pair_s {
88*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  up_first;
89*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  up_second;
90*4d9fdb46SRobert Mustacchi };
91bc1f688bSRobert Mustacchi 
92bc1f688bSRobert Mustacchi /*
93bc1f688bSRobert Mustacchi     This structure provides the context in which the fields of
94bc1f688bSRobert Mustacchi     a Dwarf_Line structure are interpreted.  They come from the
95bc1f688bSRobert Mustacchi     statement program prologue.  **Updated by dwarf_srclines in
96bc1f688bSRobert Mustacchi     dwarf_line.c.
97bc1f688bSRobert Mustacchi 
98*4d9fdb46SRobert Mustacchi     lc_magic will be DW_CONTEXT_MAGIC unless there is a serious
99*4d9fdb46SRobert Mustacchi     programming error somewhere.
100*4d9fdb46SRobert Mustacchi     It's set zero when a Line_Context is deallocated.
101*4d9fdb46SRobert Mustacchi     Any other value indicates there is bug somewhere.
102*4d9fdb46SRobert Mustacchi */
103*4d9fdb46SRobert Mustacchi #define DW_CONTEXT_MAGIC 0xd00d1111
104*4d9fdb46SRobert Mustacchi struct Dwarf_Line_Context_s {
105*4d9fdb46SRobert Mustacchi     unsigned    lc_magic;
106*4d9fdb46SRobert Mustacchi 
107*4d9fdb46SRobert Mustacchi     /*  lc_new_style_access is non-zero if this was allocated
108*4d9fdb46SRobert Mustacchi         via a dwarf_srclines_b() call or equivalent.
109*4d9fdb46SRobert Mustacchi         Otherwise this is 0.  */
110*4d9fdb46SRobert Mustacchi     unsigned char lc_new_style_access;
111*4d9fdb46SRobert Mustacchi 
112*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_unit_length; /* all versions */
113*4d9fdb46SRobert Mustacchi 
114*4d9fdb46SRobert Mustacchi     /* The section offset (in .debug_line
115*4d9fdb46SRobert Mustacchi         or .debug_line.dwo of the line table */
116*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_section_offset;
117*4d9fdb46SRobert Mustacchi 
118*4d9fdb46SRobert Mustacchi     /*  2 for DWARF2, 3 for DWARF3, 4 for DWARF4, 5 for DWARF5.
119*4d9fdb46SRobert Mustacchi         0xf006 for experimental two-level line tables. */
120*4d9fdb46SRobert Mustacchi     Dwarf_Half lc_version_number; /* all versions */
121*4d9fdb46SRobert Mustacchi 
122*4d9fdb46SRobert Mustacchi     /* Total length of the line data for this CU */
123*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_total_length; /* all versions */
124*4d9fdb46SRobert Mustacchi 
125*4d9fdb46SRobert Mustacchi     /* Length of the initial length field itself. */
126*4d9fdb46SRobert Mustacchi     Dwarf_Half lc_length_field_length; /* all versions */
127*4d9fdb46SRobert Mustacchi 
128*4d9fdb46SRobert Mustacchi     /* address size and segment sizefields new in DWARF5 header.  */
129*4d9fdb46SRobert Mustacchi     Dwarf_Small lc_address_size; /* DWARF5 */
130*4d9fdb46SRobert Mustacchi     Dwarf_Small lc_segment_selector_size; /* DWARF5 */
131*4d9fdb46SRobert Mustacchi 
132*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_header_length; /* all versions */
133*4d9fdb46SRobert Mustacchi 
134*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_prologue_length;
135*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_actuals_table_offset;
136*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_logicals_table_offset;
137*4d9fdb46SRobert Mustacchi     Dwarf_Small lc_minimum_instruction_length;  /* all versions */
138*4d9fdb46SRobert Mustacchi     Dwarf_Ubyte lc_maximum_ops_per_instruction; /*DWARF5*/
139*4d9fdb46SRobert Mustacchi 
140*4d9fdb46SRobert Mustacchi     /*  Start and end of this CU line area. pf_line_ptr_start +
141*4d9fdb46SRobert Mustacchi         pf_total_length + pf_length_field_length == pf_line_ptr_end.
142*4d9fdb46SRobert Mustacchi         Meaning lc_line_ptr_start is before the length info. */
143*4d9fdb46SRobert Mustacchi     Dwarf_Small *lc_line_ptr_start;
144*4d9fdb46SRobert Mustacchi     Dwarf_Small *lc_line_ptr_end;
145*4d9fdb46SRobert Mustacchi     /*  Start of the lines themselves. */
146*4d9fdb46SRobert Mustacchi     Dwarf_Small *lc_line_ptr_lines;
147*4d9fdb46SRobert Mustacchi 
148*4d9fdb46SRobert Mustacchi     /* Used to check that decoding of the line prologue is done right. */
149*4d9fdb46SRobert Mustacchi     Dwarf_Small *lc_line_prologue_start;
150*4d9fdb46SRobert Mustacchi 
151*4d9fdb46SRobert Mustacchi     Dwarf_Small lc_default_is_stmt; /* all versions */
152*4d9fdb46SRobert Mustacchi     Dwarf_Sbyte lc_line_base;  /* all versions */
153*4d9fdb46SRobert Mustacchi     Dwarf_Small lc_line_range;  /* all versions */
154*4d9fdb46SRobert Mustacchi 
155*4d9fdb46SRobert Mustacchi     /* Highest std opcode (+1).  */
156*4d9fdb46SRobert Mustacchi     Dwarf_Small lc_opcode_base; /* all versions */
157*4d9fdb46SRobert Mustacchi     /*  pf_opcode_base -1 entries (each a count, normally the value of
158*4d9fdb46SRobert Mustacchi         each entry is 0 or 1). */
159*4d9fdb46SRobert Mustacchi     Dwarf_Small *lc_opcode_length_table; /* all versions */
160*4d9fdb46SRobert Mustacchi 
161*4d9fdb46SRobert Mustacchi     /*  The number to treat as standard ops. This is a special
162*4d9fdb46SRobert Mustacchi         accomodation of gcc using the new standard opcodes but not
163*4d9fdb46SRobert Mustacchi         updating the version number. It's legal dwarf2, but much better
164*4d9fdb46SRobert Mustacchi         for the user to understand as dwarf3 when 'it looks ok'. */
165*4d9fdb46SRobert Mustacchi     Dwarf_Small lc_std_op_count;
166*4d9fdb46SRobert Mustacchi 
167*4d9fdb46SRobert Mustacchi     /* ======== includes =========*/
168*4d9fdb46SRobert Mustacchi     /*  Points to the portion of .debug_line section that
169*4d9fdb46SRobert Mustacchi         contains a list of strings naming the included
170*4d9fdb46SRobert Mustacchi         directories.  Do not free().
171*4d9fdb46SRobert Mustacchi         No free even DWARF5?
172*4d9fdb46SRobert Mustacchi         An array of pointers to strings.  */
173*4d9fdb46SRobert Mustacchi     /*  DWARF 2,3,4: does not name the current dir of the compilation.
174*4d9fdb46SRobert Mustacchi         DWARF5: Initial entry is the dir of the compilation. */
175*4d9fdb46SRobert Mustacchi     Dwarf_Small **lc_include_directories;
176bc1f688bSRobert Mustacchi     /*  Count of the number of included directories. */
177*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_include_directories_count;
178*4d9fdb46SRobert Mustacchi 
179*4d9fdb46SRobert Mustacchi     /* count of uleb pairs */
180*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_directory_entry_format_count; /* DWARF5 */
181*4d9fdb46SRobert Mustacchi 
182*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_directory_entry_values_count; /* DWARF5 */
183*4d9fdb46SRobert Mustacchi     /*  This must be freed,malloc space, an array of the
184*4d9fdb46SRobert Mustacchi         values of each entry. */
185*4d9fdb46SRobert Mustacchi     struct Dwarf_Unsigned_Pair_s * lc_directory_format_values; /* DWARF5 */
186*4d9fdb46SRobert Mustacchi 
187*4d9fdb46SRobert Mustacchi     /* ======== end includes =========*/
188*4d9fdb46SRobert Mustacchi 
189*4d9fdb46SRobert Mustacchi     /* ======== file names =========*/
190*4d9fdb46SRobert Mustacchi 
191*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_file_name_format_count; /* DWARF5 */
192*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * lc_file_name_format; /* DWARF5 */
193*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_file_entry_values_count; /* DWARF5 */
194*4d9fdb46SRobert Mustacchi     /*  This must be freed,malloc space, an array of the
195*4d9fdb46SRobert Mustacchi         values of each entry. */
196*4d9fdb46SRobert Mustacchi     struct Dwarf_Unsigned_Pair_s * lc_file_format_values; /* DWARF5 */
197*4d9fdb46SRobert Mustacchi 
198*4d9fdb46SRobert Mustacchi     /*  Points to a singly-linked list of entries providing info
199*4d9fdb46SRobert Mustacchi         about source files
200*4d9fdb46SRobert Mustacchi         for the current set of Dwarf_Line structures.
201*4d9fdb46SRobert Mustacchi         The initial  entry on the list is 'file 1' per DWARF2,3,4 rules.
202*4d9fdb46SRobert Mustacchi         And so on.  lc_last_entry points at the last entry
203*4d9fdb46SRobert Mustacchi         in the list (so we can easily expand the list).
204*4d9fdb46SRobert Mustacchi         It's a list (not a table) since we may encounter
205*4d9fdb46SRobert Mustacchi         DW_LNE_define_file entries.
206*4d9fdb46SRobert Mustacchi         For Dwarf5 the initial entry is 'file 0'
207*4d9fdb46SRobert Mustacchi         and must match the CU-DIE DW_AT_name string. */
208*4d9fdb46SRobert Mustacchi     Dwarf_File_Entry lc_file_entries;
209*4d9fdb46SRobert Mustacchi     Dwarf_File_Entry lc_last_entry;
210*4d9fdb46SRobert Mustacchi     /*  Count of number of source files for this set of Dwarf_Line
211*4d9fdb46SRobert Mustacchi         structures. */
212*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_file_entry_count; /* all versions */
213*4d9fdb46SRobert Mustacchi     /*  Values Easing the process of indexing through lc_file_entries. */
214*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_file_entry_baseindex;
215*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_file_entry_endindex;
216*4d9fdb46SRobert Mustacchi     /* ======== end file names =========*/
217*4d9fdb46SRobert Mustacchi 
218*4d9fdb46SRobert Mustacchi 
219*4d9fdb46SRobert Mustacchi     /*  Points to an array of subprogram entries.
220*4d9fdb46SRobert Mustacchi         With Two level line tables this may be non-zero.
221*4d9fdb46SRobert Mustacchi         An array of Dwarf_Subprogram_Entry_s structs. */
222*4d9fdb46SRobert Mustacchi     Dwarf_Subprog_Entry lc_subprogs;
223*4d9fdb46SRobert Mustacchi 
224*4d9fdb46SRobert Mustacchi     /*  Count of the number of subprogram entries
225*4d9fdb46SRobert Mustacchi         With Two level line tables this may be non-zero. */
226*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_subprogs_count;
227bc1f688bSRobert Mustacchi 
228bc1f688bSRobert Mustacchi     /*  Count of the number of lines for this cu. */
229*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_line_count;
230bc1f688bSRobert Mustacchi 
231*4d9fdb46SRobert Mustacchi     /*  Points to name of compilation directory.
232*4d9fdb46SRobert Mustacchi         That string is in a .debug section  (DWARF 2,3,4)
233*4d9fdb46SRobert Mustacchi         so do not free this. For DWARF5 must be the same
234*4d9fdb46SRobert Mustacchi         as lc_include_directories[0] */
235bc1f688bSRobert Mustacchi     Dwarf_Small *lc_compilation_directory;
236bc1f688bSRobert Mustacchi 
237bc1f688bSRobert Mustacchi     Dwarf_Debug lc_dbg;
238bc1f688bSRobert Mustacchi 
239*4d9fdb46SRobert Mustacchi     /*  zero table count is skeleton, or just missing names.
240*4d9fdb46SRobert Mustacchi         1 is standard table.
241*4d9fdb46SRobert Mustacchi         2 means two-level table (experimantal)
242*4d9fdb46SRobert Mustacchi         Other is a bug somewhere.  */
243*4d9fdb46SRobert Mustacchi     Dwarf_Small lc_table_count;
244*4d9fdb46SRobert Mustacchi     Dwarf_Bool lc_is_single_table;
245*4d9fdb46SRobert Mustacchi 
246*4d9fdb46SRobert Mustacchi     /* For standard line tables  the logicals are
247*4d9fdb46SRobert Mustacchi         the only tables and linecount_actuals is 0. */
248*4d9fdb46SRobert Mustacchi     Dwarf_Line   *lc_linebuf_logicals;
249*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_linecount_logicals;
250*4d9fdb46SRobert Mustacchi 
251*4d9fdb46SRobert Mustacchi     /* Non-zero only if two-level table with actuals */
252*4d9fdb46SRobert Mustacchi     Dwarf_Line   *lc_linebuf_actuals;
253*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_linecount_actuals;
254bc1f688bSRobert Mustacchi };
255bc1f688bSRobert Mustacchi 
256bc1f688bSRobert Mustacchi 
257*4d9fdb46SRobert Mustacchi 
258*4d9fdb46SRobert Mustacchi /*  The line table set of registers.
259*4d9fdb46SRobert Mustacchi     The state machine state variables.
260*4d9fdb46SRobert Mustacchi     Using names from the DWARF documentation
261*4d9fdb46SRobert Mustacchi     but preceded by lr_.  */
262*4d9fdb46SRobert Mustacchi struct Dwarf_Line_Registers_s {
263*4d9fdb46SRobert Mustacchi     Dwarf_Addr lr_address;        /* DWARF2 */
264*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lr_file ;          /* DWARF2 */
265*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lr_line ;          /* DWARF2 */
266*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lr_column ;        /* DWARF2 */
267*4d9fdb46SRobert Mustacchi     Dwarf_Bool lr_is_stmt;        /* DWARF2 */
268*4d9fdb46SRobert Mustacchi     Dwarf_Bool lr_basic_block;    /* DWARF2 */
269*4d9fdb46SRobert Mustacchi     Dwarf_Bool lr_end_sequence;   /* DWARF2 */
270*4d9fdb46SRobert Mustacchi     Dwarf_Bool lr_prologue_end;   /* DWARF3 */
271*4d9fdb46SRobert Mustacchi     Dwarf_Bool lr_epilogue_begin; /* DWARF3 */
272*4d9fdb46SRobert Mustacchi     Dwarf_Small lr_isa;           /* DWARF3 */
273*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lr_op_index;      /* DWARF4, operation within VLIW instruction. */
274*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lr_discriminator; /* DWARF4 */
275*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lr_call_context;       /* EXPERIMENTAL */
276*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lr_subprogram;     /* EXPERIMENTAL */
277*4d9fdb46SRobert Mustacchi };
278*4d9fdb46SRobert Mustacchi typedef struct Dwarf_Line_Registers_s *Dwarf_Line_Registers;
279*4d9fdb46SRobert Mustacchi void _dwarf_set_line_table_regs_default_values(
280*4d9fdb46SRobert Mustacchi     Dwarf_Line_Registers regs,
281*4d9fdb46SRobert Mustacchi     unsigned lineversion,
282*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_stmt);
283*4d9fdb46SRobert Mustacchi 
284*4d9fdb46SRobert Mustacchi 
285*4d9fdb46SRobert Mustacchi 
286bc1f688bSRobert Mustacchi /*
287bc1f688bSRobert Mustacchi     This structure defines a row of the line table.
288bc1f688bSRobert Mustacchi     All of the fields except li_offset have the exact
289bc1f688bSRobert Mustacchi     same meaning that is defined in Section 6.2.2
290bc1f688bSRobert Mustacchi     of the Libdwarf Document.
291bc1f688bSRobert Mustacchi 
292bc1f688bSRobert Mustacchi     li_offset is used by _dwarf_addr_finder() which is called
293bc1f688bSRobert Mustacchi     by rqs(1), an sgi utility for 'moving' shared libraries
294bc1f688bSRobert Mustacchi     as if the static linker (ld) had linked the shared library
295bc1f688bSRobert Mustacchi     at the newly-specified address.  Most libdwarf-using
296bc1f688bSRobert Mustacchi     apps will ignore li_offset and _dwarf_addr_finder().
297bc1f688bSRobert Mustacchi 
298bc1f688bSRobert Mustacchi */
299bc1f688bSRobert Mustacchi struct Dwarf_Line_s {
300bc1f688bSRobert Mustacchi     Dwarf_Addr li_address;  /* pc value of machine instr */
301bc1f688bSRobert Mustacchi     union addr_or_line_s {
302bc1f688bSRobert Mustacchi         struct li_inner_s {
303*4d9fdb46SRobert Mustacchi             /* New as of DWARF4 */
304*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned li_discriminator;
305*4d9fdb46SRobert Mustacchi 
306*4d9fdb46SRobert Mustacchi             /*  int identifying src file
307*4d9fdb46SRobert Mustacchi                 li_file is a number 1-N, indexing into a conceptual
308bc1f688bSRobert Mustacchi                 source file table as described in dwarf2/3 spec line
309bc1f688bSRobert Mustacchi                 table doc. (see Dwarf_File_Entry lc_file_entries; and
310*4d9fdb46SRobert Mustacchi                 Dwarf_Unsigned lc_file_entry_count;) */
311*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned li_file;
312bc1f688bSRobert Mustacchi 
313*4d9fdb46SRobert Mustacchi             /*  In single-level table is line number in source file. 1-N
314*4d9fdb46SRobert Mustacchi                 In logicals table is not used.
315*4d9fdb46SRobert Mustacchi                 In actuals table is index into logicals table.  1-N*/
316*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned li_line;
317*4d9fdb46SRobert Mustacchi 
318*4d9fdb46SRobert Mustacchi             Dwarf_Half li_column; /* source file column number  1-N */
319*4d9fdb46SRobert Mustacchi             Dwarf_Small li_isa;   /* New as of DWARF4. */
320*4d9fdb46SRobert Mustacchi 
321*4d9fdb46SRobert Mustacchi             /*  Two-level line tables.
322*4d9fdb46SRobert Mustacchi                 Is index from logicals table
323*4d9fdb46SRobert Mustacchi                 into logicals table. 1-N */
324*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned li_call_context;
325*4d9fdb46SRobert Mustacchi 
326*4d9fdb46SRobert Mustacchi             /*  Two-level line tables.
327*4d9fdb46SRobert Mustacchi                 is index into subprograms table. 1-N */
328*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned li_subprogram;
329bc1f688bSRobert Mustacchi 
330bc1f688bSRobert Mustacchi             /* To save space, use bit flags. */
331bc1f688bSRobert Mustacchi             /* indicate start of stmt */
332*4d9fdb46SRobert Mustacchi             unsigned li_is_stmt:1;
333bc1f688bSRobert Mustacchi 
334bc1f688bSRobert Mustacchi             /* indicate start basic block */
335*4d9fdb46SRobert Mustacchi             unsigned li_basic_block:1;
336bc1f688bSRobert Mustacchi 
337bc1f688bSRobert Mustacchi             /* first post sequence instr */
338*4d9fdb46SRobert Mustacchi             unsigned li_end_sequence:1;
339bc1f688bSRobert Mustacchi 
340*4d9fdb46SRobert Mustacchi             unsigned li_prologue_end:1;
341*4d9fdb46SRobert Mustacchi             unsigned li_epilogue_begin:1;
342*4d9fdb46SRobert Mustacchi 
343*4d9fdb46SRobert Mustacchi             /* Mark a line record as being DW_LNS_set_address. */
344*4d9fdb46SRobert Mustacchi             unsigned li_is_addr_set:1;
345bc1f688bSRobert Mustacchi         } li_l_data;
346*4d9fdb46SRobert Mustacchi #ifdef __sgi /* SGI IRIX ONLY */
347*4d9fdb46SRobert Mustacchi         Dwarf_Off li_offset;  /* for SGI IRIX rqs only*/
348*4d9fdb46SRobert Mustacchi #endif /* __sgi */
349bc1f688bSRobert Mustacchi     } li_addr_line;
350bc1f688bSRobert Mustacchi     Dwarf_Line_Context li_context; /* assoc Dwarf_Line_Context_s */
351*4d9fdb46SRobert Mustacchi 
352*4d9fdb46SRobert Mustacchi     /*  Set only on the actuals table of a two-level line table.
353*4d9fdb46SRobert Mustacchi         Assists in the dealloc code.
354*4d9fdb46SRobert Mustacchi     */
355*4d9fdb46SRobert Mustacchi     Dwarf_Bool li_is_actuals_table;
356bc1f688bSRobert Mustacchi };
357bc1f688bSRobert Mustacchi 
358bc1f688bSRobert Mustacchi 
359bc1f688bSRobert Mustacchi int _dwarf_line_address_offsets(Dwarf_Debug dbg,
360bc1f688bSRobert Mustacchi     Dwarf_Die die,
361bc1f688bSRobert Mustacchi     Dwarf_Addr ** addrs,
362bc1f688bSRobert Mustacchi     Dwarf_Off ** offs,
363bc1f688bSRobert Mustacchi     Dwarf_Unsigned * returncount,
364bc1f688bSRobert Mustacchi     Dwarf_Error * err);
365bc1f688bSRobert Mustacchi int _dwarf_internal_srclines(Dwarf_Die die,
366*4d9fdb46SRobert Mustacchi     Dwarf_Bool old_interface,
367*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * version,
368*4d9fdb46SRobert Mustacchi     Dwarf_Small     * table_count,
369*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context *line_context,
370bc1f688bSRobert Mustacchi     Dwarf_Line ** linebuf,
371bc1f688bSRobert Mustacchi     Dwarf_Signed * count,
372*4d9fdb46SRobert Mustacchi     Dwarf_Line ** linebuf_actuals,
373*4d9fdb46SRobert Mustacchi     Dwarf_Signed * count_actuals,
374bc1f688bSRobert Mustacchi     Dwarf_Bool doaddrs,
375*4d9fdb46SRobert Mustacchi     Dwarf_Bool dolines,
376*4d9fdb46SRobert Mustacchi     Dwarf_Error * error);
377bc1f688bSRobert Mustacchi 
378bc1f688bSRobert Mustacchi /*  The LOP, WHAT_IS_OPCODE stuff is here so it can
379bc1f688bSRobert Mustacchi     be reused in 3 places.  Seemed hard to keep
380bc1f688bSRobert Mustacchi     the 3 places the same without an inline func or
381bc1f688bSRobert Mustacchi     a macro.
382bc1f688bSRobert Mustacchi 
383bc1f688bSRobert Mustacchi     Handling the line section where the header and the
384bc1f688bSRobert Mustacchi     file being processed do not match (unusual, but
385bc1f688bSRobert Mustacchi     planned for in the  design of .debug_line)
386bc1f688bSRobert Mustacchi     is too tricky to recode this several times and keep
387bc1f688bSRobert Mustacchi     it right.
388bc1f688bSRobert Mustacchi 
389bc1f688bSRobert Mustacchi     As it is the code starting up line-reading is duplicated
390bc1f688bSRobert Mustacchi     and that is just wrong to do. FIXME!
391bc1f688bSRobert Mustacchi */
392bc1f688bSRobert Mustacchi #define LOP_EXTENDED 1
393bc1f688bSRobert Mustacchi #define LOP_DISCARD  2
394bc1f688bSRobert Mustacchi #define LOP_STANDARD 3
395bc1f688bSRobert Mustacchi #define LOP_SPECIAL  4
396bc1f688bSRobert Mustacchi 
397bc1f688bSRobert Mustacchi #define WHAT_IS_OPCODE(type,opcode,base,opcode_length,line_ptr,highest_std) \
398bc1f688bSRobert Mustacchi     if ((opcode) < (base)) {                             \
399bc1f688bSRobert Mustacchi         /*  we know we must treat as a standard op       \
400*4d9fdb46SRobert Mustacchi             or a special case. */                        \
401bc1f688bSRobert Mustacchi         if ((opcode) == DW_EXTENDED_OPCODE) {            \
402bc1f688bSRobert Mustacchi             type = LOP_EXTENDED;                         \
403*4d9fdb46SRobert Mustacchi         } else if ((highest_std+1) >= (base)) {        \
404bc1f688bSRobert Mustacchi             /*  == Standard case: compile of             \
405bc1f688bSRobert Mustacchi                 dwarf_line.c and object                  \
406bc1f688bSRobert Mustacchi                 have same standard op codes set.         \
407*4d9fdb46SRobert Mustacchi                 == Special case: compile of dwarf_line.c \
408bc1f688bSRobert Mustacchi                 has things in standard op codes list     \
409bc1f688bSRobert Mustacchi                 in dwarf.h header not                    \
410bc1f688bSRobert Mustacchi                 in the object: handle this as a standard \
411bc1f688bSRobert Mustacchi                 op code in switch below.                 \
412bc1f688bSRobert Mustacchi                 The header special ops overlap the       \
413bc1f688bSRobert Mustacchi                 object standard ops.                     \
414bc1f688bSRobert Mustacchi                 The new standard op codes will not       \
415*4d9fdb46SRobert Mustacchi                 appear in the object. */                 \
416bc1f688bSRobert Mustacchi             type = LOP_STANDARD;                         \
417bc1f688bSRobert Mustacchi         } else  {                                        \
418bc1f688bSRobert Mustacchi             /* These are standard opcodes in the object  \
419bc1f688bSRobert Mustacchi             ** that were not defined  in the header      \
420bc1f688bSRobert Mustacchi             ** at the time dwarf_line.c                  \
421bc1f688bSRobert Mustacchi             ** was compiled. Provides the ability of     \
422bc1f688bSRobert Mustacchi             ** out-of-date dwarf reader to read newer    \
423bc1f688bSRobert Mustacchi             ** line table data transparently.            \
424bc1f688bSRobert Mustacchi             */                                           \
425bc1f688bSRobert Mustacchi             type = LOP_DISCARD;                          \
426bc1f688bSRobert Mustacchi         }                                                \
427bc1f688bSRobert Mustacchi     } else {                                             \
428*4d9fdb46SRobert Mustacchi         /* Is  a special op code. */                     \
429bc1f688bSRobert Mustacchi         type =  LOP_SPECIAL;                             \
430bc1f688bSRobert Mustacchi     }
431bc1f688bSRobert Mustacchi 
432bc1f688bSRobert Mustacchi /*  The following is from  the dwarf definition of 'ubyte'
433bc1f688bSRobert Mustacchi     and is specifically  mentioned in section  6.2.5.1, page 54
434bc1f688bSRobert Mustacchi     of the Rev 2.0.0 dwarf specification.
435bc1f688bSRobert Mustacchi */
436bc1f688bSRobert Mustacchi 
437bc1f688bSRobert Mustacchi #define MAX_LINE_OP_CODE  255
438bc1f688bSRobert Mustacchi 
439*4d9fdb46SRobert Mustacchi /* Operand counts per standard operand.
440*4d9fdb46SRobert Mustacchi    The initial zero is for DW_LNS_copy.
441*4d9fdb46SRobert Mustacchi    This is an economical way to verify we understand the table
442*4d9fdb46SRobert Mustacchi    of standard-opcode-lengths in the line table prologue.  */
443*4d9fdb46SRobert Mustacchi #define STANDARD_OPERAND_COUNT_DWARF2 9
444*4d9fdb46SRobert Mustacchi #define STANDARD_OPERAND_COUNT_DWARF3 12
445*4d9fdb46SRobert Mustacchi /* For two-level line tables, we have three additional standard opcodes. */
446*4d9fdb46SRobert Mustacchi #define STANDARD_OPERAND_COUNT_TWO_LEVEL 15
447bc1f688bSRobert Mustacchi 
448*4d9fdb46SRobert Mustacchi void _dwarf_print_header_issue(Dwarf_Debug dbg,
449*4d9fdb46SRobert Mustacchi     const char *specific_msg,
450bc1f688bSRobert Mustacchi     Dwarf_Small *data_start,
451*4d9fdb46SRobert Mustacchi     Dwarf_Signed value,
452*4d9fdb46SRobert Mustacchi     unsigned index,
453*4d9fdb46SRobert Mustacchi     unsigned tabv,
454*4d9fdb46SRobert Mustacchi     unsigned linetabv,
455bc1f688bSRobert Mustacchi     int *err_count_out);
456*4d9fdb46SRobert Mustacchi int _dwarf_decode_line_string_form(Dwarf_Debug dbg,
457*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned form,
458*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset_size,
459*4d9fdb46SRobert Mustacchi     Dwarf_Small **line_ptr,
460*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_ptr_end,
461*4d9fdb46SRobert Mustacchi     char **return_str,
462*4d9fdb46SRobert Mustacchi     Dwarf_Error * error);
463*4d9fdb46SRobert Mustacchi int _dwarf_decode_line_udata_form(Dwarf_Debug dbg,
464*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned form,
465*4d9fdb46SRobert Mustacchi     Dwarf_Small **line_ptr,
466*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *return_val,
467*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_end_ptr,
468*4d9fdb46SRobert Mustacchi     Dwarf_Error * error);
469*4d9fdb46SRobert Mustacchi 
470*4d9fdb46SRobert Mustacchi void _dwarf_update_chain_list( Dwarf_Chain chain_line,
471*4d9fdb46SRobert Mustacchi     Dwarf_Chain *head_chain, Dwarf_Chain *curr_chain);
472*4d9fdb46SRobert Mustacchi void _dwarf_free_chain_entries(Dwarf_Debug dbg,Dwarf_Chain head,int count);
473*4d9fdb46SRobert Mustacchi 
474*4d9fdb46SRobert Mustacchi int _dwarf_line_context_constructor(Dwarf_Debug dbg, void *m);
475*4d9fdb46SRobert Mustacchi void _dwarf_line_context_destructor(void *m);
476*4d9fdb46SRobert Mustacchi 
477*4d9fdb46SRobert Mustacchi void _dwarf_print_line_context_record(Dwarf_Debug dbg,
478*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context);
479*4d9fdb46SRobert Mustacchi void _dwarf_context_src_files_destroy(Dwarf_Line_Context context);
480*4d9fdb46SRobert Mustacchi int _dwarf_add_to_files_list(Dwarf_Line_Context context, Dwarf_File_Entry fe);
481