xref: /titanic_44/usr/src/tools/ctf/dwarf/common/pro_die.c (revision 07dc1947c362e187fb955d283b692f8769dd5def)
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