1*7fd79137SRobert Mustacchi /* 2*7fd79137SRobert Mustacchi 3*7fd79137SRobert Mustacchi Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. 4*7fd79137SRobert Mustacchi Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. 5*7fd79137SRobert Mustacchi 6*7fd79137SRobert Mustacchi This program is free software; you can redistribute it and/or modify it 7*7fd79137SRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License 8*7fd79137SRobert Mustacchi as published by the Free Software Foundation. 9*7fd79137SRobert Mustacchi 10*7fd79137SRobert Mustacchi This program is distributed in the hope that it would be useful, but 11*7fd79137SRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of 12*7fd79137SRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 13*7fd79137SRobert Mustacchi 14*7fd79137SRobert Mustacchi Further, this software is distributed without any warranty that it is 15*7fd79137SRobert Mustacchi free of the rightful claim of any third person regarding infringement 16*7fd79137SRobert Mustacchi or the like. Any license provided herein, whether implied or 17*7fd79137SRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if 18*7fd79137SRobert Mustacchi any, provided herein do not apply to combinations of this program with 19*7fd79137SRobert Mustacchi other software, or any other product whatsoever. 20*7fd79137SRobert Mustacchi 21*7fd79137SRobert Mustacchi You should have received a copy of the GNU Lesser General Public 22*7fd79137SRobert Mustacchi License along with this program; if not, write the Free Software 23*7fd79137SRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, 24*7fd79137SRobert Mustacchi USA. 25*7fd79137SRobert Mustacchi 26*7fd79137SRobert Mustacchi Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, 27*7fd79137SRobert Mustacchi Mountain View, CA 94043, or: 28*7fd79137SRobert Mustacchi 29*7fd79137SRobert Mustacchi http://www.sgi.com 30*7fd79137SRobert Mustacchi 31*7fd79137SRobert Mustacchi For further information regarding this notice, see: 32*7fd79137SRobert Mustacchi 33*7fd79137SRobert Mustacchi http://oss.sgi.com/projects/GenInfo/NoticeExplan 34*7fd79137SRobert Mustacchi 35*7fd79137SRobert Mustacchi */ 36*7fd79137SRobert Mustacchi 37*7fd79137SRobert Mustacchi 38*7fd79137SRobert Mustacchi 39*7fd79137SRobert Mustacchi #include "config.h" 40*7fd79137SRobert Mustacchi #include "libdwarfdefs.h" 41*7fd79137SRobert Mustacchi #include <stdio.h> 42*7fd79137SRobert Mustacchi #include <string.h> 43*7fd79137SRobert Mustacchi #include "pro_incl.h" 44*7fd79137SRobert Mustacchi #include "pro_die.h" 45*7fd79137SRobert Mustacchi 46*7fd79137SRobert Mustacchi #ifndef R_MIPS_NONE 47*7fd79137SRobert Mustacchi #define R_MIPS_NONE 0 48*7fd79137SRobert Mustacchi #endif 49*7fd79137SRobert Mustacchi 50*7fd79137SRobert Mustacchi /* adds an attribute to a die */ 51*7fd79137SRobert Mustacchi void _dwarf_pro_add_at_to_die(Dwarf_P_Die die, Dwarf_P_Attribute attr); 52*7fd79137SRobert Mustacchi 53*7fd79137SRobert Mustacchi /*---------------------------------------------------------------------------- 54*7fd79137SRobert Mustacchi This function creates a new die. 55*7fd79137SRobert Mustacchi tag: tag of the new die to be created 56*7fd79137SRobert Mustacchi parent,child,left,right: specify neighbors of the new die. Only 57*7fd79137SRobert Mustacchi one of these may be non-null 58*7fd79137SRobert Mustacchi -----------------------------------------------------------------------------*/ 59*7fd79137SRobert Mustacchi Dwarf_P_Die 60*7fd79137SRobert Mustacchi dwarf_new_die(Dwarf_P_Debug dbg, 61*7fd79137SRobert Mustacchi Dwarf_Tag tag, 62*7fd79137SRobert Mustacchi Dwarf_P_Die parent, 63*7fd79137SRobert Mustacchi Dwarf_P_Die child, 64*7fd79137SRobert Mustacchi Dwarf_P_Die left, Dwarf_P_Die right, Dwarf_Error * error) 65*7fd79137SRobert Mustacchi { 66*7fd79137SRobert Mustacchi Dwarf_P_Die ret_die = 0; 67*7fd79137SRobert Mustacchi 68*7fd79137SRobert Mustacchi Dwarf_P_Die new_die = (Dwarf_P_Die) 69*7fd79137SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Die_s)); 70*7fd79137SRobert Mustacchi if (new_die == NULL) { 71*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(dbg, DW_DLE_DIE_ALLOC, 72*7fd79137SRobert Mustacchi (Dwarf_P_Die) DW_DLV_BADADDR); 73*7fd79137SRobert Mustacchi } 74*7fd79137SRobert Mustacchi new_die->di_parent = NULL; 75*7fd79137SRobert Mustacchi new_die->di_left = NULL; 76*7fd79137SRobert Mustacchi new_die->di_right = NULL; 77*7fd79137SRobert Mustacchi new_die->di_child = NULL; 78*7fd79137SRobert Mustacchi new_die->di_last_child = NULL; 79*7fd79137SRobert Mustacchi new_die->di_tag = tag; 80*7fd79137SRobert Mustacchi new_die->di_dbg = dbg; 81*7fd79137SRobert Mustacchi new_die->di_marker = 0; 82*7fd79137SRobert Mustacchi ret_die = 83*7fd79137SRobert Mustacchi dwarf_die_link(new_die, parent, child, left, right, error); 84*7fd79137SRobert Mustacchi return ret_die; 85*7fd79137SRobert Mustacchi } 86*7fd79137SRobert Mustacchi 87*7fd79137SRobert Mustacchi /*---------------------------------------------------------------------------- 88*7fd79137SRobert Mustacchi This function links up a die to specified neighbors 89*7fd79137SRobert Mustacchi parent,child,left,right: specify neighbors of the new die. Only 90*7fd79137SRobert Mustacchi one of these may be non-null 91*7fd79137SRobert Mustacchi -----------------------------------------------------------------------------*/ 92*7fd79137SRobert Mustacchi Dwarf_P_Die 93*7fd79137SRobert Mustacchi dwarf_die_link(Dwarf_P_Die new_die, 94*7fd79137SRobert Mustacchi Dwarf_P_Die parent, 95*7fd79137SRobert Mustacchi Dwarf_P_Die child, 96*7fd79137SRobert Mustacchi Dwarf_P_Die left, Dwarf_P_Die right, Dwarf_Error * error) 97*7fd79137SRobert Mustacchi { 98*7fd79137SRobert Mustacchi /* Count the # of non null neighbors. */ 99*7fd79137SRobert Mustacchi int n_nulls = 0; 100*7fd79137SRobert Mustacchi 101*7fd79137SRobert Mustacchi if (parent != NULL) { 102*7fd79137SRobert Mustacchi n_nulls++; 103*7fd79137SRobert Mustacchi if (new_die->di_parent != NULL) { 104*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_LINK_LOOP, 105*7fd79137SRobert Mustacchi (Dwarf_P_Die) DW_DLV_BADADDR); 106*7fd79137SRobert Mustacchi } 107*7fd79137SRobert Mustacchi new_die->di_parent = parent; 108*7fd79137SRobert Mustacchi if (parent->di_child) { 109*7fd79137SRobert Mustacchi 110*7fd79137SRobert Mustacchi /* di_last_child identifies the last sibling, the 111*7fd79137SRobert Mustacchi die we want to attach new_die to. */ 112*7fd79137SRobert Mustacchi /* ASSERT: if di_child is set so is di_last_child. */ 113*7fd79137SRobert Mustacchi Dwarf_P_Die former_lastchild = parent->di_last_child; 114*7fd79137SRobert Mustacchi parent->di_last_child = new_die; 115*7fd79137SRobert Mustacchi /* Attach to the new die to end of the sibling list. */ 116*7fd79137SRobert Mustacchi former_lastchild->di_right = new_die; 117*7fd79137SRobert Mustacchi new_die->di_left = former_lastchild; 118*7fd79137SRobert Mustacchi } else { 119*7fd79137SRobert Mustacchi parent->di_child = new_die; 120*7fd79137SRobert Mustacchi parent->di_last_child = new_die; 121*7fd79137SRobert Mustacchi } 122*7fd79137SRobert Mustacchi } 123*7fd79137SRobert Mustacchi if (child != NULL) { 124*7fd79137SRobert Mustacchi n_nulls++; 125*7fd79137SRobert Mustacchi new_die->di_child = child; 126*7fd79137SRobert Mustacchi new_die->di_last_child = child; 127*7fd79137SRobert Mustacchi if (child->di_parent) { 128*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_PARENT_EXISTS, 129*7fd79137SRobert Mustacchi (Dwarf_P_Die) DW_DLV_BADADDR); 130*7fd79137SRobert Mustacchi } else { 131*7fd79137SRobert Mustacchi child->di_parent = new_die; 132*7fd79137SRobert Mustacchi } 133*7fd79137SRobert Mustacchi } 134*7fd79137SRobert Mustacchi if (left != NULL) { 135*7fd79137SRobert Mustacchi n_nulls++; 136*7fd79137SRobert Mustacchi new_die->di_left = left; 137*7fd79137SRobert Mustacchi if (left->di_right) { 138*7fd79137SRobert Mustacchi /* There's already a right sibling of left, 139*7fd79137SRobert Mustacchi insert the new die in the list. */ 140*7fd79137SRobert Mustacchi new_die->di_right = left->di_right; 141*7fd79137SRobert Mustacchi left->di_right->di_left = new_die; 142*7fd79137SRobert Mustacchi } 143*7fd79137SRobert Mustacchi left->di_right = new_die; 144*7fd79137SRobert Mustacchi if (new_die->di_parent) { 145*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_PARENT_EXISTS, 146*7fd79137SRobert Mustacchi (Dwarf_P_Die) DW_DLV_BADADDR); 147*7fd79137SRobert Mustacchi } else { 148*7fd79137SRobert Mustacchi new_die->di_parent = left->di_parent; 149*7fd79137SRobert Mustacchi } 150*7fd79137SRobert Mustacchi } 151*7fd79137SRobert Mustacchi if (right != NULL) { 152*7fd79137SRobert Mustacchi n_nulls++; 153*7fd79137SRobert Mustacchi new_die->di_right = right; 154*7fd79137SRobert Mustacchi if (right->di_left) { 155*7fd79137SRobert Mustacchi /* There is already a left sibling of the right die, 156*7fd79137SRobert Mustacchi insert the new die in the list. */ 157*7fd79137SRobert Mustacchi new_die->di_left = right->di_left; 158*7fd79137SRobert Mustacchi right->di_left->di_right = new_die; 159*7fd79137SRobert Mustacchi } 160*7fd79137SRobert Mustacchi right->di_left = new_die; 161*7fd79137SRobert Mustacchi if (new_die->di_parent) { 162*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_PARENT_EXISTS, 163*7fd79137SRobert Mustacchi (Dwarf_P_Die) DW_DLV_BADADDR); 164*7fd79137SRobert Mustacchi } else { 165*7fd79137SRobert Mustacchi new_die->di_parent = right->di_parent; 166*7fd79137SRobert Mustacchi } 167*7fd79137SRobert Mustacchi } 168*7fd79137SRobert Mustacchi if (n_nulls > 1) { 169*7fd79137SRobert Mustacchi /* Multiple neighbors! error! */ 170*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_EXTRA_NEIGHBORS, 171*7fd79137SRobert Mustacchi (Dwarf_P_Die) DW_DLV_BADADDR); 172*7fd79137SRobert Mustacchi } 173*7fd79137SRobert Mustacchi return new_die; 174*7fd79137SRobert Mustacchi 175*7fd79137SRobert Mustacchi } 176*7fd79137SRobert Mustacchi 177*7fd79137SRobert Mustacchi Dwarf_Unsigned 178*7fd79137SRobert Mustacchi dwarf_add_die_marker(Dwarf_P_Debug dbg, 179*7fd79137SRobert Mustacchi Dwarf_P_Die die, 180*7fd79137SRobert Mustacchi Dwarf_Unsigned marker, 181*7fd79137SRobert Mustacchi Dwarf_Error * error) 182*7fd79137SRobert Mustacchi { 183*7fd79137SRobert Mustacchi if (die == NULL) { 184*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(dbg, DW_DLE_DIE_NULL, DW_DLV_NOCOUNT); 185*7fd79137SRobert Mustacchi } 186*7fd79137SRobert Mustacchi die->di_marker = marker; 187*7fd79137SRobert Mustacchi return 0; 188*7fd79137SRobert Mustacchi } 189*7fd79137SRobert Mustacchi 190*7fd79137SRobert Mustacchi 191*7fd79137SRobert Mustacchi Dwarf_Unsigned 192*7fd79137SRobert Mustacchi dwarf_get_die_marker(Dwarf_P_Debug dbg, 193*7fd79137SRobert Mustacchi Dwarf_P_Die die, 194*7fd79137SRobert Mustacchi Dwarf_Unsigned * marker, 195*7fd79137SRobert Mustacchi Dwarf_Error * error) 196*7fd79137SRobert Mustacchi { 197*7fd79137SRobert Mustacchi if (die == NULL) { 198*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(dbg, DW_DLE_DIE_NULL, DW_DLV_NOCOUNT); 199*7fd79137SRobert Mustacchi } 200*7fd79137SRobert Mustacchi *marker = die->di_marker; 201*7fd79137SRobert Mustacchi return 0; 202*7fd79137SRobert Mustacchi } 203*7fd79137SRobert Mustacchi 204*7fd79137SRobert Mustacchi 205*7fd79137SRobert Mustacchi /*---------------------------------------------------------------------------- 206*7fd79137SRobert Mustacchi This function adds a die to dbg struct. It should be called using 207*7fd79137SRobert Mustacchi the root of all the dies. 208*7fd79137SRobert Mustacchi -----------------------------------------------------------------------------*/ 209*7fd79137SRobert Mustacchi Dwarf_Unsigned 210*7fd79137SRobert Mustacchi dwarf_add_die_to_debug(Dwarf_P_Debug dbg, 211*7fd79137SRobert Mustacchi Dwarf_P_Die first_die, Dwarf_Error * error) 212*7fd79137SRobert Mustacchi { 213*7fd79137SRobert Mustacchi if (first_die == NULL) { 214*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(dbg, DW_DLE_DIE_NULL, DW_DLV_NOCOUNT); 215*7fd79137SRobert Mustacchi } 216*7fd79137SRobert Mustacchi if (first_die->di_tag != DW_TAG_compile_unit) { 217*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(dbg, DW_DLE_WRONG_TAG, DW_DLV_NOCOUNT); 218*7fd79137SRobert Mustacchi } 219*7fd79137SRobert Mustacchi dbg->de_dies = first_die; 220*7fd79137SRobert Mustacchi return 0; 221*7fd79137SRobert Mustacchi } 222*7fd79137SRobert Mustacchi 223*7fd79137SRobert Mustacchi int 224*7fd79137SRobert Mustacchi _dwarf_pro_add_AT_stmt_list(Dwarf_P_Debug dbg, 225*7fd79137SRobert Mustacchi Dwarf_P_Die first_die, Dwarf_Error * error) 226*7fd79137SRobert Mustacchi { 227*7fd79137SRobert Mustacchi Dwarf_P_Attribute new_attr; 228*7fd79137SRobert Mustacchi int uwordb_size = dbg->de_offset_size; 229*7fd79137SRobert Mustacchi 230*7fd79137SRobert Mustacchi /* Add AT_stmt_list attribute */ 231*7fd79137SRobert Mustacchi new_attr = (Dwarf_P_Attribute) 232*7fd79137SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s)); 233*7fd79137SRobert Mustacchi if (new_attr == NULL) { 234*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, DW_DLV_NOCOUNT); 235*7fd79137SRobert Mustacchi } 236*7fd79137SRobert Mustacchi 237*7fd79137SRobert Mustacchi new_attr->ar_attribute = DW_AT_stmt_list; 238*7fd79137SRobert Mustacchi new_attr->ar_attribute_form = dbg->de_ar_data_attribute_form; 239*7fd79137SRobert Mustacchi new_attr->ar_rel_type = dbg->de_offset_reloc; 240*7fd79137SRobert Mustacchi 241*7fd79137SRobert Mustacchi new_attr->ar_nbytes = uwordb_size; 242*7fd79137SRobert Mustacchi new_attr->ar_next = NULL; 243*7fd79137SRobert Mustacchi new_attr->ar_reloc_len = uwordb_size; 244*7fd79137SRobert Mustacchi new_attr->ar_data = (char *) 245*7fd79137SRobert Mustacchi _dwarf_p_get_alloc(dbg, uwordb_size); 246*7fd79137SRobert Mustacchi if (new_attr->ar_data == NULL) { 247*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_ADDR_ALLOC, DW_DLV_NOCOUNT); 248*7fd79137SRobert Mustacchi } 249*7fd79137SRobert Mustacchi { 250*7fd79137SRobert Mustacchi Dwarf_Unsigned du = 0; 251*7fd79137SRobert Mustacchi 252*7fd79137SRobert Mustacchi WRITE_UNALIGNED(dbg, (void *) new_attr->ar_data, 253*7fd79137SRobert Mustacchi (const void *) &du, sizeof(du), uwordb_size); 254*7fd79137SRobert Mustacchi } 255*7fd79137SRobert Mustacchi 256*7fd79137SRobert Mustacchi _dwarf_pro_add_at_to_die(first_die, new_attr); 257*7fd79137SRobert Mustacchi return 0; 258*7fd79137SRobert Mustacchi } 259*7fd79137SRobert Mustacchi 260*7fd79137SRobert Mustacchi /*----------------------------------------------------------------------------- 261*7fd79137SRobert Mustacchi Add AT_name attribute to die 262*7fd79137SRobert Mustacchi ------------------------------------------------------------------------------*/ 263*7fd79137SRobert Mustacchi Dwarf_P_Attribute 264*7fd79137SRobert Mustacchi dwarf_add_AT_name(Dwarf_P_Die die, char *name, Dwarf_Error * error) 265*7fd79137SRobert Mustacchi { 266*7fd79137SRobert Mustacchi Dwarf_P_Attribute new_attr; 267*7fd79137SRobert Mustacchi 268*7fd79137SRobert Mustacchi if (die == NULL) { 269*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_DIE_NULL, 270*7fd79137SRobert Mustacchi (Dwarf_P_Attribute) DW_DLV_BADADDR); 271*7fd79137SRobert Mustacchi } 272*7fd79137SRobert Mustacchi new_attr = (Dwarf_P_Attribute) 273*7fd79137SRobert Mustacchi _dwarf_p_get_alloc(die->di_dbg,sizeof(struct Dwarf_P_Attribute_s)); 274*7fd79137SRobert Mustacchi if (new_attr == NULL) { 275*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, 276*7fd79137SRobert Mustacchi (Dwarf_P_Attribute) DW_DLV_BADADDR); 277*7fd79137SRobert Mustacchi } 278*7fd79137SRobert Mustacchi 279*7fd79137SRobert Mustacchi /* fill in the information */ 280*7fd79137SRobert Mustacchi new_attr->ar_attribute = DW_AT_name; 281*7fd79137SRobert Mustacchi /* assume that form is string, no debug_str yet */ 282*7fd79137SRobert Mustacchi new_attr->ar_attribute_form = DW_FORM_string; 283*7fd79137SRobert Mustacchi new_attr->ar_nbytes = strlen(name) + 1; 284*7fd79137SRobert Mustacchi new_attr->ar_next = NULL; 285*7fd79137SRobert Mustacchi new_attr->ar_reloc_len = 0; 286*7fd79137SRobert Mustacchi new_attr->ar_data = (char *) 287*7fd79137SRobert Mustacchi _dwarf_p_get_alloc(die->di_dbg, strlen(name)+1); 288*7fd79137SRobert Mustacchi if (new_attr->ar_data == NULL) { 289*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_STRING_ALLOC, 290*7fd79137SRobert Mustacchi (Dwarf_P_Attribute) DW_DLV_BADADDR); 291*7fd79137SRobert Mustacchi } 292*7fd79137SRobert Mustacchi strcpy(new_attr->ar_data, name); 293*7fd79137SRobert Mustacchi 294*7fd79137SRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE; 295*7fd79137SRobert Mustacchi 296*7fd79137SRobert Mustacchi /* add attribute to the die */ 297*7fd79137SRobert Mustacchi _dwarf_pro_add_at_to_die(die, new_attr); 298*7fd79137SRobert Mustacchi return new_attr; 299*7fd79137SRobert Mustacchi } 300*7fd79137SRobert Mustacchi 301*7fd79137SRobert Mustacchi 302*7fd79137SRobert Mustacchi /*----------------------------------------------------------------------------- 303*7fd79137SRobert Mustacchi Add AT_comp_dir attribute to die 304*7fd79137SRobert Mustacchi ------------------------------------------------------------------------------*/ 305*7fd79137SRobert Mustacchi Dwarf_P_Attribute 306*7fd79137SRobert Mustacchi dwarf_add_AT_comp_dir(Dwarf_P_Die ownerdie, 307*7fd79137SRobert Mustacchi char *current_working_directory, 308*7fd79137SRobert Mustacchi Dwarf_Error * error) 309*7fd79137SRobert Mustacchi { 310*7fd79137SRobert Mustacchi Dwarf_P_Attribute new_attr; 311*7fd79137SRobert Mustacchi 312*7fd79137SRobert Mustacchi if (ownerdie == NULL) { 313*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_DIE_NULL, 314*7fd79137SRobert Mustacchi (Dwarf_P_Attribute) DW_DLV_BADADDR); 315*7fd79137SRobert Mustacchi } 316*7fd79137SRobert Mustacchi new_attr = (Dwarf_P_Attribute) 317*7fd79137SRobert Mustacchi _dwarf_p_get_alloc(ownerdie->di_dbg, 318*7fd79137SRobert Mustacchi sizeof(struct Dwarf_P_Attribute_s)); 319*7fd79137SRobert Mustacchi if (new_attr == NULL) { 320*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, 321*7fd79137SRobert Mustacchi (Dwarf_P_Attribute) DW_DLV_BADADDR); 322*7fd79137SRobert Mustacchi } 323*7fd79137SRobert Mustacchi 324*7fd79137SRobert Mustacchi /* fill in the information */ 325*7fd79137SRobert Mustacchi new_attr->ar_attribute = DW_AT_comp_dir; 326*7fd79137SRobert Mustacchi /* assume that form is string, no debug_str yet */ 327*7fd79137SRobert Mustacchi new_attr->ar_attribute_form = DW_FORM_string; 328*7fd79137SRobert Mustacchi new_attr->ar_nbytes = strlen(current_working_directory) + 1; 329*7fd79137SRobert Mustacchi new_attr->ar_next = NULL; 330*7fd79137SRobert Mustacchi new_attr->ar_reloc_len = 0; 331*7fd79137SRobert Mustacchi new_attr->ar_data = (char *) 332*7fd79137SRobert Mustacchi _dwarf_p_get_alloc(ownerdie->di_dbg, 333*7fd79137SRobert Mustacchi strlen(current_working_directory)+1); 334*7fd79137SRobert Mustacchi if (new_attr->ar_data == NULL) { 335*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_STRING_ALLOC, 336*7fd79137SRobert Mustacchi (Dwarf_P_Attribute) DW_DLV_BADADDR); 337*7fd79137SRobert Mustacchi } 338*7fd79137SRobert Mustacchi strcpy(new_attr->ar_data, current_working_directory); 339*7fd79137SRobert Mustacchi 340*7fd79137SRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE; 341*7fd79137SRobert Mustacchi 342*7fd79137SRobert Mustacchi /* add attribute to the die */ 343*7fd79137SRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr); 344*7fd79137SRobert Mustacchi return new_attr; 345*7fd79137SRobert Mustacchi } 346*7fd79137SRobert Mustacchi 347*7fd79137SRobert Mustacchi int 348*7fd79137SRobert Mustacchi _dwarf_pro_add_AT_fde(Dwarf_P_Debug dbg, 349*7fd79137SRobert Mustacchi Dwarf_P_Die die, 350*7fd79137SRobert Mustacchi Dwarf_Unsigned offset, Dwarf_Error * error) 351*7fd79137SRobert Mustacchi { 352*7fd79137SRobert Mustacchi Dwarf_P_Attribute new_attr; 353*7fd79137SRobert Mustacchi int uwordb_size = dbg->de_offset_size; 354*7fd79137SRobert Mustacchi 355*7fd79137SRobert Mustacchi if (die == NULL) { 356*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_DIE_NULL, -1); 357*7fd79137SRobert Mustacchi } 358*7fd79137SRobert Mustacchi new_attr = (Dwarf_P_Attribute) 359*7fd79137SRobert Mustacchi _dwarf_p_get_alloc(dbg,sizeof(struct Dwarf_P_Attribute_s)); 360*7fd79137SRobert Mustacchi if (new_attr == NULL) { 361*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, -1); 362*7fd79137SRobert Mustacchi } 363*7fd79137SRobert Mustacchi 364*7fd79137SRobert Mustacchi /* fill in the information */ 365*7fd79137SRobert Mustacchi new_attr->ar_attribute = DW_AT_MIPS_fde; 366*7fd79137SRobert Mustacchi new_attr->ar_attribute_form = dbg->de_ar_data_attribute_form;; 367*7fd79137SRobert Mustacchi new_attr->ar_rel_type = dbg->de_offset_reloc; 368*7fd79137SRobert Mustacchi new_attr->ar_nbytes = uwordb_size; 369*7fd79137SRobert Mustacchi new_attr->ar_next = NULL; 370*7fd79137SRobert Mustacchi new_attr->ar_reloc_len = uwordb_size; 371*7fd79137SRobert Mustacchi new_attr->ar_data = (char *) 372*7fd79137SRobert Mustacchi _dwarf_p_get_alloc(dbg, uwordb_size); 373*7fd79137SRobert Mustacchi if (new_attr->ar_data == NULL) { 374*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_ADDR_ALLOC, DW_DLV_NOCOUNT); 375*7fd79137SRobert Mustacchi } 376*7fd79137SRobert Mustacchi { 377*7fd79137SRobert Mustacchi Dwarf_Unsigned du = offset; 378*7fd79137SRobert Mustacchi 379*7fd79137SRobert Mustacchi WRITE_UNALIGNED(dbg, (void *) new_attr->ar_data, 380*7fd79137SRobert Mustacchi (const void *) &du, sizeof(du), uwordb_size); 381*7fd79137SRobert Mustacchi } 382*7fd79137SRobert Mustacchi 383*7fd79137SRobert Mustacchi _dwarf_pro_add_at_to_die(die, new_attr); 384*7fd79137SRobert Mustacchi 385*7fd79137SRobert Mustacchi return 0; 386*7fd79137SRobert Mustacchi } 387*7fd79137SRobert Mustacchi 388*7fd79137SRobert Mustacchi int 389*7fd79137SRobert Mustacchi _dwarf_pro_add_AT_macro_info(Dwarf_P_Debug dbg, 390*7fd79137SRobert Mustacchi Dwarf_P_Die die, 391*7fd79137SRobert Mustacchi Dwarf_Unsigned offset, Dwarf_Error * error) 392*7fd79137SRobert Mustacchi { 393*7fd79137SRobert Mustacchi Dwarf_P_Attribute new_attr; 394*7fd79137SRobert Mustacchi int uwordb_size = dbg->de_offset_size; 395*7fd79137SRobert Mustacchi 396*7fd79137SRobert Mustacchi if (die == NULL) { 397*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_DIE_NULL, -1); 398*7fd79137SRobert Mustacchi } 399*7fd79137SRobert Mustacchi new_attr = (Dwarf_P_Attribute) 400*7fd79137SRobert Mustacchi _dwarf_p_get_alloc(dbg,sizeof(struct Dwarf_P_Attribute_s)); 401*7fd79137SRobert Mustacchi if (new_attr == NULL) { 402*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, -1); 403*7fd79137SRobert Mustacchi } 404*7fd79137SRobert Mustacchi 405*7fd79137SRobert Mustacchi /* fill in the information */ 406*7fd79137SRobert Mustacchi new_attr->ar_attribute = DW_AT_macro_info; 407*7fd79137SRobert Mustacchi new_attr->ar_attribute_form = dbg->de_ar_data_attribute_form; 408*7fd79137SRobert Mustacchi new_attr->ar_rel_type = dbg->de_offset_reloc; 409*7fd79137SRobert Mustacchi 410*7fd79137SRobert Mustacchi new_attr->ar_nbytes = uwordb_size; 411*7fd79137SRobert Mustacchi new_attr->ar_next = NULL; 412*7fd79137SRobert Mustacchi new_attr->ar_reloc_len = uwordb_size; 413*7fd79137SRobert Mustacchi new_attr->ar_data = (char *) 414*7fd79137SRobert Mustacchi _dwarf_p_get_alloc(dbg, uwordb_size); 415*7fd79137SRobert Mustacchi if (new_attr->ar_data == NULL) { 416*7fd79137SRobert Mustacchi DWARF_P_DBG_ERROR(NULL, DW_DLE_ADDR_ALLOC, DW_DLV_NOCOUNT); 417*7fd79137SRobert Mustacchi } 418*7fd79137SRobert Mustacchi { 419*7fd79137SRobert Mustacchi Dwarf_Unsigned du = offset; 420*7fd79137SRobert Mustacchi 421*7fd79137SRobert Mustacchi WRITE_UNALIGNED(dbg, (void *) new_attr->ar_data, 422*7fd79137SRobert Mustacchi (const void *) &du, sizeof(du), uwordb_size); 423*7fd79137SRobert Mustacchi } 424*7fd79137SRobert Mustacchi 425*7fd79137SRobert Mustacchi _dwarf_pro_add_at_to_die(die, new_attr); 426*7fd79137SRobert Mustacchi 427*7fd79137SRobert Mustacchi return 0; 428*7fd79137SRobert Mustacchi } 429*7fd79137SRobert Mustacchi 430*7fd79137SRobert Mustacchi 431*7fd79137SRobert Mustacchi void 432*7fd79137SRobert Mustacchi _dwarf_pro_add_at_to_die(Dwarf_P_Die die, Dwarf_P_Attribute attr) 433*7fd79137SRobert Mustacchi { 434*7fd79137SRobert Mustacchi if (die->di_last_attr) { 435*7fd79137SRobert Mustacchi die->di_last_attr->ar_next = attr; 436*7fd79137SRobert Mustacchi die->di_last_attr = attr; 437*7fd79137SRobert Mustacchi die->di_n_attr++; 438*7fd79137SRobert Mustacchi } else { 439*7fd79137SRobert Mustacchi die->di_n_attr = 1; 440*7fd79137SRobert Mustacchi die->di_attrs = die->di_last_attr = attr; 441*7fd79137SRobert Mustacchi } 442*7fd79137SRobert Mustacchi } 443