149d3bc91SRichard Lowe /*
249d3bc91SRichard Lowe 
307dc1947SRichard Lowe   Copyright (C) 2000,2004 Silicon Graphics, Inc.  All Rights Reserved.
4*4d9fdb46SRobert Mustacchi   Portions Copyright 2011-2019 David Anderson.  All Rights Reserved.
549d3bc91SRichard Lowe 
649d3bc91SRichard Lowe   This program is free software; you can redistribute it and/or modify it
7*4d9fdb46SRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
849d3bc91SRichard Lowe   as published by the Free Software Foundation.
949d3bc91SRichard Lowe 
1049d3bc91SRichard Lowe   This program is distributed in the hope that it would be useful, but
1149d3bc91SRichard Lowe   WITHOUT ANY WARRANTY; without even the implied warranty of
12*4d9fdb46SRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1349d3bc91SRichard Lowe 
1449d3bc91SRichard Lowe   Further, this software is distributed without any warranty that it is
15*4d9fdb46SRobert Mustacchi   free of the rightful claim of any third person regarding infringement
16*4d9fdb46SRobert Mustacchi   or the like.  Any license provided herein, whether implied or
1749d3bc91SRichard Lowe   otherwise, applies only to this software file.  Patent licenses, if
18*4d9fdb46SRobert Mustacchi   any, provided herein do not apply to combinations of this program with
19*4d9fdb46SRobert Mustacchi   other software, or any other product whatsoever.
2049d3bc91SRichard Lowe 
21*4d9fdb46SRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
22*4d9fdb46SRobert Mustacchi   License along with this program; if not, write the Free Software
2307dc1947SRichard Lowe   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
2449d3bc91SRichard Lowe   USA.
2549d3bc91SRichard Lowe 
2649d3bc91SRichard Lowe */
2749d3bc91SRichard Lowe 
2849d3bc91SRichard Lowe #include "config.h"
2949d3bc91SRichard Lowe #include "libdwarfdefs.h"
3049d3bc91SRichard Lowe #include <stdio.h>
3149d3bc91SRichard Lowe #include <string.h>
3249d3bc91SRichard Lowe #ifdef HAVE_ELFACCESS_H
3349d3bc91SRichard Lowe #include <elfaccess.h>
3449d3bc91SRichard Lowe #endif
3549d3bc91SRichard Lowe #include "pro_incl.h"
36*4d9fdb46SRobert Mustacchi #include <stddef.h>
37*4d9fdb46SRobert Mustacchi #include "dwarf.h"
38*4d9fdb46SRobert Mustacchi #include "libdwarf.h"
39*4d9fdb46SRobert Mustacchi #include "pro_opaque.h"
40*4d9fdb46SRobert Mustacchi #include "pro_error.h"
41*4d9fdb46SRobert Mustacchi #include "pro_alloc.h"
4249d3bc91SRichard Lowe #include "pro_arange.h"
4349d3bc91SRichard Lowe #include "pro_section.h"
4449d3bc91SRichard Lowe #include "pro_reloc.h"
4549d3bc91SRichard Lowe 
4649d3bc91SRichard Lowe 
47*4d9fdb46SRobert Mustacchi #define SIZEOFT32 4
4849d3bc91SRichard Lowe 
49*4d9fdb46SRobert Mustacchi /*  This function adds another address range
5049d3bc91SRichard Lowe     to the list of address ranges for the
5149d3bc91SRichard Lowe     given Dwarf_P_Debug.  It returns 0 on error,
52*4d9fdb46SRobert Mustacchi     and 1 otherwise.  */
5349d3bc91SRichard Lowe Dwarf_Unsigned
dwarf_add_arange(Dwarf_P_Debug dbg,Dwarf_Addr begin_address,Dwarf_Unsigned length,Dwarf_Signed symbol_index,Dwarf_Error * error)5449d3bc91SRichard Lowe dwarf_add_arange(Dwarf_P_Debug dbg,
55*4d9fdb46SRobert Mustacchi     Dwarf_Addr begin_address,
56*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned length,
57*4d9fdb46SRobert Mustacchi     Dwarf_Signed symbol_index, Dwarf_Error * error)
5849d3bc91SRichard Lowe {
59*4d9fdb46SRobert Mustacchi     int res = 0;
60*4d9fdb46SRobert Mustacchi 
61*4d9fdb46SRobert Mustacchi     res = dwarf_add_arange_b(dbg, begin_address, length, symbol_index,
62*4d9fdb46SRobert Mustacchi         /* end_symbol_index */ 0,
63*4d9fdb46SRobert Mustacchi         /* offset_from_end_sym */ 0,
64*4d9fdb46SRobert Mustacchi         error);
65*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
66*4d9fdb46SRobert Mustacchi         return 0;
67*4d9fdb46SRobert Mustacchi     }
68*4d9fdb46SRobert Mustacchi     return 1;
69*4d9fdb46SRobert Mustacchi 
7049d3bc91SRichard Lowe }
7149d3bc91SRichard Lowe 
72*4d9fdb46SRobert Mustacchi /*  This function adds another address range
7349d3bc91SRichard Lowe     to the list of address ranges for the
74*4d9fdb46SRobert Mustacchi     given Dwarf_P_Debug.  It returns DW_DLV_ERROR on error,
75*4d9fdb46SRobert Mustacchi     and DW_DLV_OK otherwise.  */
7649d3bc91SRichard Lowe 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)7749d3bc91SRichard Lowe dwarf_add_arange_b(Dwarf_P_Debug dbg,
78*4d9fdb46SRobert Mustacchi     Dwarf_Addr begin_address,
79*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned length,
80*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned symbol_index,
81*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned end_symbol_index,
82*4d9fdb46SRobert Mustacchi     Dwarf_Addr offset_from_end_sym,
83*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
84*4d9fdb46SRobert Mustacchi {
85*4d9fdb46SRobert Mustacchi     int res = 0;
86*4d9fdb46SRobert Mustacchi 
87*4d9fdb46SRobert Mustacchi     res = dwarf_add_arange_c(dbg,begin_address,length,
88*4d9fdb46SRobert Mustacchi         symbol_index, end_symbol_index,
89*4d9fdb46SRobert Mustacchi         offset_from_end_sym,error);
90*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
91*4d9fdb46SRobert Mustacchi         return 0;
92*4d9fdb46SRobert Mustacchi     }
93*4d9fdb46SRobert Mustacchi     return 1;
94*4d9fdb46SRobert Mustacchi }
95*4d9fdb46SRobert Mustacchi int
dwarf_add_arange_c(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)96*4d9fdb46SRobert Mustacchi dwarf_add_arange_c(Dwarf_P_Debug dbg,
97*4d9fdb46SRobert Mustacchi     Dwarf_Addr begin_address,
98*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned length,
99*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned symbol_index,
100*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned end_symbol_index,
101*4d9fdb46SRobert Mustacchi     Dwarf_Addr offset_from_end_sym,
102*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
10349d3bc91SRichard Lowe {
10449d3bc91SRichard Lowe     Dwarf_P_Arange arange;
10549d3bc91SRichard Lowe 
10649d3bc91SRichard Lowe     if (dbg == NULL) {
10707dc1947SRichard Lowe         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
108*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
10949d3bc91SRichard Lowe     }
11049d3bc91SRichard Lowe 
11149d3bc91SRichard Lowe     arange = (Dwarf_P_Arange)
11207dc1947SRichard Lowe         _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Arange_s));
11349d3bc91SRichard Lowe     if (arange == NULL) {
11407dc1947SRichard Lowe         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
115*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
11649d3bc91SRichard Lowe     }
11749d3bc91SRichard Lowe 
11849d3bc91SRichard Lowe     arange->ag_begin_address = begin_address;
11949d3bc91SRichard Lowe     arange->ag_length = length;
12049d3bc91SRichard Lowe     arange->ag_symbol_index = symbol_index;
12149d3bc91SRichard Lowe     arange->ag_end_symbol_index = end_symbol_index;
12249d3bc91SRichard Lowe     arange->ag_end_symbol_offset = offset_from_end_sym;
12349d3bc91SRichard Lowe 
12449d3bc91SRichard Lowe     if (dbg->de_arange == NULL)
12507dc1947SRichard Lowe         dbg->de_arange = dbg->de_last_arange = arange;
12649d3bc91SRichard Lowe     else {
12707dc1947SRichard Lowe         dbg->de_last_arange->ag_next = arange;
12807dc1947SRichard Lowe         dbg->de_last_arange = arange;
12949d3bc91SRichard Lowe     }
13049d3bc91SRichard Lowe     dbg->de_arange_count++;
131*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
13249d3bc91SRichard Lowe }
13349d3bc91SRichard Lowe 
13449d3bc91SRichard Lowe 
13549d3bc91SRichard Lowe int
_dwarf_transform_arange_to_disk(Dwarf_P_Debug dbg,Dwarf_Signed * nbufs,Dwarf_Error * error)136*4d9fdb46SRobert Mustacchi _dwarf_transform_arange_to_disk(Dwarf_P_Debug dbg,
137*4d9fdb46SRobert Mustacchi     Dwarf_Signed *nbufs, Dwarf_Error * error)
13849d3bc91SRichard Lowe {
13949d3bc91SRichard Lowe     /* Total num of bytes in .debug_aranges section. */
140*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned arange_num_bytes = 0;
14149d3bc91SRichard Lowe 
142*4d9fdb46SRobert Mustacchi     /*  Adjustment to align the start of the actual address ranges on a
143*4d9fdb46SRobert Mustacchi         boundary aligned with twice the address size. */
144*4d9fdb46SRobert Mustacchi     Dwarf_Small remainder = 0;
14549d3bc91SRichard Lowe 
146*4d9fdb46SRobert Mustacchi     /*  Total number of bytes excluding the length field. */
147*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned adjusted_length = 0;
14849d3bc91SRichard Lowe 
149*4d9fdb46SRobert Mustacchi     /*  Points to first byte of .debug_aranges buffer. */
150*4d9fdb46SRobert Mustacchi     Dwarf_Small *arange = 0;
15149d3bc91SRichard Lowe 
152*4d9fdb46SRobert Mustacchi     /*  Fills in the .debug_aranges buffer. */
153*4d9fdb46SRobert Mustacchi     Dwarf_Small *arange_ptr = 0;
15449d3bc91SRichard Lowe 
155*4d9fdb46SRobert Mustacchi     /*  Scans the list of address ranges provided by user. */
156*4d9fdb46SRobert Mustacchi     Dwarf_P_Arange given_arange = 0;
15749d3bc91SRichard Lowe 
158*4d9fdb46SRobert Mustacchi     /*  Used to fill in 0. */
15949d3bc91SRichard Lowe     const Dwarf_Signed big_zero = 0;
16049d3bc91SRichard Lowe 
16149d3bc91SRichard Lowe     int extension_word_size = dbg->de_64bit_extension ? 4 : 0;
162*4d9fdb46SRobert Mustacchi     int offset_size = dbg->de_dwarf_offset_size;
16349d3bc91SRichard Lowe     int upointer_size = dbg->de_pointer_size;
164*4d9fdb46SRobert Mustacchi 
165*4d9fdb46SRobert Mustacchi     /*  All dwarf versions so far use 2 here. */
166*4d9fdb46SRobert Mustacchi     Dwarf_Half version = 2;
167*4d9fdb46SRobert Mustacchi     int res = 0;
16849d3bc91SRichard Lowe 
16949d3bc91SRichard Lowe 
17049d3bc91SRichard Lowe     /* ***** BEGIN CODE ***** */
17149d3bc91SRichard Lowe 
17249d3bc91SRichard Lowe     /* Size of the .debug_aranges section header. */
173*4d9fdb46SRobert Mustacchi     arange_num_bytes = extension_word_size +
174*4d9fdb46SRobert Mustacchi         offset_size +       /* Size of length field.  */
175*4d9fdb46SRobert Mustacchi         DWARF_HALF_SIZE +    /* Size of version field. */
176*4d9fdb46SRobert Mustacchi         offset_size +            /* Size of .debug_info offset. */
17707dc1947SRichard Lowe         sizeof(Dwarf_Small) +   /* Size of address size field. */
17807dc1947SRichard Lowe         sizeof(Dwarf_Small);    /* Size of segment size field. */
17949d3bc91SRichard Lowe 
180*4d9fdb46SRobert Mustacchi     /*  Adjust the size so that the set of aranges begins on a boundary
181*4d9fdb46SRobert Mustacchi         that aligned with twice the address size.  This is a Libdwarf
182*4d9fdb46SRobert Mustacchi         requirement. */
18349d3bc91SRichard Lowe     remainder = arange_num_bytes % (2 * upointer_size);
18449d3bc91SRichard Lowe     if (remainder != 0)
18507dc1947SRichard Lowe         arange_num_bytes += (2 * upointer_size) - remainder;
18649d3bc91SRichard Lowe 
18749d3bc91SRichard Lowe 
18849d3bc91SRichard Lowe     /* Add the bytes for the actual address ranges. */
18949d3bc91SRichard Lowe     arange_num_bytes += upointer_size * 2 * (dbg->de_arange_count + 1);
19049d3bc91SRichard Lowe 
19149d3bc91SRichard Lowe     GET_CHUNK(dbg, dbg->de_elf_sects[DEBUG_ARANGES],
192*4d9fdb46SRobert Mustacchi         arange, (unsigned long) arange_num_bytes, error);
19349d3bc91SRichard Lowe     arange_ptr = arange;
19449d3bc91SRichard Lowe     if (extension_word_size) {
195*4d9fdb46SRobert Mustacchi         DISTINGUISHED_VALUE_ARRAY(v4);
19607dc1947SRichard Lowe         WRITE_UNALIGNED(dbg, (void *) arange_ptr,
197*4d9fdb46SRobert Mustacchi             (const void *)&v4[0] ,
198*4d9fdb46SRobert Mustacchi             SIZEOFT32, extension_word_size);
19907dc1947SRichard Lowe         arange_ptr += extension_word_size;
20049d3bc91SRichard Lowe     }
20149d3bc91SRichard Lowe 
20249d3bc91SRichard Lowe     /* Write the total length of .debug_aranges section. */
203*4d9fdb46SRobert Mustacchi     adjusted_length = arange_num_bytes - offset_size
20407dc1947SRichard Lowe         - extension_word_size;
20549d3bc91SRichard Lowe     {
20607dc1947SRichard Lowe         Dwarf_Unsigned du = adjusted_length;
20749d3bc91SRichard Lowe 
20807dc1947SRichard Lowe         WRITE_UNALIGNED(dbg, (void *) arange_ptr,
209*4d9fdb46SRobert Mustacchi             (const void *) &du, sizeof(du), offset_size);
210*4d9fdb46SRobert Mustacchi         arange_ptr += offset_size;
21149d3bc91SRichard Lowe     }
21249d3bc91SRichard Lowe 
21349d3bc91SRichard Lowe     /* Write the version as 2 bytes. */
21449d3bc91SRichard Lowe     {
215*4d9fdb46SRobert Mustacchi         Dwarf_Half verstamp = version;
21649d3bc91SRichard Lowe 
21707dc1947SRichard Lowe         WRITE_UNALIGNED(dbg, (void *) arange_ptr,
218*4d9fdb46SRobert Mustacchi             (const void *) &verstamp,
219*4d9fdb46SRobert Mustacchi             sizeof(verstamp), DWARF_HALF_SIZE);
220*4d9fdb46SRobert Mustacchi         arange_ptr += DWARF_HALF_SIZE;
22149d3bc91SRichard Lowe     }
22249d3bc91SRichard Lowe 
22349d3bc91SRichard Lowe 
22449d3bc91SRichard Lowe     /* Write the .debug_info offset.  This is always 0. */
22549d3bc91SRichard Lowe     WRITE_UNALIGNED(dbg, (void *) arange_ptr,
226*4d9fdb46SRobert Mustacchi         (const void *) &big_zero,
227*4d9fdb46SRobert Mustacchi         sizeof(big_zero), offset_size);
228*4d9fdb46SRobert Mustacchi     arange_ptr += offset_size;
22949d3bc91SRichard Lowe 
23049d3bc91SRichard Lowe     {
23107dc1947SRichard Lowe         unsigned long count = dbg->de_arange_count + 1;
232*4d9fdb46SRobert Mustacchi         int res2 = 0;
233*4d9fdb46SRobert Mustacchi         Dwarf_P_Per_Reloc_Sect p_reloc =
234*4d9fdb46SRobert Mustacchi             &dbg->de_reloc_sect[DEBUG_ARANGES];
23507dc1947SRichard Lowe 
236*4d9fdb46SRobert Mustacchi         if (dbg->de_relocate_pair_by_symbol) {
23707dc1947SRichard Lowe             count = (3 * dbg->de_arange_count) + 1;
23807dc1947SRichard Lowe         }
239*4d9fdb46SRobert Mustacchi         /*  The following is a small optimization: not needed for
240*4d9fdb46SRobert Mustacchi             correctness.  Does nothing if
241*4d9fdb46SRobert Mustacchi             preloc->pr_first_block is non-null */
242*4d9fdb46SRobert Mustacchi         res2 = _dwarf_pro_pre_alloc_specific_reloc_slots(dbg,
243*4d9fdb46SRobert Mustacchi             p_reloc, count);
244*4d9fdb46SRobert Mustacchi         if (res2 != DW_DLV_OK) {
245*4d9fdb46SRobert Mustacchi             _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
246*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
24707dc1947SRichard Lowe         }
24849d3bc91SRichard Lowe     }
24949d3bc91SRichard Lowe 
25049d3bc91SRichard Lowe     /* reloc for .debug_info */
251*4d9fdb46SRobert Mustacchi     res = dbg->de_relocate_by_name_symbol(dbg,
252*4d9fdb46SRobert Mustacchi         DEBUG_ARANGES,
253*4d9fdb46SRobert Mustacchi         extension_word_size +
254*4d9fdb46SRobert Mustacchi         offset_size + DWARF_HALF_SIZE,
255*4d9fdb46SRobert Mustacchi         dbg->de_sect_name_idx[DEBUG_INFO],
256*4d9fdb46SRobert Mustacchi         dwarf_drt_data_reloc, offset_size);
257*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_NO_ENTRY) {
258*4d9fdb46SRobert Mustacchi         return res;
259*4d9fdb46SRobert Mustacchi     }
260*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_ERROR) {
261*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error,DW_DLE_RELOCS_ERROR);
262*4d9fdb46SRobert Mustacchi         return res;
263*4d9fdb46SRobert Mustacchi     }
26449d3bc91SRichard Lowe 
26549d3bc91SRichard Lowe     /* Write the size of addresses. */
26649d3bc91SRichard Lowe     *arange_ptr = dbg->de_pointer_size;
26749d3bc91SRichard Lowe     arange_ptr++;
26849d3bc91SRichard Lowe 
269*4d9fdb46SRobert Mustacchi     /*  Write the size of segment addresses. This is zero for MIPS
270*4d9fdb46SRobert Mustacchi         architectures. */
27149d3bc91SRichard Lowe     *arange_ptr = 0;
27249d3bc91SRichard Lowe     arange_ptr++;
27349d3bc91SRichard Lowe 
274*4d9fdb46SRobert Mustacchi     /*  Skip over the padding to align the start of the actual address
275*4d9fdb46SRobert Mustacchi         ranges to twice the address size. */
27649d3bc91SRichard Lowe     if (remainder != 0)
27707dc1947SRichard Lowe         arange_ptr += (2 * upointer_size) - remainder;
27849d3bc91SRichard Lowe 
27949d3bc91SRichard Lowe 
28049d3bc91SRichard Lowe 
28149d3bc91SRichard Lowe 
28249d3bc91SRichard Lowe 
283*4d9fdb46SRobert Mustacchi     /*  The arange address, length are pointer-size fields of the target
284*4d9fdb46SRobert Mustacchi         machine. */
28549d3bc91SRichard Lowe     for (given_arange = dbg->de_arange; given_arange != NULL;
286*4d9fdb46SRobert Mustacchi         given_arange = given_arange->ag_next) {
28707dc1947SRichard Lowe 
28807dc1947SRichard Lowe         /* Write relocation record for beginning of address range. */
289*4d9fdb46SRobert Mustacchi         res = dbg->de_relocate_by_name_symbol(dbg, DEBUG_ARANGES,
290*4d9fdb46SRobert Mustacchi             arange_ptr - arange,       /* r_offset */
291*4d9fdb46SRobert Mustacchi             (long) given_arange->ag_symbol_index,
292*4d9fdb46SRobert Mustacchi             dwarf_drt_data_reloc, upointer_size);
29307dc1947SRichard Lowe         if (res != DW_DLV_OK) {
294*4d9fdb46SRobert Mustacchi             _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
295*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
29607dc1947SRichard Lowe         }
29707dc1947SRichard Lowe 
29807dc1947SRichard Lowe         /* Copy beginning address of range. */
29907dc1947SRichard Lowe         WRITE_UNALIGNED(dbg, (void *) arange_ptr,
300*4d9fdb46SRobert Mustacchi             (const void *) &given_arange->ag_begin_address,
301*4d9fdb46SRobert Mustacchi             sizeof(given_arange->ag_begin_address),
302*4d9fdb46SRobert Mustacchi             upointer_size);
30307dc1947SRichard Lowe         arange_ptr += upointer_size;
30407dc1947SRichard Lowe 
305*4d9fdb46SRobert Mustacchi         if (dbg->de_relocate_pair_by_symbol &&
30607dc1947SRichard Lowe             given_arange->ag_end_symbol_index != 0 &&
30707dc1947SRichard Lowe             given_arange->ag_length == 0) {
308*4d9fdb46SRobert Mustacchi             /*  symbolic reloc, need reloc for length What if we really
309*4d9fdb46SRobert Mustacchi                 know the length? If so, should use the other part of
310*4d9fdb46SRobert Mustacchi                 'if'. */
31107dc1947SRichard Lowe             Dwarf_Unsigned val;
31207dc1947SRichard Lowe 
313*4d9fdb46SRobert Mustacchi             res = dbg->de_relocate_pair_by_symbol(dbg,
314*4d9fdb46SRobert Mustacchi                 DEBUG_ARANGES,
315*4d9fdb46SRobert Mustacchi                 arange_ptr - arange,   /* r_offset */
316*4d9fdb46SRobert Mustacchi                 given_arange->ag_symbol_index,
317*4d9fdb46SRobert Mustacchi                 given_arange->ag_end_symbol_index,
318*4d9fdb46SRobert Mustacchi                 dwarf_drt_first_of_length_pair,
319*4d9fdb46SRobert Mustacchi                 upointer_size);
32007dc1947SRichard Lowe             if (res != DW_DLV_OK) {
321*4d9fdb46SRobert Mustacchi                 _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
322*4d9fdb46SRobert Mustacchi                 return DW_DLV_ERROR;
32307dc1947SRichard Lowe             }
32407dc1947SRichard Lowe 
325*4d9fdb46SRobert Mustacchi             /*  arange pre-calc so assem text can do .word end - begin
326*4d9fdb46SRobert Mustacchi                 + val (gets val from stream) */
32707dc1947SRichard Lowe             val = given_arange->ag_end_symbol_offset -
32807dc1947SRichard Lowe                 given_arange->ag_begin_address;
32907dc1947SRichard Lowe             WRITE_UNALIGNED(dbg, (void *) arange_ptr,
330*4d9fdb46SRobert Mustacchi                 (const void *) &val,
331*4d9fdb46SRobert Mustacchi                 sizeof(val), upointer_size);
33207dc1947SRichard Lowe             arange_ptr += upointer_size;
33307dc1947SRichard Lowe 
33407dc1947SRichard Lowe         } else {
33507dc1947SRichard Lowe             /* plain old length to copy, no relocation at all */
33607dc1947SRichard Lowe             WRITE_UNALIGNED(dbg, (void *) arange_ptr,
337*4d9fdb46SRobert Mustacchi                 (const void *) &given_arange->ag_length,
338*4d9fdb46SRobert Mustacchi                 sizeof(given_arange->ag_length),
339*4d9fdb46SRobert Mustacchi                 upointer_size);
34007dc1947SRichard Lowe             arange_ptr += upointer_size;
34107dc1947SRichard Lowe         }
34249d3bc91SRichard Lowe     }
34349d3bc91SRichard Lowe 
34449d3bc91SRichard Lowe     WRITE_UNALIGNED(dbg, (void *) arange_ptr,
345*4d9fdb46SRobert Mustacchi         (const void *) &big_zero,
346*4d9fdb46SRobert Mustacchi         sizeof(big_zero), upointer_size);
34749d3bc91SRichard Lowe 
34849d3bc91SRichard Lowe     arange_ptr += upointer_size;
34949d3bc91SRichard Lowe     WRITE_UNALIGNED(dbg, (void *) arange_ptr,
350*4d9fdb46SRobert Mustacchi         (const void *) &big_zero,
351*4d9fdb46SRobert Mustacchi         sizeof(big_zero), upointer_size);
352*4d9fdb46SRobert Mustacchi     *nbufs =  dbg->de_n_debug_sect;
353*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
35449d3bc91SRichard Lowe }
355