07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Copyright (C) 2000-2006 Silicon Graphics, Inc. All Rights Reserved.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe This program is free software; you can redistribute it and/or modify it
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe under the terms of version 2.1 of the GNU Lesser General Public License
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe as published by the Free Software Foundation.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe This program is distributed in the hope that it would be useful, but
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WITHOUT ANY WARRANTY; without even the implied warranty of
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Further, this software is distributed without any warranty that it is
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe free of the rightful claim of any third person regarding infringement
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe or the like. Any license provided herein, whether implied or
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe otherwise, applies only to this software file. Patent licenses, if
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe any, provided herein do not apply to combinations of this program with
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe other software, or any other product whatsoever.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe You should have received a copy of the GNU Lesser General Public
07dc1947c362e187fb955d283b692f8769dd5defRichard 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,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe USA.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Mountain View, CA 94043, or:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe http://www.sgi.com
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe For further information regarding this notice, see:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe http://oss.sgi.com/projects/GenInfo/NoticeExplan
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#include "config.h"
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#include "dwarf_incl.h"
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#include <stdio.h>
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#include <stdlib.h>
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#include "dwarf_frame.h"
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#include "dwarf_arange.h" /* using Arange as a way to build a list */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Used by rqs (an IRIX application).
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Not needed except for that one application.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Should be moved to its own source file since
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe it is so rarely needed.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Returns DW_DLV_OK if returns the arrays.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Returns DW_DLV_NO_ENTRY if no section. ?? (How do I tell?)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Returns DW_DLV_ERROR if there is an error.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Uses DW_FRAME_CFA_COL because IRIX is only DWARF2
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe and that is what IRIX compilers and compatible
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe compilers support on IRIX.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe_dwarf_frame_address_offsets(Dwarf_Debug dbg, Dwarf_Addr ** addrlist,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Off ** offsetlist,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed * returncount,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * err)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int retval = DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = DW_DLV_ERROR;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Cie *cie_data;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed cie_count;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Fde *fde_data;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed fde_count;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed i;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Frame_Op *frame_inst;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Fde fdep;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Cie ciep;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Chain curr_chain = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Chain head_chain = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Chain prev_chain = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Arange arange;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned arange_count = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr *arange_addrs = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Off *arange_offsets = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = dwarf_get_fde_list(dbg, &cie_data, &cie_count,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &fde_data, &fde_count, err);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_load_section(dbg, &dbg->de_debug_frame, err);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i = 0; i < cie_count; i++) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Off instoff = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed initial_instructions_length = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *instr_end = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Sword icount = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int j = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int dw_err;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ciep = cie_data[i];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe instoff = ciep->ci_cie_instr_start - dbg->de_debug_frame.dss_data;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe initial_instructions_length = ciep->ci_length +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ciep->ci_length_size + ciep->ci_extension_size -
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (ciep->ci_cie_instr_start - ciep->ci_cie_start);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe instr_end = ciep->ci_cie_instr_start +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe initial_instructions_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_exec_frame_instr( /* make_instr */ true,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &frame_inst,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* search_pc= */ false,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* search_pc_val= */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* location */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ciep->ci_cie_instr_start,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe instr_end,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Dwarf_frame= */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* cie= */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_FRAME_CFA_COL,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &icount, &dw_err);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res == DW_DLV_ERROR) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, err, dw_err);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (res);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (res == DW_DLV_NO_ENTRY) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (j = 0; j < icount; ++j) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Frame_Op *finst = frame_inst + j;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (finst->fp_base_op == 0 && finst->fp_extended_op == 1) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* is DW_CFA_set_loc */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr add = (Dwarf_Addr) finst->fp_offset;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Off off = finst->fp_instr_offset + instoff;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange = (Dwarf_Arange)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_get_alloc(dbg, DW_DLA_ARANGE, 1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (arange == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange->ar_address = add;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange->ar_info_offset = off;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_count++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curr_chain = (Dwarf_Chain)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curr_chain == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curr_chain->ch_item = arange;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (head_chain == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe head_chain = prev_chain = curr_chain;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prev_chain->ch_next = curr_chain;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prev_chain = curr_chain;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_dealloc(dbg, frame_inst, DW_DLA_FRAME_BLOCK);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i = 0; i < fde_count; i++) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *instr_end = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Sword icount = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed instructions_length = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Off instoff = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Off off = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr addr = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int j = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int dw_err;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fdep = fde_data[i];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe off = fdep->fd_initial_loc_pos - dbg->de_debug_frame.dss_data;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe addr = fdep->fd_initial_location;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange = (Dwarf_Arange)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_get_alloc(dbg, DW_DLA_ARANGE, 1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (arange == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange->ar_address = addr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange->ar_info_offset = off;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_count++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curr_chain = (Dwarf_Chain)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curr_chain == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curr_chain->ch_item = arange;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (head_chain == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe head_chain = prev_chain = curr_chain;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prev_chain->ch_next = curr_chain;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prev_chain = curr_chain;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe instoff = fdep->fd_fde_instr_start - dbg->de_debug_frame.dss_data;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe instructions_length = fdep->fd_length +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fdep->fd_length_size + fdep->fd_extension_size -
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (fdep->fd_fde_instr_start - fdep->fd_fde_start);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe instr_end = fdep->fd_fde_instr_start + instructions_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_exec_frame_instr( /* make_instr */ true,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &frame_inst,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* search_pc= */ false,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* search_pc_val= */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* location */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fdep->fd_fde_instr_start,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe instr_end,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Dwarf_frame= */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* cie= */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_FRAME_CFA_COL,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &icount, &dw_err);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res == DW_DLV_ERROR) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, err, dw_err);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (res);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (res == DW_DLV_NO_ENTRY) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (j = 0; j < icount; ++j) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Frame_Op *finst2 = frame_inst + j;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (finst2->fp_base_op == 0 && finst2->fp_extended_op == 1) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* is DW_CFA_set_loc */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr add = (Dwarf_Addr) finst2->fp_offset;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Off off = finst2->fp_instr_offset + instoff;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange = (Dwarf_Arange)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_get_alloc(dbg, DW_DLA_ARANGE, 1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (arange == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange->ar_address = add;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange->ar_info_offset = off;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_count++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curr_chain = (Dwarf_Chain)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curr_chain == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curr_chain->ch_item = arange;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (head_chain == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe head_chain = prev_chain = curr_chain;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prev_chain->ch_next = curr_chain;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prev_chain = curr_chain;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_dealloc(dbg, frame_inst, DW_DLA_FRAME_BLOCK);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_dealloc(dbg, fde_data, DW_DLA_LIST);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_dealloc(dbg, cie_data, DW_DLA_LIST);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_addrs = (Dwarf_Addr *)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_get_alloc(dbg, DW_DLA_ADDR, arange_count);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (arange_addrs == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_offsets = (Dwarf_Off *)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_get_alloc(dbg, DW_DLA_ADDR, arange_count);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (arange_offsets == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curr_chain = head_chain;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i = 0; i < arange_count; i++) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Arange ar = curr_chain->ch_item;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_addrs[i] = ar->ar_address;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arange_offsets[i] = ar->ar_info_offset;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prev_chain = curr_chain;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curr_chain = curr_chain->ch_next;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_dealloc(dbg, ar, DW_DLA_ARANGE);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_dealloc(dbg, prev_chain, DW_DLA_CHAIN);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *returncount = arange_count;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *offsetlist = arange_offsets;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *addrlist = arange_addrs;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return retval;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}