49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
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
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
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,
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*/
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*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "config.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "dwarf_incl.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <stdio.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <time.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "dwarf_line.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* FIXME Need to add prologue_end epilogue_begin isa fields. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic void
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweprint_line_header(void)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe printf
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (" s b e\n"
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe " t l s\n"
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe " m c e\n"
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe " section op col t k q\n"
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe " offset code address file line umn ? ? ?\n");
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* FIXME: print new line values: prologue_end epilogue_begin isa */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic void
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweprint_line_detail(char *prefix,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int opcode,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned address,
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 int prologue_end, int epilogue_begin, int isa)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("%-15s %2d 0x%08" DW_PR_DUx " "
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe "%2lu %4lu %2lu %1d %1d %1d\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (int) opcode,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Unsigned) address,
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);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
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 call.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe_dwarf_internal_printlines(Dwarf_Die die, Dwarf_Error * error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int * err_count_out, int only_line_header)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This pointer is used to scan the portion of the .debug_line
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe section for the current cu. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *line_ptr = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *orig_line_ptr = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe This points to the last byte of the .debug_line portion for the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe current cu. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *line_ptr_end = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Pointer to a DW_AT_stmt_list attribute in case it exists in the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe die. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Attribute stmt_list_attr = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Pointer to DW_AT_comp_dir attribute in die. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Attribute comp_dir_attr = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Pointer to name of compilation directory. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Small *comp_dir = NULL;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Offset into .debug_line specified by a DW_AT_stmt_list
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe attribute. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned line_offset = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe struct Line_Table_Prefix_s prefix;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* These are the state machine state variables. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr address = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word file = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word line = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word column = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Bool is_stmt = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Bool basic_block = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Bool end_sequence = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Bool prologue_end = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Bool epilogue_begin = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small isa = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Sword i=0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe This is the current opcode read from the statement program. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small opcode=0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
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 bytes. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word leb128_num=0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word leb128_length=0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Sword advance_line=0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half attrform = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This is the operand of the latest fixed_advance_pc extended
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe opcode. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half fixed_advance_pc=0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
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 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small* bogus_bytes_ptr = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned bogus_bytes_count = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The Dwarf_Debug this die belongs to. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Debug dbg=0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int resattr = DW_DLV_ERROR;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int lres = DW_DLV_ERROR;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = DW_DLV_ERROR;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* ***** BEGIN CODE ***** */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (error != NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *error = NULL;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe CHECK_DIE(die, DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg = die->di_cu_context->cc_dbg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (resattr != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return resattr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The list of relevant FORMs is small.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_FORM_data4, DW_FORM_data8, DW_FORM_sec_offset
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe lres = dwarf_whatform(stmt_list_attr,&attrform,error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (lres != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return lres;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (attrform != DW_FORM_data4 && attrform != DW_FORM_data8 &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attrform != DW_FORM_sec_offset ) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe lres = dwarf_global_formref(stmt_list_attr, &line_offset, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (lres != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return lres;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (line_offset >= dbg->de_debug_line.dss_size) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe orig_line_ptr = dbg->de_debug_line.dss_data;
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
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
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);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (resattr == DW_DLV_ERROR) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return resattr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (resattr == DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int cres = DW_DLV_ERROR;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char *cdir = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cres = dwarf_formstring(comp_dir_attr, &cdir, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (cres == DW_DLV_ERROR) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return cres;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (cres == DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe comp_dir = (Dwarf_Small *) cdir;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (resattr == DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_init_line_table_prefix(&prefix);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *line_ptr_out = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int dres = dwarf_read_line_table_prefix(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr,dbg->de_debug_line.dss_size - line_offset,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &line_ptr_out,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &prefix,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &bogus_bytes_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &bogus_bytes_count,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe err_count_out);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dres == DW_DLV_ERROR) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_free_line_table_prefix(&prefix);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return dres;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dres == DW_DLV_NO_ENTRY) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_free_line_table_prefix(&prefix);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return dres;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr_end = prefix.pf_line_ptr_end;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr = line_ptr_out;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(only_line_header) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Just checking for header errors, nothing more here.*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_free_line_table_prefix(&prefix);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("total line info length %ld bytes, "
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe "line offset 0x%" DW_PR_DUx " %" DW_PR_DSd "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (long) prefix.pf_total_length,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Unsigned) line_offset,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Signed) line_offset);
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 (int)prefix.pf_length_field_length,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (int)prefix.pf_prologue_length);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("compilation_directory %s\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe comp_dir ? ((char *) comp_dir) : "");
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe printf(" min instruction length %d\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (int) prefix.pf_minimum_instruction_length);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" default is stmt %d\n", (int)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_default_is_stmt);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" line base %d\n", (int)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_line_base);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" line_range %d\n", (int)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_line_range);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" opcode base %d\n", (int)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_opcode_base);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" standard opcode count %d\n", (int)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_std_op_count);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i = 1; i < prefix.pf_opcode_base; i++) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" opcode[%2d] length %d\n", (int) i,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (int) prefix.pf_opcode_length_table[i - 1]);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" include directories count %d\n", (int)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_include_directories_count);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i = 0; i < prefix.pf_include_directories_count; ++i) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" include dir[%d] %s\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (int) i, prefix.pf_include_directories[i]);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" files count %d\n", (int)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_files_count);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i = 0; i < prefix.pf_files_count; ++i) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe struct Line_Table_File_Entry_s *lfile =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_line_table_file_entries + i;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned tlm2 = lfile->lte_last_modification_time;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned di = lfile->lte_directory_index;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned fl = lfile->lte_length_of_file;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" file[%d] %s (file-number: %d) \n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (int) i, (char *) lfile->lte_filename,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (int)(i+1));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" dir index %d\n", (int) di);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe time_t tt = (time_t) tlm2;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" last time 0x%x %s", /* ctime supplies
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe newline */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (unsigned) tlm2, ctime(&tt));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" file length %ld 0x%lx\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (long) fl, (unsigned long) fl);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned offset = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(bogus_bytes_count > 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned wcount = bogus_bytes_count;
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 wcount, boffset,boffset);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *err_count_out += 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe offset = line_ptr - orig_line_ptr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" statement prog offset in section: %" DW_PR_DUu " 0x%" DW_PR_DUx "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe offset, offset);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Initialize the part of the state machine dependent on the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe is_stmt = prefix.pf_default_is_stmt;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe print_line_header();
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Start of statement program. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (line_ptr < line_ptr_end) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int type = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" [0x%06" DW_PR_DSx "] ",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Signed) (line_ptr - orig_line_ptr));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe opcode = *(Dwarf_Small *) line_ptr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* 'type' is the output */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WHAT_IS_OPCODE(type, opcode, prefix.pf_opcode_base,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_opcode_length_table, line_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_std_op_count);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (type == LOP_DISCARD) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int oc;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int opcnt = prefix.pf_opcode_length_table[opcode];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("*** DWARF CHECK: DISCARD standard opcode %d "
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe "with %d operands: "
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe "not understood.", opcode, opcnt);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *err_count_out += 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (oc = 0; oc < opcnt; oc++) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /*
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 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned utmp2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DECODE_LEB128_UWORD(line_ptr, utmp2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" %" DW_PR_DUu " (0x%" DW_PR_DUx ")",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Unsigned) utmp2,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Unsigned) utmp2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("***\n");
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* do nothing, necessary ops done */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (type == LOP_SPECIAL) {
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 char special[50];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned origop = opcode;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe opcode = opcode - prefix.pf_opcode_base;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe address = address + prefix.pf_minimum_instruction_length *
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (opcode / prefix.pf_line_range);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line + prefix.pf_line_base +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe opcode % prefix.pf_line_range;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sprintf(special, "Specialop %3u", origop);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe print_line_detail(special,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe opcode, address, (int) file, line, column,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe is_stmt, basic_block, end_sequence,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prologue_end, epilogue_begin, isa);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe basic_block = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (type == LOP_STANDARD) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe switch (opcode) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNS_copy:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe print_line_detail("DW_LNS_copy",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe opcode, address, file, line,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe column, is_stmt, basic_block,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe end_sequence, prologue_end,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe epilogue_begin, isa);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe basic_block = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNS_advance_pc:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned utmp2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DECODE_LEB128_UWORD(line_ptr, utmp2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_advance_pc val %" DW_PR_DSd " 0x%" DW_PR_DUx "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Signed) (Dwarf_Word) utmp2,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Unsigned) (Dwarf_Word) utmp2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe leb128_num = (Dwarf_Word) utmp2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe address =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe address +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_minimum_instruction_length *
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe leb128_num;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNS_advance_line:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed stmp;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DECODE_LEB128_SWORD(line_ptr, stmp);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe advance_line = (Dwarf_Sword) stmp;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_advance_line val %" DW_PR_DSd " 0x%" DW_PR_DSx "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Signed) advance_line,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Signed) advance_line);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line = line + advance_line;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNS_set_file:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned utmp2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DECODE_LEB128_UWORD(line_ptr, utmp2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe file = (Dwarf_Word) utmp2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_set_file %ld\n", (long) file);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNS_set_column:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned utmp2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DECODE_LEB128_UWORD(line_ptr, utmp2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe column = (Dwarf_Word) utmp2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_set_column val %" DW_PR_DSd " 0x%" DW_PR_DSx "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Signed) column, (Dwarf_Signed) column);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNS_negate_stmt:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe is_stmt = !is_stmt;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_negate_stmt\n");
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNS_set_basic_block:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_set_basic_block\n");
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe basic_block = true;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNS_const_add_pc:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe opcode = MAX_LINE_OP_CODE - prefix.pf_opcode_base;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe address =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe address +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.pf_minimum_instruction_length * (opcode /
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prefix.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe pf_line_range);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_const_add_pc new address 0x%" DW_PR_DSx "\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Signed) address);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNS_fixed_advance_pc:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, fixed_advance_pc, Dwarf_Half,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr, sizeof(Dwarf_Half));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr += sizeof(Dwarf_Half);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe address = address + fixed_advance_pc;
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 (Dwarf_Signed) fixed_advance_pc,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Signed) fixed_advance_pc,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Signed) address);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNS_set_prologue_end:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prologue_end = true;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_set_prologue_end set true.\n");
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* New in DWARF3 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNS_set_epilogue_begin:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe epilogue_begin = true;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_set_epilogue_begin set true.\n");
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* New in DWARF3 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNS_set_isa:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned utmp2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DECODE_LEB128_UWORD(line_ptr, utmp2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe isa = utmp2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNS_set_isa new value 0x%" DW_PR_DUx ".\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_Unsigned) utmp2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (isa != utmp2) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The value of the isa did not fit in our
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe local so we record it wrong. declare an
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_free_line_table_prefix(&prefix);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_LINE_NUM_OPERANDS_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (type == LOP_EXTENDED) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned utmp3 = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word instr_length = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small ext_opcode = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DECODE_LEB128_UWORD(line_ptr, utmp3);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe instr_length = (Dwarf_Word) utmp3;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ext_opcode = *(Dwarf_Small *) line_ptr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe switch (ext_opcode) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNE_end_sequence:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe end_sequence = true;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe print_line_detail("DW_LNE_end_sequence extended",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe opcode, address, file, line,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe column, is_stmt, basic_block,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe end_sequence, prologue_end,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe epilogue_begin, isa);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe address = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe file = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe column = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe is_stmt = prefix.pf_default_is_stmt;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe basic_block = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe end_sequence = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prologue_end = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe epilogue_begin = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNE_set_address:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, address, Dwarf_Addr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe die->di_cu_context->cc_address_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
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 (Dwarf_Unsigned) address);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNE_define_file:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned di = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned tlm = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned fl = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *fn = (Dwarf_Small *) line_ptr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr = line_ptr + strlen((char *) line_ptr) + 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe di = _dwarf_decode_u_leb128(line_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &leb128_length);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr = line_ptr + leb128_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe tlm = _dwarf_decode_u_leb128(line_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &leb128_length);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr = line_ptr + leb128_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fl = _dwarf_decode_u_leb128(line_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &leb128_length);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr = line_ptr + leb128_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNE_define_file %s \n", fn);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" dir index %d\n", (int) di);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe time_t tt3 = (time_t) tlm;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* ctime supplies newline */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" last time 0x%x %s",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (unsigned) tlm, ctime(&tt3));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" file length %ld 0x%lx\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (long) fl, (unsigned long) fl);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe default:{
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
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned remaining_bytes = instr_length -1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(instr_length < 1 || remaining_bytes > DW_LNE_LEN_MAX) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_free_line_table_prefix(&prefix);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_LINE_EXT_OPCODE_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("DW_LNE extended op 0x%x ",ext_opcode);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("Bytecount: " DW_PR_DUu , instr_length);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(remaining_bytes > 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf(" linedata: 0x");
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe while (remaining_bytes > 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("%02x",(unsigned char)(*(line_ptr)));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_ptr++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe remaining_bytes--;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("\n");
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_free_line_table_prefix(&prefix);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (DW_DLV_OK);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
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.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_print_lines(Dwarf_Die die, Dwarf_Error * error,int *error_count)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int only_line_header = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = _dwarf_internal_printlines(die, error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error_count,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe only_line_header);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_print_lines(Dwarf_Die die, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int only_line_header = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int err_count = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = _dwarf_internal_printlines(die, error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &err_count,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe only_line_header);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* No way to get error count back in this interface */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
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 Lowe*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowevoid
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_check_lineheader(Dwarf_Die die, int *err_count_out)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error err;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int only_line_header = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_internal_printlines(die, &err,err_count_out,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe only_line_header);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe