15e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine/* Copyright (C) 2007-2010 The Android Open Source Project 25e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine** 35e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine** This software is licensed under the terms of the GNU General Public 45e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine** License version 2, as published by the Free Software Foundation, and 55e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine** may be copied, distributed, and modified under those terms. 65e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine** 75e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine** This program is distributed in the hope that it will be useful, 85e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine** but WITHOUT ANY WARRANTY; without even the implied warranty of 95e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 105e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine** GNU General Public License for more details. 115e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine*/ 125e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 135e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine/* 145e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine * Contains implementation of misc. DWARF utility routines. 155e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine */ 165e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 17b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien#include <stdio.h> 18b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien#define __STDC_FORMAT_MACROS 1 19b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien#include <inttypes.h> 205e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine#include "dwarf_utils.h" 215e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 225e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine/* "Stringifies" the parameter. */ 235e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine#define DWARF_NAMEFY(val) case val: return "" #val "" 245e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 255e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine/* "Stringifies" two parameters. */ 265e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine#define DWARF_NAMEFY2(val1, val2) case val1: return "" #val1 " | " #val2 "" 275e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 285e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkineconst char* 295e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkinedwarf_at_name(Dwarf_At at) { 305e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine switch (at) { 315e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_sibling); 325e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_location); 335e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_name); 345e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_ordering); 355e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_subscr_data); 365e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_byte_size); 375e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_bit_offset); 385e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_bit_size); 395e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_element_list); 405e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_stmt_list); 415e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_low_pc); 425e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_high_pc); 435e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_language); 445e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_member); 455e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_discr); 465e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_discr_value); 475e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_visibility); 485e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_import); 495e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_string_length); 505e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_common_reference); 515e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_comp_dir); 525e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_const_value); 535e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_containing_type); 545e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_default_value); 555e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_inline); 565e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_is_optional); 575e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_lower_bound); 585e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_producer); 595e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_prototyped); 605e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_return_addr); 615e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_start_scope); 625e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY2(DW_AT_bit_stride, DW_AT_stride_size); 635e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_upper_bound); 645e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_abstract_origin); 655e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_accessibility); 665e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_address_class); 675e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_artificial); 685e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_base_types); 695e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_calling_convention); 705e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_count); 715e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_data_member_location); 725e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_decl_column); 735e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_decl_file); 745e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_decl_line); 755e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_declaration); 765e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_discr_list); 775e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_encoding); 785e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_external); 795e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_frame_base); 805e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_friend); 815e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_identifier_case); 825e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_macro_info); 835e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_namelist_item); 845e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_priority); 855e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_segment); 865e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_specification); 875e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_static_link); 885e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_type); 895e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_use_location); 905e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_variable_parameter); 915e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_virtuality); 925e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_vtable_elem_location); 935e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_allocated); 945e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_associated); 955e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_data_location); 965e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY2(DW_AT_byte_stride, DW_AT_stride); 975e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_entry_pc); 985e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_use_UTF8); 995e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_extension); 1005e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_ranges); 1015e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_trampoline); 1025e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_call_column); 1035e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_call_file); 1045e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_call_line); 1055e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_description); 1065e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_binary_scale); 1075e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_decimal_scale); 1085e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_small); 1095e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_decimal_sign); 1105e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_digit_count); 1115e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_picture_string); 1125e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_mutable); 1135e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_threads_scaled); 1145e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_explicit); 1155e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_object_pointer); 1165e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_endianity); 1175e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_elemental); 1185e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_pure); 1195e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_recursive); 1205e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_signature); 1215e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_main_subprogram); 1225e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_data_bit_offset); 1235e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_const_expr); 1245e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_enum_class); 1255e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_AT_linkage_name); 1265e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine default: 1275e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine return "DW_AT_Unknown"; 1285e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine } 1295e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine} 1305e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 1315e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkineconst char* 1325e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkinedwarf_form_name(Dwarf_Form form) { 1335e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine switch (form) { 1345e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_addr); 1355e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_block2); 1365e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_block4); 1375e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_data2); 1385e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_data4); 1395e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_data8); 1405e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_string); 1415e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_block); 1425e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_block1); 1435e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_data1); 1445e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_flag); 1455e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_sdata); 1465e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_strp); 1475e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_udata); 1485e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_ref_addr); 1495e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_ref1); 1505e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_ref2); 1515e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_ref4); 1525e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_ref8); 1535e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_ref_udata); 1545e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_indirect); 1555e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_sec_offset); 1565e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_exprloc); 1575e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_flag_present); 1585e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_FORM_ref_sig8); 1595e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine default: 1605e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine return "DW_FORM_Unknown"; 1615e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine } 1625e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine} 1635e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 1645e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkineconst char* 1655e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkinedwarf_tag_name(Dwarf_Tag tag) { 1665e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine switch (tag) { 1675e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_array_type); 1685e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_class_type); 1695e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_entry_point); 1705e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_enumeration_type); 1715e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_formal_parameter); 1725e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_imported_declaration); 1735e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_label); 1745e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_lexical_block); 1755e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_member); 1765e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_pointer_type); 1775e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_reference_type); 1785e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_compile_unit); 1795e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_string_type); 1805e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_structure_type); 1815e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_subroutine_type); 1825e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_typedef); 1835e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_union_type); 1845e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_unspecified_parameters); 1855e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_variant); 1865e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_common_block); 1875e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_common_inclusion); 1885e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_inheritance); 1895e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_inlined_subroutine); 1905e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_module); 1915e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_ptr_to_member_type); 1925e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_set_type); 1935e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_subrange_type); 1945e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_with_stmt); 1955e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_access_declaration); 1965e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_base_type); 1975e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_catch_block); 1985e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_const_type); 1995e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_constant); 2005e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_enumerator); 2015e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_file_type); 2025e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_friend); 2035e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_namelist); 2045e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY2(DW_TAG_namelist_item, DW_TAG_namelist_items); 2055e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_packed_type); 2065e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_subprogram); 2075e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY2(DW_TAG_template_type_parameter, DW_TAG_template_type_param); 2085e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY2(DW_TAG_template_value_parameter, 2095e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DW_TAG_template_value_param); 2105e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_thrown_type); 2115e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_try_block); 2125e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_variant_part); 2135e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_variable); 2145e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_volatile_type); 2155e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_dwarf_procedure); 2165e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_restrict_type); 2175e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_interface_type); 2185e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_namespace); 2195e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_imported_module); 2205e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_unspecified_type); 2215e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_partial_unit); 2225e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_imported_unit); 2235e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_mutable_type); 2245e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_condition); 2255e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_shared_type); 2265e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_type_unit); 2275e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_rvalue_reference_type); 2285e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine DWARF_NAMEFY(DW_TAG_template_alias); 2295e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine default: 2305e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine return "DW_TAG_Unknown"; 2315e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine } 2325e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine} 2335e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 2345e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkinevoid 2355e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkinedump_attrib(Dwarf_At at, Dwarf_Form form, const Dwarf_Value* val) { 2365e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine if (form != 0) { 2375e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf(" +++ Attribute: %s [%s]\n", 2385e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine dwarf_at_name(at), dwarf_form_name(form)); 2395e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine } else { 2405e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf(" +++ Attribute: %s\n", dwarf_at_name(at)); 2415e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine } 2425e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine dump_value(val); 2435e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine} 2445e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 2455e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkinevoid 2465e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkinedump_value(const Dwarf_Value* attr_value) { 2475e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf(" Data[%03u]: (", attr_value->encoded_size); 2485e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine switch (attr_value->type) { 2495e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_U8: 2505e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf("BYTE) = %u (x%02X)\n", (Elf_Word)attr_value->u8, 251b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien (Elf_Word)attr_value->u8); 2525e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 2535e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 2545e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_S8: 2555e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf("SBYTE) = %d (x%02X)\n", (Elf_Sword)attr_value->s8, 256b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien (Elf_Sword)attr_value->s8); 2575e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 2585e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 2595e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_U16: 2605e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf("WORD) = %u (x%04X)\n", (Elf_Word)attr_value->u16, 261b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien (Elf_Word)attr_value->u16); 2625e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 2635e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 2645e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_S16: 2655e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf("SWORD) = %d (x%04X)\n", (Elf_Sword)attr_value->s16, 266b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien (Elf_Sword)attr_value->s16); 2675e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 2685e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 2695e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_U32: 2705e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf("DWORD) = %u (x%08X)\n", attr_value->u32, 271b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien attr_value->u32); 2725e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 2735e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 2745e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_S32: 2755e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf("SDWORD) = %d (x%08X)\n", attr_value->s32, 276b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien attr_value->s32); 2775e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 2785e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 2795e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_U64: 280b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien printf("XWORD) = %" PRIu64 " (x%" PRIX64 ")\n", attr_value->u64, 281b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien attr_value->u64); 2825e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 2835e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 2845e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_S64: 285b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien printf("SXWORD) = %" PRId64 " (x%" PRIX64 ")\n", attr_value->s64, 286b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien attr_value->s64); 2875e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 2885e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 2895e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_STR: 2905e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf("STRING) = %s\n", attr_value->str); 2915e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 2925e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 2935e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_PTR32: 2945e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf("PTR32) = x%08X\n", attr_value->ptr32); 2955e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 2965e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 2975e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_PTR64: 298b89bd608f0f0ca0c4a6d6f2a3579b0748bdd1ef4Logan Chien printf("PTR64) = x%08" PRIX64 "\n", attr_value->ptr64); 2995e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 3005e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 3015e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_BLOCK: 3025e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf("BLOCK) = [%u]:", attr_value->block.block_size); 3035e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine for (Elf_Xword i = 0; i < attr_value->block.block_size; i++) { 3045e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine Elf_Byte prnt = *((const Elf_Byte*)attr_value->block.block_ptr + i); 3055e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf(" x%02X", prnt); 3065e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine } 3075e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf("\n"); 3085e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 3095e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine 3105e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine case DWARF_VALUE_UNKNOWN: 3115e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine default: 3125e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine printf("UNKNOWN)"); 3135e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine break; 3145e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine } 3155e0720014efeafbf6228ae4cd93b3968c1de53fcVladimir Chtchetkine} 316