1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Copyright (C) 2000,2002,2004 Silicon Graphics, Inc. All Rights Reserved.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo This program is free software; you can redistribute it and/or modify it
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo under the terms of version 2.1 of the GNU Lesser General Public License
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo as published by the Free Software Foundation.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo This program is distributed in the hope that it would be useful, but
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo WITHOUT ANY WARRANTY; without even the implied warranty of
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Further, this software is distributed without any warranty that it is
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo free of the rightful claim of any third person regarding infringement
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo or the like. Any license provided herein, whether implied or
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo otherwise, applies only to this software file. Patent licenses, if
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo any, provided herein do not apply to combinations of this program with
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo other software, or any other product whatsoever.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo You should have received a copy of the GNU Lesser General Public
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo License along with this program; if not, write the Free Software
3c96341aef2b4da56c902941f089284b52bd573fnarayan Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo USA.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Mountain View, CA 94043, or:
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo http://www.sgi.com
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo For further information regarding this notice, see:
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo http://oss.sgi.com/projects/GenInfo/NoticeExplan
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo*/
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan/* The address of the Free Software Foundation is
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Boston, MA 02110-1301, USA.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo SGI has moved from the Crittenden Lane address.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo*/
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include "config.h"
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include "dwarf_incl.h"
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <stdio.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include "dwarf_die_deliv.h"
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* This is normally reliable.
3c96341aef2b4da56c902941f089284b52bd573fnarayanBut not always.
3c96341aef2b4da56c902941f089284b52bd573fnarayanIf different compilation
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartreunits have different address sizes
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppothis may not give the correct value in all contexts.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoIf the Elf offset size != address_size
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan(for example if address_size = 4 but recorded in elf64 object)
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayanthis may not give the correct value in all contexts.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo*/
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoint
3c96341aef2b4da56c902941f089284b52bd573fnarayandwarf_get_address_size(Dwarf_Debug dbg,
3c96341aef2b4da56c902941f089284b52bd573fnarayan Dwarf_Half * ret_addr_size, Dwarf_Error * error)
3c96341aef2b4da56c902941f089284b52bd573fnarayan{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Half address_size = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (dbg == 0) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo _dwarf_error(NULL, error, DW_DLE_DBG_NULL);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (DW_DLV_ERROR);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo address_size = dbg->de_pointer_size;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *ret_addr_size = address_size;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return DW_DLV_OK;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* This will be correct in all contexts where the
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb CU context of a DIE is known.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo*/
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoint
3c96341aef2b4da56c902941f089284b52bd573fnarayandwarf_get_die_address_size(Dwarf_Die die,
3c96341aef2b4da56c902941f089284b52bd573fnarayan Dwarf_Half * ret_addr_size, Dwarf_Error * error)
3c96341aef2b4da56c902941f089284b52bd573fnarayan{
3c96341aef2b4da56c902941f089284b52bd573fnarayan Dwarf_Half address_size = 0;
3c96341aef2b4da56c902941f089284b52bd573fnarayan CHECK_DIE(die, DW_DLV_ERROR);
3c96341aef2b4da56c902941f089284b52bd573fnarayan address_size = die->di_cu_context->cc_address_size;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *ret_addr_size = address_size;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return DW_DLV_OK;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoint
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppodwarf_dieoffset(Dwarf_Die die,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Off * ret_offset, Dwarf_Error * error)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo CHECK_DIE(die, DW_DLV_ERROR);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *ret_offset = (die->di_debug_info_ptr -
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo die->di_cu_context->cc_dbg->de_debug_info.dss_data);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return DW_DLV_OK;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo This function returns the offset of
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo the die relative to the start of its
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo compilation-unit rather than .debug_info.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Returns DW_DLV_ERROR on error.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo*/
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoint
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppodwarf_die_CU_offset(Dwarf_Die die,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Off * cu_off, Dwarf_Error * error)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_CU_Context cu_context = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo CHECK_DIE(die, DW_DLV_ERROR);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo cu_context = die->di_cu_context;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *cu_off =
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (die->di_debug_info_ptr - cu_context->cc_dbg->de_debug_info.dss_data -
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo cu_context->cc_debug_info_offset);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return DW_DLV_OK;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre}
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre/*
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre This function returns the global offset
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre (meaning the section offset) and length of
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre the CU that this die is a part of.
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Used for correctness checking by dwarfdump.
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre*/
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartreint
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartredwarf_die_CU_offset_range(Dwarf_Die die,
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Off * cu_off,
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Off * cu_length,
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb Dwarf_Error * error)
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb{
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb Dwarf_CU_Context cu_context = 0;
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb CHECK_DIE(die, DW_DLV_ERROR);
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb cu_context = die->di_cu_context;
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb *cu_off = cu_context->cc_debug_info_offset;
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb *cu_length = cu_context->cc_length + cu_context->cc_length_size
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb + cu_context->cc_extension_size;
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb return DW_DLV_OK;
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb}
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsbint
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsbdwarf_tag(Dwarf_Die die, Dwarf_Half * tag, Dwarf_Error * error)
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb{
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb CHECK_DIE(die, DW_DLV_ERROR);
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb *tag = (die->di_abbrev_list->ab_tag);
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb return DW_DLV_OK;
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb}
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsbint
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsbdwarf_attrlist(Dwarf_Die die,
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb Dwarf_Attribute ** attrbuf,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Signed * attrcnt, Dwarf_Error * error)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
3af08d828975d7e2581b6829e0eecff14d87a483lm Dwarf_Word attr_count = 0;
3af08d828975d7e2581b6829e0eecff14d87a483lm Dwarf_Word i = 0;
3af08d828975d7e2581b6829e0eecff14d87a483lm Dwarf_Half attr = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Half attr_form = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Byte_Ptr abbrev_ptr = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Abbrev_List abbrev_list = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Attribute new_attr = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Attribute head_attr = NULL;
3c96341aef2b4da56c902941f089284b52bd573fnarayan Dwarf_Attribute curr_attr = NULL;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Attribute *attr_ptr = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Debug dbg = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Byte_Ptr info_ptr = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo CHECK_DIE(die, DW_DLV_ERROR);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo dbg = die->di_cu_context->cc_dbg;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
3af08d828975d7e2581b6829e0eecff14d87a483lm abbrev_list = _dwarf_get_abbrev_for_code(die->di_cu_context,
3af08d828975d7e2581b6829e0eecff14d87a483lm die->di_abbrev_list->
3af08d828975d7e2581b6829e0eecff14d87a483lm ab_code);
3af08d828975d7e2581b6829e0eecff14d87a483lm if (abbrev_list == NULL) {
3af08d828975d7e2581b6829e0eecff14d87a483lm _dwarf_error(dbg, error, DW_DLE_DIE_ABBREV_BAD);
3af08d828975d7e2581b6829e0eecff14d87a483lm return (DW_DLV_ERROR);
3af08d828975d7e2581b6829e0eecff14d87a483lm }
3af08d828975d7e2581b6829e0eecff14d87a483lm abbrev_ptr = abbrev_list->ab_abbrev_ptr;
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm info_ptr = die->di_debug_info_ptr;
3af08d828975d7e2581b6829e0eecff14d87a483lm SKIP_LEB128_WORD(info_ptr);
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm do {
3af08d828975d7e2581b6829e0eecff14d87a483lm Dwarf_Unsigned utmp2;
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm DECODE_LEB128_UWORD(abbrev_ptr, utmp2);
3af08d828975d7e2581b6829e0eecff14d87a483lm attr = (Dwarf_Half) utmp2;
3af08d828975d7e2581b6829e0eecff14d87a483lm DECODE_LEB128_UWORD(abbrev_ptr, utmp2);
3af08d828975d7e2581b6829e0eecff14d87a483lm attr_form = (Dwarf_Half) utmp2;
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm if (attr != 0) {
3af08d828975d7e2581b6829e0eecff14d87a483lm new_attr =
3af08d828975d7e2581b6829e0eecff14d87a483lm (Dwarf_Attribute) _dwarf_get_alloc(dbg, DW_DLA_ATTR, 1);
3af08d828975d7e2581b6829e0eecff14d87a483lm if (new_attr == NULL) {
3af08d828975d7e2581b6829e0eecff14d87a483lm _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
3af08d828975d7e2581b6829e0eecff14d87a483lm return (DW_DLV_ERROR);
3af08d828975d7e2581b6829e0eecff14d87a483lm }
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm new_attr->ar_attribute = attr;
3af08d828975d7e2581b6829e0eecff14d87a483lm new_attr->ar_attribute_form_direct = attr_form;
3af08d828975d7e2581b6829e0eecff14d87a483lm new_attr->ar_attribute_form = attr_form;
3af08d828975d7e2581b6829e0eecff14d87a483lm if (attr_form == DW_FORM_indirect) {
3af08d828975d7e2581b6829e0eecff14d87a483lm Dwarf_Unsigned utmp6;
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm /* DECODE_LEB128_UWORD does info_ptr update */
3af08d828975d7e2581b6829e0eecff14d87a483lm DECODE_LEB128_UWORD(info_ptr, utmp6);
3af08d828975d7e2581b6829e0eecff14d87a483lm attr_form = (Dwarf_Half) utmp6;
3af08d828975d7e2581b6829e0eecff14d87a483lm new_attr->ar_attribute_form = attr_form;
3af08d828975d7e2581b6829e0eecff14d87a483lm }
3af08d828975d7e2581b6829e0eecff14d87a483lm new_attr->ar_cu_context = die->di_cu_context;
3af08d828975d7e2581b6829e0eecff14d87a483lm new_attr->ar_debug_info_ptr = info_ptr;
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm {
3af08d828975d7e2581b6829e0eecff14d87a483lm Dwarf_Unsigned sov = _dwarf_get_size_of_val(dbg,
3af08d828975d7e2581b6829e0eecff14d87a483lm attr_form,
3af08d828975d7e2581b6829e0eecff14d87a483lm die->di_cu_context->cc_address_size,
3af08d828975d7e2581b6829e0eecff14d87a483lm info_ptr,
3af08d828975d7e2581b6829e0eecff14d87a483lm die->di_cu_context->cc_length_size);
3af08d828975d7e2581b6829e0eecff14d87a483lm info_ptr += sov;
3af08d828975d7e2581b6829e0eecff14d87a483lm }
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm if (head_attr == NULL)
3af08d828975d7e2581b6829e0eecff14d87a483lm head_attr = curr_attr = new_attr;
3af08d828975d7e2581b6829e0eecff14d87a483lm else {
3af08d828975d7e2581b6829e0eecff14d87a483lm curr_attr->ar_next = new_attr;
3af08d828975d7e2581b6829e0eecff14d87a483lm curr_attr = new_attr;
3af08d828975d7e2581b6829e0eecff14d87a483lm }
3af08d828975d7e2581b6829e0eecff14d87a483lm attr_count++;
3af08d828975d7e2581b6829e0eecff14d87a483lm }
3af08d828975d7e2581b6829e0eecff14d87a483lm } while (attr != 0 || attr_form != 0);
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm if (attr_count == 0) {
3af08d828975d7e2581b6829e0eecff14d87a483lm *attrbuf = NULL;
3af08d828975d7e2581b6829e0eecff14d87a483lm *attrcnt = 0;
3af08d828975d7e2581b6829e0eecff14d87a483lm return (DW_DLV_NO_ENTRY);
3af08d828975d7e2581b6829e0eecff14d87a483lm }
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm attr_ptr = (Dwarf_Attribute *)
3af08d828975d7e2581b6829e0eecff14d87a483lm _dwarf_get_alloc(dbg, DW_DLA_LIST, attr_count);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (attr_ptr == NULL) {
3af08d828975d7e2581b6829e0eecff14d87a483lm _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (DW_DLV_ERROR);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo curr_attr = head_attr;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (i = 0; i < attr_count; i++) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *(attr_ptr + i) = curr_attr;
3af08d828975d7e2581b6829e0eecff14d87a483lm curr_attr = curr_attr->ar_next;
3af08d828975d7e2581b6829e0eecff14d87a483lm }
3af08d828975d7e2581b6829e0eecff14d87a483lm
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *attrbuf = attr_ptr;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *attrcnt = attr_count;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (DW_DLV_OK);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan}
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo This function takes a die, and an attr, and returns
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo a pointer to the start of the value of that attr in
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo the given die in the .debug_info section. The form
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo is returned in *attr_form.
445b4c2ed2d52ef648ae6b36e4f5e14ff3d234afsb
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Returns NULL on error, or if attr is not found.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo However, *attr_form is 0 on error, and positive
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo otherwise.
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan*/
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayanstatic Dwarf_Byte_Ptr
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan_dwarf_get_value_ptr(Dwarf_Die die,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Half attr, Dwarf_Half * attr_form)
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan{
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Byte_Ptr abbrev_ptr = 0;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Abbrev_List abbrev_list;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Half curr_attr = 0;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Half curr_attr_form = 0;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Byte_Ptr info_ptr = 0;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan abbrev_list = _dwarf_get_abbrev_for_code(die->di_cu_context,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan die->di_abbrev_list->ab_code);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan if (abbrev_list == NULL) {
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan *attr_form = 0;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan return (NULL);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan }
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan abbrev_ptr = abbrev_list->ab_abbrev_ptr;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan info_ptr = die->di_debug_info_ptr;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan SKIP_LEB128_WORD(info_ptr);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan do {
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Unsigned utmp3;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DECODE_LEB128_UWORD(abbrev_ptr, utmp3);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo curr_attr = (Dwarf_Half) utmp3;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DECODE_LEB128_UWORD(abbrev_ptr, utmp3);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan curr_attr_form = (Dwarf_Half) utmp3;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan if (curr_attr_form == DW_FORM_indirect) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Unsigned utmp6;
3c96341aef2b4da56c902941f089284b52bd573fnarayan
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* DECODE_LEB128_UWORD updates info_ptr */
e1ebb9ec908bc2d0a8810f137ebd6566cc8a8061lm DECODE_LEB128_UWORD(info_ptr, utmp6);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo curr_attr_form = (Dwarf_Half) utmp6;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
e1ebb9ec908bc2d0a8810f137ebd6566cc8a8061lm if (curr_attr == attr) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *attr_form = curr_attr_form;
3c96341aef2b4da56c902941f089284b52bd573fnarayan return (info_ptr);
3c96341aef2b4da56c902941f089284b52bd573fnarayan }
3c96341aef2b4da56c902941f089284b52bd573fnarayan
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan info_ptr += _dwarf_get_size_of_val(die->di_cu_context->cc_dbg,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo curr_attr_form,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo die->di_cu_context->cc_address_size,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo info_ptr,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo die->di_cu_context->cc_length_size);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo } while (curr_attr != 0 || curr_attr_form != 0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *attr_form = 1;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (NULL);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoint
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppodwarf_diename(Dwarf_Die die, char **ret_name, Dwarf_Error * error)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
3af08d828975d7e2581b6829e0eecff14d87a483lm Dwarf_Half attr_form = 0;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Debug dbg = 0;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Byte_Ptr info_ptr = 0;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Unsigned string_offset = 0;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan int res = DW_DLV_ERROR;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan CHECK_DIE(die, DW_DLV_ERROR);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo info_ptr = _dwarf_get_value_ptr(die, DW_AT_name, &attr_form);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (info_ptr == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (attr_form == 0) {
3af08d828975d7e2581b6829e0eecff14d87a483lm _dwarf_error(die->di_cu_context->cc_dbg, error,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DW_DLE_DIE_BAD);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan return (DW_DLV_ERROR);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return DW_DLV_NO_ENTRY;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm if (attr_form == DW_FORM_string) {
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm *ret_name = (char *) (info_ptr);
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm return DW_DLV_OK;
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm }
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm dbg = die->di_cu_context->cc_dbg;
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm if (attr_form != DW_FORM_strp) {
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD);
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm return (DW_DLV_ERROR);
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm }
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm READ_UNALIGNED(dbg, string_offset, Dwarf_Unsigned,
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm info_ptr, die->di_cu_context->cc_length_size);
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (string_offset >= dbg->de_debug_str.dss_size) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo _dwarf_error(dbg, error, DW_DLE_STRING_OFFSET_BAD);
3c96341aef2b4da56c902941f089284b52bd573fnarayan return (DW_DLV_ERROR);
3af08d828975d7e2581b6829e0eecff14d87a483lm }
3c96341aef2b4da56c902941f089284b52bd573fnarayan
3c96341aef2b4da56c902941f089284b52bd573fnarayan res = _dwarf_load_section(dbg, &dbg->de_debug_str,error);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (res != DW_DLV_OK) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return res;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *ret_name = (char *) (dbg->de_debug_str.dss_data + string_offset);
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm return DW_DLV_OK;
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm}
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lmint
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lmdwarf_hasattr(Dwarf_Die die,
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm Dwarf_Half attr,
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm Dwarf_Bool * return_bool, Dwarf_Error * error)
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm{
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm Dwarf_Half attr_form = 0;
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm
3af08d828975d7e2581b6829e0eecff14d87a483lm CHECK_DIE(die, DW_DLV_ERROR);
3c96341aef2b4da56c902941f089284b52bd573fnarayan
3c96341aef2b4da56c902941f089284b52bd573fnarayan if (_dwarf_get_value_ptr(die, attr, &attr_form) == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (attr_form == 0) {
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre _dwarf_error(die->di_cu_context->cc_dbg, error,
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre DW_DLE_DIE_BAD);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return (DW_DLV_ERROR);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre }
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre *return_bool = false;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return DW_DLV_OK;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre }
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre *return_bool = (true);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return DW_DLV_OK;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre}
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartreint
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartredwarf_attr(Dwarf_Die die,
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Half attr,
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Attribute * ret_attr, Dwarf_Error * error)
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre{
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Half attr_form = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Attribute attrib = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Byte_Ptr info_ptr = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Debug dbg = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre CHECK_DIE(die, DW_DLV_ERROR);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre dbg = die->di_cu_context->cc_dbg;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre info_ptr = _dwarf_get_value_ptr(die, attr, &attr_form);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre if (info_ptr == NULL) {
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre if (attr_form == 0) {
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre _dwarf_error(dbg, error, DW_DLE_DIE_BAD);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return (DW_DLV_ERROR);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre }
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return DW_DLV_NO_ENTRY;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre }
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre attrib = (Dwarf_Attribute) _dwarf_get_alloc(dbg, DW_DLA_ATTR, 1);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre if (attrib == NULL) {
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return (DW_DLV_ERROR);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre }
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre attrib->ar_attribute = attr;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre attrib->ar_attribute_form = attr_form;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre attrib->ar_attribute_form_direct = attr_form;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre attrib->ar_cu_context = die->di_cu_context;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre attrib->ar_debug_info_ptr = info_ptr;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre *ret_attr = (attrib);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return DW_DLV_OK;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre}
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartreint
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartredwarf_lowpc(Dwarf_Die die,
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Addr * return_addr, Dwarf_Error * error)
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre{
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Addr ret_addr = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Byte_Ptr info_ptr = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Half attr_form = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Debug dbg = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Half address_size = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre CHECK_DIE(die, DW_DLV_ERROR);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre dbg = die->di_cu_context->cc_dbg;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre address_size = die->di_cu_context->cc_address_size;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre info_ptr = _dwarf_get_value_ptr(die, DW_AT_low_pc, &attr_form);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre if ((info_ptr == NULL && attr_form == 0) ||
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre (info_ptr != NULL && attr_form != DW_FORM_addr)) {
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre _dwarf_error(dbg, error, DW_DLE_DIE_BAD);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return (DW_DLV_ERROR);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre }
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre if (info_ptr == NULL) {
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return (DW_DLV_NO_ENTRY);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre }
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre READ_UNALIGNED(dbg, ret_addr, Dwarf_Addr,
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre info_ptr, address_size);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre *return_addr = ret_addr;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return (DW_DLV_OK);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre}
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartreint
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartredwarf_highpc(Dwarf_Die die,
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Addr * return_addr, Dwarf_Error * error)
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre{
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Addr ret_addr = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Byte_Ptr info_ptr = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Half attr_form = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Debug dbg = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Dwarf_Half address_size = 0;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre CHECK_DIE(die, DW_DLV_ERROR);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre dbg = die->di_cu_context->cc_dbg;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre address_size = die->di_cu_context->cc_address_size;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre info_ptr = _dwarf_get_value_ptr(die, DW_AT_high_pc, &attr_form);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre if ((info_ptr == NULL && attr_form == 0) ||
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre (info_ptr != NULL && attr_form != DW_FORM_addr)) {
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre _dwarf_error(dbg, error, DW_DLE_DIE_BAD);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return (DW_DLV_ERROR);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre }
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre if (info_ptr == NULL) {
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return (DW_DLV_NO_ENTRY);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre }
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre READ_UNALIGNED(dbg, ret_addr, Dwarf_Addr,
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre info_ptr, address_size);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre *return_addr = ret_addr;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return (DW_DLV_OK);
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre}
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre/*
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre Takes a die, an attribute attr, and checks if attr
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre occurs in die. Attr is required to be an attribute
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo whose form is in the "constant" class. If attr occurs
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan in die, the value is returned.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Returns DW_DLV_OK, DW_DLV_ERROR, or DW_DLV_NO_ENTRY as
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan appropriate. Sets the value thru the pointer return_val.
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan This function is meant to do all the
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan processing for dwarf_bytesize, dwarf_bitsize, dwarf_bitoffset,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan and dwarf_srclang.
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan*/
3c96341aef2b4da56c902941f089284b52bd573fnarayanstatic int
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan_dwarf_die_attr_unsigned_constant(Dwarf_Die die,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Half attr,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Unsigned * return_val,
3c96341aef2b4da56c902941f089284b52bd573fnarayan Dwarf_Error * error)
3c96341aef2b4da56c902941f089284b52bd573fnarayan{
3c96341aef2b4da56c902941f089284b52bd573fnarayan Dwarf_Byte_Ptr info_ptr;
3c96341aef2b4da56c902941f089284b52bd573fnarayan Dwarf_Half attr_form;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Unsigned ret_value;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Debug dbg;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo CHECK_DIE(die, DW_DLV_ERROR);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo dbg = die->di_cu_context->cc_dbg;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan info_ptr = _dwarf_get_value_ptr(die, attr, &attr_form);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan if (info_ptr != NULL) {
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan switch (attr_form) {
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_data1:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan *return_val = (*(Dwarf_Small *) info_ptr);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan return (DW_DLV_OK);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
3c96341aef2b4da56c902941f089284b52bd573fnarayan case DW_FORM_data2:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned,
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan info_ptr, sizeof(Dwarf_Shalf));
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan *return_val = ret_value;
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan return (DW_DLV_OK);
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan case DW_FORM_data4:
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned,
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan info_ptr, sizeof(Dwarf_sfixed));
3af08d828975d7e2581b6829e0eecff14d87a483lm *return_val = ret_value;
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan return (DW_DLV_OK);
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan case DW_FORM_data8:
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned,
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan info_ptr, sizeof(Dwarf_Unsigned));
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan *return_val = ret_value;
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan return (DW_DLV_OK);
3af08d828975d7e2581b6829e0eecff14d87a483lm
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan case DW_FORM_udata:
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan *return_val = (_dwarf_decode_u_leb128(info_ptr, NULL));
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan return (DW_DLV_OK);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan default:
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan _dwarf_error(dbg, error, DW_DLE_DIE_BAD);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan return (DW_DLV_ERROR);
3c96341aef2b4da56c902941f089284b52bd573fnarayan }
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre }
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre if (attr_form == 0) {
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre _dwarf_error(dbg, error, DW_DLE_DIE_BAD);
3c96341aef2b4da56c902941f089284b52bd573fnarayan return (DW_DLV_ERROR);
3c96341aef2b4da56c902941f089284b52bd573fnarayan }
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre return DW_DLV_NO_ENTRY;
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre}
690555a1dfb3e9c3b00be26ece1988ed10a6fbe5achartre
3c96341aef2b4da56c902941f089284b52bd573fnarayan
3c96341aef2b4da56c902941f089284b52bd573fnarayanint
3c96341aef2b4da56c902941f089284b52bd573fnarayandwarf_bytesize(Dwarf_Die die,
3c96341aef2b4da56c902941f089284b52bd573fnarayan Dwarf_Unsigned * ret_size, Dwarf_Error * error)
3c96341aef2b4da56c902941f089284b52bd573fnarayan{
3c96341aef2b4da56c902941f089284b52bd573fnarayan Dwarf_Unsigned luns = 0;
3c96341aef2b4da56c902941f089284b52bd573fnarayan int res = _dwarf_die_attr_unsigned_constant(die, DW_AT_byte_size,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan &luns, error);
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan *ret_size = luns;
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan return res;
3af08d828975d7e2581b6829e0eecff14d87a483lm}
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
4bac220845f606f60663ed6f3a2b88caa00ae87enarayanint
3af08d828975d7e2581b6829e0eecff14d87a483lmdwarf_bitsize(Dwarf_Die die,
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan Dwarf_Unsigned * ret_size, Dwarf_Error * error)
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan{
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Unsigned luns = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo int res = _dwarf_die_attr_unsigned_constant(die, DW_AT_bit_size,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo &luns, error);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *ret_size = luns;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return res;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
3af08d828975d7e2581b6829e0eecff14d87a483lm
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayanint
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppodwarf_bitoffset(Dwarf_Die die,
3af08d828975d7e2581b6829e0eecff14d87a483lm Dwarf_Unsigned * ret_size, Dwarf_Error * error)
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan{
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Unsigned luns = 0;
3af08d828975d7e2581b6829e0eecff14d87a483lm int res = _dwarf_die_attr_unsigned_constant(die,
3af08d828975d7e2581b6829e0eecff14d87a483lm DW_AT_bit_offset, &luns, error);
3af08d828975d7e2581b6829e0eecff14d87a483lm *ret_size = luns;
3af08d828975d7e2581b6829e0eecff14d87a483lm return res;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan}
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm/* Refer section 3.1, page 21 in Dwarf Definition. */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoint
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayandwarf_srclang(Dwarf_Die die,
3af08d828975d7e2581b6829e0eecff14d87a483lm Dwarf_Unsigned * ret_size, Dwarf_Error * error)
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Unsigned luns = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo int res = _dwarf_die_attr_unsigned_constant(die, DW_AT_language,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan &luns, error);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan *ret_size = luns;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan return res;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan/* Refer section 5.4, page 37 in Dwarf Definition. */
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayanint
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayandwarf_arrayorder(Dwarf_Die die,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Unsigned * ret_size, Dwarf_Error * error)
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan{
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Unsigned luns = 0;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan int res = _dwarf_die_attr_unsigned_constant(die, DW_AT_ordering,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan &luns, error);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan *ret_size = luns;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan return res;
3af08d828975d7e2581b6829e0eecff14d87a483lm}
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan/*
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Return DW_DLV_OK if ok
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan DW_DLV_ERROR if failure.
3af08d828975d7e2581b6829e0eecff14d87a483lm
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan If the die and the attr are not related the result is
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan meaningless.
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan*/
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayanint
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayandwarf_attr_offset(Dwarf_Die die, Dwarf_Attribute attr,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Off * offset /* return offset thru this ptr */,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Error * error)
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan{
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Off attroff = 0;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan CHECK_DIE(die, DW_DLV_ERROR);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan attroff = (attr->ar_debug_info_ptr -
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan die->di_cu_context->cc_dbg->de_debug_info.dss_data);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan *offset = attroff;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan return DW_DLV_OK;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan}
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
3c96341aef2b4da56c902941f089284b52bd573fnarayanint
3c96341aef2b4da56c902941f089284b52bd573fnarayandwarf_die_abbrev_code(Dwarf_Die die)
3c96341aef2b4da56c902941f089284b52bd573fnarayan{
3c96341aef2b4da56c902941f089284b52bd573fnarayan return die->di_abbrev_code;
3c96341aef2b4da56c902941f089284b52bd573fnarayan}
3c96341aef2b4da56c902941f089284b52bd573fnarayan
3c96341aef2b4da56c902941f089284b52bd573fnarayan/* Helper function for finding form class. */
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayanstatic enum Dwarf_Form_Class
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayandw_get_special_offset(Dwarf_Half attrnum)
3af08d828975d7e2581b6829e0eecff14d87a483lm{
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan switch(attrnum) {
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_stmt_list:
3af08d828975d7e2581b6829e0eecff14d87a483lm return DW_FORM_CLASS_LINEPTR;
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_macro_info:
3af08d828975d7e2581b6829e0eecff14d87a483lm return DW_FORM_CLASS_MACPTR;
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_ranges:
3af08d828975d7e2581b6829e0eecff14d87a483lm return DW_FORM_CLASS_RANGELISTPTR;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_AT_location:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_AT_string_length:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_return_addr:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_data_member_location:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_frame_base:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_segment:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_static_link:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_AT_use_location:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_AT_vtable_elem_location:
3af08d828975d7e2581b6829e0eecff14d87a483lm return DW_FORM_CLASS_LOCLISTPTR;
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_sibling:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_byte_size :
e1ebb9ec908bc2d0a8810f137ebd6566cc8a8061lm case DW_AT_bit_offset :
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_bit_size :
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_AT_discr :
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_AT_import :
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_AT_common_reference:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_AT_containing_type:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_AT_default_value:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_lower_bound:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_bit_stride:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_upper_bound:
cb112a141f667f84bf442a77589d1705a2336dbelm case DW_AT_abstract_origin:
cb112a141f667f84bf442a77589d1705a2336dbelm case DW_AT_base_types:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_count:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_AT_friend:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_AT_namelist_item:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_priority:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_AT_specification:
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo case DW_AT_type:
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo case DW_AT_allocated:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_associated:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_byte_stride:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_extension:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_trampoline:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_small:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_object_pointer:
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_signature:
3af08d828975d7e2581b6829e0eecff14d87a483lm return DW_FORM_CLASS_REFERENCE;
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_AT_MIPS_fde: /* SGI/IRIX extension */
3af08d828975d7e2581b6829e0eecff14d87a483lm return DW_FORM_CLASS_FRAMEPTR;
3af08d828975d7e2581b6829e0eecff14d87a483lm }
3af08d828975d7e2581b6829e0eecff14d87a483lm return DW_FORM_CLASS_UNKNOWN;
3af08d828975d7e2581b6829e0eecff14d87a483lm}
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm/* It takes 4 pieces of data (including the FORM)
3af08d828975d7e2581b6829e0eecff14d87a483lm to accurately determine the form 'class' as documented
3af08d828975d7e2581b6829e0eecff14d87a483lm in the DWARF spec. This is per DWARF4, but will work
3af08d828975d7e2581b6829e0eecff14d87a483lm for DWARF2 or 3 as well. */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoenum Dwarf_Form_Class dwarf_get_form_class(
3c96341aef2b4da56c902941f089284b52bd573fnarayan Dwarf_Half dwversion,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo Dwarf_Half attrnum,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Half offset_size,
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan Dwarf_Half form)
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo switch(form) {
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_FORM_addr: return DW_FORM_CLASS_ADDRESS;
3af08d828975d7e2581b6829e0eecff14d87a483lm
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo case DW_FORM_data2: return DW_FORM_CLASS_CONSTANT;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_FORM_data4:
3af08d828975d7e2581b6829e0eecff14d87a483lm if(dwversion <= 3 && offset_size == 4) {
3af08d828975d7e2581b6829e0eecff14d87a483lm enum Dwarf_Form_Class class = dw_get_special_offset(attrnum);
3af08d828975d7e2581b6829e0eecff14d87a483lm if(class != DW_FORM_CLASS_UNKNOWN) {
3af08d828975d7e2581b6829e0eecff14d87a483lm return class;
3af08d828975d7e2581b6829e0eecff14d87a483lm }
3af08d828975d7e2581b6829e0eecff14d87a483lm }
3af08d828975d7e2581b6829e0eecff14d87a483lm return DW_FORM_CLASS_CONSTANT;
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_FORM_data8:
3af08d828975d7e2581b6829e0eecff14d87a483lm if(dwversion <= 3 && offset_size == 8) {
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan enum Dwarf_Form_Class class = dw_get_special_offset(attrnum);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan if(class != DW_FORM_CLASS_UNKNOWN) {
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan return class;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan }
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan }
3c96341aef2b4da56c902941f089284b52bd573fnarayan return DW_FORM_CLASS_CONSTANT;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_sec_offset:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan {
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan enum Dwarf_Form_Class class = dw_get_special_offset(attrnum);
3af08d828975d7e2581b6829e0eecff14d87a483lm if(class != DW_FORM_CLASS_UNKNOWN) {
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan return class;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan }
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan }
3af08d828975d7e2581b6829e0eecff14d87a483lm /* We do not know what this is. */
3af08d828975d7e2581b6829e0eecff14d87a483lm break;
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_FORM_string: return DW_FORM_CLASS_STRING;
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_FORM_strp: return DW_FORM_CLASS_STRING;
3af08d828975d7e2581b6829e0eecff14d87a483lm
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_FORM_block: return DW_FORM_CLASS_BLOCK;
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_FORM_block1: return DW_FORM_CLASS_BLOCK;
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_FORM_block2: return DW_FORM_CLASS_BLOCK;
3af08d828975d7e2581b6829e0eecff14d87a483lm case DW_FORM_block4: return DW_FORM_CLASS_BLOCK;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_data1: return DW_FORM_CLASS_CONSTANT;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_sdata: return DW_FORM_CLASS_CONSTANT;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_udata: return DW_FORM_CLASS_CONSTANT;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_ref_addr: return DW_FORM_CLASS_REFERENCE;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_ref1: return DW_FORM_CLASS_REFERENCE;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_ref2: return DW_FORM_CLASS_REFERENCE;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_ref4: return DW_FORM_CLASS_REFERENCE;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_ref8: return DW_FORM_CLASS_REFERENCE;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_ref_udata: return DW_FORM_CLASS_REFERENCE;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_ref_sig8: return DW_FORM_CLASS_REFERENCE;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_exprloc: return DW_FORM_CLASS_EXPRLOC;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_flag: return DW_FORM_CLASS_FLAG;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan case DW_FORM_flag_present: return DW_FORM_CLASS_FLAG;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
3c96341aef2b4da56c902941f089284b52bd573fnarayan case DW_FORM_indirect:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan default:
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan break;
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan };
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan return DW_FORM_CLASS_UNKNOWN;
3c96341aef2b4da56c902941f089284b52bd573fnarayan}
3c96341aef2b4da56c902941f089284b52bd573fnarayan
3c96341aef2b4da56c902941f089284b52bd573fnarayan