07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved.
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 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 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 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,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Mountain View, CA 94043, or:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe For further information regarding this notice, see:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe http://oss.sgi.com/projects/GenInfo/NoticeExplan
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic void _dwarf_pro_add_to_fde(Dwarf_P_Fde fde,
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--------------------------------------------------------------------------*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned init_n_bytes, Dwarf_Error * error)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Cie_s));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_ALLOC, DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Cie_s));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_ALLOC, DW_DLV_NOCOUNT);
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--------------------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return dwarf_add_frame_fde_b(dbg, fde, die, cie, virt_addr,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*ARGSUSED10*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_offset_into_exception_tables = DW_DLX_NO_EH_OFFSET;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_end_symbol_offset = offset_from_end_sym;
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 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 Lowe return dwarf_add_frame_info_b(dbg, fde, die, cie, virt_addr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* end_symbol */ 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* offset_from_end */ 0,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_exception_table_symbol = exception_table_symbol;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe fde->fde_end_symbol_offset = offset_from_end_symbol;
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 Lowe Dwarf_P_Fde fde,Dwarf_Unsigned len, Dwarf_Ptr ibytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DUPLICATE_INST_BLOCK,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde->fde_block = (Dwarf_Ptr)_dwarf_p_get_alloc(dbg, len);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*-------------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Create a new fde.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe---------------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_new_fde(Dwarf_P_Debug dbg, Dwarf_Error * error)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Fde_s));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*------------------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Add a cfe_offset instruction to the fde passed in.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe-------------------------------------------------------------------------*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Frame_Pgm_s));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe opc = opc | regno; /* lower 6 bits are register number */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe res = _dwarf_pro_encode_leb128_nm(offset, &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
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 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.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe This does not treat all DW_CFA instructions yet.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe For certain operations a val? value must be
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe signed (though passed in as unsigned here).
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 /* This is a hack telling the code when to transform
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe a value to a signed leb number. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Frame_Pgm_s));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* test not portable FIX */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* test not portable FIX */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* test not portable FIX */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(val2, &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(val1, &nbytes1,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(val2, &nbytes2,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_signed_leb128_nm(val2s, &nbytes2,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(val2, &nbytes2,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes1 + nbytes2);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(val1, &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_signed_leb128_nm(val1s, &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* FIXME: argument is dwarf expr, not handled yet. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* First arg: ULEB reg num. 2nd arg dwarf expr in form block.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe FIXME: not handled yet. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* First arg: ULEB reg num. 2nd arg dwarf expr in form block.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe FIXME: not handled yet. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_DEBUGFRAME_ERROR);
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 Lowe_dwarf_pro_add_to_fde(Dwarf_P_Fde fde, Dwarf_P_Frame_Pgm curinst)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (long) (curinst->dfp_nbytes + sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (long) (curinst->dfp_nbytes + sizeof(Dwarf_Ubyte));