1*7fd79137SRobert Mustacchi /* 2*7fd79137SRobert Mustacchi 3*7fd79137SRobert Mustacchi Copyright (C) 2000,2002,2004,2005,2006 Silicon Graphics, Inc. All Rights Reserved. 4*7fd79137SRobert Mustacchi Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. 5*7fd79137SRobert Mustacchi 6*7fd79137SRobert Mustacchi This program is free software; you can redistribute it and/or modify it 7*7fd79137SRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License 8*7fd79137SRobert Mustacchi as published by the Free Software Foundation. 9*7fd79137SRobert Mustacchi 10*7fd79137SRobert Mustacchi This program is distributed in the hope that it would be useful, but 11*7fd79137SRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of 12*7fd79137SRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 13*7fd79137SRobert Mustacchi 14*7fd79137SRobert Mustacchi Further, this software is distributed without any warranty that it is 15*7fd79137SRobert Mustacchi free of the rightful claim of any third person regarding infringement 16*7fd79137SRobert Mustacchi or the like. Any license provided herein, whether implied or 17*7fd79137SRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if 18*7fd79137SRobert Mustacchi any, provided herein do not apply to combinations of this program with 19*7fd79137SRobert Mustacchi other software, or any other product whatsoever. 20*7fd79137SRobert Mustacchi 21*7fd79137SRobert Mustacchi You should have received a copy of the GNU Lesser General Public 22*7fd79137SRobert Mustacchi License along with this program; if not, write the Free Software 23*7fd79137SRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, 24*7fd79137SRobert Mustacchi USA. 25*7fd79137SRobert Mustacchi 26*7fd79137SRobert Mustacchi Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, 27*7fd79137SRobert Mustacchi Mountain View, CA 94043, or: 28*7fd79137SRobert Mustacchi 29*7fd79137SRobert Mustacchi http://www.sgi.com 30*7fd79137SRobert Mustacchi 31*7fd79137SRobert Mustacchi For further information regarding this notice, see: 32*7fd79137SRobert Mustacchi 33*7fd79137SRobert Mustacchi http://oss.sgi.com/projects/GenInfo/NoticeExplan 34*7fd79137SRobert Mustacchi 35*7fd79137SRobert Mustacchi */ 36*7fd79137SRobert Mustacchi /* The address of the Free Software Foundation is 37*7fd79137SRobert Mustacchi Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 38*7fd79137SRobert Mustacchi Boston, MA 02110-1301, USA. 39*7fd79137SRobert Mustacchi SGI has moved from the Crittenden Lane address. 40*7fd79137SRobert Mustacchi */ 41*7fd79137SRobert Mustacchi 42*7fd79137SRobert Mustacchi 43*7fd79137SRobert Mustacchi 44*7fd79137SRobert Mustacchi 45*7fd79137SRobert Mustacchi #include "config.h" 46*7fd79137SRobert Mustacchi #include "dwarf_incl.h" 47*7fd79137SRobert Mustacchi #include <stdio.h> 48*7fd79137SRobert Mustacchi #include <time.h> 49*7fd79137SRobert Mustacchi #include "dwarf_line.h" 50*7fd79137SRobert Mustacchi 51*7fd79137SRobert Mustacchi /* FIXME Need to add prologue_end epilogue_begin isa fields. */ 52*7fd79137SRobert Mustacchi static void 53*7fd79137SRobert Mustacchi print_line_header(void) 54*7fd79137SRobert Mustacchi { 55*7fd79137SRobert Mustacchi printf 56*7fd79137SRobert Mustacchi (" s b e\n" 57*7fd79137SRobert Mustacchi " t l s\n" 58*7fd79137SRobert Mustacchi " m c e\n" 59*7fd79137SRobert Mustacchi " section op col t k q\n" 60*7fd79137SRobert Mustacchi " offset code address file line umn ? ? ?\n"); 61*7fd79137SRobert Mustacchi } 62*7fd79137SRobert Mustacchi 63*7fd79137SRobert Mustacchi /* FIXME: print new line values: prologue_end epilogue_begin isa */ 64*7fd79137SRobert Mustacchi static void 65*7fd79137SRobert Mustacchi print_line_detail(char *prefix, 66*7fd79137SRobert Mustacchi int opcode, 67*7fd79137SRobert Mustacchi Dwarf_Unsigned address, 68*7fd79137SRobert Mustacchi unsigned long file, 69*7fd79137SRobert Mustacchi unsigned long line, 70*7fd79137SRobert Mustacchi unsigned long column, 71*7fd79137SRobert Mustacchi int is_stmt, int basic_block, int end_sequence, 72*7fd79137SRobert Mustacchi int prologue_end, int epilogue_begin, int isa) 73*7fd79137SRobert Mustacchi { 74*7fd79137SRobert Mustacchi printf("%-15s %2d 0x%08" DW_PR_DUx " " 75*7fd79137SRobert Mustacchi "%2lu %4lu %2lu %1d %1d %1d\n", 76*7fd79137SRobert Mustacchi prefix, 77*7fd79137SRobert Mustacchi (int) opcode, 78*7fd79137SRobert Mustacchi (Dwarf_Unsigned) address, 79*7fd79137SRobert Mustacchi (unsigned long) file, 80*7fd79137SRobert Mustacchi (unsigned long) line, 81*7fd79137SRobert Mustacchi (unsigned long) column, 82*7fd79137SRobert Mustacchi (int) is_stmt, (int) basic_block, (int) end_sequence); 83*7fd79137SRobert Mustacchi 84*7fd79137SRobert Mustacchi } 85*7fd79137SRobert Mustacchi 86*7fd79137SRobert Mustacchi 87*7fd79137SRobert Mustacchi /* 88*7fd79137SRobert Mustacchi return DW_DLV_OK if ok. else DW_DLV_NO_ENTRY or DW_DLV_ERROR 89*7fd79137SRobert Mustacchi If err_count_out is non-NULL, this is a special 'check' 90*7fd79137SRobert Mustacchi call. 91*7fd79137SRobert Mustacchi */ 92*7fd79137SRobert Mustacchi int 93*7fd79137SRobert Mustacchi _dwarf_internal_printlines(Dwarf_Die die, Dwarf_Error * error, 94*7fd79137SRobert Mustacchi int * err_count_out, int only_line_header) 95*7fd79137SRobert Mustacchi { 96*7fd79137SRobert Mustacchi /* 97*7fd79137SRobert Mustacchi This pointer is used to scan the portion of the .debug_line 98*7fd79137SRobert Mustacchi section for the current cu. */ 99*7fd79137SRobert Mustacchi Dwarf_Small *line_ptr = 0; 100*7fd79137SRobert Mustacchi Dwarf_Small *orig_line_ptr = 0; 101*7fd79137SRobert Mustacchi 102*7fd79137SRobert Mustacchi /* 103*7fd79137SRobert Mustacchi This points to the last byte of the .debug_line portion for the 104*7fd79137SRobert Mustacchi current cu. */ 105*7fd79137SRobert Mustacchi Dwarf_Small *line_ptr_end = 0; 106*7fd79137SRobert Mustacchi 107*7fd79137SRobert Mustacchi /* 108*7fd79137SRobert Mustacchi Pointer to a DW_AT_stmt_list attribute in case it exists in the 109*7fd79137SRobert Mustacchi die. */ 110*7fd79137SRobert Mustacchi Dwarf_Attribute stmt_list_attr = 0; 111*7fd79137SRobert Mustacchi 112*7fd79137SRobert Mustacchi /* Pointer to DW_AT_comp_dir attribute in die. */ 113*7fd79137SRobert Mustacchi Dwarf_Attribute comp_dir_attr = 0; 114*7fd79137SRobert Mustacchi 115*7fd79137SRobert Mustacchi /* Pointer to name of compilation directory. */ 116*7fd79137SRobert Mustacchi Dwarf_Small *comp_dir = NULL; 117*7fd79137SRobert Mustacchi 118*7fd79137SRobert Mustacchi /* 119*7fd79137SRobert Mustacchi Offset into .debug_line specified by a DW_AT_stmt_list 120*7fd79137SRobert Mustacchi attribute. */ 121*7fd79137SRobert Mustacchi Dwarf_Unsigned line_offset = 0; 122*7fd79137SRobert Mustacchi 123*7fd79137SRobert Mustacchi struct Line_Table_Prefix_s prefix; 124*7fd79137SRobert Mustacchi 125*7fd79137SRobert Mustacchi 126*7fd79137SRobert Mustacchi /* These are the state machine state variables. */ 127*7fd79137SRobert Mustacchi Dwarf_Addr address = 0; 128*7fd79137SRobert Mustacchi Dwarf_Word file = 1; 129*7fd79137SRobert Mustacchi Dwarf_Word line = 1; 130*7fd79137SRobert Mustacchi Dwarf_Word column = 0; 131*7fd79137SRobert Mustacchi Dwarf_Bool is_stmt = false; 132*7fd79137SRobert Mustacchi Dwarf_Bool basic_block = false; 133*7fd79137SRobert Mustacchi Dwarf_Bool end_sequence = false; 134*7fd79137SRobert Mustacchi Dwarf_Bool prologue_end = false; 135*7fd79137SRobert Mustacchi Dwarf_Bool epilogue_begin = false; 136*7fd79137SRobert Mustacchi Dwarf_Small isa = 0; 137*7fd79137SRobert Mustacchi 138*7fd79137SRobert Mustacchi 139*7fd79137SRobert Mustacchi Dwarf_Sword i=0; 140*7fd79137SRobert Mustacchi 141*7fd79137SRobert Mustacchi /* 142*7fd79137SRobert Mustacchi This is the current opcode read from the statement program. */ 143*7fd79137SRobert Mustacchi Dwarf_Small opcode=0; 144*7fd79137SRobert Mustacchi 145*7fd79137SRobert Mustacchi 146*7fd79137SRobert Mustacchi /* 147*7fd79137SRobert Mustacchi These variables are used to decode leb128 numbers. Leb128_num 148*7fd79137SRobert Mustacchi holds the decoded number, and leb128_length is its length in 149*7fd79137SRobert Mustacchi bytes. */ 150*7fd79137SRobert Mustacchi Dwarf_Word leb128_num=0; 151*7fd79137SRobert Mustacchi Dwarf_Word leb128_length=0; 152*7fd79137SRobert Mustacchi Dwarf_Sword advance_line=0; 153*7fd79137SRobert Mustacchi Dwarf_Half attrform = 0; 154*7fd79137SRobert Mustacchi /* 155*7fd79137SRobert Mustacchi This is the operand of the latest fixed_advance_pc extended 156*7fd79137SRobert Mustacchi opcode. */ 157*7fd79137SRobert Mustacchi Dwarf_Half fixed_advance_pc=0; 158*7fd79137SRobert Mustacchi 159*7fd79137SRobert Mustacchi /* In case there are wierd bytes 'after' the line table 160*7fd79137SRobert Mustacchi * prologue this lets us print something. This is a gcc 161*7fd79137SRobert Mustacchi * compiler bug and we expect the bytes count to be 12. 162*7fd79137SRobert Mustacchi */ 163*7fd79137SRobert Mustacchi Dwarf_Small* bogus_bytes_ptr = 0; 164*7fd79137SRobert Mustacchi Dwarf_Unsigned bogus_bytes_count = 0; 165*7fd79137SRobert Mustacchi 166*7fd79137SRobert Mustacchi 167*7fd79137SRobert Mustacchi /* The Dwarf_Debug this die belongs to. */ 168*7fd79137SRobert Mustacchi Dwarf_Debug dbg=0; 169*7fd79137SRobert Mustacchi int resattr = DW_DLV_ERROR; 170*7fd79137SRobert Mustacchi int lres = DW_DLV_ERROR; 171*7fd79137SRobert Mustacchi int res = DW_DLV_ERROR; 172*7fd79137SRobert Mustacchi 173*7fd79137SRobert Mustacchi /* ***** BEGIN CODE ***** */ 174*7fd79137SRobert Mustacchi 175*7fd79137SRobert Mustacchi if (error != NULL) { 176*7fd79137SRobert Mustacchi *error = NULL; 177*7fd79137SRobert Mustacchi } 178*7fd79137SRobert Mustacchi 179*7fd79137SRobert Mustacchi CHECK_DIE(die, DW_DLV_ERROR); 180*7fd79137SRobert Mustacchi dbg = die->di_cu_context->cc_dbg; 181*7fd79137SRobert Mustacchi 182*7fd79137SRobert Mustacchi res = _dwarf_load_section(dbg, &dbg->de_debug_line,error); 183*7fd79137SRobert Mustacchi if (res != DW_DLV_OK) { 184*7fd79137SRobert Mustacchi return res; 185*7fd79137SRobert Mustacchi } 186*7fd79137SRobert Mustacchi 187*7fd79137SRobert Mustacchi resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error); 188*7fd79137SRobert Mustacchi if (resattr != DW_DLV_OK) { 189*7fd79137SRobert Mustacchi return resattr; 190*7fd79137SRobert Mustacchi } 191*7fd79137SRobert Mustacchi 192*7fd79137SRobert Mustacchi 193*7fd79137SRobert Mustacchi /* The list of relevant FORMs is small. 194*7fd79137SRobert Mustacchi DW_FORM_data4, DW_FORM_data8, DW_FORM_sec_offset 195*7fd79137SRobert Mustacchi */ 196*7fd79137SRobert Mustacchi lres = dwarf_whatform(stmt_list_attr,&attrform,error); 197*7fd79137SRobert Mustacchi if (lres != DW_DLV_OK) { 198*7fd79137SRobert Mustacchi return lres; 199*7fd79137SRobert Mustacchi } 200*7fd79137SRobert Mustacchi if (attrform != DW_FORM_data4 && attrform != DW_FORM_data8 && 201*7fd79137SRobert Mustacchi attrform != DW_FORM_sec_offset ) { 202*7fd79137SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD); 203*7fd79137SRobert Mustacchi return (DW_DLV_ERROR); 204*7fd79137SRobert Mustacchi } 205*7fd79137SRobert Mustacchi lres = dwarf_global_formref(stmt_list_attr, &line_offset, error); 206*7fd79137SRobert Mustacchi if (lres != DW_DLV_OK) { 207*7fd79137SRobert Mustacchi return lres; 208*7fd79137SRobert Mustacchi } 209*7fd79137SRobert Mustacchi 210*7fd79137SRobert Mustacchi if (line_offset >= dbg->de_debug_line.dss_size) { 211*7fd79137SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD); 212*7fd79137SRobert Mustacchi return (DW_DLV_ERROR); 213*7fd79137SRobert Mustacchi } 214*7fd79137SRobert Mustacchi orig_line_ptr = dbg->de_debug_line.dss_data; 215*7fd79137SRobert Mustacchi line_ptr = dbg->de_debug_line.dss_data + line_offset; 216*7fd79137SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR); 217*7fd79137SRobert Mustacchi 218*7fd79137SRobert Mustacchi /* 219*7fd79137SRobert Mustacchi If die has DW_AT_comp_dir attribute, get the string that names 220*7fd79137SRobert Mustacchi the compilation directory. */ 221*7fd79137SRobert Mustacchi resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error); 222*7fd79137SRobert Mustacchi if (resattr == DW_DLV_ERROR) { 223*7fd79137SRobert Mustacchi return resattr; 224*7fd79137SRobert Mustacchi } 225*7fd79137SRobert Mustacchi if (resattr == DW_DLV_OK) { 226*7fd79137SRobert Mustacchi int cres = DW_DLV_ERROR; 227*7fd79137SRobert Mustacchi char *cdir = 0; 228*7fd79137SRobert Mustacchi 229*7fd79137SRobert Mustacchi cres = dwarf_formstring(comp_dir_attr, &cdir, error); 230*7fd79137SRobert Mustacchi if (cres == DW_DLV_ERROR) { 231*7fd79137SRobert Mustacchi return cres; 232*7fd79137SRobert Mustacchi } else if (cres == DW_DLV_OK) { 233*7fd79137SRobert Mustacchi comp_dir = (Dwarf_Small *) cdir; 234*7fd79137SRobert Mustacchi } 235*7fd79137SRobert Mustacchi } 236*7fd79137SRobert Mustacchi if (resattr == DW_DLV_OK) { 237*7fd79137SRobert Mustacchi dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR); 238*7fd79137SRobert Mustacchi } 239*7fd79137SRobert Mustacchi 240*7fd79137SRobert Mustacchi dwarf_init_line_table_prefix(&prefix); 241*7fd79137SRobert Mustacchi { 242*7fd79137SRobert Mustacchi Dwarf_Small *line_ptr_out = 0; 243*7fd79137SRobert Mustacchi int dres = dwarf_read_line_table_prefix(dbg, 244*7fd79137SRobert Mustacchi line_ptr,dbg->de_debug_line.dss_size - line_offset, 245*7fd79137SRobert Mustacchi &line_ptr_out, 246*7fd79137SRobert Mustacchi &prefix, 247*7fd79137SRobert Mustacchi &bogus_bytes_ptr, 248*7fd79137SRobert Mustacchi &bogus_bytes_count, 249*7fd79137SRobert Mustacchi error, 250*7fd79137SRobert Mustacchi err_count_out); 251*7fd79137SRobert Mustacchi if (dres == DW_DLV_ERROR) { 252*7fd79137SRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 253*7fd79137SRobert Mustacchi return dres; 254*7fd79137SRobert Mustacchi } 255*7fd79137SRobert Mustacchi if (dres == DW_DLV_NO_ENTRY) { 256*7fd79137SRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 257*7fd79137SRobert Mustacchi return dres; 258*7fd79137SRobert Mustacchi } 259*7fd79137SRobert Mustacchi line_ptr_end = prefix.pf_line_ptr_end; 260*7fd79137SRobert Mustacchi line_ptr = line_ptr_out; 261*7fd79137SRobert Mustacchi } 262*7fd79137SRobert Mustacchi if(only_line_header) { 263*7fd79137SRobert Mustacchi /* Just checking for header errors, nothing more here.*/ 264*7fd79137SRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 265*7fd79137SRobert Mustacchi return DW_DLV_OK; 266*7fd79137SRobert Mustacchi } 267*7fd79137SRobert Mustacchi 268*7fd79137SRobert Mustacchi 269*7fd79137SRobert Mustacchi printf("total line info length %ld bytes, " 270*7fd79137SRobert Mustacchi "line offset 0x%" DW_PR_DUx " %" DW_PR_DSd "\n", 271*7fd79137SRobert Mustacchi (long) prefix.pf_total_length, 272*7fd79137SRobert Mustacchi (Dwarf_Unsigned) line_offset, 273*7fd79137SRobert Mustacchi (Dwarf_Signed) line_offset); 274*7fd79137SRobert Mustacchi printf("line table version %d\n",(int) prefix.pf_version); 275*7fd79137SRobert Mustacchi printf("line table length field length %d prologue length %d\n", 276*7fd79137SRobert Mustacchi (int)prefix.pf_length_field_length, 277*7fd79137SRobert Mustacchi (int)prefix.pf_prologue_length); 278*7fd79137SRobert Mustacchi printf("compilation_directory %s\n", 279*7fd79137SRobert Mustacchi comp_dir ? ((char *) comp_dir) : ""); 280*7fd79137SRobert Mustacchi 281*7fd79137SRobert Mustacchi printf(" min instruction length %d\n", 282*7fd79137SRobert Mustacchi (int) prefix.pf_minimum_instruction_length); 283*7fd79137SRobert Mustacchi printf(" default is stmt %d\n", (int) 284*7fd79137SRobert Mustacchi prefix.pf_default_is_stmt); 285*7fd79137SRobert Mustacchi printf(" line base %d\n", (int) 286*7fd79137SRobert Mustacchi prefix.pf_line_base); 287*7fd79137SRobert Mustacchi printf(" line_range %d\n", (int) 288*7fd79137SRobert Mustacchi prefix.pf_line_range); 289*7fd79137SRobert Mustacchi printf(" opcode base %d\n", (int) 290*7fd79137SRobert Mustacchi prefix.pf_opcode_base); 291*7fd79137SRobert Mustacchi printf(" standard opcode count %d\n", (int) 292*7fd79137SRobert Mustacchi prefix.pf_std_op_count); 293*7fd79137SRobert Mustacchi 294*7fd79137SRobert Mustacchi for (i = 1; i < prefix.pf_opcode_base; i++) { 295*7fd79137SRobert Mustacchi printf(" opcode[%2d] length %d\n", (int) i, 296*7fd79137SRobert Mustacchi (int) prefix.pf_opcode_length_table[i - 1]); 297*7fd79137SRobert Mustacchi } 298*7fd79137SRobert Mustacchi printf(" include directories count %d\n", (int) 299*7fd79137SRobert Mustacchi prefix.pf_include_directories_count); 300*7fd79137SRobert Mustacchi 301*7fd79137SRobert Mustacchi 302*7fd79137SRobert Mustacchi for (i = 0; i < prefix.pf_include_directories_count; ++i) { 303*7fd79137SRobert Mustacchi printf(" include dir[%d] %s\n", 304*7fd79137SRobert Mustacchi (int) i, prefix.pf_include_directories[i]); 305*7fd79137SRobert Mustacchi } 306*7fd79137SRobert Mustacchi printf(" files count %d\n", (int) 307*7fd79137SRobert Mustacchi prefix.pf_files_count); 308*7fd79137SRobert Mustacchi 309*7fd79137SRobert Mustacchi for (i = 0; i < prefix.pf_files_count; ++i) { 310*7fd79137SRobert Mustacchi struct Line_Table_File_Entry_s *lfile = 311*7fd79137SRobert Mustacchi prefix.pf_line_table_file_entries + i; 312*7fd79137SRobert Mustacchi 313*7fd79137SRobert Mustacchi Dwarf_Unsigned tlm2 = lfile->lte_last_modification_time; 314*7fd79137SRobert Mustacchi Dwarf_Unsigned di = lfile->lte_directory_index; 315*7fd79137SRobert Mustacchi Dwarf_Unsigned fl = lfile->lte_length_of_file; 316*7fd79137SRobert Mustacchi 317*7fd79137SRobert Mustacchi printf(" file[%d] %s (file-number: %d) \n", 318*7fd79137SRobert Mustacchi (int) i, (char *) lfile->lte_filename, 319*7fd79137SRobert Mustacchi (int)(i+1)); 320*7fd79137SRobert Mustacchi 321*7fd79137SRobert Mustacchi printf(" dir index %d\n", (int) di); 322*7fd79137SRobert Mustacchi { 323*7fd79137SRobert Mustacchi time_t tt = (time_t) tlm2; 324*7fd79137SRobert Mustacchi 325*7fd79137SRobert Mustacchi printf(" last time 0x%x %s", /* ctime supplies 326*7fd79137SRobert Mustacchi newline */ 327*7fd79137SRobert Mustacchi (unsigned) tlm2, ctime(&tt)); 328*7fd79137SRobert Mustacchi } 329*7fd79137SRobert Mustacchi printf(" file length %ld 0x%lx\n", 330*7fd79137SRobert Mustacchi (long) fl, (unsigned long) fl); 331*7fd79137SRobert Mustacchi 332*7fd79137SRobert Mustacchi 333*7fd79137SRobert Mustacchi } 334*7fd79137SRobert Mustacchi 335*7fd79137SRobert Mustacchi 336*7fd79137SRobert Mustacchi { 337*7fd79137SRobert Mustacchi Dwarf_Unsigned offset = 0; 338*7fd79137SRobert Mustacchi if(bogus_bytes_count > 0) { 339*7fd79137SRobert Mustacchi Dwarf_Unsigned wcount = bogus_bytes_count; 340*7fd79137SRobert Mustacchi Dwarf_Unsigned boffset = bogus_bytes_ptr - orig_line_ptr; 341*7fd79137SRobert Mustacchi printf("*** DWARF CHECK: the line table prologue header_length " 342*7fd79137SRobert Mustacchi " is %" DW_PR_DUu " too high, we pretend it is smaller." 343*7fd79137SRobert Mustacchi "Section offset: %" DW_PR_DUu " (0x%" DW_PR_DUx ") ***\n", 344*7fd79137SRobert Mustacchi wcount, boffset,boffset); 345*7fd79137SRobert Mustacchi *err_count_out += 1; 346*7fd79137SRobert Mustacchi } 347*7fd79137SRobert Mustacchi offset = line_ptr - orig_line_ptr; 348*7fd79137SRobert Mustacchi 349*7fd79137SRobert Mustacchi printf(" statement prog offset in section: %" DW_PR_DUu " 0x%" DW_PR_DUx "\n", 350*7fd79137SRobert Mustacchi offset, offset); 351*7fd79137SRobert Mustacchi } 352*7fd79137SRobert Mustacchi 353*7fd79137SRobert Mustacchi /* Initialize the part of the state machine dependent on the 354*7fd79137SRobert Mustacchi prefix. */ 355*7fd79137SRobert Mustacchi is_stmt = prefix.pf_default_is_stmt; 356*7fd79137SRobert Mustacchi 357*7fd79137SRobert Mustacchi 358*7fd79137SRobert Mustacchi print_line_header(); 359*7fd79137SRobert Mustacchi /* Start of statement program. */ 360*7fd79137SRobert Mustacchi while (line_ptr < line_ptr_end) { 361*7fd79137SRobert Mustacchi int type = 0; 362*7fd79137SRobert Mustacchi 363*7fd79137SRobert Mustacchi printf(" [0x%06" DW_PR_DSx "] ", 364*7fd79137SRobert Mustacchi (Dwarf_Signed) (line_ptr - orig_line_ptr)); 365*7fd79137SRobert Mustacchi opcode = *(Dwarf_Small *) line_ptr; 366*7fd79137SRobert Mustacchi line_ptr++; 367*7fd79137SRobert Mustacchi /* 'type' is the output */ 368*7fd79137SRobert Mustacchi WHAT_IS_OPCODE(type, opcode, prefix.pf_opcode_base, 369*7fd79137SRobert Mustacchi prefix.pf_opcode_length_table, line_ptr, 370*7fd79137SRobert Mustacchi prefix.pf_std_op_count); 371*7fd79137SRobert Mustacchi 372*7fd79137SRobert Mustacchi if (type == LOP_DISCARD) { 373*7fd79137SRobert Mustacchi int oc; 374*7fd79137SRobert Mustacchi int opcnt = prefix.pf_opcode_length_table[opcode]; 375*7fd79137SRobert Mustacchi 376*7fd79137SRobert Mustacchi printf("*** DWARF CHECK: DISCARD standard opcode %d " 377*7fd79137SRobert Mustacchi "with %d operands: " 378*7fd79137SRobert Mustacchi "not understood.", opcode, opcnt); 379*7fd79137SRobert Mustacchi *err_count_out += 1; 380*7fd79137SRobert Mustacchi for (oc = 0; oc < opcnt; oc++) { 381*7fd79137SRobert Mustacchi /* 382*7fd79137SRobert Mustacchi * Read and discard operands we don't 383*7fd79137SRobert Mustacchi * understand. 384*7fd79137SRobert Mustacchi * Arbitrary choice of unsigned read. 385*7fd79137SRobert Mustacchi * Signed read would work as well. 386*7fd79137SRobert Mustacchi */ 387*7fd79137SRobert Mustacchi Dwarf_Unsigned utmp2; 388*7fd79137SRobert Mustacchi 389*7fd79137SRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2); 390*7fd79137SRobert Mustacchi printf(" %" DW_PR_DUu " (0x%" DW_PR_DUx ")", 391*7fd79137SRobert Mustacchi (Dwarf_Unsigned) utmp2, 392*7fd79137SRobert Mustacchi (Dwarf_Unsigned) utmp2); 393*7fd79137SRobert Mustacchi } 394*7fd79137SRobert Mustacchi 395*7fd79137SRobert Mustacchi printf("***\n"); 396*7fd79137SRobert Mustacchi /* do nothing, necessary ops done */ 397*7fd79137SRobert Mustacchi } else if (type == LOP_SPECIAL) { 398*7fd79137SRobert Mustacchi /* This op code is a special op in the object, no matter 399*7fd79137SRobert Mustacchi that it might fall into the standard op range in this 400*7fd79137SRobert Mustacchi compile Thatis, these are special opcodes between 401*7fd79137SRobert Mustacchi special_opcode_base and MAX_LINE_OP_CODE. (including 402*7fd79137SRobert Mustacchi special_opcode_base and MAX_LINE_OP_CODE) */ 403*7fd79137SRobert Mustacchi char special[50]; 404*7fd79137SRobert Mustacchi unsigned origop = opcode; 405*7fd79137SRobert Mustacchi 406*7fd79137SRobert Mustacchi opcode = opcode - prefix.pf_opcode_base; 407*7fd79137SRobert Mustacchi address = address + prefix.pf_minimum_instruction_length * 408*7fd79137SRobert Mustacchi (opcode / prefix.pf_line_range); 409*7fd79137SRobert Mustacchi line = 410*7fd79137SRobert Mustacchi line + prefix.pf_line_base + 411*7fd79137SRobert Mustacchi opcode % prefix.pf_line_range; 412*7fd79137SRobert Mustacchi 413*7fd79137SRobert Mustacchi sprintf(special, "Specialop %3u", origop); 414*7fd79137SRobert Mustacchi print_line_detail(special, 415*7fd79137SRobert Mustacchi opcode, address, (int) file, line, column, 416*7fd79137SRobert Mustacchi is_stmt, basic_block, end_sequence, 417*7fd79137SRobert Mustacchi prologue_end, epilogue_begin, isa); 418*7fd79137SRobert Mustacchi 419*7fd79137SRobert Mustacchi basic_block = false; 420*7fd79137SRobert Mustacchi 421*7fd79137SRobert Mustacchi } else if (type == LOP_STANDARD) { 422*7fd79137SRobert Mustacchi switch (opcode) { 423*7fd79137SRobert Mustacchi 424*7fd79137SRobert Mustacchi case DW_LNS_copy:{ 425*7fd79137SRobert Mustacchi 426*7fd79137SRobert Mustacchi print_line_detail("DW_LNS_copy", 427*7fd79137SRobert Mustacchi opcode, address, file, line, 428*7fd79137SRobert Mustacchi column, is_stmt, basic_block, 429*7fd79137SRobert Mustacchi end_sequence, prologue_end, 430*7fd79137SRobert Mustacchi epilogue_begin, isa); 431*7fd79137SRobert Mustacchi 432*7fd79137SRobert Mustacchi basic_block = false; 433*7fd79137SRobert Mustacchi break; 434*7fd79137SRobert Mustacchi } 435*7fd79137SRobert Mustacchi 436*7fd79137SRobert Mustacchi case DW_LNS_advance_pc:{ 437*7fd79137SRobert Mustacchi Dwarf_Unsigned utmp2; 438*7fd79137SRobert Mustacchi 439*7fd79137SRobert Mustacchi 440*7fd79137SRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2); 441*7fd79137SRobert Mustacchi printf("DW_LNS_advance_pc val %" DW_PR_DSd " 0x%" DW_PR_DUx "\n", 442*7fd79137SRobert Mustacchi (Dwarf_Signed) (Dwarf_Word) utmp2, 443*7fd79137SRobert Mustacchi (Dwarf_Unsigned) (Dwarf_Word) utmp2); 444*7fd79137SRobert Mustacchi leb128_num = (Dwarf_Word) utmp2; 445*7fd79137SRobert Mustacchi address = 446*7fd79137SRobert Mustacchi address + 447*7fd79137SRobert Mustacchi prefix.pf_minimum_instruction_length * 448*7fd79137SRobert Mustacchi leb128_num; 449*7fd79137SRobert Mustacchi break; 450*7fd79137SRobert Mustacchi } 451*7fd79137SRobert Mustacchi 452*7fd79137SRobert Mustacchi case DW_LNS_advance_line:{ 453*7fd79137SRobert Mustacchi Dwarf_Signed stmp; 454*7fd79137SRobert Mustacchi 455*7fd79137SRobert Mustacchi 456*7fd79137SRobert Mustacchi DECODE_LEB128_SWORD(line_ptr, stmp); 457*7fd79137SRobert Mustacchi advance_line = (Dwarf_Sword) stmp; 458*7fd79137SRobert Mustacchi printf("DW_LNS_advance_line val %" DW_PR_DSd " 0x%" DW_PR_DSx "\n", 459*7fd79137SRobert Mustacchi (Dwarf_Signed) advance_line, 460*7fd79137SRobert Mustacchi (Dwarf_Signed) advance_line); 461*7fd79137SRobert Mustacchi line = line + advance_line; 462*7fd79137SRobert Mustacchi break; 463*7fd79137SRobert Mustacchi } 464*7fd79137SRobert Mustacchi 465*7fd79137SRobert Mustacchi case DW_LNS_set_file:{ 466*7fd79137SRobert Mustacchi Dwarf_Unsigned utmp2; 467*7fd79137SRobert Mustacchi 468*7fd79137SRobert Mustacchi 469*7fd79137SRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2); 470*7fd79137SRobert Mustacchi file = (Dwarf_Word) utmp2; 471*7fd79137SRobert Mustacchi printf("DW_LNS_set_file %ld\n", (long) file); 472*7fd79137SRobert Mustacchi break; 473*7fd79137SRobert Mustacchi } 474*7fd79137SRobert Mustacchi 475*7fd79137SRobert Mustacchi case DW_LNS_set_column:{ 476*7fd79137SRobert Mustacchi Dwarf_Unsigned utmp2; 477*7fd79137SRobert Mustacchi 478*7fd79137SRobert Mustacchi 479*7fd79137SRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2); 480*7fd79137SRobert Mustacchi column = (Dwarf_Word) utmp2; 481*7fd79137SRobert Mustacchi printf("DW_LNS_set_column val %" DW_PR_DSd " 0x%" DW_PR_DSx "\n", 482*7fd79137SRobert Mustacchi (Dwarf_Signed) column, (Dwarf_Signed) column); 483*7fd79137SRobert Mustacchi break; 484*7fd79137SRobert Mustacchi } 485*7fd79137SRobert Mustacchi 486*7fd79137SRobert Mustacchi case DW_LNS_negate_stmt:{ 487*7fd79137SRobert Mustacchi is_stmt = !is_stmt; 488*7fd79137SRobert Mustacchi printf("DW_LNS_negate_stmt\n"); 489*7fd79137SRobert Mustacchi break; 490*7fd79137SRobert Mustacchi } 491*7fd79137SRobert Mustacchi 492*7fd79137SRobert Mustacchi case DW_LNS_set_basic_block:{ 493*7fd79137SRobert Mustacchi 494*7fd79137SRobert Mustacchi printf("DW_LNS_set_basic_block\n"); 495*7fd79137SRobert Mustacchi basic_block = true; 496*7fd79137SRobert Mustacchi break; 497*7fd79137SRobert Mustacchi } 498*7fd79137SRobert Mustacchi 499*7fd79137SRobert Mustacchi case DW_LNS_const_add_pc:{ 500*7fd79137SRobert Mustacchi opcode = MAX_LINE_OP_CODE - prefix.pf_opcode_base; 501*7fd79137SRobert Mustacchi address = 502*7fd79137SRobert Mustacchi address + 503*7fd79137SRobert Mustacchi prefix.pf_minimum_instruction_length * (opcode / 504*7fd79137SRobert Mustacchi prefix. 505*7fd79137SRobert Mustacchi pf_line_range); 506*7fd79137SRobert Mustacchi 507*7fd79137SRobert Mustacchi printf("DW_LNS_const_add_pc new address 0x%" DW_PR_DSx "\n", 508*7fd79137SRobert Mustacchi (Dwarf_Signed) address); 509*7fd79137SRobert Mustacchi break; 510*7fd79137SRobert Mustacchi } 511*7fd79137SRobert Mustacchi 512*7fd79137SRobert Mustacchi case DW_LNS_fixed_advance_pc:{ 513*7fd79137SRobert Mustacchi 514*7fd79137SRobert Mustacchi READ_UNALIGNED(dbg, fixed_advance_pc, Dwarf_Half, 515*7fd79137SRobert Mustacchi line_ptr, sizeof(Dwarf_Half)); 516*7fd79137SRobert Mustacchi line_ptr += sizeof(Dwarf_Half); 517*7fd79137SRobert Mustacchi address = address + fixed_advance_pc; 518*7fd79137SRobert Mustacchi printf("DW_LNS_fixed_advance_pc val %" DW_PR_DSd 519*7fd79137SRobert Mustacchi " 0x%" DW_PR_DSx " new address 0x%" DW_PR_DSx "\n", 520*7fd79137SRobert Mustacchi (Dwarf_Signed) fixed_advance_pc, 521*7fd79137SRobert Mustacchi (Dwarf_Signed) fixed_advance_pc, 522*7fd79137SRobert Mustacchi (Dwarf_Signed) address); 523*7fd79137SRobert Mustacchi break; 524*7fd79137SRobert Mustacchi } 525*7fd79137SRobert Mustacchi case DW_LNS_set_prologue_end:{ 526*7fd79137SRobert Mustacchi 527*7fd79137SRobert Mustacchi prologue_end = true; 528*7fd79137SRobert Mustacchi printf("DW_LNS_set_prologue_end set true.\n"); 529*7fd79137SRobert Mustacchi break; 530*7fd79137SRobert Mustacchi 531*7fd79137SRobert Mustacchi 532*7fd79137SRobert Mustacchi } 533*7fd79137SRobert Mustacchi /* New in DWARF3 */ 534*7fd79137SRobert Mustacchi case DW_LNS_set_epilogue_begin:{ 535*7fd79137SRobert Mustacchi epilogue_begin = true; 536*7fd79137SRobert Mustacchi printf("DW_LNS_set_epilogue_begin set true.\n"); 537*7fd79137SRobert Mustacchi break; 538*7fd79137SRobert Mustacchi } 539*7fd79137SRobert Mustacchi 540*7fd79137SRobert Mustacchi /* New in DWARF3 */ 541*7fd79137SRobert Mustacchi case DW_LNS_set_isa:{ 542*7fd79137SRobert Mustacchi Dwarf_Unsigned utmp2; 543*7fd79137SRobert Mustacchi 544*7fd79137SRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2); 545*7fd79137SRobert Mustacchi isa = utmp2; 546*7fd79137SRobert Mustacchi printf("DW_LNS_set_isa new value 0x%" DW_PR_DUx ".\n", 547*7fd79137SRobert Mustacchi (Dwarf_Unsigned) utmp2); 548*7fd79137SRobert Mustacchi if (isa != utmp2) { 549*7fd79137SRobert Mustacchi /* The value of the isa did not fit in our 550*7fd79137SRobert Mustacchi local so we record it wrong. declare an 551*7fd79137SRobert Mustacchi error. */ 552*7fd79137SRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 553*7fd79137SRobert Mustacchi 554*7fd79137SRobert Mustacchi _dwarf_error(dbg, error, 555*7fd79137SRobert Mustacchi DW_DLE_LINE_NUM_OPERANDS_BAD); 556*7fd79137SRobert Mustacchi return (DW_DLV_ERROR); 557*7fd79137SRobert Mustacchi } 558*7fd79137SRobert Mustacchi break; 559*7fd79137SRobert Mustacchi } 560*7fd79137SRobert Mustacchi } 561*7fd79137SRobert Mustacchi 562*7fd79137SRobert Mustacchi 563*7fd79137SRobert Mustacchi } else if (type == LOP_EXTENDED) { 564*7fd79137SRobert Mustacchi Dwarf_Unsigned utmp3 = 0; 565*7fd79137SRobert Mustacchi Dwarf_Word instr_length = 0; 566*7fd79137SRobert Mustacchi Dwarf_Small ext_opcode = 0; 567*7fd79137SRobert Mustacchi 568*7fd79137SRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp3); 569*7fd79137SRobert Mustacchi instr_length = (Dwarf_Word) utmp3; 570*7fd79137SRobert Mustacchi ext_opcode = *(Dwarf_Small *) line_ptr; 571*7fd79137SRobert Mustacchi line_ptr++; 572*7fd79137SRobert Mustacchi switch (ext_opcode) { 573*7fd79137SRobert Mustacchi 574*7fd79137SRobert Mustacchi case DW_LNE_end_sequence:{ 575*7fd79137SRobert Mustacchi end_sequence = true; 576*7fd79137SRobert Mustacchi 577*7fd79137SRobert Mustacchi print_line_detail("DW_LNE_end_sequence extended", 578*7fd79137SRobert Mustacchi opcode, address, file, line, 579*7fd79137SRobert Mustacchi column, is_stmt, basic_block, 580*7fd79137SRobert Mustacchi end_sequence, prologue_end, 581*7fd79137SRobert Mustacchi epilogue_begin, isa); 582*7fd79137SRobert Mustacchi 583*7fd79137SRobert Mustacchi address = 0; 584*7fd79137SRobert Mustacchi file = 1; 585*7fd79137SRobert Mustacchi line = 1; 586*7fd79137SRobert Mustacchi column = 0; 587*7fd79137SRobert Mustacchi is_stmt = prefix.pf_default_is_stmt; 588*7fd79137SRobert Mustacchi basic_block = false; 589*7fd79137SRobert Mustacchi end_sequence = false; 590*7fd79137SRobert Mustacchi prologue_end = false; 591*7fd79137SRobert Mustacchi epilogue_begin = false; 592*7fd79137SRobert Mustacchi 593*7fd79137SRobert Mustacchi 594*7fd79137SRobert Mustacchi break; 595*7fd79137SRobert Mustacchi } 596*7fd79137SRobert Mustacchi 597*7fd79137SRobert Mustacchi case DW_LNE_set_address:{ 598*7fd79137SRobert Mustacchi { 599*7fd79137SRobert Mustacchi READ_UNALIGNED(dbg, address, Dwarf_Addr, 600*7fd79137SRobert Mustacchi line_ptr, 601*7fd79137SRobert Mustacchi die->di_cu_context->cc_address_size); 602*7fd79137SRobert Mustacchi 603*7fd79137SRobert Mustacchi line_ptr += die->di_cu_context->cc_address_size; 604*7fd79137SRobert Mustacchi printf("DW_LNE_set_address address 0x%" DW_PR_DUx "\n", 605*7fd79137SRobert Mustacchi (Dwarf_Unsigned) address); 606*7fd79137SRobert Mustacchi } 607*7fd79137SRobert Mustacchi 608*7fd79137SRobert Mustacchi break; 609*7fd79137SRobert Mustacchi } 610*7fd79137SRobert Mustacchi 611*7fd79137SRobert Mustacchi case DW_LNE_define_file:{ 612*7fd79137SRobert Mustacchi Dwarf_Unsigned di = 0; 613*7fd79137SRobert Mustacchi Dwarf_Unsigned tlm = 0; 614*7fd79137SRobert Mustacchi Dwarf_Unsigned fl = 0; 615*7fd79137SRobert Mustacchi 616*7fd79137SRobert Mustacchi Dwarf_Small *fn = (Dwarf_Small *) line_ptr; 617*7fd79137SRobert Mustacchi line_ptr = line_ptr + strlen((char *) line_ptr) + 1; 618*7fd79137SRobert Mustacchi 619*7fd79137SRobert Mustacchi di = _dwarf_decode_u_leb128(line_ptr, 620*7fd79137SRobert Mustacchi &leb128_length); 621*7fd79137SRobert Mustacchi line_ptr = line_ptr + leb128_length; 622*7fd79137SRobert Mustacchi 623*7fd79137SRobert Mustacchi tlm = _dwarf_decode_u_leb128(line_ptr, 624*7fd79137SRobert Mustacchi &leb128_length); 625*7fd79137SRobert Mustacchi line_ptr = line_ptr + leb128_length; 626*7fd79137SRobert Mustacchi 627*7fd79137SRobert Mustacchi fl = _dwarf_decode_u_leb128(line_ptr, 628*7fd79137SRobert Mustacchi &leb128_length); 629*7fd79137SRobert Mustacchi line_ptr = line_ptr + leb128_length; 630*7fd79137SRobert Mustacchi 631*7fd79137SRobert Mustacchi 632*7fd79137SRobert Mustacchi printf("DW_LNE_define_file %s \n", fn); 633*7fd79137SRobert Mustacchi printf(" dir index %d\n", (int) di); 634*7fd79137SRobert Mustacchi { 635*7fd79137SRobert Mustacchi time_t tt3 = (time_t) tlm; 636*7fd79137SRobert Mustacchi 637*7fd79137SRobert Mustacchi /* ctime supplies newline */ 638*7fd79137SRobert Mustacchi printf(" last time 0x%x %s", 639*7fd79137SRobert Mustacchi (unsigned) tlm, ctime(&tt3)); 640*7fd79137SRobert Mustacchi } 641*7fd79137SRobert Mustacchi printf(" file length %ld 0x%lx\n", 642*7fd79137SRobert Mustacchi (long) fl, (unsigned long) fl); 643*7fd79137SRobert Mustacchi 644*7fd79137SRobert Mustacchi break; 645*7fd79137SRobert Mustacchi } 646*7fd79137SRobert Mustacchi 647*7fd79137SRobert Mustacchi default:{ 648*7fd79137SRobert Mustacchi /* This is an extended op code we do not know about, 649*7fd79137SRobert Mustacchi other than we know now many bytes it is 650*7fd79137SRobert Mustacchi (and the op code and the bytes of operand). */ 651*7fd79137SRobert Mustacchi 652*7fd79137SRobert Mustacchi Dwarf_Unsigned remaining_bytes = instr_length -1; 653*7fd79137SRobert Mustacchi if(instr_length < 1 || remaining_bytes > DW_LNE_LEN_MAX) { 654*7fd79137SRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 655*7fd79137SRobert Mustacchi _dwarf_error(dbg, error, 656*7fd79137SRobert Mustacchi DW_DLE_LINE_EXT_OPCODE_BAD); 657*7fd79137SRobert Mustacchi return (DW_DLV_ERROR); 658*7fd79137SRobert Mustacchi } 659*7fd79137SRobert Mustacchi printf("DW_LNE extended op 0x%x ",ext_opcode); 660*7fd79137SRobert Mustacchi printf("Bytecount: " DW_PR_DUu , instr_length); 661*7fd79137SRobert Mustacchi if(remaining_bytes > 0) { 662*7fd79137SRobert Mustacchi printf(" linedata: 0x"); 663*7fd79137SRobert Mustacchi while (remaining_bytes > 0) { 664*7fd79137SRobert Mustacchi printf("%02x",(unsigned char)(*(line_ptr))); 665*7fd79137SRobert Mustacchi line_ptr++; 666*7fd79137SRobert Mustacchi remaining_bytes--; 667*7fd79137SRobert Mustacchi } 668*7fd79137SRobert Mustacchi } 669*7fd79137SRobert Mustacchi printf("\n"); 670*7fd79137SRobert Mustacchi } 671*7fd79137SRobert Mustacchi break; 672*7fd79137SRobert Mustacchi } 673*7fd79137SRobert Mustacchi 674*7fd79137SRobert Mustacchi } 675*7fd79137SRobert Mustacchi } 676*7fd79137SRobert Mustacchi 677*7fd79137SRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 678*7fd79137SRobert Mustacchi return (DW_DLV_OK); 679*7fd79137SRobert Mustacchi } 680*7fd79137SRobert Mustacchi 681*7fd79137SRobert Mustacchi /* 682*7fd79137SRobert Mustacchi This is support for dwarfdump: making it possible 683*7fd79137SRobert Mustacchi for clients wanting line detail info on stdout 684*7fd79137SRobert Mustacchi to get that detail without including internal libdwarf 685*7fd79137SRobert Mustacchi header information. 686*7fd79137SRobert Mustacchi Caller passes in compilation unit DIE. 687*7fd79137SRobert Mustacchi The _dwarf_ version is obsolete (though supported for 688*7fd79137SRobert Mustacchi compatibility). 689*7fd79137SRobert Mustacchi The dwarf_ version is preferred. 690*7fd79137SRobert Mustacchi The functions are intentionally identical: having 691*7fd79137SRobert Mustacchi _dwarf_print_lines call dwarf_print_lines might 692*7fd79137SRobert Mustacchi better emphasize they are intentionally identical, but 693*7fd79137SRobert Mustacchi that seemed slightly silly given how short the functions are. 694*7fd79137SRobert Mustacchi Interface adds error_count (output value) February 2009. 695*7fd79137SRobert Mustacchi */ 696*7fd79137SRobert Mustacchi int 697*7fd79137SRobert Mustacchi dwarf_print_lines(Dwarf_Die die, Dwarf_Error * error,int *error_count) 698*7fd79137SRobert Mustacchi { 699*7fd79137SRobert Mustacchi int only_line_header = 0; 700*7fd79137SRobert Mustacchi int res = _dwarf_internal_printlines(die, error, 701*7fd79137SRobert Mustacchi error_count, 702*7fd79137SRobert Mustacchi only_line_header); 703*7fd79137SRobert Mustacchi if (res != DW_DLV_OK) { 704*7fd79137SRobert Mustacchi return res; 705*7fd79137SRobert Mustacchi } 706*7fd79137SRobert Mustacchi return res; 707*7fd79137SRobert Mustacchi } 708*7fd79137SRobert Mustacchi int 709*7fd79137SRobert Mustacchi _dwarf_print_lines(Dwarf_Die die, Dwarf_Error * error) 710*7fd79137SRobert Mustacchi { 711*7fd79137SRobert Mustacchi int only_line_header = 0; 712*7fd79137SRobert Mustacchi int err_count = 0; 713*7fd79137SRobert Mustacchi int res = _dwarf_internal_printlines(die, error, 714*7fd79137SRobert Mustacchi &err_count, 715*7fd79137SRobert Mustacchi only_line_header); 716*7fd79137SRobert Mustacchi /* No way to get error count back in this interface */ 717*7fd79137SRobert Mustacchi if (res != DW_DLV_OK) { 718*7fd79137SRobert Mustacchi return res; 719*7fd79137SRobert Mustacchi } 720*7fd79137SRobert Mustacchi return res; 721*7fd79137SRobert Mustacchi } 722*7fd79137SRobert Mustacchi 723*7fd79137SRobert Mustacchi /* The check is in case we are not printing full line data, 724*7fd79137SRobert Mustacchi this gets some of the issues noted with .debug_line, 725*7fd79137SRobert Mustacchi but not all. Call dwarf_print_lines() to get all issues. 726*7fd79137SRobert Mustacchi Intended for apps like dwarfdump. 727*7fd79137SRobert Mustacchi */ 728*7fd79137SRobert Mustacchi void 729*7fd79137SRobert Mustacchi dwarf_check_lineheader(Dwarf_Die die, int *err_count_out) 730*7fd79137SRobert Mustacchi { 731*7fd79137SRobert Mustacchi Dwarf_Error err; 732*7fd79137SRobert Mustacchi int only_line_header = 1; 733*7fd79137SRobert Mustacchi _dwarf_internal_printlines(die, &err,err_count_out, 734*7fd79137SRobert Mustacchi only_line_header); 735*7fd79137SRobert Mustacchi return; 736*7fd79137SRobert Mustacchi } 737*7fd79137SRobert Mustacchi 738