149d3bc91SRichard Lowe /*
207dc1947SRichard Lowe   Copyright (C) 2000,2004 Silicon Graphics, Inc.  All Rights Reserved.
307dc1947SRichard Lowe   Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved.
4*4d9fdb46SRobert Mustacchi   Portions Copyright 2007-2013 David Anderson. All rights reserved.
5*4d9fdb46SRobert Mustacchi   Portions Copyright 2012 SN Systems Ltd. All rights reserved.
649d3bc91SRichard Lowe 
749d3bc91SRichard Lowe   This program is free software; you can redistribute it and/or modify it
8*4d9fdb46SRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
949d3bc91SRichard Lowe   as published by the Free Software Foundation.
1049d3bc91SRichard Lowe 
1149d3bc91SRichard Lowe   This program is distributed in the hope that it would be useful, but
1249d3bc91SRichard Lowe   WITHOUT ANY WARRANTY; without even the implied warranty of
13*4d9fdb46SRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1449d3bc91SRichard Lowe 
1549d3bc91SRichard Lowe   Further, this software is distributed without any warranty that it is
16*4d9fdb46SRobert Mustacchi   free of the rightful claim of any third person regarding infringement
17*4d9fdb46SRobert Mustacchi   or the like.  Any license provided herein, whether implied or
1849d3bc91SRichard Lowe   otherwise, applies only to this software file.  Patent licenses, if
19*4d9fdb46SRobert Mustacchi   any, provided herein do not apply to combinations of this program with
20*4d9fdb46SRobert Mustacchi   other software, or any other product whatsoever.
2149d3bc91SRichard Lowe 
22*4d9fdb46SRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
23*4d9fdb46SRobert Mustacchi   License along with this program; if not, write the Free Software
2407dc1947SRichard Lowe   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
2549d3bc91SRichard Lowe   USA.
2649d3bc91SRichard Lowe 
2749d3bc91SRichard Lowe */
2849d3bc91SRichard Lowe 
2949d3bc91SRichard Lowe #include "config.h"
3049d3bc91SRichard Lowe #include "libdwarfdefs.h"
3149d3bc91SRichard Lowe #include <stdio.h>
3249d3bc91SRichard Lowe #include <string.h>
3349d3bc91SRichard Lowe #include <limits.h>
3449d3bc91SRichard Lowe #include "pro_incl.h"
35*4d9fdb46SRobert Mustacchi #include <stddef.h>
36*4d9fdb46SRobert Mustacchi #include "dwarf.h"
37*4d9fdb46SRobert Mustacchi #include "libdwarf.h"
38*4d9fdb46SRobert Mustacchi #include "pro_opaque.h"
39*4d9fdb46SRobert Mustacchi #include "pro_error.h"
40*4d9fdb46SRobert Mustacchi #include "pro_encode_nm.h"
41*4d9fdb46SRobert Mustacchi #include "pro_alloc.h"
42*4d9fdb46SRobert Mustacchi #include "pro_die.h"
4349d3bc91SRichard Lowe #include "pro_expr.h"
4449d3bc91SRichard Lowe 
4549d3bc91SRichard Lowe #ifndef R_MIPS_NONE
4649d3bc91SRichard Lowe #define R_MIPS_NONE 0
4749d3bc91SRichard Lowe #endif
4849d3bc91SRichard Lowe 
4949d3bc91SRichard Lowe 
50*4d9fdb46SRobert Mustacchi /* Indicates no relocation needed. */
5107dc1947SRichard Lowe #define NO_ELF_SYM_INDEX        0
5249d3bc91SRichard Lowe 
5349d3bc91SRichard Lowe 
54*4d9fdb46SRobert Mustacchi #ifdef WORDS_BIGENDIAN
55*4d9fdb46SRobert Mustacchi #define ASNAR(t,s,l)                   \
56*4d9fdb46SRobert Mustacchi     do {                                    \
57*4d9fdb46SRobert Mustacchi         unsigned tbyte = sizeof(t) - l;     \
58*4d9fdb46SRobert Mustacchi         t = 0;                              \
59*4d9fdb46SRobert Mustacchi         dbg->de_copy_word(((char *)&t)+tbyte ,&s[0],l);\
60*4d9fdb46SRobert Mustacchi     } while (0)
61*4d9fdb46SRobert Mustacchi #else /* LITTLE ENDIAN */
62*4d9fdb46SRobert Mustacchi #define ASNAR(t,s,l)                 \
63*4d9fdb46SRobert Mustacchi     do {                                \
64*4d9fdb46SRobert Mustacchi         t = 0;                          \
65*4d9fdb46SRobert Mustacchi         dbg->de_copy_word(&t,&s[0],l);             \
66*4d9fdb46SRobert Mustacchi     } while (0)
67*4d9fdb46SRobert Mustacchi #endif /* end LITTLE- BIG-ENDIAN */
68*4d9fdb46SRobert Mustacchi 
69*4d9fdb46SRobert Mustacchi 
70*4d9fdb46SRobert Mustacchi #ifdef WORDS_BIGENDIAN
71*4d9fdb46SRobert Mustacchi #define ASNOUT(t,s,l)                       \
72*4d9fdb46SRobert Mustacchi     do {                                    \
73*4d9fdb46SRobert Mustacchi         unsigned sbyte = 0;                 \
74*4d9fdb46SRobert Mustacchi         char *p = 0;                        \
75*4d9fdb46SRobert Mustacchi         if (l > sizeof(s)) {                \
76*4d9fdb46SRobert Mustacchi             _dwarf_p_error(dbg, error, DW_DLE_DEBUG_FRAME_LENGTH_BAD);\
77*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;            \
78*4d9fdb46SRobert Mustacchi         }                                   \
79*4d9fdb46SRobert Mustacchi         sbyte = sizeof(s) - l;              \
80*4d9fdb46SRobert Mustacchi         p = (const char *)(&s);             \
81*4d9fdb46SRobert Mustacchi         dbg->de_copy_word(t,(const void *)(p+sbyte),l);\
82*4d9fdb46SRobert Mustacchi     } while (0)
83*4d9fdb46SRobert Mustacchi #else /* LITTLEENDIAN */
84*4d9fdb46SRobert Mustacchi #define ASNOUT(t,s,l)                       \
85*4d9fdb46SRobert Mustacchi     do {                                    \
86*4d9fdb46SRobert Mustacchi         const char *p = 0;                  \
87*4d9fdb46SRobert Mustacchi         if (l > sizeof(s)) {                \
88*4d9fdb46SRobert Mustacchi             _dwarf_p_error(dbg, error, DW_DLE_DEBUG_FRAME_LENGTH_BAD);\
89*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;            \
90*4d9fdb46SRobert Mustacchi         }                                   \
91*4d9fdb46SRobert Mustacchi         p = (const char *)(&s);             \
92*4d9fdb46SRobert Mustacchi         memcpy(t,(const void *)p,l);        \
93*4d9fdb46SRobert Mustacchi         dbg->de_copy_word(t,(const void *)p,l); \
94*4d9fdb46SRobert Mustacchi     } while (0)
95*4d9fdb46SRobert Mustacchi #endif /* ENDIANNESS */
96*4d9fdb46SRobert Mustacchi 
97*4d9fdb46SRobert Mustacchi #ifdef WORDS_BIGENDIAN
98*4d9fdb46SRobert Mustacchi #define SIGN_EXTEND(dest, length)                                 \
99*4d9fdb46SRobert Mustacchi     do {                                                          \
100*4d9fdb46SRobert Mustacchi         if (*(Dwarf_Sbyte *)((char *)&dest +                      \
101*4d9fdb46SRobert Mustacchi             sizeof(dest) - length) < 0) {                         \
102*4d9fdb46SRobert Mustacchi             memcpy((char *)&dest, "\xff\xff\xff\xff\xff\xff\xff\xff",\
103*4d9fdb46SRobert Mustacchi                 sizeof(dest) - length);                           \
104*4d9fdb46SRobert Mustacchi         }                                                         \
105*4d9fdb46SRobert Mustacchi     } while (0)
106*4d9fdb46SRobert Mustacchi #else /* LITTLE ENDIAN */
107*4d9fdb46SRobert Mustacchi #define SIGN_EXTEND(dest, length)                               \
108*4d9fdb46SRobert Mustacchi     do {                                                        \
109*4d9fdb46SRobert Mustacchi         if (*(Dwarf_Sbyte *)((char *)&dest + (length-1)) < 0) { \
110*4d9fdb46SRobert Mustacchi             memcpy((char *)&dest+length,                        \
111*4d9fdb46SRobert Mustacchi                 "\xff\xff\xff\xff\xff\xff\xff\xff",             \
112*4d9fdb46SRobert Mustacchi                 sizeof(dest) - length);                         \
113*4d9fdb46SRobert Mustacchi         }                                                       \
114*4d9fdb46SRobert Mustacchi     } while (0)
115*4d9fdb46SRobert Mustacchi 
116*4d9fdb46SRobert Mustacchi #endif /* ! LITTLE_ENDIAN */
117*4d9fdb46SRobert Mustacchi 
118*4d9fdb46SRobert Mustacchi 
119*4d9fdb46SRobert Mustacchi /*  This function adds an attribute whose value is
12049d3bc91SRichard Lowe     a target address to the given die.  The attribute
12149d3bc91SRichard Lowe     is given the name provided by attr.  The address
122*4d9fdb46SRobert Mustacchi     is given in pc_value.  */
123*4d9fdb46SRobert Mustacchi 
124*4d9fdb46SRobert Mustacchi static int
125*4d9fdb46SRobert Mustacchi local_add_AT_address_a(Dwarf_P_Debug dbg,
126*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
127*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
128*4d9fdb46SRobert Mustacchi     Dwarf_Signed form,
129*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned pc_value,
130*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned sym_index,
131*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
132*4d9fdb46SRobert Mustacchi     Dwarf_Error * error);
13307dc1947SRichard Lowe 
13449d3bc91SRichard Lowe /* old interface */
13549d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_targ_address(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Signed sym_index,Dwarf_Error * error)13649d3bc91SRichard Lowe dwarf_add_AT_targ_address(Dwarf_P_Debug dbg,
137*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
138*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
139*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned pc_value,
140*4d9fdb46SRobert Mustacchi     Dwarf_Signed sym_index, Dwarf_Error * error)
14149d3bc91SRichard Lowe {
142*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
143*4d9fdb46SRobert Mustacchi     int res = 0;
144*4d9fdb46SRobert Mustacchi 
145*4d9fdb46SRobert Mustacchi     if (sym_index < 0) {
146*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
147*4d9fdb46SRobert Mustacchi     }
148*4d9fdb46SRobert Mustacchi     res =   dwarf_add_AT_targ_address_c(dbg,
149*4d9fdb46SRobert Mustacchi         ownerdie, attr, pc_value,
150*4d9fdb46SRobert Mustacchi         (Dwarf_Unsigned) sym_index,
151*4d9fdb46SRobert Mustacchi         &a,
152*4d9fdb46SRobert Mustacchi         error);
153*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
154*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
155*4d9fdb46SRobert Mustacchi     }
156*4d9fdb46SRobert Mustacchi     return a;
157*4d9fdb46SRobert Mustacchi 
15849d3bc91SRichard Lowe }
15949d3bc91SRichard Lowe 
160*4d9fdb46SRobert Mustacchi /*  New interface, replacing dwarf_add_AT_targ_address.
161*4d9fdb46SRobert Mustacchi     Essentially just makes sym_index a Dwarf_Unsigned
162*4d9fdb46SRobert Mustacchi     so for symbolic relocations it can be a full address.  */
16349d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_targ_address_b(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_Error * error)16449d3bc91SRichard Lowe dwarf_add_AT_targ_address_b(Dwarf_P_Debug dbg,
165*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
166*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
167*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned pc_value,
168*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned sym_index,
169*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
170*4d9fdb46SRobert Mustacchi {
171*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
172*4d9fdb46SRobert Mustacchi     int res = 0;
173*4d9fdb46SRobert Mustacchi 
174*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_targ_address_c(dbg,
175*4d9fdb46SRobert Mustacchi         ownerdie,attr,pc_value,sym_index,
176*4d9fdb46SRobert Mustacchi         &a, error);
177*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
178*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
179*4d9fdb46SRobert Mustacchi     }
180*4d9fdb46SRobert Mustacchi     return a;
181*4d9fdb46SRobert Mustacchi 
182*4d9fdb46SRobert Mustacchi }
183*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_targ_address_c(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)184*4d9fdb46SRobert Mustacchi dwarf_add_AT_targ_address_c(Dwarf_P_Debug dbg,
185*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
186*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
187*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned pc_value,
188*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned sym_index,
189*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
190*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
19107dc1947SRichard Lowe {
192*4d9fdb46SRobert Mustacchi     int res = 0;
193*4d9fdb46SRobert Mustacchi 
19407dc1947SRichard Lowe     switch (attr) {
19507dc1947SRichard Lowe     case DW_AT_low_pc:
19607dc1947SRichard Lowe     case DW_AT_high_pc:
19707dc1947SRichard Lowe 
19807dc1947SRichard Lowe     /* added to support location lists */
19907dc1947SRichard Lowe     /* no way to check that this is a loclist-style address though */
20007dc1947SRichard Lowe     case DW_AT_location:
20107dc1947SRichard Lowe     case DW_AT_string_length:
20207dc1947SRichard Lowe     case DW_AT_return_addr:
20307dc1947SRichard Lowe     case DW_AT_frame_base:
20407dc1947SRichard Lowe     case DW_AT_segment:
20507dc1947SRichard Lowe     case DW_AT_static_link:
20607dc1947SRichard Lowe     case DW_AT_use_location:
20707dc1947SRichard Lowe     case DW_AT_vtable_elem_location:
20807dc1947SRichard Lowe     case DW_AT_const_value: /* Gcc can generate this as address. */
20907dc1947SRichard Lowe     case DW_AT_entry_pc:
21007dc1947SRichard Lowe         break;
211*4d9fdb46SRobert Mustacchi     default:
212*4d9fdb46SRobert Mustacchi         if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
21307dc1947SRichard Lowe             _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
214*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
21507dc1947SRichard Lowe         }
21607dc1947SRichard Lowe         break;
21707dc1947SRichard Lowe     }
218*4d9fdb46SRobert Mustacchi 
219*4d9fdb46SRobert Mustacchi     res = local_add_AT_address_a(dbg, ownerdie, attr, DW_FORM_addr,
220*4d9fdb46SRobert Mustacchi         pc_value, sym_index,attr_out, error);
221*4d9fdb46SRobert Mustacchi     return res;
22207dc1947SRichard Lowe }
22307dc1947SRichard Lowe 
22407dc1947SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_ref_address(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_Error * error)22507dc1947SRichard Lowe dwarf_add_AT_ref_address(Dwarf_P_Debug dbg,
226*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
227*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
228*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned pc_value,
229*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned sym_index,
230*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
231*4d9fdb46SRobert Mustacchi {
232*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
233*4d9fdb46SRobert Mustacchi     int res = 0;
234*4d9fdb46SRobert Mustacchi 
235*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_ref_address_a(dbg,ownerdie,
236*4d9fdb46SRobert Mustacchi         attr,pc_value,sym_index,&a,error);
237*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
238*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
239*4d9fdb46SRobert Mustacchi     }
240*4d9fdb46SRobert Mustacchi     return a;
241*4d9fdb46SRobert Mustacchi }
242*4d9fdb46SRobert Mustacchi 
243*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_ref_address_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)244*4d9fdb46SRobert Mustacchi dwarf_add_AT_ref_address_a(Dwarf_P_Debug dbg,
245*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
246*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
247*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned pc_value,
248*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned sym_index,
249*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
250*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
25107dc1947SRichard Lowe {
252*4d9fdb46SRobert Mustacchi     int res = 0;
253*4d9fdb46SRobert Mustacchi 
25407dc1947SRichard Lowe     switch (attr) {
25507dc1947SRichard Lowe     case DW_AT_type:
25607dc1947SRichard Lowe     case DW_AT_import:
25707dc1947SRichard Lowe         break;
25807dc1947SRichard Lowe 
259*4d9fdb46SRobert Mustacchi     default:
260*4d9fdb46SRobert Mustacchi         if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
26107dc1947SRichard Lowe             _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
262*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
26307dc1947SRichard Lowe         }
26407dc1947SRichard Lowe         break;
26507dc1947SRichard Lowe     }
266*4d9fdb46SRobert Mustacchi 
267*4d9fdb46SRobert Mustacchi     /*  FIXME: For DWARF3 and later this call is problematic as
268*4d9fdb46SRobert Mustacchi         DW_FORM_ref_addr is really an offset in
269*4d9fdb46SRobert Mustacchi         .debug_info , not an address.  */
270*4d9fdb46SRobert Mustacchi     res = local_add_AT_address_a(dbg, ownerdie,
271*4d9fdb46SRobert Mustacchi         attr, DW_FORM_ref_addr,
272*4d9fdb46SRobert Mustacchi         pc_value, sym_index,attr_out, error);
273*4d9fdb46SRobert Mustacchi     return res;
27407dc1947SRichard Lowe }
27507dc1947SRichard Lowe 
27607dc1947SRichard Lowe 
27707dc1947SRichard Lowe /* Make sure attribute types are checked before entering here. */
278*4d9fdb46SRobert Mustacchi static int
local_add_AT_address_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Signed form,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)279*4d9fdb46SRobert Mustacchi local_add_AT_address_a(Dwarf_P_Debug dbg,
280*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
281*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
282*4d9fdb46SRobert Mustacchi     Dwarf_Signed form,
283*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned pc_value,
284*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned sym_index,
285*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
286*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
28749d3bc91SRichard Lowe {
28849d3bc91SRichard Lowe     Dwarf_P_Attribute new_attr;
289*4d9fdb46SRobert Mustacchi     int upointer_size = 0;
29049d3bc91SRichard Lowe 
29149d3bc91SRichard Lowe     if (dbg == NULL) {
29207dc1947SRichard Lowe         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
293*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
29449d3bc91SRichard Lowe     }
295*4d9fdb46SRobert Mustacchi     upointer_size = dbg->de_pointer_size;
29649d3bc91SRichard Lowe 
29749d3bc91SRichard Lowe     if (ownerdie == NULL) {
29807dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
299*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
30049d3bc91SRichard Lowe     }
30149d3bc91SRichard Lowe 
30207dc1947SRichard Lowe     /* attribute types have already been checked */
30307dc1947SRichard Lowe     /* switch (attr) { ... } */
30449d3bc91SRichard Lowe 
30549d3bc91SRichard Lowe     new_attr = (Dwarf_P_Attribute)
30607dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
30749d3bc91SRichard Lowe     if (new_attr == NULL) {
30807dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
309*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
31049d3bc91SRichard Lowe     }
31149d3bc91SRichard Lowe 
31249d3bc91SRichard Lowe     new_attr->ar_attribute = attr;
31307dc1947SRichard Lowe     new_attr->ar_attribute_form = form;
31449d3bc91SRichard Lowe     new_attr->ar_nbytes = upointer_size;
31549d3bc91SRichard Lowe     new_attr->ar_rel_symidx = sym_index;
31649d3bc91SRichard Lowe     new_attr->ar_reloc_len = upointer_size;
31749d3bc91SRichard Lowe     new_attr->ar_next = 0;
318*4d9fdb46SRobert Mustacchi     if (sym_index != NO_ELF_SYM_INDEX) {
31907dc1947SRichard Lowe         new_attr->ar_rel_type = dbg->de_ptr_reloc;
320*4d9fdb46SRobert Mustacchi     } else {
32107dc1947SRichard Lowe         new_attr->ar_rel_type = R_MIPS_NONE;
322*4d9fdb46SRobert Mustacchi     }
32349d3bc91SRichard Lowe 
32449d3bc91SRichard Lowe     new_attr->ar_data = (char *)
32507dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, upointer_size);
32649d3bc91SRichard Lowe     if (new_attr->ar_data == NULL) {
32707dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
328*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
32949d3bc91SRichard Lowe     }
33049d3bc91SRichard Lowe     WRITE_UNALIGNED(dbg, new_attr->ar_data,
331*4d9fdb46SRobert Mustacchi         (const void *) &pc_value,
332*4d9fdb46SRobert Mustacchi         sizeof(pc_value), upointer_size);
33307dc1947SRichard Lowe 
33407dc1947SRichard Lowe     /* add attribute to the die */
33507dc1947SRichard Lowe     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
336*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
337*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
33807dc1947SRichard Lowe }
33907dc1947SRichard Lowe 
340*4d9fdb46SRobert Mustacchi /*  Pass in array (ie a pointer to) of Dwarf_Signed
341*4d9fdb46SRobert Mustacchi     with input_array_length elements.
342*4d9fdb46SRobert Mustacchi 
343*4d9fdb46SRobert Mustacchi     A block of bytes is created
344*4d9fdb46SRobert Mustacchi     with the sleb data in it.
345*4d9fdb46SRobert Mustacchi 
346*4d9fdb46SRobert Mustacchi     A pointer to the glob of bytes is returned
347*4d9fdb46SRobert Mustacchi     through the output_block pointer and its length
348*4d9fdb46SRobert Mustacchi     through output_block_len pointer. */
349*4d9fdb46SRobert Mustacchi int
dwarf_compress_integer_block_a(Dwarf_P_Debug dbg,Dwarf_Unsigned input_array_length,Dwarf_Signed * input_array,Dwarf_Unsigned * output_block_len,void ** output_block_returned,Dwarf_Error * error)350*4d9fdb46SRobert Mustacchi dwarf_compress_integer_block_a(
351*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug    dbg,
352*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  input_array_length,
353*4d9fdb46SRobert Mustacchi     Dwarf_Signed *  input_array,
354*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *output_block_len,
355*4d9fdb46SRobert Mustacchi     void         ** output_block_returned,
356*4d9fdb46SRobert Mustacchi     Dwarf_Error*     error
357*4d9fdb46SRobert Mustacchi )
358*4d9fdb46SRobert Mustacchi {
359*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned output_length_in_bytes = 0;
360*4d9fdb46SRobert Mustacchi     char * output_block = 0;
361*4d9fdb46SRobert Mustacchi     char encode_buffer[ENCODE_SPACE_NEEDED];
362*4d9fdb46SRobert Mustacchi     unsigned u = 0;
363*4d9fdb46SRobert Mustacchi     char * ptr = 0;
364*4d9fdb46SRobert Mustacchi     int remain = 0;
365*4d9fdb46SRobert Mustacchi     int result = 0;
366*4d9fdb46SRobert Mustacchi 
367*4d9fdb46SRobert Mustacchi     if (dbg == NULL) {
368*4d9fdb46SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
369*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
370*4d9fdb46SRobert Mustacchi     }
371*4d9fdb46SRobert Mustacchi     /* First compress everything to find the total size. */
372*4d9fdb46SRobert Mustacchi 
373*4d9fdb46SRobert Mustacchi     output_length_in_bytes = 0;
374*4d9fdb46SRobert Mustacchi     for (u=0; u<input_array_length; u++) {
375*4d9fdb46SRobert Mustacchi         int unit_encoded_size;
376*4d9fdb46SRobert Mustacchi         Dwarf_Signed unit = 0;
377*4d9fdb46SRobert Mustacchi 
378*4d9fdb46SRobert Mustacchi         unit = input_array[u];
379*4d9fdb46SRobert Mustacchi         result = _dwarf_pro_encode_signed_leb128_nm(
380*4d9fdb46SRobert Mustacchi             unit, &unit_encoded_size,
381*4d9fdb46SRobert Mustacchi             encode_buffer,sizeof(encode_buffer));
382*4d9fdb46SRobert Mustacchi         if (result !=  DW_DLV_OK) {
383*4d9fdb46SRobert Mustacchi             _dwarf_p_error(NULL, error, DW_DLE_LEB_IMPROPER);
384*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
385*4d9fdb46SRobert Mustacchi         }
386*4d9fdb46SRobert Mustacchi         output_length_in_bytes += unit_encoded_size;
387*4d9fdb46SRobert Mustacchi     }
388*4d9fdb46SRobert Mustacchi     output_block = (void *)
389*4d9fdb46SRobert Mustacchi         _dwarf_p_get_alloc(dbg, output_length_in_bytes);
390*4d9fdb46SRobert Mustacchi     if (output_block == NULL) {
391*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
392*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
393*4d9fdb46SRobert Mustacchi     }
394*4d9fdb46SRobert Mustacchi 
395*4d9fdb46SRobert Mustacchi     /* Then compress again and copy into new buffer */
396*4d9fdb46SRobert Mustacchi     ptr = output_block;
397*4d9fdb46SRobert Mustacchi     remain = output_length_in_bytes;
398*4d9fdb46SRobert Mustacchi     for (u=0; u<input_array_length; u++) {
399*4d9fdb46SRobert Mustacchi         int unit_encoded_size;
400*4d9fdb46SRobert Mustacchi         Dwarf_Signed unit = 0;
401*4d9fdb46SRobert Mustacchi 
402*4d9fdb46SRobert Mustacchi         unit = input_array[u];
403*4d9fdb46SRobert Mustacchi         result = _dwarf_pro_encode_signed_leb128_nm(unit,
404*4d9fdb46SRobert Mustacchi             &unit_encoded_size,
405*4d9fdb46SRobert Mustacchi             ptr, remain);
406*4d9fdb46SRobert Mustacchi         if (result !=  DW_DLV_OK) {
407*4d9fdb46SRobert Mustacchi             _dwarf_p_error(NULL, error, DW_DLE_LEB_IMPROPER);
408*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
409*4d9fdb46SRobert Mustacchi         }
410*4d9fdb46SRobert Mustacchi         remain -= unit_encoded_size;
411*4d9fdb46SRobert Mustacchi         ptr += unit_encoded_size;
412*4d9fdb46SRobert Mustacchi     }
413*4d9fdb46SRobert Mustacchi 
414*4d9fdb46SRobert Mustacchi     *output_block_len = output_length_in_bytes;
415*4d9fdb46SRobert Mustacchi     *output_block_returned = output_block;
416*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
417*4d9fdb46SRobert Mustacchi }
418*4d9fdb46SRobert Mustacchi /*  Functions to compress and uncompress data from normal
419*4d9fdb46SRobert Mustacchi     arrays of integral types into arrays of LEB128 numbers.
420*4d9fdb46SRobert Mustacchi     Extend these functions as needed to handle wider input
421*4d9fdb46SRobert Mustacchi     variety.  Return values should be freed with _dwarf_p_dealloc
422*4d9fdb46SRobert Mustacchi     after they aren't needed any more.
423*4d9fdb46SRobert Mustacchi 
424*4d9fdb46SRobert Mustacchi     It is not clear there is any use to this function
425*4d9fdb46SRobert Mustacchi     as it was contributed by SUN but may not have ever
426*4d9fdb46SRobert Mustacchi     been needed in any released SUN compiler. */
42707dc1947SRichard Lowe 
428*4d9fdb46SRobert Mustacchi /* return value points to an array of LEB numbers */
42907dc1947SRichard Lowe 
43007dc1947SRichard Lowe void *
dwarf_compress_integer_block(Dwarf_P_Debug dbg,Dwarf_Bool unit_is_signed,Dwarf_Small unit_length_in_bits,void * input_block,Dwarf_Unsigned input_length_in_units,Dwarf_Unsigned * output_length_in_bytes_ptr,Dwarf_Error * error)43107dc1947SRichard Lowe dwarf_compress_integer_block(
43207dc1947SRichard Lowe     Dwarf_P_Debug    dbg,
43307dc1947SRichard Lowe     Dwarf_Bool       unit_is_signed,
43407dc1947SRichard Lowe     Dwarf_Small      unit_length_in_bits,
43507dc1947SRichard Lowe     void*            input_block,
43607dc1947SRichard Lowe     Dwarf_Unsigned   input_length_in_units,
43707dc1947SRichard Lowe     Dwarf_Unsigned*  output_length_in_bytes_ptr,
43807dc1947SRichard Lowe     Dwarf_Error*     error
43907dc1947SRichard Lowe )
44007dc1947SRichard Lowe {
44107dc1947SRichard Lowe     Dwarf_Unsigned output_length_in_bytes = 0;
44207dc1947SRichard Lowe     char * output_block = 0;
44307dc1947SRichard Lowe     char encode_buffer[ENCODE_SPACE_NEEDED];
444*4d9fdb46SRobert Mustacchi     unsigned u = 0;
44507dc1947SRichard Lowe     char * ptr = 0;
44607dc1947SRichard Lowe     int remain = 0;
44707dc1947SRichard Lowe     int result = 0;
448*4d9fdb46SRobert Mustacchi     char *inptr = 0;
44907dc1947SRichard Lowe 
45007dc1947SRichard Lowe     if (dbg == NULL) {
45107dc1947SRichard Lowe         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
45207dc1947SRichard Lowe         return((void *)DW_DLV_BADADDR);
45307dc1947SRichard Lowe     }
454*4d9fdb46SRobert Mustacchi 
45507dc1947SRichard Lowe     if (unit_is_signed == false ||
45607dc1947SRichard Lowe         unit_length_in_bits != 32 ||
45707dc1947SRichard Lowe         input_block == NULL ||
45807dc1947SRichard Lowe         input_length_in_units == 0 ||
45907dc1947SRichard Lowe         output_length_in_bytes_ptr == NULL) {
46007dc1947SRichard Lowe         _dwarf_p_error(NULL, error, DW_DLE_BADBITC);
46107dc1947SRichard Lowe         return ((void *) DW_DLV_BADADDR);
46207dc1947SRichard Lowe     }
46307dc1947SRichard Lowe 
46407dc1947SRichard Lowe     /* At this point we assume the format is: signed 32 bit */
46507dc1947SRichard Lowe 
466*4d9fdb46SRobert Mustacchi     /* First compress everything to find the total size. */
46707dc1947SRichard Lowe 
46807dc1947SRichard Lowe     output_length_in_bytes = 0;
469*4d9fdb46SRobert Mustacchi     inptr = input_block;
470*4d9fdb46SRobert Mustacchi     for (u=0; u<input_length_in_units; u++) {
47107dc1947SRichard Lowe         int unit_encoded_size;
472*4d9fdb46SRobert Mustacchi         Dwarf_Signed unit = 0;
473*4d9fdb46SRobert Mustacchi 
474*4d9fdb46SRobert Mustacchi         ASNAR(unit,inptr,DWARF_32BIT_SIZE);
475*4d9fdb46SRobert Mustacchi         SIGN_EXTEND(unit,DWARF_32BIT_SIZE);
476*4d9fdb46SRobert Mustacchi         result = _dwarf_pro_encode_signed_leb128_nm(
477*4d9fdb46SRobert Mustacchi             unit, &unit_encoded_size,
478*4d9fdb46SRobert Mustacchi             encode_buffer,sizeof(encode_buffer));
47907dc1947SRichard Lowe         if (result !=  DW_DLV_OK) {
48007dc1947SRichard Lowe             _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
48107dc1947SRichard Lowe             return((Dwarf_P_Attribute)DW_DLV_BADADDR);
48207dc1947SRichard Lowe         }
48307dc1947SRichard Lowe         output_length_in_bytes += unit_encoded_size;
484*4d9fdb46SRobert Mustacchi         inptr += DWARF_32BIT_SIZE;
48507dc1947SRichard Lowe     }
48607dc1947SRichard Lowe 
487*4d9fdb46SRobert Mustacchi     /* Then alloc */
48807dc1947SRichard Lowe     output_block = (void *)
48907dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, output_length_in_bytes);
49007dc1947SRichard Lowe     if (output_block == NULL) {
49107dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
49207dc1947SRichard Lowe         return((void*)DW_DLV_BADADDR);
49307dc1947SRichard Lowe     }
49407dc1947SRichard Lowe 
495*4d9fdb46SRobert Mustacchi     /* Then compress again and copy into new buffer */
49607dc1947SRichard Lowe     ptr = output_block;
497*4d9fdb46SRobert Mustacchi     inptr = input_block;
49807dc1947SRichard Lowe     remain = output_length_in_bytes;
499*4d9fdb46SRobert Mustacchi     for (u=0; u<input_length_in_units; u++) {
50007dc1947SRichard Lowe         int unit_encoded_size;
501*4d9fdb46SRobert Mustacchi         Dwarf_Signed unit = 0;
502*4d9fdb46SRobert Mustacchi 
503*4d9fdb46SRobert Mustacchi         ASNAR(unit,inptr,DWARF_32BIT_SIZE);
504*4d9fdb46SRobert Mustacchi         SIGN_EXTEND(unit,DWARF_32BIT_SIZE);
505*4d9fdb46SRobert Mustacchi         result = _dwarf_pro_encode_signed_leb128_nm(unit,
506*4d9fdb46SRobert Mustacchi             &unit_encoded_size,
507*4d9fdb46SRobert Mustacchi             ptr, remain);
50807dc1947SRichard Lowe         if (result !=  DW_DLV_OK) {
50907dc1947SRichard Lowe             _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
51007dc1947SRichard Lowe             return((Dwarf_P_Attribute)DW_DLV_BADADDR);
51107dc1947SRichard Lowe         }
51207dc1947SRichard Lowe         remain -= unit_encoded_size;
51307dc1947SRichard Lowe         ptr += unit_encoded_size;
514*4d9fdb46SRobert Mustacchi         inptr += DWARF_32BIT_SIZE;
51507dc1947SRichard Lowe     }
51607dc1947SRichard Lowe 
51707dc1947SRichard Lowe     if (remain != 0) {
51807dc1947SRichard Lowe         _dwarf_p_dealloc(dbg, (unsigned char *)output_block);
51907dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
52007dc1947SRichard Lowe         return((Dwarf_P_Attribute)DW_DLV_BADADDR);
52107dc1947SRichard Lowe     }
52207dc1947SRichard Lowe 
52307dc1947SRichard Lowe     *output_length_in_bytes_ptr = output_length_in_bytes;
52407dc1947SRichard Lowe     return (void*) output_block;
52507dc1947SRichard Lowe }
52607dc1947SRichard Lowe 
52707dc1947SRichard Lowe void
dwarf_dealloc_compressed_block(Dwarf_P_Debug dbg,void * space)52807dc1947SRichard Lowe dwarf_dealloc_compressed_block(Dwarf_P_Debug dbg, void * space)
52907dc1947SRichard Lowe {
53007dc1947SRichard Lowe     _dwarf_p_dealloc(dbg, space);
53107dc1947SRichard Lowe }
53207dc1947SRichard Lowe 
533*4d9fdb46SRobert Mustacchi /*  This is very similar to targ_address but results in a different FORM */
534*4d9fdb46SRobert Mustacchi /*  dbg->de_ar_data_attribute_form is data4 or data8
535*4d9fdb46SRobert Mustacchi     and dwarf4 changes the definition for such on DW_AT_high_pc.
536*4d9fdb46SRobert Mustacchi     DWARF 3: the FORM here has no defined meaning for dwarf3.
537*4d9fdb46SRobert Mustacchi     DWARF 4: the FORM here means that for DW_AT_high_pc the value
538*4d9fdb46SRobert Mustacchi         is not a high address but is instead an offset
539*4d9fdb46SRobert Mustacchi         from a (separate) DW_AT_low_pc.
540*4d9fdb46SRobert Mustacchi     The intent for DWARF4 is that this is not a relocated
541*4d9fdb46SRobert Mustacchi     address at all.  Instead a simple offset.
542*4d9fdb46SRobert Mustacchi     But this should NOT be called for a simple non-relocated offset.
543*4d9fdb46SRobert Mustacchi     So do not call this with an attr of DW_AT_high_pc.
544*4d9fdb46SRobert Mustacchi     Use dwarf_add_AT_unsigned_const() (for example) instead of
545*4d9fdb46SRobert Mustacchi     dwarf_add_AT_dataref when the value is a simple offset .  */
546*4d9fdb46SRobert Mustacchi 
547*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_dataref_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)548*4d9fdb46SRobert Mustacchi dwarf_add_AT_dataref_a(
54907dc1947SRichard Lowe     Dwarf_P_Debug dbg,
55007dc1947SRichard Lowe     Dwarf_P_Die ownerdie,
55107dc1947SRichard Lowe     Dwarf_Half attr,
55207dc1947SRichard Lowe     Dwarf_Unsigned pc_value,
55307dc1947SRichard Lowe     Dwarf_Unsigned sym_index,
554*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
55507dc1947SRichard Lowe     Dwarf_Error * error)
55607dc1947SRichard Lowe {
557*4d9fdb46SRobert Mustacchi     int res = 0;
558*4d9fdb46SRobert Mustacchi 
55907dc1947SRichard Lowe     /* TODO: Add checking here */
560*4d9fdb46SRobert Mustacchi     res = local_add_AT_address_a(dbg, ownerdie, attr,
561*4d9fdb46SRobert Mustacchi         dbg->de_ar_data_attribute_form,
562*4d9fdb46SRobert Mustacchi         pc_value,
563*4d9fdb46SRobert Mustacchi         sym_index,
564*4d9fdb46SRobert Mustacchi         attr_out,
565*4d9fdb46SRobert Mustacchi         error);
566*4d9fdb46SRobert Mustacchi     return res;
56707dc1947SRichard Lowe }
56807dc1947SRichard Lowe 
56907dc1947SRichard Lowe 
570*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_dataref(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_Error * error)571*4d9fdb46SRobert Mustacchi dwarf_add_AT_dataref(
572*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug dbg,
573*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
574*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
575*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned pc_value,
576*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned sym_index,
577*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
578*4d9fdb46SRobert Mustacchi {
579*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
580*4d9fdb46SRobert Mustacchi     int res = 0;
581*4d9fdb46SRobert Mustacchi 
582*4d9fdb46SRobert Mustacchi     /* TODO: Add checking here */
583*4d9fdb46SRobert Mustacchi     res = local_add_AT_address_a(dbg, ownerdie, attr,
584*4d9fdb46SRobert Mustacchi         dbg->de_ar_data_attribute_form,
585*4d9fdb46SRobert Mustacchi         pc_value,
586*4d9fdb46SRobert Mustacchi         sym_index,
587*4d9fdb46SRobert Mustacchi         &a,
588*4d9fdb46SRobert Mustacchi         error);
589*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
590*4d9fdb46SRobert Mustacchi         return((Dwarf_P_Attribute)DW_DLV_BADADDR);
591*4d9fdb46SRobert Mustacchi     }
592*4d9fdb46SRobert Mustacchi     return a;
593*4d9fdb46SRobert Mustacchi }
59407dc1947SRichard Lowe 
595*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_block(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Small * block_data,Dwarf_Unsigned block_size,Dwarf_Error * error)59607dc1947SRichard Lowe dwarf_add_AT_block(
59707dc1947SRichard Lowe     Dwarf_P_Debug       dbg,
59807dc1947SRichard Lowe     Dwarf_P_Die         ownerdie,
59907dc1947SRichard Lowe     Dwarf_Half          attr,
60007dc1947SRichard Lowe     Dwarf_Small         *block_data,
60107dc1947SRichard Lowe     Dwarf_Unsigned      block_size,
602*4d9fdb46SRobert Mustacchi     Dwarf_Error         *error)
603*4d9fdb46SRobert Mustacchi {
604*4d9fdb46SRobert Mustacchi     int res = 0;
605*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute   new_attr = 0;
606*4d9fdb46SRobert Mustacchi 
607*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_block_a(dbg,ownerdie,attr,
608*4d9fdb46SRobert Mustacchi         block_data,block_size,&new_attr,error);
609*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
610*4d9fdb46SRobert Mustacchi         return((Dwarf_P_Attribute)DW_DLV_BADADDR);
611*4d9fdb46SRobert Mustacchi     }
612*4d9fdb46SRobert Mustacchi     return new_attr;
613*4d9fdb46SRobert Mustacchi }
614*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_block_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Small * block_data,Dwarf_Unsigned block_size,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)615*4d9fdb46SRobert Mustacchi dwarf_add_AT_block_a(
616*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug       dbg,
617*4d9fdb46SRobert Mustacchi     Dwarf_P_Die         ownerdie,
618*4d9fdb46SRobert Mustacchi     Dwarf_Half          attr,
619*4d9fdb46SRobert Mustacchi     Dwarf_Small         *block_data,
620*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned      block_size,
621*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute*  attr_out,
622*4d9fdb46SRobert Mustacchi     Dwarf_Error         *error)
62307dc1947SRichard Lowe {
624*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute   new_attr = 0;
625*4d9fdb46SRobert Mustacchi     int result = 0;
62607dc1947SRichard Lowe     char encode_buffer[ENCODE_SPACE_NEEDED];
627*4d9fdb46SRobert Mustacchi     int len_size = 0;
628*4d9fdb46SRobert Mustacchi     char * attrdata = 0;
62907dc1947SRichard Lowe 
63007dc1947SRichard Lowe     if (dbg == NULL) {
63107dc1947SRichard Lowe         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
632*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
63307dc1947SRichard Lowe     }
63407dc1947SRichard Lowe 
63507dc1947SRichard Lowe     if (ownerdie == NULL) {
63607dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
637*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
63807dc1947SRichard Lowe     }
63907dc1947SRichard Lowe 
64007dc1947SRichard Lowe     /* I don't mess with block1, block2, block4, not worth the effort */
64107dc1947SRichard Lowe 
64207dc1947SRichard Lowe     /* So, encode the length into LEB128 */
64307dc1947SRichard Lowe     result = _dwarf_pro_encode_leb128_nm(block_size, &len_size,
644*4d9fdb46SRobert Mustacchi         encode_buffer,sizeof(encode_buffer));
64507dc1947SRichard Lowe     if (result !=  DW_DLV_OK) {
64607dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
647*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
64807dc1947SRichard Lowe     }
64907dc1947SRichard Lowe 
65007dc1947SRichard Lowe     /* Allocate the new attribute */
65107dc1947SRichard Lowe     new_attr = (Dwarf_P_Attribute)
65207dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
65307dc1947SRichard Lowe     if (new_attr == NULL) {
65407dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
655*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
65607dc1947SRichard Lowe     }
65707dc1947SRichard Lowe 
65807dc1947SRichard Lowe     /* Fill in the attribute */
65907dc1947SRichard Lowe     new_attr->ar_attribute = attr;
66007dc1947SRichard Lowe     new_attr->ar_attribute_form = DW_FORM_block;
66107dc1947SRichard Lowe     new_attr->ar_nbytes = len_size + block_size;
66207dc1947SRichard Lowe     new_attr->ar_next = 0;
66307dc1947SRichard Lowe 
66407dc1947SRichard Lowe     new_attr->ar_data = attrdata = (char *)
66507dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, len_size + block_size);
66607dc1947SRichard Lowe     if (new_attr->ar_data == NULL) {
66707dc1947SRichard Lowe         /* free the block we got earlier */
66807dc1947SRichard Lowe         _dwarf_p_dealloc(dbg, (unsigned char *) new_attr);
66907dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
670*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
67107dc1947SRichard Lowe     }
67249d3bc91SRichard Lowe 
67307dc1947SRichard Lowe     /* write length and data to attribute data buffer */
67407dc1947SRichard Lowe     memcpy(attrdata, encode_buffer, len_size);
67507dc1947SRichard Lowe     attrdata += len_size;
67607dc1947SRichard Lowe     memcpy(attrdata, block_data, block_size);
677*4d9fdb46SRobert Mustacchi 
67849d3bc91SRichard Lowe     /* add attribute to the die */
67949d3bc91SRichard Lowe     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
680*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
681*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
68249d3bc91SRichard Lowe }
68349d3bc91SRichard Lowe 
68449d3bc91SRichard Lowe 
68549d3bc91SRichard Lowe /*
68649d3bc91SRichard Lowe     This function adds attributes whose value
687*4d9fdb46SRobert Mustacchi     is an unsigned constant.  It determines the
688*4d9fdb46SRobert Mustacchi     size of the value field from the value of
68949d3bc91SRichard Lowe     the constant.
69049d3bc91SRichard Lowe */
69149d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_unsigned_const(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned value,Dwarf_Error * error)69249d3bc91SRichard Lowe dwarf_add_AT_unsigned_const(Dwarf_P_Debug dbg,
693*4d9fdb46SRobert Mustacchi    Dwarf_P_Die ownerdie,
694*4d9fdb46SRobert Mustacchi    Dwarf_Half attr,
695*4d9fdb46SRobert Mustacchi    Dwarf_Unsigned value, Dwarf_Error * error)
69649d3bc91SRichard Lowe {
697*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
698*4d9fdb46SRobert Mustacchi     int res = 0;
699*4d9fdb46SRobert Mustacchi 
700*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_unsigned_const_a(dbg,
701*4d9fdb46SRobert Mustacchi         ownerdie,attr,value,
702*4d9fdb46SRobert Mustacchi         &a,error);
703*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
704*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
705*4d9fdb46SRobert Mustacchi     }
706*4d9fdb46SRobert Mustacchi     return a;
707*4d9fdb46SRobert Mustacchi }
708*4d9fdb46SRobert Mustacchi 
709*4d9fdb46SRobert Mustacchi 
710*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_unsigned_const_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Unsigned value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)711*4d9fdb46SRobert Mustacchi dwarf_add_AT_unsigned_const_a(Dwarf_P_Debug dbg,
712*4d9fdb46SRobert Mustacchi    Dwarf_P_Die ownerdie,
713*4d9fdb46SRobert Mustacchi    Dwarf_Half attr,
714*4d9fdb46SRobert Mustacchi    Dwarf_Unsigned value,
715*4d9fdb46SRobert Mustacchi    Dwarf_P_Attribute *attr_out,
716*4d9fdb46SRobert Mustacchi    Dwarf_Error * error)
717*4d9fdb46SRobert Mustacchi {
718*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute new_attr = 0;
719*4d9fdb46SRobert Mustacchi     Dwarf_Half attr_form = 0;
720*4d9fdb46SRobert Mustacchi     Dwarf_Small size = 0;
72149d3bc91SRichard Lowe 
72249d3bc91SRichard Lowe     if (dbg == NULL) {
72307dc1947SRichard Lowe         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
724*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
72549d3bc91SRichard Lowe     }
72649d3bc91SRichard Lowe 
72749d3bc91SRichard Lowe     if (ownerdie == NULL) {
72807dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
729*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
73049d3bc91SRichard Lowe     }
73149d3bc91SRichard Lowe 
73249d3bc91SRichard Lowe     switch (attr) {
73349d3bc91SRichard Lowe     case DW_AT_ordering:
73449d3bc91SRichard Lowe     case DW_AT_byte_size:
73549d3bc91SRichard Lowe     case DW_AT_bit_offset:
73649d3bc91SRichard Lowe     case DW_AT_bit_size:
73749d3bc91SRichard Lowe     case DW_AT_inline:
73849d3bc91SRichard Lowe     case DW_AT_language:
73949d3bc91SRichard Lowe     case DW_AT_visibility:
74049d3bc91SRichard Lowe     case DW_AT_virtuality:
74149d3bc91SRichard Lowe     case DW_AT_accessibility:
74249d3bc91SRichard Lowe     case DW_AT_address_class:
74349d3bc91SRichard Lowe     case DW_AT_calling_convention:
74449d3bc91SRichard Lowe     case DW_AT_encoding:
74549d3bc91SRichard Lowe     case DW_AT_identifier_case:
74649d3bc91SRichard Lowe     case DW_AT_MIPS_loop_unroll_factor:
74749d3bc91SRichard Lowe     case DW_AT_MIPS_software_pipeline_depth:
74807dc1947SRichard Lowe         break;
74949d3bc91SRichard Lowe 
75049d3bc91SRichard Lowe     case DW_AT_decl_column:
75149d3bc91SRichard Lowe     case DW_AT_decl_file:
75249d3bc91SRichard Lowe     case DW_AT_decl_line:
75349d3bc91SRichard Lowe     case DW_AT_const_value:
75449d3bc91SRichard Lowe     case DW_AT_start_scope:
755*4d9fdb46SRobert Mustacchi     case DW_AT_stride_size: /* DW_AT_bit_stride  is DWARF3 name */
75649d3bc91SRichard Lowe     case DW_AT_count:
757*4d9fdb46SRobert Mustacchi     case DW_AT_high_pc:     /* DWARF5: allowing const udata high_pc */
75807dc1947SRichard Lowe     case DW_AT_associated:
75907dc1947SRichard Lowe     case DW_AT_allocated:
76007dc1947SRichard Lowe     case DW_AT_upper_bound:
76107dc1947SRichard Lowe     case DW_AT_lower_bound:
76207dc1947SRichard Lowe     case DW_AT_call_file:
76307dc1947SRichard Lowe     case DW_AT_call_line:
764*4d9fdb46SRobert Mustacchi     case DW_AT_data_member_location:
765*4d9fdb46SRobert Mustacchi     case DW_AT_trampoline:
76607dc1947SRichard Lowe         break;
76707dc1947SRichard Lowe 
768*4d9fdb46SRobert Mustacchi     default:
769*4d9fdb46SRobert Mustacchi         if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
770*4d9fdb46SRobert Mustacchi             _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
771*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
77207dc1947SRichard Lowe         }
773*4d9fdb46SRobert Mustacchi         break;
774*4d9fdb46SRobert Mustacchi     }
77549d3bc91SRichard Lowe 
776*4d9fdb46SRobert Mustacchi     /* Compute the number of bytes needed to hold constant. */
77749d3bc91SRichard Lowe     if (value <= UCHAR_MAX) {
77807dc1947SRichard Lowe         attr_form = DW_FORM_data1;
77907dc1947SRichard Lowe         size = 1;
78049d3bc91SRichard Lowe     } else if (value <= USHRT_MAX) {
78107dc1947SRichard Lowe         attr_form = DW_FORM_data2;
78207dc1947SRichard Lowe         size = 2;
78349d3bc91SRichard Lowe     } else if (value <= UINT_MAX) {
78407dc1947SRichard Lowe         attr_form = DW_FORM_data4;
78507dc1947SRichard Lowe         size = 4;
78649d3bc91SRichard Lowe     } else {
78707dc1947SRichard Lowe         attr_form = DW_FORM_data8;
78807dc1947SRichard Lowe         size = 8;
78949d3bc91SRichard Lowe     }
79049d3bc91SRichard Lowe 
79149d3bc91SRichard Lowe     new_attr = (Dwarf_P_Attribute)
79207dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
79349d3bc91SRichard Lowe     if (new_attr == NULL) {
79407dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
795*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
79649d3bc91SRichard Lowe     }
79749d3bc91SRichard Lowe 
79849d3bc91SRichard Lowe     new_attr->ar_attribute = attr;
79949d3bc91SRichard Lowe     new_attr->ar_attribute_form = attr_form;
80049d3bc91SRichard Lowe     new_attr->ar_rel_type = R_MIPS_NONE;
80107dc1947SRichard Lowe     new_attr->ar_reloc_len = 0; /* irrelevant: unused with R_MIPS_NONE */
80249d3bc91SRichard Lowe     new_attr->ar_nbytes = size;
80349d3bc91SRichard Lowe     new_attr->ar_next = 0;
80449d3bc91SRichard Lowe 
80549d3bc91SRichard Lowe     new_attr->ar_data = (char *)
80607dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, size);
80749d3bc91SRichard Lowe     if (new_attr->ar_data == NULL) {
80807dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
809*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
81049d3bc91SRichard Lowe     }
81149d3bc91SRichard Lowe     WRITE_UNALIGNED(dbg, new_attr->ar_data,
812*4d9fdb46SRobert Mustacchi         (const void *) &value, sizeof(value), size);
81349d3bc91SRichard Lowe 
81449d3bc91SRichard Lowe     /* add attribute to the die */
81549d3bc91SRichard Lowe     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
816*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
817*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
81849d3bc91SRichard Lowe }
81949d3bc91SRichard Lowe 
82049d3bc91SRichard Lowe 
821*4d9fdb46SRobert Mustacchi /*  This function adds attributes whose value
822*4d9fdb46SRobert Mustacchi     is an signed constant.  It determines the
823*4d9fdb46SRobert Mustacchi     size of the value field from the value of
824*4d9fdb46SRobert Mustacchi     the constant.  */
82549d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_signed_const(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Signed value,Dwarf_Error * error)82649d3bc91SRichard Lowe dwarf_add_AT_signed_const(Dwarf_P_Debug dbg,
827*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
828*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
829*4d9fdb46SRobert Mustacchi     Dwarf_Signed value,
830*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
83149d3bc91SRichard Lowe {
832*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
833*4d9fdb46SRobert Mustacchi     int res = 0;
834*4d9fdb46SRobert Mustacchi 
835*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_signed_const_a(dbg,
836*4d9fdb46SRobert Mustacchi         ownerdie,attr,value,&a,error);
837*4d9fdb46SRobert Mustacchi     if(res != DW_DLV_OK) {
838*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
839*4d9fdb46SRobert Mustacchi     }
840*4d9fdb46SRobert Mustacchi     return a;
841*4d9fdb46SRobert Mustacchi }
842*4d9fdb46SRobert Mustacchi 
843*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_signed_const_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Signed value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)844*4d9fdb46SRobert Mustacchi dwarf_add_AT_signed_const_a(Dwarf_P_Debug dbg,
845*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
846*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
847*4d9fdb46SRobert Mustacchi     Dwarf_Signed value,
848*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
849*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
850*4d9fdb46SRobert Mustacchi {
851*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute new_attr = 0;
852*4d9fdb46SRobert Mustacchi     Dwarf_Half attr_form = 0;
853*4d9fdb46SRobert Mustacchi     Dwarf_Small size = 0;
85449d3bc91SRichard Lowe 
85549d3bc91SRichard Lowe     if (dbg == NULL) {
85607dc1947SRichard Lowe         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
857*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
85849d3bc91SRichard Lowe     }
85949d3bc91SRichard Lowe 
86049d3bc91SRichard Lowe     if (ownerdie == NULL) {
86107dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
862*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
86349d3bc91SRichard Lowe     }
86449d3bc91SRichard Lowe 
86549d3bc91SRichard Lowe     switch (attr) {
86649d3bc91SRichard Lowe     case DW_AT_lower_bound:
86707dc1947SRichard Lowe     case DW_AT_upper_bound:
86807dc1947SRichard Lowe     case DW_AT_const_value:
86907dc1947SRichard Lowe     case DW_AT_bit_offset:
87007dc1947SRichard Lowe     case DW_AT_bit_size:
87107dc1947SRichard Lowe     case DW_AT_byte_size:
87207dc1947SRichard Lowe     case DW_AT_count:
87307dc1947SRichard Lowe     case DW_AT_byte_stride:
87407dc1947SRichard Lowe     case DW_AT_bit_stride:
87507dc1947SRichard Lowe     case DW_AT_allocated:
87607dc1947SRichard Lowe     case DW_AT_associated:
87707dc1947SRichard Lowe         break;
87807dc1947SRichard Lowe 
879*4d9fdb46SRobert Mustacchi     default:
880*4d9fdb46SRobert Mustacchi         if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
881*4d9fdb46SRobert Mustacchi             _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
882*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
88307dc1947SRichard Lowe         }
88407dc1947SRichard Lowe         break;
88549d3bc91SRichard Lowe     }
88649d3bc91SRichard Lowe 
887*4d9fdb46SRobert Mustacchi     /* Compute the number of bytes needed to hold constant. */
88849d3bc91SRichard Lowe     if (value >= SCHAR_MIN && value <= SCHAR_MAX) {
88907dc1947SRichard Lowe         attr_form = DW_FORM_data1;
89007dc1947SRichard Lowe         size = 1;
89149d3bc91SRichard Lowe     } else if (value >= SHRT_MIN && value <= SHRT_MAX) {
89207dc1947SRichard Lowe         attr_form = DW_FORM_data2;
89307dc1947SRichard Lowe         size = 2;
89449d3bc91SRichard Lowe     } else if (value >= INT_MIN && value <= INT_MAX) {
89507dc1947SRichard Lowe         attr_form = DW_FORM_data4;
89607dc1947SRichard Lowe         size = 4;
89749d3bc91SRichard Lowe     } else {
89807dc1947SRichard Lowe         attr_form = DW_FORM_data8;
89907dc1947SRichard Lowe         size = 8;
90049d3bc91SRichard Lowe     }
90149d3bc91SRichard Lowe 
90249d3bc91SRichard Lowe     new_attr = (Dwarf_P_Attribute)
90307dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
90449d3bc91SRichard Lowe     if (new_attr == NULL) {
90507dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
906*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
90749d3bc91SRichard Lowe     }
90849d3bc91SRichard Lowe 
90949d3bc91SRichard Lowe     new_attr->ar_attribute = attr;
91049d3bc91SRichard Lowe     new_attr->ar_attribute_form = attr_form;
91149d3bc91SRichard Lowe     new_attr->ar_rel_type = R_MIPS_NONE;
91207dc1947SRichard Lowe     new_attr->ar_reloc_len = 0; /* irrelevant: unused with R_MIPS_NONE */
91349d3bc91SRichard Lowe     new_attr->ar_nbytes = size;
91449d3bc91SRichard Lowe     new_attr->ar_next = 0;
91549d3bc91SRichard Lowe 
91649d3bc91SRichard Lowe     new_attr->ar_data = (char *)
91707dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, size);
91849d3bc91SRichard Lowe     if (new_attr->ar_data == NULL) {
91907dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
920*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
92149d3bc91SRichard Lowe     }
92249d3bc91SRichard Lowe     WRITE_UNALIGNED(dbg, new_attr->ar_data,
923*4d9fdb46SRobert Mustacchi         (const void *) &value, sizeof(value), size);
92449d3bc91SRichard Lowe 
92549d3bc91SRichard Lowe     /* add attribute to the die */
92649d3bc91SRichard Lowe     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
927*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
928*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
92949d3bc91SRichard Lowe }
93049d3bc91SRichard Lowe 
93149d3bc91SRichard Lowe 
932*4d9fdb46SRobert Mustacchi /*  This function adds attributes whose value
933*4d9fdb46SRobert Mustacchi     is a location expression.  */
93449d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_location_expr(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_P_Expr loc_expr,Dwarf_Error * error)93549d3bc91SRichard Lowe dwarf_add_AT_location_expr(Dwarf_P_Debug dbg,
936*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
937*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
938*4d9fdb46SRobert Mustacchi     Dwarf_P_Expr loc_expr, Dwarf_Error * error)
939*4d9fdb46SRobert Mustacchi {
940*4d9fdb46SRobert Mustacchi     int res = 0;
941*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
942*4d9fdb46SRobert Mustacchi 
943*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_location_expr_a(dbg,ownerdie,attr,
944*4d9fdb46SRobert Mustacchi         loc_expr,&a,error);
945*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
946*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
947*4d9fdb46SRobert Mustacchi     }
948*4d9fdb46SRobert Mustacchi     return a;
949*4d9fdb46SRobert Mustacchi }
950*4d9fdb46SRobert Mustacchi 
951*4d9fdb46SRobert Mustacchi /* Preferred interface as of December 2018 */
952*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_location_expr_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_P_Expr loc_expr,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)953*4d9fdb46SRobert Mustacchi dwarf_add_AT_location_expr_a(Dwarf_P_Debug dbg,
954*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
955*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
956*4d9fdb46SRobert Mustacchi     Dwarf_P_Expr loc_expr,
957*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
958*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
95949d3bc91SRichard Lowe {
96049d3bc91SRichard Lowe     char encode_buffer[ENCODE_SPACE_NEEDED];
961*4d9fdb46SRobert Mustacchi     int res = 0;
962*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute new_attr = 0;
963*4d9fdb46SRobert Mustacchi     Dwarf_Half attr_form = 0;
96407dc1947SRichard Lowe     char *len_str = 0;
965*4d9fdb46SRobert Mustacchi     int len_size = 0;
966*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned block_size = 0;
967*4d9fdb46SRobert Mustacchi     char *block_dest_ptr = 0;
96849d3bc91SRichard Lowe     int do_len_as_int = 0;
96949d3bc91SRichard Lowe 
97049d3bc91SRichard Lowe     if (dbg == NULL) {
97107dc1947SRichard Lowe         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
972*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
97349d3bc91SRichard Lowe     }
97449d3bc91SRichard Lowe 
97549d3bc91SRichard Lowe     if (ownerdie == NULL) {
97607dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
977*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
97849d3bc91SRichard Lowe     }
97949d3bc91SRichard Lowe 
98049d3bc91SRichard Lowe     if (loc_expr == NULL) {
98107dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_EXPR_NULL);
982*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
98349d3bc91SRichard Lowe     }
98449d3bc91SRichard Lowe 
98549d3bc91SRichard Lowe     if (loc_expr->ex_dbg != dbg) {
98607dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_LOC_EXPR_BAD);
987*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
98849d3bc91SRichard Lowe     }
98949d3bc91SRichard Lowe     block_size = loc_expr->ex_next_byte_offset;
99049d3bc91SRichard Lowe 
99149d3bc91SRichard Lowe     switch (attr) {
99249d3bc91SRichard Lowe     case DW_AT_location:
99349d3bc91SRichard Lowe     case DW_AT_string_length:
99449d3bc91SRichard Lowe     case DW_AT_const_value:
99549d3bc91SRichard Lowe     case DW_AT_use_location:
99649d3bc91SRichard Lowe     case DW_AT_return_addr:
99749d3bc91SRichard Lowe     case DW_AT_data_member_location:
99849d3bc91SRichard Lowe     case DW_AT_frame_base:
99949d3bc91SRichard Lowe     case DW_AT_static_link:
100049d3bc91SRichard Lowe     case DW_AT_vtable_elem_location:
100107dc1947SRichard Lowe     case DW_AT_lower_bound:
100207dc1947SRichard Lowe     case DW_AT_upper_bound:
100307dc1947SRichard Lowe     case DW_AT_count:
100407dc1947SRichard Lowe     case DW_AT_associated:
100507dc1947SRichard Lowe     case DW_AT_allocated:
100607dc1947SRichard Lowe     case DW_AT_data_location:
100707dc1947SRichard Lowe     case DW_AT_byte_stride:
100807dc1947SRichard Lowe     case DW_AT_bit_stride:
100907dc1947SRichard Lowe     case DW_AT_byte_size:
101007dc1947SRichard Lowe     case DW_AT_bit_size:
101107dc1947SRichard Lowe     break;
101207dc1947SRichard Lowe 
101307dc1947SRichard Lowe     default:
1014*4d9fdb46SRobert Mustacchi         if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
101507dc1947SRichard Lowe             _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
1016*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
101707dc1947SRichard Lowe         }
101807dc1947SRichard Lowe     break;
101949d3bc91SRichard Lowe     }
102049d3bc91SRichard Lowe 
1021*4d9fdb46SRobert Mustacchi     /*  Compute the number of bytes needed to hold constant.
1022*4d9fdb46SRobert Mustacchi         This is a bit fake in that the size will never
1023*4d9fdb46SRobert Mustacchi         be particularly large and always < UINT_MAX. */
102449d3bc91SRichard Lowe     if (block_size <= UCHAR_MAX) {
102507dc1947SRichard Lowe         attr_form = DW_FORM_block1;
102607dc1947SRichard Lowe         len_size = 1;
102707dc1947SRichard Lowe         do_len_as_int = 1;
102849d3bc91SRichard Lowe     } else if (block_size <= USHRT_MAX) {
102907dc1947SRichard Lowe         attr_form = DW_FORM_block2;
103007dc1947SRichard Lowe         len_size = 2;
103107dc1947SRichard Lowe         do_len_as_int = 1;
103249d3bc91SRichard Lowe     } else if (block_size <= UINT_MAX) {
103307dc1947SRichard Lowe         attr_form = DW_FORM_block4;
103407dc1947SRichard Lowe         len_size = 4;
103507dc1947SRichard Lowe         do_len_as_int = 1;
103649d3bc91SRichard Lowe     } else {
103707dc1947SRichard Lowe         attr_form = DW_FORM_block;
103807dc1947SRichard Lowe         res = _dwarf_pro_encode_leb128_nm(block_size, &len_size,
1039*4d9fdb46SRobert Mustacchi             encode_buffer,
1040*4d9fdb46SRobert Mustacchi             sizeof(encode_buffer));
104107dc1947SRichard Lowe         if (res != DW_DLV_OK) {
104207dc1947SRichard Lowe             _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1043*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
104407dc1947SRichard Lowe         }
104507dc1947SRichard Lowe         len_str = (char *) encode_buffer;
104649d3bc91SRichard Lowe     }
104749d3bc91SRichard Lowe 
104849d3bc91SRichard Lowe     new_attr = (Dwarf_P_Attribute)
104907dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
105049d3bc91SRichard Lowe     if (new_attr == NULL) {
105107dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1052*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
105349d3bc91SRichard Lowe     }
105449d3bc91SRichard Lowe 
105549d3bc91SRichard Lowe     new_attr->ar_attribute = attr;
105649d3bc91SRichard Lowe     new_attr->ar_attribute_form = attr_form;
105749d3bc91SRichard Lowe     new_attr->ar_reloc_len = dbg->de_pointer_size;
105849d3bc91SRichard Lowe     if (loc_expr->ex_reloc_sym_index != NO_ELF_SYM_INDEX) {
105907dc1947SRichard Lowe         new_attr->ar_rel_type = dbg->de_ptr_reloc;
106049d3bc91SRichard Lowe     } else {
106107dc1947SRichard Lowe         new_attr->ar_rel_type = R_MIPS_NONE;
106249d3bc91SRichard Lowe     }
106349d3bc91SRichard Lowe     new_attr->ar_rel_symidx = loc_expr->ex_reloc_sym_index;
106449d3bc91SRichard Lowe     new_attr->ar_rel_offset =
1065*4d9fdb46SRobert Mustacchi         loc_expr->ex_reloc_offset + len_size;
106649d3bc91SRichard Lowe 
106749d3bc91SRichard Lowe     new_attr->ar_nbytes = block_size + len_size;
106849d3bc91SRichard Lowe 
106949d3bc91SRichard Lowe     new_attr->ar_next = 0;
107049d3bc91SRichard Lowe     new_attr->ar_data = block_dest_ptr =
107107dc1947SRichard Lowe         (char *) _dwarf_p_get_alloc(dbg, block_size + len_size);
107249d3bc91SRichard Lowe     if (new_attr->ar_data == NULL) {
107307dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1074*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
107549d3bc91SRichard Lowe     }
107649d3bc91SRichard Lowe 
107749d3bc91SRichard Lowe     if (do_len_as_int) {
107807dc1947SRichard Lowe         WRITE_UNALIGNED(dbg, block_dest_ptr, (const void *) &block_size,
1079*4d9fdb46SRobert Mustacchi             sizeof(block_size), len_size);
108049d3bc91SRichard Lowe     } else {
108107dc1947SRichard Lowe         /* Is uleb number form, DW_FORM_block. See above. */
108207dc1947SRichard Lowe         memcpy(block_dest_ptr, len_str, len_size);
108349d3bc91SRichard Lowe     }
108449d3bc91SRichard Lowe     block_dest_ptr += len_size;
1085*4d9fdb46SRobert Mustacchi     if (block_size > sizeof(loc_expr->ex_byte_stream)) {
1086*4d9fdb46SRobert Mustacchi         /* ex_byte_stream has a fixed max value. */
1087*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_EXPR_LENGTH_BAD);
1088*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1089*4d9fdb46SRobert Mustacchi     }
109049d3bc91SRichard Lowe     memcpy(block_dest_ptr, &(loc_expr->ex_byte_stream[0]), block_size);
109149d3bc91SRichard Lowe 
109249d3bc91SRichard Lowe     /* add attribute to the die */
109349d3bc91SRichard Lowe     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1094*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
1095*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
109649d3bc91SRichard Lowe }
109749d3bc91SRichard Lowe 
109849d3bc91SRichard Lowe 
1099*4d9fdb46SRobert Mustacchi /*  This function adds attributes of reference class.
1100*4d9fdb46SRobert Mustacchi     The references here are local CU references,
110149d3bc91SRichard Lowe     not DW_FORM_ref_addr.
110249d3bc91SRichard Lowe     The offset field is 4 bytes for 32-bit objects,
110349d3bc91SRichard Lowe     and 8-bytes for 64-bit objects.  Otherdie is the
110449d3bc91SRichard Lowe     that is referenced by ownerdie.
110549d3bc91SRichard Lowe 
110649d3bc91SRichard Lowe     For reference attributes, the ar_data and ar_nbytes
110749d3bc91SRichard Lowe     are not needed.  Instead, the ar_ref_die points to
110849d3bc91SRichard Lowe     the other die, and its di_offset value is used as
1109*4d9fdb46SRobert Mustacchi     the reference value.  */
1110*4d9fdb46SRobert Mustacchi 
1111*4d9fdb46SRobert Mustacchi static int
_dwarf_add_AT_reference_internal_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_P_Die otherdie,int check_otherdie,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1112*4d9fdb46SRobert Mustacchi _dwarf_add_AT_reference_internal_a(Dwarf_P_Debug dbg,
1113*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
1114*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
1115*4d9fdb46SRobert Mustacchi     Dwarf_P_Die otherdie,
1116*4d9fdb46SRobert Mustacchi     int check_otherdie,
1117*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
1118*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
111949d3bc91SRichard Lowe {
1120*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute new_attr = 0;
112149d3bc91SRichard Lowe 
112249d3bc91SRichard Lowe     if (dbg == NULL) {
112307dc1947SRichard Lowe         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
1124*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
112549d3bc91SRichard Lowe     }
112649d3bc91SRichard Lowe 
112749d3bc91SRichard Lowe     if (ownerdie == NULL) {
112807dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1129*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
113049d3bc91SRichard Lowe     }
113149d3bc91SRichard Lowe 
1132*4d9fdb46SRobert Mustacchi     if (check_otherdie && (otherdie == NULL)) {
113307dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1134*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
113549d3bc91SRichard Lowe     }
113649d3bc91SRichard Lowe 
113749d3bc91SRichard Lowe     switch (attr) {
1138*4d9fdb46SRobert Mustacchi     case DW_AT_count:
1139*4d9fdb46SRobert Mustacchi     case DW_AT_sibling:
1140*4d9fdb46SRobert Mustacchi     case DW_AT_byte_size:
1141*4d9fdb46SRobert Mustacchi     case DW_AT_bit_offset:
1142*4d9fdb46SRobert Mustacchi     case DW_AT_bit_size:
114349d3bc91SRichard Lowe     case DW_AT_discr:
114449d3bc91SRichard Lowe     case DW_AT_import:
1145*4d9fdb46SRobert Mustacchi     case DW_AT_common_reference:
114649d3bc91SRichard Lowe     case DW_AT_containing_type:
114749d3bc91SRichard Lowe     case DW_AT_default_value:
1148*4d9fdb46SRobert Mustacchi     case DW_AT_lower_bound:
1149*4d9fdb46SRobert Mustacchi     case DW_AT_bit_stride: /* Early name is DW_AT_stride_size */
1150*4d9fdb46SRobert Mustacchi     case DW_AT_upper_bound:
1151*4d9fdb46SRobert Mustacchi     case DW_AT_abstract_origin:
1152*4d9fdb46SRobert Mustacchi     case DW_AT_base_types:
115349d3bc91SRichard Lowe     case DW_AT_friend:
1154*4d9fdb46SRobert Mustacchi     case DW_AT_namelist_item:
115549d3bc91SRichard Lowe     case DW_AT_priority:
1156*4d9fdb46SRobert Mustacchi     case DW_AT_specification:
115749d3bc91SRichard Lowe     case DW_AT_type:
115807dc1947SRichard Lowe     case DW_AT_allocated:
1159*4d9fdb46SRobert Mustacchi     case DW_AT_associated:
116007dc1947SRichard Lowe     case DW_AT_byte_stride:
1161*4d9fdb46SRobert Mustacchi     case DW_AT_extension:
1162*4d9fdb46SRobert Mustacchi     case DW_AT_trampoline:
1163*4d9fdb46SRobert Mustacchi     case DW_AT_small:
1164*4d9fdb46SRobert Mustacchi     case DW_AT_object_pointer:
1165*4d9fdb46SRobert Mustacchi     case DW_AT_signature:
116607dc1947SRichard Lowe         break;
116707dc1947SRichard Lowe 
116807dc1947SRichard Lowe     default:
1169*4d9fdb46SRobert Mustacchi         if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
117007dc1947SRichard Lowe             _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
1171*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
117207dc1947SRichard Lowe         }
117307dc1947SRichard Lowe         break;
117449d3bc91SRichard Lowe     }
117549d3bc91SRichard Lowe 
117649d3bc91SRichard Lowe     new_attr = (Dwarf_P_Attribute)
117707dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
117849d3bc91SRichard Lowe     if (new_attr == NULL) {
117907dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1180*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
118149d3bc91SRichard Lowe     }
118249d3bc91SRichard Lowe 
118349d3bc91SRichard Lowe     new_attr->ar_attribute = attr;
118449d3bc91SRichard Lowe     new_attr->ar_attribute_form = dbg->de_ar_ref_attr_form;
1185*4d9fdb46SRobert Mustacchi     new_attr->ar_nbytes = dbg->de_dwarf_offset_size;
1186*4d9fdb46SRobert Mustacchi     new_attr->ar_reloc_len = dbg->de_dwarf_offset_size;
118749d3bc91SRichard Lowe     new_attr->ar_ref_die = otherdie;
118849d3bc91SRichard Lowe     new_attr->ar_rel_type = R_MIPS_NONE;
118949d3bc91SRichard Lowe     new_attr->ar_next = 0;
119049d3bc91SRichard Lowe 
1191*4d9fdb46SRobert Mustacchi     /* Add attribute to the die */
119249d3bc91SRichard Lowe     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1193*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
1194*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
119549d3bc91SRichard Lowe }
119649d3bc91SRichard Lowe 
1197*4d9fdb46SRobert Mustacchi /*  Allowing the target die to be identified later.
1198*4d9fdb46SRobert Mustacchi     */
1199*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_reference_c(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_P_Die otherdie,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1200*4d9fdb46SRobert Mustacchi dwarf_add_AT_reference_c(Dwarf_P_Debug dbg,
1201*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
1202*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
1203*4d9fdb46SRobert Mustacchi     Dwarf_P_Die otherdie,
1204*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
1205*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1206*4d9fdb46SRobert Mustacchi {
1207*4d9fdb46SRobert Mustacchi     int res = 0;
1208*4d9fdb46SRobert Mustacchi 
1209*4d9fdb46SRobert Mustacchi     res = _dwarf_add_AT_reference_internal_a(dbg,
1210*4d9fdb46SRobert Mustacchi         ownerdie,
1211*4d9fdb46SRobert Mustacchi         attr,
1212*4d9fdb46SRobert Mustacchi         otherdie,
1213*4d9fdb46SRobert Mustacchi         /* check otherdie */ 0,
1214*4d9fdb46SRobert Mustacchi         attr_out,
1215*4d9fdb46SRobert Mustacchi         error);
1216*4d9fdb46SRobert Mustacchi     return res;
1217*4d9fdb46SRobert Mustacchi }
1218*4d9fdb46SRobert Mustacchi 
1219*4d9fdb46SRobert Mustacchi 
122049d3bc91SRichard Lowe 
122149d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_reference(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_P_Die otherdie,Dwarf_Error * error)1222*4d9fdb46SRobert Mustacchi dwarf_add_AT_reference(Dwarf_P_Debug dbg,
1223*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
1224*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
1225*4d9fdb46SRobert Mustacchi     Dwarf_P_Die otherdie, Dwarf_Error * error)
122649d3bc91SRichard Lowe {
1227*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
1228*4d9fdb46SRobert Mustacchi     int res = 0;
1229*4d9fdb46SRobert Mustacchi 
1230*4d9fdb46SRobert Mustacchi     res = _dwarf_add_AT_reference_internal_a(dbg,
1231*4d9fdb46SRobert Mustacchi         ownerdie,
1232*4d9fdb46SRobert Mustacchi         attr,
1233*4d9fdb46SRobert Mustacchi         otherdie,
1234*4d9fdb46SRobert Mustacchi         /* check otherdie */ 1,
1235*4d9fdb46SRobert Mustacchi         &a,
1236*4d9fdb46SRobert Mustacchi         error);
1237*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1238*4d9fdb46SRobert Mustacchi         return (Dwarf_P_Attribute)DW_DLV_BADADDR;
1239*4d9fdb46SRobert Mustacchi     }
1240*4d9fdb46SRobert Mustacchi     return a;
1241*4d9fdb46SRobert Mustacchi }
1242*4d9fdb46SRobert Mustacchi 
1243*4d9fdb46SRobert Mustacchi /*  Allowing the target die to be identified later.
1244*4d9fdb46SRobert Mustacchi     */
1245*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_reference_b(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_P_Die otherdie,Dwarf_Error * error)1246*4d9fdb46SRobert Mustacchi dwarf_add_AT_reference_b(Dwarf_P_Debug dbg,
1247*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
1248*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
1249*4d9fdb46SRobert Mustacchi     Dwarf_P_Die otherdie,
1250*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1251*4d9fdb46SRobert Mustacchi {
1252*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
1253*4d9fdb46SRobert Mustacchi     int res = 0;
1254*4d9fdb46SRobert Mustacchi 
1255*4d9fdb46SRobert Mustacchi     res = _dwarf_add_AT_reference_internal_a(dbg,
1256*4d9fdb46SRobert Mustacchi         ownerdie,
1257*4d9fdb46SRobert Mustacchi         attr,
1258*4d9fdb46SRobert Mustacchi         otherdie,
1259*4d9fdb46SRobert Mustacchi         /* check otherdie */ 0,
1260*4d9fdb46SRobert Mustacchi         &a,
1261*4d9fdb46SRobert Mustacchi         error);
1262*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1263*4d9fdb46SRobert Mustacchi         return (Dwarf_P_Attribute)DW_DLV_BADADDR;
1264*4d9fdb46SRobert Mustacchi     }
1265*4d9fdb46SRobert Mustacchi     return a;
1266*4d9fdb46SRobert Mustacchi }
1267*4d9fdb46SRobert Mustacchi 
1268*4d9fdb46SRobert Mustacchi 
126949d3bc91SRichard Lowe 
1270*4d9fdb46SRobert Mustacchi 
1271*4d9fdb46SRobert Mustacchi int
dwarf_fixup_AT_reference_die(Dwarf_P_Debug dbg,Dwarf_Half attrnum,Dwarf_P_Die sourcedie,Dwarf_P_Die targetdie,Dwarf_Error * error)1272*4d9fdb46SRobert Mustacchi dwarf_fixup_AT_reference_die(Dwarf_P_Debug dbg,
1273*4d9fdb46SRobert Mustacchi    Dwarf_Half attrnum,
1274*4d9fdb46SRobert Mustacchi    Dwarf_P_Die sourcedie,
1275*4d9fdb46SRobert Mustacchi    Dwarf_P_Die targetdie,
1276*4d9fdb46SRobert Mustacchi    Dwarf_Error *error)
1277*4d9fdb46SRobert Mustacchi {
1278*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
1279*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute cur = 0;
128049d3bc91SRichard Lowe     if (dbg == NULL) {
128107dc1947SRichard Lowe         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
1282*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1283*4d9fdb46SRobert Mustacchi     }
1284*4d9fdb46SRobert Mustacchi     for(cur = sourcedie->di_attrs; cur; cur = cur->ar_next) {
1285*4d9fdb46SRobert Mustacchi         if (attrnum == cur->ar_attribute) {
1286*4d9fdb46SRobert Mustacchi             a = cur;
1287*4d9fdb46SRobert Mustacchi             break;
1288*4d9fdb46SRobert Mustacchi         }
1289*4d9fdb46SRobert Mustacchi     }
1290*4d9fdb46SRobert Mustacchi     if(!a) {
1291*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_AT_FIXUP_NULL);
1292*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
129349d3bc91SRichard Lowe     }
1294*4d9fdb46SRobert Mustacchi     if(a->ar_ref_die) {
1295*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_AT_FIXUP_DUP);
1296*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1297*4d9fdb46SRobert Mustacchi     }
1298*4d9fdb46SRobert Mustacchi     a->ar_ref_die = targetdie;
1299*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1300*4d9fdb46SRobert Mustacchi }
130149d3bc91SRichard Lowe 
1302*4d9fdb46SRobert Mustacchi 
1303*4d9fdb46SRobert Mustacchi /* This function adds attributes of the flag class.  */
1304*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_flag(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Small flag,Dwarf_Error * error)1305*4d9fdb46SRobert Mustacchi dwarf_add_AT_flag(Dwarf_P_Debug dbg,
1306*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
1307*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
1308*4d9fdb46SRobert Mustacchi     Dwarf_Small flag,
1309*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1310*4d9fdb46SRobert Mustacchi {
1311*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
1312*4d9fdb46SRobert Mustacchi     int res = 0;
1313*4d9fdb46SRobert Mustacchi 
1314*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_flag_a(dbg,ownerdie,attr,flag,
1315*4d9fdb46SRobert Mustacchi         &a,error);
1316*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
131707dc1947SRichard Lowe         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
131849d3bc91SRichard Lowe     }
1319*4d9fdb46SRobert Mustacchi     return a;
1320*4d9fdb46SRobert Mustacchi }
1321*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_flag_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,Dwarf_Small flag,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1322*4d9fdb46SRobert Mustacchi dwarf_add_AT_flag_a(Dwarf_P_Debug dbg,
1323*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
1324*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
1325*4d9fdb46SRobert Mustacchi     Dwarf_Small flag,
1326*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute * attr_out,
1327*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1328*4d9fdb46SRobert Mustacchi {
1329*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute new_attr = 0;
133049d3bc91SRichard Lowe 
1331*4d9fdb46SRobert Mustacchi     if (dbg == NULL) {
1332*4d9fdb46SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
1333*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1334*4d9fdb46SRobert Mustacchi     }
1335*4d9fdb46SRobert Mustacchi     if (ownerdie == NULL) {
1336*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1337*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
133849d3bc91SRichard Lowe     }
133949d3bc91SRichard Lowe 
134049d3bc91SRichard Lowe     new_attr = (Dwarf_P_Attribute)
134107dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
134249d3bc91SRichard Lowe     if (new_attr == NULL) {
134307dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1344*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
134549d3bc91SRichard Lowe     }
134649d3bc91SRichard Lowe 
134749d3bc91SRichard Lowe     new_attr->ar_attribute = attr;
134849d3bc91SRichard Lowe     new_attr->ar_attribute_form = DW_FORM_flag;
134949d3bc91SRichard Lowe     new_attr->ar_nbytes = 1;
135007dc1947SRichard Lowe     new_attr->ar_reloc_len = 0; /* not used */
135149d3bc91SRichard Lowe     new_attr->ar_rel_type = R_MIPS_NONE;
135249d3bc91SRichard Lowe     new_attr->ar_next = 0;
135349d3bc91SRichard Lowe 
135449d3bc91SRichard Lowe     new_attr->ar_data = (char *)
135507dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, 1);
135649d3bc91SRichard Lowe     if (new_attr->ar_data == NULL) {
135707dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1358*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
135949d3bc91SRichard Lowe     }
136049d3bc91SRichard Lowe     memcpy(new_attr->ar_data, &flag, 1);
136149d3bc91SRichard Lowe 
1362*4d9fdb46SRobert Mustacchi     /* Add attribute to the die */
136349d3bc91SRichard Lowe     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1364*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
1365*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
136649d3bc91SRichard Lowe }
136749d3bc91SRichard Lowe 
136849d3bc91SRichard Lowe 
1369*4d9fdb46SRobert Mustacchi /*  This function adds values of attributes
1370*4d9fdb46SRobert Mustacchi     belonging to the string class. */
137149d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_string(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,char * string,Dwarf_Error * error)137249d3bc91SRichard Lowe dwarf_add_AT_string(Dwarf_P_Debug dbg,
1373*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
1374*4d9fdb46SRobert Mustacchi     Dwarf_Half attr, char *string, Dwarf_Error * error)
137549d3bc91SRichard Lowe {
1376*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
1377*4d9fdb46SRobert Mustacchi     int res = 0;
1378*4d9fdb46SRobert Mustacchi 
1379*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_string_a(dbg,
1380*4d9fdb46SRobert Mustacchi         ownerdie,attr,string,&a,error);
1381*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1382*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
1383*4d9fdb46SRobert Mustacchi     }
1384*4d9fdb46SRobert Mustacchi     return a;
1385*4d9fdb46SRobert Mustacchi }
1386*4d9fdb46SRobert Mustacchi 
1387*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_string_a(Dwarf_P_Debug dbg,Dwarf_P_Die ownerdie,Dwarf_Half attr,char * string,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1388*4d9fdb46SRobert Mustacchi dwarf_add_AT_string_a(Dwarf_P_Debug dbg,
1389*4d9fdb46SRobert Mustacchi     Dwarf_P_Die ownerdie,
1390*4d9fdb46SRobert Mustacchi     Dwarf_Half attr,
1391*4d9fdb46SRobert Mustacchi     char *string,
1392*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
1393*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1394*4d9fdb46SRobert Mustacchi {
1395*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute new_attr = 0;
1396*4d9fdb46SRobert Mustacchi     int res = 0;
139749d3bc91SRichard Lowe 
139849d3bc91SRichard Lowe     if (dbg == NULL) {
139907dc1947SRichard Lowe         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
1400*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
140149d3bc91SRichard Lowe     }
140249d3bc91SRichard Lowe 
140349d3bc91SRichard Lowe     if (ownerdie == NULL) {
140407dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1405*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
140649d3bc91SRichard Lowe     }
140749d3bc91SRichard Lowe 
140849d3bc91SRichard Lowe     new_attr = (Dwarf_P_Attribute)
140907dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
141049d3bc91SRichard Lowe     if (new_attr == NULL) {
141107dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1412*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
141349d3bc91SRichard Lowe     }
141449d3bc91SRichard Lowe 
141549d3bc91SRichard Lowe     switch (attr) {
1416*4d9fdb46SRobert Mustacchi     /* See also: pro_section.c for same strings attribute list. */
141749d3bc91SRichard Lowe     case DW_AT_comp_dir:
141849d3bc91SRichard Lowe     case DW_AT_const_value:
1419*4d9fdb46SRobert Mustacchi     case DW_AT_linkage_name:/* DWARF5, but ok for any version really.*/
1420*4d9fdb46SRobert Mustacchi     case DW_AT_MIPS_abstract_name:
1421*4d9fdb46SRobert Mustacchi     case DW_AT_MIPS_linkage_name:
1422*4d9fdb46SRobert Mustacchi     case DW_AT_name:
142349d3bc91SRichard Lowe     case DW_AT_producer:
142407dc1947SRichard Lowe         break;
142507dc1947SRichard Lowe 
142607dc1947SRichard Lowe         default:
1427*4d9fdb46SRobert Mustacchi             if (attr < DW_AT_lo_user || attr > DW_AT_hi_user ) {
142807dc1947SRichard Lowe             _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD);
1429*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
143007dc1947SRichard Lowe         }
143107dc1947SRichard Lowe             break;
143249d3bc91SRichard Lowe     }
143349d3bc91SRichard Lowe     new_attr->ar_attribute = attr;
1434*4d9fdb46SRobert Mustacchi     res = _dwarf_pro_set_string_attr(new_attr,ownerdie->di_dbg,
1435*4d9fdb46SRobert Mustacchi         string,error);
1436*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1437*4d9fdb46SRobert Mustacchi         return res;
143849d3bc91SRichard Lowe     }
143949d3bc91SRichard Lowe 
144049d3bc91SRichard Lowe     /* add attribute to the die */
144149d3bc91SRichard Lowe     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1442*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
1443*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
144449d3bc91SRichard Lowe }
144549d3bc91SRichard Lowe 
144649d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_const_value_string(Dwarf_P_Die ownerdie,char * string_value,Dwarf_Error * error)144749d3bc91SRichard Lowe dwarf_add_AT_const_value_string(Dwarf_P_Die ownerdie,
1448*4d9fdb46SRobert Mustacchi     char *string_value, Dwarf_Error * error)
144949d3bc91SRichard Lowe {
1450*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
1451*4d9fdb46SRobert Mustacchi     int res = 0;
1452*4d9fdb46SRobert Mustacchi 
1453*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_const_value_string_a(ownerdie,
1454*4d9fdb46SRobert Mustacchi         string_value,&a,error);
1455*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1456*4d9fdb46SRobert Mustacchi         return (Dwarf_P_Attribute) DW_DLV_BADADDR;
1457*4d9fdb46SRobert Mustacchi     }
1458*4d9fdb46SRobert Mustacchi     return a;
1459*4d9fdb46SRobert Mustacchi }
1460*4d9fdb46SRobert Mustacchi 
1461*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_const_value_string_a(Dwarf_P_Die ownerdie,char * string_value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1462*4d9fdb46SRobert Mustacchi dwarf_add_AT_const_value_string_a(Dwarf_P_Die ownerdie,
1463*4d9fdb46SRobert Mustacchi     char *string_value,
1464*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
1465*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1466*4d9fdb46SRobert Mustacchi {
1467*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute new_attr = 0;
1468*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug dbg = 0;
1469*4d9fdb46SRobert Mustacchi     int res = 0;
147049d3bc91SRichard Lowe 
147149d3bc91SRichard Lowe     if (ownerdie == NULL) {
1472*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1473*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
147449d3bc91SRichard Lowe     }
1475*4d9fdb46SRobert Mustacchi     dbg = ownerdie->di_dbg;
147649d3bc91SRichard Lowe 
147749d3bc91SRichard Lowe     new_attr = (Dwarf_P_Attribute)
1478*4d9fdb46SRobert Mustacchi         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
147949d3bc91SRichard Lowe     if (new_attr == NULL) {
1480*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1481*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
148249d3bc91SRichard Lowe     }
148349d3bc91SRichard Lowe 
148449d3bc91SRichard Lowe     new_attr->ar_attribute = DW_AT_const_value;
1485*4d9fdb46SRobert Mustacchi     res = _dwarf_pro_set_string_attr(new_attr,dbg,
1486*4d9fdb46SRobert Mustacchi         string_value,error);
1487*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1488*4d9fdb46SRobert Mustacchi         return res;
1489*4d9fdb46SRobert Mustacchi     }
1490*4d9fdb46SRobert Mustacchi 
1491*4d9fdb46SRobert Mustacchi     /* add attribute to the die */
1492*4d9fdb46SRobert Mustacchi     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1493*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
1494*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1495*4d9fdb46SRobert Mustacchi }
1496*4d9fdb46SRobert Mustacchi 
1497*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_with_ref_sig8(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,const Dwarf_Sig8 * sig8_in,Dwarf_Error * error)1498*4d9fdb46SRobert Mustacchi dwarf_add_AT_with_ref_sig8(Dwarf_P_Die ownerdie,
1499*4d9fdb46SRobert Mustacchi     Dwarf_Half attrnum,
1500*4d9fdb46SRobert Mustacchi     const Dwarf_Sig8 *sig8_in,
1501*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1502*4d9fdb46SRobert Mustacchi {
1503*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
1504*4d9fdb46SRobert Mustacchi     int res = 0;
1505*4d9fdb46SRobert Mustacchi 
1506*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_with_ref_sig8_a(ownerdie,
1507*4d9fdb46SRobert Mustacchi         attrnum,sig8_in,&a,error);
1508*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1509*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
1510*4d9fdb46SRobert Mustacchi     }
1511*4d9fdb46SRobert Mustacchi     return a;
1512*4d9fdb46SRobert Mustacchi }
1513*4d9fdb46SRobert Mustacchi 
1514*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_with_ref_sig8_a(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,const Dwarf_Sig8 * sig8_in,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1515*4d9fdb46SRobert Mustacchi dwarf_add_AT_with_ref_sig8_a(Dwarf_P_Die ownerdie,
1516*4d9fdb46SRobert Mustacchi     Dwarf_Half attrnum,
1517*4d9fdb46SRobert Mustacchi     const Dwarf_Sig8 *sig8_in,
1518*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute * attr_out,
1519*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1520*4d9fdb46SRobert Mustacchi {
1521*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute new_attr = 0;
1522*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug dbg = 0;
1523*4d9fdb46SRobert Mustacchi 
1524*4d9fdb46SRobert Mustacchi     if (ownerdie == NULL) {
1525*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1526*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1527*4d9fdb46SRobert Mustacchi     }
1528*4d9fdb46SRobert Mustacchi     dbg = ownerdie->di_dbg;
1529*4d9fdb46SRobert Mustacchi 
1530*4d9fdb46SRobert Mustacchi     new_attr = (Dwarf_P_Attribute)
1531*4d9fdb46SRobert Mustacchi         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1532*4d9fdb46SRobert Mustacchi     if (new_attr == NULL) {
1533*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1534*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1535*4d9fdb46SRobert Mustacchi     }
1536*4d9fdb46SRobert Mustacchi     new_attr->ar_attribute = attrnum;
1537*4d9fdb46SRobert Mustacchi     new_attr->ar_attribute_form = DW_FORM_ref_sig8;
1538*4d9fdb46SRobert Mustacchi     new_attr->ar_nbytes = sizeof (Dwarf_Sig8);
153949d3bc91SRichard Lowe     new_attr->ar_next = 0;
154049d3bc91SRichard Lowe 
154149d3bc91SRichard Lowe     new_attr->ar_data =
1542*4d9fdb46SRobert Mustacchi         (char *) _dwarf_p_get_alloc(dbg, sizeof(Dwarf_Sig8));
154349d3bc91SRichard Lowe     if (new_attr->ar_data == NULL) {
1544*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1545*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
154649d3bc91SRichard Lowe     }
1547*4d9fdb46SRobert Mustacchi     memcpy(new_attr->ar_data,sig8_in,sizeof(Dwarf_Sig8));
154849d3bc91SRichard Lowe     new_attr->ar_rel_type = R_MIPS_NONE;
154907dc1947SRichard Lowe     new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
155049d3bc91SRichard Lowe     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1551*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
1552*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
155349d3bc91SRichard Lowe }
155449d3bc91SRichard Lowe 
155549d3bc91SRichard Lowe 
1556*4d9fdb46SRobert Mustacchi 
155749d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_producer(Dwarf_P_Die ownerdie,char * producer_string,Dwarf_Error * error)155849d3bc91SRichard Lowe dwarf_add_AT_producer(Dwarf_P_Die ownerdie,
1559*4d9fdb46SRobert Mustacchi     char *producer_string, Dwarf_Error * error)
156049d3bc91SRichard Lowe {
1561*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
1562*4d9fdb46SRobert Mustacchi     int res = 0;
156349d3bc91SRichard Lowe 
1564*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_producer_a(ownerdie,
1565*4d9fdb46SRobert Mustacchi         producer_string,&a,error);
1566*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1567*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute)DW_DLV_BADADDR);
156849d3bc91SRichard Lowe     }
1569*4d9fdb46SRobert Mustacchi     return a;
1570*4d9fdb46SRobert Mustacchi }
157149d3bc91SRichard Lowe 
1572*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_producer_a(Dwarf_P_Die ownerdie,char * producer_string,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1573*4d9fdb46SRobert Mustacchi dwarf_add_AT_producer_a(Dwarf_P_Die ownerdie,
1574*4d9fdb46SRobert Mustacchi     char *producer_string,
1575*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
1576*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1577*4d9fdb46SRobert Mustacchi {
1578*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute new_attr = 0;
1579*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug dbg = 0;
1580*4d9fdb46SRobert Mustacchi     int res = 0;
1581*4d9fdb46SRobert Mustacchi 
1582*4d9fdb46SRobert Mustacchi     if (ownerdie == NULL) {
1583*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1584*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1585*4d9fdb46SRobert Mustacchi     }
1586*4d9fdb46SRobert Mustacchi     dbg = ownerdie->di_dbg;
158749d3bc91SRichard Lowe     new_attr = (Dwarf_P_Attribute)
1588*4d9fdb46SRobert Mustacchi         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
158949d3bc91SRichard Lowe     if (new_attr == NULL) {
1590*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1591*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
159249d3bc91SRichard Lowe     }
159349d3bc91SRichard Lowe 
159449d3bc91SRichard Lowe     new_attr->ar_attribute = DW_AT_producer;
1595*4d9fdb46SRobert Mustacchi     res = _dwarf_pro_set_string_attr(new_attr,dbg,
1596*4d9fdb46SRobert Mustacchi         producer_string,error);
1597*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1598*4d9fdb46SRobert Mustacchi         return res;
1599*4d9fdb46SRobert Mustacchi     }
160049d3bc91SRichard Lowe 
1601*4d9fdb46SRobert Mustacchi     /* add attribute to the die */
1602*4d9fdb46SRobert Mustacchi     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1603*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
1604*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1605*4d9fdb46SRobert Mustacchi }
1606*4d9fdb46SRobert Mustacchi 
1607*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_const_value_signedint_a(Dwarf_P_Die ownerdie,Dwarf_Signed signed_value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1608*4d9fdb46SRobert Mustacchi dwarf_add_AT_const_value_signedint_a(Dwarf_P_Die ownerdie,
1609*4d9fdb46SRobert Mustacchi     Dwarf_Signed signed_value,
1610*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
1611*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1612*4d9fdb46SRobert Mustacchi {
1613*4d9fdb46SRobert Mustacchi     int res = 0;
1614*4d9fdb46SRobert Mustacchi 
1615*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_any_value_sleb_a(
1616*4d9fdb46SRobert Mustacchi         ownerdie,DW_AT_const_value,
1617*4d9fdb46SRobert Mustacchi         signed_value,
1618*4d9fdb46SRobert Mustacchi         attr_out, error);
1619*4d9fdb46SRobert Mustacchi     return res;
1620*4d9fdb46SRobert Mustacchi }
1621*4d9fdb46SRobert Mustacchi 
1622*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_const_value_signedint(Dwarf_P_Die ownerdie,Dwarf_Signed signed_value,Dwarf_Error * error)1623*4d9fdb46SRobert Mustacchi dwarf_add_AT_const_value_signedint(Dwarf_P_Die ownerdie,
1624*4d9fdb46SRobert Mustacchi     Dwarf_Signed signed_value,
1625*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1626*4d9fdb46SRobert Mustacchi {
1627*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
1628*4d9fdb46SRobert Mustacchi     int res = 0;
1629*4d9fdb46SRobert Mustacchi 
1630*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_any_value_sleb_a(
1631*4d9fdb46SRobert Mustacchi         ownerdie,DW_AT_const_value,
1632*4d9fdb46SRobert Mustacchi         signed_value,
1633*4d9fdb46SRobert Mustacchi         &a, error);
1634*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1635*4d9fdb46SRobert Mustacchi         return (Dwarf_P_Attribute)DW_DLV_BADADDR;
1636*4d9fdb46SRobert Mustacchi     }
1637*4d9fdb46SRobert Mustacchi     return a;
1638*4d9fdb46SRobert Mustacchi }
1639*4d9fdb46SRobert Mustacchi 
1640*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_implicit_const(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,Dwarf_Signed signed_value,Dwarf_P_Attribute * outattr,Dwarf_Error * error)1641*4d9fdb46SRobert Mustacchi dwarf_add_AT_implicit_const(Dwarf_P_Die ownerdie,
1642*4d9fdb46SRobert Mustacchi     Dwarf_Half attrnum,
1643*4d9fdb46SRobert Mustacchi     Dwarf_Signed signed_value,
1644*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *outattr,
1645*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1646*4d9fdb46SRobert Mustacchi {
1647*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute new_attr = 0;
1648*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug dbg = 0;
1649*4d9fdb46SRobert Mustacchi 
1650*4d9fdb46SRobert Mustacchi     if (ownerdie == NULL) {
1651*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1652*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1653*4d9fdb46SRobert Mustacchi     }
1654*4d9fdb46SRobert Mustacchi     dbg = ownerdie->di_dbg;
1655*4d9fdb46SRobert Mustacchi 
1656*4d9fdb46SRobert Mustacchi     new_attr = (Dwarf_P_Attribute)
1657*4d9fdb46SRobert Mustacchi         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1658*4d9fdb46SRobert Mustacchi     if (new_attr == NULL) {
1659*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1660*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
166149d3bc91SRichard Lowe     }
166249d3bc91SRichard Lowe 
1663*4d9fdb46SRobert Mustacchi     new_attr->ar_attribute = attrnum;
1664*4d9fdb46SRobert Mustacchi     new_attr->ar_attribute_form = DW_FORM_implicit_const;
166549d3bc91SRichard Lowe     new_attr->ar_rel_type = R_MIPS_NONE;
166607dc1947SRichard Lowe     new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
1667*4d9fdb46SRobert Mustacchi     new_attr->ar_next = 0;
1668*4d9fdb46SRobert Mustacchi 
1669*4d9fdb46SRobert Mustacchi     /*  The value will go in the abbrev section.
1670*4d9fdb46SRobert Mustacchi         Not the DIE. Encoding done with abbrev generation. */
1671*4d9fdb46SRobert Mustacchi     new_attr->ar_data = 0;
1672*4d9fdb46SRobert Mustacchi     new_attr->ar_nbytes = 0;
1673*4d9fdb46SRobert Mustacchi     new_attr->ar_implicit_const = signed_value;
167449d3bc91SRichard Lowe 
167549d3bc91SRichard Lowe     /* add attribute to the die */
167649d3bc91SRichard Lowe     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1677*4d9fdb46SRobert Mustacchi     *outattr = new_attr;
1678*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
167949d3bc91SRichard Lowe }
168049d3bc91SRichard Lowe 
168149d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_any_value_sleb(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,Dwarf_Signed signed_value,Dwarf_Error * error)1682*4d9fdb46SRobert Mustacchi dwarf_add_AT_any_value_sleb(Dwarf_P_Die ownerdie,
1683*4d9fdb46SRobert Mustacchi     Dwarf_Half attrnum,
1684*4d9fdb46SRobert Mustacchi     Dwarf_Signed signed_value,
1685*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
168649d3bc91SRichard Lowe {
1687*4d9fdb46SRobert Mustacchi     int res = 0;
1688*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
1689*4d9fdb46SRobert Mustacchi 
1690*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_any_value_sleb_a(ownerdie,
1691*4d9fdb46SRobert Mustacchi         attrnum,
1692*4d9fdb46SRobert Mustacchi         signed_value,
1693*4d9fdb46SRobert Mustacchi         &a, error);
1694*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1695*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
1696*4d9fdb46SRobert Mustacchi     }
1697*4d9fdb46SRobert Mustacchi     return a;
1698*4d9fdb46SRobert Mustacchi }
1699*4d9fdb46SRobert Mustacchi 
1700*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_any_value_sleb_a(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,Dwarf_Signed signed_value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1701*4d9fdb46SRobert Mustacchi dwarf_add_AT_any_value_sleb_a(Dwarf_P_Die ownerdie,
1702*4d9fdb46SRobert Mustacchi     Dwarf_Half attrnum,
1703*4d9fdb46SRobert Mustacchi     Dwarf_Signed signed_value,
1704*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
1705*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1706*4d9fdb46SRobert Mustacchi {
1707*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute new_attr = 0;
1708*4d9fdb46SRobert Mustacchi     int leb_size = 0;
1709*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug dbg = 0;
171049d3bc91SRichard Lowe     char encode_buffer[ENCODE_SPACE_NEEDED];
1711*4d9fdb46SRobert Mustacchi     int res = 0;
171249d3bc91SRichard Lowe 
171349d3bc91SRichard Lowe     if (ownerdie == NULL) {
1714*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1715*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
171649d3bc91SRichard Lowe     }
1717*4d9fdb46SRobert Mustacchi     dbg = ownerdie->di_dbg;
171849d3bc91SRichard Lowe 
171949d3bc91SRichard Lowe     new_attr = (Dwarf_P_Attribute)
1720*4d9fdb46SRobert Mustacchi         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
172149d3bc91SRichard Lowe     if (new_attr == NULL) {
1722*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1723*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
172449d3bc91SRichard Lowe     }
172549d3bc91SRichard Lowe 
1726*4d9fdb46SRobert Mustacchi     new_attr->ar_attribute = attrnum;
172749d3bc91SRichard Lowe     new_attr->ar_attribute_form = DW_FORM_sdata;
172849d3bc91SRichard Lowe     new_attr->ar_rel_type = R_MIPS_NONE;
172907dc1947SRichard Lowe     new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
173049d3bc91SRichard Lowe     new_attr->ar_next = 0;
173149d3bc91SRichard Lowe 
173249d3bc91SRichard Lowe     res = _dwarf_pro_encode_signed_leb128_nm(signed_value, &leb_size,
1733*4d9fdb46SRobert Mustacchi         encode_buffer,
1734*4d9fdb46SRobert Mustacchi         sizeof(encode_buffer));
173549d3bc91SRichard Lowe     if (res != DW_DLV_OK) {
1736*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1737*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
173849d3bc91SRichard Lowe     }
173949d3bc91SRichard Lowe     new_attr->ar_data = (char *)
1740*4d9fdb46SRobert Mustacchi         _dwarf_p_get_alloc(dbg, leb_size);
174149d3bc91SRichard Lowe     if (new_attr->ar_data == NULL) {
1742*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1743*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
174449d3bc91SRichard Lowe     }
174549d3bc91SRichard Lowe     memcpy(new_attr->ar_data, encode_buffer, leb_size);
174649d3bc91SRichard Lowe     new_attr->ar_nbytes = leb_size;
174749d3bc91SRichard Lowe 
174849d3bc91SRichard Lowe     /* add attribute to the die */
174949d3bc91SRichard Lowe     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1750*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
1751*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
175249d3bc91SRichard Lowe }
175349d3bc91SRichard Lowe 
1754*4d9fdb46SRobert Mustacchi /* AT_const_value, uleb */
175549d3bc91SRichard Lowe Dwarf_P_Attribute
dwarf_add_AT_const_value_unsignedint(Dwarf_P_Die ownerdie,Dwarf_Unsigned unsigned_value,Dwarf_Error * error)175649d3bc91SRichard Lowe dwarf_add_AT_const_value_unsignedint(Dwarf_P_Die ownerdie,
1757*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned unsigned_value,
1758*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1759*4d9fdb46SRobert Mustacchi {
1760*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a =0;
1761*4d9fdb46SRobert Mustacchi     int res = 0;
1762*4d9fdb46SRobert Mustacchi 
1763*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_any_value_uleb_a(
1764*4d9fdb46SRobert Mustacchi         ownerdie,DW_AT_const_value,
1765*4d9fdb46SRobert Mustacchi         unsigned_value,
1766*4d9fdb46SRobert Mustacchi         &a,
1767*4d9fdb46SRobert Mustacchi         error);
1768*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1769*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
1770*4d9fdb46SRobert Mustacchi     }
1771*4d9fdb46SRobert Mustacchi     return a;
1772*4d9fdb46SRobert Mustacchi }
1773*4d9fdb46SRobert Mustacchi 
1774*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_const_value_unsignedint_a(Dwarf_P_Die ownerdie,Dwarf_Unsigned unsigned_value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1775*4d9fdb46SRobert Mustacchi dwarf_add_AT_const_value_unsignedint_a(Dwarf_P_Die ownerdie,
1776*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned unsigned_value,
1777*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute *attr_out,
1778*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1779*4d9fdb46SRobert Mustacchi {
1780*4d9fdb46SRobert Mustacchi 
1781*4d9fdb46SRobert Mustacchi     return dwarf_add_AT_any_value_uleb_a(
1782*4d9fdb46SRobert Mustacchi         ownerdie,DW_AT_const_value,
1783*4d9fdb46SRobert Mustacchi         unsigned_value,
1784*4d9fdb46SRobert Mustacchi         attr_out,
1785*4d9fdb46SRobert Mustacchi         error);
1786*4d9fdb46SRobert Mustacchi }
1787*4d9fdb46SRobert Mustacchi 
1788*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_data16(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,Dwarf_Form_Data16 * ptr_to_val,Dwarf_P_Attribute * attr_return,Dwarf_Error * error)1789*4d9fdb46SRobert Mustacchi dwarf_add_AT_data16(Dwarf_P_Die ownerdie,
1790*4d9fdb46SRobert Mustacchi     Dwarf_Half attrnum,
1791*4d9fdb46SRobert Mustacchi     Dwarf_Form_Data16 * ptr_to_val,
1792*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute * attr_return,
1793*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1794*4d9fdb46SRobert Mustacchi {
1795*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute new_attr;
1796*4d9fdb46SRobert Mustacchi     int val_size = sizeof(Dwarf_Form_Data16);
1797*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug dbg = 0;
1798*4d9fdb46SRobert Mustacchi 
1799*4d9fdb46SRobert Mustacchi     if (ownerdie == NULL) {
1800*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1801*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1802*4d9fdb46SRobert Mustacchi     }
1803*4d9fdb46SRobert Mustacchi     dbg = ownerdie->di_dbg;
1804*4d9fdb46SRobert Mustacchi     new_attr = (Dwarf_P_Attribute)
1805*4d9fdb46SRobert Mustacchi         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
1806*4d9fdb46SRobert Mustacchi     if (new_attr == NULL) {
1807*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1808*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1809*4d9fdb46SRobert Mustacchi     }
1810*4d9fdb46SRobert Mustacchi     new_attr->ar_attribute = attrnum;
1811*4d9fdb46SRobert Mustacchi     new_attr->ar_attribute_form = DW_FORM_data16;
1812*4d9fdb46SRobert Mustacchi     new_attr->ar_rel_type = R_MIPS_NONE;
1813*4d9fdb46SRobert Mustacchi     new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
1814*4d9fdb46SRobert Mustacchi     new_attr->ar_next = 0;
1815*4d9fdb46SRobert Mustacchi     new_attr->ar_data = (char *)
1816*4d9fdb46SRobert Mustacchi         _dwarf_p_get_alloc(dbg, val_size);
1817*4d9fdb46SRobert Mustacchi     if (new_attr->ar_data == NULL) {
1818*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1819*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1820*4d9fdb46SRobert Mustacchi     }
1821*4d9fdb46SRobert Mustacchi     memcpy(new_attr->ar_data, ptr_to_val->fd_data, val_size);
1822*4d9fdb46SRobert Mustacchi     new_attr->ar_nbytes = val_size;
1823*4d9fdb46SRobert Mustacchi     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1824*4d9fdb46SRobert Mustacchi     *attr_return = new_attr;
1825*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1826*4d9fdb46SRobert Mustacchi }
1827*4d9fdb46SRobert Mustacchi 
1828*4d9fdb46SRobert Mustacchi Dwarf_P_Attribute
dwarf_add_AT_any_value_uleb(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,Dwarf_Unsigned unsigned_value,Dwarf_Error * error)1829*4d9fdb46SRobert Mustacchi dwarf_add_AT_any_value_uleb(Dwarf_P_Die ownerdie,
1830*4d9fdb46SRobert Mustacchi     Dwarf_Half attrnum,
1831*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned unsigned_value,
1832*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1833*4d9fdb46SRobert Mustacchi {
1834*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute a = 0;
1835*4d9fdb46SRobert Mustacchi     int res = 0;
1836*4d9fdb46SRobert Mustacchi 
1837*4d9fdb46SRobert Mustacchi     res = dwarf_add_AT_any_value_uleb_a(ownerdie,
1838*4d9fdb46SRobert Mustacchi         attrnum,unsigned_value,&a,error);
1839*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1840*4d9fdb46SRobert Mustacchi         return ((Dwarf_P_Attribute) DW_DLV_BADADDR);
1841*4d9fdb46SRobert Mustacchi     }
1842*4d9fdb46SRobert Mustacchi     return a;
1843*4d9fdb46SRobert Mustacchi }
1844*4d9fdb46SRobert Mustacchi int
dwarf_add_AT_any_value_uleb_a(Dwarf_P_Die ownerdie,Dwarf_Half attrnum,Dwarf_Unsigned unsigned_value,Dwarf_P_Attribute * attr_out,Dwarf_Error * error)1845*4d9fdb46SRobert Mustacchi dwarf_add_AT_any_value_uleb_a(Dwarf_P_Die ownerdie,
1846*4d9fdb46SRobert Mustacchi     Dwarf_Half attrnum,
1847*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned unsigned_value,
1848*4d9fdb46SRobert Mustacchi     Dwarf_P_Attribute * attr_out,
1849*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
185049d3bc91SRichard Lowe {
185149d3bc91SRichard Lowe     Dwarf_P_Attribute new_attr;
185249d3bc91SRichard Lowe     int leb_size;
1853*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug dbg = 0;
185449d3bc91SRichard Lowe     char encode_buffer[ENCODE_SPACE_NEEDED];
185549d3bc91SRichard Lowe     int res;
185649d3bc91SRichard Lowe 
185749d3bc91SRichard Lowe     if (ownerdie == NULL) {
1858*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL);
1859*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
186049d3bc91SRichard Lowe     }
1861*4d9fdb46SRobert Mustacchi     dbg = ownerdie->di_dbg;
186249d3bc91SRichard Lowe     new_attr = (Dwarf_P_Attribute)
1863*4d9fdb46SRobert Mustacchi         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s));
186449d3bc91SRichard Lowe     if (new_attr == NULL) {
186507dc1947SRichard Lowe         _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL);
1866*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
186749d3bc91SRichard Lowe     }
186849d3bc91SRichard Lowe 
1869*4d9fdb46SRobert Mustacchi     new_attr->ar_attribute = attrnum;
187049d3bc91SRichard Lowe     new_attr->ar_attribute_form = DW_FORM_udata;
187149d3bc91SRichard Lowe     new_attr->ar_rel_type = R_MIPS_NONE;
187207dc1947SRichard Lowe     new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */
187349d3bc91SRichard Lowe     new_attr->ar_next = 0;
187449d3bc91SRichard Lowe 
187549d3bc91SRichard Lowe     res = _dwarf_pro_encode_leb128_nm(unsigned_value, &leb_size,
1876*4d9fdb46SRobert Mustacchi         encode_buffer,
1877*4d9fdb46SRobert Mustacchi         sizeof(encode_buffer));
187849d3bc91SRichard Lowe     if (res != DW_DLV_OK) {
1879*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1880*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
188149d3bc91SRichard Lowe     }
188249d3bc91SRichard Lowe     new_attr->ar_data = (char *)
1883*4d9fdb46SRobert Mustacchi         _dwarf_p_get_alloc(dbg, leb_size);
188449d3bc91SRichard Lowe     if (new_attr->ar_data == NULL) {
1885*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
1886*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
188749d3bc91SRichard Lowe     }
188849d3bc91SRichard Lowe     memcpy(new_attr->ar_data, encode_buffer, leb_size);
188949d3bc91SRichard Lowe     new_attr->ar_nbytes = leb_size;
189049d3bc91SRichard Lowe 
189149d3bc91SRichard Lowe     /* add attribute to the die */
189249d3bc91SRichard Lowe     _dwarf_pro_add_at_to_die(ownerdie, new_attr);
1893*4d9fdb46SRobert Mustacchi     *attr_out = new_attr;
1894*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
189549d3bc91SRichard Lowe }
1896