49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Copyright (C) 2000,2002,2004,2005 Silicon Graphics, Inc. All Rights Reserved.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Portions Copyright 2007-2010 Sun Microsystems, Inc. All rights reserved.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Portions Copyright 2008-2010 David Anderson. 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 "dwarf_incl.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "dwarf_die_deliv.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_hasform(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half form,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Bool * return_bool, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cu_context = attr->ar_cu_context;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context->cc_dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *return_bool = (attr->ar_attribute_form == form);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/* Not often called, we do not worry about efficiency here.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe The dwarf_whatform() call does the sanity checks for us.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_whatform_direct(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half * return_form, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int res = dwarf_whatform(attr, return_form, error);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *return_form = attr->ar_attribute_form_direct;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (DW_DLV_OK);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowevoid *
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_uncompress_integer_block(
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Bool unit_is_signed,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small unit_length_in_bits,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe void* input_block,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned input_length_in_bytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned* output_length_in_units_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error* error
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned output_length_in_units = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe void * output_block = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int i = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char * ptr = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int remain = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_sfixed * array = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return((void *)DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (unit_is_signed == false ||
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unit_length_in_bits != 32 ||
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe input_block == NULL ||
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe input_length_in_bytes == 0 ||
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe output_length_in_units_ptr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_BADBITC);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return ((void *) DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* At this point we assume the format is: signed 32 bit */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* first uncompress everything to find the total size. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe output_length_in_units = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe remain = input_length_in_bytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = input_block;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe while (remain > 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed num;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word len;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe num = _dwarf_decode_s_leb128((unsigned char *)ptr, &len);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr += len;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe remain -= len;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe output_length_in_units++;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (remain != 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return((void *)DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* then alloc */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe output_block = (void *)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_get_alloc(dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLA_STRING,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe output_length_in_units * (unit_length_in_bits / 8));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (output_block == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return((void*)DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* then uncompress again and copy into new buffer */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe array = (Dwarf_sfixed *) output_block;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe remain = input_length_in_bytes;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr = input_block;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (i=0; i<output_length_in_units && remain>0; i++) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed num;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word len;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe num = _dwarf_decode_s_leb128((unsigned char *)ptr, &len);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ptr += len;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe remain -= len;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe array[i] = num;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (remain != 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_dealloc(dbg, (unsigned char *)output_block, DW_DLA_STRING);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return((Dwarf_P_Attribute)DW_DLV_BADADDR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *output_length_in_units_ptr = output_length_in_units;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return output_block;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowevoid
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_dealloc_uncompressed_block(Dwarf_Debug dbg, void * space)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_dealloc(dbg, space, DW_DLA_STRING);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_whatform(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half * return_form, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cu_context = attr->ar_cu_context;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context->cc_dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *return_form = attr->ar_attribute_form;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (DW_DLV_OK);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This function is analogous to dwarf_whatform.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe It returns the attribute in attr instead of
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe the form.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_whatattr(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half * return_attr, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cu_context = attr->ar_cu_context;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context->cc_dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *return_attr = (attr->ar_attribute);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe A global offset cannot be returned by this interface:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe see dwarf_global_formref().
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe DW_FORM_ref_addr is considered an incorrect form
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for this call because DW_FORM_ref_addr is a global-offset into
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe the debug_info section.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe For the same reason DW_FORM_data4/data8 are not returned
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe from this function.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe For the same reason DW_FORM_sec_offset is not returned
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe from this function, DW_FORM_sec_offset is a global offset
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (to various sections, not a CU relative offset.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_FORM_ref_addr has a value which was documented in
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF2 as address-size but which was always an offset
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe so should have always been offset size (wording
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe corrected in DWARF3).
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_formref(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Off * ret_offset, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Debug dbg = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned offset = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cu_context = attr->ar_cu_context;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context->cc_dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg = cu_context->cc_dbg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe switch (attr->ar_attribute_form) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_ref1:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe offset = *(Dwarf_Small *) attr->ar_debug_info_ptr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_ref2:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, offset, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_Half));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_ref4:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, offset, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_ufixed));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_ref8:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, offset, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_Unsigned));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_ref_udata:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe offset = _dwarf_decode_u_leb128(attr->ar_debug_info_ptr, NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe default:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_BAD_REF_FORM);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Check that offset is within current cu portion of .debug_info. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (offset >= cu_context->cc_length +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context->cc_length_size + cu_context->cc_extension_size) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_OFFSET_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *ret_offset = (offset);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* dwarf_formsig8 returns in the caller-provided 8 byte area
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe the 8 bytes of a DW_FORM_ref_sig8 (copying the bytes
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe directly to the caller). Not a string, an 8 byte
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe MD5 hash. This function is new in DWARF4 libdwarf.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint dwarf_formsig8(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Sig8 * returned_sig_bytes,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error* error)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Debug dbg = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned field_end_offset = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context = attr->ar_cu_context;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (cu_context->cc_dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg = cu_context->cc_dbg;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(attr->ar_attribute_form != DW_FORM_ref_sig8 ) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_BAD_REF_SIG8_FORM);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe field_end_offset = attr->ar_debug_info_ptr + sizeof(Dwarf_Sig8) -
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (dbg->de_debug_info.dss_data + cu_context->cc_debug_info_offset);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Check that offset is within current cu portion of .debug_info. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (field_end_offset > cu_context->cc_length +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context->cc_length_size + cu_context->cc_extension_size) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_OFFSET_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe memcpy(returned_sig_bytes, attr->ar_debug_info_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Sig8));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Since this returns section-relative debug_info offsets,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe this can represent all REFERENCE forms correctly
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe and allows all applicable forms.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_FORM_ref_addr has a value which was documented in
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF2 as address-size but which was always an offset
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe so should have always been offset size (wording
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe corrected in DWARF3).
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe See the DWARF4 document for the 3 cases fitting
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe reference forms. The caller must determine which section the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe reference 'points' to. The function added in November 2009,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_get_form_class(), helps in this regard.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_global_formref(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Off * ret_offset, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Debug dbg = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned offset = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr ref_addr = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half context_version = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cu_context = attr->ar_cu_context;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe context_version = cu_context->cc_version_stamp;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context->cc_dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg = cu_context->cc_dbg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe switch (attr->ar_attribute_form) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_ref1:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe offset = *(Dwarf_Small *) attr->ar_debug_info_ptr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe goto fixoffset;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_ref2:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, offset, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_Half));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe goto fixoffset;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_ref4:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, offset, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_ufixed));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe goto fixoffset;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_ref8:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, offset, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_Unsigned));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe goto fixoffset;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_ref_udata:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe offset = _dwarf_decode_u_leb128(attr->ar_debug_info_ptr, NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fixoffset: /* we have a local offset, make it
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe global */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* check legality of offset */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (offset >= cu_context->cc_length +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context->cc_length_size +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context->cc_extension_size) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_OFFSET_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* globalize the offset */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe offset += cu_context->cc_debug_info_offset;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The DWARF2 document did not make clear that
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_FORM_data4( and 8) were references with
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe global offsets to some section.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe That was first clearly documented in DWARF3.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe In DWARF4 these two forms are no longer references. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_FORM_data4:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(context_version == DW_CU_VERSION4) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_NOT_REF_FORM);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, offset, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_ufixed));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The offset is global. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_FORM_data8:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(context_version == DW_CU_VERSION4) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_NOT_REF_FORM);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, offset, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_Unsigned));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The offset is global. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_ref_addr:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case DW_FORM_sec_offset:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* DW_FORM_sec_offset first exists in DWARF4.*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* It is up to the caller to know what the offset
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe of DW_FORM_sec_offset refers to,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe the offset is not going to refer to .debug_info! */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe unsigned length_size = cu_context->cc_length_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(length_size == 4) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, offset, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_ufixed));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (length_size == 8) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, offset, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_Unsigned));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_FORM_SEC_OFFSET_LENGTH_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe default:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_BAD_REF_FORM);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* We do not know what section the offset refers to, so
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe we have no way to check it for correctness. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *ret_offset = offset;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_formaddr(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr * return_addr, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Debug dbg = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr ret_addr = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cu_context = attr->ar_cu_context;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context->cc_dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg = cu_context->cc_dbg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr->ar_attribute_form == DW_FORM_addr
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* || attr->ar_attribute_form == DW_FORM_ref_addr Allowance of
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_FORM_ref_addr was a mistake. The value returned in that
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe case is NOT an address it is a global debug_info offset (ie,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe not CU-relative offset within the CU in debug_info). The
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf document refers to it as an address (misleadingly) in
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sec 6.5.4 where it describes the reference form. It is
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe address-sized so that the linker can easily update it, but
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe it is a reference inside the debug_info section. No longer
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe allowed. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, ret_addr, Dwarf_Addr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context->cc_address_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_addr = ret_addr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_OK);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_formflag(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Bool * ret_bool, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cu_context = attr->ar_cu_context;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context->cc_dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (attr->ar_attribute_form == DW_FORM_flag_present) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Implicit means we don't read any data at all. Just
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe the existence of the Form does it. DWARF4. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *ret_bool = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_OK);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr->ar_attribute_form == DW_FORM_flag) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *ret_bool = (*(Dwarf_Small *) attr->ar_debug_info_ptr != 0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_OK);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_error(cu_context->cc_dbg, error, DW_DLE_ATTR_FORM_BAD);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_formudata(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * return_uval, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned ret_value = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Debug dbg = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cu_context = attr->ar_cu_context;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg = cu_context->cc_dbg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe switch (attr->ar_attribute_form) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_data1:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_Small));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_uval = ret_value;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* READ_UNALIGNED does the right thing as it reads
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe the right number bits and generates host order.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe So we can just assign to *return_uval. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_data2:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_Half));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_uval = ret_value;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_data4:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_ufixed));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_uval = ret_value;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_data8:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Unsigned));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_uval = ret_value;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_udata:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ret_value =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (_dwarf_decode_u_leb128(attr->ar_debug_info_ptr, NULL));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_uval = ret_value;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* see bug 583450. We do not allow reading sdata from a udata
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe value. Caller can retry, calling sdata */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe default:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_formsdata(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed * return_sval, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Signed ret_value = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Debug dbg = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cu_context = attr->ar_cu_context;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg = cu_context->cc_dbg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe switch (attr->ar_attribute_form) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_data1:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_sval = (*(Dwarf_Sbyte *) attr->ar_debug_info_ptr);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* READ_UNALIGNED does not sign extend.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe So we have to use a cast to get the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe value sign extended in the right way for each case. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_data2:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, ret_value, Dwarf_Signed,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Shalf));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_sval = (Dwarf_Shalf) ret_value;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_data4:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, ret_value, Dwarf_Signed,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_sfixed));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_sval = (Dwarf_sfixed) ret_value;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_data8:{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, ret_value, Dwarf_Signed,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe sizeof(Dwarf_Signed));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_sval = (Dwarf_Signed) ret_value;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_sdata:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ret_value =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (_dwarf_decode_s_leb128(attr->ar_debug_info_ptr, NULL));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_sval = ret_value;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* see bug 583450. We do not allow reading sdata from a udata
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe value. Caller can retry, calling sdata */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe default:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_formblock(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Block ** return_block, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Debug dbg = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned length = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small *data = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Word leb128_length = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Block *ret_block = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cu_context = attr->ar_cu_context;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context->cc_dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg = cu_context->cc_dbg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe switch (attr->ar_attribute_form) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_block1:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe length = *(Dwarf_Small *) attr->ar_debug_info_ptr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data = attr->ar_debug_info_ptr + sizeof(Dwarf_Small);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_block2:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, length, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_Half));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data = attr->ar_debug_info_ptr + sizeof(Dwarf_Half);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_block4:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, length, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr, sizeof(Dwarf_ufixed));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data = attr->ar_debug_info_ptr + sizeof(Dwarf_ufixed);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case DW_FORM_block:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe length = _dwarf_decode_u_leb128(attr->ar_debug_info_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &leb128_length);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe data = attr->ar_debug_info_ptr + leb128_length;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe break;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe default:
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(cu_context->cc_dbg, error, DW_DLE_ATTR_FORM_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Check that block lies within current cu in .debug_info. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr->ar_debug_info_ptr + length >=
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_debug_info.dss_data + cu_context->cc_debug_info_offset +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context->cc_length + cu_context->cc_length_size +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context->cc_extension_size) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_SIZE_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ret_block = (Dwarf_Block *) _dwarf_get_alloc(dbg, DW_DLA_BLOCK, 1);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (ret_block == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ret_block->bl_len = length;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ret_block->bl_data = (Dwarf_Ptr) data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ret_block->bl_from_loclist = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ret_block->bl_section_offset = data - dbg->de_debug_info.dss_data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *return_block = ret_block;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (DW_DLV_OK);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* Contrary to long standing documentation,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe The string pointer returned thru return_str must
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe never have dwarf_dealloc() applied to it.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Documentation fixed July 2005.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_formstring(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe char **return_str, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Debug dbg = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned offset = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = DW_DLV_ERROR;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe cu_context = attr->ar_cu_context;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (cu_context->cc_dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg = cu_context->cc_dbg;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr->ar_attribute_form == DW_FORM_string) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe void *begin = attr->ar_debug_info_ptr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (0 == dbg->de_assume_string_in_bounds) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Check that string lies within current cu in .debug_info.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe void *end = dbg->de_debug_info.dss_data +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context->cc_debug_info_offset +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context->cc_length + cu_context->cc_length_size +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context->cc_extension_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (0 == _dwarf_string_valid(begin, end)) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_SIZE_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_str = (char *) (begin);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (attr->ar_attribute_form == DW_FORM_strp) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe READ_UNALIGNED(dbg, offset, Dwarf_Unsigned,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe attr->ar_debug_info_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context->cc_length_size);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = _dwarf_load_section(dbg, &dbg->de_debug_str,error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (0 == dbg->de_assume_string_in_bounds) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Check that string lies within current cu in .debug_info.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe void *end = dbg->de_debug_str.dss_data +
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_debug_str.dss_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe void*begin = dbg->de_debug_str.dss_data + offset;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (0 == _dwarf_string_valid(begin, end)) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_STRP_OFFSET_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_str = (char *) (dbg->de_debug_str.dss_data + offset);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_formexprloc(Dwarf_Attribute attr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * return_exprlen,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Ptr * block_ptr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * error)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Debug dbg = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_CU_Context cu_context = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (attr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe cu_context = attr->ar_cu_context;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (cu_context == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg = cu_context->cc_dbg;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return (DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (attr->ar_attribute_form == DW_FORM_exprloc ) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned exprlen =
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (_dwarf_decode_u_leb128(attr->ar_debug_info_ptr, NULL));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Small * addr = attr->ar_debug_info_ptr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *return_exprlen = exprlen;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *block_ptr = addr + exprlen;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_error(dbg, error, DW_DLE_ATTR_EXPRLOC_FORM_BAD);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}