49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This program is free software; you can redistribute it and/or modify it
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe under the terms of version 2.1 of the GNU Lesser General Public License
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe as published by the Free Software Foundation.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This program is distributed in the hope that it would be useful, but
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WITHOUT ANY WARRANTY; without even the implied warranty of
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Further, this software is distributed without any warranty that it is
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe free of the rightful claim of any third person regarding infringement
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe or the like. Any license provided herein, whether implied or
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe otherwise, applies only to this software file. Patent licenses, if
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe any, provided herein do not apply to combinations of this program with
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe other software, or any other product whatsoever.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe You should have received a copy of the GNU Lesser General Public
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe License along with this program; if not, write the Free Software
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe USA.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Mountain View, CA 94043, or:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe http://www.sgi.com
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe For further information regarding this notice, see:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe http://oss.sgi.com/projects/GenInfo/NoticeExplan
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "config.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "libdwarfdefs.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <stdio.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <string.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#ifdef HAVE_ELFACCESS_H
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <elfaccess.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#endif
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_incl.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_section.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This function adds another type name to the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe list of type names for the given Dwarf_P_Debug.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe It returns 0 on error, and 1 otherwise.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard LoweDwarf_Unsigned
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_add_typename(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Die die,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char *type_name, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_add_simple_name_entry(dbg, die, type_name,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_snk_typename, error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe The following is the generic 'add a simple name entry'
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe for any of the simple name sections.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe See enum dwarf_sn_kind in pro_opaque.h
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard LoweDwarf_Unsigned
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_add_simple_name_entry(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_P_Die die,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char *entry_name,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe enum dwarf_sn_kind entrykind,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Simple_nameentry nameentry;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Simple_name_header hdr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe char *name;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int uword_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (die == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(NULL, error, DW_DLE_DIE_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe nameentry = (Dwarf_P_Simple_nameentry)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(struct Dwarf_P_Simple_nameentry_s));
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (nameentry == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe name = _dwarf_p_get_alloc(dbg, strlen(entry_name) + 1);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (name == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe strcpy(name, entry_name);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe nameentry->sne_die = die;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe nameentry->sne_name = name;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe nameentry->sne_name_len = strlen(name);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe uword_size = dbg->de_offset_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe hdr = &dbg->de_simple_name_headers[entrykind];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (hdr->sn_head == NULL)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe hdr->sn_head = hdr->sn_tail = nameentry;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe hdr->sn_tail->sne_next = nameentry;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe hdr->sn_tail = nameentry;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe hdr->sn_count++;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe hdr->sn_net_len += uword_size + nameentry->sne_name_len + 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (1);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_transform_simplename_to_disk writes
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".rel.debug_pubnames",
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".rel.debug_funcnames", sgi extension
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".rel.debug_typenames", sgi extension
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".rel.debug_varnames", sgi extension
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ".rel.debug_weaknames", sgi extension
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe to disk.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index indexes one of those sections.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe entrykind is one of those 'kind's.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe_dwarf_transform_simplename_to_disk(Dwarf_P_Debug dbg, enum dwarf_sn_kind entrykind, int section_index, /* in
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe de_elf_sects
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe etc
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Used to fill in 0. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe const Dwarf_Signed big_zero = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Used to scan the section data buffers. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Section_Data debug_sect;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Signed debug_info_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Simple_nameentry nameentry_original;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Simple_nameentry nameentry;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Small *stream_bytes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Small *cur_stream_bytes_ptr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned stream_bytes_count;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned adjusted_length; /* count excluding length field
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int uword_size = dbg->de_offset_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int extension_size = dbg->de_64bit_extension ? 4 : 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Simple_name_header hdr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* ***** BEGIN CODE ***** */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe debug_info_size = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe for (debug_sect = dbg->de_debug_sects; debug_sect != NULL;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe debug_sect = debug_sect->ds_next) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* We want the size of the .debug_info section for this CU
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe because the dwarf spec requires us to output it below so we
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe look for it specifically. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (debug_sect->ds_elf_sect_no == dbg->de_elf_sects[DEBUG_INFO]) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe debug_info_size += debug_sect->ds_nbytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe hdr = &dbg->de_simple_name_headers[entrykind];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Size of the .debug_typenames (or similar) section header. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe stream_bytes_count = extension_size + uword_size + /* Size of
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe length
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe field. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Half) + /* Size of version field. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe uword_size + /* Size of .debug_info offset. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe uword_size; /* Size of .debug_names. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe nameentry_original = hdr->sn_head;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe nameentry = nameentry_original;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* add in the content size */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe stream_bytes_count += hdr->sn_net_len;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Size of the last 0 offset. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe stream_bytes_count += uword_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Now we know how long the entire section is */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe GET_CHUNK(dbg, dbg->de_elf_sects[section_index],
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe stream_bytes, (unsigned long) stream_bytes_count, error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (stream_bytes == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cur_stream_bytes_ptr = stream_bytes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (extension_size) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned x = DISTINGUISHED_VALUE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &x, sizeof(x), extension_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cur_stream_bytes_ptr += extension_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Write the adjusted length of .debug_*names section. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe adjusted_length = stream_bytes_count - uword_size - extension_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &adjusted_length,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(adjusted_length), uword_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cur_stream_bytes_ptr += uword_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Write the version as 2 bytes. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half verstamp = CURRENT_VERSION_STAMP;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &verstamp,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(verstamp), sizeof(Dwarf_Half));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cur_stream_bytes_ptr += sizeof(Dwarf_Half);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Write the offset of the compile-unit. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &big_zero,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(big_zero), uword_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cur_stream_bytes_ptr += uword_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* now create the relocation for the compile_unit offset */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = dbg->de_reloc_name(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe extension_size + uword_size +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Half)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* r_offset */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* debug_info section name symbol */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_sect_name_idx[DEBUG_INFO],
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_drt_data_reloc,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe uword_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Write the size of .debug_info section. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &debug_info_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(debug_info_size), uword_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cur_stream_bytes_ptr += uword_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe for (nameentry = nameentry_original;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe nameentry != NULL; nameentry = nameentry->sne_next) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Copy offset of die from start of compile-unit. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &nameentry->sne_die->di_offset,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(nameentry->sne_die->di_offset),
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe uword_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cur_stream_bytes_ptr += uword_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Copy the type name. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe strcpy((char *) cur_stream_bytes_ptr, nameentry->sne_name);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cur_stream_bytes_ptr += nameentry->sne_name_len + 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (const void *) &big_zero,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(big_zero), uword_size);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (int) dbg->de_n_debug_sect;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}