diff -r 1af5c1be89f8 -r 92d87f2e53c2 tools/elf4rom/libs/dwarf-20071209/libdwarf/dwarf_opaque.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/elf4rom/libs/dwarf-20071209/libdwarf/dwarf_opaque.h Fri Jan 15 09:07:44 2010 +0000 @@ -0,0 +1,301 @@ +/* + + Copyright (C) 2000,2002,2003,2004,2005 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright (C) 2007 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 versions applicable by section are: + DWARF2 DWARF3 DWARF4 + .debug_info 2 3 4 + .debug_abbrev - - - + .debug_frame 1 3 3 + .debug_str - - - + .debug_loc - - - + .debug_line 2 3 3 + .debug_aranges 2 2 2 + .debug_ranges x - - + .debug_pubtypes x 2 2 + .debug_pubnames 2 2 2 + .debug_macinfo - - - +*/ + +#include + + +struct Dwarf_Die_s { + /* + Points to the start of the portion corresponding to this Die in + the .debug_info section. */ + Dwarf_Byte_Ptr di_debug_info_ptr; + + Dwarf_Abbrev_List di_abbrev_list; + + /* Points to cu context for this die. */ + Dwarf_CU_Context di_cu_context; +}; + +struct Dwarf_Attribute_s { + Dwarf_Half ar_attribute; /* Attribute Value. */ + Dwarf_Half ar_attribute_form; /* Attribute Form. */ + Dwarf_Half ar_attribute_form_direct; + /* Identical to ar_attribute_form except that if + the original form uleb was DW_FORM_indirect, + ar_attribute_form_direct contains DW_FORM_indirect + but ar_attribute_form contains the true form. */ + + Dwarf_CU_Context ar_cu_context; + Dwarf_Small *ar_debug_info_ptr; + Dwarf_Attribute ar_next; +}; + +/* + This structure provides the context for a compilation unit. + Thus, it contains the Dwarf_Debug, cc_dbg, that this cu + belongs to. It contains the information in the compilation + unit header, cc_length, cc_version_stamp, cc_abbrev_offset, + and cc_address_size, in the .debug_info section for that cu. + In addition, it contains the count, cc_count_cu, of the cu + number of that cu in the list of cu's in the .debug_info. + The count starts at 1, ie cc_count_cu is 1 for the first cu, + 2 for the second and so on. This struct also contains a + pointer, cc_abbrev_table, to a list of pairs of abbrev code + and a pointer to the start of that abbrev + in the .debug_abbrev section. + + Each die will also contain a pointer to such a struct to + record the context for that die. + + **Updated by dwarf_next_cu_header in dwarf_die_deliv.c +*/ +struct Dwarf_CU_Context_s { + Dwarf_Debug cc_dbg; + Dwarf_Word cc_length; + Dwarf_Small cc_length_size; + Dwarf_Small cc_extension_size; + Dwarf_Half cc_version_stamp; + Dwarf_Sword cc_abbrev_offset; + Dwarf_Small cc_address_size; + Dwarf_Word cc_debug_info_offset; + Dwarf_Byte_Ptr cc_last_abbrev_ptr; + Dwarf_Hash_Table cc_abbrev_hash_table; + Dwarf_CU_Context cc_next; + unsigned char cc_offset_length; +}; + + +struct Dwarf_Debug_s { + dwarf_elf_handle de_elf; /* see de_elf_must_close at end of struct */ + + Dwarf_Unsigned de_access; + Dwarf_Handler de_errhand; + Dwarf_Ptr de_errarg; + + /* + Context for the compilation_unit just read by a call to + dwarf_next_cu_header. **Updated by dwarf_next_cu_header in + dwarf_die_deliv.c */ + Dwarf_CU_Context de_cu_context; + + /* + Points to linked list of CU Contexts for the CU's already read. + These are only CU's read by dwarf_next_cu_header(). */ + Dwarf_CU_Context de_cu_context_list; + + /* + Points to the last CU Context added to the list by + dwarf_next_cu_header(). */ + Dwarf_CU_Context de_cu_context_list_end; + + /* + This is the list of CU contexts read for dwarf_offdie(). These + may read ahead of dwarf_next_cu_header(). */ + Dwarf_CU_Context de_offdie_cu_context; + Dwarf_CU_Context de_offdie_cu_context_end; + + /* Offset of last byte of last CU read. */ + Dwarf_Word de_info_last_offset; + + /* + Number of bytes in the length, and offset field in various + .debug_* sections. It's not very meaningful, and is + only used in one 'approximate' calculation. */ + Dwarf_Small de_length_size; + + /* number of bytes in a pointer of the target in various .debug_ + sections. 4 in 32bit, 8 in MIPS 64, ia64. */ + Dwarf_Small de_pointer_size; + + /* set at creation of a Dwarf_Debug to say if form_string should be + checked for valid length at every call. 0 means do the check. + non-zero means do not do the check. */ + Dwarf_Small de_assume_string_in_bounds; + + /* + Dwarf_Alloc_Hdr_s structs used to manage chunks that are + malloc'ed for each allocation type for structs. */ + struct Dwarf_Alloc_Hdr_s de_alloc_hdr[ALLOC_AREA_REAL_TABLE_MAX]; +#ifdef DWARF_SIMPLE_MALLOC + struct simple_malloc_record_s * de_simple_malloc_base; +#endif + + + /* + These fields are used to process debug_frame section. **Updated + by dwarf_get_fde_list in dwarf_frame.h */ + /* + Points to contiguous block of pointers to Dwarf_Cie_s structs. */ + Dwarf_Cie *de_cie_data; + /* Count of number of Dwarf_Cie_s structs. */ + Dwarf_Signed de_cie_count; + /* + Points to contiguous block of pointers to Dwarf_Fde_s structs. */ + Dwarf_Fde *de_fde_data; + /* Count of number of Dwarf_Fde_s structs. */ + Dwarf_Signed de_fde_count; + + Dwarf_Small *de_debug_info; + Dwarf_Small *de_debug_abbrev; + Dwarf_Small *de_debug_line; + Dwarf_Small *de_debug_loc; + Dwarf_Small *de_debug_aranges; + Dwarf_Small *de_debug_macinfo; + Dwarf_Small *de_debug_pubnames; + Dwarf_Small *de_debug_str; + Dwarf_Small *de_debug_frame; + Dwarf_Small *de_debug_pubtypes; /* DWARF3 .debug_pubtypes */ + Dwarf_Small *de_debug_frame_eh_gnu; /* gnu for the g++ eh_frame + section */ + Dwarf_Addr de_debug_frame_eh_addr; /* gnu for the g++ eh_frame + section. Section address + from Elf. Purpose: to handle + DW_EH_PE_pcrel encoding. */ + + Dwarf_Small *de_debug_funcnames; + Dwarf_Small *de_debug_typenames; /* SGI IRIX extension essentially + identical to DWARF3 .debug_pubtypes. */ + Dwarf_Small *de_debug_varnames; + Dwarf_Small *de_debug_weaknames; + + Dwarf_Unsigned de_debug_info_size; + Dwarf_Unsigned de_debug_abbrev_size; + Dwarf_Unsigned de_debug_line_size; + Dwarf_Unsigned de_debug_loc_size; + Dwarf_Unsigned de_debug_aranges_size; + Dwarf_Unsigned de_debug_macinfo_size; + Dwarf_Unsigned de_debug_pubnames_size; + Dwarf_Unsigned de_debug_str_size; + Dwarf_Unsigned de_debug_pubtypes_size; /* DWARF3 .debug_pubtypes*/ + + + Dwarf_Unsigned de_debug_frame_size; + + Dwarf_Unsigned de_debug_frame_size_eh_gnu; /* gnu for the g++ + eh_frame section */ + + Dwarf_Unsigned de_debug_funcnames_size; + Dwarf_Unsigned de_debug_typenames_size; + Dwarf_Unsigned de_debug_varnames_size; + Dwarf_Unsigned de_debug_weaknames_size; + + void *(*de_copy_word) (void *, const void *, size_t); + unsigned char de_same_endian; + unsigned char de_elf_must_close; /* if non-zero, then + it was dwarf_init (not dwarf_elf_init) + so must elf_end() */ + + /* + The following are used for storing section indicies. + + After a Dwarf_Debug is initialized, a zero for any of + these indicies indicates an absent section. + + If the ELF spec is ever changed to permit 32-bit section + indicies, these will need to be changed. + */ + Dwarf_Half de_debug_aranges_index; + Dwarf_Half de_debug_line_index; + Dwarf_Half de_debug_loc_index; + Dwarf_Half de_debug_macinfo_index; + Dwarf_Half de_debug_pubnames_index; + Dwarf_Half de_debug_funcnames_index; + Dwarf_Half de_debug_typenames_index; + Dwarf_Half de_debug_varnames_index; + Dwarf_Half de_debug_weaknames_index; + Dwarf_Half de_debug_frame_index; + Dwarf_Half de_debug_frame_eh_gnu_index; + Dwarf_Half de_debug_str_index; + Dwarf_Half de_debug_info_index; + Dwarf_Half de_debug_abbrev_index; + Dwarf_Half de_debug_pubtypes_index; /* DWARF3 .debug_pubtypes */ + + /* Default is DW_FRAME_INITIAL_VALUE from header. */ + Dwarf_Half de_frame_rule_initial_value; + + /* Default is DW_FRAME_LAST_REG_NUM. */ + Dwarf_Half de_frame_reg_rules_entry_count; + + + unsigned char de_big_endian_object; /* non-zero if big-endian + object opened. */ +}; + +typedef struct Dwarf_Chain_s *Dwarf_Chain; +struct Dwarf_Chain_s { + void *ch_item; + Dwarf_Chain ch_next; +}; + + +#define CURRENT_VERSION_STAMP 2 /* DWARF2 */ +#define CURRENT_VERSION_STAMP3 3 /* DWARF3 */ +#define CURRENT_VERSION_STAMP4 3 /* DWARF4 */ + + /* Size of cu header version stamp field. */ +#define CU_VERSION_STAMP_SIZE sizeof(Dwarf_Half) + + /* Size of cu header address size field. */ +#define CU_ADDRESS_SIZE_SIZE sizeof(Dwarf_Small) + +void *_dwarf_memcpy_swap_bytes(void *s1, const void *s2, size_t len); + +#define ORIGINAL_DWARF_OFFSET_SIZE 4 +#define DISTINGUISHED_VALUE 0xffffffff +#define DISTINGUISHED_VALUE_OFFSET_SIZE 8 + +/* + We don't load the sections until they are needed. This function is + used to load the section. + */ +int _dwarf_load_section(Dwarf_Debug, + Dwarf_Half, + Dwarf_Small **, + Dwarf_Error *);