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