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