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