1bc1f688bSRobert Mustacchi /*
2bc1f688bSRobert Mustacchi Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved.
3bc1f688bSRobert Mustacchi Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved.
4*4d9fdb46SRobert Mustacchi Portions Copyright 2007-2013 David Anderson. All rights reserved.
5*4d9fdb46SRobert Mustacchi Portions Copyright 2012 SN Systems Ltd. All rights reserved.
6bc1f688bSRobert Mustacchi
7bc1f688bSRobert Mustacchi This program is free software; you can redistribute it and/or modify it
8bc1f688bSRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License
9bc1f688bSRobert Mustacchi as published by the Free Software Foundation.
10bc1f688bSRobert Mustacchi
11bc1f688bSRobert Mustacchi This program is distributed in the hope that it would be useful, but
12bc1f688bSRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of
13bc1f688bSRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14bc1f688bSRobert Mustacchi
15bc1f688bSRobert Mustacchi Further, this software is distributed without any warranty that it is
16bc1f688bSRobert Mustacchi free of the rightful claim of any third person regarding infringement
17bc1f688bSRobert Mustacchi or the like. Any license provided herein, whether implied or
18bc1f688bSRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if
19bc1f688bSRobert Mustacchi any, provided herein do not apply to combinations of this program with
20bc1f688bSRobert Mustacchi other software, or any other product whatsoever.
21bc1f688bSRobert Mustacchi
22bc1f688bSRobert Mustacchi You should have received a copy of the GNU Lesser General Public
23bc1f688bSRobert Mustacchi License along with this program; if not, write the Free Software
24bc1f688bSRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
25bc1f688bSRobert Mustacchi USA.
26bc1f688bSRobert Mustacchi
27bc1f688bSRobert Mustacchi */
28bc1f688bSRobert Mustacchi
29bc1f688bSRobert Mustacchi #include "config.h"
30bc1f688bSRobert Mustacchi #include "libdwarfdefs.h"
31bc1f688bSRobert Mustacchi #include <stdio.h>
32bc1f688bSRobert Mustacchi #include <string.h>
33bc1f688bSRobert Mustacchi #include <limits.h>
34bc1f688bSRobert Mustacchi #include "pro_incl.h"
35*4d9fdb46SRobert Mustacchi #include <stddef.h>
36*4d9fdb46SRobert Mustacchi #include "dwarf.h"
37*4d9fdb46SRobert Mustacchi #include "libdwarf.h"
38*4d9fdb46SRobert Mustacchi #include "pro_opaque.h"
39*4d9fdb46SRobert Mustacchi #include "pro_error.h"
40*4d9fdb46SRobert Mustacchi #include "pro_encode_nm.h"
41*4d9fdb46SRobert Mustacchi #include "pro_alloc.h"
42*4d9fdb46SRobert Mustacchi #include "pro_die.h"
43bc1f688bSRobert Mustacchi #include "pro_expr.h"
44bc1f688bSRobert Mustacchi
45bc1f688bSRobert Mustacchi #ifndef R_MIPS_NONE
46bc1f688bSRobert Mustacchi #define R_MIPS_NONE 0
47bc1f688bSRobert Mustacchi #endif
48bc1f688bSRobert Mustacchi
49bc1f688bSRobert Mustacchi
50bc1f688bSRobert Mustacchi /* Indicates no relocation needed. */
51bc1f688bSRobert Mustacchi #define NO_ELF_SYM_INDEX 0
52bc1f688bSRobert Mustacchi
53bc1f688bSRobert Mustacchi
54*4d9fdb46SRobert Mustacchi #ifdef WORDS_BIGENDIAN
55*4d9fdb46SRobert Mustacchi #define ASNAR(t,s,l) \
56*4d9fdb46SRobert Mustacchi do { \
57*4d9fdb46SRobert Mustacchi unsigned tbyte = sizeof(t) - l; \
58*4d9fdb46SRobert Mustacchi t = 0; \
59*4d9fdb46SRobert Mustacchi dbg->de_copy_word(((char *)&t)+tbyte ,&s[0],l);\
60*4d9fdb46SRobert Mustacchi } while (0)
61*4d9fdb46SRobert Mustacchi #else /* LITTLE ENDIAN */
62*4d9fdb46SRobert Mustacchi #define ASNAR(t,s,l) \
63*4d9fdb46SRobert Mustacchi do { \
64*4d9fdb46SRobert Mustacchi t = 0; \
65*4d9fdb46SRobert Mustacchi dbg->de_copy_word(&t,&s[0],l); \
66*4d9fdb46SRobert Mustacchi } while (0)
67*4d9fdb46SRobert Mustacchi #endif /* end LITTLE- BIG-ENDIAN */
68bc1f688bSRobert Mustacchi
69*4d9fdb46SRobert Mustacchi
70*4d9fdb46SRobert Mustacchi #ifdef WORDS_BIGENDIAN
71*4d9fdb46SRobert Mustacchi #define ASNOUT(t,s,l) \
72*4d9fdb46SRobert Mustacchi do { \
73*4d9fdb46SRobert Mustacchi unsigned sbyte = 0; \
74*4d9fdb46SRobert Mustacchi char *p = 0; \
75*4d9fdb46SRobert Mustacchi if (l > sizeof(s)) { \
76*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DEBUG_FRAME_LENGTH_BAD);\
77*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR; \
78*4d9fdb46SRobert Mustacchi } \
79*4d9fdb46SRobert Mustacchi sbyte = sizeof(s) - l; \
80*4d9fdb46SRobert Mustacchi p = (const char *)(&s); \
81*4d9fdb46SRobert Mustacchi dbg->de_copy_word(t,(const void *)(p+sbyte),l);\
82*4d9fdb46SRobert Mustacchi } while (0)
83*4d9fdb46SRobert Mustacchi #else /* LITTLEENDIAN */
84*4d9fdb46SRobert Mustacchi #define ASNOUT(t,s,l) \
85*4d9fdb46SRobert Mustacchi do { \
86*4d9fdb46SRobert Mustacchi const char *p = 0; \
87*4d9fdb46SRobert Mustacchi if (l > sizeof(s)) { \
88*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DEBUG_FRAME_LENGTH_BAD);\
89*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR; \
90*4d9fdb46SRobert Mustacchi } \
91*4d9fdb46SRobert Mustacchi p = (const char *)(&s); \
92*4d9fdb46SRobert Mustacchi memcpy(t,(const void *)p,l); \
93*4d9fdb46SRobert Mustacchi dbg->de_copy_word(t,(const void *)p,l); \
94*4d9fdb46SRobert Mustacchi } while (0)
95*4d9fdb46SRobert Mustacchi #endif /* ENDIANNESS */
96*4d9fdb46SRobert Mustacchi
97*4d9fdb46SRobert Mustacchi #ifdef WORDS_BIGENDIAN
98*4d9fdb46SRobert Mustacchi #define SIGN_EXTEND(dest, length) \
99*4d9fdb46SRobert Mustacchi do { \
100*4d9fdb46SRobert Mustacchi if (*(Dwarf_Sbyte *)((char *)&dest + \
101*4d9fdb46SRobert Mustacchi sizeof(dest) - length) < 0) { \
102*4d9fdb46SRobert Mustacchi memcpy((char *)&dest, "\xff\xff\xff\xff\xff\xff\xff\xff",\
103*4d9fdb46SRobert Mustacchi sizeof(dest) - length); \
104*4d9fdb46SRobert Mustacchi } \
105*4d9fdb46SRobert Mustacchi } while (0)
106*4d9fdb46SRobert Mustacchi #else /* LITTLE ENDIAN */
107*4d9fdb46SRobert Mustacchi #define SIGN_EXTEND(dest, length) \
108*4d9fdb46SRobert Mustacchi do { \
109*4d9fdb46SRobert Mustacchi if (*(Dwarf_Sbyte *)((char *)&dest + (length-1)) < 0) { \
110*4d9fdb46SRobert Mustacchi memcpy((char *)&dest+length, \
111*4d9fdb46SRobert Mustacchi "\xff\xff\xff\xff\xff\xff\xff\xff", \
112*4d9fdb46SRobert Mustacchi sizeof(dest) - length); \
113*4d9fdb46SRobert Mustacchi } \
114*4d9fdb46SRobert Mustacchi } while (0)
115*4d9fdb46SRobert Mustacchi
116*4d9fdb46SRobert Mustacchi #endif /* ! LITTLE_ENDIAN */
117*4d9fdb46SRobert Mustacchi
118*4d9fdb46SRobert Mustacchi
119*4d9fdb46SRobert Mustacchi /* This function adds an attribute whose value is
120bc1f688bSRobert Mustacchi a target address to the given die. The attribute
121bc1f688bSRobert Mustacchi is given the name provided by attr. The address
122*4d9fdb46SRobert Mustacchi is given in pc_value. */
123bc1f688bSRobert Mustacchi
124*4d9fdb46SRobert Mustacchi static int
125*4d9fdb46SRobert Mustacchi local_add_AT_address_a(Dwarf_P_Debug dbg,
126bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
127bc1f688bSRobert Mustacchi Dwarf_Half attr,
128bc1f688bSRobert Mustacchi Dwarf_Signed form,
129bc1f688bSRobert Mustacchi Dwarf_Unsigned pc_value,
130bc1f688bSRobert Mustacchi Dwarf_Unsigned sym_index,
131*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
132bc1f688bSRobert Mustacchi Dwarf_Error * error);
133bc1f688bSRobert Mustacchi
134bc1f688bSRobert Mustacchi /* old interface */
135bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_targ_address(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Signed sym_index,Dwarf_Error * error)136bc1f688bSRobert Mustacchi dwarf_add_AT_targ_address(Dwarf_P_Debug dbg,
137bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
138bc1f688bSRobert Mustacchi Dwarf_Half attr,
139bc1f688bSRobert Mustacchi Dwarf_Unsigned pc_value,
140bc1f688bSRobert Mustacchi Dwarf_Signed sym_index, Dwarf_Error * error)
141bc1f688bSRobert Mustacchi {
142*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
143*4d9fdb46SRobert Mustacchi int res = 0;
144*4d9fdb46SRobert Mustacchi
145*4d9fdb46SRobert Mustacchi if (sym_index < 0) {
146*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
147*4d9fdb46SRobert Mustacchi }
148*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_targ_address_c(dbg,
149*4d9fdb46SRobert Mustacchi ownerdie, attr, pc_value,
150*4d9fdb46SRobert Mustacchi (Dwarf_Unsigned) sym_index,
151*4d9fdb46SRobert Mustacchi &a,
152*4d9fdb46SRobert Mustacchi error);
153*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
154*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
155*4d9fdb46SRobert Mustacchi }
156*4d9fdb46SRobert Mustacchi return a;
157*4d9fdb46SRobert Mustacchi
158bc1f688bSRobert Mustacchi }
159bc1f688bSRobert Mustacchi
160bc1f688bSRobert Mustacchi /* New interface, replacing dwarf_add_AT_targ_address.
161bc1f688bSRobert Mustacchi Essentially just makes sym_index a Dwarf_Unsigned
162*4d9fdb46SRobert Mustacchi so for symbolic relocations it can be a full address. */
163bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_targ_address_b(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_Error * error)164bc1f688bSRobert Mustacchi dwarf_add_AT_targ_address_b(Dwarf_P_Debug dbg,
165bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
166bc1f688bSRobert Mustacchi Dwarf_Half attr,
167bc1f688bSRobert Mustacchi Dwarf_Unsigned pc_value,
168bc1f688bSRobert Mustacchi Dwarf_Unsigned sym_index,
169bc1f688bSRobert Mustacchi Dwarf_Error * error)
170bc1f688bSRobert Mustacchi {
171*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
172*4d9fdb46SRobert Mustacchi int res = 0;
173*4d9fdb46SRobert Mustacchi
174*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_targ_address_c(dbg,
175*4d9fdb46SRobert Mustacchi ownerdie,attr,pc_value,sym_index,
176*4d9fdb46SRobert Mustacchi &a, error);
177*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
178*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
179*4d9fdb46SRobert Mustacchi }
180*4d9fdb46SRobert Mustacchi return a;
181*4d9fdb46SRobert Mustacchi
182*4d9fdb46SRobert Mustacchi }
183*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_targ_address_c(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)184*4d9fdb46SRobert Mustacchi dwarf_add_AT_targ_address_c(Dwarf_P_Debug dbg,
185*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
186*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
187*4d9fdb46SRobert Mustacchi Dwarf_Unsigned pc_value,
188*4d9fdb46SRobert Mustacchi Dwarf_Unsigned sym_index,
189*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
190*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
191*4d9fdb46SRobert Mustacchi {
192*4d9fdb46SRobert Mustacchi int res = 0;
193*4d9fdb46SRobert Mustacchi
194bc1f688bSRobert Mustacchi switch (attr) {
195bc1f688bSRobert Mustacchi case DW_AT_low_pc:
196bc1f688bSRobert Mustacchi case DW_AT_high_pc:
197bc1f688bSRobert Mustacchi
198bc1f688bSRobert Mustacchi /* added to support location lists */
199bc1f688bSRobert Mustacchi /* no way to check that this is a loclist-style address though */
200bc1f688bSRobert Mustacchi case DW_AT_location:
201bc1f688bSRobert Mustacchi case DW_AT_string_length:
202bc1f688bSRobert Mustacchi case DW_AT_return_addr:
203bc1f688bSRobert Mustacchi case DW_AT_frame_base:
204bc1f688bSRobert Mustacchi case DW_AT_segment:
205bc1f688bSRobert Mustacchi case DW_AT_static_link:
206bc1f688bSRobert Mustacchi case DW_AT_use_location:
207bc1f688bSRobert Mustacchi case DW_AT_vtable_elem_location:
208bc1f688bSRobert Mustacchi case DW_AT_const_value: /* Gcc can generate this as address. */
209bc1f688bSRobert Mustacchi case DW_AT_entry_pc:
210bc1f688bSRobert Mustacchi break;
211bc1f688bSRobert Mustacchi default:
212bc1f688bSRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
213bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
214*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
215bc1f688bSRobert Mustacchi }
216bc1f688bSRobert Mustacchi break;
217bc1f688bSRobert Mustacchi }
218bc1f688bSRobert Mustacchi
219*4d9fdb46SRobert Mustacchi res = local_add_AT_address_a(dbg, ownerdie, attr, DW_FORM_addr,
220*4d9fdb46SRobert Mustacchi pc_value, sym_index,attr_out, error);
221*4d9fdb46SRobert Mustacchi return res;
222bc1f688bSRobert Mustacchi }
223bc1f688bSRobert Mustacchi
224bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_ref_address(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_Error * error)225bc1f688bSRobert Mustacchi dwarf_add_AT_ref_address(Dwarf_P_Debug dbg,
226bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
227bc1f688bSRobert Mustacchi Dwarf_Half attr,
228bc1f688bSRobert Mustacchi Dwarf_Unsigned pc_value,
229bc1f688bSRobert Mustacchi Dwarf_Unsigned sym_index,
230bc1f688bSRobert Mustacchi Dwarf_Error * error)
231bc1f688bSRobert Mustacchi {
232*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
233*4d9fdb46SRobert Mustacchi int res = 0;
234*4d9fdb46SRobert Mustacchi
235*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_ref_address_a(dbg,ownerdie,
236*4d9fdb46SRobert Mustacchi attr,pc_value,sym_index,&a,error);
237*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
238*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
239*4d9fdb46SRobert Mustacchi }
240*4d9fdb46SRobert Mustacchi return a;
241*4d9fdb46SRobert Mustacchi }
242*4d9fdb46SRobert Mustacchi
243*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_ref_address_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)244*4d9fdb46SRobert Mustacchi dwarf_add_AT_ref_address_a(Dwarf_P_Debug dbg,
245*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
246*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
247*4d9fdb46SRobert Mustacchi Dwarf_Unsigned pc_value,
248*4d9fdb46SRobert Mustacchi Dwarf_Unsigned sym_index,
249*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
250*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
251*4d9fdb46SRobert Mustacchi {
252*4d9fdb46SRobert Mustacchi int res = 0;
253*4d9fdb46SRobert Mustacchi
254bc1f688bSRobert Mustacchi switch (attr) {
255bc1f688bSRobert Mustacchi case DW_AT_type:
256bc1f688bSRobert Mustacchi case DW_AT_import:
257bc1f688bSRobert Mustacchi break;
258bc1f688bSRobert Mustacchi
259bc1f688bSRobert Mustacchi default:
260bc1f688bSRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
261bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
262*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
263bc1f688bSRobert Mustacchi }
264bc1f688bSRobert Mustacchi break;
265bc1f688bSRobert Mustacchi }
266bc1f688bSRobert Mustacchi
267*4d9fdb46SRobert Mustacchi /* FIXME: For DWARF3 and later this call is problematic as
268*4d9fdb46SRobert Mustacchi DW_FORM_ref_addr is really an offset in
269*4d9fdb46SRobert Mustacchi .debug_info , not an address. */
270*4d9fdb46SRobert Mustacchi res = local_add_AT_address_a(dbg, ownerdie,
271*4d9fdb46SRobert Mustacchi attr, DW_FORM_ref_addr,
272*4d9fdb46SRobert Mustacchi pc_value, sym_index,attr_out, error);
273*4d9fdb46SRobert Mustacchi return res;
274bc1f688bSRobert Mustacchi }
275bc1f688bSRobert Mustacchi
276bc1f688bSRobert Mustacchi
277bc1f688bSRobert Mustacchi /* Make sure attribute types are checked before entering here. */
278*4d9fdb46SRobert Mustacchi static int
local_add_AT_address_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Signed form,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)279*4d9fdb46SRobert Mustacchi local_add_AT_address_a(Dwarf_P_Debug dbg,
280bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
281bc1f688bSRobert Mustacchi Dwarf_Half attr,
282bc1f688bSRobert Mustacchi Dwarf_Signed form,
283bc1f688bSRobert Mustacchi Dwarf_Unsigned pc_value,
284bc1f688bSRobert Mustacchi Dwarf_Unsigned sym_index,
285*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
286bc1f688bSRobert Mustacchi Dwarf_Error * error)
287bc1f688bSRobert Mustacchi {
288bc1f688bSRobert Mustacchi Dwarf_P_Attribute new_attr;
289*4d9fdb46SRobert Mustacchi int upointer_size = 0;
290bc1f688bSRobert Mustacchi
291bc1f688bSRobert Mustacchi if (dbg == NULL) {
292bc1f688bSRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
293*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
294bc1f688bSRobert Mustacchi }
295*4d9fdb46SRobert Mustacchi upointer_size = dbg->de_pointer_size;
296bc1f688bSRobert Mustacchi
297bc1f688bSRobert Mustacchi if (ownerdie == NULL) {
298bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
299*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
300bc1f688bSRobert Mustacchi }
301bc1f688bSRobert Mustacchi
302bc1f688bSRobert Mustacchi /* attribute types have already been checked */
303bc1f688bSRobert Mustacchi /* switch (attr) { ... } */
304bc1f688bSRobert Mustacchi
305bc1f688bSRobert Mustacchi new_attr = (Dwarf_P_Attribute)
306bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
307bc1f688bSRobert Mustacchi if (new_attr == NULL) {
308bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
309*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
310bc1f688bSRobert Mustacchi }
311bc1f688bSRobert Mustacchi
312bc1f688bSRobert Mustacchi new_attr->ar_attribute = attr;
313bc1f688bSRobert Mustacchi new_attr->ar_attribute_form = form;
314bc1f688bSRobert Mustacchi new_attr->ar_nbytes = upointer_size;
315bc1f688bSRobert Mustacchi new_attr->ar_rel_symidx = sym_index;
316bc1f688bSRobert Mustacchi new_attr->ar_reloc_len = upointer_size;
317bc1f688bSRobert Mustacchi new_attr->ar_next = 0;
318*4d9fdb46SRobert Mustacchi if (sym_index != NO_ELF_SYM_INDEX) {
319bc1f688bSRobert Mustacchi new_attr->ar_rel_type = dbg->de_ptr_reloc;
320*4d9fdb46SRobert Mustacchi } else {
321bc1f688bSRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE;
322*4d9fdb46SRobert Mustacchi }
323bc1f688bSRobert Mustacchi
324bc1f688bSRobert Mustacchi new_attr->ar_data = (char *)
325bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, upointer_size);
326bc1f688bSRobert Mustacchi if (new_attr->ar_data == NULL) {
327bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
328*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
329bc1f688bSRobert Mustacchi }
330bc1f688bSRobert Mustacchi WRITE_UNALIGNED(dbg, new_attr->ar_data,
331bc1f688bSRobert Mustacchi (const void *) &pc_value,
332bc1f688bSRobert Mustacchi sizeof(pc_value), upointer_size);
333bc1f688bSRobert Mustacchi
334bc1f688bSRobert Mustacchi /* add attribute to the die */
335bc1f688bSRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
336*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
337*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
338bc1f688bSRobert Mustacchi }
339bc1f688bSRobert Mustacchi
340*4d9fdb46SRobert Mustacchi /* Pass in array (ie a pointer to) of Dwarf_Signed
341*4d9fdb46SRobert Mustacchi with input_array_length elements.
342bc1f688bSRobert Mustacchi
343*4d9fdb46SRobert Mustacchi A block of bytes is created
344*4d9fdb46SRobert Mustacchi with the sleb data in it.
345*4d9fdb46SRobert Mustacchi
346*4d9fdb46SRobert Mustacchi A pointer to the glob of bytes is returned
347*4d9fdb46SRobert Mustacchi through the output_block pointer and its length
348*4d9fdb46SRobert Mustacchi through output_block_len pointer. */
349*4d9fdb46SRobert Mustacchi int
dwarf_compress_integer_block_a(Dwarf_P_Debug dbg,Dwarf_Unsigned input_array_length,Dwarf_Signed * input_array,Dwarf_Unsigned * output_block_len,void ** output_block_returned,Dwarf_Error * error)350*4d9fdb46SRobert Mustacchi dwarf_compress_integer_block_a(
351*4d9fdb46SRobert Mustacchi Dwarf_P_Debug dbg,
352*4d9fdb46SRobert Mustacchi Dwarf_Unsigned input_array_length,
353*4d9fdb46SRobert Mustacchi Dwarf_Signed * input_array,
354*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *output_block_len,
355*4d9fdb46SRobert Mustacchi void ** output_block_returned,
356*4d9fdb46SRobert Mustacchi Dwarf_Error* error
357*4d9fdb46SRobert Mustacchi )
358*4d9fdb46SRobert Mustacchi {
359*4d9fdb46SRobert Mustacchi Dwarf_Unsigned output_length_in_bytes = 0;
360*4d9fdb46SRobert Mustacchi char * output_block = 0;
361*4d9fdb46SRobert Mustacchi char encode_buffer[ENCODE_SPACE_NEEDED];
362*4d9fdb46SRobert Mustacchi unsigned u = 0;
363*4d9fdb46SRobert Mustacchi char * ptr = 0;
364*4d9fdb46SRobert Mustacchi int remain = 0;
365*4d9fdb46SRobert Mustacchi int result = 0;
366*4d9fdb46SRobert Mustacchi
367*4d9fdb46SRobert Mustacchi if (dbg == NULL) {
368*4d9fdb46SRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
369*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
370*4d9fdb46SRobert Mustacchi }
371*4d9fdb46SRobert Mustacchi /* First compress everything to find the total size. */
372*4d9fdb46SRobert Mustacchi
373*4d9fdb46SRobert Mustacchi output_length_in_bytes = 0;
374*4d9fdb46SRobert Mustacchi for (u=0; u<input_array_length; u++) {
375*4d9fdb46SRobert Mustacchi int unit_encoded_size;
376*4d9fdb46SRobert Mustacchi Dwarf_Signed unit = 0;
377*4d9fdb46SRobert Mustacchi
378*4d9fdb46SRobert Mustacchi unit = input_array[u];
379*4d9fdb46SRobert Mustacchi result = _dwarf_pro_encode_signed_leb128_nm(
380*4d9fdb46SRobert Mustacchi unit, &unit_encoded_size,
381*4d9fdb46SRobert Mustacchi encode_buffer,sizeof(encode_buffer));
382*4d9fdb46SRobert Mustacchi if (result != DW_DLV_OK) {
383*4d9fdb46SRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_LEB_IMPROPER);
384*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
385*4d9fdb46SRobert Mustacchi }
386*4d9fdb46SRobert Mustacchi output_length_in_bytes += unit_encoded_size;
387*4d9fdb46SRobert Mustacchi }
388*4d9fdb46SRobert Mustacchi output_block = (void *)
389*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, output_length_in_bytes);
390*4d9fdb46SRobert Mustacchi if (output_block == NULL) {
391*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
392*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
393*4d9fdb46SRobert Mustacchi }
394*4d9fdb46SRobert Mustacchi
395*4d9fdb46SRobert Mustacchi /* Then compress again and copy into new buffer */
396*4d9fdb46SRobert Mustacchi ptr = output_block;
397*4d9fdb46SRobert Mustacchi remain = output_length_in_bytes;
398*4d9fdb46SRobert Mustacchi for (u=0; u<input_array_length; u++) {
399*4d9fdb46SRobert Mustacchi int unit_encoded_size;
400*4d9fdb46SRobert Mustacchi Dwarf_Signed unit = 0;
401*4d9fdb46SRobert Mustacchi
402*4d9fdb46SRobert Mustacchi unit = input_array[u];
403*4d9fdb46SRobert Mustacchi result = _dwarf_pro_encode_signed_leb128_nm(unit,
404*4d9fdb46SRobert Mustacchi &unit_encoded_size,
405*4d9fdb46SRobert Mustacchi ptr, remain);
406*4d9fdb46SRobert Mustacchi if (result != DW_DLV_OK) {
407*4d9fdb46SRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_LEB_IMPROPER);
408*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
409*4d9fdb46SRobert Mustacchi }
410*4d9fdb46SRobert Mustacchi remain -= unit_encoded_size;
411*4d9fdb46SRobert Mustacchi ptr += unit_encoded_size;
412*4d9fdb46SRobert Mustacchi }
413*4d9fdb46SRobert Mustacchi
414*4d9fdb46SRobert Mustacchi *output_block_len = output_length_in_bytes;
415*4d9fdb46SRobert Mustacchi *output_block_returned = output_block;
416*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
417*4d9fdb46SRobert Mustacchi }
418*4d9fdb46SRobert Mustacchi /* Functions to compress and uncompress data from normal
419*4d9fdb46SRobert Mustacchi arrays of integral types into arrays of LEB128 numbers.
420*4d9fdb46SRobert Mustacchi Extend these functions as needed to handle wider input
421*4d9fdb46SRobert Mustacchi variety. Return values should be freed with _dwarf_p_dealloc
422*4d9fdb46SRobert Mustacchi after they aren't needed any more.
423*4d9fdb46SRobert Mustacchi
424*4d9fdb46SRobert Mustacchi It is not clear there is any use to this function
425*4d9fdb46SRobert Mustacchi as it was contributed by SUN but may not have ever
426*4d9fdb46SRobert Mustacchi been needed in any released SUN compiler. */
427*4d9fdb46SRobert Mustacchi
428*4d9fdb46SRobert Mustacchi /* return value points to an array of LEB numbers */
429bc1f688bSRobert Mustacchi
430bc1f688bSRobert Mustacchi void *
dwarf_compress_integer_block(Dwarf_P_Debug dbg,Dwarf_Bool unit_is_signed,Dwarf_Small unit_length_in_bits,void * input_block,Dwarf_Unsigned input_length_in_units,Dwarf_Unsigned * output_length_in_bytes_ptr,Dwarf_Error * error)431bc1f688bSRobert Mustacchi dwarf_compress_integer_block(
432bc1f688bSRobert Mustacchi Dwarf_P_Debug dbg,
433bc1f688bSRobert Mustacchi Dwarf_Bool unit_is_signed,
434bc1f688bSRobert Mustacchi Dwarf_Small unit_length_in_bits,
435bc1f688bSRobert Mustacchi void* input_block,
436bc1f688bSRobert Mustacchi Dwarf_Unsigned input_length_in_units,
437bc1f688bSRobert Mustacchi Dwarf_Unsigned* output_length_in_bytes_ptr,
438bc1f688bSRobert Mustacchi Dwarf_Error* error
439bc1f688bSRobert Mustacchi )
440bc1f688bSRobert Mustacchi {
441bc1f688bSRobert Mustacchi Dwarf_Unsigned output_length_in_bytes = 0;
442bc1f688bSRobert Mustacchi char * output_block = 0;
443bc1f688bSRobert Mustacchi char encode_buffer[ENCODE_SPACE_NEEDED];
444*4d9fdb46SRobert Mustacchi unsigned u = 0;
445bc1f688bSRobert Mustacchi char * ptr = 0;
446bc1f688bSRobert Mustacchi int remain = 0;
447bc1f688bSRobert Mustacchi int result = 0;
448*4d9fdb46SRobert Mustacchi char *inptr = 0;
449bc1f688bSRobert Mustacchi
450bc1f688bSRobert Mustacchi if (dbg == NULL) {
451bc1f688bSRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
452bc1f688bSRobert Mustacchi return((void *)DW_DLV_BADADDR);
453bc1f688bSRobert Mustacchi }
454bc1f688bSRobert Mustacchi
455bc1f688bSRobert Mustacchi if (unit_is_signed == false ||
456bc1f688bSRobert Mustacchi unit_length_in_bits != 32 ||
457bc1f688bSRobert Mustacchi input_block == NULL ||
458bc1f688bSRobert Mustacchi input_length_in_units == 0 ||
459bc1f688bSRobert Mustacchi output_length_in_bytes_ptr == NULL) {
460bc1f688bSRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_BADBITC);
461bc1f688bSRobert Mustacchi return ((void *) DW_DLV_BADADDR);
462bc1f688bSRobert Mustacchi }
463bc1f688bSRobert Mustacchi
464bc1f688bSRobert Mustacchi /* At this point we assume the format is: signed 32 bit */
465bc1f688bSRobert Mustacchi
466*4d9fdb46SRobert Mustacchi /* First compress everything to find the total size. */
467bc1f688bSRobert Mustacchi
468bc1f688bSRobert Mustacchi output_length_in_bytes = 0;
469*4d9fdb46SRobert Mustacchi inptr = input_block;
470*4d9fdb46SRobert Mustacchi for (u=0; u<input_length_in_units; u++) {
471bc1f688bSRobert Mustacchi int unit_encoded_size;
472*4d9fdb46SRobert Mustacchi Dwarf_Signed unit = 0;
473bc1f688bSRobert Mustacchi
474*4d9fdb46SRobert Mustacchi ASNAR(unit,inptr,DWARF_32BIT_SIZE);
475*4d9fdb46SRobert Mustacchi SIGN_EXTEND(unit,DWARF_32BIT_SIZE);
476*4d9fdb46SRobert Mustacchi result = _dwarf_pro_encode_signed_leb128_nm(
477*4d9fdb46SRobert Mustacchi unit, &unit_encoded_size,
478bc1f688bSRobert Mustacchi encode_buffer,sizeof(encode_buffer));
479bc1f688bSRobert Mustacchi if (result != DW_DLV_OK) {
480bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
481bc1f688bSRobert Mustacchi return((Dwarf_P_Attribute)DW_DLV_BADADDR);
482bc1f688bSRobert Mustacchi }
483bc1f688bSRobert Mustacchi output_length_in_bytes += unit_encoded_size;
484*4d9fdb46SRobert Mustacchi inptr += DWARF_32BIT_SIZE;
485bc1f688bSRobert Mustacchi }
486bc1f688bSRobert Mustacchi
487*4d9fdb46SRobert Mustacchi /* Then alloc */
488bc1f688bSRobert Mustacchi output_block = (void *)
489bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, output_length_in_bytes);
490bc1f688bSRobert Mustacchi if (output_block == NULL) {
491bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
492bc1f688bSRobert Mustacchi return((void*)DW_DLV_BADADDR);
493bc1f688bSRobert Mustacchi }
494bc1f688bSRobert Mustacchi
495*4d9fdb46SRobert Mustacchi /* Then compress again and copy into new buffer */
496bc1f688bSRobert Mustacchi ptr = output_block;
497*4d9fdb46SRobert Mustacchi inptr = input_block;
498bc1f688bSRobert Mustacchi remain = output_length_in_bytes;
499*4d9fdb46SRobert Mustacchi for (u=0; u<input_length_in_units; u++) {
500bc1f688bSRobert Mustacchi int unit_encoded_size;
501*4d9fdb46SRobert Mustacchi Dwarf_Signed unit = 0;
502bc1f688bSRobert Mustacchi
503*4d9fdb46SRobert Mustacchi ASNAR(unit,inptr,DWARF_32BIT_SIZE);
504*4d9fdb46SRobert Mustacchi SIGN_EXTEND(unit,DWARF_32BIT_SIZE);
505*4d9fdb46SRobert Mustacchi result = _dwarf_pro_encode_signed_leb128_nm(unit,
506*4d9fdb46SRobert Mustacchi &unit_encoded_size,
507bc1f688bSRobert Mustacchi ptr, remain);
508bc1f688bSRobert Mustacchi if (result != DW_DLV_OK) {
509bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
510bc1f688bSRobert Mustacchi return((Dwarf_P_Attribute)DW_DLV_BADADDR);
511bc1f688bSRobert Mustacchi }
512bc1f688bSRobert Mustacchi remain -= unit_encoded_size;
513bc1f688bSRobert Mustacchi ptr += unit_encoded_size;
514*4d9fdb46SRobert Mustacchi inptr += DWARF_32BIT_SIZE;
515bc1f688bSRobert Mustacchi }
516bc1f688bSRobert Mustacchi
517bc1f688bSRobert Mustacchi if (remain != 0) {
518bc1f688bSRobert Mustacchi _dwarf_p_dealloc(dbg, (unsigned char *)output_block);
519bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
520bc1f688bSRobert Mustacchi return((Dwarf_P_Attribute)DW_DLV_BADADDR);
521bc1f688bSRobert Mustacchi }
522bc1f688bSRobert Mustacchi
523bc1f688bSRobert Mustacchi *output_length_in_bytes_ptr = output_length_in_bytes;
524bc1f688bSRobert Mustacchi return (void*) output_block;
525bc1f688bSRobert Mustacchi }
526bc1f688bSRobert Mustacchi
527bc1f688bSRobert Mustacchi void
dwarf_dealloc_compressed_block(Dwarf_P_Debug dbg,void * space)528bc1f688bSRobert Mustacchi dwarf_dealloc_compressed_block(Dwarf_P_Debug dbg, void * space)
529bc1f688bSRobert Mustacchi {
530bc1f688bSRobert Mustacchi _dwarf_p_dealloc(dbg, space);
531bc1f688bSRobert Mustacchi }
532bc1f688bSRobert Mustacchi
533bc1f688bSRobert Mustacchi /* This is very similar to targ_address but results in a different FORM */
534bc1f688bSRobert Mustacchi /* dbg->de_ar_data_attribute_form is data4 or data8
535bc1f688bSRobert Mustacchi and dwarf4 changes the definition for such on DW_AT_high_pc.
536bc1f688bSRobert Mustacchi DWARF 3: the FORM here has no defined meaning for dwarf3.
537bc1f688bSRobert Mustacchi DWARF 4: the FORM here means that for DW_AT_high_pc the value
538bc1f688bSRobert Mustacchi is not a high address but is instead an offset
539bc1f688bSRobert Mustacchi from a (separate) DW_AT_low_pc.
540bc1f688bSRobert Mustacchi The intent for DWARF4 is that this is not a relocated
541bc1f688bSRobert Mustacchi address at all. Instead a simple offset.
542bc1f688bSRobert Mustacchi But this should NOT be called for a simple non-relocated offset.
543bc1f688bSRobert Mustacchi So do not call this with an attr of DW_AT_high_pc.
544bc1f688bSRobert Mustacchi Use dwarf_add_AT_unsigned_const() (for example) instead of
545*4d9fdb46SRobert Mustacchi dwarf_add_AT_dataref when the value is a simple offset . */
546*4d9fdb46SRobert Mustacchi
547*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_dataref_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)548*4d9fdb46SRobert Mustacchi dwarf_add_AT_dataref_a(
549*4d9fdb46SRobert Mustacchi Dwarf_P_Debug dbg,
550*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
551*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
552*4d9fdb46SRobert Mustacchi Dwarf_Unsigned pc_value,
553*4d9fdb46SRobert Mustacchi Dwarf_Unsigned sym_index,
554*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
555*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
556*4d9fdb46SRobert Mustacchi {
557*4d9fdb46SRobert Mustacchi int res = 0;
558*4d9fdb46SRobert Mustacchi
559*4d9fdb46SRobert Mustacchi /* TODO: Add checking here */
560*4d9fdb46SRobert Mustacchi res = local_add_AT_address_a(dbg, ownerdie, attr,
561*4d9fdb46SRobert Mustacchi dbg->de_ar_data_attribute_form,
562*4d9fdb46SRobert Mustacchi pc_value,
563*4d9fdb46SRobert Mustacchi sym_index,
564*4d9fdb46SRobert Mustacchi attr_out,
565*4d9fdb46SRobert Mustacchi error);
566*4d9fdb46SRobert Mustacchi return res;
567*4d9fdb46SRobert Mustacchi }
568*4d9fdb46SRobert Mustacchi
569*4d9fdb46SRobert Mustacchi
570bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_dataref(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_Error * error)571bc1f688bSRobert Mustacchi dwarf_add_AT_dataref(
572bc1f688bSRobert Mustacchi Dwarf_P_Debug dbg,
573bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
574bc1f688bSRobert Mustacchi Dwarf_Half attr,
575bc1f688bSRobert Mustacchi Dwarf_Unsigned pc_value,
576bc1f688bSRobert Mustacchi Dwarf_Unsigned sym_index,
577bc1f688bSRobert Mustacchi Dwarf_Error * error)
578bc1f688bSRobert Mustacchi {
579*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
580*4d9fdb46SRobert Mustacchi int res = 0;
581*4d9fdb46SRobert Mustacchi
582bc1f688bSRobert Mustacchi /* TODO: Add checking here */
583*4d9fdb46SRobert Mustacchi res = local_add_AT_address_a(dbg, ownerdie, attr,
584bc1f688bSRobert Mustacchi dbg->de_ar_data_attribute_form,
585bc1f688bSRobert Mustacchi pc_value,
586bc1f688bSRobert Mustacchi sym_index,
587*4d9fdb46SRobert Mustacchi &a,
588bc1f688bSRobert Mustacchi error);
589*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
590*4d9fdb46SRobert Mustacchi return((Dwarf_P_Attribute)DW_DLV_BADADDR);
591bc1f688bSRobert Mustacchi }
592*4d9fdb46SRobert Mustacchi return a;
593*4d9fdb46SRobert Mustacchi }
594bc1f688bSRobert Mustacchi
595bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_block(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Small * block_data,Dwarf_Unsigned block_size,Dwarf_Error * error)596bc1f688bSRobert Mustacchi dwarf_add_AT_block(
597bc1f688bSRobert Mustacchi Dwarf_P_Debug dbg,
598bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
599bc1f688bSRobert Mustacchi Dwarf_Half attr,
600bc1f688bSRobert Mustacchi Dwarf_Small *block_data,
601bc1f688bSRobert Mustacchi Dwarf_Unsigned block_size,
602*4d9fdb46SRobert Mustacchi Dwarf_Error *error)
603bc1f688bSRobert Mustacchi {
604*4d9fdb46SRobert Mustacchi int res = 0;
605*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
606*4d9fdb46SRobert Mustacchi
607*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_block_a(dbg,ownerdie,attr,
608*4d9fdb46SRobert Mustacchi block_data,block_size,&new_attr,error);
609*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
610*4d9fdb46SRobert Mustacchi return((Dwarf_P_Attribute)DW_DLV_BADADDR);
611*4d9fdb46SRobert Mustacchi }
612*4d9fdb46SRobert Mustacchi return new_attr;
613*4d9fdb46SRobert Mustacchi }
614*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_block_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Small * block_data,Dwarf_Unsigned block_size,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)615*4d9fdb46SRobert Mustacchi dwarf_add_AT_block_a(
616*4d9fdb46SRobert Mustacchi Dwarf_P_Debug dbg,
617*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
618*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
619*4d9fdb46SRobert Mustacchi Dwarf_Small *block_data,
620*4d9fdb46SRobert Mustacchi Dwarf_Unsigned block_size,
621*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute* attr_out,
622*4d9fdb46SRobert Mustacchi Dwarf_Error *error)
623*4d9fdb46SRobert Mustacchi {
624*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
625*4d9fdb46SRobert Mustacchi int result = 0;
626bc1f688bSRobert Mustacchi char encode_buffer[ENCODE_SPACE_NEEDED];
627*4d9fdb46SRobert Mustacchi int len_size = 0;
628*4d9fdb46SRobert Mustacchi char * attrdata = 0;
629bc1f688bSRobert Mustacchi
630bc1f688bSRobert Mustacchi if (dbg == NULL) {
631bc1f688bSRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
632*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
633bc1f688bSRobert Mustacchi }
634bc1f688bSRobert Mustacchi
635bc1f688bSRobert Mustacchi if (ownerdie == NULL) {
636bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
637*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
638bc1f688bSRobert Mustacchi }
639bc1f688bSRobert Mustacchi
640bc1f688bSRobert Mustacchi /* I don't mess with block1, block2, block4, not worth the effort */
641bc1f688bSRobert Mustacchi
642bc1f688bSRobert Mustacchi /* So, encode the length into LEB128 */
643bc1f688bSRobert Mustacchi result = _dwarf_pro_encode_leb128_nm(block_size, &len_size,
644bc1f688bSRobert Mustacchi encode_buffer,sizeof(encode_buffer));
645bc1f688bSRobert Mustacchi if (result != DW_DLV_OK) {
646bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
647*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
648bc1f688bSRobert Mustacchi }
649bc1f688bSRobert Mustacchi
650bc1f688bSRobert Mustacchi /* Allocate the new attribute */
651bc1f688bSRobert Mustacchi new_attr = (Dwarf_P_Attribute)
652bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
653bc1f688bSRobert Mustacchi if (new_attr == NULL) {
654bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
655*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
656bc1f688bSRobert Mustacchi }
657bc1f688bSRobert Mustacchi
658bc1f688bSRobert Mustacchi /* Fill in the attribute */
659bc1f688bSRobert Mustacchi new_attr->ar_attribute = attr;
660bc1f688bSRobert Mustacchi new_attr->ar_attribute_form = DW_FORM_block;
661bc1f688bSRobert Mustacchi new_attr->ar_nbytes = len_size + block_size;
662bc1f688bSRobert Mustacchi new_attr->ar_next = 0;
663bc1f688bSRobert Mustacchi
664bc1f688bSRobert Mustacchi new_attr->ar_data = attrdata = (char *)
665bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, len_size + block_size);
666bc1f688bSRobert Mustacchi if (new_attr->ar_data == NULL) {
667bc1f688bSRobert Mustacchi /* free the block we got earlier */
668bc1f688bSRobert Mustacchi _dwarf_p_dealloc(dbg, (unsigned char *) new_attr);
669bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
670*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
671bc1f688bSRobert Mustacchi }
672bc1f688bSRobert Mustacchi
673bc1f688bSRobert Mustacchi /* write length and data to attribute data buffer */
674bc1f688bSRobert Mustacchi memcpy(attrdata, encode_buffer, len_size);
675bc1f688bSRobert Mustacchi attrdata += len_size;
676bc1f688bSRobert Mustacchi memcpy(attrdata, block_data, block_size);
677bc1f688bSRobert Mustacchi
678bc1f688bSRobert Mustacchi /* add attribute to the die */
679bc1f688bSRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
680*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
681*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
682bc1f688bSRobert Mustacchi }
683bc1f688bSRobert Mustacchi
684bc1f688bSRobert Mustacchi
685bc1f688bSRobert Mustacchi /*
686bc1f688bSRobert Mustacchi This function adds attributes whose value
687bc1f688bSRobert Mustacchi is an unsigned constant. It determines the
688bc1f688bSRobert Mustacchi size of the value field from the value of
689bc1f688bSRobert Mustacchi the constant.
690bc1f688bSRobert Mustacchi */
691bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_unsigned_const(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned value,Dwarf_Error * error)692bc1f688bSRobert Mustacchi dwarf_add_AT_unsigned_const(Dwarf_P_Debug dbg,
693bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
694bc1f688bSRobert Mustacchi Dwarf_Half attr,
695bc1f688bSRobert Mustacchi Dwarf_Unsigned value, Dwarf_Error * error)
696bc1f688bSRobert Mustacchi {
697*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
698*4d9fdb46SRobert Mustacchi int res = 0;
699*4d9fdb46SRobert Mustacchi
700*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_unsigned_const_a(dbg,
701*4d9fdb46SRobert Mustacchi ownerdie,attr,value,
702*4d9fdb46SRobert Mustacchi &a,error);
703*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
704*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
705*4d9fdb46SRobert Mustacchi }
706*4d9fdb46SRobert Mustacchi return a;
707*4d9fdb46SRobert Mustacchi }
708*4d9fdb46SRobert Mustacchi
709*4d9fdb46SRobert Mustacchi
710*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_unsigned_const_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)711*4d9fdb46SRobert Mustacchi dwarf_add_AT_unsigned_const_a(Dwarf_P_Debug dbg,
712*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
713*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
714*4d9fdb46SRobert Mustacchi Dwarf_Unsigned value,
715*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
716*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
717*4d9fdb46SRobert Mustacchi {
718*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
719*4d9fdb46SRobert Mustacchi Dwarf_Half attr_form = 0;
720*4d9fdb46SRobert Mustacchi Dwarf_Small size = 0;
721bc1f688bSRobert Mustacchi
722bc1f688bSRobert Mustacchi if (dbg == NULL) {
723bc1f688bSRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
724*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
725bc1f688bSRobert Mustacchi }
726bc1f688bSRobert Mustacchi
727bc1f688bSRobert Mustacchi if (ownerdie == NULL) {
728bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
729*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
730bc1f688bSRobert Mustacchi }
731bc1f688bSRobert Mustacchi
732bc1f688bSRobert Mustacchi switch (attr) {
733bc1f688bSRobert Mustacchi case DW_AT_ordering:
734bc1f688bSRobert Mustacchi case DW_AT_byte_size:
735bc1f688bSRobert Mustacchi case DW_AT_bit_offset:
736bc1f688bSRobert Mustacchi case DW_AT_bit_size:
737bc1f688bSRobert Mustacchi case DW_AT_inline:
738bc1f688bSRobert Mustacchi case DW_AT_language:
739bc1f688bSRobert Mustacchi case DW_AT_visibility:
740bc1f688bSRobert Mustacchi case DW_AT_virtuality:
741bc1f688bSRobert Mustacchi case DW_AT_accessibility:
742bc1f688bSRobert Mustacchi case DW_AT_address_class:
743bc1f688bSRobert Mustacchi case DW_AT_calling_convention:
744bc1f688bSRobert Mustacchi case DW_AT_encoding:
745bc1f688bSRobert Mustacchi case DW_AT_identifier_case:
746bc1f688bSRobert Mustacchi case DW_AT_MIPS_loop_unroll_factor:
747bc1f688bSRobert Mustacchi case DW_AT_MIPS_software_pipeline_depth:
748bc1f688bSRobert Mustacchi break;
749bc1f688bSRobert Mustacchi
750bc1f688bSRobert Mustacchi case DW_AT_decl_column:
751bc1f688bSRobert Mustacchi case DW_AT_decl_file:
752bc1f688bSRobert Mustacchi case DW_AT_decl_line:
753bc1f688bSRobert Mustacchi case DW_AT_const_value:
754bc1f688bSRobert Mustacchi case DW_AT_start_scope:
755*4d9fdb46SRobert Mustacchi case DW_AT_stride_size: /* DW_AT_bit_stride is DWARF3 name */
756bc1f688bSRobert Mustacchi case DW_AT_count:
757*4d9fdb46SRobert Mustacchi case DW_AT_high_pc: /* DWARF5: allowing const udata high_pc */
758bc1f688bSRobert Mustacchi case DW_AT_associated:
759bc1f688bSRobert Mustacchi case DW_AT_allocated:
760bc1f688bSRobert Mustacchi case DW_AT_upper_bound:
761bc1f688bSRobert Mustacchi case DW_AT_lower_bound:
762bc1f688bSRobert Mustacchi case DW_AT_call_file:
763bc1f688bSRobert Mustacchi case DW_AT_call_line:
764*4d9fdb46SRobert Mustacchi case DW_AT_data_member_location:
765*4d9fdb46SRobert Mustacchi case DW_AT_trampoline:
766bc1f688bSRobert Mustacchi break;
767bc1f688bSRobert Mustacchi
768*4d9fdb46SRobert Mustacchi default:
769bc1f688bSRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
770bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
771*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
772bc1f688bSRobert Mustacchi }
773bc1f688bSRobert Mustacchi break;
774bc1f688bSRobert Mustacchi }
775bc1f688bSRobert Mustacchi
776*4d9fdb46SRobert Mustacchi /* Compute the number of bytes needed to hold constant. */
777bc1f688bSRobert Mustacchi if (value <= UCHAR_MAX) {
778bc1f688bSRobert Mustacchi attr_form = DW_FORM_data1;
779bc1f688bSRobert Mustacchi size = 1;
780bc1f688bSRobert Mustacchi } else if (value <= USHRT_MAX) {
781bc1f688bSRobert Mustacchi attr_form = DW_FORM_data2;
782bc1f688bSRobert Mustacchi size = 2;
783bc1f688bSRobert Mustacchi } else if (value <= UINT_MAX) {
784bc1f688bSRobert Mustacchi attr_form = DW_FORM_data4;
785bc1f688bSRobert Mustacchi size = 4;
786bc1f688bSRobert Mustacchi } else {
787bc1f688bSRobert Mustacchi attr_form = DW_FORM_data8;
788bc1f688bSRobert Mustacchi size = 8;
789bc1f688bSRobert Mustacchi }
790bc1f688bSRobert Mustacchi
791bc1f688bSRobert Mustacchi new_attr = (Dwarf_P_Attribute)
792bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
793bc1f688bSRobert Mustacchi if (new_attr == NULL) {
794bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
795*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
796bc1f688bSRobert Mustacchi }
797bc1f688bSRobert Mustacchi
798bc1f688bSRobert Mustacchi new_attr->ar_attribute = attr;
799bc1f688bSRobert Mustacchi new_attr->ar_attribute_form = attr_form;
800bc1f688bSRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE;
801bc1f688bSRobert Mustacchi new_attr->ar_reloc_len = 0; /* irrelevant: unused with R_MIPS_NONE */
802bc1f688bSRobert Mustacchi new_attr->ar_nbytes = size;
803bc1f688bSRobert Mustacchi new_attr->ar_next = 0;
804bc1f688bSRobert Mustacchi
805bc1f688bSRobert Mustacchi new_attr->ar_data = (char *)
806bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, size);
807bc1f688bSRobert Mustacchi if (new_attr->ar_data == NULL) {
808bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
809*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
810bc1f688bSRobert Mustacchi }
811bc1f688bSRobert Mustacchi WRITE_UNALIGNED(dbg, new_attr->ar_data,
812bc1f688bSRobert Mustacchi (const void *) &value, sizeof(value), size);
813bc1f688bSRobert Mustacchi
814bc1f688bSRobert Mustacchi /* add attribute to the die */
815bc1f688bSRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
816*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
817*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
818bc1f688bSRobert Mustacchi }
819bc1f688bSRobert Mustacchi
820bc1f688bSRobert Mustacchi
821*4d9fdb46SRobert Mustacchi /* This function adds attributes whose value
822bc1f688bSRobert Mustacchi is an signed constant. It determines the
823bc1f688bSRobert Mustacchi size of the value field from the value of
824*4d9fdb46SRobert Mustacchi the constant. */
825bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_signed_const(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Signed value,Dwarf_Error * error)826bc1f688bSRobert Mustacchi dwarf_add_AT_signed_const(Dwarf_P_Debug dbg,
827bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
828bc1f688bSRobert Mustacchi Dwarf_Half attr,
829*4d9fdb46SRobert Mustacchi Dwarf_Signed value,
830*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
831bc1f688bSRobert Mustacchi {
832*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
833*4d9fdb46SRobert Mustacchi int res = 0;
834*4d9fdb46SRobert Mustacchi
835*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_signed_const_a(dbg,
836*4d9fdb46SRobert Mustacchi ownerdie,attr,value,&a,error);
837*4d9fdb46SRobert Mustacchi if(res != DW_DLV_OK) {
838*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
839*4d9fdb46SRobert Mustacchi }
840*4d9fdb46SRobert Mustacchi return a;
841*4d9fdb46SRobert Mustacchi }
842*4d9fdb46SRobert Mustacchi
843*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_signed_const_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Signed value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)844*4d9fdb46SRobert Mustacchi dwarf_add_AT_signed_const_a(Dwarf_P_Debug dbg,
845*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
846*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
847*4d9fdb46SRobert Mustacchi Dwarf_Signed value,
848*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
849*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
850*4d9fdb46SRobert Mustacchi {
851*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
852*4d9fdb46SRobert Mustacchi Dwarf_Half attr_form = 0;
853*4d9fdb46SRobert Mustacchi Dwarf_Small size = 0;
854bc1f688bSRobert Mustacchi
855bc1f688bSRobert Mustacchi if (dbg == NULL) {
856bc1f688bSRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
857*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
858bc1f688bSRobert Mustacchi }
859bc1f688bSRobert Mustacchi
860bc1f688bSRobert Mustacchi if (ownerdie == NULL) {
861bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
862*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
863bc1f688bSRobert Mustacchi }
864bc1f688bSRobert Mustacchi
865bc1f688bSRobert Mustacchi switch (attr) {
866bc1f688bSRobert Mustacchi case DW_AT_lower_bound:
867bc1f688bSRobert Mustacchi case DW_AT_upper_bound:
868bc1f688bSRobert Mustacchi case DW_AT_const_value:
869bc1f688bSRobert Mustacchi case DW_AT_bit_offset:
870bc1f688bSRobert Mustacchi case DW_AT_bit_size:
871bc1f688bSRobert Mustacchi case DW_AT_byte_size:
872bc1f688bSRobert Mustacchi case DW_AT_count:
873bc1f688bSRobert Mustacchi case DW_AT_byte_stride:
874bc1f688bSRobert Mustacchi case DW_AT_bit_stride:
875bc1f688bSRobert Mustacchi case DW_AT_allocated:
876bc1f688bSRobert Mustacchi case DW_AT_associated:
877bc1f688bSRobert Mustacchi break;
878bc1f688bSRobert Mustacchi
879*4d9fdb46SRobert Mustacchi default:
880bc1f688bSRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
881bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
882*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
883bc1f688bSRobert Mustacchi }
884bc1f688bSRobert Mustacchi break;
885bc1f688bSRobert Mustacchi }
886bc1f688bSRobert Mustacchi
887*4d9fdb46SRobert Mustacchi /* Compute the number of bytes needed to hold constant. */
888bc1f688bSRobert Mustacchi if (value >= SCHAR_MIN && value <= SCHAR_MAX) {
889bc1f688bSRobert Mustacchi attr_form = DW_FORM_data1;
890bc1f688bSRobert Mustacchi size = 1;
891bc1f688bSRobert Mustacchi } else if (value >= SHRT_MIN && value <= SHRT_MAX) {
892bc1f688bSRobert Mustacchi attr_form = DW_FORM_data2;
893bc1f688bSRobert Mustacchi size = 2;
894bc1f688bSRobert Mustacchi } else if (value >= INT_MIN && value <= INT_MAX) {
895bc1f688bSRobert Mustacchi attr_form = DW_FORM_data4;
896bc1f688bSRobert Mustacchi size = 4;
897bc1f688bSRobert Mustacchi } else {
898bc1f688bSRobert Mustacchi attr_form = DW_FORM_data8;
899bc1f688bSRobert Mustacchi size = 8;
900bc1f688bSRobert Mustacchi }
901bc1f688bSRobert Mustacchi
902bc1f688bSRobert Mustacchi new_attr = (Dwarf_P_Attribute)
903bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
904bc1f688bSRobert Mustacchi if (new_attr == NULL) {
905bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
906*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
907bc1f688bSRobert Mustacchi }
908bc1f688bSRobert Mustacchi
909bc1f688bSRobert Mustacchi new_attr->ar_attribute = attr;
910bc1f688bSRobert Mustacchi new_attr->ar_attribute_form = attr_form;
911bc1f688bSRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE;
912bc1f688bSRobert Mustacchi new_attr->ar_reloc_len = 0; /* irrelevant: unused with R_MIPS_NONE */
913bc1f688bSRobert Mustacchi new_attr->ar_nbytes = size;
914bc1f688bSRobert Mustacchi new_attr->ar_next = 0;
915bc1f688bSRobert Mustacchi
916bc1f688bSRobert Mustacchi new_attr->ar_data = (char *)
917bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, size);
918bc1f688bSRobert Mustacchi if (new_attr->ar_data == NULL) {
919bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
920*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
921bc1f688bSRobert Mustacchi }
922bc1f688bSRobert Mustacchi WRITE_UNALIGNED(dbg, new_attr->ar_data,
923bc1f688bSRobert Mustacchi (const void *) &value, sizeof(value), size);
924bc1f688bSRobert Mustacchi
925bc1f688bSRobert Mustacchi /* add attribute to the die */
926bc1f688bSRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
927*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
928*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
929bc1f688bSRobert Mustacchi }
930bc1f688bSRobert Mustacchi
931bc1f688bSRobert Mustacchi
932*4d9fdb46SRobert Mustacchi /* This function adds attributes whose value
933*4d9fdb46SRobert Mustacchi is a location expression. */
934bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_location_expr(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_P_Expr loc_expr,Dwarf_Error * error)935bc1f688bSRobert Mustacchi dwarf_add_AT_location_expr(Dwarf_P_Debug dbg,
936bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
937bc1f688bSRobert Mustacchi Dwarf_Half attr,
938bc1f688bSRobert Mustacchi Dwarf_P_Expr loc_expr, Dwarf_Error * error)
939bc1f688bSRobert Mustacchi {
940*4d9fdb46SRobert Mustacchi int res = 0;
941*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
942*4d9fdb46SRobert Mustacchi
943*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_location_expr_a(dbg,ownerdie,attr,
944*4d9fdb46SRobert Mustacchi loc_expr,&a,error);
945*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
946*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
947*4d9fdb46SRobert Mustacchi }
948*4d9fdb46SRobert Mustacchi return a;
949*4d9fdb46SRobert Mustacchi }
950*4d9fdb46SRobert Mustacchi
951*4d9fdb46SRobert Mustacchi /* Preferred interface as of December 2018 */
952*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_location_expr_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_P_Expr loc_expr,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)953*4d9fdb46SRobert Mustacchi dwarf_add_AT_location_expr_a(Dwarf_P_Debug dbg,
954*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
955*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
956*4d9fdb46SRobert Mustacchi Dwarf_P_Expr loc_expr,
957*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
958*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
959*4d9fdb46SRobert Mustacchi {
960bc1f688bSRobert Mustacchi char encode_buffer[ENCODE_SPACE_NEEDED];
961*4d9fdb46SRobert Mustacchi int res = 0;
962*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
963*4d9fdb46SRobert Mustacchi Dwarf_Half attr_form = 0;
964bc1f688bSRobert Mustacchi char *len_str = 0;
965*4d9fdb46SRobert Mustacchi int len_size = 0;
966*4d9fdb46SRobert Mustacchi Dwarf_Unsigned block_size = 0;
967*4d9fdb46SRobert Mustacchi char *block_dest_ptr = 0;
968bc1f688bSRobert Mustacchi int do_len_as_int = 0;
969bc1f688bSRobert Mustacchi
970bc1f688bSRobert Mustacchi if (dbg == NULL) {
971bc1f688bSRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
972*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
973bc1f688bSRobert Mustacchi }
974bc1f688bSRobert Mustacchi
975bc1f688bSRobert Mustacchi if (ownerdie == NULL) {
976bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
977*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
978bc1f688bSRobert Mustacchi }
979bc1f688bSRobert Mustacchi
980bc1f688bSRobert Mustacchi if (loc_expr == NULL) {
981bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_EXPR_NULL);
982*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
983bc1f688bSRobert Mustacchi }
984bc1f688bSRobert Mustacchi
985bc1f688bSRobert Mustacchi if (loc_expr->ex_dbg != dbg) {
986bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_LOC_EXPR_BAD);
987*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
988bc1f688bSRobert Mustacchi }
989bc1f688bSRobert Mustacchi block_size = loc_expr->ex_next_byte_offset;
990bc1f688bSRobert Mustacchi
991bc1f688bSRobert Mustacchi switch (attr) {
992bc1f688bSRobert Mustacchi case DW_AT_location:
993bc1f688bSRobert Mustacchi case DW_AT_string_length:
994bc1f688bSRobert Mustacchi case DW_AT_const_value:
995bc1f688bSRobert Mustacchi case DW_AT_use_location:
996bc1f688bSRobert Mustacchi case DW_AT_return_addr:
997bc1f688bSRobert Mustacchi case DW_AT_data_member_location:
998bc1f688bSRobert Mustacchi case DW_AT_frame_base:
999bc1f688bSRobert Mustacchi case DW_AT_static_link:
1000bc1f688bSRobert Mustacchi case DW_AT_vtable_elem_location:
1001bc1f688bSRobert Mustacchi case DW_AT_lower_bound:
1002bc1f688bSRobert Mustacchi case DW_AT_upper_bound:
1003bc1f688bSRobert Mustacchi case DW_AT_count:
1004bc1f688bSRobert Mustacchi case DW_AT_associated:
1005bc1f688bSRobert Mustacchi case DW_AT_allocated:
1006bc1f688bSRobert Mustacchi case DW_AT_data_location:
1007bc1f688bSRobert Mustacchi case DW_AT_byte_stride:
1008bc1f688bSRobert Mustacchi case DW_AT_bit_stride:
1009bc1f688bSRobert Mustacchi case DW_AT_byte_size:
1010bc1f688bSRobert Mustacchi case DW_AT_bit_size:
1011bc1f688bSRobert Mustacchi break;
1012bc1f688bSRobert Mustacchi
1013bc1f688bSRobert Mustacchi default:
1014bc1f688bSRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
1015bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
1016*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1017bc1f688bSRobert Mustacchi }
1018bc1f688bSRobert Mustacchi break;
1019bc1f688bSRobert Mustacchi }
1020bc1f688bSRobert Mustacchi
1021*4d9fdb46SRobert Mustacchi /* Compute the number of bytes needed to hold constant.
1022*4d9fdb46SRobert Mustacchi This is a bit fake in that the size will never
1023*4d9fdb46SRobert Mustacchi be particularly large and always < UINT_MAX. */
1024bc1f688bSRobert Mustacchi if (block_size <= UCHAR_MAX) {
1025bc1f688bSRobert Mustacchi attr_form = DW_FORM_block1;
1026bc1f688bSRobert Mustacchi len_size = 1;
1027bc1f688bSRobert Mustacchi do_len_as_int = 1;
1028bc1f688bSRobert Mustacchi } else if (block_size <= USHRT_MAX) {
1029bc1f688bSRobert Mustacchi attr_form = DW_FORM_block2;
1030bc1f688bSRobert Mustacchi len_size = 2;
1031bc1f688bSRobert Mustacchi do_len_as_int = 1;
1032bc1f688bSRobert Mustacchi } else if (block_size <= UINT_MAX) {
1033bc1f688bSRobert Mustacchi attr_form = DW_FORM_block4;
1034bc1f688bSRobert Mustacchi len_size = 4;
1035bc1f688bSRobert Mustacchi do_len_as_int = 1;
1036bc1f688bSRobert Mustacchi } else {
1037bc1f688bSRobert Mustacchi attr_form = DW_FORM_block;
1038bc1f688bSRobert Mustacchi res = _dwarf_pro_encode_leb128_nm(block_size, &len_size,
1039bc1f688bSRobert Mustacchi encode_buffer,
1040bc1f688bSRobert Mustacchi sizeof(encode_buffer));
1041bc1f688bSRobert Mustacchi if (res != DW_DLV_OK) {
1042bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1043*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1044bc1f688bSRobert Mustacchi }
1045bc1f688bSRobert Mustacchi len_str = (char *) encode_buffer;
1046bc1f688bSRobert Mustacchi }
1047bc1f688bSRobert Mustacchi
1048bc1f688bSRobert Mustacchi new_attr = (Dwarf_P_Attribute)
1049bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1050bc1f688bSRobert Mustacchi if (new_attr == NULL) {
1051bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1052*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1053bc1f688bSRobert Mustacchi }
1054bc1f688bSRobert Mustacchi
1055bc1f688bSRobert Mustacchi new_attr->ar_attribute = attr;
1056bc1f688bSRobert Mustacchi new_attr->ar_attribute_form = attr_form;
1057bc1f688bSRobert Mustacchi new_attr->ar_reloc_len = dbg->de_pointer_size;
1058bc1f688bSRobert Mustacchi if (loc_expr->ex_reloc_sym_index != NO_ELF_SYM_INDEX) {
1059bc1f688bSRobert Mustacchi new_attr->ar_rel_type = dbg->de_ptr_reloc;
1060bc1f688bSRobert Mustacchi } else {
1061bc1f688bSRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE;
1062bc1f688bSRobert Mustacchi }
1063bc1f688bSRobert Mustacchi new_attr->ar_rel_symidx = loc_expr->ex_reloc_sym_index;
1064bc1f688bSRobert Mustacchi new_attr->ar_rel_offset =
1065*4d9fdb46SRobert Mustacchi loc_expr->ex_reloc_offset + len_size;
1066bc1f688bSRobert Mustacchi
1067bc1f688bSRobert Mustacchi new_attr->ar_nbytes = block_size + len_size;
1068bc1f688bSRobert Mustacchi
1069bc1f688bSRobert Mustacchi new_attr->ar_next = 0;
1070bc1f688bSRobert Mustacchi new_attr->ar_data = block_dest_ptr =
1071bc1f688bSRobert Mustacchi (char *) _dwarf_p_get_alloc(dbg, block_size + len_size);
1072bc1f688bSRobert Mustacchi if (new_attr->ar_data == NULL) {
1073bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1074*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1075bc1f688bSRobert Mustacchi }
1076bc1f688bSRobert Mustacchi
1077bc1f688bSRobert Mustacchi if (do_len_as_int) {
1078bc1f688bSRobert Mustacchi WRITE_UNALIGNED(dbg, block_dest_ptr, (const void *) &block_size,
1079bc1f688bSRobert Mustacchi sizeof(block_size), len_size);
1080bc1f688bSRobert Mustacchi } else {
1081bc1f688bSRobert Mustacchi /* Is uleb number form, DW_FORM_block. See above. */
1082bc1f688bSRobert Mustacchi memcpy(block_dest_ptr, len_str, len_size);
1083bc1f688bSRobert Mustacchi }
1084bc1f688bSRobert Mustacchi block_dest_ptr += len_size;
1085*4d9fdb46SRobert Mustacchi if (block_size > sizeof(loc_expr->ex_byte_stream)) {
1086*4d9fdb46SRobert Mustacchi /* ex_byte_stream has a fixed max value. */
1087*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_EXPR_LENGTH_BAD);
1088*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1089*4d9fdb46SRobert Mustacchi }
1090bc1f688bSRobert Mustacchi memcpy(block_dest_ptr, &(loc_expr->ex_byte_stream[0]), block_size);
1091bc1f688bSRobert Mustacchi
1092bc1f688bSRobert Mustacchi /* add attribute to the die */
1093bc1f688bSRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1094*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1095*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1096bc1f688bSRobert Mustacchi }
1097bc1f688bSRobert Mustacchi
1098bc1f688bSRobert Mustacchi
1099*4d9fdb46SRobert Mustacchi /* This function adds attributes of reference class.
1100bc1f688bSRobert Mustacchi The references here are local CU references,
1101bc1f688bSRobert Mustacchi not DW_FORM_ref_addr.
1102bc1f688bSRobert Mustacchi The offset field is 4 bytes for 32-bit objects,
1103bc1f688bSRobert Mustacchi and 8-bytes for 64-bit objects. Otherdie is the
1104bc1f688bSRobert Mustacchi that is referenced by ownerdie.
1105bc1f688bSRobert Mustacchi
1106bc1f688bSRobert Mustacchi For reference attributes, the ar_data and ar_nbytes
1107bc1f688bSRobert Mustacchi are not needed. Instead, the ar_ref_die points to
1108bc1f688bSRobert Mustacchi the other die, and its di_offset value is used as
1109*4d9fdb46SRobert Mustacchi the reference value. */
1110*4d9fdb46SRobert Mustacchi
1111*4d9fdb46SRobert Mustacchi static int
_dwarf_add_AT_reference_internal_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_P_Die otherdie,int check_otherdie,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1112*4d9fdb46SRobert Mustacchi _dwarf_add_AT_reference_internal_a(Dwarf_P_Debug dbg,
1113*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
1114*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
1115*4d9fdb46SRobert Mustacchi Dwarf_P_Die otherdie,
1116*4d9fdb46SRobert Mustacchi int check_otherdie,
1117*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
1118*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1119*4d9fdb46SRobert Mustacchi {
1120*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
1121*4d9fdb46SRobert Mustacchi
1122*4d9fdb46SRobert Mustacchi if (dbg == NULL) {
1123*4d9fdb46SRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
1124*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1125*4d9fdb46SRobert Mustacchi }
1126*4d9fdb46SRobert Mustacchi
1127*4d9fdb46SRobert Mustacchi if (ownerdie == NULL) {
1128*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1129*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1130*4d9fdb46SRobert Mustacchi }
1131*4d9fdb46SRobert Mustacchi
1132*4d9fdb46SRobert Mustacchi if (check_otherdie && (otherdie == NULL)) {
1133*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1134*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1135*4d9fdb46SRobert Mustacchi }
1136*4d9fdb46SRobert Mustacchi
1137*4d9fdb46SRobert Mustacchi switch (attr) {
1138*4d9fdb46SRobert Mustacchi case DW_AT_count:
1139*4d9fdb46SRobert Mustacchi case DW_AT_sibling:
1140*4d9fdb46SRobert Mustacchi case DW_AT_byte_size:
1141*4d9fdb46SRobert Mustacchi case DW_AT_bit_offset:
1142*4d9fdb46SRobert Mustacchi case DW_AT_bit_size:
1143*4d9fdb46SRobert Mustacchi case DW_AT_discr:
1144*4d9fdb46SRobert Mustacchi case DW_AT_import:
1145*4d9fdb46SRobert Mustacchi case DW_AT_common_reference:
1146*4d9fdb46SRobert Mustacchi case DW_AT_containing_type:
1147*4d9fdb46SRobert Mustacchi case DW_AT_default_value:
1148*4d9fdb46SRobert Mustacchi case DW_AT_lower_bound:
1149*4d9fdb46SRobert Mustacchi case DW_AT_bit_stride: /* Early name is DW_AT_stride_size */
1150*4d9fdb46SRobert Mustacchi case DW_AT_upper_bound:
1151*4d9fdb46SRobert Mustacchi case DW_AT_abstract_origin:
1152*4d9fdb46SRobert Mustacchi case DW_AT_base_types:
1153*4d9fdb46SRobert Mustacchi case DW_AT_friend:
1154*4d9fdb46SRobert Mustacchi case DW_AT_namelist_item:
1155*4d9fdb46SRobert Mustacchi case DW_AT_priority:
1156*4d9fdb46SRobert Mustacchi case DW_AT_specification:
1157*4d9fdb46SRobert Mustacchi case DW_AT_type:
1158*4d9fdb46SRobert Mustacchi case DW_AT_allocated:
1159*4d9fdb46SRobert Mustacchi case DW_AT_associated:
1160*4d9fdb46SRobert Mustacchi case DW_AT_byte_stride:
1161*4d9fdb46SRobert Mustacchi case DW_AT_extension:
1162*4d9fdb46SRobert Mustacchi case DW_AT_trampoline:
1163*4d9fdb46SRobert Mustacchi case DW_AT_small:
1164*4d9fdb46SRobert Mustacchi case DW_AT_object_pointer:
1165*4d9fdb46SRobert Mustacchi case DW_AT_signature:
1166*4d9fdb46SRobert Mustacchi break;
1167*4d9fdb46SRobert Mustacchi
1168*4d9fdb46SRobert Mustacchi default:
1169*4d9fdb46SRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
1170*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
1171*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1172*4d9fdb46SRobert Mustacchi }
1173*4d9fdb46SRobert Mustacchi break;
1174*4d9fdb46SRobert Mustacchi }
1175*4d9fdb46SRobert Mustacchi
1176*4d9fdb46SRobert Mustacchi new_attr = (Dwarf_P_Attribute)
1177*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1178*4d9fdb46SRobert Mustacchi if (new_attr == NULL) {
1179*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1180*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1181*4d9fdb46SRobert Mustacchi }
1182*4d9fdb46SRobert Mustacchi
1183*4d9fdb46SRobert Mustacchi new_attr->ar_attribute = attr;
1184*4d9fdb46SRobert Mustacchi new_attr->ar_attribute_form = dbg->de_ar_ref_attr_form;
1185*4d9fdb46SRobert Mustacchi new_attr->ar_nbytes = dbg->de_dwarf_offset_size;
1186*4d9fdb46SRobert Mustacchi new_attr->ar_reloc_len = dbg->de_dwarf_offset_size;
1187*4d9fdb46SRobert Mustacchi new_attr->ar_ref_die = otherdie;
1188*4d9fdb46SRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE;
1189*4d9fdb46SRobert Mustacchi new_attr->ar_next = 0;
1190*4d9fdb46SRobert Mustacchi
1191*4d9fdb46SRobert Mustacchi /* Add attribute to the die */
1192*4d9fdb46SRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1193*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1194*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1195*4d9fdb46SRobert Mustacchi }
1196*4d9fdb46SRobert Mustacchi
1197*4d9fdb46SRobert Mustacchi /* Allowing the target die to be identified later.
1198bc1f688bSRobert Mustacchi */
1199*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_reference_c(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_P_Die otherdie,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1200*4d9fdb46SRobert Mustacchi dwarf_add_AT_reference_c(Dwarf_P_Debug dbg,
1201*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
1202*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
1203*4d9fdb46SRobert Mustacchi Dwarf_P_Die otherdie,
1204*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
1205*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1206*4d9fdb46SRobert Mustacchi {
1207*4d9fdb46SRobert Mustacchi int res = 0;
1208*4d9fdb46SRobert Mustacchi
1209*4d9fdb46SRobert Mustacchi res = _dwarf_add_AT_reference_internal_a(dbg,
1210*4d9fdb46SRobert Mustacchi ownerdie,
1211*4d9fdb46SRobert Mustacchi attr,
1212*4d9fdb46SRobert Mustacchi otherdie,
1213*4d9fdb46SRobert Mustacchi /* check otherdie */ 0,
1214*4d9fdb46SRobert Mustacchi attr_out,
1215*4d9fdb46SRobert Mustacchi error);
1216*4d9fdb46SRobert Mustacchi return res;
1217*4d9fdb46SRobert Mustacchi }
1218*4d9fdb46SRobert Mustacchi
1219*4d9fdb46SRobert Mustacchi
1220*4d9fdb46SRobert Mustacchi
1221bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_reference(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_P_Die otherdie,Dwarf_Error * error)1222bc1f688bSRobert Mustacchi dwarf_add_AT_reference(Dwarf_P_Debug dbg,
1223bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
1224bc1f688bSRobert Mustacchi Dwarf_Half attr,
1225bc1f688bSRobert Mustacchi Dwarf_P_Die otherdie, Dwarf_Error * error)
1226bc1f688bSRobert Mustacchi {
1227*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1228*4d9fdb46SRobert Mustacchi int res = 0;
1229bc1f688bSRobert Mustacchi
1230*4d9fdb46SRobert Mustacchi res = _dwarf_add_AT_reference_internal_a(dbg,
1231*4d9fdb46SRobert Mustacchi ownerdie,
1232*4d9fdb46SRobert Mustacchi attr,
1233*4d9fdb46SRobert Mustacchi otherdie,
1234*4d9fdb46SRobert Mustacchi /* check otherdie */ 1,
1235*4d9fdb46SRobert Mustacchi &a,
1236*4d9fdb46SRobert Mustacchi error);
1237*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1238*4d9fdb46SRobert Mustacchi return (Dwarf_P_Attribute)DW_DLV_BADADDR;
1239*4d9fdb46SRobert Mustacchi }
1240*4d9fdb46SRobert Mustacchi return a;
1241*4d9fdb46SRobert Mustacchi }
1242*4d9fdb46SRobert Mustacchi
1243*4d9fdb46SRobert Mustacchi /* Allowing the target die to be identified later.
1244*4d9fdb46SRobert Mustacchi */
1245*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_reference_b(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_P_Die otherdie,Dwarf_Error * error)1246*4d9fdb46SRobert Mustacchi dwarf_add_AT_reference_b(Dwarf_P_Debug dbg,
1247*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
1248*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
1249*4d9fdb46SRobert Mustacchi Dwarf_P_Die otherdie,
1250*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1251*4d9fdb46SRobert Mustacchi {
1252*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1253*4d9fdb46SRobert Mustacchi int res = 0;
1254*4d9fdb46SRobert Mustacchi
1255*4d9fdb46SRobert Mustacchi res = _dwarf_add_AT_reference_internal_a(dbg,
1256*4d9fdb46SRobert Mustacchi ownerdie,
1257*4d9fdb46SRobert Mustacchi attr,
1258*4d9fdb46SRobert Mustacchi otherdie,
1259*4d9fdb46SRobert Mustacchi /* check otherdie */ 0,
1260*4d9fdb46SRobert Mustacchi &a,
1261*4d9fdb46SRobert Mustacchi error);
1262*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1263*4d9fdb46SRobert Mustacchi return (Dwarf_P_Attribute)DW_DLV_BADADDR;
1264*4d9fdb46SRobert Mustacchi }
1265*4d9fdb46SRobert Mustacchi return a;
1266*4d9fdb46SRobert Mustacchi }
1267*4d9fdb46SRobert Mustacchi
1268*4d9fdb46SRobert Mustacchi
1269*4d9fdb46SRobert Mustacchi
1270*4d9fdb46SRobert Mustacchi
1271*4d9fdb46SRobert Mustacchi int
dwarf_fixup_AT_reference_die(Dwarf_P_Debug dbg,Dwarf_Half attrnum,Dwarf_P_Die sourcedie,Dwarf_P_Die targetdie,Dwarf_Error * error)1272*4d9fdb46SRobert Mustacchi dwarf_fixup_AT_reference_die(Dwarf_P_Debug dbg,
1273*4d9fdb46SRobert Mustacchi Dwarf_Half attrnum,
1274*4d9fdb46SRobert Mustacchi Dwarf_P_Die sourcedie,
1275*4d9fdb46SRobert Mustacchi Dwarf_P_Die targetdie,
1276*4d9fdb46SRobert Mustacchi Dwarf_Error *error)
1277*4d9fdb46SRobert Mustacchi {
1278*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1279*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute cur = 0;
1280bc1f688bSRobert Mustacchi if (dbg == NULL) {
1281bc1f688bSRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
1282*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1283bc1f688bSRobert Mustacchi }
1284*4d9fdb46SRobert Mustacchi for(cur = sourcedie->di_attrs; cur; cur = cur->ar_next) {
1285*4d9fdb46SRobert Mustacchi if (attrnum == cur->ar_attribute) {
1286*4d9fdb46SRobert Mustacchi a = cur;
1287bc1f688bSRobert Mustacchi break;
1288bc1f688bSRobert Mustacchi }
1289bc1f688bSRobert Mustacchi }
1290*4d9fdb46SRobert Mustacchi if(!a) {
1291*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_AT_FIXUP_NULL);
1292*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1293*4d9fdb46SRobert Mustacchi }
1294*4d9fdb46SRobert Mustacchi if(a->ar_ref_die) {
1295*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_AT_FIXUP_DUP);
1296*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1297*4d9fdb46SRobert Mustacchi }
1298*4d9fdb46SRobert Mustacchi a->ar_ref_die = targetdie;
1299*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1300bc1f688bSRobert Mustacchi }
1301bc1f688bSRobert Mustacchi
1302bc1f688bSRobert Mustacchi
1303*4d9fdb46SRobert Mustacchi /* This function adds attributes of the flag class. */
1304bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_flag(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Small flag,Dwarf_Error * error)1305bc1f688bSRobert Mustacchi dwarf_add_AT_flag(Dwarf_P_Debug dbg,
1306bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
1307bc1f688bSRobert Mustacchi Dwarf_Half attr,
1308*4d9fdb46SRobert Mustacchi Dwarf_Small flag,
1309*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1310bc1f688bSRobert Mustacchi {
1311*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1312*4d9fdb46SRobert Mustacchi int res = 0;
1313*4d9fdb46SRobert Mustacchi
1314*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_flag_a(dbg,ownerdie,attr,flag,
1315*4d9fdb46SRobert Mustacchi &a,error);
1316*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1317*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
1318*4d9fdb46SRobert Mustacchi }
1319*4d9fdb46SRobert Mustacchi return a;
1320*4d9fdb46SRobert Mustacchi }
1321*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_flag_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Small flag,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1322*4d9fdb46SRobert Mustacchi dwarf_add_AT_flag_a(Dwarf_P_Debug dbg,
1323*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
1324*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
1325*4d9fdb46SRobert Mustacchi Dwarf_Small flag,
1326*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute * attr_out,
1327*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1328*4d9fdb46SRobert Mustacchi {
1329*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
1330bc1f688bSRobert Mustacchi
1331bc1f688bSRobert Mustacchi if (dbg == NULL) {
1332bc1f688bSRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
1333*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1334bc1f688bSRobert Mustacchi }
1335bc1f688bSRobert Mustacchi if (ownerdie == NULL) {
1336bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1337*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1338bc1f688bSRobert Mustacchi }
1339bc1f688bSRobert Mustacchi
1340bc1f688bSRobert Mustacchi new_attr = (Dwarf_P_Attribute)
1341bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1342bc1f688bSRobert Mustacchi if (new_attr == NULL) {
1343bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1344*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1345bc1f688bSRobert Mustacchi }
1346bc1f688bSRobert Mustacchi
1347bc1f688bSRobert Mustacchi new_attr->ar_attribute = attr;
1348bc1f688bSRobert Mustacchi new_attr->ar_attribute_form = DW_FORM_flag;
1349bc1f688bSRobert Mustacchi new_attr->ar_nbytes = 1;
1350bc1f688bSRobert Mustacchi new_attr->ar_reloc_len = 0; /* not used */
1351bc1f688bSRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE;
1352bc1f688bSRobert Mustacchi new_attr->ar_next = 0;
1353bc1f688bSRobert Mustacchi
1354bc1f688bSRobert Mustacchi new_attr->ar_data = (char *)
1355bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, 1);
1356bc1f688bSRobert Mustacchi if (new_attr->ar_data == NULL) {
1357bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1358*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1359bc1f688bSRobert Mustacchi }
1360bc1f688bSRobert Mustacchi memcpy(new_attr->ar_data, &flag, 1);
1361bc1f688bSRobert Mustacchi
1362*4d9fdb46SRobert Mustacchi /* Add attribute to the die */
1363bc1f688bSRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1364*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1365*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1366bc1f688bSRobert Mustacchi }
1367bc1f688bSRobert Mustacchi
1368bc1f688bSRobert Mustacchi
1369*4d9fdb46SRobert Mustacchi /* This function adds values of attributes
1370*4d9fdb46SRobert Mustacchi belonging to the string class. */
1371bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_string(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,char * string,Dwarf_Error * error)1372bc1f688bSRobert Mustacchi dwarf_add_AT_string(Dwarf_P_Debug dbg,
1373bc1f688bSRobert Mustacchi Dwarf_P_Die ownerdie,
1374bc1f688bSRobert Mustacchi Dwarf_Half attr, char *string, Dwarf_Error * error)
1375bc1f688bSRobert Mustacchi {
1376*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1377*4d9fdb46SRobert Mustacchi int res = 0;
1378*4d9fdb46SRobert Mustacchi
1379*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_string_a(dbg,
1380*4d9fdb46SRobert Mustacchi ownerdie,attr,string,&a,error);
1381*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1382*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
1383*4d9fdb46SRobert Mustacchi }
1384*4d9fdb46SRobert Mustacchi return a;
1385*4d9fdb46SRobert Mustacchi }
1386*4d9fdb46SRobert Mustacchi
1387*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_string_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,char * string,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1388*4d9fdb46SRobert Mustacchi dwarf_add_AT_string_a(Dwarf_P_Debug dbg,
1389*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
1390*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
1391*4d9fdb46SRobert Mustacchi char *string,
1392*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
1393*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1394*4d9fdb46SRobert Mustacchi {
1395*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
1396*4d9fdb46SRobert Mustacchi int res = 0;
1397bc1f688bSRobert Mustacchi
1398bc1f688bSRobert Mustacchi if (dbg == NULL) {
1399bc1f688bSRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
1400*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1401bc1f688bSRobert Mustacchi }
1402bc1f688bSRobert Mustacchi
1403bc1f688bSRobert Mustacchi if (ownerdie == NULL) {
1404bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1405*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1406bc1f688bSRobert Mustacchi }
1407bc1f688bSRobert Mustacchi
1408bc1f688bSRobert Mustacchi new_attr = (Dwarf_P_Attribute)
1409bc1f688bSRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1410bc1f688bSRobert Mustacchi if (new_attr == NULL) {
1411bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1412*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1413bc1f688bSRobert Mustacchi }
1414bc1f688bSRobert Mustacchi
1415bc1f688bSRobert Mustacchi switch (attr) {
1416*4d9fdb46SRobert Mustacchi /* See also: pro_section.c for same strings attribute list. */
1417bc1f688bSRobert Mustacchi case DW_AT_comp_dir:
1418bc1f688bSRobert Mustacchi case DW_AT_const_value:
1419*4d9fdb46SRobert Mustacchi case DW_AT_linkage_name:/* DWARF5, but ok for any version really.*/
1420*4d9fdb46SRobert Mustacchi case DW_AT_MIPS_abstract_name:
1421*4d9fdb46SRobert Mustacchi case DW_AT_MIPS_linkage_name:
1422*4d9fdb46SRobert Mustacchi case DW_AT_name:
1423bc1f688bSRobert Mustacchi case DW_AT_producer:
1424bc1f688bSRobert Mustacchi break;
1425bc1f688bSRobert Mustacchi
1426bc1f688bSRobert Mustacchi default:
1427bc1f688bSRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
1428bc1f688bSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
1429*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1430bc1f688bSRobert Mustacchi }
1431bc1f688bSRobert Mustacchi break;
1432bc1f688bSRobert Mustacchi }
1433bc1f688bSRobert Mustacchi new_attr->ar_attribute = attr;
1434*4d9fdb46SRobert Mustacchi res = _dwarf_pro_set_string_attr(new_attr,ownerdie->di_dbg,
1435*4d9fdb46SRobert Mustacchi string,error);
1436*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1437*4d9fdb46SRobert Mustacchi return res;
1438bc1f688bSRobert Mustacchi }
1439bc1f688bSRobert Mustacchi
1440bc1f688bSRobert Mustacchi /* add attribute to the die */
1441bc1f688bSRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1442*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1443*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1444bc1f688bSRobert Mustacchi }
1445bc1f688bSRobert Mustacchi
1446bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_const_value_string(Dwarf_P_Die ownerdie,char * string_value,Dwarf_Error * error)1447bc1f688bSRobert Mustacchi dwarf_add_AT_const_value_string(Dwarf_P_Die ownerdie,
1448bc1f688bSRobert Mustacchi char *string_value, Dwarf_Error * error)
1449bc1f688bSRobert Mustacchi {
1450*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1451*4d9fdb46SRobert Mustacchi int res = 0;
1452bc1f688bSRobert Mustacchi
1453*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_const_value_string_a(ownerdie,
1454*4d9fdb46SRobert Mustacchi string_value,&a,error);
1455*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1456*4d9fdb46SRobert Mustacchi return (Dwarf_P_Attribute) DW_DLV_BADADDR;
1457*4d9fdb46SRobert Mustacchi }
1458*4d9fdb46SRobert Mustacchi return a;
1459bc1f688bSRobert Mustacchi }
1460bc1f688bSRobert Mustacchi
1461*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_const_value_string_a(Dwarf_P_Die ownerdie,char * string_value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1462*4d9fdb46SRobert Mustacchi dwarf_add_AT_const_value_string_a(Dwarf_P_Die ownerdie,
1463*4d9fdb46SRobert Mustacchi char *string_value,
1464*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
1465*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1466*4d9fdb46SRobert Mustacchi {
1467*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
1468*4d9fdb46SRobert Mustacchi Dwarf_P_Debug dbg = 0;
1469*4d9fdb46SRobert Mustacchi int res = 0;
1470*4d9fdb46SRobert Mustacchi
1471*4d9fdb46SRobert Mustacchi if (ownerdie == NULL) {
1472*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1473*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1474*4d9fdb46SRobert Mustacchi }
1475*4d9fdb46SRobert Mustacchi dbg = ownerdie->di_dbg;
1476*4d9fdb46SRobert Mustacchi
1477bc1f688bSRobert Mustacchi new_attr = (Dwarf_P_Attribute)
1478*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1479bc1f688bSRobert Mustacchi if (new_attr == NULL) {
1480*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1481*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1482bc1f688bSRobert Mustacchi }
1483bc1f688bSRobert Mustacchi
1484bc1f688bSRobert Mustacchi new_attr->ar_attribute = DW_AT_const_value;
1485*4d9fdb46SRobert Mustacchi res = _dwarf_pro_set_string_attr(new_attr,dbg,
1486*4d9fdb46SRobert Mustacchi string_value,error);
1487*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1488*4d9fdb46SRobert Mustacchi return res;
1489bc1f688bSRobert Mustacchi }
1490bc1f688bSRobert Mustacchi
1491bc1f688bSRobert Mustacchi /* add attribute to the die */
1492bc1f688bSRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1493*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1494*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1495bc1f688bSRobert Mustacchi }
1496bc1f688bSRobert Mustacchi
1497*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_with_ref_sig8(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,const Dwarf_Sig8 * sig8_in,Dwarf_Error * error)1498*4d9fdb46SRobert Mustacchi dwarf_add_AT_with_ref_sig8(Dwarf_P_Die ownerdie,
1499*4d9fdb46SRobert Mustacchi Dwarf_Half attrnum,
1500*4d9fdb46SRobert Mustacchi const Dwarf_Sig8 *sig8_in,
1501*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1502*4d9fdb46SRobert Mustacchi {
1503*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1504*4d9fdb46SRobert Mustacchi int res = 0;
1505*4d9fdb46SRobert Mustacchi
1506*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_with_ref_sig8_a(ownerdie,
1507*4d9fdb46SRobert Mustacchi attrnum,sig8_in,&a,error);
1508*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1509*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
1510*4d9fdb46SRobert Mustacchi }
1511*4d9fdb46SRobert Mustacchi return a;
1512*4d9fdb46SRobert Mustacchi }
1513*4d9fdb46SRobert Mustacchi
1514*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_with_ref_sig8_a(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,const Dwarf_Sig8 * sig8_in,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1515*4d9fdb46SRobert Mustacchi dwarf_add_AT_with_ref_sig8_a(Dwarf_P_Die ownerdie,
1516*4d9fdb46SRobert Mustacchi Dwarf_Half attrnum,
1517*4d9fdb46SRobert Mustacchi const Dwarf_Sig8 *sig8_in,
1518*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute * attr_out,
1519*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1520*4d9fdb46SRobert Mustacchi {
1521*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
1522*4d9fdb46SRobert Mustacchi Dwarf_P_Debug dbg = 0;
1523*4d9fdb46SRobert Mustacchi
1524*4d9fdb46SRobert Mustacchi if (ownerdie == NULL) {
1525*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1526*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1527*4d9fdb46SRobert Mustacchi }
1528*4d9fdb46SRobert Mustacchi dbg = ownerdie->di_dbg;
1529*4d9fdb46SRobert Mustacchi
1530*4d9fdb46SRobert Mustacchi new_attr = (Dwarf_P_Attribute)
1531*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1532*4d9fdb46SRobert Mustacchi if (new_attr == NULL) {
1533*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1534*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1535*4d9fdb46SRobert Mustacchi }
1536*4d9fdb46SRobert Mustacchi new_attr->ar_attribute = attrnum;
1537*4d9fdb46SRobert Mustacchi new_attr->ar_attribute_form = DW_FORM_ref_sig8;
1538*4d9fdb46SRobert Mustacchi new_attr->ar_nbytes = sizeof (Dwarf_Sig8);
1539*4d9fdb46SRobert Mustacchi new_attr->ar_next = 0;
1540*4d9fdb46SRobert Mustacchi
1541*4d9fdb46SRobert Mustacchi new_attr->ar_data =
1542*4d9fdb46SRobert Mustacchi (char *) _dwarf_p_get_alloc(dbg, sizeof(Dwarf_Sig8));
1543*4d9fdb46SRobert Mustacchi if (new_attr->ar_data == NULL) {
1544*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1545*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1546*4d9fdb46SRobert Mustacchi }
1547*4d9fdb46SRobert Mustacchi memcpy(new_attr->ar_data,sig8_in,sizeof(Dwarf_Sig8));
1548*4d9fdb46SRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE;
1549*4d9fdb46SRobert Mustacchi new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
1550*4d9fdb46SRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1551*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1552*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1553*4d9fdb46SRobert Mustacchi }
1554*4d9fdb46SRobert Mustacchi
1555*4d9fdb46SRobert Mustacchi
1556bc1f688bSRobert Mustacchi
1557bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_producer(Dwarf_P_Die ownerdie,char * producer_string,Dwarf_Error * error)1558bc1f688bSRobert Mustacchi dwarf_add_AT_producer(Dwarf_P_Die ownerdie,
1559bc1f688bSRobert Mustacchi char *producer_string, Dwarf_Error * error)
1560bc1f688bSRobert Mustacchi {
1561*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1562*4d9fdb46SRobert Mustacchi int res = 0;
1563bc1f688bSRobert Mustacchi
1564*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_producer_a(ownerdie,
1565*4d9fdb46SRobert Mustacchi producer_string,&a,error);
1566*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1567bc1f688bSRobert Mustacchi return ((Dwarf_P_Attribute)DW_DLV_BADADDR);
1568bc1f688bSRobert Mustacchi }
1569*4d9fdb46SRobert Mustacchi return a;
1570*4d9fdb46SRobert Mustacchi }
1571bc1f688bSRobert Mustacchi
1572*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_producer_a(Dwarf_P_Die ownerdie,char * producer_string,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1573*4d9fdb46SRobert Mustacchi dwarf_add_AT_producer_a(Dwarf_P_Die ownerdie,
1574*4d9fdb46SRobert Mustacchi char *producer_string,
1575*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
1576*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1577*4d9fdb46SRobert Mustacchi {
1578*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
1579*4d9fdb46SRobert Mustacchi Dwarf_P_Debug dbg = 0;
1580*4d9fdb46SRobert Mustacchi int res = 0;
1581*4d9fdb46SRobert Mustacchi
1582*4d9fdb46SRobert Mustacchi if (ownerdie == NULL) {
1583*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1584*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1585*4d9fdb46SRobert Mustacchi }
1586*4d9fdb46SRobert Mustacchi dbg = ownerdie->di_dbg;
1587bc1f688bSRobert Mustacchi new_attr = (Dwarf_P_Attribute)
1588*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1589bc1f688bSRobert Mustacchi if (new_attr == NULL) {
1590*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1591*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1592bc1f688bSRobert Mustacchi }
1593bc1f688bSRobert Mustacchi
1594bc1f688bSRobert Mustacchi new_attr->ar_attribute = DW_AT_producer;
1595*4d9fdb46SRobert Mustacchi res = _dwarf_pro_set_string_attr(new_attr,dbg,
1596*4d9fdb46SRobert Mustacchi producer_string,error);
1597*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1598*4d9fdb46SRobert Mustacchi return res;
1599bc1f688bSRobert Mustacchi }
1600bc1f688bSRobert Mustacchi
1601bc1f688bSRobert Mustacchi /* add attribute to the die */
1602bc1f688bSRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1603*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1604*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1605bc1f688bSRobert Mustacchi }
1606bc1f688bSRobert Mustacchi
1607*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_const_value_signedint_a(Dwarf_P_Die ownerdie,Dwarf_Signed signed_value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1608*4d9fdb46SRobert Mustacchi dwarf_add_AT_const_value_signedint_a(Dwarf_P_Die ownerdie,
1609*4d9fdb46SRobert Mustacchi Dwarf_Signed signed_value,
1610*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
1611*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1612*4d9fdb46SRobert Mustacchi {
1613*4d9fdb46SRobert Mustacchi int res = 0;
1614*4d9fdb46SRobert Mustacchi
1615*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_any_value_sleb_a(
1616*4d9fdb46SRobert Mustacchi ownerdie,DW_AT_const_value,
1617*4d9fdb46SRobert Mustacchi signed_value,
1618*4d9fdb46SRobert Mustacchi attr_out, error);
1619*4d9fdb46SRobert Mustacchi return res;
1620*4d9fdb46SRobert Mustacchi }
1621bc1f688bSRobert Mustacchi
1622bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_const_value_signedint(Dwarf_P_Die ownerdie,Dwarf_Signed signed_value,Dwarf_Error * error)1623bc1f688bSRobert Mustacchi dwarf_add_AT_const_value_signedint(Dwarf_P_Die ownerdie,
1624bc1f688bSRobert Mustacchi Dwarf_Signed signed_value,
1625bc1f688bSRobert Mustacchi Dwarf_Error * error)
1626bc1f688bSRobert Mustacchi {
1627*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1628*4d9fdb46SRobert Mustacchi int res = 0;
1629*4d9fdb46SRobert Mustacchi
1630*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_any_value_sleb_a(
1631*4d9fdb46SRobert Mustacchi ownerdie,DW_AT_const_value,
1632*4d9fdb46SRobert Mustacchi signed_value,
1633*4d9fdb46SRobert Mustacchi &a, error);
1634*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1635*4d9fdb46SRobert Mustacchi return (Dwarf_P_Attribute)DW_DLV_BADADDR;
1636*4d9fdb46SRobert Mustacchi }
1637*4d9fdb46SRobert Mustacchi return a;
1638*4d9fdb46SRobert Mustacchi }
1639*4d9fdb46SRobert Mustacchi
1640*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_implicit_const(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,Dwarf_Signed signed_value,Dwarf_P_Attribute * outattr,Dwarf_Error * error)1641*4d9fdb46SRobert Mustacchi dwarf_add_AT_implicit_const(Dwarf_P_Die ownerdie,
1642*4d9fdb46SRobert Mustacchi Dwarf_Half attrnum,
1643*4d9fdb46SRobert Mustacchi Dwarf_Signed signed_value,
1644*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *outattr,
1645*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1646*4d9fdb46SRobert Mustacchi {
1647*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
1648*4d9fdb46SRobert Mustacchi Dwarf_P_Debug dbg = 0;
1649bc1f688bSRobert Mustacchi
1650bc1f688bSRobert Mustacchi if (ownerdie == NULL) {
1651*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1652*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1653bc1f688bSRobert Mustacchi }
1654*4d9fdb46SRobert Mustacchi dbg = ownerdie->di_dbg;
1655bc1f688bSRobert Mustacchi
1656bc1f688bSRobert Mustacchi new_attr = (Dwarf_P_Attribute)
1657*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1658bc1f688bSRobert Mustacchi if (new_attr == NULL) {
1659*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1660*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1661bc1f688bSRobert Mustacchi }
1662bc1f688bSRobert Mustacchi
1663*4d9fdb46SRobert Mustacchi new_attr->ar_attribute = attrnum;
1664*4d9fdb46SRobert Mustacchi new_attr->ar_attribute_form = DW_FORM_implicit_const;
1665*4d9fdb46SRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE;
1666*4d9fdb46SRobert Mustacchi new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
1667*4d9fdb46SRobert Mustacchi new_attr->ar_next = 0;
1668*4d9fdb46SRobert Mustacchi
1669*4d9fdb46SRobert Mustacchi /* The value will go in the abbrev section.
1670*4d9fdb46SRobert Mustacchi Not the DIE. Encoding done with abbrev generation. */
1671*4d9fdb46SRobert Mustacchi new_attr->ar_data = 0;
1672*4d9fdb46SRobert Mustacchi new_attr->ar_nbytes = 0;
1673*4d9fdb46SRobert Mustacchi new_attr->ar_implicit_const = signed_value;
1674*4d9fdb46SRobert Mustacchi
1675*4d9fdb46SRobert Mustacchi /* add attribute to the die */
1676*4d9fdb46SRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1677*4d9fdb46SRobert Mustacchi *outattr = new_attr;
1678*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1679*4d9fdb46SRobert Mustacchi }
1680*4d9fdb46SRobert Mustacchi
1681*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_any_value_sleb(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,Dwarf_Signed signed_value,Dwarf_Error * error)1682*4d9fdb46SRobert Mustacchi dwarf_add_AT_any_value_sleb(Dwarf_P_Die ownerdie,
1683*4d9fdb46SRobert Mustacchi Dwarf_Half attrnum,
1684*4d9fdb46SRobert Mustacchi Dwarf_Signed signed_value,
1685*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1686*4d9fdb46SRobert Mustacchi {
1687*4d9fdb46SRobert Mustacchi int res = 0;
1688*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1689*4d9fdb46SRobert Mustacchi
1690*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_any_value_sleb_a(ownerdie,
1691*4d9fdb46SRobert Mustacchi attrnum,
1692*4d9fdb46SRobert Mustacchi signed_value,
1693*4d9fdb46SRobert Mustacchi &a, error);
1694*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1695*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
1696*4d9fdb46SRobert Mustacchi }
1697*4d9fdb46SRobert Mustacchi return a;
1698*4d9fdb46SRobert Mustacchi }
1699*4d9fdb46SRobert Mustacchi
1700*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_any_value_sleb_a(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,Dwarf_Signed signed_value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1701*4d9fdb46SRobert Mustacchi dwarf_add_AT_any_value_sleb_a(Dwarf_P_Die ownerdie,
1702*4d9fdb46SRobert Mustacchi Dwarf_Half attrnum,
1703*4d9fdb46SRobert Mustacchi Dwarf_Signed signed_value,
1704*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
1705*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1706*4d9fdb46SRobert Mustacchi {
1707*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
1708*4d9fdb46SRobert Mustacchi int leb_size = 0;
1709*4d9fdb46SRobert Mustacchi Dwarf_P_Debug dbg = 0;
1710*4d9fdb46SRobert Mustacchi char encode_buffer[ENCODE_SPACE_NEEDED];
1711*4d9fdb46SRobert Mustacchi int res = 0;
1712*4d9fdb46SRobert Mustacchi
1713*4d9fdb46SRobert Mustacchi if (ownerdie == NULL) {
1714*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1715*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1716*4d9fdb46SRobert Mustacchi }
1717*4d9fdb46SRobert Mustacchi dbg = ownerdie->di_dbg;
1718*4d9fdb46SRobert Mustacchi
1719*4d9fdb46SRobert Mustacchi new_attr = (Dwarf_P_Attribute)
1720*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1721*4d9fdb46SRobert Mustacchi if (new_attr == NULL) {
1722*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1723*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1724*4d9fdb46SRobert Mustacchi }
1725*4d9fdb46SRobert Mustacchi
1726*4d9fdb46SRobert Mustacchi new_attr->ar_attribute = attrnum;
1727bc1f688bSRobert Mustacchi new_attr->ar_attribute_form = DW_FORM_sdata;
1728bc1f688bSRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE;
1729bc1f688bSRobert Mustacchi new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
1730bc1f688bSRobert Mustacchi new_attr->ar_next = 0;
1731bc1f688bSRobert Mustacchi
1732bc1f688bSRobert Mustacchi res = _dwarf_pro_encode_signed_leb128_nm(signed_value, &leb_size,
1733bc1f688bSRobert Mustacchi encode_buffer,
1734bc1f688bSRobert Mustacchi sizeof(encode_buffer));
1735bc1f688bSRobert Mustacchi if (res != DW_DLV_OK) {
1736*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1737*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1738bc1f688bSRobert Mustacchi }
1739bc1f688bSRobert Mustacchi new_attr->ar_data = (char *)
1740*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, leb_size);
1741bc1f688bSRobert Mustacchi if (new_attr->ar_data == NULL) {
1742*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1743*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1744bc1f688bSRobert Mustacchi }
1745bc1f688bSRobert Mustacchi memcpy(new_attr->ar_data, encode_buffer, leb_size);
1746bc1f688bSRobert Mustacchi new_attr->ar_nbytes = leb_size;
1747bc1f688bSRobert Mustacchi
1748bc1f688bSRobert Mustacchi /* add attribute to the die */
1749bc1f688bSRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1750*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1751*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1752bc1f688bSRobert Mustacchi }
1753bc1f688bSRobert Mustacchi
1754*4d9fdb46SRobert Mustacchi /* AT_const_value, uleb */
1755bc1f688bSRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_const_value_unsignedint(Dwarf_P_Die ownerdie,Dwarf_Unsigned unsigned_value,Dwarf_Error * error)1756bc1f688bSRobert Mustacchi dwarf_add_AT_const_value_unsignedint(Dwarf_P_Die ownerdie,
1757bc1f688bSRobert Mustacchi Dwarf_Unsigned unsigned_value,
1758bc1f688bSRobert Mustacchi Dwarf_Error * error)
1759bc1f688bSRobert Mustacchi {
1760*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a =0;
1761*4d9fdb46SRobert Mustacchi int res = 0;
1762*4d9fdb46SRobert Mustacchi
1763*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_any_value_uleb_a(
1764*4d9fdb46SRobert Mustacchi ownerdie,DW_AT_const_value,
1765*4d9fdb46SRobert Mustacchi unsigned_value,
1766*4d9fdb46SRobert Mustacchi &a,
1767*4d9fdb46SRobert Mustacchi error);
1768*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1769*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
1770*4d9fdb46SRobert Mustacchi }
1771*4d9fdb46SRobert Mustacchi return a;
1772*4d9fdb46SRobert Mustacchi }
1773*4d9fdb46SRobert Mustacchi
1774*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_const_value_unsignedint_a(Dwarf_P_Die ownerdie,Dwarf_Unsigned unsigned_value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1775*4d9fdb46SRobert Mustacchi dwarf_add_AT_const_value_unsignedint_a(Dwarf_P_Die ownerdie,
1776*4d9fdb46SRobert Mustacchi Dwarf_Unsigned unsigned_value,
1777*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
1778*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1779*4d9fdb46SRobert Mustacchi {
1780*4d9fdb46SRobert Mustacchi
1781*4d9fdb46SRobert Mustacchi return dwarf_add_AT_any_value_uleb_a(
1782*4d9fdb46SRobert Mustacchi ownerdie,DW_AT_const_value,
1783*4d9fdb46SRobert Mustacchi unsigned_value,
1784*4d9fdb46SRobert Mustacchi attr_out,
1785*4d9fdb46SRobert Mustacchi error);
1786*4d9fdb46SRobert Mustacchi }
1787*4d9fdb46SRobert Mustacchi
1788*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_data16(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,Dwarf_Form_Data16 * ptr_to_val,Dwarf_P_Attribute * attr_return,Dwarf_Error * error)1789*4d9fdb46SRobert Mustacchi dwarf_add_AT_data16(Dwarf_P_Die ownerdie,
1790*4d9fdb46SRobert Mustacchi Dwarf_Half attrnum,
1791*4d9fdb46SRobert Mustacchi Dwarf_Form_Data16 * ptr_to_val,
1792*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute * attr_return,
1793*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1794*4d9fdb46SRobert Mustacchi {
1795*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr;
1796*4d9fdb46SRobert Mustacchi int val_size = sizeof(Dwarf_Form_Data16);
1797*4d9fdb46SRobert Mustacchi Dwarf_P_Debug dbg = 0;
1798*4d9fdb46SRobert Mustacchi
1799*4d9fdb46SRobert Mustacchi if (ownerdie == NULL) {
1800*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1801*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1802*4d9fdb46SRobert Mustacchi }
1803*4d9fdb46SRobert Mustacchi dbg = ownerdie->di_dbg;
1804*4d9fdb46SRobert Mustacchi new_attr = (Dwarf_P_Attribute)
1805*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1806*4d9fdb46SRobert Mustacchi if (new_attr == NULL) {
1807*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1808*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1809*4d9fdb46SRobert Mustacchi }
1810*4d9fdb46SRobert Mustacchi new_attr->ar_attribute = attrnum;
1811*4d9fdb46SRobert Mustacchi new_attr->ar_attribute_form = DW_FORM_data16;
1812*4d9fdb46SRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE;
1813*4d9fdb46SRobert Mustacchi new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
1814*4d9fdb46SRobert Mustacchi new_attr->ar_next = 0;
1815*4d9fdb46SRobert Mustacchi new_attr->ar_data = (char *)
1816*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, val_size);
1817*4d9fdb46SRobert Mustacchi if (new_attr->ar_data == NULL) {
1818*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1819*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1820*4d9fdb46SRobert Mustacchi }
1821*4d9fdb46SRobert Mustacchi memcpy(new_attr->ar_data, ptr_to_val->fd_data, val_size);
1822*4d9fdb46SRobert Mustacchi new_attr->ar_nbytes = val_size;
1823*4d9fdb46SRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1824*4d9fdb46SRobert Mustacchi *attr_return = new_attr;
1825*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1826*4d9fdb46SRobert Mustacchi }
1827*4d9fdb46SRobert Mustacchi
1828*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_any_value_uleb(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,Dwarf_Unsigned unsigned_value,Dwarf_Error * error)1829*4d9fdb46SRobert Mustacchi dwarf_add_AT_any_value_uleb(Dwarf_P_Die ownerdie,
1830*4d9fdb46SRobert Mustacchi Dwarf_Half attrnum,
1831*4d9fdb46SRobert Mustacchi Dwarf_Unsigned unsigned_value,
1832*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1833*4d9fdb46SRobert Mustacchi {
1834*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1835*4d9fdb46SRobert Mustacchi int res = 0;
1836*4d9fdb46SRobert Mustacchi
1837*4d9fdb46SRobert Mustacchi res = dwarf_add_AT_any_value_uleb_a(ownerdie,
1838*4d9fdb46SRobert Mustacchi attrnum,unsigned_value,&a,error);
1839*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1840*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
1841*4d9fdb46SRobert Mustacchi }
1842*4d9fdb46SRobert Mustacchi return a;
1843*4d9fdb46SRobert Mustacchi }
1844*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_any_value_uleb_a(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,Dwarf_Unsigned unsigned_value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1845*4d9fdb46SRobert Mustacchi dwarf_add_AT_any_value_uleb_a(Dwarf_P_Die ownerdie,
1846*4d9fdb46SRobert Mustacchi Dwarf_Half attrnum,
1847*4d9fdb46SRobert Mustacchi Dwarf_Unsigned unsigned_value,
1848*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute * attr_out,
1849*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1850*4d9fdb46SRobert Mustacchi {
1851bc1f688bSRobert Mustacchi Dwarf_P_Attribute new_attr;
1852bc1f688bSRobert Mustacchi int leb_size;
1853*4d9fdb46SRobert Mustacchi Dwarf_P_Debug dbg = 0;
1854bc1f688bSRobert Mustacchi char encode_buffer[ENCODE_SPACE_NEEDED];
1855bc1f688bSRobert Mustacchi int res;
1856bc1f688bSRobert Mustacchi
1857bc1f688bSRobert Mustacchi if (ownerdie == NULL) {
1858*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1859*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1860bc1f688bSRobert Mustacchi }
1861*4d9fdb46SRobert Mustacchi dbg = ownerdie->di_dbg;
1862bc1f688bSRobert Mustacchi new_attr = (Dwarf_P_Attribute)
1863*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1864bc1f688bSRobert Mustacchi if (new_attr == NULL) {
1865bc1f688bSRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL);
1866*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1867bc1f688bSRobert Mustacchi }
1868bc1f688bSRobert Mustacchi
1869*4d9fdb46SRobert Mustacchi new_attr->ar_attribute = attrnum;
1870bc1f688bSRobert Mustacchi new_attr->ar_attribute_form = DW_FORM_udata;
1871bc1f688bSRobert Mustacchi new_attr->ar_rel_type = R_MIPS_NONE;
1872bc1f688bSRobert Mustacchi new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
1873bc1f688bSRobert Mustacchi new_attr->ar_next = 0;
1874bc1f688bSRobert Mustacchi
1875bc1f688bSRobert Mustacchi res = _dwarf_pro_encode_leb128_nm(unsigned_value, &leb_size,
1876bc1f688bSRobert Mustacchi encode_buffer,
1877bc1f688bSRobert Mustacchi sizeof(encode_buffer));
1878bc1f688bSRobert Mustacchi if (res != DW_DLV_OK) {
1879*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1880*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1881bc1f688bSRobert Mustacchi }
1882bc1f688bSRobert Mustacchi new_attr->ar_data = (char *)
1883*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, leb_size);
1884bc1f688bSRobert Mustacchi if (new_attr->ar_data == NULL) {
1885*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1886*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1887bc1f688bSRobert Mustacchi }
1888bc1f688bSRobert Mustacchi memcpy(new_attr->ar_data, encode_buffer, leb_size);
1889bc1f688bSRobert Mustacchi new_attr->ar_nbytes = leb_size;
1890bc1f688bSRobert Mustacchi
1891bc1f688bSRobert Mustacchi /* add attribute to the die */
1892bc1f688bSRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1893*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1894*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1895bc1f688bSRobert Mustacchi }
1896