49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Copyright (C) 2000,2004,2006 Silicon Graphics, Inc. All Rights Reserved.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Portions Copyright 2002-2010 Sun Microsystems, 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*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe SGI has moved from the Crittenden Lane address.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard 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_section.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_line.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_frame.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_die.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_macinfo.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_types.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#ifndef SHF_MIPS_NOSTRIP
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/* if this is not defined, we probably don't need it: just use 0 */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#define SHF_MIPS_NOSTRIP 0
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#endif
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#ifndef R_MIPS_NONE
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#define R_MIPS_NONE 0
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#endif
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#ifndef TRUE
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#define TRUE 1
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#endif
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#ifndef FALSE
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#define FALSE 0
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#endif
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/* must match up with pro_section.h defines of DEBUG_INFO etc
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweand sectnames (below). REL_SEC_PREFIX is either ".rel" or ".rela"
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowesee pro_incl.h
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowechar *_dwarf_rel_section_names[] = {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_info",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_line",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_abbrev", /* no relocations on this, really */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_frame",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_aranges",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_pubnames",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_str",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_funcnames", /* sgi extension */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_typenames", /* sgi extension */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_varnames", /* sgi extension */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_weaknames", /* sgi extension */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_macinfo",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe REL_SEC_PREFIX ".debug_loc"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe};
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/* names of sections. Ensure that it matches the defines
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe in pro_section.h, in the same order
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Must match also _dwarf_rel_section_names above
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowechar *_dwarf_sectnames[] = {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".debug_info",
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".debug_line",
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".debug_abbrev",
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".debug_frame",
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".debug_aranges",
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".debug_pubnames",
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".debug_str",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ".debug_funcnames", /* sgi extension */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ".debug_typenames", /* sgi extension */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ".debug_varnames", /* sgi extension */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ".debug_weaknames", /* sgi extension */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".debug_macinfo",
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".debug_loc"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe};
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowestatic Dwarf_Ubyte std_opcode_len[] = { 0, /* DW_LNS_copy */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 1, /* DW_LNS_advance_pc */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 1, /* DW_LNS_advance_line */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 1, /* DW_LNS_set_file */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 1, /* DW_LNS_set_column */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 0, /* DW_LNS_negate_stmt */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 0, /* DW_LNS_set_basic_block */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 0, /* DW_LNS_const_add_pc */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 1, /* DW_LNS_fixed_advance_pc */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe};
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/* struct to hold relocation entries. Its mantained as a linked
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe list of relocation structs, and will then be written at as a
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe whole into the relocation section. Whether its 32 bit or
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe 64 bit will be obtained from Dwarf_Debug pointer.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowetypedef struct Dwarf_P_Rel_s *Dwarf_P_Rel;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestruct Dwarf_P_Rel_s {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Rel dr_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe void *dr_rel_datap;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe};
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowetypedef struct Dwarf_P_Rel_Head_s *Dwarf_P_Rel_Head;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestruct Dwarf_P_Rel_Head_s {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe struct Dwarf_P_Rel_s *drh_head;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe struct Dwarf_P_Rel_s *drh_tail;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe};
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int _dwarf_pro_generate_debugline(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int _dwarf_pro_generate_debugframe(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int _dwarf_pro_generate_debuginfo(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic Dwarf_P_Abbrev _dwarf_pro_getabbrev(Dwarf_P_Die, Dwarf_P_Abbrev);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int _dwarf_pro_match_attr
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe (Dwarf_P_Attribute, Dwarf_P_Abbrev, int no_attr);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/* these macros used as return value for below functions */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#define OPC_INCS_ZERO -1
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#define OPC_OUT_OF_RANGE -2
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#define LINE_OUT_OF_RANGE -3
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int _dwarf_pro_get_opc(Dwarf_Unsigned addr_adv, int line_adv);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* BEGIN_LEN_SIZE is the size of the 'length' field in total.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Which may be 4,8, or 12 bytes!
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 4 is standard DWARF2.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 8 is non-standard MIPS-IRIX 64-bit.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 12 is standard DWARF3 for 64 bit offsets.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Used in various routines: local variable names
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe must match the names here.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#define BEGIN_LEN_SIZE (uwordb_size + extension_size)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Return TRUE if we need the section, FALSE otherwise
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe If any of the 'line-data-related' calls were made
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe including file or directory entries,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe produce .debug_line .
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_need_debug_line_section(Dwarf_P_Debug dbg)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_lines == NULL && dbg->de_file_entries == NULL
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe && dbg->de_inc_dirs == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return FALSE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return TRUE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Convert debug information to a format such that
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe it can be written on disk.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Called exactly once per execution.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard LoweDwarf_Signed
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_transform_to_disk_form(Dwarf_P_Debug dbg, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Section data in written out in a number of buffers. Each
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _generate_*() function returns a cumulative count of buffers for
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe all the sections. get_section_bytes() returns pointers to these
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe buffers one at a time. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int nbufs = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int sect = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int err = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned du = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_version_magic_number != PRO_VERSION_MAGIC) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_IA, DW_DLV_NOCOUNT);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Create dwarf section headers */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe for (sect = 0; sect < NUM_DEBUG_SECTIONS; sect++) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe long flags = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe switch (sect) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_INFO:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_dies == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_LINE:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dwarf_need_debug_line_section(dbg) == FALSE) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_ABBREV:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_dies == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_FRAME:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_frame_cies == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe flags = SHF_MIPS_NOSTRIP;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_ARANGES:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_arange == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_PUBNAMES:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_simple_name_headers[dwarf_snk_pubname].
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sn_head == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_STR:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_strings == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_FUNCNAMES:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_simple_name_headers[dwarf_snk_funcname].
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sn_head == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_TYPENAMES:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_simple_name_headers[dwarf_snk_typename].
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sn_head == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_VARNAMES:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_simple_name_headers[dwarf_snk_varname].
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sn_head == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_WEAKNAMES:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_simple_name_headers[dwarf_snk_weakname].
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sn_head == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_MACINFO:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_first_macinfo == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DEBUG_LOC:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* not handled yet */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe default:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* logic error: missing a case */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_ELF_SECT_ERR, DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int new_base_elf_sect;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_callback_func_b) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe new_base_elf_sect =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_callback_func_b(_dwarf_sectnames[sect],
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* rec size */ 1,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe SECTION_TYPE,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe flags, SHN_UNDEF, 0, &du, &err);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int name_idx = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe new_base_elf_sect = dbg->de_callback_func(
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_sectnames[sect],
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_relocation_record_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe SECTION_TYPE, flags,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe SHN_UNDEF, 0,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &name_idx, &err);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = name_idx;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (new_base_elf_sect == -1) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_ELF_SECT_ERR,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_elf_sects[sect] = new_base_elf_sect;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_sect_name_idx[sect] = du;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe nbufs = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Changing the order in which the sections are generated may cause
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe problems because of relocations. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dwarf_need_debug_line_section(dbg) == TRUE) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbufs = _dwarf_pro_generate_debugline(dbg, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (nbufs < 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGLINE_ERROR,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_frame_cies) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbufs = _dwarf_pro_generate_debugframe(dbg, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (nbufs < 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGFRAME_ERROR,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_first_macinfo) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbufs = _dwarf_pro_transform_macro_info_to_disk(dbg, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (nbufs < 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGMACINFO_ERROR,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_dies) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbufs = _dwarf_pro_generate_debuginfo(dbg, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (nbufs < 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_arange) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbufs = _dwarf_transform_arange_to_disk(dbg, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (nbufs < 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_simple_name_headers[dwarf_snk_pubname].sn_head) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbufs = _dwarf_transform_simplename_to_disk(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_snk_pubname,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DEBUG_PUBNAMES,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (nbufs < 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_simple_name_headers[dwarf_snk_funcname].sn_head) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbufs = _dwarf_transform_simplename_to_disk(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_snk_funcname,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DEBUG_FUNCNAMES,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (nbufs < 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_simple_name_headers[dwarf_snk_typename].sn_head) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbufs = _dwarf_transform_simplename_to_disk(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_snk_typename,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DEBUG_TYPENAMES,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (nbufs < 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_simple_name_headers[dwarf_snk_varname].sn_head) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbufs = _dwarf_transform_simplename_to_disk(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_snk_varname,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DEBUG_VARNAMES,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (nbufs < 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_simple_name_headers[dwarf_snk_weakname].sn_head) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbufs = _dwarf_transform_simplename_to_disk(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_snk_weakname, DEBUG_WEAKNAMES, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (nbufs < 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed new_secs = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = dbg->de_transform_relocs_to_disk(dbg, &new_secs);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLV_NOCOUNT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbufs += new_secs;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return nbufs;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*---------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Generate debug_line section
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe---------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_generate_debugline(Dwarf_P_Debug dbg, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Inc_Dir curdir = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_F_Entry curentry = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Line curline = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Line prevline = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* all data named cur* are used to loop thru linked lists */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int sum_bytes = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int prolog_size = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned char *data = 0; /* holds disk form data */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int elfsectno = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned char *start_line_sec = 0; /* pointer to the buffer at
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section start */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* temps for memcpy */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned du = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Ubyte db = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half dh = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int uwordb_size = dbg->de_offset_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int extension_size = dbg->de_64bit_extension ? 4 : 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int upointer_size = dbg->de_pointer_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe char buff1[ENCODE_SPACE_NEEDED];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe sum_bytes = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe elfsectno = dbg->de_elf_sects[DEBUG_LINE];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* include directories */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curdir = dbg->de_inc_dirs;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (curdir) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prolog_size += strlen(curdir->did_name) + 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdir = curdir->did_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prolog_size++; /* last null following last directory
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe entry. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* file entries */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curentry = dbg->de_file_entries;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (curentry) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prolog_size +=
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe strlen(curentry->dfe_name) + 1 + curentry->dfe_nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curentry = curentry->dfe_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prolog_size++; /* last null byte */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prolog_size += BEGIN_LEN_SIZE + sizeof_uhalf(dbg) + /* version # */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe uwordb_size + /* header length */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof_ubyte(dbg) + /* min_instr length */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof_ubyte(dbg) + /* default is_stmt */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof_ubyte(dbg) + /* linebase */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof_ubyte(dbg) + /* linerange */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof_ubyte(dbg); /* opcode base */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* length of table specifying # of opnds */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe prolog_size += sizeof(std_opcode_len);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe GET_CHUNK(dbg, elfsectno, data, prolog_size, error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe start_line_sec = data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* copy over the data */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* total_length */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe du = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (extension_size) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word x = DISTINGUISHED_VALUE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &x,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(x), extension_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += extension_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &du,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(du), uwordb_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data += uwordb_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dh = VERSION;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &dh,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(dh), sizeof(Dwarf_Half));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data += sizeof(Dwarf_Half);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* header length */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = prolog_size - (BEGIN_LEN_SIZE + sizeof(Dwarf_Half) +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe uwordb_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &du,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(du), uwordb_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += uwordb_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe db = MIN_INST_LENGTH;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data += sizeof(Dwarf_Ubyte);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe db = DEFAULT_IS_STMT;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data += sizeof(Dwarf_Ubyte);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe db = (Dwarf_Ubyte) LINE_BASE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data += sizeof(Dwarf_Ubyte);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe db = LINE_RANGE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data += sizeof(Dwarf_Ubyte);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe db = OPCODE_BASE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data += sizeof(Dwarf_Ubyte);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) std_opcode_len,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(std_opcode_len), sizeof(std_opcode_len));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data += sizeof(std_opcode_len);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* copy over include directories */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curdir = dbg->de_inc_dirs;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (curdir) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe strcpy((char *) data, curdir->did_name);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += strlen(curdir->did_name) + 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdir = curdir->did_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *data = '\0'; /* last null */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data++;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* copy file entries */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curentry = dbg->de_file_entries;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (curentry) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe strcpy((char *) data, curentry->dfe_name);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += strlen(curentry->dfe_name) + 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* copies of leb numbers, no endian issues */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) curentry->dfe_args, curentry->dfe_nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += curentry->dfe_nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curentry = curentry->dfe_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *data = '\0';
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data++;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe sum_bytes += prolog_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curline = dbg->de_lines;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe prevline = (Dwarf_P_Line)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Line_s));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (prevline == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_LINE_ALLOC, -1);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_pro_reg_init(prevline);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* generate opcodes for line numbers */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (curline) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char *arg;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int opc;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int no_lns_copy; /* if lns copy opcode doesnt need to be
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe generated, if special opcode or end
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sequence */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned addr_adv;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int line_adv; /* supposed to be a reasonably small
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe number, so the size should not be a
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe problem. ? */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe no_lns_copy = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curline->dpl_opc != 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int inst_bytes; /* no of bytes in extended opcode */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char *str; /* hold leb encoded inst_bytes */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int str_nbytes; /* no of bytes in str */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe switch (curline->dpl_opc) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNE_end_sequence:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Advance pc to end of text section. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe addr_adv = curline->dpl_address - prevline->dpl_address;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (addr_adv > 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = DW_LNS_advance_pc;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_pro_encode_leb128_nm(addr_adv /
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe MIN_INST_LENGTH,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &nbytes, buff1,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbytes + sizeof(Dwarf_Ubyte), error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &db, sizeof(db),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* leb, no endianness issue */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) buff1, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += nbytes + sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += nbytes + sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_address = curline->dpl_address;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* first null byte */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* write length of extended opcode */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe inst_bytes = sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_pro_encode_leb128_nm(inst_bytes, &str_nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data, str_nbytes, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) buff1, str_nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += str_nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += str_nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* write extended opcode */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = DW_LNE_end_sequence;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* reset value to original values */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_pro_reg_init(prevline);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe no_lns_copy = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* this is set only for end_sequence, so that a
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dw_lns_copy is not generated */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_LNE_set_address:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* first null byte */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* write length of extended opcode */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe inst_bytes = sizeof(Dwarf_Ubyte) + upointer_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_pro_encode_leb128_nm(inst_bytes, &str_nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data, str_nbytes, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe str = buff1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* leb number, no endian issue */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) str, str_nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += str_nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += str_nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* write extended opcode */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = DW_LNE_set_address;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data, upointer_size +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Ubyte), error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* reloc for address */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = dbg->de_reloc_name(dbg, DEBUG_LINE,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes, /* r_offset */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curline->dpl_r_symidx,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_drt_data_reloc,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe uwordb_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* write offset (address) */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = curline->dpl_address;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &du,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(du), upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += upointer_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += upointer_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_address = curline->dpl_address;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe no_lns_copy = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curline->dpl_file != prevline->dpl_file) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = DW_LNS_set_file;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_pro_encode_leb128_nm(curline->dpl_file,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &nbytes, buff1,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arg = buff1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbytes + sizeof(Dwarf_Ubyte), error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) arg, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += nbytes + sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_file = curline->dpl_file;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curline->dpl_column != prevline->dpl_column) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = DW_LNS_set_column;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(curline->dpl_column,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arg = buff1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbytes + sizeof(Dwarf_Ubyte), error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) arg, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += nbytes + sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_column = curline->dpl_column;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curline->dpl_is_stmt != prevline->dpl_is_stmt) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = DW_LNS_negate_stmt;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_is_stmt = curline->dpl_is_stmt;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curline->dpl_basic_block == true &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_basic_block == false) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = DW_LNS_set_basic_block;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_basic_block = curline->dpl_basic_block;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe addr_adv = curline->dpl_address - prevline->dpl_address;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe line_adv = (int) (curline->dpl_line - prevline->dpl_line);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if ((addr_adv % MIN_INST_LENGTH) != 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_WRONG_ADDRESS, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if ((opc = _dwarf_pro_get_opc(addr_adv, line_adv)) > 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe no_lns_copy = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = opc;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_basic_block = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_address = curline->dpl_address;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_line = curline->dpl_line;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (addr_adv > 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = DW_LNS_advance_pc;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_pro_encode_leb128_nm(addr_adv /
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe MIN_INST_LENGTH,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &nbytes, buff1,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arg = buff1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbytes + sizeof(Dwarf_Ubyte), error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) arg, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += nbytes + sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += nbytes + sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_basic_block = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_address = curline->dpl_address;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (line_adv != 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = DW_LNS_advance_line;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_signed_leb128_nm(line_adv,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe arg = buff1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nbytes + sizeof(Dwarf_Ubyte), error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &db, sizeof(db),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) arg, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += nbytes + sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += nbytes + sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_basic_block = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_line = curline->dpl_line;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } /* ends else for opc != 0 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (no_lns_copy == 0) { /* if not a special or dw_lne_end_seq
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe generate a matrix line */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = DW_LNS_copy;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte), error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sum_bytes += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe prevline->dpl_basic_block = false;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curline = curline->dpl_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* write total length field */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = sum_bytes - BEGIN_LEN_SIZE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe start_line_sec += extension_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) start_line_sec,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du, sizeof(du), uwordb_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (int) dbg->de_n_debug_sect;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*---------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Generate debug_frame section
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe---------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_generate_debugframe(Dwarf_P_Debug dbg, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int elfsectno = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int i = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int firsttime = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int pad = 0; /* Pad for padding to align cies and fdes */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Cie curcie = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Fde curfde = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned char *data = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_sfixed dsw = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned du = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Ubyte db = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe long *cie_offs = 0; /* Holds byte offsets for links to fde's */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned long cie_length = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int cie_no = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int uwordb_size = dbg->de_offset_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int extension_size = dbg->de_64bit_extension ? 4 : 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int upointer_size = dbg->de_pointer_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned cur_off = 0; /* current offset of written data, held
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for relocation info */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe elfsectno = dbg->de_elf_sects[DEBUG_FRAME];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curcie = dbg->de_frame_cies;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cie_length = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cur_off = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cie_offs = (long *)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(long) * dbg->de_n_cie);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cie_offs == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_OFFS_ALLOC, -1);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Generate cie number as we go along. This writes
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe all CIEs first before any FDEs, which is rather
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe different from the order a compiler might like (which
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe might be each CIE followed by its FDEs then the next CIE, and
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe so on). */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cie_no = 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (curcie) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char *code_al = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int c_bytes = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char *data_al = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int d_bytes = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char buff1[ENCODE_SPACE_NEEDED];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char buff2[ENCODE_SPACE_NEEDED];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char buff3[ENCODE_SPACE_NEEDED];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char *augmentation = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char *augmented_al = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe long augmented_fields_length = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int a_bytes = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(curcie->cie_code_align,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &c_bytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_OFFS_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Before April 1999, the following was using an unsigned
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe encode. That worked ok even though the decoder used the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe correct signed leb read, but doing the encode correctly
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (according to the dwarf spec) saves space in the output file
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe and is completely compatible.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Note the actual stored amount on MIPS was 10 bytes (!) to
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe store the value -4. (hex)fc ffffffff ffffffff 01 The
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe libdwarf consumer consumed all 10 bytes too!
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe old version res =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_pro_encode_leb128_nm(curcie->cie_data_align,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe below is corrected signed version. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_signed_leb128_nm(curcie->cie_data_align,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &d_bytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff2, sizeof(buff2));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_OFFS_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe code_al = buff1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data_al = buff2;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* get the correct offset */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (firsttime) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cie_offs[cie_no - 1] = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe firsttime = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cie_offs[cie_no - 1] = cie_offs[cie_no - 2] +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (long) cie_length + BEGIN_LEN_SIZE;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cie_no++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe augmentation = curcie->cie_aug;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (strcmp(augmentation, DW_CIE_AUGMENTER_STRING_V0) == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe augmented_fields_length = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(augmented_fields_length,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &a_bytes, buff3,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(buff3));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe augmented_al = buff3;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_OFFS_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cie_length = uwordb_size + /* cie_id */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Ubyte) + /* cie version */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe strlen(curcie->cie_aug) + 1 + /* augmentation */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe c_bytes + /* code alignment factor */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe d_bytes + /* data alignment factor */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Ubyte) + /* return reg address */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe a_bytes + /* augmentation length */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curcie->cie_inst_bytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cie_length = uwordb_size + /* cie_id */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Ubyte) + /* cie version */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe strlen(curcie->cie_aug) + 1 + /* augmentation */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe c_bytes + d_bytes + sizeof(Dwarf_Ubyte) + /* return
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe reg
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe address
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curcie->cie_inst_bytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe pad = (int) PADDING(cie_length, upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cie_length += pad;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data, cie_length +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe BEGIN_LEN_SIZE, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (extension_size) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned x = DISTINGUISHED_VALUE;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &x,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(x), extension_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += extension_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = cie_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* total length of cie */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du, sizeof(du), uwordb_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += uwordb_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* cie-id is a special value. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = DW_CIE_ID;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &du,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(du), uwordb_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += uwordb_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = curcie->cie_version;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe strcpy((char *) data, curcie->cie_aug);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += strlen(curcie->cie_aug) + 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) code_al, c_bytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += c_bytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) data_al, d_bytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += d_bytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = curcie->cie_ret_reg;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (strcmp(augmentation, DW_CIE_AUGMENTER_STRING_V0) == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) augmented_al, a_bytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += a_bytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) curcie->cie_inst,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curcie->cie_inst_bytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += curcie->cie_inst_bytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i = 0; i < pad; i++) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *data = DW_CFA_nop;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curcie = curcie->cie_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* calculate current offset */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cur_off = cie_offs[cie_no - 2] + cie_length + BEGIN_LEN_SIZE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* write out fde's */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curfde = dbg->de_frame_fdes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (curfde) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Frame_Pgm curinst = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe long fde_length = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int pad = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Cie cie_ptr = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word cie_index = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word index = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int oet_length = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int afl_length = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int v0_augmentation = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#if 0
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned char *fde_start_point = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#endif
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char afl_buff[ENCODE_SPACE_NEEDED];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Find the CIE associated with this fde. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cie_ptr = dbg->de_frame_cies;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cie_index = curfde->fde_cie;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe index = 1; /* The cie_index of the first cie is 1,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe not 0. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe while (cie_ptr && index < cie_index) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cie_ptr = cie_ptr->cie_next;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe index++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (cie_ptr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_NULL, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (strcmp(cie_ptr->cie_aug, DW_CIE_AUGMENTER_STRING_V0) == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe v0_augmentation = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe oet_length = sizeof(Dwarf_sfixed);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* encode the length of augmented fields. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(oet_length,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &afl_length, afl_buff,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(afl_buff));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_OFFS_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde_length = curfde->fde_n_bytes + BEGIN_LEN_SIZE + /* cie
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe pointer
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe upointer_size + /* initial loc */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe upointer_size + /* address range */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe afl_length + /* augmented field length */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe oet_length; /* exception_table offset */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde_length = curfde->fde_n_bytes + BEGIN_LEN_SIZE + /* cie
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe pointer
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe upointer_size + /* initial loc */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe upointer_size; /* address range */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curfde->fde_die) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* IRIX/MIPS extension:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Using fde offset, generate DW_AT_MIPS_fde attribute for the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe die corresponding to this fde. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(_dwarf_pro_add_AT_fde(dbg, curfde->fde_die, cur_off,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error) < 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return -1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* store relocation for cie pointer */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = dbg->de_reloc_name(dbg, DEBUG_FRAME, cur_off +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe BEGIN_LEN_SIZE /* r_offset */,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_sect_name_idx[DEBUG_FRAME],
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_drt_data_reloc, uwordb_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* store relocation information for initial location */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = dbg->de_reloc_name(dbg, DEBUG_FRAME,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cur_off + BEGIN_LEN_SIZE +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe upointer_size /* r_offset */,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curfde->fde_r_symidx,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_drt_data_reloc, upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Store the relocation information for the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe offset_into_exception_info field, if the offset is valid (0
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe is a valid offset). */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (v0_augmentation &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curfde->fde_offset_into_exception_tables >= 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = dbg->de_reloc_name(dbg, DEBUG_FRAME,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* r_offset, where in cie this
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe field starts */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cur_off + BEGIN_LEN_SIZE +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe uwordb_size + 2 * upointer_size +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe afl_length,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curfde->fde_exception_table_symbol,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_drt_segment_rel,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_sfixed));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* adjust for padding */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe pad = (int) PADDING(fde_length, upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde_length += pad;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* write out fde */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno, data, fde_length + BEGIN_LEN_SIZE,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#if 0
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fde_start_point = data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#endif
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = fde_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (extension_size) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word x = DISTINGUISHED_VALUE;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &x,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(x), extension_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += extension_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* length */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(du), uwordb_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += uwordb_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* offset to cie */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = cie_offs[curfde->fde_cie - 1];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(du), uwordb_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += uwordb_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = curfde->fde_initloc;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(du), upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += upointer_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_reloc_pair &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curfde->fde_end_symbol != 0 &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curfde->fde_addr_range == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* symbolic reloc, need reloc for length What if we
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe really know the length? If so, should use the other
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe part of 'if'. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned val;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = dbg->de_reloc_pair(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* DEBUG_ARANGES, */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DEBUG_FRAME, cur_off + 2 * uwordb_size + upointer_size, /* r_offset
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curfde->fde_r_symidx,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curfde->fde_end_symbol,
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 -
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe begin + val (gets val from stream) */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe val = curfde->fde_end_symbol_offset -
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curfde->fde_initloc;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &val,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(val), upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += upointer_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = curfde->fde_addr_range;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(du), upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += upointer_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (v0_augmentation) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* write the encoded augmented field length. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) afl_buff, afl_length);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += afl_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* write the offset_into_exception_tables field. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dsw =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (Dwarf_sfixed) curfde->fde_offset_into_exception_tables;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &dsw,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(dsw), sizeof(Dwarf_sfixed));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_sfixed);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curinst = curfde->fde_inst;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(curfde->fde_block) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned long size = curfde->fde_inst_block_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) curfde->fde_block, size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe while (curinst) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = curinst->dfp_opcode;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += sizeof(Dwarf_Ubyte);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#if 0
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curinst->dfp_sym_index) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = dbg->de_reloc_name(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DEBUG_FRAME,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* r_offset = */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (data - fde_start_point) + cur_off + uwordb_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curinst->dfp_sym_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_drt_data_reloc,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe upointer_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#endif
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) curinst->dfp_args,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curinst->dfp_nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += curinst->dfp_nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curinst = curinst->dfp_next;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* padding */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i = 0; i < pad; i++) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *data = DW_CFA_nop;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cur_off += fde_length + uwordb_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curfde = curfde->fde_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (int) dbg->de_n_debug_sect;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe These functions remember all the markers we see along
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe with the right offset in the .debug_info section so that
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe we can dump them all back to the user with the section info.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowestatic int
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowemarker_init(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned count)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_marker_n_alloc = count;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_markers = NULL;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (count > 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_markers = _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Marker_s) *
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_marker_n_alloc);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_markers == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_marker_n_alloc = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return -1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowestatic int
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowemarker_add(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned offset,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned marker)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_marker_n_alloc >= (dbg->de_marker_n_used + 1)) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned n = dbg->de_marker_n_used++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_markers[n].ma_offset = offset;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_markers[n].ma_marker = marker;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return -1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard LoweDwarf_Signed
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_get_die_markers(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Marker * marker_list, /* pointer to a pointer */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * marker_count,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * error)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (marker_list == NULL || marker_count == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_IA, DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_marker_n_used != dbg->de_marker_n_alloc) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_MAF, DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *marker_list = dbg->de_markers;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *marker_count = dbg->de_marker_n_used;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* These functions provide the offsets of DW_FORM_string
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attributes in the section section_index. These information
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe will enable a producer app that is generating assembly
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe text output to easily emit those attributes in ascii form
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe without having to decode the byte stream.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowestatic int
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowestring_attr_init (Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed section_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned count)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Per_Sect_String_Attrs sect_sa = &dbg->de_sect_string_attr[section_index];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sect_sa->sect_sa_n_alloc = count;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sect_sa->sect_sa_list = NULL;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (count > 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sect_sa->sect_sa_section_number = section_index;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sect_sa->sect_sa_list = _dwarf_p_get_alloc(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(struct Dwarf_P_String_Attr_s)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * sect_sa->sect_sa_n_alloc);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (sect_sa->sect_sa_list == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sect_sa->sect_sa_n_alloc = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return -1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowestatic int
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowestring_attr_add (Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed section_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned offset,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Attribute attr)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Per_Sect_String_Attrs sect_sa = &dbg->de_sect_string_attr[section_index];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (sect_sa->sect_sa_n_alloc >= (sect_sa->sect_sa_n_used + 1)) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned n = sect_sa->sect_sa_n_used++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sect_sa->sect_sa_list[n].sa_offset = offset;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sect_sa->sect_sa_list[n].sa_nbytes = attr->ar_nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return -1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_get_string_attributes_count(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned *
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe count_of_sa_sections,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int *drd_buffer_version,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error *error)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int i;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned int count = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i = 0; i < NUM_DEBUG_SECTIONS; ++i) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_sect_string_attr[i].sect_sa_n_used > 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ++count;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *count_of_sa_sections = (Dwarf_Unsigned) count;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *drd_buffer_version = DWARF_DRD_BUFFER_VERSION;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_get_string_attributes_info(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed *elf_section_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned *sect_sa_buffer_count,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_String_Attr *sect_sa_buffer,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error *error)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int i;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int next = dbg->de_sect_sa_next_to_return;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i = next; i < NUM_DEBUG_SECTIONS; ++i) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Per_Sect_String_Attrs sect_sa = &dbg->de_sect_string_attr[i];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (sect_sa->sect_sa_n_used > 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_sect_sa_next_to_return = i + 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *elf_section_index = sect_sa->sect_sa_section_number;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *sect_sa_buffer_count = sect_sa->sect_sa_n_used;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *sect_sa_buffer = sect_sa->sect_sa_list;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_NO_ENTRY;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*---------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Generate debug_info and debug_abbrev sections
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe---------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_generate_debuginfo(Dwarf_P_Debug dbg, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int elfsectno_of_debug_info = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int abbrevsectno = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned char *data = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int cu_header_size = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Abbrev curabbrev = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Abbrev abbrev_head = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Abbrev abbrev_tail = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Die curdie = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Die first_child = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word dw = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned du = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half dh = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Ubyte db = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half version = 0; /* Need 2 byte quantity. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned die_off = 0; /* Offset of die in debug_info. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int n_abbrevs = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned marker_count = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned string_attr_count = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned string_attr_offset = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *start_info_sec = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int uwordb_size = dbg->de_offset_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int extension_size = dbg->de_64bit_extension ? 4 : 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe abbrev_head = abbrev_tail = NULL;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe elfsectno_of_debug_info = dbg->de_elf_sects[DEBUG_INFO];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* write cu header */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_header_size = BEGIN_LEN_SIZE + sizeof(Dwarf_Half) + /* version
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe stamp
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe uwordb_size + /* offset into abbrev table */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Ubyte); /* size of target address */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe GET_CHUNK(dbg, elfsectno_of_debug_info, data, cu_header_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe start_info_sec = data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (extension_size) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = DISTINGUISHED_VALUE;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du, sizeof(du), extension_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += extension_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = 0; /* length of debug_info, not counting
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe this field itself (unknown at this
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe point). */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du, sizeof(du), uwordb_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += uwordb_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe version = CURRENT_VERSION_STAMP; /* assume this length will not
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe change */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &version,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(version), sizeof(Dwarf_Half));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data += sizeof(Dwarf_Half);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = 0; /* offset into abbrev table, not yet
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe known. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du, sizeof(du), uwordb_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data += uwordb_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe db = dbg->de_pointer_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), 1);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* We have filled the chunk we got with GET_CHUNK. At this point we
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe no longer dare use "data" or "start_info_sec" as a pointer any
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe longer except to refer to that first small chunk for the cu
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe header. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curdie = dbg->de_dies;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* create AT_macro_info if appropriate */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_first_macinfo != NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (_dwarf_pro_add_AT_macro_info(dbg, curdie, 0, error) < 0)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return -1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* create AT_stmt_list attribute if necessary */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dwarf_need_debug_line_section(dbg) == TRUE)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (_dwarf_pro_add_AT_stmt_list(dbg, curdie, error) < 0)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return -1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe die_off = cu_header_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Relocation for abbrev offset in cu header store relocation
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe record in linked list */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = dbg->de_reloc_name(dbg, DEBUG_INFO, BEGIN_LEN_SIZE +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Half),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* r_offset */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_sect_name_idx[DEBUG_ABBREV],
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_drt_data_reloc, uwordb_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_REL_ALLOC, -1);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* pass 0: only top level dies, add at_sibling attribute to those
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dies with children */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe first_child = curdie->di_child;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (first_child && first_child->di_right) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (first_child->di_child)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_add_AT_reference(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe first_child,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_AT_sibling,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe first_child->di_right, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe first_child = first_child->di_right;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* pass 1: create abbrev info, get die offsets, calc relocations */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe marker_count = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe string_attr_count = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (curdie != NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int nbytes = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Attribute curattr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Attribute new_first_attr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Attribute new_last_attr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char *space = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char buff1[ENCODE_SPACE_NEEDED];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int i = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdie->di_offset = die_off;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curdie->di_marker != 0)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe marker_count++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curabbrev = _dwarf_pro_getabbrev(curdie, abbrev_head);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curabbrev == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (abbrev_head == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe n_abbrevs = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curabbrev->abb_idx = n_abbrevs;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe abbrev_tail = abbrev_head = curabbrev;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* check if its a new abbreviation, if yes, add to tail */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curabbrev->abb_idx == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe n_abbrevs++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curabbrev->abb_idx = n_abbrevs;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe abbrev_tail->abb_next = curabbrev;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe abbrev_tail = curabbrev;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(curabbrev->abb_idx,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe space = _dwarf_p_get_alloc(dbg, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (space == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy(space, buff1, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdie->di_abbrev = space;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdie->di_abbrev_nbytes = nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe die_off += nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Resorting the attributes!! */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe new_first_attr = new_last_attr = NULL;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr = curdie->di_attrs;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i = 0; i < (int)curabbrev->abb_n_attr; i++) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Attribute ca;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Attribute cl;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The following should always find an attribute! */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (ca = cl = curattr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ca && curabbrev->abb_attrs[i] != ca->ar_attribute;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cl = ca, ca = ca->ar_next)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (!ca) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg,DW_DLE_ABBREV_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Remove the attribute from the old list. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (ca == curattr) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr = ca->ar_next;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cl->ar_next = ca->ar_next;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ca->ar_next = NULL;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Add the attribute to the new list. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (new_first_attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe new_first_attr = new_last_attr = ca;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe new_last_attr->ar_next = ca;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe new_last_attr = ca;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdie->di_attrs = new_first_attr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr = curdie->di_attrs;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe while (curattr) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curattr->ar_rel_type != R_MIPS_NONE) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe switch (curattr->ar_attribute) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_AT_stmt_list:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr->ar_rel_symidx =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_sect_name_idx[DEBUG_LINE];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_AT_MIPS_fde:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr->ar_rel_symidx =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_sect_name_idx[DEBUG_FRAME];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_AT_macro_info:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr->ar_rel_symidx =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_sect_name_idx[DEBUG_MACINFO];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe default:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = dbg->de_reloc_name(dbg, DEBUG_INFO, die_off + curattr->ar_rel_offset, /* r_offset
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr->ar_rel_symidx,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_drt_data_reloc,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr->ar_reloc_len);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_REL_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curattr->ar_attribute_form == DW_FORM_string) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe string_attr_count++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe die_off += curattr->ar_nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr = curattr->ar_next;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* depth first search */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curdie->di_child)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdie = curdie->di_child;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe while (curdie != NULL && curdie->di_right == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdie = curdie->di_parent;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe die_off++; /* since we are writing a null die at
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe the end of each sibling chain */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curdie != NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdie = curdie->di_right;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } /* end while (curdie != NULL) */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = marker_init(dbg, marker_count);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res == -1) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_REL_ALLOC, -1);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = string_attr_init(dbg, DEBUG_INFO, string_attr_count);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res == -1) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_REL_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Pass 2: Write out the die information Here 'data' is a
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe temporary, one block for each GET_CHUNK. 'data' is overused. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curdie = dbg->de_dies;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (curdie != NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Attribute curattr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curdie->di_marker != 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = marker_add(dbg, curdie->di_offset, curdie->di_marker);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res == -1) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_REL_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* index to abbreviation table */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno_of_debug_info,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data, curdie->di_abbrev_nbytes, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) curdie->di_abbrev,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdie->di_abbrev_nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Attribute values - need to fill in all form attributes */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr = curdie->di_attrs;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe string_attr_offset = curdie->di_offset + curdie->di_abbrev_nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe while (curattr) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno_of_debug_info, data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (unsigned long) curattr->ar_nbytes, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe switch (curattr->ar_attribute_form) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_FORM_ref1:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curattr->ar_ref_die->di_offset >
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (unsigned) 0xff) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_OFFSET_UFLW, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = curattr->ar_ref_die->di_offset;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_FORM_ref2:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curattr->ar_ref_die->di_offset >
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (unsigned) 0xffff) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_OFFSET_UFLW, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dh = curattr->ar_ref_die->di_offset;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &dh,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(dh), sizeof(Dwarf_Half));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_FORM_ref_addr:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* curattr->ar_ref_die == NULL!
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * ref_addr doesn't take a CU-offset.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * This is different than other refs.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * This value will be set by the user of the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * producer library using a relocation.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * No need to set a value here.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#if 0
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = curattr->ar_ref_die->di_offset;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* ref to offset of die */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(du), uwordb_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#endif
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_FORM_ref4:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curattr->ar_ref_die->di_offset >
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (unsigned) 0xffffffff) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_OFFSET_UFLW, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dw = (Dwarf_Word) curattr->ar_ref_die->di_offset;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &dw,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(dw), sizeof(Dwarf_ufixed));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_FORM_ref8:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = curattr->ar_ref_die->di_offset;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(du), sizeof(Dwarf_Unsigned));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_FORM_ref_udata:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe { /* unsigned leb128 offset */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char buff1[ENCODE_SPACE_NEEDED];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_pro_encode_leb128_nm(curattr->
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ar_ref_die->
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe di_offset, &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy(data, buff1, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe default:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) curattr->ar_data,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr->ar_nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curattr->ar_attribute_form == DW_FORM_string) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe string_attr_add(dbg, DEBUG_INFO, string_attr_offset, curattr);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe string_attr_offset += curattr->ar_nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr = curattr->ar_next;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* depth first search */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curdie->di_child)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdie = curdie->di_child;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe while (curdie != NULL && curdie->di_right == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, elfsectno_of_debug_info, data, 1, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *data = '\0';
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdie = curdie->di_parent;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (curdie != NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curdie = curdie->di_right;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } /* end while (curdir != NULL) */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Write out debug_info size */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Dont include length field or extension bytes */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe du = die_off - BEGIN_LEN_SIZE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, (void *) (start_info_sec + extension_size),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &du, sizeof(du), uwordb_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data = 0; /* Emphasise not usable now */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Write out debug_abbrev section */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe abbrevsectno = dbg->de_elf_sects[DEBUG_ABBREV];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curabbrev = abbrev_head;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (curabbrev) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char *val;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int idx;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char buff1[ENCODE_SPACE_NEEDED];
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(curabbrev->abb_idx, &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, abbrevsectno, data, nbytes, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe val = buff1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) val, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(curabbrev->abb_tag, &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe val = buff1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, abbrevsectno, data, nbytes, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) val, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe db = curabbrev->abb_children;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, abbrevsectno, data, sizeof(Dwarf_Ubyte), error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(db), sizeof(Dwarf_Ubyte));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* add attributes and forms */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (idx = 0; idx < curabbrev->abb_n_attr; idx++) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(curabbrev->abb_attrs[idx],
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe val = buff1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, abbrevsectno, data, nbytes, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) val, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_pro_encode_leb128_nm(curabbrev->abb_forms[idx],
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &nbytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe buff1, sizeof(buff1));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe val = buff1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, abbrevsectno, data, nbytes, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy((void *) data, (const void *) val, nbytes);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, abbrevsectno, data, 2, error); /* two zeros,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for last
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe entry, see
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf2 sec
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 7.5.3 */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *data = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *data = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curabbrev = curabbrev->abb_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe GET_CHUNK(dbg, abbrevsectno, data, 1, error); /* one zero,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for end of
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu, see
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf2 sec
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe 7.5.3 */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *data = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (int) dbg->de_n_debug_sect;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*---------------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Get a buffer of section data.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_idx is the elf-section number that this data applies to.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe length shows length of returned data
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe----------------------------------------------------------------------*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /*ARGSUSED*/ /* pretend all args used */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Ptr
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_get_section_bytes(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed dwarf_section,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed * section_idx,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * length, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Ptr buf;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_version_magic_number != PRO_VERSION_MAGIC) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_IA, NULL);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_debug_sects == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* no more data !! */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return NULL;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_debug_sects->ds_elf_sect_no == MAGIC_SECT_NO) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* no data ever entered !! */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return NULL;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *section_idx = dbg->de_debug_sects->ds_elf_sect_no;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *length = dbg->de_debug_sects->ds_nbytes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe buf = (Dwarf_Ptr *) dbg->de_debug_sects->ds_data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_debug_sects = dbg->de_debug_sects->ds_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* We may want to call the section stuff more than once: see
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dwarf_reset_section_bytes() do not do: dbg->de_n_debug_sect--; */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return buf;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe No errors possible.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowevoid
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_reset_section_bytes(Dwarf_P_Debug dbg)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_debug_sects = dbg->de_first_debug_sect;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* No need to reset; commented out decrement. dbg->de_n_debug_sect
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe = ???; */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_reloc_next_to_return = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_sect_sa_next_to_return = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Storage handler. Gets either a new chunk of memory, or
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe a pointer in existing memory, from the linked list attached
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe to dbg at de_debug_sects, depending on size of nbytes
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Assume dbg not null, checked in top level routine
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Returns a pointer to the allocated buffer space for the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe lib to fill in, predincrements next-to-use count so the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe space requested is already counted 'used'
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe when this returns (ie, reserved).
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard LoweDwarf_Small *
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_buffer(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int elfsectno, unsigned long nbytes)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Section_Data cursect;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cursect = dbg->de_current_active_section;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* By using MAGIC_SECT_NO we allow the following MAGIC_SECT_NO must
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe not match any legit section number. test to have just two
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe clauses (no NULL pointer test) See dwarf_producer_init(). */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if ((cursect->ds_elf_sect_no != elfsectno) ||
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ((cursect->ds_nbytes + nbytes) > cursect->ds_orig_alloc)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Either the elf section has changed or there is not enough
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe space in the current section.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Create a new Dwarf_P_Section_Data_s for the chunk. and have
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe space 'on the end' for the buffer itself so we just do one
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe malloc (not two).
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned long space = nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (nbytes < CHUNK_SIZE)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe space = CHUNK_SIZE;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cursect = (Dwarf_P_Section_Data)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(struct Dwarf_P_Section_Data_s)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe + space);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (cursect == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* _dwarf_p_get_alloc zeroes the space... */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cursect->ds_data = (char *) cursect +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(struct Dwarf_P_Section_Data_s);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cursect->ds_orig_alloc = space;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cursect->ds_elf_sect_no = elfsectno;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cursect->ds_nbytes = nbytes; /* reserve this number of bytes
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe of space for caller to fill
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe in */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Now link on the end of the list, and mark this one as the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe current one */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg->de_debug_sects->ds_elf_sect_no == MAGIC_SECT_NO) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* the only entry is the special one for 'no entry' so
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe delete that phony one while adding this initial real
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe one. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_debug_sects = cursect;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_current_active_section = cursect;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_first_debug_sect = cursect;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_current_active_section->ds_next = cursect;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_current_active_section = cursect;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_n_debug_sect++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((Dwarf_Small *) cursect->ds_data);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* There is enough space in the current buffer */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *space_for_caller = (Dwarf_Small *)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (cursect->ds_data + cursect->ds_nbytes);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cursect->ds_nbytes += nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return space_for_caller;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Given address advance and line advance, it gives
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe either special opcode, or a number < 0
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_get_opc(Dwarf_Unsigned addr_adv, int line_adv)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int opc;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe addr_adv = addr_adv / MIN_INST_LENGTH;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (line_adv == 0 && addr_adv == 0)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return OPC_INCS_ZERO;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (line_adv >= LINE_BASE && line_adv < LINE_BASE + LINE_RANGE) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe opc =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (line_adv - LINE_BASE) + (addr_adv * LINE_RANGE) +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe OPCODE_BASE;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (opc > 255)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return OPC_OUT_OF_RANGE;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return opc;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } else
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return LINE_OUT_OF_RANGE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*-----------------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Handles abbreviations. It takes a die, searches through
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe current list of abbreviations for matching one. If it
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe finds one, it returns a pointer to it, and if it doesnt,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe it returns a new one. Upto the user of this function to
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe link it up to the abbreviation head. If its a new one,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe abb_idx has 0.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe-----------------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic Dwarf_P_Abbrev
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_getabbrev(Dwarf_P_Die die, Dwarf_P_Abbrev head)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Abbrev curabbrev;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Attribute curattr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int res1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int nattrs;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int match;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_ufixed *forms = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_ufixed *attrs = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curabbrev = head;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (curabbrev) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if ((die->di_tag == curabbrev->abb_tag) &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ((die->di_child != NULL &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curabbrev->abb_children == DW_CHILDREN_yes) ||
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (die->di_child == NULL &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curabbrev->abb_children == DW_CHILDREN_no)) &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (die->di_n_attr == curabbrev->abb_n_attr)) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* There is a chance of a match. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr = die->di_attrs;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe match = 1; /* Assume match found. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe while (match && curattr) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res1 = _dwarf_pro_match_attr(curattr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curabbrev,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (int) curabbrev->
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe abb_n_attr);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res1 == 0)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe match = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr = curattr->ar_next;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (match == 1)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return curabbrev;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curabbrev = curabbrev->abb_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* no match, create new abbreviation */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (die->di_n_attr != 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe forms = (Dwarf_ufixed *)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(die->di_dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_ufixed) * die->di_n_attr);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (forms == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return NULL;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attrs = (Dwarf_ufixed *)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(die->di_dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_ufixed) * die->di_n_attr);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (attrs == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return NULL;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe nattrs = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curattr = die->di_attrs;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe while (curattr) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attrs[nattrs] = curattr->ar_attribute;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe forms[nattrs] = curattr->ar_attribute_form;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nattrs++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curattr = curattr->ar_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curabbrev = (Dwarf_P_Abbrev)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(die->di_dbg, sizeof(struct Dwarf_P_Abbrev_s));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (curabbrev == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return NULL;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (die->di_child == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curabbrev->abb_children = DW_CHILDREN_no;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe else
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe curabbrev->abb_children = DW_CHILDREN_yes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curabbrev->abb_tag = die->di_tag;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curabbrev->abb_attrs = attrs;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curabbrev->abb_forms = forms;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curabbrev->abb_n_attr = die->di_n_attr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curabbrev->abb_idx = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe curabbrev->abb_next = NULL;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return curabbrev;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*------------------------------------------------------------------
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Tries to see if given attribute and form combination
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe exists in the given abbreviation
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe-------------------------------------------------------------------*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_match_attr(Dwarf_P_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Abbrev abbrev, int no_attr)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int i;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int found = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe for (i = 0; i < no_attr; i++) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (attr->ar_attribute == abbrev->abb_attrs[i] &&
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_attribute_form == abbrev->abb_forms[i]) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe found = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return found;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}