15389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/* Copyright (C) 2007-2010 The Android Open Source Project
25389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine**
35389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** This software is licensed under the terms of the GNU General Public
45389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** License version 2, as published by the Free Software Foundation, and
55389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** may be copied, distributed, and modified under those terms.
65389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine**
75389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** This program is distributed in the hope that it will be useful,
85389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** but WITHOUT ANY WARRANTY; without even the implied warranty of
95389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
105389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine** GNU General Public License for more details.
115389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine*/
125389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
135389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/*
145389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine * Contains implementation of misc. DWARF utility routines.
155389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine */
165389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
17c7389bd69e570a2c8432b37399aff1976b021f0fAndrew Hsieh#include <stdio.h>
18c7389bd69e570a2c8432b37399aff1976b021f0fAndrew Hsieh#define __STDC_FORMAT_MACROS 1
19c7389bd69e570a2c8432b37399aff1976b021f0fAndrew Hsieh#include <inttypes.h>
205389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#include "dwarf_utils.h"
215389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
225389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/* "Stringifies" the parameter. */
235389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#define DWARF_NAMEFY(val) case val: return "" #val ""
245389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
255389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/* "Stringifies" two parameters. */
265389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#define DWARF_NAMEFY2(val1, val2) case val1: return "" #val1 " | " #val2 ""
275389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
285389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkineconst char*
295389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkinedwarf_at_name(Dwarf_At at) {
305389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  switch (at) {
315389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_sibling);
325389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_location);
335389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_name);
345389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_ordering);
355389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_subscr_data);
365389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_byte_size);
375389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_bit_offset);
385389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_bit_size);
395389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_element_list);
405389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_stmt_list);
415389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_low_pc);
425389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_high_pc);
435389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_language);
445389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_member);
455389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_discr);
465389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_discr_value);
475389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_visibility);
485389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_import);
495389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_string_length);
505389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_common_reference);
515389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_comp_dir);
525389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_const_value);
535389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_containing_type);
545389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_default_value);
555389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_inline);
565389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_is_optional);
575389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_lower_bound);
585389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_producer);
595389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_prototyped);
605389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_return_addr);
615389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_start_scope);
625389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY2(DW_AT_bit_stride, DW_AT_stride_size);
635389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_upper_bound);
645389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_abstract_origin);
655389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_accessibility);
665389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_address_class);
675389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_artificial);
685389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_base_types);
695389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_calling_convention);
705389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_count);
715389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_data_member_location);
725389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_decl_column);
735389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_decl_file);
745389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_decl_line);
755389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_declaration);
765389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_discr_list);
775389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_encoding);
785389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_external);
795389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_frame_base);
805389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_friend);
815389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_identifier_case);
825389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_macro_info);
835389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_namelist_item);
845389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_priority);
855389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_segment);
865389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_specification);
875389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_static_link);
885389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_type);
895389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_use_location);
905389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_variable_parameter);
915389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_virtuality);
925389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_vtable_elem_location);
935389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_allocated);
945389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_associated);
955389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_data_location);
965389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY2(DW_AT_byte_stride, DW_AT_stride);
975389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_entry_pc);
985389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_use_UTF8);
995389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_extension);
1005389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_ranges);
1015389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_trampoline);
1025389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_call_column);
1035389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_call_file);
1045389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_call_line);
1055389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_description);
1065389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_binary_scale);
1075389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_decimal_scale);
1085389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_small);
1095389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_decimal_sign);
1105389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_digit_count);
1115389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_picture_string);
1125389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_mutable);
1135389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_threads_scaled);
1145389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_explicit);
1155389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_object_pointer);
1165389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_endianity);
1175389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_elemental);
1185389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_pure);
1195389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_recursive);
1205389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_signature);
1215389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_main_subprogram);
1225389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_data_bit_offset);
1235389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_const_expr);
1245389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_enum_class);
1255389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_AT_linkage_name);
1265389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    default:
1275389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      return "DW_AT_Unknown";
1285389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  }
1295389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine}
1305389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
1315389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkineconst char*
1325389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkinedwarf_form_name(Dwarf_Form form) {
1335389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  switch (form) {
1345389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_addr);
1355389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_block2);
1365389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_block4);
1375389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_data2);
1385389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_data4);
1395389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_data8);
1405389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_string);
1415389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_block);
1425389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_block1);
1435389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_data1);
1445389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_flag);
1455389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_sdata);
1465389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_strp);
1475389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_udata);
1485389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_ref_addr);
1495389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_ref1);
1505389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_ref2);
1515389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_ref4);
1525389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_ref8);
1535389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_ref_udata);
1545389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_indirect);
1555389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_sec_offset);
1565389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_exprloc);
1575389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_flag_present);
1585389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_FORM_ref_sig8);
1595389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    default:
1605389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      return "DW_FORM_Unknown";
1615389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  }
1625389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine}
1635389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
1645389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkineconst char*
1655389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkinedwarf_tag_name(Dwarf_Tag tag) {
1665389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  switch (tag) {
1675389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_array_type);
1685389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_class_type);
1695389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_entry_point);
1705389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_enumeration_type);
1715389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_formal_parameter);
1725389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_imported_declaration);
1735389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_label);
1745389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_lexical_block);
1755389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_member);
1765389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_pointer_type);
1775389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_reference_type);
1785389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_compile_unit);
1795389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_string_type);
1805389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_structure_type);
1815389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_subroutine_type);
1825389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_typedef);
1835389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_union_type);
1845389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_unspecified_parameters);
1855389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_variant);
1865389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_common_block);
1875389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_common_inclusion);
1885389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_inheritance);
1895389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_inlined_subroutine);
1905389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_module);
1915389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_ptr_to_member_type);
1925389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_set_type);
1935389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_subrange_type);
1945389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_with_stmt);
1955389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_access_declaration);
1965389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_base_type);
1975389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_catch_block);
1985389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_const_type);
1995389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_constant);
2005389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_enumerator);
2015389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_file_type);
2025389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_friend);
2035389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_namelist);
2045389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY2(DW_TAG_namelist_item, DW_TAG_namelist_items);
2055389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_packed_type);
2065389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_subprogram);
2075389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY2(DW_TAG_template_type_parameter, DW_TAG_template_type_param);
2085389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY2(DW_TAG_template_value_parameter,
2095389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine                  DW_TAG_template_value_param);
2105389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_thrown_type);
2115389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_try_block);
2125389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_variant_part);
2135389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_variable);
2145389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_volatile_type);
2155389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_dwarf_procedure);
2165389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_restrict_type);
2175389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_interface_type);
2185389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_namespace);
2195389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_imported_module);
2205389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_unspecified_type);
2215389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_partial_unit);
2225389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_imported_unit);
2235389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_mutable_type);
2245389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_condition);
2255389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_shared_type);
2265389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_type_unit);
2275389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_rvalue_reference_type);
2285389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    DWARF_NAMEFY(DW_TAG_template_alias);
2295389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    default:
2305389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      return "DW_TAG_Unknown";
2315389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  }
2325389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine}
2335389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
2345389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkinevoid
2355389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkinedump_attrib(Dwarf_At at, Dwarf_Form form, const Dwarf_Value* val) {
2365389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  if (form != 0) {
2375389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    printf("   +++ Attribute: %s [%s]\n",
2385389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine           dwarf_at_name(at), dwarf_form_name(form));
2395389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  } else {
2405389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    printf("   +++ Attribute: %s\n", dwarf_at_name(at));
2415389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  }
2425389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  dump_value(val);
2435389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine}
2445389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
2455389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkinevoid
2465389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkinedump_value(const Dwarf_Value* attr_value) {
2475389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  printf("       Data[%03u]: (", attr_value->encoded_size);
2485389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  switch (attr_value->type) {
2495389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_U8:
2505389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      printf("BYTE)   = %u (x%02X)\n", (Elf_Word)attr_value->u8,
2515389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine                                      (Elf_Word)attr_value->u8);
2525389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
2535389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
2545389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_S8:
2555389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      printf("SBYTE)  = %d (x%02X)\n", (Elf_Sword)attr_value->s8,
2565389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine                                      (Elf_Sword)attr_value->s8);
2575389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
2585389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
2595389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_U16:
2605389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      printf("WORD)   = %u (x%04X)\n", (Elf_Word)attr_value->u16,
2615389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine                                      (Elf_Word)attr_value->u16);
2625389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
2635389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
2645389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_S16:
2655389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      printf("SWORD)  = %d (x%04X)\n", (Elf_Sword)attr_value->s16,
2665389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine                                      (Elf_Sword)attr_value->s16);
2675389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
2685389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
2695389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_U32:
2705389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      printf("DWORD)  = %u (x%08X)\n", attr_value->u32,
2715389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine                                      attr_value->u32);
2725389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
2735389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
2745389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_S32:
2755389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      printf("SDWORD) = %d (x%08X)\n", attr_value->s32,
2765389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine                                      attr_value->s32);
2775389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
2785389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
2795389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_U64:
280c7389bd69e570a2c8432b37399aff1976b021f0fAndrew Hsieh      printf("XWORD)  = %" PRIu64 " (x%" PRIX64 ")\n", attr_value->u64,
2815389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine                                          attr_value->u64);
2825389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
2835389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
2845389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_S64:
285c7389bd69e570a2c8432b37399aff1976b021f0fAndrew Hsieh      printf("SXWORD) = %" PRId64 " (x%" PRIX64 ")\n", attr_value->s64,
2865389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine                                          attr_value->s64);
2875389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
2885389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
2895389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_STR:
2905389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      printf("STRING) = %s\n", attr_value->str);
2915389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
2925389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
2935389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_PTR32:
2945389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      printf("PTR32)  = x%08X\n", attr_value->ptr32);
2955389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
2965389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
2975389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_PTR64:
298c7389bd69e570a2c8432b37399aff1976b021f0fAndrew Hsieh      printf("PTR64)  = x%08" PRIX64 "\n", attr_value->ptr64);
2995389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
3005389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
3015389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_BLOCK:
3024e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner      printf("BLOCK)  = [%u]:", attr_value->block.block_size);
3035389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      for (Elf_Xword i = 0; i < attr_value->block.block_size; i++) {
3045389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine        Elf_Byte prnt = *((const Elf_Byte*)attr_value->block.block_ptr + i);
3055389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine        printf(" x%02X", prnt);
3065389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      }
3075389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      printf("\n");
3085389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
3095389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
3105389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    case DWARF_VALUE_UNKNOWN:
3115389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    default:
3125389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      printf("UNKNOWN)");
3135389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine      break;
3145389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine  }
3155389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine}
316