1cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2006 Red Hat, Inc.
2cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   This file is part of Red Hat elfutils.
3441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Written by Ulrich Drepper <drepper@redhat.com>, 1998.
4441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
5cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
6cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   it under the terms of the GNU General Public License as published by the
7cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Free Software Foundation; version 2 of the License.
8441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
9cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
10cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
11cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   General Public License for more details.
13cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
14cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   You should have received a copy of the GNU General Public License along
15cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
16cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
17cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
18cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is an included package of the Open Invention Network.
19cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   An included package of the Open Invention Network is a package for which
20cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Open Invention Network licensees cross-license their patents.  No patent
21cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   license is granted, either expressly or impliedly, by designation as an
22cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   included package.  Should you wish to participate in the Open Invention
23cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Network licensing program, please visit www.openinventionnetwork.com
24cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   <http://www.openinventionnetwork.com>.  */
25441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
26441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <config.h>
27441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
28441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <dwarf.h>
29441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <inttypes.h>
30441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <libelf.h>
31cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include ELFUTILS_HEADER(dw)
32441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <fcntl.h>
33441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdio.h>
34441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <string.h>
35441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <unistd.h>
36441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
37441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
38441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic const char *tagnames[] =
39441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
40441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_array_type] = "DW_TAG_array_type",
41441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_class_type] = "DW_TAG_class_type",
42441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_entry_point] = "DW_TAG_entry_point",
43441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_enumeration_type] = "DW_TAG_enumeration_type",
44441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_formal_parameter] = "DW_TAG_formal_parameter",
45441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_imported_declaration] = "DW_TAG_imported_declaration",
46441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_label] = "DW_TAG_label",
47441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_lexical_block] = "DW_TAG_lexical_block",
48441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_member] = "DW_TAG_member",
49441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_pointer_type] = "DW_TAG_pointer_type",
50441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_reference_type] = "DW_TAG_reference_type",
51441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_compile_unit] = "DW_TAG_compile_unit",
52441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_string_type] = "DW_TAG_string_type",
53441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_structure_type] = "DW_TAG_structure_type",
54441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_subroutine_type] = "DW_TAG_subroutine_type",
55441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_typedef] = "DW_TAG_typedef",
56441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_union_type] = "DW_TAG_union_type",
57441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_unspecified_parameters] = "DW_TAG_unspecified_parameters",
58441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_variant] = "DW_TAG_variant",
59441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_common_block] = "DW_TAG_common_block",
60441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_common_inclusion] = "DW_TAG_common_inclusion",
61441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_inheritance] = "DW_TAG_inheritance",
62441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_inlined_subroutine] = "DW_TAG_inlined_subroutine",
63441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_module] = "DW_TAG_module",
64441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_ptr_to_member_type] = "DW_TAG_ptr_to_member_type",
65441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_set_type] = "DW_TAG_set_type",
66441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_subrange_type] = "DW_TAG_subrange_type",
67441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_with_stmt] = "DW_TAG_with_stmt",
68441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_access_declaration] = "DW_TAG_access_declaration",
69441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_base_type] = "DW_TAG_base_type",
70441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_catch_block] = "DW_TAG_catch_block",
71441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_const_type] = "DW_TAG_const_type",
72441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_constant] = "DW_TAG_constant",
73441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_enumerator] = "DW_TAG_enumerator",
74441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_file_type] = "DW_TAG_file_type",
75441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_friend] = "DW_TAG_friend",
76441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_namelist] = "DW_TAG_namelist",
77441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_namelist_item] = "DW_TAG_namelist_item",
78441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_packed_type] = "DW_TAG_packed_type",
79441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_subprogram] = "DW_TAG_subprogram",
80cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_template_type_parameter] = "DW_TAG_template_type_parameter",
81cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_template_value_parameter] = "DW_TAG_template_value_parameter",
82441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_thrown_type] = "DW_TAG_thrown_type",
83441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_try_block] = "DW_TAG_try_block",
84441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_variant_part] = "DW_TAG_variant_part",
85441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  [DW_TAG_variable] = "DW_TAG_variable",
86cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_volatile_type] = "DW_TAG_volatile_type",
87cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_dwarf_procedure] = "DW_TAG_dwarf_procedure",
88cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_restrict_type] = "DW_TAG_restrict_type",
89cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_interface_type] = "DW_TAG_interface_type",
90cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_namespace] = "DW_TAG_namespace",
91cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_imported_module] = "DW_TAG_imported_module",
92cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_unspecified_type] = "DW_TAG_unspecified_type",
93cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_partial_unit] = "DW_TAG_partial_unit",
94cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_imported_unit] = "DW_TAG_imported_unit",
95cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_mutable_type] = "DW_TAG_mutable_type",
96cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_condition] = "DW_TAG_condition",
97cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [DW_TAG_shared_type] = "DW_TAG_shared_type",
98441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
99441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ntagnames (sizeof (tagnames) / sizeof (tagnames[0]))
100441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
101441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
102441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectconst struct
103441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
104441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int code;
105441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *name;
106441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project} attrs[] =
107441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
108441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_sibling, "sibling" },
109441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_location, "location" },
110441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_name, "name" },
111441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_ordering, "ordering" },
112441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_subscr_data, "subscr_data" },
113441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_byte_size, "byte_size" },
114441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_bit_offset, "bit_offset" },
115441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_bit_size, "bit_size" },
116441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_element_list, "element_list" },
117441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_stmt_list, "stmt_list" },
118441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_low_pc, "low_pc" },
119441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_high_pc, "high_pc" },
120441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_language, "language" },
121441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_member, "member" },
122441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_discr, "discr" },
123441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_discr_value, "discr_value" },
124441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_visibility, "visibility" },
125441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_import, "import" },
126441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_string_length, "string_length" },
127441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_common_reference, "common_reference" },
128441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_comp_dir, "comp_dir" },
129441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_const_value, "const_value" },
130441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_containing_type, "containing_type" },
131441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_default_value, "default_value" },
132441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_inline, "inline" },
133441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_is_optional, "is_optional" },
134441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_lower_bound, "lower_bound" },
135441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_producer, "producer" },
136441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_prototyped, "prototyped" },
137441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_return_addr, "return_addr" },
138441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_start_scope, "start_scope" },
139cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_bit_stride, "bit_stride" },
140441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_upper_bound, "upper_bound" },
141441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_abstract_origin, "abstract_origin" },
142441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_accessibility, "accessibility" },
143441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_address_class, "address_class" },
144441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_artificial, "artificial" },
145441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_base_types, "base_types" },
146441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_calling_convention, "calling_convention" },
147441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_count, "count" },
148441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_data_member_location, "data_member_location" },
149441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_decl_column, "decl_column" },
150441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_decl_file, "decl_file" },
151441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_decl_line, "decl_line" },
152441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_declaration, "declaration" },
153441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_discr_list, "discr_list" },
154441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_encoding, "encoding" },
155441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_external, "external" },
156441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_frame_base, "frame_base" },
157441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_friend, "friend" },
158441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_identifier_case, "identifier_case" },
159441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_macro_info, "macro_info" },
160cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_namelist_item, "namelist_item" },
161441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_priority, "priority" },
162441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_segment, "segment" },
163441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_specification, "specification" },
164441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_static_link, "static_link" },
165441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_type, "type" },
166441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_use_location, "use_location" },
167441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_variable_parameter, "variable_parameter" },
168441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_virtuality, "virtuality" },
169441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_vtable_elem_location, "vtable_elem_location" },
170cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_allocated, "allocated" },
171cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_associated, "associated" },
172cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_data_location, "data_location" },
173cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_byte_stride, "byte_stride" },
174cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_entry_pc, "entry_pc" },
175cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_use_UTF8, "use_UTF8" },
176cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_extension, "extension" },
177cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_ranges, "ranges" },
178cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_trampoline, "trampoline" },
179cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_call_column, "call_column" },
180cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_call_file, "call_file" },
181cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_call_line, "call_line" },
182cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_description, "description" },
183cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_binary_scale, "binary_scale" },
184cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_decimal_scale, "decimal_scale" },
185cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_small, "small" },
186cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_decimal_sign, "decimal_sign" },
187cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_digit_count, "digit_count" },
188cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_picture_string, "picture_string" },
189cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_mutable, "mutable" },
190cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_threads_scaled, "threads_scaled" },
191cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_explicit, "explicit" },
192cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_object_pointer, "object_pointer" },
193cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_endianity, "endianity" },
194cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_elemental, "elemental" },
195cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_pure, "pure" },
196cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_recursive, "recursive" },
197441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_fde, "MIPS_fde" },
198441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_loop_begin, "MIPS_loop_begin" },
199441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_tail_loop_begin, "MIPS_tail_loop_begin" },
200441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_epilog_begin, "MIPS_epilog_begin" },
201441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_loop_unroll_factor, "MIPS_loop_unroll_factor" },
202441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_software_pipeline_depth, "MIPS_software_pipeline_depth" },
203441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_linkage_name, "MIPS_linkage_name" },
204441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_stride, "MIPS_stride" },
205441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_abstract_name, "MIPS_abstract_name" },
206441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_clone_origin, "MIPS_clone_origin" },
207441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_has_inlines, "MIPS_has_inlines" },
208441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_stride_byte, "MIPS_stride_byte" },
209441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_stride_elem, "MIPS_stride_elem" },
210441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_ptr_dopetype, "MIPS_ptr_dopetype" },
211441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_allocatable_dopetype, "MIPS_allocatable_dopetype" },
212441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_assumed_shape_dopetype, "MIPS_assumed_shape_dopetype" },
213441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_MIPS_assumed_size, "MIPS_assumed_size" },
214441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_sf_names, "sf_names" },
215441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_src_info, "src_info" },
216441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_mac_info, "mac_info" },
217441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_src_coords, "src_coords" },
218441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  { DW_AT_body_begin, "body_begin" },
219cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  { DW_AT_body_end, "body_end" },
220441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
221441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define nattrs (sizeof (attrs) / sizeof (attrs[0]))
222441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
223441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
224441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectvoid
225441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecthandle (Dwarf *dbg, Dwarf_Die *die, int n)
226441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
227441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Die child;
228441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int tag;
229441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *str;
230441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  char buf[30];
231441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *name;
232441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Off off;
233441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Off cuoff;
234441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t cnt;
235441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Dwarf_Addr addr;
236441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int i;
237441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
238441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  tag = dwarf_tag (die);
239441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (tag != DW_TAG_invalid)
240441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
241441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (tag < ntagnames)
242441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	str = tagnames[tag];
243441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else
244441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
245441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  snprintf (buf, sizeof buf, "%#x", tag);
246441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  str = buf;
247441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
248441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
249441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  else
250441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    str = "* NO TAG *";
251441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
252441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  name = dwarf_diename (die);
253441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (name == 0)
254441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    name = "* NO NAME *";
255441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
256441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  off = dwarf_dieoffset (die);
257441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  cuoff = dwarf_cuoffset (die);
258441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
259441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  printf ("%*s%s\n", n * 5, "", str);
260441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  printf ("%*s Name      : %s\n", n * 5, "", name);
261441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  printf ("%*s Offset    : %lld\n", n * 5, "", (long long int) off);
262441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  printf ("%*s CU offset : %lld\n", n * 5, "", (long long int) cuoff);
263441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
264441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  printf ("%*s Attrs     :", n * 5, "");
265441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  for (cnt = 0; cnt < nattrs; ++cnt)
266441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    if (dwarf_hasattr (die, attrs[cnt].code))
267441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf (" %s", attrs[cnt].name);
268441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  puts ("");
269441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
270441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (dwarf_hasattr (die, DW_AT_low_pc) && dwarf_lowpc (die, &addr) == 0)
271441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
272441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Attribute attr;
273441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Addr addr2;
274441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("%*s low PC    : %#llx\n",
275441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	      n * 5, "", (unsigned long long int) addr);
276441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
277441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (dwarf_attr (die, DW_AT_low_pc, &attr) == NULL
278441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || dwarf_formaddr (&attr, &addr2) != 0
279441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || addr != addr2)
280441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_low_pc verify failed ************");
281441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (! dwarf_hasform (&attr, DW_FORM_addr))
282441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_low_pc form failed ************");
283441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (dwarf_whatform (&attr) != DW_FORM_addr)
284441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_low_pc form (2) failed ************");
285441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (dwarf_whatattr (&attr) != DW_AT_low_pc)
286441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_low_pc attr failed ************");
287441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
288441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (dwarf_hasattr (die, DW_AT_high_pc) && dwarf_highpc (die, &addr) == 0)
289441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
290441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Attribute attr;
291441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Addr addr2;
292441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("%*s high PC   : %#llx\n",
293441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	      n * 5, "", (unsigned long long int) addr);
294441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (dwarf_attr (die, DW_AT_high_pc, &attr) == NULL
295441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || dwarf_formaddr (&attr, &addr2) != 0
296441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || addr != addr2)
297441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_high_pc verify failed ************");
298441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (! dwarf_hasform (&attr, DW_FORM_addr))
299441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_high_pc form failed ************");
300441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (dwarf_whatform (&attr) != DW_FORM_addr)
301441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_high_pc form (2) failed ************");
302441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (dwarf_whatattr (&attr) != DW_AT_high_pc)
303441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_high_pc attr failed ************");
304441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
305441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
306441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (dwarf_hasattr (die, DW_AT_byte_size) && (i = dwarf_bytesize (die)) != -1)
307441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
308441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Attribute attr;
309441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Word u2;
310441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int u;
311441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("%*s byte size : %d\n", n * 5, "", i);
312441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (dwarf_attr (die, DW_AT_byte_size, &attr) == NULL
313441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || dwarf_formudata (&attr, &u2) != 0
314441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || i != (int) u2)
315441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_byte_size verify failed ************");
316441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (! dwarf_hasform (&attr, DW_FORM_data1)
317441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data2)
318441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data4)
319441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data8)
320441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_sdata)
321441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_udata))
322441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_byte_size form failed ************");
323441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if ((u = dwarf_whatform (&attr)) == 0
324441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       || (u != DW_FORM_data1
325441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data2
326441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data4
327441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data8
328441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_sdata
329441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_udata))
330441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_byte_size form (2) failed ************");
331441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (dwarf_whatattr (&attr) != DW_AT_byte_size)
332441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_byte_size attr failed ************");
333441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
334441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (dwarf_hasattr (die, DW_AT_bit_size) && (i = dwarf_bitsize (die)) != -1)
335441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
336441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Attribute attr;
337441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Word u2;
338441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int u;
339441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("%*s bit size  : %d\n", n * 5, "", i);
340441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (dwarf_attr (die, DW_AT_bit_size, &attr) == NULL
341441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || dwarf_formudata (&attr, &u2) != 0
342441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || i != (int) u2)
343441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_bit_size test failed ************");
344441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (! dwarf_hasform (&attr, DW_FORM_data1)
345441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data2)
346441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data4)
347441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data8)
348441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_sdata)
349441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_udata))
350441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_bit_size form failed ************");
351441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if ((u = dwarf_whatform (&attr)) == 0
352441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       || (u != DW_FORM_data1
353441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data2
354441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data4
355441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data8
356441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_sdata
357441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_udata))
358441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_bit_size form (2) failed ************");
359441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (dwarf_whatattr (&attr) != DW_AT_bit_size)
360441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_bit_size attr failed ************");
361441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
362441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (dwarf_hasattr (die, DW_AT_bit_offset)
363441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      && (i = dwarf_bitoffset (die)) != -1)
364441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
365441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Attribute attr;
366441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Word u2;
367441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int u;
368441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("%*s bit offset: %d\n", n * 5, "", i);
369441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (dwarf_attr (die, DW_AT_bit_offset, &attr) == NULL
370441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || dwarf_formudata (&attr, &u2) != 0
371441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || i != (int) u2)
372441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_bit_offset test failed ************");
373441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (! dwarf_hasform (&attr, DW_FORM_data1)
374441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data2)
375441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data4)
376441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data8)
377441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_sdata)
378441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_udata))
379441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_bit_offset form failed ************");
380441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if ((u = dwarf_whatform (&attr)) == 0
381441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       || (u != DW_FORM_data1
382441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data2
383441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data4
384441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data8
385441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_sdata
386441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_udata))
387441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_bit_offset form (2) failed ************");
388441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (dwarf_whatattr (&attr) != DW_AT_bit_offset)
389441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_bit_offset attr failed ************");
390441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
391441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
392441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (dwarf_hasattr (die, DW_AT_language) && (i = dwarf_srclang (die)) != -1)
393441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
394441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Attribute attr;
395441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Word u2;
396441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int u;
397441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("%*s language  : %d\n", n * 5, "", i);
398441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (dwarf_attr (die, DW_AT_language, &attr) == NULL
399441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || dwarf_formudata (&attr, &u2) != 0
400441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || i != (int) u2)
401441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_language test failed ************");
402441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (! dwarf_hasform (&attr, DW_FORM_data1)
403441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data2)
404441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data4)
405441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data8)
406441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_sdata)
407441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_udata))
408441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_language form failed ************");
409441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if ((u = dwarf_whatform (&attr)) == 0
410441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       || (u != DW_FORM_data1
411441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data2
412441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data4
413441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data8
414441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_sdata
415441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_udata))
416441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_language form (2) failed ************");
417441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (dwarf_whatattr (&attr) != DW_AT_language)
418441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_language attr failed ************");
419441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
420441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
421441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (dwarf_hasattr (die, DW_AT_ordering)
422441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      && (i = dwarf_arrayorder (die)) != -1)
423441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
424441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Attribute attr;
425441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Word u2;
426441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      unsigned int u;
427441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("%*s ordering  : %d\n", n * 5, "", i);
428441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (dwarf_attr (die, DW_AT_ordering, &attr) == NULL
429441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || dwarf_formudata (&attr, &u2) != 0
430441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || i != (int) u2)
431441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_ordering test failed ************");
432441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (! dwarf_hasform (&attr, DW_FORM_data1)
433441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data2)
434441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data4)
435441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_data8)
436441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_sdata)
437441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       && ! dwarf_hasform (&attr, DW_FORM_udata))
438441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_ordering failed ************");
439441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if ((u = dwarf_whatform (&attr)) == 0
440441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	       || (u != DW_FORM_data1
441441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data2
442441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data4
443441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_data8
444441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_sdata
445441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		   && u != DW_FORM_udata))
446441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_ordering form (2) failed ************");
447441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else if (dwarf_whatattr (&attr) != DW_AT_ordering)
448441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_ordering attr failed ************");
449441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
450441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
451441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (dwarf_hasattr (die, DW_AT_comp_dir))
452441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
453441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Attribute attr;
454441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (dwarf_attr (die, DW_AT_comp_dir, &attr) == NULL
455441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || (name = dwarf_formstring (&attr)) == NULL)
456441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_comp_dir attr failed ************");
457441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else
458441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	printf ("%*s directory : %s\n", n * 5, "", name);
459441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
460441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
461441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (dwarf_hasattr (die, DW_AT_producer))
462441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
463441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Attribute attr;
464441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (dwarf_attr (die, DW_AT_producer, &attr) == NULL
465441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || (name = dwarf_formstring (&attr)) == NULL)
466441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	puts ("************* DW_AT_comp_dir attr failed ************");
467441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else
468441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	printf ("%*s producer  : %s\n", n * 5, "", name);
469441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
470441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
471441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (dwarf_haschildren (die) != 0 && dwarf_child (die, &child) == 0)
472441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    handle (dbg, &child, n + 1);
473441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (dwarf_siblingof (die, die) == 0)
474441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    handle (dbg, die, n);
475441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
476441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
477441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
478441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectint
479441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectmain (int argc, char *argv[])
480441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
481441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project int cnt;
482441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
483441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  for (cnt = 1; cnt < argc; ++cnt)
484441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
485441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int fd = open (argv[cnt], O_RDONLY);
486441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf *dbg;
487441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
488441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("file: %s\n", basename (argv[cnt]));
489441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
490441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      dbg = dwarf_begin (fd, DWARF_C_READ);
491441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (dbg == NULL)
492441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
493441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("%s not usable\n", argv[cnt]);
494441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  close (fd);
495441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  continue;
496441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
497441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
498441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Off off = 0;
499441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Off old_off = 0;
500441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      size_t hsize;
501441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Dwarf_Off abbrev;
502441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      uint8_t addresssize;
503441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      uint8_t offsetsize;
504441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      while (dwarf_nextcu (dbg, off, &off, &hsize, &abbrev, &addresssize,
505441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			   &offsetsize) == 0)
506441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
507441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("New CU: off = %llu, hsize = %zu, ab = %llu, as = %" PRIu8
508441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  ", os = %" PRIu8 "\n",
509441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  (unsigned long long int) old_off, hsize,
510441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  (unsigned long long int) abbrev, addresssize,
511441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  offsetsize);
512441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
513441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  Dwarf_Die die;
514441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  if (dwarf_offdie (dbg, old_off + hsize, &die) != NULL)
515441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    handle (dbg, &die, 1);
516441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
517441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  old_off = off;
518441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
519441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
520441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      dwarf_end (dbg);
521441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      close (fd);
522441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
523441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
524441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return 0;
525441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
526