07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Copyright (C) 2000,2002,2004,2005,2006 Silicon Graphics, Inc. All Rights Reserved.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved.
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 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 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 You should have received a copy of the GNU Lesser General Public
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard 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,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Mountain View, CA 94043, or:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe For further information regarding this notice, see:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe http://oss.sgi.com/projects/GenInfo/NoticeExplan
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* The address of the Free Software Foundation is
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Boston, MA 02110-1301, USA.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe SGI has moved from the Crittenden Lane address.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* FIXME Need to add prologue_end epilogue_begin isa fields. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe " section op col t k q\n"
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe " offset code address file line umn ? ? ?\n");
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* FIXME: print new line values: prologue_end epilogue_begin isa */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned long file,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned long line,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned long column,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int is_stmt, int basic_block, int end_sequence,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe "%2lu %4lu %2lu %1d %1d %1d\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (unsigned long) file,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (unsigned long) line,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (unsigned long) column,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (int) is_stmt, (int) basic_block, (int) end_sequence);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK if ok. else DW_DLV_NO_ENTRY or DW_DLV_ERROR
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe If err_count_out is non-NULL, this is a special 'check'
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe_dwarf_internal_printlines(Dwarf_Die die, Dwarf_Error * error,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This pointer is used to scan the portion of the .debug_line
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe section for the current cu. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe This points to the last byte of the .debug_line portion for the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe current cu. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Pointer to a DW_AT_stmt_list attribute in case it exists in the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Pointer to DW_AT_comp_dir attribute in die. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Pointer to name of compilation directory. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Offset into .debug_line specified by a DW_AT_stmt_list
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe attribute. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* These are the state machine state variables. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe This is the current opcode read from the statement program. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe These variables are used to decode leb128 numbers. Leb128_num
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe holds the decoded number, and leb128_length is its length in
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This is the operand of the latest fixed_advance_pc extended
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* In case there are wierd bytes 'after' the line table
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * prologue this lets us print something. This is a gcc
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * compiler bug and we expect the bytes count to be 12.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The Dwarf_Debug this die belongs to. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* ***** BEGIN CODE ***** */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The list of relevant FORMs is small.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_FORM_data4, DW_FORM_data8, DW_FORM_sec_offset
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe lres = dwarf_whatform(stmt_list_attr,&attrform,error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (attrform != DW_FORM_data4 && attrform != DW_FORM_data8 &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe lres = dwarf_global_formref(stmt_list_attr, &line_offset, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (line_offset >= dbg->de_debug_line.dss_size) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr = dbg->de_debug_line.dss_data + line_offset;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe If die has DW_AT_comp_dir attribute, get the string that names
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe the compilation directory. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cres = dwarf_formstring(comp_dir_attr, &cdir, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr,dbg->de_debug_line.dss_size - line_offset,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Just checking for header errors, nothing more here.*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe "line offset 0x%" DW_PR_DUx " %" DW_PR_DSd "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("line table version %d\n",(int) prefix.pf_version);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("line table length field length %d prologue length %d\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" include directories count %d\n", (int)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i = 0; i < prefix.pf_include_directories_count; ++i) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned tlm2 = lfile->lte_last_modification_time;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned di = lfile->lte_directory_index;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (int)(i+1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned boffset = bogus_bytes_ptr - orig_line_ptr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("*** DWARF CHECK: the line table prologue header_length "
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe " is %" DW_PR_DUu " too high, we pretend it is smaller."
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe "Section offset: %" DW_PR_DUu " (0x%" DW_PR_DUx ") ***\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" statement prog offset in section: %" DW_PR_DUu " 0x%" DW_PR_DUx "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Initialize the part of the state machine dependent on the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Start of statement program. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* 'type' is the output */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WHAT_IS_OPCODE(type, opcode, prefix.pf_opcode_base,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int opcnt = prefix.pf_opcode_length_table[opcode];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("*** DWARF CHECK: DISCARD standard opcode %d "
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe "with %d operands: "
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * Read and discard operands we don't
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * understand.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * Arbitrary choice of unsigned read.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * Signed read would work as well.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* do nothing, necessary ops done */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* This op code is a special op in the object, no matter
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe that it might fall into the standard op range in this
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe compile Thatis, these are special opcodes between
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe special_opcode_base and MAX_LINE_OP_CODE. (including
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe special_opcode_base and MAX_LINE_OP_CODE) */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe address = address + prefix.pf_minimum_instruction_length *
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_advance_pc val %" DW_PR_DSd " 0x%" DW_PR_DUx "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_advance_line val %" DW_PR_DSd " 0x%" DW_PR_DSx "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_set_column val %" DW_PR_DSd " 0x%" DW_PR_DSx "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe opcode = MAX_LINE_OP_CODE - prefix.pf_opcode_base;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_minimum_instruction_length * (opcode /
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_const_add_pc new address 0x%" DW_PR_DSx "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, fixed_advance_pc, Dwarf_Half,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_fixed_advance_pc val %" DW_PR_DSd
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe " 0x%" DW_PR_DSx " new address 0x%" DW_PR_DSx "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* New in DWARF3 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_set_epilogue_begin set true.\n");
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* New in DWARF3 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_set_isa new value 0x%" DW_PR_DUx ".\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The value of the isa did not fit in our
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe local so we record it wrong. declare an
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe print_line_detail("DW_LNE_end_sequence extended",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr += die->di_cu_context->cc_address_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNE_set_address address 0x%" DW_PR_DUx "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr = line_ptr + strlen((char *) line_ptr) + 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* ctime supplies newline */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* This is an extended op code we do not know about,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe other than we know now many bytes it is
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (and the op code and the bytes of operand). */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned remaining_bytes = instr_length -1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(instr_length < 1 || remaining_bytes > DW_LNE_LEN_MAX) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("Bytecount: " DW_PR_DUu , instr_length);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe This is support for dwarfdump: making it possible
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for clients wanting line detail info on stdout
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe to get that detail without including internal libdwarf
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe header information.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Caller passes in compilation unit DIE.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe The _dwarf_ version is obsolete (though supported for
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe compatibility).
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe The dwarf_ version is preferred.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe The functions are intentionally identical: having
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_print_lines call dwarf_print_lines might
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe better emphasize they are intentionally identical, but
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe that seemed slightly silly given how short the functions are.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Interface adds error_count (output value) February 2009.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_print_lines(Dwarf_Die die, Dwarf_Error * error,int *error_count)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = _dwarf_internal_printlines(die, error,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_print_lines(Dwarf_Die die, Dwarf_Error * error)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = _dwarf_internal_printlines(die, error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* No way to get error count back in this interface */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* The check is in case we are not printing full line data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe this gets some of the issues noted with .debug_line,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe but not all. Call dwarf_print_lines() to get all issues.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Intended for apps like dwarfdump.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_check_lineheader(Dwarf_Die die, int *err_count_out)