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