149d3bc91SRichard Lowe /*
249d3bc91SRichard Lowe
3*07dc1947SRichard Lowe Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved.
4*07dc1947SRichard Lowe Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved.
549d3bc91SRichard Lowe
649d3bc91SRichard Lowe This program is free software; you can redistribute it and/or modify it
749d3bc91SRichard Lowe under the terms of version 2.1 of the GNU Lesser General Public License
849d3bc91SRichard Lowe as published by the Free Software Foundation.
949d3bc91SRichard Lowe
1049d3bc91SRichard Lowe This program is distributed in the hope that it would be useful, but
1149d3bc91SRichard Lowe WITHOUT ANY WARRANTY; without even the implied warranty of
1249d3bc91SRichard Lowe MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1349d3bc91SRichard Lowe
1449d3bc91SRichard Lowe Further, this software is distributed without any warranty that it is
1549d3bc91SRichard Lowe free of the rightful claim of any third person regarding infringement
1649d3bc91SRichard Lowe or the like. Any license provided herein, whether implied or
1749d3bc91SRichard Lowe otherwise, applies only to this software file. Patent licenses, if
1849d3bc91SRichard Lowe any, provided herein do not apply to combinations of this program with
1949d3bc91SRichard Lowe other software, or any other product whatsoever.
2049d3bc91SRichard Lowe
2149d3bc91SRichard Lowe You should have received a copy of the GNU Lesser General Public
2249d3bc91SRichard Lowe License along with this program; if not, write the Free Software
23*07dc1947SRichard Lowe Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
2449d3bc91SRichard Lowe USA.
2549d3bc91SRichard Lowe
26*07dc1947SRichard Lowe Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
2749d3bc91SRichard Lowe Mountain View, CA 94043, or:
2849d3bc91SRichard Lowe
2949d3bc91SRichard Lowe http://www.sgi.com
3049d3bc91SRichard Lowe
3149d3bc91SRichard Lowe For further information regarding this notice, see:
3249d3bc91SRichard Lowe
3349d3bc91SRichard Lowe http://oss.sgi.com/projects/GenInfo/NoticeExplan
3449d3bc91SRichard Lowe
3549d3bc91SRichard Lowe */
3649d3bc91SRichard Lowe
3749d3bc91SRichard Lowe
3849d3bc91SRichard Lowe
3949d3bc91SRichard Lowe #include "config.h"
4049d3bc91SRichard Lowe #include "libdwarfdefs.h"
4149d3bc91SRichard Lowe #include <stdio.h>
4249d3bc91SRichard Lowe #include <string.h>
4349d3bc91SRichard Lowe #include "pro_incl.h"
4449d3bc91SRichard Lowe #include "pro_die.h"
4549d3bc91SRichard Lowe
4649d3bc91SRichard Lowe #ifndef R_MIPS_NONE
4749d3bc91SRichard Lowe #define R_MIPS_NONE 0
4849d3bc91SRichard Lowe #endif
4949d3bc91SRichard Lowe
5049d3bc91SRichard Lowe /* adds an attribute to a die */
5149d3bc91SRichard Lowe void _dwarf_pro_add_at_to_die(Dwarf_P_Die die, Dwarf_P_Attribute attr);
5249d3bc91SRichard Lowe
5349d3bc91SRichard Lowe /*----------------------------------------------------------------------------
5449d3bc91SRichard Lowe This function creates a new die.
5549d3bc91SRichard Lowe tag: tag of the new die to be created
5649d3bc91SRichard Lowe parent,child,left,right: specify neighbors of the new die. Only
5749d3bc91SRichard Lowe one of these may be non-null
5849d3bc91SRichard Lowe -----------------------------------------------------------------------------*/
5949d3bc91SRichard Lowe Dwarf_P_Die
dwarf_new_die(Dwarf_P_Debug dbg,Dwarf_Tag tag,Dwarf_P_Die parent,Dwarf_P_Die child,Dwarf_P_Die left,Dwarf_P_Die right,Dwarf_Error * error)6049d3bc91SRichard Lowe dwarf_new_die(Dwarf_P_Debug dbg,
6149d3bc91SRichard Lowe Dwarf_Tag tag,
6249d3bc91SRichard Lowe Dwarf_P_Die parent,
6349d3bc91SRichard Lowe Dwarf_P_Die child,
6449d3bc91SRichard Lowe Dwarf_P_Die left, Dwarf_P_Die right, Dwarf_Error * error)
6549d3bc91SRichard Lowe {
66*07dc1947SRichard Lowe Dwarf_P_Die ret_die = 0;
6749d3bc91SRichard Lowe
68*07dc1947SRichard Lowe Dwarf_P_Die new_die = (Dwarf_P_Die)
6949d3bc91SRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Die_s));
7049d3bc91SRichard Lowe if (new_die == NULL) {
7149d3bc91SRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DIE_ALLOC,
7249d3bc91SRichard Lowe (Dwarf_P_Die) DW_DLV_BADADDR);
7349d3bc91SRichard Lowe }
7449d3bc91SRichard Lowe new_die->di_parent = NULL;
7549d3bc91SRichard Lowe new_die->di_left = NULL;
7649d3bc91SRichard Lowe new_die->di_right = NULL;
7749d3bc91SRichard Lowe new_die->di_child = NULL;
78*07dc1947SRichard Lowe new_die->di_last_child = NULL;
7949d3bc91SRichard Lowe new_die->di_tag = tag;
80*07dc1947SRichard Lowe new_die->di_dbg = dbg;
81*07dc1947SRichard Lowe new_die->di_marker = 0;
8249d3bc91SRichard Lowe ret_die =
8349d3bc91SRichard Lowe dwarf_die_link(new_die, parent, child, left, right, error);
8449d3bc91SRichard Lowe return ret_die;
8549d3bc91SRichard Lowe }
8649d3bc91SRichard Lowe
8749d3bc91SRichard Lowe /*----------------------------------------------------------------------------
8849d3bc91SRichard Lowe This function links up a die to specified neighbors
8949d3bc91SRichard Lowe parent,child,left,right: specify neighbors of the new die. Only
9049d3bc91SRichard Lowe one of these may be non-null
9149d3bc91SRichard Lowe -----------------------------------------------------------------------------*/
9249d3bc91SRichard Lowe Dwarf_P_Die
dwarf_die_link(Dwarf_P_Die new_die,Dwarf_P_Die parent,Dwarf_P_Die child,Dwarf_P_Die left,Dwarf_P_Die right,Dwarf_Error * error)9349d3bc91SRichard Lowe dwarf_die_link(Dwarf_P_Die new_die,
9449d3bc91SRichard Lowe Dwarf_P_Die parent,
9549d3bc91SRichard Lowe Dwarf_P_Die child,
9649d3bc91SRichard Lowe Dwarf_P_Die left, Dwarf_P_Die right, Dwarf_Error * error)
9749d3bc91SRichard Lowe {
98*07dc1947SRichard Lowe /* Count the # of non null neighbors. */
99*07dc1947SRichard Lowe int n_nulls = 0;
10049d3bc91SRichard Lowe
10149d3bc91SRichard Lowe if (parent != NULL) {
10249d3bc91SRichard Lowe n_nulls++;
103*07dc1947SRichard Lowe if (new_die->di_parent != NULL) {
104*07dc1947SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_LINK_LOOP,
105*07dc1947SRichard Lowe (Dwarf_P_Die) DW_DLV_BADADDR);
106*07dc1947SRichard Lowe }
10749d3bc91SRichard Lowe new_die->di_parent = parent;
108*07dc1947SRichard Lowe if (parent->di_child) {
10949d3bc91SRichard Lowe
110*07dc1947SRichard Lowe /* di_last_child identifies the last sibling, the
111*07dc1947SRichard Lowe die we want to attach new_die to. */
112*07dc1947SRichard Lowe /* ASSERT: if di_child is set so is di_last_child. */
113*07dc1947SRichard Lowe Dwarf_P_Die former_lastchild = parent->di_last_child;
114*07dc1947SRichard Lowe parent->di_last_child = new_die;
115*07dc1947SRichard Lowe /* Attach to the new die to end of the sibling list. */
116*07dc1947SRichard Lowe former_lastchild->di_right = new_die;
117*07dc1947SRichard Lowe new_die->di_left = former_lastchild;
118*07dc1947SRichard Lowe } else {
11949d3bc91SRichard Lowe parent->di_child = new_die;
120*07dc1947SRichard Lowe parent->di_last_child = new_die;
121*07dc1947SRichard Lowe }
12249d3bc91SRichard Lowe }
12349d3bc91SRichard Lowe if (child != NULL) {
12449d3bc91SRichard Lowe n_nulls++;
12549d3bc91SRichard Lowe new_die->di_child = child;
126*07dc1947SRichard Lowe new_die->di_last_child = child;
12749d3bc91SRichard Lowe if (child->di_parent) {
12849d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_PARENT_EXISTS,
12949d3bc91SRichard Lowe (Dwarf_P_Die) DW_DLV_BADADDR);
130*07dc1947SRichard Lowe } else {
13149d3bc91SRichard Lowe child->di_parent = new_die;
13249d3bc91SRichard Lowe }
133*07dc1947SRichard Lowe }
13449d3bc91SRichard Lowe if (left != NULL) {
13549d3bc91SRichard Lowe n_nulls++;
13649d3bc91SRichard Lowe new_die->di_left = left;
137*07dc1947SRichard Lowe if (left->di_right) {
138*07dc1947SRichard Lowe /* There's already a right sibling of left,
139*07dc1947SRichard Lowe insert the new die in the list. */
14049d3bc91SRichard Lowe new_die->di_right = left->di_right;
141*07dc1947SRichard Lowe left->di_right->di_left = new_die;
142*07dc1947SRichard Lowe }
14349d3bc91SRichard Lowe left->di_right = new_die;
14449d3bc91SRichard Lowe if (new_die->di_parent) {
14549d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_PARENT_EXISTS,
14649d3bc91SRichard Lowe (Dwarf_P_Die) DW_DLV_BADADDR);
147*07dc1947SRichard Lowe } else {
14849d3bc91SRichard Lowe new_die->di_parent = left->di_parent;
14949d3bc91SRichard Lowe }
150*07dc1947SRichard Lowe }
15149d3bc91SRichard Lowe if (right != NULL) {
15249d3bc91SRichard Lowe n_nulls++;
15349d3bc91SRichard Lowe new_die->di_right = right;
154*07dc1947SRichard Lowe if (right->di_left) {
155*07dc1947SRichard Lowe /* There is already a left sibling of the right die,
156*07dc1947SRichard Lowe insert the new die in the list. */
15749d3bc91SRichard Lowe new_die->di_left = right->di_left;
158*07dc1947SRichard Lowe right->di_left->di_right = new_die;
159*07dc1947SRichard Lowe }
16049d3bc91SRichard Lowe right->di_left = new_die;
16149d3bc91SRichard Lowe if (new_die->di_parent) {
16249d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_PARENT_EXISTS,
16349d3bc91SRichard Lowe (Dwarf_P_Die) DW_DLV_BADADDR);
164*07dc1947SRichard Lowe } else {
16549d3bc91SRichard Lowe new_die->di_parent = right->di_parent;
16649d3bc91SRichard Lowe }
167*07dc1947SRichard Lowe }
168*07dc1947SRichard Lowe if (n_nulls > 1) {
169*07dc1947SRichard Lowe /* Multiple neighbors! error! */
17049d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_EXTRA_NEIGHBORS,
17149d3bc91SRichard Lowe (Dwarf_P_Die) DW_DLV_BADADDR);
17249d3bc91SRichard Lowe }
17349d3bc91SRichard Lowe return new_die;
17449d3bc91SRichard Lowe
17549d3bc91SRichard Lowe }
17649d3bc91SRichard Lowe
177*07dc1947SRichard Lowe Dwarf_Unsigned
dwarf_add_die_marker(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Unsigned marker,Dwarf_Error * error)178*07dc1947SRichard Lowe dwarf_add_die_marker(Dwarf_P_Debug dbg,
179*07dc1947SRichard Lowe Dwarf_P_Die die,
180*07dc1947SRichard Lowe Dwarf_Unsigned marker,
181*07dc1947SRichard Lowe Dwarf_Error * error)
182*07dc1947SRichard Lowe {
183*07dc1947SRichard Lowe if (die == NULL) {
184*07dc1947SRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DIE_NULL, DW_DLV_NOCOUNT);
185*07dc1947SRichard Lowe }
186*07dc1947SRichard Lowe die->di_marker = marker;
187*07dc1947SRichard Lowe return 0;
188*07dc1947SRichard Lowe }
189*07dc1947SRichard Lowe
190*07dc1947SRichard Lowe
191*07dc1947SRichard Lowe Dwarf_Unsigned
dwarf_get_die_marker(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Unsigned * marker,Dwarf_Error * error)192*07dc1947SRichard Lowe dwarf_get_die_marker(Dwarf_P_Debug dbg,
193*07dc1947SRichard Lowe Dwarf_P_Die die,
194*07dc1947SRichard Lowe Dwarf_Unsigned * marker,
195*07dc1947SRichard Lowe Dwarf_Error * error)
196*07dc1947SRichard Lowe {
197*07dc1947SRichard Lowe if (die == NULL) {
198*07dc1947SRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DIE_NULL, DW_DLV_NOCOUNT);
199*07dc1947SRichard Lowe }
200*07dc1947SRichard Lowe *marker = die->di_marker;
201*07dc1947SRichard Lowe return 0;
202*07dc1947SRichard Lowe }
203*07dc1947SRichard Lowe
204*07dc1947SRichard Lowe
20549d3bc91SRichard Lowe /*----------------------------------------------------------------------------
20649d3bc91SRichard Lowe This function adds a die to dbg struct. It should be called using
20749d3bc91SRichard Lowe the root of all the dies.
20849d3bc91SRichard Lowe -----------------------------------------------------------------------------*/
20949d3bc91SRichard Lowe Dwarf_Unsigned
dwarf_add_die_to_debug(Dwarf_P_Debug dbg,Dwarf_P_Die first_die,Dwarf_Error * error)21049d3bc91SRichard Lowe dwarf_add_die_to_debug(Dwarf_P_Debug dbg,
21149d3bc91SRichard Lowe Dwarf_P_Die first_die, Dwarf_Error * error)
21249d3bc91SRichard Lowe {
21349d3bc91SRichard Lowe if (first_die == NULL) {
21449d3bc91SRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DIE_NULL, DW_DLV_NOCOUNT);
21549d3bc91SRichard Lowe }
21649d3bc91SRichard Lowe if (first_die->di_tag != DW_TAG_compile_unit) {
21749d3bc91SRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_WRONG_TAG, DW_DLV_NOCOUNT);
21849d3bc91SRichard Lowe }
21949d3bc91SRichard Lowe dbg->de_dies = first_die;
22049d3bc91SRichard Lowe return 0;
22149d3bc91SRichard Lowe }
22249d3bc91SRichard Lowe
22349d3bc91SRichard Lowe int
_dwarf_pro_add_AT_stmt_list(Dwarf_P_Debug dbg,Dwarf_P_Die first_die,Dwarf_Error * error)22449d3bc91SRichard Lowe _dwarf_pro_add_AT_stmt_list(Dwarf_P_Debug dbg,
22549d3bc91SRichard Lowe Dwarf_P_Die first_die, Dwarf_Error * error)
22649d3bc91SRichard Lowe {
22749d3bc91SRichard Lowe Dwarf_P_Attribute new_attr;
22849d3bc91SRichard Lowe int uwordb_size = dbg->de_offset_size;
22949d3bc91SRichard Lowe
23049d3bc91SRichard Lowe /* Add AT_stmt_list attribute */
23149d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
232*07dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
23349d3bc91SRichard Lowe if (new_attr == NULL) {
23449d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, DW_DLV_NOCOUNT);
23549d3bc91SRichard Lowe }
23649d3bc91SRichard Lowe
23749d3bc91SRichard Lowe new_attr->ar_attribute = DW_AT_stmt_list;
23849d3bc91SRichard Lowe new_attr->ar_attribute_form = dbg->de_ar_data_attribute_form;
23949d3bc91SRichard Lowe new_attr->ar_rel_type = dbg->de_offset_reloc;
24049d3bc91SRichard Lowe
24149d3bc91SRichard Lowe new_attr->ar_nbytes = uwordb_size;
24249d3bc91SRichard Lowe new_attr->ar_next = NULL;
24349d3bc91SRichard Lowe new_attr->ar_reloc_len = uwordb_size;
24449d3bc91SRichard Lowe new_attr->ar_data = (char *)
245*07dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, uwordb_size);
24649d3bc91SRichard Lowe if (new_attr->ar_data == NULL) {
24749d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_ADDR_ALLOC, DW_DLV_NOCOUNT);
24849d3bc91SRichard Lowe }
24949d3bc91SRichard Lowe {
25049d3bc91SRichard Lowe Dwarf_Unsigned du = 0;
25149d3bc91SRichard Lowe
25249d3bc91SRichard Lowe WRITE_UNALIGNED(dbg, (void *) new_attr->ar_data,
25349d3bc91SRichard Lowe (const void *) &du, sizeof(du), uwordb_size);
25449d3bc91SRichard Lowe }
25549d3bc91SRichard Lowe
25649d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(first_die, new_attr);
25749d3bc91SRichard Lowe return 0;
25849d3bc91SRichard Lowe }
25949d3bc91SRichard Lowe
26049d3bc91SRichard Lowe /*-----------------------------------------------------------------------------
26149d3bc91SRichard Lowe Add AT_name attribute to die
26249d3bc91SRichard Lowe ------------------------------------------------------------------------------*/
26349d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_name(Dwarf_P_Die die,char * name,Dwarf_Error * error)26449d3bc91SRichard Lowe dwarf_add_AT_name(Dwarf_P_Die die, char *name, Dwarf_Error * error)
26549d3bc91SRichard Lowe {
26649d3bc91SRichard Lowe Dwarf_P_Attribute new_attr;
26749d3bc91SRichard Lowe
26849d3bc91SRichard Lowe if (die == NULL) {
26949d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_DIE_NULL,
27049d3bc91SRichard Lowe (Dwarf_P_Attribute) DW_DLV_BADADDR);
27149d3bc91SRichard Lowe }
27249d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
273*07dc1947SRichard Lowe _dwarf_p_get_alloc(die->di_dbg,sizeof(struct Dwarf_P_Attribute_s));
27449d3bc91SRichard Lowe if (new_attr == NULL) {
27549d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC,
27649d3bc91SRichard Lowe (Dwarf_P_Attribute) DW_DLV_BADADDR);
27749d3bc91SRichard Lowe }
27849d3bc91SRichard Lowe
27949d3bc91SRichard Lowe /* fill in the information */
28049d3bc91SRichard Lowe new_attr->ar_attribute = DW_AT_name;
28149d3bc91SRichard Lowe /* assume that form is string, no debug_str yet */
28249d3bc91SRichard Lowe new_attr->ar_attribute_form = DW_FORM_string;
28349d3bc91SRichard Lowe new_attr->ar_nbytes = strlen(name) + 1;
28449d3bc91SRichard Lowe new_attr->ar_next = NULL;
28549d3bc91SRichard Lowe new_attr->ar_reloc_len = 0;
28649d3bc91SRichard Lowe new_attr->ar_data = (char *)
287*07dc1947SRichard Lowe _dwarf_p_get_alloc(die->di_dbg, strlen(name)+1);
28849d3bc91SRichard Lowe if (new_attr->ar_data == NULL) {
28949d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_STRING_ALLOC,
29049d3bc91SRichard Lowe (Dwarf_P_Attribute) DW_DLV_BADADDR);
29149d3bc91SRichard Lowe }
29249d3bc91SRichard Lowe strcpy(new_attr->ar_data, name);
29349d3bc91SRichard Lowe
29449d3bc91SRichard Lowe new_attr->ar_rel_type = R_MIPS_NONE;
29549d3bc91SRichard Lowe
29649d3bc91SRichard Lowe /* add attribute to the die */
29749d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(die, new_attr);
29849d3bc91SRichard Lowe return new_attr;
29949d3bc91SRichard Lowe }
30049d3bc91SRichard Lowe
30149d3bc91SRichard Lowe
30249d3bc91SRichard Lowe /*-----------------------------------------------------------------------------
30349d3bc91SRichard Lowe Add AT_comp_dir attribute to die
30449d3bc91SRichard Lowe ------------------------------------------------------------------------------*/
30549d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_comp_dir(Dwarf_P_Die ownerdie,char * current_working_directory,Dwarf_Error * error)30649d3bc91SRichard Lowe dwarf_add_AT_comp_dir(Dwarf_P_Die ownerdie,
30749d3bc91SRichard Lowe char *current_working_directory,
30849d3bc91SRichard Lowe Dwarf_Error * error)
30949d3bc91SRichard Lowe {
31049d3bc91SRichard Lowe Dwarf_P_Attribute new_attr;
31149d3bc91SRichard Lowe
31249d3bc91SRichard Lowe if (ownerdie == NULL) {
31349d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_DIE_NULL,
31449d3bc91SRichard Lowe (Dwarf_P_Attribute) DW_DLV_BADADDR);
31549d3bc91SRichard Lowe }
31649d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
317*07dc1947SRichard Lowe _dwarf_p_get_alloc(ownerdie->di_dbg,
318*07dc1947SRichard Lowe sizeof(struct Dwarf_P_Attribute_s));
31949d3bc91SRichard Lowe if (new_attr == NULL) {
32049d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC,
32149d3bc91SRichard Lowe (Dwarf_P_Attribute) DW_DLV_BADADDR);
32249d3bc91SRichard Lowe }
32349d3bc91SRichard Lowe
32449d3bc91SRichard Lowe /* fill in the information */
32549d3bc91SRichard Lowe new_attr->ar_attribute = DW_AT_comp_dir;
32649d3bc91SRichard Lowe /* assume that form is string, no debug_str yet */
32749d3bc91SRichard Lowe new_attr->ar_attribute_form = DW_FORM_string;
32849d3bc91SRichard Lowe new_attr->ar_nbytes = strlen(current_working_directory) + 1;
32949d3bc91SRichard Lowe new_attr->ar_next = NULL;
33049d3bc91SRichard Lowe new_attr->ar_reloc_len = 0;
33149d3bc91SRichard Lowe new_attr->ar_data = (char *)
332*07dc1947SRichard Lowe _dwarf_p_get_alloc(ownerdie->di_dbg,
333*07dc1947SRichard Lowe strlen(current_working_directory)+1);
33449d3bc91SRichard Lowe if (new_attr->ar_data == NULL) {
33549d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_STRING_ALLOC,
33649d3bc91SRichard Lowe (Dwarf_P_Attribute) DW_DLV_BADADDR);
33749d3bc91SRichard Lowe }
33849d3bc91SRichard Lowe strcpy(new_attr->ar_data, current_working_directory);
33949d3bc91SRichard Lowe
34049d3bc91SRichard Lowe new_attr->ar_rel_type = R_MIPS_NONE;
34149d3bc91SRichard Lowe
34249d3bc91SRichard Lowe /* add attribute to the die */
34349d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
34449d3bc91SRichard Lowe return new_attr;
34549d3bc91SRichard Lowe }
34649d3bc91SRichard Lowe
34749d3bc91SRichard Lowe int
_dwarf_pro_add_AT_fde(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Unsigned offset,Dwarf_Error * error)34849d3bc91SRichard Lowe _dwarf_pro_add_AT_fde(Dwarf_P_Debug dbg,
34949d3bc91SRichard Lowe Dwarf_P_Die die,
35049d3bc91SRichard Lowe Dwarf_Unsigned offset, Dwarf_Error * error)
35149d3bc91SRichard Lowe {
35249d3bc91SRichard Lowe Dwarf_P_Attribute new_attr;
35349d3bc91SRichard Lowe int uwordb_size = dbg->de_offset_size;
35449d3bc91SRichard Lowe
35549d3bc91SRichard Lowe if (die == NULL) {
35649d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_DIE_NULL, -1);
35749d3bc91SRichard Lowe }
35849d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
359*07dc1947SRichard Lowe _dwarf_p_get_alloc(dbg,sizeof(struct Dwarf_P_Attribute_s));
36049d3bc91SRichard Lowe if (new_attr == NULL) {
36149d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, -1);
36249d3bc91SRichard Lowe }
36349d3bc91SRichard Lowe
36449d3bc91SRichard Lowe /* fill in the information */
36549d3bc91SRichard Lowe new_attr->ar_attribute = DW_AT_MIPS_fde;
36649d3bc91SRichard Lowe new_attr->ar_attribute_form = dbg->de_ar_data_attribute_form;;
36749d3bc91SRichard Lowe new_attr->ar_rel_type = dbg->de_offset_reloc;
36849d3bc91SRichard Lowe new_attr->ar_nbytes = uwordb_size;
36949d3bc91SRichard Lowe new_attr->ar_next = NULL;
37049d3bc91SRichard Lowe new_attr->ar_reloc_len = uwordb_size;
37149d3bc91SRichard Lowe new_attr->ar_data = (char *)
372*07dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, uwordb_size);
37349d3bc91SRichard Lowe if (new_attr->ar_data == NULL) {
37449d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_ADDR_ALLOC, DW_DLV_NOCOUNT);
37549d3bc91SRichard Lowe }
37649d3bc91SRichard Lowe {
37749d3bc91SRichard Lowe Dwarf_Unsigned du = offset;
37849d3bc91SRichard Lowe
37949d3bc91SRichard Lowe WRITE_UNALIGNED(dbg, (void *) new_attr->ar_data,
38049d3bc91SRichard Lowe (const void *) &du, sizeof(du), uwordb_size);
38149d3bc91SRichard Lowe }
38249d3bc91SRichard Lowe
38349d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(die, new_attr);
38449d3bc91SRichard Lowe
38549d3bc91SRichard Lowe return 0;
38649d3bc91SRichard Lowe }
38749d3bc91SRichard Lowe
38849d3bc91SRichard Lowe int
_dwarf_pro_add_AT_macro_info(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Unsigned offset,Dwarf_Error * error)38949d3bc91SRichard Lowe _dwarf_pro_add_AT_macro_info(Dwarf_P_Debug dbg,
39049d3bc91SRichard Lowe Dwarf_P_Die die,
39149d3bc91SRichard Lowe Dwarf_Unsigned offset, Dwarf_Error * error)
39249d3bc91SRichard Lowe {
39349d3bc91SRichard Lowe Dwarf_P_Attribute new_attr;
39449d3bc91SRichard Lowe int uwordb_size = dbg->de_offset_size;
39549d3bc91SRichard Lowe
39649d3bc91SRichard Lowe if (die == NULL) {
39749d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_DIE_NULL, -1);
39849d3bc91SRichard Lowe }
39949d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
400*07dc1947SRichard Lowe _dwarf_p_get_alloc(dbg,sizeof(struct Dwarf_P_Attribute_s));
40149d3bc91SRichard Lowe if (new_attr == NULL) {
40249d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, -1);
40349d3bc91SRichard Lowe }
40449d3bc91SRichard Lowe
40549d3bc91SRichard Lowe /* fill in the information */
40649d3bc91SRichard Lowe new_attr->ar_attribute = DW_AT_macro_info;
40749d3bc91SRichard Lowe new_attr->ar_attribute_form = dbg->de_ar_data_attribute_form;
40849d3bc91SRichard Lowe new_attr->ar_rel_type = dbg->de_offset_reloc;
40949d3bc91SRichard Lowe
41049d3bc91SRichard Lowe new_attr->ar_nbytes = uwordb_size;
41149d3bc91SRichard Lowe new_attr->ar_next = NULL;
41249d3bc91SRichard Lowe new_attr->ar_reloc_len = uwordb_size;
41349d3bc91SRichard Lowe new_attr->ar_data = (char *)
414*07dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, uwordb_size);
41549d3bc91SRichard Lowe if (new_attr->ar_data == NULL) {
41649d3bc91SRichard Lowe DWARF_P_DBG_ERROR(NULL, DW_DLE_ADDR_ALLOC, DW_DLV_NOCOUNT);
41749d3bc91SRichard Lowe }
41849d3bc91SRichard Lowe {
41949d3bc91SRichard Lowe Dwarf_Unsigned du = offset;
42049d3bc91SRichard Lowe
42149d3bc91SRichard Lowe WRITE_UNALIGNED(dbg, (void *) new_attr->ar_data,
42249d3bc91SRichard Lowe (const void *) &du, sizeof(du), uwordb_size);
42349d3bc91SRichard Lowe }
42449d3bc91SRichard Lowe
42549d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(die, new_attr);
42649d3bc91SRichard Lowe
42749d3bc91SRichard Lowe return 0;
42849d3bc91SRichard Lowe }
42949d3bc91SRichard Lowe
43049d3bc91SRichard Lowe
43149d3bc91SRichard Lowe void
_dwarf_pro_add_at_to_die(Dwarf_P_Die die,Dwarf_P_Attribute attr)43249d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(Dwarf_P_Die die, Dwarf_P_Attribute attr)
43349d3bc91SRichard Lowe {
43449d3bc91SRichard Lowe if (die->di_last_attr) {
43549d3bc91SRichard Lowe die->di_last_attr->ar_next = attr;
43649d3bc91SRichard Lowe die->di_last_attr = attr;
43749d3bc91SRichard Lowe die->di_n_attr++;
43849d3bc91SRichard Lowe } else {
43949d3bc91SRichard Lowe die->di_n_attr = 1;
44049d3bc91SRichard Lowe die->di_attrs = die->di_last_attr = attr;
44149d3bc91SRichard Lowe }
44249d3bc91SRichard Lowe }
443