1 /* dwarf.c -- display DWARF contents of a BFD binary file
2 Copyright (C) 2005-2015 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22 #include "libiberty.h"
24 #include "bfd_stdint.h"
27 #include "elf/common.h"
30 #include "gdb/gdb-index.h"
32 static const char *regname (unsigned int regno, int row);
34 static int have_frame_base;
35 static int need_base_address;
37 static unsigned int last_pointer_size = 0;
38 static int warned_about_missing_comp_units = FALSE;
40 static unsigned int num_debug_info_entries = 0;
41 static unsigned int alloc_num_debug_info_entries = 0;
42 static debug_info *debug_information = NULL;
43 /* Special value for num_debug_info_entries to indicate
44 that the .debug_info section could not be loaded/parsed. */
45 #define DEBUG_INFO_UNAVAILABLE (unsigned int) -1
52 int do_debug_pubnames;
53 int do_debug_pubtypes;
57 int do_debug_frames_interp;
66 int do_debug_cu_index;
69 int dwarf_cutoff_level = -1;
70 unsigned long dwarf_start_die;
74 /* Collection of CU/TU section sets from .debug_cu_index and .debug_tu_index
75 sections. For version 1 package files, each set is stored in SHNDX_POOL
76 as a zero-terminated list of section indexes comprising one set of debug
77 sections from a .dwo file. */
79 static int cu_tu_indexes_read = 0;
80 static unsigned int *shndx_pool = NULL;
81 static unsigned int shndx_pool_size = 0;
82 static unsigned int shndx_pool_used = 0;
84 /* For version 2 package files, each set contains an array of section offsets
85 and an array of section sizes, giving the offset and size of the
86 contribution from a CU or TU within one of the debug sections.
87 When displaying debug info from a package file, we need to use these
88 tables to locate the corresponding contributions to each section. */
93 dwarf_vma section_offsets[DW_SECT_MAX];
94 size_t section_sizes[DW_SECT_MAX];
97 static int cu_count = 0;
98 static int tu_count = 0;
99 static struct cu_tu_set *cu_sets = NULL;
100 static struct cu_tu_set *tu_sets = NULL;
102 static void load_cu_tu_indexes (void *file);
104 /* Values for do_debug_lines. */
105 #define FLAG_DEBUG_LINES_RAW 1
106 #define FLAG_DEBUG_LINES_DECODED 2
109 size_of_encoded_value (int encoding)
111 switch (encoding & 0x7)
114 case 0: return eh_addr_size;
122 get_encoded_value (unsigned char **pdata,
124 struct dwarf_section *section,
127 unsigned char * data = * pdata;
128 unsigned int size = size_of_encoded_value (encoding);
131 if (data + size >= end)
133 warn (_("Encoded value extends past end of section\n"));
138 /* PR 17512: file: 002-829853-0.004. */
141 warn (_("Encoded size of %d is too large to read\n"), size);
146 /* PR 17512: file: 1085-5603-0.004. */
149 warn (_("Encoded size of 0 is too small to read\n"));
154 if (encoding & DW_EH_PE_signed)
155 val = byte_get_signed (data, size);
157 val = byte_get (data, size);
159 if ((encoding & 0x70) == DW_EH_PE_pcrel)
160 val += section->address + (data - section->start);
162 * pdata = data + size;
166 #if defined HAVE_LONG_LONG && SIZEOF_LONG_LONG > SIZEOF_LONG
168 # define DWARF_VMA_FMT "ll"
169 # define DWARF_VMA_FMT_LONG "%16.16llx"
171 # define DWARF_VMA_FMT "I64"
172 # define DWARF_VMA_FMT_LONG "%016I64x"
175 # define DWARF_VMA_FMT "l"
176 # define DWARF_VMA_FMT_LONG "%16.16lx"
179 /* Convert a dwarf vma value into a string. Returns a pointer to a static
180 buffer containing the converted VALUE. The value is converted according
181 to the printf formating character FMTCH. If NUM_BYTES is non-zero then
182 it specifies the maximum number of bytes to be displayed in the converted
183 value and FMTCH is ignored - hex is always used. */
186 dwarf_vmatoa_1 (const char *fmtch, dwarf_vma value, unsigned num_bytes)
188 /* As dwarf_vmatoa is used more then once in a printf call
189 for output, we are cycling through an fixed array of pointers
190 for return address. */
191 static int buf_pos = 0;
192 static struct dwarf_vmatoa_buf
198 ret = buf[buf_pos++].place;
199 buf_pos %= ARRAY_SIZE (buf);
203 /* Printf does not have a way of specifiying a maximum field width for an
204 integer value, so we print the full value into a buffer and then select
205 the precision we need. */
206 snprintf (ret, sizeof (buf[0].place), DWARF_VMA_FMT_LONG, value);
209 return ret + (16 - 2 * num_bytes);
215 sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch);
216 snprintf (ret, sizeof (buf[0].place), fmt, value);
221 static inline const char *
222 dwarf_vmatoa (const char * fmtch, dwarf_vma value)
224 return dwarf_vmatoa_1 (fmtch, value, 0);
227 /* Print a dwarf_vma value (typically an address, offset or length) in
228 hexadecimal format, followed by a space. The length of the VALUE (and
229 hence the precision displayed) is determined by the NUM_BYTES parameter. */
232 print_dwarf_vma (dwarf_vma value, unsigned num_bytes)
234 printf ("%s ", dwarf_vmatoa_1 (NULL, value, num_bytes));
237 /* Format a 64-bit value, given as two 32-bit values, in hex.
238 For reentrancy, this uses a buffer provided by the caller. */
241 dwarf_vmatoa64 (dwarf_vma hvalue, dwarf_vma lvalue, char *buf,
242 unsigned int buf_len)
247 snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", lvalue);
250 len = snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", hvalue);
251 snprintf (buf + len, buf_len - len,
252 "%08" DWARF_VMA_FMT "x", lvalue);
258 /* Read in a LEB128 encoded value starting at address DATA.
259 If SIGN is true, return a signed LEB128 value.
260 If LENGTH_RETURN is not NULL, return in it the number of bytes read.
261 No bytes will be read at address END or beyond. */
264 read_leb128 (unsigned char *data,
265 unsigned int *length_return,
267 const unsigned char * const end)
269 dwarf_vma result = 0;
270 unsigned int num_read = 0;
271 unsigned int shift = 0;
272 unsigned char byte = 0;
279 result |= ((dwarf_vma) (byte & 0x7f)) << shift;
282 if ((byte & 0x80) == 0)
286 if (length_return != NULL)
287 *length_return = num_read;
289 if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
290 result |= (dwarf_vma) -1 << shift;
295 /* Create a signed version to avoid painful typecasts. */
296 static inline dwarf_signed_vma
297 read_sleb128 (unsigned char * data,
298 unsigned int * length_return,
299 const unsigned char * const end)
301 return (dwarf_signed_vma) read_leb128 (data, length_return, TRUE, end);
304 static inline dwarf_vma
305 read_uleb128 (unsigned char * data,
306 unsigned int * length_return,
307 const unsigned char * const end)
309 return read_leb128 (data, length_return, FALSE, end);
312 #define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END) \
315 int dummy [sizeof (VAL) < (AMOUNT) ? -1 : 1] ATTRIBUTE_UNUSED ; \
316 unsigned int amount = (AMOUNT); \
317 if (((PTR) + amount) >= (END)) \
320 amount = (END) - (PTR); \
324 if (amount == 0 || amount > 8) \
327 VAL = byte_get ((PTR), amount); \
331 #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
334 SAFE_BYTE_GET (VAL, PTR, AMOUNT, END); \
339 #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END) \
342 unsigned int amount = (AMOUNT); \
343 if (((PTR) + amount) >= (END)) \
346 amount = (END) - (PTR); \
351 VAL = byte_get_signed ((PTR), amount); \
357 #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
360 SAFE_SIGNED_BYTE_GET (VAL, PTR, AMOUNT, END); \
365 #define SAFE_BYTE_GET64(PTR, HIGH, LOW, END) \
368 if (((PTR) + 8) <= (END)) \
370 byte_get_64 ((PTR), (HIGH), (LOW)); \
374 * (LOW) = * (HIGH) = 0; \
379 typedef struct State_Machine_Registers
387 unsigned char op_index;
388 unsigned char end_sequence;
389 /* This variable hold the number of the last entry seen
390 in the File Table. */
391 unsigned int last_file_entry;
394 static SMR state_machine_regs;
397 reset_state_machine (int is_stmt)
399 state_machine_regs.address = 0;
400 state_machine_regs.op_index = 0;
401 state_machine_regs.file = 1;
402 state_machine_regs.line = 1;
403 state_machine_regs.column = 0;
404 state_machine_regs.is_stmt = is_stmt;
405 state_machine_regs.basic_block = 0;
406 state_machine_regs.end_sequence = 0;
407 state_machine_regs.last_file_entry = 0;
410 /* Handled an extend line op.
411 Returns the number of bytes read. */
414 process_extended_line_op (unsigned char * data,
418 unsigned char op_code;
419 unsigned int bytes_read;
422 unsigned char *orig_data = data;
425 len = read_uleb128 (data, & bytes_read, end);
428 if (len == 0 || data == end || len > (uintptr_t) (end - data))
430 warn (_("Badly formed extended line op encountered!\n"));
437 printf (_(" Extended opcode %d: "), op_code);
441 case DW_LNE_end_sequence:
442 printf (_("End of Sequence\n\n"));
443 reset_state_machine (is_stmt);
446 case DW_LNE_set_address:
447 /* PR 17512: file: 002-100480-0.004. */
448 if (len - bytes_read - 1 > 8)
449 warn (_("Length (%d) of DW_LNE_set_address op is too long\n"),
450 len - bytes_read - 1);
451 SAFE_BYTE_GET (adr, data, len - bytes_read - 1, end);
452 printf (_("set Address to 0x%s\n"), dwarf_vmatoa ("x", adr));
453 state_machine_regs.address = adr;
454 state_machine_regs.op_index = 0;
457 case DW_LNE_define_file:
458 printf (_("define new File Table entry\n"));
459 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
460 printf (" %d\t", ++state_machine_regs.last_file_entry);
463 data += strnlen ((char *) data, end - data) + 1;
464 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
466 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
468 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
470 printf ("%s\n\n", name);
472 if (((unsigned int) (data - orig_data) != len) || data == end)
473 warn (_("DW_LNE_define_file: Bad opcode length\n"));
476 case DW_LNE_set_discriminator:
477 printf (_("set Discriminator to %s\n"),
478 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
482 case DW_LNE_HP_negate_is_UV_update:
483 printf ("DW_LNE_HP_negate_is_UV_update\n");
485 case DW_LNE_HP_push_context:
486 printf ("DW_LNE_HP_push_context\n");
488 case DW_LNE_HP_pop_context:
489 printf ("DW_LNE_HP_pop_context\n");
491 case DW_LNE_HP_set_file_line_column:
492 printf ("DW_LNE_HP_set_file_line_column\n");
494 case DW_LNE_HP_set_routine_name:
495 printf ("DW_LNE_HP_set_routine_name\n");
497 case DW_LNE_HP_set_sequence:
498 printf ("DW_LNE_HP_set_sequence\n");
500 case DW_LNE_HP_negate_post_semantics:
501 printf ("DW_LNE_HP_negate_post_semantics\n");
503 case DW_LNE_HP_negate_function_exit:
504 printf ("DW_LNE_HP_negate_function_exit\n");
506 case DW_LNE_HP_negate_front_end_logical:
507 printf ("DW_LNE_HP_negate_front_end_logical\n");
509 case DW_LNE_HP_define_proc:
510 printf ("DW_LNE_HP_define_proc\n");
512 case DW_LNE_HP_source_file_correlation:
514 unsigned char *edata = data + len - bytes_read - 1;
516 printf ("DW_LNE_HP_source_file_correlation\n");
522 opc = read_uleb128 (data, & bytes_read, edata);
527 case DW_LNE_HP_SFC_formfeed:
528 printf (" DW_LNE_HP_SFC_formfeed\n");
530 case DW_LNE_HP_SFC_set_listing_line:
531 printf (" DW_LNE_HP_SFC_set_listing_line (%s)\n",
533 read_uleb128 (data, & bytes_read, edata)));
536 case DW_LNE_HP_SFC_associate:
537 printf (" DW_LNE_HP_SFC_associate ");
540 read_uleb128 (data, & bytes_read, edata)));
544 read_uleb128 (data, & bytes_read, edata)));
548 read_uleb128 (data, & bytes_read, edata)));
552 printf (_(" UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc);
562 unsigned int rlen = len - bytes_read - 1;
564 if (op_code >= DW_LNE_lo_user
565 /* The test against DW_LNW_hi_user is redundant due to
566 the limited range of the unsigned char data type used
568 /*&& op_code <= DW_LNE_hi_user*/)
569 printf (_("user defined: "));
571 printf (_("UNKNOWN: "));
572 printf (_("length %d ["), rlen);
574 printf (" %02x", *data++);
583 static const unsigned char *
584 fetch_indirect_string (dwarf_vma offset)
586 struct dwarf_section *section = &debug_displays [str].section;
588 if (section->start == NULL)
589 return (const unsigned char *) _("<no .debug_str section>");
591 if (offset > section->size)
593 warn (_("DW_FORM_strp offset too big: %s\n"),
594 dwarf_vmatoa ("x", offset));
595 return (const unsigned char *) _("<offset is too big>");
598 return (const unsigned char *) section->start + offset;
602 fetch_indexed_string (dwarf_vma idx, struct cu_tu_set *this_set,
603 dwarf_vma offset_size, int dwo)
605 enum dwarf_section_display_enum str_sec_idx = dwo ? str_dwo : str;
606 enum dwarf_section_display_enum idx_sec_idx = dwo ? str_index_dwo : str_index;
607 struct dwarf_section *index_section = &debug_displays [idx_sec_idx].section;
608 struct dwarf_section *str_section = &debug_displays [str_sec_idx].section;
609 dwarf_vma index_offset = idx * offset_size;
610 dwarf_vma str_offset;
612 if (index_section->start == NULL)
613 return (dwo ? _("<no .debug_str_offsets.dwo section>")
614 : _("<no .debug_str_offsets section>"));
616 if (this_set != NULL)
617 index_offset += this_set->section_offsets [DW_SECT_STR_OFFSETS];
618 if (index_offset > index_section->size)
620 warn (_("DW_FORM_GNU_str_index offset too big: %s\n"),
621 dwarf_vmatoa ("x", index_offset));
622 return _("<index offset is too big>");
625 if (str_section->start == NULL)
626 return (dwo ? _("<no .debug_str.dwo section>")
627 : _("<no .debug_str section>"));
629 str_offset = byte_get (index_section->start + index_offset, offset_size);
630 str_offset -= str_section->address;
631 if (str_offset > str_section->size)
633 warn (_("DW_FORM_GNU_str_index indirect offset too big: %s\n"),
634 dwarf_vmatoa ("x", str_offset));
635 return _("<indirect index offset is too big>");
638 return (const char *) str_section->start + str_offset;
642 fetch_indexed_value (dwarf_vma offset, dwarf_vma bytes)
644 struct dwarf_section *section = &debug_displays [debug_addr].section;
646 if (section->start == NULL)
647 return (_("<no .debug_addr section>"));
649 if (offset + bytes > section->size)
651 warn (_("Offset into section %s too big: %s\n"),
652 section->name, dwarf_vmatoa ("x", offset));
653 return "<offset too big>";
656 return dwarf_vmatoa ("x", byte_get (section->start + offset, bytes));
660 /* FIXME: There are better and more efficient ways to handle
661 these structures. For now though, I just want something that
662 is simple to implement. */
663 typedef struct abbrev_attr
665 unsigned long attribute;
667 struct abbrev_attr *next;
671 typedef struct abbrev_entry
676 struct abbrev_attr *first_attr;
677 struct abbrev_attr *last_attr;
678 struct abbrev_entry *next;
682 static abbrev_entry *first_abbrev = NULL;
683 static abbrev_entry *last_abbrev = NULL;
690 for (abbrv = first_abbrev; abbrv;)
692 abbrev_entry *next_abbrev = abbrv->next;
695 for (attr = abbrv->first_attr; attr;)
697 abbrev_attr *next_attr = attr->next;
707 last_abbrev = first_abbrev = NULL;
711 add_abbrev (unsigned long number, unsigned long tag, int children)
715 entry = (abbrev_entry *) malloc (sizeof (*entry));
720 entry->entry = number;
722 entry->children = children;
723 entry->first_attr = NULL;
724 entry->last_attr = NULL;
727 if (first_abbrev == NULL)
728 first_abbrev = entry;
730 last_abbrev->next = entry;
736 add_abbrev_attr (unsigned long attribute, unsigned long form)
740 attr = (abbrev_attr *) malloc (sizeof (*attr));
745 attr->attribute = attribute;
749 if (last_abbrev->first_attr == NULL)
750 last_abbrev->first_attr = attr;
752 last_abbrev->last_attr->next = attr;
754 last_abbrev->last_attr = attr;
757 /* Processes the (partial) contents of a .debug_abbrev section.
758 Returns NULL if the end of the section was encountered.
759 Returns the address after the last byte read if the end of
760 an abbreviation set was found. */
762 static unsigned char *
763 process_abbrev_section (unsigned char *start, unsigned char *end)
765 if (first_abbrev != NULL)
770 unsigned int bytes_read;
773 unsigned long attribute;
776 entry = read_uleb128 (start, & bytes_read, end);
779 /* A single zero is supposed to end the section according
780 to the standard. If there's more, then signal that to
787 tag = read_uleb128 (start, & bytes_read, end);
794 add_abbrev (entry, tag, children);
800 attribute = read_uleb128 (start, & bytes_read, end);
805 form = read_uleb128 (start, & bytes_read, end);
810 add_abbrev_attr (attribute, form);
812 while (attribute != 0);
815 /* Report the missing single zero which ends the section. */
816 error (_(".debug_abbrev section not zero terminated\n"));
822 get_TAG_name (unsigned long tag)
824 const char *name = get_DW_TAG_name ((unsigned int)tag);
828 static char buffer[100];
830 snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag);
838 get_FORM_name (unsigned long form)
843 return "DW_FORM value: 0";
845 name = get_DW_FORM_name (form);
848 static char buffer[100];
850 snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
857 static unsigned char *
858 display_block (unsigned char *data,
860 const unsigned char * const end)
864 printf (_(" %s byte block: "), dwarf_vmatoa ("u", length));
866 return (unsigned char *) end;
868 maxlen = (dwarf_vma) (end - data);
869 length = length > maxlen ? maxlen : length;
872 printf ("%lx ", (unsigned long) byte_get (data++, 1));
878 decode_location_expression (unsigned char * data,
879 unsigned int pointer_size,
880 unsigned int offset_size,
884 struct dwarf_section * section)
887 unsigned int bytes_read;
889 dwarf_signed_vma svalue;
890 unsigned char *end = data + length;
891 int need_frame_base = 0;
900 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
901 printf ("DW_OP_addr: %s", dwarf_vmatoa ("x", uvalue));
904 printf ("DW_OP_deref");
907 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
908 printf ("DW_OP_const1u: %lu", (unsigned long) uvalue);
911 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 1, end);
912 printf ("DW_OP_const1s: %ld", (long) svalue);
915 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
916 printf ("DW_OP_const2u: %lu", (unsigned long) uvalue);
919 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
920 printf ("DW_OP_const2s: %ld", (long) svalue);
923 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
924 printf ("DW_OP_const4u: %lu", (unsigned long) uvalue);
927 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
928 printf ("DW_OP_const4s: %ld", (long) svalue);
931 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
932 printf ("DW_OP_const8u: %lu ", (unsigned long) uvalue);
933 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
934 printf ("%lu", (unsigned long) uvalue);
937 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
938 printf ("DW_OP_const8s: %ld ", (long) svalue);
939 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
940 printf ("%ld", (long) svalue);
943 printf ("DW_OP_constu: %s",
944 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
948 printf ("DW_OP_consts: %s",
949 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
953 printf ("DW_OP_dup");
956 printf ("DW_OP_drop");
959 printf ("DW_OP_over");
962 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
963 printf ("DW_OP_pick: %ld", (unsigned long) uvalue);
966 printf ("DW_OP_swap");
969 printf ("DW_OP_rot");
972 printf ("DW_OP_xderef");
975 printf ("DW_OP_abs");
978 printf ("DW_OP_and");
981 printf ("DW_OP_div");
984 printf ("DW_OP_minus");
987 printf ("DW_OP_mod");
990 printf ("DW_OP_mul");
993 printf ("DW_OP_neg");
996 printf ("DW_OP_not");
1002 printf ("DW_OP_plus");
1004 case DW_OP_plus_uconst:
1005 printf ("DW_OP_plus_uconst: %s",
1006 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1010 printf ("DW_OP_shl");
1013 printf ("DW_OP_shr");
1016 printf ("DW_OP_shra");
1019 printf ("DW_OP_xor");
1022 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1023 printf ("DW_OP_bra: %ld", (long) svalue);
1026 printf ("DW_OP_eq");
1029 printf ("DW_OP_ge");
1032 printf ("DW_OP_gt");
1035 printf ("DW_OP_le");
1038 printf ("DW_OP_lt");
1041 printf ("DW_OP_ne");
1044 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1045 printf ("DW_OP_skip: %ld", (long) svalue);
1080 printf ("DW_OP_lit%d", op - DW_OP_lit0);
1115 printf ("DW_OP_reg%d (%s)", op - DW_OP_reg0,
1116 regname (op - DW_OP_reg0, 1));
1151 printf ("DW_OP_breg%d (%s): %s",
1153 regname (op - DW_OP_breg0, 1),
1154 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1159 uvalue = read_uleb128 (data, &bytes_read, end);
1161 printf ("DW_OP_regx: %s (%s)",
1162 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1165 need_frame_base = 1;
1166 printf ("DW_OP_fbreg: %s",
1167 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1171 uvalue = read_uleb128 (data, &bytes_read, end);
1173 printf ("DW_OP_bregx: %s (%s) %s",
1174 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1),
1175 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1179 printf ("DW_OP_piece: %s",
1180 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1183 case DW_OP_deref_size:
1184 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1185 printf ("DW_OP_deref_size: %ld", (long) uvalue);
1187 case DW_OP_xderef_size:
1188 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1189 printf ("DW_OP_xderef_size: %ld", (long) uvalue);
1192 printf ("DW_OP_nop");
1195 /* DWARF 3 extensions. */
1196 case DW_OP_push_object_address:
1197 printf ("DW_OP_push_object_address");
1200 /* XXX: Strictly speaking for 64-bit DWARF3 files
1201 this ought to be an 8-byte wide computation. */
1202 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1203 printf ("DW_OP_call2: <0x%s>",
1204 dwarf_vmatoa ("x", svalue + cu_offset));
1207 /* XXX: Strictly speaking for 64-bit DWARF3 files
1208 this ought to be an 8-byte wide computation. */
1209 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1210 printf ("DW_OP_call4: <0x%s>",
1211 dwarf_vmatoa ("x", svalue + cu_offset));
1213 case DW_OP_call_ref:
1214 /* XXX: Strictly speaking for 64-bit DWARF3 files
1215 this ought to be an 8-byte wide computation. */
1216 if (dwarf_version == -1)
1218 printf (_("(DW_OP_call_ref in frame info)"));
1219 /* No way to tell where the next op is, so just bail. */
1220 return need_frame_base;
1222 if (dwarf_version == 2)
1224 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1228 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1230 printf ("DW_OP_call_ref: <0x%s>", dwarf_vmatoa ("x", uvalue));
1232 case DW_OP_form_tls_address:
1233 printf ("DW_OP_form_tls_address");
1235 case DW_OP_call_frame_cfa:
1236 printf ("DW_OP_call_frame_cfa");
1238 case DW_OP_bit_piece:
1239 printf ("DW_OP_bit_piece: ");
1240 printf (_("size: %s "),
1241 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1243 printf (_("offset: %s "),
1244 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1248 /* DWARF 4 extensions. */
1249 case DW_OP_stack_value:
1250 printf ("DW_OP_stack_value");
1253 case DW_OP_implicit_value:
1254 printf ("DW_OP_implicit_value");
1255 uvalue = read_uleb128 (data, &bytes_read, end);
1257 data = display_block (data, uvalue, end);
1260 /* GNU extensions. */
1261 case DW_OP_GNU_push_tls_address:
1262 printf (_("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown"));
1264 case DW_OP_GNU_uninit:
1265 printf ("DW_OP_GNU_uninit");
1266 /* FIXME: Is there data associated with this OP ? */
1268 case DW_OP_GNU_encoded_addr:
1275 addr = get_encoded_value (&data, encoding, section, end);
1277 printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding);
1278 print_dwarf_vma (addr, pointer_size);
1281 case DW_OP_GNU_implicit_pointer:
1282 /* XXX: Strictly speaking for 64-bit DWARF3 files
1283 this ought to be an 8-byte wide computation. */
1284 if (dwarf_version == -1)
1286 printf (_("(DW_OP_GNU_implicit_pointer in frame info)"));
1287 /* No way to tell where the next op is, so just bail. */
1288 return need_frame_base;
1290 if (dwarf_version == 2)
1292 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1296 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1298 printf ("DW_OP_GNU_implicit_pointer: <0x%s> %s",
1299 dwarf_vmatoa ("x", uvalue),
1300 dwarf_vmatoa ("d", read_sleb128 (data,
1301 &bytes_read, end)));
1304 case DW_OP_GNU_entry_value:
1305 uvalue = read_uleb128 (data, &bytes_read, end);
1307 /* PR 17531: file: 0cc9cd00. */
1308 if (uvalue > (dwarf_vma) (end - data))
1309 uvalue = end - data;
1310 printf ("DW_OP_GNU_entry_value: (");
1311 if (decode_location_expression (data, pointer_size, offset_size,
1312 dwarf_version, uvalue,
1313 cu_offset, section))
1314 need_frame_base = 1;
1320 case DW_OP_GNU_const_type:
1321 uvalue = read_uleb128 (data, &bytes_read, end);
1323 printf ("DW_OP_GNU_const_type: <0x%s> ",
1324 dwarf_vmatoa ("x", cu_offset + uvalue));
1325 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1326 data = display_block (data, uvalue, end);
1328 case DW_OP_GNU_regval_type:
1329 uvalue = read_uleb128 (data, &bytes_read, end);
1331 printf ("DW_OP_GNU_regval_type: %s (%s)",
1332 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1333 uvalue = read_uleb128 (data, &bytes_read, end);
1335 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1337 case DW_OP_GNU_deref_type:
1338 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1339 printf ("DW_OP_GNU_deref_type: %ld", (long) uvalue);
1340 uvalue = read_uleb128 (data, &bytes_read, end);
1342 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1344 case DW_OP_GNU_convert:
1345 uvalue = read_uleb128 (data, &bytes_read, end);
1347 printf ("DW_OP_GNU_convert <0x%s>",
1348 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1350 case DW_OP_GNU_reinterpret:
1351 uvalue = read_uleb128 (data, &bytes_read, end);
1353 printf ("DW_OP_GNU_reinterpret <0x%s>",
1354 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1356 case DW_OP_GNU_parameter_ref:
1357 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1358 printf ("DW_OP_GNU_parameter_ref: <0x%s>",
1359 dwarf_vmatoa ("x", cu_offset + uvalue));
1361 case DW_OP_GNU_addr_index:
1362 uvalue = read_uleb128 (data, &bytes_read, end);
1364 printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1366 case DW_OP_GNU_const_index:
1367 uvalue = read_uleb128 (data, &bytes_read, end);
1369 printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1372 /* HP extensions. */
1373 case DW_OP_HP_is_value:
1374 printf ("DW_OP_HP_is_value");
1375 /* FIXME: Is there data associated with this OP ? */
1377 case DW_OP_HP_fltconst4:
1378 printf ("DW_OP_HP_fltconst4");
1379 /* FIXME: Is there data associated with this OP ? */
1381 case DW_OP_HP_fltconst8:
1382 printf ("DW_OP_HP_fltconst8");
1383 /* FIXME: Is there data associated with this OP ? */
1385 case DW_OP_HP_mod_range:
1386 printf ("DW_OP_HP_mod_range");
1387 /* FIXME: Is there data associated with this OP ? */
1389 case DW_OP_HP_unmod_range:
1390 printf ("DW_OP_HP_unmod_range");
1391 /* FIXME: Is there data associated with this OP ? */
1394 printf ("DW_OP_HP_tls");
1395 /* FIXME: Is there data associated with this OP ? */
1398 /* PGI (STMicroelectronics) extensions. */
1399 case DW_OP_PGI_omp_thread_num:
1400 /* Pushes the thread number for the current thread as it would be
1401 returned by the standard OpenMP library function:
1402 omp_get_thread_num(). The "current thread" is the thread for
1403 which the expression is being evaluated. */
1404 printf ("DW_OP_PGI_omp_thread_num");
1408 if (op >= DW_OP_lo_user
1409 && op <= DW_OP_hi_user)
1410 printf (_("(User defined location op)"));
1412 printf (_("(Unknown location op)"));
1413 /* No way to tell where the next op is, so just bail. */
1414 return need_frame_base;
1417 /* Separate the ops. */
1422 return need_frame_base;
1425 /* Find the CU or TU set corresponding to the given CU_OFFSET.
1426 This is used for DWARF package files. */
1428 static struct cu_tu_set *
1429 find_cu_tu_set_v2 (dwarf_vma cu_offset, int do_types)
1431 struct cu_tu_set *p;
1433 unsigned int dw_sect;
1439 dw_sect = DW_SECT_TYPES;
1445 dw_sect = DW_SECT_INFO;
1449 if (p->section_offsets [dw_sect] == cu_offset)
1457 /* Add INC to HIGH_BITS:LOW_BITS. */
1459 add64 (dwarf_vma * high_bits, dwarf_vma * low_bits, dwarf_vma inc)
1461 dwarf_vma tmp = * low_bits;
1465 /* FIXME: There is probably a better way of handling this:
1467 We need to cope with dwarf_vma being a 32-bit or 64-bit
1468 type. Plus regardless of its size LOW_BITS is meant to
1469 only hold 32-bits, so if there is overflow or wrap around
1470 we must propagate into HIGH_BITS. */
1471 if (tmp < * low_bits)
1475 else if (sizeof (tmp) > 8
1485 static unsigned char *
1486 read_and_display_attr_value (unsigned long attribute,
1488 unsigned char * data,
1489 unsigned char * end,
1490 dwarf_vma cu_offset,
1491 dwarf_vma pointer_size,
1492 dwarf_vma offset_size,
1494 debug_info * debug_info_p,
1496 struct dwarf_section * section,
1497 struct cu_tu_set * this_set)
1499 dwarf_vma uvalue = 0;
1500 unsigned char *block_start = NULL;
1501 unsigned char * orig_data = data;
1502 unsigned int bytes_read;
1504 if (data > end || (data == end && form != DW_FORM_flag_present))
1506 warn (_("Corrupt attribute\n"));
1515 case DW_FORM_ref_addr:
1516 if (dwarf_version == 2)
1517 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1518 else if (dwarf_version == 3 || dwarf_version == 4)
1519 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1521 error (_("Internal error: DWARF version is not 2, 3 or 4.\n"));
1526 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1530 case DW_FORM_sec_offset:
1531 case DW_FORM_GNU_ref_alt:
1532 case DW_FORM_GNU_strp_alt:
1533 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1536 case DW_FORM_flag_present:
1543 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1548 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1553 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1557 uvalue = read_sleb128 (data, & bytes_read, end);
1561 case DW_FORM_GNU_str_index:
1562 uvalue = read_uleb128 (data, & bytes_read, end);
1566 case DW_FORM_ref_udata:
1568 uvalue = read_uleb128 (data, & bytes_read, end);
1572 case DW_FORM_indirect:
1573 form = read_uleb128 (data, & bytes_read, end);
1576 printf (" %s", get_FORM_name (form));
1577 return read_and_display_attr_value (attribute, form, data, end,
1578 cu_offset, pointer_size,
1579 offset_size, dwarf_version,
1580 debug_info_p, do_loc,
1582 case DW_FORM_GNU_addr_index:
1583 uvalue = read_uleb128 (data, & bytes_read, end);
1590 case DW_FORM_ref_addr:
1592 printf (" <0x%s>", dwarf_vmatoa ("x",uvalue));
1595 case DW_FORM_GNU_ref_alt:
1597 printf (" <alt 0x%s>", dwarf_vmatoa ("x",uvalue));
1603 case DW_FORM_ref_udata:
1605 printf (" <0x%s>", dwarf_vmatoa ("x", uvalue + cu_offset));
1610 case DW_FORM_sec_offset:
1612 printf (" 0x%s", dwarf_vmatoa ("x", uvalue));
1615 case DW_FORM_flag_present:
1622 printf (" %s", dwarf_vmatoa ("d", uvalue));
1629 dwarf_vma high_bits;
1633 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1635 if (form == DW_FORM_ref8)
1636 add64 (& high_bits, & utmp, cu_offset);
1638 dwarf_vmatoa64 (high_bits, utmp, buf, sizeof (buf)));
1641 if ((do_loc || do_debug_loc || do_debug_ranges)
1642 && num_debug_info_entries == 0)
1644 if (sizeof (uvalue) == 8)
1645 SAFE_BYTE_GET (uvalue, data, 8, end);
1647 error (_("DW_FORM_data8 is unsupported when sizeof (dwarf_vma) != 8\n"));
1653 case DW_FORM_string:
1655 printf (" %.*s", (int) (end - data), data);
1656 data += strnlen ((char *) data, end - data) + 1;
1660 case DW_FORM_exprloc:
1661 uvalue = read_uleb128 (data, & bytes_read, end);
1662 block_start = data + bytes_read;
1663 if (block_start >= end)
1665 warn (_("Block ends prematurely\n"));
1669 /* FIXME: Testing "(block_start + uvalue) < block_start" miscompiles with
1670 gcc 4.8.3 running on an x86_64 host in 32-bit mode. So we pre-compute
1671 block_start + uvalue here. */
1672 data = block_start + uvalue;
1673 /* PR 17512: file: 008-103549-0.001:0.1. */
1674 if (block_start + uvalue > end || data < block_start)
1676 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1677 uvalue = end - block_start;
1680 data = block_start + uvalue;
1682 data = display_block (block_start, uvalue, end);
1685 case DW_FORM_block1:
1686 SAFE_BYTE_GET (uvalue, data, 1, end);
1687 block_start = data + 1;
1688 if (block_start >= end)
1690 warn (_("Block ends prematurely\n"));
1694 data = block_start + uvalue;
1695 if (block_start + uvalue > end || data < block_start)
1697 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1698 uvalue = end - block_start;
1701 data = block_start + uvalue;
1703 data = display_block (block_start, uvalue, end);
1706 case DW_FORM_block2:
1707 SAFE_BYTE_GET (uvalue, data, 2, end);
1708 block_start = data + 2;
1709 if (block_start >= end)
1711 warn (_("Block ends prematurely\n"));
1715 data = block_start + uvalue;
1716 if (block_start + uvalue > end || data < block_start)
1718 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1719 uvalue = end - block_start;
1722 data = block_start + uvalue;
1724 data = display_block (block_start, uvalue, end);
1727 case DW_FORM_block4:
1728 SAFE_BYTE_GET (uvalue, data, 4, end);
1729 block_start = data + 4;
1730 /* PR 17512: file: 3371-3907-0.004. */
1731 if (block_start >= end)
1733 warn (_("Block ends prematurely\n"));
1737 data = block_start + uvalue;
1738 if (block_start + uvalue > end
1739 /* PR 17531: file: 5b5f0592. */
1740 || data < block_start)
1742 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1743 uvalue = end - block_start;
1746 data = block_start + uvalue;
1748 data = display_block (block_start, uvalue, end);
1753 printf (_(" (indirect string, offset: 0x%s): %s"),
1754 dwarf_vmatoa ("x", uvalue),
1755 fetch_indirect_string (uvalue));
1758 case DW_FORM_GNU_str_index:
1761 const char *suffix = strrchr (section->name, '.');
1762 int dwo = (suffix && strcmp (suffix, ".dwo") == 0) ? 1 : 0;
1764 printf (_(" (indexed string: 0x%s): %s"),
1765 dwarf_vmatoa ("x", uvalue),
1766 fetch_indexed_string (uvalue, this_set, offset_size, dwo));
1770 case DW_FORM_GNU_strp_alt:
1772 printf (_(" (alt indirect string, offset: 0x%s)"),
1773 dwarf_vmatoa ("x", uvalue));
1776 case DW_FORM_indirect:
1777 /* Handled above. */
1780 case DW_FORM_ref_sig8:
1783 dwarf_vma high_bits;
1786 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1787 printf (" signature: 0x%s",
1788 dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf)));
1793 case DW_FORM_GNU_addr_index:
1795 printf (_(" (addr_index: 0x%s): %s"),
1796 dwarf_vmatoa ("x", uvalue),
1797 fetch_indexed_value (uvalue * pointer_size, pointer_size));
1801 warn (_("Unrecognized form: %lu\n"), form);
1805 if ((do_loc || do_debug_loc || do_debug_ranges)
1806 && num_debug_info_entries == 0
1807 && debug_info_p != NULL)
1811 case DW_AT_frame_base:
1812 have_frame_base = 1;
1813 case DW_AT_location:
1814 case DW_AT_string_length:
1815 case DW_AT_return_addr:
1816 case DW_AT_data_member_location:
1817 case DW_AT_vtable_elem_location:
1819 case DW_AT_static_link:
1820 case DW_AT_use_location:
1821 case DW_AT_GNU_call_site_value:
1822 case DW_AT_GNU_call_site_data_value:
1823 case DW_AT_GNU_call_site_target:
1824 case DW_AT_GNU_call_site_target_clobbered:
1825 if ((dwarf_version < 4
1826 && (form == DW_FORM_data4 || form == DW_FORM_data8))
1827 || form == DW_FORM_sec_offset)
1829 /* Process location list. */
1830 unsigned int lmax = debug_info_p->max_loc_offsets;
1831 unsigned int num = debug_info_p->num_loc_offsets;
1833 if (lmax == 0 || num >= lmax)
1836 debug_info_p->loc_offsets = (dwarf_vma *)
1837 xcrealloc (debug_info_p->loc_offsets,
1838 lmax, sizeof (*debug_info_p->loc_offsets));
1839 debug_info_p->have_frame_base = (int *)
1840 xcrealloc (debug_info_p->have_frame_base,
1841 lmax, sizeof (*debug_info_p->have_frame_base));
1842 debug_info_p->max_loc_offsets = lmax;
1844 if (this_set != NULL)
1845 uvalue += this_set->section_offsets [DW_SECT_LOC];
1846 debug_info_p->loc_offsets [num] = uvalue;
1847 debug_info_p->have_frame_base [num] = have_frame_base;
1848 debug_info_p->num_loc_offsets++;
1853 if (need_base_address)
1854 debug_info_p->base_address = uvalue;
1857 case DW_AT_GNU_addr_base:
1858 debug_info_p->addr_base = uvalue;
1861 case DW_AT_GNU_ranges_base:
1862 debug_info_p->ranges_base = uvalue;
1866 if ((dwarf_version < 4
1867 && (form == DW_FORM_data4 || form == DW_FORM_data8))
1868 || form == DW_FORM_sec_offset)
1870 /* Process range list. */
1871 unsigned int lmax = debug_info_p->max_range_lists;
1872 unsigned int num = debug_info_p->num_range_lists;
1874 if (lmax == 0 || num >= lmax)
1877 debug_info_p->range_lists = (dwarf_vma *)
1878 xcrealloc (debug_info_p->range_lists,
1879 lmax, sizeof (*debug_info_p->range_lists));
1880 debug_info_p->max_range_lists = lmax;
1882 debug_info_p->range_lists [num] = uvalue;
1883 debug_info_p->num_range_lists++;
1892 if (do_loc || attribute == 0)
1895 /* For some attributes we can display further information. */
1902 case DW_INL_not_inlined:
1903 printf (_("(not inlined)"));
1905 case DW_INL_inlined:
1906 printf (_("(inlined)"));
1908 case DW_INL_declared_not_inlined:
1909 printf (_("(declared as inline but ignored)"));
1911 case DW_INL_declared_inlined:
1912 printf (_("(declared as inline and inlined)"));
1915 printf (_(" (Unknown inline attribute value: %s)"),
1916 dwarf_vmatoa ("x", uvalue));
1921 case DW_AT_language:
1925 /* Ordered by the numeric value of these constants. */
1926 case DW_LANG_C89: printf ("(ANSI C)"); break;
1927 case DW_LANG_C: printf ("(non-ANSI C)"); break;
1928 case DW_LANG_Ada83: printf ("(Ada)"); break;
1929 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
1930 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
1931 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
1932 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
1933 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
1934 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
1935 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
1936 /* DWARF 2.1 values. */
1937 case DW_LANG_Java: printf ("(Java)"); break;
1938 case DW_LANG_C99: printf ("(ANSI C99)"); break;
1939 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
1940 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
1941 /* DWARF 3 values. */
1942 case DW_LANG_PLI: printf ("(PLI)"); break;
1943 case DW_LANG_ObjC: printf ("(Objective C)"); break;
1944 case DW_LANG_ObjC_plus_plus: printf ("(Objective C++)"); break;
1945 case DW_LANG_UPC: printf ("(Unified Parallel C)"); break;
1946 case DW_LANG_D: printf ("(D)"); break;
1947 /* DWARF 4 values. */
1948 case DW_LANG_Python: printf ("(Python)"); break;
1949 /* DWARF 5 values. */
1950 case DW_LANG_Go: printf ("(Go)"); break;
1951 case DW_LANG_C_plus_plus_11: printf ("(C++11)"); break;
1952 case DW_LANG_C11: printf ("(C11)"); break;
1953 case DW_LANG_C_plus_plus_14: printf ("(C++14)"); break;
1954 case DW_LANG_Fortran03: printf ("(Fortran 03)"); break;
1955 case DW_LANG_Fortran08: printf ("(Fortran 08)"); break;
1956 /* MIPS extension. */
1957 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
1958 /* UPC extension. */
1959 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
1961 if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
1962 printf (_("(implementation defined: %s)"),
1963 dwarf_vmatoa ("x", uvalue));
1965 printf (_("(Unknown: %s)"), dwarf_vmatoa ("x", uvalue));
1970 case DW_AT_encoding:
1974 case DW_ATE_void: printf ("(void)"); break;
1975 case DW_ATE_address: printf ("(machine address)"); break;
1976 case DW_ATE_boolean: printf ("(boolean)"); break;
1977 case DW_ATE_complex_float: printf ("(complex float)"); break;
1978 case DW_ATE_float: printf ("(float)"); break;
1979 case DW_ATE_signed: printf ("(signed)"); break;
1980 case DW_ATE_signed_char: printf ("(signed char)"); break;
1981 case DW_ATE_unsigned: printf ("(unsigned)"); break;
1982 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
1983 /* DWARF 2.1 values: */
1984 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
1985 case DW_ATE_decimal_float: printf ("(decimal float)"); break;
1986 /* DWARF 3 values: */
1987 case DW_ATE_packed_decimal: printf ("(packed_decimal)"); break;
1988 case DW_ATE_numeric_string: printf ("(numeric_string)"); break;
1989 case DW_ATE_edited: printf ("(edited)"); break;
1990 case DW_ATE_signed_fixed: printf ("(signed_fixed)"); break;
1991 case DW_ATE_unsigned_fixed: printf ("(unsigned_fixed)"); break;
1992 /* HP extensions: */
1993 case DW_ATE_HP_float80: printf ("(HP_float80)"); break;
1994 case DW_ATE_HP_complex_float80: printf ("(HP_complex_float80)"); break;
1995 case DW_ATE_HP_float128: printf ("(HP_float128)"); break;
1996 case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
1997 case DW_ATE_HP_floathpintel: printf ("(HP_floathpintel)"); break;
1998 case DW_ATE_HP_imaginary_float80: printf ("(HP_imaginary_float80)"); break;
1999 case DW_ATE_HP_imaginary_float128: printf ("(HP_imaginary_float128)"); break;
2002 if (uvalue >= DW_ATE_lo_user
2003 && uvalue <= DW_ATE_hi_user)
2004 printf (_("(user defined type)"));
2006 printf (_("(unknown type)"));
2011 case DW_AT_accessibility:
2015 case DW_ACCESS_public: printf ("(public)"); break;
2016 case DW_ACCESS_protected: printf ("(protected)"); break;
2017 case DW_ACCESS_private: printf ("(private)"); break;
2019 printf (_("(unknown accessibility)"));
2024 case DW_AT_visibility:
2028 case DW_VIS_local: printf ("(local)"); break;
2029 case DW_VIS_exported: printf ("(exported)"); break;
2030 case DW_VIS_qualified: printf ("(qualified)"); break;
2031 default: printf (_("(unknown visibility)")); break;
2035 case DW_AT_virtuality:
2039 case DW_VIRTUALITY_none: printf ("(none)"); break;
2040 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
2041 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
2042 default: printf (_("(unknown virtuality)")); break;
2046 case DW_AT_identifier_case:
2050 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
2051 case DW_ID_up_case: printf ("(up_case)"); break;
2052 case DW_ID_down_case: printf ("(down_case)"); break;
2053 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
2054 default: printf (_("(unknown case)")); break;
2058 case DW_AT_calling_convention:
2062 case DW_CC_normal: printf ("(normal)"); break;
2063 case DW_CC_program: printf ("(program)"); break;
2064 case DW_CC_nocall: printf ("(nocall)"); break;
2066 if (uvalue >= DW_CC_lo_user
2067 && uvalue <= DW_CC_hi_user)
2068 printf (_("(user defined)"));
2070 printf (_("(unknown convention)"));
2074 case DW_AT_ordering:
2078 case -1: printf (_("(undefined)")); break;
2079 case 0: printf ("(row major)"); break;
2080 case 1: printf ("(column major)"); break;
2084 case DW_AT_frame_base:
2085 have_frame_base = 1;
2086 case DW_AT_location:
2087 case DW_AT_string_length:
2088 case DW_AT_return_addr:
2089 case DW_AT_data_member_location:
2090 case DW_AT_vtable_elem_location:
2092 case DW_AT_static_link:
2093 case DW_AT_use_location:
2094 case DW_AT_GNU_call_site_value:
2095 case DW_AT_GNU_call_site_data_value:
2096 case DW_AT_GNU_call_site_target:
2097 case DW_AT_GNU_call_site_target_clobbered:
2098 if ((dwarf_version < 4
2099 && (form == DW_FORM_data4 || form == DW_FORM_data8))
2100 || form == DW_FORM_sec_offset)
2101 printf (_(" (location list)"));
2103 case DW_AT_allocated:
2104 case DW_AT_associated:
2105 case DW_AT_data_location:
2107 case DW_AT_upper_bound:
2108 case DW_AT_lower_bound:
2111 int need_frame_base;
2114 need_frame_base = decode_location_expression (block_start,
2119 cu_offset, section);
2121 if (need_frame_base && !have_frame_base)
2122 printf (_(" [without DW_AT_frame_base]"));
2128 if (form == DW_FORM_ref_sig8
2129 || form == DW_FORM_GNU_ref_alt)
2132 if (form == DW_FORM_ref1
2133 || form == DW_FORM_ref2
2134 || form == DW_FORM_ref4
2135 || form == DW_FORM_ref_udata)
2136 uvalue += cu_offset;
2138 if (uvalue >= section->size)
2139 warn (_("Offset %s used as value for DW_AT_import attribute of DIE at offset 0x%lx is too big.\n"),
2140 dwarf_vmatoa ("x", uvalue),
2141 (unsigned long) (orig_data - section->start));
2144 unsigned long abbrev_number;
2145 abbrev_entry * entry;
2147 abbrev_number = read_uleb128 (section->start + uvalue, NULL, end);
2149 printf (_("\t[Abbrev Number: %ld"), abbrev_number);
2150 /* Don't look up abbrev for DW_FORM_ref_addr, as it very often will
2151 use different abbrev table, and we don't track .debug_info chunks
2153 if (form != DW_FORM_ref_addr)
2155 for (entry = first_abbrev; entry != NULL; entry = entry->next)
2156 if (entry->entry == abbrev_number)
2159 printf (" (%s)", get_TAG_name (entry->tag));
2174 get_AT_name (unsigned long attribute)
2179 return "DW_AT value: 0";
2181 /* One value is shared by the MIPS and HP extensions: */
2182 if (attribute == DW_AT_MIPS_fde)
2183 return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
2185 name = get_DW_AT_name (attribute);
2189 static char buffer[100];
2191 snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
2199 static unsigned char *
2200 read_and_display_attr (unsigned long attribute,
2202 unsigned char * data,
2203 unsigned char * end,
2204 dwarf_vma cu_offset,
2205 dwarf_vma pointer_size,
2206 dwarf_vma offset_size,
2208 debug_info * debug_info_p,
2210 struct dwarf_section * section,
2211 struct cu_tu_set * this_set)
2214 printf (" %-18s:", get_AT_name (attribute));
2215 data = read_and_display_attr_value (attribute, form, data, end,
2216 cu_offset, pointer_size, offset_size,
2217 dwarf_version, debug_info_p,
2218 do_loc, section, this_set);
2224 /* Process the contents of a .debug_info section. If do_loc is non-zero
2225 then we are scanning for location lists and we do not want to display
2226 anything to the user. If do_types is non-zero, we are processing
2227 a .debug_types section instead of a .debug_info section. */
2230 process_debug_info (struct dwarf_section *section,
2232 enum dwarf_section_display_enum abbrev_sec,
2236 unsigned char *start = section->start;
2237 unsigned char *end = start + section->size;
2238 unsigned char *section_begin;
2240 unsigned int num_units = 0;
2242 if ((do_loc || do_debug_loc || do_debug_ranges)
2243 && num_debug_info_entries == 0
2248 /* First scan the section to get the number of comp units. */
2249 for (section_begin = start, num_units = 0; section_begin < end;
2252 /* Read the first 4 bytes. For a 32-bit DWARF section, this
2253 will be the length. For a 64-bit DWARF section, it'll be
2254 the escape code 0xffffffff followed by an 8 byte length. */
2255 SAFE_BYTE_GET (length, section_begin, 4, end);
2257 if (length == 0xffffffff)
2259 SAFE_BYTE_GET (length, section_begin + 4, 8, end);
2260 section_begin += length + 12;
2262 else if (length >= 0xfffffff0 && length < 0xffffffff)
2264 warn (_("Reserved length value (0x%s) found in section %s\n"),
2265 dwarf_vmatoa ("x", length), section->name);
2269 section_begin += length + 4;
2271 /* Negative values are illegal, they may even cause infinite
2272 looping. This can happen if we can't accurately apply
2273 relocations to an object file, or if the file is corrupt. */
2274 if ((signed long) length <= 0 || section_begin < start)
2276 warn (_("Corrupt unit length (0x%s) found in section %s\n"),
2277 dwarf_vmatoa ("x", length), section->name);
2284 error (_("No comp units in %s section ?\n"), section->name);
2288 /* Then allocate an array to hold the information. */
2289 debug_information = (debug_info *) cmalloc (num_units,
2290 sizeof (* debug_information));
2291 if (debug_information == NULL)
2293 error (_("Not enough memory for a debug info array of %u entries\n"),
2295 alloc_num_debug_info_entries = num_debug_info_entries = 0;
2298 alloc_num_debug_info_entries = num_units;
2303 if (dwarf_start_die == 0)
2304 printf (_("Contents of the %s section:\n\n"), section->name);
2306 load_debug_section (str, file);
2307 load_debug_section (str_dwo, file);
2308 load_debug_section (str_index, file);
2309 load_debug_section (str_index_dwo, file);
2310 load_debug_section (debug_addr, file);
2313 load_debug_section (abbrev_sec, file);
2314 if (debug_displays [abbrev_sec].section.start == NULL)
2316 warn (_("Unable to locate %s section!\n"),
2317 debug_displays [abbrev_sec].section.name);
2321 for (section_begin = start, unit = 0; start < end; unit++)
2323 DWARF2_Internal_CompUnit compunit;
2324 unsigned char *hdrptr;
2325 unsigned char *tags;
2326 int level, last_level, saved_level;
2327 dwarf_vma cu_offset;
2328 unsigned int offset_size;
2329 int initial_length_size;
2330 dwarf_vma signature_high = 0;
2331 dwarf_vma signature_low = 0;
2332 dwarf_vma type_offset = 0;
2333 struct cu_tu_set *this_set;
2334 dwarf_vma abbrev_base;
2339 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 4, end);
2341 if (compunit.cu_length == 0xffffffff)
2343 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 8, end);
2345 initial_length_size = 12;
2350 initial_length_size = 4;
2353 SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end);
2355 cu_offset = start - section_begin;
2357 this_set = find_cu_tu_set_v2 (cu_offset, do_types);
2359 SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
2361 if (this_set == NULL)
2364 abbrev_size = debug_displays [abbrev_sec].section.size;
2368 abbrev_base = this_set->section_offsets [DW_SECT_ABBREV];
2369 abbrev_size = this_set->section_sizes [DW_SECT_ABBREV];
2372 SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
2373 /* PR 17512: file: 001-108546-0.001:0.1. */
2374 if (compunit.cu_pointer_size < 2 || compunit.cu_pointer_size > 8)
2376 warn (_("Invalid pointer size (%d) in compunit header, using %d instead\n"),
2377 compunit.cu_pointer_size, offset_size);
2378 compunit.cu_pointer_size = offset_size;
2383 SAFE_BYTE_GET64 (hdrptr, &signature_high, &signature_low, end);
2385 SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end);
2388 if ((do_loc || do_debug_loc || do_debug_ranges)
2389 && num_debug_info_entries == 0
2392 debug_information [unit].cu_offset = cu_offset;
2393 debug_information [unit].pointer_size
2394 = compunit.cu_pointer_size;
2395 debug_information [unit].offset_size = offset_size;
2396 debug_information [unit].dwarf_version = compunit.cu_version;
2397 debug_information [unit].base_address = 0;
2398 debug_information [unit].addr_base = DEBUG_INFO_UNAVAILABLE;
2399 debug_information [unit].ranges_base = DEBUG_INFO_UNAVAILABLE;
2400 debug_information [unit].loc_offsets = NULL;
2401 debug_information [unit].have_frame_base = NULL;
2402 debug_information [unit].max_loc_offsets = 0;
2403 debug_information [unit].num_loc_offsets = 0;
2404 debug_information [unit].range_lists = NULL;
2405 debug_information [unit].max_range_lists= 0;
2406 debug_information [unit].num_range_lists = 0;
2409 if (!do_loc && dwarf_start_die == 0)
2411 printf (_(" Compilation Unit @ offset 0x%s:\n"),
2412 dwarf_vmatoa ("x", cu_offset));
2413 printf (_(" Length: 0x%s (%s)\n"),
2414 dwarf_vmatoa ("x", compunit.cu_length),
2415 offset_size == 8 ? "64-bit" : "32-bit");
2416 printf (_(" Version: %d\n"), compunit.cu_version);
2417 printf (_(" Abbrev Offset: 0x%s\n"),
2418 dwarf_vmatoa ("x", compunit.cu_abbrev_offset));
2419 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
2424 printf (_(" Signature: 0x%s\n"),
2425 dwarf_vmatoa64 (signature_high, signature_low,
2426 buf, sizeof (buf)));
2427 printf (_(" Type Offset: 0x%s\n"),
2428 dwarf_vmatoa ("x", type_offset));
2430 if (this_set != NULL)
2432 dwarf_vma *offsets = this_set->section_offsets;
2433 size_t *sizes = this_set->section_sizes;
2435 printf (_(" Section contributions:\n"));
2436 printf (_(" .debug_abbrev.dwo: 0x%s 0x%s\n"),
2437 dwarf_vmatoa ("x", offsets [DW_SECT_ABBREV]),
2438 dwarf_vmatoa ("x", sizes [DW_SECT_ABBREV]));
2439 printf (_(" .debug_line.dwo: 0x%s 0x%s\n"),
2440 dwarf_vmatoa ("x", offsets [DW_SECT_LINE]),
2441 dwarf_vmatoa ("x", sizes [DW_SECT_LINE]));
2442 printf (_(" .debug_loc.dwo: 0x%s 0x%s\n"),
2443 dwarf_vmatoa ("x", offsets [DW_SECT_LOC]),
2444 dwarf_vmatoa ("x", sizes [DW_SECT_LOC]));
2445 printf (_(" .debug_str_offsets.dwo: 0x%s 0x%s\n"),
2446 dwarf_vmatoa ("x", offsets [DW_SECT_STR_OFFSETS]),
2447 dwarf_vmatoa ("x", sizes [DW_SECT_STR_OFFSETS]));
2451 if (cu_offset + compunit.cu_length + initial_length_size
2454 warn (_("Debug info is corrupted, length of CU at %s"
2455 " extends beyond end of section (length = %s)\n"),
2456 dwarf_vmatoa ("x", cu_offset),
2457 dwarf_vmatoa ("x", compunit.cu_length));
2462 start += compunit.cu_length + initial_length_size;
2466 warn (_("Debug info is corrupt. CU at %s extends beyond end of section"),
2467 dwarf_vmatoa ("x", cu_offset));
2471 if (compunit.cu_version != 2
2472 && compunit.cu_version != 3
2473 && compunit.cu_version != 4)
2475 warn (_("CU at offset %s contains corrupt or "
2476 "unsupported version number: %d.\n"),
2477 dwarf_vmatoa ("x", cu_offset), compunit.cu_version);
2483 /* Process the abbrevs used by this compilation unit. */
2484 if (compunit.cu_abbrev_offset >= abbrev_size)
2485 warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"),
2486 (unsigned long) compunit.cu_abbrev_offset,
2487 (unsigned long) abbrev_size);
2488 /* PR 17531: file:4bcd9ce9. */
2489 else if ((abbrev_base + abbrev_size)
2490 > debug_displays [abbrev_sec].section.size)
2491 warn (_("Debug info is corrupted, abbrev size (%lx) is larger than abbrev section size (%lx)\n"),
2492 (unsigned long) abbrev_base + abbrev_size,
2493 (unsigned long) debug_displays [abbrev_sec].section.size);
2495 process_abbrev_section
2496 (((unsigned char *) debug_displays [abbrev_sec].section.start
2497 + abbrev_base + compunit.cu_abbrev_offset),
2498 ((unsigned char *) debug_displays [abbrev_sec].section.start
2499 + abbrev_base + abbrev_size));
2504 while (tags < start)
2506 unsigned int bytes_read;
2507 unsigned long abbrev_number;
2508 unsigned long die_offset;
2509 abbrev_entry *entry;
2511 int do_printing = 1;
2513 die_offset = tags - section_begin;
2515 abbrev_number = read_uleb128 (tags, & bytes_read, start);
2518 /* A null DIE marks the end of a list of siblings or it may also be
2519 a section padding. */
2520 if (abbrev_number == 0)
2522 /* Check if it can be a section padding for the last CU. */
2523 if (level == 0 && start == end)
2527 for (chk = tags; chk < start; chk++)
2534 if (!do_loc && die_offset >= dwarf_start_die
2535 && (dwarf_cutoff_level == -1
2536 || level < dwarf_cutoff_level))
2537 printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
2543 static unsigned num_bogus_warns = 0;
2545 if (num_bogus_warns < 3)
2547 warn (_("Bogus end-of-siblings marker detected at offset %lx in %s section\n"),
2548 die_offset, section->name);
2550 if (num_bogus_warns == 3)
2551 warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
2554 if (dwarf_start_die != 0 && level < saved_level)
2561 if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
2565 if (dwarf_start_die != 0 && die_offset == dwarf_start_die)
2566 saved_level = level;
2567 do_printing = (dwarf_cutoff_level == -1
2568 || level < dwarf_cutoff_level);
2570 printf (_(" <%d><%lx>: Abbrev Number: %lu"),
2571 level, die_offset, abbrev_number);
2572 else if (dwarf_cutoff_level == -1
2573 || last_level < dwarf_cutoff_level)
2574 printf (_(" <%d><%lx>: ...\n"), level, die_offset);
2579 /* Scan through the abbreviation list until we reach the
2581 for (entry = first_abbrev;
2582 entry && entry->entry != abbrev_number;
2583 entry = entry->next)
2588 if (!do_loc && do_printing)
2593 warn (_("DIE at offset 0x%lx refers to abbreviation number %lu which does not exist\n"),
2594 die_offset, abbrev_number);
2598 if (!do_loc && do_printing)
2599 printf (" (%s)\n", get_TAG_name (entry->tag));
2604 need_base_address = 0;
2606 case DW_TAG_compile_unit:
2607 need_base_address = 1;
2609 case DW_TAG_entry_point:
2610 case DW_TAG_subprogram:
2611 need_base_address = 0;
2612 /* Assuming that there is no DW_AT_frame_base. */
2613 have_frame_base = 0;
2617 for (attr = entry->first_attr;
2618 attr && attr->attribute;
2623 if (! do_loc && do_printing)
2624 /* Show the offset from where the tag was extracted. */
2625 printf (" <%lx>", (unsigned long)(tags - section_begin));
2627 if (debug_information && unit < alloc_num_debug_info_entries)
2628 arg = debug_information + unit;
2632 tags = read_and_display_attr (attr->attribute,
2637 compunit.cu_pointer_size,
2639 compunit.cu_version,
2641 do_loc || ! do_printing,
2646 if (entry->children)
2651 /* Set num_debug_info_entries here so that it can be used to check if
2652 we need to process .debug_loc and .debug_ranges sections. */
2653 if ((do_loc || do_debug_loc || do_debug_ranges)
2654 && num_debug_info_entries == 0
2657 if (num_units > alloc_num_debug_info_entries)
2658 num_debug_info_entries = alloc_num_debug_info_entries;
2660 num_debug_info_entries = num_units;
2669 /* Locate and scan the .debug_info section in the file and record the pointer
2670 sizes and offsets for the compilation units in it. Usually an executable
2671 will have just one pointer size, but this is not guaranteed, and so we try
2672 not to make any assumptions. Returns zero upon failure, or the number of
2673 compilation units upon success. */
2676 load_debug_info (void * file)
2678 /* Reset the last pointer size so that we can issue correct error
2679 messages if we are displaying the contents of more than one section. */
2680 last_pointer_size = 0;
2681 warned_about_missing_comp_units = FALSE;
2683 /* If we have already tried and failed to load the .debug_info
2684 section then do not bother to repeat the task. */
2685 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
2688 /* If we already have the information there is nothing else to do. */
2689 if (num_debug_info_entries > 0)
2690 return num_debug_info_entries;
2692 /* If this is a DWARF package file, load the CU and TU indexes. */
2693 load_cu_tu_indexes (file);
2695 if (load_debug_section (info, file)
2696 && process_debug_info (&debug_displays [info].section, file, abbrev, 1, 0))
2697 return num_debug_info_entries;
2699 if (load_debug_section (info_dwo, file)
2700 && process_debug_info (&debug_displays [info_dwo].section, file,
2702 return num_debug_info_entries;
2704 num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
2708 /* Read a DWARF .debug_line section header starting at DATA.
2709 Upon success returns an updated DATA pointer and the LINFO
2710 structure and the END_OF_SEQUENCE pointer will be filled in.
2711 Otherwise returns NULL. */
2713 static unsigned char *
2714 read_debug_line_header (struct dwarf_section * section,
2715 unsigned char * data,
2716 unsigned char * end,
2717 DWARF2_Internal_LineInfo * linfo,
2718 unsigned char ** end_of_sequence)
2720 unsigned char *hdrptr;
2721 unsigned int offset_size;
2722 unsigned int initial_length_size;
2724 /* Extract information from the Line Number Program Header.
2725 (section 6.2.4 in the Dwarf3 doc). */
2728 /* Get and check the length of the block. */
2729 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 4, end);
2731 if (linfo->li_length == 0xffffffff)
2733 /* This section is 64-bit DWARF 3. */
2734 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 8, end);
2736 initial_length_size = 12;
2741 initial_length_size = 4;
2744 if (linfo->li_length + initial_length_size > section->size)
2746 /* If the length is just a bias against the initial_length_size then
2747 this means that the field has a relocation against it which has not
2748 been applied. (Ie we are dealing with an object file, not a linked
2749 binary). Do not complain but instead assume that the rest of the
2750 section applies to this particular header. */
2751 if (linfo->li_length == - initial_length_size)
2753 linfo->li_length = section->size - initial_length_size;
2757 warn (_("The line info appears to be corrupt - the section is too small\n"));
2762 /* Get and check the version number. */
2763 SAFE_BYTE_GET_AND_INC (linfo->li_version, hdrptr, 2, end);
2765 if (linfo->li_version != 2
2766 && linfo->li_version != 3
2767 && linfo->li_version != 4)
2769 warn (_("Only DWARF version 2, 3 and 4 line info is currently supported.\n"));
2773 SAFE_BYTE_GET_AND_INC (linfo->li_prologue_length, hdrptr, offset_size, end);
2774 SAFE_BYTE_GET_AND_INC (linfo->li_min_insn_length, hdrptr, 1, end);
2776 if (linfo->li_version >= 4)
2778 SAFE_BYTE_GET_AND_INC (linfo->li_max_ops_per_insn, hdrptr, 1, end);
2780 if (linfo->li_max_ops_per_insn == 0)
2782 warn (_("Invalid maximum operations per insn.\n"));
2787 linfo->li_max_ops_per_insn = 1;
2789 SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end);
2790 SAFE_SIGNED_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
2791 SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end);
2792 SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end);
2794 * end_of_sequence = data + linfo->li_length + initial_length_size;
2795 /* PR 17512: file:002-117414-0.004. */
2796 if (* end_of_sequence > end)
2798 warn (_("Line length %s extends beyond end of section\n"),
2799 dwarf_vmatoa ("u", linfo->li_length));
2800 * end_of_sequence = end;
2808 display_debug_lines_raw (struct dwarf_section *section,
2809 unsigned char *data,
2812 unsigned char *start = section->start;
2814 printf (_("Raw dump of debug contents of section %s:\n\n"),
2819 static DWARF2_Internal_LineInfo saved_linfo;
2820 DWARF2_Internal_LineInfo linfo;
2821 unsigned char *standard_opcodes;
2822 unsigned char *end_of_sequence;
2823 unsigned int last_dir_entry = 0;
2826 if (const_strneq (section->name, ".debug_line.")
2827 /* Note: the following does not apply to .debug_line.dwo sections.
2828 These are full debug_line sections. */
2829 && strcmp (section->name, ".debug_line.dwo") != 0)
2831 /* Sections named .debug_line.<foo> are fragments of a .debug_line
2832 section containing just the Line Number Statements. They are
2833 created by the assembler and intended to be used alongside gcc's
2834 -ffunction-sections command line option. When the linker's
2835 garbage collection decides to discard a .text.<foo> section it
2836 can then also discard the line number information in .debug_line.<foo>.
2838 Since the section is a fragment it does not have the details
2839 needed to fill out a LineInfo structure, so instead we use the
2840 details from the last full debug_line section that we processed. */
2841 end_of_sequence = end;
2842 standard_opcodes = NULL;
2843 linfo = saved_linfo;
2844 /* PR 17531: file: 0522b371. */
2845 if (linfo.li_line_range == 0)
2847 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
2850 reset_state_machine (linfo.li_default_is_stmt);
2854 unsigned char * hdrptr;
2856 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
2857 & end_of_sequence)) == NULL)
2860 printf (_(" Offset: 0x%lx\n"), (long)(data - start));
2861 printf (_(" Length: %ld\n"), (long) linfo.li_length);
2862 printf (_(" DWARF Version: %d\n"), linfo.li_version);
2863 printf (_(" Prologue Length: %d\n"), linfo.li_prologue_length);
2864 printf (_(" Minimum Instruction Length: %d\n"), linfo.li_min_insn_length);
2865 if (linfo.li_version >= 4)
2866 printf (_(" Maximum Ops per Instruction: %d\n"), linfo.li_max_ops_per_insn);
2867 printf (_(" Initial value of 'is_stmt': %d\n"), linfo.li_default_is_stmt);
2868 printf (_(" Line Base: %d\n"), linfo.li_line_base);
2869 printf (_(" Line Range: %d\n"), linfo.li_line_range);
2870 printf (_(" Opcode Base: %d\n"), linfo.li_opcode_base);
2872 /* PR 17512: file: 1665-6428-0.004. */
2873 if (linfo.li_line_range == 0)
2875 warn (_("Line range of 0 is invalid, using 1 instead\n"));
2876 linfo.li_line_range = 1;
2879 reset_state_machine (linfo.li_default_is_stmt);
2881 /* Display the contents of the Opcodes table. */
2882 standard_opcodes = hdrptr;
2884 /* PR 17512: file: 002-417945-0.004. */
2885 if (standard_opcodes + linfo.li_opcode_base >= end)
2887 warn (_("Line Base extends beyond end of section\n"));
2891 printf (_("\n Opcodes:\n"));
2893 for (i = 1; i < linfo.li_opcode_base; i++)
2894 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
2896 /* Display the contents of the Directory table. */
2897 data = standard_opcodes + linfo.li_opcode_base - 1;
2900 printf (_("\n The Directory Table is empty.\n"));
2903 printf (_("\n The Directory Table (offset 0x%lx):\n"),
2904 (long)(data - start));
2906 while (data < end && *data != 0)
2908 printf (" %d\t%.*s\n", ++last_dir_entry, (int) (end - data), data);
2910 data += strnlen ((char *) data, end - data) + 1;
2913 /* PR 17512: file: 002-132094-0.004. */
2914 if (data >= end - 1)
2918 /* Skip the NUL at the end of the table. */
2921 /* Display the contents of the File Name table. */
2923 printf (_("\n The File Name Table is empty.\n"));
2926 printf (_("\n The File Name Table (offset 0x%lx):\n"),
2927 (long)(data - start));
2928 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
2930 while (data < end && *data != 0)
2932 unsigned char *name;
2933 unsigned int bytes_read;
2935 printf (" %d\t", ++state_machine_regs.last_file_entry);
2937 data += strnlen ((char *) data, end - data) + 1;
2940 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2943 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2946 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2948 printf ("%.*s\n", (int)(end - name), name);
2952 warn (_("Corrupt file name table entry\n"));
2958 /* Skip the NUL at the end of the table. */
2961 saved_linfo = linfo;
2964 /* Now display the statements. */
2965 if (data >= end_of_sequence)
2966 printf (_(" No Line Number Statements.\n"));
2969 printf (_(" Line Number Statements:\n"));
2971 while (data < end_of_sequence)
2973 unsigned char op_code;
2974 dwarf_signed_vma adv;
2976 unsigned int bytes_read;
2978 printf (" [0x%08lx]", (long)(data - start));
2982 if (op_code >= linfo.li_opcode_base)
2984 op_code -= linfo.li_opcode_base;
2985 uladv = (op_code / linfo.li_line_range);
2986 if (linfo.li_max_ops_per_insn == 1)
2988 uladv *= linfo.li_min_insn_length;
2989 state_machine_regs.address += uladv;
2990 printf (_(" Special opcode %d: "
2991 "advance Address by %s to 0x%s"),
2992 op_code, dwarf_vmatoa ("u", uladv),
2993 dwarf_vmatoa ("x", state_machine_regs.address));
2997 state_machine_regs.address
2998 += ((state_machine_regs.op_index + uladv)
2999 / linfo.li_max_ops_per_insn)
3000 * linfo.li_min_insn_length;
3001 state_machine_regs.op_index
3002 = (state_machine_regs.op_index + uladv)
3003 % linfo.li_max_ops_per_insn;
3004 printf (_(" Special opcode %d: "
3005 "advance Address by %s to 0x%s[%d]"),
3006 op_code, dwarf_vmatoa ("u", uladv),
3007 dwarf_vmatoa ("x", state_machine_regs.address),
3008 state_machine_regs.op_index);
3010 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
3011 state_machine_regs.line += adv;
3012 printf (_(" and Line by %s to %d\n"),
3013 dwarf_vmatoa ("d", adv), state_machine_regs.line);
3015 else switch (op_code)
3017 case DW_LNS_extended_op:
3018 data += process_extended_line_op (data, linfo.li_default_is_stmt, end);
3022 printf (_(" Copy\n"));
3025 case DW_LNS_advance_pc:
3026 uladv = read_uleb128 (data, & bytes_read, end);
3028 if (linfo.li_max_ops_per_insn == 1)
3030 uladv *= linfo.li_min_insn_length;
3031 state_machine_regs.address += uladv;
3032 printf (_(" Advance PC by %s to 0x%s\n"),
3033 dwarf_vmatoa ("u", uladv),
3034 dwarf_vmatoa ("x", state_machine_regs.address));
3038 state_machine_regs.address
3039 += ((state_machine_regs.op_index + uladv)
3040 / linfo.li_max_ops_per_insn)
3041 * linfo.li_min_insn_length;
3042 state_machine_regs.op_index
3043 = (state_machine_regs.op_index + uladv)
3044 % linfo.li_max_ops_per_insn;
3045 printf (_(" Advance PC by %s to 0x%s[%d]\n"),
3046 dwarf_vmatoa ("u", uladv),
3047 dwarf_vmatoa ("x", state_machine_regs.address),
3048 state_machine_regs.op_index);
3052 case DW_LNS_advance_line:
3053 adv = read_sleb128 (data, & bytes_read, end);
3055 state_machine_regs.line += adv;
3056 printf (_(" Advance Line by %s to %d\n"),
3057 dwarf_vmatoa ("d", adv),
3058 state_machine_regs.line);
3061 case DW_LNS_set_file:
3062 adv = read_uleb128 (data, & bytes_read, end);
3064 printf (_(" Set File Name to entry %s in the File Name Table\n"),
3065 dwarf_vmatoa ("d", adv));
3066 state_machine_regs.file = adv;
3069 case DW_LNS_set_column:
3070 uladv = read_uleb128 (data, & bytes_read, end);
3072 printf (_(" Set column to %s\n"),
3073 dwarf_vmatoa ("u", uladv));
3074 state_machine_regs.column = uladv;
3077 case DW_LNS_negate_stmt:
3078 adv = state_machine_regs.is_stmt;
3080 printf (_(" Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv));
3081 state_machine_regs.is_stmt = adv;
3084 case DW_LNS_set_basic_block:
3085 printf (_(" Set basic block\n"));
3086 state_machine_regs.basic_block = 1;
3089 case DW_LNS_const_add_pc:
3090 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
3091 if (linfo.li_max_ops_per_insn)
3093 uladv *= linfo.li_min_insn_length;
3094 state_machine_regs.address += uladv;
3095 printf (_(" Advance PC by constant %s to 0x%s\n"),
3096 dwarf_vmatoa ("u", uladv),
3097 dwarf_vmatoa ("x", state_machine_regs.address));
3101 state_machine_regs.address
3102 += ((state_machine_regs.op_index + uladv)
3103 / linfo.li_max_ops_per_insn)
3104 * linfo.li_min_insn_length;
3105 state_machine_regs.op_index
3106 = (state_machine_regs.op_index + uladv)
3107 % linfo.li_max_ops_per_insn;
3108 printf (_(" Advance PC by constant %s to 0x%s[%d]\n"),
3109 dwarf_vmatoa ("u", uladv),
3110 dwarf_vmatoa ("x", state_machine_regs.address),
3111 state_machine_regs.op_index);
3115 case DW_LNS_fixed_advance_pc:
3116 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
3117 state_machine_regs.address += uladv;
3118 state_machine_regs.op_index = 0;
3119 printf (_(" Advance PC by fixed size amount %s to 0x%s\n"),
3120 dwarf_vmatoa ("u", uladv),
3121 dwarf_vmatoa ("x", state_machine_regs.address));
3124 case DW_LNS_set_prologue_end:
3125 printf (_(" Set prologue_end to true\n"));
3128 case DW_LNS_set_epilogue_begin:
3129 printf (_(" Set epilogue_begin to true\n"));
3132 case DW_LNS_set_isa:
3133 uladv = read_uleb128 (data, & bytes_read, end);
3135 printf (_(" Set ISA to %s\n"), dwarf_vmatoa ("u", uladv));
3139 printf (_(" Unknown opcode %d with operands: "), op_code);
3141 if (standard_opcodes != NULL)
3142 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
3144 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
3146 i == 1 ? "" : ", ");
3162 unsigned char *name;
3163 unsigned int directory_index;
3164 unsigned int modification_date;
3165 unsigned int length;
3168 /* Output a decoded representation of the .debug_line section. */
3171 display_debug_lines_decoded (struct dwarf_section *section,
3172 unsigned char *data,
3175 static DWARF2_Internal_LineInfo saved_linfo;
3177 printf (_("Decoded dump of debug contents of section %s:\n\n"),
3182 /* This loop amounts to one iteration per compilation unit. */
3183 DWARF2_Internal_LineInfo linfo;
3184 unsigned char *standard_opcodes;
3185 unsigned char *end_of_sequence;
3187 File_Entry *file_table = NULL;
3188 unsigned int n_files = 0;
3189 unsigned char **directory_table = NULL;
3190 unsigned int n_directories = 0;
3192 if (const_strneq (section->name, ".debug_line.")
3193 /* Note: the following does not apply to .debug_line.dwo sections.
3194 These are full debug_line sections. */
3195 && strcmp (section->name, ".debug_line.dwo") != 0)
3197 /* See comment in display_debug_lines_raw(). */
3198 end_of_sequence = end;
3199 standard_opcodes = NULL;
3200 linfo = saved_linfo;
3201 /* PR 17531: file: 0522b371. */
3202 if (linfo.li_line_range == 0)
3204 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
3207 reset_state_machine (linfo.li_default_is_stmt);
3211 unsigned char *hdrptr;
3213 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
3214 & end_of_sequence)) == NULL)
3217 /* PR 17531: file: 0522b371. */
3218 if (linfo.li_line_range == 0)
3220 warn (_("Line range of 0 is invalid, using 1 instead\n"));
3221 linfo.li_line_range = 1;
3223 reset_state_machine (linfo.li_default_is_stmt);
3225 /* Save a pointer to the contents of the Opcodes table. */
3226 standard_opcodes = hdrptr;
3228 /* Traverse the Directory table just to count entries. */
3229 data = standard_opcodes + linfo.li_opcode_base - 1;
3232 unsigned char *ptr_directory_table = data;
3236 data += strnlen ((char *) data, end - data) + 1;
3240 /* Go through the directory table again to save the directories. */
3241 directory_table = (unsigned char **)
3242 xmalloc (n_directories * sizeof (unsigned char *));
3245 while (*ptr_directory_table != 0)
3247 directory_table[i] = ptr_directory_table;
3248 ptr_directory_table += strnlen ((char *) ptr_directory_table,
3249 ptr_directory_table - end) + 1;
3253 /* Skip the NUL at the end of the table. */
3256 /* Traverse the File Name table just to count the entries. */
3259 unsigned char *ptr_file_name_table = data;
3263 unsigned int bytes_read;
3265 /* Skip Name, directory index, last modification time and length
3267 data += strnlen ((char *) data, end - data) + 1;
3268 read_uleb128 (data, & bytes_read, end);
3270 read_uleb128 (data, & bytes_read, end);
3272 read_uleb128 (data, & bytes_read, end);
3278 /* Go through the file table again to save the strings. */
3279 file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
3282 while (*ptr_file_name_table != 0)
3284 unsigned int bytes_read;
3286 file_table[i].name = ptr_file_name_table;
3287 ptr_file_name_table += strnlen ((char *) ptr_file_name_table,
3288 end - ptr_file_name_table) + 1;
3290 /* We are not interested in directory, time or size. */
3291 file_table[i].directory_index = read_uleb128 (ptr_file_name_table,
3293 ptr_file_name_table += bytes_read;
3294 file_table[i].modification_date = read_uleb128 (ptr_file_name_table,
3296 ptr_file_name_table += bytes_read;
3297 file_table[i].length = read_uleb128 (ptr_file_name_table, & bytes_read, end);
3298 ptr_file_name_table += bytes_read;
3303 /* Print the Compilation Unit's name and a header. */
3304 if (directory_table == NULL)
3306 printf (_("CU: %s:\n"), file_table[0].name);
3307 printf (_("File name Line number Starting address\n"));
3311 unsigned int ix = file_table[0].directory_index;
3312 const char *directory = ix ? (char *)directory_table[ix - 1] : ".";
3314 if (do_wide || strlen (directory) < 76)
3315 printf (_("CU: %s/%s:\n"), directory, file_table[0].name);
3317 printf ("%s:\n", file_table[0].name);
3319 printf (_("File name Line number Starting address\n"));
3323 /* Skip the NUL at the end of the table. */
3326 saved_linfo = linfo;
3329 /* This loop iterates through the Dwarf Line Number Program. */
3330 while (data < end_of_sequence)
3332 unsigned char op_code;
3334 unsigned long int uladv;
3335 unsigned int bytes_read;
3336 int is_special_opcode = 0;
3340 if (op_code >= linfo.li_opcode_base)
3342 op_code -= linfo.li_opcode_base;
3343 uladv = (op_code / linfo.li_line_range);
3344 if (linfo.li_max_ops_per_insn == 1)
3346 uladv *= linfo.li_min_insn_length;
3347 state_machine_regs.address += uladv;
3351 state_machine_regs.address
3352 += ((state_machine_regs.op_index + uladv)
3353 / linfo.li_max_ops_per_insn)
3354 * linfo.li_min_insn_length;
3355 state_machine_regs.op_index
3356 = (state_machine_regs.op_index + uladv)
3357 % linfo.li_max_ops_per_insn;
3360 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
3361 state_machine_regs.line += adv;
3362 is_special_opcode = 1;
3364 else switch (op_code)
3366 case DW_LNS_extended_op:
3368 unsigned int ext_op_code_len;
3369 unsigned char ext_op_code;
3370 unsigned char *op_code_data = data;
3372 ext_op_code_len = read_uleb128 (op_code_data, &bytes_read,
3374 op_code_data += bytes_read;
3376 if (ext_op_code_len == 0)
3378 warn (_("Badly formed extended line op encountered!\n"));
3381 ext_op_code_len += bytes_read;
3382 ext_op_code = *op_code_data++;
3384 switch (ext_op_code)
3386 case DW_LNE_end_sequence:
3387 reset_state_machine (linfo.li_default_is_stmt);
3389 case DW_LNE_set_address:
3390 SAFE_BYTE_GET_AND_INC (state_machine_regs.address,
3392 ext_op_code_len - bytes_read - 1,
3394 state_machine_regs.op_index = 0;
3396 case DW_LNE_define_file:
3398 file_table = (File_Entry *) xrealloc
3399 (file_table, (n_files + 1) * sizeof (File_Entry));
3401 ++state_machine_regs.last_file_entry;
3402 /* Source file name. */
3403 file_table[n_files].name = op_code_data;
3404 op_code_data += strlen ((char *) op_code_data) + 1;
3405 /* Directory index. */
3406 file_table[n_files].directory_index =
3407 read_uleb128 (op_code_data, & bytes_read,
3409 op_code_data += bytes_read;
3410 /* Last modification time. */
3411 file_table[n_files].modification_date =
3412 read_uleb128 (op_code_data, & bytes_read,
3414 op_code_data += bytes_read;
3416 file_table[n_files].length =
3417 read_uleb128 (op_code_data, & bytes_read,
3423 case DW_LNE_set_discriminator:
3424 case DW_LNE_HP_set_sequence:
3425 /* Simply ignored. */
3429 printf (_("UNKNOWN (%u): length %d\n"),
3430 ext_op_code, ext_op_code_len - bytes_read);
3433 data += ext_op_code_len;
3439 case DW_LNS_advance_pc:
3440 uladv = read_uleb128 (data, & bytes_read, end);
3442 if (linfo.li_max_ops_per_insn == 1)
3444 uladv *= linfo.li_min_insn_length;
3445 state_machine_regs.address += uladv;
3449 state_machine_regs.address
3450 += ((state_machine_regs.op_index + uladv)
3451 / linfo.li_max_ops_per_insn)
3452 * linfo.li_min_insn_length;
3453 state_machine_regs.op_index
3454 = (state_machine_regs.op_index + uladv)
3455 % linfo.li_max_ops_per_insn;
3459 case DW_LNS_advance_line:
3460 adv = read_sleb128 (data, & bytes_read, end);
3462 state_machine_regs.line += adv;
3465 case DW_LNS_set_file:
3466 adv = read_uleb128 (data, & bytes_read, end);
3468 state_machine_regs.file = adv;
3470 if (file_table == NULL)
3471 printf (_("\n [Use file table entry %d]\n"), state_machine_regs.file - 1);
3472 else if (file_table[state_machine_regs.file - 1].directory_index == 0)
3473 /* If directory index is 0, that means current directory. */
3474 printf ("\n./%s:[++]\n",
3475 file_table[state_machine_regs.file - 1].name);
3476 else if (directory_table == NULL)
3477 printf (_("\n [Use directory table entry %d]\n"),
3478 file_table[state_machine_regs.file - 1].directory_index - 1);
3480 /* The directory index starts counting at 1. */
3481 printf ("\n%s/%s:\n",
3482 directory_table[file_table[state_machine_regs.file - 1].directory_index - 1],
3483 file_table[state_machine_regs.file - 1].name);
3486 case DW_LNS_set_column:
3487 uladv = read_uleb128 (data, & bytes_read, end);
3489 state_machine_regs.column = uladv;
3492 case DW_LNS_negate_stmt:
3493 adv = state_machine_regs.is_stmt;
3495 state_machine_regs.is_stmt = adv;
3498 case DW_LNS_set_basic_block:
3499 state_machine_regs.basic_block = 1;
3502 case DW_LNS_const_add_pc:
3503 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
3504 if (linfo.li_max_ops_per_insn == 1)
3506 uladv *= linfo.li_min_insn_length;
3507 state_machine_regs.address += uladv;
3511 state_machine_regs.address
3512 += ((state_machine_regs.op_index + uladv)
3513 / linfo.li_max_ops_per_insn)
3514 * linfo.li_min_insn_length;
3515 state_machine_regs.op_index
3516 = (state_machine_regs.op_index + uladv)
3517 % linfo.li_max_ops_per_insn;
3521 case DW_LNS_fixed_advance_pc:
3522 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
3523 state_machine_regs.address += uladv;
3524 state_machine_regs.op_index = 0;
3527 case DW_LNS_set_prologue_end:
3530 case DW_LNS_set_epilogue_begin:
3533 case DW_LNS_set_isa:
3534 uladv = read_uleb128 (data, & bytes_read, end);
3536 printf (_(" Set ISA to %lu\n"), uladv);
3540 printf (_(" Unknown opcode %d with operands: "), op_code);
3542 if (standard_opcodes != NULL)
3543 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
3545 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
3547 i == 1 ? "" : ", ");
3554 /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
3555 to the DWARF address/line matrix. */
3556 if ((is_special_opcode) || (op_code == DW_LNE_end_sequence)
3557 || (op_code == DW_LNS_copy))
3559 const unsigned int MAX_FILENAME_LENGTH = 35;
3561 char *newFileName = NULL;
3562 size_t fileNameLength;
3565 fileName = (char *) file_table[state_machine_regs.file - 1].name;
3567 fileName = "<unknown>";
3569 fileNameLength = strlen (fileName);
3571 if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
3573 newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
3574 /* Truncate file name */
3575 strncpy (newFileName,
3576 fileName + fileNameLength - MAX_FILENAME_LENGTH,
3577 MAX_FILENAME_LENGTH + 1);
3581 newFileName = (char *) xmalloc (fileNameLength + 1);
3582 strncpy (newFileName, fileName, fileNameLength + 1);
3585 if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
3587 if (linfo.li_max_ops_per_insn == 1)
3588 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x\n",
3589 newFileName, state_machine_regs.line,
3590 state_machine_regs.address);
3592 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x[%d]\n",
3593 newFileName, state_machine_regs.line,
3594 state_machine_regs.address,
3595 state_machine_regs.op_index);
3599 if (linfo.li_max_ops_per_insn == 1)
3600 printf ("%s %11d %#18" DWARF_VMA_FMT "x\n",
3601 newFileName, state_machine_regs.line,
3602 state_machine_regs.address);
3604 printf ("%s %11d %#18" DWARF_VMA_FMT "x[%d]\n",
3605 newFileName, state_machine_regs.line,
3606 state_machine_regs.address,
3607 state_machine_regs.op_index);
3610 if (op_code == DW_LNE_end_sequence)
3624 if (directory_table)
3626 free (directory_table);
3627 directory_table = NULL;
3638 display_debug_lines (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
3640 unsigned char *data = section->start;
3641 unsigned char *end = data + section->size;
3643 int retValDecoded = 1;
3645 if (do_debug_lines == 0)
3646 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
3648 if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
3649 retValRaw = display_debug_lines_raw (section, data, end);
3651 if (do_debug_lines & FLAG_DEBUG_LINES_DECODED)
3652 retValDecoded = display_debug_lines_decoded (section, data, end);
3654 if (!retValRaw || !retValDecoded)
3661 find_debug_info_for_offset (unsigned long offset)
3665 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
3668 for (i = 0; i < num_debug_info_entries; i++)
3669 if (debug_information[i].cu_offset == offset)
3670 return debug_information + i;
3676 get_gdb_index_symbol_kind_name (gdb_index_symbol_kind kind)
3678 /* See gdb/gdb-index.h. */
3679 static const char * const kinds[] =
3691 return _ (kinds[kind]);
3695 display_debug_pubnames_worker (struct dwarf_section *section,
3696 void *file ATTRIBUTE_UNUSED,
3699 DWARF2_Internal_PubNames names;
3700 unsigned char *start = section->start;
3701 unsigned char *end = start + section->size;
3703 /* It does not matter if this load fails,
3704 we test for that later on. */
3705 load_debug_info (file);
3707 printf (_("Contents of the %s section:\n\n"), section->name);
3711 unsigned char *data;
3712 unsigned long offset;
3713 unsigned int offset_size, initial_length_size;
3717 SAFE_BYTE_GET_AND_INC (names.pn_length, data, 4, end);
3718 if (names.pn_length == 0xffffffff)
3720 SAFE_BYTE_GET_AND_INC (names.pn_length, data, 8, end);
3722 initial_length_size = 12;
3727 initial_length_size = 4;
3730 SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end);
3731 SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end);
3733 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
3734 && num_debug_info_entries > 0
3735 && find_debug_info_for_offset (names.pn_offset) == NULL)
3736 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
3737 (unsigned long) names.pn_offset, section->name);
3739 SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, end);
3741 /* PR 17531: file: 7615b6b2. */
3742 if ((dwarf_signed_vma) names.pn_length < 0
3743 /* PR 17531: file: a5dbeaa7. */
3744 || start + names.pn_length + initial_length_size < start)
3746 warn (_("Negative length for public name: 0x%lx\n"), (long) names.pn_length);
3750 start += names.pn_length + initial_length_size;
3752 printf (_(" Length: %ld\n"),
3753 (long) names.pn_length);
3754 printf (_(" Version: %d\n"),
3756 printf (_(" Offset into .debug_info section: 0x%lx\n"),
3757 (unsigned long) names.pn_offset);
3758 printf (_(" Size of area in .debug_info section: %ld\n"),
3759 (long) names.pn_size);
3761 if (names.pn_version != 2 && names.pn_version != 3)
3763 static int warned = 0;
3767 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
3775 printf (_("\n Offset Kind Name\n"));
3777 printf (_("\n Offset\tName\n"));
3781 bfd_size_type maxprint;
3783 SAFE_BYTE_GET (offset, data, offset_size, end);
3787 data += offset_size;
3790 maxprint = (end - data) - 1;
3794 unsigned int kind_data;
3795 gdb_index_symbol_kind kind;
3796 const char *kind_name;
3799 SAFE_BYTE_GET (kind_data, data, 1, end);
3802 /* GCC computes the kind as the upper byte in the CU index
3803 word, and then right shifts it by the CU index size.
3804 Left shift KIND to where the gdb-index.h accessor macros
3806 kind_data <<= GDB_INDEX_CU_BITSIZE;
3807 kind = GDB_INDEX_SYMBOL_KIND_VALUE (kind_data);
3808 kind_name = get_gdb_index_symbol_kind_name (kind);
3809 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (kind_data);
3810 printf (" %-6lx %s,%-10s %.*s\n",
3811 offset, is_static ? _("s") : _("g"),
3812 kind_name, (int) maxprint, data);
3815 printf (" %-6lx\t%.*s\n", offset, (int) maxprint, data);
3817 data += strnlen ((char *) data, maxprint) + 1;
3822 while (offset != 0);
3830 display_debug_pubnames (struct dwarf_section *section, void *file)
3832 return display_debug_pubnames_worker (section, file, 0);
3836 display_debug_gnu_pubnames (struct dwarf_section *section, void *file)
3838 return display_debug_pubnames_worker (section, file, 1);
3842 display_debug_macinfo (struct dwarf_section *section,
3843 void *file ATTRIBUTE_UNUSED)
3845 unsigned char *start = section->start;
3846 unsigned char *end = start + section->size;
3847 unsigned char *curr = start;
3848 unsigned int bytes_read;
3849 enum dwarf_macinfo_record_type op;
3851 printf (_("Contents of the %s section:\n\n"), section->name);
3855 unsigned int lineno;
3856 const unsigned char *string;
3858 op = (enum dwarf_macinfo_record_type) *curr;
3863 case DW_MACINFO_start_file:
3865 unsigned int filenum;
3867 lineno = read_uleb128 (curr, & bytes_read, end);
3869 filenum = read_uleb128 (curr, & bytes_read, end);
3872 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
3877 case DW_MACINFO_end_file:
3878 printf (_(" DW_MACINFO_end_file\n"));
3881 case DW_MACINFO_define:
3882 lineno = read_uleb128 (curr, & bytes_read, end);
3885 curr += strnlen ((char *) string, end - string) + 1;
3886 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
3890 case DW_MACINFO_undef:
3891 lineno = read_uleb128 (curr, & bytes_read, end);
3894 curr += strnlen ((char *) string, end - string) + 1;
3895 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
3899 case DW_MACINFO_vendor_ext:
3901 unsigned int constant;
3903 constant = read_uleb128 (curr, & bytes_read, end);
3906 curr += strnlen ((char *) string, end - string) + 1;
3907 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
3917 /* Given LINE_OFFSET into the .debug_line section, attempt to return
3918 filename and dirname corresponding to file name table entry with index
3919 FILEIDX. Return NULL on failure. */
3921 static unsigned char *
3922 get_line_filename_and_dirname (dwarf_vma line_offset,
3924 unsigned char **dir_name)
3926 struct dwarf_section *section = &debug_displays [line].section;
3927 unsigned char *hdrptr, *dirtable, *file_name;
3928 unsigned int offset_size, initial_length_size;
3929 unsigned int version, opcode_base, bytes_read;
3930 dwarf_vma length, diridx;
3931 const unsigned char * end;
3934 if (section->start == NULL
3935 || line_offset >= section->size
3939 hdrptr = section->start + line_offset;
3940 end = section->start + section->size;
3942 SAFE_BYTE_GET_AND_INC (length, hdrptr, 4, end);
3943 if (length == 0xffffffff)
3945 /* This section is 64-bit DWARF 3. */
3946 SAFE_BYTE_GET_AND_INC (length, hdrptr, 8, end);
3948 initial_length_size = 12;
3953 initial_length_size = 4;
3955 if (length + initial_length_size > section->size)
3958 SAFE_BYTE_GET_AND_INC (version, hdrptr, 2, end);
3959 if (version != 2 && version != 3 && version != 4)
3961 hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length. */
3963 hdrptr++; /* Skip max_ops_per_insn. */
3964 hdrptr += 3; /* Skip default_is_stmt, line_base, line_range. */
3966 SAFE_BYTE_GET_AND_INC (opcode_base, hdrptr, 1, end);
3967 if (opcode_base == 0)
3970 hdrptr += opcode_base - 1;
3972 /* Skip over dirname table. */
3973 while (*hdrptr != '\0')
3974 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
3975 hdrptr++; /* Skip the NUL at the end of the table. */
3976 /* Now skip over preceding filename table entries. */
3977 for (; *hdrptr != '\0' && fileidx > 1; fileidx--)
3979 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
3980 read_uleb128 (hdrptr, &bytes_read, end);
3981 hdrptr += bytes_read;
3982 read_uleb128 (hdrptr, &bytes_read, end);
3983 hdrptr += bytes_read;
3984 read_uleb128 (hdrptr, &bytes_read, end);
3985 hdrptr += bytes_read;
3987 if (hdrptr == end || *hdrptr == '\0')
3990 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
3991 diridx = read_uleb128 (hdrptr, &bytes_read, end);
3994 for (; *dirtable != '\0' && diridx > 1; diridx--)
3995 dirtable += strnlen ((char *) dirtable, end - dirtable) + 1;
3996 if (*dirtable == '\0')
3998 *dir_name = dirtable;
4003 display_debug_macro (struct dwarf_section *section,
4006 unsigned char *start = section->start;
4007 unsigned char *end = start + section->size;
4008 unsigned char *curr = start;
4009 unsigned char *extended_op_buf[256];
4010 unsigned int bytes_read;
4012 load_debug_section (str, file);
4013 load_debug_section (line, file);
4015 printf (_("Contents of the %s section:\n\n"), section->name);
4019 unsigned int lineno, version, flags;
4020 unsigned int offset_size = 4;
4021 const unsigned char *string;
4022 dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
4023 unsigned char **extended_ops = NULL;
4025 SAFE_BYTE_GET_AND_INC (version, curr, 2, end);
4028 error (_("Only GNU extension to DWARF 4 of %s is currently supported.\n"),
4033 SAFE_BYTE_GET_AND_INC (flags, curr, 1, end);
4036 printf (_(" Offset: 0x%lx\n"),
4037 (unsigned long) sec_offset);
4038 printf (_(" Version: %d\n"), version);
4039 printf (_(" Offset size: %d\n"), offset_size);
4042 SAFE_BYTE_GET_AND_INC (line_offset, curr, offset_size, end);
4043 printf (_(" Offset into .debug_line: 0x%lx\n"),
4044 (unsigned long) line_offset);
4048 unsigned int i, count, op;
4051 SAFE_BYTE_GET_AND_INC (count, curr, 1, end);
4053 memset (extended_op_buf, 0, sizeof (extended_op_buf));
4054 extended_ops = extended_op_buf;
4057 printf (_(" Extension opcode arguments:\n"));
4058 for (i = 0; i < count; i++)
4060 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
4061 extended_ops[op] = curr;
4062 nargs = read_uleb128 (curr, &bytes_read, end);
4065 printf (_(" DW_MACRO_GNU_%02x has no arguments\n"), op);
4068 printf (_(" DW_MACRO_GNU_%02x arguments: "), op);
4069 for (n = 0; n < nargs; n++)
4073 SAFE_BYTE_GET_AND_INC (form, curr, 1, end);
4074 printf ("%s%s", get_FORM_name (form),
4075 n == nargs - 1 ? "\n" : ", ");
4085 case DW_FORM_block1:
4086 case DW_FORM_block2:
4087 case DW_FORM_block4:
4089 case DW_FORM_string:
4091 case DW_FORM_sec_offset:
4094 error (_("Invalid extension opcode form %s\n"),
4095 get_FORM_name (form));
4111 error (_(".debug_macro section not zero terminated\n"));
4115 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
4121 case DW_MACRO_GNU_start_file:
4123 unsigned int filenum;
4124 unsigned char *file_name = NULL, *dir_name = NULL;
4126 lineno = read_uleb128 (curr, &bytes_read, end);
4128 filenum = read_uleb128 (curr, &bytes_read, end);
4131 if ((flags & 2) == 0)
4132 error (_("DW_MACRO_GNU_start_file used, but no .debug_line offset provided.\n"));
4135 = get_line_filename_and_dirname (line_offset, filenum,
4137 if (file_name == NULL)
4138 printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d\n"),
4141 printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
4143 dir_name != NULL ? (const char *) dir_name : "",
4144 dir_name != NULL ? "/" : "", file_name);
4148 case DW_MACRO_GNU_end_file:
4149 printf (_(" DW_MACRO_GNU_end_file\n"));
4152 case DW_MACRO_GNU_define:
4153 lineno = read_uleb128 (curr, &bytes_read, end);
4156 curr += strnlen ((char *) string, end - string) + 1;
4157 printf (_(" DW_MACRO_GNU_define - lineno : %d macro : %s\n"),
4161 case DW_MACRO_GNU_undef:
4162 lineno = read_uleb128 (curr, &bytes_read, end);
4165 curr += strnlen ((char *) string, end - string) + 1;
4166 printf (_(" DW_MACRO_GNU_undef - lineno : %d macro : %s\n"),
4170 case DW_MACRO_GNU_define_indirect:
4171 lineno = read_uleb128 (curr, &bytes_read, end);
4173 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4174 string = fetch_indirect_string (offset);
4175 printf (_(" DW_MACRO_GNU_define_indirect - lineno : %d macro : %s\n"),
4179 case DW_MACRO_GNU_undef_indirect:
4180 lineno = read_uleb128 (curr, &bytes_read, end);
4182 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4183 string = fetch_indirect_string (offset);
4184 printf (_(" DW_MACRO_GNU_undef_indirect - lineno : %d macro : %s\n"),
4188 case DW_MACRO_GNU_transparent_include:
4189 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4190 printf (_(" DW_MACRO_GNU_transparent_include - offset : 0x%lx\n"),
4191 (unsigned long) offset);
4194 case DW_MACRO_GNU_define_indirect_alt:
4195 lineno = read_uleb128 (curr, &bytes_read, end);
4197 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4198 printf (_(" DW_MACRO_GNU_define_indirect_alt - lineno : %d macro offset : 0x%lx\n"),
4199 lineno, (unsigned long) offset);
4202 case DW_MACRO_GNU_undef_indirect_alt:
4203 lineno = read_uleb128 (curr, &bytes_read, end);
4205 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4206 printf (_(" DW_MACRO_GNU_undef_indirect_alt - lineno : %d macro offset : 0x%lx\n"),
4207 lineno, (unsigned long) offset);
4210 case DW_MACRO_GNU_transparent_include_alt:
4211 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4212 printf (_(" DW_MACRO_GNU_transparent_include_alt - offset : 0x%lx\n"),
4213 (unsigned long) offset);
4217 if (extended_ops == NULL || extended_ops[op] == NULL)
4219 error (_(" Unknown macro opcode %02x seen\n"), op);
4224 /* Skip over unhandled opcodes. */
4226 unsigned char *desc = extended_ops[op];
4227 nargs = read_uleb128 (desc, &bytes_read, end);
4231 printf (_(" DW_MACRO_GNU_%02x\n"), op);
4234 printf (_(" DW_MACRO_GNU_%02x -"), op);
4235 for (n = 0; n < nargs; n++)
4239 SAFE_BYTE_GET_AND_INC (val, desc, 1, end);
4241 = read_and_display_attr_value (0, val,
4242 curr, end, 0, 0, offset_size,
4243 version, NULL, 0, NULL,
4261 display_debug_abbrev (struct dwarf_section *section,
4262 void *file ATTRIBUTE_UNUSED)
4264 abbrev_entry *entry;
4265 unsigned char *start = section->start;
4266 unsigned char *end = start + section->size;
4268 printf (_("Contents of the %s section:\n\n"), section->name);
4272 unsigned char *last;
4277 start = process_abbrev_section (start, end);
4279 if (first_abbrev == NULL)
4282 printf (_(" Number TAG (0x%lx)\n"), (long) (last - section->start));
4284 for (entry = first_abbrev; entry; entry = entry->next)
4288 printf (" %ld %s [%s]\n",
4290 get_TAG_name (entry->tag),
4291 entry->children ? _("has children") : _("no children"));
4293 for (attr = entry->first_attr; attr; attr = attr->next)
4294 printf (" %-18s %s\n",
4295 get_AT_name (attr->attribute),
4296 get_FORM_name (attr->form));
4306 /* Display a location list from a normal (ie, non-dwo) .debug_loc section. */
4309 display_loc_list (struct dwarf_section *section,
4310 unsigned char **start_ptr,
4311 unsigned int debug_info_entry,
4312 unsigned long offset,
4313 unsigned long base_address,
4316 unsigned char *start = *start_ptr;
4317 unsigned char *section_end = section->start + section->size;
4318 unsigned long cu_offset;
4319 unsigned int pointer_size;
4320 unsigned int offset_size;
4325 unsigned short length;
4326 int need_frame_base;
4328 if (debug_info_entry >= num_debug_info_entries)
4330 warn (_("No debug information available for loc lists of entry: %u\n"),
4335 cu_offset = debug_information [debug_info_entry].cu_offset;
4336 pointer_size = debug_information [debug_info_entry].pointer_size;
4337 offset_size = debug_information [debug_info_entry].offset_size;
4338 dwarf_version = debug_information [debug_info_entry].dwarf_version;
4340 if (pointer_size < 2 || pointer_size > 8)
4342 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
4343 pointer_size, debug_info_entry);
4349 if (start + 2 * pointer_size > section_end)
4351 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4356 printf (" %8.8lx ", offset + (start - *start_ptr));
4358 /* Note: we use sign extension here in order to be sure that we can detect
4359 the -1 escape value. Sign extension into the top 32 bits of a 32-bit
4360 address will not affect the values that we display since we always show
4361 hex values, and always the bottom 32-bits. */
4362 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
4363 SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
4365 if (begin == 0 && end == 0)
4367 printf (_("<End of list>\n"));
4371 /* Check base address specifiers. */
4372 if (begin == (dwarf_vma) -1 && end != (dwarf_vma) -1)
4375 print_dwarf_vma (begin, pointer_size);
4376 print_dwarf_vma (end, pointer_size);
4377 printf (_("(base address)\n"));
4381 if (start + 2 > section_end)
4383 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4388 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
4390 if (start + length > section_end)
4392 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4397 print_dwarf_vma (begin + base_address, pointer_size);
4398 print_dwarf_vma (end + base_address, pointer_size);
4401 need_frame_base = decode_location_expression (start,
4406 cu_offset, section);
4409 if (need_frame_base && !has_frame_base)
4410 printf (_(" [without DW_AT_frame_base]"));
4413 fputs (_(" (start == end)"), stdout);
4414 else if (begin > end)
4415 fputs (_(" (start > end)"), stdout);
4425 /* Print a .debug_addr table index in decimal, surrounded by square brackets,
4426 right-adjusted in a field of length LEN, and followed by a space. */
4429 print_addr_index (unsigned int idx, unsigned int len)
4431 static char buf[15];
4432 snprintf (buf, sizeof (buf), "[%d]", idx);
4433 printf ("%*s ", len, buf);
4436 /* Display a location list from a .dwo section. It uses address indexes rather
4437 than embedded addresses. This code closely follows display_loc_list, but the
4438 two are sufficiently different that combining things is very ugly. */
4441 display_loc_list_dwo (struct dwarf_section *section,
4442 unsigned char **start_ptr,
4443 unsigned int debug_info_entry,
4444 unsigned long offset,
4447 unsigned char *start = *start_ptr;
4448 unsigned char *section_end = section->start + section->size;
4449 unsigned long cu_offset;
4450 unsigned int pointer_size;
4451 unsigned int offset_size;
4454 unsigned short length;
4455 int need_frame_base;
4457 unsigned int bytes_read;
4459 if (debug_info_entry >= num_debug_info_entries)
4461 warn (_("No debug information for loc lists of entry: %u\n"),
4466 cu_offset = debug_information [debug_info_entry].cu_offset;
4467 pointer_size = debug_information [debug_info_entry].pointer_size;
4468 offset_size = debug_information [debug_info_entry].offset_size;
4469 dwarf_version = debug_information [debug_info_entry].dwarf_version;
4471 if (pointer_size < 2 || pointer_size > 8)
4473 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
4474 pointer_size, debug_info_entry);
4480 printf (" %8.8lx ", offset + (start - *start_ptr));
4482 if (start >= section_end)
4484 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4489 SAFE_BYTE_GET_AND_INC (entry_type, start, 1, section_end);
4492 case 0: /* A terminating entry. */
4494 printf (_("<End of list>\n"));
4496 case 1: /* A base-address entry. */
4497 idx = read_uleb128 (start, &bytes_read, section_end);
4498 start += bytes_read;
4499 print_addr_index (idx, 8);
4501 printf (_("(base address selection entry)\n"));
4503 case 2: /* A start/end entry. */
4504 idx = read_uleb128 (start, &bytes_read, section_end);
4505 start += bytes_read;
4506 print_addr_index (idx, 8);
4507 idx = read_uleb128 (start, &bytes_read, section_end);
4508 start += bytes_read;
4509 print_addr_index (idx, 8);
4511 case 3: /* A start/length entry. */
4512 idx = read_uleb128 (start, &bytes_read, section_end);
4513 start += bytes_read;
4514 print_addr_index (idx, 8);
4515 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4516 printf ("%08x ", idx);
4518 case 4: /* An offset pair entry. */
4519 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4520 printf ("%08x ", idx);
4521 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4522 printf ("%08x ", idx);
4525 warn (_("Unknown location list entry type 0x%x.\n"), entry_type);
4530 if (start + 2 > section_end)
4532 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4537 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
4538 if (start + length > section_end)
4540 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4546 need_frame_base = decode_location_expression (start,
4551 cu_offset, section);
4554 if (need_frame_base && !has_frame_base)
4555 printf (_(" [without DW_AT_frame_base]"));
4565 /* Sort array of indexes in ascending order of loc_offsets[idx]. */
4567 static dwarf_vma *loc_offsets;
4570 loc_offsets_compar (const void *ap, const void *bp)
4572 dwarf_vma a = loc_offsets[*(const unsigned int *) ap];
4573 dwarf_vma b = loc_offsets[*(const unsigned int *) bp];
4575 return (a > b) - (b > a);
4579 display_debug_loc (struct dwarf_section *section, void *file)
4581 unsigned char *start = section->start;
4582 unsigned long bytes;
4583 unsigned char *section_begin = start;
4584 unsigned int num_loc_list = 0;
4585 unsigned long last_offset = 0;
4586 unsigned int first = 0;
4590 int seen_first_offset = 0;
4591 int locs_sorted = 1;
4592 unsigned char *next;
4593 unsigned int *array = NULL;
4594 const char *suffix = strrchr (section->name, '.');
4597 if (suffix && strcmp (suffix, ".dwo") == 0)
4600 bytes = section->size;
4604 printf (_("\nThe %s section is empty.\n"), section->name);
4608 if (load_debug_info (file) == 0)
4610 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
4615 /* Check the order of location list in .debug_info section. If
4616 offsets of location lists are in the ascending order, we can
4617 use `debug_information' directly. */
4618 for (i = 0; i < num_debug_info_entries; i++)
4622 num = debug_information [i].num_loc_offsets;
4623 if (num > num_loc_list)
4626 /* Check if we can use `debug_information' directly. */
4627 if (locs_sorted && num != 0)
4629 if (!seen_first_offset)
4631 /* This is the first location list. */
4632 last_offset = debug_information [i].loc_offsets [0];
4634 seen_first_offset = 1;
4640 for (; j < num; j++)
4643 debug_information [i].loc_offsets [j])
4648 last_offset = debug_information [i].loc_offsets [j];
4653 if (!seen_first_offset)
4654 error (_("No location lists in .debug_info section!\n"));
4656 if (debug_information [first].num_loc_offsets > 0
4657 && debug_information [first].loc_offsets [0] != 0)
4658 warn (_("Location lists in %s section start at 0x%s\n"),
4660 dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]));
4663 array = (unsigned int *) xcmalloc (num_loc_list, sizeof (unsigned int));
4664 printf (_("Contents of the %s section:\n\n"), section->name);
4665 printf (_(" Offset Begin End Expression\n"));
4667 seen_first_offset = 0;
4668 for (i = first; i < num_debug_info_entries; i++)
4670 unsigned long offset;
4671 unsigned long base_address;
4676 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
4678 loc_offsets = debug_information [i].loc_offsets;
4679 qsort (array, debug_information [i].num_loc_offsets,
4680 sizeof (*array), loc_offsets_compar);
4683 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
4685 j = locs_sorted ? k : array[k];
4687 && debug_information [i].loc_offsets [locs_sorted
4688 ? k - 1 : array [k - 1]]
4689 == debug_information [i].loc_offsets [j])
4691 has_frame_base = debug_information [i].have_frame_base [j];
4692 offset = debug_information [i].loc_offsets [j];
4693 next = section_begin + offset;
4694 base_address = debug_information [i].base_address;
4696 if (!seen_first_offset)
4697 seen_first_offset = 1;
4701 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
4702 (unsigned long) (start - section_begin),
4703 (unsigned long) (next - section_begin));
4704 else if (start > next)
4705 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
4706 (unsigned long) (start - section_begin),
4707 (unsigned long) (next - section_begin));
4711 if (offset >= bytes)
4713 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
4719 display_loc_list_dwo (section, &start, i, offset, has_frame_base);
4721 display_loc_list (section, &start, i, offset, base_address,
4726 if (start < section->start + section->size)
4727 warn (_("There are %ld unused bytes at the end of section %s\n"),
4728 (long) (section->start + section->size - start), section->name);
4735 display_debug_str (struct dwarf_section *section,
4736 void *file ATTRIBUTE_UNUSED)
4738 unsigned char *start = section->start;
4739 unsigned long bytes = section->size;
4740 dwarf_vma addr = section->address;
4744 printf (_("\nThe %s section is empty.\n"), section->name);
4748 printf (_("Contents of the %s section:\n\n"), section->name);
4756 lbytes = (bytes > 16 ? 16 : bytes);
4758 printf (" 0x%8.8lx ", (unsigned long) addr);
4760 for (j = 0; j < 16; j++)
4763 printf ("%2.2x", start[j]);
4771 for (j = 0; j < lbytes; j++)
4774 if (k >= ' ' && k < 0x80)
4793 display_debug_info (struct dwarf_section *section, void *file)
4795 return process_debug_info (section, file, section->abbrev_sec, 0, 0);
4799 display_debug_types (struct dwarf_section *section, void *file)
4801 return process_debug_info (section, file, section->abbrev_sec, 0, 1);
4805 display_trace_info (struct dwarf_section *section, void *file)
4807 return process_debug_info (section, file, section->abbrev_sec, 0, 0);
4811 display_debug_aranges (struct dwarf_section *section,
4812 void *file ATTRIBUTE_UNUSED)
4814 unsigned char *start = section->start;
4815 unsigned char *end = start + section->size;
4817 printf (_("Contents of the %s section:\n\n"), section->name);
4819 /* It does not matter if this load fails,
4820 we test for that later on. */
4821 load_debug_info (file);
4825 unsigned char *hdrptr;
4826 DWARF2_Internal_ARange arange;
4827 unsigned char *addr_ranges;
4830 unsigned char address_size;
4832 unsigned int offset_size;
4833 unsigned int initial_length_size;
4837 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 4, end);
4838 if (arange.ar_length == 0xffffffff)
4840 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 8, end);
4842 initial_length_size = 12;
4847 initial_length_size = 4;
4850 SAFE_BYTE_GET_AND_INC (arange.ar_version, hdrptr, 2, end);
4851 SAFE_BYTE_GET_AND_INC (arange.ar_info_offset, hdrptr, offset_size, end);
4853 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
4854 && num_debug_info_entries > 0
4855 && find_debug_info_for_offset (arange.ar_info_offset) == NULL)
4856 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
4857 (unsigned long) arange.ar_info_offset, section->name);
4859 SAFE_BYTE_GET_AND_INC (arange.ar_pointer_size, hdrptr, 1, end);
4860 SAFE_BYTE_GET_AND_INC (arange.ar_segment_size, hdrptr, 1, end);
4862 if (arange.ar_version != 2 && arange.ar_version != 3)
4864 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
4868 printf (_(" Length: %ld\n"),
4869 (long) arange.ar_length);
4870 printf (_(" Version: %d\n"), arange.ar_version);
4871 printf (_(" Offset into .debug_info: 0x%lx\n"),
4872 (unsigned long) arange.ar_info_offset);
4873 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
4874 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
4876 address_size = arange.ar_pointer_size + arange.ar_segment_size;
4878 /* PR 17512: file: 001-108546-0.001:0.1. */
4879 if (address_size == 0 || address_size > 8)
4881 error (_("Invalid address size in %s section!\n"),
4886 /* The DWARF spec does not require that the address size be a power
4887 of two, but we do. This will have to change if we ever encounter
4888 an uneven architecture. */
4889 if ((address_size & (address_size - 1)) != 0)
4891 warn (_("Pointer size + Segment size is not a power of two.\n"));
4895 if (address_size > 4)
4896 printf (_("\n Address Length\n"));
4898 printf (_("\n Address Length\n"));
4900 addr_ranges = hdrptr;
4902 /* Must pad to an alignment boundary that is twice the address size. */
4903 excess = (hdrptr - start) % (2 * address_size);
4905 addr_ranges += (2 * address_size) - excess;
4907 start += arange.ar_length + initial_length_size;
4909 while (addr_ranges + 2 * address_size <= start)
4911 SAFE_BYTE_GET_AND_INC (address, addr_ranges, address_size, end);
4912 SAFE_BYTE_GET_AND_INC (length, addr_ranges, address_size, end);
4915 print_dwarf_vma (address, address_size);
4916 print_dwarf_vma (length, address_size);
4926 /* Comparison function for qsort. */
4928 comp_addr_base (const void * v0, const void * v1)
4930 debug_info * info0 = (debug_info *) v0;
4931 debug_info * info1 = (debug_info *) v1;
4932 return info0->addr_base - info1->addr_base;
4935 /* Display the debug_addr section. */
4937 display_debug_addr (struct dwarf_section *section,
4940 debug_info **debug_addr_info;
4941 unsigned char *entry;
4946 if (section->size == 0)
4948 printf (_("\nThe %s section is empty.\n"), section->name);
4952 if (load_debug_info (file) == 0)
4954 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
4959 printf (_("Contents of the %s section:\n\n"), section->name);
4961 /* PR 17531: file: cf38d01b.
4962 We use xcalloc because a corrupt file may not have initialised all of the
4963 fields in the debug_info structure, which means that the sort below might
4964 try to move uninitialised data. */
4965 debug_addr_info = (debug_info **) xcalloc ((num_debug_info_entries + 1),
4966 sizeof (debug_info *));
4969 for (i = 0; i < num_debug_info_entries; i++)
4970 if (debug_information [i].addr_base != DEBUG_INFO_UNAVAILABLE)
4972 /* PR 17531: file: cf38d01b. */
4973 if (debug_information[i].addr_base >= section->size)
4974 warn (_("Corrupt address base (%lx) found in debug section %u\n"),
4975 (unsigned long) debug_information[i].addr_base, i);
4977 debug_addr_info [count++] = debug_information + i;
4980 /* Add a sentinel to make iteration convenient. */
4981 debug_addr_info [count] = (debug_info *) xmalloc (sizeof (debug_info));
4982 debug_addr_info [count]->addr_base = section->size;
4983 qsort (debug_addr_info, count, sizeof (debug_info *), comp_addr_base);
4985 for (i = 0; i < count; i++)
4988 unsigned int address_size = debug_addr_info [i]->pointer_size;
4990 printf (_(" For compilation unit at offset 0x%s:\n"),
4991 dwarf_vmatoa ("x", debug_addr_info [i]->cu_offset));
4993 printf (_("\tIndex\tAddress\n"));
4994 entry = section->start + debug_addr_info [i]->addr_base;
4995 end = section->start + debug_addr_info [i + 1]->addr_base;
4999 dwarf_vma base = byte_get (entry, address_size);
5000 printf (_("\t%d:\t"), idx);
5001 print_dwarf_vma (base, address_size);
5003 entry += address_size;
5009 free (debug_addr_info);
5013 /* Display the .debug_str_offsets and .debug_str_offsets.dwo sections. */
5015 display_debug_str_offsets (struct dwarf_section *section,
5016 void *file ATTRIBUTE_UNUSED)
5018 if (section->size == 0)
5020 printf (_("\nThe %s section is empty.\n"), section->name);
5023 /* TODO: Dump the contents. This is made somewhat difficult by not knowing
5024 what the offset size is for this section. */
5028 /* Each debug_information[x].range_lists[y] gets this representation for
5029 sorting purposes. */
5033 /* The debug_information[x].range_lists[y] value. */
5034 unsigned long ranges_offset;
5036 /* Original debug_information to find parameters of the data. */
5037 debug_info *debug_info_p;
5040 /* Sort struct range_entry in ascending order of its RANGES_OFFSET. */
5043 range_entry_compar (const void *ap, const void *bp)
5045 const struct range_entry *a_re = (const struct range_entry *) ap;
5046 const struct range_entry *b_re = (const struct range_entry *) bp;
5047 const unsigned long a = a_re->ranges_offset;
5048 const unsigned long b = b_re->ranges_offset;
5050 return (a > b) - (b > a);
5054 display_debug_ranges (struct dwarf_section *section,
5055 void *file ATTRIBUTE_UNUSED)
5057 unsigned char *start = section->start;
5058 unsigned char *last_start = start;
5059 unsigned long bytes = section->size;
5060 unsigned char *section_begin = start;
5061 unsigned char *finish = start + bytes;
5062 unsigned int num_range_list, i;
5063 struct range_entry *range_entries, *range_entry_fill;
5067 printf (_("\nThe %s section is empty.\n"), section->name);
5071 if (load_debug_info (file) == 0)
5073 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
5079 for (i = 0; i < num_debug_info_entries; i++)
5080 num_range_list += debug_information [i].num_range_lists;
5082 if (num_range_list == 0)
5084 /* This can happen when the file was compiled with -gsplit-debug
5085 which removes references to range lists from the primary .o file. */
5086 printf (_("No range lists in .debug_info section.\n"));
5090 range_entries = (struct range_entry *)
5091 xmalloc (sizeof (*range_entries) * num_range_list);
5092 range_entry_fill = range_entries;
5094 for (i = 0; i < num_debug_info_entries; i++)
5096 debug_info *debug_info_p = &debug_information[i];
5099 for (j = 0; j < debug_info_p->num_range_lists; j++)
5101 range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
5102 range_entry_fill->debug_info_p = debug_info_p;
5107 qsort (range_entries, num_range_list, sizeof (*range_entries),
5108 range_entry_compar);
5110 if (dwarf_check != 0 && range_entries[0].ranges_offset != 0)
5111 warn (_("Range lists in %s section start at 0x%lx\n"),
5112 section->name, range_entries[0].ranges_offset);
5114 printf (_("Contents of the %s section:\n\n"), section->name);
5115 printf (_(" Offset Begin End\n"));
5117 for (i = 0; i < num_range_list; i++)
5119 struct range_entry *range_entry = &range_entries[i];
5120 debug_info *debug_info_p = range_entry->debug_info_p;
5121 unsigned int pointer_size;
5122 unsigned long offset;
5123 unsigned char *next;
5124 unsigned long base_address;
5126 pointer_size = debug_info_p->pointer_size;
5127 offset = range_entry->ranges_offset;
5128 next = section_begin + offset;
5129 base_address = debug_info_p->base_address;
5131 /* PR 17512: file: 001-101485-0.001:0.1. */
5132 if (pointer_size < 2 || pointer_size > 8)
5134 warn (_("Corrupt pointer size (%d) in debug entry at offset %8.8lx\n"),
5135 pointer_size, offset);
5139 if (dwarf_check != 0 && i > 0)
5142 warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
5143 (unsigned long) (start - section_begin),
5144 (unsigned long) (next - section_begin), section->name);
5145 else if (start > next)
5147 if (next == last_start)
5149 warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
5150 (unsigned long) (start - section_begin),
5151 (unsigned long) (next - section_begin), section->name);
5157 while (start < finish)
5162 /* Note: we use sign extension here in order to be sure that
5163 we can detect the -1 escape value. Sign extension into the
5164 top 32 bits of a 32-bit address will not affect the values
5165 that we display since we always show hex values, and always
5166 the bottom 32-bits. */
5167 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
5168 if (start >= finish)
5170 SAFE_SIGNED_BYTE_GET_AND_INC (end, start, pointer_size, finish);
5172 printf (" %8.8lx ", offset);
5174 if (begin == 0 && end == 0)
5176 printf (_("<End of list>\n"));
5180 /* Check base address specifiers. */
5181 if (begin == (dwarf_vma) -1 && end != (dwarf_vma) -1)
5184 print_dwarf_vma (begin, pointer_size);
5185 print_dwarf_vma (end, pointer_size);
5186 printf ("(base address)\n");
5190 print_dwarf_vma (begin + base_address, pointer_size);
5191 print_dwarf_vma (end + base_address, pointer_size);
5194 fputs (_("(start == end)"), stdout);
5195 else if (begin > end)
5196 fputs (_("(start > end)"), stdout);
5203 free (range_entries);
5208 typedef struct Frame_Chunk
5210 struct Frame_Chunk *next;
5211 unsigned char *chunk_start;
5213 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
5214 short int *col_type;
5217 unsigned int code_factor;
5224 unsigned char fde_encoding;
5225 unsigned char cfa_exp;
5226 unsigned char ptr_size;
5227 unsigned char segment_size;
5231 static const char *const *dwarf_regnames;
5232 static unsigned int dwarf_regnames_count;
5234 /* A marker for a col_type that means this column was never referenced
5235 in the frame info. */
5236 #define DW_CFA_unreferenced (-1)
5238 /* Return 0 if no more space is needed, 1 if more space is needed,
5239 -1 for invalid reg. */
5242 frame_need_space (Frame_Chunk *fc, unsigned int reg)
5244 unsigned int prev = fc->ncols;
5246 if (reg < (unsigned int) fc->ncols)
5249 if (dwarf_regnames_count
5250 && reg > dwarf_regnames_count)
5253 fc->ncols = reg + 1;
5254 /* PR 17512: file: 10450-2643-0.004.
5255 If reg == -1 then this can happen... */
5259 /* PR 17512: file: 2844a11d. */
5260 if (fc->ncols > 1024)
5262 error (_("Unfeasibly large register number: %u\n"), reg);
5264 /* FIXME: 1024 is an arbitrary limit. Increase it if
5265 we ever encounter a valid binary that exceeds it. */
5269 fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
5270 sizeof (short int));
5271 fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
5272 /* PR 17512: file:002-10025-0.005. */
5273 if (fc->col_type == NULL || fc->col_offset == NULL)
5275 error (_("Out of memory allocating %u columns in dwarf frame arrays\n"),
5281 while (prev < fc->ncols)
5283 fc->col_type[prev] = DW_CFA_unreferenced;
5284 fc->col_offset[prev] = 0;
5290 static const char *const dwarf_regnames_i386[] =
5292 "eax", "ecx", "edx", "ebx", /* 0 - 3 */
5293 "esp", "ebp", "esi", "edi", /* 4 - 7 */
5294 "eip", "eflags", NULL, /* 8 - 10 */
5295 "st0", "st1", "st2", "st3", /* 11 - 14 */
5296 "st4", "st5", "st6", "st7", /* 15 - 18 */
5297 NULL, NULL, /* 19 - 20 */
5298 "xmm0", "xmm1", "xmm2", "xmm3", /* 21 - 24 */
5299 "xmm4", "xmm5", "xmm6", "xmm7", /* 25 - 28 */
5300 "mm0", "mm1", "mm2", "mm3", /* 29 - 32 */
5301 "mm4", "mm5", "mm6", "mm7", /* 33 - 36 */
5302 "fcw", "fsw", "mxcsr", /* 37 - 39 */
5303 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47 */
5304 "tr", "ldtr", /* 48 - 49 */
5305 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57 */
5306 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65 */
5307 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73 */
5308 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81 */
5309 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89 */
5310 NULL, NULL, NULL, /* 90 - 92 */
5311 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7" /* 93 - 100 */
5315 init_dwarf_regnames_i386 (void)
5317 dwarf_regnames = dwarf_regnames_i386;
5318 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
5321 static const char *const dwarf_regnames_x86_64[] =
5323 "rax", "rdx", "rcx", "rbx",
5324 "rsi", "rdi", "rbp", "rsp",
5325 "r8", "r9", "r10", "r11",
5326 "r12", "r13", "r14", "r15",
5328 "xmm0", "xmm1", "xmm2", "xmm3",
5329 "xmm4", "xmm5", "xmm6", "xmm7",
5330 "xmm8", "xmm9", "xmm10", "xmm11",
5331 "xmm12", "xmm13", "xmm14", "xmm15",
5332 "st0", "st1", "st2", "st3",
5333 "st4", "st5", "st6", "st7",
5334 "mm0", "mm1", "mm2", "mm3",
5335 "mm4", "mm5", "mm6", "mm7",
5337 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
5338 "fs.base", "gs.base", NULL, NULL,
5340 "mxcsr", "fcw", "fsw",
5341 "xmm16", "xmm17", "xmm18", "xmm19",
5342 "xmm20", "xmm21", "xmm22", "xmm23",
5343 "xmm24", "xmm25", "xmm26", "xmm27",
5344 "xmm28", "xmm29", "xmm30", "xmm31",
5345 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 83 - 90 */
5346 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 91 - 98 */
5347 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 99 - 106 */
5348 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 107 - 114 */
5349 NULL, NULL, NULL, /* 115 - 117 */
5350 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
5354 init_dwarf_regnames_x86_64 (void)
5356 dwarf_regnames = dwarf_regnames_x86_64;
5357 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
5360 static const char *const dwarf_regnames_aarch64[] =
5362 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
5363 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
5364 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
5365 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp",
5366 NULL, "elr", NULL, NULL, NULL, NULL, NULL, NULL,
5367 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5368 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5369 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5370 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
5371 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
5372 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
5373 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
5377 init_dwarf_regnames_aarch64 (void)
5379 dwarf_regnames = dwarf_regnames_aarch64;
5380 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_aarch64);
5384 init_dwarf_regnames (unsigned int e_machine)
5390 init_dwarf_regnames_i386 ();
5396 init_dwarf_regnames_x86_64 ();
5400 init_dwarf_regnames_aarch64 ();
5409 regname (unsigned int regno, int row)
5411 static char reg[64];
5413 && regno < dwarf_regnames_count
5414 && dwarf_regnames [regno] != NULL)
5417 return dwarf_regnames [regno];
5418 snprintf (reg, sizeof (reg), "r%d (%s)", regno,
5419 dwarf_regnames [regno]);
5422 snprintf (reg, sizeof (reg), "r%d", regno);
5427 frame_display_row (Frame_Chunk *fc, int *need_col_headers, unsigned int *max_regs)
5432 if (*max_regs < fc->ncols)
5433 *max_regs = fc->ncols;
5435 if (*need_col_headers)
5437 static const char *sloc = " LOC";
5439 *need_col_headers = 0;
5441 printf ("%-*s CFA ", eh_addr_size * 2, sloc);
5443 for (r = 0; r < *max_regs; r++)
5444 if (fc->col_type[r] != DW_CFA_unreferenced)
5449 printf ("%-5s ", regname (r, 1));
5455 print_dwarf_vma (fc->pc_begin, eh_addr_size);
5457 strcpy (tmp, "exp");
5459 sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), fc->cfa_offset);
5460 printf ("%-8s ", tmp);
5462 for (r = 0; r < fc->ncols; r++)
5464 if (fc->col_type[r] != DW_CFA_unreferenced)
5466 switch (fc->col_type[r])
5468 case DW_CFA_undefined:
5471 case DW_CFA_same_value:
5475 sprintf (tmp, "c%+d", fc->col_offset[r]);
5477 case DW_CFA_val_offset:
5478 sprintf (tmp, "v%+d", fc->col_offset[r]);
5480 case DW_CFA_register:
5481 sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
5483 case DW_CFA_expression:
5484 strcpy (tmp, "exp");
5486 case DW_CFA_val_expression:
5487 strcpy (tmp, "vexp");
5490 strcpy (tmp, "n/a");
5493 printf ("%-5s ", tmp);
5499 #define GET(VAR, N) SAFE_BYTE_GET_AND_INC (VAR, start, N, end)
5500 #define LEB() read_uleb128 (start, & length_return, end); start += length_return
5501 #define SLEB() read_sleb128 (start, & length_return, end); start += length_return
5503 static unsigned char *
5504 read_cie (unsigned char *start, unsigned char *end,
5505 Frame_Chunk **p_cie, int *p_version,
5506 unsigned long *p_aug_len, unsigned char **p_aug)
5510 unsigned int length_return;
5511 unsigned char *augmentation_data = NULL;
5512 unsigned long augmentation_data_len = 0;
5515 /* PR 17512: file: 001-228113-0.004. */
5519 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
5520 memset (fc, 0, sizeof (Frame_Chunk));
5522 fc->col_type = (short int *) xmalloc (sizeof (short int));
5523 fc->col_offset = (int *) xmalloc (sizeof (int));
5527 fc->augmentation = (char *) start;
5528 /* PR 17512: file: 001-228113-0.004.
5529 Skip past augmentation name, but avoid running off the end of the data. */
5531 if (* start ++ == '\0')
5535 warn (_("No terminator for augmentation name\n"));
5539 if (strcmp (fc->augmentation, "eh") == 0)
5540 start += eh_addr_size;
5544 GET (fc->ptr_size, 1);
5545 GET (fc->segment_size, 1);
5546 eh_addr_size = fc->ptr_size;
5550 fc->ptr_size = eh_addr_size;
5551 fc->segment_size = 0;
5553 fc->code_factor = LEB ();
5554 fc->data_factor = SLEB ();
5564 if (fc->augmentation[0] == 'z')
5566 augmentation_data_len = LEB ();
5567 augmentation_data = start;
5568 start += augmentation_data_len;
5569 /* PR 17512: file: 11042-2589-0.004. */
5572 warn (_("Augmentation data too long: 0x%lx\n"), augmentation_data_len);
5577 if (augmentation_data_len)
5581 unsigned char *qend;
5583 p = (unsigned char *) fc->augmentation + 1;
5584 q = augmentation_data;
5585 qend = q + augmentation_data_len;
5587 /* PR 17531: file: 015adfaa. */
5590 warn (_("Negative augmentation data length: 0x%lx"), augmentation_data_len);
5591 augmentation_data_len = 0;
5594 while (p < end && q < augmentation_data + augmentation_data_len)
5599 q += 1 + size_of_encoded_value (*q);
5601 fc->fde_encoding = *q++;
5608 /* Note - it is OK if this loop terminates with q < qend.
5609 Padding may have been inserted to align the end of the CIE. */
5614 *p_version = version;
5617 *p_aug_len = augmentation_data_len;
5618 *p_aug = augmentation_data;
5624 display_debug_frames (struct dwarf_section *section,
5625 void *file ATTRIBUTE_UNUSED)
5627 unsigned char *start = section->start;
5628 unsigned char *end = start + section->size;
5629 unsigned char *section_start = start;
5630 Frame_Chunk *chunks = 0, *forward_refs = 0;
5631 Frame_Chunk *remembered_state = 0;
5633 int is_eh = strcmp (section->name, ".eh_frame") == 0;
5634 unsigned int length_return;
5635 unsigned int max_regs = 0;
5636 const char *bad_reg = _("bad register: ");
5637 int saved_eh_addr_size = eh_addr_size;
5639 printf (_("Contents of the %s section:\n"), section->name);
5643 unsigned char *saved_start;
5644 unsigned char *block_end;
5649 int need_col_headers = 1;
5650 unsigned char *augmentation_data = NULL;
5651 unsigned long augmentation_data_len = 0;
5652 unsigned int encoded_ptr_size = saved_eh_addr_size;
5653 unsigned int offset_size;
5654 unsigned int initial_length_size;
5656 saved_start = start;
5658 SAFE_BYTE_GET_AND_INC (length, start, 4, end);
5662 printf ("\n%08lx ZERO terminator\n\n",
5663 (unsigned long)(saved_start - section_start));
5664 /* Skip any zero terminators that directly follow.
5665 A corrupt section size could have loaded a whole
5666 slew of zero filled memory bytes. eg
5667 PR 17512: file: 070-19381-0.004. */
5668 while (start < end && * start == 0)
5673 if (length == 0xffffffff)
5675 SAFE_BYTE_GET_AND_INC (length, start, 8, end);
5677 initial_length_size = 12;
5682 initial_length_size = 4;
5685 block_end = saved_start + length + initial_length_size;
5686 if (block_end > end || block_end < start)
5688 warn ("Invalid length 0x%s in FDE at %#08lx\n",
5689 dwarf_vmatoa_1 (NULL, length, offset_size),
5690 (unsigned long) (saved_start - section_start));
5694 SAFE_BYTE_GET_AND_INC (cie_id, start, offset_size, end);
5696 if (is_eh ? (cie_id == 0) : ((offset_size == 4 && cie_id == DW_CIE_ID)
5697 || (offset_size == 8 && cie_id == DW64_CIE_ID)))
5702 start = read_cie (start, end, &cie, &version,
5703 &augmentation_data_len, &augmentation_data);
5704 /* PR 17512: file: 027-135133-0.005. */
5711 fc->chunk_start = saved_start;
5712 mreg = max_regs > 0 ? max_regs - 1 : 0;
5715 if (frame_need_space (fc, mreg) < 0)
5717 if (fc->fde_encoding)
5718 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
5720 printf ("\n%08lx ", (unsigned long) (saved_start - section_start));
5721 print_dwarf_vma (length, fc->ptr_size);
5722 print_dwarf_vma (cie_id, offset_size);
5724 if (do_debug_frames_interp)
5726 printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc->augmentation,
5727 fc->code_factor, fc->data_factor, fc->ra);
5732 printf (" Version: %d\n", version);
5733 printf (" Augmentation: \"%s\"\n", fc->augmentation);
5736 printf (" Pointer Size: %u\n", fc->ptr_size);
5737 printf (" Segment Size: %u\n", fc->segment_size);
5739 printf (" Code alignment factor: %u\n", fc->code_factor);
5740 printf (" Data alignment factor: %d\n", fc->data_factor);
5741 printf (" Return address column: %d\n", fc->ra);
5743 if (augmentation_data_len)
5747 printf (" Augmentation data: ");
5748 for (i = 0; i < augmentation_data_len; ++i)
5749 /* FIXME: If do_wide is FALSE, then we should
5750 add carriage returns at 80 columns... */
5751 printf (" %02x", augmentation_data[i]);
5759 unsigned char *look_for;
5760 static Frame_Chunk fde_fc;
5761 unsigned long segment_selector;
5765 dwarf_vma sign = (dwarf_vma) 1 << (offset_size * 8 - 1);
5766 look_for = start - 4 - ((cie_id ^ sign) - sign);
5769 look_for = section_start + cie_id;
5771 if (look_for <= saved_start)
5773 for (cie = chunks; cie ; cie = cie->next)
5774 if (cie->chunk_start == look_for)
5779 for (cie = forward_refs; cie ; cie = cie->next)
5780 if (cie->chunk_start == look_for)
5784 unsigned int off_size;
5785 unsigned char *cie_scan;
5787 cie_scan = look_for;
5789 SAFE_BYTE_GET_AND_INC (length, cie_scan, 4, end);
5790 if (length == 0xffffffff)
5792 SAFE_BYTE_GET_AND_INC (length, cie_scan, 8, end);
5799 SAFE_BYTE_GET_AND_INC (c_id, cie_scan, off_size, end);
5802 : ((off_size == 4 && c_id == DW_CIE_ID)
5803 || (off_size == 8 && c_id == DW64_CIE_ID)))
5808 read_cie (cie_scan, end, &cie, &version,
5809 &augmentation_data_len, &augmentation_data);
5810 /* PR 17512: file: 3450-2098-0.004. */
5813 warn (_("Failed to read CIE information\n"));
5816 cie->next = forward_refs;
5818 cie->chunk_start = look_for;
5819 mreg = max_regs > 0 ? max_regs - 1 : 0;
5822 if (frame_need_space (cie, mreg) < 0)
5824 warn (_("Invalid max register\n"));
5827 if (cie->fde_encoding)
5829 = size_of_encoded_value (cie->fde_encoding);
5836 memset (fc, 0, sizeof (Frame_Chunk));
5840 warn ("Invalid CIE pointer 0x%s in FDE at %#08lx\n",
5841 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
5842 (unsigned long) (saved_start - section_start));
5844 fc->col_type = (short int *) xmalloc (sizeof (short int));
5845 fc->col_offset = (int *) xmalloc (sizeof (int));
5846 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1 : 0) < 0)
5848 warn (_("Invalid max register\n"));
5852 fc->augmentation = "";
5853 fc->fde_encoding = 0;
5854 fc->ptr_size = eh_addr_size;
5855 fc->segment_size = 0;
5859 fc->ncols = cie->ncols;
5860 fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
5861 fc->col_offset = (int *) xcmalloc (fc->ncols, sizeof (int));
5862 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
5863 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
5864 fc->augmentation = cie->augmentation;
5865 fc->ptr_size = cie->ptr_size;
5866 eh_addr_size = cie->ptr_size;
5867 fc->segment_size = cie->segment_size;
5868 fc->code_factor = cie->code_factor;
5869 fc->data_factor = cie->data_factor;
5870 fc->cfa_reg = cie->cfa_reg;
5871 fc->cfa_offset = cie->cfa_offset;
5873 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1: 0) < 0)
5875 warn (_("Invalid max register\n"));
5878 fc->fde_encoding = cie->fde_encoding;
5881 if (fc->fde_encoding)
5882 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
5884 segment_selector = 0;
5885 if (fc->segment_size)
5886 SAFE_BYTE_GET_AND_INC (segment_selector, start, fc->segment_size, end);
5888 fc->pc_begin = get_encoded_value (&start, fc->fde_encoding, section, end);
5890 /* FIXME: It appears that sometimes the final pc_range value is
5891 encoded in less than encoded_ptr_size bytes. See the x86_64
5892 run of the "objcopy on compressed debug sections" test for an
5894 SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end);
5896 if (cie->augmentation[0] == 'z')
5898 augmentation_data_len = LEB ();
5899 augmentation_data = start;
5900 start += augmentation_data_len;
5901 /* PR 17512: file: 722-8446-0.004. */
5902 if (start >= end || ((signed long) augmentation_data_len) < 0)
5904 warn (_("Corrupt augmentation data length: %lx\n"),
5905 augmentation_data_len);
5907 augmentation_data = NULL;
5908 augmentation_data_len = 0;
5912 printf ("\n%08lx %s %s FDE cie=%08lx pc=",
5913 (unsigned long)(saved_start - section_start),
5914 dwarf_vmatoa_1 (NULL, length, fc->ptr_size),
5915 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
5916 (unsigned long)(cie->chunk_start - section_start));
5918 if (fc->segment_size)
5919 printf ("%04lx:", segment_selector);
5922 dwarf_vmatoa_1 (NULL, fc->pc_begin, fc->ptr_size),
5923 dwarf_vmatoa_1 (NULL, fc->pc_begin + fc->pc_range, fc->ptr_size));
5925 if (! do_debug_frames_interp && augmentation_data_len)
5929 printf (" Augmentation data: ");
5930 for (i = 0; i < augmentation_data_len; ++i)
5931 printf (" %02x", augmentation_data[i]);
5937 /* At this point, fc is the current chunk, cie (if any) is set, and
5938 we're about to interpret instructions for the chunk. */
5939 /* ??? At present we need to do this always, since this sizes the
5940 fc->col_type and fc->col_offset arrays, which we write into always.
5941 We should probably split the interpreted and non-interpreted bits
5942 into two different routines, since there's so much that doesn't
5943 really overlap between them. */
5944 if (1 || do_debug_frames_interp)
5946 /* Start by making a pass over the chunk, allocating storage
5947 and taking note of what registers are used. */
5948 unsigned char *tmp = start;
5950 while (start < block_end)
5952 unsigned int reg, op, opa;
5954 unsigned char * new_start;
5961 /* Warning: if you add any more cases to this switch, be
5962 sure to add them to the corresponding switch below. */
5965 case DW_CFA_advance_loc:
5969 if (frame_need_space (fc, opa) >= 0)
5970 fc->col_type[opa] = DW_CFA_undefined;
5972 case DW_CFA_restore:
5973 if (frame_need_space (fc, opa) >= 0)
5974 fc->col_type[opa] = DW_CFA_undefined;
5976 case DW_CFA_set_loc:
5977 start += encoded_ptr_size;
5979 case DW_CFA_advance_loc1:
5982 case DW_CFA_advance_loc2:
5985 case DW_CFA_advance_loc4:
5988 case DW_CFA_offset_extended:
5989 case DW_CFA_val_offset:
5990 reg = LEB (); LEB ();
5991 if (frame_need_space (fc, reg) >= 0)
5992 fc->col_type[reg] = DW_CFA_undefined;
5994 case DW_CFA_restore_extended:
5996 if (frame_need_space (fc, reg) >= 0)
5997 fc->col_type[reg] = DW_CFA_undefined;
5999 case DW_CFA_undefined:
6001 if (frame_need_space (fc, reg) >= 0)
6002 fc->col_type[reg] = DW_CFA_undefined;
6004 case DW_CFA_same_value:
6006 if (frame_need_space (fc, reg) >= 0)
6007 fc->col_type[reg] = DW_CFA_undefined;
6009 case DW_CFA_register:
6010 reg = LEB (); LEB ();
6011 if (frame_need_space (fc, reg) >= 0)
6012 fc->col_type[reg] = DW_CFA_undefined;
6014 case DW_CFA_def_cfa:
6017 case DW_CFA_def_cfa_register:
6020 case DW_CFA_def_cfa_offset:
6023 case DW_CFA_def_cfa_expression:
6025 new_start = start + temp;
6026 if (new_start < start)
6028 warn (_("Corrupt CFA_def expression value: %lu\n"), temp);
6034 case DW_CFA_expression:
6035 case DW_CFA_val_expression:
6038 new_start = start + temp;
6039 if (new_start < start)
6041 /* PR 17512: file:306-192417-0.005. */
6042 warn (_("Corrupt CFA expression value: %lu\n"), temp);
6047 if (frame_need_space (fc, reg) >= 0)
6048 fc->col_type[reg] = DW_CFA_undefined;
6050 case DW_CFA_offset_extended_sf:
6051 case DW_CFA_val_offset_sf:
6052 reg = LEB (); SLEB ();
6053 if (frame_need_space (fc, reg) >= 0)
6054 fc->col_type[reg] = DW_CFA_undefined;
6056 case DW_CFA_def_cfa_sf:
6059 case DW_CFA_def_cfa_offset_sf:
6062 case DW_CFA_MIPS_advance_loc8:
6065 case DW_CFA_GNU_args_size:
6068 case DW_CFA_GNU_negative_offset_extended:
6069 reg = LEB (); LEB ();
6070 if (frame_need_space (fc, reg) >= 0)
6071 fc->col_type[reg] = DW_CFA_undefined;
6080 /* Now we know what registers are used, make a second pass over
6081 the chunk, this time actually printing out the info. */
6083 while (start < block_end)
6086 unsigned long ul, reg, roffs;
6090 const char *reg_prefix = "";
6097 /* Warning: if you add any more cases to this switch, be
6098 sure to add them to the corresponding switch above. */
6101 case DW_CFA_advance_loc:
6102 if (do_debug_frames_interp)
6103 frame_display_row (fc, &need_col_headers, &max_regs);
6105 printf (" DW_CFA_advance_loc: %d to %s\n",
6106 opa * fc->code_factor,
6107 dwarf_vmatoa_1 (NULL,
6108 fc->pc_begin + opa * fc->code_factor,
6110 fc->pc_begin += opa * fc->code_factor;
6115 if (opa >= (unsigned int) fc->ncols)
6116 reg_prefix = bad_reg;
6117 if (! do_debug_frames_interp || *reg_prefix != '\0')
6118 printf (" DW_CFA_offset: %s%s at cfa%+ld\n",
6119 reg_prefix, regname (opa, 0),
6120 roffs * fc->data_factor);
6121 if (*reg_prefix == '\0')
6123 fc->col_type[opa] = DW_CFA_offset;
6124 fc->col_offset[opa] = roffs * fc->data_factor;
6128 case DW_CFA_restore:
6129 if (opa >= (unsigned int) cie->ncols
6130 || opa >= (unsigned int) fc->ncols)
6131 reg_prefix = bad_reg;
6132 if (! do_debug_frames_interp || *reg_prefix != '\0')
6133 printf (" DW_CFA_restore: %s%s\n",
6134 reg_prefix, regname (opa, 0));
6135 if (*reg_prefix == '\0')
6137 fc->col_type[opa] = cie->col_type[opa];
6138 fc->col_offset[opa] = cie->col_offset[opa];
6139 if (do_debug_frames_interp
6140 && fc->col_type[opa] == DW_CFA_unreferenced)
6141 fc->col_type[opa] = DW_CFA_undefined;
6145 case DW_CFA_set_loc:
6146 vma = get_encoded_value (&start, fc->fde_encoding, section, block_end);
6147 if (do_debug_frames_interp)
6148 frame_display_row (fc, &need_col_headers, &max_regs);
6150 printf (" DW_CFA_set_loc: %s\n",
6151 dwarf_vmatoa_1 (NULL, vma, fc->ptr_size));
6155 case DW_CFA_advance_loc1:
6156 SAFE_BYTE_GET_AND_INC (ofs, start, 1, end);
6157 if (do_debug_frames_interp)
6158 frame_display_row (fc, &need_col_headers, &max_regs);
6160 printf (" DW_CFA_advance_loc1: %ld to %s\n",
6161 (unsigned long) (ofs * fc->code_factor),
6162 dwarf_vmatoa_1 (NULL,
6163 fc->pc_begin + ofs * fc->code_factor,
6165 fc->pc_begin += ofs * fc->code_factor;
6168 case DW_CFA_advance_loc2:
6169 SAFE_BYTE_GET_AND_INC (ofs, start, 2, block_end);
6170 if (do_debug_frames_interp)
6171 frame_display_row (fc, &need_col_headers, &max_regs);
6173 printf (" DW_CFA_advance_loc2: %ld to %s\n",
6174 (unsigned long) (ofs * fc->code_factor),
6175 dwarf_vmatoa_1 (NULL,
6176 fc->pc_begin + ofs * fc->code_factor,
6178 fc->pc_begin += ofs * fc->code_factor;
6181 case DW_CFA_advance_loc4:
6182 SAFE_BYTE_GET_AND_INC (ofs, start, 4, block_end);
6183 if (do_debug_frames_interp)
6184 frame_display_row (fc, &need_col_headers, &max_regs);
6186 printf (" DW_CFA_advance_loc4: %ld to %s\n",
6187 (unsigned long) (ofs * fc->code_factor),
6188 dwarf_vmatoa_1 (NULL,
6189 fc->pc_begin + ofs * fc->code_factor,
6191 fc->pc_begin += ofs * fc->code_factor;
6194 case DW_CFA_offset_extended:
6197 if (reg >= (unsigned int) fc->ncols)
6198 reg_prefix = bad_reg;
6199 if (! do_debug_frames_interp || *reg_prefix != '\0')
6200 printf (" DW_CFA_offset_extended: %s%s at cfa%+ld\n",
6201 reg_prefix, regname (reg, 0),
6202 roffs * fc->data_factor);
6203 if (*reg_prefix == '\0')
6205 fc->col_type[reg] = DW_CFA_offset;
6206 fc->col_offset[reg] = roffs * fc->data_factor;
6210 case DW_CFA_val_offset:
6213 if (reg >= (unsigned int) fc->ncols)
6214 reg_prefix = bad_reg;
6215 if (! do_debug_frames_interp || *reg_prefix != '\0')
6216 printf (" DW_CFA_val_offset: %s%s at cfa%+ld\n",
6217 reg_prefix, regname (reg, 0),
6218 roffs * fc->data_factor);
6219 if (*reg_prefix == '\0')
6221 fc->col_type[reg] = DW_CFA_val_offset;
6222 fc->col_offset[reg] = roffs * fc->data_factor;
6226 case DW_CFA_restore_extended:
6228 if (reg >= (unsigned int) cie->ncols
6229 || reg >= (unsigned int) fc->ncols)
6230 reg_prefix = bad_reg;
6231 if (! do_debug_frames_interp || *reg_prefix != '\0')
6232 printf (" DW_CFA_restore_extended: %s%s\n",
6233 reg_prefix, regname (reg, 0));
6234 if (*reg_prefix == '\0')
6236 fc->col_type[reg] = cie->col_type[reg];
6237 fc->col_offset[reg] = cie->col_offset[reg];
6241 case DW_CFA_undefined:
6243 if (reg >= (unsigned int) fc->ncols)
6244 reg_prefix = bad_reg;
6245 if (! do_debug_frames_interp || *reg_prefix != '\0')
6246 printf (" DW_CFA_undefined: %s%s\n",
6247 reg_prefix, regname (reg, 0));
6248 if (*reg_prefix == '\0')
6250 fc->col_type[reg] = DW_CFA_undefined;
6251 fc->col_offset[reg] = 0;
6255 case DW_CFA_same_value:
6257 if (reg >= (unsigned int) fc->ncols)
6258 reg_prefix = bad_reg;
6259 if (! do_debug_frames_interp || *reg_prefix != '\0')
6260 printf (" DW_CFA_same_value: %s%s\n",
6261 reg_prefix, regname (reg, 0));
6262 if (*reg_prefix == '\0')
6264 fc->col_type[reg] = DW_CFA_same_value;
6265 fc->col_offset[reg] = 0;
6269 case DW_CFA_register:
6272 if (reg >= (unsigned int) fc->ncols)
6273 reg_prefix = bad_reg;
6274 if (! do_debug_frames_interp || *reg_prefix != '\0')
6276 printf (" DW_CFA_register: %s%s in ",
6277 reg_prefix, regname (reg, 0));
6278 puts (regname (roffs, 0));
6280 if (*reg_prefix == '\0')
6282 fc->col_type[reg] = DW_CFA_register;
6283 fc->col_offset[reg] = roffs;
6287 case DW_CFA_remember_state:
6288 if (! do_debug_frames_interp)
6289 printf (" DW_CFA_remember_state\n");
6290 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
6291 rs->cfa_offset = fc->cfa_offset;
6292 rs->cfa_reg = fc->cfa_reg;
6294 rs->cfa_exp = fc->cfa_exp;
6295 rs->ncols = fc->ncols;
6296 rs->col_type = (short int *) xcmalloc (rs->ncols,
6297 sizeof (* rs->col_type));
6298 rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (* rs->col_offset));
6299 memcpy (rs->col_type, fc->col_type, rs->ncols * sizeof (* fc->col_type));
6300 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (* fc->col_offset));
6301 rs->next = remembered_state;
6302 remembered_state = rs;
6305 case DW_CFA_restore_state:
6306 if (! do_debug_frames_interp)
6307 printf (" DW_CFA_restore_state\n");
6308 rs = remembered_state;
6311 remembered_state = rs->next;
6312 fc->cfa_offset = rs->cfa_offset;
6313 fc->cfa_reg = rs->cfa_reg;
6315 fc->cfa_exp = rs->cfa_exp;
6316 if (frame_need_space (fc, rs->ncols - 1) < 0)
6318 warn (_("Invalid column number in saved frame state\n"));
6322 memcpy (fc->col_type, rs->col_type, rs->ncols * sizeof (* rs->col_type));
6323 memcpy (fc->col_offset, rs->col_offset,
6324 rs->ncols * sizeof (* rs->col_offset));
6325 free (rs->col_type);
6326 free (rs->col_offset);
6329 else if (do_debug_frames_interp)
6330 printf ("Mismatched DW_CFA_restore_state\n");
6333 case DW_CFA_def_cfa:
6334 fc->cfa_reg = LEB ();
6335 fc->cfa_offset = LEB ();
6337 if (! do_debug_frames_interp)
6338 printf (" DW_CFA_def_cfa: %s ofs %d\n",
6339 regname (fc->cfa_reg, 0), fc->cfa_offset);
6342 case DW_CFA_def_cfa_register:
6343 fc->cfa_reg = LEB ();
6345 if (! do_debug_frames_interp)
6346 printf (" DW_CFA_def_cfa_register: %s\n",
6347 regname (fc->cfa_reg, 0));
6350 case DW_CFA_def_cfa_offset:
6351 fc->cfa_offset = LEB ();
6352 if (! do_debug_frames_interp)
6353 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
6357 if (! do_debug_frames_interp)
6358 printf (" DW_CFA_nop\n");
6361 case DW_CFA_def_cfa_expression:
6363 if (start >= block_end || start + ul > block_end || start + ul < start)
6365 printf (_(" DW_CFA_def_cfa_expression: <corrupt len %lu>\n"), ul);
6368 if (! do_debug_frames_interp)
6370 printf (" DW_CFA_def_cfa_expression (");
6371 decode_location_expression (start, eh_addr_size, 0, -1,
6379 case DW_CFA_expression:
6382 if (reg >= (unsigned int) fc->ncols)
6383 reg_prefix = bad_reg;
6384 /* PR 17512: file: 069-133014-0.006. */
6385 /* PR 17512: file: 98c02eb4. */
6386 if (start >= block_end || start + ul > block_end || start + ul < start)
6388 printf (_(" DW_CFA_expression: <corrupt len %lu>\n"), ul);
6391 if (! do_debug_frames_interp || *reg_prefix != '\0')
6393 printf (" DW_CFA_expression: %s%s (",
6394 reg_prefix, regname (reg, 0));
6395 decode_location_expression (start, eh_addr_size, 0, -1,
6399 if (*reg_prefix == '\0')
6400 fc->col_type[reg] = DW_CFA_expression;
6404 case DW_CFA_val_expression:
6407 if (reg >= (unsigned int) fc->ncols)
6408 reg_prefix = bad_reg;
6409 if (start >= block_end || start + ul > block_end || start + ul < start)
6411 printf (" DW_CFA_val_expression: <corrupt len %lu>\n", ul);
6414 if (! do_debug_frames_interp || *reg_prefix != '\0')
6416 printf (" DW_CFA_val_expression: %s%s (",
6417 reg_prefix, regname (reg, 0));
6418 decode_location_expression (start, eh_addr_size, 0, -1,
6422 if (*reg_prefix == '\0')
6423 fc->col_type[reg] = DW_CFA_val_expression;
6427 case DW_CFA_offset_extended_sf:
6430 if (frame_need_space (fc, reg) < 0)
6431 reg_prefix = bad_reg;
6432 if (! do_debug_frames_interp || *reg_prefix != '\0')
6433 printf (" DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
6434 reg_prefix, regname (reg, 0),
6435 l * fc->data_factor);
6436 if (*reg_prefix == '\0')
6438 fc->col_type[reg] = DW_CFA_offset;
6439 fc->col_offset[reg] = l * fc->data_factor;
6443 case DW_CFA_val_offset_sf:
6446 if (frame_need_space (fc, reg) < 0)
6447 reg_prefix = bad_reg;
6448 if (! do_debug_frames_interp || *reg_prefix != '\0')
6449 printf (" DW_CFA_val_offset_sf: %s%s at cfa%+ld\n",
6450 reg_prefix, regname (reg, 0),
6451 l * fc->data_factor);
6452 if (*reg_prefix == '\0')
6454 fc->col_type[reg] = DW_CFA_val_offset;
6455 fc->col_offset[reg] = l * fc->data_factor;
6459 case DW_CFA_def_cfa_sf:
6460 fc->cfa_reg = LEB ();
6461 fc->cfa_offset = SLEB ();
6462 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
6464 if (! do_debug_frames_interp)
6465 printf (" DW_CFA_def_cfa_sf: %s ofs %d\n",
6466 regname (fc->cfa_reg, 0), fc->cfa_offset);
6469 case DW_CFA_def_cfa_offset_sf:
6470 fc->cfa_offset = SLEB ();
6471 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
6472 if (! do_debug_frames_interp)
6473 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
6476 case DW_CFA_MIPS_advance_loc8:
6477 SAFE_BYTE_GET_AND_INC (ofs, start, 8, block_end);
6478 if (do_debug_frames_interp)
6479 frame_display_row (fc, &need_col_headers, &max_regs);
6481 printf (" DW_CFA_MIPS_advance_loc8: %ld to %s\n",
6482 (unsigned long) (ofs * fc->code_factor),
6483 dwarf_vmatoa_1 (NULL,
6484 fc->pc_begin + ofs * fc->code_factor,
6486 fc->pc_begin += ofs * fc->code_factor;
6489 case DW_CFA_GNU_window_save:
6490 if (! do_debug_frames_interp)
6491 printf (" DW_CFA_GNU_window_save\n");
6494 case DW_CFA_GNU_args_size:
6496 if (! do_debug_frames_interp)
6497 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
6500 case DW_CFA_GNU_negative_offset_extended:
6503 if (frame_need_space (fc, reg) < 0)
6504 reg_prefix = bad_reg;
6505 if (! do_debug_frames_interp || *reg_prefix != '\0')
6506 printf (" DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
6507 reg_prefix, regname (reg, 0),
6508 l * fc->data_factor);
6509 if (*reg_prefix == '\0')
6511 fc->col_type[reg] = DW_CFA_offset;
6512 fc->col_offset[reg] = l * fc->data_factor;
6517 if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
6518 printf (_(" DW_CFA_??? (User defined call frame op: %#x)\n"), op);
6520 warn (_("Unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
6525 if (do_debug_frames_interp)
6526 frame_display_row (fc, &need_col_headers, &max_regs);
6529 eh_addr_size = saved_eh_addr_size;
6542 display_gdb_index (struct dwarf_section *section,
6543 void *file ATTRIBUTE_UNUSED)
6545 unsigned char *start = section->start;
6547 uint32_t cu_list_offset, tu_list_offset;
6548 uint32_t address_table_offset, symbol_table_offset, constant_pool_offset;
6549 unsigned int cu_list_elements, tu_list_elements;
6550 unsigned int address_table_size, symbol_table_slots;
6551 unsigned char *cu_list, *tu_list;
6552 unsigned char *address_table, *symbol_table, *constant_pool;
6555 /* The documentation for the format of this file is in gdb/dwarf2read.c. */
6557 printf (_("Contents of the %s section:\n"), section->name);
6559 if (section->size < 6 * sizeof (uint32_t))
6561 warn (_("Truncated header in the %s section.\n"), section->name);
6565 version = byte_get_little_endian (start, 4);
6566 printf (_("Version %ld\n"), (long) version);
6568 /* Prior versions are obsolete, and future versions may not be
6569 backwards compatible. */
6570 if (version < 3 || version > 8)
6572 warn (_("Unsupported version %lu.\n"), (unsigned long) version);
6576 warn (_("The address table data in version 3 may be wrong.\n"));
6578 warn (_("Version 4 does not support case insensitive lookups.\n"));
6580 warn (_("Version 5 does not include inlined functions.\n"));
6582 warn (_("Version 6 does not include symbol attributes.\n"));
6583 /* Version 7 indices generated by Gold have bad type unit references,
6584 PR binutils/15021. But we don't know if the index was generated by
6585 Gold or not, so to avoid worrying users with gdb-generated indices
6586 we say nothing for version 7 here. */
6588 cu_list_offset = byte_get_little_endian (start + 4, 4);
6589 tu_list_offset = byte_get_little_endian (start + 8, 4);
6590 address_table_offset = byte_get_little_endian (start + 12, 4);
6591 symbol_table_offset = byte_get_little_endian (start + 16, 4);
6592 constant_pool_offset = byte_get_little_endian (start + 20, 4);
6594 if (cu_list_offset > section->size
6595 || tu_list_offset > section->size
6596 || address_table_offset > section->size
6597 || symbol_table_offset > section->size
6598 || constant_pool_offset > section->size)
6600 warn (_("Corrupt header in the %s section.\n"), section->name);
6604 /* PR 17531: file: 418d0a8a. */
6605 if (tu_list_offset < cu_list_offset)
6607 warn (_("TU offset (%x) is less than CU offset (%x)\n"),
6608 tu_list_offset, cu_list_offset);
6612 cu_list_elements = (tu_list_offset - cu_list_offset) / 8;
6614 if (address_table_offset < tu_list_offset)
6616 warn (_("Address table offset (%x) is less than TU offset (%x)\n"),
6617 address_table_offset, tu_list_offset);
6621 tu_list_elements = (address_table_offset - tu_list_offset) / 8;
6623 /* PR 17531: file: 18a47d3d. */
6624 if (symbol_table_offset < address_table_offset)
6626 warn (_("Symbol table offset (%xl) is less then Address table offset (%x)\n"),
6627 symbol_table_offset, address_table_offset);
6631 address_table_size = symbol_table_offset - address_table_offset;
6633 if (constant_pool_offset < symbol_table_offset)
6635 warn (_("Constant pool offset (%x) is less than symbol table offset (%x)\n"),
6636 constant_pool_offset, symbol_table_offset);
6640 symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8;
6642 cu_list = start + cu_list_offset;
6643 tu_list = start + tu_list_offset;
6644 address_table = start + address_table_offset;
6645 symbol_table = start + symbol_table_offset;
6646 constant_pool = start + constant_pool_offset;
6648 if (address_table + address_table_size * (2 + 8 + 4) > section->start + section->size)
6650 warn (_("Address table extends beyond end of section.\n"));
6654 printf (_("\nCU table:\n"));
6655 for (i = 0; i < cu_list_elements; i += 2)
6657 uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8);
6658 uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8);
6660 printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2,
6661 (unsigned long) cu_offset,
6662 (unsigned long) (cu_offset + cu_length - 1));
6665 printf (_("\nTU table:\n"));
6666 for (i = 0; i < tu_list_elements; i += 3)
6668 uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8);
6669 uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8);
6670 uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8);
6672 printf (_("[%3u] 0x%lx 0x%lx "), i / 3,
6673 (unsigned long) tu_offset,
6674 (unsigned long) type_offset);
6675 print_dwarf_vma (signature, 8);
6679 printf (_("\nAddress table:\n"));
6680 for (i = 0; i < address_table_size && i <= address_table_size - (2 * 8 + 4);
6683 uint64_t low = byte_get_little_endian (address_table + i, 8);
6684 uint64_t high = byte_get_little_endian (address_table + i + 8, 8);
6685 uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4);
6687 print_dwarf_vma (low, 8);
6688 print_dwarf_vma (high, 8);
6689 printf (_("%lu\n"), (unsigned long) cu_index);
6692 printf (_("\nSymbol table:\n"));
6693 for (i = 0; i < symbol_table_slots; ++i)
6695 uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4);
6696 uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4);
6697 uint32_t num_cus, cu;
6699 if (name_offset != 0
6700 || cu_vector_offset != 0)
6704 /* PR 17531: file: 5b7b07ad. */
6705 if (constant_pool + name_offset < constant_pool
6706 || constant_pool + name_offset >= section->start + section->size)
6708 printf (_("[%3u] <corrupt offset: %x>"), i, name_offset);
6709 warn (_("Corrupt name offset of 0x%x found for symbol table slot %d\n"),
6713 printf ("[%3u] %.*s:", i,
6714 (int) (section->size - (constant_pool_offset + name_offset)),
6715 constant_pool + name_offset);
6717 if (constant_pool + cu_vector_offset < constant_pool
6718 || constant_pool + cu_vector_offset >= section->start + section->size - 3)
6720 printf (_("<invalid CU vector offset: %x>\n"), cu_vector_offset);
6721 warn (_("Corrupt CU vector offset of 0x%x found for symbol table slot %d\n"),
6722 cu_vector_offset, i);
6726 num_cus = byte_get_little_endian (constant_pool + cu_vector_offset, 4);
6728 if (num_cus * 4 < num_cus
6729 || constant_pool + cu_vector_offset + 4 + num_cus * 4
6730 >= section->start + section->size
6731 || (constant_pool + cu_vector_offset + 4 + num_cus * 4) < constant_pool)
6733 printf ("<invalid number of CUs: %d>\n", num_cus);
6734 warn (_("Invalid number of CUs (0x%x) for symbol table slot %d\n"),
6742 for (j = 0; j < num_cus; ++j)
6745 gdb_index_symbol_kind kind;
6747 cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4);
6748 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu);
6749 kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu);
6750 cu = GDB_INDEX_CU_VALUE (cu);
6751 /* Convert to TU number if it's for a type unit. */
6752 if (cu >= cu_list_elements / 2)
6753 printf ("%cT%lu", num_cus > 1 ? '\t' : ' ',
6754 (unsigned long) (cu - cu_list_elements / 2));
6756 printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu);
6758 printf (" [%s, %s]",
6759 is_static ? _("static") : _("global"),
6760 get_gdb_index_symbol_kind_name (kind));
6772 /* Pre-allocate enough space for the CU/TU sets needed. */
6775 prealloc_cu_tu_list (unsigned int nshndx)
6777 if (shndx_pool == NULL)
6779 shndx_pool_size = nshndx;
6780 shndx_pool_used = 0;
6781 shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size,
6782 sizeof (unsigned int));
6786 shndx_pool_size = shndx_pool_used + nshndx;
6787 shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size,
6788 sizeof (unsigned int));
6793 add_shndx_to_cu_tu_entry (unsigned int shndx)
6795 if (shndx_pool_used >= shndx_pool_size)
6797 error (_("Internal error: out of space in the shndx pool.\n"));
6800 shndx_pool [shndx_pool_used++] = shndx;
6804 end_cu_tu_entry (void)
6806 if (shndx_pool_used >= shndx_pool_size)
6808 error (_("Internal error: out of space in the shndx pool.\n"));
6811 shndx_pool [shndx_pool_used++] = 0;
6814 /* Return the short name of a DWARF section given by a DW_SECT enumerator. */
6817 get_DW_SECT_short_name (unsigned int dw_sect)
6819 static char buf[16];
6827 case DW_SECT_ABBREV:
6833 case DW_SECT_STR_OFFSETS:
6835 case DW_SECT_MACINFO:
6843 snprintf (buf, sizeof (buf), "%d", dw_sect);
6847 /* Process a CU or TU index. If DO_DISPLAY is true, print the contents.
6848 These sections are extensions for Fission.
6849 See http://gcc.gnu.org/wiki/DebugFissionDWP. */
6852 process_cu_tu_index (struct dwarf_section *section, int do_display)
6854 unsigned char *phdr = section->start;
6855 unsigned char *limit = phdr + section->size;
6856 unsigned char *phash;
6857 unsigned char *pindex;
6858 unsigned char *ppool;
6859 unsigned int version;
6860 unsigned int ncols = 0;
6862 unsigned int nslots;
6865 dwarf_vma signature_high;
6866 dwarf_vma signature_low;
6869 /* PR 17512: file: 002-168123-0.004. */
6872 warn (_("Section %s is empty\n"), section->name);
6875 /* PR 17512: file: 002-376-0.004. */
6876 if (section->size < 24)
6878 warn (_("Section %s is too small to contain a CU/TU header\n"),
6883 SAFE_BYTE_GET (version, phdr, 4, limit);
6885 SAFE_BYTE_GET (ncols, phdr + 4, 4, limit);
6886 SAFE_BYTE_GET (nused, phdr + 8, 4, limit);
6887 SAFE_BYTE_GET (nslots, phdr + 12, 4, limit);
6890 pindex = phash + nslots * 8;
6891 ppool = pindex + nslots * 4;
6893 /* PR 17531: file: 45d69832. */
6894 if (pindex < phash || ppool < phdr)
6896 warn (_("Section %s is too small for %d slots\n"),
6897 section->name, nslots);
6903 printf (_("Contents of the %s section:\n\n"), section->name);
6904 printf (_(" Version: %d\n"), version);
6906 printf (_(" Number of columns: %d\n"), ncols);
6907 printf (_(" Number of used entries: %d\n"), nused);
6908 printf (_(" Number of slots: %d\n\n"), nslots);
6913 warn (_("Section %s too small for %d hash table entries\n"),
6914 section->name, nslots);
6921 prealloc_cu_tu_list ((limit - ppool) / 4);
6922 for (i = 0; i < nslots; i++)
6924 unsigned char *shndx_list;
6927 SAFE_BYTE_GET64 (phash, &signature_high, &signature_low, limit);
6928 if (signature_high != 0 || signature_low != 0)
6930 SAFE_BYTE_GET (j, pindex, 4, limit);
6931 shndx_list = ppool + j * 4;
6932 /* PR 17531: file: 705e010d. */
6933 if (shndx_list < ppool)
6935 warn (_("Section index pool located before start of section\n"));
6940 printf (_(" [%3d] Signature: 0x%s Sections: "),
6941 i, dwarf_vmatoa64 (signature_high, signature_low,
6942 buf, sizeof (buf)));
6945 if (shndx_list >= limit)
6947 warn (_("Section %s too small for shndx pool\n"),
6951 SAFE_BYTE_GET (shndx, shndx_list, 4, limit);
6955 printf (" %d", shndx);
6957 add_shndx_to_cu_tu_entry (shndx);
6969 else if (version == 2)
6972 unsigned int dw_sect;
6973 unsigned char *ph = phash;
6974 unsigned char *pi = pindex;
6975 unsigned char *poffsets = ppool + ncols * 4;
6976 unsigned char *psizes = poffsets + nused * ncols * 4;
6977 unsigned char *pend = psizes + nused * ncols * 4;
6978 bfd_boolean is_tu_index;
6979 struct cu_tu_set *this_set = NULL;
6981 unsigned char *prow;
6983 is_tu_index = strcmp (section->name, ".debug_tu_index") == 0;
6987 warn (_("Section %s too small for offset and size tables\n"),
6994 printf (_(" Offset table\n"));
6995 printf (" slot %-16s ",
6996 is_tu_index ? _("signature") : _("dwo_id"));
7003 tu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
7009 cu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
7016 for (j = 0; j < ncols; j++)
7018 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
7019 printf (" %8s", get_DW_SECT_short_name (dw_sect));
7024 for (i = 0; i < nslots; i++)
7026 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
7028 SAFE_BYTE_GET (row, pi, 4, limit);
7031 /* PR 17531: file: a05f6ab3. */
7034 warn (_("Row index (%u) is larger than number of used entries (%u)\n"),
7040 memcpy (&this_set[row - 1].signature, ph, sizeof (uint64_t));
7042 prow = poffsets + (row - 1) * ncols * 4;
7045 printf (_(" [%3d] 0x%s"),
7046 i, dwarf_vmatoa64 (signature_high, signature_low,
7047 buf, sizeof (buf)));
7048 for (j = 0; j < ncols; j++)
7050 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
7052 printf (" %8d", val);
7055 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
7057 /* PR 17531: file: 10796eb3. */
7058 if (dw_sect >= DW_SECT_MAX)
7059 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
7061 this_set [row - 1].section_offsets [dw_sect] = val;
7077 printf (_(" Size table\n"));
7078 printf (" slot %-16s ",
7079 is_tu_index ? _("signature") : _("dwo_id"));
7082 for (j = 0; j < ncols; j++)
7084 SAFE_BYTE_GET (val, ppool + j * 4, 4, limit);
7086 printf (" %8s", get_DW_SECT_short_name (val));
7092 for (i = 0; i < nslots; i++)
7094 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
7096 SAFE_BYTE_GET (row, pi, 4, limit);
7099 prow = psizes + (row - 1) * ncols * 4;
7102 printf (_(" [%3d] 0x%s"),
7103 i, dwarf_vmatoa64 (signature_high, signature_low,
7104 buf, sizeof (buf)));
7106 for (j = 0; j < ncols; j++)
7108 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
7110 printf (" %8d", val);
7113 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
7114 if (dw_sect >= DW_SECT_MAX)
7115 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
7117 this_set [row - 1].section_sizes [dw_sect] = val;
7129 else if (do_display)
7130 printf (_(" Unsupported version (%d)\n"), version);
7138 /* Load the CU and TU indexes if present. This will build a list of
7139 section sets that we can use to associate a .debug_info.dwo section
7140 with its associated .debug_abbrev.dwo section in a .dwp file. */
7143 load_cu_tu_indexes (void *file)
7145 /* If we have already loaded (or tried to load) the CU and TU indexes
7146 then do not bother to repeat the task. */
7147 if (cu_tu_indexes_read)
7150 if (load_debug_section (dwp_cu_index, file))
7151 process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0);
7153 if (load_debug_section (dwp_tu_index, file))
7154 process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0);
7156 cu_tu_indexes_read = 1;
7159 /* Find the set of sections that includes section SHNDX. */
7162 find_cu_tu_set (void *file, unsigned int shndx)
7166 load_cu_tu_indexes (file);
7168 /* Find SHNDX in the shndx pool. */
7169 for (i = 0; i < shndx_pool_used; i++)
7170 if (shndx_pool [i] == shndx)
7173 if (i >= shndx_pool_used)
7176 /* Now backup to find the first entry in the set. */
7177 while (i > 0 && shndx_pool [i - 1] != 0)
7180 return shndx_pool + i;
7183 /* Display a .debug_cu_index or .debug_tu_index section. */
7186 display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
7188 return process_cu_tu_index (section, 1);
7192 display_debug_not_supported (struct dwarf_section *section,
7193 void *file ATTRIBUTE_UNUSED)
7195 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
7201 /* Like malloc, but takes two parameters like calloc.
7202 Verifies that the first parameter is not too large.
7203 Note: does *not* initialise the allocated memory to zero. */
7205 cmalloc (size_t nmemb, size_t size)
7207 /* Check for overflow. */
7208 if (nmemb >= ~(size_t) 0 / size)
7211 return xmalloc (nmemb * size);
7214 /* Like xmalloc, but takes two parameters like calloc.
7215 Verifies that the first parameter is not too large.
7216 Note: does *not* initialise the allocated memory to zero. */
7218 xcmalloc (size_t nmemb, size_t size)
7220 /* Check for overflow. */
7221 if (nmemb >= ~(size_t) 0 / size)
7224 _("Attempt to allocate an array with an excessive number of elements: 0x%lx\n"),
7229 return xmalloc (nmemb * size);
7232 /* Like xrealloc, but takes three parameters.
7233 Verifies that the second parameter is not too large.
7234 Note: does *not* initialise any new memory to zero. */
7236 xcrealloc (void *ptr, size_t nmemb, size_t size)
7238 /* Check for overflow. */
7239 if (nmemb >= ~(size_t) 0 / size)
7242 _("Attempt to re-allocate an array with an excessive number of elements: 0x%lx\n"),
7247 return xrealloc (ptr, nmemb * size);
7250 /* Like xcalloc, but verifies that the first parameter is not too large. */
7252 xcalloc2 (size_t nmemb, size_t size)
7254 /* Check for overflow. */
7255 if (nmemb >= ~(size_t) 0 / size)
7258 _("Attempt to allocate a zero'ed array with an excessive number of elements: 0x%lx\n"),
7263 return xcalloc (nmemb, size);
7267 free_debug_memory (void)
7273 for (i = 0; i < max; i++)
7274 free_debug_section ((enum dwarf_section_display_enum) i);
7276 if (debug_information != NULL)
7278 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
7280 for (i = 0; i < num_debug_info_entries; i++)
7282 if (!debug_information [i].max_loc_offsets)
7284 free (debug_information [i].loc_offsets);
7285 free (debug_information [i].have_frame_base);
7287 if (!debug_information [i].max_range_lists)
7288 free (debug_information [i].range_lists);
7291 free (debug_information);
7292 debug_information = NULL;
7293 alloc_num_debug_info_entries = num_debug_info_entries = 0;
7298 dwarf_select_sections_by_names (const char *names)
7302 const char * option;
7306 debug_dump_long_opts;
7308 static const debug_dump_long_opts opts_table [] =
7310 /* Please keep this table alpha- sorted. */
7311 { "Ranges", & do_debug_ranges, 1 },
7312 { "abbrev", & do_debug_abbrevs, 1 },
7313 { "addr", & do_debug_addr, 1 },
7314 { "aranges", & do_debug_aranges, 1 },
7315 { "cu_index", & do_debug_cu_index, 1 },
7316 { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
7317 { "frames", & do_debug_frames, 1 },
7318 { "frames-interp", & do_debug_frames_interp, 1 },
7319 /* The special .gdb_index section. */
7320 { "gdb_index", & do_gdb_index, 1 },
7321 { "info", & do_debug_info, 1 },
7322 { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility. */
7323 { "loc", & do_debug_loc, 1 },
7324 { "macro", & do_debug_macinfo, 1 },
7325 { "pubnames", & do_debug_pubnames, 1 },
7326 { "pubtypes", & do_debug_pubtypes, 1 },
7327 /* This entry is for compatability
7328 with earlier versions of readelf. */
7329 { "ranges", & do_debug_aranges, 1 },
7330 { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
7331 { "str", & do_debug_str, 1 },
7332 /* These trace_* sections are used by Itanium VMS. */
7333 { "trace_abbrev", & do_trace_abbrevs, 1 },
7334 { "trace_aranges", & do_trace_aranges, 1 },
7335 { "trace_info", & do_trace_info, 1 },
7344 const debug_dump_long_opts * entry;
7346 for (entry = opts_table; entry->option; entry++)
7348 size_t len = strlen (entry->option);
7350 if (strncmp (p, entry->option, len) == 0
7351 && (p[len] == ',' || p[len] == '\0'))
7353 * entry->variable |= entry->val;
7355 /* The --debug-dump=frames-interp option also
7356 enables the --debug-dump=frames option. */
7357 if (do_debug_frames_interp)
7358 do_debug_frames = 1;
7365 if (entry->option == NULL)
7367 warn (_("Unrecognized debug option '%s'\n"), p);
7368 p = strchr (p, ',');
7379 dwarf_select_sections_by_letters (const char *letters)
7381 unsigned int lindex = 0;
7383 while (letters[lindex])
7384 switch (letters[lindex++])
7391 do_debug_abbrevs = 1;
7395 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
7399 do_debug_lines |= FLAG_DEBUG_LINES_DECODED;
7403 do_debug_pubnames = 1;
7407 do_debug_pubtypes = 1;
7411 do_debug_aranges = 1;
7415 do_debug_ranges = 1;
7419 do_debug_frames_interp = 1;
7421 do_debug_frames = 1;
7425 do_debug_macinfo = 1;
7437 warn (_("Unrecognized debug option '%s'\n"), letters);
7443 dwarf_select_sections_all (void)
7446 do_debug_abbrevs = 1;
7447 do_debug_lines = FLAG_DEBUG_LINES_RAW;
7448 do_debug_pubnames = 1;
7449 do_debug_pubtypes = 1;
7450 do_debug_aranges = 1;
7451 do_debug_ranges = 1;
7452 do_debug_frames = 1;
7453 do_debug_macinfo = 1;
7458 do_trace_abbrevs = 1;
7459 do_trace_aranges = 1;
7461 do_debug_cu_index = 1;
7464 struct dwarf_section_display debug_displays[] =
7466 { { ".debug_abbrev", ".zdebug_abbrev", NULL, NULL, 0, 0, 0, NULL },
7467 display_debug_abbrev, &do_debug_abbrevs, 0 },
7468 { { ".debug_aranges", ".zdebug_aranges", NULL, NULL, 0, 0, 0, NULL },
7469 display_debug_aranges, &do_debug_aranges, 1 },
7470 { { ".debug_frame", ".zdebug_frame", NULL, NULL, 0, 0, 0, NULL },
7471 display_debug_frames, &do_debug_frames, 1 },
7472 { { ".debug_info", ".zdebug_info", NULL, NULL, 0, 0, abbrev, NULL },
7473 display_debug_info, &do_debug_info, 1 },
7474 { { ".debug_line", ".zdebug_line", NULL, NULL, 0, 0, 0, NULL },
7475 display_debug_lines, &do_debug_lines, 1 },
7476 { { ".debug_pubnames", ".zdebug_pubnames", NULL, NULL, 0, 0, 0, NULL },
7477 display_debug_pubnames, &do_debug_pubnames, 0 },
7478 { { ".debug_gnu_pubnames", ".zdebug_gnu_pubnames", NULL, NULL, 0, 0, 0, NULL },
7479 display_debug_gnu_pubnames, &do_debug_pubnames, 0 },
7480 { { ".eh_frame", "", NULL, NULL, 0, 0, 0, NULL },
7481 display_debug_frames, &do_debug_frames, 1 },
7482 { { ".debug_macinfo", ".zdebug_macinfo", NULL, NULL, 0, 0, 0, NULL },
7483 display_debug_macinfo, &do_debug_macinfo, 0 },
7484 { { ".debug_macro", ".zdebug_macro", NULL, NULL, 0, 0, 0, NULL },
7485 display_debug_macro, &do_debug_macinfo, 1 },
7486 { { ".debug_str", ".zdebug_str", NULL, NULL, 0, 0, 0, NULL },
7487 display_debug_str, &do_debug_str, 0 },
7488 { { ".debug_loc", ".zdebug_loc", NULL, NULL, 0, 0, 0, NULL },
7489 display_debug_loc, &do_debug_loc, 1 },
7490 { { ".debug_pubtypes", ".zdebug_pubtypes", NULL, NULL, 0, 0, 0, NULL },
7491 display_debug_pubnames, &do_debug_pubtypes, 0 },
7492 { { ".debug_gnu_pubtypes", ".zdebug_gnu_pubtypes", NULL, NULL, 0, 0, 0, NULL },
7493 display_debug_gnu_pubnames, &do_debug_pubtypes, 0 },
7494 { { ".debug_ranges", ".zdebug_ranges", NULL, NULL, 0, 0, 0, NULL },
7495 display_debug_ranges, &do_debug_ranges, 1 },
7496 { { ".debug_static_func", ".zdebug_static_func", NULL, NULL, 0, 0, 0, NULL },
7497 display_debug_not_supported, NULL, 0 },
7498 { { ".debug_static_vars", ".zdebug_static_vars", NULL, NULL, 0, 0, 0, NULL },
7499 display_debug_not_supported, NULL, 0 },
7500 { { ".debug_types", ".zdebug_types", NULL, NULL, 0, 0, abbrev, NULL },
7501 display_debug_types, &do_debug_info, 1 },
7502 { { ".debug_weaknames", ".zdebug_weaknames", NULL, NULL, 0, 0, 0, NULL },
7503 display_debug_not_supported, NULL, 0 },
7504 { { ".gdb_index", "", NULL, NULL, 0, 0, 0, NULL },
7505 display_gdb_index, &do_gdb_index, 0 },
7506 { { ".trace_info", "", NULL, NULL, 0, 0, trace_abbrev, NULL },
7507 display_trace_info, &do_trace_info, 1 },
7508 { { ".trace_abbrev", "", NULL, NULL, 0, 0, 0, NULL },
7509 display_debug_abbrev, &do_trace_abbrevs, 0 },
7510 { { ".trace_aranges", "", NULL, NULL, 0, 0, 0, NULL },
7511 display_debug_aranges, &do_trace_aranges, 0 },
7512 { { ".debug_info.dwo", ".zdebug_info.dwo", NULL, NULL, 0, 0, abbrev_dwo, NULL },
7513 display_debug_info, &do_debug_info, 1 },
7514 { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", NULL, NULL, 0, 0, 0, NULL },
7515 display_debug_abbrev, &do_debug_abbrevs, 0 },
7516 { { ".debug_types.dwo", ".zdebug_types.dwo", NULL, NULL, 0, 0, abbrev_dwo, NULL },
7517 display_debug_types, &do_debug_info, 1 },
7518 { { ".debug_line.dwo", ".zdebug_line.dwo", NULL, NULL, 0, 0, 0, NULL },
7519 display_debug_lines, &do_debug_lines, 1 },
7520 { { ".debug_loc.dwo", ".zdebug_loc.dwo", NULL, NULL, 0, 0, 0, NULL },
7521 display_debug_loc, &do_debug_loc, 1 },
7522 { { ".debug_macro.dwo", ".zdebug_macro.dwo", NULL, NULL, 0, 0, 0, NULL },
7523 display_debug_macro, &do_debug_macinfo, 1 },
7524 { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NULL, NULL, 0, 0, 0, NULL },
7525 display_debug_macinfo, &do_debug_macinfo, 0 },
7526 { { ".debug_str.dwo", ".zdebug_str.dwo", NULL, NULL, 0, 0, 0, NULL },
7527 display_debug_str, &do_debug_str, 1 },
7528 { { ".debug_str_offsets", ".zdebug_str_offsets", NULL, NULL, 0, 0, 0, NULL },
7529 display_debug_str_offsets, NULL, 0 },
7530 { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NULL, NULL, 0, 0, 0, NULL },
7531 display_debug_str_offsets, NULL, 0 },
7532 { { ".debug_addr", ".zdebug_addr", NULL, NULL, 0, 0, 0, NULL },
7533 display_debug_addr, &do_debug_addr, 1 },
7534 { { ".debug_cu_index", "", NULL, NULL, 0, 0, 0, NULL },
7535 display_cu_index, &do_debug_cu_index, 0 },
7536 { { ".debug_tu_index", "", NULL, NULL, 0, 0, 0, NULL },
7537 display_cu_index, &do_debug_cu_index, 0 },