xref: /titanic_50/usr/src/lib/libdwarf/common/pro_arange.c (revision f3e7f55e73a39377d55a030f124cc86b3b66a9cc)
1*f3e7f55eSRobert Mustacchi /*
2*f3e7f55eSRobert Mustacchi 
3*f3e7f55eSRobert Mustacchi   Copyright (C) 2000,2004 Silicon Graphics, Inc.  All Rights Reserved.
4*f3e7f55eSRobert Mustacchi 
5*f3e7f55eSRobert Mustacchi   This program is free software; you can redistribute it and/or modify it
6*f3e7f55eSRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
7*f3e7f55eSRobert Mustacchi   as published by the Free Software Foundation.
8*f3e7f55eSRobert Mustacchi 
9*f3e7f55eSRobert Mustacchi   This program is distributed in the hope that it would be useful, but
10*f3e7f55eSRobert Mustacchi   WITHOUT ANY WARRANTY; without even the implied warranty of
11*f3e7f55eSRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12*f3e7f55eSRobert Mustacchi 
13*f3e7f55eSRobert Mustacchi   Further, this software is distributed without any warranty that it is
14*f3e7f55eSRobert Mustacchi   free of the rightful claim of any third person regarding infringement
15*f3e7f55eSRobert Mustacchi   or the like.  Any license provided herein, whether implied or
16*f3e7f55eSRobert Mustacchi   otherwise, applies only to this software file.  Patent licenses, if
17*f3e7f55eSRobert Mustacchi   any, provided herein do not apply to combinations of this program with
18*f3e7f55eSRobert Mustacchi   other software, or any other product whatsoever.
19*f3e7f55eSRobert Mustacchi 
20*f3e7f55eSRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
21*f3e7f55eSRobert Mustacchi   License along with this program; if not, write the Free Software
22*f3e7f55eSRobert Mustacchi   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
23*f3e7f55eSRobert Mustacchi   USA.
24*f3e7f55eSRobert Mustacchi 
25*f3e7f55eSRobert Mustacchi   Contact information:  Silicon Graphics, Inc., 1500 Crittenden Lane,
26*f3e7f55eSRobert Mustacchi   Mountain View, CA 94043, or:
27*f3e7f55eSRobert Mustacchi 
28*f3e7f55eSRobert Mustacchi   http://www.sgi.com
29*f3e7f55eSRobert Mustacchi 
30*f3e7f55eSRobert Mustacchi   For further information regarding this notice, see:
31*f3e7f55eSRobert Mustacchi 
32*f3e7f55eSRobert Mustacchi   http://oss.sgi.com/projects/GenInfo/NoticeExplan
33*f3e7f55eSRobert Mustacchi 
34*f3e7f55eSRobert Mustacchi */
35*f3e7f55eSRobert Mustacchi 
36*f3e7f55eSRobert Mustacchi 
37*f3e7f55eSRobert Mustacchi 
38*f3e7f55eSRobert Mustacchi #include "config.h"
39*f3e7f55eSRobert Mustacchi #include "libdwarfdefs.h"
40*f3e7f55eSRobert Mustacchi #include <stdio.h>
41*f3e7f55eSRobert Mustacchi #include <string.h>
42*f3e7f55eSRobert Mustacchi #ifdef HAVE_ELFACCESS_H
43*f3e7f55eSRobert Mustacchi #include <elfaccess.h>
44*f3e7f55eSRobert Mustacchi #endif
45*f3e7f55eSRobert Mustacchi #include "pro_incl.h"
46*f3e7f55eSRobert Mustacchi #include "pro_arange.h"
47*f3e7f55eSRobert Mustacchi #include "pro_section.h"
48*f3e7f55eSRobert Mustacchi #include "pro_reloc.h"
49*f3e7f55eSRobert Mustacchi 
50*f3e7f55eSRobert Mustacchi 
51*f3e7f55eSRobert Mustacchi 
52*f3e7f55eSRobert Mustacchi /*
53*f3e7f55eSRobert Mustacchi     This function adds another address range
54*f3e7f55eSRobert Mustacchi     to the list of address ranges for the
55*f3e7f55eSRobert Mustacchi     given Dwarf_P_Debug.  It returns 0 on error,
56*f3e7f55eSRobert Mustacchi     and 1 otherwise.
57*f3e7f55eSRobert Mustacchi */
58*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
dwarf_add_arange(Dwarf_P_Debug dbg,Dwarf_Addr begin_address,Dwarf_Unsigned length,Dwarf_Signed symbol_index,Dwarf_Error * error)59*f3e7f55eSRobert Mustacchi dwarf_add_arange(Dwarf_P_Debug dbg,
60*f3e7f55eSRobert Mustacchi                  Dwarf_Addr begin_address,
61*f3e7f55eSRobert Mustacchi                  Dwarf_Unsigned length,
62*f3e7f55eSRobert Mustacchi                  Dwarf_Signed symbol_index, Dwarf_Error * error)
63*f3e7f55eSRobert Mustacchi {
64*f3e7f55eSRobert Mustacchi     return dwarf_add_arange_b(dbg, begin_address, length, symbol_index,
65*f3e7f55eSRobert Mustacchi                               /* end_symbol_index */ 0,
66*f3e7f55eSRobert Mustacchi                               /* offset_from_end_sym */ 0,
67*f3e7f55eSRobert Mustacchi                               error);
68*f3e7f55eSRobert Mustacchi }
69*f3e7f55eSRobert Mustacchi 
70*f3e7f55eSRobert Mustacchi /*
71*f3e7f55eSRobert Mustacchi     This function adds another address range
72*f3e7f55eSRobert Mustacchi     to the list of address ranges for the
73*f3e7f55eSRobert Mustacchi     given Dwarf_P_Debug.  It returns 0 on error,
74*f3e7f55eSRobert Mustacchi     and 1 otherwise.
75*f3e7f55eSRobert Mustacchi */
76*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
dwarf_add_arange_b(Dwarf_P_Debug dbg,Dwarf_Addr begin_address,Dwarf_Unsigned length,Dwarf_Unsigned symbol_index,Dwarf_Unsigned end_symbol_index,Dwarf_Addr offset_from_end_sym,Dwarf_Error * error)77*f3e7f55eSRobert Mustacchi dwarf_add_arange_b(Dwarf_P_Debug dbg,
78*f3e7f55eSRobert Mustacchi                    Dwarf_Addr begin_address,
79*f3e7f55eSRobert Mustacchi                    Dwarf_Unsigned length,
80*f3e7f55eSRobert Mustacchi                    Dwarf_Unsigned symbol_index,
81*f3e7f55eSRobert Mustacchi                    Dwarf_Unsigned end_symbol_index,
82*f3e7f55eSRobert Mustacchi                    Dwarf_Addr offset_from_end_sym, Dwarf_Error * error)
83*f3e7f55eSRobert Mustacchi {
84*f3e7f55eSRobert Mustacchi     Dwarf_P_Arange arange;
85*f3e7f55eSRobert Mustacchi 
86*f3e7f55eSRobert Mustacchi     if (dbg == NULL) {
87*f3e7f55eSRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
88*f3e7f55eSRobert Mustacchi         return (0);
89*f3e7f55eSRobert Mustacchi     }
90*f3e7f55eSRobert Mustacchi 
91*f3e7f55eSRobert Mustacchi     arange = (Dwarf_P_Arange)
92*f3e7f55eSRobert Mustacchi         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Arange_s));
93*f3e7f55eSRobert Mustacchi     if (arange == NULL) {
94*f3e7f55eSRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
95*f3e7f55eSRobert Mustacchi         return (0);
96*f3e7f55eSRobert Mustacchi     }
97*f3e7f55eSRobert Mustacchi 
98*f3e7f55eSRobert Mustacchi     arange->ag_begin_address = begin_address;
99*f3e7f55eSRobert Mustacchi     arange->ag_length = length;
100*f3e7f55eSRobert Mustacchi     arange->ag_symbol_index = symbol_index;
101*f3e7f55eSRobert Mustacchi     arange->ag_end_symbol_index = end_symbol_index;
102*f3e7f55eSRobert Mustacchi     arange->ag_end_symbol_offset = offset_from_end_sym;
103*f3e7f55eSRobert Mustacchi 
104*f3e7f55eSRobert Mustacchi     if (dbg->de_arange == NULL)
105*f3e7f55eSRobert Mustacchi         dbg->de_arange = dbg->de_last_arange = arange;
106*f3e7f55eSRobert Mustacchi     else {
107*f3e7f55eSRobert Mustacchi         dbg->de_last_arange->ag_next = arange;
108*f3e7f55eSRobert Mustacchi         dbg->de_last_arange = arange;
109*f3e7f55eSRobert Mustacchi     }
110*f3e7f55eSRobert Mustacchi     dbg->de_arange_count++;
111*f3e7f55eSRobert Mustacchi 
112*f3e7f55eSRobert Mustacchi     return (1);
113*f3e7f55eSRobert Mustacchi }
114*f3e7f55eSRobert Mustacchi 
115*f3e7f55eSRobert Mustacchi 
116*f3e7f55eSRobert Mustacchi int
_dwarf_transform_arange_to_disk(Dwarf_P_Debug dbg,Dwarf_Error * error)117*f3e7f55eSRobert Mustacchi _dwarf_transform_arange_to_disk(Dwarf_P_Debug dbg, Dwarf_Error * error)
118*f3e7f55eSRobert Mustacchi {
119*f3e7f55eSRobert Mustacchi     /* Total num of bytes in .debug_aranges section. */
120*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned arange_num_bytes;
121*f3e7f55eSRobert Mustacchi 
122*f3e7f55eSRobert Mustacchi     /*
123*f3e7f55eSRobert Mustacchi        Adjustment to align the start of the actual address ranges on a
124*f3e7f55eSRobert Mustacchi        boundary aligned with twice the address size. */
125*f3e7f55eSRobert Mustacchi     Dwarf_Small remainder;
126*f3e7f55eSRobert Mustacchi 
127*f3e7f55eSRobert Mustacchi     /* Total number of bytes excluding the length field. */
128*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned adjusted_length;
129*f3e7f55eSRobert Mustacchi 
130*f3e7f55eSRobert Mustacchi     /* Points to first byte of .debug_aranges buffer. */
131*f3e7f55eSRobert Mustacchi     Dwarf_Small *arange;
132*f3e7f55eSRobert Mustacchi 
133*f3e7f55eSRobert Mustacchi     /* Fills in the .debug_aranges buffer. */
134*f3e7f55eSRobert Mustacchi     Dwarf_Small *arange_ptr;
135*f3e7f55eSRobert Mustacchi 
136*f3e7f55eSRobert Mustacchi     /* Scans the list of address ranges provided by user. */
137*f3e7f55eSRobert Mustacchi     Dwarf_P_Arange given_arange;
138*f3e7f55eSRobert Mustacchi 
139*f3e7f55eSRobert Mustacchi     /* Used to fill in 0. */
140*f3e7f55eSRobert Mustacchi     const Dwarf_Signed big_zero = 0;
141*f3e7f55eSRobert Mustacchi 
142*f3e7f55eSRobert Mustacchi     int extension_word_size = dbg->de_64bit_extension ? 4 : 0;
143*f3e7f55eSRobert Mustacchi     int uword_size = dbg->de_offset_size;
144*f3e7f55eSRobert Mustacchi     int upointer_size = dbg->de_pointer_size;
145*f3e7f55eSRobert Mustacchi     int res;
146*f3e7f55eSRobert Mustacchi 
147*f3e7f55eSRobert Mustacchi 
148*f3e7f55eSRobert Mustacchi     /* ***** BEGIN CODE ***** */
149*f3e7f55eSRobert Mustacchi 
150*f3e7f55eSRobert Mustacchi     /* Size of the .debug_aranges section header. */
151*f3e7f55eSRobert Mustacchi     arange_num_bytes = extension_word_size + uword_size +       /* Size
152*f3e7f55eSRobert Mustacchi                                                                    of
153*f3e7f55eSRobert Mustacchi                                                                    length
154*f3e7f55eSRobert Mustacchi                                                                    field.
155*f3e7f55eSRobert Mustacchi                                                                  */
156*f3e7f55eSRobert Mustacchi         sizeof(Dwarf_Half) +    /* Size of version field. */
157*f3e7f55eSRobert Mustacchi         uword_size +            /* Size of .debug_info offset. */
158*f3e7f55eSRobert Mustacchi         sizeof(Dwarf_Small) +   /* Size of address size field. */
159*f3e7f55eSRobert Mustacchi         sizeof(Dwarf_Small);    /* Size of segment size field. */
160*f3e7f55eSRobert Mustacchi 
161*f3e7f55eSRobert Mustacchi     /*
162*f3e7f55eSRobert Mustacchi        Adjust the size so that the set of aranges begins on a boundary
163*f3e7f55eSRobert Mustacchi        that aligned with twice the address size.  This is a Libdwarf
164*f3e7f55eSRobert Mustacchi        requirement. */
165*f3e7f55eSRobert Mustacchi     remainder = arange_num_bytes % (2 * upointer_size);
166*f3e7f55eSRobert Mustacchi     if (remainder != 0)
167*f3e7f55eSRobert Mustacchi         arange_num_bytes += (2 * upointer_size) - remainder;
168*f3e7f55eSRobert Mustacchi 
169*f3e7f55eSRobert Mustacchi 
170*f3e7f55eSRobert Mustacchi     /* Add the bytes for the actual address ranges. */
171*f3e7f55eSRobert Mustacchi     arange_num_bytes += upointer_size * 2 * (dbg->de_arange_count + 1);
172*f3e7f55eSRobert Mustacchi 
173*f3e7f55eSRobert Mustacchi     GET_CHUNK(dbg, dbg->de_elf_sects[DEBUG_ARANGES],
174*f3e7f55eSRobert Mustacchi               arange, (unsigned long) arange_num_bytes, error);
175*f3e7f55eSRobert Mustacchi     arange_ptr = arange;
176*f3e7f55eSRobert Mustacchi     if (arange == NULL) {
177*f3e7f55eSRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
178*f3e7f55eSRobert Mustacchi         return (0);
179*f3e7f55eSRobert Mustacchi     }
180*f3e7f55eSRobert Mustacchi     if (extension_word_size) {
181*f3e7f55eSRobert Mustacchi         Dwarf_Word x = DISTINGUISHED_VALUE;
182*f3e7f55eSRobert Mustacchi 
183*f3e7f55eSRobert Mustacchi         WRITE_UNALIGNED(dbg, (void *) arange_ptr,
184*f3e7f55eSRobert Mustacchi                         (const void *) &x,
185*f3e7f55eSRobert Mustacchi                         sizeof(x), extension_word_size);
186*f3e7f55eSRobert Mustacchi         arange_ptr += extension_word_size;
187*f3e7f55eSRobert Mustacchi     }
188*f3e7f55eSRobert Mustacchi 
189*f3e7f55eSRobert Mustacchi     /* Write the total length of .debug_aranges section. */
190*f3e7f55eSRobert Mustacchi     adjusted_length = arange_num_bytes - uword_size
191*f3e7f55eSRobert Mustacchi         - extension_word_size;
192*f3e7f55eSRobert Mustacchi     {
193*f3e7f55eSRobert Mustacchi         Dwarf_Unsigned du = adjusted_length;
194*f3e7f55eSRobert Mustacchi 
195*f3e7f55eSRobert Mustacchi         WRITE_UNALIGNED(dbg, (void *) arange_ptr,
196*f3e7f55eSRobert Mustacchi                         (const void *) &du, sizeof(du), uword_size);
197*f3e7f55eSRobert Mustacchi         arange_ptr += uword_size;
198*f3e7f55eSRobert Mustacchi     }
199*f3e7f55eSRobert Mustacchi 
200*f3e7f55eSRobert Mustacchi     /* Write the version as 2 bytes. */
201*f3e7f55eSRobert Mustacchi     {
202*f3e7f55eSRobert Mustacchi         Dwarf_Half verstamp = CURRENT_VERSION_STAMP;
203*f3e7f55eSRobert Mustacchi 
204*f3e7f55eSRobert Mustacchi         WRITE_UNALIGNED(dbg, (void *) arange_ptr,
205*f3e7f55eSRobert Mustacchi                         (const void *) &verstamp,
206*f3e7f55eSRobert Mustacchi                         sizeof(verstamp), sizeof(Dwarf_Half));
207*f3e7f55eSRobert Mustacchi         arange_ptr += sizeof(Dwarf_Half);
208*f3e7f55eSRobert Mustacchi     }
209*f3e7f55eSRobert Mustacchi 
210*f3e7f55eSRobert Mustacchi 
211*f3e7f55eSRobert Mustacchi     /* Write the .debug_info offset.  This is always 0. */
212*f3e7f55eSRobert Mustacchi     WRITE_UNALIGNED(dbg, (void *) arange_ptr,
213*f3e7f55eSRobert Mustacchi                     (const void *) &big_zero,
214*f3e7f55eSRobert Mustacchi                     sizeof(big_zero), uword_size);
215*f3e7f55eSRobert Mustacchi     arange_ptr += uword_size;
216*f3e7f55eSRobert Mustacchi 
217*f3e7f55eSRobert Mustacchi     {
218*f3e7f55eSRobert Mustacchi         unsigned long count = dbg->de_arange_count + 1;
219*f3e7f55eSRobert Mustacchi         int res;
220*f3e7f55eSRobert Mustacchi 
221*f3e7f55eSRobert Mustacchi         if (dbg->de_reloc_pair) {
222*f3e7f55eSRobert Mustacchi             count = (3 * dbg->de_arange_count) + 1;
223*f3e7f55eSRobert Mustacchi         }
224*f3e7f55eSRobert Mustacchi         /* the following is a small optimization: not needed for
225*f3e7f55eSRobert Mustacchi            correctness */
226*f3e7f55eSRobert Mustacchi         res = _dwarf_pro_pre_alloc_n_reloc_slots(dbg,
227*f3e7f55eSRobert Mustacchi                                                  DEBUG_ARANGES, count);
228*f3e7f55eSRobert Mustacchi         if (res != DW_DLV_OK) {
229*f3e7f55eSRobert Mustacchi             {
230*f3e7f55eSRobert Mustacchi                 _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
231*f3e7f55eSRobert Mustacchi                 return (0);
232*f3e7f55eSRobert Mustacchi             }
233*f3e7f55eSRobert Mustacchi         }
234*f3e7f55eSRobert Mustacchi     }
235*f3e7f55eSRobert Mustacchi 
236*f3e7f55eSRobert Mustacchi     /* reloc for .debug_info */
237*f3e7f55eSRobert Mustacchi     res = dbg->de_reloc_name(dbg,
238*f3e7f55eSRobert Mustacchi                              DEBUG_ARANGES,
239*f3e7f55eSRobert Mustacchi                              extension_word_size +
240*f3e7f55eSRobert Mustacchi                              uword_size + sizeof(Dwarf_Half),
241*f3e7f55eSRobert Mustacchi                              dbg->de_sect_name_idx[DEBUG_INFO],
242*f3e7f55eSRobert Mustacchi                              dwarf_drt_data_reloc, uword_size);
243*f3e7f55eSRobert Mustacchi 
244*f3e7f55eSRobert Mustacchi     /* Write the size of addresses. */
245*f3e7f55eSRobert Mustacchi     *arange_ptr = dbg->de_pointer_size;
246*f3e7f55eSRobert Mustacchi     arange_ptr++;
247*f3e7f55eSRobert Mustacchi 
248*f3e7f55eSRobert Mustacchi     /*
249*f3e7f55eSRobert Mustacchi        Write the size of segment addresses. This is zero for MIPS
250*f3e7f55eSRobert Mustacchi        architectures. */
251*f3e7f55eSRobert Mustacchi     *arange_ptr = 0;
252*f3e7f55eSRobert Mustacchi     arange_ptr++;
253*f3e7f55eSRobert Mustacchi 
254*f3e7f55eSRobert Mustacchi     /*
255*f3e7f55eSRobert Mustacchi        Skip over the padding to align the start of the actual address
256*f3e7f55eSRobert Mustacchi        ranges to twice the address size. */
257*f3e7f55eSRobert Mustacchi     if (remainder != 0)
258*f3e7f55eSRobert Mustacchi         arange_ptr += (2 * upointer_size) - remainder;
259*f3e7f55eSRobert Mustacchi 
260*f3e7f55eSRobert Mustacchi 
261*f3e7f55eSRobert Mustacchi 
262*f3e7f55eSRobert Mustacchi 
263*f3e7f55eSRobert Mustacchi 
264*f3e7f55eSRobert Mustacchi     /* The arange address, length are pointer-size fields of the target
265*f3e7f55eSRobert Mustacchi        machine. */
266*f3e7f55eSRobert Mustacchi     for (given_arange = dbg->de_arange; given_arange != NULL;
267*f3e7f55eSRobert Mustacchi          given_arange = given_arange->ag_next) {
268*f3e7f55eSRobert Mustacchi 
269*f3e7f55eSRobert Mustacchi         /* Write relocation record for beginning of address range. */
270*f3e7f55eSRobert Mustacchi         res = dbg->de_reloc_name(dbg, DEBUG_ARANGES, arange_ptr - arange,       /* r_offset
271*f3e7f55eSRobert Mustacchi                                                                                  */
272*f3e7f55eSRobert Mustacchi                                  (long) given_arange->ag_symbol_index,
273*f3e7f55eSRobert Mustacchi                                  dwarf_drt_data_reloc, upointer_size);
274*f3e7f55eSRobert Mustacchi         if (res != DW_DLV_OK) {
275*f3e7f55eSRobert Mustacchi             {
276*f3e7f55eSRobert Mustacchi                 _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
277*f3e7f55eSRobert Mustacchi                 return (0);
278*f3e7f55eSRobert Mustacchi             }
279*f3e7f55eSRobert Mustacchi         }
280*f3e7f55eSRobert Mustacchi 
281*f3e7f55eSRobert Mustacchi         /* Copy beginning address of range. */
282*f3e7f55eSRobert Mustacchi         WRITE_UNALIGNED(dbg, (void *) arange_ptr,
283*f3e7f55eSRobert Mustacchi                         (const void *) &given_arange->ag_begin_address,
284*f3e7f55eSRobert Mustacchi                         sizeof(given_arange->ag_begin_address),
285*f3e7f55eSRobert Mustacchi                         upointer_size);
286*f3e7f55eSRobert Mustacchi         arange_ptr += upointer_size;
287*f3e7f55eSRobert Mustacchi 
288*f3e7f55eSRobert Mustacchi         if (dbg->de_reloc_pair &&
289*f3e7f55eSRobert Mustacchi             given_arange->ag_end_symbol_index != 0 &&
290*f3e7f55eSRobert Mustacchi             given_arange->ag_length == 0) {
291*f3e7f55eSRobert Mustacchi             /* symbolic reloc, need reloc for length What if we really
292*f3e7f55eSRobert Mustacchi                know the length? If so, should use the other part of
293*f3e7f55eSRobert Mustacchi                'if'. */
294*f3e7f55eSRobert Mustacchi             Dwarf_Unsigned val;
295*f3e7f55eSRobert Mustacchi 
296*f3e7f55eSRobert Mustacchi             res = dbg->de_reloc_pair(dbg, DEBUG_ARANGES, arange_ptr - arange,   /* r_offset
297*f3e7f55eSRobert Mustacchi                                                                                  */
298*f3e7f55eSRobert Mustacchi                                      given_arange->ag_symbol_index,
299*f3e7f55eSRobert Mustacchi                                      given_arange->ag_end_symbol_index,
300*f3e7f55eSRobert Mustacchi                                      dwarf_drt_first_of_length_pair,
301*f3e7f55eSRobert Mustacchi                                      upointer_size);
302*f3e7f55eSRobert Mustacchi             if (res != DW_DLV_OK) {
303*f3e7f55eSRobert Mustacchi                 {
304*f3e7f55eSRobert Mustacchi                     _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
305*f3e7f55eSRobert Mustacchi                     return (0);
306*f3e7f55eSRobert Mustacchi                 }
307*f3e7f55eSRobert Mustacchi             }
308*f3e7f55eSRobert Mustacchi 
309*f3e7f55eSRobert Mustacchi             /* arrange pre-calc so assem text can do .word end - begin
310*f3e7f55eSRobert Mustacchi                + val (gets val from stream) */
311*f3e7f55eSRobert Mustacchi             val = given_arange->ag_end_symbol_offset -
312*f3e7f55eSRobert Mustacchi                 given_arange->ag_begin_address;
313*f3e7f55eSRobert Mustacchi             WRITE_UNALIGNED(dbg, (void *) arange_ptr,
314*f3e7f55eSRobert Mustacchi                             (const void *) &val,
315*f3e7f55eSRobert Mustacchi                             sizeof(val), upointer_size);
316*f3e7f55eSRobert Mustacchi             arange_ptr += upointer_size;
317*f3e7f55eSRobert Mustacchi 
318*f3e7f55eSRobert Mustacchi         } else {
319*f3e7f55eSRobert Mustacchi             /* plain old length to copy, no relocation at all */
320*f3e7f55eSRobert Mustacchi             WRITE_UNALIGNED(dbg, (void *) arange_ptr,
321*f3e7f55eSRobert Mustacchi                             (const void *) &given_arange->ag_length,
322*f3e7f55eSRobert Mustacchi                             sizeof(given_arange->ag_length),
323*f3e7f55eSRobert Mustacchi                             upointer_size);
324*f3e7f55eSRobert Mustacchi             arange_ptr += upointer_size;
325*f3e7f55eSRobert Mustacchi         }
326*f3e7f55eSRobert Mustacchi     }
327*f3e7f55eSRobert Mustacchi 
328*f3e7f55eSRobert Mustacchi     WRITE_UNALIGNED(dbg, (void *) arange_ptr,
329*f3e7f55eSRobert Mustacchi                     (const void *) &big_zero,
330*f3e7f55eSRobert Mustacchi                     sizeof(big_zero), upointer_size);
331*f3e7f55eSRobert Mustacchi 
332*f3e7f55eSRobert Mustacchi     arange_ptr += upointer_size;
333*f3e7f55eSRobert Mustacchi     WRITE_UNALIGNED(dbg, (void *) arange_ptr,
334*f3e7f55eSRobert Mustacchi                     (const void *) &big_zero,
335*f3e7f55eSRobert Mustacchi                     sizeof(big_zero), upointer_size);
336*f3e7f55eSRobert Mustacchi     return (int) dbg->de_n_debug_sect;
337*f3e7f55eSRobert Mustacchi }
338