49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This program is free software; you can redistribute it and/or modify it
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe under the terms of version 2.1 of the GNU Lesser General Public License
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe as published by the Free Software Foundation.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This program is distributed in the hope that it would be useful, but
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WITHOUT ANY WARRANTY; without even the implied warranty of
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Further, this software is distributed without any warranty that it is
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe free of the rightful claim of any third person regarding infringement
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe or the like. Any license provided herein, whether implied or
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe otherwise, applies only to this software file. Patent licenses, if
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe any, provided herein do not apply to combinations of this program with
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe other software, or any other product whatsoever.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe You should have received a copy of the GNU Lesser General Public
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe License along with this program; if not, write the Free Software
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe USA.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Mountain View, CA 94043, or:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe http://www.sgi.com
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe For further information regarding this notice, see:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe http://oss.sgi.com/projects/GenInfo/NoticeExplan
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "config.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "libdwarfdefs.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <stdio.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <string.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#ifdef HAVE_ELFACCESS_H
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <elfaccess.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#endif
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_incl.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_arange.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_section.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_reloc.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This function adds another address range
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe to the list of address ranges for the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe given Dwarf_P_Debug. It returns 0 on error,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe and 1 otherwise.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard LoweDwarf_Unsigned
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_add_arange(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr begin_address,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned length,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed symbol_index, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return dwarf_add_arange_b(dbg, begin_address, length, symbol_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* end_symbol_index */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* offset_from_end_sym */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This function adds another address range
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe to the list of address ranges for the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe given Dwarf_P_Debug. It returns 0 on error,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe and 1 otherwise.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard LoweDwarf_Unsigned
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_add_arange_b(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr begin_address,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned length,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned symbol_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned end_symbol_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr offset_from_end_sym, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Arange arange;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe arange = (Dwarf_P_Arange)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Arange_s));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (arange == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe arange->ag_begin_address = begin_address;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe arange->ag_length = length;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe arange->ag_symbol_index = symbol_index;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe arange->ag_end_symbol_index = end_symbol_index;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe arange->ag_end_symbol_offset = offset_from_end_sym;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_arange == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_arange = dbg->de_last_arange = arange;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_last_arange->ag_next = arange;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_last_arange = arange;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_arange_count++;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (1);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_transform_arange_to_disk(Dwarf_P_Debug dbg, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Total num of bytes in .debug_aranges section. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned arange_num_bytes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Adjustment to align the start of the actual address ranges on a
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe boundary aligned with twice the address size. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Small remainder;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Total number of bytes excluding the length field. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned adjusted_length;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Points to first byte of .debug_aranges buffer. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Small *arange;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Fills in the .debug_aranges buffer. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Small *arange_ptr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Scans the list of address ranges provided by user. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Arange given_arange;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Used to fill in 0. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe const Dwarf_Signed big_zero = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int extension_word_size = dbg->de_64bit_extension ? 4 : 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int uword_size = dbg->de_offset_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int upointer_size = dbg->de_pointer_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* ***** BEGIN CODE ***** */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Size of the .debug_aranges section header. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_num_bytes = extension_word_size + uword_size + /* Size
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe of
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe length
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe field.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Half) + /* Size of version field. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe uword_size + /* Size of .debug_info offset. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Small) + /* Size of address size field. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Small); /* Size of segment size field. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Adjust the size so that the set of aranges begins on a boundary
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe that aligned with twice the address size. This is a Libdwarf
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe requirement. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe remainder = arange_num_bytes % (2 * upointer_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (remainder != 0)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_num_bytes += (2 * upointer_size) - remainder;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Add the bytes for the actual address ranges. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe arange_num_bytes += upointer_size * 2 * (dbg->de_arange_count + 1);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe GET_CHUNK(dbg, dbg->de_elf_sects[DEBUG_ARANGES],
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange, (unsigned long) arange_num_bytes, error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe arange_ptr = arange;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (arange == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (extension_word_size) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word x = DISTINGUISHED_VALUE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) arange_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &x,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(x), extension_word_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_ptr += extension_word_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Write the total length of .debug_aranges section. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe adjusted_length = arange_num_bytes - uword_size
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe - extension_word_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned du = adjusted_length;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) arange_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du, sizeof(du), uword_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_ptr += uword_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Write the version as 2 bytes. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half verstamp = CURRENT_VERSION_STAMP;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) arange_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &verstamp,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(verstamp), sizeof(Dwarf_Half));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_ptr += sizeof(Dwarf_Half);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Write the .debug_info offset. This is always 0. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) arange_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &big_zero,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(big_zero), uword_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe arange_ptr += uword_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned long count = dbg->de_arange_count + 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_reloc_pair) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe count = (3 * dbg->de_arange_count) + 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* the following is a small optimization: not needed for
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe correctness */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_pre_alloc_n_reloc_slots(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DEBUG_ARANGES, count);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* reloc for .debug_info */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe res = dbg->de_reloc_name(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DEBUG_ARANGES,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe extension_word_size +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe uword_size + sizeof(Dwarf_Half),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_sect_name_idx[DEBUG_INFO],
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_drt_data_reloc, uword_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Write the size of addresses. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *arange_ptr = dbg->de_pointer_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe arange_ptr++;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Write the size of segment addresses. This is zero for MIPS
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe architectures. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *arange_ptr = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe arange_ptr++;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Skip over the padding to align the start of the actual address
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ranges to twice the address size. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (remainder != 0)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_ptr += (2 * upointer_size) - remainder;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* The arange address, length are pointer-size fields of the target
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe machine. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe for (given_arange = dbg->de_arange; given_arange != NULL;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe given_arange = given_arange->ag_next) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Write relocation record for beginning of address range. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = dbg->de_reloc_name(dbg, DEBUG_ARANGES, arange_ptr - arange, /* r_offset
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (long) given_arange->ag_symbol_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_drt_data_reloc, upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Copy beginning address of range. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) arange_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &given_arange->ag_begin_address,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(given_arange->ag_begin_address),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_ptr += upointer_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_reloc_pair &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe given_arange->ag_end_symbol_index != 0 &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe given_arange->ag_length == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* symbolic reloc, need reloc for length What if we really
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe know the length? If so, should use the other part of
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 'if'. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned val;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = dbg->de_reloc_pair(dbg, DEBUG_ARANGES, arange_ptr - arange, /* r_offset
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe given_arange->ag_symbol_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe given_arange->ag_end_symbol_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_drt_first_of_length_pair,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* arrange pre-calc so assem text can do .word end - begin
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe + val (gets val from stream) */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe val = given_arange->ag_end_symbol_offset -
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe given_arange->ag_begin_address;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) arange_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &val,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(val), upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_ptr += upointer_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* plain old length to copy, no relocation at all */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) arange_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &given_arange->ag_length,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(given_arange->ag_length),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_ptr += upointer_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) arange_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &big_zero,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(big_zero), upointer_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe arange_ptr += upointer_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) arange_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &big_zero,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(big_zero), upointer_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (int) dbg->de_n_debug_sect;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}