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