2009-09-15 H.J. Lu <hongjiu.lu@intel.com>
[binutils.git] / binutils / dwarf.c
blob5eeef088911ac3f3ee2ac1d66b9f9e360e125955
1 /* dwarf.c -- display DWARF contents of a BFD binary file
2 Copyright 2005, 2006, 2007, 2008, 2009
3 Free Software Foundation, Inc.
5 This file is part of GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, USA. */
22 #include "sysdep.h"
23 #include "libiberty.h"
24 #include "bfd.h"
25 #include "bucomm.h"
26 #include "elf/common.h"
27 #include "dwarf2.h"
28 #include "dwarf.h"
30 static int have_frame_base;
31 static int need_base_address;
33 static unsigned int last_pointer_size = 0;
34 static int warned_about_missing_comp_units = FALSE;
36 static unsigned int num_debug_info_entries = 0;
37 static debug_info *debug_information = NULL;
38 /* Special value for num_debug_info_entries to indicate
39 that the .debug_info section could not be loaded/parsed. */
40 #define DEBUG_INFO_UNAVAILABLE (unsigned int) -1
42 int eh_addr_size;
44 int do_debug_info;
45 int do_debug_abbrevs;
46 int do_debug_lines;
47 int do_debug_pubnames;
48 int do_debug_aranges;
49 int do_debug_ranges;
50 int do_debug_frames;
51 int do_debug_frames_interp;
52 int do_debug_macinfo;
53 int do_debug_str;
54 int do_debug_loc;
55 int do_wide;
57 /* Values for do_debug_lines. */
58 #define FLAG_DEBUG_LINES_RAW 1
59 #define FLAG_DEBUG_LINES_DECODED 2
61 dwarf_vma (*byte_get) (unsigned char *, int);
63 dwarf_vma
64 byte_get_little_endian (unsigned char *field, int size)
66 switch (size)
68 case 1:
69 return *field;
71 case 2:
72 return ((unsigned int) (field[0]))
73 | (((unsigned int) (field[1])) << 8);
75 case 3:
76 return ((unsigned long) (field[0]))
77 | (((unsigned long) (field[1])) << 8)
78 | (((unsigned long) (field[2])) << 16);
80 case 4:
81 return ((unsigned long) (field[0]))
82 | (((unsigned long) (field[1])) << 8)
83 | (((unsigned long) (field[2])) << 16)
84 | (((unsigned long) (field[3])) << 24);
86 case 8:
87 if (sizeof (dwarf_vma) == 8)
88 return ((dwarf_vma) (field[0]))
89 | (((dwarf_vma) (field[1])) << 8)
90 | (((dwarf_vma) (field[2])) << 16)
91 | (((dwarf_vma) (field[3])) << 24)
92 | (((dwarf_vma) (field[4])) << 32)
93 | (((dwarf_vma) (field[5])) << 40)
94 | (((dwarf_vma) (field[6])) << 48)
95 | (((dwarf_vma) (field[7])) << 56);
96 else if (sizeof (dwarf_vma) == 4)
97 /* We want to extract data from an 8 byte wide field and
98 place it into a 4 byte wide field. Since this is a little
99 endian source we can just use the 4 byte extraction code. */
100 return ((unsigned long) (field[0]))
101 | (((unsigned long) (field[1])) << 8)
102 | (((unsigned long) (field[2])) << 16)
103 | (((unsigned long) (field[3])) << 24);
105 default:
106 error (_("Unhandled data length: %d\n"), size);
107 abort ();
111 dwarf_vma
112 byte_get_big_endian (unsigned char *field, int size)
114 switch (size)
116 case 1:
117 return *field;
119 case 2:
120 return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
122 case 3:
123 return ((unsigned long) (field[2]))
124 | (((unsigned long) (field[1])) << 8)
125 | (((unsigned long) (field[0])) << 16);
127 case 4:
128 return ((unsigned long) (field[3]))
129 | (((unsigned long) (field[2])) << 8)
130 | (((unsigned long) (field[1])) << 16)
131 | (((unsigned long) (field[0])) << 24);
133 case 8:
134 if (sizeof (dwarf_vma) == 8)
135 return ((dwarf_vma) (field[7]))
136 | (((dwarf_vma) (field[6])) << 8)
137 | (((dwarf_vma) (field[5])) << 16)
138 | (((dwarf_vma) (field[4])) << 24)
139 | (((dwarf_vma) (field[3])) << 32)
140 | (((dwarf_vma) (field[2])) << 40)
141 | (((dwarf_vma) (field[1])) << 48)
142 | (((dwarf_vma) (field[0])) << 56);
143 else if (sizeof (dwarf_vma) == 4)
145 /* Although we are extracing data from an 8 byte wide field,
146 we are returning only 4 bytes of data. */
147 field += 4;
148 return ((unsigned long) (field[3]))
149 | (((unsigned long) (field[2])) << 8)
150 | (((unsigned long) (field[1])) << 16)
151 | (((unsigned long) (field[0])) << 24);
154 default:
155 error (_("Unhandled data length: %d\n"), size);
156 abort ();
160 static dwarf_vma
161 byte_get_signed (unsigned char *field, int size)
163 dwarf_vma x = byte_get (field, size);
165 switch (size)
167 case 1:
168 return (x ^ 0x80) - 0x80;
169 case 2:
170 return (x ^ 0x8000) - 0x8000;
171 case 4:
172 return (x ^ 0x80000000) - 0x80000000;
173 case 8:
174 return x;
175 default:
176 abort ();
180 static int
181 size_of_encoded_value (int encoding)
183 switch (encoding & 0x7)
185 default: /* ??? */
186 case 0: return eh_addr_size;
187 case 2: return 2;
188 case 3: return 4;
189 case 4: return 8;
193 static dwarf_vma
194 get_encoded_value (unsigned char *data, int encoding)
196 int size = size_of_encoded_value (encoding);
198 if (encoding & DW_EH_PE_signed)
199 return byte_get_signed (data, size);
200 else
201 return byte_get (data, size);
204 /* Print a dwarf_vma value (typically an address, offset or length) in
205 hexadecimal format, followed by a space. The length of the value (and
206 hence the precision displayed) is determined by the byte_size parameter. */
208 static void
209 print_dwarf_vma (dwarf_vma val, unsigned byte_size)
211 static char buff[18];
213 /* Printf does not have a way of specifiying a maximum field width for an
214 integer value, so we print the full value into a buffer and then select
215 the precision we need. */
216 #if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
217 #ifndef __MSVCRT__
218 snprintf (buff, sizeof (buff), "%16.16llx ", val);
219 #else
220 snprintf (buff, sizeof (buff), "%016I64x ", val);
221 #endif
222 #else
223 snprintf (buff, sizeof (buff), "%16.16lx ", val);
224 #endif
226 fputs (buff + (byte_size == 4 ? 8 : 0), stdout);
229 static unsigned long int
230 read_leb128 (unsigned char *data, unsigned int *length_return, int sign)
232 unsigned long int result = 0;
233 unsigned int num_read = 0;
234 unsigned int shift = 0;
235 unsigned char byte;
239 byte = *data++;
240 num_read++;
242 result |= ((unsigned long int) (byte & 0x7f)) << shift;
244 shift += 7;
247 while (byte & 0x80);
249 if (length_return != NULL)
250 *length_return = num_read;
252 if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
253 result |= -1L << shift;
255 return result;
258 typedef struct State_Machine_Registers
260 unsigned long address;
261 unsigned int file;
262 unsigned int line;
263 unsigned int column;
264 int is_stmt;
265 int basic_block;
266 int end_sequence;
267 /* This variable hold the number of the last entry seen
268 in the File Table. */
269 unsigned int last_file_entry;
270 } SMR;
272 static SMR state_machine_regs;
274 static void
275 reset_state_machine (int is_stmt)
277 state_machine_regs.address = 0;
278 state_machine_regs.file = 1;
279 state_machine_regs.line = 1;
280 state_machine_regs.column = 0;
281 state_machine_regs.is_stmt = is_stmt;
282 state_machine_regs.basic_block = 0;
283 state_machine_regs.end_sequence = 0;
284 state_machine_regs.last_file_entry = 0;
287 /* Handled an extend line op.
288 Returns the number of bytes read. */
290 static int
291 process_extended_line_op (unsigned char *data, int is_stmt)
293 unsigned char op_code;
294 unsigned int bytes_read;
295 unsigned int len;
296 unsigned char *name;
297 unsigned long adr;
299 len = read_leb128 (data, & bytes_read, 0);
300 data += bytes_read;
302 if (len == 0)
304 warn (_("badly formed extended line op encountered!\n"));
305 return bytes_read;
308 len += bytes_read;
309 op_code = *data++;
311 printf (_(" Extended opcode %d: "), op_code);
313 switch (op_code)
315 case DW_LNE_end_sequence:
316 printf (_("End of Sequence\n\n"));
317 reset_state_machine (is_stmt);
318 break;
320 case DW_LNE_set_address:
321 adr = byte_get (data, len - bytes_read - 1);
322 printf (_("set Address to 0x%lx\n"), adr);
323 state_machine_regs.address = adr;
324 break;
326 case DW_LNE_define_file:
327 printf (_(" define new File Table entry\n"));
328 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
330 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
331 name = data;
332 data += strlen ((char *) data) + 1;
333 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
334 data += bytes_read;
335 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
336 data += bytes_read;
337 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
338 printf (_("%s\n\n"), name);
339 break;
341 case DW_LNE_set_discriminator:
342 printf (_("set Discriminator to %lu\n"),
343 read_leb128 (data, & bytes_read, 0));
344 break;
346 /* HP extensions. */
347 case DW_LNE_HP_negate_is_UV_update:
348 printf ("DW_LNE_HP_negate_is_UV_update\n");
349 break;
350 case DW_LNE_HP_push_context:
351 printf ("DW_LNE_HP_push_context\n");
352 break;
353 case DW_LNE_HP_pop_context:
354 printf ("DW_LNE_HP_pop_context\n");
355 break;
356 case DW_LNE_HP_set_file_line_column:
357 printf ("DW_LNE_HP_set_file_line_column\n");
358 break;
359 case DW_LNE_HP_set_routine_name:
360 printf ("DW_LNE_HP_set_routine_name\n");
361 break;
362 case DW_LNE_HP_set_sequence:
363 printf ("DW_LNE_HP_set_sequence\n");
364 break;
365 case DW_LNE_HP_negate_post_semantics:
366 printf ("DW_LNE_HP_negate_post_semantics\n");
367 break;
368 case DW_LNE_HP_negate_function_exit:
369 printf ("DW_LNE_HP_negate_function_exit\n");
370 break;
371 case DW_LNE_HP_negate_front_end_logical:
372 printf ("DW_LNE_HP_negate_front_end_logical\n");
373 break;
374 case DW_LNE_HP_define_proc:
375 printf ("DW_LNE_HP_define_proc\n");
376 break;
378 default:
379 if (op_code >= DW_LNE_lo_user
380 /* The test against DW_LNW_hi_user is redundant due to
381 the limited range of the unsigned char data type used
382 for op_code. */
383 /*&& op_code <= DW_LNE_hi_user*/)
384 printf (_("user defined: length %d\n"), len - bytes_read);
385 else
386 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
387 break;
390 return len;
393 static const char *
394 fetch_indirect_string (unsigned long offset)
396 struct dwarf_section *section = &debug_displays [str].section;
398 if (section->start == NULL)
399 return _("<no .debug_str section>");
401 /* DWARF sections under Mach-O have non-zero addresses. */
402 offset -= section->address;
403 if (offset > section->size)
405 warn (_("DW_FORM_strp offset too big: %lx\n"), offset);
406 return _("<offset is too big>");
409 return (const char *) section->start + offset;
412 /* FIXME: There are better and more efficient ways to handle
413 these structures. For now though, I just want something that
414 is simple to implement. */
415 typedef struct abbrev_attr
417 unsigned long attribute;
418 unsigned long form;
419 struct abbrev_attr *next;
421 abbrev_attr;
423 typedef struct abbrev_entry
425 unsigned long entry;
426 unsigned long tag;
427 int children;
428 struct abbrev_attr *first_attr;
429 struct abbrev_attr *last_attr;
430 struct abbrev_entry *next;
432 abbrev_entry;
434 static abbrev_entry *first_abbrev = NULL;
435 static abbrev_entry *last_abbrev = NULL;
437 static void
438 free_abbrevs (void)
440 abbrev_entry *abbrev;
442 for (abbrev = first_abbrev; abbrev;)
444 abbrev_entry *next = abbrev->next;
445 abbrev_attr *attr;
447 for (attr = abbrev->first_attr; attr;)
449 abbrev_attr *next = attr->next;
451 free (attr);
452 attr = next;
455 free (abbrev);
456 abbrev = next;
459 last_abbrev = first_abbrev = NULL;
462 static void
463 add_abbrev (unsigned long number, unsigned long tag, int children)
465 abbrev_entry *entry;
467 entry = (abbrev_entry *) malloc (sizeof (*entry));
469 if (entry == NULL)
470 /* ugg */
471 return;
473 entry->entry = number;
474 entry->tag = tag;
475 entry->children = children;
476 entry->first_attr = NULL;
477 entry->last_attr = NULL;
478 entry->next = NULL;
480 if (first_abbrev == NULL)
481 first_abbrev = entry;
482 else
483 last_abbrev->next = entry;
485 last_abbrev = entry;
488 static void
489 add_abbrev_attr (unsigned long attribute, unsigned long form)
491 abbrev_attr *attr;
493 attr = (abbrev_attr *) malloc (sizeof (*attr));
495 if (attr == NULL)
496 /* ugg */
497 return;
499 attr->attribute = attribute;
500 attr->form = form;
501 attr->next = NULL;
503 if (last_abbrev->first_attr == NULL)
504 last_abbrev->first_attr = attr;
505 else
506 last_abbrev->last_attr->next = attr;
508 last_abbrev->last_attr = attr;
511 /* Processes the (partial) contents of a .debug_abbrev section.
512 Returns NULL if the end of the section was encountered.
513 Returns the address after the last byte read if the end of
514 an abbreviation set was found. */
516 static unsigned char *
517 process_abbrev_section (unsigned char *start, unsigned char *end)
519 if (first_abbrev != NULL)
520 return NULL;
522 while (start < end)
524 unsigned int bytes_read;
525 unsigned long entry;
526 unsigned long tag;
527 unsigned long attribute;
528 int children;
530 entry = read_leb128 (start, & bytes_read, 0);
531 start += bytes_read;
533 /* A single zero is supposed to end the section according
534 to the standard. If there's more, then signal that to
535 the caller. */
536 if (entry == 0)
537 return start == end ? NULL : start;
539 tag = read_leb128 (start, & bytes_read, 0);
540 start += bytes_read;
542 children = *start++;
544 add_abbrev (entry, tag, children);
548 unsigned long form;
550 attribute = read_leb128 (start, & bytes_read, 0);
551 start += bytes_read;
553 form = read_leb128 (start, & bytes_read, 0);
554 start += bytes_read;
556 if (attribute != 0)
557 add_abbrev_attr (attribute, form);
559 while (attribute != 0);
562 return NULL;
565 static char *
566 get_TAG_name (unsigned long tag)
568 switch (tag)
570 case DW_TAG_padding: return "DW_TAG_padding";
571 case DW_TAG_array_type: return "DW_TAG_array_type";
572 case DW_TAG_class_type: return "DW_TAG_class_type";
573 case DW_TAG_entry_point: return "DW_TAG_entry_point";
574 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
575 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
576 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
577 case DW_TAG_label: return "DW_TAG_label";
578 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
579 case DW_TAG_member: return "DW_TAG_member";
580 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
581 case DW_TAG_reference_type: return "DW_TAG_reference_type";
582 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
583 case DW_TAG_string_type: return "DW_TAG_string_type";
584 case DW_TAG_structure_type: return "DW_TAG_structure_type";
585 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
586 case DW_TAG_typedef: return "DW_TAG_typedef";
587 case DW_TAG_union_type: return "DW_TAG_union_type";
588 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
589 case DW_TAG_variant: return "DW_TAG_variant";
590 case DW_TAG_common_block: return "DW_TAG_common_block";
591 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
592 case DW_TAG_inheritance: return "DW_TAG_inheritance";
593 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
594 case DW_TAG_module: return "DW_TAG_module";
595 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
596 case DW_TAG_set_type: return "DW_TAG_set_type";
597 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
598 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
599 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
600 case DW_TAG_base_type: return "DW_TAG_base_type";
601 case DW_TAG_catch_block: return "DW_TAG_catch_block";
602 case DW_TAG_const_type: return "DW_TAG_const_type";
603 case DW_TAG_constant: return "DW_TAG_constant";
604 case DW_TAG_enumerator: return "DW_TAG_enumerator";
605 case DW_TAG_file_type: return "DW_TAG_file_type";
606 case DW_TAG_friend: return "DW_TAG_friend";
607 case DW_TAG_namelist: return "DW_TAG_namelist";
608 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
609 case DW_TAG_packed_type: return "DW_TAG_packed_type";
610 case DW_TAG_subprogram: return "DW_TAG_subprogram";
611 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
612 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
613 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
614 case DW_TAG_try_block: return "DW_TAG_try_block";
615 case DW_TAG_variant_part: return "DW_TAG_variant_part";
616 case DW_TAG_variable: return "DW_TAG_variable";
617 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
618 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
619 case DW_TAG_format_label: return "DW_TAG_format_label";
620 case DW_TAG_function_template: return "DW_TAG_function_template";
621 case DW_TAG_class_template: return "DW_TAG_class_template";
622 /* DWARF 2.1 values. */
623 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
624 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
625 case DW_TAG_interface_type: return "DW_TAG_interface_type";
626 case DW_TAG_namespace: return "DW_TAG_namespace";
627 case DW_TAG_imported_module: return "DW_TAG_imported_module";
628 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
629 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
630 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
631 /* UPC values. */
632 case DW_TAG_upc_shared_type: return "DW_TAG_upc_shared_type";
633 case DW_TAG_upc_strict_type: return "DW_TAG_upc_strict_type";
634 case DW_TAG_upc_relaxed_type: return "DW_TAG_upc_relaxed_type";
635 default:
637 static char buffer[100];
639 snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag);
640 return buffer;
645 static char *
646 get_FORM_name (unsigned long form)
648 switch (form)
650 case DW_FORM_addr: return "DW_FORM_addr";
651 case DW_FORM_block2: return "DW_FORM_block2";
652 case DW_FORM_block4: return "DW_FORM_block4";
653 case DW_FORM_data2: return "DW_FORM_data2";
654 case DW_FORM_data4: return "DW_FORM_data4";
655 case DW_FORM_data8: return "DW_FORM_data8";
656 case DW_FORM_string: return "DW_FORM_string";
657 case DW_FORM_block: return "DW_FORM_block";
658 case DW_FORM_block1: return "DW_FORM_block1";
659 case DW_FORM_data1: return "DW_FORM_data1";
660 case DW_FORM_flag: return "DW_FORM_flag";
661 case DW_FORM_sdata: return "DW_FORM_sdata";
662 case DW_FORM_strp: return "DW_FORM_strp";
663 case DW_FORM_udata: return "DW_FORM_udata";
664 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
665 case DW_FORM_ref1: return "DW_FORM_ref1";
666 case DW_FORM_ref2: return "DW_FORM_ref2";
667 case DW_FORM_ref4: return "DW_FORM_ref4";
668 case DW_FORM_ref8: return "DW_FORM_ref8";
669 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
670 case DW_FORM_indirect: return "DW_FORM_indirect";
671 default:
673 static char buffer[100];
675 snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
676 return buffer;
681 static unsigned char *
682 display_block (unsigned char *data, unsigned long length)
684 printf (_(" %lu byte block: "), length);
686 while (length --)
687 printf ("%lx ", (unsigned long) byte_get (data++, 1));
689 return data;
692 static int
693 decode_location_expression (unsigned char * data,
694 unsigned int pointer_size,
695 unsigned long length,
696 unsigned long cu_offset,
697 struct dwarf_section * section)
699 unsigned op;
700 unsigned int bytes_read;
701 unsigned long uvalue;
702 unsigned char *end = data + length;
703 int need_frame_base = 0;
705 while (data < end)
707 op = *data++;
709 switch (op)
711 case DW_OP_addr:
712 printf ("DW_OP_addr: %lx",
713 (unsigned long) byte_get (data, pointer_size));
714 data += pointer_size;
715 break;
716 case DW_OP_deref:
717 printf ("DW_OP_deref");
718 break;
719 case DW_OP_const1u:
720 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
721 break;
722 case DW_OP_const1s:
723 printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data++, 1));
724 break;
725 case DW_OP_const2u:
726 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
727 data += 2;
728 break;
729 case DW_OP_const2s:
730 printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data, 2));
731 data += 2;
732 break;
733 case DW_OP_const4u:
734 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
735 data += 4;
736 break;
737 case DW_OP_const4s:
738 printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data, 4));
739 data += 4;
740 break;
741 case DW_OP_const8u:
742 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
743 (unsigned long) byte_get (data + 4, 4));
744 data += 8;
745 break;
746 case DW_OP_const8s:
747 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
748 (long) byte_get (data + 4, 4));
749 data += 8;
750 break;
751 case DW_OP_constu:
752 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
753 data += bytes_read;
754 break;
755 case DW_OP_consts:
756 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
757 data += bytes_read;
758 break;
759 case DW_OP_dup:
760 printf ("DW_OP_dup");
761 break;
762 case DW_OP_drop:
763 printf ("DW_OP_drop");
764 break;
765 case DW_OP_over:
766 printf ("DW_OP_over");
767 break;
768 case DW_OP_pick:
769 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
770 break;
771 case DW_OP_swap:
772 printf ("DW_OP_swap");
773 break;
774 case DW_OP_rot:
775 printf ("DW_OP_rot");
776 break;
777 case DW_OP_xderef:
778 printf ("DW_OP_xderef");
779 break;
780 case DW_OP_abs:
781 printf ("DW_OP_abs");
782 break;
783 case DW_OP_and:
784 printf ("DW_OP_and");
785 break;
786 case DW_OP_div:
787 printf ("DW_OP_div");
788 break;
789 case DW_OP_minus:
790 printf ("DW_OP_minus");
791 break;
792 case DW_OP_mod:
793 printf ("DW_OP_mod");
794 break;
795 case DW_OP_mul:
796 printf ("DW_OP_mul");
797 break;
798 case DW_OP_neg:
799 printf ("DW_OP_neg");
800 break;
801 case DW_OP_not:
802 printf ("DW_OP_not");
803 break;
804 case DW_OP_or:
805 printf ("DW_OP_or");
806 break;
807 case DW_OP_plus:
808 printf ("DW_OP_plus");
809 break;
810 case DW_OP_plus_uconst:
811 printf ("DW_OP_plus_uconst: %lu",
812 read_leb128 (data, &bytes_read, 0));
813 data += bytes_read;
814 break;
815 case DW_OP_shl:
816 printf ("DW_OP_shl");
817 break;
818 case DW_OP_shr:
819 printf ("DW_OP_shr");
820 break;
821 case DW_OP_shra:
822 printf ("DW_OP_shra");
823 break;
824 case DW_OP_xor:
825 printf ("DW_OP_xor");
826 break;
827 case DW_OP_bra:
828 printf ("DW_OP_bra: %ld", (long) byte_get_signed (data, 2));
829 data += 2;
830 break;
831 case DW_OP_eq:
832 printf ("DW_OP_eq");
833 break;
834 case DW_OP_ge:
835 printf ("DW_OP_ge");
836 break;
837 case DW_OP_gt:
838 printf ("DW_OP_gt");
839 break;
840 case DW_OP_le:
841 printf ("DW_OP_le");
842 break;
843 case DW_OP_lt:
844 printf ("DW_OP_lt");
845 break;
846 case DW_OP_ne:
847 printf ("DW_OP_ne");
848 break;
849 case DW_OP_skip:
850 printf ("DW_OP_skip: %ld", (long) byte_get_signed (data, 2));
851 data += 2;
852 break;
854 case DW_OP_lit0:
855 case DW_OP_lit1:
856 case DW_OP_lit2:
857 case DW_OP_lit3:
858 case DW_OP_lit4:
859 case DW_OP_lit5:
860 case DW_OP_lit6:
861 case DW_OP_lit7:
862 case DW_OP_lit8:
863 case DW_OP_lit9:
864 case DW_OP_lit10:
865 case DW_OP_lit11:
866 case DW_OP_lit12:
867 case DW_OP_lit13:
868 case DW_OP_lit14:
869 case DW_OP_lit15:
870 case DW_OP_lit16:
871 case DW_OP_lit17:
872 case DW_OP_lit18:
873 case DW_OP_lit19:
874 case DW_OP_lit20:
875 case DW_OP_lit21:
876 case DW_OP_lit22:
877 case DW_OP_lit23:
878 case DW_OP_lit24:
879 case DW_OP_lit25:
880 case DW_OP_lit26:
881 case DW_OP_lit27:
882 case DW_OP_lit28:
883 case DW_OP_lit29:
884 case DW_OP_lit30:
885 case DW_OP_lit31:
886 printf ("DW_OP_lit%d", op - DW_OP_lit0);
887 break;
889 case DW_OP_reg0:
890 case DW_OP_reg1:
891 case DW_OP_reg2:
892 case DW_OP_reg3:
893 case DW_OP_reg4:
894 case DW_OP_reg5:
895 case DW_OP_reg6:
896 case DW_OP_reg7:
897 case DW_OP_reg8:
898 case DW_OP_reg9:
899 case DW_OP_reg10:
900 case DW_OP_reg11:
901 case DW_OP_reg12:
902 case DW_OP_reg13:
903 case DW_OP_reg14:
904 case DW_OP_reg15:
905 case DW_OP_reg16:
906 case DW_OP_reg17:
907 case DW_OP_reg18:
908 case DW_OP_reg19:
909 case DW_OP_reg20:
910 case DW_OP_reg21:
911 case DW_OP_reg22:
912 case DW_OP_reg23:
913 case DW_OP_reg24:
914 case DW_OP_reg25:
915 case DW_OP_reg26:
916 case DW_OP_reg27:
917 case DW_OP_reg28:
918 case DW_OP_reg29:
919 case DW_OP_reg30:
920 case DW_OP_reg31:
921 printf ("DW_OP_reg%d", op - DW_OP_reg0);
922 break;
924 case DW_OP_breg0:
925 case DW_OP_breg1:
926 case DW_OP_breg2:
927 case DW_OP_breg3:
928 case DW_OP_breg4:
929 case DW_OP_breg5:
930 case DW_OP_breg6:
931 case DW_OP_breg7:
932 case DW_OP_breg8:
933 case DW_OP_breg9:
934 case DW_OP_breg10:
935 case DW_OP_breg11:
936 case DW_OP_breg12:
937 case DW_OP_breg13:
938 case DW_OP_breg14:
939 case DW_OP_breg15:
940 case DW_OP_breg16:
941 case DW_OP_breg17:
942 case DW_OP_breg18:
943 case DW_OP_breg19:
944 case DW_OP_breg20:
945 case DW_OP_breg21:
946 case DW_OP_breg22:
947 case DW_OP_breg23:
948 case DW_OP_breg24:
949 case DW_OP_breg25:
950 case DW_OP_breg26:
951 case DW_OP_breg27:
952 case DW_OP_breg28:
953 case DW_OP_breg29:
954 case DW_OP_breg30:
955 case DW_OP_breg31:
956 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
957 read_leb128 (data, &bytes_read, 1));
958 data += bytes_read;
959 break;
961 case DW_OP_regx:
962 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
963 data += bytes_read;
964 break;
965 case DW_OP_fbreg:
966 need_frame_base = 1;
967 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
968 data += bytes_read;
969 break;
970 case DW_OP_bregx:
971 uvalue = read_leb128 (data, &bytes_read, 0);
972 data += bytes_read;
973 printf ("DW_OP_bregx: %lu %ld", uvalue,
974 read_leb128 (data, &bytes_read, 1));
975 data += bytes_read;
976 break;
977 case DW_OP_piece:
978 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
979 data += bytes_read;
980 break;
981 case DW_OP_deref_size:
982 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
983 break;
984 case DW_OP_xderef_size:
985 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
986 break;
987 case DW_OP_nop:
988 printf ("DW_OP_nop");
989 break;
991 /* DWARF 3 extensions. */
992 case DW_OP_push_object_address:
993 printf ("DW_OP_push_object_address");
994 break;
995 case DW_OP_call2:
996 /* XXX: Strictly speaking for 64-bit DWARF3 files
997 this ought to be an 8-byte wide computation. */
998 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2) + cu_offset);
999 data += 2;
1000 break;
1001 case DW_OP_call4:
1002 /* XXX: Strictly speaking for 64-bit DWARF3 files
1003 this ought to be an 8-byte wide computation. */
1004 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4) + cu_offset);
1005 data += 4;
1006 break;
1007 case DW_OP_call_ref:
1008 /* XXX: Strictly speaking for 64-bit DWARF3 files
1009 this ought to be an 8-byte wide computation. */
1010 printf ("DW_OP_call_ref: <%lx>", (long) byte_get (data, 4) + cu_offset);
1011 data += 4;
1012 break;
1013 case DW_OP_form_tls_address:
1014 printf ("DW_OP_form_tls_address");
1015 break;
1016 case DW_OP_call_frame_cfa:
1017 printf ("DW_OP_call_frame_cfa");
1018 break;
1019 case DW_OP_bit_piece:
1020 printf ("DW_OP_bit_piece: ");
1021 printf ("size: %lu ", read_leb128 (data, &bytes_read, 0));
1022 data += bytes_read;
1023 printf ("offset: %lu ", read_leb128 (data, &bytes_read, 0));
1024 data += bytes_read;
1025 break;
1027 /* DWARF 4 extensions. */
1028 case DW_OP_stack_value:
1029 printf ("DW_OP_stack_value");
1030 break;
1032 case DW_OP_implicit_value:
1033 printf ("DW_OP_implicit_value");
1034 uvalue = read_leb128 (data, &bytes_read, 0);
1035 data += bytes_read;
1036 display_block (data, uvalue);
1037 data += uvalue;
1038 break;
1040 /* GNU extensions. */
1041 case DW_OP_GNU_push_tls_address:
1042 printf ("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown");
1043 break;
1044 case DW_OP_GNU_uninit:
1045 printf ("DW_OP_GNU_uninit");
1046 /* FIXME: Is there data associated with this OP ? */
1047 break;
1048 case DW_OP_GNU_encoded_addr:
1050 int encoding;
1051 dwarf_vma addr;
1053 encoding = *data++;
1054 addr = get_encoded_value (data, encoding);
1055 if ((encoding & 0x70) == DW_EH_PE_pcrel)
1056 addr += section->address + (data - section->start);
1057 data += size_of_encoded_value (encoding);
1059 printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding);
1060 print_dwarf_vma (addr, pointer_size);
1062 break;
1064 /* HP extensions. */
1065 case DW_OP_HP_is_value:
1066 printf ("DW_OP_HP_is_value");
1067 /* FIXME: Is there data associated with this OP ? */
1068 break;
1069 case DW_OP_HP_fltconst4:
1070 printf ("DW_OP_HP_fltconst4");
1071 /* FIXME: Is there data associated with this OP ? */
1072 break;
1073 case DW_OP_HP_fltconst8:
1074 printf ("DW_OP_HP_fltconst8");
1075 /* FIXME: Is there data associated with this OP ? */
1076 break;
1077 case DW_OP_HP_mod_range:
1078 printf ("DW_OP_HP_mod_range");
1079 /* FIXME: Is there data associated with this OP ? */
1080 break;
1081 case DW_OP_HP_unmod_range:
1082 printf ("DW_OP_HP_unmod_range");
1083 /* FIXME: Is there data associated with this OP ? */
1084 break;
1085 case DW_OP_HP_tls:
1086 printf ("DW_OP_HP_tls");
1087 /* FIXME: Is there data associated with this OP ? */
1088 break;
1090 /* PGI (STMicroelectronics) extensions. */
1091 case DW_OP_PGI_omp_thread_num:
1092 /* Pushes the thread number for the current thread as it would be
1093 returned by the standard OpenMP library function:
1094 omp_get_thread_num(). The "current thread" is the thread for
1095 which the expression is being evaluated. */
1096 printf ("DW_OP_PGI_omp_thread_num");
1097 break;
1099 default:
1100 if (op >= DW_OP_lo_user
1101 && op <= DW_OP_hi_user)
1102 printf (_("(User defined location op)"));
1103 else
1104 printf (_("(Unknown location op)"));
1105 /* No way to tell where the next op is, so just bail. */
1106 return need_frame_base;
1109 /* Separate the ops. */
1110 if (data < end)
1111 printf ("; ");
1114 return need_frame_base;
1117 static unsigned char *
1118 read_and_display_attr_value (unsigned long attribute,
1119 unsigned long form,
1120 unsigned char * data,
1121 unsigned long cu_offset,
1122 unsigned long pointer_size,
1123 unsigned long offset_size,
1124 int dwarf_version,
1125 debug_info * debug_info_p,
1126 int do_loc,
1127 struct dwarf_section * section)
1129 unsigned long uvalue = 0;
1130 unsigned char *block_start = NULL;
1131 unsigned char * orig_data = data;
1132 unsigned int bytes_read;
1134 switch (form)
1136 default:
1137 break;
1139 case DW_FORM_ref_addr:
1140 if (dwarf_version == 2)
1142 uvalue = byte_get (data, pointer_size);
1143 data += pointer_size;
1145 else if (dwarf_version == 3)
1147 uvalue = byte_get (data, offset_size);
1148 data += offset_size;
1150 else
1152 error (_("Internal error: DWARF version is not 2 or 3.\n"));
1154 break;
1156 case DW_FORM_addr:
1157 uvalue = byte_get (data, pointer_size);
1158 data += pointer_size;
1159 break;
1161 case DW_FORM_strp:
1162 uvalue = byte_get (data, offset_size);
1163 data += offset_size;
1164 break;
1166 case DW_FORM_ref1:
1167 case DW_FORM_flag:
1168 case DW_FORM_data1:
1169 uvalue = byte_get (data++, 1);
1170 break;
1172 case DW_FORM_ref2:
1173 case DW_FORM_data2:
1174 uvalue = byte_get (data, 2);
1175 data += 2;
1176 break;
1178 case DW_FORM_ref4:
1179 case DW_FORM_data4:
1180 uvalue = byte_get (data, 4);
1181 data += 4;
1182 break;
1184 case DW_FORM_sdata:
1185 uvalue = read_leb128 (data, & bytes_read, 1);
1186 data += bytes_read;
1187 break;
1189 case DW_FORM_ref_udata:
1190 case DW_FORM_udata:
1191 uvalue = read_leb128 (data, & bytes_read, 0);
1192 data += bytes_read;
1193 break;
1195 case DW_FORM_indirect:
1196 form = read_leb128 (data, & bytes_read, 0);
1197 data += bytes_read;
1198 if (!do_loc)
1199 printf (" %s", get_FORM_name (form));
1200 return read_and_display_attr_value (attribute, form, data,
1201 cu_offset, pointer_size,
1202 offset_size, dwarf_version,
1203 debug_info_p, do_loc,
1204 section);
1207 switch (form)
1209 case DW_FORM_ref_addr:
1210 if (!do_loc)
1211 printf (" <0x%lx>", uvalue);
1212 break;
1214 case DW_FORM_ref1:
1215 case DW_FORM_ref2:
1216 case DW_FORM_ref4:
1217 case DW_FORM_ref_udata:
1218 if (!do_loc)
1219 printf (" <0x%lx>", uvalue + cu_offset);
1220 break;
1222 case DW_FORM_data4:
1223 case DW_FORM_addr:
1224 if (!do_loc)
1225 printf (" 0x%lx", uvalue);
1226 break;
1228 case DW_FORM_flag:
1229 case DW_FORM_data1:
1230 case DW_FORM_data2:
1231 case DW_FORM_sdata:
1232 case DW_FORM_udata:
1233 if (!do_loc)
1234 printf (" %ld", uvalue);
1235 break;
1237 case DW_FORM_ref8:
1238 case DW_FORM_data8:
1239 if (!do_loc)
1241 uvalue = byte_get (data, 4);
1242 printf (" 0x%lx", uvalue);
1243 printf (" 0x%lx", (unsigned long) byte_get (data + 4, 4));
1245 if ((do_loc || do_debug_loc || do_debug_ranges)
1246 && num_debug_info_entries == 0)
1248 if (sizeof (uvalue) == 8)
1249 uvalue = byte_get (data, 8);
1250 else
1251 error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
1253 data += 8;
1254 break;
1256 case DW_FORM_string:
1257 if (!do_loc)
1258 printf (" %s", data);
1259 data += strlen ((char *) data) + 1;
1260 break;
1262 case DW_FORM_block:
1263 uvalue = read_leb128 (data, & bytes_read, 0);
1264 block_start = data + bytes_read;
1265 if (do_loc)
1266 data = block_start + uvalue;
1267 else
1268 data = display_block (block_start, uvalue);
1269 break;
1271 case DW_FORM_block1:
1272 uvalue = byte_get (data, 1);
1273 block_start = data + 1;
1274 if (do_loc)
1275 data = block_start + uvalue;
1276 else
1277 data = display_block (block_start, uvalue);
1278 break;
1280 case DW_FORM_block2:
1281 uvalue = byte_get (data, 2);
1282 block_start = data + 2;
1283 if (do_loc)
1284 data = block_start + uvalue;
1285 else
1286 data = display_block (block_start, uvalue);
1287 break;
1289 case DW_FORM_block4:
1290 uvalue = byte_get (data, 4);
1291 block_start = data + 4;
1292 if (do_loc)
1293 data = block_start + uvalue;
1294 else
1295 data = display_block (block_start, uvalue);
1296 break;
1298 case DW_FORM_strp:
1299 if (!do_loc)
1300 printf (_(" (indirect string, offset: 0x%lx): %s"),
1301 uvalue, fetch_indirect_string (uvalue));
1302 break;
1304 case DW_FORM_indirect:
1305 /* Handled above. */
1306 break;
1308 default:
1309 warn (_("Unrecognized form: %lu\n"), form);
1310 break;
1313 if ((do_loc || do_debug_loc || do_debug_ranges)
1314 && num_debug_info_entries == 0)
1316 switch (attribute)
1318 case DW_AT_frame_base:
1319 have_frame_base = 1;
1320 case DW_AT_location:
1321 case DW_AT_string_length:
1322 case DW_AT_return_addr:
1323 case DW_AT_data_member_location:
1324 case DW_AT_vtable_elem_location:
1325 case DW_AT_segment:
1326 case DW_AT_static_link:
1327 case DW_AT_use_location:
1328 if (form == DW_FORM_data4 || form == DW_FORM_data8)
1330 /* Process location list. */
1331 unsigned int max = debug_info_p->max_loc_offsets;
1332 unsigned int num = debug_info_p->num_loc_offsets;
1334 if (max == 0 || num >= max)
1336 max += 1024;
1337 debug_info_p->loc_offsets = (long unsigned int *)
1338 xcrealloc (debug_info_p->loc_offsets,
1339 max, sizeof (*debug_info_p->loc_offsets));
1340 debug_info_p->have_frame_base = (int *)
1341 xcrealloc (debug_info_p->have_frame_base,
1342 max, sizeof (*debug_info_p->have_frame_base));
1343 debug_info_p->max_loc_offsets = max;
1345 debug_info_p->loc_offsets [num] = uvalue;
1346 debug_info_p->have_frame_base [num] = have_frame_base;
1347 debug_info_p->num_loc_offsets++;
1349 break;
1351 case DW_AT_low_pc:
1352 if (need_base_address)
1353 debug_info_p->base_address = uvalue;
1354 break;
1356 case DW_AT_ranges:
1357 if (form == DW_FORM_data4 || form == DW_FORM_data8)
1359 /* Process range list. */
1360 unsigned int max = debug_info_p->max_range_lists;
1361 unsigned int num = debug_info_p->num_range_lists;
1363 if (max == 0 || num >= max)
1365 max += 1024;
1366 debug_info_p->range_lists = (long unsigned int *)
1367 xcrealloc (debug_info_p->range_lists,
1368 max, sizeof (*debug_info_p->range_lists));
1369 debug_info_p->max_range_lists = max;
1371 debug_info_p->range_lists [num] = uvalue;
1372 debug_info_p->num_range_lists++;
1374 break;
1376 default:
1377 break;
1381 if (do_loc)
1382 return data;
1384 /* For some attributes we can display further information. */
1385 printf ("\t");
1387 switch (attribute)
1389 case DW_AT_inline:
1390 switch (uvalue)
1392 case DW_INL_not_inlined:
1393 printf (_("(not inlined)"));
1394 break;
1395 case DW_INL_inlined:
1396 printf (_("(inlined)"));
1397 break;
1398 case DW_INL_declared_not_inlined:
1399 printf (_("(declared as inline but ignored)"));
1400 break;
1401 case DW_INL_declared_inlined:
1402 printf (_("(declared as inline and inlined)"));
1403 break;
1404 default:
1405 printf (_(" (Unknown inline attribute value: %lx)"), uvalue);
1406 break;
1408 break;
1410 case DW_AT_language:
1411 switch (uvalue)
1413 /* Ordered by the numeric value of these constants. */
1414 case DW_LANG_C89: printf ("(ANSI C)"); break;
1415 case DW_LANG_C: printf ("(non-ANSI C)"); break;
1416 case DW_LANG_Ada83: printf ("(Ada)"); break;
1417 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
1418 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
1419 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
1420 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
1421 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
1422 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
1423 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
1424 /* DWARF 2.1 values. */
1425 case DW_LANG_Java: printf ("(Java)"); break;
1426 case DW_LANG_C99: printf ("(ANSI C99)"); break;
1427 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
1428 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
1429 /* DWARF 3 values. */
1430 case DW_LANG_PLI: printf ("(PLI)"); break;
1431 case DW_LANG_ObjC: printf ("(Objective C)"); break;
1432 case DW_LANG_ObjC_plus_plus: printf ("(Objective C++)"); break;
1433 case DW_LANG_UPC: printf ("(Unified Parallel C)"); break;
1434 case DW_LANG_D: printf ("(D)"); break;
1435 /* MIPS extension. */
1436 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
1437 /* UPC extension. */
1438 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
1439 default:
1440 if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
1441 printf ("(implementation defined: %lx)", uvalue);
1442 else
1443 printf ("(Unknown: %lx)", uvalue);
1444 break;
1446 break;
1448 case DW_AT_encoding:
1449 switch (uvalue)
1451 case DW_ATE_void: printf ("(void)"); break;
1452 case DW_ATE_address: printf ("(machine address)"); break;
1453 case DW_ATE_boolean: printf ("(boolean)"); break;
1454 case DW_ATE_complex_float: printf ("(complex float)"); break;
1455 case DW_ATE_float: printf ("(float)"); break;
1456 case DW_ATE_signed: printf ("(signed)"); break;
1457 case DW_ATE_signed_char: printf ("(signed char)"); break;
1458 case DW_ATE_unsigned: printf ("(unsigned)"); break;
1459 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
1460 /* DWARF 2.1 values: */
1461 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
1462 case DW_ATE_decimal_float: printf ("(decimal float)"); break;
1463 /* DWARF 3 values: */
1464 case DW_ATE_packed_decimal: printf ("(packed_decimal)"); break;
1465 case DW_ATE_numeric_string: printf ("(numeric_string)"); break;
1466 case DW_ATE_edited: printf ("(edited)"); break;
1467 case DW_ATE_signed_fixed: printf ("(signed_fixed)"); break;
1468 case DW_ATE_unsigned_fixed: printf ("(unsigned_fixed)"); break;
1469 /* HP extensions: */
1470 case DW_ATE_HP_float80: printf ("(HP_float80)"); break;
1471 case DW_ATE_HP_complex_float80: printf ("(HP_complex_float80)"); break;
1472 case DW_ATE_HP_float128: printf ("(HP_float128)"); break;
1473 case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
1474 case DW_ATE_HP_floathpintel: printf ("(HP_floathpintel)"); break;
1475 case DW_ATE_HP_imaginary_float80: printf ("(HP_imaginary_float80)"); break;
1476 case DW_ATE_HP_imaginary_float128: printf ("(HP_imaginary_float128)"); break;
1478 default:
1479 if (uvalue >= DW_ATE_lo_user
1480 && uvalue <= DW_ATE_hi_user)
1481 printf ("(user defined type)");
1482 else
1483 printf ("(unknown type)");
1484 break;
1486 break;
1488 case DW_AT_accessibility:
1489 switch (uvalue)
1491 case DW_ACCESS_public: printf ("(public)"); break;
1492 case DW_ACCESS_protected: printf ("(protected)"); break;
1493 case DW_ACCESS_private: printf ("(private)"); break;
1494 default:
1495 printf ("(unknown accessibility)");
1496 break;
1498 break;
1500 case DW_AT_visibility:
1501 switch (uvalue)
1503 case DW_VIS_local: printf ("(local)"); break;
1504 case DW_VIS_exported: printf ("(exported)"); break;
1505 case DW_VIS_qualified: printf ("(qualified)"); break;
1506 default: printf ("(unknown visibility)"); break;
1508 break;
1510 case DW_AT_virtuality:
1511 switch (uvalue)
1513 case DW_VIRTUALITY_none: printf ("(none)"); break;
1514 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
1515 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
1516 default: printf ("(unknown virtuality)"); break;
1518 break;
1520 case DW_AT_identifier_case:
1521 switch (uvalue)
1523 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
1524 case DW_ID_up_case: printf ("(up_case)"); break;
1525 case DW_ID_down_case: printf ("(down_case)"); break;
1526 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
1527 default: printf ("(unknown case)"); break;
1529 break;
1531 case DW_AT_calling_convention:
1532 switch (uvalue)
1534 case DW_CC_normal: printf ("(normal)"); break;
1535 case DW_CC_program: printf ("(program)"); break;
1536 case DW_CC_nocall: printf ("(nocall)"); break;
1537 default:
1538 if (uvalue >= DW_CC_lo_user
1539 && uvalue <= DW_CC_hi_user)
1540 printf ("(user defined)");
1541 else
1542 printf ("(unknown convention)");
1544 break;
1546 case DW_AT_ordering:
1547 switch (uvalue)
1549 case -1: printf ("(undefined)"); break;
1550 case 0: printf ("(row major)"); break;
1551 case 1: printf ("(column major)"); break;
1553 break;
1555 case DW_AT_frame_base:
1556 have_frame_base = 1;
1557 case DW_AT_location:
1558 case DW_AT_string_length:
1559 case DW_AT_return_addr:
1560 case DW_AT_data_member_location:
1561 case DW_AT_vtable_elem_location:
1562 case DW_AT_segment:
1563 case DW_AT_static_link:
1564 case DW_AT_use_location:
1565 if (form == DW_FORM_data4 || form == DW_FORM_data8)
1566 printf (_("(location list)"));
1567 /* Fall through. */
1568 case DW_AT_allocated:
1569 case DW_AT_associated:
1570 case DW_AT_data_location:
1571 case DW_AT_stride:
1572 case DW_AT_upper_bound:
1573 case DW_AT_lower_bound:
1574 if (block_start)
1576 int need_frame_base;
1578 printf ("(");
1579 need_frame_base = decode_location_expression (block_start,
1580 pointer_size,
1581 uvalue,
1582 cu_offset, section);
1583 printf (")");
1584 if (need_frame_base && !have_frame_base)
1585 printf (_(" [without DW_AT_frame_base]"));
1587 break;
1589 case DW_AT_import:
1591 if (form == DW_FORM_ref1
1592 || form == DW_FORM_ref2
1593 || form == DW_FORM_ref4)
1594 uvalue += cu_offset;
1596 if (uvalue >= section->size)
1597 warn (_("Offset %lx used as value for DW_AT_import attribute of DIE at offset %lx is too big.\n"),
1598 uvalue, (unsigned long) (orig_data - section->start));
1599 else
1601 unsigned long abbrev_number;
1602 abbrev_entry * entry;
1604 abbrev_number = read_leb128 (section->start + uvalue, NULL, 0);
1606 printf ("[Abbrev Number: %ld", abbrev_number);
1607 for (entry = first_abbrev; entry != NULL; entry = entry->next)
1608 if (entry->entry == abbrev_number)
1609 break;
1610 if (entry != NULL)
1611 printf (" (%s)", get_TAG_name (entry->tag));
1612 printf ("]");
1615 break;
1617 default:
1618 break;
1621 return data;
1624 static char *
1625 get_AT_name (unsigned long attribute)
1627 switch (attribute)
1629 case DW_AT_sibling: return "DW_AT_sibling";
1630 case DW_AT_location: return "DW_AT_location";
1631 case DW_AT_name: return "DW_AT_name";
1632 case DW_AT_ordering: return "DW_AT_ordering";
1633 case DW_AT_subscr_data: return "DW_AT_subscr_data";
1634 case DW_AT_byte_size: return "DW_AT_byte_size";
1635 case DW_AT_bit_offset: return "DW_AT_bit_offset";
1636 case DW_AT_bit_size: return "DW_AT_bit_size";
1637 case DW_AT_element_list: return "DW_AT_element_list";
1638 case DW_AT_stmt_list: return "DW_AT_stmt_list";
1639 case DW_AT_low_pc: return "DW_AT_low_pc";
1640 case DW_AT_high_pc: return "DW_AT_high_pc";
1641 case DW_AT_language: return "DW_AT_language";
1642 case DW_AT_member: return "DW_AT_member";
1643 case DW_AT_discr: return "DW_AT_discr";
1644 case DW_AT_discr_value: return "DW_AT_discr_value";
1645 case DW_AT_visibility: return "DW_AT_visibility";
1646 case DW_AT_import: return "DW_AT_import";
1647 case DW_AT_string_length: return "DW_AT_string_length";
1648 case DW_AT_common_reference: return "DW_AT_common_reference";
1649 case DW_AT_comp_dir: return "DW_AT_comp_dir";
1650 case DW_AT_const_value: return "DW_AT_const_value";
1651 case DW_AT_containing_type: return "DW_AT_containing_type";
1652 case DW_AT_default_value: return "DW_AT_default_value";
1653 case DW_AT_inline: return "DW_AT_inline";
1654 case DW_AT_is_optional: return "DW_AT_is_optional";
1655 case DW_AT_lower_bound: return "DW_AT_lower_bound";
1656 case DW_AT_producer: return "DW_AT_producer";
1657 case DW_AT_prototyped: return "DW_AT_prototyped";
1658 case DW_AT_return_addr: return "DW_AT_return_addr";
1659 case DW_AT_start_scope: return "DW_AT_start_scope";
1660 case DW_AT_stride_size: return "DW_AT_stride_size";
1661 case DW_AT_upper_bound: return "DW_AT_upper_bound";
1662 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
1663 case DW_AT_accessibility: return "DW_AT_accessibility";
1664 case DW_AT_address_class: return "DW_AT_address_class";
1665 case DW_AT_artificial: return "DW_AT_artificial";
1666 case DW_AT_base_types: return "DW_AT_base_types";
1667 case DW_AT_calling_convention: return "DW_AT_calling_convention";
1668 case DW_AT_count: return "DW_AT_count";
1669 case DW_AT_data_member_location: return "DW_AT_data_member_location";
1670 case DW_AT_decl_column: return "DW_AT_decl_column";
1671 case DW_AT_decl_file: return "DW_AT_decl_file";
1672 case DW_AT_decl_line: return "DW_AT_decl_line";
1673 case DW_AT_declaration: return "DW_AT_declaration";
1674 case DW_AT_discr_list: return "DW_AT_discr_list";
1675 case DW_AT_encoding: return "DW_AT_encoding";
1676 case DW_AT_external: return "DW_AT_external";
1677 case DW_AT_frame_base: return "DW_AT_frame_base";
1678 case DW_AT_friend: return "DW_AT_friend";
1679 case DW_AT_identifier_case: return "DW_AT_identifier_case";
1680 case DW_AT_macro_info: return "DW_AT_macro_info";
1681 case DW_AT_namelist_items: return "DW_AT_namelist_items";
1682 case DW_AT_priority: return "DW_AT_priority";
1683 case DW_AT_segment: return "DW_AT_segment";
1684 case DW_AT_specification: return "DW_AT_specification";
1685 case DW_AT_static_link: return "DW_AT_static_link";
1686 case DW_AT_type: return "DW_AT_type";
1687 case DW_AT_use_location: return "DW_AT_use_location";
1688 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
1689 case DW_AT_virtuality: return "DW_AT_virtuality";
1690 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
1691 /* DWARF 2.1 values. */
1692 case DW_AT_allocated: return "DW_AT_allocated";
1693 case DW_AT_associated: return "DW_AT_associated";
1694 case DW_AT_data_location: return "DW_AT_data_location";
1695 case DW_AT_stride: return "DW_AT_stride";
1696 case DW_AT_entry_pc: return "DW_AT_entry_pc";
1697 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
1698 case DW_AT_extension: return "DW_AT_extension";
1699 case DW_AT_ranges: return "DW_AT_ranges";
1700 case DW_AT_trampoline: return "DW_AT_trampoline";
1701 case DW_AT_call_column: return "DW_AT_call_column";
1702 case DW_AT_call_file: return "DW_AT_call_file";
1703 case DW_AT_call_line: return "DW_AT_call_line";
1704 case DW_AT_description: return "DW_AT_description";
1705 case DW_AT_binary_scale: return "DW_AT_binary_scale";
1706 case DW_AT_decimal_scale: return "DW_AT_decimal_scale";
1707 case DW_AT_small: return "DW_AT_small";
1708 case DW_AT_decimal_sign: return "DW_AT_decimal_sign";
1709 case DW_AT_digit_count: return "DW_AT_digit_count";
1710 case DW_AT_picture_string: return "DW_AT_picture_string";
1711 case DW_AT_mutable: return "DW_AT_mutable";
1712 case DW_AT_threads_scaled: return "DW_AT_threads_scaled";
1713 case DW_AT_explicit: return "DW_AT_explicit";
1714 case DW_AT_object_pointer: return "DW_AT_object_pointer";
1715 case DW_AT_endianity: return "DW_AT_endianity";
1716 case DW_AT_elemental: return "DW_AT_elemental";
1717 case DW_AT_pure: return "DW_AT_pure";
1718 case DW_AT_recursive: return "DW_AT_recursive";
1720 /* HP and SGI/MIPS extensions. */
1721 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
1722 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
1723 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
1724 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
1725 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
1726 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
1727 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
1728 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
1729 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
1730 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
1732 /* HP Extensions. */
1733 case DW_AT_HP_block_index: return "DW_AT_HP_block_index";
1734 case DW_AT_HP_actuals_stmt_list: return "DW_AT_HP_actuals_stmt_list";
1735 case DW_AT_HP_proc_per_section: return "DW_AT_HP_proc_per_section";
1736 case DW_AT_HP_raw_data_ptr: return "DW_AT_HP_raw_data_ptr";
1737 case DW_AT_HP_pass_by_reference: return "DW_AT_HP_pass_by_reference";
1738 case DW_AT_HP_opt_level: return "DW_AT_HP_opt_level";
1739 case DW_AT_HP_prof_version_id: return "DW_AT_HP_prof_version_id";
1740 case DW_AT_HP_opt_flags: return "DW_AT_HP_opt_flags";
1741 case DW_AT_HP_cold_region_low_pc: return "DW_AT_HP_cold_region_low_pc";
1742 case DW_AT_HP_cold_region_high_pc: return "DW_AT_HP_cold_region_high_pc";
1743 case DW_AT_HP_all_variables_modifiable: return "DW_AT_HP_all_variables_modifiable";
1744 case DW_AT_HP_linkage_name: return "DW_AT_HP_linkage_name";
1745 case DW_AT_HP_prof_flags: return "DW_AT_HP_prof_flags";
1747 /* One value is shared by the MIPS and HP extensions: */
1748 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
1750 /* GNU extensions. */
1751 case DW_AT_sf_names: return "DW_AT_sf_names";
1752 case DW_AT_src_info: return "DW_AT_src_info";
1753 case DW_AT_mac_info: return "DW_AT_mac_info";
1754 case DW_AT_src_coords: return "DW_AT_src_coords";
1755 case DW_AT_body_begin: return "DW_AT_body_begin";
1756 case DW_AT_body_end: return "DW_AT_body_end";
1757 case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
1759 /* UPC extension. */
1760 case DW_AT_upc_threads_scaled: return "DW_AT_upc_threads_scaled";
1762 /* PGI (STMicroelectronics) extensions. */
1763 case DW_AT_PGI_lbase: return "DW_AT_PGI_lbase";
1764 case DW_AT_PGI_soffset: return "DW_AT_PGI_soffset";
1765 case DW_AT_PGI_lstride: return "DW_AT_PGI_lstride";
1767 default:
1769 static char buffer[100];
1771 snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
1772 attribute);
1773 return buffer;
1778 static unsigned char *
1779 read_and_display_attr (unsigned long attribute,
1780 unsigned long form,
1781 unsigned char * data,
1782 unsigned long cu_offset,
1783 unsigned long pointer_size,
1784 unsigned long offset_size,
1785 int dwarf_version,
1786 debug_info * debug_info_p,
1787 int do_loc,
1788 struct dwarf_section * section)
1790 if (!do_loc)
1791 printf (" %-18s:", get_AT_name (attribute));
1792 data = read_and_display_attr_value (attribute, form, data, cu_offset,
1793 pointer_size, offset_size,
1794 dwarf_version, debug_info_p,
1795 do_loc, section);
1796 if (!do_loc)
1797 printf ("\n");
1798 return data;
1802 /* Process the contents of a .debug_info section. If do_loc is non-zero
1803 then we are scanning for location lists and we do not want to display
1804 anything to the user. */
1806 static int
1807 process_debug_info (struct dwarf_section *section,
1808 void *file,
1809 int do_loc)
1811 unsigned char *start = section->start;
1812 unsigned char *end = start + section->size;
1813 unsigned char *section_begin;
1814 unsigned int unit;
1815 unsigned int num_units = 0;
1817 if ((do_loc || do_debug_loc || do_debug_ranges)
1818 && num_debug_info_entries == 0)
1820 unsigned long length;
1822 /* First scan the section to get the number of comp units. */
1823 for (section_begin = start, num_units = 0; section_begin < end;
1824 num_units ++)
1826 /* Read the first 4 bytes. For a 32-bit DWARF section, this
1827 will be the length. For a 64-bit DWARF section, it'll be
1828 the escape code 0xffffffff followed by an 8 byte length. */
1829 length = byte_get (section_begin, 4);
1831 if (length == 0xffffffff)
1833 length = byte_get (section_begin + 4, 8);
1834 section_begin += length + 12;
1836 else if (length >= 0xfffffff0 && length < 0xffffffff)
1838 warn (_("Reserved length value (%lx) found in section %s\n"), length, section->name);
1839 return 0;
1841 else
1842 section_begin += length + 4;
1844 /* Negative values are illegal, they may even cause infinite
1845 looping. This can happen if we can't accurately apply
1846 relocations to an object file. */
1847 if ((signed long) length <= 0)
1849 warn (_("Corrupt unit length (%lx) found in section %s\n"), length, section->name);
1850 return 0;
1854 if (num_units == 0)
1856 error (_("No comp units in %s section ?"), section->name);
1857 return 0;
1860 /* Then allocate an array to hold the information. */
1861 debug_information = (debug_info *) cmalloc (num_units,
1862 sizeof (* debug_information));
1863 if (debug_information == NULL)
1865 error (_("Not enough memory for a debug info array of %u entries"),
1866 num_units);
1867 return 0;
1871 if (!do_loc)
1873 printf (_("Contents of the %s section:\n\n"), section->name);
1875 load_debug_section (str, file);
1878 load_debug_section (abbrev, file);
1879 if (debug_displays [abbrev].section.start == NULL)
1881 warn (_("Unable to locate %s section!\n"),
1882 debug_displays [abbrev].section.name);
1883 return 0;
1886 for (section_begin = start, unit = 0; start < end; unit++)
1888 DWARF2_Internal_CompUnit compunit;
1889 unsigned char *hdrptr;
1890 unsigned char *cu_abbrev_offset_ptr;
1891 unsigned char *tags;
1892 int level;
1893 unsigned long cu_offset;
1894 int offset_size;
1895 int initial_length_size;
1897 hdrptr = start;
1899 compunit.cu_length = byte_get (hdrptr, 4);
1900 hdrptr += 4;
1902 if (compunit.cu_length == 0xffffffff)
1904 compunit.cu_length = byte_get (hdrptr, 8);
1905 hdrptr += 8;
1906 offset_size = 8;
1907 initial_length_size = 12;
1909 else
1911 offset_size = 4;
1912 initial_length_size = 4;
1915 compunit.cu_version = byte_get (hdrptr, 2);
1916 hdrptr += 2;
1918 cu_offset = start - section_begin;
1920 cu_abbrev_offset_ptr = hdrptr;
1921 compunit.cu_abbrev_offset = byte_get (hdrptr, offset_size);
1922 hdrptr += offset_size;
1924 compunit.cu_pointer_size = byte_get (hdrptr, 1);
1925 hdrptr += 1;
1926 if ((do_loc || do_debug_loc || do_debug_ranges)
1927 && num_debug_info_entries == 0)
1929 debug_information [unit].cu_offset = cu_offset;
1930 debug_information [unit].pointer_size
1931 = compunit.cu_pointer_size;
1932 debug_information [unit].base_address = 0;
1933 debug_information [unit].loc_offsets = NULL;
1934 debug_information [unit].have_frame_base = NULL;
1935 debug_information [unit].max_loc_offsets = 0;
1936 debug_information [unit].num_loc_offsets = 0;
1937 debug_information [unit].range_lists = NULL;
1938 debug_information [unit].max_range_lists= 0;
1939 debug_information [unit].num_range_lists = 0;
1942 if (!do_loc)
1944 printf (_(" Compilation Unit @ offset 0x%lx:\n"), cu_offset);
1945 printf (_(" Length: 0x%lx (%s)\n"), compunit.cu_length,
1946 initial_length_size == 8 ? "64-bit" : "32-bit");
1947 printf (_(" Version: %d\n"), compunit.cu_version);
1948 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
1949 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
1952 if (cu_offset + compunit.cu_length + initial_length_size
1953 > section->size)
1955 warn (_("Debug info is corrupted, length of CU at %lx extends beyond end of section (length = %lx)\n"),
1956 cu_offset, compunit.cu_length);
1957 break;
1959 tags = hdrptr;
1960 start += compunit.cu_length + initial_length_size;
1962 if (compunit.cu_version != 2 && compunit.cu_version != 3)
1964 warn (_("CU at offset %lx contains corrupt or unsupported version number: %d.\n"),
1965 cu_offset, compunit.cu_version);
1966 continue;
1969 free_abbrevs ();
1971 /* Process the abbrevs used by this compilation unit. DWARF
1972 sections under Mach-O have non-zero addresses. */
1973 if (compunit.cu_abbrev_offset >= debug_displays [abbrev].section.size)
1974 warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"),
1975 (unsigned long) compunit.cu_abbrev_offset,
1976 (unsigned long) debug_displays [abbrev].section.size);
1977 else
1978 process_abbrev_section
1979 ((unsigned char *) debug_displays [abbrev].section.start
1980 + compunit.cu_abbrev_offset - debug_displays [abbrev].section.address,
1981 (unsigned char *) debug_displays [abbrev].section.start
1982 + debug_displays [abbrev].section.size);
1984 level = 0;
1985 while (tags < start)
1987 unsigned int bytes_read;
1988 unsigned long abbrev_number;
1989 unsigned long die_offset;
1990 abbrev_entry *entry;
1991 abbrev_attr *attr;
1993 die_offset = tags - section_begin;
1995 abbrev_number = read_leb128 (tags, & bytes_read, 0);
1996 tags += bytes_read;
1998 /* A null DIE marks the end of a list of siblings or it may also be
1999 a section padding. */
2000 if (abbrev_number == 0)
2002 /* Check if it can be a section padding for the last CU. */
2003 if (level == 0 && start == end)
2005 unsigned char *chk;
2007 for (chk = tags; chk < start; chk++)
2008 if (*chk != 0)
2009 break;
2010 if (chk == start)
2011 break;
2014 --level;
2015 if (level < 0)
2017 static unsigned num_bogus_warns = 0;
2019 if (num_bogus_warns < 3)
2021 warn (_("Bogus end-of-siblings marker detected at offset %lx in .debug_info section\n"),
2022 die_offset);
2023 num_bogus_warns ++;
2024 if (num_bogus_warns == 3)
2025 warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
2028 continue;
2031 if (!do_loc)
2032 printf (_(" <%d><%lx>: Abbrev Number: %lu"),
2033 level, die_offset, abbrev_number);
2035 /* Scan through the abbreviation list until we reach the
2036 correct entry. */
2037 for (entry = first_abbrev;
2038 entry && entry->entry != abbrev_number;
2039 entry = entry->next)
2040 continue;
2042 if (entry == NULL)
2044 if (!do_loc)
2046 printf ("\n");
2047 fflush (stdout);
2049 warn (_("DIE at offset %lx refers to abbreviation number %lu which does not exist\n"),
2050 die_offset, abbrev_number);
2051 return 0;
2054 if (!do_loc)
2055 printf (_(" (%s)\n"), get_TAG_name (entry->tag));
2057 switch (entry->tag)
2059 default:
2060 need_base_address = 0;
2061 break;
2062 case DW_TAG_compile_unit:
2063 need_base_address = 1;
2064 break;
2065 case DW_TAG_entry_point:
2066 case DW_TAG_subprogram:
2067 need_base_address = 0;
2068 /* Assuming that there is no DW_AT_frame_base. */
2069 have_frame_base = 0;
2070 break;
2073 for (attr = entry->first_attr; attr; attr = attr->next)
2075 if (! do_loc)
2076 /* Show the offset from where the tag was extracted. */
2077 printf (" <%2lx>", (unsigned long)(tags - section_begin));
2079 tags = read_and_display_attr (attr->attribute,
2080 attr->form,
2081 tags, cu_offset,
2082 compunit.cu_pointer_size,
2083 offset_size,
2084 compunit.cu_version,
2085 debug_information + unit,
2086 do_loc, section);
2089 if (entry->children)
2090 ++level;
2094 /* Set num_debug_info_entries here so that it can be used to check if
2095 we need to process .debug_loc and .debug_ranges sections. */
2096 if ((do_loc || do_debug_loc || do_debug_ranges)
2097 && num_debug_info_entries == 0)
2098 num_debug_info_entries = num_units;
2100 if (!do_loc)
2102 printf ("\n");
2105 return 1;
2108 /* Locate and scan the .debug_info section in the file and record the pointer
2109 sizes and offsets for the compilation units in it. Usually an executable
2110 will have just one pointer size, but this is not guaranteed, and so we try
2111 not to make any assumptions. Returns zero upon failure, or the number of
2112 compilation units upon success. */
2114 static unsigned int
2115 load_debug_info (void * file)
2117 /* Reset the last pointer size so that we can issue correct error
2118 messages if we are displaying the contents of more than one section. */
2119 last_pointer_size = 0;
2120 warned_about_missing_comp_units = FALSE;
2122 /* If we have already tried and failed to load the .debug_info
2123 section then do not bother to repear the task. */
2124 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
2125 return 0;
2127 /* If we already have the information there is nothing else to do. */
2128 if (num_debug_info_entries > 0)
2129 return num_debug_info_entries;
2131 if (load_debug_section (info, file)
2132 && process_debug_info (&debug_displays [info].section, file, 1))
2133 return num_debug_info_entries;
2135 num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
2136 return 0;
2139 static int
2140 display_debug_lines_raw (struct dwarf_section *section,
2141 unsigned char *data,
2142 unsigned char *end)
2144 unsigned char *start = section->start;
2146 printf (_("Raw dump of debug contents of section %s:\n\n"),
2147 section->name);
2149 while (data < end)
2151 DWARF2_Internal_LineInfo info;
2152 unsigned char *standard_opcodes;
2153 unsigned char *end_of_sequence;
2154 unsigned char *hdrptr;
2155 unsigned long hdroff;
2156 int initial_length_size;
2157 int offset_size;
2158 int i;
2160 hdrptr = data;
2161 hdroff = hdrptr - start;
2163 /* Check the length of the block. */
2164 info.li_length = byte_get (hdrptr, 4);
2165 hdrptr += 4;
2167 if (info.li_length == 0xffffffff)
2169 /* This section is 64-bit DWARF 3. */
2170 info.li_length = byte_get (hdrptr, 8);
2171 hdrptr += 8;
2172 offset_size = 8;
2173 initial_length_size = 12;
2175 else
2177 offset_size = 4;
2178 initial_length_size = 4;
2181 if (info.li_length + initial_length_size > section->size)
2183 warn
2184 (_("The information in section %s appears to be corrupt - the section is too small\n"),
2185 section->name);
2186 return 0;
2189 /* Check its version number. */
2190 info.li_version = byte_get (hdrptr, 2);
2191 hdrptr += 2;
2192 if (info.li_version != 2 && info.li_version != 3)
2194 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
2195 return 0;
2198 info.li_prologue_length = byte_get (hdrptr, offset_size);
2199 hdrptr += offset_size;
2200 info.li_min_insn_length = byte_get (hdrptr, 1);
2201 hdrptr++;
2202 info.li_default_is_stmt = byte_get (hdrptr, 1);
2203 hdrptr++;
2204 info.li_line_base = byte_get (hdrptr, 1);
2205 hdrptr++;
2206 info.li_line_range = byte_get (hdrptr, 1);
2207 hdrptr++;
2208 info.li_opcode_base = byte_get (hdrptr, 1);
2209 hdrptr++;
2211 /* Sign extend the line base field. */
2212 info.li_line_base <<= 24;
2213 info.li_line_base >>= 24;
2215 printf (_(" Offset: 0x%lx\n"), hdroff);
2216 printf (_(" Length: %ld\n"), info.li_length);
2217 printf (_(" DWARF Version: %d\n"), info.li_version);
2218 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
2219 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
2220 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
2221 printf (_(" Line Base: %d\n"), info.li_line_base);
2222 printf (_(" Line Range: %d\n"), info.li_line_range);
2223 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
2225 end_of_sequence = data + info.li_length + initial_length_size;
2227 reset_state_machine (info.li_default_is_stmt);
2229 /* Display the contents of the Opcodes table. */
2230 standard_opcodes = hdrptr;
2232 printf (_("\n Opcodes:\n"));
2234 for (i = 1; i < info.li_opcode_base; i++)
2235 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
2237 /* Display the contents of the Directory table. */
2238 data = standard_opcodes + info.li_opcode_base - 1;
2240 if (*data == 0)
2241 printf (_("\n The Directory Table is empty.\n"));
2242 else
2244 printf (_("\n The Directory Table:\n"));
2246 while (*data != 0)
2248 printf (_(" %s\n"), data);
2250 data += strlen ((char *) data) + 1;
2254 /* Skip the NUL at the end of the table. */
2255 data++;
2257 /* Display the contents of the File Name table. */
2258 if (*data == 0)
2259 printf (_("\n The File Name Table is empty.\n"));
2260 else
2262 printf (_("\n The File Name Table:\n"));
2263 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
2265 while (*data != 0)
2267 unsigned char *name;
2268 unsigned int bytes_read;
2270 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
2271 name = data;
2273 data += strlen ((char *) data) + 1;
2275 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
2276 data += bytes_read;
2277 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
2278 data += bytes_read;
2279 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
2280 data += bytes_read;
2281 printf (_("%s\n"), name);
2285 /* Skip the NUL at the end of the table. */
2286 data++;
2288 /* Now display the statements. */
2289 printf (_("\n Line Number Statements:\n"));
2291 while (data < end_of_sequence)
2293 unsigned char op_code;
2294 int adv;
2295 unsigned long int uladv;
2296 unsigned int bytes_read;
2298 op_code = *data++;
2300 if (op_code >= info.li_opcode_base)
2302 op_code -= info.li_opcode_base;
2303 uladv = (op_code / info.li_line_range) * info.li_min_insn_length;
2304 state_machine_regs.address += uladv;
2305 printf (_(" Special opcode %d: advance Address by %lu to 0x%lx"),
2306 op_code, uladv, state_machine_regs.address);
2307 adv = (op_code % info.li_line_range) + info.li_line_base;
2308 state_machine_regs.line += adv;
2309 printf (_(" and Line by %d to %d\n"),
2310 adv, state_machine_regs.line);
2312 else switch (op_code)
2314 case DW_LNS_extended_op:
2315 data += process_extended_line_op (data, info.li_default_is_stmt);
2316 break;
2318 case DW_LNS_copy:
2319 printf (_(" Copy\n"));
2320 break;
2322 case DW_LNS_advance_pc:
2323 uladv = read_leb128 (data, & bytes_read, 0);
2324 uladv *= info.li_min_insn_length;
2325 data += bytes_read;
2326 state_machine_regs.address += uladv;
2327 printf (_(" Advance PC by %lu to 0x%lx\n"), uladv,
2328 state_machine_regs.address);
2329 break;
2331 case DW_LNS_advance_line:
2332 adv = read_leb128 (data, & bytes_read, 1);
2333 data += bytes_read;
2334 state_machine_regs.line += adv;
2335 printf (_(" Advance Line by %d to %d\n"), adv,
2336 state_machine_regs.line);
2337 break;
2339 case DW_LNS_set_file:
2340 adv = read_leb128 (data, & bytes_read, 0);
2341 data += bytes_read;
2342 printf (_(" Set File Name to entry %d in the File Name Table\n"),
2343 adv);
2344 state_machine_regs.file = adv;
2345 break;
2347 case DW_LNS_set_column:
2348 uladv = read_leb128 (data, & bytes_read, 0);
2349 data += bytes_read;
2350 printf (_(" Set column to %lu\n"), uladv);
2351 state_machine_regs.column = uladv;
2352 break;
2354 case DW_LNS_negate_stmt:
2355 adv = state_machine_regs.is_stmt;
2356 adv = ! adv;
2357 printf (_(" Set is_stmt to %d\n"), adv);
2358 state_machine_regs.is_stmt = adv;
2359 break;
2361 case DW_LNS_set_basic_block:
2362 printf (_(" Set basic block\n"));
2363 state_machine_regs.basic_block = 1;
2364 break;
2366 case DW_LNS_const_add_pc:
2367 uladv = (((255 - info.li_opcode_base) / info.li_line_range)
2368 * info.li_min_insn_length);
2369 state_machine_regs.address += uladv;
2370 printf (_(" Advance PC by constant %lu to 0x%lx\n"), uladv,
2371 state_machine_regs.address);
2372 break;
2374 case DW_LNS_fixed_advance_pc:
2375 uladv = byte_get (data, 2);
2376 data += 2;
2377 state_machine_regs.address += uladv;
2378 printf (_(" Advance PC by fixed size amount %lu to 0x%lx\n"),
2379 uladv, state_machine_regs.address);
2380 break;
2382 case DW_LNS_set_prologue_end:
2383 printf (_(" Set prologue_end to true\n"));
2384 break;
2386 case DW_LNS_set_epilogue_begin:
2387 printf (_(" Set epilogue_begin to true\n"));
2388 break;
2390 case DW_LNS_set_isa:
2391 uladv = read_leb128 (data, & bytes_read, 0);
2392 data += bytes_read;
2393 printf (_(" Set ISA to %lu\n"), uladv);
2394 break;
2396 default:
2397 printf (_(" Unknown opcode %d with operands: "), op_code);
2399 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
2401 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
2402 i == 1 ? "" : ", ");
2403 data += bytes_read;
2405 putchar ('\n');
2406 break;
2409 putchar ('\n');
2412 return 1;
2415 typedef struct
2417 unsigned char *name;
2418 unsigned int directory_index;
2419 unsigned int modification_date;
2420 unsigned int length;
2421 } File_Entry;
2423 /* Output a decoded representation of the .debug_line section. */
2425 static int
2426 display_debug_lines_decoded (struct dwarf_section *section,
2427 unsigned char *data,
2428 unsigned char *end)
2430 printf (_("Decoded dump of debug contents of section %s:\n\n"),
2431 section->name);
2433 while (data < end)
2435 /* This loop amounts to one iteration per compilation unit. */
2436 DWARF2_Internal_LineInfo info;
2437 unsigned char *standard_opcodes;
2438 unsigned char *end_of_sequence;
2439 unsigned char *hdrptr;
2440 int initial_length_size;
2441 int offset_size;
2442 int i;
2443 File_Entry *file_table = NULL;
2444 unsigned char **directory_table = NULL;
2445 unsigned int prev_line = 0;
2447 hdrptr = data;
2449 /* Extract information from the Line Number Program Header.
2450 (section 6.2.4 in the Dwarf3 doc). */
2452 /* Get the length of this CU's line number information block. */
2453 info.li_length = byte_get (hdrptr, 4);
2454 hdrptr += 4;
2456 if (info.li_length == 0xffffffff)
2458 /* This section is 64-bit DWARF 3. */
2459 info.li_length = byte_get (hdrptr, 8);
2460 hdrptr += 8;
2461 offset_size = 8;
2462 initial_length_size = 12;
2464 else
2466 offset_size = 4;
2467 initial_length_size = 4;
2470 if (info.li_length + initial_length_size > section->size)
2472 warn (_("The line info appears to be corrupt - "
2473 "the section is too small\n"));
2474 return 0;
2477 /* Get this CU's Line Number Block version number. */
2478 info.li_version = byte_get (hdrptr, 2);
2479 hdrptr += 2;
2480 if (info.li_version != 2 && info.li_version != 3)
2482 warn (_("Only DWARF version 2 and 3 line info is currently "
2483 "supported.\n"));
2484 return 0;
2487 info.li_prologue_length = byte_get (hdrptr, offset_size);
2488 hdrptr += offset_size;
2489 info.li_min_insn_length = byte_get (hdrptr, 1);
2490 hdrptr++;
2491 info.li_default_is_stmt = byte_get (hdrptr, 1);
2492 hdrptr++;
2493 info.li_line_base = byte_get (hdrptr, 1);
2494 hdrptr++;
2495 info.li_line_range = byte_get (hdrptr, 1);
2496 hdrptr++;
2497 info.li_opcode_base = byte_get (hdrptr, 1);
2498 hdrptr++;
2500 /* Sign extend the line base field. */
2501 info.li_line_base <<= 24;
2502 info.li_line_base >>= 24;
2504 /* Find the end of this CU's Line Number Information Block. */
2505 end_of_sequence = data + info.li_length + initial_length_size;
2507 reset_state_machine (info.li_default_is_stmt);
2509 /* Save a pointer to the contents of the Opcodes table. */
2510 standard_opcodes = hdrptr;
2512 /* Traverse the Directory table just to count entries. */
2513 data = standard_opcodes + info.li_opcode_base - 1;
2514 if (*data != 0)
2516 unsigned int n_directories = 0;
2517 unsigned char *ptr_directory_table = data;
2518 int i;
2520 while (*data != 0)
2522 data += strlen ((char *) data) + 1;
2523 n_directories++;
2526 /* Go through the directory table again to save the directories. */
2527 directory_table = (unsigned char **)
2528 xmalloc (n_directories * sizeof (unsigned char *));
2530 i = 0;
2531 while (*ptr_directory_table != 0)
2533 directory_table[i] = ptr_directory_table;
2534 ptr_directory_table += strlen ((char *) ptr_directory_table) + 1;
2535 i++;
2538 /* Skip the NUL at the end of the table. */
2539 data++;
2541 /* Traverse the File Name table just to count the entries. */
2542 if (*data != 0)
2544 unsigned int n_files = 0;
2545 unsigned char *ptr_file_name_table = data;
2546 int i;
2548 while (*data != 0)
2550 unsigned int bytes_read;
2552 /* Skip Name, directory index, last modification time and length
2553 of file. */
2554 data += strlen ((char *) data) + 1;
2555 read_leb128 (data, & bytes_read, 0);
2556 data += bytes_read;
2557 read_leb128 (data, & bytes_read, 0);
2558 data += bytes_read;
2559 read_leb128 (data, & bytes_read, 0);
2560 data += bytes_read;
2562 n_files++;
2565 /* Go through the file table again to save the strings. */
2566 file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
2568 i = 0;
2569 while (*ptr_file_name_table != 0)
2571 unsigned int bytes_read;
2573 file_table[i].name = ptr_file_name_table;
2574 ptr_file_name_table += strlen ((char *) ptr_file_name_table) + 1;
2576 /* We are not interested in directory, time or size. */
2577 file_table[i].directory_index = read_leb128 (ptr_file_name_table,
2578 & bytes_read, 0);
2579 ptr_file_name_table += bytes_read;
2580 file_table[i].modification_date = read_leb128 (ptr_file_name_table,
2581 & bytes_read, 0);
2582 ptr_file_name_table += bytes_read;
2583 file_table[i].length = read_leb128 (ptr_file_name_table, & bytes_read, 0);
2584 ptr_file_name_table += bytes_read;
2585 i++;
2587 i = 0;
2589 /* Print the Compilation Unit's name and a header. */
2590 if (directory_table == NULL)
2592 printf (_("CU: %s:\n"), file_table[0].name);
2593 printf (_("File name Line number Starting address\n"));
2595 else
2597 if (do_wide || strlen ((char *) directory_table[0]) < 76)
2599 printf (_("CU: %s/%s:\n"), directory_table[0],
2600 file_table[0].name);
2602 else
2604 printf (_("%s:\n"), file_table[0].name);
2606 printf (_("File name Line number Starting address\n"));
2610 /* Skip the NUL at the end of the table. */
2611 data++;
2613 /* This loop iterates through the Dwarf Line Number Program. */
2614 while (data < end_of_sequence)
2616 unsigned char op_code;
2617 int adv;
2618 unsigned long int uladv;
2619 unsigned int bytes_read;
2620 int is_special_opcode = 0;
2622 op_code = *data++;
2623 prev_line = state_machine_regs.line;
2625 if (op_code >= info.li_opcode_base)
2627 op_code -= info.li_opcode_base;
2628 uladv = (op_code / info.li_line_range) * info.li_min_insn_length;
2629 state_machine_regs.address += uladv;
2631 adv = (op_code % info.li_line_range) + info.li_line_base;
2632 state_machine_regs.line += adv;
2633 is_special_opcode = 1;
2635 else switch (op_code)
2637 case DW_LNS_extended_op:
2639 unsigned int ext_op_code_len;
2640 unsigned int bytes_read;
2641 unsigned char ext_op_code;
2642 unsigned char *op_code_data = data;
2644 ext_op_code_len = read_leb128 (op_code_data, &bytes_read, 0);
2645 op_code_data += bytes_read;
2647 if (ext_op_code_len == 0)
2649 warn (_("badly formed extended line op encountered!\n"));
2650 break;
2652 ext_op_code_len += bytes_read;
2653 ext_op_code = *op_code_data++;
2655 switch (ext_op_code)
2657 case DW_LNE_end_sequence:
2658 reset_state_machine (info.li_default_is_stmt);
2659 break;
2660 case DW_LNE_set_address:
2661 state_machine_regs.address =
2662 byte_get (op_code_data, ext_op_code_len - bytes_read - 1);
2663 break;
2664 case DW_LNE_define_file:
2666 unsigned int dir_index = 0;
2668 ++state_machine_regs.last_file_entry;
2669 op_code_data += strlen ((char *) op_code_data) + 1;
2670 dir_index = read_leb128 (op_code_data, & bytes_read, 0);
2671 op_code_data += bytes_read;
2672 read_leb128 (op_code_data, & bytes_read, 0);
2673 op_code_data += bytes_read;
2674 read_leb128 (op_code_data, & bytes_read, 0);
2676 printf (_("%s:\n"), directory_table[dir_index]);
2677 break;
2679 default:
2680 printf (_("UNKNOWN: length %d\n"), ext_op_code_len - bytes_read);
2681 break;
2683 data += ext_op_code_len;
2684 break;
2686 case DW_LNS_copy:
2687 break;
2689 case DW_LNS_advance_pc:
2690 uladv = read_leb128 (data, & bytes_read, 0);
2691 uladv *= info.li_min_insn_length;
2692 data += bytes_read;
2693 state_machine_regs.address += uladv;
2694 break;
2696 case DW_LNS_advance_line:
2697 adv = read_leb128 (data, & bytes_read, 1);
2698 data += bytes_read;
2699 state_machine_regs.line += adv;
2700 break;
2702 case DW_LNS_set_file:
2703 adv = read_leb128 (data, & bytes_read, 0);
2704 data += bytes_read;
2705 state_machine_regs.file = adv;
2706 if (file_table[state_machine_regs.file - 1].directory_index == 0)
2708 /* If directory index is 0, that means current directory. */
2709 printf (_("\n./%s:[++]\n"),
2710 file_table[state_machine_regs.file - 1].name);
2712 else
2714 /* The directory index starts counting at 1. */
2715 printf (_("\n%s/%s:\n"),
2716 directory_table[file_table[state_machine_regs.file - 1].directory_index - 1],
2717 file_table[state_machine_regs.file - 1].name);
2719 break;
2721 case DW_LNS_set_column:
2722 uladv = read_leb128 (data, & bytes_read, 0);
2723 data += bytes_read;
2724 state_machine_regs.column = uladv;
2725 break;
2727 case DW_LNS_negate_stmt:
2728 adv = state_machine_regs.is_stmt;
2729 adv = ! adv;
2730 state_machine_regs.is_stmt = adv;
2731 break;
2733 case DW_LNS_set_basic_block:
2734 state_machine_regs.basic_block = 1;
2735 break;
2737 case DW_LNS_const_add_pc:
2738 uladv = (((255 - info.li_opcode_base) / info.li_line_range)
2739 * info.li_min_insn_length);
2740 state_machine_regs.address += uladv;
2741 break;
2743 case DW_LNS_fixed_advance_pc:
2744 uladv = byte_get (data, 2);
2745 data += 2;
2746 state_machine_regs.address += uladv;
2747 break;
2749 case DW_LNS_set_prologue_end:
2750 break;
2752 case DW_LNS_set_epilogue_begin:
2753 break;
2755 case DW_LNS_set_isa:
2756 uladv = read_leb128 (data, & bytes_read, 0);
2757 data += bytes_read;
2758 printf (_(" Set ISA to %lu\n"), uladv);
2759 break;
2761 default:
2762 printf (_(" Unknown opcode %d with operands: "), op_code);
2764 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
2766 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
2767 i == 1 ? "" : ", ");
2768 data += bytes_read;
2770 putchar ('\n');
2771 break;
2774 /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
2775 to the DWARF address/line matrix. */
2776 if ((is_special_opcode) || (op_code == DW_LNE_end_sequence)
2777 || (op_code == DW_LNS_copy))
2779 const unsigned int MAX_FILENAME_LENGTH = 35;
2780 char *fileName = (char *)file_table[state_machine_regs.file - 1].name;
2781 char *newFileName = NULL;
2782 size_t fileNameLength = strlen (fileName);
2784 if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
2786 newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
2787 /* Truncate file name */
2788 strncpy (newFileName,
2789 fileName + fileNameLength - MAX_FILENAME_LENGTH,
2790 MAX_FILENAME_LENGTH + 1);
2792 else
2794 newFileName = (char *) xmalloc (fileNameLength + 1);
2795 strncpy (newFileName, fileName, fileNameLength + 1);
2798 if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
2800 printf (_("%-35s %11d %#18lx\n"), newFileName,
2801 state_machine_regs.line, state_machine_regs.address);
2803 else
2805 printf (_("%s %11d %#18lx\n"), newFileName,
2806 state_machine_regs.line, state_machine_regs.address);
2809 if (op_code == DW_LNE_end_sequence)
2810 printf ("\n");
2812 free (newFileName);
2815 free (file_table);
2816 file_table = NULL;
2817 free (directory_table);
2818 directory_table = NULL;
2819 putchar ('\n');
2822 return 1;
2825 static int
2826 display_debug_lines (struct dwarf_section *section, void *file)
2828 unsigned char *data = section->start;
2829 unsigned char *end = data + section->size;
2830 int retValRaw = 1;
2831 int retValDecoded = 1;
2833 if (load_debug_info (file) == 0)
2835 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
2836 section->name);
2837 return 0;
2840 if (do_debug_lines == 0)
2841 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
2843 if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
2844 retValRaw = display_debug_lines_raw (section, data, end);
2846 if (do_debug_lines & FLAG_DEBUG_LINES_DECODED)
2847 retValDecoded = display_debug_lines_decoded (section, data, end);
2849 if (!retValRaw || !retValDecoded)
2850 return 0;
2852 return 1;
2855 static debug_info *
2856 find_debug_info_for_offset (unsigned long offset)
2858 unsigned int i;
2860 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
2861 return NULL;
2863 for (i = 0; i < num_debug_info_entries; i++)
2864 if (debug_information[i].cu_offset == offset)
2865 return debug_information + i;
2867 return NULL;
2870 static int
2871 display_debug_pubnames (struct dwarf_section *section,
2872 void *file ATTRIBUTE_UNUSED)
2874 DWARF2_Internal_PubNames pubnames;
2875 unsigned char *start = section->start;
2876 unsigned char *end = start + section->size;
2878 /* It does not matter if this load fails,
2879 we test for that later on. */
2880 load_debug_info (file);
2882 printf (_("Contents of the %s section:\n\n"), section->name);
2884 while (start < end)
2886 unsigned char *data;
2887 unsigned long offset;
2888 int offset_size, initial_length_size;
2890 data = start;
2892 pubnames.pn_length = byte_get (data, 4);
2893 data += 4;
2894 if (pubnames.pn_length == 0xffffffff)
2896 pubnames.pn_length = byte_get (data, 8);
2897 data += 8;
2898 offset_size = 8;
2899 initial_length_size = 12;
2901 else
2903 offset_size = 4;
2904 initial_length_size = 4;
2907 pubnames.pn_version = byte_get (data, 2);
2908 data += 2;
2910 pubnames.pn_offset = byte_get (data, offset_size);
2911 data += offset_size;
2913 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
2914 && num_debug_info_entries > 0
2915 && find_debug_info_for_offset (pubnames.pn_offset) == NULL)
2916 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
2917 pubnames.pn_offset, section->name);
2919 pubnames.pn_size = byte_get (data, offset_size);
2920 data += offset_size;
2922 start += pubnames.pn_length + initial_length_size;
2924 if (pubnames.pn_version != 2 && pubnames.pn_version != 3)
2926 static int warned = 0;
2928 if (! warned)
2930 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
2931 warned = 1;
2934 continue;
2937 printf (_(" Length: %ld\n"),
2938 pubnames.pn_length);
2939 printf (_(" Version: %d\n"),
2940 pubnames.pn_version);
2941 printf (_(" Offset into .debug_info section: 0x%lx\n"),
2942 pubnames.pn_offset);
2943 printf (_(" Size of area in .debug_info section: %ld\n"),
2944 pubnames.pn_size);
2946 printf (_("\n Offset\tName\n"));
2950 offset = byte_get (data, offset_size);
2952 if (offset != 0)
2954 data += offset_size;
2955 printf (" %-6lx\t%s\n", offset, data);
2956 data += strlen ((char *) data) + 1;
2959 while (offset != 0);
2962 printf ("\n");
2963 return 1;
2966 static int
2967 display_debug_macinfo (struct dwarf_section *section,
2968 void *file ATTRIBUTE_UNUSED)
2970 unsigned char *start = section->start;
2971 unsigned char *end = start + section->size;
2972 unsigned char *curr = start;
2973 unsigned int bytes_read;
2974 enum dwarf_macinfo_record_type op;
2976 printf (_("Contents of the %s section:\n\n"), section->name);
2978 while (curr < end)
2980 unsigned int lineno;
2981 const char *string;
2983 op = (enum dwarf_macinfo_record_type) *curr;
2984 curr++;
2986 switch (op)
2988 case DW_MACINFO_start_file:
2990 unsigned int filenum;
2992 lineno = read_leb128 (curr, & bytes_read, 0);
2993 curr += bytes_read;
2994 filenum = read_leb128 (curr, & bytes_read, 0);
2995 curr += bytes_read;
2997 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
2998 lineno, filenum);
3000 break;
3002 case DW_MACINFO_end_file:
3003 printf (_(" DW_MACINFO_end_file\n"));
3004 break;
3006 case DW_MACINFO_define:
3007 lineno = read_leb128 (curr, & bytes_read, 0);
3008 curr += bytes_read;
3009 string = (char *) curr;
3010 curr += strlen (string) + 1;
3011 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
3012 lineno, string);
3013 break;
3015 case DW_MACINFO_undef:
3016 lineno = read_leb128 (curr, & bytes_read, 0);
3017 curr += bytes_read;
3018 string = (char *) curr;
3019 curr += strlen (string) + 1;
3020 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
3021 lineno, string);
3022 break;
3024 case DW_MACINFO_vendor_ext:
3026 unsigned int constant;
3028 constant = read_leb128 (curr, & bytes_read, 0);
3029 curr += bytes_read;
3030 string = (char *) curr;
3031 curr += strlen (string) + 1;
3032 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
3033 constant, string);
3035 break;
3039 return 1;
3042 static int
3043 display_debug_abbrev (struct dwarf_section *section,
3044 void *file ATTRIBUTE_UNUSED)
3046 abbrev_entry *entry;
3047 unsigned char *start = section->start;
3048 unsigned char *end = start + section->size;
3050 printf (_("Contents of the %s section:\n\n"), section->name);
3054 free_abbrevs ();
3056 start = process_abbrev_section (start, end);
3058 if (first_abbrev == NULL)
3059 continue;
3061 printf (_(" Number TAG\n"));
3063 for (entry = first_abbrev; entry; entry = entry->next)
3065 abbrev_attr *attr;
3067 printf (_(" %ld %s [%s]\n"),
3068 entry->entry,
3069 get_TAG_name (entry->tag),
3070 entry->children ? _("has children") : _("no children"));
3072 for (attr = entry->first_attr; attr; attr = attr->next)
3073 printf (_(" %-18s %s\n"),
3074 get_AT_name (attr->attribute),
3075 get_FORM_name (attr->form));
3078 while (start);
3080 printf ("\n");
3082 return 1;
3085 static int
3086 display_debug_loc (struct dwarf_section *section, void *file)
3088 unsigned char *start = section->start;
3089 unsigned char *section_end;
3090 unsigned long bytes;
3091 unsigned char *section_begin = start;
3092 unsigned int num_loc_list = 0;
3093 unsigned long last_offset = 0;
3094 unsigned int first = 0;
3095 unsigned int i;
3096 unsigned int j;
3097 int seen_first_offset = 0;
3098 int use_debug_info = 1;
3099 unsigned char *next;
3101 bytes = section->size;
3102 section_end = start + bytes;
3104 if (bytes == 0)
3106 printf (_("\nThe %s section is empty.\n"), section->name);
3107 return 0;
3110 if (load_debug_info (file) == 0)
3112 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
3113 section->name);
3114 return 0;
3117 /* Check the order of location list in .debug_info section. If
3118 offsets of location lists are in the ascending order, we can
3119 use `debug_information' directly. */
3120 for (i = 0; i < num_debug_info_entries; i++)
3122 unsigned int num;
3124 num = debug_information [i].num_loc_offsets;
3125 num_loc_list += num;
3127 /* Check if we can use `debug_information' directly. */
3128 if (use_debug_info && num != 0)
3130 if (!seen_first_offset)
3132 /* This is the first location list. */
3133 last_offset = debug_information [i].loc_offsets [0];
3134 first = i;
3135 seen_first_offset = 1;
3136 j = 1;
3138 else
3139 j = 0;
3141 for (; j < num; j++)
3143 if (last_offset >
3144 debug_information [i].loc_offsets [j])
3146 use_debug_info = 0;
3147 break;
3149 last_offset = debug_information [i].loc_offsets [j];
3154 if (!use_debug_info)
3155 /* FIXME: Should we handle this case? */
3156 error (_("Location lists in .debug_info section aren't in ascending order!\n"));
3158 if (!seen_first_offset)
3159 error (_("No location lists in .debug_info section!\n"));
3161 /* DWARF sections under Mach-O have non-zero addresses. */
3162 if (debug_information [first].num_loc_offsets > 0
3163 && debug_information [first].loc_offsets [0] != section->address)
3164 warn (_("Location lists in %s section start at 0x%lx\n"),
3165 section->name, debug_information [first].loc_offsets [0]);
3167 printf (_("Contents of the %s section:\n\n"), section->name);
3168 printf (_(" Offset Begin End Expression\n"));
3170 seen_first_offset = 0;
3171 for (i = first; i < num_debug_info_entries; i++)
3173 dwarf_vma begin;
3174 dwarf_vma end;
3175 unsigned short length;
3176 unsigned long offset;
3177 unsigned int pointer_size;
3178 unsigned long cu_offset;
3179 unsigned long base_address;
3180 int need_frame_base;
3181 int has_frame_base;
3183 pointer_size = debug_information [i].pointer_size;
3184 cu_offset = debug_information [i].cu_offset;
3186 for (j = 0; j < debug_information [i].num_loc_offsets; j++)
3188 has_frame_base = debug_information [i].have_frame_base [j];
3189 /* DWARF sections under Mach-O have non-zero addresses. */
3190 offset = debug_information [i].loc_offsets [j] - section->address;
3191 next = section_begin + offset;
3192 base_address = debug_information [i].base_address;
3194 if (!seen_first_offset)
3195 seen_first_offset = 1;
3196 else
3198 if (start < next)
3199 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
3200 (unsigned long) (start - section_begin),
3201 (unsigned long) (next - section_begin));
3202 else if (start > next)
3203 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
3204 (unsigned long) (start - section_begin),
3205 (unsigned long) (next - section_begin));
3207 start = next;
3209 if (offset >= bytes)
3211 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
3212 offset);
3213 continue;
3216 while (1)
3218 if (start + 2 * pointer_size > section_end)
3220 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
3221 offset);
3222 break;
3225 /* Note: we use sign extension here in order to be sure that
3226 we can detect the -1 escape value. Sign extension into the
3227 top 32 bits of a 32-bit address will not affect the values
3228 that we display since we always show hex values, and always
3229 the bottom 32-bits. */
3230 begin = byte_get_signed (start, pointer_size);
3231 start += pointer_size;
3232 end = byte_get_signed (start, pointer_size);
3233 start += pointer_size;
3235 printf (" %8.8lx ", offset);
3237 if (begin == 0 && end == 0)
3239 printf (_("<End of list>\n"));
3240 break;
3243 /* Check base address specifiers. */
3244 if (begin == (dwarf_vma) -1 && end != (dwarf_vma) -1)
3246 base_address = end;
3247 print_dwarf_vma (begin, pointer_size);
3248 print_dwarf_vma (end, pointer_size);
3249 printf (_("(base address)\n"));
3250 continue;
3253 if (start + 2 > section_end)
3255 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
3256 offset);
3257 break;
3260 length = byte_get (start, 2);
3261 start += 2;
3263 if (start + length > section_end)
3265 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
3266 offset);
3267 break;
3270 print_dwarf_vma (begin + base_address, pointer_size);
3271 print_dwarf_vma (end + base_address, pointer_size);
3273 putchar ('(');
3274 need_frame_base = decode_location_expression (start,
3275 pointer_size,
3276 length,
3277 cu_offset, section);
3278 putchar (')');
3280 if (need_frame_base && !has_frame_base)
3281 printf (_(" [without DW_AT_frame_base]"));
3283 if (begin == end)
3284 fputs (_(" (start == end)"), stdout);
3285 else if (begin > end)
3286 fputs (_(" (start > end)"), stdout);
3288 putchar ('\n');
3290 start += length;
3295 if (start < section_end)
3296 warn (_("There are %ld unused bytes at the end of section %s\n"),
3297 (long) (section_end - start), section->name);
3298 putchar ('\n');
3299 return 1;
3302 static int
3303 display_debug_str (struct dwarf_section *section,
3304 void *file ATTRIBUTE_UNUSED)
3306 unsigned char *start = section->start;
3307 unsigned long bytes = section->size;
3308 dwarf_vma addr = section->address;
3310 if (bytes == 0)
3312 printf (_("\nThe %s section is empty.\n"), section->name);
3313 return 0;
3316 printf (_("Contents of the %s section:\n\n"), section->name);
3318 while (bytes)
3320 int j;
3321 int k;
3322 int lbytes;
3324 lbytes = (bytes > 16 ? 16 : bytes);
3326 printf (" 0x%8.8lx ", (unsigned long) addr);
3328 for (j = 0; j < 16; j++)
3330 if (j < lbytes)
3331 printf ("%2.2x", start[j]);
3332 else
3333 printf (" ");
3335 if ((j & 3) == 3)
3336 printf (" ");
3339 for (j = 0; j < lbytes; j++)
3341 k = start[j];
3342 if (k >= ' ' && k < 0x80)
3343 printf ("%c", k);
3344 else
3345 printf (".");
3348 putchar ('\n');
3350 start += lbytes;
3351 addr += lbytes;
3352 bytes -= lbytes;
3355 putchar ('\n');
3357 return 1;
3360 static int
3361 display_debug_info (struct dwarf_section *section, void *file)
3363 return process_debug_info (section, file, 0);
3367 static int
3368 display_debug_aranges (struct dwarf_section *section,
3369 void *file ATTRIBUTE_UNUSED)
3371 unsigned char *start = section->start;
3372 unsigned char *end = start + section->size;
3374 printf (_("Contents of the %s section:\n\n"), section->name);
3376 /* It does not matter if this load fails,
3377 we test for that later on. */
3378 load_debug_info (file);
3380 while (start < end)
3382 unsigned char *hdrptr;
3383 DWARF2_Internal_ARange arange;
3384 unsigned char *ranges;
3385 dwarf_vma length;
3386 dwarf_vma address;
3387 unsigned char address_size;
3388 int excess;
3389 int offset_size;
3390 int initial_length_size;
3392 hdrptr = start;
3394 arange.ar_length = byte_get (hdrptr, 4);
3395 hdrptr += 4;
3397 if (arange.ar_length == 0xffffffff)
3399 arange.ar_length = byte_get (hdrptr, 8);
3400 hdrptr += 8;
3401 offset_size = 8;
3402 initial_length_size = 12;
3404 else
3406 offset_size = 4;
3407 initial_length_size = 4;
3410 arange.ar_version = byte_get (hdrptr, 2);
3411 hdrptr += 2;
3413 arange.ar_info_offset = byte_get (hdrptr, offset_size);
3414 hdrptr += offset_size;
3416 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
3417 && num_debug_info_entries > 0
3418 && find_debug_info_for_offset (arange.ar_info_offset) == NULL)
3419 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
3420 arange.ar_info_offset, section->name);
3422 arange.ar_pointer_size = byte_get (hdrptr, 1);
3423 hdrptr += 1;
3425 arange.ar_segment_size = byte_get (hdrptr, 1);
3426 hdrptr += 1;
3428 if (arange.ar_version != 2 && arange.ar_version != 3)
3430 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
3431 break;
3434 printf (_(" Length: %ld\n"), arange.ar_length);
3435 printf (_(" Version: %d\n"), arange.ar_version);
3436 printf (_(" Offset into .debug_info: 0x%lx\n"), arange.ar_info_offset);
3437 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
3438 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
3440 address_size = arange.ar_pointer_size + arange.ar_segment_size;
3442 /* The DWARF spec does not require that the address size be a power
3443 of two, but we do. This will have to change if we ever encounter
3444 an uneven architecture. */
3445 if ((address_size & (address_size - 1)) != 0)
3447 warn (_("Pointer size + Segment size is not a power of two.\n"));
3448 break;
3451 if (address_size > 4)
3452 printf (_("\n Address Length\n"));
3453 else
3454 printf (_("\n Address Length\n"));
3456 ranges = hdrptr;
3458 /* Must pad to an alignment boundary that is twice the address size. */
3459 excess = (hdrptr - start) % (2 * address_size);
3460 if (excess)
3461 ranges += (2 * address_size) - excess;
3463 start += arange.ar_length + initial_length_size;
3465 while (ranges + 2 * address_size <= start)
3467 address = byte_get (ranges, address_size);
3469 ranges += address_size;
3471 length = byte_get (ranges, address_size);
3473 ranges += address_size;
3475 printf (" ");
3476 print_dwarf_vma (address, address_size);
3477 print_dwarf_vma (length, address_size);
3478 putchar ('\n');
3482 printf ("\n");
3484 return 1;
3487 /* Each debug_information[x].range_lists[y] gets this representation for
3488 sorting purposes. */
3490 struct range_entry
3492 /* The debug_information[x].range_lists[y] value. */
3493 unsigned long ranges_offset;
3495 /* Original debug_information to find parameters of the data. */
3496 debug_info *debug_info_p;
3499 /* Sort struct range_entry in ascending order of its RANGES_OFFSET. */
3501 static int
3502 range_entry_compar (const void *ap, const void *bp)
3504 const struct range_entry *a_re = (const struct range_entry *) ap;
3505 const struct range_entry *b_re = (const struct range_entry *) bp;
3506 const unsigned long a = a_re->ranges_offset;
3507 const unsigned long b = b_re->ranges_offset;
3509 return (a > b) - (b > a);
3512 static int
3513 display_debug_ranges (struct dwarf_section *section,
3514 void *file ATTRIBUTE_UNUSED)
3516 unsigned char *start = section->start;
3517 unsigned char *section_end;
3518 unsigned long bytes;
3519 unsigned char *section_begin = start;
3520 unsigned int num_range_list, i;
3521 struct range_entry *range_entries, *range_entry_fill;
3523 bytes = section->size;
3524 section_end = start + bytes;
3526 if (bytes == 0)
3528 printf (_("\nThe %s section is empty.\n"), section->name);
3529 return 0;
3532 if (load_debug_info (file) == 0)
3534 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
3535 section->name);
3536 return 0;
3539 num_range_list = 0;
3540 for (i = 0; i < num_debug_info_entries; i++)
3541 num_range_list += debug_information [i].num_range_lists;
3543 if (num_range_list == 0)
3544 error (_("No range lists in .debug_info section!\n"));
3546 range_entries = (struct range_entry *)
3547 xmalloc (sizeof (*range_entries) * num_range_list);
3548 range_entry_fill = range_entries;
3550 for (i = 0; i < num_debug_info_entries; i++)
3552 debug_info *debug_info_p = &debug_information[i];
3553 unsigned int j;
3555 for (j = 0; j < debug_info_p->num_range_lists; j++)
3557 range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
3558 range_entry_fill->debug_info_p = debug_info_p;
3559 range_entry_fill++;
3563 qsort (range_entries, num_range_list, sizeof (*range_entries),
3564 range_entry_compar);
3566 /* DWARF sections under Mach-O have non-zero addresses. */
3567 if (range_entries[0].ranges_offset != section->address)
3568 warn (_("Range lists in %s section start at 0x%lx\n"),
3569 section->name, range_entries[0].ranges_offset);
3571 printf (_("Contents of the %s section:\n\n"), section->name);
3572 printf (_(" Offset Begin End\n"));
3574 for (i = 0; i < num_range_list; i++)
3576 struct range_entry *range_entry = &range_entries[i];
3577 debug_info *debug_info_p = range_entry->debug_info_p;
3578 unsigned int pointer_size;
3579 unsigned long offset;
3580 unsigned char *next;
3581 unsigned long base_address;
3583 pointer_size = debug_info_p->pointer_size;
3585 /* DWARF sections under Mach-O have non-zero addresses. */
3586 offset = range_entry->ranges_offset - section->address;
3587 next = section_begin + offset;
3588 base_address = debug_info_p->base_address;
3590 if (i > 0)
3592 if (start < next)
3593 warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
3594 (unsigned long) (start - section_begin),
3595 (unsigned long) (next - section_begin), section->name);
3596 else if (start > next)
3597 warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
3598 (unsigned long) (start - section_begin),
3599 (unsigned long) (next - section_begin), section->name);
3601 start = next;
3603 while (1)
3605 dwarf_vma begin;
3606 dwarf_vma end;
3608 /* Note: we use sign extension here in order to be sure that
3609 we can detect the -1 escape value. Sign extension into the
3610 top 32 bits of a 32-bit address will not affect the values
3611 that we display since we always show hex values, and always
3612 the bottom 32-bits. */
3613 begin = byte_get_signed (start, pointer_size);
3614 start += pointer_size;
3615 end = byte_get_signed (start, pointer_size);
3616 start += pointer_size;
3618 printf (" %8.8lx ", offset);
3620 if (begin == 0 && end == 0)
3622 printf (_("<End of list>\n"));
3623 break;
3626 /* Check base address specifiers. */
3627 if (begin == (dwarf_vma) -1 && end != (dwarf_vma) -1)
3629 base_address = end;
3630 print_dwarf_vma (begin, pointer_size);
3631 print_dwarf_vma (end, pointer_size);
3632 printf ("(base address)\n");
3633 continue;
3636 print_dwarf_vma (begin + base_address, pointer_size);
3637 print_dwarf_vma (end + base_address, pointer_size);
3639 if (begin == end)
3640 fputs (_("(start == end)"), stdout);
3641 else if (begin > end)
3642 fputs (_("(start > end)"), stdout);
3644 putchar ('\n');
3647 putchar ('\n');
3649 free (range_entries);
3651 return 1;
3654 typedef struct Frame_Chunk
3656 struct Frame_Chunk *next;
3657 unsigned char *chunk_start;
3658 int ncols;
3659 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
3660 short int *col_type;
3661 int *col_offset;
3662 char *augmentation;
3663 unsigned int code_factor;
3664 int data_factor;
3665 unsigned long pc_begin;
3666 unsigned long pc_range;
3667 int cfa_reg;
3668 int cfa_offset;
3669 int ra;
3670 unsigned char fde_encoding;
3671 unsigned char cfa_exp;
3673 Frame_Chunk;
3675 static const char *const *dwarf_regnames;
3676 static unsigned int dwarf_regnames_count;
3678 /* A marker for a col_type that means this column was never referenced
3679 in the frame info. */
3680 #define DW_CFA_unreferenced (-1)
3682 /* Return 0 if not more space is needed, 1 if more space is needed,
3683 -1 for invalid reg. */
3685 static int
3686 frame_need_space (Frame_Chunk *fc, unsigned int reg)
3688 int prev = fc->ncols;
3690 if (reg < (unsigned int) fc->ncols)
3691 return 0;
3693 if (dwarf_regnames_count
3694 && reg > dwarf_regnames_count)
3695 return -1;
3697 fc->ncols = reg + 1;
3698 fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
3699 sizeof (short int));
3700 fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
3702 while (prev < fc->ncols)
3704 fc->col_type[prev] = DW_CFA_unreferenced;
3705 fc->col_offset[prev] = 0;
3706 prev++;
3708 return 1;
3711 static const char *const dwarf_regnames_i386[] =
3713 "eax", "ecx", "edx", "ebx",
3714 "esp", "ebp", "esi", "edi",
3715 "eip", "eflags", NULL,
3716 "st0", "st1", "st2", "st3",
3717 "st4", "st5", "st6", "st7",
3718 NULL, NULL,
3719 "xmm0", "xmm1", "xmm2", "xmm3",
3720 "xmm4", "xmm5", "xmm6", "xmm7",
3721 "mm0", "mm1", "mm2", "mm3",
3722 "mm4", "mm5", "mm6", "mm7",
3723 "fcw", "fsw", "mxcsr",
3724 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
3725 "tr", "ldtr"
3728 static const char *const dwarf_regnames_x86_64[] =
3730 "rax", "rdx", "rcx", "rbx",
3731 "rsi", "rdi", "rbp", "rsp",
3732 "r8", "r9", "r10", "r11",
3733 "r12", "r13", "r14", "r15",
3734 "rip",
3735 "xmm0", "xmm1", "xmm2", "xmm3",
3736 "xmm4", "xmm5", "xmm6", "xmm7",
3737 "xmm8", "xmm9", "xmm10", "xmm11",
3738 "xmm12", "xmm13", "xmm14", "xmm15",
3739 "st0", "st1", "st2", "st3",
3740 "st4", "st5", "st6", "st7",
3741 "mm0", "mm1", "mm2", "mm3",
3742 "mm4", "mm5", "mm6", "mm7",
3743 "rflags",
3744 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
3745 "fs.base", "gs.base", NULL, NULL,
3746 "tr", "ldtr",
3747 "mxcsr", "fcw", "fsw"
3750 void
3751 init_dwarf_regnames (unsigned int e_machine)
3753 switch (e_machine)
3755 case EM_386:
3756 case EM_486:
3757 dwarf_regnames = dwarf_regnames_i386;
3758 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
3759 break;
3761 case EM_X86_64:
3762 dwarf_regnames = dwarf_regnames_x86_64;
3763 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
3764 break;
3766 default:
3767 break;
3771 static const char *
3772 regname (unsigned int regno, int row)
3774 static char reg[64];
3775 if (dwarf_regnames
3776 && regno < dwarf_regnames_count
3777 && dwarf_regnames [regno] != NULL)
3779 if (row)
3780 return dwarf_regnames [regno];
3781 snprintf (reg, sizeof (reg), "r%d (%s)", regno,
3782 dwarf_regnames [regno]);
3784 else
3785 snprintf (reg, sizeof (reg), "r%d", regno);
3786 return reg;
3789 static void
3790 frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
3792 int r;
3793 char tmp[100];
3795 if (*max_regs < fc->ncols)
3796 *max_regs = fc->ncols;
3798 if (*need_col_headers)
3800 static const char *loc = " LOC";
3802 *need_col_headers = 0;
3804 printf ("%-*s CFA ", eh_addr_size * 2, loc);
3806 for (r = 0; r < *max_regs; r++)
3807 if (fc->col_type[r] != DW_CFA_unreferenced)
3809 if (r == fc->ra)
3810 printf ("ra ");
3811 else
3812 printf ("%-5s ", regname (r, 1));
3815 printf ("\n");
3818 printf ("%0*lx ", eh_addr_size * 2, fc->pc_begin);
3819 if (fc->cfa_exp)
3820 strcpy (tmp, "exp");
3821 else
3822 sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), fc->cfa_offset);
3823 printf ("%-8s ", tmp);
3825 for (r = 0; r < fc->ncols; r++)
3827 if (fc->col_type[r] != DW_CFA_unreferenced)
3829 switch (fc->col_type[r])
3831 case DW_CFA_undefined:
3832 strcpy (tmp, "u");
3833 break;
3834 case DW_CFA_same_value:
3835 strcpy (tmp, "s");
3836 break;
3837 case DW_CFA_offset:
3838 sprintf (tmp, "c%+d", fc->col_offset[r]);
3839 break;
3840 case DW_CFA_val_offset:
3841 sprintf (tmp, "v%+d", fc->col_offset[r]);
3842 break;
3843 case DW_CFA_register:
3844 sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
3845 break;
3846 case DW_CFA_expression:
3847 strcpy (tmp, "exp");
3848 break;
3849 case DW_CFA_val_expression:
3850 strcpy (tmp, "vexp");
3851 break;
3852 default:
3853 strcpy (tmp, "n/a");
3854 break;
3856 printf ("%-5s ", tmp);
3859 printf ("\n");
3862 #define GET(N) byte_get (start, N); start += N
3863 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
3864 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
3866 static int
3867 display_debug_frames (struct dwarf_section *section,
3868 void *file ATTRIBUTE_UNUSED)
3870 unsigned char *start = section->start;
3871 unsigned char *end = start + section->size;
3872 unsigned char *section_start = start;
3873 Frame_Chunk *chunks = 0;
3874 Frame_Chunk *remembered_state = 0;
3875 Frame_Chunk *rs;
3876 int is_eh = strcmp (section->name, ".eh_frame") == 0;
3877 unsigned int length_return;
3878 int max_regs = 0;
3879 const char *bad_reg = _("bad register: ");
3881 printf (_("Contents of the %s section:\n"), section->name);
3883 while (start < end)
3885 unsigned char *saved_start;
3886 unsigned char *block_end;
3887 unsigned long length;
3888 unsigned long cie_id;
3889 Frame_Chunk *fc;
3890 Frame_Chunk *cie;
3891 int need_col_headers = 1;
3892 unsigned char *augmentation_data = NULL;
3893 unsigned long augmentation_data_len = 0;
3894 int encoded_ptr_size = eh_addr_size;
3895 int offset_size;
3896 int initial_length_size;
3898 saved_start = start;
3899 length = byte_get (start, 4); start += 4;
3901 if (length == 0)
3903 printf ("\n%08lx ZERO terminator\n\n",
3904 (unsigned long)(saved_start - section_start));
3905 continue;
3908 if (length == 0xffffffff)
3910 length = byte_get (start, 8);
3911 start += 8;
3912 offset_size = 8;
3913 initial_length_size = 12;
3915 else
3917 offset_size = 4;
3918 initial_length_size = 4;
3921 block_end = saved_start + length + initial_length_size;
3922 if (block_end > end)
3924 warn ("Invalid length %#08lx in FDE at %#08lx\n",
3925 length, (unsigned long)(saved_start - section_start));
3926 block_end = end;
3928 cie_id = byte_get (start, offset_size); start += offset_size;
3930 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
3932 int version;
3934 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
3935 memset (fc, 0, sizeof (Frame_Chunk));
3937 fc->next = chunks;
3938 chunks = fc;
3939 fc->chunk_start = saved_start;
3940 fc->ncols = 0;
3941 fc->col_type = (short int *) xmalloc (sizeof (short int));
3942 fc->col_offset = (int *) xmalloc (sizeof (int));
3943 frame_need_space (fc, max_regs - 1);
3945 version = *start++;
3947 fc->augmentation = (char *) start;
3948 start = (unsigned char *) strchr ((char *) start, '\0') + 1;
3950 if (fc->augmentation[0] == 'z')
3952 fc->code_factor = LEB ();
3953 fc->data_factor = SLEB ();
3954 if (version == 1)
3956 fc->ra = GET (1);
3958 else
3960 fc->ra = LEB ();
3962 augmentation_data_len = LEB ();
3963 augmentation_data = start;
3964 start += augmentation_data_len;
3966 else if (strcmp (fc->augmentation, "eh") == 0)
3968 start += eh_addr_size;
3969 fc->code_factor = LEB ();
3970 fc->data_factor = SLEB ();
3971 if (version == 1)
3973 fc->ra = GET (1);
3975 else
3977 fc->ra = LEB ();
3980 else
3982 fc->code_factor = LEB ();
3983 fc->data_factor = SLEB ();
3984 if (version == 1)
3986 fc->ra = GET (1);
3988 else
3990 fc->ra = LEB ();
3993 cie = fc;
3995 if (do_debug_frames_interp)
3996 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
3997 (unsigned long)(saved_start - section_start), length, cie_id,
3998 fc->augmentation, fc->code_factor, fc->data_factor,
3999 fc->ra);
4000 else
4002 printf ("\n%08lx %08lx %08lx CIE\n",
4003 (unsigned long)(saved_start - section_start), length, cie_id);
4004 printf (" Version: %d\n", version);
4005 printf (" Augmentation: \"%s\"\n", fc->augmentation);
4006 printf (" Code alignment factor: %u\n", fc->code_factor);
4007 printf (" Data alignment factor: %d\n", fc->data_factor);
4008 printf (" Return address column: %d\n", fc->ra);
4010 if (augmentation_data_len)
4012 unsigned long i;
4013 printf (" Augmentation data: ");
4014 for (i = 0; i < augmentation_data_len; ++i)
4015 printf (" %02x", augmentation_data[i]);
4016 putchar ('\n');
4018 putchar ('\n');
4021 if (augmentation_data_len)
4023 unsigned char *p, *q;
4024 p = (unsigned char *) fc->augmentation + 1;
4025 q = augmentation_data;
4027 while (1)
4029 if (*p == 'L')
4030 q++;
4031 else if (*p == 'P')
4032 q += 1 + size_of_encoded_value (*q);
4033 else if (*p == 'R')
4034 fc->fde_encoding = *q++;
4035 else
4036 break;
4037 p++;
4040 if (fc->fde_encoding)
4041 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
4044 frame_need_space (fc, fc->ra);
4046 else
4048 unsigned char *look_for;
4049 static Frame_Chunk fde_fc;
4051 fc = & fde_fc;
4052 memset (fc, 0, sizeof (Frame_Chunk));
4054 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
4056 for (cie = chunks; cie ; cie = cie->next)
4057 if (cie->chunk_start == look_for)
4058 break;
4060 if (!cie)
4062 warn ("Invalid CIE pointer %#08lx in FDE at %#08lx\n",
4063 cie_id, (unsigned long)(saved_start - section_start));
4064 fc->ncols = 0;
4065 fc->col_type = (short int *) xmalloc (sizeof (short int));
4066 fc->col_offset = (int *) xmalloc (sizeof (int));
4067 frame_need_space (fc, max_regs - 1);
4068 cie = fc;
4069 fc->augmentation = "";
4070 fc->fde_encoding = 0;
4072 else
4074 fc->ncols = cie->ncols;
4075 fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
4076 fc->col_offset = (int *) xcmalloc (fc->ncols, sizeof (int));
4077 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
4078 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
4079 fc->augmentation = cie->augmentation;
4080 fc->code_factor = cie->code_factor;
4081 fc->data_factor = cie->data_factor;
4082 fc->cfa_reg = cie->cfa_reg;
4083 fc->cfa_offset = cie->cfa_offset;
4084 fc->ra = cie->ra;
4085 frame_need_space (fc, max_regs - 1);
4086 fc->fde_encoding = cie->fde_encoding;
4089 if (fc->fde_encoding)
4090 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
4092 fc->pc_begin = get_encoded_value (start, fc->fde_encoding);
4093 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
4094 fc->pc_begin += section->address + (start - section_start);
4095 start += encoded_ptr_size;
4096 fc->pc_range = byte_get (start, encoded_ptr_size);
4097 start += encoded_ptr_size;
4099 if (cie->augmentation[0] == 'z')
4101 augmentation_data_len = LEB ();
4102 augmentation_data = start;
4103 start += augmentation_data_len;
4106 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
4107 (unsigned long)(saved_start - section_start), length, cie_id,
4108 (unsigned long)(cie->chunk_start - section_start),
4109 fc->pc_begin, fc->pc_begin + fc->pc_range);
4110 if (! do_debug_frames_interp && augmentation_data_len)
4112 unsigned long i;
4114 printf (" Augmentation data: ");
4115 for (i = 0; i < augmentation_data_len; ++i)
4116 printf (" %02x", augmentation_data[i]);
4117 putchar ('\n');
4118 putchar ('\n');
4122 /* At this point, fc is the current chunk, cie (if any) is set, and
4123 we're about to interpret instructions for the chunk. */
4124 /* ??? At present we need to do this always, since this sizes the
4125 fc->col_type and fc->col_offset arrays, which we write into always.
4126 We should probably split the interpreted and non-interpreted bits
4127 into two different routines, since there's so much that doesn't
4128 really overlap between them. */
4129 if (1 || do_debug_frames_interp)
4131 /* Start by making a pass over the chunk, allocating storage
4132 and taking note of what registers are used. */
4133 unsigned char *tmp = start;
4135 while (start < block_end)
4137 unsigned op, opa;
4138 unsigned long reg, tmp;
4140 op = *start++;
4141 opa = op & 0x3f;
4142 if (op & 0xc0)
4143 op &= 0xc0;
4145 /* Warning: if you add any more cases to this switch, be
4146 sure to add them to the corresponding switch below. */
4147 switch (op)
4149 case DW_CFA_advance_loc:
4150 break;
4151 case DW_CFA_offset:
4152 LEB ();
4153 if (frame_need_space (fc, opa) >= 0)
4154 fc->col_type[opa] = DW_CFA_undefined;
4155 break;
4156 case DW_CFA_restore:
4157 if (frame_need_space (fc, opa) >= 0)
4158 fc->col_type[opa] = DW_CFA_undefined;
4159 break;
4160 case DW_CFA_set_loc:
4161 start += encoded_ptr_size;
4162 break;
4163 case DW_CFA_advance_loc1:
4164 start += 1;
4165 break;
4166 case DW_CFA_advance_loc2:
4167 start += 2;
4168 break;
4169 case DW_CFA_advance_loc4:
4170 start += 4;
4171 break;
4172 case DW_CFA_offset_extended:
4173 case DW_CFA_val_offset:
4174 reg = LEB (); LEB ();
4175 if (frame_need_space (fc, reg) >= 0)
4176 fc->col_type[reg] = DW_CFA_undefined;
4177 break;
4178 case DW_CFA_restore_extended:
4179 reg = LEB ();
4180 frame_need_space (fc, reg);
4181 if (frame_need_space (fc, reg) >= 0)
4182 fc->col_type[reg] = DW_CFA_undefined;
4183 break;
4184 case DW_CFA_undefined:
4185 reg = LEB ();
4186 if (frame_need_space (fc, reg) >= 0)
4187 fc->col_type[reg] = DW_CFA_undefined;
4188 break;
4189 case DW_CFA_same_value:
4190 reg = LEB ();
4191 if (frame_need_space (fc, reg) >= 0)
4192 fc->col_type[reg] = DW_CFA_undefined;
4193 break;
4194 case DW_CFA_register:
4195 reg = LEB (); LEB ();
4196 if (frame_need_space (fc, reg) >= 0)
4197 fc->col_type[reg] = DW_CFA_undefined;
4198 break;
4199 case DW_CFA_def_cfa:
4200 LEB (); LEB ();
4201 break;
4202 case DW_CFA_def_cfa_register:
4203 LEB ();
4204 break;
4205 case DW_CFA_def_cfa_offset:
4206 LEB ();
4207 break;
4208 case DW_CFA_def_cfa_expression:
4209 tmp = LEB ();
4210 start += tmp;
4211 break;
4212 case DW_CFA_expression:
4213 case DW_CFA_val_expression:
4214 reg = LEB ();
4215 tmp = LEB ();
4216 start += tmp;
4217 if (frame_need_space (fc, reg) >= 0)
4218 fc->col_type[reg] = DW_CFA_undefined;
4219 break;
4220 case DW_CFA_offset_extended_sf:
4221 case DW_CFA_val_offset_sf:
4222 reg = LEB (); SLEB ();
4223 if (frame_need_space (fc, reg) >= 0)
4224 fc->col_type[reg] = DW_CFA_undefined;
4225 break;
4226 case DW_CFA_def_cfa_sf:
4227 LEB (); SLEB ();
4228 break;
4229 case DW_CFA_def_cfa_offset_sf:
4230 SLEB ();
4231 break;
4232 case DW_CFA_MIPS_advance_loc8:
4233 start += 8;
4234 break;
4235 case DW_CFA_GNU_args_size:
4236 LEB ();
4237 break;
4238 case DW_CFA_GNU_negative_offset_extended:
4239 reg = LEB (); LEB ();
4240 if (frame_need_space (fc, reg) >= 0)
4241 fc->col_type[reg] = DW_CFA_undefined;
4242 break;
4243 default:
4244 break;
4247 start = tmp;
4250 /* Now we know what registers are used, make a second pass over
4251 the chunk, this time actually printing out the info. */
4253 while (start < block_end)
4255 unsigned op, opa;
4256 unsigned long ul, reg, roffs;
4257 long l, ofs;
4258 dwarf_vma vma;
4259 const char *reg_prefix = "";
4261 op = *start++;
4262 opa = op & 0x3f;
4263 if (op & 0xc0)
4264 op &= 0xc0;
4266 /* Warning: if you add any more cases to this switch, be
4267 sure to add them to the corresponding switch above. */
4268 switch (op)
4270 case DW_CFA_advance_loc:
4271 if (do_debug_frames_interp)
4272 frame_display_row (fc, &need_col_headers, &max_regs);
4273 else
4274 printf (" DW_CFA_advance_loc: %d to %08lx\n",
4275 opa * fc->code_factor,
4276 fc->pc_begin + opa * fc->code_factor);
4277 fc->pc_begin += opa * fc->code_factor;
4278 break;
4280 case DW_CFA_offset:
4281 roffs = LEB ();
4282 if (opa >= (unsigned int) fc->ncols)
4283 reg_prefix = bad_reg;
4284 if (! do_debug_frames_interp || *reg_prefix != '\0')
4285 printf (" DW_CFA_offset: %s%s at cfa%+ld\n",
4286 reg_prefix, regname (opa, 0),
4287 roffs * fc->data_factor);
4288 if (*reg_prefix == '\0')
4290 fc->col_type[opa] = DW_CFA_offset;
4291 fc->col_offset[opa] = roffs * fc->data_factor;
4293 break;
4295 case DW_CFA_restore:
4296 if (opa >= (unsigned int) cie->ncols
4297 || opa >= (unsigned int) fc->ncols)
4298 reg_prefix = bad_reg;
4299 if (! do_debug_frames_interp || *reg_prefix != '\0')
4300 printf (" DW_CFA_restore: %s%s\n",
4301 reg_prefix, regname (opa, 0));
4302 if (*reg_prefix == '\0')
4304 fc->col_type[opa] = cie->col_type[opa];
4305 fc->col_offset[opa] = cie->col_offset[opa];
4307 break;
4309 case DW_CFA_set_loc:
4310 vma = get_encoded_value (start, fc->fde_encoding);
4311 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
4312 vma += section->address + (start - section_start);
4313 start += encoded_ptr_size;
4314 if (do_debug_frames_interp)
4315 frame_display_row (fc, &need_col_headers, &max_regs);
4316 else
4317 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
4318 fc->pc_begin = vma;
4319 break;
4321 case DW_CFA_advance_loc1:
4322 ofs = byte_get (start, 1); start += 1;
4323 if (do_debug_frames_interp)
4324 frame_display_row (fc, &need_col_headers, &max_regs);
4325 else
4326 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
4327 ofs * fc->code_factor,
4328 fc->pc_begin + ofs * fc->code_factor);
4329 fc->pc_begin += ofs * fc->code_factor;
4330 break;
4332 case DW_CFA_advance_loc2:
4333 ofs = byte_get (start, 2); start += 2;
4334 if (do_debug_frames_interp)
4335 frame_display_row (fc, &need_col_headers, &max_regs);
4336 else
4337 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
4338 ofs * fc->code_factor,
4339 fc->pc_begin + ofs * fc->code_factor);
4340 fc->pc_begin += ofs * fc->code_factor;
4341 break;
4343 case DW_CFA_advance_loc4:
4344 ofs = byte_get (start, 4); start += 4;
4345 if (do_debug_frames_interp)
4346 frame_display_row (fc, &need_col_headers, &max_regs);
4347 else
4348 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
4349 ofs * fc->code_factor,
4350 fc->pc_begin + ofs * fc->code_factor);
4351 fc->pc_begin += ofs * fc->code_factor;
4352 break;
4354 case DW_CFA_offset_extended:
4355 reg = LEB ();
4356 roffs = LEB ();
4357 if (reg >= (unsigned int) fc->ncols)
4358 reg_prefix = bad_reg;
4359 if (! do_debug_frames_interp || *reg_prefix != '\0')
4360 printf (" DW_CFA_offset_extended: %s%s at cfa%+ld\n",
4361 reg_prefix, regname (reg, 0),
4362 roffs * fc->data_factor);
4363 if (*reg_prefix == '\0')
4365 fc->col_type[reg] = DW_CFA_offset;
4366 fc->col_offset[reg] = roffs * fc->data_factor;
4368 break;
4370 case DW_CFA_val_offset:
4371 reg = LEB ();
4372 roffs = LEB ();
4373 if (reg >= (unsigned int) fc->ncols)
4374 reg_prefix = bad_reg;
4375 if (! do_debug_frames_interp || *reg_prefix != '\0')
4376 printf (" DW_CFA_val_offset: %s%s at cfa%+ld\n",
4377 reg_prefix, regname (reg, 0),
4378 roffs * fc->data_factor);
4379 if (*reg_prefix == '\0')
4381 fc->col_type[reg] = DW_CFA_val_offset;
4382 fc->col_offset[reg] = roffs * fc->data_factor;
4384 break;
4386 case DW_CFA_restore_extended:
4387 reg = LEB ();
4388 if (reg >= (unsigned int) cie->ncols
4389 || reg >= (unsigned int) fc->ncols)
4390 reg_prefix = bad_reg;
4391 if (! do_debug_frames_interp || *reg_prefix != '\0')
4392 printf (" DW_CFA_restore_extended: %s%s\n",
4393 reg_prefix, regname (reg, 0));
4394 if (*reg_prefix == '\0')
4396 fc->col_type[reg] = cie->col_type[reg];
4397 fc->col_offset[reg] = cie->col_offset[reg];
4399 break;
4401 case DW_CFA_undefined:
4402 reg = LEB ();
4403 if (reg >= (unsigned int) fc->ncols)
4404 reg_prefix = bad_reg;
4405 if (! do_debug_frames_interp || *reg_prefix != '\0')
4406 printf (" DW_CFA_undefined: %s%s\n",
4407 reg_prefix, regname (reg, 0));
4408 if (*reg_prefix == '\0')
4410 fc->col_type[reg] = DW_CFA_undefined;
4411 fc->col_offset[reg] = 0;
4413 break;
4415 case DW_CFA_same_value:
4416 reg = LEB ();
4417 if (reg >= (unsigned int) fc->ncols)
4418 reg_prefix = bad_reg;
4419 if (! do_debug_frames_interp || *reg_prefix != '\0')
4420 printf (" DW_CFA_same_value: %s%s\n",
4421 reg_prefix, regname (reg, 0));
4422 if (*reg_prefix == '\0')
4424 fc->col_type[reg] = DW_CFA_same_value;
4425 fc->col_offset[reg] = 0;
4427 break;
4429 case DW_CFA_register:
4430 reg = LEB ();
4431 roffs = LEB ();
4432 if (reg >= (unsigned int) fc->ncols)
4433 reg_prefix = bad_reg;
4434 if (! do_debug_frames_interp || *reg_prefix != '\0')
4436 printf (" DW_CFA_register: %s%s in ",
4437 reg_prefix, regname (reg, 0));
4438 puts (regname (roffs, 0));
4440 if (*reg_prefix == '\0')
4442 fc->col_type[reg] = DW_CFA_register;
4443 fc->col_offset[reg] = roffs;
4445 break;
4447 case DW_CFA_remember_state:
4448 if (! do_debug_frames_interp)
4449 printf (" DW_CFA_remember_state\n");
4450 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
4451 rs->ncols = fc->ncols;
4452 rs->col_type = (short int *) xcmalloc (rs->ncols,
4453 sizeof (short int));
4454 rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (int));
4455 memcpy (rs->col_type, fc->col_type, rs->ncols);
4456 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
4457 rs->next = remembered_state;
4458 remembered_state = rs;
4459 break;
4461 case DW_CFA_restore_state:
4462 if (! do_debug_frames_interp)
4463 printf (" DW_CFA_restore_state\n");
4464 rs = remembered_state;
4465 if (rs)
4467 remembered_state = rs->next;
4468 frame_need_space (fc, rs->ncols - 1);
4469 memcpy (fc->col_type, rs->col_type, rs->ncols);
4470 memcpy (fc->col_offset, rs->col_offset,
4471 rs->ncols * sizeof (int));
4472 free (rs->col_type);
4473 free (rs->col_offset);
4474 free (rs);
4476 else if (do_debug_frames_interp)
4477 printf ("Mismatched DW_CFA_restore_state\n");
4478 break;
4480 case DW_CFA_def_cfa:
4481 fc->cfa_reg = LEB ();
4482 fc->cfa_offset = LEB ();
4483 fc->cfa_exp = 0;
4484 if (! do_debug_frames_interp)
4485 printf (" DW_CFA_def_cfa: %s ofs %d\n",
4486 regname (fc->cfa_reg, 0), fc->cfa_offset);
4487 break;
4489 case DW_CFA_def_cfa_register:
4490 fc->cfa_reg = LEB ();
4491 fc->cfa_exp = 0;
4492 if (! do_debug_frames_interp)
4493 printf (" DW_CFA_def_cfa_register: %s\n",
4494 regname (fc->cfa_reg, 0));
4495 break;
4497 case DW_CFA_def_cfa_offset:
4498 fc->cfa_offset = LEB ();
4499 if (! do_debug_frames_interp)
4500 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
4501 break;
4503 case DW_CFA_nop:
4504 if (! do_debug_frames_interp)
4505 printf (" DW_CFA_nop\n");
4506 break;
4508 case DW_CFA_def_cfa_expression:
4509 ul = LEB ();
4510 if (! do_debug_frames_interp)
4512 printf (" DW_CFA_def_cfa_expression (");
4513 decode_location_expression (start, eh_addr_size, ul, 0,
4514 section);
4515 printf (")\n");
4517 fc->cfa_exp = 1;
4518 start += ul;
4519 break;
4521 case DW_CFA_expression:
4522 reg = LEB ();
4523 ul = LEB ();
4524 if (reg >= (unsigned int) fc->ncols)
4525 reg_prefix = bad_reg;
4526 if (! do_debug_frames_interp || *reg_prefix != '\0')
4528 printf (" DW_CFA_expression: %s%s (",
4529 reg_prefix, regname (reg, 0));
4530 decode_location_expression (start, eh_addr_size,
4531 ul, 0, section);
4532 printf (")\n");
4534 if (*reg_prefix == '\0')
4535 fc->col_type[reg] = DW_CFA_expression;
4536 start += ul;
4537 break;
4539 case DW_CFA_val_expression:
4540 reg = LEB ();
4541 ul = LEB ();
4542 if (reg >= (unsigned int) fc->ncols)
4543 reg_prefix = bad_reg;
4544 if (! do_debug_frames_interp || *reg_prefix != '\0')
4546 printf (" DW_CFA_val_expression: %s%s (",
4547 reg_prefix, regname (reg, 0));
4548 decode_location_expression (start, eh_addr_size, ul, 0,
4549 section);
4550 printf (")\n");
4552 if (*reg_prefix == '\0')
4553 fc->col_type[reg] = DW_CFA_val_expression;
4554 start += ul;
4555 break;
4557 case DW_CFA_offset_extended_sf:
4558 reg = LEB ();
4559 l = SLEB ();
4560 if (frame_need_space (fc, reg) < 0)
4561 reg_prefix = bad_reg;
4562 if (! do_debug_frames_interp || *reg_prefix != '\0')
4563 printf (" DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
4564 reg_prefix, regname (reg, 0),
4565 l * fc->data_factor);
4566 if (*reg_prefix == '\0')
4568 fc->col_type[reg] = DW_CFA_offset;
4569 fc->col_offset[reg] = l * fc->data_factor;
4571 break;
4573 case DW_CFA_val_offset_sf:
4574 reg = LEB ();
4575 l = SLEB ();
4576 if (frame_need_space (fc, reg) < 0)
4577 reg_prefix = bad_reg;
4578 if (! do_debug_frames_interp || *reg_prefix != '\0')
4579 printf (" DW_CFA_val_offset_sf: %s%s at cfa%+ld\n",
4580 reg_prefix, regname (reg, 0),
4581 l * fc->data_factor);
4582 if (*reg_prefix == '\0')
4584 fc->col_type[reg] = DW_CFA_val_offset;
4585 fc->col_offset[reg] = l * fc->data_factor;
4587 break;
4589 case DW_CFA_def_cfa_sf:
4590 fc->cfa_reg = LEB ();
4591 fc->cfa_offset = SLEB ();
4592 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
4593 fc->cfa_exp = 0;
4594 if (! do_debug_frames_interp)
4595 printf (" DW_CFA_def_cfa_sf: %s ofs %d\n",
4596 regname (fc->cfa_reg, 0), fc->cfa_offset);
4597 break;
4599 case DW_CFA_def_cfa_offset_sf:
4600 fc->cfa_offset = SLEB ();
4601 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
4602 if (! do_debug_frames_interp)
4603 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
4604 break;
4606 case DW_CFA_MIPS_advance_loc8:
4607 ofs = byte_get (start, 8); start += 8;
4608 if (do_debug_frames_interp)
4609 frame_display_row (fc, &need_col_headers, &max_regs);
4610 else
4611 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
4612 ofs * fc->code_factor,
4613 fc->pc_begin + ofs * fc->code_factor);
4614 fc->pc_begin += ofs * fc->code_factor;
4615 break;
4617 case DW_CFA_GNU_window_save:
4618 if (! do_debug_frames_interp)
4619 printf (" DW_CFA_GNU_window_save\n");
4620 break;
4622 case DW_CFA_GNU_args_size:
4623 ul = LEB ();
4624 if (! do_debug_frames_interp)
4625 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
4626 break;
4628 case DW_CFA_GNU_negative_offset_extended:
4629 reg = LEB ();
4630 l = - LEB ();
4631 if (frame_need_space (fc, reg) < 0)
4632 reg_prefix = bad_reg;
4633 if (! do_debug_frames_interp || *reg_prefix != '\0')
4634 printf (" DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
4635 reg_prefix, regname (reg, 0),
4636 l * fc->data_factor);
4637 if (*reg_prefix == '\0')
4639 fc->col_type[reg] = DW_CFA_offset;
4640 fc->col_offset[reg] = l * fc->data_factor;
4642 break;
4644 default:
4645 if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
4646 printf (_(" DW_CFA_??? (User defined call frame op: %#x)\n"), op);
4647 else
4648 warn (_("unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
4649 start = block_end;
4653 if (do_debug_frames_interp)
4654 frame_display_row (fc, &need_col_headers, &max_regs);
4656 start = block_end;
4659 printf ("\n");
4661 return 1;
4664 #undef GET
4665 #undef LEB
4666 #undef SLEB
4668 static int
4669 display_debug_not_supported (struct dwarf_section *section,
4670 void *file ATTRIBUTE_UNUSED)
4672 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
4673 section->name);
4675 return 1;
4678 void *
4679 cmalloc (size_t nmemb, size_t size)
4681 /* Check for overflow. */
4682 if (nmemb >= ~(size_t) 0 / size)
4683 return NULL;
4684 else
4685 return malloc (nmemb * size);
4688 void *
4689 xcmalloc (size_t nmemb, size_t size)
4691 /* Check for overflow. */
4692 if (nmemb >= ~(size_t) 0 / size)
4693 return NULL;
4694 else
4695 return xmalloc (nmemb * size);
4698 void *
4699 xcrealloc (void *ptr, size_t nmemb, size_t size)
4701 /* Check for overflow. */
4702 if (nmemb >= ~(size_t) 0 / size)
4703 return NULL;
4704 else
4705 return xrealloc (ptr, nmemb * size);
4708 void
4709 error (const char *message, ...)
4711 va_list args;
4713 va_start (args, message);
4714 fprintf (stderr, _("%s: Error: "), program_name);
4715 vfprintf (stderr, message, args);
4716 va_end (args);
4719 void
4720 warn (const char *message, ...)
4722 va_list args;
4724 va_start (args, message);
4725 fprintf (stderr, _("%s: Warning: "), program_name);
4726 vfprintf (stderr, message, args);
4727 va_end (args);
4730 void
4731 free_debug_memory (void)
4733 unsigned int i;
4735 free_abbrevs ();
4737 for (i = 0; i < max; i++)
4738 free_debug_section ((enum dwarf_section_display_enum) i);
4740 if (debug_information != NULL)
4742 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
4744 for (i = 0; i < num_debug_info_entries; i++)
4746 if (!debug_information [i].max_loc_offsets)
4748 free (debug_information [i].loc_offsets);
4749 free (debug_information [i].have_frame_base);
4751 if (!debug_information [i].max_range_lists)
4752 free (debug_information [i].range_lists);
4756 free (debug_information);
4757 debug_information = NULL;
4758 num_debug_info_entries = 0;
4762 void
4763 dwarf_select_sections_by_names (const char *names)
4765 typedef struct
4767 const char * option;
4768 int * variable;
4769 int val;
4771 debug_dump_long_opts;
4773 static const debug_dump_long_opts opts_table [] =
4775 /* Please keep this table alpha- sorted. */
4776 { "Ranges", & do_debug_ranges, 1 },
4777 { "abbrev", & do_debug_abbrevs, 1 },
4778 { "aranges", & do_debug_aranges, 1 },
4779 { "frames", & do_debug_frames, 1 },
4780 { "frames-interp", & do_debug_frames_interp, 1 },
4781 { "info", & do_debug_info, 1 },
4782 { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility. */
4783 { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
4784 { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
4785 { "loc", & do_debug_loc, 1 },
4786 { "macro", & do_debug_macinfo, 1 },
4787 { "pubnames", & do_debug_pubnames, 1 },
4788 /* This entry is for compatability
4789 with earlier versions of readelf. */
4790 { "ranges", & do_debug_aranges, 1 },
4791 { "str", & do_debug_str, 1 },
4792 { NULL, NULL, 0 }
4795 const char *p;
4797 p = names;
4798 while (*p)
4800 const debug_dump_long_opts * entry;
4802 for (entry = opts_table; entry->option; entry++)
4804 size_t len = strlen (entry->option);
4806 if (strncmp (p, entry->option, len) == 0
4807 && (p[len] == ',' || p[len] == '\0'))
4809 * entry->variable |= entry->val;
4811 /* The --debug-dump=frames-interp option also
4812 enables the --debug-dump=frames option. */
4813 if (do_debug_frames_interp)
4814 do_debug_frames = 1;
4816 p += len;
4817 break;
4821 if (entry->option == NULL)
4823 warn (_("Unrecognized debug option '%s'\n"), p);
4824 p = strchr (p, ',');
4825 if (p == NULL)
4826 break;
4829 if (*p == ',')
4830 p++;
4834 void
4835 dwarf_select_sections_by_letters (const char *letters)
4837 unsigned int index = 0;
4839 while (letters[index])
4840 switch (letters[index++])
4842 case 'i':
4843 do_debug_info = 1;
4844 break;
4846 case 'a':
4847 do_debug_abbrevs = 1;
4848 break;
4850 case 'l':
4851 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
4852 break;
4854 case 'L':
4855 do_debug_lines |= FLAG_DEBUG_LINES_DECODED;
4856 break;
4858 case 'p':
4859 do_debug_pubnames = 1;
4860 break;
4862 case 'r':
4863 do_debug_aranges = 1;
4864 break;
4866 case 'R':
4867 do_debug_ranges = 1;
4868 break;
4870 case 'F':
4871 do_debug_frames_interp = 1;
4872 case 'f':
4873 do_debug_frames = 1;
4874 break;
4876 case 'm':
4877 do_debug_macinfo = 1;
4878 break;
4880 case 's':
4881 do_debug_str = 1;
4882 break;
4884 case 'o':
4885 do_debug_loc = 1;
4886 break;
4888 default:
4889 warn (_("Unrecognized debug option '%s'\n"), optarg);
4890 break;
4894 void
4895 dwarf_select_sections_all (void)
4897 do_debug_info = 1;
4898 do_debug_abbrevs = 1;
4899 do_debug_lines = FLAG_DEBUG_LINES_RAW;
4900 do_debug_pubnames = 1;
4901 do_debug_aranges = 1;
4902 do_debug_ranges = 1;
4903 do_debug_frames = 1;
4904 do_debug_macinfo = 1;
4905 do_debug_str = 1;
4906 do_debug_loc = 1;
4909 struct dwarf_section_display debug_displays[] =
4911 { { ".debug_abbrev", ".zdebug_abbrev", NULL, NULL, 0, 0 },
4912 display_debug_abbrev, &do_debug_abbrevs, 0 },
4913 { { ".debug_aranges", ".zdebug_aranges", NULL, NULL, 0, 0 },
4914 display_debug_aranges, &do_debug_aranges, 1 },
4915 { { ".debug_frame", ".zdebug_frame", NULL, NULL, 0, 0 },
4916 display_debug_frames, &do_debug_frames, 1 },
4917 { { ".debug_info", ".zdebug_info", NULL, NULL, 0, 0 },
4918 display_debug_info, &do_debug_info, 1 },
4919 { { ".debug_line", ".zdebug_line", NULL, NULL, 0, 0 },
4920 display_debug_lines, &do_debug_lines, 1 },
4921 { { ".debug_pubnames", ".zdebug_pubnames", NULL, NULL, 0, 0 },
4922 display_debug_pubnames, &do_debug_pubnames, 0 },
4923 { { ".eh_frame", "", NULL, NULL, 0, 0 },
4924 display_debug_frames, &do_debug_frames, 1 },
4925 { { ".debug_macinfo", ".zdebug_macinfo", NULL, NULL, 0, 0 },
4926 display_debug_macinfo, &do_debug_macinfo, 0 },
4927 { { ".debug_str", ".zdebug_str", NULL, NULL, 0, 0 },
4928 display_debug_str, &do_debug_str, 0 },
4929 { { ".debug_loc", ".zdebug_loc", NULL, NULL, 0, 0 },
4930 display_debug_loc, &do_debug_loc, 1 },
4931 { { ".debug_pubtypes", ".zdebug_pubtypes", NULL, NULL, 0, 0 },
4932 display_debug_pubnames, &do_debug_pubnames, 0 },
4933 { { ".debug_ranges", ".zdebug_ranges", NULL, NULL, 0, 0 },
4934 display_debug_ranges, &do_debug_ranges, 1 },
4935 { { ".debug_static_func", ".zdebug_static_func", NULL, NULL, 0, 0 },
4936 display_debug_not_supported, NULL, 0 },
4937 { { ".debug_static_vars", ".zdebug_static_vars", NULL, NULL, 0, 0 },
4938 display_debug_not_supported, NULL, 0 },
4939 { { ".debug_types", ".zdebug_types", NULL, NULL, 0, 0 },
4940 display_debug_not_supported, NULL, 0 },
4941 { { ".debug_weaknames", ".zdebug_weaknames", NULL, NULL, 0, 0 },
4942 display_debug_not_supported, NULL, 0 }