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#include <limits.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_incl.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_frame.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic void _dwarf_pro_add_to_fde(Dwarf_P_Fde fde,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Frame_Pgm inst);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*-------------------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe This function adds a cie struct to the debug pointer. Its in the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe form of a linked list.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe augmenter: string reps augmentation (implementation defined)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe code_align: alignment of code
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data_align: alignment of data
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe init_bytes: byts having initial instructions
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe init_n_bytes: number of bytes of initial instructions
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe--------------------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard LoweDwarf_Unsigned
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_add_frame_cie(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char *augmenter,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small code_align,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small data_align,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small return_reg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Ptr init_bytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned init_n_bytes, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Cie curcie;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_frame_cies == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_frame_cies = (Dwarf_P_Cie)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Cie_s));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_frame_cies == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_ALLOC, DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curcie = dbg->de_frame_cies;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_n_cie = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_last_cie = curcie;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curcie = dbg->de_last_cie;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curcie->cie_next = (Dwarf_P_Cie)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Cie_s));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curcie->cie_next == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_ALLOC, DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curcie = curcie->cie_next;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_n_cie++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_last_cie = curcie;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curcie->cie_version = DW_CIE_VERSION;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curcie->cie_aug = augmenter;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curcie->cie_code_align = code_align;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curcie->cie_data_align = data_align;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curcie->cie_ret_reg = return_reg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curcie->cie_inst = (char *) init_bytes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curcie->cie_inst_bytes = (long) init_n_bytes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curcie->cie_next = NULL;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return dbg->de_n_cie;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*-------------------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe This functions adds a fde struct to the debug pointer. Its in the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe form of a linked list.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe die: subprogram/function die corresponding to this fde
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cie: cie referred to by this fde, obtained from call to
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_frame_cie() routine.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe virt_addr: beginning address
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe code_len: length of code reps by the fde
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe--------------------------------------------------------------------------*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /*ARGSUSED*/ /* pretend all args used */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_add_frame_fde(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Fde fde,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Die die,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned cie,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned virt_addr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned code_len,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned symidx, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return dwarf_add_frame_fde_b(dbg, fde, die, cie, virt_addr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe code_len, symidx, 0, 0, error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*ARGSUSED10*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard LoweDwarf_Unsigned
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_add_frame_fde_b(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Fde fde,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Die die,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned cie,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned virt_addr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned code_len,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned symidx,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned symidx_of_end,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr offset_from_end_sym,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Fde curfde;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_die = die;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_cie = (long) cie;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_initloc = virt_addr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_r_symidx = symidx;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_addr_range = code_len;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_offset_into_exception_tables = DW_DLX_NO_EH_OFFSET;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_exception_table_symbol = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_end_symbol_offset = offset_from_end_sym;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_end_symbol = symidx_of_end;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_dbg = dbg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curfde = dbg->de_last_fde;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (curfde == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_frame_fdes = fde;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_last_fde = fde;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_n_fde = 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curfde->fde_next = fde;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_last_fde = fde;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_n_fde++;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return dbg->de_n_fde;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*-------------------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe This functions adds information to an fde. The fde is
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe linked into the linked list of fde's maintained in the Dwarf_P_Debug
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe structure.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg: The debug descriptor.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde: The fde to be added.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe die: subprogram/function die corresponding to this fde
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cie: cie referred to by this fde, obtained from call to
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_frame_cie() routine.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe virt_addr: beginning address
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe code_len: length of code reps by the fde
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe symidx: The symbol id of the symbol wrt to which relocation needs
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe to be performed for 'virt_addr'.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe offset_into_exception_tables: The start of exception tables for
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe this function (indicated as an offset into the exception
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe tables). A value of -1 indicates that there is no exception
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe table entries associated with this function.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe exception_table_symbol: The symbol id of the section for exception
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe tables wrt to which the offset_into_exception_tables will
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe be relocated.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe--------------------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard LoweDwarf_Unsigned
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_add_frame_info(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Fde fde,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Die die,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned cie,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned virt_addr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned code_len,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned symidx,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed offset_into_exception_tables,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned exception_table_symbol,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return dwarf_add_frame_info_b(dbg, fde, die, cie, virt_addr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe code_len, symidx,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* end_symbol */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* offset_from_end */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe offset_into_exception_tables,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe exception_table_symbol, error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /*ARGSUSED*/ /* pretend all args used */
07dc1947c362e187fb955d283b692f8769dd5defRichard LoweDwarf_Unsigned
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_add_frame_info_b(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Fde fde,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Die die,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned cie,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned virt_addr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned code_len,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned symidx,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned end_symidx,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned offset_from_end_symbol,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed offset_into_exception_tables,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned exception_table_symbol,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Fde curfde;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_die = die;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_cie = (long) cie;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_initloc = virt_addr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_r_symidx = symidx;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_addr_range = code_len;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_offset_into_exception_tables =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe offset_into_exception_tables;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_exception_table_symbol = exception_table_symbol;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_end_symbol_offset = offset_from_end_symbol;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_end_symbol = end_symidx;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_dbg = dbg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curfde = dbg->de_last_fde;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (curfde == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_frame_fdes = fde;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_last_fde = fde;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_n_fde = 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curfde->fde_next = fde;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_last_fde = fde;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_n_fde++;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return dbg->de_n_fde;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* This is an alternate to inserting frame instructions
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe one instruction at a time. But use either this
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe or instruction level, not both in one fde. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_insert_fde_inst_bytes(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Fde fde,Dwarf_Unsigned len, Dwarf_Ptr ibytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error *error)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if( len == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(fde->fde_block || fde->fde_inst) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DUPLICATE_INST_BLOCK,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (int)DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_block = (Dwarf_Ptr)_dwarf_p_get_alloc(dbg, len);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy(fde->fde_block,ibytes,len);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_inst_block_size = len;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_n_bytes += len;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*-------------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Create a new fde.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe---------------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard LoweDwarf_P_Fde
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_new_fde(Dwarf_P_Debug dbg, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Fde fde;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde = (Dwarf_P_Fde)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Fde_s));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (fde == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_FDE_ALLOC,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_P_Fde) DW_DLV_BADADDR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_uwordb_size = dbg->de_offset_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return fde;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*------------------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Add a cfe_offset instruction to the fde passed in.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe-------------------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard LoweDwarf_P_Fde
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_fde_cfa_offset(Dwarf_P_Fde fde,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned reg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed offset, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Ubyte opc, regno;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe char *ptr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Frame_Pgm curinst;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int nbytes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe char buff1[ENCODE_SPACE_NEEDED];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Debug dbg = fde->fde_dbg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curinst = (Dwarf_P_Frame_Pgm)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Frame_Pgm_s));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (curinst == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_FPGM_ALLOC,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_P_Fde) DW_DLV_BADADDR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe opc = DW_CFA_offset;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe regno = reg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (regno & 0xc0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_REGNO_OVFL,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_P_Fde) DW_DLV_BADADDR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe opc = opc | regno; /* lower 6 bits are register number */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curinst->dfp_opcode = opc;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe res = _dwarf_pro_encode_leb128_nm(offset, &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (ptr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe memcpy(ptr, buff1, nbytes);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curinst->dfp_args = ptr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curinst->dfp_nbytes = nbytes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curinst->dfp_next = NULL;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_pro_add_to_fde(fde, curinst);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return fde;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Generic routine to add opcode to fde instructions. val1 and
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe val2 are parameters whose interpretation depends on the 'op'.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This does not work properly for DW_DLC_SYMBOLIC_RELOCATIONS
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe for DW_CFA_set_loc or DW_DVA_advance_loc* 'op', as
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe these ops normally are addresses or (DW_CFA_set_loc)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe or code lengths (DW_DVA_advance_loc*) and such must be
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe represented with relocations and symbol indices for
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe DW_DLC_SYMBOLIC_RELOCATIONS.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe This does not treat all DW_CFA instructions yet.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe For certain operations a val? value must be
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe signed (though passed in as unsigned here).
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Currently this does not check that the frame
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe version is 3(for dwarf3) or 4 (for dwarf4)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe when applying operations that are only valid for
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf3 or dwarf4.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard LoweDwarf_P_Fde
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_add_fde_inst(Dwarf_P_Fde fde,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small op,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned val1,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned val2, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Frame_Pgm curinst;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int nbytes, nbytes1, nbytes2;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Ubyte db;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Half dh;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Word dw;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned du;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe char *ptr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe char buff1[ENCODE_SPACE_NEEDED];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe char buff2[ENCODE_SPACE_NEEDED];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Debug dbg = fde->fde_dbg;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* This is a hack telling the code when to transform
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe a value to a signed leb number. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int signed_second = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int signed_first = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe nbytes = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ptr = NULL;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curinst = (Dwarf_P_Frame_Pgm)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Frame_Pgm_s));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (curinst == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_FPGM_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe switch (op) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_CFA_advance_loc:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (val1 <= 0x3f) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = val1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe op |= db;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* test not portable FIX */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (val1 <= UCHAR_MAX) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe op = DW_CFA_advance_loc1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = val1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = (char *) _dwarf_p_get_alloc(dbg, 1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (ptr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) ptr, (const void *) &db, 1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbytes = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* test not portable FIX */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (val1 <= USHRT_MAX) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe op = DW_CFA_advance_loc2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dh = val1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = (char *) _dwarf_p_get_alloc(dbg, 2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (ptr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) ptr, (const void *) &dh, 2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbytes = 2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* test not portable FIX */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (val1 <= ULONG_MAX) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe op = DW_CFA_advance_loc4;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dw = (Dwarf_Word) val1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = (char *) _dwarf_p_get_alloc(dbg, 4);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (ptr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) ptr, (const void *) &dw, 4);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbytes = 4;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe op = DW_CFA_MIPS_advance_loc8;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = val1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (char *) _dwarf_p_get_alloc(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Unsigned));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (ptr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) ptr, (const void *) &du, 8);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbytes = 8;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_CFA_offset:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (val1 <= MAX_6_BIT_VALUE) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = val1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe op |= db;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(val2, &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (ptr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy(ptr, buff1, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe op = DW_CFA_offset_extended;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe goto two_leb;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_CFA_offset_extended_sf: /* DWARF3 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe signed_second = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe goto two_leb;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_CFA_offset_extended:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe goto two_leb;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_CFA_undefined:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_CFA_same_value:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe goto one_leb;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_CFA_val_offset:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe goto two_leb;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_CFA_val_offset_sf:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe signed_second = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe goto two_leb;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_CFA_def_cfa_sf:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe signed_second = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe goto two_leb;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_CFA_register:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_CFA_def_cfa:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe two_leb:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(val1, &nbytes1,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (!signed_second) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(val2, &nbytes2,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff2, sizeof(buff2));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed val2s = val2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_signed_leb128_nm(val2s, &nbytes2,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff2, sizeof(buff2));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(val2, &nbytes2,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff2, sizeof(buff2));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes1 + nbytes2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (ptr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy(ptr, buff1, nbytes1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy(ptr + nbytes1, buff2, nbytes2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbytes = nbytes1 + nbytes2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_CFA_def_cfa_offset_sf: /* DWARF3 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe signed_first = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe goto one_leb;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_CFA_def_cfa_register:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_CFA_def_cfa_offset:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe one_leb:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(!signed_first) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(val1, &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed val1s = val1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_signed_leb128_nm(val1s, &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (ptr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy(ptr, buff1, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_CFA_def_cfa_expression: /* DWARF3 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* FIXME: argument is dwarf expr, not handled yet. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_CFA_expression: /* DWARF3 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* First arg: ULEB reg num. 2nd arg dwarf expr in form block.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe FIXME: not handled yet. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_CFA_val_expression: /* DWARF3f */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* First arg: ULEB reg num. 2nd arg dwarf expr in form block.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe FIXME: not handled yet. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe default:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_DEBUGFRAME_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_P_Fde) DW_DLV_BADADDR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curinst->dfp_opcode = op;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curinst->dfp_args = ptr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curinst->dfp_nbytes = nbytes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curinst->dfp_next = NULL;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_pro_add_to_fde(fde, curinst);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return fde;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*------------------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Instructions are added to an fde in the form of a linked
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe list. This function manages the linked list.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe-------------------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowevoid
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_add_to_fde(Dwarf_P_Fde fde, Dwarf_P_Frame_Pgm curinst)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (fde->fde_last_inst) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_last_inst->dfp_next = curinst;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_last_inst = curinst;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_n_inst++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_n_bytes +=
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (long) (curinst->dfp_nbytes + sizeof(Dwarf_Ubyte));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_last_inst = curinst;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_inst = curinst;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_n_inst = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_n_bytes =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (long) (curinst->dfp_nbytes + sizeof(Dwarf_Ubyte));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}