1 /* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2006 Red Hat, Inc.
2 This file is part of Red Hat elfutils.
3 Written by Ulrich Drepper <drepper@redhat.com>, 1998.
5 Red Hat elfutils is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by the
7 Free Software Foundation; version 2 of the License.
9 Red Hat elfutils is distributed in the hope that it will be useful, but
10 WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 General Public License for more details.
14 You should have received a copy of the GNU General Public License along
15 with Red Hat elfutils; if not, write to the Free Software Foundation,
16 Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
18 Red Hat elfutils is an included package of the Open Invention Network.
19 An included package of the Open Invention Network is a package for which
20 Open Invention Network licensees cross-license their patents. No patent
21 license is granted, either expressly or impliedly, by designation as an
22 included package. Should you wish to participate in the Open Invention
23 Network licensing program, please visit www.openinventionnetwork.com
24 <http://www.openinventionnetwork.com>. */
31 #include ELFUTILS_HEADER(dw)
38 static const char *tagnames[] =
40 [DW_TAG_array_type] = "DW_TAG_array_type",
41 [DW_TAG_class_type] = "DW_TAG_class_type",
42 [DW_TAG_entry_point] = "DW_TAG_entry_point",
43 [DW_TAG_enumeration_type] = "DW_TAG_enumeration_type",
44 [DW_TAG_formal_parameter] = "DW_TAG_formal_parameter",
45 [DW_TAG_imported_declaration] = "DW_TAG_imported_declaration",
46 [DW_TAG_label] = "DW_TAG_label",
47 [DW_TAG_lexical_block] = "DW_TAG_lexical_block",
48 [DW_TAG_member] = "DW_TAG_member",
49 [DW_TAG_pointer_type] = "DW_TAG_pointer_type",
50 [DW_TAG_reference_type] = "DW_TAG_reference_type",
51 [DW_TAG_compile_unit] = "DW_TAG_compile_unit",
52 [DW_TAG_string_type] = "DW_TAG_string_type",
53 [DW_TAG_structure_type] = "DW_TAG_structure_type",
54 [DW_TAG_subroutine_type] = "DW_TAG_subroutine_type",
55 [DW_TAG_typedef] = "DW_TAG_typedef",
56 [DW_TAG_union_type] = "DW_TAG_union_type",
57 [DW_TAG_unspecified_parameters] = "DW_TAG_unspecified_parameters",
58 [DW_TAG_variant] = "DW_TAG_variant",
59 [DW_TAG_common_block] = "DW_TAG_common_block",
60 [DW_TAG_common_inclusion] = "DW_TAG_common_inclusion",
61 [DW_TAG_inheritance] = "DW_TAG_inheritance",
62 [DW_TAG_inlined_subroutine] = "DW_TAG_inlined_subroutine",
63 [DW_TAG_module] = "DW_TAG_module",
64 [DW_TAG_ptr_to_member_type] = "DW_TAG_ptr_to_member_type",
65 [DW_TAG_set_type] = "DW_TAG_set_type",
66 [DW_TAG_subrange_type] = "DW_TAG_subrange_type",
67 [DW_TAG_with_stmt] = "DW_TAG_with_stmt",
68 [DW_TAG_access_declaration] = "DW_TAG_access_declaration",
69 [DW_TAG_base_type] = "DW_TAG_base_type",
70 [DW_TAG_catch_block] = "DW_TAG_catch_block",
71 [DW_TAG_const_type] = "DW_TAG_const_type",
72 [DW_TAG_constant] = "DW_TAG_constant",
73 [DW_TAG_enumerator] = "DW_TAG_enumerator",
74 [DW_TAG_file_type] = "DW_TAG_file_type",
75 [DW_TAG_friend] = "DW_TAG_friend",
76 [DW_TAG_namelist] = "DW_TAG_namelist",
77 [DW_TAG_namelist_item] = "DW_TAG_namelist_item",
78 [DW_TAG_packed_type] = "DW_TAG_packed_type",
79 [DW_TAG_subprogram] = "DW_TAG_subprogram",
80 [DW_TAG_template_type_parameter] = "DW_TAG_template_type_parameter",
81 [DW_TAG_template_value_parameter] = "DW_TAG_template_value_parameter",
82 [DW_TAG_thrown_type] = "DW_TAG_thrown_type",
83 [DW_TAG_try_block] = "DW_TAG_try_block",
84 [DW_TAG_variant_part] = "DW_TAG_variant_part",
85 [DW_TAG_variable] = "DW_TAG_variable",
86 [DW_TAG_volatile_type] = "DW_TAG_volatile_type",
87 [DW_TAG_dwarf_procedure] = "DW_TAG_dwarf_procedure",
88 [DW_TAG_restrict_type] = "DW_TAG_restrict_type",
89 [DW_TAG_interface_type] = "DW_TAG_interface_type",
90 [DW_TAG_namespace] = "DW_TAG_namespace",
91 [DW_TAG_imported_module] = "DW_TAG_imported_module",
92 [DW_TAG_unspecified_type] = "DW_TAG_unspecified_type",
93 [DW_TAG_partial_unit] = "DW_TAG_partial_unit",
94 [DW_TAG_imported_unit] = "DW_TAG_imported_unit",
95 [DW_TAG_mutable_type] = "DW_TAG_mutable_type",
96 [DW_TAG_condition] = "DW_TAG_condition",
97 [DW_TAG_shared_type] = "DW_TAG_shared_type",
99 #define ntagnames (sizeof (tagnames) / sizeof (tagnames[0]))
108 { DW_AT_sibling, "sibling" },
109 { DW_AT_location, "location" },
110 { DW_AT_name, "name" },
111 { DW_AT_ordering, "ordering" },
112 { DW_AT_subscr_data, "subscr_data" },
113 { DW_AT_byte_size, "byte_size" },
114 { DW_AT_bit_offset, "bit_offset" },
115 { DW_AT_bit_size, "bit_size" },
116 { DW_AT_element_list, "element_list" },
117 { DW_AT_stmt_list, "stmt_list" },
118 { DW_AT_low_pc, "low_pc" },
119 { DW_AT_high_pc, "high_pc" },
120 { DW_AT_language, "language" },
121 { DW_AT_member, "member" },
122 { DW_AT_discr, "discr" },
123 { DW_AT_discr_value, "discr_value" },
124 { DW_AT_visibility, "visibility" },
125 { DW_AT_import, "import" },
126 { DW_AT_string_length, "string_length" },
127 { DW_AT_common_reference, "common_reference" },
128 { DW_AT_comp_dir, "comp_dir" },
129 { DW_AT_const_value, "const_value" },
130 { DW_AT_containing_type, "containing_type" },
131 { DW_AT_default_value, "default_value" },
132 { DW_AT_inline, "inline" },
133 { DW_AT_is_optional, "is_optional" },
134 { DW_AT_lower_bound, "lower_bound" },
135 { DW_AT_producer, "producer" },
136 { DW_AT_prototyped, "prototyped" },
137 { DW_AT_return_addr, "return_addr" },
138 { DW_AT_start_scope, "start_scope" },
139 { DW_AT_bit_stride, "bit_stride" },
140 { DW_AT_upper_bound, "upper_bound" },
141 { DW_AT_abstract_origin, "abstract_origin" },
142 { DW_AT_accessibility, "accessibility" },
143 { DW_AT_address_class, "address_class" },
144 { DW_AT_artificial, "artificial" },
145 { DW_AT_base_types, "base_types" },
146 { DW_AT_calling_convention, "calling_convention" },
147 { DW_AT_count, "count" },
148 { DW_AT_data_member_location, "data_member_location" },
149 { DW_AT_decl_column, "decl_column" },
150 { DW_AT_decl_file, "decl_file" },
151 { DW_AT_decl_line, "decl_line" },
152 { DW_AT_declaration, "declaration" },
153 { DW_AT_discr_list, "discr_list" },
154 { DW_AT_encoding, "encoding" },
155 { DW_AT_external, "external" },
156 { DW_AT_frame_base, "frame_base" },
157 { DW_AT_friend, "friend" },
158 { DW_AT_identifier_case, "identifier_case" },
159 { DW_AT_macro_info, "macro_info" },
160 { DW_AT_namelist_item, "namelist_item" },
161 { DW_AT_priority, "priority" },
162 { DW_AT_segment, "segment" },
163 { DW_AT_specification, "specification" },
164 { DW_AT_static_link, "static_link" },
165 { DW_AT_type, "type" },
166 { DW_AT_use_location, "use_location" },
167 { DW_AT_variable_parameter, "variable_parameter" },
168 { DW_AT_virtuality, "virtuality" },
169 { DW_AT_vtable_elem_location, "vtable_elem_location" },
170 { DW_AT_allocated, "allocated" },
171 { DW_AT_associated, "associated" },
172 { DW_AT_data_location, "data_location" },
173 { DW_AT_byte_stride, "byte_stride" },
174 { DW_AT_entry_pc, "entry_pc" },
175 { DW_AT_use_UTF8, "use_UTF8" },
176 { DW_AT_extension, "extension" },
177 { DW_AT_ranges, "ranges" },
178 { DW_AT_trampoline, "trampoline" },
179 { DW_AT_call_column, "call_column" },
180 { DW_AT_call_file, "call_file" },
181 { DW_AT_call_line, "call_line" },
182 { DW_AT_description, "description" },
183 { DW_AT_binary_scale, "binary_scale" },
184 { DW_AT_decimal_scale, "decimal_scale" },
185 { DW_AT_small, "small" },
186 { DW_AT_decimal_sign, "decimal_sign" },
187 { DW_AT_digit_count, "digit_count" },
188 { DW_AT_picture_string, "picture_string" },
189 { DW_AT_mutable, "mutable" },
190 { DW_AT_threads_scaled, "threads_scaled" },
191 { DW_AT_explicit, "explicit" },
192 { DW_AT_object_pointer, "object_pointer" },
193 { DW_AT_endianity, "endianity" },
194 { DW_AT_elemental, "elemental" },
195 { DW_AT_pure, "pure" },
196 { DW_AT_recursive, "recursive" },
197 { DW_AT_MIPS_fde, "MIPS_fde" },
198 { DW_AT_MIPS_loop_begin, "MIPS_loop_begin" },
199 { DW_AT_MIPS_tail_loop_begin, "MIPS_tail_loop_begin" },
200 { DW_AT_MIPS_epilog_begin, "MIPS_epilog_begin" },
201 { DW_AT_MIPS_loop_unroll_factor, "MIPS_loop_unroll_factor" },
202 { DW_AT_MIPS_software_pipeline_depth, "MIPS_software_pipeline_depth" },
203 { DW_AT_MIPS_linkage_name, "MIPS_linkage_name" },
204 { DW_AT_MIPS_stride, "MIPS_stride" },
205 { DW_AT_MIPS_abstract_name, "MIPS_abstract_name" },
206 { DW_AT_MIPS_clone_origin, "MIPS_clone_origin" },
207 { DW_AT_MIPS_has_inlines, "MIPS_has_inlines" },
208 { DW_AT_MIPS_stride_byte, "MIPS_stride_byte" },
209 { DW_AT_MIPS_stride_elem, "MIPS_stride_elem" },
210 { DW_AT_MIPS_ptr_dopetype, "MIPS_ptr_dopetype" },
211 { DW_AT_MIPS_allocatable_dopetype, "MIPS_allocatable_dopetype" },
212 { DW_AT_MIPS_assumed_shape_dopetype, "MIPS_assumed_shape_dopetype" },
213 { DW_AT_MIPS_assumed_size, "MIPS_assumed_size" },
214 { DW_AT_sf_names, "sf_names" },
215 { DW_AT_src_info, "src_info" },
216 { DW_AT_mac_info, "mac_info" },
217 { DW_AT_src_coords, "src_coords" },
218 { DW_AT_body_begin, "body_begin" },
219 { DW_AT_body_end, "body_end" },
221 #define nattrs (sizeof (attrs) / sizeof (attrs[0]))
225 handle (Dwarf *dbg, Dwarf_Die *die, int n)
238 tag = dwarf_tag (die);
239 if (tag != DW_TAG_invalid)
245 snprintf (buf, sizeof buf, "%#x", tag);
252 name = dwarf_diename (die);
254 name = "* NO NAME *";
256 off = dwarf_dieoffset (die);
257 cuoff = dwarf_cuoffset (die);
259 printf ("%*s%s\n", n * 5, "", str);
260 printf ("%*s Name : %s\n", n * 5, "", name);
261 printf ("%*s Offset : %lld\n", n * 5, "", (long long int) off);
262 printf ("%*s CU offset : %lld\n", n * 5, "", (long long int) cuoff);
264 printf ("%*s Attrs :", n * 5, "");
265 for (cnt = 0; cnt < nattrs; ++cnt)
266 if (dwarf_hasattr (die, attrs[cnt].code))
267 printf (" %s", attrs[cnt].name);
270 if (dwarf_hasattr (die, DW_AT_low_pc) && dwarf_lowpc (die, &addr) == 0)
272 Dwarf_Attribute attr;
274 printf ("%*s low PC : %#llx\n",
275 n * 5, "", (unsigned long long int) addr);
277 if (dwarf_attr (die, DW_AT_low_pc, &attr) == NULL
278 || dwarf_formaddr (&attr, &addr2) != 0
280 puts ("************* DW_AT_low_pc verify failed ************");
281 else if (! dwarf_hasform (&attr, DW_FORM_addr))
282 puts ("************* DW_AT_low_pc form failed ************");
283 else if (dwarf_whatform (&attr) != DW_FORM_addr)
284 puts ("************* DW_AT_low_pc form (2) failed ************");
285 else if (dwarf_whatattr (&attr) != DW_AT_low_pc)
286 puts ("************* DW_AT_low_pc attr failed ************");
288 if (dwarf_hasattr (die, DW_AT_high_pc) && dwarf_highpc (die, &addr) == 0)
290 Dwarf_Attribute attr;
292 printf ("%*s high PC : %#llx\n",
293 n * 5, "", (unsigned long long int) addr);
294 if (dwarf_attr (die, DW_AT_high_pc, &attr) == NULL
295 || dwarf_formaddr (&attr, &addr2) != 0
297 puts ("************* DW_AT_high_pc verify failed ************");
298 else if (! dwarf_hasform (&attr, DW_FORM_addr))
299 puts ("************* DW_AT_high_pc form failed ************");
300 else if (dwarf_whatform (&attr) != DW_FORM_addr)
301 puts ("************* DW_AT_high_pc form (2) failed ************");
302 else if (dwarf_whatattr (&attr) != DW_AT_high_pc)
303 puts ("************* DW_AT_high_pc attr failed ************");
306 if (dwarf_hasattr (die, DW_AT_byte_size) && (i = dwarf_bytesize (die)) != -1)
308 Dwarf_Attribute attr;
311 printf ("%*s byte size : %d\n", n * 5, "", i);
312 if (dwarf_attr (die, DW_AT_byte_size, &attr) == NULL
313 || dwarf_formudata (&attr, &u2) != 0
315 puts ("************* DW_AT_byte_size verify failed ************");
316 else if (! dwarf_hasform (&attr, DW_FORM_data1)
317 && ! dwarf_hasform (&attr, DW_FORM_data2)
318 && ! dwarf_hasform (&attr, DW_FORM_data4)
319 && ! dwarf_hasform (&attr, DW_FORM_data8)
320 && ! dwarf_hasform (&attr, DW_FORM_sdata)
321 && ! dwarf_hasform (&attr, DW_FORM_udata))
322 puts ("************* DW_AT_byte_size form failed ************");
323 else if ((u = dwarf_whatform (&attr)) == 0
324 || (u != DW_FORM_data1
325 && u != DW_FORM_data2
326 && u != DW_FORM_data4
327 && u != DW_FORM_data8
328 && u != DW_FORM_sdata
329 && u != DW_FORM_udata))
330 puts ("************* DW_AT_byte_size form (2) failed ************");
331 else if (dwarf_whatattr (&attr) != DW_AT_byte_size)
332 puts ("************* DW_AT_byte_size attr failed ************");
334 if (dwarf_hasattr (die, DW_AT_bit_size) && (i = dwarf_bitsize (die)) != -1)
336 Dwarf_Attribute attr;
339 printf ("%*s bit size : %d\n", n * 5, "", i);
340 if (dwarf_attr (die, DW_AT_bit_size, &attr) == NULL
341 || dwarf_formudata (&attr, &u2) != 0
343 puts ("************* DW_AT_bit_size test failed ************");
344 else if (! dwarf_hasform (&attr, DW_FORM_data1)
345 && ! dwarf_hasform (&attr, DW_FORM_data2)
346 && ! dwarf_hasform (&attr, DW_FORM_data4)
347 && ! dwarf_hasform (&attr, DW_FORM_data8)
348 && ! dwarf_hasform (&attr, DW_FORM_sdata)
349 && ! dwarf_hasform (&attr, DW_FORM_udata))
350 puts ("************* DW_AT_bit_size form failed ************");
351 else if ((u = dwarf_whatform (&attr)) == 0
352 || (u != DW_FORM_data1
353 && u != DW_FORM_data2
354 && u != DW_FORM_data4
355 && u != DW_FORM_data8
356 && u != DW_FORM_sdata
357 && u != DW_FORM_udata))
358 puts ("************* DW_AT_bit_size form (2) failed ************");
359 else if (dwarf_whatattr (&attr) != DW_AT_bit_size)
360 puts ("************* DW_AT_bit_size attr failed ************");
362 if (dwarf_hasattr (die, DW_AT_bit_offset)
363 && (i = dwarf_bitoffset (die)) != -1)
365 Dwarf_Attribute attr;
368 printf ("%*s bit offset: %d\n", n * 5, "", i);
369 if (dwarf_attr (die, DW_AT_bit_offset, &attr) == NULL
370 || dwarf_formudata (&attr, &u2) != 0
372 puts ("************* DW_AT_bit_offset test failed ************");
373 else if (! dwarf_hasform (&attr, DW_FORM_data1)
374 && ! dwarf_hasform (&attr, DW_FORM_data2)
375 && ! dwarf_hasform (&attr, DW_FORM_data4)
376 && ! dwarf_hasform (&attr, DW_FORM_data8)
377 && ! dwarf_hasform (&attr, DW_FORM_sdata)
378 && ! dwarf_hasform (&attr, DW_FORM_udata))
379 puts ("************* DW_AT_bit_offset form failed ************");
380 else if ((u = dwarf_whatform (&attr)) == 0
381 || (u != DW_FORM_data1
382 && u != DW_FORM_data2
383 && u != DW_FORM_data4
384 && u != DW_FORM_data8
385 && u != DW_FORM_sdata
386 && u != DW_FORM_udata))
387 puts ("************* DW_AT_bit_offset form (2) failed ************");
388 else if (dwarf_whatattr (&attr) != DW_AT_bit_offset)
389 puts ("************* DW_AT_bit_offset attr failed ************");
392 if (dwarf_hasattr (die, DW_AT_language) && (i = dwarf_srclang (die)) != -1)
394 Dwarf_Attribute attr;
397 printf ("%*s language : %d\n", n * 5, "", i);
398 if (dwarf_attr (die, DW_AT_language, &attr) == NULL
399 || dwarf_formudata (&attr, &u2) != 0
401 puts ("************* DW_AT_language test failed ************");
402 else if (! dwarf_hasform (&attr, DW_FORM_data1)
403 && ! dwarf_hasform (&attr, DW_FORM_data2)
404 && ! dwarf_hasform (&attr, DW_FORM_data4)
405 && ! dwarf_hasform (&attr, DW_FORM_data8)
406 && ! dwarf_hasform (&attr, DW_FORM_sdata)
407 && ! dwarf_hasform (&attr, DW_FORM_udata))
408 puts ("************* DW_AT_language form failed ************");
409 else if ((u = dwarf_whatform (&attr)) == 0
410 || (u != DW_FORM_data1
411 && u != DW_FORM_data2
412 && u != DW_FORM_data4
413 && u != DW_FORM_data8
414 && u != DW_FORM_sdata
415 && u != DW_FORM_udata))
416 puts ("************* DW_AT_language form (2) failed ************");
417 else if (dwarf_whatattr (&attr) != DW_AT_language)
418 puts ("************* DW_AT_language attr failed ************");
421 if (dwarf_hasattr (die, DW_AT_ordering)
422 && (i = dwarf_arrayorder (die)) != -1)
424 Dwarf_Attribute attr;
427 printf ("%*s ordering : %d\n", n * 5, "", i);
428 if (dwarf_attr (die, DW_AT_ordering, &attr) == NULL
429 || dwarf_formudata (&attr, &u2) != 0
431 puts ("************* DW_AT_ordering test failed ************");
432 else if (! dwarf_hasform (&attr, DW_FORM_data1)
433 && ! dwarf_hasform (&attr, DW_FORM_data2)
434 && ! dwarf_hasform (&attr, DW_FORM_data4)
435 && ! dwarf_hasform (&attr, DW_FORM_data8)
436 && ! dwarf_hasform (&attr, DW_FORM_sdata)
437 && ! dwarf_hasform (&attr, DW_FORM_udata))
438 puts ("************* DW_AT_ordering failed ************");
439 else if ((u = dwarf_whatform (&attr)) == 0
440 || (u != DW_FORM_data1
441 && u != DW_FORM_data2
442 && u != DW_FORM_data4
443 && u != DW_FORM_data8
444 && u != DW_FORM_sdata
445 && u != DW_FORM_udata))
446 puts ("************* DW_AT_ordering form (2) failed ************");
447 else if (dwarf_whatattr (&attr) != DW_AT_ordering)
448 puts ("************* DW_AT_ordering attr failed ************");
451 if (dwarf_hasattr (die, DW_AT_comp_dir))
453 Dwarf_Attribute attr;
454 if (dwarf_attr (die, DW_AT_comp_dir, &attr) == NULL
455 || (name = dwarf_formstring (&attr)) == NULL)
456 puts ("************* DW_AT_comp_dir attr failed ************");
458 printf ("%*s directory : %s\n", n * 5, "", name);
461 if (dwarf_hasattr (die, DW_AT_producer))
463 Dwarf_Attribute attr;
464 if (dwarf_attr (die, DW_AT_producer, &attr) == NULL
465 || (name = dwarf_formstring (&attr)) == NULL)
466 puts ("************* DW_AT_comp_dir attr failed ************");
468 printf ("%*s producer : %s\n", n * 5, "", name);
471 if (dwarf_haschildren (die) != 0 && dwarf_child (die, &child) == 0)
472 handle (dbg, &child, n + 1);
473 if (dwarf_siblingof (die, die) == 0)
474 handle (dbg, die, n);
479 main (int argc, char *argv[])
483 for (cnt = 1; cnt < argc; ++cnt)
485 int fd = open (argv[cnt], O_RDONLY);
488 printf ("file: %s\n", basename (argv[cnt]));
490 dbg = dwarf_begin (fd, DWARF_C_READ);
493 printf ("%s not usable\n", argv[cnt]);
499 Dwarf_Off old_off = 0;
504 while (dwarf_nextcu (dbg, off, &off, &hsize, &abbrev, &addresssize,
507 printf ("New CU: off = %llu, hsize = %zu, ab = %llu, as = %" PRIu8
508 ", os = %" PRIu8 "\n",
509 (unsigned long long int) old_off, hsize,
510 (unsigned long long int) abbrev, addresssize,
514 if (dwarf_offdie (dbg, old_off + hsize, &die) != NULL)
515 handle (dbg, &die, 1);