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