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
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*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
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*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
dwarf_add_die_marker(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Unsigned marker,Dwarf_Error * error)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
dwarf_get_die_marker(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Unsigned * marker,Dwarf_Error * error)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
dwarf_add_die_to_debug(Dwarf_P_Debug dbg,Dwarf_P_Die first_die,Dwarf_Error * error)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
_dwarf_pro_add_AT_stmt_list(Dwarf_P_Debug dbg,Dwarf_P_Die first_die,Dwarf_Error * error)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
dwarf_add_AT_name(Dwarf_P_Die die,char * name,Dwarf_Error * error)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
dwarf_add_AT_comp_dir(Dwarf_P_Die ownerdie,char * current_working_directory,Dwarf_Error * error)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
_dwarf_pro_add_AT_fde(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Unsigned offset,Dwarf_Error * error)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
_dwarf_pro_add_AT_macro_info(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Unsigned offset,Dwarf_Error * error)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
_dwarf_pro_add_at_to_die(Dwarf_P_Die die,Dwarf_P_Attribute attr)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