From dae6fcbd0f9f9187e8591192b2d4c8238027b9a9 Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 29 Apr 2010 20:12:21 +0000 Subject: [PATCH] add libelf and libdwarf for potential fun times. none of the elf examples were working for me so i didnt even get a chance to test dwarf, but i dont think the problem is with the libs --- desmume/src/windows/DeSmuME_2005.vcproj | 672 ++-- desmume/src/windows/DeSmuME_2008.vcproj | 620 ++-- .../windows/libelf_libdwarf/libdwarf/common.h | 47 + .../windows/libelf_libdwarf/libdwarf/dwarf.h | 1065 +++++++ .../libelf_libdwarf/libdwarf/dwarf_abbrev.h | 55 + .../libdwarf/dwarf_addr_finder.h | 55 + .../libelf_libdwarf/libdwarf/dwarf_alloc.h | 177 ++ .../libelf_libdwarf/libdwarf/dwarf_arange.h | 71 + .../libdwarf/dwarf_base_types.h | 123 + .../libdwarf/dwarf_die_deliv.h | 57 + .../libdwarf/dwarf_elf_access.h | 55 + .../libelf_libdwarf/libdwarf/dwarf_error.h | 43 + .../libelf_libdwarf/libdwarf/dwarf_frame.h | 421 +++ .../libelf_libdwarf/libdwarf/dwarf_funcs.h | 42 + .../libelf_libdwarf/libdwarf/dwarf_global.h | 124 + .../libelf_libdwarf/libdwarf/dwarf_harmless.h | 31 + .../libelf_libdwarf/libdwarf/dwarf_incl.h | 66 + .../libelf_libdwarf/libdwarf/dwarf_line.h | 331 ++ .../libelf_libdwarf/libdwarf/dwarf_loc.h | 46 + .../libelf_libdwarf/libdwarf/dwarf_macro.h | 44 + .../libelf_libdwarf/libdwarf/dwarf_opaque.h | 339 ++ .../libelf_libdwarf/libdwarf/dwarf_types.h | 41 + .../libelf_libdwarf/libdwarf/dwarf_util.h | 311 ++ .../libelf_libdwarf/libdwarf/dwarf_vars.h | 41 + .../libelf_libdwarf/libdwarf/dwarf_weaks.h | 41 + .../libelf_libdwarf/libdwarf/libdwarf.h | 2727 +++++++++++++++++ .../libelf_libdwarf/libdwarf/libdwarfdefs.h | 91 + .../libelf_libdwarf/libdwarf/malloc_check.h | 62 + .../libelf_libdwarf/libdwarf/pro_alloc.h | 42 + .../libelf_libdwarf/libdwarf/pro_arange.h | 62 + .../libelf_libdwarf/libdwarf/pro_die.h | 68 + .../libelf_libdwarf/libdwarf/pro_encode_nm.h | 48 + .../libelf_libdwarf/libdwarf/pro_error.h | 52 + .../libelf_libdwarf/libdwarf/pro_expr.h | 45 + .../libelf_libdwarf/libdwarf/pro_frame.h | 132 + .../libelf_libdwarf/libdwarf/pro_incl.h | 94 + .../libelf_libdwarf/libdwarf/pro_line.h | 116 + .../libelf_libdwarf/libdwarf/pro_macinfo.h | 40 + .../libelf_libdwarf/libdwarf/pro_opaque.h | 484 +++ .../libelf_libdwarf/libdwarf/pro_reloc.h | 47 + .../libdwarf/pro_reloc_stream.h | 63 + .../libdwarf/pro_reloc_symbolic.h | 55 + .../libelf_libdwarf/libdwarf/pro_section.h | 112 + .../libelf_libdwarf/libdwarf/pro_types.h | 44 + .../libelf_libdwarf/libdwarf/pro_util.h | 148 + .../windows/libelf_libdwarf/libelf/byteswap.h | 95 + .../windows/libelf_libdwarf/libelf/elf_repl.h | 996 ++++++ .../windows/libelf_libdwarf/libelf/errors.h | 100 + .../libelf_libdwarf/libelf/ext_types.h | 334 ++ .../src/windows/libelf_libdwarf/libelf/gelf.h | 155 + .../windows/libelf_libdwarf/libelf/libelf.h | 305 ++ .../windows/libelf_libdwarf/libelf/nlist.h | 48 + .../windows/libelf_libdwarf/libelf/sys_elf.h | 130 + .../windows/libelf_libdwarf/libelf/verdef.h | 241 ++ .../windows/libelf_libdwarf/libelf/verneed.h | 245 ++ .../libelf_libdwarf/libelf_libdwarf.7z | Bin 0 -> 229282 bytes ...elf_libdwarf_0.8.13_20100404_from_tastools | 0 desmume/src/windows/main.cpp | 98 + 58 files changed, 11615 insertions(+), 582 deletions(-) create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/common.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_abbrev.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_addr_finder.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_alloc.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_arange.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_base_types.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_die_deliv.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_elf_access.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_error.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_frame.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_funcs.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_global.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_harmless.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_incl.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_line.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_loc.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_macro.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_opaque.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_types.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_util.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_vars.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_weaks.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/libdwarf.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/libdwarfdefs.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/malloc_check.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_alloc.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_arange.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_die.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_encode_nm.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_error.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_expr.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_frame.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_incl.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_line.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_macinfo.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_opaque.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_reloc.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_reloc_stream.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_reloc_symbolic.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_section.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_types.h create mode 100644 desmume/src/windows/libelf_libdwarf/libdwarf/pro_util.h create mode 100644 desmume/src/windows/libelf_libdwarf/libelf/byteswap.h create mode 100644 desmume/src/windows/libelf_libdwarf/libelf/elf_repl.h create mode 100644 desmume/src/windows/libelf_libdwarf/libelf/errors.h create mode 100644 desmume/src/windows/libelf_libdwarf/libelf/ext_types.h create mode 100644 desmume/src/windows/libelf_libdwarf/libelf/gelf.h create mode 100644 desmume/src/windows/libelf_libdwarf/libelf/libelf.h create mode 100644 desmume/src/windows/libelf_libdwarf/libelf/nlist.h create mode 100644 desmume/src/windows/libelf_libdwarf/libelf/sys_elf.h create mode 100644 desmume/src/windows/libelf_libdwarf/libelf/verdef.h create mode 100644 desmume/src/windows/libelf_libdwarf/libelf/verneed.h create mode 100644 desmume/src/windows/libelf_libdwarf/libelf_libdwarf.7z create mode 100644 desmume/src/windows/libelf_libdwarf/libelf_libdwarf_0.8.13_20100404_from_tastools diff --git a/desmume/src/windows/DeSmuME_2005.vcproj b/desmume/src/windows/DeSmuME_2005.vcproj index bb89ce398..fec748744 100644 --- a/desmume/src/windows/DeSmuME_2005.vcproj +++ b/desmume/src/windows/DeSmuME_2005.vcproj @@ -81,7 +81,7 @@ /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - @@ -1004,6 +984,16 @@ Outputs=".libs\7z.tag" /> + + + @@ -1014,6 +1004,16 @@ Outputs=".libs\7z.tag" /> + + + @@ -1038,26 +1038,6 @@ Outputs=".libs\directx.tag" /> - - - - - - @@ -1068,6 +1048,16 @@ Outputs=".libs\directx.tag" /> + + + @@ -1078,6 +1068,16 @@ Outputs=".libs\directx.tag" /> + + + @@ -1102,26 +1102,6 @@ Outputs=".libs\glib-vc8.tag" /> - - - - - - @@ -1132,6 +1112,16 @@ Outputs=".libs\glib-vc8.tag" /> + + + @@ -1142,6 +1132,16 @@ Outputs=".libs\glib-vc8.tag" /> + + + @@ -1154,16 +1154,26 @@ + + + + + + + + + + + + + + + + + @@ -1206,6 +1260,16 @@ Outputs=".libs\lua.tag" /> + + + @@ -1230,26 +1294,6 @@ Outputs=".libs\wx.tag" /> - - - - - - @@ -1260,6 +1304,16 @@ Outputs=".libs\wx.tag" /> + + + @@ -1270,6 +1324,16 @@ Outputs=".libs\wx.tag" /> + + + @@ -1361,24 +1425,6 @@ XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc" /> - - - - - - @@ -1388,6 +1434,15 @@ XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc" /> + + + @@ -1397,6 +1452,15 @@ XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc" /> + + + @@ -1689,7 +1753,7 @@ /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - @@ -1623,6 +1603,16 @@ Outputs=".libs\7z.tag" /> + + + @@ -1633,6 +1623,16 @@ Outputs=".libs\7z.tag" /> + + + @@ -1657,26 +1657,6 @@ Outputs=".libs\directx.tag" /> - - - - - - @@ -1687,6 +1667,16 @@ Outputs=".libs\directx.tag" /> + + + @@ -1697,6 +1687,16 @@ Outputs=".libs\directx.tag" /> + + + @@ -1721,26 +1721,6 @@ Outputs=".libs\glib-vc8.tag" /> - - - - - - @@ -1751,6 +1731,16 @@ Outputs=".libs\glib-vc8.tag" /> + + + @@ -1761,6 +1751,16 @@ Outputs=".libs\glib-vc8.tag" /> + + + @@ -1773,16 +1773,26 @@ + + + + + + + + + + + + + + + + + @@ -1825,6 +1879,16 @@ Outputs=".libs\lua.tag" /> + + + @@ -1849,6 +1913,16 @@ Outputs=".libs\wx.tag" /> + + + @@ -1859,6 +1933,16 @@ Outputs=".libs\wx.tag" /> + + + @@ -1869,26 +1953,6 @@ Outputs=".libs\wx.tag" /> - - - - - - diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/common.h b/desmume/src/windows/libelf_libdwarf/libdwarf/common.h new file mode 100644 index 000000000..ab26b20d4 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/common.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2009-2010 SN Systems. All Rights Reserved. + Portions Copyright (C) 2009-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 + +*/ + +#ifndef common_INCLUDED +#define common_INCLUDED + +#include + + +void print_args(int argc, char *argv[]); +void print_usage_message(const char *options[]); +void print_version(const char * name); + +#endif /* common_INCLUDED */ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf.h new file mode 100644 index 000000000..1d3491c9b --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf.h @@ -0,0 +1,1065 @@ +/* + Copyright (C) 2000,2001,2003,2004,2005,2006 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. + Portions Copyright 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 + +*/ + + +#ifndef __DWARF_H +#define __DWARF_H +#ifdef __cplusplus +extern "C" { +#endif + +/* + dwarf.h DWARF debugging information values + $Revision: 1.41 $ $Date: 2006/04/17 00:09:56 $ + + The comment "DWARF3" appears where there are + new entries from DWARF3 as of 2004, "DWARF3f" + where there are new entries as of the November 2005 + public review document and other comments apply + where extension entries appear. + + Extensions part of DWARF4 are marked DWARF4. + + A few extension names have omitted the 'vendor id' + (See chapter 7, "Vendor Extensibility"). Please + always use a 'vendor id' string in extension names. + + Vendors should use a vendor string in names and + whereever possible avoid duplicating values used by + other vendor extensions + +*/ + + +#define DW_TAG_array_type 0x01 +#define DW_TAG_class_type 0x02 +#define DW_TAG_entry_point 0x03 +#define DW_TAG_enumeration_type 0x04 +#define DW_TAG_formal_parameter 0x05 +#define DW_TAG_imported_declaration 0x08 +#define DW_TAG_label 0x0a +#define DW_TAG_lexical_block 0x0b +#define DW_TAG_member 0x0d +#define DW_TAG_pointer_type 0x0f +#define DW_TAG_reference_type 0x10 +#define DW_TAG_compile_unit 0x11 +#define DW_TAG_string_type 0x12 +#define DW_TAG_structure_type 0x13 +#define DW_TAG_subroutine_type 0x15 +#define DW_TAG_typedef 0x16 +#define DW_TAG_union_type 0x17 +#define DW_TAG_unspecified_parameters 0x18 +#define DW_TAG_variant 0x19 +#define DW_TAG_common_block 0x1a +#define DW_TAG_common_inclusion 0x1b +#define DW_TAG_inheritance 0x1c +#define DW_TAG_inlined_subroutine 0x1d +#define DW_TAG_module 0x1e +#define DW_TAG_ptr_to_member_type 0x1f +#define DW_TAG_set_type 0x20 +#define DW_TAG_subrange_type 0x21 +#define DW_TAG_with_stmt 0x22 +#define DW_TAG_access_declaration 0x23 +#define DW_TAG_base_type 0x24 +#define DW_TAG_catch_block 0x25 +#define DW_TAG_const_type 0x26 +#define DW_TAG_constant 0x27 +#define DW_TAG_enumerator 0x28 +#define DW_TAG_file_type 0x29 +#define DW_TAG_friend 0x2a +#define DW_TAG_namelist 0x2b + /* Early releases of this header had the following + misspelled with a trailing 's' */ +#define DW_TAG_namelist_item 0x2c /* DWARF3/2 spelling */ +#define DW_TAG_namelist_items 0x2c /* SGI misspelling/typo */ +#define DW_TAG_packed_type 0x2d +#define DW_TAG_subprogram 0x2e + /* The DWARF2 document had two spellings of the following + two TAGs, DWARF3 specifies the longer spelling. */ +#define DW_TAG_template_type_parameter 0x2f /* DWARF3/2 spelling*/ +#define DW_TAG_template_type_param 0x2f /* DWARF2 spelling*/ +#define DW_TAG_template_value_parameter 0x30 /* DWARF3/2 spelling*/ +#define DW_TAG_template_value_param 0x30 /* DWARF2 spelling*/ +#define DW_TAG_thrown_type 0x31 +#define DW_TAG_try_block 0x32 +#define DW_TAG_variant_part 0x33 +#define DW_TAG_variable 0x34 +#define DW_TAG_volatile_type 0x35 +#define DW_TAG_dwarf_procedure 0x36 /* DWARF3 */ +#define DW_TAG_restrict_type 0x37 /* DWARF3 */ +#define DW_TAG_interface_type 0x38 /* DWARF3 */ +#define DW_TAG_namespace 0x39 /* DWARF3 */ +#define DW_TAG_imported_module 0x3a /* DWARF3 */ +#define DW_TAG_unspecified_type 0x3b /* DWARF3 */ +#define DW_TAG_partial_unit 0x3c /* DWARF3 */ +#define DW_TAG_imported_unit 0x3d /* DWARF3 */ + /* Do not use DW_TAG_mutable_type */ +#define DW_TAG_mutable_type 0x3e /* Withdrawn from DWARF3 by DWARF3f. */ +#define DW_TAG_condition 0x3f /* DWARF3f */ +#define DW_TAG_shared_type 0x40 /* DWARF3f */ +#define DW_TAG_type_unit 0x41 /* DWARF4 */ +#define DW_TAG_rvalue_reference_type 0x42 /* DWARF4 */ +#define DW_TAG_template_alias 0x43 /* DWARF4 */ +#define DW_TAG_lo_user 0x4080 + +#define DW_TAG_MIPS_loop 0x4081 + +/* HP extensions: ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz */ +#define DW_TAG_HP_array_descriptor 0x4090 /* HP */ + +/* GNU extensions. The first 3 missing the GNU_. */ +#define DW_TAG_format_label 0x4101 /* GNU. Fortran. */ +#define DW_TAG_function_template 0x4102 /* GNU. For C++ */ +#define DW_TAG_class_template 0x4103 /* GNU. For C++ */ +#define DW_TAG_GNU_BINCL 0x4104 /* GNU */ +#define DW_TAG_GNU_EINCL 0x4105 /* GNU */ + + +/* GNU extension. http://gcc.gnu.org/wiki/TemplateParmsDwarf */ +#define DW_TAG_GNU_template_template_parameter 0x4106 /* GNU */ +#define DW_TAG_GNU_template_template_param 0x4106 /* GNU */ +#define DW_TAG_GNU_template_parameter_pack 0x4107 /* GNU */ +#define DW_TAG_GNU_formal_parameter_pack 0x4108 /* GNU */ + +/* ALTIUM extensions */ + /* DSP-C/Starcore __circ qualifier */ +#define DW_TAG_ALTIUM_circ_type 0x5101 /* ALTIUM */ + /* Starcore __mwa_circ qualifier */ +#define DW_TAG_ALTIUM_mwa_circ_type 0x5102 /* ALTIUM */ + /* Starcore __rev_carry qualifier */ +#define DW_TAG_ALTIUM_rev_carry_type 0x5103 /* ALTIUM */ + /* M16 __rom qualifier */ +#define DW_TAG_ALTIUM_rom 0x5111 /* ALTIUM */ + +/* The following 3 are extensions to support UPC */ +#define DW_TAG_upc_shared_type 0x8765 /* UPC */ +#define DW_TAG_upc_strict_type 0x8766 /* UPC */ +#define DW_TAG_upc_relaxed_type 0x8767 /* UPC */ + +/* PGI (STMicroelectronics) extensions. */ +#define DW_TAG_PGI_kanji_type 0xa000 /* PGI */ +#define DW_TAG_PGI_interface_block 0xa020 /* PGI */ +/* The following are SUN extensions */ +#define DW_TAG_SUN_function_template 0x4201 /* SUN */ +#define DW_TAG_SUN_class_template 0x4202 /* SUN */ +#define DW_TAG_SUN_struct_template 0x4203 /* SUN */ +#define DW_TAG_SUN_union_template 0x4204 /* SUN */ +#define DW_TAG_SUN_indirect_inheritance 0x4205 /* SUN */ +#define DW_TAG_SUN_codeflags 0x4206 /* SUN */ +#define DW_TAG_SUN_memop_info 0x4207 /* SUN */ +#define DW_TAG_SUN_omp_child_func 0x4208 /* SUN */ +#define DW_TAG_SUN_rtti_descriptor 0x4209 /* SUN */ +#define DW_TAG_SUN_dtor_info 0x420a /* SUN */ +#define DW_TAG_SUN_dtor 0x420b /* SUN */ +#define DW_TAG_SUN_f90_interface 0x420c /* SUN */ +#define DW_TAG_SUN_fortran_vax_structure 0x420d /* SUN */ +#define DW_TAG_SUN_hi 0x42ff /* SUN */ + + +#define DW_TAG_hi_user 0xffff + +#define DW_children_no 0 +#define DW_children_yes 1 + + + +#define DW_FORM_addr 0x01 +#define DW_FORM_block2 0x03 +#define DW_FORM_block4 0x04 +#define DW_FORM_data2 0x05 +#define DW_FORM_data4 0x06 +#define DW_FORM_data8 0x07 +#define DW_FORM_string 0x08 +#define DW_FORM_block 0x09 +#define DW_FORM_block1 0x0a +#define DW_FORM_data1 0x0b +#define DW_FORM_flag 0x0c +#define DW_FORM_sdata 0x0d +#define DW_FORM_strp 0x0e +#define DW_FORM_udata 0x0f +#define DW_FORM_ref_addr 0x10 +#define DW_FORM_ref1 0x11 +#define DW_FORM_ref2 0x12 +#define DW_FORM_ref4 0x13 +#define DW_FORM_ref8 0x14 +#define DW_FORM_ref_udata 0x15 +#define DW_FORM_indirect 0x16 +#define DW_FORM_sec_offset 0x17 /* DWARF4 */ +#define DW_FORM_exprloc 0x18 /* DWARF4 */ +#define DW_FORM_flag_present 0x19 /* DWARF4 */ +#define DW_FORM_ref_sig8 0x20 /* DWARF4 */ + +#define DW_AT_sibling 0x01 +#define DW_AT_location 0x02 +#define DW_AT_name 0x03 +#define DW_AT_ordering 0x09 +#define DW_AT_subscr_data 0x0a +#define DW_AT_byte_size 0x0b +#define DW_AT_bit_offset 0x0c +#define DW_AT_bit_size 0x0d +#define DW_AT_element_list 0x0f +#define DW_AT_stmt_list 0x10 +#define DW_AT_low_pc 0x11 +#define DW_AT_high_pc 0x12 +#define DW_AT_language 0x13 +#define DW_AT_member 0x14 +#define DW_AT_discr 0x15 +#define DW_AT_discr_value 0x16 +#define DW_AT_visibility 0x17 +#define DW_AT_import 0x18 +#define DW_AT_string_length 0x19 +#define DW_AT_common_reference 0x1a +#define DW_AT_comp_dir 0x1b +#define DW_AT_const_value 0x1c +#define DW_AT_containing_type 0x1d +#define DW_AT_default_value 0x1e +#define DW_AT_inline 0x20 +#define DW_AT_is_optional 0x21 +#define DW_AT_lower_bound 0x22 +#define DW_AT_producer 0x25 +#define DW_AT_prototyped 0x27 +#define DW_AT_return_addr 0x2a +#define DW_AT_start_scope 0x2c +#define DW_AT_bit_stride 0x2e /* DWARF3 name */ +#define DW_AT_stride_size 0x2e /* DWARF2 name */ +#define DW_AT_upper_bound 0x2f +#define DW_AT_abstract_origin 0x31 +#define DW_AT_accessibility 0x32 +#define DW_AT_address_class 0x33 +#define DW_AT_artificial 0x34 +#define DW_AT_base_types 0x35 +#define DW_AT_calling_convention 0x36 +#define DW_AT_count 0x37 +#define DW_AT_data_member_location 0x38 +#define DW_AT_decl_column 0x39 +#define DW_AT_decl_file 0x3a +#define DW_AT_decl_line 0x3b +#define DW_AT_declaration 0x3c +#define DW_AT_discr_list 0x3d +#define DW_AT_encoding 0x3e +#define DW_AT_external 0x3f +#define DW_AT_frame_base 0x40 +#define DW_AT_friend 0x41 +#define DW_AT_identifier_case 0x42 +#define DW_AT_macro_info 0x43 +#define DW_AT_namelist_item 0x44 +#define DW_AT_priority 0x45 +#define DW_AT_segment 0x46 +#define DW_AT_specification 0x47 +#define DW_AT_static_link 0x48 +#define DW_AT_type 0x49 +#define DW_AT_use_location 0x4a +#define DW_AT_variable_parameter 0x4b +#define DW_AT_virtuality 0x4c +#define DW_AT_vtable_elem_location 0x4d +#define DW_AT_allocated 0x4e /* DWARF3 */ +#define DW_AT_associated 0x4f /* DWARF3 */ +#define DW_AT_data_location 0x50 /* DWARF3 */ +#define DW_AT_byte_stride 0x51 /* DWARF3f */ +#define DW_AT_stride 0x51 /* DWARF3 (do not use) */ +#define DW_AT_entry_pc 0x52 /* DWARF3 */ +#define DW_AT_use_UTF8 0x53 /* DWARF3 */ +#define DW_AT_extension 0x54 /* DWARF3 */ +#define DW_AT_ranges 0x55 /* DWARF3 */ +#define DW_AT_trampoline 0x56 /* DWARF3 */ +#define DW_AT_call_column 0x57 /* DWARF3 */ +#define DW_AT_call_file 0x58 /* DWARF3 */ +#define DW_AT_call_line 0x59 /* DWARF3 */ +#define DW_AT_description 0x5a /* DWARF3 */ +#define DW_AT_binary_scale 0x5b /* DWARF3f */ +#define DW_AT_decimal_scale 0x5c /* DWARF3f */ +#define DW_AT_small 0x5d /* DWARF3f */ +#define DW_AT_decimal_sign 0x5e /* DWARF3f */ +#define DW_AT_digit_count 0x5f /* DWARF3f */ +#define DW_AT_picture_string 0x60 /* DWARF3f */ +#define DW_AT_mutable 0x61 /* DWARF3f */ +#define DW_AT_threads_scaled 0x62 /* DWARF3f */ +#define DW_AT_explicit 0x63 /* DWARF3f */ +#define DW_AT_object_pointer 0x64 /* DWARF3f */ +#define DW_AT_endianity 0x65 /* DWARF3f */ +#define DW_AT_elemental 0x66 /* DWARF3f */ +#define DW_AT_pure 0x67 /* DWARF3f */ +#define DW_AT_recursive 0x68 /* DWARF3f */ +#define DW_AT_signature 0x69 /* DWARF4 */ +#define DW_AT_main_subprogram 0x6a /* DWARF4 */ +#define DW_AT_data_bit_offset 0x6b /* DWARF4 */ +#define DW_AT_const_expr 0x6c /* DWARF4 */ +#define DW_AT_enum_class 0x6d /* DWARF4 */ +#define DW_AT_linkage_name 0x6e /* DWARF4 */ + +/* In extensions, we attempt to include the vendor extension + in the name even when the vendor leaves it out. */ + +/* HP extensions. */ +#define DW_AT_HP_block_index 0x2000 /* HP */ + +/* Follows extension so dwarfdump prints the most-likely-useful name. */ +#define DW_AT_lo_user 0x2000 + +#define DW_AT_MIPS_fde 0x2001 /* MIPS/SGI */ +#define DW_AT_MIPS_loop_begin 0x2002 /* MIPS/SGI */ +#define DW_AT_MIPS_tail_loop_begin 0x2003 /* MIPS/SGI */ +#define DW_AT_MIPS_epilog_begin 0x2004 /* MIPS/SGI */ +#define DW_AT_MIPS_loop_unroll_factor 0x2005 /* MIPS/SGI */ +#define DW_AT_MIPS_software_pipeline_depth 0x2006 /* MIPS/SGI */ +#define DW_AT_MIPS_linkage_name 0x2007 /* MIPS/SGI, GNU, and others.*/ +#define DW_AT_MIPS_stride 0x2008 /* MIPS/SGI */ +#define DW_AT_MIPS_abstract_name 0x2009 /* MIPS/SGI */ +#define DW_AT_MIPS_clone_origin 0x200a /* MIPS/SGI */ +#define DW_AT_MIPS_has_inlines 0x200b /* MIPS/SGI */ +#define DW_AT_MIPS_stride_byte 0x200c /* MIPS/SGI */ +#define DW_AT_MIPS_stride_elem 0x200d /* MIPS/SGI */ +#define DW_AT_MIPS_ptr_dopetype 0x200e /* MIPS/SGI */ +#define DW_AT_MIPS_allocatable_dopetype 0x200f /* MIPS/SGI */ +#define DW_AT_MIPS_assumed_shape_dopetype 0x2010 /* MIPS/SGI */ +#define DW_AT_MIPS_assumed_size 0x2011 /* MIPS/SGI */ + +/* HP extensions. */ +#define DW_AT_HP_unmodifiable 0x2001 /* conflict: MIPS */ +#define DW_AT_HP_actuals_stmt_list 0x2010 /* conflict: MIPS */ +#define DW_AT_HP_proc_per_section 0x2011 /* conflict: MIPS */ +#define DW_AT_HP_raw_data_ptr 0x2012 /* HP */ +#define DW_AT_HP_pass_by_reference 0x2013 /* HP */ +#define DW_AT_HP_opt_level 0x2014 /* HP */ +#define DW_AT_HP_prof_version_id 0x2015 /* HP */ +#define DW_AT_HP_opt_flags 0x2016 /* HP */ +#define DW_AT_HP_cold_region_low_pc 0x2017 /* HP */ +#define DW_AT_HP_cold_region_high_pc 0x2018 /* HP */ +#define DW_AT_HP_all_variables_modifiable 0x2019 /* HP */ +#define DW_AT_HP_linkage_name 0x201a /* HP */ +#define DW_AT_HP_prof_flags 0x201b /* HP */ + +#define DW_AT_CPQ_discontig_ranges 0x2001 /* COMPAQ/HP */ +#define DW_AT_CPQ_semantic_events 0x2002 /* COMPAQ/HP */ +#define DW_AT_CPQ_split_lifetimes_var 0x2003 /* COMPAQ/HP */ +#define DW_AT_CPQ_split_lifetimes_rtn 0x2004 /* COMPAQ/HP */ +#define DW_AT_CPQ_prologue_length 0x2005 /* COMPAQ/HP */ + +#define DW_AT_INTEL_other_endian 0x2026 /* Intel, 1 if byte swapped. */ + +/* GNU extensions. */ +#define DW_AT_sf_names 0x2101 /* GNU */ +#define DW_AT_src_info 0x2102 /* GNU */ +#define DW_AT_mac_info 0x2103 /* GNU */ +#define DW_AT_src_coords 0x2104 /* GNU */ +#define DW_AT_body_begin 0x2105 /* GNU */ +#define DW_AT_body_end 0x2106 /* GNU */ +#define DW_AT_GNU_vector 0x2107 /* GNU */ +#define DW_AT_GNU_template_name 0x2108 /* GNU */ + +/* ALTIUM extension: ALTIUM Compliant location lists (flag) */ +#define DW_AT_ALTIUM_loclist 0x2300 /* ALTIUM */ + +/* Sun extensions */ +#define DW_AT_SUN_template 0x2201 /* SUN */ +#define DW_AT_VMS_rtnbeg_pd_address 0x2201 /* VMS */ +#define DW_AT_SUN_alignment 0x2202 /* SUN */ +#define DW_AT_SUN_vtable 0x2203 /* SUN */ +#define DW_AT_SUN_count_guarantee 0x2204 /* SUN */ +#define DW_AT_SUN_command_line 0x2205 /* SUN */ +#define DW_AT_SUN_vbase 0x2206 /* SUN */ +#define DW_AT_SUN_compile_options 0x2207 /* SUN */ +#define DW_AT_SUN_language 0x2208 /* SUN */ +#define DW_AT_SUN_browser_file 0x2209 /* SUN */ +#define DW_AT_SUN_vtable_abi 0x2210 /* SUN */ +#define DW_AT_SUN_func_offsets 0x2211 /* SUN */ +#define DW_AT_SUN_cf_kind 0x2212 /* SUN */ +#define DW_AT_SUN_vtable_index 0x2213 /* SUN */ +#define DW_AT_SUN_omp_tpriv_addr 0x2214 /* SUN */ +#define DW_AT_SUN_omp_child_func 0x2215 /* SUN */ +#define DW_AT_SUN_func_offset 0x2216 /* SUN */ +#define DW_AT_SUN_memop_type_ref 0x2217 /* SUN */ +#define DW_AT_SUN_profile_id 0x2218 /* SUN */ +#define DW_AT_SUN_memop_signature 0x2219 /* SUN */ +#define DW_AT_SUN_obj_dir 0x2220 /* SUN */ +#define DW_AT_SUN_obj_file 0x2221 /* SUN */ +#define DW_AT_SUN_original_name 0x2222 /* SUN */ +#define DW_AT_SUN_hwcprof_signature 0x2223 /* SUN */ +#define DW_AT_SUN_amd64_parmdump 0x2224 /* SUN */ +#define DW_AT_SUN_part_link_name 0x2225 /* SUN */ +#define DW_AT_SUN_link_name 0x2226 /* SUN */ +#define DW_AT_SUN_pass_with_const 0x2227 /* SUN */ +#define DW_AT_SUN_return_with_const 0x2228 /* SUN */ +#define DW_AT_SUN_import_by_name 0x2229 /* SUN */ +#define DW_AT_SUN_f90_pointer 0x222a /* SUN */ +#define DW_AT_SUN_pass_by_ref 0x222b /* SUN */ +#define DW_AT_SUN_f90_allocatable 0x222c /* SUN */ +#define DW_AT_SUN_f90_assumed_shape_array 0x222d /* SUN */ +#define DW_AT_SUN_c_vla 0x222e /* SUN */ +#define DW_AT_SUN_return_value_ptr 0x2230 /* SUN */ +#define DW_AT_SUN_dtor_start 0x2231 /* SUN */ +#define DW_AT_SUN_dtor_length 0x2232 /* SUN */ +#define DW_AT_SUN_dtor_state_initial 0x2233 /* SUN */ +#define DW_AT_SUN_dtor_state_final 0x2234 /* SUN */ +#define DW_AT_SUN_dtor_state_deltas 0x2235 /* SUN */ +#define DW_AT_SUN_import_by_lname 0x2236 /* SUN */ +#define DW_AT_SUN_f90_use_only 0x2237 /* SUN */ +#define DW_AT_SUN_namelist_spec 0x2238 /* SUN */ +#define DW_AT_SUN_is_omp_child_func 0x2239 /* SUN */ +#define DW_AT_SUN_fortran_main_alias 0x223a /* SUN */ +#define DW_AT_SUN_fortran_based 0x223b /* SUN */ + +/* UPC extension */ +#define DW_AT_upc_threads_scaled 0x3210 /* UPC */ + +/* PGI (STMicroelectronics) extensions. */ +#define DW_AT_PGI_lbase 0x3a00 /* PGI. Block, constant, reference. This attribute is an ASTPLAB extension used to describe the array local base. */ +#define DW_AT_PGI_soffset 0x3a01 /* PGI. Block, constant, reference. ASTPLAB adds this attribute to describe the section offset, or the offset to the first element in the dimension. */ +#define DW_AT_PGI_lstride 0x3a02 /* PGI. Block, constant, reference. ASTPLAB adds this attribute to describe the linear stride or the distance between elements in the dimension. */ + +/* Apple Extensions for closures */ +#define DW_AT_APPLE_closure 0x3fe4 /* Apple */ +/* Apple Extensions for Objective-C runtime info */ +#define DW_AT_APPLE_major_runtime_vers 0x3fe5 /* Apple */ +#define DW_AT_APPLE_runtime_class 0x3fe6 /* Apple */ + + +#define DW_AT_hi_user 0x3fff + +#define DW_OP_addr 0x03 +#define DW_OP_deref 0x06 +#define DW_OP_const1u 0x08 +#define DW_OP_const1s 0x09 +#define DW_OP_const2u 0x0a +#define DW_OP_const2s 0x0b +#define DW_OP_const4u 0x0c +#define DW_OP_const4s 0x0d +#define DW_OP_const8u 0x0e +#define DW_OP_const8s 0x0f +#define DW_OP_constu 0x10 +#define DW_OP_consts 0x11 +#define DW_OP_dup 0x12 +#define DW_OP_drop 0x13 +#define DW_OP_over 0x14 +#define DW_OP_pick 0x15 +#define DW_OP_swap 0x16 +#define DW_OP_rot 0x17 +#define DW_OP_xderef 0x18 +#define DW_OP_abs 0x19 +#define DW_OP_and 0x1a +#define DW_OP_div 0x1b +#define DW_OP_minus 0x1c +#define DW_OP_mod 0x1d +#define DW_OP_mul 0x1e +#define DW_OP_neg 0x1f +#define DW_OP_not 0x20 +#define DW_OP_or 0x21 +#define DW_OP_plus 0x22 +#define DW_OP_plus_uconst 0x23 +#define DW_OP_shl 0x24 +#define DW_OP_shr 0x25 +#define DW_OP_shra 0x26 +#define DW_OP_xor 0x27 +#define DW_OP_bra 0x28 +#define DW_OP_eq 0x29 +#define DW_OP_ge 0x2a +#define DW_OP_gt 0x2b +#define DW_OP_le 0x2c +#define DW_OP_lt 0x2d +#define DW_OP_ne 0x2e +#define DW_OP_skip 0x2f +#define DW_OP_lit0 0x30 +#define DW_OP_lit1 0x31 +#define DW_OP_lit2 0x32 +#define DW_OP_lit3 0x33 +#define DW_OP_lit4 0x34 +#define DW_OP_lit5 0x35 +#define DW_OP_lit6 0x36 +#define DW_OP_lit7 0x37 +#define DW_OP_lit8 0x38 +#define DW_OP_lit9 0x39 +#define DW_OP_lit10 0x3a +#define DW_OP_lit11 0x3b +#define DW_OP_lit12 0x3c +#define DW_OP_lit13 0x3d +#define DW_OP_lit14 0x3e +#define DW_OP_lit15 0x3f +#define DW_OP_lit16 0x40 +#define DW_OP_lit17 0x41 +#define DW_OP_lit18 0x42 +#define DW_OP_lit19 0x43 +#define DW_OP_lit20 0x44 +#define DW_OP_lit21 0x45 +#define DW_OP_lit22 0x46 +#define DW_OP_lit23 0x47 +#define DW_OP_lit24 0x48 +#define DW_OP_lit25 0x49 +#define DW_OP_lit26 0x4a +#define DW_OP_lit27 0x4b +#define DW_OP_lit28 0x4c +#define DW_OP_lit29 0x4d +#define DW_OP_lit30 0x4e +#define DW_OP_lit31 0x4f +#define DW_OP_reg0 0x50 +#define DW_OP_reg1 0x51 +#define DW_OP_reg2 0x52 +#define DW_OP_reg3 0x53 +#define DW_OP_reg4 0x54 +#define DW_OP_reg5 0x55 +#define DW_OP_reg6 0x56 +#define DW_OP_reg7 0x57 +#define DW_OP_reg8 0x58 +#define DW_OP_reg9 0x59 +#define DW_OP_reg10 0x5a +#define DW_OP_reg11 0x5b +#define DW_OP_reg12 0x5c +#define DW_OP_reg13 0x5d +#define DW_OP_reg14 0x5e +#define DW_OP_reg15 0x5f +#define DW_OP_reg16 0x60 +#define DW_OP_reg17 0x61 +#define DW_OP_reg18 0x62 +#define DW_OP_reg19 0x63 +#define DW_OP_reg20 0x64 +#define DW_OP_reg21 0x65 +#define DW_OP_reg22 0x66 +#define DW_OP_reg23 0x67 +#define DW_OP_reg24 0x68 +#define DW_OP_reg25 0x69 +#define DW_OP_reg26 0x6a +#define DW_OP_reg27 0x6b +#define DW_OP_reg28 0x6c +#define DW_OP_reg29 0x6d +#define DW_OP_reg30 0x6e +#define DW_OP_reg31 0x6f +#define DW_OP_breg0 0x70 +#define DW_OP_breg1 0x71 +#define DW_OP_breg2 0x72 +#define DW_OP_breg3 0x73 +#define DW_OP_breg4 0x74 +#define DW_OP_breg5 0x75 +#define DW_OP_breg6 0x76 +#define DW_OP_breg7 0x77 +#define DW_OP_breg8 0x78 +#define DW_OP_breg9 0x79 +#define DW_OP_breg10 0x7a +#define DW_OP_breg11 0x7b +#define DW_OP_breg12 0x7c +#define DW_OP_breg13 0x7d +#define DW_OP_breg14 0x7e +#define DW_OP_breg15 0x7f +#define DW_OP_breg16 0x80 +#define DW_OP_breg17 0x81 +#define DW_OP_breg18 0x82 +#define DW_OP_breg19 0x83 +#define DW_OP_breg20 0x84 +#define DW_OP_breg21 0x85 +#define DW_OP_breg22 0x86 +#define DW_OP_breg23 0x87 +#define DW_OP_breg24 0x88 +#define DW_OP_breg25 0x89 +#define DW_OP_breg26 0x8a +#define DW_OP_breg27 0x8b +#define DW_OP_breg28 0x8c +#define DW_OP_breg29 0x8d +#define DW_OP_breg30 0x8e +#define DW_OP_breg31 0x8f +#define DW_OP_regx 0x90 +#define DW_OP_fbreg 0x91 +#define DW_OP_bregx 0x92 +#define DW_OP_piece 0x93 +#define DW_OP_deref_size 0x94 +#define DW_OP_xderef_size 0x95 +#define DW_OP_nop 0x96 +#define DW_OP_push_object_address 0x97 /* DWARF3 */ +#define DW_OP_call2 0x98 /* DWARF3 */ +#define DW_OP_call4 0x99 /* DWARF3 */ +#define DW_OP_call_ref 0x9a /* DWARF3 */ +#define DW_OP_form_tls_address 0x9b /* DWARF3f */ +#define DW_OP_call_frame_cfa 0x9c /* DWARF3f */ +#define DW_OP_bit_piece 0x9d /* DWARF3f */ +#define DW_OP_implicit_value 0x9e /* DWARF4 */ +#define DW_OP_stack_value 0x9f /* DWARF4 */ + + + /* GNU extensions. */ +#define DW_OP_GNU_push_tls_address 0xe0 /* GNU */ + +/* Follows extension so dwarfdump prints the most-likely-useful name. */ +#define DW_OP_lo_user 0xe0 + + /* HP extensions. */ +#define DW_OP_HP_unknown 0xe0 /* HP conflict: GNU */ +#define DW_OP_HP_is_value 0xe1 /* HP */ +#define DW_OP_HP_fltconst4 0xe2 /* HP */ +#define DW_OP_HP_fltconst8 0xe3 /* HP */ +#define DW_OP_HP_mod_range 0xe4 /* HP */ +#define DW_OP_HP_unmod_range 0xe5 /* HP */ +#define DW_OP_HP_tls 0xe6 /* HP */ + +#define DW_OP_INTEL_bit_piece 0xe8 /* Intel: made obsolete by DW_OP_bit_piece above. */ + + + /* Apple extension. */ +#define DW_OP_APPLE_uninit 0xf0 /* Apple */ + +#define DW_OP_hi_user 0xff + +#define DW_ATE_address 0x1 +#define DW_ATE_boolean 0x2 +#define DW_ATE_complex_float 0x3 +#define DW_ATE_float 0x4 +#define DW_ATE_signed 0x5 +#define DW_ATE_signed_char 0x6 +#define DW_ATE_unsigned 0x7 +#define DW_ATE_unsigned_char 0x8 +#define DW_ATE_imaginary_float 0x9 /* DWARF3 */ +#define DW_ATE_packed_decimal 0xa /* DWARF3f */ +#define DW_ATE_numeric_string 0xb /* DWARF3f */ +#define DW_ATE_edited 0xc /* DWARF3f */ +#define DW_ATE_signed_fixed 0xd /* DWARF3f */ +#define DW_ATE_unsigned_fixed 0xe /* DWARF3f */ +#define DW_ATE_decimal_float 0xf /* DWARF3f */ + + +/* ALTIUM extensions. x80, x81 */ +#define DW_ATE_ALTIUM_fract 0x80 /* ALTIUM __fract type */ + +/* Follows extension so dwarfdump prints the most-likely-useful name. */ +#define DW_ATE_lo_user 0x80 + +/* Shown here to help dwarfdump build script. */ +#define DW_ATE_ALTIUM_accum 0x81 /* ALTIUM __accum type */ + +/* HP Floating point extensions. */ +#define DW_ATE_HP_float80 0x80 /* (80 bit). HP */ + + +#define DW_ATE_HP_complex_float80 0x81 /* Complex (80 bit). HP */ +#define DW_ATE_HP_float128 0x82 /* (128 bit). HP */ +#define DW_ATE_HP_complex_float128 0x83 /* Complex (128 bit). HP */ +#define DW_ATE_HP_floathpintel 0x84 /* (82 bit IA64). HP */ +#define DW_ATE_HP_imaginary_float80 0x85 /* HP */ +#define DW_ATE_HP_imaginary_float128 0x86 /* HP */ + +/* Sun extensions */ +#define DW_ATE_SUN_interval_float 0x91 +#define DW_ATE_SUN_imaginary_float 0x92 /* Obsolete: See DW_ATE_imaginary_float */ + +#define DW_ATE_hi_user 0xff + + +/* Decimal Sign codes. */ +#define DW_DS_unsigned 0x01 /* DWARF3f */ +#define DW_DS_leading_overpunch 0x02 /* DWARF3f */ +#define DW_DS_trailing_overpunch 0x03 /* DWARF3f */ +#define DW_DS_leading_separate 0x04 /* DWARF3f */ + +#define DW_DS_trailing_separate 0x05 /* DWARF3f */ + +/* Endian code name. */ +#define DW_END_default 0x00 /* DWARF3f */ +#define DW_END_big 0x01 /* DWARF3f */ +#define DW_END_little 0x02 /* DWARF3f */ + +#define DW_END_lo_user 0x40 /* DWARF3f */ +#define DW_END_hi_user 0xff /* DWARF3f */ + +/* For use with DW_TAG_SUN_codeflags + * If DW_TAG_SUN_codeflags is accepted as a dwarf standard, then + * standard dwarf ATCF entries start at 0x01 + */ +#define DW_ATCF_lo_user 0x40 /* SUN */ +#define DW_ATCF_SUN_mop_bitfield 0x41 /* SUN */ +#define DW_ATCF_SUN_mop_spill 0x42 /* SUN */ +#define DW_ATCF_SUN_mop_scopy 0x43 /* SUN */ +#define DW_ATCF_SUN_func_start 0x44 /* SUN */ +#define DW_ATCF_SUN_end_ctors 0x45 /* SUN */ +#define DW_ATCF_SUN_branch_target 0x46 /* SUN */ +#define DW_ATCF_SUN_mop_stack_probe 0x47 /* SUN */ +#define DW_ATCF_SUN_func_epilog 0x48 /* SUN */ +#define DW_ATCF_hi_user 0xff /* SUN */ + +/* Accessibility code name. */ +#define DW_ACCESS_public 0x01 +#define DW_ACCESS_protected 0x02 +#define DW_ACCESS_private 0x03 + +/* Visibility code name. */ +#define DW_VIS_local 0x01 +#define DW_VIS_exported 0x02 +#define DW_VIS_qualified 0x03 + +/* Virtuality code name. */ +#define DW_VIRTUALITY_none 0x00 +#define DW_VIRTUALITY_virtual 0x01 +#define DW_VIRTUALITY_pure_virtual 0x02 + +#define DW_LANG_C89 0x0001 +#define DW_LANG_C 0x0002 +#define DW_LANG_Ada83 0x0003 +#define DW_LANG_C_plus_plus 0x0004 +#define DW_LANG_Cobol74 0x0005 +#define DW_LANG_Cobol85 0x0006 +#define DW_LANG_Fortran77 0x0007 +#define DW_LANG_Fortran90 0x0008 +#define DW_LANG_Pascal83 0x0009 +#define DW_LANG_Modula2 0x000a +#define DW_LANG_Java 0x000b /* DWARF3 */ +#define DW_LANG_C99 0x000c /* DWARF3 */ +#define DW_LANG_Ada95 0x000d /* DWARF3 */ +#define DW_LANG_Fortran95 0x000e /* DWARF3 */ +#define DW_LANG_PLI 0x000f /* DWARF3 */ +#define DW_LANG_ObjC 0x0010 /* DWARF3f */ +#define DW_LANG_ObjC_plus_plus 0x0011 /* DWARF3f */ +#define DW_LANG_UPC 0x0012 /* DWARF3f */ +#define DW_LANG_D 0x0013 /* DWARF3f */ +#define DW_LANG_Python 0x0014 /* DWARF4 */ +#define DW_LANG_lo_user 0x8000 +#define DW_LANG_Mips_Assembler 0x8001 /* MIPS */ +#define DW_LANG_Upc 0x8765 /* UPC, use + DW_LANG_UPC instead. */ +/* ALTIUM extension */ +#define DW_LANG_ALTIUM_Assembler 0x9101 /* ALTIUM */ + +/* Sun extensions */ +#define DW_LANG_SUN_Assembler 0x9001 /* SUN */ + +#define DW_LANG_hi_user 0xffff + +/* Identifier case name. */ +#define DW_ID_case_sensitive 0x00 +#define DW_ID_up_case 0x01 +#define DW_ID_down_case 0x02 +#define DW_ID_case_insensitive 0x03 + +/* Calling Convention Name. */ +#define DW_CC_normal 0x01 +#define DW_CC_program 0x02 +#define DW_CC_nocall 0x03 +#define DW_CC_lo_user 0x40 + +/* ALTIUM extensions. */ +/* Function is an interrupt handler, return address on system stack. */ +#define DW_CC_ALTIUM_interrupt 0x65 /* ALTIUM*/ + +/* Near function model, return address on system stack. */ +#define DW_CC_ALTIUM_near_system_stack 0x66 /*ALTIUM */ + +/* Near function model, return address on user stack. */ +#define DW_CC_ALTIUM_near_user_stack 0x67 /* ALTIUM */ + +/* Huge function model, return address on user stack. */ +#define DW_CC_ALTIUM_huge_user_stack 0x68 /* ALTIUM */ + + +#define DW_CC_hi_user 0xff + +/* Inline Code Name. */ +#define DW_INL_not_inlined 0x00 +#define DW_INL_inlined 0x01 +#define DW_INL_declared_not_inlined 0x02 +#define DW_INL_declared_inlined 0x03 + +/* Ordering Name. */ +#define DW_ORD_row_major 0x00 +#define DW_ORD_col_major 0x01 + +/* Discriminant Descriptor Name. */ +#define DW_DSC_label 0x00 +#define DW_DSC_range 0x01 + +/* Line number standard opcode name. */ +#define DW_LNS_copy 0x01 +#define DW_LNS_advance_pc 0x02 +#define DW_LNS_advance_line 0x03 +#define DW_LNS_set_file 0x04 +#define DW_LNS_set_column 0x05 +#define DW_LNS_negate_stmt 0x06 +#define DW_LNS_set_basic_block 0x07 +#define DW_LNS_const_add_pc 0x08 +#define DW_LNS_fixed_advance_pc 0x09 +#define DW_LNS_set_prologue_end 0x0a /* DWARF3 */ +#define DW_LNS_set_epilogue_begin 0x0b /* DWARF3 */ +#define DW_LNS_set_isa 0x0c /* DWARF3 */ + +/* Line number extended opcode name. */ +#define DW_LNE_end_sequence 0x01 +#define DW_LNE_set_address 0x02 +#define DW_LNE_define_file 0x03 +#define DW_LNE_set_discriminator 0x04 /* DWARF4 */ + +/* HP extensions. */ +#define DW_LNE_HP_negate_is_UV_update 0x11 /* 17 HP */ +#define DW_LNE_HP_push_context 0x12 /* 18 HP */ +#define DW_LNE_HP_pop_context 0x13 /* 19 HP */ +#define DW_LNE_HP_set_file_line_column 0x14 /* 20 HP */ +#define DW_LNE_HP_set_routine_name 0x15 /* 21 HP */ +#define DW_LNE_HP_set_sequence 0x16 /* 22 HP */ +#define DW_LNE_HP_negate_post_semantics 0x17 /* 23 HP */ +#define DW_LNE_HP_negate_function_exit 0x18 /* 24 HP */ +#define DW_LNE_HP_negate_front_end_logical 0x19 /* 25 HP */ +#define DW_LNE_HP_define_proc 0x20 /* 32 HP */ + +#define DW_LNE_lo_user 0x80 /* DWARF3 */ +#define DW_LNE_hi_user 0xff /* DWARF3 */ + +/* Macro information. */ +#define DW_MACINFO_define 0x01 +#define DW_MACINFO_undef 0x02 +#define DW_MACINFO_start_file 0x03 +#define DW_MACINFO_end_file 0x04 +#define DW_MACINFO_vendor_ext 0xff + +/* CFA operator compaction (a space saving measure, see + the DWARF standard) means DW_CFA_extended and DW_CFA_nop + have the same value here. */ +#define DW_CFA_advance_loc 0x40 +#define DW_CFA_offset 0x80 +#define DW_CFA_restore 0xc0 +#define DW_CFA_extended 0 + +#define DW_CFA_nop 0x00 +#define DW_CFA_set_loc 0x01 +#define DW_CFA_advance_loc1 0x02 +#define DW_CFA_advance_loc2 0x03 +#define DW_CFA_advance_loc4 0x04 +#define DW_CFA_offset_extended 0x05 +#define DW_CFA_restore_extended 0x06 +#define DW_CFA_undefined 0x07 +#define DW_CFA_same_value 0x08 +#define DW_CFA_register 0x09 +#define DW_CFA_remember_state 0x0a +#define DW_CFA_restore_state 0x0b +#define DW_CFA_def_cfa 0x0c +#define DW_CFA_def_cfa_register 0x0d +#define DW_CFA_def_cfa_offset 0x0e +#define DW_CFA_def_cfa_expression 0x0f /* DWARF3 */ +#define DW_CFA_expression 0x10 /* DWARF3 */ +#define DW_CFA_offset_extended_sf 0x11 /* DWARF3 */ +#define DW_CFA_def_cfa_sf 0x12 /* DWARF3 */ +#define DW_CFA_def_cfa_offset_sf 0x13 /* DWARF3 */ +#define DW_CFA_val_offset 0x14 /* DWARF3f */ +#define DW_CFA_val_offset_sf 0x15 /* DWARF3f */ +#define DW_CFA_val_expression 0x16 /* DWARF3f */ + +#define DW_CFA_lo_user 0x1c +#define DW_CFA_low_user 0x1c /* Incorrect spelling, do not use. */ + +/* SGI/MIPS extension. */ +#define DW_CFA_MIPS_advance_loc8 0x1d /* MIPS */ + +/* GNU extensions. */ +#define DW_CFA_GNU_window_save 0x2d /* GNU */ +#define DW_CFA_GNU_args_size 0x2e /* GNU */ +#define DW_CFA_GNU_negative_offset_extended 0x2f /* GNU */ + +#define DW_CFA_high_user 0x3f + +/* GNU exception header encoding. See the Generic + Elf Specification of the Linux Standard Base (LSB). + http://refspecs.freestandards.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/dwarfext.html + The upper 4 bits indicate how the value is to be applied. + The lower 4 bits indicate the format of the data. +*/ +#define DW_EH_PE_absptr 0x00 /* GNU */ +#define DW_EH_PE_uleb128 0x01 /* GNU */ +#define DW_EH_PE_udata2 0x02 /* GNU */ +#define DW_EH_PE_udata4 0x03 /* GNU */ +#define DW_EH_PE_udata8 0x04 /* GNU */ +#define DW_EH_PE_sleb128 0x09 /* GNU */ +#define DW_EH_PE_sdata2 0x0A /* GNU */ +#define DW_EH_PE_sdata4 0x0B /* GNU */ +#define DW_EH_PE_sdata8 0x0C /* GNU */ + +#define DW_EH_PE_pcrel 0x10 /* GNU */ +#define DW_EH_PE_textrel 0x20 /* GNU */ +#define DW_EH_PE_datarel 0x30 /* GNU */ +#define DW_EH_PE_funcrel 0x40 /* GNU */ +#define DW_EH_PE_aligned 0x50 /* GNU */ + +#define DW_EH_PE_omit 0xff /* GNU. Means no value present. */ + + +/* Mapping from machine registers and pseudo-regs into the .debug_frame table. + DW_FRAME entries are machine specific. These describe + MIPS/SGI R3000, R4K, R4400 and all later MIPS/SGI IRIX machines. + They describe a mapping from hardware register number to + the number used in the table to identify that register. + + The CFA (Canonical Frame Address) described in DWARF is called + the Virtual Frame Pointer on MIPS/SGI machines. + + The DW_FRAME* names here are MIPS/SGI specfic. + Libdwarf interfaces defined in 2008 make the + frame definitions + here (and the fixed table sizes they imply) obsolete. + They are left here for compatibility. +*/ +/* Default column used for CFA in the libdwarf reader client. + Assumes reg 0 never appears as + a register in DWARF information. Usable for MIPS, + but never a good idea, really. */ +#define DW_FRAME_CFA_COL 0 + +#define DW_FRAME_REG1 1 /* integer reg 1 */ +#define DW_FRAME_REG2 2 /* integer reg 2 */ +#define DW_FRAME_REG3 3 /* integer reg 3 */ +#define DW_FRAME_REG4 4 /* integer reg 4 */ +#define DW_FRAME_REG5 5 /* integer reg 5 */ +#define DW_FRAME_REG6 6 /* integer reg 6 */ +#define DW_FRAME_REG7 7 /* integer reg 7 */ +#define DW_FRAME_REG8 8 /* integer reg 8 */ +#define DW_FRAME_REG9 9 /* integer reg 9 */ +#define DW_FRAME_REG10 10 /* integer reg 10 */ +#define DW_FRAME_REG11 11 /* integer reg 11 */ +#define DW_FRAME_REG12 12 /* integer reg 12 */ +#define DW_FRAME_REG13 13 /* integer reg 13 */ +#define DW_FRAME_REG14 14 /* integer reg 14 */ +#define DW_FRAME_REG15 15 /* integer reg 15 */ +#define DW_FRAME_REG16 16 /* integer reg 16 */ +#define DW_FRAME_REG17 17 /* integer reg 17 */ +#define DW_FRAME_REG18 18 /* integer reg 18 */ +#define DW_FRAME_REG19 19 /* integer reg 19 */ +#define DW_FRAME_REG20 20 /* integer reg 20 */ +#define DW_FRAME_REG21 21 /* integer reg 21 */ +#define DW_FRAME_REG22 22 /* integer reg 22 */ +#define DW_FRAME_REG23 23 /* integer reg 23 */ +#define DW_FRAME_REG24 24 /* integer reg 24 */ +#define DW_FRAME_REG25 25 /* integer reg 25 */ +#define DW_FRAME_REG26 26 /* integer reg 26 */ +#define DW_FRAME_REG27 27 /* integer reg 27 */ +#define DW_FRAME_REG28 28 /* integer reg 28 */ +#define DW_FRAME_REG29 29 /* integer reg 29 */ +#define DW_FRAME_REG30 30 /* integer reg 30 */ +#define DW_FRAME_REG31 31 /* integer reg 31, aka ra */ + + /* MIPS1, 2 have only some of these 64-bit registers. + ** MIPS1 save/restore takes 2 instructions per 64-bit reg, and + ** in that case, the register is considered stored after the second + ** swc1. + */ +#define DW_FRAME_FREG0 32 /* 64-bit floating point reg 0 */ +#define DW_FRAME_FREG1 33 /* 64-bit floating point reg 1 */ +#define DW_FRAME_FREG2 34 /* 64-bit floating point reg 2 */ +#define DW_FRAME_FREG3 35 /* 64-bit floating point reg 3 */ +#define DW_FRAME_FREG4 36 /* 64-bit floating point reg 4 */ +#define DW_FRAME_FREG5 37 /* 64-bit floating point reg 5 */ +#define DW_FRAME_FREG6 38 /* 64-bit floating point reg 6 */ +#define DW_FRAME_FREG7 39 /* 64-bit floating point reg 7 */ +#define DW_FRAME_FREG8 40 /* 64-bit floating point reg 8 */ +#define DW_FRAME_FREG9 41 /* 64-bit floating point reg 9 */ +#define DW_FRAME_FREG10 42 /* 64-bit floating point reg 10 */ +#define DW_FRAME_FREG11 43 /* 64-bit floating point reg 11 */ +#define DW_FRAME_FREG12 44 /* 64-bit floating point reg 12 */ +#define DW_FRAME_FREG13 45 /* 64-bit floating point reg 13 */ +#define DW_FRAME_FREG14 46 /* 64-bit floating point reg 14 */ +#define DW_FRAME_FREG15 47 /* 64-bit floating point reg 15 */ +#define DW_FRAME_FREG16 48 /* 64-bit floating point reg 16 */ +#define DW_FRAME_FREG17 49 /* 64-bit floating point reg 17 */ +#define DW_FRAME_FREG18 50 /* 64-bit floating point reg 18 */ +#define DW_FRAME_FREG19 51 /* 64-bit floating point reg 19 */ +#define DW_FRAME_FREG20 52 /* 64-bit floating point reg 20 */ +#define DW_FRAME_FREG21 53 /* 64-bit floating point reg 21 */ +#define DW_FRAME_FREG22 54 /* 64-bit floating point reg 22 */ +#define DW_FRAME_FREG23 55 /* 64-bit floating point reg 23 */ +#define DW_FRAME_FREG24 56 /* 64-bit floating point reg 24 */ +#define DW_FRAME_FREG25 57 /* 64-bit floating point reg 25 */ +#define DW_FRAME_FREG26 58 /* 64-bit floating point reg 26 */ +#define DW_FRAME_FREG27 59 /* 64-bit floating point reg 27 */ +#define DW_FRAME_FREG28 60 /* 64-bit floating point reg 28 */ +#define DW_FRAME_FREG29 61 /* 64-bit floating point reg 29 */ +#define DW_FRAME_FREG30 62 /* 64-bit floating point reg 30 */ +#define DW_FRAME_FREG31 63 /* 64-bit floating point reg 31 */ + +/* ***IMPORTANT NOTE, TARGET DEPENDENCY **** + The following 4 #defines are dependent on + the target cpu(s) that you apply libdwarf to. + Ensure that DW_FRAME_UNDEFINED_VAL and DW_FRAME_SAME_VAL + do not conflict with the range [0-DW_FRAME_STATIC_LINK]. + The value 63 works for MIPS cpus at least up to the R16000. + + For a cpu with more than 63 real registers + DW_FRAME_HIGHEST_NORMAL_REGISTER + must be increased for things to work properly! + Also ensure that DW_FRAME_UNDEFINED_VAL DW_FRAME_SAME_VAL + are not in the range [0-DW_FRAME_STATIC_LINK] + + Having DW_FRAME_HIGHEST_NORMAL_REGISTER be higher than + is strictly needed is safe. + +*/ + +#ifndef DW_FRAME_HIGHEST_NORMAL_REGISTER +#define DW_FRAME_HIGHEST_NORMAL_REGISTER 63 +#endif +/* This is the number of columns in the Frame Table. + This constant should + be kept in sync with DW_REG_TABLE_SIZE defined in libdwarf.h + It must also be large enough to be beyond the highest + compiler-defined-register (meaning DW_FRAME_RA_COL DW_FRAME_STATIC_LINK + in the MIPS/IRIX case */ +#ifndef DW_FRAME_LAST_REG_NUM +#define DW_FRAME_LAST_REG_NUM (DW_FRAME_HIGHEST_NORMAL_REGISTER + 3) +#endif + + +/* Column recording ra (return address from a function call). + This is common to many architectures, but as a 'simple register' + is not necessarily adequate for all architectures. + For MIPS/IRIX this register number is actually recorded on disk + in the .debug_frame section. + */ +#define DW_FRAME_RA_COL (DW_FRAME_HIGHEST_NORMAL_REGISTER + 1) + +/* Column recording static link applicable to up-level + addressing, as in IRIX mp code, pascal, etc. + This is common to many architectures but + is not necessarily adequate for all architectures. + For MIPS/IRIX this register number is actually recorded on disk + in the .debug_frame section. +*/ +#define DW_FRAME_STATIC_LINK (DW_FRAME_HIGHEST_NORMAL_REGISTER + 2) + + + +/* + DW_FRAME_UNDEFINED_VAL and DW_FRAME_SAME_VAL are + never on disk, just generated by libdwarf. See libdwarf.h + for their values. +*/ + + + +#define DW_CHILDREN_no 0x00 +#define DW_CHILDREN_yes 0x01 + +#define DW_ADDR_none 0 + +#ifdef __cplusplus +} +#endif +#endif /* __DWARF_H */ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_abbrev.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_abbrev.h new file mode 100644 index 000000000..b525924c8 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_abbrev.h @@ -0,0 +1,55 @@ +/* + + Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright (C) 2008-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 + +*/ + + + + +/* In a given CU, one of these is (eventually) set up + for every abbreviation we need to find (and for all. + those ealier in the abbreviations for that CU). + So we don't want elements needlessly big. +*/ +struct Dwarf_Abbrev_s { + /* No TAG should exceed DW_TAG_hi_user, 0xffff, but + we do allow a larger value here. */ + Dwarf_Word ab_tag; + /* Abbreviations are numbered (normally sequentially from + 1 and so 16 bits is not enough! */ + Dwarf_Word ab_code; + Dwarf_Small ab_has_child; + Dwarf_Byte_Ptr ab_abbrev_ptr; + Dwarf_Debug ab_dbg; +}; diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_addr_finder.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_addr_finder.h new file mode 100644 index 000000000..0eda6d1c4 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_addr_finder.h @@ -0,0 +1,55 @@ +/* + dwarf_addr_finder.h + $Source: /plroot/cmplrs.src/v7.4.5m/.RCS/PL/include/cmplrs/RCS/dwarf_addr_finder.h,v $ + $Date: 2002/06/11 17:49:06 $ + + Defines user interface. + +*/ + +/* return codes for functions +*/ +#define DW_DLV_NO_ENTRY -1 +#define DW_DLV_OK 0 +#define DW_DLV_ERROR 1 + + +/* the following are the 'section' number passed to the called-back + function. + The called-back application must translate this to the + appropriate elf section number/pointer. + + Putting this burden on the application avoids having to store + the numbers in the Dwarf_Debug structure (thereby saving space + for most consumers). +*/ +#define DW_SECTION_INFO 0 +#define DW_SECTION_FRAME 1 +#define DW_SECTION_ARANGES 2 +#define DW_SECTION_LINE 3 +#define DW_SECTION_LOC 4 /* .debug_loc */ + +/* section is one of the above codes: it specifies a section. + secoff is the offset in the dwarf section. + existingAddr is the value at the specified offset (so the + called back routine can sanity check the proceedings). + It's up to the caller to know the size of an address (4 or 8) + and update the right number of bytes. +*/ +typedef int (*Dwarf_addr_callback_func) (int /*section*/, + Dwarf_Off /*secoff*/, Dwarf_Addr /*existingAddr*/); + +/* call this to do the work: it calls back thru cb_func + once per each address to be modified. + Once this returns you are done. + Returns DW_DLV_OK if finished ok. + Returns DW_DLV_ERROR if there was some kind of error, in which + the dwarf error number was passed back thu the dwerr ptr. + Returns DW_DLV_NO_ENTRY if there are no relevant dwarf sections, + so there were no addresses to be modified (and none + called back). +*/ +int _dwarf_addr_finder(dwarf_elf_handle elf_file_ptr, + Dwarf_addr_callback_func cb_func, + int *dwerr); + diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_alloc.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_alloc.h new file mode 100644 index 000000000..3a61c692c --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_alloc.h @@ -0,0 +1,177 @@ +/* + + Copyright (C) 2000,2005 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright (C) 2008-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 + +*/ + +/* #define DWARF_SIMPLE_MALLOC 1 */ + +Dwarf_Ptr _dwarf_get_alloc(Dwarf_Debug, Dwarf_Small, Dwarf_Unsigned); +Dwarf_Debug _dwarf_get_debug(void); +Dwarf_Debug _dwarf_setup_debug(Dwarf_Debug); +int _dwarf_free_all_of_one_debug(Dwarf_Debug); + +typedef struct Dwarf_Alloc_Area_s *Dwarf_Alloc_Area; +typedef struct Dwarf_Free_List_s *Dwarf_Free_List; + +/* ALLOC_AREA_INDEX_TABLE_MAX is the size of the + struct ial_s index_into_allocated array in dwarf_alloc.c +*/ +#define ALLOC_AREA_INDEX_TABLE_MAX 45 +/* ALLOC_AREA_REAL_TABLE_MAX is the size of the array needed + to hold pointers to dwarf alloc chunk areas. + It's smaller as some of the index_into_allocated + entries (they look like {0,1,1,0,0} ) + are treated specially and don't use 'chunks'. +*/ +#define ALLOC_AREA_REAL_TABLE_MAX 32 + +/* + This struct is used to chain all the deallocated + structs on the free list of each chain. The structs + are chained internally, by using the memory they + contain. +*/ +struct Dwarf_Free_List_s { + Dwarf_Free_List fl_next; +}; + + +/* + This struct is used to manage all the chunks malloc'ed + for a particular alloc_type. Many of the fields are + initialized by dwarf_init(). +*/ +struct Dwarf_Alloc_Hdr_s { + + /* Count of actual number of structs user app holds pointers to + currently. */ + Dwarf_Sword ah_struct_user_holds; + + /* + Size of each struct that will be allocated for this alloc_type. + Initialized by dwarf_init(). */ + Dwarf_Half ah_bytes_one_struct; + + /* + Number of structs of this alloc_type that will be contained in + each chunk that is malloc'ed. Initialized by dwarf_init(). */ + Dwarf_Word ah_structs_per_chunk; + + /* + Number of bytes malloc'ed per chunk which is basically + (ah_bytes_one_struct+_DWARF_RESERVE) * ah_alloc_num. */ + Dwarf_Word ah_bytes_malloc_per_chunk; + + /* Count of chunks currently allocated for type. */ + Dwarf_Sword ah_chunks_allocated; + + /* + Points to a chain of Dwarf_Alloc_Area_s structs that represent + all the chunks currently allocated for the alloc_type. */ + Dwarf_Alloc_Area ah_alloc_area_head; + + /* Last Alloc Area that was allocated by malloc. The + free-space-search area looks here first and only if it is full + goes thru the list pointed to by ah_alloc_area_head. */ + Dwarf_Alloc_Area ah_last_alloc_area; +}; + + +/* + This struct is used to manage each chunk that is + malloc'ed for a particular alloc_type. For each + allocation type, the allocation header points to + a list of all the chunks malloc'ed for that type. +*/ +struct Dwarf_Alloc_Area_s { + + /* Points to the free list of structs in the chunk. */ + Dwarf_Ptr aa_free_list; + + /* + Count of the number of free structs in the chunk. This includes + both those on the free list, and in the blob. */ + Dwarf_Sword aa_free_structs_in_chunk; + + /* + Points to the first byte of the blob from which struct will be + allocated. A struct is put on the free_list only when it + dwarf_deallocated. Initial allocations are from the blob. */ + Dwarf_Small *aa_blob_start; + + /* Points just past the last byte of the blob. */ + Dwarf_Small *aa_blob_end; + + /* Points to alloc_hdr this alloc_area is linked to: The owner, in + other words. */ + Dwarf_Alloc_Hdr aa_alloc_hdr; + + /* + Used for chaining Dwarf_Alloc_Area_s atructs. Alloc areas are + doubly linked to enable deletion from the list in constant time. */ + Dwarf_Alloc_Area aa_next; + Dwarf_Alloc_Area aa_prev; +}; + +struct Dwarf_Error_s *_dwarf_special_no_dbg_error_malloc(void); + +#ifdef DWARF_SIMPLE_MALLOC +/* + DWARF_SIMPLE_MALLOC is for testing the hypothesis that the existing + complex malloc scheme in libdwarf is pointless complexity. + + DWARF_SIMPLE_MALLOC also makes it easy for a malloc-tracing + tool to verify libdwarf malloc has no botches (though of course + such does not test the complicated standard-libdwarf-alloc code). + +*/ + +struct simple_malloc_entry_s { + Dwarf_Small *se_addr; + unsigned long se_size; + short se_type; +}; +#define DSM_BLOCK_COUNT (1000) +#define DSM_BLOCK_SIZE (sizeof(struct simple_malloc_entry_s)*DSM_BLOCK_COUNT) + +/* we do this so dwarf_dealloc can really free everything */ +struct simple_malloc_record_s { + struct simple_malloc_record_s *sr_next; + int sr_used; + struct simple_malloc_entry_s sr_entry[DSM_BLOCK_COUNT]; +}; + + + +#endif /* DWARF_SIMPLE_MALLOC */ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_arange.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_arange.h new file mode 100644 index 000000000..d6c537c45 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_arange.h @@ -0,0 +1,71 @@ +/* + + Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright (C) 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 + +*/ + + + +/* This structure is used to read an arange into. */ +struct Dwarf_Arange_s { + + /* The segment selector. Only non-zero if Dwarf4, only + meaningful if ar_segment_selector_size non-zero */ + Dwarf_Unsigned ar_segment_selector; + + /* Starting address of the arange, ie low-pc. */ + Dwarf_Addr ar_address; + + /* Length of the arange. */ + Dwarf_Unsigned ar_length; + + + /* + Offset into .debug_info of the start of the compilation-unit + containing this set of aranges. */ + Dwarf_Off ar_info_offset; + + /* Corresponding Dwarf_Debug. */ + Dwarf_Debug ar_dbg; + + Dwarf_Half ar_segment_selector_size; +}; + + + +int + _dwarf_get_aranges_addr_offsets(Dwarf_Debug dbg, + Dwarf_Addr ** addrs, + Dwarf_Off ** offsets, + Dwarf_Signed * count, + Dwarf_Error * error); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_base_types.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_base_types.h new file mode 100644 index 000000000..00e2700a8 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_base_types.h @@ -0,0 +1,123 @@ +/* + + Copyright (C) 2000,2005 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright (C) 2008-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 + +*/ + + + +#include "libdwarfdefs.h" + +#define true 1 +#define false 0 + +/* to identify a cie */ +#define DW_CIE_ID ~(0x0) +#define DW_CIE_VERSION 1 /* DWARF2 */ +#define DW_CIE_VERSION3 3 /* DWARF3 */ +#define DW_CIE_VERSION4 4 /* DWARF4 */ + +#define DW_CU_VERSION2 2 +#define DW_CU_VERSION3 3 +#define DW_CU_VERSION4 4 + +/* DWARF2,3 and 4 */ +#define DW_ARANGES_VERSION2 2 + +#define DW_LINE_VERSION2 2 +#define DW_LINE_VERSION3 3 +#define DW_LINE_VERSION4 4 + + +/* + These are allocation type codes for structs that + are internal to the Libdwarf Consumer library. +*/ +#define DW_DLA_ABBREV_LIST DW_DLA_RANGES + 1 +#define DW_DLA_CHAIN DW_DLA_RANGES + 2 +#define DW_DLA_CU_CONTEXT DW_DLA_RANGES + 3 +#define DW_DLA_FRAME DW_DLA_RANGES + 4 +#define DW_DLA_GLOBAL_CONTEXT DW_DLA_RANGES + 5 +#define DW_DLA_FILE_ENTRY DW_DLA_RANGES + 6 +#define DW_DLA_LINE_CONTEXT DW_DLA_RANGES + 7 +#define DW_DLA_LOC_CHAIN DW_DLA_RANGES + 8 +#define DW_DLA_HASH_TABLE DW_DLA_RANGES + 9 +#define DW_DLA_FUNC_CONTEXT DW_DLA_RANGES + 10 +#define DW_DLA_TYPENAME_CONTEXT DW_DLA_RANGES + 11 +#define DW_DLA_VAR_CONTEXT DW_DLA_RANGES + 12 +#define DW_DLA_WEAK_CONTEXT DW_DLA_RANGES + 13 +#define DW_DLA_PUBTYPES_CONTEXT DW_DLA_RANGES + 14 /* DWARF3 */ +#define DW_DLA_HASH_TABLE_ENTRY DW_DLA_RANGES + 15 + +/* Maximum number of allocation types for allocation routines. */ +#define MAX_DW_DLA DW_DLA_HASH_TABLE_ENTRY + +/*Dwarf_Word is unsigned word usable for index, count in memory */ +/*Dwarf_Sword is signed word usable for index, count in memory */ +/* The are 32 or 64 bits depending if 64 bit longs or not, which +** fits the ILP32 and LP64 models +** These work equally well with ILP64. +*/ + +typedef unsigned long Dwarf_Word; +typedef signed long Dwarf_Sword; + +typedef signed char Dwarf_Sbyte; +typedef unsigned char Dwarf_Ubyte; +typedef signed short Dwarf_Shalf; +typedef Dwarf_Small *Dwarf_Byte_Ptr; + +/* these 2 are fixed sizes which must not vary with the +** ILP32/LP64 model. Between these two, stay at 32 bit. +*/ +typedef __uint32_t Dwarf_ufixed; +typedef __int32_t Dwarf_sfixed; + +/* + In various places the code mistakenly associates + forms 8 bytes long with Dwarf_Signed or Dwarf_Unsigned + This is not a very portable assumption. + The following should be used instead for 64 bit integers. +*/ +typedef __uint64_t Dwarf_ufixed64; +typedef __int64_t Dwarf_sfixed64; + + +typedef struct Dwarf_Abbrev_List_s *Dwarf_Abbrev_List; +typedef struct Dwarf_File_Entry_s *Dwarf_File_Entry; +typedef struct Dwarf_CU_Context_s *Dwarf_CU_Context; +typedef struct Dwarf_Hash_Table_s *Dwarf_Hash_Table; +typedef struct Dwarf_Hash_Table_Entry_s *Dwarf_Hash_Table_Entry; + + +typedef struct Dwarf_Alloc_Hdr_s *Dwarf_Alloc_Hdr; diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_die_deliv.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_die_deliv.h new file mode 100644 index 000000000..f1ecb153b --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_die_deliv.h @@ -0,0 +1,57 @@ +/* + + Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright (C) 2008-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 + +*/ + + + + +/* + This struct holds information about a abbreviation. + It is put in the hash table for abbreviations for + a compile-unit. +*/ +struct Dwarf_Abbrev_List_s { + + Dwarf_Unsigned ab_code; + Dwarf_Half ab_tag; + Dwarf_Half ab_has_child; + + /* + Points to start of attribute and form pairs in the .debug_abbrev + section for the abbrev. */ + Dwarf_Byte_Ptr ab_abbrev_ptr; + + struct Dwarf_Abbrev_List_s *ab_next; +}; diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_elf_access.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_elf_access.h new file mode 100644 index 000000000..fd52c1793 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_elf_access.h @@ -0,0 +1,55 @@ +#ifndef _DWARF_ELF_PORT_H +#define _DWARF_ELF_PORT_H +/* + + Copyright (C) 2008-2010 David Anderson. All rights reserved. + Portions Copyright 2008-2010 Arxan Technologies, Inc. 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 + +*/ + + + +/* ELF (usually libelf) object access for the generic object file interface */ + +int +dwarf_elf_object_access_init(dwarf_elf_handle elf , + int libdwarf_owns_elf, + Dwarf_Obj_Access_Interface** ret_obj, + int *err ); + +void +dwarf_elf_object_access_finish(Dwarf_Obj_Access_Interface* obj ); + +/* End ELF object access for the generic object file interface */ + + +#endif diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_error.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_error.h new file mode 100644 index 000000000..27acf70db --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_error.h @@ -0,0 +1,43 @@ +/* + + Copyright (C) 2000 Silicon Graphics, Inc. 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 + +*/ + + + +void _dwarf_error(Dwarf_Debug dbg, Dwarf_Error * error, + Dwarf_Sword errval); + +struct Dwarf_Error_s { + Dwarf_Sword er_errval; +}; diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_frame.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_frame.h new file mode 100644 index 000000000..ceb686335 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_frame.h @@ -0,0 +1,421 @@ +/* + + Copyright (C) 2000, 2004, 2006 Silicon Graphics, Inc. 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 dwarf 2.0 standard dictates that only the following + * fields can be read when an unexpected augmentation string + * (in the cie) is encountered: CIE length, CIE_id, version and + * augmentation; FDE: length, CIE pointer, initial location and + * address range. Unfortunately, with the above restrictions, it + * is impossible to read the instruction table from a CIE or a FDE + * when a new augmentation string is encountered. + * To fix this problem, the following layout is used, if the + * augmentation string starts with the string "z". + * CIE FDE + * length length + * CIE_id CIE_pointer + * version initial_location + * augmentation address_range + * length_of_augmented_fields (*NEW*) + * code_alignment_factor Any new fields as necessary + * data_alignment_factor instruction_table + * return_address + * length_of_augmented fields + * Any new fields as necessary + * initial_instructions + * + * The type of all the old data items are the same as what is + * described in dwarf 2.0 standard. The length_of_augmented_fields + * is an LEB128 data item that denotes the size (in bytes) of + * the augmented fields (not including the size of + * "length_of_augmented_fields" itself). + + * Handling of cie augmentation strings is necessarly a heuristic. + * See dwarf_frame.c for the currently known augmentation strings. + + + ---START SGI-ONLY COMMENT: + * SGI-IRIX versions of cie or fde were intended to use "z1", "z2" as the + * augmenter strings if required for new augmentation. + * However, that never happened (as of March 2005). + * + * The fde's augmented by the string "z" have a new field + * (signed constant, 4 byte field) + * called offset_into_exception_tables, following the + * length_of_augmented field. This field contains an offset + * into the "_MIPS_eh_region", which describes + * the IRIX CC exception handling tables. + ---END SGI-ONLY COMMENT + + + * GNU .eh_frame has an augmentation string of z[RLP]* (gcc 3.4) + * The similarity to IRIX 'z' (and proposed but never + * implemented IRIX z1, z2 etc) was confusing things. + * If the section is .eh_frame then 'z' means GNU exception + * information 'Augmentation Data' not IRIX 'z'. + * See The Linux Standard Base Core Specification version 3.0 + */ + +#define DW_DEBUG_FRAME_VERSION 1 /* DWARF2 */ +#define DW_DEBUG_FRAME_VERSION3 3 /* DWARF3 */ +#define DW_DEBUG_FRAME_VERSION4 4 /* DWARF4 */ +/* The following is SGI/IRIX specific, and probably no longer + in use anywhere. */ +#define DW_DEBUG_FRAME_AUGMENTER_STRING "mti v1" + +/* The value of the offset field for Cie's. */ +#define DW_CIE_OFFSET ~(0x0) + +/* The augmentation string may be NULL. */ +#define DW_EMPTY_STRING "" + +#define DW_FRAME_INSTR_OPCODE_SHIFT 6 +#define DW_FRAME_INSTR_OFFSET_MASK 0x3f + +/* + This struct denotes the rule for a register in a row of + the frame table. In other words, it is one element of + the table. +*/ +struct Dwarf_Reg_Rule_s { + + /* + Is a flag indicating whether the rule includes the offset + field, ie whether the ru_offset field is valid or not. + Applies only if DW_EXPR_OFFSET or DW_EXPR_VAL_OFFSET. + It is important, since reg+offset (offset of 0) is different from + just 'register' since the former means 'read memory at address + given by the sum of register contents plus offset to get the + value'. whereas the latter means 'the value is in the register'. + + The 'register' numbers are either real registers (ie, table + columns defined as real registers) or defined entries that are + not really hardware registers, such as DW_FRAME_SAME_VAL or + DW_FRAME_CFA_COL. + + */ + Dwarf_Sbyte ru_is_off; + + /* DW_EXPR_OFFSET (0, DWARF2) + DW_EXPR_VAL_OFFSET 1 (dwarf2/3) + DW_EXPR_EXPRESSION 2 (dwarf2/3) + DW_EXPR_VAL_EXPRESSION 3 (dwarf2/3) + See dwarf_frame.h. */ + Dwarf_Sbyte ru_value_type; + + /* Register involved in this rule. */ + Dwarf_Half ru_register; + + /* Offset to add to register, if indicated by ru_is_offset + and if DW_EXPR_OFFSET or DW_EXPR_VAL_OFFSET. + If DW_EXPR_EXPRESSION or DW_EXPR_VAL_EXPRESSION + this is DW_FORM_block block-length, not offset. */ + Dwarf_Unsigned ru_offset_or_block_len; + + /* For DW_EXPR_EXPRESSION DW_EXPR_VAL_EXPRESSION these is set, + else 0. */ + Dwarf_Small *ru_block; +}; + +typedef struct Dwarf_Frame_s *Dwarf_Frame; + +/* + This structure represents a row of the frame table. + Fr_loc is the pc value for this row, and Fr_reg + contains the rule for each column. + + Entry DW_FRAME_CFA_COL of fr_reg was the tradional MIPS + way of setting CFA. cfa_rule is the new one. +*/ +struct Dwarf_Frame_s { + + /* Pc value corresponding to this row of the frame table. */ + Dwarf_Addr fr_loc; + + /* Rules for all the registers in this row. */ + struct Dwarf_Reg_Rule_s fr_cfa_rule; + + /* fr_reg_count is the the number of + entries of the fr_reg array. */ + unsigned long fr_reg_count; + struct Dwarf_Reg_Rule_s *fr_reg; + + Dwarf_Frame fr_next; +}; + +typedef struct Dwarf_Frame_Op_List_s *Dwarf_Frame_Op_List; + +/* This is used to chain together Dwarf_Frame_Op structures. */ +struct Dwarf_Frame_Op_List_s { + Dwarf_Frame_Op *fl_frame_instr; + Dwarf_Frame_Op_List fl_next; +}; + +/* See dwarf_frame.c for the heuristics used to set the + Dwarf_Cie ci_augmentation_type. + + This succinctly helps interpret the size and meaning of .debug_frame + and (for gcc) .eh_frame. + + In the case of gcc .eh_frame (gcc 3.3, 3.4) + z may be followed by one or more of + L R P. + +*/ +enum Dwarf_augmentation_type { + aug_empty_string, /* Default empty augmentation string. */ + aug_irix_exception_table, /* IRIX plain "z", + for exception handling, IRIX CC compiler. + Proposed z1 z2 ... never implemented. */ + aug_gcc_eh_z, /* gcc z augmentation, (including + L R P variations). gcc 3.3 3.4 exception + handling in eh_frame. */ + aug_irix_mti_v1, /* IRIX "mti v1" augmentation string. Probably + never in any released SGI-IRIX compiler. */ + aug_eh, /* For gcc .eh_frame, "eh" is the string., + gcc 1,2, egcs. Older values. */ + aug_armcc, /* "armcc+" meaning the cfa calculation + is corrected to be standard (output by + Arm C RVCT 3.0 SP1 and later). See + http://sourceware.org/ml/gdb-patches/2006-12/msg00249.html + for details. */ + aug_unknown, /* Unknown augmentation, we cannot do much. */ + aug_past_last +}; + + +/* + This structure contains all the pertinent info for a Cie. Most + of the fields are taken straight from the definition of a Cie. + Ci_cie_start points to the address (in .debug_frame) where this + Cie begins. Ci_cie_instr_start points to the first byte of the + frame instructions for this Cie. Ci_dbg points to the associated + Dwarf_Debug structure. Ci_initial_table is a pointer to the table + row generated by the instructions for this Cie. +*/ +struct Dwarf_Cie_s { + Dwarf_Unsigned ci_length; + char *ci_augmentation; + Dwarf_Small ci_code_alignment_factor; + Dwarf_Sbyte ci_data_alignment_factor; + Dwarf_Small ci_return_address_register; + Dwarf_Small *ci_cie_start; + Dwarf_Small *ci_cie_instr_start; + Dwarf_Debug ci_dbg; + Dwarf_Frame ci_initial_table; + Dwarf_Cie ci_next; + Dwarf_Small ci_length_size; + Dwarf_Small ci_extension_size; + Dwarf_Half ci_cie_version_number; + enum Dwarf_augmentation_type ci_augmentation_type; + + /* The following 2 for GNU .eh_frame exception handling + Augmentation Data. Set if ci_augmentation_type + is aug_gcc_eh_z. Zero if unused. */ + Dwarf_Unsigned ci_gnu_eh_augmentation_len; + Dwarf_Ptr ci_gnu_eh_augmentation_bytes; + + /* These are extracted from the gnu eh_frame + augmentation if the + augmentation begins with 'z'. See Linux LSB documents. + Otherwize these are zero. */ + unsigned char ci_gnu_personality_handler_encoding; + unsigned char ci_gnu_lsda_encoding; + unsigned char ci_gnu_fde_begin_encoding; + + /* If 'P' augmentation present, is handler addr. Else + is zero. */ + Dwarf_Addr ci_gnu_personality_handler_addr; + + + /* In creating list of cie's (which will become an array) + record the position so fde can get it on fde creation. */ + Dwarf_Unsigned ci_index; + Dwarf_Small * ci_section_ptr; + /* DWARF4 adds address size and segment size to the CIE: the .debug_info + section may not always be present to allow libdwarf to + find address_size from the compilation-unit. */ + Dwarf_Half ci_address_size; + Dwarf_Half ci_segment_size; + +}; + +/* + This structure contains all the pertinent info for a Fde. + Most of the fields are taken straight from the definition. + fd_cie_index is the index of the Cie associated with this + Fde in the list of Cie's for this debug_frame. Fd_cie + points to the corresponsing Dwarf_Cie structure. Fd_fde_start + points to the start address of the Fde. Fd_fde_instr_start + points to the start of the instructions for this Fde. Fd_dbg + points to the associated Dwarf_Debug structure. +*/ +struct Dwarf_Fde_s { + Dwarf_Unsigned fd_length; + Dwarf_Addr fd_cie_offset; + Dwarf_Unsigned fd_cie_index; + Dwarf_Cie fd_cie; + Dwarf_Addr fd_initial_location; + Dwarf_Small *fd_initial_loc_pos; + Dwarf_Addr fd_address_range; + Dwarf_Small *fd_fde_start; + Dwarf_Small *fd_fde_instr_start; + Dwarf_Debug fd_dbg; + + /* fd_offset_into_exception_tables is SGI/IRIX exception table + offset. Unused and zero if not IRIX .debug_frame. */ + Dwarf_Signed fd_offset_into_exception_tables; + + Dwarf_Fde fd_next; + Dwarf_Small fd_length_size; + Dwarf_Small fd_extension_size; + /* So we know from an fde which 'count' of fde-s in + Dwarf_Debug applies: eh or standard. */ + Dwarf_Small fd_is_eh; + /* The following 2 for GNU .eh_frame exception handling + Augmentation Data. Set if CIE ci_augmentation_type + is aug_gcc_eh_z. Zero if unused. */ + Dwarf_Unsigned fd_gnu_eh_augmentation_len; + Dwarf_Ptr fd_gnu_eh_augmentation_bytes; + Dwarf_Addr fd_gnu_eh_lsda; /* If 'L' augmentation letter + present: is address of the + Language Specific Data Area (LSDA). If not 'L" is zero. */ + + /* The following 3 are about the Elf section the FDEs come from. */ + Dwarf_Small * fd_section_ptr; + Dwarf_Unsigned fd_section_length; + Dwarf_Unsigned fd_section_index; + +}; + + +int + _dwarf_frame_address_offsets(Dwarf_Debug dbg, Dwarf_Addr ** addrlist, + Dwarf_Off ** offsetlist, + Dwarf_Signed * returncount, + Dwarf_Error * err); + +int +_dwarf_get_fde_list_internal(Dwarf_Debug dbg, + Dwarf_Cie ** cie_data, + Dwarf_Signed * cie_element_count, + Dwarf_Fde ** fde_data, + Dwarf_Signed * fde_element_count, + Dwarf_Small * section_ptr, + Dwarf_Unsigned section_index, + Dwarf_Unsigned section_length, + Dwarf_Unsigned cie_id_value, + int use_gnu_cie_calc, /* If non-zero, + this is gcc eh_frame. */ + Dwarf_Error * error); + +enum Dwarf_augmentation_type +_dwarf_get_augmentation_type(Dwarf_Debug dbg, + Dwarf_Small *augmentation_string, + int is_gcc_eh_frame); + +Dwarf_Unsigned _dwarf_get_return_address_reg(Dwarf_Small *frame_ptr, + int version, + unsigned long *size); + +/* Temporary recording of crucial cie/fde prefix data. + * Vastly simplifies some argument lists. + */ +struct cie_fde_prefix_s { + /* cf_start_addr is a pointer to the first byte of this fde/cie + we are reading now. */ + Dwarf_Small * cf_start_addr; + Dwarf_Small * cf_addr_after_prefix; + Dwarf_Unsigned cf_length; + int cf_local_length_size; + int cf_local_extension_size; + Dwarf_Unsigned cf_cie_id; + Dwarf_Small * cf_cie_id_addr; /* used for eh_frame calculations. */ + + /* Simplifies passing around these values to create fde having + these here. */ + /* cf_section_ptr is a pointer to the first byte + of the object section the prefix is read from. */ + Dwarf_Small * cf_section_ptr; + Dwarf_Unsigned cf_section_index; + Dwarf_Unsigned cf_section_length; +}; + +int +_dwarf_exec_frame_instr(Dwarf_Bool make_instr, + Dwarf_Frame_Op ** ret_frame_instr, + Dwarf_Bool search_pc, + Dwarf_Addr search_pc_val, + Dwarf_Addr initial_loc, + Dwarf_Small * start_instr_ptr, + Dwarf_Small * final_instr_ptr, + Dwarf_Frame table, + Dwarf_Cie cie, + Dwarf_Debug dbg, + Dwarf_Half reg_num_of_cfa, + Dwarf_Sword * returned_count, + int *returned_error); + + +int dwarf_read_cie_fde_prefix(Dwarf_Debug dbg, + Dwarf_Small *frame_ptr_in, + Dwarf_Small *section_ptr_in, + Dwarf_Unsigned section_index_in, + Dwarf_Unsigned section_length_in, + struct cie_fde_prefix_s *prefix_out, + Dwarf_Error *error); + +int dwarf_create_fde_from_after_start(Dwarf_Debug dbg, + struct cie_fde_prefix_s * prefix, + Dwarf_Small *section_pointer, + Dwarf_Small *frame_ptr, + int use_gnu_cie_calc, + Dwarf_Cie cie_ptr_in, + Dwarf_Fde *fde_ptr_out, + Dwarf_Error *error); + +int dwarf_create_cie_from_after_start(Dwarf_Debug dbg, + struct cie_fde_prefix_s *prefix, + Dwarf_Small* section_pointer, + Dwarf_Small* frame_ptr, + Dwarf_Unsigned cie_count, + int use_gnu_cie_calc, + Dwarf_Cie *cie_ptr_out, + Dwarf_Error *error); + + +int _dwarf_frame_constructor(Dwarf_Debug dbg,void * ); +void _dwarf_frame_destructor (void *); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_funcs.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_funcs.h new file mode 100644 index 000000000..bf91c3215 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_funcs.h @@ -0,0 +1,42 @@ +/* + + Copyright (C) 2000, 2004 Silicon Graphics, Inc. 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 + +*/ + + + + +typedef struct Dwarf_Func_Context_s *Dwarf_Func_Context; + + +/* struct never completed: see dwarf_global.h */ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_global.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_global.h new file mode 100644 index 000000000..c2bc2cdcc --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_global.h @@ -0,0 +1,124 @@ +/* + + Copyright (C) 2000,2004,2005 Silicon Graphics, Inc. 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 + +*/ + + + + +typedef struct Dwarf_Global_Context_s *Dwarf_Global_Context; + +/* + This struct contains header information for a set of pubnames. + Essentially, they contain the context for a set of pubnames + belonging to a compilation-unit. + + This is also used for the sgi-specific + weaknames, typenames, varnames, funcnames data: + the structs for those are incomplete and + instances of this are used instead. + + Also used for DWARF3 .debug_pubtypes. + +*/ +struct Dwarf_Global_Context_s { + + /* Length in .debug_pubnames (etc) of a set of names for a + compilation-unit. Dwarf_Word pu_length; The value is not made + available outside libdwarf and not used inside, so no need to + record it. */ + + /* For this context, size of a length. 4 or 8 */ + unsigned char pu_length_size; + + /* For this CU, size of the extension 0 except for dwarf2 extension + 64bit, in which case is 4. */ + unsigned char pu_extension_size; + + /* + Offset into .debug_info of the compilation-unit header (not DIE) + for this set of pubnames. */ + Dwarf_Off pu_offset_of_cu_header; + + /* Size of compilation-unit that these pubnames are in. */ + Dwarf_Unsigned pu_info_length; + + Dwarf_Debug pu_dbg; +}; + + +/* This struct contains information for a single pubname. */ +struct Dwarf_Global_s { + + /* + Offset from the start of the corresponding compilation-unit of + the DIE for the given pubname CU. */ + Dwarf_Off gl_named_die_offset_within_cu; + + /* Points to the given pubname. */ + Dwarf_Small *gl_name; + + /* Context for this pubname. */ + Dwarf_Global_Context gl_context; +}; + +int _dwarf_internal_get_pubnames_like_data(Dwarf_Debug dbg, + Dwarf_Small * + section_data_ptr, + Dwarf_Unsigned + section_length, + Dwarf_Global ** globals, + Dwarf_Signed * return_count, + Dwarf_Error * error, + int context_code, + int global_code, + int length_err_num, + int version_err_num); + +void +_dwarf_internal_globals_dealloc( Dwarf_Debug dbg, Dwarf_Global *dwgl, + Dwarf_Signed count, + int context_code, + int global_code, + int list_code); + + +#ifdef __sgi /* __sgi should only be defined for IRIX/MIPS. */ +void _dwarf_fix_up_offset_irix(Dwarf_Debug dbg, + Dwarf_Unsigned *varp, + char *caller_site_name); +#define FIX_UP_OFFSET_IRIX_BUG(ldbg,var,name) _dwarf_fix_up_offset_irix(ldbg,&var,name) +#else +#define FIX_UP_OFFSET_IRIX_BUG(ldbg,var,name) +#endif + diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_harmless.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_harmless.h new file mode 100644 index 000000000..3d4d910ce --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_harmless.h @@ -0,0 +1,31 @@ +/* + + Copyright (C) 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. + +*/ + + + +void dwarf_harmless_init(struct Dwarf_Harmless_s *dhp,unsigned size); +void dwarf_harmless_cleanout(struct Dwarf_Harmless_s *dhp); + diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_incl.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_incl.h new file mode 100644 index 000000000..df2fbf334 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_incl.h @@ -0,0 +1,66 @@ +/* + + Copyright (C) 2000, 2002, 2004 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright 2008-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 + +*/ + + + +#ifndef DWARF_INCL_H +#define DWARF_INCL_H +#if (!defined(HAVE_RAW_LIBELF_OK) && defined(HAVE_LIBELF_OFF64_OK) ) +/* At a certain point libelf.h requires _GNU_SOURCE. + here we assume the criteria in configure determine that + usefully. +*/ +#define _GNU_SOURCE 1 +#endif + + +#include "libdwarfdefs.h" +#include + +#ifdef HAVE_ELF_H +#include +#endif + +#include +#include +#include + +#include "dwarf_base_types.h" +#include "dwarf_alloc.h" +#include "dwarf_opaque.h" +#include "dwarf_error.h" +#include "dwarf_util.h" +#endif /* DWARF_INCL_H */ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_line.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_line.h new file mode 100644 index 000000000..66d606275 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_line.h @@ -0,0 +1,331 @@ +/* + + Copyright (C) 2000, 2004, 2006 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright (C) 2009-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 + +*/ + + + +#define DW_EXTENDED_OPCODE 0 + +/* + This is used as the starting value for an algorithm + to get the minimum difference between 2 values. + UINT_MAX is used as our approximation to infinity. +*/ +#define MAX_LINE_DIFF UINT_MAX + +/* This is for a sanity check on line + table extended opcodes. + It is entirely arbitrary, and 100 is surely too small if + someone was inserting strings in the opcode. */ +#define DW_LNE_LEN_MAX 100 + + +/* + This structure is used to build a list of all the + files that are used in the current compilation unit. + All of the fields execpt fi_next have meanings that + are obvious from section 6.2.4 of the Libdwarf Doc. +*/ +struct Dwarf_File_Entry_s { + /* Points to string naming the file. */ + Dwarf_Small *fi_file_name; + + /* + Index into the list of directories of the directory in which + this file exits. */ + Dwarf_Sword fi_dir_index; + + /* Time of last modification of the file. */ + Dwarf_Unsigned fi_time_last_mod; + + /* Length in bytes of the file. */ + Dwarf_Unsigned fi_file_length; + + /* Pointer for chaining file entries. */ + Dwarf_File_Entry fi_next; +}; + + +typedef struct Dwarf_Line_Context_s *Dwarf_Line_Context; + +/* + This structure provides the context in which the fields of + a Dwarf_Line structure are interpreted. They come from the + statement program prologue. **Updated by dwarf_srclines in + dwarf_line.c. +*/ +struct Dwarf_Line_Context_s { + /* + Points to a chain of entries providing info about source files + for the current set of Dwarf_Line structures. File number + 'li_file 1' is last on the list, the first list entry is the + file numbered lc_file_entry_count. The numbering of the file + names matches the dwarf2/3 line table specification file table + and DW_LNE_define_file numbering rules. */ + Dwarf_File_Entry lc_file_entries; + /* + Count of number of source files for this set of Dwarf_Line + structures. */ + Dwarf_Sword lc_file_entry_count; + /* + Points to the portion of .debug_line section that contains a + list of strings naming the included directories. */ + Dwarf_Small *lc_include_directories; + + /* Count of the number of included directories. */ + Dwarf_Sword lc_include_directories_count; + + /* Count of the number of lines for this cu. */ + Dwarf_Sword lc_line_count; + + /* Points to name of compilation directory. */ + Dwarf_Small *lc_compilation_directory; + + Dwarf_Debug lc_dbg; + + Dwarf_Half lc_version_number; /* DWARF2/3 version number, 2 + for DWARF2, 3 for DWARF3. */ +}; + + +/* + This structure defines a row of the line table. + All of the fields except li_offset have the exact + same meaning that is defined in Section 6.2.2 + of the Libdwarf Document. + + li_offset is used by _dwarf_addr_finder() which is called + by rqs(1), an sgi utility for 'moving' shared libraries + as if the static linker (ld) had linked the shared library + at the newly-specified address. Most libdwarf-using + apps will ignore li_offset and _dwarf_addr_finder(). + +*/ +struct Dwarf_Line_s { + Dwarf_Addr li_address; /* pc value of machine instr */ + union addr_or_line_s { + struct li_inner_s { + Dwarf_Sword li_file; /* int identifying src file */ + /* li_file is a number 1-N, indexing into a conceptual + source file table as described in dwarf2/3 spec line + table doc. (see Dwarf_File_Entry lc_file_entries; and + Dwarf_Sword lc_file_entry_count;) */ + + Dwarf_Sword li_line; /* source file line number. */ + Dwarf_Half li_column; /* source file column number */ + Dwarf_Small li_isa; + + /* To save space, use bit flags. */ + /* indicate start of stmt */ + unsigned char li_is_stmt:1; + + /* indicate start basic block */ + unsigned char li_basic_block:1; + + /* first post sequence instr */ + unsigned char li_end_sequence:1; + + unsigned char li_prologue_end:1; + unsigned char li_epilogue_begin:1; + } li_l_data; + Dwarf_Off li_offset; /* for rqs */ + } li_addr_line; + Dwarf_Line_Context li_context; /* assoc Dwarf_Line_Context_s */ +}; + + +int _dwarf_line_address_offsets(Dwarf_Debug dbg, + Dwarf_Die die, + Dwarf_Addr ** addrs, + Dwarf_Off ** offs, + Dwarf_Unsigned * returncount, + Dwarf_Error * err); +int _dwarf_internal_srclines(Dwarf_Die die, + Dwarf_Line ** linebuf, + Dwarf_Signed * count, + Dwarf_Bool doaddrs, + Dwarf_Bool dolines, Dwarf_Error * error); + + + +/* The LOP, WHAT_IS_OPCODE stuff is here so it can + be reused in 3 places. Seemed hard to keep + the 3 places the same without an inline func or + a macro. + + Handling the line section where the header and the + file being processed do not match (unusual, but + planned for in the design of .debug_line) + is too tricky to recode this several times and keep + it right. + + As it is the code starting up line-reading is duplicated + and that is just wrong to do. FIXME! +*/ +#define LOP_EXTENDED 1 +#define LOP_DISCARD 2 +#define LOP_STANDARD 3 +#define LOP_SPECIAL 4 + +#define WHAT_IS_OPCODE(type,opcode,base,opcode_length,line_ptr,highest_std) \ + if( (opcode) < (base) ) { \ + /* we know we must treat as a standard op \ + or a special case. \ + */ \ + if((opcode) == DW_EXTENDED_OPCODE) { \ + type = LOP_EXTENDED; \ + } else if( ((highest_std)+1) >= (base)) { \ + /* == Standard case: compile of \ + dwarf_line.c and object \ + have same standard op codes set. \ + \ + > Special case: compile of dwarf_line.c\ + has things in standard op codes list \ + in dwarf.h header not \ + in the object: handle this as a standard\ + op code in switch below. \ + The header special ops overlap the \ + object standard ops. \ + The new standard op codes will not \ + appear in the object. \ + */ \ + type = LOP_STANDARD; \ + } else { \ + /* These are standard opcodes in the object\ + ** that were not defined in the header \ + ** at the time dwarf_line.c \ + ** was compiled. Provides the ability of \ + ** out-of-date dwarf reader to read newer \ + ** line table data transparently. \ + */ \ + type = LOP_DISCARD; \ + } \ + \ + } else { \ + /* Is a special op code. \ + */ \ + type = LOP_SPECIAL; \ + } + +/* The following is from the dwarf definition of 'ubyte' + and is specifically mentioned in section 6.2.5.1, page 54 + of the Rev 2.0.0 dwarf specification. +*/ + +#define MAX_LINE_OP_CODE 255 + + +/* The following structs (Line_Table_File_Entry_s,Line_Table_Prefix_s) + and functions allow refactoring common code into a single + reader routine. +*/ +/* There can be zero of more of these needed for 1 line prologue. */ +struct Line_Table_File_Entry_s { + Dwarf_Small *lte_filename; + Dwarf_Unsigned lte_directory_index; + Dwarf_Unsigned lte_last_modification_time; + Dwarf_Unsigned lte_length_of_file; +}; + +/* Data picked up from the line table prologue for a single +CU. */ +struct Line_Table_Prefix_s { + + /* pf_total_length is the value of the length field for the line + table of this CU. So it does not count the length of itself (the + length value) for consistency with the say lenghts recorded in + DWARF2/3. */ + Dwarf_Unsigned pf_total_length; + + /* Length of the initial length field itself. */ + Dwarf_Half pf_length_field_length; + + /* The version is 2 for DWARF2, 3 for DWARF3 */ + Dwarf_Half pf_version; + + Dwarf_Unsigned pf_prologue_length; + Dwarf_Small pf_minimum_instruction_length; + + /* Start and end of this CU line area. pf_line_ptr_start + + pf_total_length + pf_length_field_length == pf_line_ptr_end. + Meaning pf_line_ptr_start is before the length info. */ + Dwarf_Small *pf_line_ptr_start; + Dwarf_Small *pf_line_ptr_end; + + /* Used to check that decoding of the line prologue is done right. */ + Dwarf_Small *pf_line_prologue_start; + + Dwarf_Small pf_default_is_stmt; + Dwarf_Sbyte pf_line_base; + Dwarf_Small pf_line_range; + + /* Highest std opcode (+1). */ + Dwarf_Small pf_opcode_base; + + /* pf_opcode_base -1 entries (each a count, normally the value of + each entry is 0 or 1). */ + Dwarf_Small *pf_opcode_length_table; + + Dwarf_Unsigned pf_include_directories_count; + /* Array of pointers to dir strings. pf_include_directories_count + entriesin the array. */ + Dwarf_Small **pf_include_directories; + + /* Count of entries in line_table_file_entries array. */ + Dwarf_Unsigned pf_files_count; + struct Line_Table_File_Entry_s *pf_line_table_file_entries; + + /* The number to treat as standard ops. This is a special + accomodation of gcc using the new standard opcodes but not + updating the version number. It's legal dwarf2, but much better + for the user to understand as dwarf3 when 'it looks ok'. */ + Dwarf_Bool pf_std_op_count; + +}; + +void dwarf_init_line_table_prefix(struct Line_Table_Prefix_s *pf); +void dwarf_free_line_table_prefix(struct Line_Table_Prefix_s *pf); + +int dwarf_read_line_table_prefix(Dwarf_Debug dbg, + Dwarf_Small * data_start, + Dwarf_Unsigned data_length, + Dwarf_Small ** updated_data_start_out, + struct Line_Table_Prefix_s *prefix_out, + /* The following 2 arguments are solely for warning users + * when there is a surprising 'gap' in the .debug_line info. */ + Dwarf_Small ** bogus_bytes_ptr, + Dwarf_Unsigned * bogus_bytes_count, + Dwarf_Error * err, + int * err_count_out); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_loc.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_loc.h new file mode 100644 index 000000000..685d199f2 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_loc.h @@ -0,0 +1,46 @@ +/* + + Copyright (C) 2000, 2004 Silicon Graphics, Inc. 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 + +*/ + + + +typedef struct Dwarf_Loc_Chain_s *Dwarf_Loc_Chain; + +struct Dwarf_Loc_Chain_s { + Dwarf_Small lc_atom; + Dwarf_Unsigned lc_number; + Dwarf_Unsigned lc_number2; + Dwarf_Unsigned lc_offset; + Dwarf_Loc_Chain lc_next; +}; diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_macro.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_macro.h new file mode 100644 index 000000000..31ea2e6e6 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_macro.h @@ -0,0 +1,44 @@ +/* + + Copyright (C) 2000, 2004 Silicon Graphics, Inc. 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 + +*/ + + +/* + + + dwarf_macro.h + + $Revision: 1.4 $ $Date: 2004/10/28 22:19:14 $ + +*/ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_opaque.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_opaque.h new file mode 100644 index 000000000..b235a9c7b --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_opaque.h @@ -0,0 +1,339 @@ +/* + + Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. + Portions Copyright (C) 2008-2010 Arxan Technologies, Inc. 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_abbrev - - - + .debug_aranges 2 2 2 + .debug_frame 1 3 4 + .debug_info 2 3 4 + .debug_line 2 3 4 + .debug_loc - - - + .debug_macinfo - - - + .debug_pubtypes x 2 2 + .debug_pubnames 2 2 2 + .debug_ranges x - - + .debug_str - - - + .debug_types x x 4 +*/ + +#include + + +struct Dwarf_Die_s { + Dwarf_Byte_Ptr di_debug_info_ptr; + Dwarf_Abbrev_List di_abbrev_list; + Dwarf_CU_Context di_cu_context; + int di_abbrev_code; +}; + +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. + + Notice that a pointer to the CU DIE itself is + Dwarf_Off off2 = cu_context->cc_debug_info_offset; + cu_die_info_ptr = dbg->de_debug_info.dss_data + + off2 + _dwarf_length_of_cu_header(dbg, off2); + + **Updated by dwarf_next_cu_header in dwarf_die_deliv.c +*/ +struct Dwarf_CU_Context_s { + Dwarf_Debug cc_dbg; + /* The sum of cc_length, cc_length_size, and cc_extension_size + is the total length of the CU including its header. */ + Dwarf_Word cc_length; + /* cc_length_size is the size in bytes of an offset. + 4 for 32bit dwarf, 8 for 64bit dwarf (whether MIPS/IRIX + 64bit dwarf or standard 64bit dwarf using the extension + mechanism). */ + Dwarf_Small cc_length_size; + /* cc_extension_size is zero unless this is standard + DWARF3 and later 64bit dwarf using the extension mechanism. + If it is the DWARF3 and later 64bit dwarf cc_extension + size is 4. So for 32bit dwarf and MIPS/IRIX 64bit dwarf + cc_extension_size is zero. */ + Dwarf_Small cc_extension_size; + Dwarf_Half cc_version_stamp; + Dwarf_Sword cc_abbrev_offset; + Dwarf_Small cc_address_size; + /* cc_debug_info_offset is the offset in the section + of the CU header of this CU. Dwarf_Word + should be large enough. */ + 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; */ +}; + +/* Consolidates section-specific data in one place. + Section is an Elf specific term, intended as a general + term (for non-Elf objects some code must synthesize the + values somehow). + Makes adding more section-data much simpler. */ +struct Dwarf_Section_s { + Dwarf_Small * dss_data; + Dwarf_Unsigned dss_size; + Dwarf_Word dss_index; + /* dss_addr is the 'section address' which is only + non-zero for a GNU eh section. + Purpose: to handle DW_EH_PE_pcrel encoding. Leaving + it zero is fine for non-elf. */ + Dwarf_Addr dss_addr; + Dwarf_Small dss_data_was_malloc; + + /* For non-elf, leaving the following fields zero + will mean they are ignored. */ + /* dss_link should be zero unless a section has a link + to another (sh_link). Used to access relocation data for + a section (and for symtab section, access its strtab). */ + Dwarf_Word dss_link; + /* The following is used when reading .rela sections + (such sections appear in some .o files). */ + Dwarf_Half dss_reloc_index; /* Zero means ignore the reloc fields. */ + Dwarf_Small * dss_reloc_data; + Dwarf_Unsigned dss_reloc_size; + Dwarf_Addr dss_reloc_addr; + /* dss_reloc_symtab is the sh_link of a .rela to its .symtab, leave + it 0 if non-meaningful. */ + Dwarf_Addr dss_reloc_symtab; + /* dss_reloc_link should be zero unless a reloc section has a link + to another (sh_link). Used to access the symtab for relocations + a section. */ + Dwarf_Word dss_reloc_link; + /* Pointer to the elf symtab, used for elf .rela. Leave it 0 + if not relevant. */ + struct Dwarf_Section_s *dss_symtab; +}; + +/* Overview: if next_to_use== first, no error slots are used. + If next_to_use+1 (mod maxcount) == first the slots are all used +*/ +struct Dwarf_Harmless_s { + unsigned dh_maxcount; + unsigned dh_next_to_use; + unsigned dh_first; + unsigned dh_errs_count; + char ** dh_errors; +}; + +struct Dwarf_Debug_s { + /* All file access methods and support data + are hidden in this structure. + We get a pointer, callers control the lifetime of the + structure and contents. */ + struct Dwarf_Obj_Access_Interface_s *de_obj_file; + + 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; + /* Keep eh (GNU) separate!. */ + Dwarf_Cie *de_cie_data_eh; + Dwarf_Signed de_cie_count_eh; + /* + 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; + /* Keep eh (GNU) separate!. */ + Dwarf_Fde *de_fde_data_eh; + Dwarf_Signed de_fde_count_eh; + + struct Dwarf_Section_s de_debug_info; + struct Dwarf_Section_s de_debug_abbrev; + struct Dwarf_Section_s de_debug_line; + struct Dwarf_Section_s de_debug_loc; + struct Dwarf_Section_s de_debug_aranges; + struct Dwarf_Section_s de_debug_macinfo; + struct Dwarf_Section_s de_debug_pubnames; + struct Dwarf_Section_s de_debug_str; + struct Dwarf_Section_s de_debug_frame; + + /* gnu: the g++ eh_frame section */ + struct Dwarf_Section_s de_debug_frame_eh_gnu; + + struct Dwarf_Section_s de_debug_pubtypes; /* DWARF3 .debug_pubtypes */ + + struct Dwarf_Section_s de_debug_funcnames; + struct Dwarf_Section_s de_debug_typenames; /* SGI IRIX extension essentially + identical to DWARF3 .debug_pubtypes. */ + struct Dwarf_Section_s de_debug_varnames; + struct Dwarf_Section_s de_debug_weaknames; + struct Dwarf_Section_s de_debug_ranges; + + /* For non-elf, simply leave the following two structs zeroed and + they will be ignored. */ + struct Dwarf_Section_s de_elf_symtab; + struct Dwarf_Section_s de_elf_strtab; + + + 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() */ + + /* 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; + + Dwarf_Half de_frame_cfa_col_number; + Dwarf_Half de_frame_same_value_number; + Dwarf_Half de_frame_undefined_value_number; + + unsigned char de_big_endian_object; /* non-zero if big-endian + object opened. */ + + struct Dwarf_Harmless_s de_harmless_errors; +}; + +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 4 /* 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, + struct Dwarf_Section_s *, + Dwarf_Error *); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_types.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_types.h new file mode 100644 index 000000000..ebd31c6c7 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_types.h @@ -0,0 +1,41 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + + + +typedef struct Dwarf_Type_Context_s *Dwarf_Type_Context; + +/* type never completed see dwarf_global.h */ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_util.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_util.h new file mode 100644 index 000000000..4046bb247 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_util.h @@ -0,0 +1,311 @@ +#ifndef DWARF_UTIL_H +#define DWARF_UTIL_H +/* + + Copyright (C) 2000,2003,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. +*/ + + + + +/* + Decodes unsigned leb128 encoded numbers. + Make sure ptr is a pointer to a 1-byte type. + In 2003 and earlier this was a hand-inlined + version of _dwarf_decode_u_leb128() which did + not work correctly if Dwarf_Word was 64 bits. +*/ +#define DECODE_LEB128_UWORD(ptr, value) \ + do { \ + Dwarf_Word uleblen; \ + value = _dwarf_decode_u_leb128(ptr,&uleblen); \ + ptr += uleblen; \ + } while (0) + +/* + Decodes signed leb128 encoded numbers. + Make sure ptr is a pointer to a 1-byte type. + In 2003 and earlier this was a hand-inlined + version of _dwarf_decode_s_leb128() which did + not work correctly if Dwarf_Word was 64 bits. + +*/ +#define DECODE_LEB128_SWORD(ptr, value) \ + do { \ + Dwarf_Word sleblen; \ + value = _dwarf_decode_s_leb128(ptr,&sleblen); \ + ptr += sleblen; \ + } while(0) + + +/* + Skips leb128_encoded numbers that are guaranteed + to be no more than 4 bytes long. Same for both + signed and unsigned numbers. +*/ +#define SKIP_LEB128_WORD(ptr) \ + do{ if ((*(ptr++) & 0x80) != 0) { \ + if ((*(ptr++) & 0x80) != 0) { \ + if ((*(ptr++) & 0x80) != 0) { \ + if ((*(ptr++) & 0x80) != 0) { \ + } \ + } \ + } \ + } } while (0) + + +#define CHECK_DIE(die, error_ret_value) \ +do {if (die == NULL) { \ + _dwarf_error(NULL, error, DW_DLE_DIE_NULL); \ + return(error_ret_value); \ + } \ + if (die->di_cu_context == NULL) { \ + _dwarf_error(NULL, error, DW_DLE_DIE_NO_CU_CONTEXT); \ + return(error_ret_value); \ + } \ + if (die->di_cu_context->cc_dbg == NULL) { \ + _dwarf_error(NULL, error, DW_DLE_DBG_NULL); \ + return(error_ret_value); \ + } \ +} while (0) + + +/* + Reads 'source' for 'length' bytes from unaligned addr. + + Avoids any constant-in-conditional warnings and + avoids a test in the generated code (for non-const cases, + which are in the majority.) + Uses a temp to avoid the test. + The decl here should avoid any problem of size in the temp. + This code is ENDIAN DEPENDENT + The memcpy args are the endian issue. +*/ +typedef Dwarf_Unsigned BIGGEST_UINT; + +#ifdef WORDS_BIGENDIAN +#define READ_UNALIGNED(dbg,dest,desttype, source, length) \ + do { \ + BIGGEST_UINT _ltmp = 0; \ + dbg->de_copy_word( (((char *)(&_ltmp)) + sizeof(_ltmp) - length), \ + source, length) ; \ + dest = (desttype)_ltmp; \ + } while (0) + + +/* + This macro sign-extends a variable depending on the length. + It fills the bytes between the size of the destination and + the length with appropriate padding. + This code is ENDIAN DEPENDENT but dependent only + on host endianness, not object file endianness. + The memcpy args are the issue. +*/ +#define SIGN_EXTEND(dest, length) \ + do {if (*(Dwarf_Sbyte *)((char *)&dest + sizeof(dest) - length) < 0) {\ + memcpy((char *)&dest, "\xff\xff\xff\xff\xff\xff\xff\xff", \ + sizeof(dest) - length); \ + } \ + } while (0) +#else /* LITTLE ENDIAN */ + +#define READ_UNALIGNED(dbg,dest,desttype, source, length) \ + do { \ + BIGGEST_UINT _ltmp = 0; \ + dbg->de_copy_word( (char *)(&_ltmp) , \ + source, length) ; \ + dest = (desttype)_ltmp; \ + } while (0) + + +/* + This macro sign-extends a variable depending on the length. + It fills the bytes between the size of the destination and + the length with appropriate padding. + This code is ENDIAN DEPENDENT but dependent only + on host endianness, not object file endianness. + The memcpy args are the issue. +*/ +#define SIGN_EXTEND(dest, length) \ + do {if (*(Dwarf_Sbyte *)((char *)&dest + (length-1)) < 0) {\ + memcpy((char *)&dest+length, \ + "\xff\xff\xff\xff\xff\xff\xff\xff", \ + sizeof(dest) - length); \ + } \ + } while (0) + +#endif /* ! LITTLE_ENDIAN */ + + + +/* + READ_AREA LENGTH reads the length (the older way + of pure 32 or 64 bit + or the new proposed dwarfv2.1 64bit-extension way) + + It reads the bits from where rw_src_data_p points to + and updates the rw_src_data_p to point past what was just read. + + It updates w_length_size (to the size of an offset, either 4 or 8) + and w_exten_size (set 0 unless this frame has the DWARF3,4 64bit + extension, in which case w_exten_size is set to 4). + + r_dbg is just the current dbg pointer. + w_target is the output length field. + r_targtype is the output type. Always Dwarf_Unsigned so far. + +*/ +/* This one handles the v2.1 64bit extension + and 32bit (and MIPS fixed 64 bit via the + dwarf_init-set r_dbg->de_length_size).. + It does not recognize any but the one distingushed value + (the only one with defined meaning). + It assumes that no CU will have a length + 0xffffffxx (32bit length) + or + 0xffffffxx xxxxxxxx (64bit length) + which makes possible auto-detection of the extension. + + This depends on knowing that only a non-zero length + is legitimate (AFAICT), and for IRIX non-standard -64 + dwarf that the first 32 bits of the 64bit offset will be + zero (because the compiler could not handle a truly large + value as of Jan 2003 and because no app has that much debug + info anyway, at least not in the IRIX case). + + At present not testing for '64bit elf' here as that + does not seem necessary (none of the 64bit length seems + appropriate unless it's ident[EI_CLASS] == ELFCLASS64). +*/ +# define READ_AREA_LENGTH(r_dbg,w_target,r_targtype, \ + rw_src_data_p,w_length_size,w_exten_size) \ +do { READ_UNALIGNED(r_dbg,w_target,r_targtype, \ + rw_src_data_p, ORIGINAL_DWARF_OFFSET_SIZE); \ + if(w_target == DISTINGUISHED_VALUE) { \ + /* dwarf3 64bit extension */ \ + w_length_size = DISTINGUISHED_VALUE_OFFSET_SIZE; \ + rw_src_data_p += ORIGINAL_DWARF_OFFSET_SIZE; \ + w_exten_size = ORIGINAL_DWARF_OFFSET_SIZE; \ + READ_UNALIGNED(r_dbg,w_target,r_targtype, \ + rw_src_data_p, DISTINGUISHED_VALUE_OFFSET_SIZE);\ + rw_src_data_p += DISTINGUISHED_VALUE_OFFSET_SIZE; \ + } else { \ + if(w_target == 0 && r_dbg->de_big_endian_object) { \ + /* IRIX 64 bit, big endian. This test */ \ + /* is not a truly precise test, a precise test */ \ + /* would check if the target was IRIX. */ \ + READ_UNALIGNED(r_dbg,w_target,r_targtype, \ + rw_src_data_p, DISTINGUISHED_VALUE_OFFSET_SIZE); \ + w_length_size = DISTINGUISHED_VALUE_OFFSET_SIZE; \ + rw_src_data_p += DISTINGUISHED_VALUE_OFFSET_SIZE; \ + w_exten_size = 0; \ + } else { \ + /* standard 32 bit dwarf2/dwarf3 */ \ + w_exten_size = 0; \ + w_length_size = ORIGINAL_DWARF_OFFSET_SIZE; \ + rw_src_data_p += w_length_size; \ + } \ + } } while(0) + +Dwarf_Unsigned +_dwarf_decode_u_leb128(Dwarf_Small * leb128, + Dwarf_Word * leb128_length); + +Dwarf_Signed +_dwarf_decode_s_leb128(Dwarf_Small * leb128, + Dwarf_Word * leb128_length); + +Dwarf_Unsigned +_dwarf_get_size_of_val(Dwarf_Debug dbg, + Dwarf_Unsigned form, + Dwarf_Half address_size, + Dwarf_Small * val_ptr, + int v_length_size); + +struct Dwarf_Hash_Table_Entry_s; +/* This single struct is the base for the hash table. + The intent is that once the total_abbrev_count across + all the entries is greater than 10*current_table_entry_count + one should build a new Dwarf_Hash_Table_Base_s, rehash + all the existing entries, and delete the old table and entries. + (10 is a heuristic, nothing magic about it, but once the + count gets to 30 or 40 times current_table_entry_count + things really slow down a lot. One (500MB) application had + 127000 abbreviations in one compilation unit) + The incoming 'code' is an abbrev number and those simply + increase linearly so the hashing is perfect always. +*/ +struct Dwarf_Hash_Table_s { + unsigned long tb_table_entry_count; + unsigned long tb_total_abbrev_count; + /* Each table entry is a list of abbreviations. */ + struct Dwarf_Hash_Table_Entry_s *tb_entries; +}; + +/* + This struct is used to build a hash table for the + abbreviation codes for a compile-unit. +*/ +struct Dwarf_Hash_Table_Entry_s { + Dwarf_Abbrev_List at_head; +}; + + + +Dwarf_Abbrev_List +_dwarf_get_abbrev_for_code(Dwarf_CU_Context cu_context, + Dwarf_Unsigned code); + + +/* return 1 if string ends before 'endptr' else +** return 0 meaning string is not properly terminated. +** Presumption is the 'endptr' pts to end of some dwarf section data. +*/ +int _dwarf_string_valid(void *startptr, void *endptr); + +Dwarf_Unsigned _dwarf_length_of_cu_header(Dwarf_Debug, + Dwarf_Unsigned offset); +Dwarf_Unsigned _dwarf_length_of_cu_header_simple(Dwarf_Debug); + +int _dwarf_load_debug_info(Dwarf_Debug dbg, Dwarf_Error *error); +void _dwarf_free_abbrev_hash_table_contents(Dwarf_Debug dbg, + struct Dwarf_Hash_Table_s* hash_table); +int _dwarf_get_address_size(Dwarf_Debug dbg, Dwarf_Die die); + +#endif /* DWARF_UTIL_H */ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_vars.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_vars.h new file mode 100644 index 000000000..bd5f967e4 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_vars.h @@ -0,0 +1,41 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + + + +typedef struct Dwarf_Var_Context_s *Dwarf_Var_Context; + +/* struct never completed: see dwarf_global.h */ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_weaks.h b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_weaks.h new file mode 100644 index 000000000..d38f5f118 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/dwarf_weaks.h @@ -0,0 +1,41 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + + + +typedef struct Dwarf_Weak_Context_s *Dwarf_Weak_Context; + +/* struct never completed: see dwarf_global.h */ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/libdwarf.h b/desmume/src/windows/libelf_libdwarf/libdwarf/libdwarf.h new file mode 100644 index 000000000..7e59d32f4 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/libdwarf.h @@ -0,0 +1,2727 @@ +/* + + Copyright (C) 2000-2010 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright 2007-2010 Sun Microsystems, Inc. All rights reserved. + Portions Copyright 2008-2010 David Anderson. All rights reserved. + Portions Copyright 2008-2010 Arxan Technologies, Inc. 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 + +*/ + + +#ifndef _LIBDWARF_H +#define _LIBDWARF_H +#ifdef __cplusplus +extern "C" { +#endif +/* + libdwarf.h + $Revision: #9 $ $Date: 2008/01/17 $ + + For libdwarf producers and consumers + + The interface is defined as having 8-byte signed and unsigned + values so it can handle 64-or-32bit target on 64-or-32bit host. + Addr is the native size: it represents pointers on + the host machine (not the target!). + + This contains declarations for types and all producer + and consumer functions. + + Function declarations are written on a single line each here + so one can use grep to each declaration in its entirety. + The declarations are a little harder to read this way, but... + +*/ + +struct Elf; +typedef struct Elf* dwarf_elf_handle; + +/* To enable printing with printf regardless of the + actual underlying data type, we define the DW_PR_xxx macros. */ +#if (_MIPS_SZLONG == 64) +/* Special case for MIPS, so -64 (LP64) build gets simple -long-. + Non-MIPS LP64 or ILP64 environments should probably ensure + _MIPS_SZLONG set to 64 everywhere this header is #included. +*/ +typedef int Dwarf_Bool; /* boolean type */ +typedef unsigned long Dwarf_Off; /* 4 or 8 byte file offset */ +typedef unsigned long Dwarf_Unsigned; /* 4 or 8 byte unsigned value */ +typedef unsigned short Dwarf_Half; /* 2 byte unsigned value */ +typedef unsigned char Dwarf_Small; /* 1 byte unsigned value */ +typedef signed long Dwarf_Signed; /* 4 or 8 byte signed value */ +typedef unsigned long Dwarf_Addr; /* target memory address */ +#define DW_PR_DUx "lx" +#define DW_PR_DSx "lx" +#define DW_PR_DUu "lu" +#define DW_PR_DSd "ld" + +#else /* 32-bit */ +/* This is for ILP32, allowing i/o of 64bit dwarf info. + Also should be fine for LP64 and ILP64 cases. +*/ +typedef int Dwarf_Bool; /* boolean type */ +typedef unsigned long long Dwarf_Off; /* 8 byte file offset */ +typedef unsigned long long Dwarf_Unsigned; /* 8 byte unsigned value*/ +typedef unsigned short Dwarf_Half; /* 2 byte unsigned value */ +typedef unsigned char Dwarf_Small; /* 1 byte unsigned value */ +typedef signed long long Dwarf_Signed; /* 8 byte signed value */ +typedef unsigned long long Dwarf_Addr; /* target memory address */ +#define DW_PR_DUx "llx" +#define DW_PR_DSx "llx" +#define DW_PR_DUu "llu" +#define DW_PR_DSd "lld" +#endif +#ifdef HAVE_NONSTANDARD_PRINTF_64_FORMAT +/* Windows does not use std C formatting, so allow it. */ +#undef DW_PR_DUx +#undef DW_PR_DSx +#undef DW_PR_DUu +#undef DW_PR_DSd +#define DW_PR_DUx "I64x" +#define DW_PR_DSx "I64x" +#define DW_PR_DUu "I64u" +#define DW_PR_DSd "I64d" +#endif /* HAVE_NONSTANDARD_FORMAT */ + +typedef void* Dwarf_Ptr; /* host machine pointer */ + +/* Used for DW_FORM_ref_sig8. It is not a string, it + is 8 bytes of a signature one would use to find + a type unit. See dwarf_formsig8() +*/ +typedef struct { + char signature[8]; +} Dwarf_Sig8; + +/* Contains info on an uninterpreted block of data +*/ +typedef struct { + Dwarf_Unsigned bl_len; /* length of block */ + Dwarf_Ptr bl_data; /* uninterpreted data */ + Dwarf_Small bl_from_loclist; /*non-0 if loclist, else debug_info*/ + Dwarf_Unsigned bl_section_offset; /* Section (not CU) offset + which 'data' comes from. */ +} Dwarf_Block; + + +/* location record +*/ +typedef struct { + Dwarf_Small lr_atom; /* location operation */ + Dwarf_Unsigned lr_number; /* operand */ + Dwarf_Unsigned lr_number2; /* for OP_BREGx */ + Dwarf_Unsigned lr_offset; /* offset in locexpr for OP_BRA etc */ +} Dwarf_Loc; + + +/* location description +*/ +typedef struct { + Dwarf_Addr ld_lopc; /* beginning of active range */ + Dwarf_Addr ld_hipc; /* end of active range */ + Dwarf_Half ld_cents; /* count of location records */ + Dwarf_Loc* ld_s; /* pointer to list of same */ + Dwarf_Small ld_from_loclist; + /* non-0 if loclist, else debug_info*/ + + Dwarf_Unsigned ld_section_offset; /* Section (not CU) offset + where loc-expr begins*/ +} Dwarf_Locdesc; + +/* First appears in DWARF3. + The dwr_addr1/addr2 data is either an offset (DW_RANGES_ENTRY) + or an address (dwr_addr2 in DW_RANGES_ADDRESS_SELECTION) or + both are zero (DW_RANGES_END). +*/ +enum Dwarf_Ranges_Entry_Type { DW_RANGES_ENTRY, + DW_RANGES_ADDRESS_SELECTION, + DW_RANGES_END }; +typedef struct { + Dwarf_Addr dwr_addr1; + Dwarf_Addr dwr_addr2; + enum Dwarf_Ranges_Entry_Type dwr_type; +} Dwarf_Ranges; + +/* Frame description instructions expanded. +*/ +typedef struct { + Dwarf_Small fp_base_op; + Dwarf_Small fp_extended_op; + Dwarf_Half fp_register; + + /* Value may be signed, depends on op. + Any applicable data_alignment_factor has + not been applied, this is the raw offset. */ + Dwarf_Unsigned fp_offset; + Dwarf_Off fp_instr_offset; +} Dwarf_Frame_Op; /* DWARF2 */ + +typedef struct { + Dwarf_Small fp_base_op; + Dwarf_Small fp_extended_op; + Dwarf_Half fp_register; + + /* Value may be signed, depends on op. + Any applicable data_alignment_factor has + not been applied, this is the raw offset. */ + Dwarf_Unsigned fp_offset_or_block_len; + Dwarf_Small *fp_expr_block; + + Dwarf_Off fp_instr_offset; +} Dwarf_Frame_Op3; /* DWARF3 and DWARF2 compatible */ + +/* ***IMPORTANT NOTE, TARGET DEPENDENCY **** + DW_REG_TABLE_SIZE must be at least as large as + the number of registers + (DW_FRAME_LAST_REG_NUM) as defined in dwarf.h + Preferably identical to DW_FRAME_LAST_REG_NUM. + Ensure [0-DW_REG_TABLE_SIZE] does not overlap + DW_FRAME_UNDEFINED_VAL or DW_FRAME_SAME_VAL. + Also ensure DW_FRAME_REG_INITIAL_VALUE is set to what + is appropriate to your cpu. + For various CPUs DW_FRAME_UNDEFINED_VAL is correct + as the value for DW_FRAME_REG_INITIAL_VALUE. + + For consumer apps, this can be set dynamically: see + dwarf_set_frame_rule_table_size(); + */ +#ifndef DW_REG_TABLE_SIZE +#define DW_REG_TABLE_SIZE 66 +#endif + +/* For MIPS, DW_FRAME_SAME_VAL is the correct default value + for a frame register value. For other CPUS another value + may be better, such as DW_FRAME_UNDEFINED_VAL. + See dwarf_set_frame_rule_table_size +*/ +#ifndef DW_FRAME_REG_INITIAL_VALUE +#define DW_FRAME_REG_INITIAL_VALUE DW_FRAME_SAME_VAL +#endif + +/* Taken as meaning 'undefined value', this is not + a column or register number. + Only present at libdwarf runtime in the consumer + interfaces. Never on disk. + DW_FRAME_* Values present on disk are in dwarf.h + Ensure this is > DW_REG_TABLE_SIZE (the reg table + size is changeable at runtime with the *reg3() interfaces, + and this value must be greater than the reg table size). +*/ +#define DW_FRAME_UNDEFINED_VAL 1034 + +/* Taken as meaning 'same value' as caller had, not a column + or register number. + Only present at libdwarf runtime in the consumer + interfaces. Never on disk. + DW_FRAME_* Values present on disk are in dwarf.h + Ensure this is > DW_REG_TABLE_SIZE (the reg table + size is changeable at runtime with the *reg3() interfaces, + and this value must be greater than the reg table size). +*/ +#define DW_FRAME_SAME_VAL 1035 + +/* For DWARF3 consumer interfaces, make the CFA a column with no + real table number. This is what should have been done + for the DWARF2 interfaces. This actually works for + both DWARF2 and DWARF3, but see the libdwarf documentation + on Dwarf_Regtable3 and dwarf_get_fde_info_for_reg3() + and dwarf_get_fde_info_for_all_regs3() + Do NOT use this with the older dwarf_get_fde_info_for_reg() + or dwarf_get_fde_info_for_all_regs() consumer interfaces. + Must be higher than any register count for *any* ABI + (ensures maximum applicability with minimum effort). + Ensure this is > DW_REG_TABLE_SIZE (the reg table + size is changeable at runtime with the *reg3() interfaces, + and this value must be greater than the reg table size). + Only present at libdwarf runtime in the consumer + interfaces. Never on disk. +*/ +#define DW_FRAME_CFA_COL3 1436 + +/* The following are all needed to evaluate DWARF3 register rules. +*/ +#define DW_EXPR_OFFSET 0 /* DWARF2 only sees this. */ +#define DW_EXPR_VAL_OFFSET 1 +#define DW_EXPR_EXPRESSION 2 +#define DW_EXPR_VAL_EXPRESSION 3 + +typedef struct Dwarf_Regtable_Entry_s { + /* For each index i (naming a hardware register with dwarf number + i) the following is true and defines the value of that register: + + If dw_regnum is Register DW_FRAME_UNDEFINED_VAL + it is not DWARF register number but + a place holder indicating the register has no defined value. + If dw_regnum is Register DW_FRAME_SAME_VAL + it is not DWARF register number but + a place holder indicating the register has the same + value in the previous frame. + DW_FRAME_UNDEFINED_VAL, DW_FRAME_SAME_VAL are + only present at libdwarf runtime. Never on disk. + DW_FRAME_* Values present on disk are in dwarf.h + + Otherwise: the register number is a DWARF register number + (see ABI documents for how this translates to hardware/ + software register numbers in the machine hardware) + and the following applies: + + if dw_value_type == DW_EXPR_OFFSET (the only case for dwarf2): + If dw_offset_relevant is non-zero, then + the value is stored at at the address CFA+N where + N is a signed offset. + Rule: Offset(N) + If dw_offset_relevant is zero, then the value of the register + is the value of (DWARF) register number dw_regnum. + Rule: register(F) + Other values of dw_value_type are an error. + */ + Dwarf_Small dw_offset_relevant; + + /* For DWARF2, always 0 */ + Dwarf_Small dw_value_type; + + Dwarf_Half dw_regnum; + + /* The data type here should the larger of Dwarf_Addr + and Dwarf_Unsigned and Dwarf_Signed. */ + Dwarf_Addr dw_offset; +} Dwarf_Regtable_Entry; + +typedef struct Dwarf_Regtable_s { + struct Dwarf_Regtable_Entry_s rules[DW_REG_TABLE_SIZE]; +} Dwarf_Regtable; + +/* opaque type. Functional interface shown later. */ +struct Dwarf_Reg_value3_s; +typedef struct Dwarf_Reg_value3_s Dwarf_Reg_Value3; + +typedef struct Dwarf_Regtable_Entry3_s { + /* For each index i (naming a hardware register with dwarf number + i) the following is true and defines the value of that register: + + If dw_regnum is Register DW_FRAME_UNDEFINED_VAL + it is not DWARF register number but + a place holder indicating the register has no defined value. + If dw_regnum is Register DW_FRAME_SAME_VAL + it is not DWARF register number but + a place holder indicating the register has the same + value in the previous frame. + DW_FRAME_UNDEFINED_VAL, DW_FRAME_SAME_VAL and + DW_FRAME_CFA_COL3 are only present at libdwarf runtime. + Never on disk. + DW_FRAME_* Values present on disk are in dwarf.h + Because DW_FRAME_SAME_VAL and DW_FRAME_UNDEFINED_VAL + and DW_FRAME_CFA_COL3 are defineable at runtime + consider the names symbolic in this comment, not absolute. + + Otherwise: the register number is a DWARF register number + (see ABI documents for how this translates to hardware/ + software register numbers in the machine hardware) + and the following applies: + + In a cfa-defining entry (rt3_cfa_rule) the regnum is the + CFA 'register number'. Which is some 'normal' register, + not DW_FRAME_CFA_COL3, nor DW_FRAME_SAME_VAL, nor + DW_FRAME_UNDEFINED_VAL. + + If dw_value_type == DW_EXPR_OFFSET (the only possible case for + dwarf2): + If dw_offset_relevant is non-zero, then + the value is stored at at the address + CFA+N where N is a signed offset. + dw_regnum is the cfa register rule which means + one ignores dw_regnum and uses the CFA appropriately. + So dw_offset_or_block_len is a signed value, really, + and must be printed/evaluated as such. + Rule: Offset(N) + If dw_offset_relevant is zero, then the value of the register + is the value of (DWARF) register number dw_regnum. + Rule: register(R) + If dw_value_type == DW_EXPR_VAL_OFFSET + the value of this register is CFA +N where N is a signed offset. + dw_regnum is the cfa register rule which means + one ignores dw_regnum and uses the CFA appropriately. + Rule: val_offset(N) + If dw_value_type == DW_EXPR_EXPRESSION + The value of the register is the value at the address + computed by evaluating the DWARF expression E. + Rule: expression(E) + The expression E byte stream is pointed to by dw_block_ptr. + The expression length in bytes is given by + dw_offset_or_block_len. + If dw_value_type == DW_EXPR_VAL_EXPRESSION + The value of the register is the value + computed by evaluating the DWARF expression E. + Rule: val_expression(E) + The expression E byte stream is pointed to by dw_block_ptr. + The expression length in bytes is given by + dw_offset_or_block_len. + Other values of dw_value_type are an error. + */ + Dwarf_Small dw_offset_relevant; + Dwarf_Small dw_value_type; + Dwarf_Half dw_regnum; + Dwarf_Unsigned dw_offset_or_block_len; + Dwarf_Ptr dw_block_ptr; + +}Dwarf_Regtable_Entry3; + +/* For the DWARF3 version, moved the DW_FRAME_CFA_COL + out of the array and into its own struct. + Having it part of the array is not very easy to work + with from a portability point of view: changing + the number for every architecture is a pain (if one fails + to set it correctly a register rule gets clobbered when + setting CFA). With MIPS it just happened to be easy to use + DW_FRAME_CFA_COL (it was wrong conceptually but it was easy...). + + rt3_rules and rt3_reg_table_size must be filled in before + calling libdwarf. Filled in with a pointer to an array + (pointer and array set up by the calling application) + of rt3_reg_table_size Dwarf_Regtable_Entry3_s structs. + libdwarf does not allocate or deallocate space for the + rules, you must do so. libdwarf will initialize the + contents rules array, you do not need to do so (though + if you choose to initialize the array somehow that is ok: + libdwarf will overwrite your initializations with its own). + +*/ +typedef struct Dwarf_Regtable3_s { + struct Dwarf_Regtable_Entry3_s rt3_cfa_rule; + + Dwarf_Half rt3_reg_table_size; + struct Dwarf_Regtable_Entry3_s * rt3_rules; +} Dwarf_Regtable3; + + +/* Use for DW_EPXR_STANDARD., DW_EXPR_VAL_OFFSET. + Returns DW_DLV_OK if the value is available. + If DW_DLV_OK returns the regnum and offset thru the pointers + (which the consumer must use appropriately). +*/ +int dwarf_frame_get_reg_register(struct Dwarf_Regtable_Entry3_s *reg_in, + Dwarf_Small *offset_relevant, + Dwarf_Half *regnum_out, + Dwarf_Signed *offset_out); + +/* Use for DW_EXPR_EXPRESSION, DW_EXPR_VAL_EXPRESSION. + Returns DW_DLV_OK if the value is available. + The caller must pass in the address of a valid + Dwarf_Block (the caller need not initialize it). +*/ +int dwarf_frame_get_reg_expression(struct Dwarf_Regtable_Entry3_s *reg_in, + Dwarf_Block *block_out); + + +/* For DW_DLC_SYMBOLIC_RELOCATIONS output to caller + v2, adding drd_length: some relocations are 4 and + some 8 bytes (pointers are 8, section offsets 4) in + some dwarf environments. (MIPS relocations are all one + size in any given ABI.) Changing drd_type to an unsigned char + to keep struct size down. +*/ +enum Dwarf_Rel_Type { + dwarf_drt_none, /* Should not get to caller */ + dwarf_drt_data_reloc, /* Simple normal relocation. */ + dwarf_drt_segment_rel, /* Special reloc, exceptions. */ + /* dwarf_drt_first_of_length_pair and drt_second + are for for the .word end - begin case. */ + dwarf_drt_first_of_length_pair, + dwarf_drt_second_of_length_pair +}; + +typedef struct Dwarf_P_Marker_s * Dwarf_P_Marker; +struct Dwarf_P_Marker_s { + Dwarf_Unsigned ma_marker; + Dwarf_Unsigned ma_offset; +}; + +typedef struct Dwarf_Relocation_Data_s * Dwarf_Relocation_Data; +struct Dwarf_Relocation_Data_s { + unsigned char drd_type; /* Cast to/from Dwarf_Rel_Type + to keep size small in struct. */ + unsigned char drd_length; /* Length in bytes of data being + relocated. 4 for 32bit data, + 8 for 64bit data. */ + Dwarf_Unsigned drd_offset; /* Where the data to reloc is. */ + Dwarf_Unsigned drd_symbol_index; +}; + +typedef struct Dwarf_P_String_Attr_s * Dwarf_P_String_Attr; +struct Dwarf_P_String_Attr_s { + Dwarf_Unsigned sa_offset; /* Offset of string attribute data */ + Dwarf_Unsigned sa_nbytes; +}; + + +/* Opaque types for Consumer Library. */ +typedef struct Dwarf_Debug_s* Dwarf_Debug; +typedef struct Dwarf_Die_s* Dwarf_Die; +typedef struct Dwarf_Line_s* Dwarf_Line; +typedef struct Dwarf_Global_s* Dwarf_Global; +typedef struct Dwarf_Func_s* Dwarf_Func; +typedef struct Dwarf_Type_s* Dwarf_Type; +typedef struct Dwarf_Var_s* Dwarf_Var; +typedef struct Dwarf_Weak_s* Dwarf_Weak; +typedef struct Dwarf_Error_s* Dwarf_Error; +typedef struct Dwarf_Attribute_s* Dwarf_Attribute; +typedef struct Dwarf_Abbrev_s* Dwarf_Abbrev; +typedef struct Dwarf_Fde_s* Dwarf_Fde; +typedef struct Dwarf_Cie_s* Dwarf_Cie; +typedef struct Dwarf_Arange_s* Dwarf_Arange; + +/* Opaque types for Producer Library. */ +typedef struct Dwarf_P_Debug_s* Dwarf_P_Debug; +typedef struct Dwarf_P_Die_s* Dwarf_P_Die; +typedef struct Dwarf_P_Attribute_s* Dwarf_P_Attribute; +typedef struct Dwarf_P_Fde_s* Dwarf_P_Fde; +typedef struct Dwarf_P_Expr_s* Dwarf_P_Expr; +typedef Dwarf_Unsigned Dwarf_Tag; + + +/* error handler function +*/ +typedef void (*Dwarf_Handler)(Dwarf_Error /*error*/, Dwarf_Ptr /*errarg*/); + + +/* Begin libdwarf Object File Interface declarations. + +As of February 2008 there are multiple dwarf_reader object access +initialization methods available: +The traditional dwarf_elf_init() and dwarf_init() and dwarf_finish() + which assume libelf and POSIX file access. +An object-file and library agnostic dwarf_object_init() and dwarf_object_finish() + which allow the coder to provide object access routines + abstracting away the elf interface. So there is no dependence in the + reader code on the object format and no dependence on libelf. + See the code in dwarf_elf_access.c and dwarf_original_elf_init.c + to see an example of initializing the structures mentioned below. + +Projects using dwarf_elf_init() or dwarf_init() can ignore +the Dwarf_Obj_Access* structures entirely as all these details +are completed for you. + +*/ + +typedef struct Dwarf_Obj_Access_Interface_s Dwarf_Obj_Access_Interface; +typedef struct Dwarf_Obj_Access_Methods_s Dwarf_Obj_Access_Methods; +typedef struct Dwarf_Obj_Access_Section_s Dwarf_Obj_Access_Section; + + +/* Used in the get_section interface function + in Dwarf_Obj_Access_Section_s. Since libdwarf + depends on standard DWARF section names an object + format that has no such names (but has some + method of setting up 'sections equivalents') + must arrange to return standard DWARF section + names in the 'name' field. libdwarf does + not free the strings in 'name'. */ +struct Dwarf_Obj_Access_Section_s { + Dwarf_Addr addr; + Dwarf_Unsigned size; + const char* name; + /* Set link to zero if it is meaningless. If non-zero + it should be a link to a rela section or from symtab + to strtab. In Elf it is sh_link. */ + Dwarf_Unsigned link; +}; + +/* Returned by the get_endianness function in + Dwarf_Obj_Access_Methods_s. */ +typedef enum { + DW_OBJECT_MSB, + DW_OBJECT_LSB +} Dwarf_Endianness; + +/* The functions we need to access object data from libdwarf are declared here. + + In these function pointer declarations + 'void *obj' is intended to be a pointer (the object field in + Dwarf_Obj_Access_Interface_s) + that hides the library-specific and object-specific data that makes + it possible to handle multiple object formats and multiple libraries. + It's not required that one handles multiple such in a single libdwarf + archive/shared-library (but not ruled out either). + See dwarf_elf_object_access_internals_t and dwarf_elf_access.c + for an example. + +*/ +struct Dwarf_Obj_Access_Methods_s { + /** + * get_section_info + * + * Get address, size, and name info about a section. + * + * Parameters + * section_index - Zero-based index. + * return_section - Pointer to a structure in which section info + * will be placed. Caller must provide a valid pointer to a + * structure area. The structure's contents will be overwritten + * by the call to get_section_info. + * error - A pointer to an integer in which an error code may be stored. + * + * Return + * DW_DLV_OK - Everything ok. + * DW_DLV_ERROR - Error occurred. Use 'error' to determine the + * libdwarf defined error. + * DW_DLV_NO_ENTRY - No such section. + */ + int (*get_section_info)(void* obj, Dwarf_Half section_index, + Dwarf_Obj_Access_Section* return_section, int* error); + /** + * get_byte_order + * + * Get whether the object file represented by this interface is big-endian + * (DW_OBJECT_MSB) or little endian (DW_OBJECT_LSB). + * + * Parameters + * obj - Equivalent to 'this' in OO languages. + * + * Return + * Endianness of object. Cannot fail. + */ + Dwarf_Endianness (*get_byte_order)(void* obj); + /** + * get_length_size + * + * Get the size of a length field in the underlying object file. + * libdwarf currently supports * 4 and 8 byte sizes, but may + * support larger in the future. + * Perhaps the return type should be an enumeration? + * + * Parameters + * obj - Equivalent to 'this' in OO languages. + * + * Return + * Size of length. Cannot fail. + */ + Dwarf_Small (*get_length_size)(void* obj); + /** + * get_pointer_size + * + * Get the size of a pointer field in the underlying object file. + * libdwarf currently supports 4 and 8 byte sizes. + * Perhaps the return type should be an enumeration? + + * Return + * Size of pointer. Cannot fail. + */ + Dwarf_Small (*get_pointer_size)(void* obj); + /** + * get_section_count + * + * Get the number of sections in the object file. + * + * Parameters + * + * Return + * Number of sections + */ + Dwarf_Unsigned (*get_section_count)(void* obj); + /** + * load_section + * + * Get a pointer to an array of bytes that represent the section. + * + * Parameters + * section_index - Zero-based index. + * return_data - The address of a pointer to which the section data block + * will be assigned. + * error - Pointer to an integer for returning libdwarf-defined + * error numbers. + * + * Return + * DW_DLV_OK - No error. + * DW_DLV_ERROR - Error. Use 'error' to indicate a libdwarf-defined + * error number. + * DW_DLV_NO_ENTRY - No such section. + */ + int (*load_section)(void* obj, Dwarf_Half section_index, + Dwarf_Small** return_data, int* error); + + /** + * relocate_a_section + * If relocations are not supported leave this pointer NULL. + * + * Get a pointer to an array of bytes that represent the section. + * + * Parameters + * section_index - Zero-based index of the section to be relocated. + * error - Pointer to an integer for returning libdwarf-defined + * error numbers. + * + * Return + * DW_DLV_OK - No error. + * DW_DLV_ERROR - Error. Use 'error' to indicate a libdwarf-defined + * error number. + * DW_DLV_NO_ENTRY - No such section. + */ + int (*relocate_a_section)(void* obj, Dwarf_Half section_index, + Dwarf_Debug dbg, + int* error); + +}; + + + +/* These structures are allocated and deallocated by your code + when you are using the libdwarf Object File Interface + [dwarf_object_init() and dwarf_object_finish()] directly. + dwarf_object_finish() does not free + struct Dwarf_Obj_Access_Interface_s or its content. + (libdwarf does record a pointer to this struct: you must + ensure that pointer remains valid for as long as + a libdwarf instance is open (meaning + after dwarf_init() and before dwarf_finish()). + + If you are reading Elf objects and libelf use dwarf_init() + or dwarf_elf_init() which take care of these details. +*/ +struct Dwarf_Obj_Access_Interface_s { + /* object is a void* as it hides the data the object access routines + need (which varies by library in use and object format). + */ + void* object; + const Dwarf_Obj_Access_Methods * methods; +}; + +/* End libdwarf Object File Interface */ + +/* + Dwarf_dealloc() alloc_type arguments. + Argument points to: +*/ +#define DW_DLA_STRING 0x01 /* char* */ +#define DW_DLA_LOC 0x02 /* Dwarf_Loc */ +#define DW_DLA_LOCDESC 0x03 /* Dwarf_Locdesc */ +#define DW_DLA_ELLIST 0x04 /* Dwarf_Ellist (not used)*/ +#define DW_DLA_BOUNDS 0x05 /* Dwarf_Bounds (not used) */ +#define DW_DLA_BLOCK 0x06 /* Dwarf_Block */ +#define DW_DLA_DEBUG 0x07 /* Dwarf_Debug */ +#define DW_DLA_DIE 0x08 /* Dwarf_Die */ +#define DW_DLA_LINE 0x09 /* Dwarf_Line */ +#define DW_DLA_ATTR 0x0a /* Dwarf_Attribute */ +#define DW_DLA_TYPE 0x0b /* Dwarf_Type (not used) */ +#define DW_DLA_SUBSCR 0x0c /* Dwarf_Subscr (not used) */ +#define DW_DLA_GLOBAL 0x0d /* Dwarf_Global */ +#define DW_DLA_ERROR 0x0e /* Dwarf_Error */ +#define DW_DLA_LIST 0x0f /* a list */ +#define DW_DLA_LINEBUF 0x10 /* Dwarf_Line* (not used) */ +#define DW_DLA_ARANGE 0x11 /* Dwarf_Arange */ +#define DW_DLA_ABBREV 0x12 /* Dwarf_Abbrev */ +#define DW_DLA_FRAME_OP 0x13 /* Dwarf_Frame_Op */ +#define DW_DLA_CIE 0x14 /* Dwarf_Cie */ +#define DW_DLA_FDE 0x15 /* Dwarf_Fde */ +#define DW_DLA_LOC_BLOCK 0x16 /* Dwarf_Loc Block (not used) */ +#define DW_DLA_FRAME_BLOCK 0x17 /* Dwarf_Frame Block (not used) */ +#define DW_DLA_FUNC 0x18 /* Dwarf_Func */ +#define DW_DLA_TYPENAME 0x19 /* Dwarf_Type */ +#define DW_DLA_VAR 0x1a /* Dwarf_Var */ +#define DW_DLA_WEAK 0x1b /* Dwarf_Weak */ +#define DW_DLA_ADDR 0x1c /* Dwarf_Addr sized entries */ +#define DW_DLA_RANGES 0x1d /* Dwarf_Ranges */ + +/* The augmenter string for CIE */ +#define DW_CIE_AUGMENTER_STRING_V0 "z" + +/* dwarf_init() access arguments +*/ +#define DW_DLC_READ 0 /* read only access */ +#define DW_DLC_WRITE 1 /* write only access */ +#define DW_DLC_RDWR 2 /* read/write access NOT SUPPORTED*/ + +/* pro_init() access flag modifiers + If HAVE_DWARF2_99_EXTENSION is defined at libdwarf build time + and DW_DLC_OFFSET_SIZE_64 is passed in pro_init() flags then the DWARF3 + 64 bit offset extension is used to generate 64 bit offsets. +*/ +#define DW_DLC_SIZE_64 0x40000000 /* 32-bit address-size target */ +#define DW_DLC_SIZE_32 0x20000000 /* 64-bit address-size target */ +#define DW_DLC_OFFSET_SIZE_64 0x10000000 /* 64-bit offset-size DWARF */ + +/* dwarf_pro_init() access flag modifiers +*/ +#define DW_DLC_ISA_MIPS 0x00000000 /* MIPS target */ +#define DW_DLC_ISA_IA64 0x01000000 /* IA64 target */ +#define DW_DLC_STREAM_RELOCATIONS 0x02000000 /* Old style binary relocs */ + + /* Usable with assembly output because it is up to the producer to + deal with locations in whatever manner the producer code wishes. + Possibly emitting text an assembler will recognize. */ +#define DW_DLC_SYMBOLIC_RELOCATIONS 0x04000000 + +#define DW_DLC_TARGET_BIGENDIAN 0x08000000 /* Big endian target */ +#define DW_DLC_TARGET_LITTLEENDIAN 0x00100000 /* Little endian target */ + +#if 0 + /* + The libdwarf producer interfaces jumble these two semantics together in + confusing ways. We *should* have flags like these... + But changing the code means a lot of diffs. So for now, + we leave things as they are + */ + #define DW_DLC_SUN_OFFSET32 0x00010000 /* use 32-bit sec offsets */ + #define DW_DLC_SUN_OFFSET64 0x00020000 /* use 64-bit sec offsets */ + #define DW_DLC_SUN_POINTER32 0x00040000 /* use 4 for address_size */ + #define DW_DLC_SUN_POINTER64 0x00080000 /* use 8 for address_size */ +#endif + +/* dwarf_pcline() slide arguments +*/ +#define DW_DLS_BACKWARD -1 /* slide backward to find line */ +#define DW_DLS_NOSLIDE 0 /* match exactly without sliding */ +#define DW_DLS_FORWARD 1 /* slide forward to find line */ + +/* libdwarf error numbers +*/ +#define DW_DLE_NE 0 /* no error */ +#define DW_DLE_VMM 1 /* dwarf format/library version mismatch */ +#define DW_DLE_MAP 2 /* memory map failure */ +#define DW_DLE_LEE 3 /* libelf error */ +#define DW_DLE_NDS 4 /* no debug section */ +#define DW_DLE_NLS 5 /* no line section */ +#define DW_DLE_ID 6 /* invalid descriptor for query */ +#define DW_DLE_IOF 7 /* I/O failure */ +#define DW_DLE_MAF 8 /* memory allocation failure */ +#define DW_DLE_IA 9 /* invalid argument */ +#define DW_DLE_MDE 10 /* mangled debugging entry */ +#define DW_DLE_MLE 11 /* mangled line number entry */ +#define DW_DLE_FNO 12 /* file not open */ +#define DW_DLE_FNR 13 /* file not a regular file */ +#define DW_DLE_FWA 14 /* file open with wrong access */ +#define DW_DLE_NOB 15 /* not an object file */ +#define DW_DLE_MOF 16 /* mangled object file header */ +#define DW_DLE_EOLL 17 /* end of location list entries */ +#define DW_DLE_NOLL 18 /* no location list section */ +#define DW_DLE_BADOFF 19 /* Invalid offset */ +#define DW_DLE_EOS 20 /* end of section */ +#define DW_DLE_ATRUNC 21 /* abbreviations section appears truncated*/ +#define DW_DLE_BADBITC 22 /* Address size passed to dwarf bad*/ + /* It is not an allowed size (64 or 32) */ + /* Error codes defined by the current Libdwarf Implementation. */ +#define DW_DLE_DBG_ALLOC 23 +#define DW_DLE_FSTAT_ERROR 24 +#define DW_DLE_FSTAT_MODE_ERROR 25 +#define DW_DLE_INIT_ACCESS_WRONG 26 +#define DW_DLE_ELF_BEGIN_ERROR 27 +#define DW_DLE_ELF_GETEHDR_ERROR 28 +#define DW_DLE_ELF_GETSHDR_ERROR 29 +#define DW_DLE_ELF_STRPTR_ERROR 30 +#define DW_DLE_DEBUG_INFO_DUPLICATE 31 +#define DW_DLE_DEBUG_INFO_NULL 32 +#define DW_DLE_DEBUG_ABBREV_DUPLICATE 33 +#define DW_DLE_DEBUG_ABBREV_NULL 34 +#define DW_DLE_DEBUG_ARANGES_DUPLICATE 35 +#define DW_DLE_DEBUG_ARANGES_NULL 36 +#define DW_DLE_DEBUG_LINE_DUPLICATE 37 +#define DW_DLE_DEBUG_LINE_NULL 38 +#define DW_DLE_DEBUG_LOC_DUPLICATE 39 +#define DW_DLE_DEBUG_LOC_NULL 40 +#define DW_DLE_DEBUG_MACINFO_DUPLICATE 41 +#define DW_DLE_DEBUG_MACINFO_NULL 42 +#define DW_DLE_DEBUG_PUBNAMES_DUPLICATE 43 +#define DW_DLE_DEBUG_PUBNAMES_NULL 44 +#define DW_DLE_DEBUG_STR_DUPLICATE 45 +#define DW_DLE_DEBUG_STR_NULL 46 +#define DW_DLE_CU_LENGTH_ERROR 47 +#define DW_DLE_VERSION_STAMP_ERROR 48 +#define DW_DLE_ABBREV_OFFSET_ERROR 49 +#define DW_DLE_ADDRESS_SIZE_ERROR 50 +#define DW_DLE_DEBUG_INFO_PTR_NULL 51 +#define DW_DLE_DIE_NULL 52 +#define DW_DLE_STRING_OFFSET_BAD 53 +#define DW_DLE_DEBUG_LINE_LENGTH_BAD 54 +#define DW_DLE_LINE_PROLOG_LENGTH_BAD 55 +#define DW_DLE_LINE_NUM_OPERANDS_BAD 56 +#define DW_DLE_LINE_SET_ADDR_ERROR 57 /* No longer used. */ +#define DW_DLE_LINE_EXT_OPCODE_BAD 58 +#define DW_DLE_DWARF_LINE_NULL 59 +#define DW_DLE_INCL_DIR_NUM_BAD 60 +#define DW_DLE_LINE_FILE_NUM_BAD 61 +#define DW_DLE_ALLOC_FAIL 62 +#define DW_DLE_NO_CALLBACK_FUNC 63 +#define DW_DLE_SECT_ALLOC 64 +#define DW_DLE_FILE_ENTRY_ALLOC 65 +#define DW_DLE_LINE_ALLOC 66 +#define DW_DLE_FPGM_ALLOC 67 +#define DW_DLE_INCDIR_ALLOC 68 +#define DW_DLE_STRING_ALLOC 69 +#define DW_DLE_CHUNK_ALLOC 70 +#define DW_DLE_BYTEOFF_ERR 71 +#define DW_DLE_CIE_ALLOC 72 +#define DW_DLE_FDE_ALLOC 73 +#define DW_DLE_REGNO_OVFL 74 +#define DW_DLE_CIE_OFFS_ALLOC 75 +#define DW_DLE_WRONG_ADDRESS 76 +#define DW_DLE_EXTRA_NEIGHBORS 77 +#define DW_DLE_WRONG_TAG 78 +#define DW_DLE_DIE_ALLOC 79 +#define DW_DLE_PARENT_EXISTS 80 +#define DW_DLE_DBG_NULL 81 +#define DW_DLE_DEBUGLINE_ERROR 82 +#define DW_DLE_DEBUGFRAME_ERROR 83 +#define DW_DLE_DEBUGINFO_ERROR 84 +#define DW_DLE_ATTR_ALLOC 85 +#define DW_DLE_ABBREV_ALLOC 86 +#define DW_DLE_OFFSET_UFLW 87 +#define DW_DLE_ELF_SECT_ERR 88 +#define DW_DLE_DEBUG_FRAME_LENGTH_BAD 89 +#define DW_DLE_FRAME_VERSION_BAD 90 +#define DW_DLE_CIE_RET_ADDR_REG_ERROR 91 +#define DW_DLE_FDE_NULL 92 +#define DW_DLE_FDE_DBG_NULL 93 +#define DW_DLE_CIE_NULL 94 +#define DW_DLE_CIE_DBG_NULL 95 +#define DW_DLE_FRAME_TABLE_COL_BAD 96 +#define DW_DLE_PC_NOT_IN_FDE_RANGE 97 +#define DW_DLE_CIE_INSTR_EXEC_ERROR 98 +#define DW_DLE_FRAME_INSTR_EXEC_ERROR 99 +#define DW_DLE_FDE_PTR_NULL 100 +#define DW_DLE_RET_OP_LIST_NULL 101 +#define DW_DLE_LINE_CONTEXT_NULL 102 +#define DW_DLE_DBG_NO_CU_CONTEXT 103 +#define DW_DLE_DIE_NO_CU_CONTEXT 104 +#define DW_DLE_FIRST_DIE_NOT_CU 105 +#define DW_DLE_NEXT_DIE_PTR_NULL 106 +#define DW_DLE_DEBUG_FRAME_DUPLICATE 107 +#define DW_DLE_DEBUG_FRAME_NULL 108 +#define DW_DLE_ABBREV_DECODE_ERROR 109 +#define DW_DLE_DWARF_ABBREV_NULL 110 +#define DW_DLE_ATTR_NULL 111 +#define DW_DLE_DIE_BAD 112 +#define DW_DLE_DIE_ABBREV_BAD 113 +#define DW_DLE_ATTR_FORM_BAD 114 +#define DW_DLE_ATTR_NO_CU_CONTEXT 115 +#define DW_DLE_ATTR_FORM_SIZE_BAD 116 +#define DW_DLE_ATTR_DBG_NULL 117 +#define DW_DLE_BAD_REF_FORM 118 +#define DW_DLE_ATTR_FORM_OFFSET_BAD 119 +#define DW_DLE_LINE_OFFSET_BAD 120 +#define DW_DLE_DEBUG_STR_OFFSET_BAD 121 +#define DW_DLE_STRING_PTR_NULL 122 +#define DW_DLE_PUBNAMES_VERSION_ERROR 123 +#define DW_DLE_PUBNAMES_LENGTH_BAD 124 +#define DW_DLE_GLOBAL_NULL 125 +#define DW_DLE_GLOBAL_CONTEXT_NULL 126 +#define DW_DLE_DIR_INDEX_BAD 127 +#define DW_DLE_LOC_EXPR_BAD 128 +#define DW_DLE_DIE_LOC_EXPR_BAD 129 +#define DW_DLE_ADDR_ALLOC 130 +#define DW_DLE_OFFSET_BAD 131 +#define DW_DLE_MAKE_CU_CONTEXT_FAIL 132 +#define DW_DLE_REL_ALLOC 133 +#define DW_DLE_ARANGE_OFFSET_BAD 134 +#define DW_DLE_SEGMENT_SIZE_BAD 135 +#define DW_DLE_ARANGE_LENGTH_BAD 136 +#define DW_DLE_ARANGE_DECODE_ERROR 137 +#define DW_DLE_ARANGES_NULL 138 +#define DW_DLE_ARANGE_NULL 139 +#define DW_DLE_NO_FILE_NAME 140 +#define DW_DLE_NO_COMP_DIR 141 +#define DW_DLE_CU_ADDRESS_SIZE_BAD 142 +#define DW_DLE_INPUT_ATTR_BAD 143 +#define DW_DLE_EXPR_NULL 144 +#define DW_DLE_BAD_EXPR_OPCODE 145 +#define DW_DLE_EXPR_LENGTH_BAD 146 +#define DW_DLE_MULTIPLE_RELOC_IN_EXPR 147 +#define DW_DLE_ELF_GETIDENT_ERROR 148 +#define DW_DLE_NO_AT_MIPS_FDE 149 +#define DW_DLE_NO_CIE_FOR_FDE 150 +#define DW_DLE_DIE_ABBREV_LIST_NULL 151 +#define DW_DLE_DEBUG_FUNCNAMES_DUPLICATE 152 +#define DW_DLE_DEBUG_FUNCNAMES_NULL 153 +#define DW_DLE_DEBUG_FUNCNAMES_VERSION_ERROR 154 +#define DW_DLE_DEBUG_FUNCNAMES_LENGTH_BAD 155 +#define DW_DLE_FUNC_NULL 156 +#define DW_DLE_FUNC_CONTEXT_NULL 157 +#define DW_DLE_DEBUG_TYPENAMES_DUPLICATE 158 +#define DW_DLE_DEBUG_TYPENAMES_NULL 159 +#define DW_DLE_DEBUG_TYPENAMES_VERSION_ERROR 160 +#define DW_DLE_DEBUG_TYPENAMES_LENGTH_BAD 161 +#define DW_DLE_TYPE_NULL 162 +#define DW_DLE_TYPE_CONTEXT_NULL 163 +#define DW_DLE_DEBUG_VARNAMES_DUPLICATE 164 +#define DW_DLE_DEBUG_VARNAMES_NULL 165 +#define DW_DLE_DEBUG_VARNAMES_VERSION_ERROR 166 +#define DW_DLE_DEBUG_VARNAMES_LENGTH_BAD 167 +#define DW_DLE_VAR_NULL 168 +#define DW_DLE_VAR_CONTEXT_NULL 169 +#define DW_DLE_DEBUG_WEAKNAMES_DUPLICATE 170 +#define DW_DLE_DEBUG_WEAKNAMES_NULL 171 +#define DW_DLE_DEBUG_WEAKNAMES_VERSION_ERROR 172 +#define DW_DLE_DEBUG_WEAKNAMES_LENGTH_BAD 173 +#define DW_DLE_WEAK_NULL 174 +#define DW_DLE_WEAK_CONTEXT_NULL 175 +#define DW_DLE_LOCDESC_COUNT_WRONG 176 +#define DW_DLE_MACINFO_STRING_NULL 177 +#define DW_DLE_MACINFO_STRING_EMPTY 178 +#define DW_DLE_MACINFO_INTERNAL_ERROR_SPACE 179 +#define DW_DLE_MACINFO_MALLOC_FAIL 180 +#define DW_DLE_DEBUGMACINFO_ERROR 181 +#define DW_DLE_DEBUG_MACRO_LENGTH_BAD 182 +#define DW_DLE_DEBUG_MACRO_MAX_BAD 183 +#define DW_DLE_DEBUG_MACRO_INTERNAL_ERR 184 +#define DW_DLE_DEBUG_MACRO_MALLOC_SPACE 185 +#define DW_DLE_DEBUG_MACRO_INCONSISTENT 186 +#define DW_DLE_DF_NO_CIE_AUGMENTATION 187 +#define DW_DLE_DF_REG_NUM_TOO_HIGH 188 +#define DW_DLE_DF_MAKE_INSTR_NO_INIT 189 +#define DW_DLE_DF_NEW_LOC_LESS_OLD_LOC 190 +#define DW_DLE_DF_POP_EMPTY_STACK 191 +#define DW_DLE_DF_ALLOC_FAIL 192 +#define DW_DLE_DF_FRAME_DECODING_ERROR 193 +#define DW_DLE_DEBUG_LOC_SECTION_SHORT 194 +#define DW_DLE_FRAME_AUGMENTATION_UNKNOWN 195 +#define DW_DLE_PUBTYPE_CONTEXT 196 /* Unused. */ +#define DW_DLE_DEBUG_PUBTYPES_LENGTH_BAD 197 +#define DW_DLE_DEBUG_PUBTYPES_VERSION_ERROR 198 +#define DW_DLE_DEBUG_PUBTYPES_DUPLICATE 199 +#define DW_DLE_FRAME_CIE_DECODE_ERROR 200 +#define DW_DLE_FRAME_REGISTER_UNREPRESENTABLE 201 +#define DW_DLE_FRAME_REGISTER_COUNT_MISMATCH 202 +#define DW_DLE_LINK_LOOP 203 +#define DW_DLE_STRP_OFFSET_BAD 204 +#define DW_DLE_DEBUG_RANGES_DUPLICATE 205 +#define DW_DLE_DEBUG_RANGES_OFFSET_BAD 206 +#define DW_DLE_DEBUG_RANGES_MISSING_END 207 +#define DW_DLE_DEBUG_RANGES_OUT_OF_MEM 208 +#define DW_DLE_DEBUG_SYMTAB_ERR 209 +#define DW_DLE_DEBUG_STRTAB_ERR 210 +#define DW_DLE_RELOC_MISMATCH_INDEX 211 +#define DW_DLE_RELOC_MISMATCH_RELOC_INDEX 212 +#define DW_DLE_RELOC_MISMATCH_STRTAB_INDEX 213 +#define DW_DLE_RELOC_SECTION_MISMATCH 214 +#define DW_DLE_RELOC_SECTION_MISSING_INDEX 215 +#define DW_DLE_RELOC_SECTION_LENGTH_ODD 216 +#define DW_DLE_RELOC_SECTION_PTR_NULL 217 +#define DW_DLE_RELOC_SECTION_MALLOC_FAIL 218 +#define DW_DLE_NO_ELF64_SUPPORT 219 +#define DW_DLE_MISSING_ELF64_SUPPORT 220 +#define DW_DLE_ORPHAN_FDE 221 +#define DW_DLE_DUPLICATE_INST_BLOCK 222 +#define DW_DLE_BAD_REF_SIG8_FORM 223 +#define DW_DLE_ATTR_EXPRLOC_FORM_BAD 224 +#define DW_DLE_FORM_SEC_OFFSET_LENGTH_BAD 225 +#define DW_DLE_NOT_REF_FORM 226 +#define DW_DLE_DEBUG_FRAME_LENGTH_NOT_MULTIPLE 227 + + + + /* DW_DLE_LAST MUST EQUAL LAST ERROR NUMBER */ +#define DW_DLE_LAST 227 +#define DW_DLE_LO_USER 0x10000 + + /* Taken as meaning 'undefined value', this is not + a column or register number. + Only present at libdwarf runtime. Never on disk. + DW_FRAME_* Values present on disk are in dwarf.h + */ +#define DW_FRAME_UNDEFINED_VAL 1034 + + /* Taken as meaning 'same value' as caller had, not a column + or register number + Only present at libdwarf runtime. Never on disk. + DW_FRAME_* Values present on disk are in dwarf.h + */ +#define DW_FRAME_SAME_VAL 1035 + + + +/* error return values +*/ +#define DW_DLV_BADADDR (~(Dwarf_Addr)0) + /* for functions returning target address */ + +#define DW_DLV_NOCOUNT ((Dwarf_Signed)-1) + /* for functions returning count */ + +#define DW_DLV_BADOFFSET (~(Dwarf_Off)0) + /* for functions returning offset */ + +/* standard return values for functions */ +#define DW_DLV_NO_ENTRY -1 +#define DW_DLV_OK 0 +#define DW_DLV_ERROR 1 + +/* Special values for offset_into_exception_table field of dwarf fde's. */ +/* The following value indicates that there is no Exception table offset + associated with a dwarf frame. */ +#define DW_DLX_NO_EH_OFFSET (-1LL) +/* The following value indicates that the producer was unable to analyse the + source file to generate Exception tables for this function. */ +#define DW_DLX_EH_OFFSET_UNAVAILABLE (-2LL) + + +/*===========================================================================*/ +/* Dwarf consumer interface initialization and termination operations */ + +/* Initialization based on Unix open fd (using libelf internally). */ +int dwarf_init(int /*fd*/, + Dwarf_Unsigned /*access*/, + Dwarf_Handler /*errhand*/, + Dwarf_Ptr /*errarg*/, + Dwarf_Debug* /*dbg*/, + Dwarf_Error* /*error*/); + +/* Initialization based on libelf/sgi-fastlibelf open pointer. */ +int dwarf_elf_init(dwarf_elf_handle /*elf*/, + Dwarf_Unsigned /*access*/, + Dwarf_Handler /*errhand*/, + Dwarf_Ptr /*errarg*/, + Dwarf_Debug* /*dbg*/, + Dwarf_Error* /*error*/); + +/* Undocumented function for memory allocator. */ +void dwarf_print_memory_stats(Dwarf_Debug /*dbg*/); + +int dwarf_get_elf(Dwarf_Debug /*dbg*/, + dwarf_elf_handle* /*return_elfptr*/, + Dwarf_Error* /*error*/); + +int dwarf_finish(Dwarf_Debug /*dbg*/, Dwarf_Error* /*error*/); + + +int dwarf_object_init(Dwarf_Obj_Access_Interface* /* obj */, + Dwarf_Handler /* errhand */, + Dwarf_Ptr /* errarg */, + Dwarf_Debug* /* dbg */, + Dwarf_Error* /* error */); + +int dwarf_object_finish(Dwarf_Debug /* dbg */, + Dwarf_Error* /* error */); + +/* die traversal operations */ +int dwarf_next_cu_header_b(Dwarf_Debug /*dbg*/, + Dwarf_Unsigned* /*cu_header_length*/, + Dwarf_Half* /*version_stamp*/, + Dwarf_Off* /*abbrev_offset*/, + Dwarf_Half* /*address_size*/, + Dwarf_Half* /*length_size*/, + Dwarf_Half* /*extension_size*/, + Dwarf_Unsigned* /*next_cu_header_offset*/, + Dwarf_Error* /*error*/); +/* The following is now obsolete, though supported. November 2009. */ +int dwarf_next_cu_header(Dwarf_Debug /*dbg*/, + Dwarf_Unsigned* /*cu_header_length*/, + Dwarf_Half* /*version_stamp*/, + Dwarf_Off* /*abbrev_offset*/, + Dwarf_Half* /*address_size*/, + Dwarf_Unsigned* /*next_cu_header_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_siblingof(Dwarf_Debug /*dbg*/, + Dwarf_Die /*die*/, + Dwarf_Die* /*return_siblingdie*/, + Dwarf_Error* /*error*/); + +int dwarf_child(Dwarf_Die /*die*/, + Dwarf_Die* /*return_childdie*/, + Dwarf_Error* /*error*/); + +/* Finding die given global (not CU-relative) offset */ +int dwarf_offdie(Dwarf_Debug /*dbg*/, + Dwarf_Off /*offset*/, + Dwarf_Die* /*return_die*/, + Dwarf_Error* /*error*/); + +/* Higher level functions (Unimplemented) */ +int dwarf_pcfile(Dwarf_Debug /*dbg*/, + Dwarf_Addr /*pc*/, + Dwarf_Die* /*return_die*/, + Dwarf_Error* /*error*/); + +/* Unimplemented */ +int dwarf_pcsubr(Dwarf_Debug /*dbg*/, + Dwarf_Addr /*pc*/, + Dwarf_Die* /*return_die*/, + Dwarf_Error* /*error*/); + +/* Unimplemented */ +int dwarf_pcscope(Dwarf_Debug /*dbg*/, + Dwarf_Addr /*pc*/, + Dwarf_Die* /*return_die*/, + Dwarf_Error* /*error*/); + +/* operations on DIEs */ +int dwarf_tag(Dwarf_Die /*die*/, + Dwarf_Half* /*return_tag*/, + Dwarf_Error* /*error*/); + +/* utility? */ +/* dwarf_dieoffset returns the global debug_info + section offset, not the CU relative offset. */ +int dwarf_dieoffset(Dwarf_Die /*die*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +/* dwarf_CU_dieoffset_given_die returns + the global debug_info section offset of the CU die + that is the CU containing the given_die + (the passed in DIE can be any DIE). + This information makes it possible for a consumer to + find and print CU context information for any die. + See also dwarf_get_cu_die_offset_given_cu_header_offset(). */ +int dwarf_CU_dieoffset_given_die(Dwarf_Die /*given_die*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +/* dwarf_die_CU_offset returns the CU relative offset + not the global debug_info section offset, given + any DIE in the CU. See also dwarf_CU_dieoffset_given_die(). + */ +int dwarf_die_CU_offset(Dwarf_Die /*die*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_die_CU_offset_range(Dwarf_Die /*die*/, + Dwarf_Off* /*return_CU_header_offset*/, + Dwarf_Off* /*return_CU_length_bytes*/, + Dwarf_Error* /*error*/); + +int dwarf_attr (Dwarf_Die /*die*/, + Dwarf_Half /*attr*/, + Dwarf_Attribute * /*returned_attr*/, + Dwarf_Error* /*error*/); + +int dwarf_diename(Dwarf_Die /*die*/, + char ** /*diename*/, + Dwarf_Error* /*error*/); + +/* Returns the abbrev code of the die. Cannot fail. */ +int dwarf_die_abbrev_code(Dwarf_Die /*die */); + + +/* convenience functions, alternative to using dwarf_attrlist() */ +int dwarf_hasattr(Dwarf_Die /*die*/, + Dwarf_Half /*attr*/, + Dwarf_Bool * /*returned_bool*/, + Dwarf_Error* /*error*/); + +/* dwarf_loclist_n preferred over dwarf_loclist */ +int dwarf_loclist_n(Dwarf_Attribute /*attr*/, + Dwarf_Locdesc*** /*llbuf*/, + Dwarf_Signed * /*locCount*/, + Dwarf_Error* /*error*/); + +int dwarf_loclist(Dwarf_Attribute /*attr*/, /* inflexible! */ + Dwarf_Locdesc** /*llbuf*/, + Dwarf_Signed * /*locCount*/, + Dwarf_Error* /*error*/); + +/* Extracts a dwarf expression from an expression byte stream. + Useful to get expressions from DW_CFA_def_cfa_expression + DW_CFA_expression DW_CFA_val_expression expression bytes. + 27 April 2009: dwarf_loclist_from_expr() interface with + no addr_size is obsolete but supported, + use dwarf_loclist_from_expr_a() instead. +*/ +int dwarf_loclist_from_expr(Dwarf_Debug dbg, + Dwarf_Ptr expression_in, + Dwarf_Unsigned expression_length, + Dwarf_Locdesc ** llbuf, + Dwarf_Signed * listlen, Dwarf_Error * error); + +/* dwarf_loclist_from_expr_a() new 27 Apr 2009: added addr_size argument. */ +int dwarf_loclist_from_expr_a(Dwarf_Debug dbg, + Dwarf_Ptr expression_in, + Dwarf_Unsigned expression_length, + Dwarf_Half addr_size, + Dwarf_Locdesc ** llbuf, + Dwarf_Signed * listlen, Dwarf_Error * error); + +/* Unimplemented */ +int dwarf_stringlen(Dwarf_Die /*die*/, + Dwarf_Locdesc ** /*returned_locdesc*/, + Dwarf_Error* /*error*/); + +/* Unimplemented */ +int dwarf_subscrcnt(Dwarf_Die /*die*/, + Dwarf_Signed * /*returned_count*/, + Dwarf_Error* /*error*/); + +/* Unimplemented */ +int dwarf_nthsubscr(Dwarf_Die /*die*/, + Dwarf_Unsigned /*ssndx*/, + Dwarf_Die * /*returned_die*/, + Dwarf_Error* /*error*/); + +int dwarf_lowpc(Dwarf_Die /*die*/, + Dwarf_Addr * /*returned_addr*/, + Dwarf_Error* /*error*/); + +int dwarf_highpc(Dwarf_Die /*die*/, + Dwarf_Addr * /*returned_addr*/, + Dwarf_Error* /*error*/); + +int dwarf_bytesize(Dwarf_Die /*die*/, + Dwarf_Unsigned * /*returned_size*/, + Dwarf_Error* /*error*/); + +/* Unimplemented */ +int dwarf_isbitfield(Dwarf_Die /*die*/, + Dwarf_Bool * /*returned_bool*/, + Dwarf_Error* /*error*/); + +int dwarf_bitsize(Dwarf_Die /*die*/, + Dwarf_Unsigned * /*returned_size*/, + Dwarf_Error* /*error*/); + +int dwarf_bitoffset(Dwarf_Die /*die*/, + Dwarf_Unsigned * /*returned_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_srclang(Dwarf_Die /*die*/, + Dwarf_Unsigned * /*returned_lang*/, + Dwarf_Error* /*error*/); + +int dwarf_arrayorder(Dwarf_Die /*die*/, + Dwarf_Unsigned * /*returned_order*/, + Dwarf_Error* /*error*/); + +/* end of convenience function list */ + +/* this is the main interface to attributes of a DIE */ +int dwarf_attrlist(Dwarf_Die /*die*/, + Dwarf_Attribute** /*attrbuf*/, + Dwarf_Signed * /*attrcount*/, + Dwarf_Error* /*error*/); + +/* query operations for attributes */ +int dwarf_hasform(Dwarf_Attribute /*attr*/, + Dwarf_Half /*form*/, + Dwarf_Bool * /*returned_bool*/, + Dwarf_Error* /*error*/); + +int dwarf_whatform(Dwarf_Attribute /*attr*/, + Dwarf_Half * /*returned_form*/, + Dwarf_Error* /*error*/); + +int dwarf_whatform_direct(Dwarf_Attribute /*attr*/, + Dwarf_Half * /*returned_form*/, + Dwarf_Error* /*error*/); + +int dwarf_whatattr(Dwarf_Attribute /*attr*/, + Dwarf_Half * /*returned_attr_num*/, + Dwarf_Error* /*error*/); + +/* + The following are concerned with the Primary Interface: getting + the actual data values. One function per 'kind' of FORM. +*/ +/* dwarf_formref returns, thru return_offset, a CU-relative offset + and does not allow DW_FORM_ref_addr*/ +int dwarf_formref(Dwarf_Attribute /*attr*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); +/* dwarf_global_formref returns, thru return_offset, + a debug_info-relative offset and does allow all reference forms*/ +int dwarf_global_formref(Dwarf_Attribute /*attr*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +/* dwarf_formsig8 returns in the caller-provided 8 byte area + the 8 bytes of a DW_FORM_ref_sig8. Not a string. */ +int dwarf_formsig8(Dwarf_Attribute /*attr*/, + Dwarf_Sig8 * /*returned sig bytes*/, + Dwarf_Error* /*error*/); + +int dwarf_formaddr(Dwarf_Attribute /*attr*/, + Dwarf_Addr * /*returned_addr*/, + Dwarf_Error* /*error*/); + +int dwarf_formflag(Dwarf_Attribute /*attr*/, + Dwarf_Bool * /*returned_bool*/, + Dwarf_Error* /*error*/); + +int dwarf_formudata(Dwarf_Attribute /*attr*/, + Dwarf_Unsigned * /*returned_val*/, + Dwarf_Error* /*error*/); + +int dwarf_formsdata(Dwarf_Attribute /*attr*/, + Dwarf_Signed * /*returned_val*/, + Dwarf_Error* /*error*/); + +int dwarf_formblock(Dwarf_Attribute /*attr*/, + Dwarf_Block ** /*returned_block*/, + Dwarf_Error* /*error*/); + +int dwarf_formstring(Dwarf_Attribute /*attr*/, + char ** /*returned_string*/, + Dwarf_Error* /*error*/); + +int dwarf_formexprloc(Dwarf_Attribute /*attr*/, + Dwarf_Unsigned * /*return_exprlen*/, + Dwarf_Ptr * /*block_ptr*/, + Dwarf_Error * /*error*/); + + +/* end attribute query operations. */ + +/* line number operations */ +/* dwarf_srclines is the normal interface */ +int dwarf_srclines(Dwarf_Die /*die*/, + Dwarf_Line** /*linebuf*/, + Dwarf_Signed * /*linecount*/, + Dwarf_Error* /*error*/); + +/* dwarf_srclines_dealloc, created July 2005, is the new + method for deallocating what dwarf_srclines returns. + More complete free than using dwarf_dealloc directly. */ +void dwarf_srclines_dealloc(Dwarf_Debug /*dbg*/, + Dwarf_Line* /*linebuf*/, + Dwarf_Signed /*count */); + + +int dwarf_srcfiles(Dwarf_Die /*die*/, + char*** /*srcfiles*/, + Dwarf_Signed * /*filecount*/, + Dwarf_Error* /*error*/); + +/* Unimplemented. */ +int dwarf_dieline(Dwarf_Die /*die*/, + Dwarf_Line * /*returned_line*/, + Dwarf_Error * /*error*/); + +int dwarf_linebeginstatement(Dwarf_Line /*line*/, + Dwarf_Bool * /*returned_bool*/, + Dwarf_Error* /*error*/); + +int dwarf_lineendsequence(Dwarf_Line /*line*/, + Dwarf_Bool * /*returned_bool*/, + Dwarf_Error* /*error*/); + +int dwarf_lineno(Dwarf_Line /*line*/, + Dwarf_Unsigned * /*returned_lineno*/, + Dwarf_Error* /*error*/); + +int dwarf_line_srcfileno(Dwarf_Line /*line*/, + Dwarf_Unsigned * /*ret_fileno*/, + Dwarf_Error * /*error*/); + +int dwarf_lineaddr(Dwarf_Line /*line*/, + Dwarf_Addr * /*returned_addr*/, + Dwarf_Error* /*error*/); + +int dwarf_lineoff(Dwarf_Line /*line*/, + Dwarf_Signed * /*returned_lineoffset*/, + Dwarf_Error* /*error*/); + +int dwarf_linesrc(Dwarf_Line /*line*/, + char ** /*returned_name*/, + Dwarf_Error* /*error*/); + +int dwarf_lineblock(Dwarf_Line /*line*/, + Dwarf_Bool * /*returned_bool*/, + Dwarf_Error* /*error*/); + +/* tertiary interface to line info */ +/* Unimplemented */ +int dwarf_pclines(Dwarf_Debug /*dbg*/, + Dwarf_Addr /*pc*/, + Dwarf_Line** /*linebuf*/, + Dwarf_Signed * /*linecount*/, + Dwarf_Signed /*slide*/, + Dwarf_Error* /*error*/); +/* end line number operations */ + +/* global name space operations (.debug_pubnames access) */ +int dwarf_get_globals(Dwarf_Debug /*dbg*/, + Dwarf_Global** /*globals*/, + Dwarf_Signed * /*number_of_globals*/, + Dwarf_Error* /*error*/); +void dwarf_globals_dealloc(Dwarf_Debug /*dbg*/, + Dwarf_Global* /*globals*/, + Dwarf_Signed /*number_of_globals*/); + +int dwarf_globname(Dwarf_Global /*glob*/, + char ** /*returned_name*/, + Dwarf_Error* /*error*/); + +int dwarf_global_die_offset(Dwarf_Global /*global*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error * /*error*/); + +/* This returns the CU die global offset if one knows the + CU header global offset. + See also dwarf_CU_dieoffset_given_die(). */ +int dwarf_get_cu_die_offset_given_cu_header_offset( + Dwarf_Debug /*dbg*/, + Dwarf_Off /*in_cu_header_offset*/, + Dwarf_Off * /*out_cu_die_offset*/, + Dwarf_Error * /*err*/); +#ifdef __sgi /* pragma is sgi MIPS only */ +#pragma optional dwarf_get_cu_die_offset_given_cu_header_offset +#endif + +int dwarf_global_cu_offset(Dwarf_Global /*global*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_global_name_offsets(Dwarf_Global /*global*/, + char ** /*returned_name*/, + Dwarf_Off* /*die_offset*/, + Dwarf_Off* /*cu_offset*/, + Dwarf_Error* /*error*/); + +/* Static function name operations. */ +int dwarf_get_funcs(Dwarf_Debug /*dbg*/, + Dwarf_Func** /*funcs*/, + Dwarf_Signed * /*number_of_funcs*/, + Dwarf_Error* /*error*/); +void dwarf_funcs_dealloc(Dwarf_Debug /*dbg*/, + Dwarf_Func* /*funcs*/, + Dwarf_Signed /*number_of_funcs*/); + +int dwarf_funcname(Dwarf_Func /*func*/, + char ** /*returned_name*/, + Dwarf_Error* /*error*/); + +int dwarf_func_die_offset(Dwarf_Func /*func*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_func_cu_offset(Dwarf_Func /*func*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_func_name_offsets(Dwarf_Func /*func*/, + char ** /*returned_name*/, + Dwarf_Off* /*die_offset*/, + Dwarf_Off* /*cu_offset*/, + Dwarf_Error* /*error*/); + +/* User-defined type name operations, SGI IRIX .debug_typenames section. + Same content as DWARF3 .debug_pubtypes, but defined years before + .debug_pubtypes was defined. SGI IRIX only. */ +int dwarf_get_types(Dwarf_Debug /*dbg*/, + Dwarf_Type** /*types*/, + Dwarf_Signed * /*number_of_types*/, + Dwarf_Error* /*error*/); +void dwarf_types_dealloc(Dwarf_Debug /*dbg*/, + Dwarf_Type* /*types*/, + Dwarf_Signed /*number_of_types*/); + + +int dwarf_typename(Dwarf_Type /*type*/, + char ** /*returned_name*/, + Dwarf_Error* /*error*/); + +int dwarf_type_die_offset(Dwarf_Type /*type*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_type_cu_offset(Dwarf_Type /*type*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_type_name_offsets(Dwarf_Type /*type*/, + char ** /*returned_name*/, + Dwarf_Off* /*die_offset*/, + Dwarf_Off* /*cu_offset*/, + Dwarf_Error* /*error*/); + +/* User-defined type name operations, DWARF3 .debug_pubtypes section. +*/ +int dwarf_get_pubtypes(Dwarf_Debug /*dbg*/, + Dwarf_Type** /*types*/, + Dwarf_Signed * /*number_of_types*/, + Dwarf_Error* /*error*/); +void dwarf_pubtypes_dealloc(Dwarf_Debug /*dbg*/, + Dwarf_Type* /*pubtypes*/, + Dwarf_Signed /*number_of_pubtypes*/); + + +int dwarf_pubtypename(Dwarf_Type /*type*/, + char ** /*returned_name*/, + Dwarf_Error* /*error*/); + +int dwarf_pubtype_die_offset(Dwarf_Type /*type*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_pubtype_cu_offset(Dwarf_Type /*type*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_pubtype_name_offsets(Dwarf_Type /*type*/, + char ** /*returned_name*/, + Dwarf_Off* /*die_offset*/, + Dwarf_Off* /*cu_offset*/, + Dwarf_Error* /*error*/); + +/* File-scope static variable name operations. */ +int dwarf_get_vars(Dwarf_Debug /*dbg*/, + Dwarf_Var** /*vars*/, + Dwarf_Signed * /*number_of_vars*/, + Dwarf_Error* /*error*/); +void dwarf_vars_dealloc(Dwarf_Debug /*dbg*/, + Dwarf_Var* /*vars*/, + Dwarf_Signed /*number_of_vars*/); + + +int dwarf_varname(Dwarf_Var /*var*/, + char ** /*returned_name*/, + Dwarf_Error* /*error*/); + +int dwarf_var_die_offset(Dwarf_Var /*var*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_var_cu_offset(Dwarf_Var /*var*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_var_name_offsets(Dwarf_Var /*var*/, + char ** /*returned_name*/, + Dwarf_Off* /*die_offset*/, + Dwarf_Off* /*cu_offset*/, + Dwarf_Error* /*error*/); + +/* weak name operations. */ +int dwarf_get_weaks(Dwarf_Debug /*dbg*/, + Dwarf_Weak** /*weaks*/, + Dwarf_Signed * /*number_of_weaks*/, + Dwarf_Error* /*error*/); +void dwarf_weaks_dealloc(Dwarf_Debug /*dbg*/, + Dwarf_Weak* /*weaks*/, + Dwarf_Signed /*number_of_weaks*/); + + +int dwarf_weakname(Dwarf_Weak /*weak*/, + char ** /*returned_name*/, + Dwarf_Error* /*error*/); + +int dwarf_weak_die_offset(Dwarf_Weak /*weak*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_weak_cu_offset(Dwarf_Weak /*weak*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_weak_name_offsets(Dwarf_Weak /*weak*/, + char ** /*returned_name*/, + Dwarf_Off* /*die_offset*/, + Dwarf_Off* /*cu_offset*/, + Dwarf_Error* /*error*/); + +/* location list section operation. (.debug_loc access) */ +int dwarf_get_loclist_entry(Dwarf_Debug /*dbg*/, + Dwarf_Unsigned /*offset*/, + Dwarf_Addr* /*hipc*/, + Dwarf_Addr* /*lopc*/, + Dwarf_Ptr* /*data*/, + Dwarf_Unsigned* /*entry_len*/, + Dwarf_Unsigned* /*next_entry*/, + Dwarf_Error* /*error*/); + +/* abbreviation section operations */ +int dwarf_get_abbrev(Dwarf_Debug /*dbg*/, + Dwarf_Unsigned /*offset*/, + Dwarf_Abbrev * /*returned_abbrev*/, + Dwarf_Unsigned* /*length*/, + Dwarf_Unsigned* /*attr_count*/, + Dwarf_Error* /*error*/); + +int dwarf_get_abbrev_tag(Dwarf_Abbrev /*abbrev*/, + Dwarf_Half* /*return_tag_number*/, + Dwarf_Error* /*error*/); +int dwarf_get_abbrev_code(Dwarf_Abbrev /*abbrev*/, + Dwarf_Unsigned* /*return_code_number*/, + Dwarf_Error* /*error*/); + +int dwarf_get_abbrev_children_flag(Dwarf_Abbrev /*abbrev*/, + Dwarf_Signed* /*return_flag*/, + Dwarf_Error* /*error*/); + +int dwarf_get_abbrev_entry(Dwarf_Abbrev /*abbrev*/, + Dwarf_Signed /*index*/, + Dwarf_Half * /*returned_attr_num*/, + Dwarf_Signed* /*form*/, + Dwarf_Off* /*offset*/, + Dwarf_Error* /*error*/); + +/* consumer string section operation */ +int dwarf_get_str(Dwarf_Debug /*dbg*/, + Dwarf_Off /*offset*/, + char** /*string*/, + Dwarf_Signed * /*strlen_of_string*/, + Dwarf_Error* /*error*/); + +/* Consumer op on gnu .eh_frame info */ +int dwarf_get_fde_list_eh( + Dwarf_Debug /*dbg*/, + Dwarf_Cie** /*cie_data*/, + Dwarf_Signed* /*cie_element_count*/, + Dwarf_Fde** /*fde_data*/, + Dwarf_Signed* /*fde_element_count*/, + Dwarf_Error* /*error*/); + + +/* consumer operations on frame info: .debug_frame */ +int dwarf_get_fde_list(Dwarf_Debug /*dbg*/, + Dwarf_Cie** /*cie_data*/, + Dwarf_Signed* /*cie_element_count*/, + Dwarf_Fde** /*fde_data*/, + Dwarf_Signed* /*fde_element_count*/, + Dwarf_Error* /*error*/); + +/* Release storage gotten by dwarf_get_fde_list_eh() or + dwarf_get_fde_list() */ +void dwarf_fde_cie_list_dealloc(Dwarf_Debug dbg, + Dwarf_Cie *cie_data, + Dwarf_Signed cie_element_count, + Dwarf_Fde *fde_data, + Dwarf_Signed fde_element_count); + + + +int dwarf_get_fde_range(Dwarf_Fde /*fde*/, + Dwarf_Addr* /*low_pc*/, + Dwarf_Unsigned* /*func_length*/, + Dwarf_Ptr* /*fde_bytes*/, + Dwarf_Unsigned* /*fde_byte_length*/, + Dwarf_Off* /*cie_offset*/, + Dwarf_Signed* /*cie_index*/, + Dwarf_Off* /*fde_offset*/, + Dwarf_Error* /*error*/); + +/* Useful for IRIX only: see dwarf_get_cie_augmentation_data() + dwarf_get_fde_augmentation_data() for GNU .eh_frame. */ +int dwarf_get_fde_exception_info(Dwarf_Fde /*fde*/, + Dwarf_Signed* /* offset_into_exception_tables */, + Dwarf_Error* /*error*/); + + +int dwarf_get_cie_of_fde(Dwarf_Fde /*fde*/, + Dwarf_Cie * /*cie_returned*/, + Dwarf_Error* /*error*/); + +int dwarf_get_cie_info(Dwarf_Cie /*cie*/, + Dwarf_Unsigned * /*bytes_in_cie*/, + Dwarf_Small* /*version*/, + char ** /*augmenter*/, + Dwarf_Unsigned* /*code_alignment_factor*/, + Dwarf_Signed* /*data_alignment_factor*/, + Dwarf_Half* /*return_address_register_rule*/, + Dwarf_Ptr* /*initial_instructions*/, + Dwarf_Unsigned* /*initial_instructions_length*/, + Dwarf_Error* /*error*/); + +/* dwarf_get_cie_index new September 2009. */ +int dwarf_get_cie_index( + Dwarf_Cie /*cie*/, + Dwarf_Signed* /*index*/, + Dwarf_Error* /*error*/ ); + + +int dwarf_get_fde_instr_bytes(Dwarf_Fde /*fde*/, + Dwarf_Ptr * /*outinstrs*/, Dwarf_Unsigned * /*outlen*/, + Dwarf_Error * /*error*/); + +int dwarf_get_fde_info_for_all_regs(Dwarf_Fde /*fde*/, + Dwarf_Addr /*pc_requested*/, + Dwarf_Regtable* /*reg_table*/, + Dwarf_Addr* /*row_pc*/, + Dwarf_Error* /*error*/); + +int dwarf_get_fde_info_for_all_regs3(Dwarf_Fde /*fde*/, + Dwarf_Addr /*pc_requested*/, + Dwarf_Regtable3* /*reg_table*/, + Dwarf_Addr* /*row_pc*/, + Dwarf_Error* /*error*/); + +/* In this older interface DW_FRAME_CFA_COL is a meaningful + column (which does not work well with DWARF3 or + non-MIPS architectures). */ +int dwarf_get_fde_info_for_reg(Dwarf_Fde /*fde*/, + Dwarf_Half /*table_column*/, + Dwarf_Addr /*pc_requested*/, + Dwarf_Signed* /*offset_relevant*/, + Dwarf_Signed* /*register*/, + Dwarf_Signed* /*offset*/, + Dwarf_Addr* /*row_pc*/, + Dwarf_Error* /*error*/); + +/* See discussion of dw_value_type, libdwarf.h. + Use of DW_FRAME_CFA_COL is not meaningful in this interface. + See dwarf_get_fde_info_for_cfa_reg3(). +*/ +/* dwarf_get_fde_info_for_reg3 is useful on a single column, but + it is inefficient to iterate across all table_columns using this + function. Instead call dwarf_get_fde_info_for_all_regs3() and index + into the table it fills in. */ +int dwarf_get_fde_info_for_reg3(Dwarf_Fde /*fde*/, + Dwarf_Half /*table_column*/, + Dwarf_Addr /*pc_requested*/, + Dwarf_Small * /*value_type*/, + Dwarf_Signed * /*offset_relevant*/, + Dwarf_Signed* /*register*/, + Dwarf_Signed* /*offset_or_block_len*/, + Dwarf_Ptr * /*block_ptr */, + Dwarf_Addr* /*row_pc_out*/, + Dwarf_Error* /*error*/); + +/* Use this to get the cfa. */ +int dwarf_get_fde_info_for_cfa_reg3(Dwarf_Fde /*fde*/, + Dwarf_Addr /*pc_requested*/, + Dwarf_Small * /*value_type*/, + Dwarf_Signed * /*offset_relevant*/, + Dwarf_Signed* /*register*/, + Dwarf_Signed* /*offset_or_block_len*/, + Dwarf_Ptr * /*block_ptr */, + Dwarf_Addr* /*row_pc_out*/, + Dwarf_Error* /*error*/); + +int dwarf_get_fde_for_die(Dwarf_Debug /*dbg*/, + Dwarf_Die /*subr_die */, + Dwarf_Fde * /*returned_fde*/, + Dwarf_Error* /*error*/); + +int dwarf_get_fde_n(Dwarf_Fde* /*fde_data*/, + Dwarf_Unsigned /*fde_index*/, + Dwarf_Fde * /*returned_fde*/, + Dwarf_Error* /*error*/); + +int dwarf_get_fde_at_pc(Dwarf_Fde* /*fde_data*/, + Dwarf_Addr /*pc_of_interest*/, + Dwarf_Fde * /*returned_fde*/, + Dwarf_Addr* /*lopc*/, + Dwarf_Addr* /*hipc*/, + Dwarf_Error* /*error*/); + +/* GNU .eh_frame augmentation information, raw form, see + Linux Standard Base Core Specification version 3.0 . */ +int dwarf_get_cie_augmentation_data(Dwarf_Cie /* cie*/, + Dwarf_Small ** /* augdata */, + Dwarf_Unsigned * /* augdata_len */, + Dwarf_Error* /*error*/); +/* GNU .eh_frame augmentation information, raw form, see + Linux Standard Base Core Specification version 3.0 . */ +int dwarf_get_fde_augmentation_data(Dwarf_Fde /* fde*/, + Dwarf_Small ** /* augdata */, + Dwarf_Unsigned * /* augdata_len */, + Dwarf_Error* /*error*/); + +int dwarf_expand_frame_instructions(Dwarf_Cie /*cie*/, + Dwarf_Ptr /*instruction*/, + Dwarf_Unsigned /*i_length*/, + Dwarf_Frame_Op** /*returned_op_list*/, + Dwarf_Signed* /*op_count*/, + Dwarf_Error* /*error*/); + +/* Operations on .debug_aranges. */ +int dwarf_get_aranges(Dwarf_Debug /*dbg*/, + Dwarf_Arange** /*aranges*/, + Dwarf_Signed * /*arange_count*/, + Dwarf_Error* /*error*/); + + + +int dwarf_get_arange( + Dwarf_Arange* /*aranges*/, + Dwarf_Unsigned /*arange_count*/, + Dwarf_Addr /*address*/, + Dwarf_Arange * /*returned_arange*/, + Dwarf_Error* /*error*/); + +int dwarf_get_cu_die_offset( + Dwarf_Arange /*arange*/, + Dwarf_Off* /*return_offset*/, + Dwarf_Error* /*error*/); + +int dwarf_get_arange_cu_header_offset( + Dwarf_Arange /*arange*/, + Dwarf_Off* /*return_cu_header_offset*/, + Dwarf_Error* /*error*/); +#ifdef __sgi /* pragma is sgi MIPS only */ +#pragma optional dwarf_get_arange_cu_header_offset +#endif + +/* DWARF2,3 interface. No longer really adequate (it was never + right for segmented address spaces, please switch + to using dwarf_get_arange_info_b instead. + There is no effective difference between these + functions if the address space + of the target is not segmented. */ +int dwarf_get_arange_info( + Dwarf_Arange /*arange*/, + Dwarf_Addr* /*start*/, + Dwarf_Unsigned* /*length*/, + Dwarf_Off* /*cu_die_offset*/, + Dwarf_Error* /*error*/ ); + +/* New for DWARF4, entries may have segment information. + *segment is only meaningful if *segment_entry_size is non-zero. */ +int dwarf_get_arange_info_b( + Dwarf_Arange /*arange*/, + Dwarf_Unsigned* /*segment*/, + Dwarf_Unsigned* /*segment_entry_size*/, + Dwarf_Addr * /*start*/, + Dwarf_Unsigned* /*length*/, + Dwarf_Off * /*cu_die_offset*/, + Dwarf_Error * /*error*/ ); + + +/* consumer .debug_macinfo information interface. +*/ +struct Dwarf_Macro_Details_s { + Dwarf_Off dmd_offset; /* offset, in the section, + of this macro info */ + Dwarf_Small dmd_type; /* the type, DW_MACINFO_define etc*/ + Dwarf_Signed dmd_lineno; /* the source line number where + applicable and vend_def # if + vendor_extension op + */ + + Dwarf_Signed dmd_fileindex;/* the source file index: + applies to define undef start_file + */ + char * dmd_macro; /* macro name (with value for defineop) + string from vendor ext + */ +}; + +/* dwarf_print_lines is for use by dwarfdump: it prints + line info to stdout. + The _dwarf name is obsolete. Use dwarf_ instead. + Added extra argnument 2/2009 for better checking. +*/ +int _dwarf_print_lines(Dwarf_Die /*cu_die*/,Dwarf_Error * /*error*/); +int dwarf_print_lines(Dwarf_Die /*cu_die*/,Dwarf_Error * /*error*/, + int * /*error_count_out */); + +/* dwarf_check_lineheader lets dwarfdump get detailed messages + about some compiler errors we detect. + We return the count of detected errors throught the + pointer. +*/ +void dwarf_check_lineheader(Dwarf_Die /*cu_die*/,int *errcount_out); + +/* dwarf_ld_sort_lines helps SGI IRIX ld + rearrange lines in .debug_line in a .o created with a text + section per function. + -OPT:procedure_reorder=ON + where ld-cord (cord(1)ing by ld, + not by cord(1)) may have changed the function order. + The _dwarf name is obsolete. Use dwarf_ instead. +*/ +int _dwarf_ld_sort_lines( + void * /*orig_buffer*/, + unsigned long /* buffer_len*/, + int /*is_64_bit*/, + int * /*any_change*/, + int * /*err_code*/); +int dwarf_ld_sort_lines( + void * /*orig_buffer*/, + unsigned long /*buffer_len*/, + int /*is_64_bit*/, + int * /*any_change*/, + int * /*err_code*/); + +/* Used by dwarfdump -v to print fde offsets from debugging + info. + The _dwarf name is obsolete. Use dwarf_ instead. +*/ +int _dwarf_fde_section_offset(Dwarf_Debug dbg, + Dwarf_Fde /*in_fde*/, + Dwarf_Off * /*fde_off*/, + Dwarf_Off * /*cie_off*/, + Dwarf_Error * /*err*/); +int dwarf_fde_section_offset(Dwarf_Debug dbg, + Dwarf_Fde /*in_fde*/, + Dwarf_Off * /*fde_off*/, + Dwarf_Off * /*cie_off*/, + Dwarf_Error * /*err*/); + +/* Used by dwarfdump -v to print cie offsets from debugging + info. + The _dwarf name is obsolete. Use dwarf_ instead. +*/ +int dwarf_cie_section_offset(Dwarf_Debug /*dbg*/, + Dwarf_Cie /*in_cie*/, + Dwarf_Off * /*cie_off */, + Dwarf_Error * /*err*/); +int _dwarf_cie_section_offset(Dwarf_Debug /*dbg*/, + Dwarf_Cie /*in_cie*/, + Dwarf_Off * /*cie_off*/, + Dwarf_Error * /*err*/); + +typedef struct Dwarf_Macro_Details_s Dwarf_Macro_Details; + +int dwarf_get_macro(Dwarf_Debug /*dbg*/, + char * /*requested_macro_name*/, + Dwarf_Addr /*pc_of_request*/, + char ** /*returned_macro_value*/, + Dwarf_Error * /*error*/); + +int dwarf_get_all_defined_macros(Dwarf_Debug /*dbg*/, + Dwarf_Addr /*pc_of_request*/, + Dwarf_Signed * /*returned_count*/, + char *** /*returned_pointers_to_macros*/, + Dwarf_Error * /*error*/); + +char *dwarf_find_macro_value_start(char * /*macro_string*/); + +int dwarf_get_macro_details(Dwarf_Debug /*dbg*/, + Dwarf_Off /*macro_offset*/, + Dwarf_Unsigned /*maximum_count*/, + Dwarf_Signed * /*entry_count*/, + Dwarf_Macro_Details ** /*details*/, + Dwarf_Error * /*err*/); + + +int dwarf_get_address_size(Dwarf_Debug /*dbg*/, + Dwarf_Half * /*addr_size*/, + Dwarf_Error * /*error*/); + +/* The dwarf specification separates FORMs into +different classes. To do the seperation properly +requires 4 pieces of data as of DWARF4 (thus the +function arguments listed here). +The DWARF4 specification class definition suffices to +describe all DWARF versions. +See section 7.5.4, Attribute Encodings. +A return of DW_FORM_CLASS_UNKNOWN means we could not properly figure +out what form-class it is. + + DW_FORM_CLASS_FRAMEPTR is MIPS/IRIX only, and refers + to the DW_AT_MIPS_fde attribute (a reference to the + .debug_frame section). +*/ +enum Dwarf_Form_Class { + DW_FORM_CLASS_UNKNOWN, DW_FORM_CLASS_ADDRESS, + DW_FORM_CLASS_BLOCK, DW_FORM_CLASS_CONSTANT, + DW_FORM_CLASS_EXPRLOC, DW_FORM_CLASS_FLAG, + DW_FORM_CLASS_LINEPTR, DW_FORM_CLASS_LOCLISTPTR, + DW_FORM_CLASS_MACPTR, DW_FORM_CLASS_RANGELISTPTR, + DW_FORM_CLASS_REFERENCE, DW_FORM_CLASS_STRING, + DW_FORM_CLASS_FRAMEPTR +}; + +enum Dwarf_Form_Class dwarf_get_form_class( + Dwarf_Half /* dwversion */, + Dwarf_Half /* attrnum */, + Dwarf_Half /*offset_size */, + Dwarf_Half /*form*/); + +/* utility operations */ +Dwarf_Unsigned dwarf_errno(Dwarf_Error /*error*/); + +char* dwarf_errmsg(Dwarf_Error /*error*/); + +/* stringcheck zero is default and means do all +** string length validity checks. +** Call with parameter value 1 to turn off many such checks (and +** increase performance). +** Call with zero for safest running. +** Actual value saved and returned is only 8 bits! Upper bits +** ignored by libdwarf (and zero on return). +** Returns previous value. +*/ +int dwarf_set_stringcheck(int /*stringcheck*/); + +/* 'apply' defaults to 1 and means do all + * 'rela' relocations on reading in a dwarf object section with + * such relocations. + * Call with parameter value 0 to turn off application of + * such relocations. + * Since the static linker leaves 'bogus' data in object sections + * with a 'rela' relocation section such data cannot be read + * sensibly without processing the relocations. Such relocations + * do not exist in executables and shared objects (.so), the + * relocations only exist in plain .o relocatable object files. + * Actual value saved and returned is only 8 bits! Upper bits + * ignored by libdwarf (and zero on return). + * Returns previous value. + * */ +int dwarf_set_reloc_application(int /*apply*/); + + +/* Unimplemented */ +Dwarf_Handler dwarf_seterrhand(Dwarf_Debug /*dbg*/, Dwarf_Handler /*errhand*/); + +/* Unimplemented */ +Dwarf_Ptr dwarf_seterrarg(Dwarf_Debug /*dbg*/, Dwarf_Ptr /*errarg*/); + +void dwarf_dealloc(Dwarf_Debug /*dbg*/, void* /*space*/, + Dwarf_Unsigned /*type*/); + +/* DWARF Producer Interface */ + +typedef int (*Dwarf_Callback_Func)( + char* /*name*/, + int /*size*/, + Dwarf_Unsigned /*type*/, + Dwarf_Unsigned /*flags*/, + Dwarf_Unsigned /*link*/, + Dwarf_Unsigned /*info*/, + int* /*sect name index*/, + int* /*error*/); + +Dwarf_P_Debug dwarf_producer_init( + Dwarf_Unsigned /*creation_flags*/, + Dwarf_Callback_Func /*func*/, + Dwarf_Handler /*errhand*/, + Dwarf_Ptr /*errarg*/, + Dwarf_Error* /*error*/); + +typedef int (*Dwarf_Callback_Func_b)( + char* /*name*/, + int /*size*/, + Dwarf_Unsigned /*type*/, + Dwarf_Unsigned /*flags*/, + Dwarf_Unsigned /*link*/, + Dwarf_Unsigned /*info*/, + Dwarf_Unsigned* /*sect_name_index*/, + int* /*error*/); + + +Dwarf_P_Debug dwarf_producer_init_b( + Dwarf_Unsigned /*flags*/, + Dwarf_Callback_Func_b /*func*/, + Dwarf_Handler /*errhand*/, + Dwarf_Ptr /*errarg*/, + Dwarf_Error * /*error*/); + + +Dwarf_Signed dwarf_transform_to_disk_form(Dwarf_P_Debug /*dbg*/, + Dwarf_Error* /*error*/); + +Dwarf_Ptr dwarf_get_section_bytes(Dwarf_P_Debug /*dbg*/, + Dwarf_Signed /*dwarf_section*/, + Dwarf_Signed* /*elf_section_index*/, + Dwarf_Unsigned* /*length*/, + Dwarf_Error* /*error*/); + +int dwarf_get_relocation_info_count( + Dwarf_P_Debug /*dbg*/, + Dwarf_Unsigned * /*count_of_relocation_sections*/, + int * /*drd_buffer_version*/, + Dwarf_Error* /*error*/); + +int dwarf_get_relocation_info( + Dwarf_P_Debug /*dbg*/, + Dwarf_Signed * /*elf_section_index*/, + Dwarf_Signed * /*elf_section_index_link*/, + Dwarf_Unsigned * /*relocation_buffer_count*/, + Dwarf_Relocation_Data * /*reldata_buffer*/, + Dwarf_Error* /*error*/); + +/* v1: no drd_length field, enum explicit */ +/* v2: has the drd_length field, enum value in uchar member */ +#define DWARF_DRD_BUFFER_VERSION 2 + +Dwarf_Signed dwarf_get_die_markers( + Dwarf_P_Debug /*dbg*/, + Dwarf_P_Marker * /*marker_list*/, + Dwarf_Unsigned * /*marker_count*/, + Dwarf_Error * /*error*/); + +int dwarf_get_string_attributes_count(Dwarf_P_Debug, + Dwarf_Unsigned *, + int *, + Dwarf_Error *); + +int dwarf_get_string_attributes_info(Dwarf_P_Debug, + Dwarf_Signed *, + Dwarf_Unsigned *, + Dwarf_P_String_Attr *, + Dwarf_Error *); + +void dwarf_reset_section_bytes(Dwarf_P_Debug /*dbg*/); + +Dwarf_Unsigned dwarf_producer_finish(Dwarf_P_Debug /*dbg*/, + Dwarf_Error* /*error*/); + +/* Producer attribute addition functions. */ +Dwarf_P_Attribute dwarf_add_AT_targ_address(Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*ownerdie*/, + Dwarf_Half /*attr*/, + Dwarf_Unsigned /*pc_value*/, + Dwarf_Signed /*sym_index*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_block(Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*ownerdie*/, + Dwarf_Half /*attr*/, + Dwarf_Small* /*block_data*/, + Dwarf_Unsigned /*block_len*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_targ_address_b(Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*ownerdie*/, + Dwarf_Half /*attr*/, + Dwarf_Unsigned /*pc_value*/, + Dwarf_Unsigned /*sym_index*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_ref_address(Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*ownerdie*/, + Dwarf_Half /*attr*/, + Dwarf_Unsigned /*pc_value*/, + Dwarf_Unsigned /*sym_index*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_unsigned_const(Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*ownerdie*/, + Dwarf_Half /*attr*/, + Dwarf_Unsigned /*value*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_signed_const(Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*ownerdie*/, + Dwarf_Half /*attr*/, + Dwarf_Signed /*value*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_reference(Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*ownerdie*/, + Dwarf_Half /*attr*/, + Dwarf_P_Die /*otherdie*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_dataref( + Dwarf_P_Debug /* dbg*/, + Dwarf_P_Die /*ownerdie*/, + Dwarf_Half /*attr*/, + Dwarf_Unsigned /*pcvalue*/, + Dwarf_Unsigned /*sym_index*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_const_value_string(Dwarf_P_Die /*ownerdie*/, + char* /*string_value*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_location_expr(Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*ownerdie*/, + Dwarf_Half /*attr*/, + Dwarf_P_Expr /*loc_expr*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_string(Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*ownerdie*/, + Dwarf_Half /*attr*/, + char* /*string*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_flag(Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*ownerdie*/, + Dwarf_Half /*attr*/, + Dwarf_Small /*flag*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_producer(Dwarf_P_Die /*ownerdie*/, + char* /*producer_string*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_const_value_signedint(Dwarf_P_Die /*ownerdie*/, + Dwarf_Signed /*signed_value*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_const_value_unsignedint( + Dwarf_P_Die /*ownerdie*/, + Dwarf_Unsigned /*unsigned_value*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_comp_dir(Dwarf_P_Die /*ownerdie*/, + char* /*current_working_directory*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Attribute dwarf_add_AT_name(Dwarf_P_Die /*die*/, + char* /*name*/, + Dwarf_Error* /*error*/); + +/* Producer line creation functions (.debug_line) */ +Dwarf_Unsigned dwarf_add_directory_decl(Dwarf_P_Debug /*dbg*/, + char* /*name*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_file_decl(Dwarf_P_Debug /*dbg*/, + char* /*name*/, + Dwarf_Unsigned /*dir_index*/, + Dwarf_Unsigned /*time_last_modified*/, + Dwarf_Unsigned /*length*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_line_entry(Dwarf_P_Debug /*dbg*/, + Dwarf_Unsigned /*file_index*/, + Dwarf_Addr /*code_address*/, + Dwarf_Unsigned /*lineno*/, + Dwarf_Signed /*column_number*/, + Dwarf_Bool /*is_source_stmt_begin*/, + Dwarf_Bool /*is_basic_block_begin*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_lne_set_address(Dwarf_P_Debug /*dbg*/, + Dwarf_Unsigned /*offset*/, + Dwarf_Unsigned /*symbol_index*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_lne_end_sequence(Dwarf_P_Debug /*dbg*/, + Dwarf_Addr /*end_address*/, + Dwarf_Error* /*error*/); + +/* Producer .debug_frame functions */ +Dwarf_Unsigned dwarf_add_frame_cie(Dwarf_P_Debug /*dbg*/, + char* /*augmenter*/, + Dwarf_Small /*code_alignent_factor*/, + Dwarf_Small /*data_alignment_factor*/, + Dwarf_Small /*return_address_reg*/, + Dwarf_Ptr /*initialization_bytes*/, + Dwarf_Unsigned /*init_byte_len*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_frame_fde( + Dwarf_P_Debug /*dbg*/, + Dwarf_P_Fde /*fde*/, + Dwarf_P_Die /*corresponding subprogram die*/, + Dwarf_Unsigned /*cie_to_use*/, + Dwarf_Unsigned /*virt_addr_of_described_code*/, + Dwarf_Unsigned /*length_of_code*/, + Dwarf_Unsigned /*symbol_index*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_frame_fde_b( + Dwarf_P_Debug /*dbg*/, + Dwarf_P_Fde /*fde*/, + Dwarf_P_Die /*die*/, + Dwarf_Unsigned /*cie*/, + Dwarf_Addr /*virt_addr*/, + Dwarf_Unsigned /*code_len*/, + Dwarf_Unsigned /*sym_idx*/, + Dwarf_Unsigned /*sym_idx_of_end*/, + Dwarf_Addr /*offset_from_end_sym*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_frame_info_b( + Dwarf_P_Debug dbg /*dbg*/, + Dwarf_P_Fde /*fde*/, + Dwarf_P_Die /*die*/, + Dwarf_Unsigned /*cie*/, + Dwarf_Addr /*virt_addr*/, + Dwarf_Unsigned /*code_len*/, + Dwarf_Unsigned /*symidx*/, + Dwarf_Unsigned /*end_symbol */, + Dwarf_Addr /*offset_from_end_symbol */, + Dwarf_Signed /*offset_into_exception_tables*/, + Dwarf_Unsigned /*exception_table_symbol*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_frame_info( + Dwarf_P_Debug dbg /*dbg*/, + Dwarf_P_Fde /*fde*/, + Dwarf_P_Die /*die*/, + Dwarf_Unsigned /*cie*/, + Dwarf_Addr /*virt_addr*/, + Dwarf_Unsigned /*code_len*/, + Dwarf_Unsigned /*symidx*/, + Dwarf_Signed /*offset_into_exception_tables*/, + Dwarf_Unsigned /*exception_table_symbol*/, + Dwarf_Error* /*error*/); + +Dwarf_P_Fde dwarf_add_fde_inst( + Dwarf_P_Fde /*fde*/, + Dwarf_Small /*op*/, + Dwarf_Unsigned /*val1*/, + Dwarf_Unsigned /*val2*/, + Dwarf_Error* /*error*/); + +/* New September 17, 2009 */ +int dwarf_insert_fde_inst_bytes( + Dwarf_P_Debug /*dbg*/, + Dwarf_P_Fde /*fde*/, + Dwarf_Unsigned /*len*/, + Dwarf_Ptr /*ibytes*/, + Dwarf_Error* /*error*/); + + +Dwarf_P_Fde dwarf_new_fde(Dwarf_P_Debug /*dbg*/, Dwarf_Error* /*error*/); + +Dwarf_P_Fde dwarf_fde_cfa_offset( + Dwarf_P_Fde /*fde*/, + Dwarf_Unsigned /*register_number*/, + Dwarf_Signed /*offset*/, + Dwarf_Error* /*error*/); + +/* die creation & addition routines */ +Dwarf_P_Die dwarf_new_die( + Dwarf_P_Debug /*dbg*/, + Dwarf_Tag /*tag*/, + Dwarf_P_Die /*parent*/, + Dwarf_P_Die /*child*/, + Dwarf_P_Die /*left */, + Dwarf_P_Die /*right*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_die_to_debug( + Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*die*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_die_marker( + Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*die*/, + Dwarf_Unsigned /*marker*/, + Dwarf_Error * /*error*/); + +Dwarf_Unsigned dwarf_get_die_marker( + Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*die*/, + Dwarf_Unsigned * /*marker*/, + Dwarf_Error * /*error*/); + +Dwarf_P_Die dwarf_die_link( + Dwarf_P_Die /*die*/, + Dwarf_P_Die /*parent*/, + Dwarf_P_Die /*child*/, + Dwarf_P_Die /*left*/, + Dwarf_P_Die /*right*/, + Dwarf_Error* /*error*/); + +void dwarf_dealloc_compressed_block( + Dwarf_P_Debug, + void * +); + +/* Call this passing in return value from dwarf_uncompress_integer_block() + * to free the space the decompression allocated. */ +void dwarf_dealloc_uncompressed_block( + Dwarf_Debug, + void * +); + +void * dwarf_compress_integer_block( + Dwarf_P_Debug, /* dbg */ + Dwarf_Bool, /* signed==true (or unsigned) */ + Dwarf_Small, /* size of integer units: 8, 16, 32, 64 */ + void*, /* data */ + Dwarf_Unsigned, /* number of elements */ + Dwarf_Unsigned*, /* number of bytes in output block */ + Dwarf_Error* /* error */ +); + +/* Decode an array of signed leb integers (so of course the + * array is not composed of fixed length values, but is instead + * a sequence of sleb values). + * Returns a DW_DLV_BADADDR on error. + * Otherwise returns a pointer to an array of 32bit integers. + * The signed argument must be non-zero (the decode + * assumes sleb integers in the input data) at this time. + * Size of integer units must be 32 (32 bits each) at this time. + * Number of bytes in block is a byte count (not array count). + * Returns number of units in output block (ie, number of elements + * of the array that the return value points to) thru the argument. + */ +void * dwarf_uncompress_integer_block( + Dwarf_Debug, /* dbg */ + Dwarf_Bool, /* signed==true (or unsigned) */ + Dwarf_Small, /* size of integer units: 8, 16, 32, 64 */ + void*, /* input data */ + Dwarf_Unsigned, /* number of bytes in input */ + Dwarf_Unsigned*, /* number of units in output block */ + Dwarf_Error* /* error */ +); + +/* Operations to create location expressions. */ +Dwarf_P_Expr dwarf_new_expr(Dwarf_P_Debug /*dbg*/, Dwarf_Error* /*error*/); + +void dwarf_expr_reset( + Dwarf_P_Expr /*expr*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_expr_gen( + Dwarf_P_Expr /*expr*/, + Dwarf_Small /*opcode*/, + Dwarf_Unsigned /*val1*/, + Dwarf_Unsigned /*val2*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_expr_addr( + Dwarf_P_Expr /*expr*/, + Dwarf_Unsigned /*addr*/, + Dwarf_Signed /*sym_index*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_expr_addr_b( + Dwarf_P_Expr /*expr*/, + Dwarf_Unsigned /*addr*/, + Dwarf_Unsigned /*sym_index*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_expr_current_offset( + Dwarf_P_Expr /*expr*/, + Dwarf_Error* /*error*/); + +Dwarf_Addr dwarf_expr_into_block( + Dwarf_P_Expr /*expr*/, + Dwarf_Unsigned* /*length*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_arange(Dwarf_P_Debug /*dbg*/, + Dwarf_Addr /*begin_address*/, + Dwarf_Unsigned /*length*/, + Dwarf_Signed /*symbol_index*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_arange_b( + Dwarf_P_Debug /*dbg*/, + Dwarf_Addr /*begin_address*/, + Dwarf_Unsigned /*length*/, + Dwarf_Unsigned /*symbol_index*/, + Dwarf_Unsigned /*end_symbol_index*/, + Dwarf_Addr /*offset_from_end_symbol*/, + Dwarf_Error * /*error*/); + +Dwarf_Unsigned dwarf_add_pubname( + Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*die*/, + char* /*pubname_name*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_funcname( + Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*die*/, + char* /*func_name*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_typename( + Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*die*/, + char* /*type_name*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_varname( + Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*die*/, + char* /*var_name*/, + Dwarf_Error* /*error*/); + +Dwarf_Unsigned dwarf_add_weakname( + Dwarf_P_Debug /*dbg*/, + Dwarf_P_Die /*die*/, + char* /*weak_name*/, + Dwarf_Error* /*error*/); + +/* .debug_macinfo producer functions + Functions must be called in right order: the section is output + In the order these are presented. +*/ +int dwarf_def_macro(Dwarf_P_Debug /*dbg*/, + Dwarf_Unsigned /*line*/, + char * /*macname, with (arglist), no space before (*/, + char * /*macvalue*/, + Dwarf_Error* /*error*/); + +int dwarf_undef_macro(Dwarf_P_Debug /*dbg*/, + Dwarf_Unsigned /*line*/, + char * /*macname, no arglist, of course*/, + Dwarf_Error* /*error*/); + +int dwarf_start_macro_file(Dwarf_P_Debug /*dbg*/, + Dwarf_Unsigned /*fileindex*/, + Dwarf_Unsigned /*linenumber*/, + Dwarf_Error* /*error*/); + +int dwarf_end_macro_file(Dwarf_P_Debug /*dbg*/, + Dwarf_Error* /*error*/); + +int dwarf_vendor_ext(Dwarf_P_Debug /*dbg*/, + Dwarf_Unsigned /*constant*/, + char * /*string*/, + Dwarf_Error* /*error*/); + +/* end macinfo producer functions */ + +int dwarf_attr_offset(Dwarf_Die /*die*/, + Dwarf_Attribute /*attr of above die*/, + Dwarf_Off * /*returns offset thru this ptr */, + Dwarf_Error * /*error*/); + +/* This is a hack so clients can verify offsets. + Added April 2005 so that debugger can detect broken offsets + (which happened in an IRIX executable larger than 2GB + with MIPSpro 7.3.1.3 toolchain.). +*/ +int +dwarf_get_section_max_offsets(Dwarf_Debug /*dbg*/, + Dwarf_Unsigned * /*debug_info_size*/, + Dwarf_Unsigned * /*debug_abbrev_size*/, + Dwarf_Unsigned * /*debug_line_size*/, + Dwarf_Unsigned * /*debug_loc_size*/, + Dwarf_Unsigned * /*debug_aranges_size*/, + Dwarf_Unsigned * /*debug_macinfo_size*/, + Dwarf_Unsigned * /*debug_pubnames_size*/, + Dwarf_Unsigned * /*debug_str_size*/, + Dwarf_Unsigned * /*debug_frame_size*/, + Dwarf_Unsigned * /*debug_ranges_size*/, + Dwarf_Unsigned * /*debug_pubtypes_size*/); + +/* Multiple releases spelled 'initial' as 'inital' . + The 'inital' spelling should not be used. */ +Dwarf_Half dwarf_set_frame_rule_inital_value(Dwarf_Debug /*dbg*/, + Dwarf_Half /*value*/); +/* Additional interface with correct 'initial' spelling. */ +/* It is likely you will want to call the following 5 functions + before accessing any frame information. All are useful + to tailor handling of pseudo-registers needed to turn + frame operation references into simpler forms and to + reflect ABI specific data. Of course altering libdwarf.h + and dwarf.h allow the same capabilities, but such header changes + do not let one change these values at runtime. */ +Dwarf_Half dwarf_set_frame_rule_initial_value(Dwarf_Debug /*dbg*/, + Dwarf_Half /*value*/); +Dwarf_Half dwarf_set_frame_rule_table_size(Dwarf_Debug /*dbg*/, + Dwarf_Half /*value*/); +Dwarf_Half dwarf_set_frame_cfa_value(Dwarf_Debug /*dbg*/, + Dwarf_Half /*value*/); +Dwarf_Half dwarf_set_frame_same_value(Dwarf_Debug /*dbg*/, + Dwarf_Half /*value*/); +Dwarf_Half dwarf_set_frame_undefined_value(Dwarf_Debug /*dbg*/, + Dwarf_Half /*value*/); + +/* As of April 27, 2009, this version with no diepointer is + obsolete though supported. Use dwarf_get_ranges_a() instead. */ +int dwarf_get_ranges(Dwarf_Debug /*dbg*/, + Dwarf_Off /*rangesoffset*/, + Dwarf_Ranges ** /*rangesbuf*/, + Dwarf_Signed * /*listlen*/, + Dwarf_Unsigned * /*bytecount*/, + Dwarf_Error * /*error*/); + +/* This adds the address_size argument. New April 27, 2009 */ +int dwarf_get_ranges_a(Dwarf_Debug /*dbg*/, + Dwarf_Off /*rangesoffset*/, + Dwarf_Die /* diepointer */, + Dwarf_Ranges ** /*rangesbuf*/, + Dwarf_Signed * /*listlen*/, + Dwarf_Unsigned * /*bytecount*/, + Dwarf_Error * /*error*/); + +void dwarf_ranges_dealloc(Dwarf_Debug /*dbg*/, + Dwarf_Ranges * /*rangesbuf*/, + Dwarf_Signed /*rangecount*/); + +/* The harmless error list is a circular buffer of + errors we note but which do not stop us from processing + the object. Created so dwarfdump or other tools + can report such inconsequential errors without causing + anything to stop early. */ +#define DW_HARMLESS_ERROR_CIRCULAR_LIST_DEFAULT_SIZE 4 +#define DW_HARMLESS_ERROR_MSG_STRING_SIZE 200 +/* User code supplies size of array of pointers errmsg_ptrs_array + in count and the array of pointers (the pointers themselves + need not be initialized). + The pointers returned in the array of pointers + are invalidated by ANY call to libdwarf. + Use them before making another libdwarf call! + The array of string pointers passed in always has + a final null pointer, so if there are N pointers the + and M actual strings, then MIN(M,N-1) pointers are + set to point to error strings. The array of pointers + to strings always terminates with a NULL pointer. + If 'count' is passed in zero then errmsg_ptrs_array + is not touched. + + The function returns DW_DLV_NO_ENTRY if no harmless errors + were noted so far. Returns DW_DLV_OK if there are errors. + Never returns DW_DLV_ERROR. + + Each call empties the error list (discarding all current entries). + If newerr_count is non-NULL the count of harmless errors + since the last call is returned through the pointer + (some may have been discarded or not returned, it is a circular + list...). + If DW_DLV_NO_ENTRY is returned none of the arguments + here are touched or used. + */ +int dwarf_get_harmless_error_list(Dwarf_Debug /*dbg*/, + unsigned /*count*/, + const char ** /*errmsg_ptrs_array*/, + unsigned * /*newerr_count*/); + +/* Insertion is only for testing the harmless error code, it is not + necessarily useful otherwise. */ +void dwarf_insert_harmless_error(Dwarf_Debug /*dbg*/, + char * /*newerror*/); + +/* The size of the circular list of strings may be set + and reset as needed. If it is shortened excess + messages are simply dropped. It returns the previous + size. If zero passed in the size is unchanged + and it simply returns the current size */ +unsigned dwarf_set_harmless_error_list_size(Dwarf_Debug /*dbg*/, + unsigned /*maxcount*/); +/* The harmless error strings (if any) are freed when the dbg + is dwarf_finish()ed. */ + +/* When the val_in is known these dwarf_get_TAG_name (etc) + functions return the string corresponding to the val_in passed in + through the pointer s_out and the value returned is DW_DLV_OK. + The strings are in static storage + and must not be freed. + If DW_DLV_NO_ENTRY is returned the val_in is not known and + *s_out is not set. DW_DLV_ERROR is never returned.*/ + +extern int dwarf_get_TAG_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_children_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_FORM_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_AT_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_OP_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_ATE_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_DS_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_END_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_ATCF_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_ACCESS_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_VIS_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_VIRTUALITY_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_LANG_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_ID_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_CC_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_INL_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_ORD_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_DSC_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_LNS_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_LNE_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_MACINFO_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_CFA_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_EH_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_FRAME_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_CHILDREN_name(unsigned int /*val_in*/, const char ** /*s_out */); +extern int dwarf_get_ADDR_name(unsigned int /*val_in*/, const char ** /*s_out */); + +#ifdef __cplusplus +} +#endif +#endif /* _LIBDWARF_H */ + + diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/libdwarfdefs.h b/desmume/src/windows/libelf_libdwarf/libdwarf/libdwarfdefs.h new file mode 100644 index 000000000..a564655b2 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/libdwarfdefs.h @@ -0,0 +1,91 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + +/* libdwarfdefs.h +*/ + +#ifndef LIBDWARFDEFS_H +#define LIBDWARFDEFS_H + +/* We want __uint32_t and __uint64_t and __int32_t __int64_t + properly defined but not duplicated, since duplicate typedefs + are not legal C. +*/ +/* + HAVE___UINT32_T + HAVE___UINT64_T will be set by configure if + our 4 types are predefined in compiler +*/ + + +#if (!defined(HAVE___UINT32_T)) && defined(HAVE___UINT32_T_IN_SGIDEFS_H) +#include /* sgidefs.h defines them */ +#define HAVE___UINT32_T 1 +#endif + +#if (!defined(HAVE___UINT64_T)) && defined(HAVE___UINT64_T_IN_SGIDEFS_H) +#include /* sgidefs.h defines them */ +#define HAVE___UINT64_T 1 +#endif + + +#if (!defined(HAVE___UINT32_T)) && \ + defined(HAVE_SYS_TYPES_H) && \ + defined(HAVE___UINT32_T_IN_SYS_TYPES_H) +# include +#define HAVE___UINT32_T 1 +#endif + +#if (!defined(HAVE___UINT64_T)) && \ + defined(HAVE_SYS_TYPES_H) && \ + defined(HAVE___UINT64_T_IN_SYS_TYPES_H) +# include +#define HAVE___UINT64_T 1 +#endif + +#ifndef HAVE___UINT32_T +typedef int __int32_t; +typedef unsigned __uint32_t; +#define HAVE___UINT32_T 1 +#endif + +#ifndef HAVE___UINT64_T +typedef long long __int64_t; +typedef unsigned long long __uint64_t; +#define HAVE___UINT64_T 1 +#endif + +#endif /* LIBDWARFDEFS_H */ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/malloc_check.h b/desmume/src/windows/libelf_libdwarf/libdwarf/malloc_check.h new file mode 100644 index 000000000..ba1ad3da7 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/malloc_check.h @@ -0,0 +1,62 @@ +/* + + Copyright (C) 2005 Silicon Graphics, Inc. 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 + +*/ + + +/* malloc_check.h */ + +/* A simple libdwarf-aware malloc checker. + define WANT_LIBBDWARF_MALLOC_CHECK and rebuild libdwarf + do make a checking-for-alloc-mistakes libdwarf. + NOT recommended for production use. + + When defined, also add malloc_check.c to the list of + files in Makefile. +*/ + +#undef WANT_LIBBDWARF_MALLOC_CHECK +/*#define WANT_LIBBDWARF_MALLOC_CHECK 1 */ + +#ifdef WANT_LIBBDWARF_MALLOC_CHECK + +void dwarf_malloc_check_alloc_data(void * addr,unsigned char code); +void dwarf_malloc_check_dealloc_data(void * addr,unsigned char code); +void dwarf_malloc_check_complete(char *wheremsg); /* called at exit of app */ + +#else /* !WANT_LIBBDWARF_MALLOC_CHECK */ + +#define dwarf_malloc_check_alloc_data(a,b) /* nothing */ +#define dwarf_malloc_check_dealloc_data(a,b) /* nothing */ +#define dwarf_malloc_check_complete(a) /* nothing */ + +#endif /* WANT_LIBBDWARF_MALLOC_CHECK */ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_alloc.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_alloc.h new file mode 100644 index 000000000..b4da65325 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_alloc.h @@ -0,0 +1,42 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + + +Dwarf_Ptr _dwarf_p_get_alloc(Dwarf_P_Debug, Dwarf_Unsigned); + +void _dwarf_p_dealloc(Dwarf_P_Debug dbg, Dwarf_Small * ptr); + +void _dwarf_p_dealloc_all(Dwarf_P_Debug dbg); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_arange.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_arange.h new file mode 100644 index 000000000..f0e7e84df --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_arange.h @@ -0,0 +1,62 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + +/* + If ag_end_symbol_index is zero, + ag_length must be known and non-zero. + + + Deals with length being known costant or fr + assembler output, not known. + +*/ + +struct Dwarf_P_Arange_s { + Dwarf_Addr ag_begin_address; /* known address or for + symbolic assem output, + offset of symbol */ + Dwarf_Addr ag_length; /* zero or address or offset */ + Dwarf_Unsigned ag_symbol_index; + + Dwarf_P_Arange ag_next; + + Dwarf_Unsigned ag_end_symbol_index; /* zero or index/id of end + symbol */ + Dwarf_Addr ag_end_symbol_offset; /* known address or for + symbolic assem output, + offset of end symbol */ + +}; diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_die.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_die.h new file mode 100644 index 000000000..01c00e79b --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_die.h @@ -0,0 +1,68 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + + + +/* + This struct holds the abbreviation table, before they are written + on disk. Holds a linked list of abbreviations, each consisting of + a bitmap for attributes and a bitmap for forms +*/ +typedef struct Dwarf_P_Abbrev_s *Dwarf_P_Abbrev; + +struct Dwarf_P_Abbrev_s { + Dwarf_Unsigned abb_idx; /* index of abbreviation */ + Dwarf_Tag abb_tag; /* tag of die */ + Dwarf_Ubyte abb_children; /* if children are present */ + Dwarf_ufixed *abb_attrs; /* holds names of attrs */ + Dwarf_ufixed *abb_forms; /* forms of attributes */ + int abb_n_attr; /* num of attrs = # of forms */ + Dwarf_P_Abbrev abb_next; +}; + +/* used in pro_section.c */ + +int _dwarf_pro_add_AT_fde(Dwarf_P_Debug dbg, Dwarf_P_Die die, + Dwarf_Unsigned offset, Dwarf_Error * error); + +int _dwarf_pro_add_AT_stmt_list(Dwarf_P_Debug dbg, + Dwarf_P_Die first_die, + Dwarf_Error * error); + +int _dwarf_pro_add_AT_macro_info(Dwarf_P_Debug dbg, + Dwarf_P_Die first_die, + Dwarf_Unsigned offset, + Dwarf_Error * error); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_encode_nm.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_encode_nm.h new file mode 100644 index 000000000..d08e4d514 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_encode_nm.h @@ -0,0 +1,48 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + + +/* Bytes needed to encode a number. + Not a tight bound, just a reasonable bound. +*/ +#define ENCODE_SPACE_NEEDED (2*sizeof(Dwarf_Unsigned)) + + +int _dwarf_pro_encode_leb128_nm(Dwarf_Unsigned val, int *nbytes, + char *space, int splen); + +int _dwarf_pro_encode_signed_leb128_nm(Dwarf_Signed value, int *nbytes, + char *space, int splen); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_error.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_error.h new file mode 100644 index 000000000..c37035301 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_error.h @@ -0,0 +1,52 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + + + +/* Handle error passing in the name of the Dwarf_P_Debug + User must supply {} around the macro. + Putting the {} here leads to macro uses that don't look like C. + The error argument to dwarf_error is hard coded here as 'error' +*/ +#define DWARF_P_DBG_ERROR(dbg,errval,retval) \ + _dwarf_p_error(dbg,error,errval); return(retval); + +struct Dwarf_Error_s { + Dwarf_Sword er_errval; +}; + +void _dwarf_p_error(Dwarf_P_Debug dbg, Dwarf_Error * error, + Dwarf_Word errval); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_expr.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_expr.h new file mode 100644 index 000000000..202f2d30d --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_expr.h @@ -0,0 +1,45 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + +#define MAXIMUM_LOC_EXPR_LENGTH 20 + +struct Dwarf_P_Expr_s { + Dwarf_Small ex_byte_stream[MAXIMUM_LOC_EXPR_LENGTH]; + Dwarf_P_Debug ex_dbg; + Dwarf_Unsigned ex_next_byte_offset; + Dwarf_Unsigned ex_reloc_sym_index; + Dwarf_Unsigned ex_reloc_offset; +}; diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_frame.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_frame.h new file mode 100644 index 000000000..df60d369e --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_frame.h @@ -0,0 +1,132 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + + +/* + Largest register value that can be coded into + the opcode since there are only 6 bits in the + register field. +*/ +#define MAX_6_BIT_VALUE 0x3f + +/* + This struct holds debug_frame instructions +*/ +typedef struct Dwarf_P_Frame_Pgm_s *Dwarf_P_Frame_Pgm; + +struct Dwarf_P_Frame_Pgm_s { + Dwarf_Ubyte dfp_opcode; /* opcode - includes reg # */ + char *dfp_args; /* operands */ + int dfp_nbytes; /* number of bytes in args */ +#if 0 + Dwarf_Unsigned dfp_sym_index; /* 0 unless reloc needed */ +#endif + Dwarf_P_Frame_Pgm dfp_next; +}; + + +/* + This struct has cie related information. Used to gather data + from user program, and later to transform to disk form +*/ +struct Dwarf_P_Cie_s { + Dwarf_Ubyte cie_version; + char *cie_aug; /* augmentation */ + Dwarf_Ubyte cie_code_align; /* alignment of code */ + Dwarf_Sbyte cie_data_align; + Dwarf_Ubyte cie_ret_reg; /* return register # */ + char *cie_inst; /* initial instruction */ + long cie_inst_bytes; + /* no of init_inst */ + Dwarf_P_Cie cie_next; +}; + + +/* producer fields */ +struct Dwarf_P_Fde_s { + Dwarf_Unsigned fde_unused1; + + /* function/subr die for this fde */ + Dwarf_P_Die fde_die; + + /* index to asso. cie */ + Dwarf_Word fde_cie; + + /* Address of first location of the code this frame applies to If + fde_end_symbol non-zero, this represents the offset from the + symbol indicated by fde_r_symidx */ + Dwarf_Addr fde_initloc; + + /* Relocation symbol for address of the code this frame applies to. + */ + Dwarf_Unsigned fde_r_symidx; + + /* Bytes of instr for this fde, if known */ + Dwarf_Unsigned fde_addr_range; + + /* linked list of instructions we will put in fde. */ + Dwarf_P_Frame_Pgm fde_inst; + + /* number of instructions in fde */ + long fde_n_inst; + + /* number of bytes of inst in fde */ + long fde_n_bytes; + + /* offset into exception table for this function. */ + Dwarf_Signed fde_offset_into_exception_tables; + + /* The symbol for the exception table elf section. */ + Dwarf_Unsigned fde_exception_table_symbol; + + /* pointer to last inst */ + Dwarf_P_Frame_Pgm fde_last_inst; + + Dwarf_P_Fde fde_next; + + /* The symbol and offset of the end symbol. When fde_end_symbol is + non-zero we must represent the */ + Dwarf_Addr fde_end_symbol_offset; + Dwarf_Unsigned fde_end_symbol; + + int fde_uwordb_size; + Dwarf_P_Debug fde_dbg; + + /* If fde_block is non-null, then it is the set of instructions. + so we should use it rather than fde_inst. */ + Dwarf_Unsigned fde_inst_block_size; + void *fde_block; +}; diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_incl.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_incl.h new file mode 100644 index 000000000..e22e0251a --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_incl.h @@ -0,0 +1,94 @@ +/* + + Copyright (C) 2000,2002,2004 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. + Portions Copyright 2008-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 + +*/ + + +#ifdef HAVE_ELF_H +#include +#elif defined(HAVE_LIBELF_H) +/* On one platform without elf.h this gets Elf32_Rel + type defined (a required type). */ +#include +#elif defined(HAVE_LIBELF_LIBELF_H) +#include +#endif + +#if defined(sun) +#include +#include +#endif + +/* The target address is given: the place in the source integer + is to be determined. +*/ +#ifdef WORDS_BIGENDIAN +#define WRITE_UNALIGNED(dbg,dest,source, srclength,len_out) \ + { \ + dbg->de_copy_word(dest, \ + ((char *)source) +srclength-len_out, \ + len_out) ; \ + } + + +#else /* LITTLE ENDIAN */ + +#define WRITE_UNALIGNED(dbg,dest,source, srclength,len_out) \ + { \ + dbg->de_copy_word( (dest) , \ + ((char *)source) , \ + len_out) ; \ + } +#endif + + +#if defined(sparc) && defined(sun) +#define REL32 Elf32_Rela +#define REL64 Elf64_Rela +#define REL_SEC_PREFIX ".rela" +#else +#define REL32 Elf32_Rel +#define REL64 Elf64_Rel +#define REL_SEC_PREFIX ".rel" +#endif + +#include "dwarf.h" +#include "libdwarf.h" + +#include "pro_opaque.h" +#include "pro_error.h" +#include "pro_util.h" +#include "pro_encode_nm.h" +#include "pro_alloc.h" diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_line.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_line.h new file mode 100644 index 000000000..eed941239 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_line.h @@ -0,0 +1,116 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright 2007-2010 Sun Microsystems, Inc. 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 + +*/ + + + +#define VERSION 2 +#ifdef __i386 +#define MIN_INST_LENGTH 1 +#else +#define MIN_INST_LENGTH 4 +#endif +#define DEFAULT_IS_STMT false + /* line base and range are temporarily defines. + They need to be calculated later */ +#define LINE_BASE -1 +#define LINE_RANGE 4 + +#define OPCODE_BASE 10 +#define MAX_OPCODE 255 + + +/* + This struct is used to hold entries in the include directories + part of statement prologue. +*/ +struct Dwarf_P_Inc_Dir_s { + char *did_name; /* name of directory */ + Dwarf_P_Inc_Dir did_next; +}; + + +/* + This struct holds file entries for the statement prologue. + Defined in pro_line.h +*/ +struct Dwarf_P_F_Entry_s { + char *dfe_name; + char *dfe_args; /* has dir index, time of modification, + length in bytes. Encodes as leb128 */ + int dfe_nbytes; /* number of bytes in args */ + Dwarf_P_F_Entry dfe_next; +}; + + +/* + Struct holding line number information for each of the producer + line entries +*/ +struct Dwarf_P_Line_s { + /* code address */ + Dwarf_Addr dpl_address; + + /* file index, index into file entry */ + Dwarf_Word dpl_file; + + /* line number */ + Dwarf_Word dpl_line; + + /* column number */ + Dwarf_Word dpl_column; + + /* whether its a beginning of a stmt */ + Dwarf_Ubyte dpl_is_stmt; + + /* whether its a beginning of basic blk */ + Dwarf_Ubyte dpl_basic_block; + + /* used to store opcodes set_address, and end_seq */ + Dwarf_Ubyte dpl_opc; + + /* + Used only for relocations. Has index of symbol relative to + which relocation has to be done (the S part in S + A) */ + Dwarf_Unsigned dpl_r_symidx; + + Dwarf_P_Line dpl_next; +}; + +/* + to initialize state machine registers, definition in + pro_line.c +*/ +void _dwarf_pro_reg_init(Dwarf_P_Line); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_macinfo.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_macinfo.h new file mode 100644 index 000000000..852a0cec1 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_macinfo.h @@ -0,0 +1,40 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + + + +int _dwarf_pro_transform_macro_info_to_disk(Dwarf_P_Debug dbg, + Dwarf_Error * error); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_opaque.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_opaque.h new file mode 100644 index 000000000..befc69faa --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_opaque.h @@ -0,0 +1,484 @@ +/* + + Copyright (C) 2000,2002,2004 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright 2002-2010 Sun Microsystems, Inc. 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 + +*/ + + +#include + +/* + Sgidefs included to define __uint32_t, + a guaranteed 4-byte quantity. +*/ +#include "libdwarfdefs.h" + +#define true 1 +#define false 0 + +/* to identify a cie */ +#define DW_CIE_ID ~(0x0) +#define DW_CIE_VERSION 1 + +/*Dwarf_Word is unsigned word usable for index, count in memory */ +/*Dwarf_Sword is signed word usable for index, count in memory */ +/* The are 32 or 64 bits depending if 64 bit longs or not, which +** fits the ILP32 and LP64 models +** These work equally well with ILP64. +*/ + +typedef unsigned long Dwarf_Word; +typedef long Dwarf_Sword; + + +typedef signed char Dwarf_Sbyte; +typedef unsigned char Dwarf_Ubyte; +typedef signed short Dwarf_Shalf; + +/* + On any change that makes libdwarf producer + incompatible, increment this number. + 1->2->3 ... + +*/ +#define PRO_VERSION_MAGIC 0xdead1 + + +/* these 2 are fixed sizes which must not vary with the +** ILP32/LP64 model. These two stay at 32 bit. +*/ +typedef __uint32_t Dwarf_ufixed; +typedef __int32_t Dwarf_sfixed; + +/* + producer: + This struct is used to hold information about all + debug* sections. On creating a new section, section + names and indices are added to this struct + definition in pro_section.h +*/ +typedef struct Dwarf_P_Section_Data_s *Dwarf_P_Section_Data; + +/* + producer: + This struct is used to hold entries in the include directories + part of statement prologue. Definition in pro_line.h +*/ +typedef struct Dwarf_P_Inc_Dir_s *Dwarf_P_Inc_Dir; + +/* + producer: + This struct holds file entries for the statement prologue. + Defined in pro_line.h +*/ +typedef struct Dwarf_P_F_Entry_s *Dwarf_P_F_Entry; + +/* + producer: + This struct holds information for each cie. Defn in pro_frame.h +*/ +typedef struct Dwarf_P_Cie_s *Dwarf_P_Cie; + +/* + producer: + Struct to hold line number information, different from + Dwarf_Line opaque type. +*/ +typedef struct Dwarf_P_Line_s *Dwarf_P_Line; + +/* + producer: + Struct to hold information about address ranges. +*/ +typedef struct Dwarf_P_Simple_nameentry_s *Dwarf_P_Simple_nameentry; +typedef struct Dwarf_P_Simple_name_header_s *Dwarf_P_Simple_name_header; +typedef struct Dwarf_P_Arange_s *Dwarf_P_Arange; +typedef struct Dwarf_P_Per_Reloc_Sect_s *Dwarf_P_Per_Reloc_Sect; +typedef struct Dwarf_P_Per_Sect_String_Attrs_s *Dwarf_P_Per_Sect_String_Attrs; + +/* Defined to get at the elf section numbers and section name + indices in symtab for the dwarf sections + Must match .rel.* names in _dwarf_rel_section_names + exactly. +*/ +#define DEBUG_INFO 0 +#define DEBUG_LINE 1 +#define DEBUG_ABBREV 2 +#define DEBUG_FRAME 3 +#define DEBUG_ARANGES 4 +#define DEBUG_PUBNAMES 5 +#define DEBUG_STR 6 +#define DEBUG_FUNCNAMES 7 +#define DEBUG_TYPENAMES 8 +#define DEBUG_VARNAMES 9 +#define DEBUG_WEAKNAMES 10 +#define DEBUG_MACINFO 11 +#define DEBUG_LOC 12 + + /* number of debug_* sections not including the relocations */ +#define NUM_DEBUG_SECTIONS DEBUG_LOC + 1 + + +struct Dwarf_P_Die_s { + Dwarf_Unsigned di_offset; /* offset in debug info */ + char *di_abbrev; /* abbreviation */ + Dwarf_Word di_abbrev_nbytes; /* # of bytes in abbrev */ + Dwarf_Tag di_tag; + Dwarf_P_Die di_parent; /* parent of current die */ + Dwarf_P_Die di_child; /* first child */ + /* The last child field makes linking up children an O(1) operation, + See pro_die.c. */ + Dwarf_P_Die di_last_child; + Dwarf_P_Die di_left; /* left sibling */ + Dwarf_P_Die di_right; /* right sibling */ + Dwarf_P_Attribute di_attrs; /* list of attributes */ + Dwarf_P_Attribute di_last_attr; /* last attribute */ + int di_n_attr; /* number of attributes */ + Dwarf_P_Debug di_dbg; /* For memory management */ + Dwarf_Unsigned di_marker; /* used to attach symbols to dies */ +}; + + +/* producer fields */ +struct Dwarf_P_Attribute_s { + Dwarf_Half ar_attribute; /* Attribute Value. */ + Dwarf_Half ar_attribute_form; /* Attribute Form. */ + Dwarf_P_Die ar_ref_die; /* die pointer if form ref */ + char *ar_data; /* data, format given by form */ + Dwarf_Unsigned ar_nbytes; /* no. of bytes of data */ + Dwarf_Unsigned ar_rel_symidx; /* when attribute has a + relocatable value, holds + index of symbol in SYMTAB */ + Dwarf_Ubyte ar_rel_type; /* relocation type */ + Dwarf_Word ar_rel_offset; /* Offset of relocation within block */ + char ar_reloc_len; /* Number of bytes that relocation + applies to. 4 or 8. Unused and may + be 0 if if ar_rel_type is + R_MIPS_NONE */ + Dwarf_P_Attribute ar_next; +}; + +/* A block of .debug_macinfo data: this forms a series of blocks. +** Each macinfo input is compressed immediately and put into +** the current block if room, else a newblock allocated. +** The space allocation is such that the block and the macinfo +** data are one malloc block: free with a pointer to this and the +** mb_data is freed automatically. +** Like the struct hack, but legal ANSI C. +*/ +struct dw_macinfo_block_s { + struct dw_macinfo_block_s *mb_next; + unsigned long mb_avail_len; + unsigned long mb_used_len; + unsigned long mb_macinfo_data_space_len; + char *mb_data; /* original malloc ptr. */ +}; + +/* dwarf_sn_kind is for the array of similarly-treated + name -> cu ties +*/ +enum dwarf_sn_kind { dwarf_snk_pubname, dwarf_snk_funcname, + dwarf_snk_weakname, dwarf_snk_typename, + dwarf_snk_varname, + dwarf_snk_entrycount /* this one must be last */ +}; + + + +/* The calls to add a varname etc use a list of + these as the list. +*/ +struct Dwarf_P_Simple_nameentry_s { + Dwarf_P_Die sne_die; + char *sne_name; + int sne_name_len; + Dwarf_P_Simple_nameentry sne_next; +}; + +/* An array of these, each of which heads a list + of Dwarf_P_Simple_nameentry +*/ +struct Dwarf_P_Simple_name_header_s { + Dwarf_P_Simple_nameentry sn_head; + Dwarf_P_Simple_nameentry sn_tail; + Dwarf_Signed sn_count; + + /* length that will be generated, not counting fixed header or + trailer */ + Dwarf_Signed sn_net_len; +}; +typedef int (*_dwarf_pro_reloc_name_func_ptr) (Dwarf_P_Debug dbg, + int sec_index, + Dwarf_Unsigned offset,/* r_offset */ + Dwarf_Unsigned symidx, + enum Dwarf_Rel_Type type, + int reltarget_length); + +typedef int (*_dwarf_pro_reloc_length_func_ptr) (Dwarf_P_Debug dbg, + int sec_index, Dwarf_Unsigned offset,/* r_offset */ + Dwarf_Unsigned start_symidx, + Dwarf_Unsigned end_symidx, + enum Dwarf_Rel_Type type, + int reltarget_length); +typedef int (*_dwarf_pro_transform_relocs_func_ptr) (Dwarf_P_Debug dbg, + Dwarf_Signed * + new_sec_count); + +/* + Each slot in a block of slots could be: + a binary stream relocation entry (32 or 64bit relocation data) + a SYMBOLIC relocation entry. + During creation sometimes we create multiple chained blocks, + but sometimes we create a single long block. + Before returning reloc data to caller, + we switch to a single, long-enough, + block. + + We make counters here Dwarf_Unsigned so that we + get sufficient alignment. Since we use space after + the struct (at malloc time) for user data which + must have Dwarf_Unsigned alignment, this + struct must have that alignment too. +*/ +struct Dwarf_P_Relocation_Block_s { + Dwarf_Unsigned rb_slots_in_block; /* slots in block, as created */ + Dwarf_Unsigned rb_next_slot_to_use; /* counter, start at 0. */ + struct Dwarf_P_Relocation_Block_s *rb_next; + char *rb_where_to_add_next; /* pointer to next slot (might be past + end, depending on + rb_next_slot_to_use) */ + char *rb_data; /* data area */ +}; + +/* One of these per potential relocation section + So one per actual dwarf section. + Left zeroed when not used (some sections have + no relocations). +*/ +struct Dwarf_P_Per_Reloc_Sect_s { + unsigned long pr_reloc_total_count; /* total number of entries + across all blocks */ + + unsigned long pr_slots_per_block_to_alloc; /* at Block alloc, this + is the default number of slots to use */ + + int pr_sect_num_of_reloc_sect; /* sect number returned by + de_callback_func() or de_callback_func_b() call, this is the sect + number of the relocation section. */ + + /* singly-linked list. add at and ('last') with count of blocks */ + struct Dwarf_P_Relocation_Block_s *pr_first_block; + struct Dwarf_P_Relocation_Block_s *pr_last_block; + unsigned long pr_block_count; +}; + +#define DEFAULT_SLOTS_PER_BLOCK 3 + +typedef struct memory_list_s { + struct memory_list_s *prev; + struct memory_list_s *next; +} memory_list_t; + +struct Dwarf_P_Per_Sect_String_Attrs_s { + int sect_sa_section_number; + unsigned sect_sa_n_alloc; + unsigned sect_sa_n_used; + Dwarf_P_String_Attr sect_sa_list; +}; + +/* Fields used by producer */ +struct Dwarf_P_Debug_s { + /* used to catch dso passing dbg to another DSO with incompatible + version of libdwarf See PRO_VERSION_MAGIC */ + int de_version_magic_number; + + Dwarf_Handler de_errhand; + Dwarf_Ptr de_errarg; + + /* Call back function, used to create .debug* sections. Provided + by user. Only of these used per dbg. */ + Dwarf_Callback_Func de_callback_func; + Dwarf_Callback_Func_b de_callback_func_b; + + /* Flags from producer_init call */ + Dwarf_Unsigned de_flags; + + /* This holds information on debug section stream output, including + the stream data */ + Dwarf_P_Section_Data de_debug_sects; + + /* Pointer to the 'current active' section */ + Dwarf_P_Section_Data de_current_active_section; + + /* Number of debug data streams globs. */ + Dwarf_Word de_n_debug_sect; + + /* File entry information, null terminated singly-linked list */ + Dwarf_P_F_Entry de_file_entries; + Dwarf_P_F_Entry de_last_file_entry; + Dwarf_Unsigned de_n_file_entries; + + /* Has the directories used to search for source files */ + Dwarf_P_Inc_Dir de_inc_dirs; + Dwarf_P_Inc_Dir de_last_inc_dir; + Dwarf_Unsigned de_n_inc_dirs; + + /* Has all the line number info for the stmt program */ + Dwarf_P_Line de_lines; + Dwarf_P_Line de_last_line; + + /* List of cie's for the debug unit */ + Dwarf_P_Cie de_frame_cies; + Dwarf_P_Cie de_last_cie; + Dwarf_Unsigned de_n_cie; + + /* Singly-linked list of fde's for the debug unit */ + Dwarf_P_Fde de_frame_fdes; + Dwarf_P_Fde de_last_fde; + Dwarf_Unsigned de_n_fde; + + /* First die, leads to all others */ + Dwarf_P_Die de_dies; + + /* Pointer to list of strings */ + char *de_strings; + + /* Pointer to chain of aranges */ + Dwarf_P_Arange de_arange; + Dwarf_P_Arange de_last_arange; + Dwarf_Sword de_arange_count; + + /* macinfo controls. */ + /* first points to beginning of the list during creation */ + struct dw_macinfo_block_s *de_first_macinfo; + + /* current points to the current, unfilled, block */ + struct dw_macinfo_block_s *de_current_macinfo; + + /* Pointer to the first section, to support reset_section_bytes */ + Dwarf_P_Section_Data de_first_debug_sect; + + /* handles pubnames, weaknames, etc. See dwarf_sn_kind in + pro_opaque.h */ + struct Dwarf_P_Simple_name_header_s + de_simple_name_headers[dwarf_snk_entrycount]; + + /* relocation data. not all sections will actally have relocation + info, of course */ + struct Dwarf_P_Per_Reloc_Sect_s de_reloc_sect[NUM_DEBUG_SECTIONS]; + int de_reloc_next_to_return; /* iterator on reloc sections + (SYMBOLIC output) */ + + /* used in remembering sections */ + int de_elf_sects[NUM_DEBUG_SECTIONS]; /* elf sect number of + the section itself, DEBUG_LINE for example */ + + Dwarf_Unsigned de_sect_name_idx[NUM_DEBUG_SECTIONS]; /* section + name index or handle for the name of the symbol for + DEBUG_LINE for example */ + + int de_offset_reloc; /* offset reloc type, R_MIPS_32 for + example. Specific to the ABI being + produced. Relocates offset size + field */ + int de_exc_reloc; /* reloc type specific to exception + table relocs. */ + int de_ptr_reloc; /* standard reloc type, R_MIPS_32 for + example. Specific to the ABI being + produced. relocates pointer size + field */ + + unsigned char de_offset_size; /* section offset. Here to + avoid test of abi in macro + at run time MIPS -n32 4, + -64 8. */ + + unsigned char de_pointer_size; /* size of pointer in target. + Here to avoid test of abi in + macro at run time MIPS -n32 + 4, -64 is 8. */ + + unsigned char de_is_64bit; /* non-zero if is 64bit. Else 32 bit: + used for passing this info as a flag + */ + unsigned char de_relocation_record_size; /* reloc record size + varies by ABI and + relocation-output + method (stream or + symbolic) */ + + unsigned char de_64bit_extension; /* non-zero if creating 64 bit + offsets using dwarf2-99 + extension proposal */ + + int de_ar_data_attribute_form; /* data8, data4 abi dependent */ + int de_ar_ref_attr_form; /* ref8 ref4 , abi dependent */ + + /* simple name relocations */ + _dwarf_pro_reloc_name_func_ptr de_reloc_name; + + /* relocations for a length, requiring a pair of symbols */ + _dwarf_pro_reloc_length_func_ptr de_reloc_pair; + + _dwarf_pro_transform_relocs_func_ptr de_transform_relocs_to_disk; + + /* following used for macro buffers */ + unsigned long de_compose_avail; + unsigned long de_compose_used_len; + + unsigned char de_same_endian; + void *(*de_copy_word) (void *, const void *, size_t); + + /* Add new fields at the END of this struct to preserve some hope + of sensible behavior on dbg passing between DSOs linked with + mismatched libdwarf producer versions. */ + + Dwarf_P_Marker de_markers; /* pointer to array of markers */ + unsigned de_marker_n_alloc; + unsigned de_marker_n_used; + int de_sect_sa_next_to_return; /* Iterator on sring attrib sects */ + /* String attributes data of each section. */ + struct Dwarf_P_Per_Sect_String_Attrs_s de_sect_string_attr[NUM_DEBUG_SECTIONS]; +}; + +#define CURRENT_VERSION_STAMP 2 + +Dwarf_Unsigned _dwarf_add_simple_name_entry(Dwarf_P_Debug dbg, + Dwarf_P_Die die, + char *entry_name, + enum dwarf_sn_kind + entrykind, + Dwarf_Error * error); + + +#define DISTINGUISHED_VALUE 0xffffffff /* 64bit extension flag */ diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_reloc.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_reloc.h new file mode 100644 index 000000000..d2e6c6735 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_reloc.h @@ -0,0 +1,47 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + + + +int _dwarf_pro_pre_alloc_n_reloc_slots(Dwarf_P_Debug dbg, + int rel_sec_index, + Dwarf_Unsigned newslots); + +int _dwarf_pro_alloc_reloc_slots(Dwarf_P_Debug dbg, int rel_sec_index); + +int _dwarf_pro_reloc_get_a_slot(Dwarf_P_Debug dbg, + int base_sec_index, + void **relrec_to_fill); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_reloc_stream.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_reloc_stream.h new file mode 100644 index 000000000..892ea5baf --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_reloc_stream.h @@ -0,0 +1,63 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + + + +int _dwarf_pro_reloc_name_stream64(Dwarf_P_Debug dbg, int base_sec_index, Dwarf_Unsigned offset, /* r_offset + of + reloc + */ + Dwarf_Unsigned symidx, + enum Dwarf_Rel_Type, + int reltarget_length); +int _dwarf_pro_reloc_name_stream32(Dwarf_P_Debug dbg, int base_sec_index, Dwarf_Unsigned offset, /* r_offset + of + reloc + */ + Dwarf_Unsigned symidx, + enum Dwarf_Rel_Type, + int reltarget_length); +int _dwarf_pro_reloc_length_stream(Dwarf_P_Debug dbg, int base_sec_index, Dwarf_Unsigned offset, /* r_offset + of + reloc + */ + Dwarf_Unsigned start_symidx, + Dwarf_Unsigned end_symidx, + enum Dwarf_Rel_Type, + int reltarget_length); + +int _dwarf_stream_relocs_to_disk(Dwarf_P_Debug dbg, + Dwarf_Signed * new_sec_count); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_reloc_symbolic.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_reloc_symbolic.h new file mode 100644 index 000000000..3d03a4786 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_reloc_symbolic.h @@ -0,0 +1,55 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + +int _dwarf_pro_reloc_name_symbolic(Dwarf_P_Debug dbg, int base_sec_index, Dwarf_Unsigned offset, /* r_offset + of + reloc + */ + Dwarf_Unsigned symidx, + enum Dwarf_Rel_Type, + int reltarget_length); +int + _dwarf_pro_reloc_length_symbolic(Dwarf_P_Debug dbg, int base_sec_index, Dwarf_Unsigned offset, /* r_offset + of + reloc + */ + Dwarf_Unsigned start_symidx, + Dwarf_Unsigned end_symidx, + enum Dwarf_Rel_Type, + int reltarget_length); + +int _dwarf_symbolic_relocs_to_disk(Dwarf_P_Debug dbg, + Dwarf_Signed * new_sec_count); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_section.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_section.h new file mode 100644 index 000000000..b37ade44d --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_section.h @@ -0,0 +1,112 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + + + + +/* relocation section names */ +extern char *_dwarf_rel_section_names[]; + +/* section names */ +extern char *_dwarf_sectnames[]; + +/* struct to hold relocation entries. Its mantained as a linked + list of relocation structs, and will then be written at as a + whole into the relocation section. Whether its 32 bit or + 64 bit will be obtained from Dwarf_Debug pointer. +*/ + + + + + +/* + struct stores a chunk of data pertaining to a section +*/ +struct Dwarf_P_Section_Data_s { + int ds_elf_sect_no; /* elf section number */ + char *ds_data; /* data contained in section */ + unsigned long ds_nbytes; /* bytes of data used so far */ + unsigned long ds_orig_alloc; /* bytes allocated originally */ + Dwarf_P_Section_Data ds_next; /* next on the list */ +}; + +/* Used to allow a dummy initial struct (which we + drop before it gets used + This must not match any legitimate 'section' number. +*/ +#define MAGIC_SECT_NO -3 + +/* Size of chunk of data allocated in one alloc + Not clear if this is the best size. + Used to be just 4096 for user data, the section data struct + was a separate malloc. +*/ +#define CHUNK_SIZE (4096 - sizeof (struct Dwarf_P_Section_Data_s)) + +/* + chunk alloc routine - + if chunk->ds_data is nil, it will alloc CHUNK_SIZE bytes, + and return pointer to the beginning. If chunk is not nil, + it will see if there's enoungh space for nbytes in current + chunk, if not, add new chunk to linked list, and return + a char * pointer to it. Return null if unsuccessful. +*/ +Dwarf_Small *_dwarf_pro_buffer(Dwarf_P_Debug dbg, int sectno, + unsigned long nbytes); + +#define GET_CHUNK(dbg,sectno,ptr,nbytes,error) \ + { \ + (ptr) = _dwarf_pro_buffer((dbg),(sectno),(nbytes)); \ + if ((ptr) == NULL) { \ + DWARF_P_DBG_ERROR(dbg,DW_DLE_CHUNK_ALLOC,-1); \ + } \ + } + + + +int + _dwarf_transform_arange_to_disk(Dwarf_P_Debug dbg, + Dwarf_Error * error); + +/* These are for creating ELF section type codes. +*/ +#if defined(linux) || defined(__BEOS__) || !defined(SHT_MIPS_DWARF) +/* Intel's SoftSdv accepts only this */ +#define SECTION_TYPE SHT_PROGBITS +#else +#define SECTION_TYPE SHT_MIPS_DWARF +#endif diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_types.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_types.h new file mode 100644 index 000000000..817609215 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_types.h @@ -0,0 +1,44 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. 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 + +*/ + + +/* pro_types.h */ + + +int _dwarf_transform_simplename_to_disk(Dwarf_P_Debug dbg, enum dwarf_sn_kind entrykind, int section_index, /* in + de_elf_sects + etc + */ + Dwarf_Error * error); diff --git a/desmume/src/windows/libelf_libdwarf/libdwarf/pro_util.h b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_util.h new file mode 100644 index 000000000..56bde8bda --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libdwarf/pro_util.h @@ -0,0 +1,148 @@ +/* + + Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. + Portions Copyright 2002-2010 Sun Microsystems, Inc. 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 + +*/ + + + + +#define IS_64BIT(dbg) ((dbg)->de_flags & DW_DLC_SIZE_64 ? 1 : 0) +#define ISA_IA64(dbg) ((dbg)->de_flags & DW_DLC_ISA_IA64 ? 1 : 0) + +/* definition of sizes of types, given target machine */ +#define sizeof_sbyte(dbg) sizeof(Dwarf_Sbyte) +#define sizeof_ubyte(dbg) sizeof(Dwarf_Ubyte) +#define sizeof_uhalf(dbg) sizeof(Dwarf_Half) +/* certain sizes not defined here, but set in dbg record. + See pro_init.c +*/ + +/* Computes amount of padding necessary to align n to a k-boundary. */ +/* Important: Assumes n, k both GREATER than zero. */ +#define PADDING(n, k) ( (k)-1 - ((n)-1)%(k) ) + +/* The following defines are only important for users of the +** producer part of libdwarf, and such should have these +** defined correctly (as necessary) +** by the #include done in pro_incl.h +** before the #include "pro_util.h". +** For others producer macros do not matter so 0 is a usable value, and +** zero values let compilation succeed on more non-MIPS architectures. +** A better approach would be welcome. +*/ +/* R_MIPS* are #define so #ifndef works */ +/* R_IA_64* are not necessarily #define (might be enum) so #ifndef + is useless, we use the configure script generating + HAVE_R_IA_64_DIR32LSB and HAVE_R_IA64_DIR32LSB. +*/ +#ifndef R_MIPS_64 +#define R_MIPS_64 0 +#endif +#ifndef R_MIPS_32 +#define R_MIPS_32 0 +#endif +#ifndef R_MIPS_SCN_DISP +#define R_MIPS_SCN_DISP 0 +#endif + +/* R_IA_64_DIR32LSB came before the now-standard R_IA64_DIR32LSB + (etc) was defined. This now deals with either form, + preferring the new form if available. */ +#ifdef HAVE_R_IA64_DIR32LSB +#define DWARF_PRO_R_IA64_DIR32LSB R_IA64_DIR32LSB +#define DWARF_PRO_R_IA64_DIR64LSB R_IA64_DIR64LSB +#define DWARF_PRO_R_IA64_SEGREL64LSB R_IA64_SEGREL64LSB +#define DWARF_PRO_R_IA64_SEGREL32LSB R_IA64_SEGREL32LSB +#endif +#if defined(HAVE_R_IA_64_DIR32LSB) && !defined(HAVE_R_IA64_DIR32LSB) +#define DWARF_PRO_R_IA64_DIR32LSB R_IA_64_DIR32LSB +#define DWARF_PRO_R_IA64_DIR64LSB R_IA_64_DIR64LSB +#define DWARF_PRO_R_IA64_SEGREL64LSB R_IA_64_SEGREL64LSB +#define DWARF_PRO_R_IA64_SEGREL32LSB R_IA_64_SEGREL32LSB +#endif +#if !defined(HAVE_R_IA_64_DIR32LSB) && !defined(HAVE_R_IA64_DIR32LSB) +#define DWARF_PRO_R_IA64_DIR32LSB 0 +#define DWARF_PRO_R_IA64_DIR64LSB 0 +#define DWARF_PRO_R_IA64_SEGREL64LSB 0 +#define DWARF_PRO_R_IA64_SEGREL32LSB 0 +#endif + +/* + * The default "I don't know" value can't be zero. + * Because that's the sentinel value that means "no relocation". + * In order to use this library in 'symbolic relocation mode we + * don't care if this value is the right relocation value, + * only that it's non-NULL. So at the end, we define it + * to something sensible. + */ + + + +#if defined(sun) +#if defined(sparc) +#define Get_REL64_isa(dbg) (R_SPARC_UA64) +#define Get_REL32_isa(dbg) (R_SPARC_UA32) +#define Get_REL_SEGREL_isa(dbg) (R_SPARC_NONE) /* I don't know! */ +#else /* i386 */ +#define Get_REL64_isa(dbg) (R_386_32) /* Any non-zero value is ok */ +#define Get_REL32_isa(dbg) (R_386_32) +#define Get_REL_SEGREL_isa(dbg) (R_386_NONE) /* I don't know! */ +#endif /* sparc || i386 */ +#else /* !sun */ +#ifdef HAVE_SYS_IA64_ELF_H +#define Get_REL64_isa(dbg) (ISA_IA64(dbg) ? \ + DWARF_PRO_R_IA64_DIR64LSB : R_MIPS_64) +#define Get_REL32_isa(dbg) (ISA_IA64(dbg) ? \ + DWARF_PRO_R_IA64_DIR32LSB : R_MIPS_32) + + +/* ia64 uses 32bit dwarf offsets for sections */ +#define Get_REL_SEGREL_isa(dbg) (ISA_IA64(dbg) ? \ + DWARF_PRO_R_IA64_SEGREL32LSB : R_MIPS_SCN_DISP) +#else /* HAVE_SYS_IA64_ELF_H */ + +#if !defined(linux) && !defined(__BEOS__) +#define Get_REL64_isa(dbg) (R_MIPS_64) +#define Get_REL32_isa(dbg) (R_MIPS_32) +#define Get_REL_SEGREL_isa(dbg) (R_MIPS_SCN_DISP) +#else +#define Get_REL64_isa(dbg) (1) +#define Get_REL32_isa(dbg) (1) /* these are used on linux */ +#define Get_REL_SEGREL_isa(dbg) (1) /* non zero values, see comments above */ +#endif + +#endif /* HAVE_SYS_IA64_ELF_H */ +#endif /* !sun */ + + diff --git a/desmume/src/windows/libelf_libdwarf/libelf/byteswap.h b/desmume/src/windows/libelf_libdwarf/libelf/byteswap.h new file mode 100644 index 000000000..7526d1233 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libelf/byteswap.h @@ -0,0 +1,95 @@ +/* +byteswap.h - functions and macros for byte swapping. +Copyright (C) 1995 - 2001 Michael Riepe + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +*/ + +/* @(#) $Id: byteswap.h,v 1.7 2008/05/23 08:15:34 michael Exp $ */ + +#ifndef _BYTESWAP_H +#define _BYTESWAP_H + +#define lu(from,i,s) (((__libelf_u32_t)((unsigned char*)(from))[i])<<(s)) +#define li(from,i,s) (((__libelf_i32_t)(( signed char*)(from))[i])<<(s)) + +#define __load_u16L(from) ((__libelf_u32_t) \ + (lu(from,1,8) | lu(from,0,0))) +#define __load_u16M(from) ((__libelf_u32_t) \ + (lu(from,0,8) | lu(from,1,0))) +#define __load_i16L(from) ((__libelf_i32_t) \ + (li(from,1,8) | lu(from,0,0))) +#define __load_i16M(from) ((__libelf_i32_t) \ + (li(from,0,8) | lu(from,1,0))) + +#define __load_u32L(from) ((__libelf_u32_t) \ + (lu(from,3,24) | lu(from,2,16) | lu(from,1,8) | lu(from,0,0))) +#define __load_u32M(from) ((__libelf_u32_t) \ + (lu(from,0,24) | lu(from,1,16) | lu(from,2,8) | lu(from,3,0))) +#define __load_i32L(from) ((__libelf_i32_t) \ + (li(from,3,24) | lu(from,2,16) | lu(from,1,8) | lu(from,0,0))) +#define __load_i32M(from) ((__libelf_i32_t) \ + (li(from,0,24) | lu(from,1,16) | lu(from,2,8) | lu(from,3,0))) + +#define su(to,i,v,s) (((char*)(to))[i]=((__libelf_u32_t)(v)>>(s))) +#define si(to,i,v,s) (((char*)(to))[i]=((__libelf_i32_t)(v)>>(s))) + +#define __store_u16L(to,v) \ + (su(to,1,v,8), su(to,0,v,0)) +#define __store_u16M(to,v) \ + (su(to,0,v,8), su(to,1,v,0)) +#define __store_i16L(to,v) \ + (si(to,1,v,8), si(to,0,v,0)) +#define __store_i16M(to,v) \ + (si(to,0,v,8), si(to,1,v,0)) + +#define __store_u32L(to,v) \ + (su(to,3,v,24), su(to,2,v,16), su(to,1,v,8), su(to,0,v,0)) +#define __store_u32M(to,v) \ + (su(to,0,v,24), su(to,1,v,16), su(to,2,v,8), su(to,3,v,0)) +#define __store_i32L(to,v) \ + (si(to,3,v,24), si(to,2,v,16), si(to,1,v,8), si(to,0,v,0)) +#define __store_i32M(to,v) \ + (si(to,0,v,24), si(to,1,v,16), si(to,2,v,8), si(to,3,v,0)) + +#if __LIBELF64 + +/* + * conversion functions from swap64.c + */ +extern __libelf_u64_t _elf_load_u64L(const unsigned char *from); +extern __libelf_u64_t _elf_load_u64M(const unsigned char *from); +extern __libelf_i64_t _elf_load_i64L(const unsigned char *from); +extern __libelf_i64_t _elf_load_i64M(const unsigned char *from); +extern void _elf_store_u64L(unsigned char *to, __libelf_u64_t v); +extern void _elf_store_u64M(unsigned char *to, __libelf_u64_t v); +extern void _elf_store_i64L(unsigned char *to, __libelf_u64_t v); +extern void _elf_store_i64M(unsigned char *to, __libelf_u64_t v); + +/* + * aliases for existing conversion code + */ +#define __load_u64L _elf_load_u64L +#define __load_u64M _elf_load_u64M +#define __load_i64L _elf_load_i64L +#define __load_i64M _elf_load_i64M +#define __store_u64L _elf_store_u64L +#define __store_u64M _elf_store_u64M +#define __store_i64L _elf_store_i64L +#define __store_i64M _elf_store_i64M + +#endif /* __LIBELF64 */ + +#endif /* _BYTESWAP_H */ diff --git a/desmume/src/windows/libelf_libdwarf/libelf/elf_repl.h b/desmume/src/windows/libelf_libdwarf/libelf/elf_repl.h new file mode 100644 index 000000000..c5cf90f7a --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libelf/elf_repl.h @@ -0,0 +1,996 @@ +/* + * elf_repl.h - public header file for systems that lack it. + * Copyright (C) 1995 - 2006 Michael Riepe + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* @(#) $Id: elf_repl.h,v 1.22 2009/11/01 13:04:19 michael Exp $ */ + +/* + * NEVER INCLUDE THIS FILE DIRECTLY - USE INSTEAD! + */ + +#ifndef _ELF_REPL_H +#define _ELF_REPL_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* + * Scalar data types + */ +typedef __libelf_u32_t Elf32_Addr; +typedef __libelf_u16_t Elf32_Half; +typedef __libelf_u32_t Elf32_Off; +typedef __libelf_i32_t Elf32_Sword; +typedef __libelf_u32_t Elf32_Word; + +#define ELF32_FSZ_ADDR 4 +#define ELF32_FSZ_HALF 2 +#define ELF32_FSZ_OFF 4 +#define ELF32_FSZ_SWORD 4 +#define ELF32_FSZ_WORD 4 + +#if __LIBELF64 + +typedef __libelf_u64_t Elf64_Addr; +typedef __libelf_u16_t Elf64_Half; +typedef __libelf_u64_t Elf64_Off; +typedef __libelf_i32_t Elf64_Sword; +typedef __libelf_u32_t Elf64_Word; +typedef __libelf_i64_t Elf64_Sxword; +typedef __libelf_u64_t Elf64_Xword; + +#define ELF64_FSZ_ADDR 8 +#define ELF64_FSZ_HALF 2 +#define ELF64_FSZ_OFF 8 +#define ELF64_FSZ_SWORD 4 +#define ELF64_FSZ_WORD 4 +#define ELF64_FSZ_SXWORD 8 +#define ELF64_FSZ_XWORD 8 + +/* + * Blame Sun for this... + */ +typedef __libelf_u64_t Elf64_Lword; +typedef __libelf_u64_t Elf32_Lword; + +#endif /* __LIBELF64 */ + +/* + * ELF header + */ +#define EI_NIDENT 16 + +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +} Elf32_Ehdr; + +#if __LIBELF64 +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +} Elf64_Ehdr; +#endif /* __LIBELF64 */ + +/* + * e_ident + */ +#define EI_MAG0 0 +#define EI_MAG1 1 +#define EI_MAG2 2 +#define EI_MAG3 3 +#define EI_CLASS 4 +#define EI_DATA 5 +#define EI_VERSION 6 +#define EI_OSABI 7 +#define EI_ABIVERSION 8 +#define EI_PAD 9 + +#define ELFMAG0 0x7f +#define ELFMAG1 'E' +#define ELFMAG2 'L' +#define ELFMAG3 'F' +#define ELFMAG "\177ELF" +#define SELFMAG 4 + +/* + * e_ident[EI_CLASS] + */ +#define ELFCLASSNONE 0 +#define ELFCLASS32 1 +#define ELFCLASS64 2 +#define ELFCLASSNUM 3 + +/* + * e_ident[EI_DATA] + */ +#define ELFDATANONE 0 +#define ELFDATA2LSB 1 +#define ELFDATA2MSB 2 +#define ELFDATANUM 3 + +/* + * e_ident[EI_OSABI] + */ +#define ELFOSABI_NONE 0 /* No extensions or unspecified */ +#define ELFOSABI_SYSV ELFOSABI_NONE +#define ELFOSABI_HPUX 1 /* Hewlett-Packard HP-UX */ +#define ELFOSABI_NETBSD 2 /* NetBSD */ +#define ELFOSABI_LINUX 3 /* Linux */ +#define ELFOSABI_SOLARIS 6 /* Sun Solaris */ +#define ELFOSABI_AIX 7 /* AIX */ +#define ELFOSABI_IRIX 8 /* IRIX */ +#define ELFOSABI_FREEBSD 9 /* FreeBSD */ +#define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX */ +#define ELFOSABI_MODESTO 11 /* Novell Modesto */ +#define ELFOSABI_OPENBSD 12 /* Open BSD */ +#define ELFOSABI_OPENVMS 13 /* Open VMS */ +#define ELFOSABI_NSK 14 /* Hewlett-Packard Non-Stop Kernel */ +#define ELFOSABI_AROS 15 /* Amiga Research OS */ +/* these are probably obsolete: */ +#define ELFOSABI_ARM 97 /* ARM */ +#define ELFOSABI_STANDALONE 255 /* standalone (embedded) application */ + + +/* + * e_type + */ +#define ET_NONE 0 +#define ET_REL 1 +#define ET_EXEC 2 +#define ET_DYN 3 +#define ET_CORE 4 +#define ET_NUM 5 +#define ET_LOOS 0xfe00 +#define ET_HIOS 0xfeff +#define ET_LOPROC 0xff00 +#define ET_HIPROC 0xffff + +/* + * e_machine + */ +#define EM_NONE 0 /* No machine */ +#define EM_M32 1 /* AT&T WE 32100 */ +#define EM_SPARC 2 /* SPARC */ +#define EM_386 3 /* Intel 80386 */ +#define EM_68K 4 /* Motorola 68000 */ +#define EM_88K 5 /* Motorola 88000 */ +#define EM_486 6 /* Intel i486 (DO NOT USE THIS ONE) */ +#define EM_860 7 /* Intel 80860 */ +#define EM_MIPS 8 /* MIPS I Architecture */ +#define EM_S370 9 /* IBM System/370 Processor */ +#define EM_MIPS_RS3_LE 10 /* MIPS RS3000 Little-endian */ +#define EM_SPARC64 11 /* SPARC 64-bit */ +#define EM_PARISC 15 /* Hewlett-Packard PA-RISC */ +#define EM_VPP500 17 /* Fujitsu VPP500 */ +#define EM_SPARC32PLUS 18 /* Enhanced instruction set SPARC */ +#define EM_960 19 /* Intel 80960 */ +#define EM_PPC 20 /* PowerPC */ +#define EM_PPC64 21 /* 64-bit PowerPC */ +#define EM_S390 22 /* IBM System/390 Processor */ +#define EM_V800 36 /* NEC V800 */ +#define EM_FR20 37 /* Fujitsu FR20 */ +#define EM_RH32 38 /* TRW RH-32 */ +#define EM_RCE 39 /* Motorola RCE */ +#define EM_ARM 40 /* Advanced RISC Machines ARM */ +#define EM_ALPHA 41 /* Digital Alpha */ +#define EM_SH 42 /* Hitachi SH */ +#define EM_SPARCV9 43 /* SPARC Version 9 */ +#define EM_TRICORE 44 /* Siemens TriCore embedded processor */ +#define EM_ARC 45 /* Argonaut RISC Core, Argonaut Technologies Inc. */ +#define EM_H8_300 46 /* Hitachi H8/300 */ +#define EM_H8_300H 47 /* Hitachi H8/300H */ +#define EM_H8S 48 /* Hitachi H8S */ +#define EM_H8_500 49 /* Hitachi H8/500 */ +#define EM_IA_64 50 /* Intel IA-64 processor architecture */ +#define EM_MIPS_X 51 /* Stanford MIPS-X */ +#define EM_COLDFIRE 52 /* Motorola ColdFire */ +#define EM_68HC12 53 /* Motorola M68HC12 */ +#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator */ +#define EM_PCP 55 /* Siemens PCP */ +#define EM_NCPU 56 /* Sony nCPU embedded RISC processor */ +#define EM_NDR1 57 /* Denso NDR1 microprocessor */ +#define EM_STARCORE 58 /* Motorola Star*Core processor */ +#define EM_ME16 59 /* Toyota ME16 processor */ +#define EM_ST100 60 /* STMicroelectronics ST100 processor */ +#define EM_TINYJ 61 /* Advanced Logic Corp. TinyJ embedded processor family */ +#define EM_X86_64 62 /* AMD x86-64 architecture */ +#define EM_AMD64 EM_X86_64 +#define EM_PDSP 63 /* Sony DSP Processor */ +#define EM_FX66 66 /* Siemens FX66 microcontroller */ +#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 bit microcontroller */ +#define EM_ST7 68 /* STMicroelectronics ST7 8-bit microcontroller */ +#define EM_68HC16 69 /* Motorola MC68HC16 Microcontroller */ +#define EM_68HC11 70 /* Motorola MC68HC11 Microcontroller */ +#define EM_68HC08 71 /* Motorola MC68HC08 Microcontroller */ +#define EM_68HC05 72 /* Motorola MC68HC05 Microcontroller */ +#define EM_SVX 73 /* Silicon Graphics SVx */ +#define EM_ST19 74 /* STMicroelectronics ST19 8-bit microcontroller */ +#define EM_VAX 75 /* Digital VAX */ +#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ +#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor */ +#define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */ +#define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */ +#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */ +#define EM_HUANY 81 /* Harvard University machine-independent object files */ +#define EM_PRISM 82 /* SiTera Prism */ +#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ +#define EM_FR30 84 /* Fujitsu FR30 */ +#define EM_D10V 85 /* Mitsubishi D10V */ +#define EM_D30V 86 /* Mitsubishi D30V */ +#define EM_V850 87 /* NEC v850 */ +#define EM_M32R 88 /* Mitsubishi M32R */ +#define EM_MN10300 89 /* Matsushita MN10300 */ +#define EM_MN10200 90 /* Matsushita MN10200 */ +#define EM_PJ 91 /* picoJava */ +#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ +#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ +#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ +#define EM_VIDEOCORE 95 /* Alphamosaic VideoCore processor */ +#define EM_TMM_GPP 96 /* Thompson Multimedia General Purpose Processor */ +#define EM_NS32K 97 /* National Semiconductor 32000 series */ +#define EM_TPC 98 /* Tenor Network TPC processor */ +#define EM_SNP1K 99 /* Trebia SNP 1000 processor */ +#define EM_ST200 100 /* STMicroelectronics (www.st.com) ST200 microcontroller */ +#define EM_IP2K 101 /* Ubicom IP2xxx microcontroller family */ +#define EM_MAX 102 /* MAX Processor */ +#define EM_CR 103 /* National Semiconductor CompactRISC microprocessor */ +#define EM_F2MC16 104 /* Fujitsu F2MC16 */ +#define EM_MSP430 105 /* Texas Instruments embedded microcontroller msp430 */ +#define EM_BLACKFIN 106 /* Analog Devices Blackfin (DSP) processor */ +#define EM_SE_C33 107 /* S1C33 Family of Seiko Epson processors */ +#define EM_SEP 108 /* Sharp embedded microprocessor */ +#define EM_ARCA 109 /* Arca RISC Microprocessor */ +#define EM_UNICORE 110 /* Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University */ +#define EM_NUM 111 + +/* + * e_ident[EI_VERSION], e_version + */ +#define EV_NONE 0 +#define EV_CURRENT 1 +#define EV_NUM 2 + +/* + * Section header + */ +typedef struct { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; +} Elf32_Shdr; + +#if __LIBELF64 +typedef struct { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +} Elf64_Shdr; +#endif /* __LIBELF64 */ + +/* + * Special section indices + */ +#define SHN_UNDEF 0 +#define SHN_LORESERVE 0xff00 +#define SHN_LOPROC 0xff00 +#define SHN_HIPROC 0xff1f +#define SHN_LOOS 0xff20 +#define SHN_HIOS 0xff3f +#define SHN_ABS 0xfff1 +#define SHN_COMMON 0xfff2 +#define SHN_XINDEX 0xffff +#define SHN_HIRESERVE 0xffff + +/* + * sh_type + */ +#define SHT_NULL 0 +#define SHT_PROGBITS 1 +#define SHT_SYMTAB 2 +#define SHT_STRTAB 3 +#define SHT_RELA 4 +#define SHT_HASH 5 +#define SHT_DYNAMIC 6 +#define SHT_NOTE 7 +#define SHT_NOBITS 8 +#define SHT_REL 9 +#define SHT_SHLIB 10 +#define SHT_DYNSYM 11 +#define SHT_INIT_ARRAY 14 +#define SHT_FINI_ARRAY 15 +#define SHT_PREINIT_ARRAY 16 +#define SHT_GROUP 17 +#define SHT_SYMTAB_SHNDX 18 +#define SHT_NUM 19 +#define SHT_LOOS 0x60000000 +#define SHT_HIOS 0x6fffffff +#define SHT_LOPROC 0x70000000 +#define SHT_HIPROC 0x7fffffff +#define SHT_LOUSER 0x80000000 +#define SHT_HIUSER 0xffffffff + +/* + * Solaris extensions + */ +#define SHT_LOSUNW 0x6ffffff4 +#define SHT_SUNW_dof 0x6ffffff4 +#define SHT_SUNW_cap 0x6ffffff5 +#define SHT_SUNW_SIGNATURE 0x6ffffff6 +#define SHT_SUNW_ANNOTATE 0x6ffffff7 +#define SHT_SUNW_DEBUGSTR 0x6ffffff8 +#define SHT_SUNW_DEBUG 0x6ffffff9 +#define SHT_SUNW_move 0x6ffffffa +#define SHT_SUNW_COMDAT 0x6ffffffb +#define SHT_SUNW_syminfo 0x6ffffffc +#define SHT_SUNW_verdef 0x6ffffffd +#define SHT_SUNW_verneed 0x6ffffffe +#define SHT_SUNW_versym 0x6fffffff +#define SHT_HISUNW 0x6fffffff + +#define SHT_SPARC_GOTDATA 0x70000000 +#define SHT_AMD64_UNWIND 0x70000001 + +/* + * GNU extensions + */ +#define SHT_GNU_verdef 0x6ffffffd +#define SHT_GNU_verneed 0x6ffffffe +#define SHT_GNU_versym 0x6fffffff + +/* + * sh_flags + */ +#define SHF_WRITE 0x1 +#define SHF_ALLOC 0x2 +#define SHF_EXECINSTR 0x4 +#define SHF_MERGE 0x10 +#define SHF_STRINGS 0x20 +#define SHF_INFO_LINK 0x40 +#define SHF_LINK_ORDER 0x80 +#define SHF_OS_NONCONFORMING 0x100 +#define SHF_GROUP 0x200 +#define SHF_TLS 0x400 +#define SHF_MASKOS 0x0ff00000 +#define SHF_MASKPROC 0xf0000000 + +/* + * Solaris extensions + */ +#define SHF_AMD64_LARGE 0x10000000 +#define SHF_ORDERED 0x40000000 +#define SHF_EXCLUDE 0x80000000 + +/* + * Section group flags + */ +#define GRP_COMDAT 0x1 +#define GRP_MASKOS 0x0ff00000 +#define GRP_MASKPROC 0xf0000000 + +/* + * Symbol table + */ +typedef struct { + Elf32_Word st_name; + Elf32_Addr st_value; + Elf32_Word st_size; + unsigned char st_info; + unsigned char st_other; + Elf32_Half st_shndx; +} Elf32_Sym; + +#if __LIBELF64 +typedef struct { + Elf64_Word st_name; + unsigned char st_info; + unsigned char st_other; + Elf64_Half st_shndx; + Elf64_Addr st_value; + Elf64_Xword st_size; +} Elf64_Sym; +#endif /* __LIBELF64 */ + +/* + * Special symbol indices + */ +#define STN_UNDEF 0 + +/* + * Macros for manipulating st_info + */ +#define ELF32_ST_BIND(i) ((i)>>4) +#define ELF32_ST_TYPE(i) ((i)&0xf) +#define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) + +#if __LIBELF64 +#define ELF64_ST_BIND(i) ((i)>>4) +#define ELF64_ST_TYPE(i) ((i)&0xf) +#define ELF64_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) +#endif /* __LIBELF64 */ + +/* + * Symbol binding + */ +#define STB_LOCAL 0 +#define STB_GLOBAL 1 +#define STB_WEAK 2 +#define STB_NUM 3 +#define STB_LOOS 10 +#define STB_HIOS 12 +#define STB_LOPROC 13 +#define STB_HIPROC 15 + +/* + * Symbol types + */ +#define STT_NOTYPE 0 +#define STT_OBJECT 1 +#define STT_FUNC 2 +#define STT_SECTION 3 +#define STT_FILE 4 +#define STT_COMMON 5 +#define STT_TLS 6 +#define STT_NUM 7 +#define STT_LOOS 10 +#define STT_HIOS 12 +#define STT_LOPROC 13 +#define STT_HIPROC 15 + +/* + * Macros for manipulating st_other + */ +#define ELF32_ST_VISIBILITY(o) ((o)&0x3) +#if __LIBELF64 +#define ELF64_ST_VISIBILITY(o) ((o)&0x3) +#endif /* __LIBELF64 */ + +/* + * Symbol visibility + */ +#define STV_DEFAULT 0 +#define STV_INTERNAL 1 +#define STV_HIDDEN 2 +#define STV_PROTECTED 3 + +/* + * Relocation + */ +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; +} Elf32_Rel; + +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; + Elf32_Sword r_addend; +} Elf32_Rela; + +#if __LIBELF64 +typedef struct { + Elf64_Addr r_offset; + Elf64_Xword r_info; +} Elf64_Rel; + +typedef struct { + Elf64_Addr r_offset; + Elf64_Xword r_info; + Elf64_Sxword r_addend; +} Elf64_Rela; +#endif /* __LIBELF64 */ + +/* + * Macros for manipulating r_info + */ +#define ELF32_R_SYM(i) ((i)>>8) +#define ELF32_R_TYPE(i) ((unsigned char)(i)) +#define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t)) + +#if __LIBELF64 +#define ELF64_R_SYM(i) ((Elf64_Xword)(i)>>32) +#define ELF64_R_TYPE(i) ((i)&0xffffffffL) +#define ELF64_R_INFO(s,t) (((Elf64_Xword)(s)<<32)+((t)&0xffffffffL)) +#endif /* __LIBELF64 */ + +/* + * Note entry header + */ +typedef struct { + Elf32_Word n_namesz; /* name size */ + Elf32_Word n_descsz; /* descriptor size */ + Elf32_Word n_type; /* descriptor type */ +} Elf32_Nhdr; + +#if __LIBELF64 +/* Solaris and GNU use this layout. Be compatible. */ +/* XXX: Latest ELF specs say it's 64-bit!!! */ +typedef struct { + Elf64_Word n_namesz; /* name size */ + Elf64_Word n_descsz; /* descriptor size */ + Elf64_Word n_type; /* descriptor type */ +} Elf64_Nhdr; +#endif /* __LIBELF64 */ + +/* + * Well-known descriptor types for ET_CORE files + */ +#define NT_PRSTATUS 1 +#define NT_PRFPREG 2 +#define NT_PRPSINFO 3 + +/* + * Program header + */ +typedef struct { + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +} Elf32_Phdr; + +#if __LIBELF64 +typedef struct { + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +} Elf64_Phdr; +#endif /* __LIBELF64 */ + +/* + * Special numbers + */ +#define PN_XNUM 0xffff + +/* + * p_type + */ +#define PT_NULL 0 +#define PT_LOAD 1 +#define PT_DYNAMIC 2 +#define PT_INTERP 3 +#define PT_NOTE 4 +#define PT_SHLIB 5 +#define PT_PHDR 6 +#define PT_TLS 7 +#define PT_NUM 8 +#define PT_LOOS 0x60000000 +#define PT_HIOS 0x6fffffff +#define PT_LOPROC 0x70000000 +#define PT_HIPROC 0x7fffffff + +/* + * Solaris extensions + */ + +#define PT_SUNW_UNWIND 0x6464e550 +#define PT_LOSUNW 0x6ffffffa +#define PT_SUNWBSS 0x6ffffffa +#define PT_SUNWSTACK 0x6ffffffb +#define PT_SUNWDTRACE 0x6ffffffc +#define PT_SUNWCAP 0x6ffffffd +#define PT_HISUNW 0x6fffffff + +/* + * p_flags + */ +#define PF_X 0x1 +#define PF_W 0x2 +#define PF_R 0x4 +#define PF_MASKOS 0x0ff00000 +#define PF_MASKPROC 0xf0000000 + +/* + * Dynamic structure + */ +typedef struct { + Elf32_Sword d_tag; + union { + Elf32_Word d_val; + Elf32_Addr d_ptr; + } d_un; +} Elf32_Dyn; + +#if __LIBELF64 +typedef struct { + Elf64_Sxword d_tag; + union { + Elf64_Xword d_val; + Elf64_Addr d_ptr; + } d_un; +} Elf64_Dyn; +#endif /* __LIBELF64 */ + +/* + * Dynamic array tags + */ + /* d_un exec shared */ +#define DT_NULL 0 /* ign. mand. mand. */ +#define DT_NEEDED 1 /* d_val opt. opt. */ +#define DT_PLTRELSZ 2 /* d_val opt. opt. */ +#define DT_PLTGOT 3 /* d_ptr opt. opt. */ +#define DT_HASH 4 /* d_ptr mand. mand. */ +#define DT_STRTAB 5 /* d_ptr mand. mand. */ +#define DT_SYMTAB 6 /* d_ptr mand. mand. */ +#define DT_RELA 7 /* d_ptr mand. opt. */ +#define DT_RELASZ 8 /* d_val mand. opt. */ +#define DT_RELAENT 9 /* d_val mand. opt. */ +#define DT_STRSZ 10 /* d_val mand. mand. */ +#define DT_SYMENT 11 /* d_val mand. mand. */ +#define DT_INIT 12 /* d_ptr opt. opt. */ +#define DT_FINI 13 /* d_ptr opt. opt. */ +#define DT_SONAME 14 /* d_val ign. opt. */ +#define DT_RPATH 15 /* d_val opt. ign. */ +#define DT_SYMBOLIC 16 /* ign. ign. opt. */ +#define DT_REL 17 /* d_ptr mand. opt. */ +#define DT_RELSZ 18 /* d_val mand. opt. */ +#define DT_RELENT 19 /* d_val mand. opt. */ +#define DT_PLTREL 20 /* d_val opt. opt. */ +#define DT_DEBUG 21 /* d_ptr opt. ign. */ +#define DT_TEXTREL 22 /* ign. opt. opt. */ +#define DT_JMPREL 23 /* d_ptr opt. opt. */ +#define DT_BIND_NOW 24 /* ign. opt. opt. */ +#define DT_INIT_ARRAY 25 /* d_ptr opt. opt. */ +#define DT_FINI_ARRAY 26 /* d_ptr opt. opt. */ +#define DT_INIT_ARRAYSZ 27 /* d_val opt. opt. */ +#define DT_FINI_ARRAYSZ 28 /* d_val opt. opt. */ +#define DT_RUNPATH 29 /* d_val opt. opt. */ +#define DT_FLAGS 30 /* d_val opt. opt. */ +#define DT_ENCODING 32 /* odd/even encoding rule starts here */ +#define DT_PREINIT_ARRAY 32 /* d_ptr opt. ign. */ +#define DT_PREINIT_ARRAYSZ 33 /* d_val opt. ign. */ +#define DT_NUM 34 +#define DT_LOOS 0x6000000D +#define DT_HIOS 0x6ffff000 +#define DT_LOPROC 0x70000000 +#define DT_HIPROC 0x7fffffff + +/* + * DT_FLAGS values + */ +#define DF_ORIGIN 0x1 +#define DF_SYMBOLIC 0x2 +#define DF_TEXTREL 0x4 +#define DF_BIND_NOW 0x8 +#define DF_STATIC_TLS 0x10 + +/* + * Solaris extensions + */ +#define DT_VALRNGLO 0x6ffffd00 +#define DT_CHECKSUM 0x6ffffdf8 +#define DT_PLTPADSZ 0x6ffffdf9 +#define DT_MOVEENT 0x6ffffdfa +#define DT_MOVESZ 0x6ffffdfb +#define DT_FEATURE_1 0x6ffffdfc +#define DT_POSFLAG_1 0x6ffffdfd +#define DT_SYMINSZ 0x6ffffdfe +#define DT_SYMINENT 0x6ffffdff +#define DT_VALRNGHI 0x6ffffdff + +#define DT_ADDRRNGLO 0x6ffffe00 +#define DT_CONFIG 0x6ffffefa +#define DT_DEPAUDIT 0x6ffffefb +#define DT_AUDIT 0x6ffffefc +#define DT_PLTPAD 0x6ffffefd +#define DT_MOVETAB 0x6ffffefe +#define DT_SYMINFO 0x6ffffeff +#define DT_ADDRRNGHI 0x6ffffeff + +#define DT_RELACOUNT 0x6ffffff9 +#define DT_RELCOUNT 0x6ffffffa +#define DT_FLAGS_1 0x6ffffffb +#define DT_VERDEF 0x6ffffffc +#define DT_VERDEFNUM 0x6ffffffd +#define DT_VERNEED 0x6ffffffe +#define DT_VERNEEDNUM 0x6fffffff + +#define DT_AUXILIARY 0x7ffffffd +#define DT_USED 0x7ffffffe +#define DT_FILTER 0x7fffffff + +/* + * GNU extensions + */ +#define DT_VERSYM 0x6ffffff0 + +/* + * DT_FEATURE_1 values + */ +#define DTF_1_PARINIT 0x1 +#define DTF_1_CONFEXP 0x2 + +/* + * DT_POSFLAG_1 values + */ +#define DF_P1_LAZYLOAD 0x1 +#define DF_P1_GROUPPERM 0x2 + +/* + * DT_FLAGS_1 values + */ +#define DF_1_NOW 0x00000001 +#define DF_1_GLOBAL 0x00000002 +#define DF_1_GROUP 0x00000004 +#define DF_1_NODELETE 0x00000008 +#define DF_1_LOADFLTR 0x00000010 +#define DF_1_INITFIRST 0x00000020 +#define DF_1_NOOPEN 0x00000040 +#define DF_1_ORIGIN 0x00000080 +#define DF_1_DIRECT 0x00000100 +#define DF_1_TRANS 0x00000200 +#define DF_1_INTERPOSE 0x00000400 +#define DF_1_NODEFLIB 0x00000800 +#define DF_1_NODUMP 0x00001000 +#define DF_1_CONFALT 0x00002000 +#define DF_1_ENDFILTEE 0x00004000 +#define DF_1_DISPRELDNE 0x00008000 +#define DF_1_DISPRELPND 0x00010000 + +/* + * Syminfo structure + */ +typedef struct { + Elf32_Half si_boundto; + Elf32_Half si_flags; +} Elf32_Syminfo; + +#if __LIBELF64 +typedef struct { + Elf64_Half si_boundto; + Elf64_Half si_flags; +} Elf64_Syminfo; +#endif /* __LIBELF64 */ + +/* + * Syminfo version (stored in unused first entry) + */ +#define SYMINFO_NONE 0 +#define SYMINFO_CURRENT 1 +#define SYMINFO_NUM 2 + +/* + * si_boundto special values + */ +#define SYMINFO_BT_LOWRESERVE 0xff00 +#define SYMINFO_BT_PARENT 0xfffe /* bound to parent */ +#define SYMINFO_BT_SELF 0xffff /* bound to self */ + +/* + * si_flags + */ +#define SYMINFO_FLG_DIRECT 0x01 /* bound to an object */ +#define SYMINFO_FLG_PASSTHRU 0x02 /* pass-thru symbol */ +#define SYMINFO_FLG_COPY 0x04 /* result of a copy relocation */ +#define SYMINFO_FLG_LAZYLOAD 0x08 /* bound to lazy-loaded object */ + +/* + * Version definitions + */ +typedef struct { + Elf32_Half vd_version; + Elf32_Half vd_flags; + Elf32_Half vd_ndx; + Elf32_Half vd_cnt; + Elf32_Word vd_hash; + Elf32_Word vd_aux; + Elf32_Word vd_next; +} Elf32_Verdef; + +typedef struct { + Elf32_Word vda_name; + Elf32_Word vda_next; +} Elf32_Verdaux; + +typedef struct { + Elf32_Half vn_version; + Elf32_Half vn_cnt; + Elf32_Word vn_file; + Elf32_Word vn_aux; + Elf32_Word vn_next; +} Elf32_Verneed; + +typedef struct { + Elf32_Word vna_hash; + Elf32_Half vna_flags; + Elf32_Half vna_other; + Elf32_Word vna_name; + Elf32_Word vna_next; +} Elf32_Vernaux; + +typedef Elf32_Half Elf32_Versym; + +#if __LIBELF64 + +typedef struct { + Elf64_Half vd_version; + Elf64_Half vd_flags; + Elf64_Half vd_ndx; + Elf64_Half vd_cnt; + Elf64_Word vd_hash; + Elf64_Word vd_aux; + Elf64_Word vd_next; +} Elf64_Verdef; + +typedef struct { + Elf64_Word vda_name; + Elf64_Word vda_next; +} Elf64_Verdaux; + +typedef struct { + Elf64_Half vn_version; + Elf64_Half vn_cnt; + Elf64_Word vn_file; + Elf64_Word vn_aux; + Elf64_Word vn_next; +} Elf64_Verneed; + +typedef struct { + Elf64_Word vna_hash; + Elf64_Half vna_flags; + Elf64_Half vna_other; + Elf64_Word vna_name; + Elf64_Word vna_next; +} Elf64_Vernaux; + +typedef Elf64_Half Elf64_Versym; + +#endif /* __LIBELF64 */ + +/* + * vd_version + */ +#define VER_DEF_NONE 0 +#define VER_DEF_CURRENT 1 +#define VER_DEF_NUM 2 + +/* + * vn_version + */ +#define VER_NEED_NONE 0 +#define VER_NEED_CURRENT 1 +#define VER_NEED_NUM 2 + +/* + * vd_flags / vna_flags + */ +#define VER_FLG_BASE 0x1 /* vd_flags only */ +#define VER_FLG_WEAK 0x2 + +/* + * Elf*_Versym special values + */ +#define VER_NDX_LOCAL 0 +#define VER_NDX_GLOBAL 1 + +/* + * Solaris extensions + */ + +/* + * Move section + */ +#if __LIBELF64 + +typedef struct { + Elf32_Lword m_value; + Elf32_Word m_info; + Elf32_Word m_poffset; + Elf32_Half m_repeat; + Elf32_Half m_stride; +} Elf32_Move; + +typedef struct { + Elf64_Lword m_value; + Elf64_Xword m_info; + Elf64_Xword m_poffset; + Elf64_Half m_repeat; + Elf64_Half m_stride; +} Elf64_Move; + +#define ELF32_M_SYM(info) ((info)>>8) +#define ELF32_M_SIZE(info) ((unsigned char)(info)) +#define ELF32_M_INFO(sym, sz) (((sym)<<8)+(unsigned char)(sz)) + +#define ELF64_M_SYM(info) ((Elf64_Xword)(info)>>8) +#define ELF64_M_SIZE(info) ((unsigned char)(info)) +#define ELF64_M_INFO(sym, sz) (((Elf64_Xword)(sym)<<8)+(unsigned char)(sz)) + +#endif /* __LIBELF64 */ + +/* + * Capabilities + */ + +typedef struct { + Elf32_Word c_tag; + union { + Elf32_Word c_val; + Elf32_Addr c_ptr; + } c_un; +} Elf32_Cap; + +#if __LIBELF64 + +typedef struct { + Elf64_Xword c_tag; + union { + Elf64_Xword c_val; + Elf64_Addr c_ptr; + } c_un; +} Elf64_Cap; + +#endif /* __LIBELF64 */ + +#define CA_SUNW_NULL 0 /* c_un ignored */ +#define CA_SUNW_HW_1 1 /* c_un.c_val */ +#define CA_SUNW_SF_1 2 /* c_un.c_val */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _ELF_REPL_H */ diff --git a/desmume/src/windows/libelf_libdwarf/libelf/errors.h b/desmume/src/windows/libelf_libdwarf/libelf/errors.h new file mode 100644 index 000000000..80ee70b92 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libelf/errors.h @@ -0,0 +1,100 @@ +/* + * errors.h - exhaustive list of all error codes and messages for libelf. + * Copyright (C) 1995 - 2003, 2006 Michael Riepe + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* @(#) $Id: errors.h,v 1.18 2008/05/23 08:15:34 michael Exp $ */ + +/* dummy for xgettext */ +#define _(str) str + +__err__(ERROR_OK, _("no error")) +__err__(ERROR_UNKNOWN, _("unknown error")) +__err__(ERROR_INTERNAL, _("Internal error: unknown reason")) +__err__(ERROR_UNIMPLEMENTED, _("Internal error: not implemented")) +__err__(ERROR_WRONLY, _("Request error: cntl(ELF_C_FDREAD) on write-only file")) +__err__(ERROR_INVALID_CMD, _("Request error: invalid ELF_C_* argument")) +__err__(ERROR_FDDISABLED, _("Request error: file descriptor disabled")) +__err__(ERROR_NOTARCHIVE, _("Request error: not an archive")) +__err__(ERROR_BADOFF, _("Request error: offset out of range")) +__err__(ERROR_UNKNOWN_VERSION, _("Request error: unknown ELF version")) +__err__(ERROR_CMDMISMATCH, _("Request error: ELF_C_* argument does not match")) +__err__(ERROR_MEMBERWRITE, _("Request error: archive member begin() for writing")) +__err__(ERROR_FDMISMATCH, _("Request error: archive/member file descriptor mismatch")) +__err__(ERROR_NOTELF, _("Request error: not an ELF file")) +__err__(ERROR_CLASSMISMATCH, _("Request error: class file/memory mismatch")) +__err__(ERROR_UNKNOWN_TYPE, _("Request error: invalid ELF_T_* argument")) +__err__(ERROR_UNKNOWN_ENCODING, _("Request error: unknown data encoding")) +__err__(ERROR_DST2SMALL, _("Request error: destination buffer too small")) +__err__(ERROR_NULLBUF, _("Request error: d_buf is NULL")) +__err__(ERROR_UNKNOWN_CLASS, _("Request error: unknown ELF class")) +__err__(ERROR_ELFSCNMISMATCH, _("Request error: section does not belong to file")) +__err__(ERROR_NOSUCHSCN, _("Request error: no section at index")) +__err__(ERROR_NULLSCN, _("Request error: can't manipulate null section")) +__err__(ERROR_SCNDATAMISMATCH, _("Request error: data does not belong to section")) +__err__(ERROR_NOSTRTAB, _("Request error: no string table")) +__err__(ERROR_BADSTROFF, _("Request error: string table offset out of range")) +__err__(ERROR_RDONLY, _("Request error: update(ELF_C_WRITE) on read-only file")) +__err__(ERROR_IO_SEEK, _("I/O error: seek")) +__err__(ERROR_IO_2BIG, _("I/O error: file too big for memory")) +__err__(ERROR_IO_READ, _("I/O error: raw read")) +__err__(ERROR_IO_GETSIZE, _("I/O error: get file size")) +__err__(ERROR_IO_WRITE, _("I/O error: output write")) +__err__(ERROR_IO_TRUNC, _("I/O error: can't truncate output file")) +__err__(ERROR_VERSION_UNSET, _("Sequence error: must set ELF version first")) +__err__(ERROR_NOEHDR, _("Sequence error: must create ELF header first")) +__err__(ERROR_OUTSIDE, _("Format error: reference outside file")) +__err__(ERROR_TRUNC_ARHDR, _("Format error: archive header truncated")) +__err__(ERROR_ARFMAG, _("Format error: archive fmag")) +__err__(ERROR_ARHDR, _("Format error: archive header")) +__err__(ERROR_TRUNC_MEMBER, _("Format error: archive member truncated")) +__err__(ERROR_SIZE_ARSYMTAB, _("Format error: archive symbol table size")) +__err__(ERROR_ARSTRTAB, _("Format error: archive string table")) +__err__(ERROR_ARSPECIAL, _("Format error: archive special name unknown")) +__err__(ERROR_TRUNC_EHDR, _("Format error: ELF header truncated")) +__err__(ERROR_TRUNC_PHDR, _("Format error: program header table truncated")) +__err__(ERROR_TRUNC_SHDR, _("Format error: section header table truncated")) +__err__(ERROR_TRUNC_SCN, _("Format error: data region truncated")) +__err__(ERROR_ALIGN_PHDR, _("Format error: program header table alignment")) +__err__(ERROR_ALIGN_SHDR, _("Format error: section header table alignment")) +__err__(ERROR_VERDEF_FORMAT, _("Format error: bad parameter in Verdef record")) +__err__(ERROR_VERDEF_VERSION, _("Format error: unknown Verdef version")) +__err__(ERROR_VERNEED_FORMAT, _("Format error: bad parameter in Verneed record")) +__err__(ERROR_VERNEED_VERSION, _("Format error: unknown Verneed version")) +__err__(ERROR_EHDR_SHNUM, _("Format error: bad e_shnum value")) +__err__(ERROR_EHDR_SHENTSIZE, _("Format error: bad e_shentsize value")) +__err__(ERROR_EHDR_PHENTSIZE, _("Format error: bad e_phentsize value")) +__err__(ERROR_UNTERM, _("Format error: unterminated string in string table")) +__err__(ERROR_SCN2SMALL, _("Layout error: section size too small for data")) +__err__(ERROR_SCN_OVERLAP, _("Layout error: overlapping sections")) +__err__(ERROR_MEM_ELF, _("Memory error: elf descriptor")) +__err__(ERROR_MEM_ARSYMTAB, _("Memory error: archive symbol table")) +__err__(ERROR_MEM_ARHDR, _("Memory error: archive member header")) +__err__(ERROR_MEM_EHDR, _("Memory error: ELF header")) +__err__(ERROR_MEM_PHDR, _("Memory error: program header table")) +__err__(ERROR_MEM_SHDR, _("Memory error: section header table")) +__err__(ERROR_MEM_SCN, _("Memory error: section descriptor")) +__err__(ERROR_MEM_SCNDATA, _("Memory error: section data")) +__err__(ERROR_MEM_OUTBUF, _("Memory error: output file space")) +__err__(ERROR_MEM_TEMPORARY, _("Memory error: temporary buffer")) +__err__(ERROR_BADVALUE, _("GElf error: value out of range")) +__err__(ERROR_BADINDEX, _("GElf error: index out of range")) +__err__(ERROR_BADTYPE, _("GElf error: type mismatch")) +__err__(ERROR_MEM_SYM, _("GElf error: not enough memory for GElf_Sym")) +__err__(ERROR_MEM_DYN, _("GElf error: not enough memory for GElf_Dyn")) +__err__(ERROR_MEM_RELA, _("GElf error: not enough memory for GElf_Rela")) +__err__(ERROR_MEM_REL, _("GElf error: not enough memory for GElf_Rel")) diff --git a/desmume/src/windows/libelf_libdwarf/libelf/ext_types.h b/desmume/src/windows/libelf_libdwarf/libelf/ext_types.h new file mode 100644 index 000000000..ead116db0 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libelf/ext_types.h @@ -0,0 +1,334 @@ +/* +ext_types.h - external representation of ELF data types. +Copyright (C) 1995 - 1998 Michael Riepe + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +*/ + +/* @(#) $Id: ext_types.h,v 1.9 2008/05/23 08:15:34 michael Exp $ */ + +#ifndef _EXT_TYPES_H +#define _EXT_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* + * Scalar data types + */ +typedef unsigned char __ext_Elf32_Addr [ELF32_FSZ_ADDR]; +typedef unsigned char __ext_Elf32_Half [ELF32_FSZ_HALF]; +typedef unsigned char __ext_Elf32_Off [ELF32_FSZ_OFF]; +typedef unsigned char __ext_Elf32_Sword [ELF32_FSZ_SWORD]; +typedef unsigned char __ext_Elf32_Word [ELF32_FSZ_WORD]; + +#if __LIBELF64 + +typedef unsigned char __ext_Elf32_Lword [8]; + +typedef unsigned char __ext_Elf64_Addr [ELF64_FSZ_ADDR]; +typedef unsigned char __ext_Elf64_Half [ELF64_FSZ_HALF]; +typedef unsigned char __ext_Elf64_Off [ELF64_FSZ_OFF]; +typedef unsigned char __ext_Elf64_Sword [ELF64_FSZ_SWORD]; +typedef unsigned char __ext_Elf64_Word [ELF64_FSZ_WORD]; +typedef unsigned char __ext_Elf64_Sxword[ELF64_FSZ_SXWORD]; +typedef unsigned char __ext_Elf64_Xword [ELF64_FSZ_XWORD]; + +typedef unsigned char __ext_Elf64_Lword [8]; + +#endif /* __LIBELF64 */ + +/* + * ELF header + */ +typedef struct { + unsigned char e_ident[EI_NIDENT]; + __ext_Elf32_Half e_type; + __ext_Elf32_Half e_machine; + __ext_Elf32_Word e_version; + __ext_Elf32_Addr e_entry; + __ext_Elf32_Off e_phoff; + __ext_Elf32_Off e_shoff; + __ext_Elf32_Word e_flags; + __ext_Elf32_Half e_ehsize; + __ext_Elf32_Half e_phentsize; + __ext_Elf32_Half e_phnum; + __ext_Elf32_Half e_shentsize; + __ext_Elf32_Half e_shnum; + __ext_Elf32_Half e_shstrndx; +} __ext_Elf32_Ehdr; + +#if __LIBELF64 +typedef struct { + unsigned char e_ident[EI_NIDENT]; + __ext_Elf64_Half e_type; + __ext_Elf64_Half e_machine; + __ext_Elf64_Word e_version; + __ext_Elf64_Addr e_entry; + __ext_Elf64_Off e_phoff; + __ext_Elf64_Off e_shoff; + __ext_Elf64_Word e_flags; + __ext_Elf64_Half e_ehsize; + __ext_Elf64_Half e_phentsize; + __ext_Elf64_Half e_phnum; + __ext_Elf64_Half e_shentsize; + __ext_Elf64_Half e_shnum; + __ext_Elf64_Half e_shstrndx; +} __ext_Elf64_Ehdr; +#endif /* __LIBELF64 */ + +/* + * Section header + */ +typedef struct { + __ext_Elf32_Word sh_name; + __ext_Elf32_Word sh_type; + __ext_Elf32_Word sh_flags; + __ext_Elf32_Addr sh_addr; + __ext_Elf32_Off sh_offset; + __ext_Elf32_Word sh_size; + __ext_Elf32_Word sh_link; + __ext_Elf32_Word sh_info; + __ext_Elf32_Word sh_addralign; + __ext_Elf32_Word sh_entsize; +} __ext_Elf32_Shdr; + +#if __LIBELF64 +typedef struct { + __ext_Elf64_Word sh_name; + __ext_Elf64_Word sh_type; + __ext_Elf64_Xword sh_flags; + __ext_Elf64_Addr sh_addr; + __ext_Elf64_Off sh_offset; + __ext_Elf64_Xword sh_size; + __ext_Elf64_Word sh_link; + __ext_Elf64_Word sh_info; + __ext_Elf64_Xword sh_addralign; + __ext_Elf64_Xword sh_entsize; +} __ext_Elf64_Shdr; +#endif /* __LIBELF64 */ + +/* + * Symbol table + */ +typedef struct { + __ext_Elf32_Word st_name; + __ext_Elf32_Addr st_value; + __ext_Elf32_Word st_size; + unsigned char st_info; + unsigned char st_other; + __ext_Elf32_Half st_shndx; +} __ext_Elf32_Sym; + +#if __LIBELF64 +typedef struct { + __ext_Elf64_Word st_name; + unsigned char st_info; + unsigned char st_other; + __ext_Elf64_Half st_shndx; + __ext_Elf64_Addr st_value; + __ext_Elf64_Xword st_size; +} __ext_Elf64_Sym; +#endif /* __LIBELF64 */ + +/* + * Relocation + */ +typedef struct { + __ext_Elf32_Addr r_offset; + __ext_Elf32_Word r_info; +} __ext_Elf32_Rel; + +typedef struct { + __ext_Elf32_Addr r_offset; + __ext_Elf32_Word r_info; + __ext_Elf32_Sword r_addend; +} __ext_Elf32_Rela; + +#if __LIBELF64 +typedef struct { + __ext_Elf64_Addr r_offset; +#if __LIBELF64_IRIX + __ext_Elf64_Word r_sym; + unsigned char r_ssym; + unsigned char r_type3; + unsigned char r_type2; + unsigned char r_type; +#else /* __LIBELF64_IRIX */ + __ext_Elf64_Xword r_info; +#endif /* __LIBELF64_IRIX */ +} __ext_Elf64_Rel; + +typedef struct { + __ext_Elf64_Addr r_offset; +#if __LIBELF64_IRIX + __ext_Elf64_Word r_sym; + unsigned char r_ssym; + unsigned char r_type3; + unsigned char r_type2; + unsigned char r_type; +#else /* __LIBELF64_IRIX */ + __ext_Elf64_Xword r_info; +#endif /* __LIBELF64_IRIX */ + __ext_Elf64_Sxword r_addend; +} __ext_Elf64_Rela; +#endif /* __LIBELF64 */ + +/* + * Program header + */ +typedef struct { + __ext_Elf32_Word p_type; + __ext_Elf32_Off p_offset; + __ext_Elf32_Addr p_vaddr; + __ext_Elf32_Addr p_paddr; + __ext_Elf32_Word p_filesz; + __ext_Elf32_Word p_memsz; + __ext_Elf32_Word p_flags; + __ext_Elf32_Word p_align; +} __ext_Elf32_Phdr; + +#if __LIBELF64 +typedef struct { + __ext_Elf64_Word p_type; + __ext_Elf64_Word p_flags; + __ext_Elf64_Off p_offset; + __ext_Elf64_Addr p_vaddr; + __ext_Elf64_Addr p_paddr; + __ext_Elf64_Xword p_filesz; + __ext_Elf64_Xword p_memsz; + __ext_Elf64_Xword p_align; +} __ext_Elf64_Phdr; +#endif /* __LIBELF64 */ + +/* + * Dynamic structure + */ +typedef struct { + __ext_Elf32_Sword d_tag; + union { + __ext_Elf32_Word d_val; + __ext_Elf32_Addr d_ptr; + } d_un; +} __ext_Elf32_Dyn; + +#if __LIBELF64 +typedef struct { + __ext_Elf64_Sxword d_tag; + union { + __ext_Elf64_Xword d_val; + __ext_Elf64_Addr d_ptr; + } d_un; +} __ext_Elf64_Dyn; +#endif /* __LIBELF64 */ + +/* + * Version definitions + */ +typedef struct { + __ext_Elf32_Half vd_version; + __ext_Elf32_Half vd_flags; + __ext_Elf32_Half vd_ndx; + __ext_Elf32_Half vd_cnt; + __ext_Elf32_Word vd_hash; + __ext_Elf32_Word vd_aux; + __ext_Elf32_Word vd_next; +} __ext_Elf32_Verdef; + +typedef struct { + __ext_Elf32_Word vda_name; + __ext_Elf32_Word vda_next; +} __ext_Elf32_Verdaux; + +typedef struct { + __ext_Elf32_Half vn_version; + __ext_Elf32_Half vn_cnt; + __ext_Elf32_Word vn_file; + __ext_Elf32_Word vn_aux; + __ext_Elf32_Word vn_next; +} __ext_Elf32_Verneed; + +typedef struct { + __ext_Elf32_Word vna_hash; + __ext_Elf32_Half vna_flags; + __ext_Elf32_Half vna_other; + __ext_Elf32_Word vna_name; + __ext_Elf32_Word vna_next; +} __ext_Elf32_Vernaux; + +#if __LIBELF64 + +typedef struct { + __ext_Elf64_Half vd_version; + __ext_Elf64_Half vd_flags; + __ext_Elf64_Half vd_ndx; + __ext_Elf64_Half vd_cnt; + __ext_Elf64_Word vd_hash; + __ext_Elf64_Word vd_aux; + __ext_Elf64_Word vd_next; +} __ext_Elf64_Verdef; + +typedef struct { + __ext_Elf64_Word vda_name; + __ext_Elf64_Word vda_next; +} __ext_Elf64_Verdaux; + +typedef struct { + __ext_Elf64_Half vn_version; + __ext_Elf64_Half vn_cnt; + __ext_Elf64_Word vn_file; + __ext_Elf64_Word vn_aux; + __ext_Elf64_Word vn_next; +} __ext_Elf64_Verneed; + +typedef struct { + __ext_Elf64_Word vna_hash; + __ext_Elf64_Half vna_flags; + __ext_Elf64_Half vna_other; + __ext_Elf64_Word vna_name; + __ext_Elf64_Word vna_next; +} __ext_Elf64_Vernaux; + +#endif /* __LIBELF64 */ + +/* + * Move section + */ +#if __LIBELF64 + +typedef struct { + __ext_Elf32_Lword m_value; + __ext_Elf32_Word m_info; + __ext_Elf32_Word m_poffset; + __ext_Elf32_Half m_repeat; + __ext_Elf32_Half m_stride; +} __ext_Elf32_Move; + +typedef struct { + __ext_Elf64_Lword m_value; + __ext_Elf64_Xword m_info; + __ext_Elf64_Xword m_poffset; + __ext_Elf64_Half m_repeat; + __ext_Elf64_Half m_stride; +} __ext_Elf64_Move; + +#endif /* __LIBELF64 */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _EXT_TYPES_H */ diff --git a/desmume/src/windows/libelf_libdwarf/libelf/gelf.h b/desmume/src/windows/libelf_libdwarf/libelf/gelf.h new file mode 100644 index 000000000..5af055899 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libelf/gelf.h @@ -0,0 +1,155 @@ +/* + * gelf.h - public header file for libelf. + * Copyright (C) 2000 - 2006 Michael Riepe + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* @(#) $Id: gelf.h,v 1.16 2008/05/23 08:15:34 michael Exp $ */ + +#ifndef _GELF_H +#define _GELF_H + +#if __LIBELF_INTERNAL__ +#include +#else /* __LIBELF_INTERNAL__ */ +#include +#endif /* __LIBELF_INTERNAL__ */ + +#if __LIBELF_NEED_LINK_H +#include +#elif __LIBELF_NEED_SYS_LINK_H +#include +#endif /* __LIBELF_NEED_LINK_H */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifndef __P +# if (__STDC__ + 0) || defined(__cplusplus) || defined(_WIN32) +# define __P(args) args +# else /* __STDC__ || defined(__cplusplus) */ +# define __P(args) () +# endif /* __STDC__ || defined(__cplusplus) */ +#endif /* __P */ + +#if !__LIBELF64 + +#error "GElf is not supported on this system." + +#else /* __LIBELF64 */ + +typedef Elf64_Addr GElf_Addr; +typedef Elf64_Half GElf_Half; +typedef Elf64_Off GElf_Off; +typedef Elf64_Sword GElf_Sword; +typedef Elf64_Word GElf_Word; +typedef Elf64_Sxword GElf_Sxword; +typedef Elf64_Xword GElf_Xword; + +typedef Elf64_Ehdr GElf_Ehdr; +typedef Elf64_Phdr GElf_Phdr; +typedef Elf64_Shdr GElf_Shdr; +typedef Elf64_Dyn GElf_Dyn; +typedef Elf64_Rel GElf_Rel; +typedef Elf64_Rela GElf_Rela; +typedef Elf64_Sym GElf_Sym; + +/* + * Symbol versioning + */ +#if __LIBELF_SYMBOL_VERSIONS +typedef Elf64_Verdef GElf_Verdef; +typedef Elf64_Verneed GElf_Verneed; +typedef Elf64_Verdaux GElf_Verdaux; +typedef Elf64_Vernaux GElf_Vernaux; +#endif /* __LIBELF_SYMBOL_VERSIONS */ + +/* + * These types aren't implemented (yet) + * +typedef Elf64_Move GElf_Move; +typedef Elf64_Syminfo GElf_Syminfo; + */ + +/* + * Generic macros + */ +#define GELF_ST_BIND ELF64_ST_BIND +#define GELF_ST_TYPE ELF64_ST_TYPE +#define GELF_ST_INFO ELF64_ST_INFO + +#define GELF_R_TYPE ELF64_R_TYPE +#define GELF_R_SYM ELF64_R_SYM +#define GELF_R_INFO ELF64_R_INFO + +/* + * Function declarations + */ +extern int gelf_getclass __P((Elf *__elf)); + +extern size_t gelf_fsize __P((Elf *__elf, Elf_Type __type, size_t __count, unsigned __ver)); + +extern Elf_Data *gelf_xlatetof __P((Elf *__elf, Elf_Data *__dst, const Elf_Data *__src, unsigned __encode)); +extern Elf_Data *gelf_xlatetom __P((Elf *__elf, Elf_Data *__dst, const Elf_Data *__src, unsigned __encode)); + +extern GElf_Ehdr *gelf_getehdr __P((Elf *__elf, GElf_Ehdr *__dst)); +extern int gelf_update_ehdr __P((Elf *__elf, GElf_Ehdr *__src)); +extern unsigned long gelf_newehdr __P((Elf *__elf, int __elfclass)); + +extern GElf_Phdr *gelf_getphdr __P((Elf *__elf, int ndx, GElf_Phdr *__dst)); +extern int gelf_update_phdr __P((Elf *__elf, int ndx, GElf_Phdr *__src)); +extern unsigned long gelf_newphdr __P((Elf *__elf, size_t __phnum)); + +extern GElf_Shdr *gelf_getshdr __P((Elf_Scn *__scn, GElf_Shdr *__dst)); +extern int gelf_update_shdr __P((Elf_Scn *__scn, GElf_Shdr *__src)); + +extern GElf_Dyn *gelf_getdyn __P((Elf_Data *__src, int __ndx, GElf_Dyn *__dst)); +extern int gelf_update_dyn __P((Elf_Data *__dst, int __ndx, GElf_Dyn *__src)); + +extern GElf_Rel *gelf_getrel __P((Elf_Data *__src, int __ndx, GElf_Rel *__dst)); +extern int gelf_update_rel __P((Elf_Data *__dst, int __ndx, GElf_Rel *__src)); + +extern GElf_Rela *gelf_getrela __P((Elf_Data *__src, int __ndx, GElf_Rela *__dst)); +extern int gelf_update_rela __P((Elf_Data *__dst, int __ndx, GElf_Rela *__src)); + +extern GElf_Sym *gelf_getsym __P((Elf_Data *__src, int __ndx, GElf_Sym *__dst)); +extern int gelf_update_sym __P((Elf_Data *__dst, int __ndx, GElf_Sym *__src)); + +extern long gelf_checksum __P((Elf *__elf)); + +/* + * These functions aren't implemented (yet) + * +extern GElf_Move *gelf_getmove __P((Elf_Data *__src, int __ndx, GElf_Move *__src)); +extern int gelf_update_move __P((Elf_Data *__dst, int __ndx, GElf_Move *__src)); + * +extern GElf_Syminfo* gelf_getsyminfo __P((Elf_Data *__src, int __ndx, GElf_Syminfo *__dst)); +extern int gelf_update_syminfo __P((Elf_Data *__dst, int __ndx, GElf_Syminfo *__src)); + */ + +/* + * Extensions (not available in other versions of libelf) + */ +extern size_t gelf_msize __P((Elf *__elf, Elf_Type __type, size_t __count, unsigned __ver)); + +#endif /* __LIBELF64 */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _GELF_H */ diff --git a/desmume/src/windows/libelf_libdwarf/libelf/libelf.h b/desmume/src/windows/libelf_libdwarf/libelf/libelf.h new file mode 100644 index 000000000..3ebd0f3f9 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libelf/libelf.h @@ -0,0 +1,305 @@ +/* + * libelf.h - public header file for libelf. + * Copyright (C) 1995 - 2008 Michael Riepe + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* @(#) $Id: libelf.h,v 1.29 2009/07/07 17:57:43 michael Exp $ */ + +#ifndef _LIBELF_H +#define _LIBELF_H + +#include /* for size_t */ +#include + +#if __LIBELF_INTERNAL__ +#include +#else /* __LIBELF_INTERNAL__ */ +#include +#endif /* __LIBELF_INTERNAL__ */ + +#if defined __GNUC__ && !defined __cplusplus +#define DEPRECATED __attribute__((deprecated)) +#else +#define DEPRECATED /* nothing */ +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifndef __P +# if (__STDC__ + 0) || defined(__cplusplus) || defined(_WIN32) +# define __P(args) args +# else /* __STDC__ || defined(__cplusplus) */ +# define __P(args) () +# endif /* __STDC__ || defined(__cplusplus) */ +#endif /* __P */ + +/* + * Commands + */ +typedef enum { + ELF_C_NULL = 0, /* must be first, 0 */ + ELF_C_READ, + ELF_C_WRITE, + ELF_C_CLR, + ELF_C_SET, + ELF_C_FDDONE, + ELF_C_FDREAD, + ELF_C_RDWR, + ELF_C_NUM /* must be last */ +} Elf_Cmd; + +/* + * Flags + */ +#define ELF_F_DIRTY 0x1 +#define ELF_F_LAYOUT 0x4 +/* + * Allow sections to overlap when ELF_F_LAYOUT is in effect. + * Note that this flag ist NOT portable, and that it may render + * the output file unusable. Use with extreme caution! + */ +#define ELF_F_LAYOUT_OVERLAP 0x10000000 + +/* + * File types + */ +typedef enum { + ELF_K_NONE = 0, /* must be first, 0 */ + ELF_K_AR, + ELF_K_COFF, + ELF_K_ELF, + ELF_K_NUM /* must be last */ +} Elf_Kind; + +/* + * Data types + */ +typedef enum { + ELF_T_BYTE = 0, /* must be first, 0 */ + ELF_T_ADDR, + ELF_T_DYN, + ELF_T_EHDR, + ELF_T_HALF, + ELF_T_OFF, + ELF_T_PHDR, + ELF_T_RELA, + ELF_T_REL, + ELF_T_SHDR, + ELF_T_SWORD, + ELF_T_SYM, + ELF_T_WORD, + /* + * New stuff for 64-bit. + * + * Most implementations add ELF_T_SXWORD after ELF_T_SWORD + * which breaks binary compatibility with earlier versions. + * If this causes problems for you, contact me. + */ + ELF_T_SXWORD, + ELF_T_XWORD, + /* + * Symbol versioning. Sun broke binary compatibility (again!), + * but I won't. + */ + ELF_T_VDEF, + ELF_T_VNEED, + ELF_T_NUM /* must be last */ +} Elf_Type; + +/* + * Elf descriptor + */ +typedef struct Elf Elf; + +/* + * Section descriptor + */ +typedef struct Elf_Scn Elf_Scn; + +/* + * Archive member header + */ +typedef struct { + char* ar_name; + time_t ar_date; + long ar_uid; + long ar_gid; + unsigned long ar_mode; + off_t ar_size; + char* ar_rawname; +} Elf_Arhdr; + +/* + * Archive symbol table + */ +typedef struct { + char* as_name; + size_t as_off; + unsigned long as_hash; +} Elf_Arsym; + +/* + * Data descriptor + */ +typedef struct { + void* d_buf; + Elf_Type d_type; + size_t d_size; + off_t d_off; + size_t d_align; + unsigned d_version; +} Elf_Data; + +/* + * Function declarations + */ +extern Elf *elf_begin __P((int __fd, Elf_Cmd __cmd, Elf *__ref)); +extern Elf *elf_memory __P((char *__image, size_t __size)); +extern int elf_cntl __P((Elf *__elf, Elf_Cmd __cmd)); +extern int elf_end __P((Elf *__elf)); +extern const char *elf_errmsg __P((int __err)); +extern int elf_errno __P((void)); +extern void elf_fill __P((int __fill)); +extern unsigned elf_flagdata __P((Elf_Data *__data, Elf_Cmd __cmd, + unsigned __flags)); +extern unsigned elf_flagehdr __P((Elf *__elf, Elf_Cmd __cmd, + unsigned __flags)); +extern unsigned elf_flagelf __P((Elf *__elf, Elf_Cmd __cmd, + unsigned __flags)); +extern unsigned elf_flagphdr __P((Elf *__elf, Elf_Cmd __cmd, + unsigned __flags)); +extern unsigned elf_flagscn __P((Elf_Scn *__scn, Elf_Cmd __cmd, + unsigned __flags)); +extern unsigned elf_flagshdr __P((Elf_Scn *__scn, Elf_Cmd __cmd, + unsigned __flags)); +extern size_t elf32_fsize __P((Elf_Type __type, size_t __count, + unsigned __ver)); +extern Elf_Arhdr *elf_getarhdr __P((Elf *__elf)); +extern Elf_Arsym *elf_getarsym __P((Elf *__elf, size_t *__ptr)); +extern off_t elf_getbase __P((Elf *__elf)); +extern Elf_Data *elf_getdata __P((Elf_Scn *__scn, Elf_Data *__data)); +extern Elf32_Ehdr *elf32_getehdr __P((Elf *__elf)); +extern char *elf_getident __P((Elf *__elf, size_t *__ptr)); +extern Elf32_Phdr *elf32_getphdr __P((Elf *__elf)); +extern Elf_Scn *elf_getscn __P((Elf *__elf, size_t __index)); +extern Elf32_Shdr *elf32_getshdr __P((Elf_Scn *__scn)); +extern unsigned long elf_hash __P((const unsigned char *__name)); +extern Elf_Kind elf_kind __P((Elf *__elf)); +extern size_t elf_ndxscn __P((Elf_Scn *__scn)); +extern Elf_Data *elf_newdata __P((Elf_Scn *__scn)); +extern Elf32_Ehdr *elf32_newehdr __P((Elf *__elf)); +extern Elf32_Phdr *elf32_newphdr __P((Elf *__elf, size_t __count)); +extern Elf_Scn *elf_newscn __P((Elf *__elf)); +extern Elf_Cmd elf_next __P((Elf *__elf)); +extern Elf_Scn *elf_nextscn __P((Elf *__elf, Elf_Scn *__scn)); +extern size_t elf_rand __P((Elf *__elf, size_t __offset)); +extern Elf_Data *elf_rawdata __P((Elf_Scn *__scn, Elf_Data *__data)); +extern char *elf_rawfile __P((Elf *__elf, size_t *__ptr)); +extern char *elf_strptr __P((Elf *__elf, size_t __section, size_t __offset)); +extern off_t elf_update __P((Elf *__elf, Elf_Cmd __cmd)); +extern unsigned elf_version __P((unsigned __ver)); +extern Elf_Data *elf32_xlatetof __P((Elf_Data *__dst, const Elf_Data *__src, + unsigned __encode)); +extern Elf_Data *elf32_xlatetom __P((Elf_Data *__dst, const Elf_Data *__src, + unsigned __encode)); + +/* + * Additional functions found on Solaris + */ +extern long elf32_checksum __P((Elf *__elf)); + +#if __LIBELF64 +/* + * 64-bit ELF functions + * Not available on all platforms + */ +extern Elf64_Ehdr *elf64_getehdr __P((Elf *__elf)); +extern Elf64_Ehdr *elf64_newehdr __P((Elf *__elf)); +extern Elf64_Phdr *elf64_getphdr __P((Elf *__elf)); +extern Elf64_Phdr *elf64_newphdr __P((Elf *__elf, size_t __count)); +extern Elf64_Shdr *elf64_getshdr __P((Elf_Scn *__scn)); +extern size_t elf64_fsize __P((Elf_Type __type, size_t __count, + unsigned __ver)); +extern Elf_Data *elf64_xlatetof __P((Elf_Data *__dst, const Elf_Data *__src, + unsigned __encode)); +extern Elf_Data *elf64_xlatetom __P((Elf_Data *__dst, const Elf_Data *__src, + unsigned __encode)); + +/* + * Additional functions found on Solaris + */ +extern long elf64_checksum __P((Elf *__elf)); + +#endif /* __LIBELF64 */ + +/* + * ELF format extensions + * + * These functions return 0 on failure, 1 on success. Since other + * implementations of libelf may behave differently (there was quite + * some confusion about the correct values), they are now officially + * deprecated and should be replaced with the three new functions below. + */ +DEPRECATED extern int elf_getphnum __P((Elf *__elf, size_t *__resultp)); +DEPRECATED extern int elf_getshnum __P((Elf *__elf, size_t *__resultp)); +DEPRECATED extern int elf_getshstrndx __P((Elf *__elf, size_t *__resultp)); +/* + * Replacement functions (return -1 on failure, 0 on success). + */ +extern int elf_getphdrnum __P((Elf *__elf, size_t *__resultp)); +extern int elf_getshdrnum __P((Elf *__elf, size_t *__resultp)); +extern int elf_getshdrstrndx __P((Elf *__elf, size_t *__resultp)); + +/* + * Convenience functions + * + * elfx_update_shstrndx is elf_getshstrndx's counterpart. + * It should be used to set the e_shstrndx member. + * There is no update function for e_shnum or e_phnum + * because libelf handles them internally. + */ +extern int elfx_update_shstrndx __P((Elf *__elf, size_t __index)); + +/* + * Experimental extensions: + * + * elfx_movscn() moves section `__scn' directly after section `__after'. + * elfx_remscn() removes section `__scn'. Both functions update + * the section indices; elfx_remscn() also adjusts the ELF header's + * e_shnum member. The application is responsible for updating other + * data (in particular, e_shstrndx and the section headers' sh_link and + * sh_info members). + * + * elfx_movscn() returns the new index of the moved section. + * elfx_remscn() returns the original index of the removed section. + * A return value of zero indicates an error. + */ +extern size_t elfx_movscn __P((Elf *__elf, Elf_Scn *__scn, Elf_Scn *__after)); +extern size_t elfx_remscn __P((Elf *__elf, Elf_Scn *__scn)); + +/* + * elf_delscn() is obsolete. Please use elfx_remscn() instead. + */ +extern size_t elf_delscn __P((Elf *__elf, Elf_Scn *__scn)); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _LIBELF_H */ diff --git a/desmume/src/windows/libelf_libdwarf/libelf/nlist.h b/desmume/src/windows/libelf_libdwarf/libelf/nlist.h new file mode 100644 index 000000000..27a452ec5 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libelf/nlist.h @@ -0,0 +1,48 @@ +/* + * nlist.h - public header file for nlist(3). + * Copyright (C) 1995 - 2006 Michael Riepe + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* @(#) $Id: nlist.h,v 1.10 2008/05/23 08:15:35 michael Exp $ */ + +#ifndef _NLIST_H +#define _NLIST_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +struct nlist { + char* n_name; + long n_value; + short n_scnum; + unsigned short n_type; + char n_sclass; + char n_numaux; +}; + +#if (__STDC__ + 0) || defined(__cplusplus) || defined(_WIN32) +extern int nlist(const char *__filename, struct nlist *__nl); +#else /* __STDC__ || defined(__cplusplus) */ +extern int nlist(); +#endif /* __STDC__ || defined(__cplusplus) */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _NLIST_H */ diff --git a/desmume/src/windows/libelf_libdwarf/libelf/sys_elf.h b/desmume/src/windows/libelf_libdwarf/libelf/sys_elf.h new file mode 100644 index 000000000..0f93c5598 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libelf/sys_elf.h @@ -0,0 +1,130 @@ +/* + * lib/sys_elf.h.w32 - internal configuration file for W32 port + * Copyright (C) 2004 - 2006 Michael Riepe + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * @(#) $Id: sys_elf.h.w32,v 1.2 2006/09/07 15:55:42 michael Exp $ + */ + +/* + * DO NOT USE THIS IN APPLICATIONS - #include INSTEAD! + */ + +/* Define to `' or `' if one of them is present */ +#undef __LIBELF_HEADER_ELF_H + +/* Define if Elf32_Dyn is declared in */ +#undef __LIBELF_NEED_LINK_H + +/* Define if Elf32_Dyn is declared in */ +#undef __LIBELF_NEED_SYS_LINK_H + +/* Define if you want 64-bit support (and your system supports it) */ +#define __LIBELF64 1 + +/* Define if you want 64-bit support, and are running IRIX */ +#undef __LIBELF64_IRIX + +/* Define if you want 64-bit support, and are running Linux */ +#undef __LIBELF64_LINUX + +/* Define if you want symbol versioning (and your system supports it) */ +#define __LIBELF_SYMBOL_VERSIONS 1 + +/* Define to a 64-bit signed integer type if one exists */ +#define __libelf_i64_t __int64 + +/* Define to a 64-bit unsigned integer type if one exists */ +#define __libelf_u64_t unsigned __int64 + +/* Define to a 32-bit signed integer type if one exists */ +#define __libelf_i32_t int + +/* Define to a 32-bit unsigned integer type if one exists */ +#define __libelf_u32_t unsigned int + +/* Define to a 16-bit signed integer type if one exists */ +#define __libelf_i16_t short int + +/* Define to a 16-bit unsigned integer type if one exists */ +#define __libelf_u16_t unsigned short int + +/* + * Ok, now get the correct instance of elf.h... + */ +#ifdef __LIBELF_HEADER_ELF_H +# include __LIBELF_HEADER_ELF_H +#else /* __LIBELF_HEADER_ELF_H */ +# if __LIBELF_INTERNAL__ +# include +# else /* __LIBELF_INTERNAL__ */ +# include +# endif /* __LIBELF_INTERNAL__ */ +#endif /* __LIBELF_HEADER_ELF_H */ + +/* + * On some systems, is severely broken. Try to fix it. + */ +#ifdef __LIBELF_HEADER_ELF_H + +# ifndef ELF32_FSZ_ADDR +# define ELF32_FSZ_ADDR 4 +# define ELF32_FSZ_HALF 2 +# define ELF32_FSZ_OFF 4 +# define ELF32_FSZ_SWORD 4 +# define ELF32_FSZ_WORD 4 +# endif /* ELF32_FSZ_ADDR */ + +# ifndef STN_UNDEF +# define STN_UNDEF 0 +# endif /* STN_UNDEF */ + +# if __LIBELF64 + +# ifndef ELF64_FSZ_ADDR +# define ELF64_FSZ_ADDR 8 +# define ELF64_FSZ_HALF 2 +# define ELF64_FSZ_OFF 8 +# define ELF64_FSZ_SWORD 4 +# define ELF64_FSZ_WORD 4 +# define ELF64_FSZ_SXWORD 8 +# define ELF64_FSZ_XWORD 8 +# endif /* ELF64_FSZ_ADDR */ + +# ifndef ELF64_ST_BIND +# define ELF64_ST_BIND(i) ((i)>>4) +# define ELF64_ST_TYPE(i) ((i)&0xf) +# define ELF64_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) +# endif /* ELF64_ST_BIND */ + +# ifndef ELF64_R_SYM +# define ELF64_R_SYM(i) ((Elf64_Xword)(i)>>32) +# define ELF64_R_TYPE(i) ((i)&0xffffffffL) +# define ELF64_R_INFO(s,t) (((Elf64_Xword)(s)<<32)+((t)&0xffffffffL)) +# endif /* ELF64_R_SYM */ + +# if __LIBELF64_LINUX +typedef __libelf_u64_t Elf64_Addr; +typedef __libelf_u16_t Elf64_Half; +typedef __libelf_u64_t Elf64_Off; +typedef __libelf_i32_t Elf64_Sword; +typedef __libelf_u32_t Elf64_Word; +typedef __libelf_i64_t Elf64_Sxword; +typedef __libelf_u64_t Elf64_Xword; +# endif /* __LIBELF64_LINUX */ + +# endif /* __LIBELF64 */ +#endif /* __LIBELF_HEADER_ELF_H */ diff --git a/desmume/src/windows/libelf_libdwarf/libelf/verdef.h b/desmume/src/windows/libelf_libdwarf/libelf/verdef.h new file mode 100644 index 000000000..e17f6826b --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libelf/verdef.h @@ -0,0 +1,241 @@ +/* + * verdef.h - copy versioning information. + * Copyright (C) 2001 - 2006 Michael Riepe + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef lint +static const char verdef_h_rcsid[] = "@(#) $Id: verdef.h,v 1.13 2008/05/23 08:15:35 michael Exp $"; +#endif /* lint */ + +#if VER_DEF_CURRENT != 1 +#error libelf currently does not support VER_DEF_CURRENT != 1 +#endif /* VER_DEF_CURRENT != 1 */ + +#if TOFILE + +static void +__store_verdaux(verdaux_ftype *dst, const verdaux_mtype *src, unsigned enc) { + if (enc == ELFDATA2LSB) { + __store_u32L(dst->vda_name, src->vda_name); + __store_u32L(dst->vda_next, src->vda_next); + } + else { + __store_u32M(dst->vda_name, src->vda_name); + __store_u32M(dst->vda_next, src->vda_next); + } +} + +static void +__store_verdef(verdef_ftype *dst, const verdef_mtype *src, unsigned enc) { + if (enc == ELFDATA2LSB) { + __store_u16L(dst->vd_version, src->vd_version); + __store_u16L(dst->vd_flags, src->vd_flags); + __store_u16L(dst->vd_ndx, src->vd_ndx); + __store_u16L(dst->vd_cnt, src->vd_cnt); + __store_u32L(dst->vd_hash, src->vd_hash); + __store_u32L(dst->vd_aux, src->vd_aux); + __store_u32L(dst->vd_next, src->vd_next); + } + else { + __store_u16M(dst->vd_version, src->vd_version); + __store_u16M(dst->vd_flags, src->vd_flags); + __store_u16M(dst->vd_ndx, src->vd_ndx); + __store_u16M(dst->vd_cnt, src->vd_cnt); + __store_u32M(dst->vd_hash, src->vd_hash); + __store_u32M(dst->vd_aux, src->vd_aux); + __store_u32M(dst->vd_next, src->vd_next); + } +} + +typedef verdaux_mtype verdaux_stype; +typedef verdaux_ftype verdaux_dtype; +typedef verdef_mtype verdef_stype; +typedef verdef_ftype verdef_dtype; +typedef align_mtype verdef_atype; + +#define copy_verdaux_srctotmp(d, s, e) (*(d) = *(s)) +#define copy_verdaux_tmptodst(d, s, e) __store_verdaux((d), (s), (e)) +#define copy_verdef_srctotmp(d, s, e) (*(d) = *(s)) +#define copy_verdef_tmptodst(d, s, e) __store_verdef((d), (s), (e)) + +#define translator_suffix _tof + +#else /* TOFILE */ + +static void +__load_verdaux(verdaux_mtype *dst, const verdaux_ftype *src, unsigned enc) { + if (enc == ELFDATA2LSB) { + dst->vda_name = __load_u32L(src->vda_name); + dst->vda_next = __load_u32L(src->vda_next); + } + else { + dst->vda_name = __load_u32M(src->vda_name); + dst->vda_next = __load_u32M(src->vda_next); + } +} + +static void +__load_verdef(verdef_mtype *dst, const verdef_ftype *src, unsigned enc) { + if (enc == ELFDATA2LSB) { + dst->vd_version = __load_u16L(src->vd_version); + dst->vd_flags = __load_u16L(src->vd_flags); + dst->vd_ndx = __load_u16L(src->vd_ndx); + dst->vd_cnt = __load_u16L(src->vd_cnt); + dst->vd_hash = __load_u32L(src->vd_hash); + dst->vd_aux = __load_u32L(src->vd_aux); + dst->vd_next = __load_u32L(src->vd_next); + } + else { + dst->vd_version = __load_u16M(src->vd_version); + dst->vd_flags = __load_u16M(src->vd_flags); + dst->vd_ndx = __load_u16M(src->vd_ndx); + dst->vd_cnt = __load_u16M(src->vd_cnt); + dst->vd_hash = __load_u32M(src->vd_hash); + dst->vd_aux = __load_u32M(src->vd_aux); + dst->vd_next = __load_u32M(src->vd_next); + } +} + +typedef verdaux_ftype verdaux_stype; +typedef verdaux_mtype verdaux_dtype; +typedef verdef_ftype verdef_stype; +typedef verdef_mtype verdef_dtype; +typedef align_ftype verdef_atype; + +#define copy_verdaux_srctotmp(d, s, e) __load_verdaux((d), (s), (e)) +#define copy_verdaux_tmptodst(d, s, e) (*(d) = *(s)) +#define copy_verdef_srctotmp(d, s, e) __load_verdef((d), (s), (e)) +#define copy_verdef_tmptodst(d, s, e) (*(d) = *(s)) + +#define translator_suffix _tom + +#endif /* TOFILE */ + +#define cat3(a,b,c) a##b##c +#define xlt3(p,e,s) cat3(p,e,s) +#define xltprefix(x) xlt3(x,_,class_suffix) +#define translator(x,e) xlt3(xltprefix(_elf_##x),e,translator_suffix) + +static size_t +xlt_verdef(unsigned char *dst, const unsigned char *src, size_t n, unsigned enc) { + size_t off; + + if (sizeof(verdef_stype) != sizeof(verdef_dtype) + || sizeof(verdaux_stype) != sizeof(verdaux_dtype)) { + /* never happens for ELF v1 and Verneed v1 */ + seterr(ERROR_UNIMPLEMENTED); + return (size_t)-1; + } + /* size translation shortcut */ + if (dst == NULL) { + return n; + } + if (src == NULL) { + seterr(ERROR_NULLBUF); + return (size_t)-1; + } + off = 0; + while (off + sizeof(verdef_stype) <= n) { + const verdef_stype *svd; + verdef_dtype *dvd; + verdef_mtype vd; + size_t acount; + size_t aoff; + + /* + * check for proper alignment + */ + if (off % sizeof(verdef_atype)) { + seterr(ERROR_VERDEF_FORMAT); + return (size_t)-1; + } + /* + * copy and check src + */ + svd = (verdef_stype*)(src + off); + dvd = (verdef_dtype*)(dst + off); + copy_verdef_srctotmp(&vd, svd, enc); + if (vd.vd_version < 1 + || vd.vd_version > VER_DEF_CURRENT) { + seterr(ERROR_VERDEF_VERSION); + return (size_t)-1; + } + if (vd.vd_cnt < 1 + || vd.vd_aux == 0) { + seterr(ERROR_VERDEF_FORMAT); + return (size_t)-1; + } + copy_verdef_tmptodst(dvd, &vd, enc); + /* + * copy aux array + */ + aoff = off + vd.vd_aux; + for (acount = 0; acount < vd.vd_cnt; acount++) { + const verdaux_stype *svda; + verdaux_dtype *dvda; + verdaux_mtype vda; + + /* + * are we still inside the buffer limits? + */ + if (aoff + sizeof(verdaux_stype) > n) { + break; + } + /* + * check for proper alignment + */ + if (aoff % sizeof(verdef_atype)) { + seterr(ERROR_VERDEF_FORMAT); + return (size_t)-1; + } + /* + * copy and check src + */ + svda = (verdaux_stype*)(src + aoff); + dvda = (verdaux_dtype*)(dst + aoff); + copy_verdaux_srctotmp(&vda, svda, enc); + copy_verdaux_tmptodst(dvda, &vda, enc); + /* + * advance to next verdaux + */ + if (vda.vda_next == 0) { + /* end of list */ + break; + } + aoff += vda.vda_next; + } + /* + * advance to next verdef + */ + if (vd.vd_next == 0) { + /* end of list */ + break; + } + off += vd.vd_next; + } + return n; +} + +size_t +translator(verdef,L11)(unsigned char *dst, const unsigned char *src, size_t n) { + return xlt_verdef(dst, src, n, ELFDATA2LSB); +} + +size_t +translator(verdef,M11)(unsigned char *dst, const unsigned char *src, size_t n) { + return xlt_verdef(dst, src, n, ELFDATA2MSB); +} diff --git a/desmume/src/windows/libelf_libdwarf/libelf/verneed.h b/desmume/src/windows/libelf_libdwarf/libelf/verneed.h new file mode 100644 index 000000000..54f0f0606 --- /dev/null +++ b/desmume/src/windows/libelf_libdwarf/libelf/verneed.h @@ -0,0 +1,245 @@ +/* + * verneed.h - copy versioning information. + * Copyright (C) 2001 - 2006 Michael Riepe + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef lint +static const char verneed_h_rcsid[] = "@(#) $Id: verneed.h,v 1.13 2008/05/23 08:15:35 michael Exp $"; +#endif /* lint */ + +#if VER_NEED_CURRENT != 1 +#error libelf currently does not support VER_NEED_CURRENT != 1 +#endif /* VER_NEED_CURRENT != 1 */ + +#if TOFILE + +static void +__store_vernaux(vernaux_ftype *dst, const vernaux_mtype *src, unsigned enc) { + if (enc == ELFDATA2LSB) { + __store_u32L(dst->vna_hash, src->vna_hash); + __store_u16L(dst->vna_flags, src->vna_flags); + __store_u16L(dst->vna_other, src->vna_other); + __store_u32L(dst->vna_name, src->vna_name); + __store_u32L(dst->vna_next, src->vna_next); + } + else { + __store_u32M(dst->vna_hash, src->vna_hash); + __store_u16M(dst->vna_flags, src->vna_flags); + __store_u16M(dst->vna_other, src->vna_other); + __store_u32M(dst->vna_name, src->vna_name); + __store_u32M(dst->vna_next, src->vna_next); + } +} + +static void +__store_verneed(verneed_ftype *dst, const verneed_mtype *src, unsigned enc) { + if (enc == ELFDATA2LSB) { + __store_u16L(dst->vn_version, src->vn_version); + __store_u16L(dst->vn_cnt, src->vn_cnt); + __store_u32L(dst->vn_file, src->vn_file); + __store_u32L(dst->vn_aux, src->vn_aux); + __store_u32L(dst->vn_next, src->vn_next); + } + else { + __store_u16M(dst->vn_version, src->vn_version); + __store_u16M(dst->vn_cnt, src->vn_cnt); + __store_u32M(dst->vn_file, src->vn_file); + __store_u32M(dst->vn_aux, src->vn_aux); + __store_u32M(dst->vn_next, src->vn_next); + } +} + +typedef vernaux_mtype vernaux_stype; +typedef vernaux_ftype vernaux_dtype; +typedef verneed_mtype verneed_stype; +typedef verneed_ftype verneed_dtype; +typedef align_mtype verneed_atype; + +#define copy_vernaux_srctotmp(d, s, e) (*(d) = *(s)) +#define copy_vernaux_tmptodst(d, s, e) __store_vernaux((d), (s), (e)) +#define copy_verneed_srctotmp(d, s, e) (*(d) = *(s)) +#define copy_verneed_tmptodst(d, s, e) __store_verneed((d), (s), (e)) + +#define translator_suffix _tof + +#else /* TOFILE */ + +static void +__load_vernaux(vernaux_mtype *dst, const vernaux_ftype *src, unsigned enc) { + if (enc == ELFDATA2LSB) { + dst->vna_hash = __load_u32L(src->vna_hash); + dst->vna_flags = __load_u16L(src->vna_flags); + dst->vna_other = __load_u16L(src->vna_other); + dst->vna_name = __load_u32L(src->vna_name); + dst->vna_next = __load_u32L(src->vna_next); + } + else { + dst->vna_hash = __load_u32M(src->vna_hash); + dst->vna_flags = __load_u16M(src->vna_flags); + dst->vna_other = __load_u16M(src->vna_other); + dst->vna_name = __load_u32M(src->vna_name); + dst->vna_next = __load_u32M(src->vna_next); + } +} + +static void +__load_verneed(verneed_mtype *dst, const verneed_ftype *src, unsigned enc) { + if (enc == ELFDATA2LSB) { + dst->vn_version = __load_u16L(src->vn_version); + dst->vn_cnt = __load_u16L(src->vn_cnt); + dst->vn_file = __load_u32L(src->vn_file); + dst->vn_aux = __load_u32L(src->vn_aux); + dst->vn_next = __load_u32L(src->vn_next); + } + else { + dst->vn_version = __load_u16M(src->vn_version); + dst->vn_cnt = __load_u16M(src->vn_cnt); + dst->vn_file = __load_u32M(src->vn_file); + dst->vn_aux = __load_u32M(src->vn_aux); + dst->vn_next = __load_u32M(src->vn_next); + } +} + +typedef vernaux_ftype vernaux_stype; +typedef vernaux_mtype vernaux_dtype; +typedef verneed_ftype verneed_stype; +typedef verneed_mtype verneed_dtype; +typedef align_ftype verneed_atype; + +#define copy_vernaux_srctotmp(d, s, e) __load_vernaux((d), (s), (e)) +#define copy_vernaux_tmptodst(d, s, e) (*(d) = *(s)) +#define copy_verneed_srctotmp(d, s, e) __load_verneed((d), (s), (e)) +#define copy_verneed_tmptodst(d, s, e) (*(d) = *(s)) + +#define translator_suffix _tom + +#endif /* TOFILE */ + +#define cat3(a,b,c) a##b##c +#define xlt3(p,e,s) cat3(p,e,s) +#define xltprefix(x) xlt3(x,_,class_suffix) +#define translator(x,e) xlt3(xltprefix(_elf_##x),e,translator_suffix) + +static size_t +xlt_verneed(unsigned char *dst, const unsigned char *src, size_t n, unsigned enc) { + size_t off; + + if (sizeof(verneed_stype) != sizeof(verneed_dtype) + || sizeof(vernaux_stype) != sizeof(vernaux_dtype)) { + /* never happens for ELF v1 and Verneed v1 */ + seterr(ERROR_UNIMPLEMENTED); + return (size_t)-1; + } + /* size translation shortcut */ + if (dst == NULL) { + return n; + } + if (src == NULL) { + seterr(ERROR_NULLBUF); + return (size_t)-1; + } + off = 0; + while (off + sizeof(verneed_stype) <= n) { + const verneed_stype *svn; + verneed_dtype *dvn; + verneed_mtype vn; + size_t acount; + size_t aoff; + + /* + * check for proper alignment + */ + if (off % sizeof(verneed_atype)) { + seterr(ERROR_VERNEED_FORMAT); + return (size_t)-1; + } + /* + * copy and check src + */ + svn = (verneed_stype*)(src + off); + dvn = (verneed_dtype*)(dst + off); + copy_verneed_srctotmp(&vn, svn, enc); + if (vn.vn_version < 1 + || vn.vn_version > VER_NEED_CURRENT) { + seterr(ERROR_VERNEED_VERSION); + return (size_t)-1; + } + if (vn.vn_cnt < 1 + || vn.vn_aux == 0) { + seterr(ERROR_VERNEED_FORMAT); + return (size_t)-1; + } + copy_verneed_tmptodst(dvn, &vn, enc); + /* + * copy aux array + */ + aoff = off + vn.vn_aux; + for (acount = 0; acount < vn.vn_cnt; acount++) { + const vernaux_stype *svna; + vernaux_dtype *dvna; + vernaux_mtype vna; + + /* + * are we still inside the buffer limits? + */ + if (aoff + sizeof(vernaux_stype) > n) { + break; + } + /* + * check for proper alignment + */ + if (aoff % sizeof(verneed_atype)) { + seterr(ERROR_VERNEED_FORMAT); + return (size_t)-1; + } + /* + * copy and check src + */ + svna = (vernaux_stype*)(src + aoff); + dvna = (vernaux_dtype*)(dst + aoff); + copy_vernaux_srctotmp(&vna, svna, enc); + copy_vernaux_tmptodst(dvna, &vna, enc); + /* + * advance to next vernaux + */ + if (vna.vna_next == 0) { + /* end of list */ + break; + } + aoff += vna.vna_next; + } + /* + * advance to next verneed + */ + if (vn.vn_next == 0) { + /* end of list */ + break; + } + off += vn.vn_next; + } + return n; +} + +size_t +translator(verneed,L11)(unsigned char *dst, const unsigned char *src, size_t n) { + return xlt_verneed(dst, src, n, ELFDATA2LSB); +} + +size_t +translator(verneed,M11)(unsigned char *dst, const unsigned char *src, size_t n) { + return xlt_verneed(dst, src, n, ELFDATA2MSB); +} diff --git a/desmume/src/windows/libelf_libdwarf/libelf_libdwarf.7z b/desmume/src/windows/libelf_libdwarf/libelf_libdwarf.7z new file mode 100644 index 0000000000000000000000000000000000000000..471b8cf5a6ffd0388fd719d5bb5bc56aefdc370f GIT binary patch literal 229282 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 z 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%0D~Xh^ynG=b=~7hafk#h4({m8 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
y(z%UkMN|biF*P!I5Rv_~S7)x9$!Qx|+ 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

Soee|)L3VJ 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 z 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 +//#include +//#include +//#include +//#include +//#include +//void testelf() +//{ +// //http://webcache.googleusercontent.com/search?q=cache:XeQF6AILcrkJ:chris.rohlf.googlepages.com/libelf-howto.c+libelf+example&cd=2&hl=en&ct=clnk&gl=us +//Elf32_Ehdr *elf_header; /* ELF header */ +//Elf *elf; /* Our Elf pointer for libelf */ +//Elf_Scn *scn; /* Section Descriptor */ +//Elf_Data *edata; /* Data Descriptor */ +//GElf_Sym sym; /* Symbol */ +//GElf_Shdr shdr; /* Section Header */ +//int fd; // File Descriptor +//const char* file = "d:\\devkitPro\\examples\\nds\\hello_world\\hello_world.elf"; +//struct stat elf_stats; // fstat struct +//char *base_ptr; // ptr to our object in memory +//#define ERR -1 +// if((fd = open(file, O_RDWR)) == ERR) +// { +// printf("couldnt open %s\n", file); +// return; +// } +// if((fstat(fd, &elf_stats))) +// { +// printf("could not fstat %s\n", file); +// close(fd); +// return ; +// } +// if((base_ptr = (char *) malloc(elf_stats.st_size)) == NULL) +// { +// printf("could not malloc\n"); +// close(fd); +// return ; +// } +// if((read(fd, base_ptr, elf_stats.st_size)) < elf_stats.st_size) +// { +// printf("could not read %s\n", file); +// free(base_ptr); +// close(fd); +// return ; +// } +// /* Check libelf version first */ +// if(elf_version(EV_CURRENT) == EV_NONE) +// { +// printf("WARNING Elf Library is out of date!\n"); +// } +//elf_header = (Elf32_Ehdr *) base_ptr; // point elf_header at our object in memory +//elf = elf_begin(fd, ELF_C_READ, NULL); // Initialize 'elf' pointer to our file descriptor +///* Iterate through section headers */ +//while((scn = elf_nextscn(elf, scn)) != 0) +//{ +// gelf_getshdr(scn, &shdr); +// // print the section header type +// printf("Type: "); +// switch(shdr.sh_type) +// { +// case SHT_NULL: printf( "SHT_NULL\t"); break; +// case SHT_PROGBITS: printf( "SHT_PROGBITS"); break; +// case SHT_SYMTAB: printf( "SHT_SYMTAB"); break; +// case SHT_STRTAB: printf( "SHT_STRTAB"); break; +// case SHT_RELA: printf( "SHT_RELA\t"); break; +// case SHT_HASH: printf( "SHT_HASH\t"); break; +// case SHT_DYNAMIC: printf( "SHT_DYNAMIC"); break; +// case SHT_NOTE: printf( "SHT_NOTE\t"); break; +// case SHT_NOBITS: printf( "SHT_NOBITS"); break; +// case SHT_REL: printf( "SHT_REL\t"); break; +// case SHT_SHLIB: printf( "SHT_SHLIB"); break; +// case SHT_DYNSYM: printf( "SHT_DYNSYM"); break; +// case SHT_INIT_ARRAY: printf( "SHT_INIT_ARRAY"); break; +// case SHT_FINI_ARRAY: printf( "SHT_FINI_ARRAY"); break; +// case SHT_PREINIT_ARRAY: printf( "SHT_PREINIT_ARRAY"); break; +// case SHT_GROUP: printf( "SHT_GROUP"); break; +// case SHT_SYMTAB_SHNDX: printf( "SHT_SYMTAB_SHNDX"); break; +// case SHT_NUM: printf( "SHT_NUM\t"); break; +// case SHT_LOOS: printf( "SHT_LOOS\t"); break; +// case SHT_GNU_verdef: printf( "SHT_GNU_verdef"); break; +// case SHT_GNU_verneed: printf( "SHT_VERNEED"); break; +// case SHT_GNU_versym: printf( "SHT_GNU_versym"); break; +// default: printf( "(none) "); break; +// } +// // print the section header flags +// printf("\t("); +// if(shdr.sh_flags & SHF_WRITE) { printf("W"); } +// if(shdr.sh_flags & SHF_ALLOC) { printf("A"); } +// if(shdr.sh_flags & SHF_EXECINSTR) { printf("X"); } +// if(shdr.sh_flags & SHF_STRINGS) { printf("S"); } +// printf(")\t"); +// // the shdr name is in a string table, libelf uses elf_strptr() to find it +// // using the e_shstrndx value from the elf_header +// printf("%s\n", elf_strptr(elf, elf_header->e_shstrndx, shdr.sh_name)); +//} +//} + using namespace std; #ifdef EXPERIMENTAL_WIFI_COMM @@ -2817,6 +2913,8 @@ int WINAPI WinMain (HINSTANCE hThisInstance, int nFunsterStil) { +// testelf(); + TIMECAPS tc; if (timeGetDevCaps(&tc, sizeof(TIMECAPS))== TIMERR_NOERROR) {