49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Copyright (C) 2000, 2004, 2006 Silicon Graphics, Inc. All Rights Reserved.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This program is free software; you can redistribute it and/or modify it
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe under the terms of version 2.1 of the GNU Lesser General Public License
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe as published by the Free Software Foundation.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This program is distributed in the hope that it would be useful, but
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WITHOUT ANY WARRANTY; without even the implied warranty of
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Further, this software is distributed without any warranty that it is
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe free of the rightful claim of any third person regarding infringement
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe or the like. Any license provided herein, whether implied or
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe otherwise, applies only to this software file. Patent licenses, if
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe any, provided herein do not apply to combinations of this program with
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe other software, or any other product whatsoever.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe You should have received a copy of the GNU Lesser General Public
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe License along with this program; if not, write the Free Software
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe USA.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Mountain View, CA 94043, or:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe http://www.sgi.com
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe For further information regarding this notice, see:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe http://oss.sgi.com/projects/GenInfo/NoticeExplan
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#define DW_EXTENDED_OPCODE 0
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This is used as the starting value for an algorithm
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe to get the minimum difference between 2 values.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe UINT_MAX is used as our approximation to infinity.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#define MAX_LINE_DIFF UINT_MAX
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* This is for a sanity check on line
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe table extended opcodes.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe It is entirely arbitrary, and 100 is surely too small if
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe someone was inserting strings in the opcode. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#define DW_LNE_LEN_MAX 100
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This structure is used to build a list of all the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe files that are used in the current compilation unit.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe All of the fields execpt fi_next have meanings that
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe are obvious from section 6.2.4 of the Libdwarf Doc.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestruct Dwarf_File_Entry_s {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Points to string naming the file. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Small *fi_file_name;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Index into the list of directories of the directory in which
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe this file exits. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Sword fi_dir_index;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Time of last modification of the file. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned fi_time_last_mod;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Length in bytes of the file. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned fi_file_length;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Pointer for chaining file entries. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_File_Entry fi_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe};
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowetypedef struct Dwarf_Line_Context_s *Dwarf_Line_Context;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This structure provides the context in which the fields of
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe a Dwarf_Line structure are interpreted. They come from the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe statement program prologue. **Updated by dwarf_srclines in
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dwarf_line.c.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestruct Dwarf_Line_Context_s {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Points to a chain of entries providing info about source files
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for the current set of Dwarf_Line structures. File number
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 'li_file 1' is last on the list, the first list entry is the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe file numbered lc_file_entry_count. The numbering of the file
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe names matches the dwarf2/3 line table specification file table
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe and DW_LNE_define_file numbering rules. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_File_Entry lc_file_entries;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Count of number of source files for this set of Dwarf_Line
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe structures. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Sword lc_file_entry_count;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Points to the portion of .debug_line section that contains a
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe list of strings naming the included directories. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Small *lc_include_directories;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Count of the number of included directories. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Sword lc_include_directories_count;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Count of the number of lines for this cu. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Sword lc_line_count;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Points to name of compilation directory. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Small *lc_compilation_directory;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Debug lc_dbg;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half lc_version_number; /* DWARF2/3 version number, 2
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for DWARF2, 3 for DWARF3. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe};
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This structure defines a row of the line table.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe All of the fields except li_offset have the exact
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe same meaning that is defined in Section 6.2.2
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe of the Libdwarf Document.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe li_offset is used by _dwarf_addr_finder() which is called
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe by rqs(1), an sgi utility for 'moving' shared libraries
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe as if the static linker (ld) had linked the shared library
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe at the newly-specified address. Most libdwarf-using
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe apps will ignore li_offset and _dwarf_addr_finder().
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestruct Dwarf_Line_s {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Addr li_address; /* pc value of machine instr */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe union addr_or_line_s {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe struct li_inner_s {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Sword li_file; /* int identifying src file */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* li_file is a number 1-N, indexing into a conceptual
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe source file table as described in dwarf2/3 spec line
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe table doc. (see Dwarf_File_Entry lc_file_entries; and
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Sword lc_file_entry_count;) */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Sword li_line; /* source file line number. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Half li_column; /* source file column number */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small li_isa;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* To save space, use bit flags. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* indicate start of stmt */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned char li_is_stmt:1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* indicate start basic block */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned char li_basic_block:1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* first post sequence instr */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned char li_end_sequence:1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned char li_prologue_end:1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned char li_epilogue_begin:1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } li_l_data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Off li_offset; /* for rqs */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } li_addr_line;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Line_Context li_context; /* assoc Dwarf_Line_Context_s */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe};
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint _dwarf_line_address_offsets(Dwarf_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Die die,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr ** addrs,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Off ** offs,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * returncount,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * err);
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint _dwarf_internal_srclines(Dwarf_Die die,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Line ** linebuf,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed * count,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Bool doaddrs,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Bool dolines, Dwarf_Error * error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/* The LOP, WHAT_IS_OPCODE stuff is here so it can
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe be reused in 3 places. Seemed hard to keep
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe the 3 places the same without an inline func or
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe a macro.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Handling the line section where the header and the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe file being processed do not match (unusual, but
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe planned for in the design of .debug_line)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe is too tricky to recode this several times and keep
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe it right.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe As it is the code starting up line-reading is duplicated
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe and that is just wrong to do. FIXME!
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#define LOP_EXTENDED 1
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#define LOP_DISCARD 2
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#define LOP_STANDARD 3
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#define LOP_SPECIAL 4
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#define WHAT_IS_OPCODE(type,opcode,base,opcode_length,line_ptr,highest_std) \
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if( (opcode) < (base) ) { \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* we know we must treat as a standard op \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe or a special case. \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe */ \
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if((opcode) == DW_EXTENDED_OPCODE) { \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe type = LOP_EXTENDED; \
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if( ((highest_std)+1) >= (base)) { \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* == Standard case: compile of \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dwarf_line.c and object \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe have same standard op codes set. \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe > Special case: compile of dwarf_line.c\
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe has things in standard op codes list \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe in dwarf.h header not \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe in the object: handle this as a standard\
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe op code in switch below. \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe The header special ops overlap the \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe object standard ops. \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe The new standard op codes will not \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe appear in the object. \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe */ \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe type = LOP_STANDARD; \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } else { \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* These are standard opcodes in the object\
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ** that were not defined in the header \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ** at the time dwarf_line.c \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ** was compiled. Provides the ability of \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ** out-of-date dwarf reader to read newer \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ** line table data transparently. \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe */ \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe type = LOP_DISCARD; \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } else { \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Is a special op code. \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe */ \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe type = LOP_SPECIAL; \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/* The following is from the dwarf definition of 'ubyte'
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe and is specifically mentioned in section 6.2.5.1, page 54
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe of the Rev 2.0.0 dwarf specification.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#define MAX_LINE_OP_CODE 255
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* The following structs (Line_Table_File_Entry_s,Line_Table_Prefix_s)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe and functions allow refactoring common code into a single
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe reader routine.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* There can be zero of more of these needed for 1 line prologue. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowestruct Line_Table_File_Entry_s {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *lte_filename;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned lte_directory_index;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned lte_last_modification_time;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned lte_length_of_file;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe};
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* Data picked up from the line table prologue for a single
07dc1947c362e187fb955d283b692f8769dd5defRichard LoweCU. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowestruct Line_Table_Prefix_s {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* pf_total_length is the value of the length field for the line
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe table of this CU. So it does not count the length of itself (the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe length value) for consistency with the say lenghts recorded in
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF2/3. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned pf_total_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Length of the initial length field itself. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half pf_length_field_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The version is 2 for DWARF2, 3 for DWARF3 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half pf_version;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned pf_prologue_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small pf_minimum_instruction_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Start and end of this CU line area. pf_line_ptr_start +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe pf_total_length + pf_length_field_length == pf_line_ptr_end.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Meaning pf_line_ptr_start is before the length info. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *pf_line_ptr_start;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *pf_line_ptr_end;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Used to check that decoding of the line prologue is done right. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *pf_line_prologue_start;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small pf_default_is_stmt;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Sbyte pf_line_base;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small pf_line_range;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Highest std opcode (+1). */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small pf_opcode_base;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* pf_opcode_base -1 entries (each a count, normally the value of
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe each entry is 0 or 1). */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *pf_opcode_length_table;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned pf_include_directories_count;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Array of pointers to dir strings. pf_include_directories_count
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe entriesin the array. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small **pf_include_directories;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Count of entries in line_table_file_entries array. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned pf_files_count;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe struct Line_Table_File_Entry_s *pf_line_table_file_entries;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The number to treat as standard ops. This is a special
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe accomodation of gcc using the new standard opcodes but not
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe updating the version number. It's legal dwarf2, but much better
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for the user to understand as dwarf3 when 'it looks ok'. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Bool pf_std_op_count;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe};
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowevoid dwarf_init_line_table_prefix(struct Line_Table_Prefix_s *pf);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowevoid dwarf_free_line_table_prefix(struct Line_Table_Prefix_s *pf);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint dwarf_read_line_table_prefix(Dwarf_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small * data_start,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned data_length,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small ** updated_data_start_out,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe struct Line_Table_Prefix_s *prefix_out,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The following 2 arguments are solely for warning users
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * when there is a surprising 'gap' in the .debug_line info. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small ** bogus_bytes_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * bogus_bytes_count,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * err,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int * err_count_out);