1*bc1f688bSRobert Mustacchi /* 2*bc1f688bSRobert Mustacchi Copyright (C) 2000-2006 Silicon Graphics, Inc. All Rights Reserved. 3*bc1f688bSRobert Mustacchi Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. 4*bc1f688bSRobert Mustacchi 5*bc1f688bSRobert Mustacchi This program is free software; you can redistribute it and/or modify it 6*bc1f688bSRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License 7*bc1f688bSRobert Mustacchi as published by the Free Software Foundation. 8*bc1f688bSRobert Mustacchi 9*bc1f688bSRobert Mustacchi This program is distributed in the hope that it would be useful, but 10*bc1f688bSRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of 11*bc1f688bSRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12*bc1f688bSRobert Mustacchi 13*bc1f688bSRobert Mustacchi Further, this software is distributed without any warranty that it is 14*bc1f688bSRobert Mustacchi free of the rightful claim of any third person regarding infringement 15*bc1f688bSRobert Mustacchi or the like. Any license provided herein, whether implied or 16*bc1f688bSRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if 17*bc1f688bSRobert Mustacchi any, provided herein do not apply to combinations of this program with 18*bc1f688bSRobert Mustacchi other software, or any other product whatsoever. 19*bc1f688bSRobert Mustacchi 20*bc1f688bSRobert Mustacchi You should have received a copy of the GNU Lesser General Public 21*bc1f688bSRobert Mustacchi License along with this program; if not, write the Free Software 22*bc1f688bSRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, 23*bc1f688bSRobert Mustacchi USA. 24*bc1f688bSRobert Mustacchi 25*bc1f688bSRobert Mustacchi Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, 26*bc1f688bSRobert Mustacchi Mountain View, CA 94043, or: 27*bc1f688bSRobert Mustacchi 28*bc1f688bSRobert Mustacchi http://www.sgi.com 29*bc1f688bSRobert Mustacchi 30*bc1f688bSRobert Mustacchi For further information regarding this notice, see: 31*bc1f688bSRobert Mustacchi 32*bc1f688bSRobert Mustacchi http://oss.sgi.com/projects/GenInfo/NoticeExplan 33*bc1f688bSRobert Mustacchi 34*bc1f688bSRobert Mustacchi */ 35*bc1f688bSRobert Mustacchi /* The address of the Free Software Foundation is 36*bc1f688bSRobert Mustacchi Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 37*bc1f688bSRobert Mustacchi Boston, MA 02110-1301, USA. 38*bc1f688bSRobert Mustacchi SGI has moved from the Crittenden Lane address. 39*bc1f688bSRobert Mustacchi */ 40*bc1f688bSRobert Mustacchi 41*bc1f688bSRobert Mustacchi 42*bc1f688bSRobert Mustacchi 43*bc1f688bSRobert Mustacchi 44*bc1f688bSRobert Mustacchi #include "config.h" 45*bc1f688bSRobert Mustacchi #include "dwarf_incl.h" 46*bc1f688bSRobert Mustacchi #include <stdio.h> 47*bc1f688bSRobert Mustacchi #include <stdlib.h> 48*bc1f688bSRobert Mustacchi #include "dwarf_line.h" 49*bc1f688bSRobert Mustacchi 50*bc1f688bSRobert Mustacchi static int 51*bc1f688bSRobert Mustacchi is_path_separator(Dwarf_Small s) 52*bc1f688bSRobert Mustacchi { 53*bc1f688bSRobert Mustacchi if(s == '/') { 54*bc1f688bSRobert Mustacchi return 1; 55*bc1f688bSRobert Mustacchi } 56*bc1f688bSRobert Mustacchi #ifdef HAVE_WINDOWS_PATH 57*bc1f688bSRobert Mustacchi if(s == '\\') { 58*bc1f688bSRobert Mustacchi return 1; 59*bc1f688bSRobert Mustacchi } 60*bc1f688bSRobert Mustacchi #endif 61*bc1f688bSRobert Mustacchi return 0; 62*bc1f688bSRobert Mustacchi } 63*bc1f688bSRobert Mustacchi 64*bc1f688bSRobert Mustacchi /* Return 0 if false, 1 if true. 65*bc1f688bSRobert Mustacchi If HAVE_WINDOWS_PATH is defined we 66*bc1f688bSRobert Mustacchi attempt to handle windows full paths: 67*bc1f688bSRobert Mustacchi \\something or C:cwdpath.c 68*bc1f688bSRobert Mustacchi */ 69*bc1f688bSRobert Mustacchi static int 70*bc1f688bSRobert Mustacchi file_name_is_full_path(Dwarf_Small *fname) 71*bc1f688bSRobert Mustacchi { 72*bc1f688bSRobert Mustacchi Dwarf_Small firstc = *fname; 73*bc1f688bSRobert Mustacchi if(is_path_separator(firstc)) { 74*bc1f688bSRobert Mustacchi /* Full path. */ 75*bc1f688bSRobert Mustacchi return 1; 76*bc1f688bSRobert Mustacchi } 77*bc1f688bSRobert Mustacchi if(!firstc) { 78*bc1f688bSRobert Mustacchi return 0; 79*bc1f688bSRobert Mustacchi } 80*bc1f688bSRobert Mustacchi #ifdef HAVE_WINDOWS_PATH 81*bc1f688bSRobert Mustacchi if((firstc >= 'A' && firstc <= 'Z') || 82*bc1f688bSRobert Mustacchi (firstc >= 'a' && firstc <= 'z')) { 83*bc1f688bSRobert Mustacchi Dwarf_Small secondc = fname[1]; 84*bc1f688bSRobert Mustacchi if (secondc == ':') { 85*bc1f688bSRobert Mustacchi return 1; 86*bc1f688bSRobert Mustacchi } 87*bc1f688bSRobert Mustacchi } 88*bc1f688bSRobert Mustacchi #endif 89*bc1f688bSRobert Mustacchi return 0; 90*bc1f688bSRobert Mustacchi } 91*bc1f688bSRobert Mustacchi 92*bc1f688bSRobert Mustacchi /* 93*bc1f688bSRobert Mustacchi Although source files is supposed to return the 94*bc1f688bSRobert Mustacchi source files in the compilation-unit, it does 95*bc1f688bSRobert Mustacchi not look for any in the statement program. In 96*bc1f688bSRobert Mustacchi other words, it ignores those defined using the 97*bc1f688bSRobert Mustacchi extended opcode DW_LNE_define_file. 98*bc1f688bSRobert Mustacchi */ 99*bc1f688bSRobert Mustacchi int 100*bc1f688bSRobert Mustacchi dwarf_srcfiles(Dwarf_Die die, 101*bc1f688bSRobert Mustacchi char ***srcfiles, 102*bc1f688bSRobert Mustacchi Dwarf_Signed * srcfilecount, Dwarf_Error * error) 103*bc1f688bSRobert Mustacchi { 104*bc1f688bSRobert Mustacchi /* This pointer is used to scan the portion of the .debug_line 105*bc1f688bSRobert Mustacchi section for the current cu. */ 106*bc1f688bSRobert Mustacchi Dwarf_Small *line_ptr; 107*bc1f688bSRobert Mustacchi 108*bc1f688bSRobert Mustacchi /* Pointer to a DW_AT_stmt_list attribute in case it exists in the 109*bc1f688bSRobert Mustacchi die. */ 110*bc1f688bSRobert Mustacchi Dwarf_Attribute stmt_list_attr; 111*bc1f688bSRobert Mustacchi 112*bc1f688bSRobert Mustacchi /* Pointer to DW_AT_comp_dir attribute in die. */ 113*bc1f688bSRobert Mustacchi Dwarf_Attribute comp_dir_attr; 114*bc1f688bSRobert Mustacchi 115*bc1f688bSRobert Mustacchi /* Pointer to name of compilation directory. */ 116*bc1f688bSRobert Mustacchi Dwarf_Small *comp_dir = 0; 117*bc1f688bSRobert Mustacchi 118*bc1f688bSRobert Mustacchi /* Offset into .debug_line specified by a DW_AT_stmt_list 119*bc1f688bSRobert Mustacchi attribute. */ 120*bc1f688bSRobert Mustacchi Dwarf_Unsigned line_offset = 0; 121*bc1f688bSRobert Mustacchi 122*bc1f688bSRobert Mustacchi /* This points to a block of char *'s, each of which points to a 123*bc1f688bSRobert Mustacchi file name. */ 124*bc1f688bSRobert Mustacchi char **ret_files = 0; 125*bc1f688bSRobert Mustacchi 126*bc1f688bSRobert Mustacchi /* The Dwarf_Debug this die belongs to. */ 127*bc1f688bSRobert Mustacchi Dwarf_Debug dbg = 0; 128*bc1f688bSRobert Mustacchi 129*bc1f688bSRobert Mustacchi /* Used to chain the file names. */ 130*bc1f688bSRobert Mustacchi Dwarf_Chain curr_chain = NULL; 131*bc1f688bSRobert Mustacchi Dwarf_Chain prev_chain = NULL; 132*bc1f688bSRobert Mustacchi Dwarf_Chain head_chain = NULL; 133*bc1f688bSRobert Mustacchi Dwarf_Half attrform = 0; 134*bc1f688bSRobert Mustacchi int resattr = DW_DLV_ERROR; 135*bc1f688bSRobert Mustacchi int lres = DW_DLV_ERROR; 136*bc1f688bSRobert Mustacchi struct Line_Table_Prefix_s line_prefix; 137*bc1f688bSRobert Mustacchi int i = 0; 138*bc1f688bSRobert Mustacchi int res = DW_DLV_ERROR; 139*bc1f688bSRobert Mustacchi 140*bc1f688bSRobert Mustacchi /* ***** BEGIN CODE ***** */ 141*bc1f688bSRobert Mustacchi /* Reset error. */ 142*bc1f688bSRobert Mustacchi if (error != NULL) 143*bc1f688bSRobert Mustacchi *error = NULL; 144*bc1f688bSRobert Mustacchi 145*bc1f688bSRobert Mustacchi CHECK_DIE(die, DW_DLV_ERROR); 146*bc1f688bSRobert Mustacchi dbg = die->di_cu_context->cc_dbg; 147*bc1f688bSRobert Mustacchi 148*bc1f688bSRobert Mustacchi resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error); 149*bc1f688bSRobert Mustacchi if (resattr != DW_DLV_OK) { 150*bc1f688bSRobert Mustacchi return resattr; 151*bc1f688bSRobert Mustacchi } 152*bc1f688bSRobert Mustacchi 153*bc1f688bSRobert Mustacchi if (dbg->de_debug_line.dss_index == 0) { 154*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_DEBUG_LINE_NULL); 155*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 156*bc1f688bSRobert Mustacchi } 157*bc1f688bSRobert Mustacchi 158*bc1f688bSRobert Mustacchi res = _dwarf_load_section(dbg, &dbg->de_debug_line,error); 159*bc1f688bSRobert Mustacchi if (res != DW_DLV_OK) { 160*bc1f688bSRobert Mustacchi return res; 161*bc1f688bSRobert Mustacchi } 162*bc1f688bSRobert Mustacchi 163*bc1f688bSRobert Mustacchi lres = dwarf_whatform(stmt_list_attr,&attrform,error); 164*bc1f688bSRobert Mustacchi if (lres != DW_DLV_OK) { 165*bc1f688bSRobert Mustacchi return lres; 166*bc1f688bSRobert Mustacchi } 167*bc1f688bSRobert Mustacchi if (attrform != DW_FORM_data4 && attrform != DW_FORM_data8 && 168*bc1f688bSRobert Mustacchi attrform != DW_FORM_sec_offset ) { 169*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD); 170*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 171*bc1f688bSRobert Mustacchi } 172*bc1f688bSRobert Mustacchi lres = dwarf_global_formref(stmt_list_attr, &line_offset, error); 173*bc1f688bSRobert Mustacchi if (lres != DW_DLV_OK) { 174*bc1f688bSRobert Mustacchi return lres; 175*bc1f688bSRobert Mustacchi } 176*bc1f688bSRobert Mustacchi if (line_offset >= dbg->de_debug_line.dss_size) { 177*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD); 178*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 179*bc1f688bSRobert Mustacchi } 180*bc1f688bSRobert Mustacchi line_ptr = dbg->de_debug_line.dss_data + line_offset; 181*bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR); 182*bc1f688bSRobert Mustacchi 183*bc1f688bSRobert Mustacchi /* 184*bc1f688bSRobert Mustacchi If die has DW_AT_comp_dir attribute, get the string that names 185*bc1f688bSRobert Mustacchi the compilation directory. */ 186*bc1f688bSRobert Mustacchi resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error); 187*bc1f688bSRobert Mustacchi if (resattr == DW_DLV_ERROR) { 188*bc1f688bSRobert Mustacchi return resattr; 189*bc1f688bSRobert Mustacchi } 190*bc1f688bSRobert Mustacchi if (resattr == DW_DLV_OK) { 191*bc1f688bSRobert Mustacchi int cres = DW_DLV_ERROR; 192*bc1f688bSRobert Mustacchi char *cdir = 0; 193*bc1f688bSRobert Mustacchi 194*bc1f688bSRobert Mustacchi cres = dwarf_formstring(comp_dir_attr, &cdir, error); 195*bc1f688bSRobert Mustacchi if (cres == DW_DLV_ERROR) { 196*bc1f688bSRobert Mustacchi return cres; 197*bc1f688bSRobert Mustacchi } else if (cres == DW_DLV_OK) { 198*bc1f688bSRobert Mustacchi comp_dir = (Dwarf_Small *) cdir; 199*bc1f688bSRobert Mustacchi } 200*bc1f688bSRobert Mustacchi } 201*bc1f688bSRobert Mustacchi if (resattr == DW_DLV_OK) { 202*bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR); 203*bc1f688bSRobert Mustacchi } 204*bc1f688bSRobert Mustacchi dwarf_init_line_table_prefix(&line_prefix); 205*bc1f688bSRobert Mustacchi { 206*bc1f688bSRobert Mustacchi Dwarf_Small *line_ptr_out = 0; 207*bc1f688bSRobert Mustacchi int dres = dwarf_read_line_table_prefix(dbg, 208*bc1f688bSRobert Mustacchi line_ptr, 209*bc1f688bSRobert Mustacchi dbg->de_debug_line.dss_size, 210*bc1f688bSRobert Mustacchi &line_ptr_out, 211*bc1f688bSRobert Mustacchi &line_prefix, 212*bc1f688bSRobert Mustacchi NULL, NULL,error, 213*bc1f688bSRobert Mustacchi 0); 214*bc1f688bSRobert Mustacchi 215*bc1f688bSRobert Mustacchi if (dres == DW_DLV_ERROR) { 216*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&line_prefix); 217*bc1f688bSRobert Mustacchi return dres; 218*bc1f688bSRobert Mustacchi } 219*bc1f688bSRobert Mustacchi if (dres == DW_DLV_NO_ENTRY) { 220*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&line_prefix); 221*bc1f688bSRobert Mustacchi return dres; 222*bc1f688bSRobert Mustacchi } 223*bc1f688bSRobert Mustacchi 224*bc1f688bSRobert Mustacchi line_ptr = line_ptr_out; 225*bc1f688bSRobert Mustacchi } 226*bc1f688bSRobert Mustacchi 227*bc1f688bSRobert Mustacchi for (i = 0; i < line_prefix.pf_files_count; ++i) { 228*bc1f688bSRobert Mustacchi struct Line_Table_File_Entry_s *fe = 229*bc1f688bSRobert Mustacchi line_prefix.pf_line_table_file_entries + i; 230*bc1f688bSRobert Mustacchi char *file_name = (char *) fe->lte_filename; 231*bc1f688bSRobert Mustacchi char *dir_name = 0; 232*bc1f688bSRobert Mustacchi char *full_name = 0; 233*bc1f688bSRobert Mustacchi Dwarf_Unsigned dir_index = fe->lte_directory_index; 234*bc1f688bSRobert Mustacchi 235*bc1f688bSRobert Mustacchi if (dir_index == 0) { 236*bc1f688bSRobert Mustacchi dir_name = (char *) comp_dir; 237*bc1f688bSRobert Mustacchi } else { 238*bc1f688bSRobert Mustacchi dir_name = 239*bc1f688bSRobert Mustacchi (char *) line_prefix.pf_include_directories[ 240*bc1f688bSRobert Mustacchi fe->lte_directory_index - 1]; 241*bc1f688bSRobert Mustacchi } 242*bc1f688bSRobert Mustacchi 243*bc1f688bSRobert Mustacchi /* dir_name can be NULL if there is no DW_AT_comp_dir */ 244*bc1f688bSRobert Mustacchi if(dir_name == 0 || file_name_is_full_path((unsigned char *)file_name)) { 245*bc1f688bSRobert Mustacchi /* This is safe because dwarf_dealloc is careful to not 246*bc1f688bSRobert Mustacchi dealloc strings which are part of the raw .debug_* data. 247*bc1f688bSRobert Mustacchi */ 248*bc1f688bSRobert Mustacchi full_name = file_name; 249*bc1f688bSRobert Mustacchi } else { 250*bc1f688bSRobert Mustacchi full_name = (char *) _dwarf_get_alloc(dbg, DW_DLA_STRING, 251*bc1f688bSRobert Mustacchi strlen(dir_name) + 1 + 252*bc1f688bSRobert Mustacchi strlen(file_name) + 253*bc1f688bSRobert Mustacchi 1); 254*bc1f688bSRobert Mustacchi if (full_name == NULL) { 255*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&line_prefix); 256*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 257*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 258*bc1f688bSRobert Mustacchi } 259*bc1f688bSRobert Mustacchi 260*bc1f688bSRobert Mustacchi /* This is not careful to avoid // in the output, Nothing 261*bc1f688bSRobert Mustacchi forces a 'canonical' name format here. Unclear if this 262*bc1f688bSRobert Mustacchi needs to be fixed. */ 263*bc1f688bSRobert Mustacchi strcpy(full_name, dir_name); 264*bc1f688bSRobert Mustacchi strcat(full_name, "/"); 265*bc1f688bSRobert Mustacchi strcat(full_name, file_name); 266*bc1f688bSRobert Mustacchi } 267*bc1f688bSRobert Mustacchi curr_chain = 268*bc1f688bSRobert Mustacchi (Dwarf_Chain) _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); 269*bc1f688bSRobert Mustacchi if (curr_chain == NULL) { 270*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&line_prefix); 271*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 272*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 273*bc1f688bSRobert Mustacchi } 274*bc1f688bSRobert Mustacchi curr_chain->ch_item = full_name; 275*bc1f688bSRobert Mustacchi if (head_chain == NULL) 276*bc1f688bSRobert Mustacchi head_chain = prev_chain = curr_chain; 277*bc1f688bSRobert Mustacchi else { 278*bc1f688bSRobert Mustacchi prev_chain->ch_next = curr_chain; 279*bc1f688bSRobert Mustacchi prev_chain = curr_chain; 280*bc1f688bSRobert Mustacchi } 281*bc1f688bSRobert Mustacchi } 282*bc1f688bSRobert Mustacchi 283*bc1f688bSRobert Mustacchi curr_chain = (Dwarf_Chain) _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); 284*bc1f688bSRobert Mustacchi if (curr_chain == NULL) { 285*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&line_prefix); 286*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 287*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 288*bc1f688bSRobert Mustacchi } 289*bc1f688bSRobert Mustacchi 290*bc1f688bSRobert Mustacchi 291*bc1f688bSRobert Mustacchi 292*bc1f688bSRobert Mustacchi 293*bc1f688bSRobert Mustacchi if (line_prefix.pf_files_count == 0) { 294*bc1f688bSRobert Mustacchi *srcfiles = NULL; 295*bc1f688bSRobert Mustacchi *srcfilecount = 0; 296*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&line_prefix); 297*bc1f688bSRobert Mustacchi return (DW_DLV_NO_ENTRY); 298*bc1f688bSRobert Mustacchi } 299*bc1f688bSRobert Mustacchi 300*bc1f688bSRobert Mustacchi ret_files = (char **) 301*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_LIST, line_prefix.pf_files_count); 302*bc1f688bSRobert Mustacchi if (ret_files == NULL) { 303*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 304*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&line_prefix); 305*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 306*bc1f688bSRobert Mustacchi } 307*bc1f688bSRobert Mustacchi 308*bc1f688bSRobert Mustacchi curr_chain = head_chain; 309*bc1f688bSRobert Mustacchi for (i = 0; i < line_prefix.pf_files_count; i++) { 310*bc1f688bSRobert Mustacchi *(ret_files + i) = curr_chain->ch_item; 311*bc1f688bSRobert Mustacchi prev_chain = curr_chain; 312*bc1f688bSRobert Mustacchi curr_chain = curr_chain->ch_next; 313*bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, prev_chain, DW_DLA_CHAIN); 314*bc1f688bSRobert Mustacchi } 315*bc1f688bSRobert Mustacchi 316*bc1f688bSRobert Mustacchi *srcfiles = ret_files; 317*bc1f688bSRobert Mustacchi *srcfilecount = line_prefix.pf_files_count; 318*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&line_prefix); 319*bc1f688bSRobert Mustacchi return (DW_DLV_OK); 320*bc1f688bSRobert Mustacchi } 321*bc1f688bSRobert Mustacchi 322*bc1f688bSRobert Mustacchi 323*bc1f688bSRobert Mustacchi /* 324*bc1f688bSRobert Mustacchi return DW_DLV_OK if ok. else DW_DLV_NO_ENTRY or DW_DLV_ERROR 325*bc1f688bSRobert Mustacchi */ 326*bc1f688bSRobert Mustacchi int 327*bc1f688bSRobert Mustacchi _dwarf_internal_srclines(Dwarf_Die die, 328*bc1f688bSRobert Mustacchi Dwarf_Line ** linebuf, 329*bc1f688bSRobert Mustacchi Dwarf_Signed * count, 330*bc1f688bSRobert Mustacchi Dwarf_Bool doaddrs, 331*bc1f688bSRobert Mustacchi Dwarf_Bool dolines, Dwarf_Error * error) 332*bc1f688bSRobert Mustacchi { 333*bc1f688bSRobert Mustacchi /* This pointer is used to scan the portion of the .debug_line 334*bc1f688bSRobert Mustacchi section for the current cu. */ 335*bc1f688bSRobert Mustacchi Dwarf_Small *line_ptr = 0; 336*bc1f688bSRobert Mustacchi 337*bc1f688bSRobert Mustacchi /* This points to the last byte of the .debug_line portion for the 338*bc1f688bSRobert Mustacchi current cu. */ 339*bc1f688bSRobert Mustacchi Dwarf_Small *line_ptr_end = 0; 340*bc1f688bSRobert Mustacchi 341*bc1f688bSRobert Mustacchi /* Pointer to a DW_AT_stmt_list attribute in case it exists in the 342*bc1f688bSRobert Mustacchi die. */ 343*bc1f688bSRobert Mustacchi Dwarf_Attribute stmt_list_attr = 0; 344*bc1f688bSRobert Mustacchi 345*bc1f688bSRobert Mustacchi /* Pointer to DW_AT_comp_dir attribute in die. */ 346*bc1f688bSRobert Mustacchi Dwarf_Attribute comp_dir_attr = 0; 347*bc1f688bSRobert Mustacchi 348*bc1f688bSRobert Mustacchi /* Pointer to name of compilation directory. */ 349*bc1f688bSRobert Mustacchi Dwarf_Small *comp_dir = NULL; 350*bc1f688bSRobert Mustacchi 351*bc1f688bSRobert Mustacchi /* Offset into .debug_line specified by a DW_AT_stmt_list 352*bc1f688bSRobert Mustacchi attribute. */ 353*bc1f688bSRobert Mustacchi Dwarf_Unsigned line_offset = 0; 354*bc1f688bSRobert Mustacchi 355*bc1f688bSRobert Mustacchi Dwarf_File_Entry file_entries = 0; 356*bc1f688bSRobert Mustacchi 357*bc1f688bSRobert Mustacchi /* These are the state machine state variables. */ 358*bc1f688bSRobert Mustacchi Dwarf_Addr address = 0; 359*bc1f688bSRobert Mustacchi Dwarf_Word file = 1; 360*bc1f688bSRobert Mustacchi Dwarf_Word line = 1; 361*bc1f688bSRobert Mustacchi Dwarf_Word column = 0; 362*bc1f688bSRobert Mustacchi 363*bc1f688bSRobert Mustacchi /* Phony init. See below for true initialization. */ 364*bc1f688bSRobert Mustacchi Dwarf_Bool is_stmt = false; 365*bc1f688bSRobert Mustacchi 366*bc1f688bSRobert Mustacchi Dwarf_Bool basic_block = false; 367*bc1f688bSRobert Mustacchi Dwarf_Bool prologue_end = false; 368*bc1f688bSRobert Mustacchi Dwarf_Bool epilogue_begin = false; 369*bc1f688bSRobert Mustacchi Dwarf_Small isa = 0; 370*bc1f688bSRobert Mustacchi Dwarf_Bool end_sequence = false; 371*bc1f688bSRobert Mustacchi 372*bc1f688bSRobert Mustacchi /* These pointers are used to build the list of files names by this 373*bc1f688bSRobert Mustacchi cu. cur_file_entry points to the file name being added, and 374*bc1f688bSRobert Mustacchi prev_file_entry to the previous one. */ 375*bc1f688bSRobert Mustacchi Dwarf_File_Entry cur_file_entry, prev_file_entry; 376*bc1f688bSRobert Mustacchi 377*bc1f688bSRobert Mustacchi Dwarf_Sword i = 0; 378*bc1f688bSRobert Mustacchi Dwarf_Sword file_entry_count = 0; 379*bc1f688bSRobert Mustacchi 380*bc1f688bSRobert Mustacchi /* This is the current opcode read from the statement program. */ 381*bc1f688bSRobert Mustacchi Dwarf_Small opcode = 0; 382*bc1f688bSRobert Mustacchi 383*bc1f688bSRobert Mustacchi /* Pointer to a Dwarf_Line_Context_s structure that contains the 384*bc1f688bSRobert Mustacchi context such as file names and include directories for the set 385*bc1f688bSRobert Mustacchi of lines being generated. */ 386*bc1f688bSRobert Mustacchi Dwarf_Line_Context line_context = 0; 387*bc1f688bSRobert Mustacchi 388*bc1f688bSRobert Mustacchi /* This is a pointer to the current line being added to the line 389*bc1f688bSRobert Mustacchi matrix. */ 390*bc1f688bSRobert Mustacchi Dwarf_Line curr_line = 0; 391*bc1f688bSRobert Mustacchi 392*bc1f688bSRobert Mustacchi /* These variables are used to decode leb128 numbers. Leb128_num 393*bc1f688bSRobert Mustacchi holds the decoded number, and leb128_length is its length in 394*bc1f688bSRobert Mustacchi bytes. */ 395*bc1f688bSRobert Mustacchi Dwarf_Word leb128_num = 0; 396*bc1f688bSRobert Mustacchi Dwarf_Word leb128_length = 0; 397*bc1f688bSRobert Mustacchi Dwarf_Sword advance_line = 0; 398*bc1f688bSRobert Mustacchi 399*bc1f688bSRobert Mustacchi /* This is the operand of the latest fixed_advance_pc extended 400*bc1f688bSRobert Mustacchi opcode. */ 401*bc1f688bSRobert Mustacchi Dwarf_Half fixed_advance_pc = 0; 402*bc1f688bSRobert Mustacchi 403*bc1f688bSRobert Mustacchi /* Counts the number of lines in the line matrix. */ 404*bc1f688bSRobert Mustacchi Dwarf_Sword line_count = 0; 405*bc1f688bSRobert Mustacchi 406*bc1f688bSRobert Mustacchi /* This is the length of an extended opcode instr. */ 407*bc1f688bSRobert Mustacchi Dwarf_Word instr_length = 0; 408*bc1f688bSRobert Mustacchi Dwarf_Small ext_opcode = 0; 409*bc1f688bSRobert Mustacchi struct Line_Table_Prefix_s prefix; 410*bc1f688bSRobert Mustacchi 411*bc1f688bSRobert Mustacchi /* Used to chain together pointers to line table entries that are 412*bc1f688bSRobert Mustacchi later used to create a block of Dwarf_Line entries. */ 413*bc1f688bSRobert Mustacchi Dwarf_Chain chain_line = NULL; 414*bc1f688bSRobert Mustacchi Dwarf_Chain head_chain = NULL; 415*bc1f688bSRobert Mustacchi Dwarf_Chain curr_chain = NULL; 416*bc1f688bSRobert Mustacchi 417*bc1f688bSRobert Mustacchi /* This points to a block of Dwarf_Lines, a pointer to which is 418*bc1f688bSRobert Mustacchi returned in linebuf. */ 419*bc1f688bSRobert Mustacchi Dwarf_Line *block_line = 0; 420*bc1f688bSRobert Mustacchi 421*bc1f688bSRobert Mustacchi /* The Dwarf_Debug this die belongs to. */ 422*bc1f688bSRobert Mustacchi Dwarf_Debug dbg = 0; 423*bc1f688bSRobert Mustacchi int resattr = DW_DLV_ERROR; 424*bc1f688bSRobert Mustacchi int lres = DW_DLV_ERROR; 425*bc1f688bSRobert Mustacchi Dwarf_Half address_size = 0; 426*bc1f688bSRobert Mustacchi 427*bc1f688bSRobert Mustacchi int res = DW_DLV_ERROR; 428*bc1f688bSRobert Mustacchi 429*bc1f688bSRobert Mustacchi /* ***** BEGIN CODE ***** */ 430*bc1f688bSRobert Mustacchi if (error != NULL) 431*bc1f688bSRobert Mustacchi *error = NULL; 432*bc1f688bSRobert Mustacchi 433*bc1f688bSRobert Mustacchi CHECK_DIE(die, DW_DLV_ERROR); 434*bc1f688bSRobert Mustacchi dbg = die->di_cu_context->cc_dbg; 435*bc1f688bSRobert Mustacchi 436*bc1f688bSRobert Mustacchi res = _dwarf_load_section(dbg, &dbg->de_debug_line,error); 437*bc1f688bSRobert Mustacchi if (res != DW_DLV_OK) { 438*bc1f688bSRobert Mustacchi return res; 439*bc1f688bSRobert Mustacchi } 440*bc1f688bSRobert Mustacchi address_size = _dwarf_get_address_size(dbg, die); 441*bc1f688bSRobert Mustacchi resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error); 442*bc1f688bSRobert Mustacchi if (resattr != DW_DLV_OK) { 443*bc1f688bSRobert Mustacchi return resattr; 444*bc1f688bSRobert Mustacchi } 445*bc1f688bSRobert Mustacchi 446*bc1f688bSRobert Mustacchi lres = dwarf_formudata(stmt_list_attr, &line_offset, error); 447*bc1f688bSRobert Mustacchi if (lres != DW_DLV_OK) { 448*bc1f688bSRobert Mustacchi return lres; 449*bc1f688bSRobert Mustacchi } 450*bc1f688bSRobert Mustacchi 451*bc1f688bSRobert Mustacchi if (line_offset >= dbg->de_debug_line.dss_size) { 452*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD); 453*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 454*bc1f688bSRobert Mustacchi } 455*bc1f688bSRobert Mustacchi line_ptr = dbg->de_debug_line.dss_data + line_offset; 456*bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR); 457*bc1f688bSRobert Mustacchi 458*bc1f688bSRobert Mustacchi /* If die has DW_AT_comp_dir attribute, get the string that names 459*bc1f688bSRobert Mustacchi the compilation directory. */ 460*bc1f688bSRobert Mustacchi resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error); 461*bc1f688bSRobert Mustacchi if (resattr == DW_DLV_ERROR) { 462*bc1f688bSRobert Mustacchi return resattr; 463*bc1f688bSRobert Mustacchi } 464*bc1f688bSRobert Mustacchi if (resattr == DW_DLV_OK) { 465*bc1f688bSRobert Mustacchi int cres = DW_DLV_ERROR; 466*bc1f688bSRobert Mustacchi char *cdir = 0; 467*bc1f688bSRobert Mustacchi 468*bc1f688bSRobert Mustacchi cres = dwarf_formstring(comp_dir_attr, &cdir, error); 469*bc1f688bSRobert Mustacchi if (cres == DW_DLV_ERROR) { 470*bc1f688bSRobert Mustacchi return cres; 471*bc1f688bSRobert Mustacchi } else if (cres == DW_DLV_OK) { 472*bc1f688bSRobert Mustacchi comp_dir = (Dwarf_Small *) cdir; 473*bc1f688bSRobert Mustacchi } 474*bc1f688bSRobert Mustacchi } 475*bc1f688bSRobert Mustacchi if (resattr == DW_DLV_OK) { 476*bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR); 477*bc1f688bSRobert Mustacchi } 478*bc1f688bSRobert Mustacchi dwarf_init_line_table_prefix(&prefix); 479*bc1f688bSRobert Mustacchi 480*bc1f688bSRobert Mustacchi { 481*bc1f688bSRobert Mustacchi Dwarf_Small *newlinep = 0; 482*bc1f688bSRobert Mustacchi int res = dwarf_read_line_table_prefix(dbg, 483*bc1f688bSRobert Mustacchi line_ptr, 484*bc1f688bSRobert Mustacchi dbg->de_debug_line.dss_size, 485*bc1f688bSRobert Mustacchi &newlinep, 486*bc1f688bSRobert Mustacchi &prefix, 487*bc1f688bSRobert Mustacchi NULL,NULL, 488*bc1f688bSRobert Mustacchi error, 489*bc1f688bSRobert Mustacchi 0); 490*bc1f688bSRobert Mustacchi 491*bc1f688bSRobert Mustacchi if (res == DW_DLV_ERROR) { 492*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 493*bc1f688bSRobert Mustacchi return res; 494*bc1f688bSRobert Mustacchi } 495*bc1f688bSRobert Mustacchi if (res == DW_DLV_NO_ENTRY) { 496*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 497*bc1f688bSRobert Mustacchi return res; 498*bc1f688bSRobert Mustacchi } 499*bc1f688bSRobert Mustacchi line_ptr_end = prefix.pf_line_ptr_end; 500*bc1f688bSRobert Mustacchi line_ptr = newlinep; 501*bc1f688bSRobert Mustacchi } 502*bc1f688bSRobert Mustacchi 503*bc1f688bSRobert Mustacchi 504*bc1f688bSRobert Mustacchi /* Set up context structure for this set of lines. */ 505*bc1f688bSRobert Mustacchi line_context = (Dwarf_Line_Context) 506*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_LINE_CONTEXT, 1); 507*bc1f688bSRobert Mustacchi if (line_context == NULL) { 508*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 509*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 510*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 511*bc1f688bSRobert Mustacchi } 512*bc1f688bSRobert Mustacchi 513*bc1f688bSRobert Mustacchi /* Fill out a Dwarf_File_Entry list as we use that to implement the 514*bc1f688bSRobert Mustacchi define_file operation. */ 515*bc1f688bSRobert Mustacchi file_entries = prev_file_entry = NULL; 516*bc1f688bSRobert Mustacchi for (i = 0; i < prefix.pf_files_count; ++i) { 517*bc1f688bSRobert Mustacchi struct Line_Table_File_Entry_s *pfxfile = 518*bc1f688bSRobert Mustacchi prefix.pf_line_table_file_entries + i; 519*bc1f688bSRobert Mustacchi 520*bc1f688bSRobert Mustacchi cur_file_entry = (Dwarf_File_Entry) 521*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_FILE_ENTRY, 1); 522*bc1f688bSRobert Mustacchi if (cur_file_entry == NULL) { 523*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 524*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 525*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 526*bc1f688bSRobert Mustacchi } 527*bc1f688bSRobert Mustacchi 528*bc1f688bSRobert Mustacchi cur_file_entry->fi_file_name = pfxfile->lte_filename; 529*bc1f688bSRobert Mustacchi cur_file_entry->fi_dir_index = pfxfile->lte_directory_index; 530*bc1f688bSRobert Mustacchi cur_file_entry->fi_time_last_mod = 531*bc1f688bSRobert Mustacchi pfxfile->lte_last_modification_time; 532*bc1f688bSRobert Mustacchi 533*bc1f688bSRobert Mustacchi cur_file_entry->fi_file_length = pfxfile->lte_length_of_file; 534*bc1f688bSRobert Mustacchi 535*bc1f688bSRobert Mustacchi if (file_entries == NULL) 536*bc1f688bSRobert Mustacchi file_entries = cur_file_entry; 537*bc1f688bSRobert Mustacchi else 538*bc1f688bSRobert Mustacchi prev_file_entry->fi_next = cur_file_entry; 539*bc1f688bSRobert Mustacchi prev_file_entry = cur_file_entry; 540*bc1f688bSRobert Mustacchi 541*bc1f688bSRobert Mustacchi file_entry_count++; 542*bc1f688bSRobert Mustacchi } 543*bc1f688bSRobert Mustacchi 544*bc1f688bSRobert Mustacchi 545*bc1f688bSRobert Mustacchi /* Initialize the one state machine variable that depends on the 546*bc1f688bSRobert Mustacchi prefix. */ 547*bc1f688bSRobert Mustacchi is_stmt = prefix.pf_default_is_stmt; 548*bc1f688bSRobert Mustacchi 549*bc1f688bSRobert Mustacchi 550*bc1f688bSRobert Mustacchi /* Start of statement program. */ 551*bc1f688bSRobert Mustacchi while (line_ptr < line_ptr_end) { 552*bc1f688bSRobert Mustacchi int type; 553*bc1f688bSRobert Mustacchi 554*bc1f688bSRobert Mustacchi opcode = *(Dwarf_Small *) line_ptr; 555*bc1f688bSRobert Mustacchi line_ptr++; 556*bc1f688bSRobert Mustacchi 557*bc1f688bSRobert Mustacchi 558*bc1f688bSRobert Mustacchi /* 'type' is the output */ 559*bc1f688bSRobert Mustacchi WHAT_IS_OPCODE(type, opcode, prefix.pf_opcode_base, 560*bc1f688bSRobert Mustacchi prefix.pf_opcode_length_table, line_ptr, 561*bc1f688bSRobert Mustacchi prefix.pf_std_op_count); 562*bc1f688bSRobert Mustacchi 563*bc1f688bSRobert Mustacchi if (type == LOP_DISCARD) { 564*bc1f688bSRobert Mustacchi int oc; 565*bc1f688bSRobert Mustacchi int opcnt = prefix.pf_opcode_length_table[opcode]; 566*bc1f688bSRobert Mustacchi 567*bc1f688bSRobert Mustacchi for (oc = 0; oc < opcnt; oc++) { 568*bc1f688bSRobert Mustacchi /* 569*bc1f688bSRobert Mustacchi ** Read and discard operands we don't 570*bc1f688bSRobert Mustacchi ** understand. 571*bc1f688bSRobert Mustacchi ** arbitrary choice of unsigned read. 572*bc1f688bSRobert Mustacchi ** signed read would work as well. 573*bc1f688bSRobert Mustacchi */ 574*bc1f688bSRobert Mustacchi Dwarf_Unsigned utmp2; 575*bc1f688bSRobert Mustacchi 576*bc1f688bSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2); 577*bc1f688bSRobert Mustacchi } 578*bc1f688bSRobert Mustacchi } else if (type == LOP_SPECIAL) { 579*bc1f688bSRobert Mustacchi /* This op code is a special op in the object, no matter 580*bc1f688bSRobert Mustacchi that it might fall into the standard op range in this 581*bc1f688bSRobert Mustacchi compile. That is, these are special opcodes between 582*bc1f688bSRobert Mustacchi opcode_base and MAX_LINE_OP_CODE. (including 583*bc1f688bSRobert Mustacchi opcode_base and MAX_LINE_OP_CODE) */ 584*bc1f688bSRobert Mustacchi 585*bc1f688bSRobert Mustacchi opcode = opcode - prefix.pf_opcode_base; 586*bc1f688bSRobert Mustacchi address = address + prefix.pf_minimum_instruction_length * 587*bc1f688bSRobert Mustacchi (opcode / prefix.pf_line_range); 588*bc1f688bSRobert Mustacchi line = 589*bc1f688bSRobert Mustacchi line + prefix.pf_line_base + 590*bc1f688bSRobert Mustacchi opcode % prefix.pf_line_range; 591*bc1f688bSRobert Mustacchi 592*bc1f688bSRobert Mustacchi if (dolines) { 593*bc1f688bSRobert Mustacchi curr_line = 594*bc1f688bSRobert Mustacchi (Dwarf_Line) _dwarf_get_alloc(dbg, DW_DLA_LINE, 1); 595*bc1f688bSRobert Mustacchi if (curr_line == NULL) { 596*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 597*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 598*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 599*bc1f688bSRobert Mustacchi } 600*bc1f688bSRobert Mustacchi 601*bc1f688bSRobert Mustacchi curr_line->li_address = address; 602*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_file = 603*bc1f688bSRobert Mustacchi (Dwarf_Sword) file; 604*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_line = 605*bc1f688bSRobert Mustacchi (Dwarf_Sword) line; 606*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_column = 607*bc1f688bSRobert Mustacchi (Dwarf_Half) column; 608*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_is_stmt = is_stmt; 609*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_basic_block = 610*bc1f688bSRobert Mustacchi basic_block; 611*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_end_sequence = 612*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data. 613*bc1f688bSRobert Mustacchi li_epilogue_begin = epilogue_begin; 614*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_prologue_end = 615*bc1f688bSRobert Mustacchi prologue_end; 616*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_isa = isa; 617*bc1f688bSRobert Mustacchi curr_line->li_context = line_context; 618*bc1f688bSRobert Mustacchi line_count++; 619*bc1f688bSRobert Mustacchi 620*bc1f688bSRobert Mustacchi chain_line = (Dwarf_Chain) 621*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); 622*bc1f688bSRobert Mustacchi if (chain_line == NULL) { 623*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 624*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 625*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 626*bc1f688bSRobert Mustacchi } 627*bc1f688bSRobert Mustacchi chain_line->ch_item = curr_line; 628*bc1f688bSRobert Mustacchi 629*bc1f688bSRobert Mustacchi if (head_chain == NULL) 630*bc1f688bSRobert Mustacchi head_chain = curr_chain = chain_line; 631*bc1f688bSRobert Mustacchi else { 632*bc1f688bSRobert Mustacchi curr_chain->ch_next = chain_line; 633*bc1f688bSRobert Mustacchi curr_chain = chain_line; 634*bc1f688bSRobert Mustacchi } 635*bc1f688bSRobert Mustacchi } 636*bc1f688bSRobert Mustacchi 637*bc1f688bSRobert Mustacchi basic_block = false; 638*bc1f688bSRobert Mustacchi } else if (type == LOP_STANDARD) { 639*bc1f688bSRobert Mustacchi switch (opcode) { 640*bc1f688bSRobert Mustacchi 641*bc1f688bSRobert Mustacchi case DW_LNS_copy:{ 642*bc1f688bSRobert Mustacchi if (dolines) { 643*bc1f688bSRobert Mustacchi 644*bc1f688bSRobert Mustacchi curr_line = 645*bc1f688bSRobert Mustacchi (Dwarf_Line) _dwarf_get_alloc(dbg, 646*bc1f688bSRobert Mustacchi DW_DLA_LINE, 647*bc1f688bSRobert Mustacchi 1); 648*bc1f688bSRobert Mustacchi if (curr_line == NULL) { 649*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 650*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 651*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 652*bc1f688bSRobert Mustacchi } 653*bc1f688bSRobert Mustacchi 654*bc1f688bSRobert Mustacchi curr_line->li_address = address; 655*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_file = 656*bc1f688bSRobert Mustacchi (Dwarf_Sword) file; 657*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_line = 658*bc1f688bSRobert Mustacchi (Dwarf_Sword) line; 659*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_column = 660*bc1f688bSRobert Mustacchi (Dwarf_Half) column; 661*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_is_stmt = 662*bc1f688bSRobert Mustacchi is_stmt; 663*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data. 664*bc1f688bSRobert Mustacchi li_basic_block = basic_block; 665*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data. 666*bc1f688bSRobert Mustacchi li_end_sequence = end_sequence; 667*bc1f688bSRobert Mustacchi curr_line->li_context = line_context; 668*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data. 669*bc1f688bSRobert Mustacchi li_epilogue_begin = epilogue_begin; 670*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data. 671*bc1f688bSRobert Mustacchi li_prologue_end = prologue_end; 672*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_isa = isa; 673*bc1f688bSRobert Mustacchi line_count++; 674*bc1f688bSRobert Mustacchi 675*bc1f688bSRobert Mustacchi chain_line = (Dwarf_Chain) 676*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); 677*bc1f688bSRobert Mustacchi if (chain_line == NULL) { 678*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 679*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 680*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 681*bc1f688bSRobert Mustacchi } 682*bc1f688bSRobert Mustacchi chain_line->ch_item = curr_line; 683*bc1f688bSRobert Mustacchi if (head_chain == NULL) 684*bc1f688bSRobert Mustacchi head_chain = curr_chain = chain_line; 685*bc1f688bSRobert Mustacchi else { 686*bc1f688bSRobert Mustacchi curr_chain->ch_next = chain_line; 687*bc1f688bSRobert Mustacchi curr_chain = chain_line; 688*bc1f688bSRobert Mustacchi } 689*bc1f688bSRobert Mustacchi } 690*bc1f688bSRobert Mustacchi 691*bc1f688bSRobert Mustacchi basic_block = false; 692*bc1f688bSRobert Mustacchi prologue_end = false; 693*bc1f688bSRobert Mustacchi epilogue_begin = false; 694*bc1f688bSRobert Mustacchi break; 695*bc1f688bSRobert Mustacchi } 696*bc1f688bSRobert Mustacchi 697*bc1f688bSRobert Mustacchi case DW_LNS_advance_pc:{ 698*bc1f688bSRobert Mustacchi Dwarf_Unsigned utmp2; 699*bc1f688bSRobert Mustacchi 700*bc1f688bSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2); 701*bc1f688bSRobert Mustacchi leb128_num = (Dwarf_Word) utmp2; 702*bc1f688bSRobert Mustacchi address = 703*bc1f688bSRobert Mustacchi address + 704*bc1f688bSRobert Mustacchi prefix.pf_minimum_instruction_length * 705*bc1f688bSRobert Mustacchi leb128_num; 706*bc1f688bSRobert Mustacchi break; 707*bc1f688bSRobert Mustacchi } 708*bc1f688bSRobert Mustacchi 709*bc1f688bSRobert Mustacchi case DW_LNS_advance_line:{ 710*bc1f688bSRobert Mustacchi Dwarf_Signed stmp; 711*bc1f688bSRobert Mustacchi 712*bc1f688bSRobert Mustacchi DECODE_LEB128_SWORD(line_ptr, stmp); 713*bc1f688bSRobert Mustacchi advance_line = (Dwarf_Sword) stmp; 714*bc1f688bSRobert Mustacchi line = line + advance_line; 715*bc1f688bSRobert Mustacchi break; 716*bc1f688bSRobert Mustacchi } 717*bc1f688bSRobert Mustacchi 718*bc1f688bSRobert Mustacchi case DW_LNS_set_file:{ 719*bc1f688bSRobert Mustacchi Dwarf_Unsigned utmp2; 720*bc1f688bSRobert Mustacchi 721*bc1f688bSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2); 722*bc1f688bSRobert Mustacchi file = (Dwarf_Word) utmp2; 723*bc1f688bSRobert Mustacchi break; 724*bc1f688bSRobert Mustacchi } 725*bc1f688bSRobert Mustacchi 726*bc1f688bSRobert Mustacchi case DW_LNS_set_column:{ 727*bc1f688bSRobert Mustacchi Dwarf_Unsigned utmp2; 728*bc1f688bSRobert Mustacchi 729*bc1f688bSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2); 730*bc1f688bSRobert Mustacchi column = (Dwarf_Word) utmp2; 731*bc1f688bSRobert Mustacchi break; 732*bc1f688bSRobert Mustacchi } 733*bc1f688bSRobert Mustacchi 734*bc1f688bSRobert Mustacchi case DW_LNS_negate_stmt:{ 735*bc1f688bSRobert Mustacchi 736*bc1f688bSRobert Mustacchi is_stmt = !is_stmt; 737*bc1f688bSRobert Mustacchi break; 738*bc1f688bSRobert Mustacchi } 739*bc1f688bSRobert Mustacchi 740*bc1f688bSRobert Mustacchi case DW_LNS_set_basic_block:{ 741*bc1f688bSRobert Mustacchi 742*bc1f688bSRobert Mustacchi basic_block = true; 743*bc1f688bSRobert Mustacchi break; 744*bc1f688bSRobert Mustacchi } 745*bc1f688bSRobert Mustacchi 746*bc1f688bSRobert Mustacchi case DW_LNS_const_add_pc:{ 747*bc1f688bSRobert Mustacchi opcode = MAX_LINE_OP_CODE - prefix.pf_opcode_base; 748*bc1f688bSRobert Mustacchi address = address + 749*bc1f688bSRobert Mustacchi prefix.pf_minimum_instruction_length * (opcode / 750*bc1f688bSRobert Mustacchi prefix. 751*bc1f688bSRobert Mustacchi pf_line_range); 752*bc1f688bSRobert Mustacchi break; 753*bc1f688bSRobert Mustacchi } 754*bc1f688bSRobert Mustacchi 755*bc1f688bSRobert Mustacchi case DW_LNS_fixed_advance_pc:{ 756*bc1f688bSRobert Mustacchi 757*bc1f688bSRobert Mustacchi READ_UNALIGNED(dbg, fixed_advance_pc, Dwarf_Half, 758*bc1f688bSRobert Mustacchi line_ptr, sizeof(Dwarf_Half)); 759*bc1f688bSRobert Mustacchi line_ptr += sizeof(Dwarf_Half); 760*bc1f688bSRobert Mustacchi address = address + fixed_advance_pc; 761*bc1f688bSRobert Mustacchi break; 762*bc1f688bSRobert Mustacchi } 763*bc1f688bSRobert Mustacchi 764*bc1f688bSRobert Mustacchi /* New in DWARF3 */ 765*bc1f688bSRobert Mustacchi case DW_LNS_set_prologue_end:{ 766*bc1f688bSRobert Mustacchi 767*bc1f688bSRobert Mustacchi prologue_end = true; 768*bc1f688bSRobert Mustacchi break; 769*bc1f688bSRobert Mustacchi 770*bc1f688bSRobert Mustacchi 771*bc1f688bSRobert Mustacchi } 772*bc1f688bSRobert Mustacchi /* New in DWARF3 */ 773*bc1f688bSRobert Mustacchi case DW_LNS_set_epilogue_begin:{ 774*bc1f688bSRobert Mustacchi epilogue_begin = true; 775*bc1f688bSRobert Mustacchi break; 776*bc1f688bSRobert Mustacchi } 777*bc1f688bSRobert Mustacchi 778*bc1f688bSRobert Mustacchi /* New in DWARF3 */ 779*bc1f688bSRobert Mustacchi case DW_LNS_set_isa:{ 780*bc1f688bSRobert Mustacchi Dwarf_Unsigned utmp2; 781*bc1f688bSRobert Mustacchi 782*bc1f688bSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp2); 783*bc1f688bSRobert Mustacchi isa = utmp2; 784*bc1f688bSRobert Mustacchi if (isa != utmp2) { 785*bc1f688bSRobert Mustacchi /* The value of the isa did not fit in our 786*bc1f688bSRobert Mustacchi local so we record it wrong. declare an 787*bc1f688bSRobert Mustacchi error. */ 788*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 789*bc1f688bSRobert Mustacchi 790*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, 791*bc1f688bSRobert Mustacchi DW_DLE_LINE_NUM_OPERANDS_BAD); 792*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 793*bc1f688bSRobert Mustacchi } 794*bc1f688bSRobert Mustacchi break; 795*bc1f688bSRobert Mustacchi } 796*bc1f688bSRobert Mustacchi } 797*bc1f688bSRobert Mustacchi 798*bc1f688bSRobert Mustacchi } else if (type == LOP_EXTENDED) { 799*bc1f688bSRobert Mustacchi Dwarf_Unsigned utmp3; 800*bc1f688bSRobert Mustacchi 801*bc1f688bSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp3); 802*bc1f688bSRobert Mustacchi instr_length = (Dwarf_Word) utmp3; 803*bc1f688bSRobert Mustacchi /* Dwarf_Small is a ubyte and the extended opcode is a 804*bc1f688bSRobert Mustacchi ubyte, though not stated as clearly in the 2.0.0 spec as 805*bc1f688bSRobert Mustacchi one might hope. */ 806*bc1f688bSRobert Mustacchi ext_opcode = *(Dwarf_Small *) line_ptr; 807*bc1f688bSRobert Mustacchi line_ptr++; 808*bc1f688bSRobert Mustacchi switch (ext_opcode) { 809*bc1f688bSRobert Mustacchi 810*bc1f688bSRobert Mustacchi case DW_LNE_end_sequence:{ 811*bc1f688bSRobert Mustacchi end_sequence = true; 812*bc1f688bSRobert Mustacchi 813*bc1f688bSRobert Mustacchi if (dolines) { 814*bc1f688bSRobert Mustacchi curr_line = (Dwarf_Line) 815*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_LINE, 1); 816*bc1f688bSRobert Mustacchi if (curr_line == NULL) { 817*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 818*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 819*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 820*bc1f688bSRobert Mustacchi } 821*bc1f688bSRobert Mustacchi 822*bc1f688bSRobert Mustacchi curr_line->li_address = address; 823*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_file = 824*bc1f688bSRobert Mustacchi (Dwarf_Sword) file; 825*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_line = 826*bc1f688bSRobert Mustacchi (Dwarf_Sword) line; 827*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_column = 828*bc1f688bSRobert Mustacchi (Dwarf_Half) column; 829*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_is_stmt = 830*bc1f688bSRobert Mustacchi prefix.pf_default_is_stmt; 831*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data. 832*bc1f688bSRobert Mustacchi li_basic_block = basic_block; 833*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data. 834*bc1f688bSRobert Mustacchi li_end_sequence = end_sequence; 835*bc1f688bSRobert Mustacchi curr_line->li_context = line_context; 836*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data. 837*bc1f688bSRobert Mustacchi li_epilogue_begin = epilogue_begin; 838*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data. 839*bc1f688bSRobert Mustacchi li_prologue_end = prologue_end; 840*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_l_data.li_isa = isa; 841*bc1f688bSRobert Mustacchi line_count++; 842*bc1f688bSRobert Mustacchi 843*bc1f688bSRobert Mustacchi chain_line = (Dwarf_Chain) 844*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); 845*bc1f688bSRobert Mustacchi if (chain_line == NULL) { 846*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 847*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 848*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 849*bc1f688bSRobert Mustacchi } 850*bc1f688bSRobert Mustacchi chain_line->ch_item = curr_line; 851*bc1f688bSRobert Mustacchi 852*bc1f688bSRobert Mustacchi if (head_chain == NULL) 853*bc1f688bSRobert Mustacchi head_chain = curr_chain = chain_line; 854*bc1f688bSRobert Mustacchi else { 855*bc1f688bSRobert Mustacchi curr_chain->ch_next = chain_line; 856*bc1f688bSRobert Mustacchi curr_chain = chain_line; 857*bc1f688bSRobert Mustacchi } 858*bc1f688bSRobert Mustacchi } 859*bc1f688bSRobert Mustacchi 860*bc1f688bSRobert Mustacchi address = 0; 861*bc1f688bSRobert Mustacchi file = 1; 862*bc1f688bSRobert Mustacchi line = 1; 863*bc1f688bSRobert Mustacchi column = 0; 864*bc1f688bSRobert Mustacchi is_stmt = prefix.pf_default_is_stmt; 865*bc1f688bSRobert Mustacchi basic_block = false; 866*bc1f688bSRobert Mustacchi end_sequence = false; 867*bc1f688bSRobert Mustacchi prologue_end = false; 868*bc1f688bSRobert Mustacchi epilogue_begin = false; 869*bc1f688bSRobert Mustacchi 870*bc1f688bSRobert Mustacchi 871*bc1f688bSRobert Mustacchi break; 872*bc1f688bSRobert Mustacchi } 873*bc1f688bSRobert Mustacchi 874*bc1f688bSRobert Mustacchi case DW_LNE_set_address:{ 875*bc1f688bSRobert Mustacchi { 876*bc1f688bSRobert Mustacchi READ_UNALIGNED(dbg, address, Dwarf_Addr, 877*bc1f688bSRobert Mustacchi line_ptr, address_size); 878*bc1f688bSRobert Mustacchi if (doaddrs) { 879*bc1f688bSRobert Mustacchi curr_line = 880*bc1f688bSRobert Mustacchi (Dwarf_Line) _dwarf_get_alloc(dbg, 881*bc1f688bSRobert Mustacchi DW_DLA_LINE, 882*bc1f688bSRobert Mustacchi 1); 883*bc1f688bSRobert Mustacchi if (curr_line == NULL) { 884*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 885*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, 886*bc1f688bSRobert Mustacchi DW_DLE_ALLOC_FAIL); 887*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 888*bc1f688bSRobert Mustacchi } 889*bc1f688bSRobert Mustacchi 890*bc1f688bSRobert Mustacchi curr_line->li_address = address; 891*bc1f688bSRobert Mustacchi curr_line->li_addr_line.li_offset = 892*bc1f688bSRobert Mustacchi line_ptr - dbg->de_debug_line.dss_data; 893*bc1f688bSRobert Mustacchi 894*bc1f688bSRobert Mustacchi line_count++; 895*bc1f688bSRobert Mustacchi 896*bc1f688bSRobert Mustacchi chain_line = (Dwarf_Chain) 897*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); 898*bc1f688bSRobert Mustacchi if (chain_line == NULL) { 899*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 900*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, 901*bc1f688bSRobert Mustacchi DW_DLE_ALLOC_FAIL); 902*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 903*bc1f688bSRobert Mustacchi } 904*bc1f688bSRobert Mustacchi chain_line->ch_item = curr_line; 905*bc1f688bSRobert Mustacchi 906*bc1f688bSRobert Mustacchi if (head_chain == NULL) 907*bc1f688bSRobert Mustacchi head_chain = curr_chain = chain_line; 908*bc1f688bSRobert Mustacchi else { 909*bc1f688bSRobert Mustacchi curr_chain->ch_next = chain_line; 910*bc1f688bSRobert Mustacchi curr_chain = chain_line; 911*bc1f688bSRobert Mustacchi } 912*bc1f688bSRobert Mustacchi } 913*bc1f688bSRobert Mustacchi 914*bc1f688bSRobert Mustacchi line_ptr += address_size; 915*bc1f688bSRobert Mustacchi } 916*bc1f688bSRobert Mustacchi 917*bc1f688bSRobert Mustacchi break; 918*bc1f688bSRobert Mustacchi } 919*bc1f688bSRobert Mustacchi 920*bc1f688bSRobert Mustacchi case DW_LNE_define_file:{ 921*bc1f688bSRobert Mustacchi 922*bc1f688bSRobert Mustacchi if (dolines) { 923*bc1f688bSRobert Mustacchi cur_file_entry = (Dwarf_File_Entry) 924*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_FILE_ENTRY, 1); 925*bc1f688bSRobert Mustacchi if (cur_file_entry == NULL) { 926*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 927*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 928*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 929*bc1f688bSRobert Mustacchi } 930*bc1f688bSRobert Mustacchi 931*bc1f688bSRobert Mustacchi cur_file_entry->fi_file_name = 932*bc1f688bSRobert Mustacchi (Dwarf_Small *) line_ptr; 933*bc1f688bSRobert Mustacchi line_ptr = 934*bc1f688bSRobert Mustacchi line_ptr + strlen((char *) line_ptr) + 1; 935*bc1f688bSRobert Mustacchi 936*bc1f688bSRobert Mustacchi cur_file_entry->fi_dir_index = (Dwarf_Sword) 937*bc1f688bSRobert Mustacchi _dwarf_decode_u_leb128(line_ptr, 938*bc1f688bSRobert Mustacchi &leb128_length); 939*bc1f688bSRobert Mustacchi line_ptr = line_ptr + leb128_length; 940*bc1f688bSRobert Mustacchi 941*bc1f688bSRobert Mustacchi cur_file_entry->fi_time_last_mod = 942*bc1f688bSRobert Mustacchi _dwarf_decode_u_leb128(line_ptr, 943*bc1f688bSRobert Mustacchi &leb128_length); 944*bc1f688bSRobert Mustacchi line_ptr = line_ptr + leb128_length; 945*bc1f688bSRobert Mustacchi 946*bc1f688bSRobert Mustacchi cur_file_entry->fi_file_length = 947*bc1f688bSRobert Mustacchi _dwarf_decode_u_leb128(line_ptr, 948*bc1f688bSRobert Mustacchi &leb128_length); 949*bc1f688bSRobert Mustacchi line_ptr = line_ptr + leb128_length; 950*bc1f688bSRobert Mustacchi 951*bc1f688bSRobert Mustacchi if (file_entries == NULL) 952*bc1f688bSRobert Mustacchi file_entries = cur_file_entry; 953*bc1f688bSRobert Mustacchi else 954*bc1f688bSRobert Mustacchi prev_file_entry->fi_next = cur_file_entry; 955*bc1f688bSRobert Mustacchi prev_file_entry = cur_file_entry; 956*bc1f688bSRobert Mustacchi 957*bc1f688bSRobert Mustacchi file_entry_count++; 958*bc1f688bSRobert Mustacchi } 959*bc1f688bSRobert Mustacchi break; 960*bc1f688bSRobert Mustacchi } 961*bc1f688bSRobert Mustacchi 962*bc1f688bSRobert Mustacchi default:{ 963*bc1f688bSRobert Mustacchi /* This is an extended op code we do not know about, 964*bc1f688bSRobert Mustacchi other than we know now many bytes it is 965*bc1f688bSRobert Mustacchi and the op code and the bytes of operand. */ 966*bc1f688bSRobert Mustacchi Dwarf_Unsigned remaining_bytes = instr_length -1; 967*bc1f688bSRobert Mustacchi if(instr_length < 1 || remaining_bytes > DW_LNE_LEN_MAX) { 968*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 969*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, 970*bc1f688bSRobert Mustacchi DW_DLE_LINE_EXT_OPCODE_BAD); 971*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 972*bc1f688bSRobert Mustacchi } 973*bc1f688bSRobert Mustacchi line_ptr += remaining_bytes; 974*bc1f688bSRobert Mustacchi break; 975*bc1f688bSRobert Mustacchi } 976*bc1f688bSRobert Mustacchi } 977*bc1f688bSRobert Mustacchi 978*bc1f688bSRobert Mustacchi } 979*bc1f688bSRobert Mustacchi } 980*bc1f688bSRobert Mustacchi 981*bc1f688bSRobert Mustacchi block_line = (Dwarf_Line *) 982*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_LIST, line_count); 983*bc1f688bSRobert Mustacchi if (block_line == NULL) { 984*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 985*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 986*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 987*bc1f688bSRobert Mustacchi } 988*bc1f688bSRobert Mustacchi 989*bc1f688bSRobert Mustacchi curr_chain = head_chain; 990*bc1f688bSRobert Mustacchi for (i = 0; i < line_count; i++) { 991*bc1f688bSRobert Mustacchi *(block_line + i) = curr_chain->ch_item; 992*bc1f688bSRobert Mustacchi head_chain = curr_chain; 993*bc1f688bSRobert Mustacchi curr_chain = curr_chain->ch_next; 994*bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, head_chain, DW_DLA_CHAIN); 995*bc1f688bSRobert Mustacchi } 996*bc1f688bSRobert Mustacchi 997*bc1f688bSRobert Mustacchi line_context->lc_file_entries = file_entries; 998*bc1f688bSRobert Mustacchi line_context->lc_file_entry_count = file_entry_count; 999*bc1f688bSRobert Mustacchi line_context->lc_include_directories_count = 1000*bc1f688bSRobert Mustacchi prefix.pf_include_directories_count; 1001*bc1f688bSRobert Mustacchi if (prefix.pf_include_directories_count > 0) { 1002*bc1f688bSRobert Mustacchi /* This gets a pointer to the *first* include dir. The others 1003*bc1f688bSRobert Mustacchi follow directly with the standard DWARF2/3 NUL byte 1004*bc1f688bSRobert Mustacchi following the last. */ 1005*bc1f688bSRobert Mustacchi line_context->lc_include_directories = 1006*bc1f688bSRobert Mustacchi prefix.pf_include_directories[0]; 1007*bc1f688bSRobert Mustacchi } 1008*bc1f688bSRobert Mustacchi 1009*bc1f688bSRobert Mustacchi line_context->lc_line_count = line_count; 1010*bc1f688bSRobert Mustacchi line_context->lc_compilation_directory = comp_dir; 1011*bc1f688bSRobert Mustacchi line_context->lc_version_number = prefix.pf_version; 1012*bc1f688bSRobert Mustacchi line_context->lc_dbg = dbg; 1013*bc1f688bSRobert Mustacchi *count = line_count; 1014*bc1f688bSRobert Mustacchi 1015*bc1f688bSRobert Mustacchi *linebuf = block_line; 1016*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(&prefix); 1017*bc1f688bSRobert Mustacchi return (DW_DLV_OK); 1018*bc1f688bSRobert Mustacchi } 1019*bc1f688bSRobert Mustacchi 1020*bc1f688bSRobert Mustacchi int 1021*bc1f688bSRobert Mustacchi dwarf_srclines(Dwarf_Die die, 1022*bc1f688bSRobert Mustacchi Dwarf_Line ** linebuf, 1023*bc1f688bSRobert Mustacchi Dwarf_Signed * linecount, Dwarf_Error * error) 1024*bc1f688bSRobert Mustacchi { 1025*bc1f688bSRobert Mustacchi Dwarf_Signed count = 0; 1026*bc1f688bSRobert Mustacchi int res = _dwarf_internal_srclines(die, linebuf, &count, 1027*bc1f688bSRobert Mustacchi /* addrlist= */ false, 1028*bc1f688bSRobert Mustacchi /* linelist= */ true, error); 1029*bc1f688bSRobert Mustacchi if (res != DW_DLV_OK) { 1030*bc1f688bSRobert Mustacchi return res; 1031*bc1f688bSRobert Mustacchi } 1032*bc1f688bSRobert Mustacchi *linecount = count; 1033*bc1f688bSRobert Mustacchi return res; 1034*bc1f688bSRobert Mustacchi } 1035*bc1f688bSRobert Mustacchi 1036*bc1f688bSRobert Mustacchi 1037*bc1f688bSRobert Mustacchi 1038*bc1f688bSRobert Mustacchi /* Every line table entry (except DW_DLE_end_sequence, 1039*bc1f688bSRobert Mustacchi which is returned using dwarf_lineendsequence()) 1040*bc1f688bSRobert Mustacchi potentially has the begin-statement 1041*bc1f688bSRobert Mustacchi flag marked 'on'. This returns thru *return_bool, 1042*bc1f688bSRobert Mustacchi the begin-statement flag. 1043*bc1f688bSRobert Mustacchi */ 1044*bc1f688bSRobert Mustacchi 1045*bc1f688bSRobert Mustacchi int 1046*bc1f688bSRobert Mustacchi dwarf_linebeginstatement(Dwarf_Line line, 1047*bc1f688bSRobert Mustacchi Dwarf_Bool * return_bool, Dwarf_Error * error) 1048*bc1f688bSRobert Mustacchi { 1049*bc1f688bSRobert Mustacchi if (line == NULL || return_bool == 0) { 1050*bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); 1051*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1052*bc1f688bSRobert Mustacchi } 1053*bc1f688bSRobert Mustacchi 1054*bc1f688bSRobert Mustacchi *return_bool = (line->li_addr_line.li_l_data.li_is_stmt); 1055*bc1f688bSRobert Mustacchi return DW_DLV_OK; 1056*bc1f688bSRobert Mustacchi } 1057*bc1f688bSRobert Mustacchi 1058*bc1f688bSRobert Mustacchi /* At the end of any contiguous line-table there may be 1059*bc1f688bSRobert Mustacchi a DW_LNE_end_sequence operator. 1060*bc1f688bSRobert Mustacchi This returns non-zero thru *return_bool 1061*bc1f688bSRobert Mustacchi if and only if this 'line' entry was a DW_LNE_end_sequence. 1062*bc1f688bSRobert Mustacchi 1063*bc1f688bSRobert Mustacchi Within a compilation unit or function there may be multiple 1064*bc1f688bSRobert Mustacchi line tables, each ending with a DW_LNE_end_sequence. 1065*bc1f688bSRobert Mustacchi Each table describes a contiguous region. 1066*bc1f688bSRobert Mustacchi Because compilers may split function code up in arbitrary ways 1067*bc1f688bSRobert Mustacchi compilers may need to emit multiple contigous regions (ie 1068*bc1f688bSRobert Mustacchi line tables) for a single function. 1069*bc1f688bSRobert Mustacchi See the DWARF3 spec section 6.2. 1070*bc1f688bSRobert Mustacchi */ 1071*bc1f688bSRobert Mustacchi int 1072*bc1f688bSRobert Mustacchi dwarf_lineendsequence(Dwarf_Line line, 1073*bc1f688bSRobert Mustacchi Dwarf_Bool * return_bool, Dwarf_Error * error) 1074*bc1f688bSRobert Mustacchi { 1075*bc1f688bSRobert Mustacchi if (line == NULL) { 1076*bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); 1077*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1078*bc1f688bSRobert Mustacchi } 1079*bc1f688bSRobert Mustacchi 1080*bc1f688bSRobert Mustacchi *return_bool = (line->li_addr_line.li_l_data.li_end_sequence); 1081*bc1f688bSRobert Mustacchi return DW_DLV_OK; 1082*bc1f688bSRobert Mustacchi } 1083*bc1f688bSRobert Mustacchi 1084*bc1f688bSRobert Mustacchi 1085*bc1f688bSRobert Mustacchi /* Each 'line' entry has a line-number. 1086*bc1f688bSRobert Mustacchi If the entry is a DW_LNE_end_sequence the line-number is 1087*bc1f688bSRobert Mustacchi meaningless (see dwarf_lineendsequence(), just above). 1088*bc1f688bSRobert Mustacchi */ 1089*bc1f688bSRobert Mustacchi int 1090*bc1f688bSRobert Mustacchi dwarf_lineno(Dwarf_Line line, 1091*bc1f688bSRobert Mustacchi Dwarf_Unsigned * ret_lineno, Dwarf_Error * error) 1092*bc1f688bSRobert Mustacchi { 1093*bc1f688bSRobert Mustacchi if (line == NULL || ret_lineno == 0) { 1094*bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); 1095*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1096*bc1f688bSRobert Mustacchi } 1097*bc1f688bSRobert Mustacchi 1098*bc1f688bSRobert Mustacchi *ret_lineno = (line->li_addr_line.li_l_data.li_line); 1099*bc1f688bSRobert Mustacchi return DW_DLV_OK; 1100*bc1f688bSRobert Mustacchi } 1101*bc1f688bSRobert Mustacchi 1102*bc1f688bSRobert Mustacchi /* Each 'line' entry has a file-number, and index into the file table. 1103*bc1f688bSRobert Mustacchi If the entry is a DW_LNE_end_sequence the index is 1104*bc1f688bSRobert Mustacchi meaningless (see dwarf_lineendsequence(), just above). 1105*bc1f688bSRobert Mustacchi The file number returned is an index into the file table 1106*bc1f688bSRobert Mustacchi produced by dwarf_srcfiles(), but care is required: the 1107*bc1f688bSRobert Mustacchi li_file begins with 1 for real files, so that the li_file returned here 1108*bc1f688bSRobert Mustacchi is 1 greater than its index into the dwarf_srcfiles() output array. 1109*bc1f688bSRobert Mustacchi And entries from DW_LNE_define_file don't appear in 1110*bc1f688bSRobert Mustacchi the dwarf_srcfiles() output so file indexes from here may exceed 1111*bc1f688bSRobert Mustacchi the size of the dwarf_srcfiles() output array size. 1112*bc1f688bSRobert Mustacchi */ 1113*bc1f688bSRobert Mustacchi int 1114*bc1f688bSRobert Mustacchi dwarf_line_srcfileno(Dwarf_Line line, 1115*bc1f688bSRobert Mustacchi Dwarf_Unsigned * ret_fileno, Dwarf_Error * error) 1116*bc1f688bSRobert Mustacchi { 1117*bc1f688bSRobert Mustacchi if (line == NULL || ret_fileno == 0) { 1118*bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); 1119*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1120*bc1f688bSRobert Mustacchi } 1121*bc1f688bSRobert Mustacchi /* li_file must be <= line->li_context->lc_file_entry_count else it 1122*bc1f688bSRobert Mustacchi is trash. li_file 0 means not attributable to any source file 1123*bc1f688bSRobert Mustacchi per dwarf2/3 spec. */ 1124*bc1f688bSRobert Mustacchi 1125*bc1f688bSRobert Mustacchi *ret_fileno = (line->li_addr_line.li_l_data.li_file); 1126*bc1f688bSRobert Mustacchi return DW_DLV_OK; 1127*bc1f688bSRobert Mustacchi } 1128*bc1f688bSRobert Mustacchi 1129*bc1f688bSRobert Mustacchi 1130*bc1f688bSRobert Mustacchi /* Each 'line' entry has a line-address. 1131*bc1f688bSRobert Mustacchi If the entry is a DW_LNE_end_sequence the adddress 1132*bc1f688bSRobert Mustacchi is one-beyond the last address this contigous region 1133*bc1f688bSRobert Mustacchi covers, so the address is not inside the region, 1134*bc1f688bSRobert Mustacchi but is just outside it. 1135*bc1f688bSRobert Mustacchi */ 1136*bc1f688bSRobert Mustacchi int 1137*bc1f688bSRobert Mustacchi dwarf_lineaddr(Dwarf_Line line, 1138*bc1f688bSRobert Mustacchi Dwarf_Addr * ret_lineaddr, Dwarf_Error * error) 1139*bc1f688bSRobert Mustacchi { 1140*bc1f688bSRobert Mustacchi if (line == NULL || ret_lineaddr == 0) { 1141*bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); 1142*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1143*bc1f688bSRobert Mustacchi } 1144*bc1f688bSRobert Mustacchi 1145*bc1f688bSRobert Mustacchi *ret_lineaddr = (line->li_address); 1146*bc1f688bSRobert Mustacchi return DW_DLV_OK; 1147*bc1f688bSRobert Mustacchi } 1148*bc1f688bSRobert Mustacchi 1149*bc1f688bSRobert Mustacchi 1150*bc1f688bSRobert Mustacchi /* Each 'line' entry has a column-within-line (offset 1151*bc1f688bSRobert Mustacchi within the line) where the 1152*bc1f688bSRobert Mustacchi source text begins. 1153*bc1f688bSRobert Mustacchi If the entry is a DW_LNE_end_sequence the line-number is 1154*bc1f688bSRobert Mustacchi meaningless (see dwarf_lineendsequence(), just above). 1155*bc1f688bSRobert Mustacchi Lines of text begin at column 1. The value 0 1156*bc1f688bSRobert Mustacchi means the line begins at the left edge of the line. 1157*bc1f688bSRobert Mustacchi (See the DWARF3 spec, section 6.2.2). 1158*bc1f688bSRobert Mustacchi */ 1159*bc1f688bSRobert Mustacchi int 1160*bc1f688bSRobert Mustacchi dwarf_lineoff(Dwarf_Line line, 1161*bc1f688bSRobert Mustacchi Dwarf_Signed * ret_lineoff, Dwarf_Error * error) 1162*bc1f688bSRobert Mustacchi { 1163*bc1f688bSRobert Mustacchi if (line == NULL || ret_lineoff == 0) { 1164*bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); 1165*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1166*bc1f688bSRobert Mustacchi } 1167*bc1f688bSRobert Mustacchi 1168*bc1f688bSRobert Mustacchi *ret_lineoff = 1169*bc1f688bSRobert Mustacchi (line->li_addr_line.li_l_data.li_column == 1170*bc1f688bSRobert Mustacchi 0 ? -1 : line->li_addr_line.li_l_data.li_column); 1171*bc1f688bSRobert Mustacchi return DW_DLV_OK; 1172*bc1f688bSRobert Mustacchi } 1173*bc1f688bSRobert Mustacchi 1174*bc1f688bSRobert Mustacchi 1175*bc1f688bSRobert Mustacchi int 1176*bc1f688bSRobert Mustacchi dwarf_linesrc(Dwarf_Line line, char **ret_linesrc, Dwarf_Error * error) 1177*bc1f688bSRobert Mustacchi { 1178*bc1f688bSRobert Mustacchi Dwarf_Signed i = 0; 1179*bc1f688bSRobert Mustacchi Dwarf_File_Entry file_entry; 1180*bc1f688bSRobert Mustacchi Dwarf_Small *name_buffer = 0; 1181*bc1f688bSRobert Mustacchi Dwarf_Small *include_directories = 0; 1182*bc1f688bSRobert Mustacchi Dwarf_Small include_direc_full_path = 0; 1183*bc1f688bSRobert Mustacchi Dwarf_Small file_name_full_path = 0; 1184*bc1f688bSRobert Mustacchi Dwarf_Debug dbg = 0; 1185*bc1f688bSRobert Mustacchi unsigned int comp_dir_len = 0; 1186*bc1f688bSRobert Mustacchi 1187*bc1f688bSRobert Mustacchi if (line == NULL) { 1188*bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); 1189*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1190*bc1f688bSRobert Mustacchi } 1191*bc1f688bSRobert Mustacchi 1192*bc1f688bSRobert Mustacchi if (line->li_context == NULL) { 1193*bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_NULL); 1194*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1195*bc1f688bSRobert Mustacchi } 1196*bc1f688bSRobert Mustacchi dbg = line->li_context->lc_dbg; 1197*bc1f688bSRobert Mustacchi 1198*bc1f688bSRobert Mustacchi if (line->li_addr_line.li_l_data.li_file > 1199*bc1f688bSRobert Mustacchi line->li_context->lc_file_entry_count) { 1200*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_LINE_FILE_NUM_BAD); 1201*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1202*bc1f688bSRobert Mustacchi } 1203*bc1f688bSRobert Mustacchi 1204*bc1f688bSRobert Mustacchi if (line->li_addr_line.li_l_data.li_file == 0) { 1205*bc1f688bSRobert Mustacchi /* No file name known: see dwarf2/3 spec. */ 1206*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_NO_FILE_NAME); 1207*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1208*bc1f688bSRobert Mustacchi } 1209*bc1f688bSRobert Mustacchi file_entry = line->li_context->lc_file_entries; 1210*bc1f688bSRobert Mustacchi /* ASSERT: li_file > 0, dwarf correctness issue, see line table 1211*bc1f688bSRobert Mustacchi definition of dwarf2/3 spec. */ 1212*bc1f688bSRobert Mustacchi /* Example: if li_file is 2 and lc_file_entry_count is 3, 1213*bc1f688bSRobert Mustacchi file_entry is file 3 (1 based), aka 2( 0 based) file_entry->next 1214*bc1f688bSRobert Mustacchi is file 2 (1 based), aka 1( 0 based) file_entry->next->next is 1215*bc1f688bSRobert Mustacchi file 1 (1 based), aka 0( 0 based) file_entry->next->next->next 1216*bc1f688bSRobert Mustacchi is NULL. 1217*bc1f688bSRobert Mustacchi 1218*bc1f688bSRobert Mustacchi and this loop finds the file_entry we need (2 (1 based) in this 1219*bc1f688bSRobert Mustacchi case). Because lc_file_entries are in reverse order and 1220*bc1f688bSRobert Mustacchi effectively zero based as a count whereas li_file is 1 based. */ 1221*bc1f688bSRobert Mustacchi for (i = line->li_addr_line.li_l_data.li_file - 1; i > 0; i--) 1222*bc1f688bSRobert Mustacchi file_entry = file_entry->fi_next; 1223*bc1f688bSRobert Mustacchi 1224*bc1f688bSRobert Mustacchi if (file_entry->fi_file_name == NULL) { 1225*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_NO_FILE_NAME); 1226*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1227*bc1f688bSRobert Mustacchi } 1228*bc1f688bSRobert Mustacchi 1229*bc1f688bSRobert Mustacchi file_name_full_path = file_name_is_full_path(file_entry->fi_file_name); 1230*bc1f688bSRobert Mustacchi if (file_name_full_path) { 1231*bc1f688bSRobert Mustacchi *ret_linesrc = ((char *) file_entry->fi_file_name); 1232*bc1f688bSRobert Mustacchi return DW_DLV_OK; 1233*bc1f688bSRobert Mustacchi } 1234*bc1f688bSRobert Mustacchi 1235*bc1f688bSRobert Mustacchi if (file_entry->fi_dir_index == 0) { 1236*bc1f688bSRobert Mustacchi 1237*bc1f688bSRobert Mustacchi /* dir_index of 0 means that the compilation was in the 1238*bc1f688bSRobert Mustacchi 'current directory of compilation' */ 1239*bc1f688bSRobert Mustacchi if (line->li_context->lc_compilation_directory == NULL) { 1240*bc1f688bSRobert Mustacchi /* we don't actually *have* a current directory of 1241*bc1f688bSRobert Mustacchi compilation: DW_AT_comp_dir was not present Rather than 1242*bc1f688bSRobert Mustacchi emitting DW_DLE_NO_COMP_DIR lets just make an empty name 1243*bc1f688bSRobert Mustacchi here. In other words, do the best we can with what we do 1244*bc1f688bSRobert Mustacchi have instead of reporting an error. _dwarf_error(dbg, 1245*bc1f688bSRobert Mustacchi error, DW_DLE_NO_COMP_DIR); return(DW_DLV_ERROR); */ 1246*bc1f688bSRobert Mustacchi comp_dir_len = 0; 1247*bc1f688bSRobert Mustacchi } else { 1248*bc1f688bSRobert Mustacchi comp_dir_len = strlen((char *) 1249*bc1f688bSRobert Mustacchi (line->li_context-> 1250*bc1f688bSRobert Mustacchi lc_compilation_directory)); 1251*bc1f688bSRobert Mustacchi } 1252*bc1f688bSRobert Mustacchi 1253*bc1f688bSRobert Mustacchi name_buffer = 1254*bc1f688bSRobert Mustacchi _dwarf_get_alloc(line->li_context->lc_dbg, DW_DLA_STRING, 1255*bc1f688bSRobert Mustacchi comp_dir_len + 1 + 1256*bc1f688bSRobert Mustacchi strlen((char *) file_entry->fi_file_name) + 1257*bc1f688bSRobert Mustacchi 1); 1258*bc1f688bSRobert Mustacchi if (name_buffer == NULL) { 1259*bc1f688bSRobert Mustacchi _dwarf_error(line->li_context->lc_dbg, error, 1260*bc1f688bSRobert Mustacchi DW_DLE_ALLOC_FAIL); 1261*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1262*bc1f688bSRobert Mustacchi } 1263*bc1f688bSRobert Mustacchi 1264*bc1f688bSRobert Mustacchi if (comp_dir_len > 0) { 1265*bc1f688bSRobert Mustacchi /* if comp_dir_len is 0 we do not want to put a / in front 1266*bc1f688bSRobert Mustacchi of the fi_file_name as we just don't know anything. */ 1267*bc1f688bSRobert Mustacchi strcpy((char *) name_buffer, 1268*bc1f688bSRobert Mustacchi (char *) (line->li_context-> 1269*bc1f688bSRobert Mustacchi lc_compilation_directory)); 1270*bc1f688bSRobert Mustacchi strcat((char *) name_buffer, "/"); 1271*bc1f688bSRobert Mustacchi } 1272*bc1f688bSRobert Mustacchi strcat((char *) name_buffer, (char *) file_entry->fi_file_name); 1273*bc1f688bSRobert Mustacchi *ret_linesrc = ((char *) name_buffer); 1274*bc1f688bSRobert Mustacchi return DW_DLV_OK; 1275*bc1f688bSRobert Mustacchi } 1276*bc1f688bSRobert Mustacchi 1277*bc1f688bSRobert Mustacchi if (file_entry->fi_dir_index > 1278*bc1f688bSRobert Mustacchi line->li_context->lc_include_directories_count) { 1279*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_INCL_DIR_NUM_BAD); 1280*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1281*bc1f688bSRobert Mustacchi } 1282*bc1f688bSRobert Mustacchi 1283*bc1f688bSRobert Mustacchi include_directories = line->li_context->lc_include_directories; 1284*bc1f688bSRobert Mustacchi for (i = file_entry->fi_dir_index - 1; i > 0; i--) 1285*bc1f688bSRobert Mustacchi include_directories += strlen((char *) include_directories) + 1; 1286*bc1f688bSRobert Mustacchi 1287*bc1f688bSRobert Mustacchi if (line->li_context->lc_compilation_directory) { 1288*bc1f688bSRobert Mustacchi comp_dir_len = strlen((char *) 1289*bc1f688bSRobert Mustacchi (line->li_context->lc_compilation_directory)); 1290*bc1f688bSRobert Mustacchi } else { 1291*bc1f688bSRobert Mustacchi /* No DW_AT_comp_dir present. Do the best we can without it. */ 1292*bc1f688bSRobert Mustacchi comp_dir_len = 0; 1293*bc1f688bSRobert Mustacchi } 1294*bc1f688bSRobert Mustacchi 1295*bc1f688bSRobert Mustacchi include_direc_full_path = file_name_is_full_path(include_directories); 1296*bc1f688bSRobert Mustacchi name_buffer = _dwarf_get_alloc(dbg, DW_DLA_STRING, 1297*bc1f688bSRobert Mustacchi (include_direc_full_path ? 0 : comp_dir_len + 1) + 1298*bc1f688bSRobert Mustacchi strlen((char *)include_directories) + 1 + 1299*bc1f688bSRobert Mustacchi strlen((char *)file_entry->fi_file_name) + 1); 1300*bc1f688bSRobert Mustacchi if (name_buffer == NULL) { 1301*bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); 1302*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1303*bc1f688bSRobert Mustacchi } 1304*bc1f688bSRobert Mustacchi 1305*bc1f688bSRobert Mustacchi if (!include_direc_full_path) { 1306*bc1f688bSRobert Mustacchi if (comp_dir_len > 0) { 1307*bc1f688bSRobert Mustacchi strcpy((char *)name_buffer, 1308*bc1f688bSRobert Mustacchi (char *)line->li_context->lc_compilation_directory); 1309*bc1f688bSRobert Mustacchi /* Who provides the / needed after the compilation 1310*bc1f688bSRobert Mustacchi directory? */ 1311*bc1f688bSRobert Mustacchi if (!is_path_separator(name_buffer[comp_dir_len - 1])) { 1312*bc1f688bSRobert Mustacchi /* Here we provide the / separator. It 1313*bc1f688bSRobert Mustacchi should work ok for Windows */ 1314*bc1f688bSRobert Mustacchi /* Overwrite previous nul terminator with needed / */ 1315*bc1f688bSRobert Mustacchi name_buffer[comp_dir_len] = '/'; 1316*bc1f688bSRobert Mustacchi name_buffer[comp_dir_len + 1] = 0; 1317*bc1f688bSRobert Mustacchi } 1318*bc1f688bSRobert Mustacchi } 1319*bc1f688bSRobert Mustacchi } else { 1320*bc1f688bSRobert Mustacchi strcpy((char *) name_buffer, ""); 1321*bc1f688bSRobert Mustacchi } 1322*bc1f688bSRobert Mustacchi strcat((char *) name_buffer, (char *) include_directories); 1323*bc1f688bSRobert Mustacchi strcat((char *) name_buffer, "/"); 1324*bc1f688bSRobert Mustacchi strcat((char *) name_buffer, (char *) file_entry->fi_file_name); 1325*bc1f688bSRobert Mustacchi *ret_linesrc = ((char *) name_buffer); 1326*bc1f688bSRobert Mustacchi return DW_DLV_OK; 1327*bc1f688bSRobert Mustacchi } 1328*bc1f688bSRobert Mustacchi 1329*bc1f688bSRobert Mustacchi /* Every line table entry potentially has the basic-block-start 1330*bc1f688bSRobert Mustacchi flag marked 'on'. This returns thru *return_bool, 1331*bc1f688bSRobert Mustacchi the basic-block-start flag. 1332*bc1f688bSRobert Mustacchi */ 1333*bc1f688bSRobert Mustacchi int 1334*bc1f688bSRobert Mustacchi dwarf_lineblock(Dwarf_Line line, 1335*bc1f688bSRobert Mustacchi Dwarf_Bool * return_bool, Dwarf_Error * error) 1336*bc1f688bSRobert Mustacchi { 1337*bc1f688bSRobert Mustacchi if (line == NULL) { 1338*bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); 1339*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1340*bc1f688bSRobert Mustacchi } 1341*bc1f688bSRobert Mustacchi *return_bool = (line->li_addr_line.li_l_data.li_basic_block); 1342*bc1f688bSRobert Mustacchi return DW_DLV_OK; 1343*bc1f688bSRobert Mustacchi } 1344*bc1f688bSRobert Mustacchi 1345*bc1f688bSRobert Mustacchi 1346*bc1f688bSRobert Mustacchi #if 0 /* Ignore this. This needs major 1347*bc1f688bSRobert Mustacchi re-work. */ 1348*bc1f688bSRobert Mustacchi /* 1349*bc1f688bSRobert Mustacchi This routine works by looking for exact matches between 1350*bc1f688bSRobert Mustacchi the current line address and pc, and crossovers from 1351*bc1f688bSRobert Mustacchi from less than pc value to greater than. At each line 1352*bc1f688bSRobert Mustacchi that satisfies the above, it records a pointer to the 1353*bc1f688bSRobert Mustacchi line, and the difference between the address and pc. 1354*bc1f688bSRobert Mustacchi It then scans these pointers and picks out those with 1355*bc1f688bSRobert Mustacchi the smallest difference between pc and address. 1356*bc1f688bSRobert Mustacchi */ 1357*bc1f688bSRobert Mustacchi int 1358*bc1f688bSRobert Mustacchi dwarf_pclines(Dwarf_Debug dbg, 1359*bc1f688bSRobert Mustacchi Dwarf_Addr pc, 1360*bc1f688bSRobert Mustacchi Dwarf_Line ** linebuf, 1361*bc1f688bSRobert Mustacchi Dwarf_Signed slide, 1362*bc1f688bSRobert Mustacchi Dwarf_Signed * linecount, Dwarf_Error * error) 1363*bc1f688bSRobert Mustacchi { 1364*bc1f688bSRobert Mustacchi /* 1365*bc1f688bSRobert Mustacchi Scans the line matrix for the current cu to which a pointer 1366*bc1f688bSRobert Mustacchi exists in dbg. */ 1367*bc1f688bSRobert Mustacchi Dwarf_Line line; 1368*bc1f688bSRobert Mustacchi Dwarf_Line prev_line; 1369*bc1f688bSRobert Mustacchi 1370*bc1f688bSRobert Mustacchi /* 1371*bc1f688bSRobert Mustacchi These flags are for efficiency reasons. Check_line is true 1372*bc1f688bSRobert Mustacchi initially, but set false when the address of the current line is 1373*bc1f688bSRobert Mustacchi greater than pc. It is set true only when the address of the 1374*bc1f688bSRobert Mustacchi current line falls below pc. This assumes that addresses within 1375*bc1f688bSRobert Mustacchi the same segment increase, and we are only interested in the 1376*bc1f688bSRobert Mustacchi switch from a less than pc address to a greater than. First_line 1377*bc1f688bSRobert Mustacchi is set true initially, but set false after the first line is 1378*bc1f688bSRobert Mustacchi scanned. This is to prevent looking at the address of previous 1379*bc1f688bSRobert Mustacchi line when slide is DW_DLS_BACKWARD, and the first line is being 1380*bc1f688bSRobert Mustacchi scanned. */ 1381*bc1f688bSRobert Mustacchi Dwarf_Bool check_line, first_line; 1382*bc1f688bSRobert Mustacchi 1383*bc1f688bSRobert Mustacchi /* 1384*bc1f688bSRobert Mustacchi Diff tracks the smallest difference a line address and the input 1385*bc1f688bSRobert Mustacchi pc value. */ 1386*bc1f688bSRobert Mustacchi Dwarf_Signed diff, i; 1387*bc1f688bSRobert Mustacchi 1388*bc1f688bSRobert Mustacchi /* 1389*bc1f688bSRobert Mustacchi For the slide = DW_DLS_BACKWARD case, pc_less is the value of 1390*bc1f688bSRobert Mustacchi the address of the line immediately preceding the first line 1391*bc1f688bSRobert Mustacchi that has value greater than pc. For the slide = DW_DLS_FORWARD 1392*bc1f688bSRobert Mustacchi case, pc_more is the values of address for the first line that 1393*bc1f688bSRobert Mustacchi is greater than pc. Diff is the difference between either of the 1394*bc1f688bSRobert Mustacchi these values and pc. */ 1395*bc1f688bSRobert Mustacchi Dwarf_Addr pc_less, pc_more; 1396*bc1f688bSRobert Mustacchi 1397*bc1f688bSRobert Mustacchi /* 1398*bc1f688bSRobert Mustacchi Pc_line_buf points to a chain of pointers to lines of which 1399*bc1f688bSRobert Mustacchi those with a diff equal to the smallest difference will be 1400*bc1f688bSRobert Mustacchi returned. */ 1401*bc1f688bSRobert Mustacchi Dwarf_Line *pc_line_buf, *pc_line; 1402*bc1f688bSRobert Mustacchi 1403*bc1f688bSRobert Mustacchi /* 1404*bc1f688bSRobert Mustacchi Chain_count counts the number of lines in the above chain for 1405*bc1f688bSRobert Mustacchi which the diff is equal to the smallest difference This is the 1406*bc1f688bSRobert Mustacchi number returned by this routine. */ 1407*bc1f688bSRobert Mustacchi Dwarf_Signed chain_count; 1408*bc1f688bSRobert Mustacchi 1409*bc1f688bSRobert Mustacchi chain_head = NULL; 1410*bc1f688bSRobert Mustacchi 1411*bc1f688bSRobert Mustacchi check_line = true; 1412*bc1f688bSRobert Mustacchi first_line = true; 1413*bc1f688bSRobert Mustacchi diff = MAX_LINE_DIFF; 1414*bc1f688bSRobert Mustacchi 1415*bc1f688bSRobert Mustacchi for (i = 0; i < dbg->de_cu_line_count; i++) { 1416*bc1f688bSRobert Mustacchi 1417*bc1f688bSRobert Mustacchi line = *(dbg->de_cu_line_ptr + i); 1418*bc1f688bSRobert Mustacchi prev_line = first_line ? NULL : *(dbg->de_cu_line_ptr + i - 1); 1419*bc1f688bSRobert Mustacchi 1420*bc1f688bSRobert Mustacchi if (line->li_address == pc) { 1421*bc1f688bSRobert Mustacchi chain_ptr = (struct chain *) 1422*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); 1423*bc1f688bSRobert Mustacchi if (chain_ptr == NULL) { 1424*bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL); 1425*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1426*bc1f688bSRobert Mustacchi } 1427*bc1f688bSRobert Mustacchi 1428*bc1f688bSRobert Mustacchi chain_ptr->line = line; 1429*bc1f688bSRobert Mustacchi chain_ptr->diff = diff = 0; 1430*bc1f688bSRobert Mustacchi chain_ptr->next = chain_head; 1431*bc1f688bSRobert Mustacchi chain_head = chain_ptr; 1432*bc1f688bSRobert Mustacchi } else 1433*bc1f688bSRobert Mustacchi /* 1434*bc1f688bSRobert Mustacchi Look for crossover from less than pc address to greater 1435*bc1f688bSRobert Mustacchi than. */ 1436*bc1f688bSRobert Mustacchi if (check_line && line->li_address > pc && 1437*bc1f688bSRobert Mustacchi (first_line ? 0 : prev_line->li_address) < pc) 1438*bc1f688bSRobert Mustacchi 1439*bc1f688bSRobert Mustacchi if (slide == DW_DLS_BACKWARD && !first_line) { 1440*bc1f688bSRobert Mustacchi pc_less = prev_line->li_address; 1441*bc1f688bSRobert Mustacchi if (pc - pc_less <= diff) { 1442*bc1f688bSRobert Mustacchi chain_ptr = (struct chain *) 1443*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); 1444*bc1f688bSRobert Mustacchi if (chain_ptr == NULL) { 1445*bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL); 1446*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1447*bc1f688bSRobert Mustacchi } 1448*bc1f688bSRobert Mustacchi 1449*bc1f688bSRobert Mustacchi chain_ptr->line = prev_line; 1450*bc1f688bSRobert Mustacchi chain_ptr->diff = diff = pc - pc_less; 1451*bc1f688bSRobert Mustacchi chain_ptr->next = chain_head; 1452*bc1f688bSRobert Mustacchi chain_head = chain_ptr; 1453*bc1f688bSRobert Mustacchi } 1454*bc1f688bSRobert Mustacchi check_line = false; 1455*bc1f688bSRobert Mustacchi } else if (slide == DW_DLS_FORWARD) { 1456*bc1f688bSRobert Mustacchi pc_more = line->li_address; 1457*bc1f688bSRobert Mustacchi if (pc_more - pc <= diff) { 1458*bc1f688bSRobert Mustacchi chain_ptr = (struct chain *) 1459*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); 1460*bc1f688bSRobert Mustacchi if (chain_ptr == NULL) { 1461*bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL); 1462*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1463*bc1f688bSRobert Mustacchi } 1464*bc1f688bSRobert Mustacchi 1465*bc1f688bSRobert Mustacchi chain_ptr->line = line; 1466*bc1f688bSRobert Mustacchi chain_ptr->diff = diff = pc_more - pc; 1467*bc1f688bSRobert Mustacchi chain_ptr->next = chain_head; 1468*bc1f688bSRobert Mustacchi chain_head = chain_ptr; 1469*bc1f688bSRobert Mustacchi } 1470*bc1f688bSRobert Mustacchi check_line = false; 1471*bc1f688bSRobert Mustacchi } else 1472*bc1f688bSRobert Mustacchi /* Check addresses only when they go */ 1473*bc1f688bSRobert Mustacchi /* below pc. */ 1474*bc1f688bSRobert Mustacchi if (line->li_address < pc) 1475*bc1f688bSRobert Mustacchi check_line = true; 1476*bc1f688bSRobert Mustacchi 1477*bc1f688bSRobert Mustacchi first_line = false; 1478*bc1f688bSRobert Mustacchi } 1479*bc1f688bSRobert Mustacchi 1480*bc1f688bSRobert Mustacchi chain_count = 0; 1481*bc1f688bSRobert Mustacchi for (chain_ptr = chain_head; chain_ptr != NULL; 1482*bc1f688bSRobert Mustacchi chain_ptr = chain_ptr->next) 1483*bc1f688bSRobert Mustacchi if (chain_ptr->diff == diff) 1484*bc1f688bSRobert Mustacchi chain_count++; 1485*bc1f688bSRobert Mustacchi 1486*bc1f688bSRobert Mustacchi pc_line_buf = pc_line = (Dwarf_Line) 1487*bc1f688bSRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_LIST, chain_count); 1488*bc1f688bSRobert Mustacchi for (chain_ptr = chain_head; chain_ptr != NULL; 1489*bc1f688bSRobert Mustacchi chain_ptr = chain_ptr->next) 1490*bc1f688bSRobert Mustacchi if (chain_ptr->diff == diff) { 1491*bc1f688bSRobert Mustacchi *pc_line = chain_ptr->line; 1492*bc1f688bSRobert Mustacchi pc_line++; 1493*bc1f688bSRobert Mustacchi } 1494*bc1f688bSRobert Mustacchi 1495*bc1f688bSRobert Mustacchi for (chain_ptr = chain_head; chain_ptr != NULL;) { 1496*bc1f688bSRobert Mustacchi chain_head = chain_ptr; 1497*bc1f688bSRobert Mustacchi chain_ptr = chain_ptr->next; 1498*bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, chain_head, DW_DLA_CHAIN); 1499*bc1f688bSRobert Mustacchi } 1500*bc1f688bSRobert Mustacchi 1501*bc1f688bSRobert Mustacchi *linebuf = pc_line_buf; 1502*bc1f688bSRobert Mustacchi return (chain_count); 1503*bc1f688bSRobert Mustacchi } 1504*bc1f688bSRobert Mustacchi #endif 1505*bc1f688bSRobert Mustacchi 1506*bc1f688bSRobert Mustacchi 1507*bc1f688bSRobert Mustacchi 1508*bc1f688bSRobert Mustacchi /* 1509*bc1f688bSRobert Mustacchi It's impossible for callers of dwarf_srclines() to get to and 1510*bc1f688bSRobert Mustacchi free all the resources (in particular, the li_context and its 1511*bc1f688bSRobert Mustacchi lc_file_entries). 1512*bc1f688bSRobert Mustacchi So this function, new July 2005, does it. 1513*bc1f688bSRobert Mustacchi */ 1514*bc1f688bSRobert Mustacchi 1515*bc1f688bSRobert Mustacchi void 1516*bc1f688bSRobert Mustacchi dwarf_srclines_dealloc(Dwarf_Debug dbg, Dwarf_Line * linebuf, 1517*bc1f688bSRobert Mustacchi Dwarf_Signed count) 1518*bc1f688bSRobert Mustacchi { 1519*bc1f688bSRobert Mustacchi 1520*bc1f688bSRobert Mustacchi Dwarf_Signed i = 0; 1521*bc1f688bSRobert Mustacchi struct Dwarf_Line_Context_s *context = 0; 1522*bc1f688bSRobert Mustacchi 1523*bc1f688bSRobert Mustacchi if (count > 0) { 1524*bc1f688bSRobert Mustacchi /* All these entries share a single context */ 1525*bc1f688bSRobert Mustacchi context = linebuf[0]->li_context; 1526*bc1f688bSRobert Mustacchi } 1527*bc1f688bSRobert Mustacchi for (i = 0; i < count; ++i) { 1528*bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE); 1529*bc1f688bSRobert Mustacchi } 1530*bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, linebuf, DW_DLA_LIST); 1531*bc1f688bSRobert Mustacchi 1532*bc1f688bSRobert Mustacchi if (context) { 1533*bc1f688bSRobert Mustacchi Dwarf_File_Entry fe = context->lc_file_entries; 1534*bc1f688bSRobert Mustacchi 1535*bc1f688bSRobert Mustacchi while (fe) { 1536*bc1f688bSRobert Mustacchi Dwarf_File_Entry fenext = fe->fi_next; 1537*bc1f688bSRobert Mustacchi 1538*bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, fe, DW_DLA_FILE_ENTRY); 1539*bc1f688bSRobert Mustacchi fe = fenext; 1540*bc1f688bSRobert Mustacchi } 1541*bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, context, DW_DLA_LINE_CONTEXT); 1542*bc1f688bSRobert Mustacchi } 1543*bc1f688bSRobert Mustacchi 1544*bc1f688bSRobert Mustacchi return; 1545*bc1f688bSRobert Mustacchi } 1546*bc1f688bSRobert Mustacchi 1547*bc1f688bSRobert Mustacchi /* Operand counts per standard operand. 1548*bc1f688bSRobert Mustacchi The initial zero is for DW_LNS_copy. 1549*bc1f688bSRobert Mustacchi This is an economical way to verify we understand the table 1550*bc1f688bSRobert Mustacchi of standard-opcode-lengths in the line table prologue. */ 1551*bc1f688bSRobert Mustacchi #define STANDARD_OPERAND_COUNT_DWARF2 9 1552*bc1f688bSRobert Mustacchi #define STANDARD_OPERAND_COUNT_DWARF3 12 1553*bc1f688bSRobert Mustacchi static unsigned char 1554*bc1f688bSRobert Mustacchi dwarf_standard_opcode_operand_count[STANDARD_OPERAND_COUNT_DWARF3] = { 1555*bc1f688bSRobert Mustacchi /* DWARF2 */ 1556*bc1f688bSRobert Mustacchi 0, 1557*bc1f688bSRobert Mustacchi 1, 1, 1, 1, 1558*bc1f688bSRobert Mustacchi 0, 0, 0, 1559*bc1f688bSRobert Mustacchi 1, 1560*bc1f688bSRobert Mustacchi /* Following are new for DWARF3. */ 1561*bc1f688bSRobert Mustacchi 0, 0, 1 1562*bc1f688bSRobert Mustacchi }; 1563*bc1f688bSRobert Mustacchi 1564*bc1f688bSRobert Mustacchi /* We have a normal standard opcode base, but 1565*bc1f688bSRobert Mustacchi an arm compiler emitted a non-standard table! 1566*bc1f688bSRobert Mustacchi This could lead to problems... 1567*bc1f688bSRobert Mustacchi ARM C/C++ Compiler, RVCT4.0 [Build 4 1568*bc1f688bSRobert Mustacchi 00] seems to get the table wrong . */ 1569*bc1f688bSRobert Mustacchi static unsigned char 1570*bc1f688bSRobert Mustacchi dwarf_arm_standard_opcode_operand_count[STANDARD_OPERAND_COUNT_DWARF3] = { 1571*bc1f688bSRobert Mustacchi /* DWARF2 */ 1572*bc1f688bSRobert Mustacchi 0, 1573*bc1f688bSRobert Mustacchi 1, 1, 1, 1, 1574*bc1f688bSRobert Mustacchi 0, 0, 0, 1575*bc1f688bSRobert Mustacchi 0, /* <<< --- this is wrong */ 1576*bc1f688bSRobert Mustacchi /* Following are new for DWARF3. */ 1577*bc1f688bSRobert Mustacchi 0, 0, 1 1578*bc1f688bSRobert Mustacchi }; 1579*bc1f688bSRobert Mustacchi 1580*bc1f688bSRobert Mustacchi static void 1581*bc1f688bSRobert Mustacchi print_header_issue(Dwarf_Debug dbg, 1582*bc1f688bSRobert Mustacchi char *specific_msg, 1583*bc1f688bSRobert Mustacchi Dwarf_Small *data_start, 1584*bc1f688bSRobert Mustacchi int *err_count_out) 1585*bc1f688bSRobert Mustacchi { 1586*bc1f688bSRobert Mustacchi if(!err_count_out) 1587*bc1f688bSRobert Mustacchi return; 1588*bc1f688bSRobert Mustacchi printf("*** DWARF CHECK: " 1589*bc1f688bSRobert Mustacchi "line table header: %s", 1590*bc1f688bSRobert Mustacchi specific_msg); 1591*bc1f688bSRobert Mustacchi if( data_start >= dbg->de_debug_line.dss_data && 1592*bc1f688bSRobert Mustacchi (data_start < (dbg->de_debug_line.dss_data + 1593*bc1f688bSRobert Mustacchi dbg->de_debug_line.dss_size))) { 1594*bc1f688bSRobert Mustacchi Dwarf_Unsigned off = data_start - dbg->de_debug_line.dss_data; 1595*bc1f688bSRobert Mustacchi printf(" at .debug_line section offset 0x%" DW_PR_DUx 1596*bc1f688bSRobert Mustacchi " ( %" DW_PR_DUu " ) ", 1597*bc1f688bSRobert Mustacchi off,off); 1598*bc1f688bSRobert Mustacchi } else { 1599*bc1f688bSRobert Mustacchi printf(" (unknown section location) "); 1600*bc1f688bSRobert Mustacchi } 1601*bc1f688bSRobert Mustacchi printf("***\n"); 1602*bc1f688bSRobert Mustacchi *err_count_out += 1; 1603*bc1f688bSRobert Mustacchi } 1604*bc1f688bSRobert Mustacchi 1605*bc1f688bSRobert Mustacchi 1606*bc1f688bSRobert Mustacchi 1607*bc1f688bSRobert Mustacchi /* Common line table prefix reading code. 1608*bc1f688bSRobert Mustacchi Returns DW_DLV_OK, DW_DLV_ERROR. 1609*bc1f688bSRobert Mustacchi DW_DLV_NO_ENTRY cannot be returned, but callers should 1610*bc1f688bSRobert Mustacchi assume it is possible. 1611*bc1f688bSRobert Mustacchi 1612*bc1f688bSRobert Mustacchi The prefix_out area must be initialized properly before calling this. 1613*bc1f688bSRobert Mustacchi 1614*bc1f688bSRobert Mustacchi Has the side effect of allocating arrays which 1615*bc1f688bSRobert Mustacchi must be freed (see the Line_Table_Prefix_s struct which 1616*bc1f688bSRobert Mustacchi holds the pointers to space we allocate here). 1617*bc1f688bSRobert Mustacchi 1618*bc1f688bSRobert Mustacchi bogus_bytes_ptr and bogus_bytes are output values which 1619*bc1f688bSRobert Mustacchi let a print-program notify the user of some surprising bytes 1620*bc1f688bSRobert Mustacchi after a line table header and before the line table instructions. 1621*bc1f688bSRobert Mustacchi These can be ignored unless one is printing. 1622*bc1f688bSRobert Mustacchi And are ignored if NULL passed as the pointer. 1623*bc1f688bSRobert Mustacchi */ 1624*bc1f688bSRobert Mustacchi 1625*bc1f688bSRobert Mustacchi /* err_count_out may be NULL, in which case we 1626*bc1f688bSRobert Mustacchi make no attempt to count checking-type errors. 1627*bc1f688bSRobert Mustacchi Checking-type errors do not stop us, we just report them. 1628*bc1f688bSRobert Mustacchi */ 1629*bc1f688bSRobert Mustacchi int 1630*bc1f688bSRobert Mustacchi dwarf_read_line_table_prefix(Dwarf_Debug dbg, 1631*bc1f688bSRobert Mustacchi Dwarf_Small * data_start, 1632*bc1f688bSRobert Mustacchi Dwarf_Unsigned data_length, 1633*bc1f688bSRobert Mustacchi Dwarf_Small ** updated_data_start_out, 1634*bc1f688bSRobert Mustacchi struct Line_Table_Prefix_s *prefix_out, 1635*bc1f688bSRobert Mustacchi Dwarf_Small ** bogus_bytes_ptr, 1636*bc1f688bSRobert Mustacchi Dwarf_Unsigned *bogus_bytes, 1637*bc1f688bSRobert Mustacchi Dwarf_Error * err, 1638*bc1f688bSRobert Mustacchi int *err_count_out) 1639*bc1f688bSRobert Mustacchi { 1640*bc1f688bSRobert Mustacchi Dwarf_Small *line_ptr = data_start; 1641*bc1f688bSRobert Mustacchi Dwarf_Unsigned total_length = 0; 1642*bc1f688bSRobert Mustacchi int local_length_size = 0; 1643*bc1f688bSRobert Mustacchi int local_extension_size = 0; 1644*bc1f688bSRobert Mustacchi Dwarf_Unsigned prologue_length = 0; 1645*bc1f688bSRobert Mustacchi Dwarf_Half version = 0; 1646*bc1f688bSRobert Mustacchi Dwarf_Unsigned directories_count = 0; 1647*bc1f688bSRobert Mustacchi Dwarf_Unsigned directories_malloc = 0; 1648*bc1f688bSRobert Mustacchi Dwarf_Unsigned files_count = 0; 1649*bc1f688bSRobert Mustacchi Dwarf_Unsigned files_malloc = 0; 1650*bc1f688bSRobert Mustacchi Dwarf_Small *line_ptr_end = 0; 1651*bc1f688bSRobert Mustacchi Dwarf_Small *lp_begin = 0; 1652*bc1f688bSRobert Mustacchi if(bogus_bytes_ptr) *bogus_bytes_ptr = 0; 1653*bc1f688bSRobert Mustacchi if(bogus_bytes) *bogus_bytes= 0; 1654*bc1f688bSRobert Mustacchi 1655*bc1f688bSRobert Mustacchi prefix_out->pf_line_ptr_start = line_ptr; 1656*bc1f688bSRobert Mustacchi /* READ_AREA_LENGTH updates line_ptr for consumed bytes */ 1657*bc1f688bSRobert Mustacchi READ_AREA_LENGTH(dbg, total_length, Dwarf_Unsigned, 1658*bc1f688bSRobert Mustacchi line_ptr, local_length_size, local_extension_size); 1659*bc1f688bSRobert Mustacchi 1660*bc1f688bSRobert Mustacchi 1661*bc1f688bSRobert Mustacchi line_ptr_end = line_ptr + total_length; 1662*bc1f688bSRobert Mustacchi prefix_out->pf_line_ptr_end = line_ptr_end; 1663*bc1f688bSRobert Mustacchi prefix_out->pf_length_field_length = local_length_size + 1664*bc1f688bSRobert Mustacchi local_extension_size; 1665*bc1f688bSRobert Mustacchi /* ASSERT: prefix_out->pf_length_field_length == line_ptr 1666*bc1f688bSRobert Mustacchi -prefix_out->pf_line_ptr_start; */ 1667*bc1f688bSRobert Mustacchi if (line_ptr_end > dbg->de_debug_line.dss_data + 1668*bc1f688bSRobert Mustacchi dbg->de_debug_line.dss_size) { 1669*bc1f688bSRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD); 1670*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1671*bc1f688bSRobert Mustacchi } 1672*bc1f688bSRobert Mustacchi if (line_ptr_end > data_start + data_length) { 1673*bc1f688bSRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD); 1674*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1675*bc1f688bSRobert Mustacchi } 1676*bc1f688bSRobert Mustacchi prefix_out->pf_total_length = total_length; 1677*bc1f688bSRobert Mustacchi 1678*bc1f688bSRobert Mustacchi READ_UNALIGNED(dbg, version, Dwarf_Half, 1679*bc1f688bSRobert Mustacchi line_ptr, sizeof(Dwarf_Half)); 1680*bc1f688bSRobert Mustacchi prefix_out->pf_version = version; 1681*bc1f688bSRobert Mustacchi line_ptr += sizeof(Dwarf_Half); 1682*bc1f688bSRobert Mustacchi if (version != CURRENT_VERSION_STAMP && 1683*bc1f688bSRobert Mustacchi version != CURRENT_VERSION_STAMP3) { 1684*bc1f688bSRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_VERSION_STAMP_ERROR); 1685*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1686*bc1f688bSRobert Mustacchi } 1687*bc1f688bSRobert Mustacchi 1688*bc1f688bSRobert Mustacchi READ_UNALIGNED(dbg, prologue_length, Dwarf_Unsigned, 1689*bc1f688bSRobert Mustacchi line_ptr, local_length_size); 1690*bc1f688bSRobert Mustacchi prefix_out->pf_prologue_length = prologue_length; 1691*bc1f688bSRobert Mustacchi line_ptr += local_length_size; 1692*bc1f688bSRobert Mustacchi prefix_out->pf_line_prologue_start = line_ptr; 1693*bc1f688bSRobert Mustacchi 1694*bc1f688bSRobert Mustacchi prefix_out->pf_minimum_instruction_length = 1695*bc1f688bSRobert Mustacchi *(unsigned char *) line_ptr; 1696*bc1f688bSRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small); 1697*bc1f688bSRobert Mustacchi 1698*bc1f688bSRobert Mustacchi prefix_out->pf_default_is_stmt = *(unsigned char *) line_ptr; 1699*bc1f688bSRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small); 1700*bc1f688bSRobert Mustacchi 1701*bc1f688bSRobert Mustacchi prefix_out->pf_line_base = *(signed char *) line_ptr; 1702*bc1f688bSRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Sbyte); 1703*bc1f688bSRobert Mustacchi 1704*bc1f688bSRobert Mustacchi prefix_out->pf_line_range = *(unsigned char *) line_ptr; 1705*bc1f688bSRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small); 1706*bc1f688bSRobert Mustacchi 1707*bc1f688bSRobert Mustacchi prefix_out->pf_opcode_base = *(unsigned char *) line_ptr; 1708*bc1f688bSRobert Mustacchi line_ptr = line_ptr + sizeof(Dwarf_Small); 1709*bc1f688bSRobert Mustacchi 1710*bc1f688bSRobert Mustacchi /* Set up the array of standard opcode lengths. */ 1711*bc1f688bSRobert Mustacchi /* We think this works ok even for cross-endian processing of 1712*bc1f688bSRobert Mustacchi objects. It might be wrong, we might need to specially process 1713*bc1f688bSRobert Mustacchi the array of ubyte into host order. */ 1714*bc1f688bSRobert Mustacchi prefix_out->pf_opcode_length_table = line_ptr; 1715*bc1f688bSRobert Mustacchi 1716*bc1f688bSRobert Mustacchi /* pf_opcode_base is one greater than the size of the array. */ 1717*bc1f688bSRobert Mustacchi line_ptr += prefix_out->pf_opcode_base - 1; 1718*bc1f688bSRobert Mustacchi 1719*bc1f688bSRobert Mustacchi { 1720*bc1f688bSRobert Mustacchi /* Determine (as best we can) whether the 1721*bc1f688bSRobert Mustacchi pf_opcode_length_table holds 9 or 12 standard-conforming 1722*bc1f688bSRobert Mustacchi entries. gcc4 upped to DWARF3's 12 without updating the 1723*bc1f688bSRobert Mustacchi version number. */ 1724*bc1f688bSRobert Mustacchi int operand_ck_fail = true; 1725*bc1f688bSRobert Mustacchi 1726*bc1f688bSRobert Mustacchi if (prefix_out->pf_opcode_base >= STANDARD_OPERAND_COUNT_DWARF3) { 1727*bc1f688bSRobert Mustacchi int mismatch = memcmp(dwarf_standard_opcode_operand_count, 1728*bc1f688bSRobert Mustacchi prefix_out->pf_opcode_length_table, 1729*bc1f688bSRobert Mustacchi STANDARD_OPERAND_COUNT_DWARF3); 1730*bc1f688bSRobert Mustacchi if(mismatch) { 1731*bc1f688bSRobert Mustacchi if(err_count_out) { 1732*bc1f688bSRobert Mustacchi print_header_issue(dbg,"standard-operands did not match", 1733*bc1f688bSRobert Mustacchi data_start,err_count_out); 1734*bc1f688bSRobert Mustacchi } 1735*bc1f688bSRobert Mustacchi mismatch = memcmp(dwarf_arm_standard_opcode_operand_count, 1736*bc1f688bSRobert Mustacchi prefix_out->pf_opcode_length_table, 1737*bc1f688bSRobert Mustacchi STANDARD_OPERAND_COUNT_DWARF3); 1738*bc1f688bSRobert Mustacchi if(!mismatch && err_count_out) { 1739*bc1f688bSRobert Mustacchi print_header_issue(dbg,"arm (incorrect) operands in use", 1740*bc1f688bSRobert Mustacchi data_start,err_count_out); 1741*bc1f688bSRobert Mustacchi } 1742*bc1f688bSRobert Mustacchi } 1743*bc1f688bSRobert Mustacchi if (!mismatch) { 1744*bc1f688bSRobert Mustacchi if (version == 2) { 1745*bc1f688bSRobert Mustacchi if(err_count_out) { 1746*bc1f688bSRobert Mustacchi print_header_issue(dbg, 1747*bc1f688bSRobert Mustacchi "standard DWARF3 operands matched, but is DWARF2 linetable", 1748*bc1f688bSRobert Mustacchi data_start,err_count_out); 1749*bc1f688bSRobert Mustacchi } 1750*bc1f688bSRobert Mustacchi } 1751*bc1f688bSRobert Mustacchi operand_ck_fail = false; 1752*bc1f688bSRobert Mustacchi prefix_out->pf_std_op_count = 1753*bc1f688bSRobert Mustacchi STANDARD_OPERAND_COUNT_DWARF3; 1754*bc1f688bSRobert Mustacchi } 1755*bc1f688bSRobert Mustacchi } 1756*bc1f688bSRobert Mustacchi if (operand_ck_fail) { 1757*bc1f688bSRobert Mustacchi if (prefix_out->pf_opcode_base >= 1758*bc1f688bSRobert Mustacchi STANDARD_OPERAND_COUNT_DWARF2) { 1759*bc1f688bSRobert Mustacchi 1760*bc1f688bSRobert Mustacchi int mismatch = 1761*bc1f688bSRobert Mustacchi memcmp(dwarf_standard_opcode_operand_count, 1762*bc1f688bSRobert Mustacchi prefix_out->pf_opcode_length_table, 1763*bc1f688bSRobert Mustacchi STANDARD_OPERAND_COUNT_DWARF2); 1764*bc1f688bSRobert Mustacchi if(mismatch) { 1765*bc1f688bSRobert Mustacchi if(err_count_out) { 1766*bc1f688bSRobert Mustacchi print_header_issue(dbg,"standard-operands-lengths did not match", 1767*bc1f688bSRobert Mustacchi data_start,err_count_out); 1768*bc1f688bSRobert Mustacchi } 1769*bc1f688bSRobert Mustacchi mismatch = memcmp(dwarf_arm_standard_opcode_operand_count, 1770*bc1f688bSRobert Mustacchi prefix_out->pf_opcode_length_table, 1771*bc1f688bSRobert Mustacchi STANDARD_OPERAND_COUNT_DWARF2); 1772*bc1f688bSRobert Mustacchi if(!mismatch && err_count_out) { 1773*bc1f688bSRobert Mustacchi print_header_issue(dbg,"arm (incorrect) operand in use", 1774*bc1f688bSRobert Mustacchi data_start,err_count_out); 1775*bc1f688bSRobert Mustacchi } 1776*bc1f688bSRobert Mustacchi } 1777*bc1f688bSRobert Mustacchi 1778*bc1f688bSRobert Mustacchi if (!mismatch) { 1779*bc1f688bSRobert Mustacchi operand_ck_fail = false; 1780*bc1f688bSRobert Mustacchi prefix_out->pf_std_op_count = 1781*bc1f688bSRobert Mustacchi STANDARD_OPERAND_COUNT_DWARF2; 1782*bc1f688bSRobert Mustacchi } 1783*bc1f688bSRobert Mustacchi } 1784*bc1f688bSRobert Mustacchi } 1785*bc1f688bSRobert Mustacchi if (operand_ck_fail) { 1786*bc1f688bSRobert Mustacchi /* Here we are not sure what the pf_std_op_count is. */ 1787*bc1f688bSRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_NUM_OPERANDS_BAD); 1788*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1789*bc1f688bSRobert Mustacchi } 1790*bc1f688bSRobert Mustacchi } 1791*bc1f688bSRobert Mustacchi /* At this point we no longer need to check operand counts. */ 1792*bc1f688bSRobert Mustacchi 1793*bc1f688bSRobert Mustacchi 1794*bc1f688bSRobert Mustacchi directories_count = 0; 1795*bc1f688bSRobert Mustacchi directories_malloc = 5; 1796*bc1f688bSRobert Mustacchi prefix_out->pf_include_directories = malloc(sizeof(Dwarf_Small *) * 1797*bc1f688bSRobert Mustacchi directories_malloc); 1798*bc1f688bSRobert Mustacchi if (prefix_out->pf_include_directories == NULL) { 1799*bc1f688bSRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); 1800*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1801*bc1f688bSRobert Mustacchi } 1802*bc1f688bSRobert Mustacchi memset(prefix_out->pf_include_directories, 0, 1803*bc1f688bSRobert Mustacchi sizeof(Dwarf_Small *) * directories_malloc); 1804*bc1f688bSRobert Mustacchi 1805*bc1f688bSRobert Mustacchi while ((*(char *) line_ptr) != '\0') { 1806*bc1f688bSRobert Mustacchi if (directories_count >= directories_malloc) { 1807*bc1f688bSRobert Mustacchi Dwarf_Unsigned expand = 2 * directories_malloc; 1808*bc1f688bSRobert Mustacchi Dwarf_Unsigned bytesalloc = sizeof(Dwarf_Small *) * expand; 1809*bc1f688bSRobert Mustacchi Dwarf_Small **newdirs = 1810*bc1f688bSRobert Mustacchi realloc(prefix_out->pf_include_directories, 1811*bc1f688bSRobert Mustacchi bytesalloc); 1812*bc1f688bSRobert Mustacchi 1813*bc1f688bSRobert Mustacchi if (!newdirs) { 1814*bc1f688bSRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); 1815*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1816*bc1f688bSRobert Mustacchi } 1817*bc1f688bSRobert Mustacchi /* Doubled size, zero out second half. */ 1818*bc1f688bSRobert Mustacchi memset(newdirs + directories_malloc, 0, 1819*bc1f688bSRobert Mustacchi sizeof(Dwarf_Small *) * directories_malloc); 1820*bc1f688bSRobert Mustacchi directories_malloc = expand; 1821*bc1f688bSRobert Mustacchi prefix_out->pf_include_directories = newdirs; 1822*bc1f688bSRobert Mustacchi } 1823*bc1f688bSRobert Mustacchi prefix_out->pf_include_directories[directories_count] = 1824*bc1f688bSRobert Mustacchi line_ptr; 1825*bc1f688bSRobert Mustacchi line_ptr = line_ptr + strlen((char *) line_ptr) + 1; 1826*bc1f688bSRobert Mustacchi directories_count++; 1827*bc1f688bSRobert Mustacchi } 1828*bc1f688bSRobert Mustacchi prefix_out->pf_include_directories_count = directories_count; 1829*bc1f688bSRobert Mustacchi line_ptr++; 1830*bc1f688bSRobert Mustacchi 1831*bc1f688bSRobert Mustacchi files_count = 0; 1832*bc1f688bSRobert Mustacchi files_malloc = 5; 1833*bc1f688bSRobert Mustacchi prefix_out->pf_line_table_file_entries = 1834*bc1f688bSRobert Mustacchi malloc(sizeof(struct Line_Table_File_Entry_s) * files_malloc); 1835*bc1f688bSRobert Mustacchi if (prefix_out->pf_line_table_file_entries == NULL) { 1836*bc1f688bSRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); 1837*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1838*bc1f688bSRobert Mustacchi } 1839*bc1f688bSRobert Mustacchi memset(prefix_out->pf_line_table_file_entries, 0, 1840*bc1f688bSRobert Mustacchi sizeof(struct Line_Table_File_Entry_s) * files_malloc); 1841*bc1f688bSRobert Mustacchi 1842*bc1f688bSRobert Mustacchi while (*(char *) line_ptr != '\0') { 1843*bc1f688bSRobert Mustacchi Dwarf_Unsigned utmp; 1844*bc1f688bSRobert Mustacchi Dwarf_Unsigned dir_index = 0; 1845*bc1f688bSRobert Mustacchi Dwarf_Unsigned lastmod = 0; 1846*bc1f688bSRobert Mustacchi Dwarf_Unsigned file_length = 0; 1847*bc1f688bSRobert Mustacchi struct Line_Table_File_Entry_s *curline; 1848*bc1f688bSRobert Mustacchi Dwarf_Word leb128_length = 0; 1849*bc1f688bSRobert Mustacchi 1850*bc1f688bSRobert Mustacchi 1851*bc1f688bSRobert Mustacchi if (files_count >= files_malloc) { 1852*bc1f688bSRobert Mustacchi Dwarf_Unsigned expand = 2 * files_malloc; 1853*bc1f688bSRobert Mustacchi struct Line_Table_File_Entry_s *newfiles = 1854*bc1f688bSRobert Mustacchi realloc(prefix_out->pf_line_table_file_entries, 1855*bc1f688bSRobert Mustacchi sizeof(struct Line_Table_File_Entry_s) * 1856*bc1f688bSRobert Mustacchi expand); 1857*bc1f688bSRobert Mustacchi if (!newfiles) { 1858*bc1f688bSRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); 1859*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1860*bc1f688bSRobert Mustacchi } 1861*bc1f688bSRobert Mustacchi memset(newfiles + files_malloc, 0, 1862*bc1f688bSRobert Mustacchi sizeof(struct Line_Table_File_Entry_s) * 1863*bc1f688bSRobert Mustacchi files_malloc); 1864*bc1f688bSRobert Mustacchi files_malloc = expand; 1865*bc1f688bSRobert Mustacchi prefix_out->pf_line_table_file_entries = newfiles; 1866*bc1f688bSRobert Mustacchi } 1867*bc1f688bSRobert Mustacchi curline = prefix_out->pf_line_table_file_entries + files_count; 1868*bc1f688bSRobert Mustacchi 1869*bc1f688bSRobert Mustacchi curline->lte_filename = line_ptr; 1870*bc1f688bSRobert Mustacchi line_ptr = line_ptr + strlen((char *) line_ptr) + 1; 1871*bc1f688bSRobert Mustacchi 1872*bc1f688bSRobert Mustacchi DECODE_LEB128_UWORD(line_ptr, utmp); 1873*bc1f688bSRobert Mustacchi dir_index = (Dwarf_Sword) utmp; 1874*bc1f688bSRobert Mustacchi if (dir_index > directories_count) { 1875*bc1f688bSRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_DIR_INDEX_BAD); 1876*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1877*bc1f688bSRobert Mustacchi } 1878*bc1f688bSRobert Mustacchi curline->lte_directory_index = dir_index; 1879*bc1f688bSRobert Mustacchi 1880*bc1f688bSRobert Mustacchi lastmod = _dwarf_decode_u_leb128(line_ptr, &leb128_length); 1881*bc1f688bSRobert Mustacchi line_ptr = line_ptr + leb128_length; 1882*bc1f688bSRobert Mustacchi curline->lte_last_modification_time = lastmod; 1883*bc1f688bSRobert Mustacchi 1884*bc1f688bSRobert Mustacchi /* Skip over file length. */ 1885*bc1f688bSRobert Mustacchi file_length = _dwarf_decode_u_leb128(line_ptr, &leb128_length); 1886*bc1f688bSRobert Mustacchi line_ptr = line_ptr + leb128_length; 1887*bc1f688bSRobert Mustacchi curline->lte_length_of_file = file_length; 1888*bc1f688bSRobert Mustacchi 1889*bc1f688bSRobert Mustacchi ++files_count; 1890*bc1f688bSRobert Mustacchi 1891*bc1f688bSRobert Mustacchi } 1892*bc1f688bSRobert Mustacchi prefix_out->pf_files_count = files_count; 1893*bc1f688bSRobert Mustacchi /* Skip trailing nul byte */ 1894*bc1f688bSRobert Mustacchi ++line_ptr; 1895*bc1f688bSRobert Mustacchi 1896*bc1f688bSRobert Mustacchi 1897*bc1f688bSRobert Mustacchi lp_begin = prefix_out->pf_line_prologue_start + 1898*bc1f688bSRobert Mustacchi prefix_out->pf_prologue_length; 1899*bc1f688bSRobert Mustacchi if (line_ptr != lp_begin) { 1900*bc1f688bSRobert Mustacchi if(line_ptr > lp_begin) { 1901*bc1f688bSRobert Mustacchi _dwarf_error(dbg, err, DW_DLE_LINE_PROLOG_LENGTH_BAD); 1902*bc1f688bSRobert Mustacchi return (DW_DLV_ERROR); 1903*bc1f688bSRobert Mustacchi } else { 1904*bc1f688bSRobert Mustacchi /* Bug in compiler. These 1905*bc1f688bSRobert Mustacchi * bytes are really part of the instruction 1906*bc1f688bSRobert Mustacchi * stream. The prefix_out->pf_prologue_length is 1907*bc1f688bSRobert Mustacchi * wrong (12 too high). */ 1908*bc1f688bSRobert Mustacchi if(bogus_bytes_ptr) { 1909*bc1f688bSRobert Mustacchi *bogus_bytes_ptr = line_ptr; 1910*bc1f688bSRobert Mustacchi } 1911*bc1f688bSRobert Mustacchi if(bogus_bytes) { 1912*bc1f688bSRobert Mustacchi /* How far off things are. We expect the 1913*bc1f688bSRobert Mustacchi value 12 ! */ 1914*bc1f688bSRobert Mustacchi *bogus_bytes = (lp_begin - line_ptr); 1915*bc1f688bSRobert Mustacchi } 1916*bc1f688bSRobert Mustacchi } 1917*bc1f688bSRobert Mustacchi /* Ignore the lp_begin calc. Assume line_ptr right. 1918*bc1f688bSRobert Mustacchi Making up for compiler bug. */ 1919*bc1f688bSRobert Mustacchi lp_begin = line_ptr; 1920*bc1f688bSRobert Mustacchi 1921*bc1f688bSRobert Mustacchi } 1922*bc1f688bSRobert Mustacchi 1923*bc1f688bSRobert Mustacchi *updated_data_start_out = lp_begin; 1924*bc1f688bSRobert Mustacchi return DW_DLV_OK; 1925*bc1f688bSRobert Mustacchi } 1926*bc1f688bSRobert Mustacchi 1927*bc1f688bSRobert Mustacchi 1928*bc1f688bSRobert Mustacchi /* Initialize the Line_Table_Prefix_s struct. 1929*bc1f688bSRobert Mustacchi memset is not guaranteed a portable initializer, but works 1930*bc1f688bSRobert Mustacchi fine for current architectures. AFAIK. 1931*bc1f688bSRobert Mustacchi */ 1932*bc1f688bSRobert Mustacchi void 1933*bc1f688bSRobert Mustacchi dwarf_init_line_table_prefix(struct Line_Table_Prefix_s *pf) 1934*bc1f688bSRobert Mustacchi { 1935*bc1f688bSRobert Mustacchi memset(pf, 0, sizeof(*pf)); 1936*bc1f688bSRobert Mustacchi } 1937*bc1f688bSRobert Mustacchi 1938*bc1f688bSRobert Mustacchi /* Free any malloc'd area. of the Line_Table_Prefix_s struct. */ 1939*bc1f688bSRobert Mustacchi void 1940*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(struct Line_Table_Prefix_s *pf) 1941*bc1f688bSRobert Mustacchi { 1942*bc1f688bSRobert Mustacchi if (pf->pf_include_directories) { 1943*bc1f688bSRobert Mustacchi free(pf->pf_include_directories); 1944*bc1f688bSRobert Mustacchi pf->pf_include_directories = 0; 1945*bc1f688bSRobert Mustacchi } 1946*bc1f688bSRobert Mustacchi if (pf->pf_line_table_file_entries) { 1947*bc1f688bSRobert Mustacchi free(pf->pf_line_table_file_entries); 1948*bc1f688bSRobert Mustacchi pf->pf_line_table_file_entries = 0; 1949*bc1f688bSRobert Mustacchi } 1950*bc1f688bSRobert Mustacchi return; 1951*bc1f688bSRobert Mustacchi } 1952