149d3bc91SRichard Lowe /*
207dc1947SRichard Lowe Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved.
307dc1947SRichard Lowe 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.
649d3bc91SRichard Lowe
749d3bc91SRichard Lowe This program is free software; you can redistribute it and/or modify it
8*4d9fdb46SRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License
949d3bc91SRichard Lowe as published by the Free Software Foundation.
1049d3bc91SRichard Lowe
1149d3bc91SRichard Lowe This program is distributed in the hope that it would be useful, but
1249d3bc91SRichard Lowe WITHOUT ANY WARRANTY; without even the implied warranty of
13*4d9fdb46SRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1449d3bc91SRichard Lowe
1549d3bc91SRichard Lowe Further, this software is distributed without any warranty that it is
16*4d9fdb46SRobert Mustacchi free of the rightful claim of any third person regarding infringement
17*4d9fdb46SRobert Mustacchi or the like. Any license provided herein, whether implied or
1849d3bc91SRichard Lowe otherwise, applies only to this software file. Patent licenses, if
19*4d9fdb46SRobert Mustacchi any, provided herein do not apply to combinations of this program with
20*4d9fdb46SRobert Mustacchi other software, or any other product whatsoever.
2149d3bc91SRichard Lowe
22*4d9fdb46SRobert Mustacchi You should have received a copy of the GNU Lesser General Public
23*4d9fdb46SRobert Mustacchi License along with this program; if not, write the Free Software
2407dc1947SRichard Lowe Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
2549d3bc91SRichard Lowe USA.
2649d3bc91SRichard Lowe
2749d3bc91SRichard Lowe */
2849d3bc91SRichard Lowe
2949d3bc91SRichard Lowe #include "config.h"
3049d3bc91SRichard Lowe #include "libdwarfdefs.h"
3149d3bc91SRichard Lowe #include <stdio.h>
3249d3bc91SRichard Lowe #include <string.h>
3349d3bc91SRichard Lowe #include <limits.h>
3449d3bc91SRichard Lowe #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"
4349d3bc91SRichard Lowe #include "pro_expr.h"
4449d3bc91SRichard Lowe
4549d3bc91SRichard Lowe #ifndef R_MIPS_NONE
4649d3bc91SRichard Lowe #define R_MIPS_NONE 0
4749d3bc91SRichard Lowe #endif
4849d3bc91SRichard Lowe
4949d3bc91SRichard Lowe
50*4d9fdb46SRobert Mustacchi /* Indicates no relocation needed. */
5107dc1947SRichard Lowe #define NO_ELF_SYM_INDEX 0
5249d3bc91SRichard Lowe
5349d3bc91SRichard Lowe
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 */
68*4d9fdb46SRobert 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
12049d3bc91SRichard Lowe a target address to the given die. The attribute
12149d3bc91SRichard Lowe is given the name provided by attr. The address
122*4d9fdb46SRobert Mustacchi is given in pc_value. */
123*4d9fdb46SRobert Mustacchi
124*4d9fdb46SRobert Mustacchi static int
125*4d9fdb46SRobert Mustacchi local_add_AT_address_a(Dwarf_P_Debug dbg,
126*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
127*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
128*4d9fdb46SRobert Mustacchi Dwarf_Signed form,
129*4d9fdb46SRobert Mustacchi Dwarf_Unsigned pc_value,
130*4d9fdb46SRobert Mustacchi Dwarf_Unsigned sym_index,
131*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
132*4d9fdb46SRobert Mustacchi Dwarf_Error * error);
13307dc1947SRichard Lowe
13449d3bc91SRichard Lowe /* old interface */
13549d3bc91SRichard Lowe 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)13649d3bc91SRichard Lowe dwarf_add_AT_targ_address(Dwarf_P_Debug dbg,
137*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
138*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
139*4d9fdb46SRobert Mustacchi Dwarf_Unsigned pc_value,
140*4d9fdb46SRobert Mustacchi Dwarf_Signed sym_index, Dwarf_Error * error)
14149d3bc91SRichard Lowe {
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
15849d3bc91SRichard Lowe }
15949d3bc91SRichard Lowe
160*4d9fdb46SRobert Mustacchi /* New interface, replacing dwarf_add_AT_targ_address.
161*4d9fdb46SRobert Mustacchi Essentially just makes sym_index a Dwarf_Unsigned
162*4d9fdb46SRobert Mustacchi so for symbolic relocations it can be a full address. */
16349d3bc91SRichard Lowe 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)16449d3bc91SRichard Lowe dwarf_add_AT_targ_address_b(Dwarf_P_Debug dbg,
165*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
166*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
167*4d9fdb46SRobert Mustacchi Dwarf_Unsigned pc_value,
168*4d9fdb46SRobert Mustacchi Dwarf_Unsigned sym_index,
169*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
170*4d9fdb46SRobert 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)
19107dc1947SRichard Lowe {
192*4d9fdb46SRobert Mustacchi int res = 0;
193*4d9fdb46SRobert Mustacchi
19407dc1947SRichard Lowe switch (attr) {
19507dc1947SRichard Lowe case DW_AT_low_pc:
19607dc1947SRichard Lowe case DW_AT_high_pc:
19707dc1947SRichard Lowe
19807dc1947SRichard Lowe /* added to support location lists */
19907dc1947SRichard Lowe /* no way to check that this is a loclist-style address though */
20007dc1947SRichard Lowe case DW_AT_location:
20107dc1947SRichard Lowe case DW_AT_string_length:
20207dc1947SRichard Lowe case DW_AT_return_addr:
20307dc1947SRichard Lowe case DW_AT_frame_base:
20407dc1947SRichard Lowe case DW_AT_segment:
20507dc1947SRichard Lowe case DW_AT_static_link:
20607dc1947SRichard Lowe case DW_AT_use_location:
20707dc1947SRichard Lowe case DW_AT_vtable_elem_location:
20807dc1947SRichard Lowe case DW_AT_const_value: /* Gcc can generate this as address. */
20907dc1947SRichard Lowe case DW_AT_entry_pc:
21007dc1947SRichard Lowe break;
211*4d9fdb46SRobert Mustacchi default:
212*4d9fdb46SRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
21307dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
214*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
21507dc1947SRichard Lowe }
21607dc1947SRichard Lowe break;
21707dc1947SRichard Lowe }
218*4d9fdb46SRobert 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;
22207dc1947SRichard Lowe }
22307dc1947SRichard Lowe
22407dc1947SRichard Lowe 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)22507dc1947SRichard Lowe dwarf_add_AT_ref_address(Dwarf_P_Debug dbg,
226*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
227*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
228*4d9fdb46SRobert Mustacchi Dwarf_Unsigned pc_value,
229*4d9fdb46SRobert Mustacchi Dwarf_Unsigned sym_index,
230*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
231*4d9fdb46SRobert 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)
25107dc1947SRichard Lowe {
252*4d9fdb46SRobert Mustacchi int res = 0;
253*4d9fdb46SRobert Mustacchi
25407dc1947SRichard Lowe switch (attr) {
25507dc1947SRichard Lowe case DW_AT_type:
25607dc1947SRichard Lowe case DW_AT_import:
25707dc1947SRichard Lowe break;
25807dc1947SRichard Lowe
259*4d9fdb46SRobert Mustacchi default:
260*4d9fdb46SRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
26107dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
262*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
26307dc1947SRichard Lowe }
26407dc1947SRichard Lowe break;
26507dc1947SRichard Lowe }
266*4d9fdb46SRobert 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;
27407dc1947SRichard Lowe }
27507dc1947SRichard Lowe
27607dc1947SRichard Lowe
27707dc1947SRichard Lowe /* 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,
280*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
281*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
282*4d9fdb46SRobert Mustacchi Dwarf_Signed form,
283*4d9fdb46SRobert Mustacchi Dwarf_Unsigned pc_value,
284*4d9fdb46SRobert Mustacchi Dwarf_Unsigned sym_index,
285*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
286*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
28749d3bc91SRichard Lowe {
28849d3bc91SRichard Lowe Dwarf_P_Attribute new_attr;
289*4d9fdb46SRobert Mustacchi int upointer_size = 0;
29049d3bc91SRichard Lowe
29149d3bc91SRichard Lowe if (dbg == NULL) {
29207dc1947SRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
293*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
29449d3bc91SRichard Lowe }
295*4d9fdb46SRobert Mustacchi upointer_size = dbg->de_pointer_size;
29649d3bc91SRichard Lowe
29749d3bc91SRichard Lowe if (ownerdie == NULL) {
29807dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
299*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
30049d3bc91SRichard Lowe }
30149d3bc91SRichard Lowe
30207dc1947SRichard Lowe /* attribute types have already been checked */
30307dc1947SRichard Lowe /* switch (attr) { ... } */
30449d3bc91SRichard Lowe
30549d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
30607dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
30749d3bc91SRichard Lowe if (new_attr == NULL) {
30807dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
309*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
31049d3bc91SRichard Lowe }
31149d3bc91SRichard Lowe
31249d3bc91SRichard Lowe new_attr->ar_attribute = attr;
31307dc1947SRichard Lowe new_attr->ar_attribute_form = form;
31449d3bc91SRichard Lowe new_attr->ar_nbytes = upointer_size;
31549d3bc91SRichard Lowe new_attr->ar_rel_symidx = sym_index;
31649d3bc91SRichard Lowe new_attr->ar_reloc_len = upointer_size;
31749d3bc91SRichard Lowe new_attr->ar_next = 0;
318*4d9fdb46SRobert Mustacchi if (sym_index != NO_ELF_SYM_INDEX) {
31907dc1947SRichard Lowe new_attr->ar_rel_type = dbg->de_ptr_reloc;
320*4d9fdb46SRobert Mustacchi } else {
32107dc1947SRichard Lowe new_attr->ar_rel_type = R_MIPS_NONE;
322*4d9fdb46SRobert Mustacchi }
32349d3bc91SRichard Lowe
32449d3bc91SRichard Lowe new_attr->ar_data = (char *)
32507dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, upointer_size);
32649d3bc91SRichard Lowe if (new_attr->ar_data == NULL) {
32707dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
328*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
32949d3bc91SRichard Lowe }
33049d3bc91SRichard Lowe WRITE_UNALIGNED(dbg, new_attr->ar_data,
331*4d9fdb46SRobert Mustacchi (const void *) &pc_value,
332*4d9fdb46SRobert Mustacchi sizeof(pc_value), upointer_size);
33307dc1947SRichard Lowe
33407dc1947SRichard Lowe /* add attribute to the die */
33507dc1947SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
336*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
337*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
33807dc1947SRichard Lowe }
33907dc1947SRichard Lowe
340*4d9fdb46SRobert Mustacchi /* Pass in array (ie a pointer to) of Dwarf_Signed
341*4d9fdb46SRobert Mustacchi with input_array_length elements.
342*4d9fdb46SRobert 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. */
42707dc1947SRichard Lowe
428*4d9fdb46SRobert Mustacchi /* return value points to an array of LEB numbers */
42907dc1947SRichard Lowe
43007dc1947SRichard Lowe 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)43107dc1947SRichard Lowe dwarf_compress_integer_block(
43207dc1947SRichard Lowe Dwarf_P_Debug dbg,
43307dc1947SRichard Lowe Dwarf_Bool unit_is_signed,
43407dc1947SRichard Lowe Dwarf_Small unit_length_in_bits,
43507dc1947SRichard Lowe void* input_block,
43607dc1947SRichard Lowe Dwarf_Unsigned input_length_in_units,
43707dc1947SRichard Lowe Dwarf_Unsigned* output_length_in_bytes_ptr,
43807dc1947SRichard Lowe Dwarf_Error* error
43907dc1947SRichard Lowe )
44007dc1947SRichard Lowe {
44107dc1947SRichard Lowe Dwarf_Unsigned output_length_in_bytes = 0;
44207dc1947SRichard Lowe char * output_block = 0;
44307dc1947SRichard Lowe char encode_buffer[ENCODE_SPACE_NEEDED];
444*4d9fdb46SRobert Mustacchi unsigned u = 0;
44507dc1947SRichard Lowe char * ptr = 0;
44607dc1947SRichard Lowe int remain = 0;
44707dc1947SRichard Lowe int result = 0;
448*4d9fdb46SRobert Mustacchi char *inptr = 0;
44907dc1947SRichard Lowe
45007dc1947SRichard Lowe if (dbg == NULL) {
45107dc1947SRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
45207dc1947SRichard Lowe return((void *)DW_DLV_BADADDR);
45307dc1947SRichard Lowe }
454*4d9fdb46SRobert Mustacchi
45507dc1947SRichard Lowe if (unit_is_signed == false ||
45607dc1947SRichard Lowe unit_length_in_bits != 32 ||
45707dc1947SRichard Lowe input_block == NULL ||
45807dc1947SRichard Lowe input_length_in_units == 0 ||
45907dc1947SRichard Lowe output_length_in_bytes_ptr == NULL) {
46007dc1947SRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_BADBITC);
46107dc1947SRichard Lowe return ((void *) DW_DLV_BADADDR);
46207dc1947SRichard Lowe }
46307dc1947SRichard Lowe
46407dc1947SRichard Lowe /* At this point we assume the format is: signed 32 bit */
46507dc1947SRichard Lowe
466*4d9fdb46SRobert Mustacchi /* First compress everything to find the total size. */
46707dc1947SRichard Lowe
46807dc1947SRichard Lowe output_length_in_bytes = 0;
469*4d9fdb46SRobert Mustacchi inptr = input_block;
470*4d9fdb46SRobert Mustacchi for (u=0; u<input_length_in_units; u++) {
47107dc1947SRichard Lowe int unit_encoded_size;
472*4d9fdb46SRobert Mustacchi Dwarf_Signed unit = 0;
473*4d9fdb46SRobert 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,
478*4d9fdb46SRobert Mustacchi encode_buffer,sizeof(encode_buffer));
47907dc1947SRichard Lowe if (result != DW_DLV_OK) {
48007dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
48107dc1947SRichard Lowe return((Dwarf_P_Attribute)DW_DLV_BADADDR);
48207dc1947SRichard Lowe }
48307dc1947SRichard Lowe output_length_in_bytes += unit_encoded_size;
484*4d9fdb46SRobert Mustacchi inptr += DWARF_32BIT_SIZE;
48507dc1947SRichard Lowe }
48607dc1947SRichard Lowe
487*4d9fdb46SRobert Mustacchi /* Then alloc */
48807dc1947SRichard Lowe output_block = (void *)
48907dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, output_length_in_bytes);
49007dc1947SRichard Lowe if (output_block == NULL) {
49107dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
49207dc1947SRichard Lowe return((void*)DW_DLV_BADADDR);
49307dc1947SRichard Lowe }
49407dc1947SRichard Lowe
495*4d9fdb46SRobert Mustacchi /* Then compress again and copy into new buffer */
49607dc1947SRichard Lowe ptr = output_block;
497*4d9fdb46SRobert Mustacchi inptr = input_block;
49807dc1947SRichard Lowe remain = output_length_in_bytes;
499*4d9fdb46SRobert Mustacchi for (u=0; u<input_length_in_units; u++) {
50007dc1947SRichard Lowe int unit_encoded_size;
501*4d9fdb46SRobert Mustacchi Dwarf_Signed unit = 0;
502*4d9fdb46SRobert 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,
507*4d9fdb46SRobert Mustacchi ptr, remain);
50807dc1947SRichard Lowe if (result != DW_DLV_OK) {
50907dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
51007dc1947SRichard Lowe return((Dwarf_P_Attribute)DW_DLV_BADADDR);
51107dc1947SRichard Lowe }
51207dc1947SRichard Lowe remain -= unit_encoded_size;
51307dc1947SRichard Lowe ptr += unit_encoded_size;
514*4d9fdb46SRobert Mustacchi inptr += DWARF_32BIT_SIZE;
51507dc1947SRichard Lowe }
51607dc1947SRichard Lowe
51707dc1947SRichard Lowe if (remain != 0) {
51807dc1947SRichard Lowe _dwarf_p_dealloc(dbg, (unsigned char *)output_block);
51907dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
52007dc1947SRichard Lowe return((Dwarf_P_Attribute)DW_DLV_BADADDR);
52107dc1947SRichard Lowe }
52207dc1947SRichard Lowe
52307dc1947SRichard Lowe *output_length_in_bytes_ptr = output_length_in_bytes;
52407dc1947SRichard Lowe return (void*) output_block;
52507dc1947SRichard Lowe }
52607dc1947SRichard Lowe
52707dc1947SRichard Lowe void
dwarf_dealloc_compressed_block(Dwarf_P_Debug dbg,void * space)52807dc1947SRichard Lowe dwarf_dealloc_compressed_block(Dwarf_P_Debug dbg, void * space)
52907dc1947SRichard Lowe {
53007dc1947SRichard Lowe _dwarf_p_dealloc(dbg, space);
53107dc1947SRichard Lowe }
53207dc1947SRichard Lowe
533*4d9fdb46SRobert Mustacchi /* This is very similar to targ_address but results in a different FORM */
534*4d9fdb46SRobert Mustacchi /* dbg->de_ar_data_attribute_form is data4 or data8
535*4d9fdb46SRobert Mustacchi and dwarf4 changes the definition for such on DW_AT_high_pc.
536*4d9fdb46SRobert Mustacchi DWARF 3: the FORM here has no defined meaning for dwarf3.
537*4d9fdb46SRobert Mustacchi DWARF 4: the FORM here means that for DW_AT_high_pc the value
538*4d9fdb46SRobert Mustacchi is not a high address but is instead an offset
539*4d9fdb46SRobert Mustacchi from a (separate) DW_AT_low_pc.
540*4d9fdb46SRobert Mustacchi The intent for DWARF4 is that this is not a relocated
541*4d9fdb46SRobert Mustacchi address at all. Instead a simple offset.
542*4d9fdb46SRobert Mustacchi But this should NOT be called for a simple non-relocated offset.
543*4d9fdb46SRobert Mustacchi So do not call this with an attr of DW_AT_high_pc.
544*4d9fdb46SRobert 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(
54907dc1947SRichard Lowe Dwarf_P_Debug dbg,
55007dc1947SRichard Lowe Dwarf_P_Die ownerdie,
55107dc1947SRichard Lowe Dwarf_Half attr,
55207dc1947SRichard Lowe Dwarf_Unsigned pc_value,
55307dc1947SRichard Lowe Dwarf_Unsigned sym_index,
554*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute *attr_out,
55507dc1947SRichard Lowe Dwarf_Error * error)
55607dc1947SRichard Lowe {
557*4d9fdb46SRobert Mustacchi int res = 0;
558*4d9fdb46SRobert Mustacchi
55907dc1947SRichard Lowe /* 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;
56707dc1947SRichard Lowe }
56807dc1947SRichard Lowe
56907dc1947SRichard Lowe
570*4d9fdb46SRobert 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)571*4d9fdb46SRobert Mustacchi dwarf_add_AT_dataref(
572*4d9fdb46SRobert Mustacchi Dwarf_P_Debug dbg,
573*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
574*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
575*4d9fdb46SRobert Mustacchi Dwarf_Unsigned pc_value,
576*4d9fdb46SRobert Mustacchi Dwarf_Unsigned sym_index,
577*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
578*4d9fdb46SRobert Mustacchi {
579*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
580*4d9fdb46SRobert Mustacchi int res = 0;
581*4d9fdb46SRobert Mustacchi
582*4d9fdb46SRobert Mustacchi /* TODO: Add checking here */
583*4d9fdb46SRobert Mustacchi res = local_add_AT_address_a(dbg, ownerdie, attr,
584*4d9fdb46SRobert Mustacchi dbg->de_ar_data_attribute_form,
585*4d9fdb46SRobert Mustacchi pc_value,
586*4d9fdb46SRobert Mustacchi sym_index,
587*4d9fdb46SRobert Mustacchi &a,
588*4d9fdb46SRobert Mustacchi error);
589*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
590*4d9fdb46SRobert Mustacchi return((Dwarf_P_Attribute)DW_DLV_BADADDR);
591*4d9fdb46SRobert Mustacchi }
592*4d9fdb46SRobert Mustacchi return a;
593*4d9fdb46SRobert Mustacchi }
59407dc1947SRichard Lowe
595*4d9fdb46SRobert 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)59607dc1947SRichard Lowe dwarf_add_AT_block(
59707dc1947SRichard Lowe Dwarf_P_Debug dbg,
59807dc1947SRichard Lowe Dwarf_P_Die ownerdie,
59907dc1947SRichard Lowe Dwarf_Half attr,
60007dc1947SRichard Lowe Dwarf_Small *block_data,
60107dc1947SRichard Lowe Dwarf_Unsigned block_size,
602*4d9fdb46SRobert Mustacchi Dwarf_Error *error)
603*4d9fdb46SRobert 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)
62307dc1947SRichard Lowe {
624*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
625*4d9fdb46SRobert Mustacchi int result = 0;
62607dc1947SRichard Lowe char encode_buffer[ENCODE_SPACE_NEEDED];
627*4d9fdb46SRobert Mustacchi int len_size = 0;
628*4d9fdb46SRobert Mustacchi char * attrdata = 0;
62907dc1947SRichard Lowe
63007dc1947SRichard Lowe if (dbg == NULL) {
63107dc1947SRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
632*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
63307dc1947SRichard Lowe }
63407dc1947SRichard Lowe
63507dc1947SRichard Lowe if (ownerdie == NULL) {
63607dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
637*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
63807dc1947SRichard Lowe }
63907dc1947SRichard Lowe
64007dc1947SRichard Lowe /* I don't mess with block1, block2, block4, not worth the effort */
64107dc1947SRichard Lowe
64207dc1947SRichard Lowe /* So, encode the length into LEB128 */
64307dc1947SRichard Lowe result = _dwarf_pro_encode_leb128_nm(block_size, &len_size,
644*4d9fdb46SRobert Mustacchi encode_buffer,sizeof(encode_buffer));
64507dc1947SRichard Lowe if (result != DW_DLV_OK) {
64607dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
647*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
64807dc1947SRichard Lowe }
64907dc1947SRichard Lowe
65007dc1947SRichard Lowe /* Allocate the new attribute */
65107dc1947SRichard Lowe new_attr = (Dwarf_P_Attribute)
65207dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
65307dc1947SRichard Lowe if (new_attr == NULL) {
65407dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
655*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
65607dc1947SRichard Lowe }
65707dc1947SRichard Lowe
65807dc1947SRichard Lowe /* Fill in the attribute */
65907dc1947SRichard Lowe new_attr->ar_attribute = attr;
66007dc1947SRichard Lowe new_attr->ar_attribute_form = DW_FORM_block;
66107dc1947SRichard Lowe new_attr->ar_nbytes = len_size + block_size;
66207dc1947SRichard Lowe new_attr->ar_next = 0;
66307dc1947SRichard Lowe
66407dc1947SRichard Lowe new_attr->ar_data = attrdata = (char *)
66507dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, len_size + block_size);
66607dc1947SRichard Lowe if (new_attr->ar_data == NULL) {
66707dc1947SRichard Lowe /* free the block we got earlier */
66807dc1947SRichard Lowe _dwarf_p_dealloc(dbg, (unsigned char *) new_attr);
66907dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
670*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
67107dc1947SRichard Lowe }
67249d3bc91SRichard Lowe
67307dc1947SRichard Lowe /* write length and data to attribute data buffer */
67407dc1947SRichard Lowe memcpy(attrdata, encode_buffer, len_size);
67507dc1947SRichard Lowe attrdata += len_size;
67607dc1947SRichard Lowe memcpy(attrdata, block_data, block_size);
677*4d9fdb46SRobert Mustacchi
67849d3bc91SRichard Lowe /* add attribute to the die */
67949d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
680*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
681*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
68249d3bc91SRichard Lowe }
68349d3bc91SRichard Lowe
68449d3bc91SRichard Lowe
68549d3bc91SRichard Lowe /*
68649d3bc91SRichard Lowe This function adds attributes whose value
687*4d9fdb46SRobert Mustacchi is an unsigned constant. It determines the
688*4d9fdb46SRobert Mustacchi size of the value field from the value of
68949d3bc91SRichard Lowe the constant.
69049d3bc91SRichard Lowe */
69149d3bc91SRichard Lowe 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)69249d3bc91SRichard Lowe dwarf_add_AT_unsigned_const(Dwarf_P_Debug dbg,
693*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
694*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
695*4d9fdb46SRobert Mustacchi Dwarf_Unsigned value, Dwarf_Error * error)
69649d3bc91SRichard Lowe {
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;
72149d3bc91SRichard Lowe
72249d3bc91SRichard Lowe if (dbg == NULL) {
72307dc1947SRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
724*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
72549d3bc91SRichard Lowe }
72649d3bc91SRichard Lowe
72749d3bc91SRichard Lowe if (ownerdie == NULL) {
72807dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
729*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
73049d3bc91SRichard Lowe }
73149d3bc91SRichard Lowe
73249d3bc91SRichard Lowe switch (attr) {
73349d3bc91SRichard Lowe case DW_AT_ordering:
73449d3bc91SRichard Lowe case DW_AT_byte_size:
73549d3bc91SRichard Lowe case DW_AT_bit_offset:
73649d3bc91SRichard Lowe case DW_AT_bit_size:
73749d3bc91SRichard Lowe case DW_AT_inline:
73849d3bc91SRichard Lowe case DW_AT_language:
73949d3bc91SRichard Lowe case DW_AT_visibility:
74049d3bc91SRichard Lowe case DW_AT_virtuality:
74149d3bc91SRichard Lowe case DW_AT_accessibility:
74249d3bc91SRichard Lowe case DW_AT_address_class:
74349d3bc91SRichard Lowe case DW_AT_calling_convention:
74449d3bc91SRichard Lowe case DW_AT_encoding:
74549d3bc91SRichard Lowe case DW_AT_identifier_case:
74649d3bc91SRichard Lowe case DW_AT_MIPS_loop_unroll_factor:
74749d3bc91SRichard Lowe case DW_AT_MIPS_software_pipeline_depth:
74807dc1947SRichard Lowe break;
74949d3bc91SRichard Lowe
75049d3bc91SRichard Lowe case DW_AT_decl_column:
75149d3bc91SRichard Lowe case DW_AT_decl_file:
75249d3bc91SRichard Lowe case DW_AT_decl_line:
75349d3bc91SRichard Lowe case DW_AT_const_value:
75449d3bc91SRichard Lowe case DW_AT_start_scope:
755*4d9fdb46SRobert Mustacchi case DW_AT_stride_size: /* DW_AT_bit_stride is DWARF3 name */
75649d3bc91SRichard Lowe case DW_AT_count:
757*4d9fdb46SRobert Mustacchi case DW_AT_high_pc: /* DWARF5: allowing const udata high_pc */
75807dc1947SRichard Lowe case DW_AT_associated:
75907dc1947SRichard Lowe case DW_AT_allocated:
76007dc1947SRichard Lowe case DW_AT_upper_bound:
76107dc1947SRichard Lowe case DW_AT_lower_bound:
76207dc1947SRichard Lowe case DW_AT_call_file:
76307dc1947SRichard Lowe case DW_AT_call_line:
764*4d9fdb46SRobert Mustacchi case DW_AT_data_member_location:
765*4d9fdb46SRobert Mustacchi case DW_AT_trampoline:
76607dc1947SRichard Lowe break;
76707dc1947SRichard Lowe
768*4d9fdb46SRobert Mustacchi default:
769*4d9fdb46SRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
770*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
771*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
77207dc1947SRichard Lowe }
773*4d9fdb46SRobert Mustacchi break;
774*4d9fdb46SRobert Mustacchi }
77549d3bc91SRichard Lowe
776*4d9fdb46SRobert Mustacchi /* Compute the number of bytes needed to hold constant. */
77749d3bc91SRichard Lowe if (value <= UCHAR_MAX) {
77807dc1947SRichard Lowe attr_form = DW_FORM_data1;
77907dc1947SRichard Lowe size = 1;
78049d3bc91SRichard Lowe } else if (value <= USHRT_MAX) {
78107dc1947SRichard Lowe attr_form = DW_FORM_data2;
78207dc1947SRichard Lowe size = 2;
78349d3bc91SRichard Lowe } else if (value <= UINT_MAX) {
78407dc1947SRichard Lowe attr_form = DW_FORM_data4;
78507dc1947SRichard Lowe size = 4;
78649d3bc91SRichard Lowe } else {
78707dc1947SRichard Lowe attr_form = DW_FORM_data8;
78807dc1947SRichard Lowe size = 8;
78949d3bc91SRichard Lowe }
79049d3bc91SRichard Lowe
79149d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
79207dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
79349d3bc91SRichard Lowe if (new_attr == NULL) {
79407dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
795*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
79649d3bc91SRichard Lowe }
79749d3bc91SRichard Lowe
79849d3bc91SRichard Lowe new_attr->ar_attribute = attr;
79949d3bc91SRichard Lowe new_attr->ar_attribute_form = attr_form;
80049d3bc91SRichard Lowe new_attr->ar_rel_type = R_MIPS_NONE;
80107dc1947SRichard Lowe new_attr->ar_reloc_len = 0; /* irrelevant: unused with R_MIPS_NONE */
80249d3bc91SRichard Lowe new_attr->ar_nbytes = size;
80349d3bc91SRichard Lowe new_attr->ar_next = 0;
80449d3bc91SRichard Lowe
80549d3bc91SRichard Lowe new_attr->ar_data = (char *)
80607dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, size);
80749d3bc91SRichard Lowe if (new_attr->ar_data == NULL) {
80807dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
809*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
81049d3bc91SRichard Lowe }
81149d3bc91SRichard Lowe WRITE_UNALIGNED(dbg, new_attr->ar_data,
812*4d9fdb46SRobert Mustacchi (const void *) &value, sizeof(value), size);
81349d3bc91SRichard Lowe
81449d3bc91SRichard Lowe /* add attribute to the die */
81549d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
816*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
817*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
81849d3bc91SRichard Lowe }
81949d3bc91SRichard Lowe
82049d3bc91SRichard Lowe
821*4d9fdb46SRobert Mustacchi /* This function adds attributes whose value
822*4d9fdb46SRobert Mustacchi is an signed constant. It determines the
823*4d9fdb46SRobert Mustacchi size of the value field from the value of
824*4d9fdb46SRobert Mustacchi the constant. */
82549d3bc91SRichard Lowe 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)82649d3bc91SRichard Lowe dwarf_add_AT_signed_const(Dwarf_P_Debug dbg,
827*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
828*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
829*4d9fdb46SRobert Mustacchi Dwarf_Signed value,
830*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
83149d3bc91SRichard Lowe {
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;
85449d3bc91SRichard Lowe
85549d3bc91SRichard Lowe if (dbg == NULL) {
85607dc1947SRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
857*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
85849d3bc91SRichard Lowe }
85949d3bc91SRichard Lowe
86049d3bc91SRichard Lowe if (ownerdie == NULL) {
86107dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
862*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
86349d3bc91SRichard Lowe }
86449d3bc91SRichard Lowe
86549d3bc91SRichard Lowe switch (attr) {
86649d3bc91SRichard Lowe case DW_AT_lower_bound:
86707dc1947SRichard Lowe case DW_AT_upper_bound:
86807dc1947SRichard Lowe case DW_AT_const_value:
86907dc1947SRichard Lowe case DW_AT_bit_offset:
87007dc1947SRichard Lowe case DW_AT_bit_size:
87107dc1947SRichard Lowe case DW_AT_byte_size:
87207dc1947SRichard Lowe case DW_AT_count:
87307dc1947SRichard Lowe case DW_AT_byte_stride:
87407dc1947SRichard Lowe case DW_AT_bit_stride:
87507dc1947SRichard Lowe case DW_AT_allocated:
87607dc1947SRichard Lowe case DW_AT_associated:
87707dc1947SRichard Lowe break;
87807dc1947SRichard Lowe
879*4d9fdb46SRobert Mustacchi default:
880*4d9fdb46SRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
881*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
882*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
88307dc1947SRichard Lowe }
88407dc1947SRichard Lowe break;
88549d3bc91SRichard Lowe }
88649d3bc91SRichard Lowe
887*4d9fdb46SRobert Mustacchi /* Compute the number of bytes needed to hold constant. */
88849d3bc91SRichard Lowe if (value >= SCHAR_MIN && value <= SCHAR_MAX) {
88907dc1947SRichard Lowe attr_form = DW_FORM_data1;
89007dc1947SRichard Lowe size = 1;
89149d3bc91SRichard Lowe } else if (value >= SHRT_MIN && value <= SHRT_MAX) {
89207dc1947SRichard Lowe attr_form = DW_FORM_data2;
89307dc1947SRichard Lowe size = 2;
89449d3bc91SRichard Lowe } else if (value >= INT_MIN && value <= INT_MAX) {
89507dc1947SRichard Lowe attr_form = DW_FORM_data4;
89607dc1947SRichard Lowe size = 4;
89749d3bc91SRichard Lowe } else {
89807dc1947SRichard Lowe attr_form = DW_FORM_data8;
89907dc1947SRichard Lowe size = 8;
90049d3bc91SRichard Lowe }
90149d3bc91SRichard Lowe
90249d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
90307dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
90449d3bc91SRichard Lowe if (new_attr == NULL) {
90507dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
906*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
90749d3bc91SRichard Lowe }
90849d3bc91SRichard Lowe
90949d3bc91SRichard Lowe new_attr->ar_attribute = attr;
91049d3bc91SRichard Lowe new_attr->ar_attribute_form = attr_form;
91149d3bc91SRichard Lowe new_attr->ar_rel_type = R_MIPS_NONE;
91207dc1947SRichard Lowe new_attr->ar_reloc_len = 0; /* irrelevant: unused with R_MIPS_NONE */
91349d3bc91SRichard Lowe new_attr->ar_nbytes = size;
91449d3bc91SRichard Lowe new_attr->ar_next = 0;
91549d3bc91SRichard Lowe
91649d3bc91SRichard Lowe new_attr->ar_data = (char *)
91707dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, size);
91849d3bc91SRichard Lowe if (new_attr->ar_data == NULL) {
91907dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
920*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
92149d3bc91SRichard Lowe }
92249d3bc91SRichard Lowe WRITE_UNALIGNED(dbg, new_attr->ar_data,
923*4d9fdb46SRobert Mustacchi (const void *) &value, sizeof(value), size);
92449d3bc91SRichard Lowe
92549d3bc91SRichard Lowe /* add attribute to the die */
92649d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
927*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
928*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
92949d3bc91SRichard Lowe }
93049d3bc91SRichard Lowe
93149d3bc91SRichard Lowe
932*4d9fdb46SRobert Mustacchi /* This function adds attributes whose value
933*4d9fdb46SRobert Mustacchi is a location expression. */
93449d3bc91SRichard Lowe 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)93549d3bc91SRichard Lowe dwarf_add_AT_location_expr(Dwarf_P_Debug dbg,
936*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
937*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
938*4d9fdb46SRobert Mustacchi Dwarf_P_Expr loc_expr, Dwarf_Error * error)
939*4d9fdb46SRobert 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)
95949d3bc91SRichard Lowe {
96049d3bc91SRichard Lowe 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;
96407dc1947SRichard Lowe 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;
96849d3bc91SRichard Lowe int do_len_as_int = 0;
96949d3bc91SRichard Lowe
97049d3bc91SRichard Lowe if (dbg == NULL) {
97107dc1947SRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
972*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
97349d3bc91SRichard Lowe }
97449d3bc91SRichard Lowe
97549d3bc91SRichard Lowe if (ownerdie == NULL) {
97607dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
977*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
97849d3bc91SRichard Lowe }
97949d3bc91SRichard Lowe
98049d3bc91SRichard Lowe if (loc_expr == NULL) {
98107dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_EXPR_NULL);
982*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
98349d3bc91SRichard Lowe }
98449d3bc91SRichard Lowe
98549d3bc91SRichard Lowe if (loc_expr->ex_dbg != dbg) {
98607dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_LOC_EXPR_BAD);
987*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
98849d3bc91SRichard Lowe }
98949d3bc91SRichard Lowe block_size = loc_expr->ex_next_byte_offset;
99049d3bc91SRichard Lowe
99149d3bc91SRichard Lowe switch (attr) {
99249d3bc91SRichard Lowe case DW_AT_location:
99349d3bc91SRichard Lowe case DW_AT_string_length:
99449d3bc91SRichard Lowe case DW_AT_const_value:
99549d3bc91SRichard Lowe case DW_AT_use_location:
99649d3bc91SRichard Lowe case DW_AT_return_addr:
99749d3bc91SRichard Lowe case DW_AT_data_member_location:
99849d3bc91SRichard Lowe case DW_AT_frame_base:
99949d3bc91SRichard Lowe case DW_AT_static_link:
100049d3bc91SRichard Lowe case DW_AT_vtable_elem_location:
100107dc1947SRichard Lowe case DW_AT_lower_bound:
100207dc1947SRichard Lowe case DW_AT_upper_bound:
100307dc1947SRichard Lowe case DW_AT_count:
100407dc1947SRichard Lowe case DW_AT_associated:
100507dc1947SRichard Lowe case DW_AT_allocated:
100607dc1947SRichard Lowe case DW_AT_data_location:
100707dc1947SRichard Lowe case DW_AT_byte_stride:
100807dc1947SRichard Lowe case DW_AT_bit_stride:
100907dc1947SRichard Lowe case DW_AT_byte_size:
101007dc1947SRichard Lowe case DW_AT_bit_size:
101107dc1947SRichard Lowe break;
101207dc1947SRichard Lowe
101307dc1947SRichard Lowe default:
1014*4d9fdb46SRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
101507dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
1016*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
101707dc1947SRichard Lowe }
101807dc1947SRichard Lowe break;
101949d3bc91SRichard Lowe }
102049d3bc91SRichard Lowe
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. */
102449d3bc91SRichard Lowe if (block_size <= UCHAR_MAX) {
102507dc1947SRichard Lowe attr_form = DW_FORM_block1;
102607dc1947SRichard Lowe len_size = 1;
102707dc1947SRichard Lowe do_len_as_int = 1;
102849d3bc91SRichard Lowe } else if (block_size <= USHRT_MAX) {
102907dc1947SRichard Lowe attr_form = DW_FORM_block2;
103007dc1947SRichard Lowe len_size = 2;
103107dc1947SRichard Lowe do_len_as_int = 1;
103249d3bc91SRichard Lowe } else if (block_size <= UINT_MAX) {
103307dc1947SRichard Lowe attr_form = DW_FORM_block4;
103407dc1947SRichard Lowe len_size = 4;
103507dc1947SRichard Lowe do_len_as_int = 1;
103649d3bc91SRichard Lowe } else {
103707dc1947SRichard Lowe attr_form = DW_FORM_block;
103807dc1947SRichard Lowe res = _dwarf_pro_encode_leb128_nm(block_size, &len_size,
1039*4d9fdb46SRobert Mustacchi encode_buffer,
1040*4d9fdb46SRobert Mustacchi sizeof(encode_buffer));
104107dc1947SRichard Lowe if (res != DW_DLV_OK) {
104207dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1043*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
104407dc1947SRichard Lowe }
104507dc1947SRichard Lowe len_str = (char *) encode_buffer;
104649d3bc91SRichard Lowe }
104749d3bc91SRichard Lowe
104849d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
104907dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
105049d3bc91SRichard Lowe if (new_attr == NULL) {
105107dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1052*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
105349d3bc91SRichard Lowe }
105449d3bc91SRichard Lowe
105549d3bc91SRichard Lowe new_attr->ar_attribute = attr;
105649d3bc91SRichard Lowe new_attr->ar_attribute_form = attr_form;
105749d3bc91SRichard Lowe new_attr->ar_reloc_len = dbg->de_pointer_size;
105849d3bc91SRichard Lowe if (loc_expr->ex_reloc_sym_index != NO_ELF_SYM_INDEX) {
105907dc1947SRichard Lowe new_attr->ar_rel_type = dbg->de_ptr_reloc;
106049d3bc91SRichard Lowe } else {
106107dc1947SRichard Lowe new_attr->ar_rel_type = R_MIPS_NONE;
106249d3bc91SRichard Lowe }
106349d3bc91SRichard Lowe new_attr->ar_rel_symidx = loc_expr->ex_reloc_sym_index;
106449d3bc91SRichard Lowe new_attr->ar_rel_offset =
1065*4d9fdb46SRobert Mustacchi loc_expr->ex_reloc_offset + len_size;
106649d3bc91SRichard Lowe
106749d3bc91SRichard Lowe new_attr->ar_nbytes = block_size + len_size;
106849d3bc91SRichard Lowe
106949d3bc91SRichard Lowe new_attr->ar_next = 0;
107049d3bc91SRichard Lowe new_attr->ar_data = block_dest_ptr =
107107dc1947SRichard Lowe (char *) _dwarf_p_get_alloc(dbg, block_size + len_size);
107249d3bc91SRichard Lowe if (new_attr->ar_data == NULL) {
107307dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1074*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
107549d3bc91SRichard Lowe }
107649d3bc91SRichard Lowe
107749d3bc91SRichard Lowe if (do_len_as_int) {
107807dc1947SRichard Lowe WRITE_UNALIGNED(dbg, block_dest_ptr, (const void *) &block_size,
1079*4d9fdb46SRobert Mustacchi sizeof(block_size), len_size);
108049d3bc91SRichard Lowe } else {
108107dc1947SRichard Lowe /* Is uleb number form, DW_FORM_block. See above. */
108207dc1947SRichard Lowe memcpy(block_dest_ptr, len_str, len_size);
108349d3bc91SRichard Lowe }
108449d3bc91SRichard Lowe 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 }
109049d3bc91SRichard Lowe memcpy(block_dest_ptr, &(loc_expr->ex_byte_stream[0]), block_size);
109149d3bc91SRichard Lowe
109249d3bc91SRichard Lowe /* add attribute to the die */
109349d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1094*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1095*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
109649d3bc91SRichard Lowe }
109749d3bc91SRichard Lowe
109849d3bc91SRichard Lowe
1099*4d9fdb46SRobert Mustacchi /* This function adds attributes of reference class.
1100*4d9fdb46SRobert Mustacchi The references here are local CU references,
110149d3bc91SRichard Lowe not DW_FORM_ref_addr.
110249d3bc91SRichard Lowe The offset field is 4 bytes for 32-bit objects,
110349d3bc91SRichard Lowe and 8-bytes for 64-bit objects. Otherdie is the
110449d3bc91SRichard Lowe that is referenced by ownerdie.
110549d3bc91SRichard Lowe
110649d3bc91SRichard Lowe For reference attributes, the ar_data and ar_nbytes
110749d3bc91SRichard Lowe are not needed. Instead, the ar_ref_die points to
110849d3bc91SRichard Lowe 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)
111949d3bc91SRichard Lowe {
1120*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute new_attr = 0;
112149d3bc91SRichard Lowe
112249d3bc91SRichard Lowe if (dbg == NULL) {
112307dc1947SRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
1124*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
112549d3bc91SRichard Lowe }
112649d3bc91SRichard Lowe
112749d3bc91SRichard Lowe if (ownerdie == NULL) {
112807dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1129*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
113049d3bc91SRichard Lowe }
113149d3bc91SRichard Lowe
1132*4d9fdb46SRobert Mustacchi if (check_otherdie && (otherdie == NULL)) {
113307dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1134*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
113549d3bc91SRichard Lowe }
113649d3bc91SRichard Lowe
113749d3bc91SRichard Lowe 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:
114349d3bc91SRichard Lowe case DW_AT_discr:
114449d3bc91SRichard Lowe case DW_AT_import:
1145*4d9fdb46SRobert Mustacchi case DW_AT_common_reference:
114649d3bc91SRichard Lowe case DW_AT_containing_type:
114749d3bc91SRichard Lowe 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:
115349d3bc91SRichard Lowe case DW_AT_friend:
1154*4d9fdb46SRobert Mustacchi case DW_AT_namelist_item:
115549d3bc91SRichard Lowe case DW_AT_priority:
1156*4d9fdb46SRobert Mustacchi case DW_AT_specification:
115749d3bc91SRichard Lowe case DW_AT_type:
115807dc1947SRichard Lowe case DW_AT_allocated:
1159*4d9fdb46SRobert Mustacchi case DW_AT_associated:
116007dc1947SRichard Lowe 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:
116607dc1947SRichard Lowe break;
116707dc1947SRichard Lowe
116807dc1947SRichard Lowe default:
1169*4d9fdb46SRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
117007dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
1171*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
117207dc1947SRichard Lowe }
117307dc1947SRichard Lowe break;
117449d3bc91SRichard Lowe }
117549d3bc91SRichard Lowe
117649d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
117707dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
117849d3bc91SRichard Lowe if (new_attr == NULL) {
117907dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1180*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
118149d3bc91SRichard Lowe }
118249d3bc91SRichard Lowe
118349d3bc91SRichard Lowe new_attr->ar_attribute = attr;
118449d3bc91SRichard Lowe 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;
118749d3bc91SRichard Lowe new_attr->ar_ref_die = otherdie;
118849d3bc91SRichard Lowe new_attr->ar_rel_type = R_MIPS_NONE;
118949d3bc91SRichard Lowe new_attr->ar_next = 0;
119049d3bc91SRichard Lowe
1191*4d9fdb46SRobert Mustacchi /* Add attribute to the die */
119249d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1193*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1194*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
119549d3bc91SRichard Lowe }
119649d3bc91SRichard Lowe
1197*4d9fdb46SRobert Mustacchi /* Allowing the target die to be identified later.
1198*4d9fdb46SRobert 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
122049d3bc91SRichard Lowe
122149d3bc91SRichard Lowe 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)1222*4d9fdb46SRobert Mustacchi dwarf_add_AT_reference(Dwarf_P_Debug dbg,
1223*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
1224*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
1225*4d9fdb46SRobert Mustacchi Dwarf_P_Die otherdie, Dwarf_Error * error)
122649d3bc91SRichard Lowe {
1227*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1228*4d9fdb46SRobert Mustacchi int res = 0;
1229*4d9fdb46SRobert 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
126949d3bc91SRichard Lowe
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;
128049d3bc91SRichard Lowe if (dbg == NULL) {
128107dc1947SRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
1282*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1283*4d9fdb46SRobert 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;
1287*4d9fdb46SRobert Mustacchi break;
1288*4d9fdb46SRobert Mustacchi }
1289*4d9fdb46SRobert 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;
129349d3bc91SRichard Lowe }
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;
1300*4d9fdb46SRobert Mustacchi }
130149d3bc91SRichard Lowe
1302*4d9fdb46SRobert Mustacchi
1303*4d9fdb46SRobert Mustacchi /* This function adds attributes of the flag class. */
1304*4d9fdb46SRobert 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)1305*4d9fdb46SRobert Mustacchi dwarf_add_AT_flag(Dwarf_P_Debug dbg,
1306*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
1307*4d9fdb46SRobert Mustacchi Dwarf_Half attr,
1308*4d9fdb46SRobert Mustacchi Dwarf_Small flag,
1309*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1310*4d9fdb46SRobert 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) {
131707dc1947SRichard Lowe return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
131849d3bc91SRichard Lowe }
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;
133049d3bc91SRichard Lowe
1331*4d9fdb46SRobert Mustacchi if (dbg == NULL) {
1332*4d9fdb46SRobert Mustacchi _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
1333*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1334*4d9fdb46SRobert Mustacchi }
1335*4d9fdb46SRobert Mustacchi if (ownerdie == NULL) {
1336*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1337*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
133849d3bc91SRichard Lowe }
133949d3bc91SRichard Lowe
134049d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
134107dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
134249d3bc91SRichard Lowe if (new_attr == NULL) {
134307dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1344*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
134549d3bc91SRichard Lowe }
134649d3bc91SRichard Lowe
134749d3bc91SRichard Lowe new_attr->ar_attribute = attr;
134849d3bc91SRichard Lowe new_attr->ar_attribute_form = DW_FORM_flag;
134949d3bc91SRichard Lowe new_attr->ar_nbytes = 1;
135007dc1947SRichard Lowe new_attr->ar_reloc_len = 0; /* not used */
135149d3bc91SRichard Lowe new_attr->ar_rel_type = R_MIPS_NONE;
135249d3bc91SRichard Lowe new_attr->ar_next = 0;
135349d3bc91SRichard Lowe
135449d3bc91SRichard Lowe new_attr->ar_data = (char *)
135507dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, 1);
135649d3bc91SRichard Lowe if (new_attr->ar_data == NULL) {
135707dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1358*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
135949d3bc91SRichard Lowe }
136049d3bc91SRichard Lowe memcpy(new_attr->ar_data, &flag, 1);
136149d3bc91SRichard Lowe
1362*4d9fdb46SRobert Mustacchi /* Add attribute to the die */
136349d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1364*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1365*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
136649d3bc91SRichard Lowe }
136749d3bc91SRichard Lowe
136849d3bc91SRichard Lowe
1369*4d9fdb46SRobert Mustacchi /* This function adds values of attributes
1370*4d9fdb46SRobert Mustacchi belonging to the string class. */
137149d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_string(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,char * string,Dwarf_Error * error)137249d3bc91SRichard Lowe dwarf_add_AT_string(Dwarf_P_Debug dbg,
1373*4d9fdb46SRobert Mustacchi Dwarf_P_Die ownerdie,
1374*4d9fdb46SRobert Mustacchi Dwarf_Half attr, char *string, Dwarf_Error * error)
137549d3bc91SRichard Lowe {
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;
139749d3bc91SRichard Lowe
139849d3bc91SRichard Lowe if (dbg == NULL) {
139907dc1947SRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
1400*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
140149d3bc91SRichard Lowe }
140249d3bc91SRichard Lowe
140349d3bc91SRichard Lowe if (ownerdie == NULL) {
140407dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1405*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
140649d3bc91SRichard Lowe }
140749d3bc91SRichard Lowe
140849d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
140907dc1947SRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
141049d3bc91SRichard Lowe if (new_attr == NULL) {
141107dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1412*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
141349d3bc91SRichard Lowe }
141449d3bc91SRichard Lowe
141549d3bc91SRichard Lowe switch (attr) {
1416*4d9fdb46SRobert Mustacchi /* See also: pro_section.c for same strings attribute list. */
141749d3bc91SRichard Lowe case DW_AT_comp_dir:
141849d3bc91SRichard Lowe 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:
142349d3bc91SRichard Lowe case DW_AT_producer:
142407dc1947SRichard Lowe break;
142507dc1947SRichard Lowe
142607dc1947SRichard Lowe default:
1427*4d9fdb46SRobert Mustacchi if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
142807dc1947SRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
1429*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
143007dc1947SRichard Lowe }
143107dc1947SRichard Lowe break;
143249d3bc91SRichard Lowe }
143349d3bc91SRichard Lowe 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;
143849d3bc91SRichard Lowe }
143949d3bc91SRichard Lowe
144049d3bc91SRichard Lowe /* add attribute to the die */
144149d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1442*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1443*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
144449d3bc91SRichard Lowe }
144549d3bc91SRichard Lowe
144649d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_const_value_string(Dwarf_P_Die ownerdie,char * string_value,Dwarf_Error * error)144749d3bc91SRichard Lowe dwarf_add_AT_const_value_string(Dwarf_P_Die ownerdie,
1448*4d9fdb46SRobert Mustacchi char *string_value, Dwarf_Error * error)
144949d3bc91SRichard Lowe {
1450*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1451*4d9fdb46SRobert Mustacchi int res = 0;
1452*4d9fdb46SRobert 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;
1459*4d9fdb46SRobert Mustacchi }
1460*4d9fdb46SRobert 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;
147049d3bc91SRichard Lowe
147149d3bc91SRichard Lowe if (ownerdie == NULL) {
1472*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1473*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
147449d3bc91SRichard Lowe }
1475*4d9fdb46SRobert Mustacchi dbg = ownerdie->di_dbg;
147649d3bc91SRichard Lowe
147749d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
1478*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
147949d3bc91SRichard Lowe if (new_attr == NULL) {
1480*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1481*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
148249d3bc91SRichard Lowe }
148349d3bc91SRichard Lowe
148449d3bc91SRichard Lowe 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;
1489*4d9fdb46SRobert Mustacchi }
1490*4d9fdb46SRobert Mustacchi
1491*4d9fdb46SRobert Mustacchi /* add attribute to the die */
1492*4d9fdb46SRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1493*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1494*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1495*4d9fdb46SRobert Mustacchi }
1496*4d9fdb46SRobert 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);
153949d3bc91SRichard Lowe new_attr->ar_next = 0;
154049d3bc91SRichard Lowe
154149d3bc91SRichard Lowe new_attr->ar_data =
1542*4d9fdb46SRobert Mustacchi (char *) _dwarf_p_get_alloc(dbg, sizeof(Dwarf_Sig8));
154349d3bc91SRichard Lowe 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;
154649d3bc91SRichard Lowe }
1547*4d9fdb46SRobert Mustacchi memcpy(new_attr->ar_data,sig8_in,sizeof(Dwarf_Sig8));
154849d3bc91SRichard Lowe new_attr->ar_rel_type = R_MIPS_NONE;
154907dc1947SRichard Lowe new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
155049d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1551*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1552*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
155349d3bc91SRichard Lowe }
155449d3bc91SRichard Lowe
155549d3bc91SRichard Lowe
1556*4d9fdb46SRobert Mustacchi
155749d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_producer(Dwarf_P_Die ownerdie,char * producer_string,Dwarf_Error * error)155849d3bc91SRichard Lowe dwarf_add_AT_producer(Dwarf_P_Die ownerdie,
1559*4d9fdb46SRobert Mustacchi char *producer_string, Dwarf_Error * error)
156049d3bc91SRichard Lowe {
1561*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute a = 0;
1562*4d9fdb46SRobert Mustacchi int res = 0;
156349d3bc91SRichard Lowe
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) {
1567*4d9fdb46SRobert Mustacchi return ((Dwarf_P_Attribute)DW_DLV_BADADDR);
156849d3bc91SRichard Lowe }
1569*4d9fdb46SRobert Mustacchi return a;
1570*4d9fdb46SRobert Mustacchi }
157149d3bc91SRichard Lowe
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;
158749d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
1588*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
158949d3bc91SRichard Lowe if (new_attr == NULL) {
1590*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1591*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
159249d3bc91SRichard Lowe }
159349d3bc91SRichard Lowe
159449d3bc91SRichard Lowe 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;
1599*4d9fdb46SRobert Mustacchi }
160049d3bc91SRichard Lowe
1601*4d9fdb46SRobert Mustacchi /* add attribute to the die */
1602*4d9fdb46SRobert Mustacchi _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1603*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1604*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1605*4d9fdb46SRobert Mustacchi }
1606*4d9fdb46SRobert 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 }
1621*4d9fdb46SRobert Mustacchi
1622*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_const_value_signedint(Dwarf_P_Die ownerdie,Dwarf_Signed signed_value,Dwarf_Error * error)1623*4d9fdb46SRobert Mustacchi dwarf_add_AT_const_value_signedint(Dwarf_P_Die ownerdie,
1624*4d9fdb46SRobert Mustacchi Dwarf_Signed signed_value,
1625*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1626*4d9fdb46SRobert 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;
1649*4d9fdb46SRobert Mustacchi
1650*4d9fdb46SRobert Mustacchi if (ownerdie == NULL) {
1651*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1652*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1653*4d9fdb46SRobert Mustacchi }
1654*4d9fdb46SRobert Mustacchi dbg = ownerdie->di_dbg;
1655*4d9fdb46SRobert Mustacchi
1656*4d9fdb46SRobert Mustacchi new_attr = (Dwarf_P_Attribute)
1657*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1658*4d9fdb46SRobert Mustacchi if (new_attr == NULL) {
1659*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1660*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
166149d3bc91SRichard Lowe }
166249d3bc91SRichard Lowe
1663*4d9fdb46SRobert Mustacchi new_attr->ar_attribute = attrnum;
1664*4d9fdb46SRobert Mustacchi new_attr->ar_attribute_form = DW_FORM_implicit_const;
166549d3bc91SRichard Lowe new_attr->ar_rel_type = R_MIPS_NONE;
166607dc1947SRichard Lowe 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;
167449d3bc91SRichard Lowe
167549d3bc91SRichard Lowe /* add attribute to the die */
167649d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1677*4d9fdb46SRobert Mustacchi *outattr = new_attr;
1678*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
167949d3bc91SRichard Lowe }
168049d3bc91SRichard Lowe
168149d3bc91SRichard Lowe 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)
168649d3bc91SRichard Lowe {
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;
171049d3bc91SRichard Lowe char encode_buffer[ENCODE_SPACE_NEEDED];
1711*4d9fdb46SRobert Mustacchi int res = 0;
171249d3bc91SRichard Lowe
171349d3bc91SRichard Lowe if (ownerdie == NULL) {
1714*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1715*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
171649d3bc91SRichard Lowe }
1717*4d9fdb46SRobert Mustacchi dbg = ownerdie->di_dbg;
171849d3bc91SRichard Lowe
171949d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
1720*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
172149d3bc91SRichard Lowe if (new_attr == NULL) {
1722*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1723*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
172449d3bc91SRichard Lowe }
172549d3bc91SRichard Lowe
1726*4d9fdb46SRobert Mustacchi new_attr->ar_attribute = attrnum;
172749d3bc91SRichard Lowe new_attr->ar_attribute_form = DW_FORM_sdata;
172849d3bc91SRichard Lowe new_attr->ar_rel_type = R_MIPS_NONE;
172907dc1947SRichard Lowe new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
173049d3bc91SRichard Lowe new_attr->ar_next = 0;
173149d3bc91SRichard Lowe
173249d3bc91SRichard Lowe res = _dwarf_pro_encode_signed_leb128_nm(signed_value, &leb_size,
1733*4d9fdb46SRobert Mustacchi encode_buffer,
1734*4d9fdb46SRobert Mustacchi sizeof(encode_buffer));
173549d3bc91SRichard Lowe if (res != DW_DLV_OK) {
1736*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1737*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
173849d3bc91SRichard Lowe }
173949d3bc91SRichard Lowe new_attr->ar_data = (char *)
1740*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, leb_size);
174149d3bc91SRichard Lowe 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;
174449d3bc91SRichard Lowe }
174549d3bc91SRichard Lowe memcpy(new_attr->ar_data, encode_buffer, leb_size);
174649d3bc91SRichard Lowe new_attr->ar_nbytes = leb_size;
174749d3bc91SRichard Lowe
174849d3bc91SRichard Lowe /* add attribute to the die */
174949d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1750*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1751*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
175249d3bc91SRichard Lowe }
175349d3bc91SRichard Lowe
1754*4d9fdb46SRobert Mustacchi /* AT_const_value, uleb */
175549d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_const_value_unsignedint(Dwarf_P_Die ownerdie,Dwarf_Unsigned unsigned_value,Dwarf_Error * error)175649d3bc91SRichard Lowe dwarf_add_AT_const_value_unsignedint(Dwarf_P_Die ownerdie,
1757*4d9fdb46SRobert Mustacchi Dwarf_Unsigned unsigned_value,
1758*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1759*4d9fdb46SRobert 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)
185049d3bc91SRichard Lowe {
185149d3bc91SRichard Lowe Dwarf_P_Attribute new_attr;
185249d3bc91SRichard Lowe int leb_size;
1853*4d9fdb46SRobert Mustacchi Dwarf_P_Debug dbg = 0;
185449d3bc91SRichard Lowe char encode_buffer[ENCODE_SPACE_NEEDED];
185549d3bc91SRichard Lowe int res;
185649d3bc91SRichard Lowe
185749d3bc91SRichard Lowe if (ownerdie == NULL) {
1858*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1859*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
186049d3bc91SRichard Lowe }
1861*4d9fdb46SRobert Mustacchi dbg = ownerdie->di_dbg;
186249d3bc91SRichard Lowe new_attr = (Dwarf_P_Attribute)
1863*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
186449d3bc91SRichard Lowe if (new_attr == NULL) {
186507dc1947SRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL);
1866*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
186749d3bc91SRichard Lowe }
186849d3bc91SRichard Lowe
1869*4d9fdb46SRobert Mustacchi new_attr->ar_attribute = attrnum;
187049d3bc91SRichard Lowe new_attr->ar_attribute_form = DW_FORM_udata;
187149d3bc91SRichard Lowe new_attr->ar_rel_type = R_MIPS_NONE;
187207dc1947SRichard Lowe new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
187349d3bc91SRichard Lowe new_attr->ar_next = 0;
187449d3bc91SRichard Lowe
187549d3bc91SRichard Lowe res = _dwarf_pro_encode_leb128_nm(unsigned_value, &leb_size,
1876*4d9fdb46SRobert Mustacchi encode_buffer,
1877*4d9fdb46SRobert Mustacchi sizeof(encode_buffer));
187849d3bc91SRichard Lowe if (res != DW_DLV_OK) {
1879*4d9fdb46SRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1880*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
188149d3bc91SRichard Lowe }
188249d3bc91SRichard Lowe new_attr->ar_data = (char *)
1883*4d9fdb46SRobert Mustacchi _dwarf_p_get_alloc(dbg, leb_size);
188449d3bc91SRichard Lowe 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;
188749d3bc91SRichard Lowe }
188849d3bc91SRichard Lowe memcpy(new_attr->ar_data, encode_buffer, leb_size);
188949d3bc91SRichard Lowe new_attr->ar_nbytes = leb_size;
189049d3bc91SRichard Lowe
189149d3bc91SRichard Lowe /* add attribute to the die */
189249d3bc91SRichard Lowe _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1893*4d9fdb46SRobert Mustacchi *attr_out = new_attr;
1894*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
189549d3bc91SRichard Lowe }
1896