1 /* dwarf.c -- display DWARF contents of a BFD binary file
2 Copyright (C) 2005-2017 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"
35 #define MAX(a, b) ((a) > (b) ? (a) : (b))
36 #define MIN(a, b) ((a) < (b) ? (a) : (b))
38 static const char *regname (unsigned int regno, int row);
40 static int have_frame_base;
41 static int need_base_address;
43 static unsigned int num_debug_info_entries = 0;
44 static unsigned int alloc_num_debug_info_entries = 0;
45 static debug_info *debug_information = NULL;
46 /* Special value for num_debug_info_entries to indicate
47 that the .debug_info section could not be loaded/parsed. */
48 #define DEBUG_INFO_UNAVAILABLE (unsigned int) -1
50 unsigned int eh_addr_size;
55 int do_debug_pubnames;
56 int do_debug_pubtypes;
60 int do_debug_frames_interp;
69 int do_debug_cu_index;
72 int dwarf_cutoff_level = -1;
73 unsigned long dwarf_start_die;
77 /* Convenient constant, to avoid having to cast -1 to dwarf_vma when
78 testing whether e.g. a locview list is present. */
79 static const dwarf_vma vm1 = -1;
81 /* Collection of CU/TU section sets from .debug_cu_index and .debug_tu_index
82 sections. For version 1 package files, each set is stored in SHNDX_POOL
83 as a zero-terminated list of section indexes comprising one set of debug
84 sections from a .dwo file. */
86 static unsigned int *shndx_pool = NULL;
87 static unsigned int shndx_pool_size = 0;
88 static unsigned int shndx_pool_used = 0;
90 /* For version 2 package files, each set contains an array of section offsets
91 and an array of section sizes, giving the offset and size of the
92 contribution from a CU or TU within one of the debug sections.
93 When displaying debug info from a package file, we need to use these
94 tables to locate the corresponding contributions to each section. */
99 dwarf_vma section_offsets[DW_SECT_MAX];
100 size_t section_sizes[DW_SECT_MAX];
103 static int cu_count = 0;
104 static int tu_count = 0;
105 static struct cu_tu_set *cu_sets = NULL;
106 static struct cu_tu_set *tu_sets = NULL;
108 static bfd_boolean load_cu_tu_indexes (void *);
110 /* Values for do_debug_lines. */
111 #define FLAG_DEBUG_LINES_RAW 1
112 #define FLAG_DEBUG_LINES_DECODED 2
115 size_of_encoded_value (int encoding)
117 switch (encoding & 0x7)
120 case 0: return eh_addr_size;
128 get_encoded_value (unsigned char **pdata,
130 struct dwarf_section *section,
133 unsigned char * data = * pdata;
134 unsigned int size = size_of_encoded_value (encoding);
137 if (data + size >= end)
139 warn (_("Encoded value extends past end of section\n"));
144 /* PR 17512: file: 002-829853-0.004. */
147 warn (_("Encoded size of %d is too large to read\n"), size);
152 /* PR 17512: file: 1085-5603-0.004. */
155 warn (_("Encoded size of 0 is too small to read\n"));
160 if (encoding & DW_EH_PE_signed)
161 val = byte_get_signed (data, size);
163 val = byte_get (data, size);
165 if ((encoding & 0x70) == DW_EH_PE_pcrel)
166 val += section->address + (data - section->start);
168 * pdata = data + size;
172 #if defined HAVE_LONG_LONG && SIZEOF_LONG_LONG > SIZEOF_LONG
174 # define DWARF_VMA_FMT "ll"
175 # define DWARF_VMA_FMT_LONG "%16.16llx"
177 # define DWARF_VMA_FMT "I64"
178 # define DWARF_VMA_FMT_LONG "%016I64x"
181 # define DWARF_VMA_FMT "l"
182 # define DWARF_VMA_FMT_LONG "%16.16lx"
185 /* Convert a dwarf vma value into a string. Returns a pointer to a static
186 buffer containing the converted VALUE. The value is converted according
187 to the printf formating character FMTCH. If NUM_BYTES is non-zero then
188 it specifies the maximum number of bytes to be displayed in the converted
189 value and FMTCH is ignored - hex is always used. */
192 dwarf_vmatoa_1 (const char *fmtch, dwarf_vma value, unsigned num_bytes)
194 /* As dwarf_vmatoa is used more then once in a printf call
195 for output, we are cycling through an fixed array of pointers
196 for return address. */
197 static int buf_pos = 0;
198 static struct dwarf_vmatoa_buf
204 ret = buf[buf_pos++].place;
205 buf_pos %= ARRAY_SIZE (buf);
209 /* Printf does not have a way of specifying a maximum field width for an
210 integer value, so we print the full value into a buffer and then select
211 the precision we need. */
212 snprintf (ret, sizeof (buf[0].place), DWARF_VMA_FMT_LONG, value);
215 return ret + (16 - 2 * num_bytes);
222 sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch);
224 sprintf (fmt, "%%%s", DWARF_VMA_FMT);
225 snprintf (ret, sizeof (buf[0].place), fmt, value);
230 static inline const char *
231 dwarf_vmatoa (const char * fmtch, dwarf_vma value)
233 return dwarf_vmatoa_1 (fmtch, value, 0);
236 /* Print a dwarf_vma value (typically an address, offset or length) in
237 hexadecimal format, followed by a space. The length of the VALUE (and
238 hence the precision displayed) is determined by the NUM_BYTES parameter. */
241 print_dwarf_vma (dwarf_vma value, unsigned num_bytes)
243 printf ("%s ", dwarf_vmatoa_1 (NULL, value, num_bytes));
246 /* Print a view number in hexadecimal value, with the same width
247 print_dwarf_vma would have printed it with the same num_bytes.
248 Print blanks for zero view, unless force is nonzero. */
251 print_dwarf_view (dwarf_vma value, unsigned num_bytes, int force)
259 assert (value == (unsigned long) value);
261 printf ("v%0*lx ", len - 1, (unsigned long) value);
263 printf ("%*s", len + 1, "");
266 /* Format a 64-bit value, given as two 32-bit values, in hex.
267 For reentrancy, this uses a buffer provided by the caller. */
270 dwarf_vmatoa64 (dwarf_vma hvalue, dwarf_vma lvalue, char *buf,
271 unsigned int buf_len)
276 snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", lvalue);
279 len = snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", hvalue);
280 snprintf (buf + len, buf_len - len,
281 "%08" DWARF_VMA_FMT "x", lvalue);
287 /* Read in a LEB128 encoded value starting at address DATA.
288 If SIGN is true, return a signed LEB128 value.
289 If LENGTH_RETURN is not NULL, return in it the number of bytes read.
290 No bytes will be read at address END or beyond. */
293 read_leb128 (unsigned char *data,
294 unsigned int *length_return,
296 const unsigned char * const end)
298 dwarf_vma result = 0;
299 unsigned int num_read = 0;
300 unsigned int shift = 0;
301 unsigned char byte = 0;
308 result |= ((dwarf_vma) (byte & 0x7f)) << shift;
311 if ((byte & 0x80) == 0)
314 /* PR 17512: file: 0ca183b8.
315 FIXME: Should we signal this error somehow ? */
316 if (shift >= sizeof (result) * 8)
320 if (length_return != NULL)
321 *length_return = num_read;
323 if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
324 result |= -((dwarf_vma) 1 << shift);
329 /* Create a signed version to avoid painful typecasts. */
330 static inline dwarf_signed_vma
331 read_sleb128 (unsigned char * data,
332 unsigned int * length_return,
333 const unsigned char * const end)
335 return (dwarf_signed_vma) read_leb128 (data, length_return, TRUE, end);
338 static inline dwarf_vma
339 read_uleb128 (unsigned char * data,
340 unsigned int * length_return,
341 const unsigned char * const end)
343 return read_leb128 (data, length_return, FALSE, end);
346 #define SKIP_ULEB() read_uleb128 (start, & length_return, end); start += length_return
347 #define SKIP_SLEB() read_sleb128 (start, & length_return, end); start += length_return
349 #define READ_ULEB(var) \
354 (var) = _val = read_uleb128 (start, &length_return, end); \
356 error (_("Internal error: %s:%d: LEB value (%s) " \
357 "too large for containing variable\n"), \
358 __FILE__, __LINE__, dwarf_vmatoa ("u", _val)); \
359 start += length_return; \
363 #define READ_SLEB(var) \
366 dwarf_signed_vma _val; \
368 (var) = _val = read_sleb128 (start, &length_return, end); \
370 error (_("Internal error: %s:%d: LEB value (%s) " \
371 "too large for containing variable\n"), \
372 __FILE__, __LINE__, dwarf_vmatoa ("d", _val)); \
373 start += length_return; \
377 #define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END) \
380 unsigned int amount = (AMOUNT); \
381 if (sizeof (VAL) < amount) \
383 error (_("internal error: attempt to read %d bytes of data in to %d sized variable"),\
384 amount, (int) sizeof (VAL)); \
385 amount = sizeof (VAL); \
387 if (((PTR) + amount) >= (END)) \
390 amount = (END) - (PTR); \
394 if (amount == 0 || amount > 8) \
397 VAL = byte_get ((PTR), amount); \
401 #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
404 SAFE_BYTE_GET (VAL, PTR, AMOUNT, END); \
409 #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END) \
412 unsigned int amount = (AMOUNT); \
413 if (((PTR) + amount) >= (END)) \
416 amount = (END) - (PTR); \
421 VAL = byte_get_signed ((PTR), amount); \
427 #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
430 SAFE_SIGNED_BYTE_GET (VAL, PTR, AMOUNT, END); \
435 #define SAFE_BYTE_GET64(PTR, HIGH, LOW, END) \
438 if (((PTR) + 8) <= (END)) \
440 byte_get_64 ((PTR), (HIGH), (LOW)); \
444 * (LOW) = * (HIGH) = 0; \
449 typedef struct State_Machine_Registers
458 unsigned char op_index;
459 unsigned char end_sequence;
460 /* This variable hold the number of the last entry seen
461 in the File Table. */
462 unsigned int last_file_entry;
465 static SMR state_machine_regs;
468 reset_state_machine (int is_stmt)
470 state_machine_regs.address = 0;
471 state_machine_regs.view = 0;
472 state_machine_regs.op_index = 0;
473 state_machine_regs.file = 1;
474 state_machine_regs.line = 1;
475 state_machine_regs.column = 0;
476 state_machine_regs.is_stmt = is_stmt;
477 state_machine_regs.basic_block = 0;
478 state_machine_regs.end_sequence = 0;
479 state_machine_regs.last_file_entry = 0;
482 /* Handled an extend line op.
483 Returns the number of bytes read. */
486 process_extended_line_op (unsigned char * data,
490 unsigned char op_code;
491 unsigned int bytes_read;
494 unsigned char *orig_data = data;
497 len = read_uleb128 (data, & bytes_read, end);
500 if (len == 0 || data == end || len > (uintptr_t) (end - data))
502 warn (_("Badly formed extended line op encountered!\n"));
509 printf (_(" Extended opcode %d: "), op_code);
513 case DW_LNE_end_sequence:
514 printf (_("End of Sequence\n\n"));
515 reset_state_machine (is_stmt);
518 case DW_LNE_set_address:
519 /* PR 17512: file: 002-100480-0.004. */
520 if (len - bytes_read - 1 > 8)
522 warn (_("Length (%d) of DW_LNE_set_address op is too long\n"),
523 len - bytes_read - 1);
527 SAFE_BYTE_GET (adr, data, len - bytes_read - 1, end);
528 printf (_("set Address to 0x%s\n"), dwarf_vmatoa ("x", adr));
529 state_machine_regs.address = adr;
530 state_machine_regs.view = 0;
531 state_machine_regs.op_index = 0;
534 case DW_LNE_define_file:
535 printf (_("define new File Table entry\n"));
536 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
537 printf (" %d\t", ++state_machine_regs.last_file_entry);
543 l = strnlen ((char *) data, end - data);
545 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
547 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
549 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
551 printf ("%.*s\n\n", (int) l, name);
554 if (((unsigned int) (data - orig_data) != len) || data == end)
555 warn (_("DW_LNE_define_file: Bad opcode length\n"));
558 case DW_LNE_set_discriminator:
559 printf (_("set Discriminator to %s\n"),
560 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
564 case DW_LNE_HP_negate_is_UV_update:
565 printf ("DW_LNE_HP_negate_is_UV_update\n");
567 case DW_LNE_HP_push_context:
568 printf ("DW_LNE_HP_push_context\n");
570 case DW_LNE_HP_pop_context:
571 printf ("DW_LNE_HP_pop_context\n");
573 case DW_LNE_HP_set_file_line_column:
574 printf ("DW_LNE_HP_set_file_line_column\n");
576 case DW_LNE_HP_set_routine_name:
577 printf ("DW_LNE_HP_set_routine_name\n");
579 case DW_LNE_HP_set_sequence:
580 printf ("DW_LNE_HP_set_sequence\n");
582 case DW_LNE_HP_negate_post_semantics:
583 printf ("DW_LNE_HP_negate_post_semantics\n");
585 case DW_LNE_HP_negate_function_exit:
586 printf ("DW_LNE_HP_negate_function_exit\n");
588 case DW_LNE_HP_negate_front_end_logical:
589 printf ("DW_LNE_HP_negate_front_end_logical\n");
591 case DW_LNE_HP_define_proc:
592 printf ("DW_LNE_HP_define_proc\n");
594 case DW_LNE_HP_source_file_correlation:
596 unsigned char *edata = data + len - bytes_read - 1;
598 printf ("DW_LNE_HP_source_file_correlation\n");
604 opc = read_uleb128 (data, & bytes_read, edata);
609 case DW_LNE_HP_SFC_formfeed:
610 printf (" DW_LNE_HP_SFC_formfeed\n");
612 case DW_LNE_HP_SFC_set_listing_line:
613 printf (" DW_LNE_HP_SFC_set_listing_line (%s)\n",
615 read_uleb128 (data, & bytes_read, edata)));
618 case DW_LNE_HP_SFC_associate:
619 printf (" DW_LNE_HP_SFC_associate ");
622 read_uleb128 (data, & bytes_read, edata)));
626 read_uleb128 (data, & bytes_read, edata)));
630 read_uleb128 (data, & bytes_read, edata)));
634 printf (_(" UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc);
644 unsigned int rlen = len - bytes_read - 1;
646 if (op_code >= DW_LNE_lo_user
647 /* The test against DW_LNW_hi_user is redundant due to
648 the limited range of the unsigned char data type used
650 /*&& op_code <= DW_LNE_hi_user*/)
651 printf (_("user defined: "));
653 printf (_("UNKNOWN: "));
654 printf (_("length %d ["), rlen);
656 printf (" %02x", *data++);
665 static const unsigned char *
666 fetch_indirect_string (dwarf_vma offset)
668 struct dwarf_section *section = &debug_displays [str].section;
669 const unsigned char * ret;
671 if (section->start == NULL)
672 return (const unsigned char *) _("<no .debug_str section>");
674 if (offset >= section->size)
676 warn (_("DW_FORM_strp offset too big: %s\n"),
677 dwarf_vmatoa ("x", offset));
678 return (const unsigned char *) _("<offset is too big>");
681 ret = section->start + offset;
682 /* Unfortunately we cannot rely upon the .debug_str section ending with a
683 NUL byte. Since our caller is expecting to receive a well formed C
684 string we test for the lack of a terminating byte here. */
685 if (strnlen ((const char *) ret, section->size - offset)
686 == section->size - offset)
687 ret = (const unsigned char *)
688 _("<no NUL byte at end of .debug_str section>");
693 static const unsigned char *
694 fetch_indirect_line_string (dwarf_vma offset)
696 struct dwarf_section *section = &debug_displays [line_str].section;
697 const unsigned char * ret;
699 if (section->start == NULL)
700 return (const unsigned char *) _("<no .debug_line_str section>");
702 if (offset >= section->size)
704 warn (_("DW_FORM_line_strp offset too big: %s\n"),
705 dwarf_vmatoa ("x", offset));
706 return (const unsigned char *) _("<offset is too big>");
709 ret = section->start + offset;
710 /* Unfortunately we cannot rely upon the .debug_line_str section ending
711 with a NUL byte. Since our caller is expecting to receive a well formed
712 C string we test for the lack of a terminating byte here. */
713 if (strnlen ((const char *) ret, section->size - offset)
714 == section->size - offset)
715 ret = (const unsigned char *)
716 _("<no NUL byte at end of .debug_line_str section>");
722 fetch_indexed_string (dwarf_vma idx, struct cu_tu_set *this_set,
723 dwarf_vma offset_size, int dwo)
725 enum dwarf_section_display_enum str_sec_idx = dwo ? str_dwo : str;
726 enum dwarf_section_display_enum idx_sec_idx = dwo ? str_index_dwo : str_index;
727 struct dwarf_section *index_section = &debug_displays [idx_sec_idx].section;
728 struct dwarf_section *str_section = &debug_displays [str_sec_idx].section;
729 dwarf_vma index_offset = idx * offset_size;
730 dwarf_vma str_offset;
733 if (index_section->start == NULL)
734 return (dwo ? _("<no .debug_str_offsets.dwo section>")
735 : _("<no .debug_str_offsets section>"));
737 if (this_set != NULL)
738 index_offset += this_set->section_offsets [DW_SECT_STR_OFFSETS];
739 if (index_offset >= index_section->size)
741 warn (_("DW_FORM_GNU_str_index offset too big: %s\n"),
742 dwarf_vmatoa ("x", index_offset));
743 return _("<index offset is too big>");
746 if (str_section->start == NULL)
747 return (dwo ? _("<no .debug_str.dwo section>")
748 : _("<no .debug_str section>"));
750 str_offset = byte_get (index_section->start + index_offset, offset_size);
751 str_offset -= str_section->address;
752 if (str_offset >= str_section->size)
754 warn (_("DW_FORM_GNU_str_index indirect offset too big: %s\n"),
755 dwarf_vmatoa ("x", str_offset));
756 return _("<indirect index offset is too big>");
759 ret = (const char *) str_section->start + str_offset;
760 /* Unfortunately we cannot rely upon str_section ending with a NUL byte.
761 Since our caller is expecting to receive a well formed C string we test
762 for the lack of a terminating byte here. */
763 if (strnlen (ret, str_section->size - str_offset)
764 == str_section->size - str_offset)
765 ret = (const char *) _("<no NUL byte at end of section>");
771 fetch_indexed_value (dwarf_vma offset, dwarf_vma bytes)
773 struct dwarf_section *section = &debug_displays [debug_addr].section;
775 if (section->start == NULL)
776 return (_("<no .debug_addr section>"));
778 if (offset + bytes > section->size)
780 warn (_("Offset into section %s too big: %s\n"),
781 section->name, dwarf_vmatoa ("x", offset));
782 return "<offset too big>";
785 return dwarf_vmatoa ("x", byte_get (section->start + offset, bytes));
789 /* FIXME: There are better and more efficient ways to handle
790 these structures. For now though, I just want something that
791 is simple to implement. */
792 typedef struct abbrev_attr
794 unsigned long attribute;
796 bfd_signed_vma implicit_const;
797 struct abbrev_attr *next;
801 typedef struct abbrev_entry
806 struct abbrev_attr *first_attr;
807 struct abbrev_attr *last_attr;
808 struct abbrev_entry *next;
812 static abbrev_entry *first_abbrev = NULL;
813 static abbrev_entry *last_abbrev = NULL;
820 for (abbrv = first_abbrev; abbrv;)
822 abbrev_entry *next_abbrev = abbrv->next;
825 for (attr = abbrv->first_attr; attr;)
827 abbrev_attr *next_attr = attr->next;
837 last_abbrev = first_abbrev = NULL;
841 add_abbrev (unsigned long number, unsigned long tag, int children)
845 entry = (abbrev_entry *) malloc (sizeof (*entry));
850 entry->entry = number;
852 entry->children = children;
853 entry->first_attr = NULL;
854 entry->last_attr = NULL;
857 if (first_abbrev == NULL)
858 first_abbrev = entry;
860 last_abbrev->next = entry;
866 add_abbrev_attr (unsigned long attribute, unsigned long form,
867 bfd_signed_vma implicit_const)
871 attr = (abbrev_attr *) malloc (sizeof (*attr));
876 attr->attribute = attribute;
878 attr->implicit_const = implicit_const;
881 if (last_abbrev->first_attr == NULL)
882 last_abbrev->first_attr = attr;
884 last_abbrev->last_attr->next = attr;
886 last_abbrev->last_attr = attr;
889 /* Processes the (partial) contents of a .debug_abbrev section.
890 Returns NULL if the end of the section was encountered.
891 Returns the address after the last byte read if the end of
892 an abbreviation set was found. */
894 static unsigned char *
895 process_abbrev_section (unsigned char *start, unsigned char *end)
897 if (first_abbrev != NULL)
902 unsigned int bytes_read;
905 unsigned long attribute;
908 entry = read_uleb128 (start, & bytes_read, end);
911 /* A single zero is supposed to end the section according
912 to the standard. If there's more, then signal that to
919 tag = read_uleb128 (start, & bytes_read, end);
926 add_abbrev (entry, tag, children);
931 /* Initialize it due to a false compiler warning. */
932 bfd_signed_vma implicit_const = -1;
934 attribute = read_uleb128 (start, & bytes_read, end);
939 form = read_uleb128 (start, & bytes_read, end);
944 if (form == DW_FORM_implicit_const)
946 implicit_const = read_sleb128 (start, & bytes_read, end);
952 add_abbrev_attr (attribute, form, implicit_const);
954 while (attribute != 0);
957 /* Report the missing single zero which ends the section. */
958 error (_(".debug_abbrev section not zero terminated\n"));
964 get_TAG_name (unsigned long tag)
966 const char *name = get_DW_TAG_name ((unsigned int)tag);
970 static char buffer[100];
972 snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag);
980 get_FORM_name (unsigned long form)
985 return "DW_FORM value: 0";
987 name = get_DW_FORM_name (form);
990 static char buffer[100];
992 snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
1000 get_IDX_name (unsigned long idx)
1002 const char *name = get_DW_IDX_name ((unsigned int) idx);
1006 static char buffer[100];
1008 snprintf (buffer, sizeof (buffer), _("Unknown IDX value: %lx"), idx);
1015 static unsigned char *
1016 display_block (unsigned char *data,
1018 const unsigned char * const end, char delimiter)
1022 printf (_("%c%s byte block: "), delimiter, dwarf_vmatoa ("u", length));
1024 return (unsigned char *) end;
1026 maxlen = (dwarf_vma) (end - data);
1027 length = length > maxlen ? maxlen : length;
1030 printf ("%lx ", (unsigned long) byte_get (data++, 1));
1036 decode_location_expression (unsigned char * data,
1037 unsigned int pointer_size,
1038 unsigned int offset_size,
1041 dwarf_vma cu_offset,
1042 struct dwarf_section * section)
1045 unsigned int bytes_read;
1047 dwarf_signed_vma svalue;
1048 unsigned char *end = data + length;
1049 int need_frame_base = 0;
1058 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1059 printf ("DW_OP_addr: %s", dwarf_vmatoa ("x", uvalue));
1062 printf ("DW_OP_deref");
1065 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1066 printf ("DW_OP_const1u: %lu", (unsigned long) uvalue);
1069 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 1, end);
1070 printf ("DW_OP_const1s: %ld", (long) svalue);
1073 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1074 printf ("DW_OP_const2u: %lu", (unsigned long) uvalue);
1077 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1078 printf ("DW_OP_const2s: %ld", (long) svalue);
1081 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1082 printf ("DW_OP_const4u: %lu", (unsigned long) uvalue);
1085 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1086 printf ("DW_OP_const4s: %ld", (long) svalue);
1089 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1090 printf ("DW_OP_const8u: %lu ", (unsigned long) uvalue);
1091 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1092 printf ("%lu", (unsigned long) uvalue);
1095 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1096 printf ("DW_OP_const8s: %ld ", (long) svalue);
1097 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1098 printf ("%ld", (long) svalue);
1101 printf ("DW_OP_constu: %s",
1102 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1106 printf ("DW_OP_consts: %s",
1107 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1111 printf ("DW_OP_dup");
1114 printf ("DW_OP_drop");
1117 printf ("DW_OP_over");
1120 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1121 printf ("DW_OP_pick: %ld", (unsigned long) uvalue);
1124 printf ("DW_OP_swap");
1127 printf ("DW_OP_rot");
1130 printf ("DW_OP_xderef");
1133 printf ("DW_OP_abs");
1136 printf ("DW_OP_and");
1139 printf ("DW_OP_div");
1142 printf ("DW_OP_minus");
1145 printf ("DW_OP_mod");
1148 printf ("DW_OP_mul");
1151 printf ("DW_OP_neg");
1154 printf ("DW_OP_not");
1157 printf ("DW_OP_or");
1160 printf ("DW_OP_plus");
1162 case DW_OP_plus_uconst:
1163 printf ("DW_OP_plus_uconst: %s",
1164 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1168 printf ("DW_OP_shl");
1171 printf ("DW_OP_shr");
1174 printf ("DW_OP_shra");
1177 printf ("DW_OP_xor");
1180 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1181 printf ("DW_OP_bra: %ld", (long) svalue);
1184 printf ("DW_OP_eq");
1187 printf ("DW_OP_ge");
1190 printf ("DW_OP_gt");
1193 printf ("DW_OP_le");
1196 printf ("DW_OP_lt");
1199 printf ("DW_OP_ne");
1202 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1203 printf ("DW_OP_skip: %ld", (long) svalue);
1238 printf ("DW_OP_lit%d", op - DW_OP_lit0);
1273 printf ("DW_OP_reg%d (%s)", op - DW_OP_reg0,
1274 regname (op - DW_OP_reg0, 1));
1309 printf ("DW_OP_breg%d (%s): %s",
1311 regname (op - DW_OP_breg0, 1),
1312 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1317 uvalue = read_uleb128 (data, &bytes_read, end);
1319 printf ("DW_OP_regx: %s (%s)",
1320 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1323 need_frame_base = 1;
1324 printf ("DW_OP_fbreg: %s",
1325 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1329 uvalue = read_uleb128 (data, &bytes_read, end);
1331 printf ("DW_OP_bregx: %s (%s) %s",
1332 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1),
1333 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1337 printf ("DW_OP_piece: %s",
1338 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1341 case DW_OP_deref_size:
1342 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1343 printf ("DW_OP_deref_size: %ld", (long) uvalue);
1345 case DW_OP_xderef_size:
1346 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1347 printf ("DW_OP_xderef_size: %ld", (long) uvalue);
1350 printf ("DW_OP_nop");
1353 /* DWARF 3 extensions. */
1354 case DW_OP_push_object_address:
1355 printf ("DW_OP_push_object_address");
1358 /* XXX: Strictly speaking for 64-bit DWARF3 files
1359 this ought to be an 8-byte wide computation. */
1360 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1361 printf ("DW_OP_call2: <0x%s>",
1362 dwarf_vmatoa ("x", svalue + cu_offset));
1365 /* XXX: Strictly speaking for 64-bit DWARF3 files
1366 this ought to be an 8-byte wide computation. */
1367 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1368 printf ("DW_OP_call4: <0x%s>",
1369 dwarf_vmatoa ("x", svalue + cu_offset));
1371 case DW_OP_call_ref:
1372 /* XXX: Strictly speaking for 64-bit DWARF3 files
1373 this ought to be an 8-byte wide computation. */
1374 if (dwarf_version == -1)
1376 printf (_("(DW_OP_call_ref in frame info)"));
1377 /* No way to tell where the next op is, so just bail. */
1378 return need_frame_base;
1380 if (dwarf_version == 2)
1382 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1386 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1388 printf ("DW_OP_call_ref: <0x%s>", dwarf_vmatoa ("x", uvalue));
1390 case DW_OP_form_tls_address:
1391 printf ("DW_OP_form_tls_address");
1393 case DW_OP_call_frame_cfa:
1394 printf ("DW_OP_call_frame_cfa");
1396 case DW_OP_bit_piece:
1397 printf ("DW_OP_bit_piece: ");
1398 printf (_("size: %s "),
1399 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1401 printf (_("offset: %s "),
1402 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1406 /* DWARF 4 extensions. */
1407 case DW_OP_stack_value:
1408 printf ("DW_OP_stack_value");
1411 case DW_OP_implicit_value:
1412 printf ("DW_OP_implicit_value");
1413 uvalue = read_uleb128 (data, &bytes_read, end);
1415 data = display_block (data, uvalue, end, ' ');
1418 /* GNU extensions. */
1419 case DW_OP_GNU_push_tls_address:
1420 printf (_("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown"));
1422 case DW_OP_GNU_uninit:
1423 printf ("DW_OP_GNU_uninit");
1424 /* FIXME: Is there data associated with this OP ? */
1426 case DW_OP_GNU_encoded_addr:
1433 addr = get_encoded_value (&data, encoding, section, end);
1435 printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding);
1436 print_dwarf_vma (addr, pointer_size);
1439 case DW_OP_implicit_pointer:
1440 case DW_OP_GNU_implicit_pointer:
1441 /* XXX: Strictly speaking for 64-bit DWARF3 files
1442 this ought to be an 8-byte wide computation. */
1443 if (dwarf_version == -1)
1445 printf (_("(%s in frame info)"),
1446 (op == DW_OP_implicit_pointer
1447 ? "DW_OP_implicit_pointer"
1448 : "DW_OP_GNU_implicit_pointer"));
1449 /* No way to tell where the next op is, so just bail. */
1450 return need_frame_base;
1452 if (dwarf_version == 2)
1454 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1458 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1460 printf ("%s: <0x%s> %s",
1461 (op == DW_OP_implicit_pointer
1462 ? "DW_OP_implicit_pointer" : "DW_OP_GNU_implicit_pointer"),
1463 dwarf_vmatoa ("x", uvalue),
1464 dwarf_vmatoa ("d", read_sleb128 (data,
1465 &bytes_read, end)));
1468 case DW_OP_entry_value:
1469 case DW_OP_GNU_entry_value:
1470 uvalue = read_uleb128 (data, &bytes_read, end);
1472 /* PR 17531: file: 0cc9cd00. */
1473 if (uvalue > (dwarf_vma) (end - data))
1474 uvalue = end - data;
1475 printf ("%s: (", (op == DW_OP_entry_value ? "DW_OP_entry_value"
1476 : "DW_OP_GNU_entry_value"));
1477 if (decode_location_expression (data, pointer_size, offset_size,
1478 dwarf_version, uvalue,
1479 cu_offset, section))
1480 need_frame_base = 1;
1486 case DW_OP_const_type:
1487 case DW_OP_GNU_const_type:
1488 uvalue = read_uleb128 (data, &bytes_read, end);
1490 printf ("%s: <0x%s> ",
1491 (op == DW_OP_const_type ? "DW_OP_const_type"
1492 : "DW_OP_GNU_const_type"),
1493 dwarf_vmatoa ("x", cu_offset + uvalue));
1494 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1495 data = display_block (data, uvalue, end, ' ');
1497 case DW_OP_regval_type:
1498 case DW_OP_GNU_regval_type:
1499 uvalue = read_uleb128 (data, &bytes_read, end);
1501 printf ("%s: %s (%s)",
1502 (op == DW_OP_regval_type ? "DW_OP_regval_type"
1503 : "DW_OP_GNU_regval_type"),
1504 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1505 uvalue = read_uleb128 (data, &bytes_read, end);
1507 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1509 case DW_OP_deref_type:
1510 case DW_OP_GNU_deref_type:
1511 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1513 (op == DW_OP_deref_type ? "DW_OP_deref_type"
1514 : "DW_OP_GNU_deref_type"),
1516 uvalue = read_uleb128 (data, &bytes_read, end);
1518 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1521 case DW_OP_GNU_convert:
1522 uvalue = read_uleb128 (data, &bytes_read, end);
1524 printf ("%s <0x%s>",
1525 (op == DW_OP_convert ? "DW_OP_convert" : "DW_OP_GNU_convert"),
1526 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1528 case DW_OP_reinterpret:
1529 case DW_OP_GNU_reinterpret:
1530 uvalue = read_uleb128 (data, &bytes_read, end);
1532 printf ("%s <0x%s>",
1533 (op == DW_OP_reinterpret ? "DW_OP_reinterpret"
1534 : "DW_OP_GNU_reinterpret"),
1535 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1537 case DW_OP_GNU_parameter_ref:
1538 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1539 printf ("DW_OP_GNU_parameter_ref: <0x%s>",
1540 dwarf_vmatoa ("x", cu_offset + uvalue));
1542 case DW_OP_GNU_addr_index:
1543 uvalue = read_uleb128 (data, &bytes_read, end);
1545 printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1547 case DW_OP_GNU_const_index:
1548 uvalue = read_uleb128 (data, &bytes_read, end);
1550 printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1553 /* HP extensions. */
1554 case DW_OP_HP_is_value:
1555 printf ("DW_OP_HP_is_value");
1556 /* FIXME: Is there data associated with this OP ? */
1558 case DW_OP_HP_fltconst4:
1559 printf ("DW_OP_HP_fltconst4");
1560 /* FIXME: Is there data associated with this OP ? */
1562 case DW_OP_HP_fltconst8:
1563 printf ("DW_OP_HP_fltconst8");
1564 /* FIXME: Is there data associated with this OP ? */
1566 case DW_OP_HP_mod_range:
1567 printf ("DW_OP_HP_mod_range");
1568 /* FIXME: Is there data associated with this OP ? */
1570 case DW_OP_HP_unmod_range:
1571 printf ("DW_OP_HP_unmod_range");
1572 /* FIXME: Is there data associated with this OP ? */
1575 printf ("DW_OP_HP_tls");
1576 /* FIXME: Is there data associated with this OP ? */
1579 /* PGI (STMicroelectronics) extensions. */
1580 case DW_OP_PGI_omp_thread_num:
1581 /* Pushes the thread number for the current thread as it would be
1582 returned by the standard OpenMP library function:
1583 omp_get_thread_num(). The "current thread" is the thread for
1584 which the expression is being evaluated. */
1585 printf ("DW_OP_PGI_omp_thread_num");
1589 if (op >= DW_OP_lo_user
1590 && op <= DW_OP_hi_user)
1591 printf (_("(User defined location op 0x%x)"), op);
1593 printf (_("(Unknown location op 0x%x)"), op);
1594 /* No way to tell where the next op is, so just bail. */
1595 return need_frame_base;
1598 /* Separate the ops. */
1603 return need_frame_base;
1606 /* Find the CU or TU set corresponding to the given CU_OFFSET.
1607 This is used for DWARF package files. */
1609 static struct cu_tu_set *
1610 find_cu_tu_set_v2 (dwarf_vma cu_offset, int do_types)
1612 struct cu_tu_set *p;
1614 unsigned int dw_sect;
1620 dw_sect = DW_SECT_TYPES;
1626 dw_sect = DW_SECT_INFO;
1630 if (p->section_offsets [dw_sect] == cu_offset)
1638 /* Add INC to HIGH_BITS:LOW_BITS. */
1640 add64 (dwarf_vma * high_bits, dwarf_vma * low_bits, dwarf_vma inc)
1642 dwarf_vma tmp = * low_bits;
1646 /* FIXME: There is probably a better way of handling this:
1648 We need to cope with dwarf_vma being a 32-bit or 64-bit
1649 type. Plus regardless of its size LOW_BITS is meant to
1650 only hold 32-bits, so if there is overflow or wrap around
1651 we must propagate into HIGH_BITS. */
1652 if (tmp < * low_bits)
1656 else if (sizeof (tmp) > 8
1666 static unsigned char *
1667 read_and_display_attr_value (unsigned long attribute,
1669 dwarf_signed_vma implicit_const,
1670 unsigned char * data,
1671 unsigned char * end,
1672 dwarf_vma cu_offset,
1673 dwarf_vma pointer_size,
1674 dwarf_vma offset_size,
1676 debug_info * debug_info_p,
1678 struct dwarf_section * section,
1679 struct cu_tu_set * this_set, char delimiter)
1681 dwarf_vma uvalue = 0;
1682 unsigned char *block_start = NULL;
1683 unsigned char * orig_data = data;
1684 unsigned int bytes_read;
1686 if (data > end || (data == end && form != DW_FORM_flag_present))
1688 warn (_("Corrupt attribute\n"));
1697 case DW_FORM_ref_addr:
1698 if (dwarf_version == 2)
1699 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1700 else if (dwarf_version == 3 || dwarf_version == 4)
1701 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1703 error (_("Internal error: DWARF version is not 2, 3 or 4.\n"));
1708 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1712 case DW_FORM_line_strp:
1713 case DW_FORM_sec_offset:
1714 case DW_FORM_GNU_ref_alt:
1715 case DW_FORM_GNU_strp_alt:
1716 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1719 case DW_FORM_flag_present:
1726 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1731 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1736 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1740 uvalue = read_sleb128 (data, & bytes_read, end);
1744 case DW_FORM_GNU_str_index:
1745 uvalue = read_uleb128 (data, & bytes_read, end);
1749 case DW_FORM_ref_udata:
1751 uvalue = read_uleb128 (data, & bytes_read, end);
1755 case DW_FORM_indirect:
1756 form = read_uleb128 (data, & bytes_read, end);
1759 printf ("%c%s", delimiter, get_FORM_name (form));
1760 if (form == DW_FORM_implicit_const)
1762 implicit_const = read_sleb128 (data, & bytes_read, end);
1765 return read_and_display_attr_value (attribute, form, implicit_const, data,
1766 end, cu_offset, pointer_size,
1767 offset_size, dwarf_version,
1768 debug_info_p, do_loc,
1769 section, this_set, delimiter);
1770 case DW_FORM_GNU_addr_index:
1771 uvalue = read_uleb128 (data, & bytes_read, end);
1778 case DW_FORM_ref_addr:
1780 printf ("%c<0x%s>", delimiter, dwarf_vmatoa ("x",uvalue));
1783 case DW_FORM_GNU_ref_alt:
1785 printf ("%c<alt 0x%s>", delimiter, dwarf_vmatoa ("x",uvalue));
1791 case DW_FORM_ref_udata:
1793 printf ("%c<0x%s>", delimiter, dwarf_vmatoa ("x", uvalue + cu_offset));
1798 case DW_FORM_sec_offset:
1800 printf ("%c0x%s", delimiter, dwarf_vmatoa ("x", uvalue));
1803 case DW_FORM_flag_present:
1810 printf ("%c%s", delimiter, dwarf_vmatoa ("d", uvalue));
1813 case DW_FORM_implicit_const:
1815 printf ("%c%s", delimiter, dwarf_vmatoa ("d", implicit_const));
1822 dwarf_vma high_bits;
1826 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1828 if (form == DW_FORM_ref8)
1829 add64 (& high_bits, & utmp, cu_offset);
1830 printf ("%c0x%s", delimiter,
1831 dwarf_vmatoa64 (high_bits, utmp, buf, sizeof (buf)));
1834 if ((do_loc || do_debug_loc || do_debug_ranges)
1835 && num_debug_info_entries == 0)
1837 if (sizeof (uvalue) == 8)
1838 SAFE_BYTE_GET (uvalue, data, 8, end);
1840 error (_("DW_FORM_data8 is unsupported when sizeof (dwarf_vma) != 8\n"));
1846 case DW_FORM_data16:
1849 dwarf_vma left_high_bits, left_low_bits;
1850 dwarf_vma right_high_bits, right_low_bits;
1852 SAFE_BYTE_GET64 (data, &left_high_bits, &left_low_bits, end);
1853 SAFE_BYTE_GET64 (data + 8, &right_high_bits, &right_low_bits, end);
1854 if (byte_get == byte_get_little_endian)
1857 left_high_bits ^= right_high_bits;
1858 right_high_bits ^= left_high_bits;
1859 left_high_bits ^= right_high_bits;
1860 left_low_bits ^= right_low_bits;
1861 right_low_bits ^= left_low_bits;
1862 left_low_bits ^= right_low_bits;
1864 printf (" 0x%08" DWARF_VMA_FMT "x%08" DWARF_VMA_FMT "x"
1865 "%08" DWARF_VMA_FMT "x%08" DWARF_VMA_FMT "x",
1866 left_high_bits, left_low_bits, right_high_bits,
1872 case DW_FORM_string:
1874 printf ("%c%.*s", delimiter, (int) (end - data), data);
1875 data += strnlen ((char *) data, end - data) + 1;
1879 case DW_FORM_exprloc:
1880 uvalue = read_uleb128 (data, & bytes_read, end);
1881 block_start = data + bytes_read;
1882 if (block_start >= end)
1884 warn (_("Block ends prematurely\n"));
1888 /* FIXME: Testing "(block_start + uvalue) < block_start" miscompiles with
1889 gcc 4.8.3 running on an x86_64 host in 32-bit mode. So we pre-compute
1890 block_start + uvalue here. */
1891 data = block_start + uvalue;
1892 /* PR 17512: file: 008-103549-0.001:0.1. */
1893 if (block_start + uvalue > end || data < block_start)
1895 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1896 uvalue = end - block_start;
1899 data = block_start + uvalue;
1901 data = display_block (block_start, uvalue, end, delimiter);
1904 case DW_FORM_block1:
1905 SAFE_BYTE_GET (uvalue, data, 1, end);
1906 block_start = data + 1;
1907 if (block_start >= end)
1909 warn (_("Block ends prematurely\n"));
1913 data = block_start + uvalue;
1914 if (block_start + uvalue > end || data < block_start)
1916 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1917 uvalue = end - block_start;
1920 data = block_start + uvalue;
1922 data = display_block (block_start, uvalue, end, delimiter);
1925 case DW_FORM_block2:
1926 SAFE_BYTE_GET (uvalue, data, 2, end);
1927 block_start = data + 2;
1928 if (block_start >= end)
1930 warn (_("Block ends prematurely\n"));
1934 data = block_start + uvalue;
1935 if (block_start + uvalue > end || data < block_start)
1937 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1938 uvalue = end - block_start;
1941 data = block_start + uvalue;
1943 data = display_block (block_start, uvalue, end, delimiter);
1946 case DW_FORM_block4:
1947 SAFE_BYTE_GET (uvalue, data, 4, end);
1948 block_start = data + 4;
1949 /* PR 17512: file: 3371-3907-0.004. */
1950 if (block_start >= end)
1952 warn (_("Block ends prematurely\n"));
1956 data = block_start + uvalue;
1957 if (block_start + uvalue > end
1958 /* PR 17531: file: 5b5f0592. */
1959 || data < block_start)
1961 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1962 uvalue = end - block_start;
1965 data = block_start + uvalue;
1967 data = display_block (block_start, uvalue, end, delimiter);
1972 printf (_("%c(indirect string, offset: 0x%s): %s"), delimiter,
1973 dwarf_vmatoa ("x", uvalue),
1974 fetch_indirect_string (uvalue));
1977 case DW_FORM_line_strp:
1979 printf (_("%c(indirect line string, offset: 0x%s): %s"), delimiter,
1980 dwarf_vmatoa ("x", uvalue),
1981 fetch_indirect_line_string (uvalue));
1984 case DW_FORM_GNU_str_index:
1987 const char *suffix = strrchr (section->name, '.');
1988 int dwo = (suffix && strcmp (suffix, ".dwo") == 0) ? 1 : 0;
1990 printf (_("%c(indexed string: 0x%s): %s"), delimiter,
1991 dwarf_vmatoa ("x", uvalue),
1992 fetch_indexed_string (uvalue, this_set, offset_size, dwo));
1996 case DW_FORM_GNU_strp_alt:
1998 printf (_("%c(alt indirect string, offset: 0x%s)"), delimiter,
1999 dwarf_vmatoa ("x", uvalue));
2002 case DW_FORM_indirect:
2003 /* Handled above. */
2006 case DW_FORM_ref_sig8:
2009 dwarf_vma high_bits;
2012 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
2013 printf ("%csignature: 0x%s", delimiter,
2014 dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf)));
2019 case DW_FORM_GNU_addr_index:
2021 printf (_("%c(addr_index: 0x%s): %s"), delimiter,
2022 dwarf_vmatoa ("x", uvalue),
2023 fetch_indexed_value (uvalue * pointer_size, pointer_size));
2027 warn (_("Unrecognized form: %lu\n"), form);
2031 if ((do_loc || do_debug_loc || do_debug_ranges)
2032 && num_debug_info_entries == 0
2033 && debug_info_p != NULL)
2037 case DW_AT_frame_base:
2038 have_frame_base = 1;
2040 case DW_AT_location:
2041 case DW_AT_GNU_locviews:
2042 case DW_AT_string_length:
2043 case DW_AT_return_addr:
2044 case DW_AT_data_member_location:
2045 case DW_AT_vtable_elem_location:
2047 case DW_AT_static_link:
2048 case DW_AT_use_location:
2049 case DW_AT_call_value:
2050 case DW_AT_GNU_call_site_value:
2051 case DW_AT_call_data_value:
2052 case DW_AT_GNU_call_site_data_value:
2053 case DW_AT_call_target:
2054 case DW_AT_GNU_call_site_target:
2055 case DW_AT_call_target_clobbered:
2056 case DW_AT_GNU_call_site_target_clobbered:
2057 if ((dwarf_version < 4
2058 && (form == DW_FORM_data4 || form == DW_FORM_data8))
2059 || form == DW_FORM_sec_offset)
2061 /* Process location list. */
2062 unsigned int lmax = debug_info_p->max_loc_offsets;
2063 unsigned int num = debug_info_p->num_loc_offsets;
2065 if (lmax == 0 || num >= lmax)
2068 debug_info_p->loc_offsets = (dwarf_vma *)
2069 xcrealloc (debug_info_p->loc_offsets,
2070 lmax, sizeof (*debug_info_p->loc_offsets));
2071 debug_info_p->loc_views = (dwarf_vma *)
2072 xcrealloc (debug_info_p->loc_views,
2073 lmax, sizeof (*debug_info_p->loc_views));
2074 debug_info_p->have_frame_base = (int *)
2075 xcrealloc (debug_info_p->have_frame_base,
2076 lmax, sizeof (*debug_info_p->have_frame_base));
2077 debug_info_p->max_loc_offsets = lmax;
2079 if (this_set != NULL)
2080 uvalue += this_set->section_offsets [DW_SECT_LOC];
2081 debug_info_p->have_frame_base [num] = have_frame_base;
2082 if (attribute != DW_AT_GNU_locviews)
2084 debug_info_p->loc_offsets [num] = uvalue;
2085 debug_info_p->num_loc_offsets++;
2086 assert (debug_info_p->num_loc_offsets
2087 - debug_info_p->num_loc_views <= 1);
2091 assert (debug_info_p->num_loc_views <= num);
2092 num = debug_info_p->num_loc_views;
2093 debug_info_p->loc_views [num] = uvalue;
2094 debug_info_p->num_loc_views++;
2095 assert (debug_info_p->num_loc_views
2096 - debug_info_p->num_loc_offsets <= 1);
2102 if (need_base_address)
2103 debug_info_p->base_address = uvalue;
2106 case DW_AT_GNU_addr_base:
2107 debug_info_p->addr_base = uvalue;
2110 case DW_AT_GNU_ranges_base:
2111 debug_info_p->ranges_base = uvalue;
2115 if ((dwarf_version < 4
2116 && (form == DW_FORM_data4 || form == DW_FORM_data8))
2117 || form == DW_FORM_sec_offset)
2119 /* Process range list. */
2120 unsigned int lmax = debug_info_p->max_range_lists;
2121 unsigned int num = debug_info_p->num_range_lists;
2123 if (lmax == 0 || num >= lmax)
2126 debug_info_p->range_lists = (dwarf_vma *)
2127 xcrealloc (debug_info_p->range_lists,
2128 lmax, sizeof (*debug_info_p->range_lists));
2129 debug_info_p->max_range_lists = lmax;
2131 debug_info_p->range_lists [num] = uvalue;
2132 debug_info_p->num_range_lists++;
2141 if (do_loc || attribute == 0)
2144 /* For some attributes we can display further information. */
2151 case DW_INL_not_inlined:
2152 printf (_("(not inlined)"));
2154 case DW_INL_inlined:
2155 printf (_("(inlined)"));
2157 case DW_INL_declared_not_inlined:
2158 printf (_("(declared as inline but ignored)"));
2160 case DW_INL_declared_inlined:
2161 printf (_("(declared as inline and inlined)"));
2164 printf (_(" (Unknown inline attribute value: %s)"),
2165 dwarf_vmatoa ("x", uvalue));
2170 case DW_AT_language:
2174 /* Ordered by the numeric value of these constants. */
2175 case DW_LANG_C89: printf ("(ANSI C)"); break;
2176 case DW_LANG_C: printf ("(non-ANSI C)"); break;
2177 case DW_LANG_Ada83: printf ("(Ada)"); break;
2178 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
2179 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
2180 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
2181 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
2182 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
2183 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
2184 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
2185 /* DWARF 2.1 values. */
2186 case DW_LANG_Java: printf ("(Java)"); break;
2187 case DW_LANG_C99: printf ("(ANSI C99)"); break;
2188 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
2189 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
2190 /* DWARF 3 values. */
2191 case DW_LANG_PLI: printf ("(PLI)"); break;
2192 case DW_LANG_ObjC: printf ("(Objective C)"); break;
2193 case DW_LANG_ObjC_plus_plus: printf ("(Objective C++)"); break;
2194 case DW_LANG_UPC: printf ("(Unified Parallel C)"); break;
2195 case DW_LANG_D: printf ("(D)"); break;
2196 /* DWARF 4 values. */
2197 case DW_LANG_Python: printf ("(Python)"); break;
2198 /* DWARF 5 values. */
2199 case DW_LANG_Go: printf ("(Go)"); break;
2200 case DW_LANG_C_plus_plus_11: printf ("(C++11)"); break;
2201 case DW_LANG_C11: printf ("(C11)"); break;
2202 case DW_LANG_C_plus_plus_14: printf ("(C++14)"); break;
2203 case DW_LANG_Fortran03: printf ("(Fortran 03)"); break;
2204 case DW_LANG_Fortran08: printf ("(Fortran 08)"); break;
2205 /* MIPS extension. */
2206 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
2207 /* UPC extension. */
2208 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
2210 if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
2211 printf (_("(implementation defined: %s)"),
2212 dwarf_vmatoa ("x", uvalue));
2214 printf (_("(Unknown: %s)"), dwarf_vmatoa ("x", uvalue));
2219 case DW_AT_encoding:
2223 case DW_ATE_void: printf ("(void)"); break;
2224 case DW_ATE_address: printf ("(machine address)"); break;
2225 case DW_ATE_boolean: printf ("(boolean)"); break;
2226 case DW_ATE_complex_float: printf ("(complex float)"); break;
2227 case DW_ATE_float: printf ("(float)"); break;
2228 case DW_ATE_signed: printf ("(signed)"); break;
2229 case DW_ATE_signed_char: printf ("(signed char)"); break;
2230 case DW_ATE_unsigned: printf ("(unsigned)"); break;
2231 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
2232 /* DWARF 2.1 values: */
2233 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
2234 case DW_ATE_decimal_float: printf ("(decimal float)"); break;
2235 /* DWARF 3 values: */
2236 case DW_ATE_packed_decimal: printf ("(packed_decimal)"); break;
2237 case DW_ATE_numeric_string: printf ("(numeric_string)"); break;
2238 case DW_ATE_edited: printf ("(edited)"); break;
2239 case DW_ATE_signed_fixed: printf ("(signed_fixed)"); break;
2240 case DW_ATE_unsigned_fixed: printf ("(unsigned_fixed)"); break;
2241 /* HP extensions: */
2242 case DW_ATE_HP_float80: printf ("(HP_float80)"); break;
2243 case DW_ATE_HP_complex_float80: printf ("(HP_complex_float80)"); break;
2244 case DW_ATE_HP_float128: printf ("(HP_float128)"); break;
2245 case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
2246 case DW_ATE_HP_floathpintel: printf ("(HP_floathpintel)"); break;
2247 case DW_ATE_HP_imaginary_float80: printf ("(HP_imaginary_float80)"); break;
2248 case DW_ATE_HP_imaginary_float128: printf ("(HP_imaginary_float128)"); break;
2249 /* DWARF 4 values: */
2250 case DW_ATE_UTF: printf ("(unicode string)"); break;
2253 if (uvalue >= DW_ATE_lo_user
2254 && uvalue <= DW_ATE_hi_user)
2255 printf (_("(user defined type)"));
2257 printf (_("(unknown type)"));
2262 case DW_AT_accessibility:
2266 case DW_ACCESS_public: printf ("(public)"); break;
2267 case DW_ACCESS_protected: printf ("(protected)"); break;
2268 case DW_ACCESS_private: printf ("(private)"); break;
2270 printf (_("(unknown accessibility)"));
2275 case DW_AT_visibility:
2279 case DW_VIS_local: printf ("(local)"); break;
2280 case DW_VIS_exported: printf ("(exported)"); break;
2281 case DW_VIS_qualified: printf ("(qualified)"); break;
2282 default: printf (_("(unknown visibility)")); break;
2286 case DW_AT_virtuality:
2290 case DW_VIRTUALITY_none: printf ("(none)"); break;
2291 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
2292 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
2293 default: printf (_("(unknown virtuality)")); break;
2297 case DW_AT_identifier_case:
2301 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
2302 case DW_ID_up_case: printf ("(up_case)"); break;
2303 case DW_ID_down_case: printf ("(down_case)"); break;
2304 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
2305 default: printf (_("(unknown case)")); break;
2309 case DW_AT_calling_convention:
2313 case DW_CC_normal: printf ("(normal)"); break;
2314 case DW_CC_program: printf ("(program)"); break;
2315 case DW_CC_nocall: printf ("(nocall)"); break;
2317 if (uvalue >= DW_CC_lo_user
2318 && uvalue <= DW_CC_hi_user)
2319 printf (_("(user defined)"));
2321 printf (_("(unknown convention)"));
2325 case DW_AT_ordering:
2329 case -1: printf (_("(undefined)")); break;
2330 case 0: printf ("(row major)"); break;
2331 case 1: printf ("(column major)"); break;
2335 case DW_AT_frame_base:
2336 have_frame_base = 1;
2338 case DW_AT_location:
2339 case DW_AT_string_length:
2340 case DW_AT_return_addr:
2341 case DW_AT_data_member_location:
2342 case DW_AT_vtable_elem_location:
2344 case DW_AT_static_link:
2345 case DW_AT_use_location:
2346 case DW_AT_call_value:
2347 case DW_AT_GNU_call_site_value:
2348 case DW_AT_call_data_value:
2349 case DW_AT_GNU_call_site_data_value:
2350 case DW_AT_call_target:
2351 case DW_AT_GNU_call_site_target:
2352 case DW_AT_call_target_clobbered:
2353 case DW_AT_GNU_call_site_target_clobbered:
2354 if ((dwarf_version < 4
2355 && (form == DW_FORM_data4 || form == DW_FORM_data8))
2356 || form == DW_FORM_sec_offset)
2357 printf (_(" (location list)"));
2359 case DW_AT_allocated:
2360 case DW_AT_associated:
2361 case DW_AT_data_location:
2363 case DW_AT_upper_bound:
2364 case DW_AT_lower_bound:
2367 int need_frame_base;
2370 need_frame_base = decode_location_expression (block_start,
2375 cu_offset, section);
2377 if (need_frame_base && !have_frame_base)
2378 printf (_(" [without DW_AT_frame_base]"));
2384 if (form == DW_FORM_ref_sig8
2385 || form == DW_FORM_GNU_ref_alt)
2388 if (form == DW_FORM_ref1
2389 || form == DW_FORM_ref2
2390 || form == DW_FORM_ref4
2391 || form == DW_FORM_ref_udata)
2392 uvalue += cu_offset;
2394 if (uvalue >= section->size)
2395 warn (_("Offset %s used as value for DW_AT_import attribute of DIE at offset 0x%lx is too big.\n"),
2396 dwarf_vmatoa ("x", uvalue),
2397 (unsigned long) (orig_data - section->start));
2400 unsigned long abbrev_number;
2401 abbrev_entry * entry;
2403 abbrev_number = read_uleb128 (section->start + uvalue, NULL, end);
2405 printf (_("\t[Abbrev Number: %ld"), abbrev_number);
2406 /* Don't look up abbrev for DW_FORM_ref_addr, as it very often will
2407 use different abbrev table, and we don't track .debug_info chunks
2409 if (form != DW_FORM_ref_addr)
2411 for (entry = first_abbrev; entry != NULL; entry = entry->next)
2412 if (entry->entry == abbrev_number)
2415 printf (" (%s)", get_TAG_name (entry->tag));
2430 get_AT_name (unsigned long attribute)
2435 return "DW_AT value: 0";
2437 /* One value is shared by the MIPS and HP extensions: */
2438 if (attribute == DW_AT_MIPS_fde)
2439 return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
2441 name = get_DW_AT_name (attribute);
2445 static char buffer[100];
2447 snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
2455 static unsigned char *
2456 read_and_display_attr (unsigned long attribute,
2458 dwarf_signed_vma implicit_const,
2459 unsigned char * data,
2460 unsigned char * end,
2461 dwarf_vma cu_offset,
2462 dwarf_vma pointer_size,
2463 dwarf_vma offset_size,
2465 debug_info * debug_info_p,
2467 struct dwarf_section * section,
2468 struct cu_tu_set * this_set)
2471 printf (" %-18s:", get_AT_name (attribute));
2472 data = read_and_display_attr_value (attribute, form, implicit_const, data, end,
2473 cu_offset, pointer_size, offset_size,
2474 dwarf_version, debug_info_p,
2475 do_loc, section, this_set, ' ');
2481 /* Process the contents of a .debug_info section. If do_loc is non-zero
2482 then we are scanning for location lists and we do not want to display
2483 anything to the user. If do_types is non-zero, we are processing
2484 a .debug_types section instead of a .debug_info section. */
2487 process_debug_info (struct dwarf_section *section,
2489 enum dwarf_section_display_enum abbrev_sec,
2493 unsigned char *start = section->start;
2494 unsigned char *end = start + section->size;
2495 unsigned char *section_begin;
2497 unsigned int num_units = 0;
2499 if ((do_loc || do_debug_loc || do_debug_ranges)
2500 && num_debug_info_entries == 0
2505 /* First scan the section to get the number of comp units. */
2506 for (section_begin = start, num_units = 0; section_begin < end;
2509 /* Read the first 4 bytes. For a 32-bit DWARF section, this
2510 will be the length. For a 64-bit DWARF section, it'll be
2511 the escape code 0xffffffff followed by an 8 byte length. */
2512 SAFE_BYTE_GET (length, section_begin, 4, end);
2514 if (length == 0xffffffff)
2516 SAFE_BYTE_GET (length, section_begin + 4, 8, end);
2517 section_begin += length + 12;
2519 else if (length >= 0xfffffff0 && length < 0xffffffff)
2521 warn (_("Reserved length value (0x%s) found in section %s\n"),
2522 dwarf_vmatoa ("x", length), section->name);
2526 section_begin += length + 4;
2528 /* Negative values are illegal, they may even cause infinite
2529 looping. This can happen if we can't accurately apply
2530 relocations to an object file, or if the file is corrupt. */
2531 if ((signed long) length <= 0 || section_begin < start)
2533 warn (_("Corrupt unit length (0x%s) found in section %s\n"),
2534 dwarf_vmatoa ("x", length), section->name);
2541 error (_("No comp units in %s section ?\n"), section->name);
2545 /* Then allocate an array to hold the information. */
2546 debug_information = (debug_info *) cmalloc (num_units,
2547 sizeof (* debug_information));
2548 if (debug_information == NULL)
2550 error (_("Not enough memory for a debug info array of %u entries\n"),
2552 alloc_num_debug_info_entries = num_debug_info_entries = 0;
2555 /* PR 17531: file: 92ca3797.
2556 We cannot rely upon the debug_information array being initialised
2557 before it is used. A corrupt file could easily contain references
2558 to a unit for which information has not been made available. So
2559 we ensure that the array is zeroed here. */
2560 memset (debug_information, 0, num_units * sizeof (*debug_information));
2562 alloc_num_debug_info_entries = num_units;
2567 if (dwarf_start_die == 0)
2568 printf (_("Contents of the %s section:\n\n"), section->name);
2570 load_debug_section (str, file);
2571 load_debug_section (line_str, file);
2572 load_debug_section (str_dwo, file);
2573 load_debug_section (str_index, file);
2574 load_debug_section (str_index_dwo, file);
2575 load_debug_section (debug_addr, file);
2578 load_debug_section (abbrev_sec, file);
2579 if (debug_displays [abbrev_sec].section.start == NULL)
2581 warn (_("Unable to locate %s section!\n"),
2582 debug_displays [abbrev_sec].section.name);
2586 for (section_begin = start, unit = 0; start < end; unit++)
2588 DWARF2_Internal_CompUnit compunit;
2589 unsigned char *hdrptr;
2590 unsigned char *tags;
2591 int level, last_level, saved_level;
2592 dwarf_vma cu_offset;
2593 unsigned long sec_off;
2594 unsigned int offset_size;
2595 unsigned int initial_length_size;
2596 dwarf_vma signature_high = 0;
2597 dwarf_vma signature_low = 0;
2598 dwarf_vma type_offset = 0;
2599 struct cu_tu_set *this_set;
2600 dwarf_vma abbrev_base;
2605 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 4, end);
2607 if (compunit.cu_length == 0xffffffff)
2609 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 8, end);
2611 initial_length_size = 12;
2616 initial_length_size = 4;
2619 SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end);
2621 cu_offset = start - section_begin;
2623 this_set = find_cu_tu_set_v2 (cu_offset, do_types);
2625 if (compunit.cu_version < 5)
2627 compunit.cu_unit_type = DW_UT_compile;
2628 /* Initialize it due to a false compiler warning. */
2629 compunit.cu_pointer_size = -1;
2633 SAFE_BYTE_GET_AND_INC (compunit.cu_unit_type, hdrptr, 1, end);
2634 do_types = (compunit.cu_unit_type == DW_UT_type);
2636 SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
2639 SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
2641 if (this_set == NULL)
2644 abbrev_size = debug_displays [abbrev_sec].section.size;
2648 abbrev_base = this_set->section_offsets [DW_SECT_ABBREV];
2649 abbrev_size = this_set->section_sizes [DW_SECT_ABBREV];
2652 if (compunit.cu_version < 5)
2653 SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
2655 /* PR 17512: file: 001-108546-0.001:0.1. */
2656 if (compunit.cu_pointer_size < 2 || compunit.cu_pointer_size > 8)
2658 warn (_("Invalid pointer size (%d) in compunit header, using %d instead\n"),
2659 compunit.cu_pointer_size, offset_size);
2660 compunit.cu_pointer_size = offset_size;
2665 SAFE_BYTE_GET64 (hdrptr, &signature_high, &signature_low, end);
2667 SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end);
2670 if ((do_loc || do_debug_loc || do_debug_ranges)
2671 && num_debug_info_entries == 0
2674 debug_information [unit].cu_offset = cu_offset;
2675 debug_information [unit].pointer_size
2676 = compunit.cu_pointer_size;
2677 debug_information [unit].offset_size = offset_size;
2678 debug_information [unit].dwarf_version = compunit.cu_version;
2679 debug_information [unit].base_address = 0;
2680 debug_information [unit].addr_base = DEBUG_INFO_UNAVAILABLE;
2681 debug_information [unit].ranges_base = DEBUG_INFO_UNAVAILABLE;
2682 debug_information [unit].loc_offsets = NULL;
2683 debug_information [unit].have_frame_base = NULL;
2684 debug_information [unit].max_loc_offsets = 0;
2685 debug_information [unit].num_loc_offsets = 0;
2686 debug_information [unit].range_lists = NULL;
2687 debug_information [unit].max_range_lists= 0;
2688 debug_information [unit].num_range_lists = 0;
2691 if (!do_loc && dwarf_start_die == 0)
2693 printf (_(" Compilation Unit @ offset 0x%s:\n"),
2694 dwarf_vmatoa ("x", cu_offset));
2695 printf (_(" Length: 0x%s (%s)\n"),
2696 dwarf_vmatoa ("x", compunit.cu_length),
2697 offset_size == 8 ? "64-bit" : "32-bit");
2698 printf (_(" Version: %d\n"), compunit.cu_version);
2699 printf (_(" Abbrev Offset: 0x%s\n"),
2700 dwarf_vmatoa ("x", compunit.cu_abbrev_offset));
2701 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
2706 printf (_(" Signature: 0x%s\n"),
2707 dwarf_vmatoa64 (signature_high, signature_low,
2708 buf, sizeof (buf)));
2709 printf (_(" Type Offset: 0x%s\n"),
2710 dwarf_vmatoa ("x", type_offset));
2712 if (this_set != NULL)
2714 dwarf_vma *offsets = this_set->section_offsets;
2715 size_t *sizes = this_set->section_sizes;
2717 printf (_(" Section contributions:\n"));
2718 printf (_(" .debug_abbrev.dwo: 0x%s 0x%s\n"),
2719 dwarf_vmatoa ("x", offsets [DW_SECT_ABBREV]),
2720 dwarf_vmatoa ("x", sizes [DW_SECT_ABBREV]));
2721 printf (_(" .debug_line.dwo: 0x%s 0x%s\n"),
2722 dwarf_vmatoa ("x", offsets [DW_SECT_LINE]),
2723 dwarf_vmatoa ("x", sizes [DW_SECT_LINE]));
2724 printf (_(" .debug_loc.dwo: 0x%s 0x%s\n"),
2725 dwarf_vmatoa ("x", offsets [DW_SECT_LOC]),
2726 dwarf_vmatoa ("x", sizes [DW_SECT_LOC]));
2727 printf (_(" .debug_str_offsets.dwo: 0x%s 0x%s\n"),
2728 dwarf_vmatoa ("x", offsets [DW_SECT_STR_OFFSETS]),
2729 dwarf_vmatoa ("x", sizes [DW_SECT_STR_OFFSETS]));
2733 sec_off = cu_offset + initial_length_size;
2734 if (sec_off + compunit.cu_length < sec_off
2735 || sec_off + compunit.cu_length > section->size)
2737 warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
2739 (unsigned long) cu_offset,
2740 dwarf_vmatoa ("x", compunit.cu_length));
2746 start += compunit.cu_length + initial_length_size;
2748 if (compunit.cu_version < 2 || compunit.cu_version > 5)
2750 warn (_("CU at offset %s contains corrupt or "
2751 "unsupported version number: %d.\n"),
2752 dwarf_vmatoa ("x", cu_offset), compunit.cu_version);
2756 if (compunit.cu_unit_type != DW_UT_compile
2757 && compunit.cu_unit_type != DW_UT_type)
2759 warn (_("CU at offset %s contains corrupt or "
2760 "unsupported unit type: %d.\n"),
2761 dwarf_vmatoa ("x", cu_offset), compunit.cu_unit_type);
2767 /* Process the abbrevs used by this compilation unit. */
2768 if (compunit.cu_abbrev_offset >= abbrev_size)
2769 warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"),
2770 (unsigned long) compunit.cu_abbrev_offset,
2771 (unsigned long) abbrev_size);
2772 /* PR 17531: file:4bcd9ce9. */
2773 else if ((abbrev_base + abbrev_size)
2774 > debug_displays [abbrev_sec].section.size)
2775 warn (_("Debug info is corrupted, abbrev size (%lx) is larger than abbrev section size (%lx)\n"),
2776 (unsigned long) abbrev_base + abbrev_size,
2777 (unsigned long) debug_displays [abbrev_sec].section.size);
2779 process_abbrev_section
2780 (((unsigned char *) debug_displays [abbrev_sec].section.start
2781 + abbrev_base + compunit.cu_abbrev_offset),
2782 ((unsigned char *) debug_displays [abbrev_sec].section.start
2783 + abbrev_base + abbrev_size));
2788 while (tags < start)
2790 unsigned int bytes_read;
2791 unsigned long abbrev_number;
2792 unsigned long die_offset;
2793 abbrev_entry *entry;
2795 int do_printing = 1;
2797 die_offset = tags - section_begin;
2799 abbrev_number = read_uleb128 (tags, & bytes_read, start);
2802 /* A null DIE marks the end of a list of siblings or it may also be
2803 a section padding. */
2804 if (abbrev_number == 0)
2806 /* Check if it can be a section padding for the last CU. */
2807 if (level == 0 && start == end)
2811 for (chk = tags; chk < start; chk++)
2818 if (!do_loc && die_offset >= dwarf_start_die
2819 && (dwarf_cutoff_level == -1
2820 || level < dwarf_cutoff_level))
2821 printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
2827 static unsigned num_bogus_warns = 0;
2829 if (num_bogus_warns < 3)
2831 warn (_("Bogus end-of-siblings marker detected at offset %lx in %s section\n"),
2832 die_offset, section->name);
2834 if (num_bogus_warns == 3)
2835 warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
2838 if (dwarf_start_die != 0 && level < saved_level)
2845 if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
2849 if (dwarf_start_die != 0 && die_offset == dwarf_start_die)
2850 saved_level = level;
2851 do_printing = (dwarf_cutoff_level == -1
2852 || level < dwarf_cutoff_level);
2854 printf (_(" <%d><%lx>: Abbrev Number: %lu"),
2855 level, die_offset, abbrev_number);
2856 else if (dwarf_cutoff_level == -1
2857 || last_level < dwarf_cutoff_level)
2858 printf (_(" <%d><%lx>: ...\n"), level, die_offset);
2863 /* Scan through the abbreviation list until we reach the
2865 for (entry = first_abbrev;
2866 entry && entry->entry != abbrev_number;
2867 entry = entry->next)
2872 if (!do_loc && do_printing)
2877 warn (_("DIE at offset 0x%lx refers to abbreviation number %lu which does not exist\n"),
2878 die_offset, abbrev_number);
2882 if (!do_loc && do_printing)
2883 printf (" (%s)\n", get_TAG_name (entry->tag));
2888 need_base_address = 0;
2890 case DW_TAG_compile_unit:
2891 need_base_address = 1;
2893 case DW_TAG_entry_point:
2894 case DW_TAG_subprogram:
2895 need_base_address = 0;
2896 /* Assuming that there is no DW_AT_frame_base. */
2897 have_frame_base = 0;
2901 debug_info *debug_info_p =
2902 (debug_information && unit < alloc_num_debug_info_entries)
2903 ? debug_information + unit : NULL;
2905 assert (!debug_info_p
2906 || (debug_info_p->num_loc_offsets
2907 == debug_info_p->num_loc_views));
2909 for (attr = entry->first_attr;
2910 attr && attr->attribute;
2913 if (! do_loc && do_printing)
2914 /* Show the offset from where the tag was extracted. */
2915 printf (" <%lx>", (unsigned long)(tags - section_begin));
2917 tags = read_and_display_attr (attr->attribute,
2919 attr->implicit_const,
2923 compunit.cu_pointer_size,
2925 compunit.cu_version,
2927 do_loc || ! do_printing,
2932 /* If a locview attribute appears before a location one,
2933 make sure we don't associate it with an earlier
2936 switch (debug_info_p->num_loc_offsets - debug_info_p->num_loc_views)
2939 debug_info_p->loc_views [debug_info_p->num_loc_views] = vm1;
2940 debug_info_p->num_loc_views++;
2941 assert (debug_info_p->num_loc_views
2942 == debug_info_p->num_loc_offsets);
2949 warn(_("DIE has locviews without loclist\n"));
2950 debug_info_p->num_loc_views--;
2957 if (entry->children)
2962 /* Set num_debug_info_entries here so that it can be used to check if
2963 we need to process .debug_loc and .debug_ranges sections. */
2964 if ((do_loc || do_debug_loc || do_debug_ranges)
2965 && num_debug_info_entries == 0
2968 if (num_units > alloc_num_debug_info_entries)
2969 num_debug_info_entries = alloc_num_debug_info_entries;
2971 num_debug_info_entries = num_units;
2980 /* Locate and scan the .debug_info section in the file and record the pointer
2981 sizes and offsets for the compilation units in it. Usually an executable
2982 will have just one pointer size, but this is not guaranteed, and so we try
2983 not to make any assumptions. Returns zero upon failure, or the number of
2984 compilation units upon success. */
2987 load_debug_info (void * file)
2989 /* If we have already tried and failed to load the .debug_info
2990 section then do not bother to repeat the task. */
2991 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
2994 /* If we already have the information there is nothing else to do. */
2995 if (num_debug_info_entries > 0)
2996 return num_debug_info_entries;
2998 /* If this is a DWARF package file, load the CU and TU indexes. */
2999 (void) load_cu_tu_indexes (file);
3001 if (load_debug_section (info, file)
3002 && process_debug_info (&debug_displays [info].section, file, abbrev, 1, 0))
3003 return num_debug_info_entries;
3005 if (load_debug_section (info_dwo, file)
3006 && process_debug_info (&debug_displays [info_dwo].section, file,
3008 return num_debug_info_entries;
3010 num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
3014 /* Read a DWARF .debug_line section header starting at DATA.
3015 Upon success returns an updated DATA pointer and the LINFO
3016 structure and the END_OF_SEQUENCE pointer will be filled in.
3017 Otherwise returns NULL. */
3019 static unsigned char *
3020 read_debug_line_header (struct dwarf_section * section,
3021 unsigned char * data,
3022 unsigned char * end,
3023 DWARF2_Internal_LineInfo * linfo,
3024 unsigned char ** end_of_sequence)
3026 unsigned char *hdrptr;
3027 unsigned int initial_length_size;
3028 unsigned char address_size, segment_selector_size;
3030 /* Extract information from the Line Number Program Header.
3031 (section 6.2.4 in the Dwarf3 doc). */
3034 /* Get and check the length of the block. */
3035 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 4, end);
3037 if (linfo->li_length == 0xffffffff)
3039 /* This section is 64-bit DWARF 3. */
3040 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 8, end);
3041 linfo->li_offset_size = 8;
3042 initial_length_size = 12;
3046 linfo->li_offset_size = 4;
3047 initial_length_size = 4;
3050 if (linfo->li_length + initial_length_size > section->size)
3052 /* If the length field has a relocation against it, then we should
3053 not complain if it is inaccurate (and probably negative). This
3054 happens in object files when the .debug_line section is actually
3055 comprised of several different .debug_line.* sections, (some of
3056 which may be removed by linker garbage collection), and a relocation
3057 is used to compute the correct length once that is done. */
3058 if (reloc_at (section, (hdrptr - section->start) - linfo->li_offset_size))
3060 linfo->li_length = (end - data) - initial_length_size;
3064 warn (_("The length field (0x%lx) in the debug_line header is wrong - the section is too small\n"),
3065 (long) linfo->li_length);
3070 /* Get and check the version number. */
3071 SAFE_BYTE_GET_AND_INC (linfo->li_version, hdrptr, 2, end);
3073 if (linfo->li_version != 2
3074 && linfo->li_version != 3
3075 && linfo->li_version != 4
3076 && linfo->li_version != 5)
3078 warn (_("Only DWARF version 2, 3, 4 and 5 line info "
3079 "is currently supported.\n"));
3083 if (linfo->li_version >= 5)
3085 SAFE_BYTE_GET_AND_INC (address_size, hdrptr, 1, end);
3087 SAFE_BYTE_GET_AND_INC (segment_selector_size, hdrptr, 1, end);
3088 if (segment_selector_size != 0)
3090 warn (_("The %s section contains "
3091 "unsupported segment selector size: %d.\n"),
3092 section->name, segment_selector_size);
3097 SAFE_BYTE_GET_AND_INC (linfo->li_prologue_length, hdrptr,
3098 linfo->li_offset_size, end);
3099 SAFE_BYTE_GET_AND_INC (linfo->li_min_insn_length, hdrptr, 1, end);
3101 if (linfo->li_version >= 4)
3103 SAFE_BYTE_GET_AND_INC (linfo->li_max_ops_per_insn, hdrptr, 1, end);
3105 if (linfo->li_max_ops_per_insn == 0)
3107 warn (_("Invalid maximum operations per insn.\n"));
3112 linfo->li_max_ops_per_insn = 1;
3114 SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end);
3115 SAFE_SIGNED_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
3116 SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end);
3117 SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end);
3119 * end_of_sequence = data + linfo->li_length + initial_length_size;
3120 /* PR 17512: file:002-117414-0.004. */
3121 if (* end_of_sequence > end)
3123 warn (_("Line length %s extends beyond end of section\n"),
3124 dwarf_vmatoa ("u", linfo->li_length));
3125 * end_of_sequence = end;
3132 static unsigned char *
3133 display_formatted_table (unsigned char *data,
3134 unsigned char *start, unsigned char *end,
3135 const DWARF2_Internal_LineInfo *linfo,
3136 struct dwarf_section *section, const char *what)
3138 unsigned char *format_start, format_count, *format, formati;
3139 dwarf_vma data_count, datai;
3140 unsigned int bytes_read, namepass, last_entry = 0;
3142 SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
3143 format_start = data;
3144 for (formati = 0; formati < format_count; formati++)
3146 read_uleb128 (data, & bytes_read, end);
3148 read_uleb128 (data, & bytes_read, end);
3152 warn (_("Corrupt %s format table entry\n"), what);
3157 data_count = read_uleb128 (data, & bytes_read, end);
3161 warn (_("Corrupt %s list\n"), what);
3165 if (data_count == 0)
3167 printf (_("\n The %s Table is empty.\n"), what);
3171 printf (_("\n The %s Table (offset 0x%lx):\n"), what,
3172 (long)(data - start));
3174 printf (_(" Entry"));
3175 /* Delay displaying name as the last entry for better screen layout. */
3176 for (namepass = 0; namepass < 2; namepass++)
3178 format = format_start;
3179 for (formati = 0; formati < format_count; formati++)
3181 dwarf_vma content_type;
3183 content_type = read_uleb128 (format, & bytes_read, end);
3184 format += bytes_read;
3185 if ((content_type == DW_LNCT_path) == (namepass == 1))
3186 switch (content_type)
3189 printf (_("\tName"));
3191 case DW_LNCT_directory_index:
3192 printf (_("\tDir"));
3194 case DW_LNCT_timestamp:
3195 printf (_("\tTime"));
3198 printf (_("\tSize"));
3201 printf (_("\tMD5"));
3204 printf (_("\t(Unknown format content type %s)"),
3205 dwarf_vmatoa ("u", content_type));
3207 read_uleb128 (format, & bytes_read, end);
3208 format += bytes_read;
3213 for (datai = 0; datai < data_count; datai++)
3215 unsigned char *datapass = data;
3217 printf (" %d", last_entry++);
3218 /* Delay displaying name as the last entry for better screen layout. */
3219 for (namepass = 0; namepass < 2; namepass++)
3221 format = format_start;
3223 for (formati = 0; formati < format_count; formati++)
3225 dwarf_vma content_type, form;
3227 content_type = read_uleb128 (format, & bytes_read, end);
3228 format += bytes_read;
3229 form = read_uleb128 (format, & bytes_read, end);
3230 format += bytes_read;
3231 data = read_and_display_attr_value (0, form, 0, data, end, 0, 0,
3232 linfo->li_offset_size,
3233 linfo->li_version, NULL,
3234 ((content_type == DW_LNCT_path) != (namepass == 1)),
3235 section, NULL, '\t');
3240 warn (_("Corrupt %s entries list\n"), what);
3249 display_debug_lines_raw (struct dwarf_section *section,
3250 unsigned char *data,
3251 unsigned char *end, void *file)
3253 unsigned char *start = section->start;
3254 int verbose_view = 0;
3256 printf (_("Raw dump of debug contents of section %s:\n\n"),
3261 static DWARF2_Internal_LineInfo saved_linfo;
3262 DWARF2_Internal_LineInfo linfo;
3263 unsigned char *standard_opcodes;
3264 unsigned char *end_of_sequence;
3267 if (const_strneq (section->name, ".debug_line.")
3268 /* Note: the following does not apply to .debug_line.dwo sections.
3269 These are full debug_line sections. */
3270 && strcmp (section->name, ".debug_line.dwo") != 0)
3272 /* Sections named .debug_line.<foo> are fragments of a .debug_line
3273 section containing just the Line Number Statements. They are
3274 created by the assembler and intended to be used alongside gcc's
3275 -ffunction-sections command line option. When the linker's
3276 garbage collection decides to discard a .text.<foo> section it
3277 can then also discard the line number information in .debug_line.<foo>.
3279 Since the section is a fragment it does not have the details
3280 needed to fill out a LineInfo structure, so instead we use the
3281 details from the last full debug_line section that we processed. */
3282 end_of_sequence = end;
3283 standard_opcodes = NULL;
3284 linfo = saved_linfo;
3285 /* PR 17531: file: 0522b371. */
3286 if (linfo.li_line_range == 0)
3288 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
3291 reset_state_machine (linfo.li_default_is_stmt);
3295 unsigned char * hdrptr;
3297 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
3298 & end_of_sequence)) == NULL)
3301 printf (_(" Offset: 0x%lx\n"), (long)(data - start));
3302 printf (_(" Length: %ld\n"), (long) linfo.li_length);
3303 printf (_(" DWARF Version: %d\n"), linfo.li_version);
3304 printf (_(" Prologue Length: %d\n"), (int) linfo.li_prologue_length);
3305 printf (_(" Minimum Instruction Length: %d\n"), linfo.li_min_insn_length);
3306 if (linfo.li_version >= 4)
3307 printf (_(" Maximum Ops per Instruction: %d\n"), linfo.li_max_ops_per_insn);
3308 printf (_(" Initial value of 'is_stmt': %d\n"), linfo.li_default_is_stmt);
3309 printf (_(" Line Base: %d\n"), linfo.li_line_base);
3310 printf (_(" Line Range: %d\n"), linfo.li_line_range);
3311 printf (_(" Opcode Base: %d\n"), linfo.li_opcode_base);
3313 /* PR 17512: file: 1665-6428-0.004. */
3314 if (linfo.li_line_range == 0)
3316 warn (_("Line range of 0 is invalid, using 1 instead\n"));
3317 linfo.li_line_range = 1;
3320 reset_state_machine (linfo.li_default_is_stmt);
3322 /* Display the contents of the Opcodes table. */
3323 standard_opcodes = hdrptr;
3325 /* PR 17512: file: 002-417945-0.004. */
3326 if (standard_opcodes + linfo.li_opcode_base >= end)
3328 warn (_("Line Base extends beyond end of section\n"));
3332 printf (_("\n Opcodes:\n"));
3334 for (i = 1; i < linfo.li_opcode_base; i++)
3335 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
3337 /* Display the contents of the Directory table. */
3338 data = standard_opcodes + linfo.li_opcode_base - 1;
3340 if (linfo.li_version >= 5)
3342 load_debug_section (line_str, file);
3344 data = display_formatted_table (data, start, end, &linfo, section,
3346 data = display_formatted_table (data, start, end, &linfo, section,
3352 printf (_("\n The Directory Table is empty.\n"));
3355 unsigned int last_dir_entry = 0;
3357 printf (_("\n The Directory Table (offset 0x%lx):\n"),
3358 (long)(data - start));
3360 while (data < end && *data != 0)
3362 printf (" %d\t%.*s\n", ++last_dir_entry, (int) (end - data), data);
3364 data += strnlen ((char *) data, end - data) + 1;
3367 /* PR 17512: file: 002-132094-0.004. */
3368 if (data >= end - 1)
3372 /* Skip the NUL at the end of the table. */
3375 /* Display the contents of the File Name table. */
3377 printf (_("\n The File Name Table is empty.\n"));
3380 printf (_("\n The File Name Table (offset 0x%lx):\n"),
3381 (long)(data - start));
3382 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
3384 while (data < end && *data != 0)
3386 unsigned char *name;
3387 unsigned int bytes_read;
3389 printf (" %d\t", ++state_machine_regs.last_file_entry);
3391 data += strnlen ((char *) data, end - data) + 1;
3394 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
3397 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
3400 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
3402 printf ("%.*s\n", (int)(end - name), name);
3406 warn (_("Corrupt file name table entry\n"));
3412 /* Skip the NUL at the end of the table. */
3417 saved_linfo = linfo;
3420 /* Now display the statements. */
3421 if (data >= end_of_sequence)
3422 printf (_(" No Line Number Statements.\n"));
3425 printf (_(" Line Number Statements:\n"));
3427 while (data < end_of_sequence)
3429 unsigned char op_code;
3430 dwarf_signed_vma adv;
3432 unsigned int bytes_read;
3434 printf (" [0x%08lx]", (long)(data - start));
3438 if (op_code >= linfo.li_opcode_base)
3440 op_code -= linfo.li_opcode_base;
3441 uladv = (op_code / linfo.li_line_range);
3442 if (linfo.li_max_ops_per_insn == 1)
3444 uladv *= linfo.li_min_insn_length;
3445 state_machine_regs.address += uladv;
3447 state_machine_regs.view = 0;
3448 printf (_(" Special opcode %d: "
3449 "advance Address by %s to 0x%s%s"),
3450 op_code, dwarf_vmatoa ("u", uladv),
3451 dwarf_vmatoa ("x", state_machine_regs.address),
3452 verbose_view && uladv
3453 ? _(" (reset view)") : "");
3458 = ((state_machine_regs.op_index + uladv)
3459 / linfo.li_max_ops_per_insn)
3460 * linfo.li_min_insn_length;
3462 state_machine_regs.address += addrdelta;
3463 state_machine_regs.op_index
3464 = (state_machine_regs.op_index + uladv)
3465 % linfo.li_max_ops_per_insn;
3467 state_machine_regs.view = 0;
3468 printf (_(" Special opcode %d: "
3469 "advance Address by %s to 0x%s[%d]%s"),
3470 op_code, dwarf_vmatoa ("u", uladv),
3471 dwarf_vmatoa ("x", state_machine_regs.address),
3472 state_machine_regs.op_index,
3473 verbose_view && addrdelta
3474 ? _(" (reset view)") : "");
3476 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
3477 state_machine_regs.line += adv;
3478 printf (_(" and Line by %s to %d"),
3479 dwarf_vmatoa ("d", adv), state_machine_regs.line);
3480 if (verbose_view || state_machine_regs.view)
3481 printf (_(" (view %u)\n"), state_machine_regs.view);
3484 state_machine_regs.view++;
3486 else switch (op_code)
3488 case DW_LNS_extended_op:
3489 data += process_extended_line_op (data, linfo.li_default_is_stmt, end);
3493 printf (_(" Copy"));
3494 if (verbose_view || state_machine_regs.view)
3495 printf (_(" (view %u)\n"), state_machine_regs.view);
3498 state_machine_regs.view++;
3501 case DW_LNS_advance_pc:
3502 uladv = read_uleb128 (data, & bytes_read, end);
3504 if (linfo.li_max_ops_per_insn == 1)
3506 uladv *= linfo.li_min_insn_length;
3507 state_machine_regs.address += uladv;
3509 state_machine_regs.view = 0;
3510 printf (_(" Advance PC by %s to 0x%s%s\n"),
3511 dwarf_vmatoa ("u", uladv),
3512 dwarf_vmatoa ("x", state_machine_regs.address),
3513 verbose_view && uladv
3514 ? _(" (reset view)") : "");
3519 = ((state_machine_regs.op_index + uladv)
3520 / linfo.li_max_ops_per_insn)
3521 * linfo.li_min_insn_length;
3522 state_machine_regs.address
3524 state_machine_regs.op_index
3525 = (state_machine_regs.op_index + uladv)
3526 % linfo.li_max_ops_per_insn;
3528 state_machine_regs.view = 0;
3529 printf (_(" Advance PC by %s to 0x%s[%d]%s\n"),
3530 dwarf_vmatoa ("u", uladv),
3531 dwarf_vmatoa ("x", state_machine_regs.address),
3532 state_machine_regs.op_index,
3533 verbose_view && addrdelta
3534 ? _(" (reset view)") : "");
3538 case DW_LNS_advance_line:
3539 adv = read_sleb128 (data, & bytes_read, end);
3541 state_machine_regs.line += adv;
3542 printf (_(" Advance Line by %s to %d\n"),
3543 dwarf_vmatoa ("d", adv),
3544 state_machine_regs.line);
3547 case DW_LNS_set_file:
3548 adv = read_uleb128 (data, & bytes_read, end);
3550 printf (_(" Set File Name to entry %s in the File Name Table\n"),
3551 dwarf_vmatoa ("d", adv));
3552 state_machine_regs.file = adv;
3555 case DW_LNS_set_column:
3556 uladv = read_uleb128 (data, & bytes_read, end);
3558 printf (_(" Set column to %s\n"),
3559 dwarf_vmatoa ("u", uladv));
3560 state_machine_regs.column = uladv;
3563 case DW_LNS_negate_stmt:
3564 adv = state_machine_regs.is_stmt;
3566 printf (_(" Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv));
3567 state_machine_regs.is_stmt = adv;
3570 case DW_LNS_set_basic_block:
3571 printf (_(" Set basic block\n"));
3572 state_machine_regs.basic_block = 1;
3575 case DW_LNS_const_add_pc:
3576 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
3577 if (linfo.li_max_ops_per_insn)
3579 uladv *= linfo.li_min_insn_length;
3580 state_machine_regs.address += uladv;
3582 state_machine_regs.view = 0;
3583 printf (_(" Advance PC by constant %s to 0x%s%s\n"),
3584 dwarf_vmatoa ("u", uladv),
3585 dwarf_vmatoa ("x", state_machine_regs.address),
3586 verbose_view && uladv
3587 ? _(" (reset view)") : "");
3592 = ((state_machine_regs.op_index + uladv)
3593 / linfo.li_max_ops_per_insn)
3594 * linfo.li_min_insn_length;
3595 state_machine_regs.address
3597 state_machine_regs.op_index
3598 = (state_machine_regs.op_index + uladv)
3599 % linfo.li_max_ops_per_insn;
3601 state_machine_regs.view = 0;
3602 printf (_(" Advance PC by constant %s to 0x%s[%d]%s\n"),
3603 dwarf_vmatoa ("u", uladv),
3604 dwarf_vmatoa ("x", state_machine_regs.address),
3605 state_machine_regs.op_index,
3606 verbose_view && addrdelta
3607 ? _(" (reset view)") : "");
3611 case DW_LNS_fixed_advance_pc:
3612 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
3613 state_machine_regs.address += uladv;
3614 state_machine_regs.op_index = 0;
3615 printf (_(" Advance PC by fixed size amount %s to 0x%s\n"),
3616 dwarf_vmatoa ("u", uladv),
3617 dwarf_vmatoa ("x", state_machine_regs.address));
3618 /* Do NOT reset view. */
3621 case DW_LNS_set_prologue_end:
3622 printf (_(" Set prologue_end to true\n"));
3625 case DW_LNS_set_epilogue_begin:
3626 printf (_(" Set epilogue_begin to true\n"));
3629 case DW_LNS_set_isa:
3630 uladv = read_uleb128 (data, & bytes_read, end);
3632 printf (_(" Set ISA to %s\n"), dwarf_vmatoa ("u", uladv));
3636 printf (_(" Unknown opcode %d with operands: "), op_code);
3638 if (standard_opcodes != NULL)
3639 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
3641 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
3643 i == 1 ? "" : ", ");
3659 unsigned char *name;
3660 unsigned int directory_index;
3661 unsigned int modification_date;
3662 unsigned int length;
3665 /* Output a decoded representation of the .debug_line section. */
3668 display_debug_lines_decoded (struct dwarf_section *section,
3669 unsigned char *data,
3670 unsigned char *end, void *fileptr)
3672 static DWARF2_Internal_LineInfo saved_linfo;
3674 printf (_("Decoded dump of debug contents of section %s:\n\n"),
3679 /* This loop amounts to one iteration per compilation unit. */
3680 DWARF2_Internal_LineInfo linfo;
3681 unsigned char *standard_opcodes;
3682 unsigned char *end_of_sequence;
3684 File_Entry *file_table = NULL;
3685 unsigned int n_files = 0;
3686 unsigned char **directory_table = NULL;
3687 dwarf_vma n_directories = 0;
3689 if (const_strneq (section->name, ".debug_line.")
3690 /* Note: the following does not apply to .debug_line.dwo sections.
3691 These are full debug_line sections. */
3692 && strcmp (section->name, ".debug_line.dwo") != 0)
3694 /* See comment in display_debug_lines_raw(). */
3695 end_of_sequence = end;
3696 standard_opcodes = NULL;
3697 linfo = saved_linfo;
3698 /* PR 17531: file: 0522b371. */
3699 if (linfo.li_line_range == 0)
3701 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
3704 reset_state_machine (linfo.li_default_is_stmt);
3708 unsigned char *hdrptr;
3710 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
3711 & end_of_sequence)) == NULL)
3714 /* PR 17531: file: 0522b371. */
3715 if (linfo.li_line_range == 0)
3717 warn (_("Line range of 0 is invalid, using 1 instead\n"));
3718 linfo.li_line_range = 1;
3720 reset_state_machine (linfo.li_default_is_stmt);
3722 /* Save a pointer to the contents of the Opcodes table. */
3723 standard_opcodes = hdrptr;
3725 /* Traverse the Directory table just to count entries. */
3726 data = standard_opcodes + linfo.li_opcode_base - 1;
3730 warn (_("opcode base of %d extends beyond end of section\n"),
3731 linfo.li_opcode_base);
3735 if (linfo.li_version >= 5)
3737 unsigned char *format_start, format_count, *format;
3738 dwarf_vma formati, entryi;
3739 unsigned int bytes_read;
3741 load_debug_section (line_str, fileptr);
3743 /* Skip directories format. */
3744 SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
3745 format_start = data;
3746 for (formati = 0; formati < format_count; formati++)
3748 read_uleb128 (data, & bytes_read, end);
3750 read_uleb128 (data, & bytes_read, end);
3754 n_directories = read_uleb128 (data, & bytes_read, end);
3758 warn (_("Corrupt directories list\n"));
3762 directory_table = (unsigned char **)
3763 xmalloc (n_directories * sizeof (unsigned char *));
3765 for (entryi = 0; entryi < n_directories; entryi++)
3767 unsigned char **pathp = &directory_table[entryi];
3769 format = format_start;
3770 for (formati = 0; formati < format_count; formati++)
3772 dwarf_vma content_type, form;
3775 content_type = read_uleb128 (format, & bytes_read, end);
3776 format += bytes_read;
3777 form = read_uleb128 (format, & bytes_read, end);
3778 format += bytes_read;
3781 warn (_("Corrupt directories list\n"));
3784 switch (content_type)
3789 case DW_FORM_string:
3792 case DW_FORM_line_strp:
3793 SAFE_BYTE_GET (uvalue, data, linfo.li_offset_size,
3795 /* Remove const by the cast. */
3796 *pathp = (unsigned char *)
3797 fetch_indirect_line_string (uvalue);
3802 data = read_and_display_attr_value (0, form, 0, data, end,
3804 linfo.li_offset_size,
3811 warn (_("Corrupt directories list\n"));
3816 /* Skip files format. */
3817 SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
3818 format_start = data;
3819 for (formati = 0; formati < format_count; formati++)
3821 read_uleb128 (data, & bytes_read, end);
3823 read_uleb128 (data, & bytes_read, end);
3827 n_files = read_uleb128 (data, & bytes_read, end);
3831 warn (_("Corrupt file name list\n"));
3835 file_table = (File_Entry *) xcalloc (1, n_files
3836 * sizeof (File_Entry));
3838 for (entryi = 0; entryi < n_files; entryi++)
3840 File_Entry *file = &file_table[entryi];
3842 format = format_start;
3843 for (formati = 0; formati < format_count; formati++)
3845 dwarf_vma content_type, form;
3848 content_type = read_uleb128 (format, & bytes_read, end);
3849 format += bytes_read;
3850 form = read_uleb128 (format, & bytes_read, end);
3851 format += bytes_read;
3854 warn (_("Corrupt file name list\n"));
3857 switch (content_type)
3862 case DW_FORM_string:
3865 case DW_FORM_line_strp:
3866 SAFE_BYTE_GET (uvalue, data, linfo.li_offset_size,
3868 /* Remove const by the cast. */
3869 file->name = (unsigned char *)
3870 fetch_indirect_line_string (uvalue);
3874 case DW_LNCT_directory_index:
3878 SAFE_BYTE_GET (file->directory_index, data, 1,
3882 SAFE_BYTE_GET (file->directory_index, data, 2,
3886 file->directory_index = read_uleb128 (data, NULL,
3892 data = read_and_display_attr_value (0, form, 0, data, end,
3894 linfo.li_offset_size,
3901 warn (_("Corrupt file name list\n"));
3910 unsigned char *ptr_directory_table = data;
3912 while (data < end && *data != 0)
3914 data += strnlen ((char *) data, end - data) + 1;
3921 warn (_("directory table ends unexpectedly\n"));
3926 /* Go through the directory table again to save the directories. */
3927 directory_table = (unsigned char **)
3928 xmalloc (n_directories * sizeof (unsigned char *));
3931 while (*ptr_directory_table != 0)
3933 directory_table[i] = ptr_directory_table;
3934 ptr_directory_table += strnlen ((char *) ptr_directory_table,
3935 ptr_directory_table - end) + 1;
3939 /* Skip the NUL at the end of the table. */
3942 /* Traverse the File Name table just to count the entries. */
3943 if (data < end && *data != 0)
3945 unsigned char *ptr_file_name_table = data;
3947 while (data < end && *data != 0)
3949 unsigned int bytes_read;
3951 /* Skip Name, directory index, last modification time and length
3953 data += strnlen ((char *) data, end - data) + 1;
3954 read_uleb128 (data, & bytes_read, end);
3956 read_uleb128 (data, & bytes_read, end);
3958 read_uleb128 (data, & bytes_read, end);
3966 warn (_("file table ends unexpectedly\n"));
3971 /* Go through the file table again to save the strings. */
3972 file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
3975 while (*ptr_file_name_table != 0)
3977 unsigned int bytes_read;
3979 file_table[i].name = ptr_file_name_table;
3980 ptr_file_name_table += strnlen ((char *) ptr_file_name_table,
3981 end - ptr_file_name_table) + 1;
3983 /* We are not interested in directory, time or size. */
3984 file_table[i].directory_index = read_uleb128 (ptr_file_name_table,
3986 ptr_file_name_table += bytes_read;
3987 file_table[i].modification_date = read_uleb128 (ptr_file_name_table,
3989 ptr_file_name_table += bytes_read;
3990 file_table[i].length = read_uleb128 (ptr_file_name_table, & bytes_read, end);
3991 ptr_file_name_table += bytes_read;
3997 /* Skip the NUL at the end of the table. */
4001 /* Print the Compilation Unit's name and a header. */
4002 if (file_table == NULL)
4004 else if (directory_table == NULL)
4005 printf (_("CU: %s:\n"), file_table[0].name);
4008 unsigned int ix = file_table[0].directory_index;
4009 const char *directory;
4014 else if (n_directories == 0)
4015 directory = _("<unknown>");
4016 else if (ix > n_directories)
4018 warn (_("directory index %u > number of directories %s\n"),
4019 ix, dwarf_vmatoa ("u", n_directories));
4020 directory = _("<corrupt>");
4023 directory = (char *) directory_table[ix - 1];
4025 if (do_wide || strlen (directory) < 76)
4026 printf (_("CU: %s/%s:\n"), directory, file_table[0].name);
4028 printf ("%s:\n", file_table[0].name);
4031 printf (_("File name Line number Starting address View\n"));
4032 saved_linfo = linfo;
4035 /* This loop iterates through the Dwarf Line Number Program. */
4036 while (data < end_of_sequence)
4038 unsigned char op_code;
4041 unsigned long int uladv;
4042 unsigned int bytes_read;
4043 int is_special_opcode = 0;
4048 if (op_code >= linfo.li_opcode_base)
4050 op_code -= linfo.li_opcode_base;
4051 uladv = (op_code / linfo.li_line_range);
4052 if (linfo.li_max_ops_per_insn == 1)
4054 uladv *= linfo.li_min_insn_length;
4055 state_machine_regs.address += uladv;
4057 state_machine_regs.view = 0;
4062 = ((state_machine_regs.op_index + uladv)
4063 / linfo.li_max_ops_per_insn)
4064 * linfo.li_min_insn_length;
4065 state_machine_regs.address
4067 state_machine_regs.op_index
4068 = (state_machine_regs.op_index + uladv)
4069 % linfo.li_max_ops_per_insn;
4071 state_machine_regs.view = 0;
4074 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
4075 state_machine_regs.line += adv;
4076 is_special_opcode = 1;
4077 /* Increment view after printing this row. */
4079 else switch (op_code)
4081 case DW_LNS_extended_op:
4083 unsigned int ext_op_code_len;
4084 unsigned char ext_op_code;
4085 unsigned char *op_code_data = data;
4087 ext_op_code_len = read_uleb128 (op_code_data, &bytes_read,
4089 op_code_data += bytes_read;
4091 if (ext_op_code_len == 0)
4093 warn (_("Badly formed extended line op encountered!\n"));
4096 ext_op_code_len += bytes_read;
4097 ext_op_code = *op_code_data++;
4101 switch (ext_op_code)
4103 case DW_LNE_end_sequence:
4104 /* Reset stuff after printing this row. */
4106 case DW_LNE_set_address:
4107 SAFE_BYTE_GET_AND_INC (state_machine_regs.address,
4109 ext_op_code_len - bytes_read - 1,
4111 state_machine_regs.op_index = 0;
4112 state_machine_regs.view = 0;
4114 case DW_LNE_define_file:
4116 file_table = (File_Entry *) xrealloc
4117 (file_table, (n_files + 1) * sizeof (File_Entry));
4119 ++state_machine_regs.last_file_entry;
4120 /* Source file name. */
4121 file_table[n_files].name = op_code_data;
4122 op_code_data += strlen ((char *) op_code_data) + 1;
4123 /* Directory index. */
4124 file_table[n_files].directory_index =
4125 read_uleb128 (op_code_data, & bytes_read,
4127 op_code_data += bytes_read;
4128 /* Last modification time. */
4129 file_table[n_files].modification_date =
4130 read_uleb128 (op_code_data, & bytes_read,
4132 op_code_data += bytes_read;
4134 file_table[n_files].length =
4135 read_uleb128 (op_code_data, & bytes_read,
4141 case DW_LNE_set_discriminator:
4142 case DW_LNE_HP_set_sequence:
4143 /* Simply ignored. */
4147 printf (_("UNKNOWN (%u): length %d\n"),
4148 ext_op_code, ext_op_code_len - bytes_read);
4151 data += ext_op_code_len;
4155 /* Increment view after printing this row. */
4158 case DW_LNS_advance_pc:
4159 uladv = read_uleb128 (data, & bytes_read, end);
4161 if (linfo.li_max_ops_per_insn == 1)
4163 uladv *= linfo.li_min_insn_length;
4164 state_machine_regs.address += uladv;
4166 state_machine_regs.view = 0;
4171 = ((state_machine_regs.op_index + uladv)
4172 / linfo.li_max_ops_per_insn)
4173 * linfo.li_min_insn_length;
4174 state_machine_regs.address
4176 state_machine_regs.op_index
4177 = (state_machine_regs.op_index + uladv)
4178 % linfo.li_max_ops_per_insn;
4180 state_machine_regs.view = 0;
4184 case DW_LNS_advance_line:
4185 adv = read_sleb128 (data, & bytes_read, end);
4187 state_machine_regs.line += adv;
4190 case DW_LNS_set_file:
4191 adv = read_uleb128 (data, & bytes_read, end);
4193 state_machine_regs.file = adv;
4196 unsigned file = state_machine_regs.file - 1;
4199 if (file_table == NULL || n_files == 0)
4200 printf (_("\n [Use file table entry %d]\n"), file);
4202 else if (file >= n_files)
4204 warn (_("file index %u > number of files %u\n"), file + 1, n_files);
4205 printf (_("\n <over large file table index %u>"), file);
4207 else if ((dir = file_table[file].directory_index) == 0)
4208 /* If directory index is 0, that means current directory. */
4209 printf ("\n./%s:[++]\n", file_table[file].name);
4210 else if (directory_table == NULL || n_directories == 0)
4211 printf (_("\n [Use file %s in directory table entry %d]\n"),
4212 file_table[file].name, dir);
4214 else if (dir > n_directories)
4216 warn (_("directory index %u > number of directories %s\n"),
4217 dir, dwarf_vmatoa ("u", n_directories));
4218 printf (_("\n <over large directory table entry %u>\n"), dir);
4221 printf ("\n%s/%s:\n",
4222 /* The directory index starts counting at 1. */
4223 directory_table[dir - 1], file_table[file].name);
4227 case DW_LNS_set_column:
4228 uladv = read_uleb128 (data, & bytes_read, end);
4230 state_machine_regs.column = uladv;
4233 case DW_LNS_negate_stmt:
4234 adv = state_machine_regs.is_stmt;
4236 state_machine_regs.is_stmt = adv;
4239 case DW_LNS_set_basic_block:
4240 state_machine_regs.basic_block = 1;
4243 case DW_LNS_const_add_pc:
4244 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
4245 if (linfo.li_max_ops_per_insn == 1)
4247 uladv *= linfo.li_min_insn_length;
4248 state_machine_regs.address += uladv;
4250 state_machine_regs.view = 0;
4255 = ((state_machine_regs.op_index + uladv)
4256 / linfo.li_max_ops_per_insn)
4257 * linfo.li_min_insn_length;
4258 state_machine_regs.address
4260 state_machine_regs.op_index
4261 = (state_machine_regs.op_index + uladv)
4262 % linfo.li_max_ops_per_insn;
4264 state_machine_regs.view = 0;
4268 case DW_LNS_fixed_advance_pc:
4269 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
4270 state_machine_regs.address += uladv;
4271 state_machine_regs.op_index = 0;
4272 /* Do NOT reset view. */
4275 case DW_LNS_set_prologue_end:
4278 case DW_LNS_set_epilogue_begin:
4281 case DW_LNS_set_isa:
4282 uladv = read_uleb128 (data, & bytes_read, end);
4284 printf (_(" Set ISA to %lu\n"), uladv);
4288 printf (_(" Unknown opcode %d with operands: "), op_code);
4290 if (standard_opcodes != NULL)
4291 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
4293 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
4295 i == 1 ? "" : ", ");
4302 /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
4303 to the DWARF address/line matrix. */
4304 if ((is_special_opcode) || (xop == -DW_LNE_end_sequence)
4305 || (xop == DW_LNS_copy))
4307 const unsigned int MAX_FILENAME_LENGTH = 35;
4309 char *newFileName = NULL;
4310 size_t fileNameLength;
4314 unsigned indx = state_machine_regs.file - 1;
4316 if (indx >= n_files)
4318 warn (_("corrupt file index %u encountered\n"), indx);
4319 fileName = _("<corrupt>");
4322 fileName = (char *) file_table[indx].name;
4325 fileName = _("<unknown>");
4327 fileNameLength = strlen (fileName);
4329 if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
4331 newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
4332 /* Truncate file name */
4333 strncpy (newFileName,
4334 fileName + fileNameLength - MAX_FILENAME_LENGTH,
4335 MAX_FILENAME_LENGTH + 1);
4339 newFileName = (char *) xmalloc (fileNameLength + 1);
4340 strncpy (newFileName, fileName, fileNameLength + 1);
4343 if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
4345 if (linfo.li_max_ops_per_insn == 1)
4346 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x",
4347 newFileName, state_machine_regs.line,
4348 state_machine_regs.address);
4350 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x[%d]",
4351 newFileName, state_machine_regs.line,
4352 state_machine_regs.address,
4353 state_machine_regs.op_index);
4357 if (linfo.li_max_ops_per_insn == 1)
4358 printf ("%s %11d %#18" DWARF_VMA_FMT "x",
4359 newFileName, state_machine_regs.line,
4360 state_machine_regs.address);
4362 printf ("%s %11d %#18" DWARF_VMA_FMT "x[%d]",
4363 newFileName, state_machine_regs.line,
4364 state_machine_regs.address,
4365 state_machine_regs.op_index);
4368 if (state_machine_regs.view)
4369 printf (" %6u\n", state_machine_regs.view);
4372 state_machine_regs.view++;
4374 if (xop == -DW_LNE_end_sequence)
4376 reset_state_machine (linfo.li_default_is_stmt);
4391 if (directory_table)
4393 free (directory_table);
4394 directory_table = NULL;
4405 display_debug_lines (struct dwarf_section *section, void *file)
4407 unsigned char *data = section->start;
4408 unsigned char *end = data + section->size;
4410 int retValDecoded = 1;
4412 if (do_debug_lines == 0)
4413 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
4415 if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
4416 retValRaw = display_debug_lines_raw (section, data, end, file);
4418 if (do_debug_lines & FLAG_DEBUG_LINES_DECODED)
4419 retValDecoded = display_debug_lines_decoded (section, data, end, file);
4421 if (!retValRaw || !retValDecoded)
4428 find_debug_info_for_offset (unsigned long offset)
4432 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
4435 for (i = 0; i < num_debug_info_entries; i++)
4436 if (debug_information[i].cu_offset == offset)
4437 return debug_information + i;
4443 get_gdb_index_symbol_kind_name (gdb_index_symbol_kind kind)
4445 /* See gdb/gdb-index.h. */
4446 static const char * const kinds[] =
4458 return _ (kinds[kind]);
4462 display_debug_pubnames_worker (struct dwarf_section *section,
4463 void *file ATTRIBUTE_UNUSED,
4466 DWARF2_Internal_PubNames names;
4467 unsigned char *start = section->start;
4468 unsigned char *end = start + section->size;
4470 /* It does not matter if this load fails,
4471 we test for that later on. */
4472 load_debug_info (file);
4474 printf (_("Contents of the %s section:\n\n"), section->name);
4478 unsigned char *data;
4479 unsigned long sec_off;
4480 unsigned int offset_size, initial_length_size;
4482 SAFE_BYTE_GET_AND_INC (names.pn_length, start, 4, end);
4483 if (names.pn_length == 0xffffffff)
4485 SAFE_BYTE_GET_AND_INC (names.pn_length, start, 8, end);
4487 initial_length_size = 12;
4492 initial_length_size = 4;
4495 sec_off = start - section->start;
4496 if (sec_off + names.pn_length < sec_off
4497 || sec_off + names.pn_length > section->size)
4499 warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
4501 sec_off - initial_length_size,
4502 dwarf_vmatoa ("x", names.pn_length));
4507 start += names.pn_length;
4509 SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end);
4510 SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end);
4512 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
4513 && num_debug_info_entries > 0
4514 && find_debug_info_for_offset (names.pn_offset) == NULL)
4515 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
4516 (unsigned long) names.pn_offset, section->name);
4518 SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, end);
4520 printf (_(" Length: %ld\n"),
4521 (long) names.pn_length);
4522 printf (_(" Version: %d\n"),
4524 printf (_(" Offset into .debug_info section: 0x%lx\n"),
4525 (unsigned long) names.pn_offset);
4526 printf (_(" Size of area in .debug_info section: %ld\n"),
4527 (long) names.pn_size);
4529 if (names.pn_version != 2 && names.pn_version != 3)
4531 static int warned = 0;
4535 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
4543 printf (_("\n Offset Kind Name\n"));
4545 printf (_("\n Offset\tName\n"));
4549 bfd_size_type maxprint;
4552 SAFE_BYTE_GET (offset, data, offset_size, end);
4557 data += offset_size;
4560 maxprint = (end - data) - 1;
4564 unsigned int kind_data;
4565 gdb_index_symbol_kind kind;
4566 const char *kind_name;
4569 SAFE_BYTE_GET (kind_data, data, 1, end);
4572 /* GCC computes the kind as the upper byte in the CU index
4573 word, and then right shifts it by the CU index size.
4574 Left shift KIND to where the gdb-index.h accessor macros
4576 kind_data <<= GDB_INDEX_CU_BITSIZE;
4577 kind = GDB_INDEX_SYMBOL_KIND_VALUE (kind_data);
4578 kind_name = get_gdb_index_symbol_kind_name (kind);
4579 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (kind_data);
4580 printf (" %-6lx %s,%-10s %.*s\n",
4581 (unsigned long) offset, is_static ? _("s") : _("g"),
4582 kind_name, (int) maxprint, data);
4585 printf (" %-6lx\t%.*s\n",
4586 (unsigned long) offset, (int) maxprint, data);
4588 data += strnlen ((char *) data, maxprint) + 1;
4599 display_debug_pubnames (struct dwarf_section *section, void *file)
4601 return display_debug_pubnames_worker (section, file, 0);
4605 display_debug_gnu_pubnames (struct dwarf_section *section, void *file)
4607 return display_debug_pubnames_worker (section, file, 1);
4611 display_debug_macinfo (struct dwarf_section *section,
4612 void *file ATTRIBUTE_UNUSED)
4614 unsigned char *start = section->start;
4615 unsigned char *end = start + section->size;
4616 unsigned char *curr = start;
4617 unsigned int bytes_read;
4618 enum dwarf_macinfo_record_type op;
4620 printf (_("Contents of the %s section:\n\n"), section->name);
4624 unsigned int lineno;
4625 const unsigned char *string;
4627 op = (enum dwarf_macinfo_record_type) *curr;
4632 case DW_MACINFO_start_file:
4634 unsigned int filenum;
4636 lineno = read_uleb128 (curr, & bytes_read, end);
4638 filenum = read_uleb128 (curr, & bytes_read, end);
4641 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
4646 case DW_MACINFO_end_file:
4647 printf (_(" DW_MACINFO_end_file\n"));
4650 case DW_MACINFO_define:
4651 lineno = read_uleb128 (curr, & bytes_read, end);
4654 curr += strnlen ((char *) string, end - string) + 1;
4655 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
4659 case DW_MACINFO_undef:
4660 lineno = read_uleb128 (curr, & bytes_read, end);
4663 curr += strnlen ((char *) string, end - string) + 1;
4664 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
4668 case DW_MACINFO_vendor_ext:
4670 unsigned int constant;
4672 constant = read_uleb128 (curr, & bytes_read, end);
4675 curr += strnlen ((char *) string, end - string) + 1;
4676 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
4686 /* Given LINE_OFFSET into the .debug_line section, attempt to return
4687 filename and dirname corresponding to file name table entry with index
4688 FILEIDX. Return NULL on failure. */
4690 static unsigned char *
4691 get_line_filename_and_dirname (dwarf_vma line_offset,
4693 unsigned char **dir_name)
4695 struct dwarf_section *section = &debug_displays [line].section;
4696 unsigned char *hdrptr, *dirtable, *file_name;
4697 unsigned int offset_size, initial_length_size;
4698 unsigned int version, opcode_base, bytes_read;
4699 dwarf_vma length, diridx;
4700 const unsigned char * end;
4703 if (section->start == NULL
4704 || line_offset >= section->size
4708 hdrptr = section->start + line_offset;
4709 end = section->start + section->size;
4711 SAFE_BYTE_GET_AND_INC (length, hdrptr, 4, end);
4712 if (length == 0xffffffff)
4714 /* This section is 64-bit DWARF 3. */
4715 SAFE_BYTE_GET_AND_INC (length, hdrptr, 8, end);
4717 initial_length_size = 12;
4722 initial_length_size = 4;
4724 if (length + initial_length_size < length
4725 || length + initial_length_size > section->size)
4728 SAFE_BYTE_GET_AND_INC (version, hdrptr, 2, end);
4729 if (version != 2 && version != 3 && version != 4)
4731 hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length. */
4733 hdrptr++; /* Skip max_ops_per_insn. */
4734 hdrptr += 3; /* Skip default_is_stmt, line_base, line_range. */
4736 SAFE_BYTE_GET_AND_INC (opcode_base, hdrptr, 1, end);
4737 if (opcode_base == 0)
4740 hdrptr += opcode_base - 1;
4745 /* Skip over dirname table. */
4746 while (*hdrptr != '\0')
4748 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
4752 hdrptr++; /* Skip the NUL at the end of the table. */
4754 /* Now skip over preceding filename table entries. */
4755 for (; hdrptr < end && *hdrptr != '\0' && fileidx > 1; fileidx--)
4757 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
4758 read_uleb128 (hdrptr, &bytes_read, end);
4759 hdrptr += bytes_read;
4760 read_uleb128 (hdrptr, &bytes_read, end);
4761 hdrptr += bytes_read;
4762 read_uleb128 (hdrptr, &bytes_read, end);
4763 hdrptr += bytes_read;
4765 if (hdrptr >= end || *hdrptr == '\0')
4769 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
4772 diridx = read_uleb128 (hdrptr, &bytes_read, end);
4775 for (; dirtable < end && *dirtable != '\0' && diridx > 1; diridx--)
4776 dirtable += strnlen ((char *) dirtable, end - dirtable) + 1;
4777 if (dirtable >= end || *dirtable == '\0')
4779 *dir_name = dirtable;
4784 display_debug_macro (struct dwarf_section *section,
4787 unsigned char *start = section->start;
4788 unsigned char *end = start + section->size;
4789 unsigned char *curr = start;
4790 unsigned char *extended_op_buf[256];
4791 unsigned int bytes_read;
4793 load_debug_section (str, file);
4794 load_debug_section (line, file);
4796 printf (_("Contents of the %s section:\n\n"), section->name);
4800 unsigned int lineno, version, flags;
4801 unsigned int offset_size = 4;
4802 const unsigned char *string;
4803 dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
4804 unsigned char **extended_ops = NULL;
4806 SAFE_BYTE_GET_AND_INC (version, curr, 2, end);
4807 if (version != 4 && version != 5)
4809 error (_("Only GNU extension to DWARF 4 or 5 of %s is currently supported.\n"),
4814 SAFE_BYTE_GET_AND_INC (flags, curr, 1, end);
4817 printf (_(" Offset: 0x%lx\n"),
4818 (unsigned long) sec_offset);
4819 printf (_(" Version: %d\n"), version);
4820 printf (_(" Offset size: %d\n"), offset_size);
4823 SAFE_BYTE_GET_AND_INC (line_offset, curr, offset_size, end);
4824 printf (_(" Offset into .debug_line: 0x%lx\n"),
4825 (unsigned long) line_offset);
4829 unsigned int i, count, op;
4832 SAFE_BYTE_GET_AND_INC (count, curr, 1, end);
4834 memset (extended_op_buf, 0, sizeof (extended_op_buf));
4835 extended_ops = extended_op_buf;
4838 printf (_(" Extension opcode arguments:\n"));
4839 for (i = 0; i < count; i++)
4841 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
4842 extended_ops[op] = curr;
4843 nargs = read_uleb128 (curr, &bytes_read, end);
4846 printf (_(" DW_MACRO_%02x has no arguments\n"), op);
4849 printf (_(" DW_MACRO_%02x arguments: "), op);
4850 for (n = 0; n < nargs; n++)
4854 SAFE_BYTE_GET_AND_INC (form, curr, 1, end);
4855 printf ("%s%s", get_FORM_name (form),
4856 n == nargs - 1 ? "\n" : ", ");
4866 case DW_FORM_block1:
4867 case DW_FORM_block2:
4868 case DW_FORM_block4:
4870 case DW_FORM_string:
4872 case DW_FORM_sec_offset:
4875 error (_("Invalid extension opcode form %s\n"),
4876 get_FORM_name (form));
4892 error (_(".debug_macro section not zero terminated\n"));
4896 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
4902 case DW_MACRO_start_file:
4904 unsigned int filenum;
4905 unsigned char *file_name = NULL, *dir_name = NULL;
4907 lineno = read_uleb128 (curr, &bytes_read, end);
4909 filenum = read_uleb128 (curr, &bytes_read, end);
4912 if ((flags & 2) == 0)
4913 error (_("DW_MACRO_start_file used, but no .debug_line offset provided.\n"));
4916 = get_line_filename_and_dirname (line_offset, filenum,
4918 if (file_name == NULL)
4919 printf (_(" DW_MACRO_start_file - lineno: %d filenum: %d\n"),
4922 printf (_(" DW_MACRO_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
4924 dir_name != NULL ? (const char *) dir_name : "",
4925 dir_name != NULL ? "/" : "", file_name);
4929 case DW_MACRO_end_file:
4930 printf (_(" DW_MACRO_end_file\n"));
4933 case DW_MACRO_define:
4934 lineno = read_uleb128 (curr, &bytes_read, end);
4937 curr += strnlen ((char *) string, end - string) + 1;
4938 printf (_(" DW_MACRO_define - lineno : %d macro : %s\n"),
4942 case DW_MACRO_undef:
4943 lineno = read_uleb128 (curr, &bytes_read, end);
4946 curr += strnlen ((char *) string, end - string) + 1;
4947 printf (_(" DW_MACRO_undef - lineno : %d macro : %s\n"),
4951 case DW_MACRO_define_strp:
4952 lineno = read_uleb128 (curr, &bytes_read, end);
4954 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4955 string = fetch_indirect_string (offset);
4956 printf (_(" DW_MACRO_define_strp - lineno : %d macro : %s\n"),
4960 case DW_MACRO_undef_strp:
4961 lineno = read_uleb128 (curr, &bytes_read, end);
4963 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4964 string = fetch_indirect_string (offset);
4965 printf (_(" DW_MACRO_undef_strp - lineno : %d macro : %s\n"),
4969 case DW_MACRO_import:
4970 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4971 printf (_(" DW_MACRO_import - offset : 0x%lx\n"),
4972 (unsigned long) offset);
4975 case DW_MACRO_define_sup:
4976 lineno = read_uleb128 (curr, &bytes_read, end);
4978 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4979 printf (_(" DW_MACRO_define_sup - lineno : %d macro offset : 0x%lx\n"),
4980 lineno, (unsigned long) offset);
4983 case DW_MACRO_undef_sup:
4984 lineno = read_uleb128 (curr, &bytes_read, end);
4986 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4987 printf (_(" DW_MACRO_undef_sup - lineno : %d macro offset : 0x%lx\n"),
4988 lineno, (unsigned long) offset);
4991 case DW_MACRO_import_sup:
4992 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4993 printf (_(" DW_MACRO_import_sup - offset : 0x%lx\n"),
4994 (unsigned long) offset);
4998 if (extended_ops == NULL || extended_ops[op] == NULL)
5000 error (_(" Unknown macro opcode %02x seen\n"), op);
5005 /* Skip over unhandled opcodes. */
5007 unsigned char *desc = extended_ops[op];
5008 nargs = read_uleb128 (desc, &bytes_read, end);
5012 printf (_(" DW_MACRO_%02x\n"), op);
5015 printf (_(" DW_MACRO_%02x -"), op);
5016 for (n = 0; n < nargs; n++)
5020 /* DW_FORM_implicit_const is not expected here. */
5021 SAFE_BYTE_GET_AND_INC (val, desc, 1, end);
5023 = read_and_display_attr_value (0, val, 0,
5024 curr, end, 0, 0, offset_size,
5025 version, NULL, 0, NULL,
5043 display_debug_abbrev (struct dwarf_section *section,
5044 void *file ATTRIBUTE_UNUSED)
5046 abbrev_entry *entry;
5047 unsigned char *start = section->start;
5048 unsigned char *end = start + section->size;
5050 printf (_("Contents of the %s section:\n\n"), section->name);
5054 unsigned char *last;
5059 start = process_abbrev_section (start, end);
5061 if (first_abbrev == NULL)
5064 printf (_(" Number TAG (0x%lx)\n"), (long) (last - section->start));
5066 for (entry = first_abbrev; entry; entry = entry->next)
5070 printf (" %ld %s [%s]\n",
5072 get_TAG_name (entry->tag),
5073 entry->children ? _("has children") : _("no children"));
5075 for (attr = entry->first_attr; attr; attr = attr->next)
5077 printf (" %-18s %s",
5078 get_AT_name (attr->attribute),
5079 get_FORM_name (attr->form));
5080 if (attr->form == DW_FORM_implicit_const)
5081 printf (": %" BFD_VMA_FMT "d", attr->implicit_const);
5093 /* Return true when ADDR is the maximum address, when addresses are
5094 POINTER_SIZE bytes long. */
5097 is_max_address (dwarf_vma addr, unsigned int pointer_size)
5099 dwarf_vma mask = ~(~(dwarf_vma) 1 << (pointer_size * 8 - 1));
5100 return ((addr & mask) == mask);
5103 /* Display a view pair list starting at *VSTART_PTR and ending at
5104 VLISTEND within SECTION. */
5107 display_view_pair_list (struct dwarf_section *section,
5108 unsigned char **vstart_ptr,
5109 unsigned int debug_info_entry,
5110 unsigned char *vlistend)
5112 unsigned char *vstart = *vstart_ptr;
5113 unsigned char *section_end = section->start + section->size;
5114 unsigned int pointer_size = debug_information [debug_info_entry].pointer_size;
5116 if (vlistend < section_end)
5117 section_end = vlistend;
5121 while (vstart < section_end)
5123 dwarf_vma off = vstart - section->start;
5124 dwarf_vma vbegin, vend;
5126 unsigned int bytes_read;
5127 vbegin = read_uleb128 (vstart, &bytes_read, section_end);
5128 vstart += bytes_read;
5129 if (vstart == section_end)
5131 vstart -= bytes_read;
5135 vend = read_uleb128 (vstart, &bytes_read, section_end);
5136 vstart += bytes_read;
5138 printf (" %8.8lx ", (unsigned long) off);
5140 print_dwarf_view (vbegin, pointer_size, 1);
5141 print_dwarf_view (vend, pointer_size, 1);
5142 printf (_("location view pair\n"));
5146 *vstart_ptr = vstart;
5149 /* Display a location list from a normal (ie, non-dwo) .debug_loc section. */
5152 display_loc_list (struct dwarf_section *section,
5153 unsigned char **start_ptr,
5154 unsigned int debug_info_entry,
5156 dwarf_vma base_address,
5157 unsigned char **vstart_ptr,
5160 unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
5161 unsigned char *section_end = section->start + section->size;
5162 unsigned long cu_offset;
5163 unsigned int pointer_size;
5164 unsigned int offset_size;
5169 unsigned short length;
5170 int need_frame_base;
5172 if (debug_info_entry >= num_debug_info_entries)
5174 warn (_("No debug information available for loc lists of entry: %u\n"),
5179 cu_offset = debug_information [debug_info_entry].cu_offset;
5180 pointer_size = debug_information [debug_info_entry].pointer_size;
5181 offset_size = debug_information [debug_info_entry].offset_size;
5182 dwarf_version = debug_information [debug_info_entry].dwarf_version;
5184 if (pointer_size < 2 || pointer_size > 8)
5186 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
5187 pointer_size, debug_info_entry);
5193 dwarf_vma off = offset + (start - *start_ptr);
5194 dwarf_vma vbegin = vm1, vend = vm1;
5196 if (start + 2 * pointer_size > section_end)
5198 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5199 (unsigned long) offset);
5203 printf (" %8.8lx ", (unsigned long) off);
5205 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
5206 SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
5208 if (begin == 0 && end == 0)
5210 /* PR 18374: In a object file we can have a location list that
5211 starts with a begin and end of 0 because there are relocations
5212 that need to be applied to the addresses. Actually applying
5213 the relocations now does not help as they will probably resolve
5214 to 0, since the object file has not been fully linked. Real
5215 end of list markers will not have any relocations against them. */
5216 if (! reloc_at (section, off)
5217 && ! reloc_at (section, off + pointer_size))
5219 printf (_("<End of list>\n"));
5224 /* Check base address specifiers. */
5225 if (is_max_address (begin, pointer_size)
5226 && !is_max_address (end, pointer_size))
5229 print_dwarf_vma (begin, pointer_size);
5230 print_dwarf_vma (end, pointer_size);
5231 printf (_("(base address)\n"));
5237 unsigned int bytes_read;
5239 off = offset + (vstart - *start_ptr);
5241 vbegin = read_uleb128 (vstart, &bytes_read, section_end);
5242 vstart += bytes_read;
5243 print_dwarf_view (vbegin, pointer_size, 1);
5245 vend = read_uleb128 (vstart, &bytes_read, section_end);
5246 vstart += bytes_read;
5247 print_dwarf_view (vend, pointer_size, 1);
5249 printf (_("views at %8.8lx for:\n %*s "),
5250 (unsigned long) off, 8, "");
5253 if (start + 2 > section_end)
5255 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5256 (unsigned long) offset);
5260 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
5262 if (start + length > section_end)
5264 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5265 (unsigned long) offset);
5269 print_dwarf_vma (begin + base_address, pointer_size);
5270 print_dwarf_vma (end + base_address, pointer_size);
5273 need_frame_base = decode_location_expression (start,
5278 cu_offset, section);
5281 if (need_frame_base && !has_frame_base)
5282 printf (_(" [without DW_AT_frame_base]"));
5284 if (begin == end && vbegin == vend)
5285 fputs (_(" (start == end)"), stdout);
5286 else if (begin > end || (begin == end && vbegin > vend))
5287 fputs (_(" (start > end)"), stdout);
5295 *vstart_ptr = vstart;
5298 /* Display a location list from a normal (ie, non-dwo) .debug_loclists section. */
5301 display_loclists_list (struct dwarf_section *section,
5302 unsigned char **start_ptr,
5303 unsigned int debug_info_entry,
5305 dwarf_vma base_address,
5306 unsigned char **vstart_ptr,
5309 unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
5310 unsigned char *section_end = section->start + section->size;
5311 unsigned long cu_offset;
5312 unsigned int pointer_size;
5313 unsigned int offset_size;
5315 unsigned int bytes_read;
5317 /* Initialize it due to a false compiler warning. */
5318 dwarf_vma begin = -1, vbegin = -1;
5319 dwarf_vma end = -1, vend = -1;
5321 int need_frame_base;
5323 if (debug_info_entry >= num_debug_info_entries)
5325 warn (_("No debug information available for "
5326 "loclists lists of entry: %u\n"),
5331 cu_offset = debug_information [debug_info_entry].cu_offset;
5332 pointer_size = debug_information [debug_info_entry].pointer_size;
5333 offset_size = debug_information [debug_info_entry].offset_size;
5334 dwarf_version = debug_information [debug_info_entry].dwarf_version;
5336 if (pointer_size < 2 || pointer_size > 8)
5338 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
5339 pointer_size, debug_info_entry);
5345 dwarf_vma off = offset + (start - *start_ptr);
5346 enum dwarf_location_list_entry_type llet;
5348 if (start + 1 > section_end)
5350 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5351 (unsigned long) offset);
5355 printf (" %8.8lx ", (unsigned long) off);
5357 SAFE_BYTE_GET_AND_INC (llet, start, 1, section_end);
5359 if (vstart && llet == DW_LLE_offset_pair)
5361 off = offset + (vstart - *start_ptr);
5363 vbegin = read_uleb128 (vstart, &bytes_read, section_end);
5364 vstart += bytes_read;
5365 print_dwarf_view (vbegin, pointer_size, 1);
5367 vend = read_uleb128 (vstart, &bytes_read, section_end);
5368 vstart += bytes_read;
5369 print_dwarf_view (vend, pointer_size, 1);
5371 printf (_("views at %8.8lx for:\n %*s "),
5372 (unsigned long) off, 8, "");
5377 case DW_LLE_end_of_list:
5378 printf (_("<End of list>\n"));
5380 case DW_LLE_offset_pair:
5381 begin = read_uleb128 (start, &bytes_read, section_end);
5382 start += bytes_read;
5383 end = read_uleb128 (start, &bytes_read, section_end);
5384 start += bytes_read;
5386 case DW_LLE_base_address:
5387 SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size,
5389 print_dwarf_vma (base_address, pointer_size);
5390 printf (_("(base address)\n"));
5392 #ifdef DW_LLE_view_pair
5393 case DW_LLE_view_pair:
5395 printf (_("View pair entry in loclist with locviews attribute\n"));
5396 vbegin = read_uleb128 (start, &bytes_read, section_end);
5397 start += bytes_read;
5398 print_dwarf_view (vbegin, pointer_size, 1);
5400 vend = read_uleb128 (start, &bytes_read, section_end);
5401 start += bytes_read;
5402 print_dwarf_view (vend, pointer_size, 1);
5404 printf (_("views for:\n"));
5408 error (_("Invalid location list entry type %d\n"), llet);
5411 if (llet == DW_LLE_end_of_list)
5413 if (llet != DW_LLE_offset_pair)
5416 if (start + 2 > section_end)
5418 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5419 (unsigned long) offset);
5423 length = read_uleb128 (start, &bytes_read, section_end);
5424 start += bytes_read;
5426 print_dwarf_vma (begin + base_address, pointer_size);
5427 print_dwarf_vma (end + base_address, pointer_size);
5430 need_frame_base = decode_location_expression (start,
5435 cu_offset, section);
5438 if (need_frame_base && !has_frame_base)
5439 printf (_(" [without DW_AT_frame_base]"));
5441 if (begin == end && vbegin == vend)
5442 fputs (_(" (start == end)"), stdout);
5443 else if (begin > end || (begin == end && vbegin > vend))
5444 fputs (_(" (start > end)"), stdout);
5452 if (vbegin != vm1 || vend != vm1)
5453 printf (_("Trailing view pair not used in a range"));
5456 *vstart_ptr = vstart;
5459 /* Print a .debug_addr table index in decimal, surrounded by square brackets,
5460 right-adjusted in a field of length LEN, and followed by a space. */
5463 print_addr_index (unsigned int idx, unsigned int len)
5465 static char buf[15];
5466 snprintf (buf, sizeof (buf), "[%d]", idx);
5467 printf ("%*s ", len, buf);
5470 /* Display a location list from a .dwo section. It uses address indexes rather
5471 than embedded addresses. This code closely follows display_loc_list, but the
5472 two are sufficiently different that combining things is very ugly. */
5475 display_loc_list_dwo (struct dwarf_section *section,
5476 unsigned char **start_ptr,
5477 unsigned int debug_info_entry,
5479 unsigned char **vstart_ptr,
5482 unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
5483 unsigned char *section_end = section->start + section->size;
5484 unsigned long cu_offset;
5485 unsigned int pointer_size;
5486 unsigned int offset_size;
5489 unsigned short length;
5490 int need_frame_base;
5492 unsigned int bytes_read;
5494 if (debug_info_entry >= num_debug_info_entries)
5496 warn (_("No debug information for loc lists of entry: %u\n"),
5501 cu_offset = debug_information [debug_info_entry].cu_offset;
5502 pointer_size = debug_information [debug_info_entry].pointer_size;
5503 offset_size = debug_information [debug_info_entry].offset_size;
5504 dwarf_version = debug_information [debug_info_entry].dwarf_version;
5506 if (pointer_size < 2 || pointer_size > 8)
5508 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
5509 pointer_size, debug_info_entry);
5515 printf (" %8.8lx ", (unsigned long) (offset + (start - *start_ptr)));
5517 if (start >= section_end)
5519 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5520 (unsigned long) offset);
5524 SAFE_BYTE_GET_AND_INC (entry_type, start, 1, section_end);
5537 dwarf_vma off = offset + (vstart - *start_ptr);
5539 view = read_uleb128 (vstart, &bytes_read, section_end);
5540 vstart += bytes_read;
5541 print_dwarf_view (view, 8, 1);
5543 view = read_uleb128 (vstart, &bytes_read, section_end);
5544 vstart += bytes_read;
5545 print_dwarf_view (view, 8, 1);
5547 printf (_("views at %8.8lx for:\n %*s "),
5548 (unsigned long) off, 8, "");
5556 case 0: /* A terminating entry. */
5558 *vstart_ptr = vstart;
5559 printf (_("<End of list>\n"));
5561 case 1: /* A base-address entry. */
5562 idx = read_uleb128 (start, &bytes_read, section_end);
5563 start += bytes_read;
5564 print_addr_index (idx, 8);
5565 printf ("%*s", 9 + (vstart ? 2 * 6 : 0), "");
5566 printf (_("(base address selection entry)\n"));
5568 case 2: /* A start/end entry. */
5569 idx = read_uleb128 (start, &bytes_read, section_end);
5570 start += bytes_read;
5571 print_addr_index (idx, 8);
5572 idx = read_uleb128 (start, &bytes_read, section_end);
5573 start += bytes_read;
5574 print_addr_index (idx, 8);
5576 case 3: /* A start/length entry. */
5577 idx = read_uleb128 (start, &bytes_read, section_end);
5578 start += bytes_read;
5579 print_addr_index (idx, 8);
5580 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
5581 printf ("%08x ", idx);
5583 case 4: /* An offset pair entry. */
5584 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
5585 printf ("%08x ", idx);
5586 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
5587 printf ("%08x ", idx);
5590 warn (_("Unknown location list entry type 0x%x.\n"), entry_type);
5592 *vstart_ptr = vstart;
5596 if (start + 2 > section_end)
5598 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5599 (unsigned long) offset);
5603 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
5604 if (start + length > section_end)
5606 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5607 (unsigned long) offset);
5612 need_frame_base = decode_location_expression (start,
5617 cu_offset, section);
5620 if (need_frame_base && !has_frame_base)
5621 printf (_(" [without DW_AT_frame_base]"));
5629 *vstart_ptr = vstart;
5632 /* Sort array of indexes in ascending order of loc_offsets[idx] and
5635 static dwarf_vma *loc_offsets, *loc_views;
5638 loc_offsets_compar (const void *ap, const void *bp)
5640 dwarf_vma a = loc_offsets[*(const unsigned int *) ap];
5641 dwarf_vma b = loc_offsets[*(const unsigned int *) bp];
5643 int ret = (a > b) - (b > a);
5647 a = loc_views[*(const unsigned int *) ap];
5648 b = loc_views[*(const unsigned int *) bp];
5650 ret = (a > b) - (b > a);
5656 display_debug_loc (struct dwarf_section *section, void *file)
5658 unsigned char *start = section->start, *vstart = NULL;
5659 unsigned long bytes;
5660 unsigned char *section_begin = start;
5661 unsigned int num_loc_list = 0;
5662 unsigned long last_offset = 0;
5663 unsigned long last_view = 0;
5664 unsigned int first = 0;
5667 int seen_first_offset = 0;
5668 int locs_sorted = 1;
5669 unsigned char *next = start, *vnext = vstart;
5670 unsigned int *array = NULL;
5671 const char *suffix = strrchr (section->name, '.');
5673 int is_loclists = strstr (section->name, "debug_loclists") != NULL;
5674 dwarf_vma expected_start = 0;
5676 if (suffix && strcmp (suffix, ".dwo") == 0)
5679 bytes = section->size;
5683 printf (_("\nThe %s section is empty.\n"), section->name);
5689 unsigned char *hdrptr = section_begin;
5690 dwarf_vma ll_length;
5691 unsigned short ll_version;
5692 unsigned char *end = section_begin + section->size;
5693 unsigned char address_size, segment_selector_size;
5694 uint32_t offset_entry_count;
5696 SAFE_BYTE_GET_AND_INC (ll_length, hdrptr, 4, end);
5697 if (ll_length == 0xffffffff)
5698 SAFE_BYTE_GET_AND_INC (ll_length, hdrptr, 8, end);
5700 SAFE_BYTE_GET_AND_INC (ll_version, hdrptr, 2, end);
5701 if (ll_version != 5)
5703 warn (_("The %s section contains corrupt or "
5704 "unsupported version number: %d.\n"),
5705 section->name, ll_version);
5709 SAFE_BYTE_GET_AND_INC (address_size, hdrptr, 1, end);
5711 SAFE_BYTE_GET_AND_INC (segment_selector_size, hdrptr, 1, end);
5712 if (segment_selector_size != 0)
5714 warn (_("The %s section contains "
5715 "unsupported segment selector size: %d.\n"),
5716 section->name, segment_selector_size);
5720 SAFE_BYTE_GET_AND_INC (offset_entry_count, hdrptr, 4, end);
5721 if (offset_entry_count != 0)
5723 warn (_("The %s section contains "
5724 "unsupported offset entry count: %d.\n"),
5725 section->name, offset_entry_count);
5729 expected_start = hdrptr - section_begin;
5732 if (load_debug_info (file) == 0)
5734 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
5739 /* Check the order of location list in .debug_info section. If
5740 offsets of location lists are in the ascending order, we can
5741 use `debug_information' directly. */
5742 for (i = 0; i < num_debug_info_entries; i++)
5746 num = debug_information [i].num_loc_offsets;
5747 if (num > num_loc_list)
5750 /* Check if we can use `debug_information' directly. */
5751 if (locs_sorted && num != 0)
5753 if (!seen_first_offset)
5755 /* This is the first location list. */
5756 last_offset = debug_information [i].loc_offsets [0];
5757 last_view = debug_information [i].loc_views [0];
5759 seen_first_offset = 1;
5765 for (; j < num; j++)
5768 debug_information [i].loc_offsets [j]
5769 || (last_offset == debug_information [i].loc_offsets [j]
5770 && last_view > debug_information [i].loc_views [j]))
5775 last_offset = debug_information [i].loc_offsets [j];
5776 last_view = debug_information [i].loc_views [j];
5781 if (!seen_first_offset)
5782 error (_("No location lists in .debug_info section!\n"));
5784 if (debug_information [first].num_loc_offsets > 0
5785 && debug_information [first].loc_offsets [0] != expected_start
5786 && debug_information [first].loc_views [0] != expected_start)
5787 warn (_("Location lists in %s section start at 0x%s\n"),
5789 dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]));
5792 array = (unsigned int *) xcmalloc (num_loc_list, sizeof (unsigned int));
5793 printf (_("Contents of the %s section:\n\n"), section->name);
5794 if (reloc_at (section, 0))
5795 printf (_(" Warning: This section has relocations - addresses seen here may not be accurate.\n\n"));
5796 printf (_(" Offset Begin End Expression\n"));
5798 seen_first_offset = 0;
5799 for (i = first; i < num_debug_info_entries; i++)
5801 dwarf_vma offset, voffset;
5802 dwarf_vma base_address;
5808 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
5810 loc_offsets = debug_information [i].loc_offsets;
5811 loc_views = debug_information [i].loc_views;
5812 qsort (array, debug_information [i].num_loc_offsets,
5813 sizeof (*array), loc_offsets_compar);
5816 int adjacent_view_loclists = 1;
5817 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
5819 j = locs_sorted ? k : array[k];
5821 && (debug_information [i].loc_offsets [locs_sorted
5822 ? k - 1 : array [k - 1]]
5823 == debug_information [i].loc_offsets [j])
5824 && (debug_information [i].loc_views [locs_sorted
5825 ? k - 1 : array [k - 1]]
5826 == debug_information [i].loc_views [j]))
5828 has_frame_base = debug_information [i].have_frame_base [j];
5829 offset = debug_information [i].loc_offsets [j];
5830 next = section_begin + offset;
5831 voffset = debug_information [i].loc_views [j];
5833 vnext = section_begin + voffset;
5836 base_address = debug_information [i].base_address;
5838 if (vnext && vnext < next)
5841 display_view_pair_list (section, &vstart, i, next);
5846 if (!seen_first_offset || !adjacent_view_loclists)
5847 seen_first_offset = 1;
5851 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
5852 (unsigned long) (start - section_begin),
5853 (unsigned long) offset);
5854 else if (start > next)
5855 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
5856 (unsigned long) (start - section_begin),
5857 (unsigned long) offset);
5862 if (offset >= bytes)
5864 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
5865 (unsigned long) offset);
5869 if (vnext && voffset >= bytes)
5871 warn (_("View Offset 0x%lx is bigger than .debug_loc section size.\n"),
5872 (unsigned long) voffset);
5879 display_loc_list_dwo (section, &start, i, offset,
5880 &vstart, has_frame_base);
5882 display_loc_list (section, &start, i, offset, base_address,
5883 &vstart, has_frame_base);
5888 warn (_("DWO is not yet supported.\n"));
5890 display_loclists_list (section, &start, i, offset, base_address,
5891 &vstart, has_frame_base);
5894 /* FIXME: this arrangement is quite simplistic. Nothing
5895 requires locview lists to be adjacent to corresponding
5896 loclists, and a single loclist could be augmented by
5897 different locview lists, and vice-versa, unlikely as it
5898 is that it would make sense to do so. Hopefully we'll
5899 have view pair support built into loclists before we ever
5900 need to address all these possibilities. */
5901 if (adjacent_view_loclists && vnext
5902 && vnext != start && vstart != next)
5904 adjacent_view_loclists = 0;
5905 warn (_("Hole and overlap detection requires adjacent view lists and loclists.\n"));
5908 if (vnext && vnext == start)
5909 display_view_pair_list (section, &start, i, vstart);
5913 if (start < section->start + section->size)
5914 warn (_("There are %ld unused bytes at the end of section %s\n"),
5915 (long) (section->start + section->size - start), section->name);
5922 display_debug_str (struct dwarf_section *section,
5923 void *file ATTRIBUTE_UNUSED)
5925 unsigned char *start = section->start;
5926 unsigned long bytes = section->size;
5927 dwarf_vma addr = section->address;
5931 printf (_("\nThe %s section is empty.\n"), section->name);
5935 printf (_("Contents of the %s section:\n\n"), section->name);
5943 lbytes = (bytes > 16 ? 16 : bytes);
5945 printf (" 0x%8.8lx ", (unsigned long) addr);
5947 for (j = 0; j < 16; j++)
5950 printf ("%2.2x", start[j]);
5958 for (j = 0; j < lbytes; j++)
5961 if (k >= ' ' && k < 0x80)
5980 display_debug_info (struct dwarf_section *section, void *file)
5982 return process_debug_info (section, file, section->abbrev_sec, 0, 0);
5986 display_debug_types (struct dwarf_section *section, void *file)
5988 return process_debug_info (section, file, section->abbrev_sec, 0, 1);
5992 display_trace_info (struct dwarf_section *section, void *file)
5994 return process_debug_info (section, file, section->abbrev_sec, 0, 0);
5998 display_debug_aranges (struct dwarf_section *section,
5999 void *file ATTRIBUTE_UNUSED)
6001 unsigned char *start = section->start;
6002 unsigned char *end = start + section->size;
6004 printf (_("Contents of the %s section:\n\n"), section->name);
6006 /* It does not matter if this load fails,
6007 we test for that later on. */
6008 load_debug_info (file);
6012 unsigned char *hdrptr;
6013 DWARF2_Internal_ARange arange;
6014 unsigned char *addr_ranges;
6017 unsigned long sec_off;
6018 unsigned char address_size;
6020 unsigned int offset_size;
6021 unsigned int initial_length_size;
6025 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 4, end);
6026 if (arange.ar_length == 0xffffffff)
6028 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 8, end);
6030 initial_length_size = 12;
6035 initial_length_size = 4;
6038 sec_off = hdrptr - section->start;
6039 if (sec_off + arange.ar_length < sec_off
6040 || sec_off + arange.ar_length > section->size)
6042 warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
6044 sec_off - initial_length_size,
6045 dwarf_vmatoa ("x", arange.ar_length));
6049 SAFE_BYTE_GET_AND_INC (arange.ar_version, hdrptr, 2, end);
6050 SAFE_BYTE_GET_AND_INC (arange.ar_info_offset, hdrptr, offset_size, end);
6052 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
6053 && num_debug_info_entries > 0
6054 && find_debug_info_for_offset (arange.ar_info_offset) == NULL)
6055 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
6056 (unsigned long) arange.ar_info_offset, section->name);
6058 SAFE_BYTE_GET_AND_INC (arange.ar_pointer_size, hdrptr, 1, end);
6059 SAFE_BYTE_GET_AND_INC (arange.ar_segment_size, hdrptr, 1, end);
6061 if (arange.ar_version != 2 && arange.ar_version != 3)
6063 /* PR 19872: A version number of 0 probably means that there is
6064 padding at the end of the .debug_aranges section. Gold puts
6065 it there when performing an incremental link, for example.
6066 So do not generate a warning in this case. */
6067 if (arange.ar_version)
6068 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
6072 printf (_(" Length: %ld\n"),
6073 (long) arange.ar_length);
6074 printf (_(" Version: %d\n"), arange.ar_version);
6075 printf (_(" Offset into .debug_info: 0x%lx\n"),
6076 (unsigned long) arange.ar_info_offset);
6077 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
6078 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
6080 address_size = arange.ar_pointer_size + arange.ar_segment_size;
6082 /* PR 17512: file: 001-108546-0.001:0.1. */
6083 if (address_size == 0 || address_size > 8)
6085 error (_("Invalid address size in %s section!\n"),
6090 /* The DWARF spec does not require that the address size be a power
6091 of two, but we do. This will have to change if we ever encounter
6092 an uneven architecture. */
6093 if ((address_size & (address_size - 1)) != 0)
6095 warn (_("Pointer size + Segment size is not a power of two.\n"));
6099 if (address_size > 4)
6100 printf (_("\n Address Length\n"));
6102 printf (_("\n Address Length\n"));
6104 addr_ranges = hdrptr;
6106 /* Must pad to an alignment boundary that is twice the address size. */
6107 excess = (hdrptr - start) % (2 * address_size);
6109 addr_ranges += (2 * address_size) - excess;
6111 start += arange.ar_length + initial_length_size;
6113 while (addr_ranges + 2 * address_size <= start)
6115 SAFE_BYTE_GET_AND_INC (address, addr_ranges, address_size, end);
6116 SAFE_BYTE_GET_AND_INC (length, addr_ranges, address_size, end);
6119 print_dwarf_vma (address, address_size);
6120 print_dwarf_vma (length, address_size);
6130 /* Comparison function for qsort. */
6132 comp_addr_base (const void * v0, const void * v1)
6134 debug_info * info0 = (debug_info *) v0;
6135 debug_info * info1 = (debug_info *) v1;
6136 return info0->addr_base - info1->addr_base;
6139 /* Display the debug_addr section. */
6141 display_debug_addr (struct dwarf_section *section,
6144 debug_info **debug_addr_info;
6145 unsigned char *entry;
6150 if (section->size == 0)
6152 printf (_("\nThe %s section is empty.\n"), section->name);
6156 if (load_debug_info (file) == 0)
6158 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
6163 printf (_("Contents of the %s section:\n\n"), section->name);
6165 /* PR 17531: file: cf38d01b.
6166 We use xcalloc because a corrupt file may not have initialised all of the
6167 fields in the debug_info structure, which means that the sort below might
6168 try to move uninitialised data. */
6169 debug_addr_info = (debug_info **) xcalloc ((num_debug_info_entries + 1),
6170 sizeof (debug_info *));
6173 for (i = 0; i < num_debug_info_entries; i++)
6174 if (debug_information [i].addr_base != DEBUG_INFO_UNAVAILABLE)
6176 /* PR 17531: file: cf38d01b. */
6177 if (debug_information[i].addr_base >= section->size)
6178 warn (_("Corrupt address base (%lx) found in debug section %u\n"),
6179 (unsigned long) debug_information[i].addr_base, i);
6181 debug_addr_info [count++] = debug_information + i;
6184 /* Add a sentinel to make iteration convenient. */
6185 debug_addr_info [count] = (debug_info *) xmalloc (sizeof (debug_info));
6186 debug_addr_info [count]->addr_base = section->size;
6187 qsort (debug_addr_info, count, sizeof (debug_info *), comp_addr_base);
6189 for (i = 0; i < count; i++)
6192 unsigned int address_size = debug_addr_info [i]->pointer_size;
6194 printf (_(" For compilation unit at offset 0x%s:\n"),
6195 dwarf_vmatoa ("x", debug_addr_info [i]->cu_offset));
6197 printf (_("\tIndex\tAddress\n"));
6198 entry = section->start + debug_addr_info [i]->addr_base;
6199 end = section->start + debug_addr_info [i + 1]->addr_base;
6203 dwarf_vma base = byte_get (entry, address_size);
6204 printf (_("\t%d:\t"), idx);
6205 print_dwarf_vma (base, address_size);
6207 entry += address_size;
6213 free (debug_addr_info);
6217 /* Display the .debug_str_offsets and .debug_str_offsets.dwo sections. */
6219 display_debug_str_offsets (struct dwarf_section *section,
6220 void *file ATTRIBUTE_UNUSED)
6222 if (section->size == 0)
6224 printf (_("\nThe %s section is empty.\n"), section->name);
6227 /* TODO: Dump the contents. This is made somewhat difficult by not knowing
6228 what the offset size is for this section. */
6232 /* Each debug_information[x].range_lists[y] gets this representation for
6233 sorting purposes. */
6237 /* The debug_information[x].range_lists[y] value. */
6238 dwarf_vma ranges_offset;
6240 /* Original debug_information to find parameters of the data. */
6241 debug_info *debug_info_p;
6244 /* Sort struct range_entry in ascending order of its RANGES_OFFSET. */
6247 range_entry_compar (const void *ap, const void *bp)
6249 const struct range_entry *a_re = (const struct range_entry *) ap;
6250 const struct range_entry *b_re = (const struct range_entry *) bp;
6251 const dwarf_vma a = a_re->ranges_offset;
6252 const dwarf_vma b = b_re->ranges_offset;
6254 return (a > b) - (b > a);
6258 display_debug_ranges_list (unsigned char *start, unsigned char *finish,
6259 unsigned int pointer_size, unsigned long offset,
6260 unsigned long base_address)
6262 while (start < finish)
6267 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
6268 if (start >= finish)
6270 SAFE_SIGNED_BYTE_GET_AND_INC (end, start, pointer_size, finish);
6272 printf (" %8.8lx ", offset);
6274 if (begin == 0 && end == 0)
6276 printf (_("<End of list>\n"));
6280 /* Check base address specifiers. */
6281 if (is_max_address (begin, pointer_size)
6282 && !is_max_address (end, pointer_size))
6285 print_dwarf_vma (begin, pointer_size);
6286 print_dwarf_vma (end, pointer_size);
6287 printf ("(base address)\n");
6291 print_dwarf_vma (begin + base_address, pointer_size);
6292 print_dwarf_vma (end + base_address, pointer_size);
6295 fputs (_("(start == end)"), stdout);
6296 else if (begin > end)
6297 fputs (_("(start > end)"), stdout);
6304 display_debug_rnglists_list (unsigned char *start, unsigned char *finish,
6305 unsigned int pointer_size, unsigned long offset,
6306 unsigned long base_address)
6308 unsigned char *next = start;
6312 unsigned long off = offset + (start - next);
6313 enum dwarf_range_list_entry rlet;
6314 /* Initialize it due to a false compiler warning. */
6315 dwarf_vma begin = -1, length, end = -1;
6316 unsigned int bytes_read;
6318 if (start + 1 > finish)
6320 warn (_("Range list starting at offset 0x%lx is not terminated.\n"),
6325 printf (" %8.8lx ", off);
6327 SAFE_BYTE_GET_AND_INC (rlet, start, 1, finish);
6331 case DW_RLE_end_of_list:
6332 printf (_("<End of list>\n"));
6334 case DW_RLE_base_address:
6335 SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size, finish);
6336 print_dwarf_vma (base_address, pointer_size);
6337 printf (_("(base address)\n"));
6339 case DW_RLE_start_length:
6340 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
6341 length = read_uleb128 (start, &bytes_read, finish);
6342 start += bytes_read;
6343 end = begin + length;
6345 case DW_RLE_offset_pair:
6346 begin = read_uleb128 (start, &bytes_read, finish);
6347 start += bytes_read;
6348 end = read_uleb128 (start, &bytes_read, finish);
6349 start += bytes_read;
6351 case DW_RLE_start_end:
6352 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
6353 SAFE_BYTE_GET_AND_INC (end, start, pointer_size, finish);
6356 error (_("Invalid range list entry type %d\n"), rlet);
6357 rlet = DW_RLE_end_of_list;
6360 if (rlet == DW_RLE_end_of_list)
6362 if (rlet == DW_RLE_base_address)
6365 print_dwarf_vma (begin + base_address, pointer_size);
6366 print_dwarf_vma (end + base_address, pointer_size);
6369 fputs (_("(start == end)"), stdout);
6370 else if (begin > end)
6371 fputs (_("(start > end)"), stdout);
6378 display_debug_ranges (struct dwarf_section *section,
6379 void *file ATTRIBUTE_UNUSED)
6381 unsigned char *start = section->start;
6382 unsigned char *last_start = start;
6383 unsigned long bytes = section->size;
6384 unsigned char *section_begin = start;
6385 unsigned char *finish = start + bytes;
6386 unsigned int num_range_list, i;
6387 struct range_entry *range_entries, *range_entry_fill;
6388 int is_rnglists = strstr (section->name, "debug_rnglists") != NULL;
6389 /* Initialize it due to a false compiler warning. */
6390 unsigned char address_size = 0;
6394 printf (_("\nThe %s section is empty.\n"), section->name);
6400 dwarf_vma initial_length;
6401 unsigned int initial_length_size;
6402 unsigned char segment_selector_size;
6403 unsigned int offset_size, offset_entry_count;
6404 unsigned short version;
6406 /* Get and check the length of the block. */
6407 SAFE_BYTE_GET_AND_INC (initial_length, start, 4, finish);
6409 if (initial_length == 0xffffffff)
6411 /* This section is 64-bit DWARF 3. */
6412 SAFE_BYTE_GET_AND_INC (initial_length, start, 8, finish);
6414 initial_length_size = 12;
6419 initial_length_size = 4;
6422 if (initial_length + initial_length_size > section->size)
6424 /* If the length field has a relocation against it, then we should
6425 not complain if it is inaccurate (and probably negative).
6426 It is copied from .debug_line handling code. */
6427 if (reloc_at (section, (start - section->start) - offset_size))
6429 initial_length = (finish - start) - initial_length_size;
6433 warn (_("The length field (0x%lx) in the debug_rnglists header is wrong - the section is too small\n"),
6434 (long) initial_length);
6439 /* Get and check the version number. */
6440 SAFE_BYTE_GET_AND_INC (version, start, 2, finish);
6444 warn (_("Only DWARF version 5 debug_rnglists info "
6445 "is currently supported.\n"));
6449 SAFE_BYTE_GET_AND_INC (address_size, start, 1, finish);
6451 SAFE_BYTE_GET_AND_INC (segment_selector_size, start, 1, finish);
6452 if (segment_selector_size != 0)
6454 warn (_("The %s section contains "
6455 "unsupported segment selector size: %d.\n"),
6456 section->name, segment_selector_size);
6460 SAFE_BYTE_GET_AND_INC (offset_entry_count, start, 4, finish);
6461 if (offset_entry_count != 0)
6463 warn (_("The %s section contains "
6464 "unsupported offset entry count: %u.\n"),
6465 section->name, offset_entry_count);
6470 if (load_debug_info (file) == 0)
6472 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
6478 for (i = 0; i < num_debug_info_entries; i++)
6479 num_range_list += debug_information [i].num_range_lists;
6481 if (num_range_list == 0)
6483 /* This can happen when the file was compiled with -gsplit-debug
6484 which removes references to range lists from the primary .o file. */
6485 printf (_("No range lists in .debug_info section.\n"));
6489 range_entries = (struct range_entry *)
6490 xmalloc (sizeof (*range_entries) * num_range_list);
6491 range_entry_fill = range_entries;
6493 for (i = 0; i < num_debug_info_entries; i++)
6495 debug_info *debug_info_p = &debug_information[i];
6498 for (j = 0; j < debug_info_p->num_range_lists; j++)
6500 range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
6501 range_entry_fill->debug_info_p = debug_info_p;
6506 qsort (range_entries, num_range_list, sizeof (*range_entries),
6507 range_entry_compar);
6509 if (dwarf_check != 0 && range_entries[0].ranges_offset != 0)
6510 warn (_("Range lists in %s section start at 0x%lx\n"),
6511 section->name, (unsigned long) range_entries[0].ranges_offset);
6513 printf (_("Contents of the %s section:\n\n"), section->name);
6514 printf (_(" Offset Begin End\n"));
6516 for (i = 0; i < num_range_list; i++)
6518 struct range_entry *range_entry = &range_entries[i];
6519 debug_info *debug_info_p = range_entry->debug_info_p;
6520 unsigned int pointer_size;
6522 unsigned char *next;
6523 dwarf_vma base_address;
6525 pointer_size = (is_rnglists ? address_size : debug_info_p->pointer_size);
6526 offset = range_entry->ranges_offset;
6527 next = section_begin + offset;
6528 base_address = debug_info_p->base_address;
6530 /* PR 17512: file: 001-101485-0.001:0.1. */
6531 if (pointer_size < 2 || pointer_size > 8)
6533 warn (_("Corrupt pointer size (%d) in debug entry at offset %8.8lx\n"),
6534 pointer_size, (unsigned long) offset);
6538 if (dwarf_check != 0 && i > 0)
6541 warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
6542 (unsigned long) (start - section_begin),
6543 (unsigned long) (next - section_begin), section->name);
6544 else if (start > next)
6546 if (next == last_start)
6548 warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
6549 (unsigned long) (start - section_begin),
6550 (unsigned long) (next - section_begin), section->name);
6556 (is_rnglists ? display_debug_rnglists_list : display_debug_ranges_list)
6557 (start, finish, pointer_size, offset, base_address);
6561 free (range_entries);
6566 typedef struct Frame_Chunk
6568 struct Frame_Chunk *next;
6569 unsigned char *chunk_start;
6571 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
6572 short int *col_type;
6575 unsigned int code_factor;
6580 dwarf_vma cfa_offset;
6582 unsigned char fde_encoding;
6583 unsigned char cfa_exp;
6584 unsigned char ptr_size;
6585 unsigned char segment_size;
6589 static const char *const *dwarf_regnames;
6590 static unsigned int dwarf_regnames_count;
6592 /* A marker for a col_type that means this column was never referenced
6593 in the frame info. */
6594 #define DW_CFA_unreferenced (-1)
6596 /* Return 0 if no more space is needed, 1 if more space is needed,
6597 -1 for invalid reg. */
6600 frame_need_space (Frame_Chunk *fc, unsigned int reg)
6602 unsigned int prev = fc->ncols;
6604 if (reg < (unsigned int) fc->ncols)
6607 if (dwarf_regnames_count
6608 && reg > dwarf_regnames_count)
6611 fc->ncols = reg + 1;
6612 /* PR 17512: file: 10450-2643-0.004.
6613 If reg == -1 then this can happen... */
6617 /* PR 17512: file: 2844a11d. */
6618 if (fc->ncols > 1024)
6620 error (_("Unfeasibly large register number: %u\n"), reg);
6622 /* FIXME: 1024 is an arbitrary limit. Increase it if
6623 we ever encounter a valid binary that exceeds it. */
6627 fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
6628 sizeof (short int));
6629 fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
6630 /* PR 17512: file:002-10025-0.005. */
6631 if (fc->col_type == NULL || fc->col_offset == NULL)
6633 error (_("Out of memory allocating %u columns in dwarf frame arrays\n"),
6639 while (prev < fc->ncols)
6641 fc->col_type[prev] = DW_CFA_unreferenced;
6642 fc->col_offset[prev] = 0;
6648 static const char *const dwarf_regnames_i386[] =
6650 "eax", "ecx", "edx", "ebx", /* 0 - 3 */
6651 "esp", "ebp", "esi", "edi", /* 4 - 7 */
6652 "eip", "eflags", NULL, /* 8 - 10 */
6653 "st0", "st1", "st2", "st3", /* 11 - 14 */
6654 "st4", "st5", "st6", "st7", /* 15 - 18 */
6655 NULL, NULL, /* 19 - 20 */
6656 "xmm0", "xmm1", "xmm2", "xmm3", /* 21 - 24 */
6657 "xmm4", "xmm5", "xmm6", "xmm7", /* 25 - 28 */
6658 "mm0", "mm1", "mm2", "mm3", /* 29 - 32 */
6659 "mm4", "mm5", "mm6", "mm7", /* 33 - 36 */
6660 "fcw", "fsw", "mxcsr", /* 37 - 39 */
6661 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47 */
6662 "tr", "ldtr", /* 48 - 49 */
6663 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57 */
6664 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65 */
6665 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73 */
6666 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81 */
6667 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89 */
6668 NULL, NULL, NULL, /* 90 - 92 */
6669 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7" /* 93 - 100 */
6672 static const char *const dwarf_regnames_iamcu[] =
6674 "eax", "ecx", "edx", "ebx", /* 0 - 3 */
6675 "esp", "ebp", "esi", "edi", /* 4 - 7 */
6676 "eip", "eflags", NULL, /* 8 - 10 */
6677 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 11 - 18 */
6678 NULL, NULL, /* 19 - 20 */
6679 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 21 - 28 */
6680 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 29 - 36 */
6681 NULL, NULL, NULL, /* 37 - 39 */
6682 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47 */
6683 "tr", "ldtr", /* 48 - 49 */
6684 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57 */
6685 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65 */
6686 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73 */
6687 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81 */
6688 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89 */
6689 NULL, NULL, NULL, /* 90 - 92 */
6690 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL /* 93 - 100 */
6694 init_dwarf_regnames_i386 (void)
6696 dwarf_regnames = dwarf_regnames_i386;
6697 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
6701 init_dwarf_regnames_iamcu (void)
6703 dwarf_regnames = dwarf_regnames_iamcu;
6704 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_iamcu);
6707 static const char *const dwarf_regnames_x86_64[] =
6709 "rax", "rdx", "rcx", "rbx",
6710 "rsi", "rdi", "rbp", "rsp",
6711 "r8", "r9", "r10", "r11",
6712 "r12", "r13", "r14", "r15",
6714 "xmm0", "xmm1", "xmm2", "xmm3",
6715 "xmm4", "xmm5", "xmm6", "xmm7",
6716 "xmm8", "xmm9", "xmm10", "xmm11",
6717 "xmm12", "xmm13", "xmm14", "xmm15",
6718 "st0", "st1", "st2", "st3",
6719 "st4", "st5", "st6", "st7",
6720 "mm0", "mm1", "mm2", "mm3",
6721 "mm4", "mm5", "mm6", "mm7",
6723 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
6724 "fs.base", "gs.base", NULL, NULL,
6726 "mxcsr", "fcw", "fsw",
6727 "xmm16", "xmm17", "xmm18", "xmm19",
6728 "xmm20", "xmm21", "xmm22", "xmm23",
6729 "xmm24", "xmm25", "xmm26", "xmm27",
6730 "xmm28", "xmm29", "xmm30", "xmm31",
6731 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 83 - 90 */
6732 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 91 - 98 */
6733 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 99 - 106 */
6734 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 107 - 114 */
6735 NULL, NULL, NULL, /* 115 - 117 */
6736 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
6740 init_dwarf_regnames_x86_64 (void)
6742 dwarf_regnames = dwarf_regnames_x86_64;
6743 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
6746 static const char *const dwarf_regnames_aarch64[] =
6748 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
6749 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
6750 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
6751 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp",
6752 NULL, "elr", NULL, NULL, NULL, NULL, NULL, NULL,
6753 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
6754 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
6755 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
6756 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
6757 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
6758 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
6759 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
6763 init_dwarf_regnames_aarch64 (void)
6765 dwarf_regnames = dwarf_regnames_aarch64;
6766 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_aarch64);
6769 static const char *const dwarf_regnames_s390[] =
6771 /* Avoid saying "r5 (r5)", so omit the names of r0-r15. */
6772 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
6773 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
6774 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6775 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15",
6776 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
6777 "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", "cr15",
6778 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7",
6779 "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15",
6782 "v16", "v18", "v20", "v22", "v17", "v19", "v21", "v23",
6783 "v24", "v26", "v28", "v30", "v25", "v27", "v29", "v31",
6787 init_dwarf_regnames_s390 (void)
6789 dwarf_regnames = dwarf_regnames_s390;
6790 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_s390);
6794 init_dwarf_regnames (unsigned int e_machine)
6799 init_dwarf_regnames_i386 ();
6803 init_dwarf_regnames_iamcu ();
6809 init_dwarf_regnames_x86_64 ();
6813 init_dwarf_regnames_aarch64 ();
6817 init_dwarf_regnames_s390 ();
6826 regname (unsigned int regno, int row)
6828 static char reg[64];
6831 && regno < dwarf_regnames_count
6832 && dwarf_regnames [regno] != NULL)
6835 return dwarf_regnames [regno];
6836 snprintf (reg, sizeof (reg), "r%d (%s)", regno,
6837 dwarf_regnames [regno]);
6840 snprintf (reg, sizeof (reg), "r%d", regno);
6845 frame_display_row (Frame_Chunk *fc, int *need_col_headers, unsigned int *max_regs)
6850 if (*max_regs != fc->ncols)
6851 *max_regs = fc->ncols;
6853 if (*need_col_headers)
6855 static const char *sloc = " LOC";
6857 *need_col_headers = 0;
6859 printf ("%-*s CFA ", eh_addr_size * 2, sloc);
6861 for (r = 0; r < *max_regs; r++)
6862 if (fc->col_type[r] != DW_CFA_unreferenced)
6867 printf ("%-5s ", regname (r, 1));
6873 print_dwarf_vma (fc->pc_begin, eh_addr_size);
6875 strcpy (tmp, "exp");
6877 sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), (int) fc->cfa_offset);
6878 printf ("%-8s ", tmp);
6880 for (r = 0; r < fc->ncols; r++)
6882 if (fc->col_type[r] != DW_CFA_unreferenced)
6884 switch (fc->col_type[r])
6886 case DW_CFA_undefined:
6889 case DW_CFA_same_value:
6893 sprintf (tmp, "c%+d", fc->col_offset[r]);
6895 case DW_CFA_val_offset:
6896 sprintf (tmp, "v%+d", fc->col_offset[r]);
6898 case DW_CFA_register:
6899 sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
6901 case DW_CFA_expression:
6902 strcpy (tmp, "exp");
6904 case DW_CFA_val_expression:
6905 strcpy (tmp, "vexp");
6908 strcpy (tmp, "n/a");
6911 printf ("%-5s ", tmp);
6917 #define GET(VAR, N) SAFE_BYTE_GET_AND_INC (VAR, start, N, end)
6919 static unsigned char *
6920 read_cie (unsigned char *start, unsigned char *end,
6921 Frame_Chunk **p_cie, int *p_version,
6922 unsigned long *p_aug_len, unsigned char **p_aug)
6926 unsigned int length_return;
6927 unsigned char *augmentation_data = NULL;
6928 unsigned long augmentation_data_len = 0;
6931 /* PR 17512: file: 001-228113-0.004. */
6935 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
6936 memset (fc, 0, sizeof (Frame_Chunk));
6938 fc->col_type = (short int *) xmalloc (sizeof (short int));
6939 fc->col_offset = (int *) xmalloc (sizeof (int));
6943 fc->augmentation = (char *) start;
6944 /* PR 17512: file: 001-228113-0.004.
6945 Skip past augmentation name, but avoid running off the end of the data. */
6947 if (* start ++ == '\0')
6951 warn (_("No terminator for augmentation name\n"));
6955 if (strcmp (fc->augmentation, "eh") == 0)
6956 start += eh_addr_size;
6960 GET (fc->ptr_size, 1);
6961 if (fc->ptr_size < 1 || fc->ptr_size > 8)
6963 warn (_("Invalid pointer size (%d) in CIE data\n"), fc->ptr_size);
6967 GET (fc->segment_size, 1);
6968 /* PR 17512: file: e99d2804. */
6969 if (fc->segment_size > 8 || fc->segment_size + fc->ptr_size > 8)
6971 warn (_("Invalid segment size (%d) in CIE data\n"), fc->segment_size);
6975 eh_addr_size = fc->ptr_size;
6979 fc->ptr_size = eh_addr_size;
6980 fc->segment_size = 0;
6982 READ_ULEB (fc->code_factor);
6983 READ_SLEB (fc->data_factor);
6993 if (fc->augmentation[0] == 'z')
6995 READ_ULEB (augmentation_data_len);
6996 augmentation_data = start;
6997 /* PR 17512: file: 11042-2589-0.004. */
6998 if (augmentation_data_len > (size_t) (end - start))
7000 warn (_("Augmentation data too long: %#lx, expected at most %#lx\n"),
7001 augmentation_data_len, (unsigned long) (end - start));
7004 start += augmentation_data_len;
7007 if (augmentation_data_len)
7011 unsigned char *qend;
7013 p = (unsigned char *) fc->augmentation + 1;
7014 q = augmentation_data;
7015 qend = q + augmentation_data_len;
7017 while (p < end && q < qend)
7022 q += 1 + size_of_encoded_value (*q);
7024 fc->fde_encoding = *q++;
7031 /* Note - it is OK if this loop terminates with q < qend.
7032 Padding may have been inserted to align the end of the CIE. */
7037 *p_version = version;
7040 *p_aug_len = augmentation_data_len;
7041 *p_aug = augmentation_data;
7047 display_debug_frames (struct dwarf_section *section,
7048 void *file ATTRIBUTE_UNUSED)
7050 unsigned char *start = section->start;
7051 unsigned char *end = start + section->size;
7052 unsigned char *section_start = start;
7053 Frame_Chunk *chunks = 0, *forward_refs = 0;
7054 Frame_Chunk *remembered_state = 0;
7056 int is_eh = strcmp (section->name, ".eh_frame") == 0;
7057 unsigned int length_return;
7058 unsigned int max_regs = 0;
7059 const char *bad_reg = _("bad register: ");
7060 unsigned int saved_eh_addr_size = eh_addr_size;
7062 printf (_("Contents of the %s section:\n"), section->name);
7066 unsigned char *saved_start;
7067 unsigned char *block_end;
7072 int need_col_headers = 1;
7073 unsigned char *augmentation_data = NULL;
7074 unsigned long augmentation_data_len = 0;
7075 unsigned int encoded_ptr_size = saved_eh_addr_size;
7076 unsigned int offset_size;
7077 unsigned int initial_length_size;
7078 bfd_boolean all_nops;
7080 saved_start = start;
7082 SAFE_BYTE_GET_AND_INC (length, start, 4, end);
7086 printf ("\n%08lx ZERO terminator\n\n",
7087 (unsigned long)(saved_start - section_start));
7088 /* Skip any zero terminators that directly follow.
7089 A corrupt section size could have loaded a whole
7090 slew of zero filled memory bytes. eg
7091 PR 17512: file: 070-19381-0.004. */
7092 while (start < end && * start == 0)
7097 if (length == 0xffffffff)
7099 SAFE_BYTE_GET_AND_INC (length, start, 8, end);
7101 initial_length_size = 12;
7106 initial_length_size = 4;
7109 block_end = saved_start + length + initial_length_size;
7110 if (block_end > end || block_end < start)
7112 warn ("Invalid length 0x%s in FDE at %#08lx\n",
7113 dwarf_vmatoa_1 (NULL, length, offset_size),
7114 (unsigned long) (saved_start - section_start));
7118 SAFE_BYTE_GET_AND_INC (cie_id, start, offset_size, end);
7120 if (is_eh ? (cie_id == 0) : ((offset_size == 4 && cie_id == DW_CIE_ID)
7121 || (offset_size == 8 && cie_id == DW64_CIE_ID)))
7126 start = read_cie (start, end, &cie, &version,
7127 &augmentation_data_len, &augmentation_data);
7128 /* PR 17512: file: 027-135133-0.005. */
7135 fc->chunk_start = saved_start;
7136 mreg = max_regs > 0 ? max_regs - 1 : 0;
7139 if (frame_need_space (fc, mreg) < 0)
7141 if (fc->fde_encoding)
7142 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7144 printf ("\n%08lx ", (unsigned long) (saved_start - section_start));
7145 print_dwarf_vma (length, fc->ptr_size);
7146 print_dwarf_vma (cie_id, offset_size);
7148 if (do_debug_frames_interp)
7150 printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc->augmentation,
7151 fc->code_factor, fc->data_factor, fc->ra);
7156 printf (" Version: %d\n", version);
7157 printf (" Augmentation: \"%s\"\n", fc->augmentation);
7160 printf (" Pointer Size: %u\n", fc->ptr_size);
7161 printf (" Segment Size: %u\n", fc->segment_size);
7163 printf (" Code alignment factor: %u\n", fc->code_factor);
7164 printf (" Data alignment factor: %d\n", fc->data_factor);
7165 printf (" Return address column: %d\n", fc->ra);
7167 if (augmentation_data_len)
7171 printf (" Augmentation data: ");
7172 for (i = 0; i < augmentation_data_len; ++i)
7173 /* FIXME: If do_wide is FALSE, then we should
7174 add carriage returns at 80 columns... */
7175 printf (" %02x", augmentation_data[i]);
7183 unsigned char *look_for;
7184 static Frame_Chunk fde_fc;
7185 unsigned long segment_selector;
7189 dwarf_vma sign = (dwarf_vma) 1 << (offset_size * 8 - 1);
7190 look_for = start - 4 - ((cie_id ^ sign) - sign);
7193 look_for = section_start + cie_id;
7195 if (look_for <= saved_start)
7197 for (cie = chunks; cie ; cie = cie->next)
7198 if (cie->chunk_start == look_for)
7203 for (cie = forward_refs; cie ; cie = cie->next)
7204 if (cie->chunk_start == look_for)
7208 unsigned int off_size;
7209 unsigned char *cie_scan;
7211 cie_scan = look_for;
7213 SAFE_BYTE_GET_AND_INC (length, cie_scan, 4, end);
7214 if (length == 0xffffffff)
7216 SAFE_BYTE_GET_AND_INC (length, cie_scan, 8, end);
7223 SAFE_BYTE_GET_AND_INC (c_id, cie_scan, off_size, end);
7226 : ((off_size == 4 && c_id == DW_CIE_ID)
7227 || (off_size == 8 && c_id == DW64_CIE_ID)))
7232 read_cie (cie_scan, end, &cie, &version,
7233 &augmentation_data_len, &augmentation_data);
7234 /* PR 17512: file: 3450-2098-0.004. */
7237 warn (_("Failed to read CIE information\n"));
7240 cie->next = forward_refs;
7242 cie->chunk_start = look_for;
7243 mreg = max_regs > 0 ? max_regs - 1 : 0;
7246 if (frame_need_space (cie, mreg) < 0)
7248 warn (_("Invalid max register\n"));
7251 if (cie->fde_encoding)
7253 = size_of_encoded_value (cie->fde_encoding);
7260 memset (fc, 0, sizeof (Frame_Chunk));
7264 warn ("Invalid CIE pointer 0x%s in FDE at %#08lx\n",
7265 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
7266 (unsigned long) (saved_start - section_start));
7268 fc->col_type = (short int *) xmalloc (sizeof (short int));
7269 fc->col_offset = (int *) xmalloc (sizeof (int));
7270 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1 : 0) < 0)
7272 warn (_("Invalid max register\n"));
7276 fc->augmentation = "";
7277 fc->fde_encoding = 0;
7278 fc->ptr_size = eh_addr_size;
7279 fc->segment_size = 0;
7283 fc->ncols = cie->ncols;
7284 fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
7285 fc->col_offset = (int *) xcmalloc (fc->ncols, sizeof (int));
7286 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
7287 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
7288 fc->augmentation = cie->augmentation;
7289 fc->ptr_size = cie->ptr_size;
7290 eh_addr_size = cie->ptr_size;
7291 fc->segment_size = cie->segment_size;
7292 fc->code_factor = cie->code_factor;
7293 fc->data_factor = cie->data_factor;
7294 fc->cfa_reg = cie->cfa_reg;
7295 fc->cfa_offset = cie->cfa_offset;
7297 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1: 0) < 0)
7299 warn (_("Invalid max register\n"));
7302 fc->fde_encoding = cie->fde_encoding;
7305 if (fc->fde_encoding)
7306 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7308 segment_selector = 0;
7309 if (fc->segment_size)
7311 if (fc->segment_size > sizeof (segment_selector))
7313 /* PR 17512: file: 9e196b3e. */
7314 warn (_("Probably corrupt segment size: %d - using 4 instead\n"), fc->segment_size);
7315 fc->segment_size = 4;
7317 SAFE_BYTE_GET_AND_INC (segment_selector, start, fc->segment_size, end);
7320 fc->pc_begin = get_encoded_value (&start, fc->fde_encoding, section, end);
7322 /* FIXME: It appears that sometimes the final pc_range value is
7323 encoded in less than encoded_ptr_size bytes. See the x86_64
7324 run of the "objcopy on compressed debug sections" test for an
7326 SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end);
7328 if (cie->augmentation[0] == 'z')
7330 READ_ULEB (augmentation_data_len);
7331 augmentation_data = start;
7332 start += augmentation_data_len;
7333 /* PR 17512: file: 722-8446-0.004. */
7334 if (start >= end || ((signed long) augmentation_data_len) < 0)
7336 warn (_("Corrupt augmentation data length: %lx\n"),
7337 augmentation_data_len);
7339 augmentation_data = NULL;
7340 augmentation_data_len = 0;
7344 printf ("\n%08lx %s %s FDE cie=%08lx pc=",
7345 (unsigned long)(saved_start - section_start),
7346 dwarf_vmatoa_1 (NULL, length, fc->ptr_size),
7347 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
7348 (unsigned long)(cie->chunk_start - section_start));
7350 if (fc->segment_size)
7351 printf ("%04lx:", segment_selector);
7354 dwarf_vmatoa_1 (NULL, fc->pc_begin, fc->ptr_size),
7355 dwarf_vmatoa_1 (NULL, fc->pc_begin + fc->pc_range, fc->ptr_size));
7357 if (! do_debug_frames_interp && augmentation_data_len)
7361 printf (" Augmentation data: ");
7362 for (i = 0; i < augmentation_data_len; ++i)
7363 printf (" %02x", augmentation_data[i]);
7369 /* At this point, fc is the current chunk, cie (if any) is set, and
7370 we're about to interpret instructions for the chunk. */
7371 /* ??? At present we need to do this always, since this sizes the
7372 fc->col_type and fc->col_offset arrays, which we write into always.
7373 We should probably split the interpreted and non-interpreted bits
7374 into two different routines, since there's so much that doesn't
7375 really overlap between them. */
7376 if (1 || do_debug_frames_interp)
7378 /* Start by making a pass over the chunk, allocating storage
7379 and taking note of what registers are used. */
7380 unsigned char *tmp = start;
7382 while (start < block_end)
7384 unsigned int reg, op, opa;
7386 unsigned char * new_start;
7393 /* Warning: if you add any more cases to this switch, be
7394 sure to add them to the corresponding switch below. */
7397 case DW_CFA_advance_loc:
7401 if (frame_need_space (fc, opa) >= 0)
7402 fc->col_type[opa] = DW_CFA_undefined;
7404 case DW_CFA_restore:
7405 if (frame_need_space (fc, opa) >= 0)
7406 fc->col_type[opa] = DW_CFA_undefined;
7408 case DW_CFA_set_loc:
7409 start += encoded_ptr_size;
7411 case DW_CFA_advance_loc1:
7414 case DW_CFA_advance_loc2:
7417 case DW_CFA_advance_loc4:
7420 case DW_CFA_offset_extended:
7421 case DW_CFA_val_offset:
7424 if (frame_need_space (fc, reg) >= 0)
7425 fc->col_type[reg] = DW_CFA_undefined;
7427 case DW_CFA_restore_extended:
7429 if (frame_need_space (fc, reg) >= 0)
7430 fc->col_type[reg] = DW_CFA_undefined;
7432 case DW_CFA_undefined:
7434 if (frame_need_space (fc, reg) >= 0)
7435 fc->col_type[reg] = DW_CFA_undefined;
7437 case DW_CFA_same_value:
7439 if (frame_need_space (fc, reg) >= 0)
7440 fc->col_type[reg] = DW_CFA_undefined;
7442 case DW_CFA_register:
7445 if (frame_need_space (fc, reg) >= 0)
7446 fc->col_type[reg] = DW_CFA_undefined;
7448 case DW_CFA_def_cfa:
7452 case DW_CFA_def_cfa_register:
7455 case DW_CFA_def_cfa_offset:
7458 case DW_CFA_def_cfa_expression:
7460 new_start = start + temp;
7461 if (new_start < start)
7463 warn (_("Corrupt CFA_def expression value: %lu\n"), temp);
7469 case DW_CFA_expression:
7470 case DW_CFA_val_expression:
7473 new_start = start + temp;
7474 if (new_start < start)
7476 /* PR 17512: file:306-192417-0.005. */
7477 warn (_("Corrupt CFA expression value: %lu\n"), temp);
7482 if (frame_need_space (fc, reg) >= 0)
7483 fc->col_type[reg] = DW_CFA_undefined;
7485 case DW_CFA_offset_extended_sf:
7486 case DW_CFA_val_offset_sf:
7489 if (frame_need_space (fc, reg) >= 0)
7490 fc->col_type[reg] = DW_CFA_undefined;
7492 case DW_CFA_def_cfa_sf:
7496 case DW_CFA_def_cfa_offset_sf:
7499 case DW_CFA_MIPS_advance_loc8:
7502 case DW_CFA_GNU_args_size:
7505 case DW_CFA_GNU_negative_offset_extended:
7508 if (frame_need_space (fc, reg) >= 0)
7509 fc->col_type[reg] = DW_CFA_undefined;
7520 /* Now we know what registers are used, make a second pass over
7521 the chunk, this time actually printing out the info. */
7523 while (start < block_end)
7525 unsigned char * tmp;
7527 unsigned long ul, roffs;
7528 /* Note: It is tempting to use an unsigned long for 'reg' but there
7529 are various functions, notably frame_space_needed() that assume that
7530 reg is an unsigned int. */
7535 const char *reg_prefix = "";
7542 /* Make a note if something other than DW_CFA_nop happens. */
7543 if (op != DW_CFA_nop)
7546 /* Warning: if you add any more cases to this switch, be
7547 sure to add them to the corresponding switch above. */
7550 case DW_CFA_advance_loc:
7551 if (do_debug_frames_interp)
7552 frame_display_row (fc, &need_col_headers, &max_regs);
7554 printf (" DW_CFA_advance_loc: %d to %s\n",
7555 opa * fc->code_factor,
7556 dwarf_vmatoa_1 (NULL,
7557 fc->pc_begin + opa * fc->code_factor,
7559 fc->pc_begin += opa * fc->code_factor;
7564 if (opa >= (unsigned int) fc->ncols)
7565 reg_prefix = bad_reg;
7566 if (! do_debug_frames_interp || *reg_prefix != '\0')
7567 printf (" DW_CFA_offset: %s%s at cfa%+ld\n",
7568 reg_prefix, regname (opa, 0),
7569 roffs * fc->data_factor);
7570 if (*reg_prefix == '\0')
7572 fc->col_type[opa] = DW_CFA_offset;
7573 fc->col_offset[opa] = roffs * fc->data_factor;
7577 case DW_CFA_restore:
7578 if (opa >= (unsigned int) fc->ncols)
7579 reg_prefix = bad_reg;
7580 if (! do_debug_frames_interp || *reg_prefix != '\0')
7581 printf (" DW_CFA_restore: %s%s\n",
7582 reg_prefix, regname (opa, 0));
7583 if (*reg_prefix != '\0')
7586 if (opa >= (unsigned int) cie->ncols
7587 || (do_debug_frames_interp
7588 && cie->col_type[opa] == DW_CFA_unreferenced))
7590 fc->col_type[opa] = DW_CFA_undefined;
7591 fc->col_offset[opa] = 0;
7595 fc->col_type[opa] = cie->col_type[opa];
7596 fc->col_offset[opa] = cie->col_offset[opa];
7600 case DW_CFA_set_loc:
7601 vma = get_encoded_value (&start, fc->fde_encoding, section, block_end);
7602 if (do_debug_frames_interp)
7603 frame_display_row (fc, &need_col_headers, &max_regs);
7605 printf (" DW_CFA_set_loc: %s\n",
7606 dwarf_vmatoa_1 (NULL, vma, fc->ptr_size));
7610 case DW_CFA_advance_loc1:
7611 SAFE_BYTE_GET_AND_INC (ofs, start, 1, end);
7612 if (do_debug_frames_interp)
7613 frame_display_row (fc, &need_col_headers, &max_regs);
7615 printf (" DW_CFA_advance_loc1: %ld to %s\n",
7616 (unsigned long) (ofs * fc->code_factor),
7617 dwarf_vmatoa_1 (NULL,
7618 fc->pc_begin + ofs * fc->code_factor,
7620 fc->pc_begin += ofs * fc->code_factor;
7623 case DW_CFA_advance_loc2:
7624 SAFE_BYTE_GET_AND_INC (ofs, start, 2, block_end);
7625 if (do_debug_frames_interp)
7626 frame_display_row (fc, &need_col_headers, &max_regs);
7628 printf (" DW_CFA_advance_loc2: %ld to %s\n",
7629 (unsigned long) (ofs * fc->code_factor),
7630 dwarf_vmatoa_1 (NULL,
7631 fc->pc_begin + ofs * fc->code_factor,
7633 fc->pc_begin += ofs * fc->code_factor;
7636 case DW_CFA_advance_loc4:
7637 SAFE_BYTE_GET_AND_INC (ofs, start, 4, block_end);
7638 if (do_debug_frames_interp)
7639 frame_display_row (fc, &need_col_headers, &max_regs);
7641 printf (" DW_CFA_advance_loc4: %ld to %s\n",
7642 (unsigned long) (ofs * fc->code_factor),
7643 dwarf_vmatoa_1 (NULL,
7644 fc->pc_begin + ofs * fc->code_factor,
7646 fc->pc_begin += ofs * fc->code_factor;
7649 case DW_CFA_offset_extended:
7652 if (reg >= (unsigned int) fc->ncols)
7653 reg_prefix = bad_reg;
7654 if (! do_debug_frames_interp || *reg_prefix != '\0')
7655 printf (" DW_CFA_offset_extended: %s%s at cfa%+ld\n",
7656 reg_prefix, regname (reg, 0),
7657 roffs * fc->data_factor);
7658 if (*reg_prefix == '\0')
7660 fc->col_type[reg] = DW_CFA_offset;
7661 fc->col_offset[reg] = roffs * fc->data_factor;
7665 case DW_CFA_val_offset:
7668 if (reg >= (unsigned int) fc->ncols)
7669 reg_prefix = bad_reg;
7670 if (! do_debug_frames_interp || *reg_prefix != '\0')
7671 printf (" DW_CFA_val_offset: %s%s is cfa%+ld\n",
7672 reg_prefix, regname (reg, 0),
7673 roffs * fc->data_factor);
7674 if (*reg_prefix == '\0')
7676 fc->col_type[reg] = DW_CFA_val_offset;
7677 fc->col_offset[reg] = roffs * fc->data_factor;
7681 case DW_CFA_restore_extended:
7683 if (reg >= (unsigned int) fc->ncols)
7684 reg_prefix = bad_reg;
7685 if (! do_debug_frames_interp || *reg_prefix != '\0')
7686 printf (" DW_CFA_restore_extended: %s%s\n",
7687 reg_prefix, regname (reg, 0));
7688 if (*reg_prefix != '\0')
7691 if (reg >= (unsigned int) cie->ncols)
7693 fc->col_type[reg] = DW_CFA_undefined;
7694 fc->col_offset[reg] = 0;
7698 fc->col_type[reg] = cie->col_type[reg];
7699 fc->col_offset[reg] = cie->col_offset[reg];
7703 case DW_CFA_undefined:
7705 if (reg >= (unsigned int) fc->ncols)
7706 reg_prefix = bad_reg;
7707 if (! do_debug_frames_interp || *reg_prefix != '\0')
7708 printf (" DW_CFA_undefined: %s%s\n",
7709 reg_prefix, regname (reg, 0));
7710 if (*reg_prefix == '\0')
7712 fc->col_type[reg] = DW_CFA_undefined;
7713 fc->col_offset[reg] = 0;
7717 case DW_CFA_same_value:
7719 if (reg >= (unsigned int) fc->ncols)
7720 reg_prefix = bad_reg;
7721 if (! do_debug_frames_interp || *reg_prefix != '\0')
7722 printf (" DW_CFA_same_value: %s%s\n",
7723 reg_prefix, regname (reg, 0));
7724 if (*reg_prefix == '\0')
7726 fc->col_type[reg] = DW_CFA_same_value;
7727 fc->col_offset[reg] = 0;
7731 case DW_CFA_register:
7734 if (reg >= (unsigned int) fc->ncols)
7735 reg_prefix = bad_reg;
7736 if (! do_debug_frames_interp || *reg_prefix != '\0')
7738 printf (" DW_CFA_register: %s%s in ",
7739 reg_prefix, regname (reg, 0));
7740 puts (regname (roffs, 0));
7742 if (*reg_prefix == '\0')
7744 fc->col_type[reg] = DW_CFA_register;
7745 fc->col_offset[reg] = roffs;
7749 case DW_CFA_remember_state:
7750 if (! do_debug_frames_interp)
7751 printf (" DW_CFA_remember_state\n");
7752 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7753 rs->cfa_offset = fc->cfa_offset;
7754 rs->cfa_reg = fc->cfa_reg;
7756 rs->cfa_exp = fc->cfa_exp;
7757 rs->ncols = fc->ncols;
7758 rs->col_type = (short int *) xcmalloc (rs->ncols,
7759 sizeof (* rs->col_type));
7760 rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (* rs->col_offset));
7761 memcpy (rs->col_type, fc->col_type, rs->ncols * sizeof (* fc->col_type));
7762 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (* fc->col_offset));
7763 rs->next = remembered_state;
7764 remembered_state = rs;
7767 case DW_CFA_restore_state:
7768 if (! do_debug_frames_interp)
7769 printf (" DW_CFA_restore_state\n");
7770 rs = remembered_state;
7773 remembered_state = rs->next;
7774 fc->cfa_offset = rs->cfa_offset;
7775 fc->cfa_reg = rs->cfa_reg;
7777 fc->cfa_exp = rs->cfa_exp;
7778 if (frame_need_space (fc, rs->ncols - 1) < 0)
7780 warn (_("Invalid column number in saved frame state\n"));
7784 memcpy (fc->col_type, rs->col_type, rs->ncols * sizeof (* rs->col_type));
7785 memcpy (fc->col_offset, rs->col_offset,
7786 rs->ncols * sizeof (* rs->col_offset));
7787 free (rs->col_type);
7788 free (rs->col_offset);
7791 else if (do_debug_frames_interp)
7792 printf ("Mismatched DW_CFA_restore_state\n");
7795 case DW_CFA_def_cfa:
7796 READ_SLEB (fc->cfa_reg);
7797 READ_ULEB (fc->cfa_offset);
7799 if (! do_debug_frames_interp)
7800 printf (" DW_CFA_def_cfa: %s ofs %d\n",
7801 regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
7804 case DW_CFA_def_cfa_register:
7805 READ_SLEB (fc->cfa_reg);
7807 if (! do_debug_frames_interp)
7808 printf (" DW_CFA_def_cfa_register: %s\n",
7809 regname (fc->cfa_reg, 0));
7812 case DW_CFA_def_cfa_offset:
7813 READ_ULEB (fc->cfa_offset);
7814 if (! do_debug_frames_interp)
7815 printf (" DW_CFA_def_cfa_offset: %d\n", (int) fc->cfa_offset);
7819 if (! do_debug_frames_interp)
7820 printf (" DW_CFA_nop\n");
7823 case DW_CFA_def_cfa_expression:
7825 if (start >= block_end || ul > (unsigned long) (block_end - start))
7827 printf (_(" DW_CFA_def_cfa_expression: <corrupt len %lu>\n"), ul);
7830 if (! do_debug_frames_interp)
7832 printf (" DW_CFA_def_cfa_expression (");
7833 decode_location_expression (start, eh_addr_size, 0, -1,
7841 case DW_CFA_expression:
7844 if (reg >= (unsigned int) fc->ncols)
7845 reg_prefix = bad_reg;
7846 /* PR 17512: file: 069-133014-0.006. */
7847 /* PR 17512: file: 98c02eb4. */
7849 if (start >= block_end || tmp > block_end || tmp < start)
7851 printf (_(" DW_CFA_expression: <corrupt len %lu>\n"), ul);
7854 if (! do_debug_frames_interp || *reg_prefix != '\0')
7856 printf (" DW_CFA_expression: %s%s (",
7857 reg_prefix, regname (reg, 0));
7858 decode_location_expression (start, eh_addr_size, 0, -1,
7862 if (*reg_prefix == '\0')
7863 fc->col_type[reg] = DW_CFA_expression;
7867 case DW_CFA_val_expression:
7870 if (reg >= (unsigned int) fc->ncols)
7871 reg_prefix = bad_reg;
7873 if (start >= block_end || tmp > block_end || tmp < start)
7875 printf (" DW_CFA_val_expression: <corrupt len %lu>\n", ul);
7878 if (! do_debug_frames_interp || *reg_prefix != '\0')
7880 printf (" DW_CFA_val_expression: %s%s (",
7881 reg_prefix, regname (reg, 0));
7882 decode_location_expression (start, eh_addr_size, 0, -1,
7886 if (*reg_prefix == '\0')
7887 fc->col_type[reg] = DW_CFA_val_expression;
7891 case DW_CFA_offset_extended_sf:
7894 if (frame_need_space (fc, reg) < 0)
7895 reg_prefix = bad_reg;
7896 if (! do_debug_frames_interp || *reg_prefix != '\0')
7897 printf (" DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
7898 reg_prefix, regname (reg, 0),
7899 (long)(l * fc->data_factor));
7900 if (*reg_prefix == '\0')
7902 fc->col_type[reg] = DW_CFA_offset;
7903 fc->col_offset[reg] = l * fc->data_factor;
7907 case DW_CFA_val_offset_sf:
7910 if (frame_need_space (fc, reg) < 0)
7911 reg_prefix = bad_reg;
7912 if (! do_debug_frames_interp || *reg_prefix != '\0')
7913 printf (" DW_CFA_val_offset_sf: %s%s is cfa%+ld\n",
7914 reg_prefix, regname (reg, 0),
7915 (long)(l * fc->data_factor));
7916 if (*reg_prefix == '\0')
7918 fc->col_type[reg] = DW_CFA_val_offset;
7919 fc->col_offset[reg] = l * fc->data_factor;
7923 case DW_CFA_def_cfa_sf:
7924 READ_SLEB (fc->cfa_reg);
7925 READ_ULEB (fc->cfa_offset);
7926 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
7928 if (! do_debug_frames_interp)
7929 printf (" DW_CFA_def_cfa_sf: %s ofs %d\n",
7930 regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
7933 case DW_CFA_def_cfa_offset_sf:
7934 READ_ULEB (fc->cfa_offset);
7935 fc->cfa_offset *= fc->data_factor;
7936 if (! do_debug_frames_interp)
7937 printf (" DW_CFA_def_cfa_offset_sf: %d\n", (int) fc->cfa_offset);
7940 case DW_CFA_MIPS_advance_loc8:
7941 SAFE_BYTE_GET_AND_INC (ofs, start, 8, block_end);
7942 if (do_debug_frames_interp)
7943 frame_display_row (fc, &need_col_headers, &max_regs);
7945 printf (" DW_CFA_MIPS_advance_loc8: %ld to %s\n",
7946 (unsigned long) (ofs * fc->code_factor),
7947 dwarf_vmatoa_1 (NULL,
7948 fc->pc_begin + ofs * fc->code_factor,
7950 fc->pc_begin += ofs * fc->code_factor;
7953 case DW_CFA_GNU_window_save:
7954 if (! do_debug_frames_interp)
7955 printf (" DW_CFA_GNU_window_save\n");
7958 case DW_CFA_GNU_args_size:
7960 if (! do_debug_frames_interp)
7961 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
7964 case DW_CFA_GNU_negative_offset_extended:
7968 if (frame_need_space (fc, reg) < 0)
7969 reg_prefix = bad_reg;
7970 if (! do_debug_frames_interp || *reg_prefix != '\0')
7971 printf (" DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
7972 reg_prefix, regname (reg, 0),
7973 (long)(l * fc->data_factor));
7974 if (*reg_prefix == '\0')
7976 fc->col_type[reg] = DW_CFA_offset;
7977 fc->col_offset[reg] = l * fc->data_factor;
7982 if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
7983 printf (_(" DW_CFA_??? (User defined call frame op: %#x)\n"), op);
7985 warn (_("Unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
7990 /* Interpret the CFA - as long as it is not completely full of NOPs. */
7991 if (do_debug_frames_interp && ! all_nops)
7992 frame_display_row (fc, &need_col_headers, &max_regs);
7995 eh_addr_size = saved_eh_addr_size;
8006 display_debug_names (struct dwarf_section *section, void *file)
8008 unsigned char *hdrptr = section->start;
8009 dwarf_vma unit_length;
8010 unsigned char *unit_start;
8011 const unsigned char *const section_end = section->start + section->size;
8012 unsigned char *unit_end;
8014 printf (_("Contents of the %s section:\n"), section->name);
8016 load_debug_section (str, file);
8018 for (; hdrptr < section_end; hdrptr = unit_end)
8020 unsigned int offset_size;
8021 uint16_t dwarf_version, padding;
8022 uint32_t comp_unit_count, local_type_unit_count, foreign_type_unit_count;
8023 uint32_t bucket_count, name_count, abbrev_table_size;
8024 uint32_t augmentation_string_size;
8026 unsigned long sec_off;
8028 unit_start = hdrptr;
8030 /* Get and check the length of the block. */
8031 SAFE_BYTE_GET_AND_INC (unit_length, hdrptr, 4, section_end);
8033 if (unit_length == 0xffffffff)
8035 /* This section is 64-bit DWARF. */
8036 SAFE_BYTE_GET_AND_INC (unit_length, hdrptr, 8, section_end);
8041 unit_end = hdrptr + unit_length;
8043 sec_off = hdrptr - section->start;
8044 if (sec_off + unit_length < sec_off
8045 || sec_off + unit_length > section->size)
8047 warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
8049 (unsigned long) (unit_start - section->start),
8050 dwarf_vmatoa ("x", unit_length));
8054 /* Get and check the version number. */
8055 SAFE_BYTE_GET_AND_INC (dwarf_version, hdrptr, 2, unit_end);
8056 printf (_("Version %ld\n"), (long) dwarf_version);
8058 /* Prior versions did not exist, and future versions may not be
8059 backwards compatible. */
8060 if (dwarf_version != 5)
8062 warn (_("Only DWARF version 5 .debug_names "
8063 "is currently supported.\n"));
8067 SAFE_BYTE_GET_AND_INC (padding, hdrptr, 2, unit_end);
8069 warn (_("Padding field of .debug_names must be 0 (found 0x%x)\n"),
8072 SAFE_BYTE_GET_AND_INC (comp_unit_count, hdrptr, 4, unit_end);
8073 if (comp_unit_count == 0)
8074 warn (_("Compilation unit count must be >= 1 in .debug_names\n"));
8076 SAFE_BYTE_GET_AND_INC (local_type_unit_count, hdrptr, 4, unit_end);
8077 SAFE_BYTE_GET_AND_INC (foreign_type_unit_count, hdrptr, 4, unit_end);
8078 SAFE_BYTE_GET_AND_INC (bucket_count, hdrptr, 4, unit_end);
8079 SAFE_BYTE_GET_AND_INC (name_count, hdrptr, 4, unit_end);
8080 SAFE_BYTE_GET_AND_INC (abbrev_table_size, hdrptr, 4, unit_end);
8082 SAFE_BYTE_GET_AND_INC (augmentation_string_size, hdrptr, 4, unit_end);
8083 if (augmentation_string_size % 4 != 0)
8085 warn (_("Augmentation string length %u must be rounded up "
8086 "to a multiple of 4 in .debug_names.\n"),
8087 augmentation_string_size);
8088 augmentation_string_size += (-augmentation_string_size) & 3;
8090 printf (_("Augmentation string:"));
8091 for (i = 0; i < augmentation_string_size; i++)
8095 SAFE_BYTE_GET_AND_INC (uc, hdrptr, 1, unit_end);
8096 printf (" %02x", uc);
8101 printf (_("CU table:\n"));
8102 for (i = 0; i < comp_unit_count; i++)
8106 SAFE_BYTE_GET_AND_INC (cu_offset, hdrptr, offset_size, unit_end);
8107 printf (_("[%3u] 0x%lx\n"), i, (unsigned long) cu_offset);
8111 printf (_("TU table:\n"));
8112 for (i = 0; i < local_type_unit_count; i++)
8116 SAFE_BYTE_GET_AND_INC (tu_offset, hdrptr, offset_size, unit_end);
8117 printf (_("[%3u] 0x%lx\n"), i, (unsigned long) tu_offset);
8121 printf (_("Foreign TU table:\n"));
8122 for (i = 0; i < foreign_type_unit_count; i++)
8126 SAFE_BYTE_GET_AND_INC (signature, hdrptr, 8, unit_end);
8127 printf (_("[%3u] "), i);
8128 print_dwarf_vma (signature, 8);
8133 const uint32_t *const hash_table_buckets = (uint32_t *) hdrptr;
8134 hdrptr += bucket_count * sizeof (uint32_t);
8135 const uint32_t *const hash_table_hashes = (uint32_t *) hdrptr;
8136 hdrptr += name_count * sizeof (uint32_t);
8137 unsigned char *const name_table_string_offsets = hdrptr;
8138 hdrptr += name_count * offset_size;
8139 unsigned char *const name_table_entry_offsets = hdrptr;
8140 hdrptr += name_count * offset_size;
8141 unsigned char *const abbrev_table = hdrptr;
8142 hdrptr += abbrev_table_size;
8143 const unsigned char *const abbrev_table_end = hdrptr;
8144 unsigned char *const entry_pool = hdrptr;
8145 if (hdrptr > unit_end)
8147 warn (_("Entry pool offset (0x%lx) exceeds unit size 0x%lx "
8148 "for unit 0x%lx in the debug_names\n"),
8149 (long) (hdrptr - section->start),
8150 (long) (unit_end - section->start),
8151 (long) (unit_start - section->start));
8155 size_t buckets_filled = 0;
8157 for (bucketi = 0; bucketi < bucket_count; bucketi++)
8159 const uint32_t bucket = hash_table_buckets[bucketi];
8164 printf (_("Used %zu of %lu buckets.\n"), buckets_filled,
8165 (unsigned long) bucket_count);
8167 uint32_t hash_prev = 0;
8168 size_t hash_clash_count = 0;
8169 size_t longest_clash = 0;
8170 size_t this_length = 0;
8172 for (hashi = 0; hashi < name_count; hashi++)
8174 const uint32_t hash_this = hash_table_hashes[hashi];
8178 if (hash_prev % bucket_count == hash_this % bucket_count)
8182 longest_clash = MAX (longest_clash, this_length);
8187 hash_prev = hash_this;
8189 printf (_("Out of %lu items there are %zu bucket clashes"
8190 " (longest of %zu entries).\n"),
8191 (unsigned long) name_count, hash_clash_count, longest_clash);
8192 assert (name_count == buckets_filled + hash_clash_count);
8194 struct abbrev_lookup_entry
8196 dwarf_vma abbrev_tag;
8197 unsigned char *abbrev_lookup_ptr;
8199 struct abbrev_lookup_entry *abbrev_lookup = NULL;
8200 size_t abbrev_lookup_used = 0;
8201 size_t abbrev_lookup_allocated = 0;
8203 unsigned char *abbrevptr = abbrev_table;
8206 unsigned int bytes_read;
8207 const dwarf_vma abbrev_tag = read_uleb128 (abbrevptr, &bytes_read,
8209 abbrevptr += bytes_read;
8210 if (abbrev_tag == 0)
8212 if (abbrev_lookup_used == abbrev_lookup_allocated)
8214 abbrev_lookup_allocated = MAX (0x100,
8215 abbrev_lookup_allocated * 2);
8216 abbrev_lookup = xrealloc (abbrev_lookup,
8217 (abbrev_lookup_allocated
8218 * sizeof (*abbrev_lookup)));
8220 assert (abbrev_lookup_used < abbrev_lookup_allocated);
8221 struct abbrev_lookup_entry *entry;
8222 for (entry = abbrev_lookup;
8223 entry < abbrev_lookup + abbrev_lookup_used;
8225 if (entry->abbrev_tag == abbrev_tag)
8227 warn (_("Duplicate abbreviation tag %lu "
8228 "in unit 0x%lx in the debug_names\n"),
8229 (long) abbrev_tag, (long) (unit_start - section->start));
8232 entry = &abbrev_lookup[abbrev_lookup_used++];
8233 entry->abbrev_tag = abbrev_tag;
8234 entry->abbrev_lookup_ptr = abbrevptr;
8236 /* Skip DWARF tag. */
8237 read_uleb128 (abbrevptr, &bytes_read, abbrev_table_end);
8238 abbrevptr += bytes_read;
8241 const dwarf_vma xindex = read_uleb128 (abbrevptr,
8244 abbrevptr += bytes_read;
8245 const dwarf_vma form = read_uleb128 (abbrevptr, &bytes_read,
8247 abbrevptr += bytes_read;
8248 if (xindex == 0 && form == 0)
8253 printf (_("\nSymbol table:\n"));
8255 for (namei = 0; namei < name_count; ++namei)
8257 uint64_t string_offset, entry_offset;
8259 SAFE_BYTE_GET (string_offset,
8260 name_table_string_offsets + namei * offset_size,
8261 offset_size, unit_end);
8262 SAFE_BYTE_GET (entry_offset,
8263 name_table_entry_offsets + namei * offset_size,
8264 offset_size, unit_end);
8266 printf ("[%3u] #%08x %s:", namei, hash_table_hashes[namei],
8267 fetch_indirect_string (string_offset));
8269 unsigned char *entryptr = entry_pool + entry_offset;
8271 // We need to scan first whether there is a single or multiple
8272 // entries. TAGNO is -2 for the first entry, it is -1 for the
8273 // initial tag read of the second entry, then it becomes 0 for the
8274 // first entry for real printing etc.
8276 /* Initialize it due to a false compiler warning. */
8277 dwarf_vma second_abbrev_tag = -1;
8280 unsigned int bytes_read;
8281 const dwarf_vma abbrev_tag = read_uleb128 (entryptr, &bytes_read,
8283 entryptr += bytes_read;
8286 second_abbrev_tag = abbrev_tag;
8288 entryptr = entry_pool + entry_offset;
8291 if (abbrev_tag == 0)
8295 (tagno == 0 && second_abbrev_tag == 0 ? " " : "\n\t"),
8296 (unsigned long) abbrev_tag);
8298 const struct abbrev_lookup_entry *entry;
8299 for (entry = abbrev_lookup;
8300 entry < abbrev_lookup + abbrev_lookup_used;
8302 if (entry->abbrev_tag == abbrev_tag)
8304 if (entry >= abbrev_lookup + abbrev_lookup_used)
8306 warn (_("Undefined abbreviation tag %lu "
8307 "in unit 0x%lx in the debug_names\n"),
8309 (long) (unit_start - section->start));
8312 abbrevptr = entry->abbrev_lookup_ptr;
8313 const dwarf_vma dwarf_tag = read_uleb128 (abbrevptr, &bytes_read,
8315 abbrevptr += bytes_read;
8317 printf (" %s", get_TAG_name (dwarf_tag));
8320 const dwarf_vma xindex = read_uleb128 (abbrevptr,
8323 abbrevptr += bytes_read;
8324 const dwarf_vma form = read_uleb128 (abbrevptr, &bytes_read,
8326 abbrevptr += bytes_read;
8327 if (xindex == 0 && form == 0)
8331 printf (" %s", get_IDX_name (xindex));
8332 entryptr = read_and_display_attr_value (0, form, 0, entryptr,
8335 dwarf_version, NULL,
8342 printf (_(" <no entries>"));
8346 free (abbrev_lookup);
8353 display_gdb_index (struct dwarf_section *section,
8354 void *file ATTRIBUTE_UNUSED)
8356 unsigned char *start = section->start;
8358 uint32_t cu_list_offset, tu_list_offset;
8359 uint32_t address_table_offset, symbol_table_offset, constant_pool_offset;
8360 unsigned int cu_list_elements, tu_list_elements;
8361 unsigned int address_table_size, symbol_table_slots;
8362 unsigned char *cu_list, *tu_list;
8363 unsigned char *address_table, *symbol_table, *constant_pool;
8366 /* The documentation for the format of this file is in gdb/dwarf2read.c. */
8368 printf (_("Contents of the %s section:\n"), section->name);
8370 if (section->size < 6 * sizeof (uint32_t))
8372 warn (_("Truncated header in the %s section.\n"), section->name);
8376 version = byte_get_little_endian (start, 4);
8377 printf (_("Version %ld\n"), (long) version);
8379 /* Prior versions are obsolete, and future versions may not be
8380 backwards compatible. */
8381 if (version < 3 || version > 8)
8383 warn (_("Unsupported version %lu.\n"), (unsigned long) version);
8387 warn (_("The address table data in version 3 may be wrong.\n"));
8389 warn (_("Version 4 does not support case insensitive lookups.\n"));
8391 warn (_("Version 5 does not include inlined functions.\n"));
8393 warn (_("Version 6 does not include symbol attributes.\n"));
8394 /* Version 7 indices generated by Gold have bad type unit references,
8395 PR binutils/15021. But we don't know if the index was generated by
8396 Gold or not, so to avoid worrying users with gdb-generated indices
8397 we say nothing for version 7 here. */
8399 cu_list_offset = byte_get_little_endian (start + 4, 4);
8400 tu_list_offset = byte_get_little_endian (start + 8, 4);
8401 address_table_offset = byte_get_little_endian (start + 12, 4);
8402 symbol_table_offset = byte_get_little_endian (start + 16, 4);
8403 constant_pool_offset = byte_get_little_endian (start + 20, 4);
8405 if (cu_list_offset > section->size
8406 || tu_list_offset > section->size
8407 || address_table_offset > section->size
8408 || symbol_table_offset > section->size
8409 || constant_pool_offset > section->size)
8411 warn (_("Corrupt header in the %s section.\n"), section->name);
8415 /* PR 17531: file: 418d0a8a. */
8416 if (tu_list_offset < cu_list_offset)
8418 warn (_("TU offset (%x) is less than CU offset (%x)\n"),
8419 tu_list_offset, cu_list_offset);
8423 cu_list_elements = (tu_list_offset - cu_list_offset) / 8;
8425 if (address_table_offset < tu_list_offset)
8427 warn (_("Address table offset (%x) is less than TU offset (%x)\n"),
8428 address_table_offset, tu_list_offset);
8432 tu_list_elements = (address_table_offset - tu_list_offset) / 8;
8434 /* PR 17531: file: 18a47d3d. */
8435 if (symbol_table_offset < address_table_offset)
8437 warn (_("Symbol table offset (%x) is less then Address table offset (%x)\n"),
8438 symbol_table_offset, address_table_offset);
8442 address_table_size = symbol_table_offset - address_table_offset;
8444 if (constant_pool_offset < symbol_table_offset)
8446 warn (_("Constant pool offset (%x) is less than symbol table offset (%x)\n"),
8447 constant_pool_offset, symbol_table_offset);
8451 symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8;
8453 cu_list = start + cu_list_offset;
8454 tu_list = start + tu_list_offset;
8455 address_table = start + address_table_offset;
8456 symbol_table = start + symbol_table_offset;
8457 constant_pool = start + constant_pool_offset;
8459 if (address_table + address_table_size > section->start + section->size)
8461 warn (_("Address table extends beyond end of section.\n"));
8465 printf (_("\nCU table:\n"));
8466 for (i = 0; i < cu_list_elements; i += 2)
8468 uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8);
8469 uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8);
8471 printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2,
8472 (unsigned long) cu_offset,
8473 (unsigned long) (cu_offset + cu_length - 1));
8476 printf (_("\nTU table:\n"));
8477 for (i = 0; i < tu_list_elements; i += 3)
8479 uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8);
8480 uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8);
8481 uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8);
8483 printf (_("[%3u] 0x%lx 0x%lx "), i / 3,
8484 (unsigned long) tu_offset,
8485 (unsigned long) type_offset);
8486 print_dwarf_vma (signature, 8);
8490 printf (_("\nAddress table:\n"));
8491 for (i = 0; i < address_table_size && i <= address_table_size - (2 * 8 + 4);
8494 uint64_t low = byte_get_little_endian (address_table + i, 8);
8495 uint64_t high = byte_get_little_endian (address_table + i + 8, 8);
8496 uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4);
8498 print_dwarf_vma (low, 8);
8499 print_dwarf_vma (high, 8);
8500 printf (_("%lu\n"), (unsigned long) cu_index);
8503 printf (_("\nSymbol table:\n"));
8504 for (i = 0; i < symbol_table_slots; ++i)
8506 uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4);
8507 uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4);
8508 uint32_t num_cus, cu;
8510 if (name_offset != 0
8511 || cu_vector_offset != 0)
8514 unsigned char * adr;
8516 adr = constant_pool + name_offset;
8517 /* PR 17531: file: 5b7b07ad. */
8518 if (adr < constant_pool || adr >= section->start + section->size)
8520 printf (_("[%3u] <corrupt offset: %x>"), i, name_offset);
8521 warn (_("Corrupt name offset of 0x%x found for symbol table slot %d\n"),
8525 printf ("[%3u] %.*s:", i,
8526 (int) (section->size - (constant_pool_offset + name_offset)),
8527 constant_pool + name_offset);
8529 adr = constant_pool + cu_vector_offset;
8530 if (adr < constant_pool || adr >= section->start + section->size - 3)
8532 printf (_("<invalid CU vector offset: %x>\n"), cu_vector_offset);
8533 warn (_("Corrupt CU vector offset of 0x%x found for symbol table slot %d\n"),
8534 cu_vector_offset, i);
8538 num_cus = byte_get_little_endian (adr, 4);
8540 adr = constant_pool + cu_vector_offset + 4 + num_cus * 4;
8541 if (num_cus * 4 < num_cus
8542 || adr >= section->start + section->size
8543 || adr < constant_pool)
8545 printf ("<invalid number of CUs: %d>\n", num_cus);
8546 warn (_("Invalid number of CUs (0x%x) for symbol table slot %d\n"),
8554 for (j = 0; j < num_cus; ++j)
8557 gdb_index_symbol_kind kind;
8559 cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4);
8560 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu);
8561 kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu);
8562 cu = GDB_INDEX_CU_VALUE (cu);
8563 /* Convert to TU number if it's for a type unit. */
8564 if (cu >= cu_list_elements / 2)
8565 printf ("%cT%lu", num_cus > 1 ? '\t' : ' ',
8566 (unsigned long) (cu - cu_list_elements / 2));
8568 printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu);
8570 printf (" [%s, %s]",
8571 is_static ? _("static") : _("global"),
8572 get_gdb_index_symbol_kind_name (kind));
8584 /* Pre-allocate enough space for the CU/TU sets needed. */
8587 prealloc_cu_tu_list (unsigned int nshndx)
8589 if (shndx_pool == NULL)
8591 shndx_pool_size = nshndx;
8592 shndx_pool_used = 0;
8593 shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size,
8594 sizeof (unsigned int));
8598 shndx_pool_size = shndx_pool_used + nshndx;
8599 shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size,
8600 sizeof (unsigned int));
8605 add_shndx_to_cu_tu_entry (unsigned int shndx)
8607 if (shndx_pool_used >= shndx_pool_size)
8609 error (_("Internal error: out of space in the shndx pool.\n"));
8612 shndx_pool [shndx_pool_used++] = shndx;
8616 end_cu_tu_entry (void)
8618 if (shndx_pool_used >= shndx_pool_size)
8620 error (_("Internal error: out of space in the shndx pool.\n"));
8623 shndx_pool [shndx_pool_used++] = 0;
8626 /* Return the short name of a DWARF section given by a DW_SECT enumerator. */
8629 get_DW_SECT_short_name (unsigned int dw_sect)
8631 static char buf[16];
8639 case DW_SECT_ABBREV:
8645 case DW_SECT_STR_OFFSETS:
8647 case DW_SECT_MACINFO:
8655 snprintf (buf, sizeof (buf), "%d", dw_sect);
8659 /* Process a CU or TU index. If DO_DISPLAY is true, print the contents.
8660 These sections are extensions for Fission.
8661 See http://gcc.gnu.org/wiki/DebugFissionDWP. */
8664 process_cu_tu_index (struct dwarf_section *section, int do_display)
8666 unsigned char *phdr = section->start;
8667 unsigned char *limit = phdr + section->size;
8668 unsigned char *phash;
8669 unsigned char *pindex;
8670 unsigned char *ppool;
8671 unsigned int version;
8672 unsigned int ncols = 0;
8674 unsigned int nslots;
8677 dwarf_vma signature_high;
8678 dwarf_vma signature_low;
8681 /* PR 17512: file: 002-168123-0.004. */
8684 warn (_("Section %s is empty\n"), section->name);
8687 /* PR 17512: file: 002-376-0.004. */
8688 if (section->size < 24)
8690 warn (_("Section %s is too small to contain a CU/TU header\n"),
8695 SAFE_BYTE_GET (version, phdr, 4, limit);
8697 SAFE_BYTE_GET (ncols, phdr + 4, 4, limit);
8698 SAFE_BYTE_GET (nused, phdr + 8, 4, limit);
8699 SAFE_BYTE_GET (nslots, phdr + 12, 4, limit);
8702 pindex = phash + nslots * 8;
8703 ppool = pindex + nslots * 4;
8705 /* PR 17531: file: 45d69832. */
8706 if (pindex < phash || ppool < phdr || (pindex == phash && nslots != 0))
8708 warn (_("Section %s is too small for %d slots\n"),
8709 section->name, nslots);
8715 printf (_("Contents of the %s section:\n\n"), section->name);
8716 printf (_(" Version: %d\n"), version);
8718 printf (_(" Number of columns: %d\n"), ncols);
8719 printf (_(" Number of used entries: %d\n"), nused);
8720 printf (_(" Number of slots: %d\n\n"), nslots);
8723 if (ppool > limit || ppool < phdr)
8725 warn (_("Section %s too small for %d hash table entries\n"),
8726 section->name, nslots);
8733 prealloc_cu_tu_list ((limit - ppool) / 4);
8734 for (i = 0; i < nslots; i++)
8736 unsigned char *shndx_list;
8739 SAFE_BYTE_GET64 (phash, &signature_high, &signature_low, limit);
8740 if (signature_high != 0 || signature_low != 0)
8742 SAFE_BYTE_GET (j, pindex, 4, limit);
8743 shndx_list = ppool + j * 4;
8744 /* PR 17531: file: 705e010d. */
8745 if (shndx_list < ppool)
8747 warn (_("Section index pool located before start of section\n"));
8752 printf (_(" [%3d] Signature: 0x%s Sections: "),
8753 i, dwarf_vmatoa64 (signature_high, signature_low,
8754 buf, sizeof (buf)));
8757 if (shndx_list >= limit)
8759 warn (_("Section %s too small for shndx pool\n"),
8763 SAFE_BYTE_GET (shndx, shndx_list, 4, limit);
8767 printf (" %d", shndx);
8769 add_shndx_to_cu_tu_entry (shndx);
8781 else if (version == 2)
8784 unsigned int dw_sect;
8785 unsigned char *ph = phash;
8786 unsigned char *pi = pindex;
8787 unsigned char *poffsets = ppool + ncols * 4;
8788 unsigned char *psizes = poffsets + nused * ncols * 4;
8789 unsigned char *pend = psizes + nused * ncols * 4;
8790 bfd_boolean is_tu_index;
8791 struct cu_tu_set *this_set = NULL;
8793 unsigned char *prow;
8795 is_tu_index = strcmp (section->name, ".debug_tu_index") == 0;
8797 /* PR 17531: file: 0dd159bf.
8798 Check for wraparound with an overlarge ncols value. */
8799 if (poffsets < ppool || (unsigned int) ((poffsets - ppool) / 4) != ncols)
8801 warn (_("Overlarge number of columns: %x\n"), ncols);
8807 warn (_("Section %s too small for offset and size tables\n"),
8814 printf (_(" Offset table\n"));
8815 printf (" slot %-16s ",
8816 is_tu_index ? _("signature") : _("dwo_id"));
8823 tu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
8829 cu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
8836 for (j = 0; j < ncols; j++)
8838 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
8839 printf (" %8s", get_DW_SECT_short_name (dw_sect));
8844 for (i = 0; i < nslots; i++)
8846 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
8848 SAFE_BYTE_GET (row, pi, 4, limit);
8851 /* PR 17531: file: a05f6ab3. */
8854 warn (_("Row index (%u) is larger than number of used entries (%u)\n"),
8860 memcpy (&this_set[row - 1].signature, ph, sizeof (uint64_t));
8862 prow = poffsets + (row - 1) * ncols * 4;
8863 /* PR 17531: file: b8ce60a8. */
8864 if (prow < poffsets || prow > limit)
8866 warn (_("Row index (%u) * num columns (%u) > space remaining in section\n"),
8872 printf (_(" [%3d] 0x%s"),
8873 i, dwarf_vmatoa64 (signature_high, signature_low,
8874 buf, sizeof (buf)));
8875 for (j = 0; j < ncols; j++)
8877 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
8879 printf (" %8d", val);
8882 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
8884 /* PR 17531: file: 10796eb3. */
8885 if (dw_sect >= DW_SECT_MAX)
8886 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
8888 this_set [row - 1].section_offsets [dw_sect] = val;
8904 printf (_(" Size table\n"));
8905 printf (" slot %-16s ",
8906 is_tu_index ? _("signature") : _("dwo_id"));
8909 for (j = 0; j < ncols; j++)
8911 SAFE_BYTE_GET (val, ppool + j * 4, 4, limit);
8913 printf (" %8s", get_DW_SECT_short_name (val));
8919 for (i = 0; i < nslots; i++)
8921 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
8923 SAFE_BYTE_GET (row, pi, 4, limit);
8926 prow = psizes + (row - 1) * ncols * 4;
8929 printf (_(" [%3d] 0x%s"),
8930 i, dwarf_vmatoa64 (signature_high, signature_low,
8931 buf, sizeof (buf)));
8933 for (j = 0; j < ncols; j++)
8935 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
8937 printf (" %8d", val);
8940 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
8941 if (dw_sect >= DW_SECT_MAX)
8942 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
8944 this_set [row - 1].section_sizes [dw_sect] = val;
8956 else if (do_display)
8957 printf (_(" Unsupported version (%d)\n"), version);
8965 /* Load the CU and TU indexes if present. This will build a list of
8966 section sets that we can use to associate a .debug_info.dwo section
8967 with its associated .debug_abbrev.dwo section in a .dwp file. */
8970 load_cu_tu_indexes (void *file)
8972 static int cu_tu_indexes_read = -1; /* Tri-state variable. */
8974 /* If we have already loaded (or tried to load) the CU and TU indexes
8975 then do not bother to repeat the task. */
8976 if (cu_tu_indexes_read == -1)
8978 cu_tu_indexes_read = TRUE;
8980 if (load_debug_section (dwp_cu_index, file))
8981 if (! process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0))
8982 cu_tu_indexes_read = FALSE;
8984 if (load_debug_section (dwp_tu_index, file))
8985 if (! process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0))
8986 cu_tu_indexes_read = FALSE;
8989 return (bfd_boolean) cu_tu_indexes_read;
8992 /* Find the set of sections that includes section SHNDX. */
8995 find_cu_tu_set (void *file, unsigned int shndx)
8999 if (! load_cu_tu_indexes (file))
9002 /* Find SHNDX in the shndx pool. */
9003 for (i = 0; i < shndx_pool_used; i++)
9004 if (shndx_pool [i] == shndx)
9007 if (i >= shndx_pool_used)
9010 /* Now backup to find the first entry in the set. */
9011 while (i > 0 && shndx_pool [i - 1] != 0)
9014 return shndx_pool + i;
9017 /* Display a .debug_cu_index or .debug_tu_index section. */
9020 display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
9022 return process_cu_tu_index (section, 1);
9026 display_debug_not_supported (struct dwarf_section *section,
9027 void *file ATTRIBUTE_UNUSED)
9029 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9035 /* Like malloc, but takes two parameters like calloc.
9036 Verifies that the first parameter is not too large.
9037 Note: does *not* initialise the allocated memory to zero. */
9039 cmalloc (size_t nmemb, size_t size)
9041 /* Check for overflow. */
9042 if (nmemb >= ~(size_t) 0 / size)
9045 return xmalloc (nmemb * size);
9048 /* Like xmalloc, but takes two parameters like calloc.
9049 Verifies that the first parameter is not too large.
9050 Note: does *not* initialise the allocated memory to zero. */
9052 xcmalloc (size_t nmemb, size_t size)
9054 /* Check for overflow. */
9055 if (nmemb >= ~(size_t) 0 / size)
9058 _("Attempt to allocate an array with an excessive number of elements: 0x%lx\n"),
9063 return xmalloc (nmemb * size);
9066 /* Like xrealloc, but takes three parameters.
9067 Verifies that the second parameter is not too large.
9068 Note: does *not* initialise any new memory to zero. */
9070 xcrealloc (void *ptr, size_t nmemb, size_t size)
9072 /* Check for overflow. */
9073 if (nmemb >= ~(size_t) 0 / size)
9076 _("Attempt to re-allocate an array with an excessive number of elements: 0x%lx\n"),
9081 return xrealloc (ptr, nmemb * size);
9084 /* Like xcalloc, but verifies that the first parameter is not too large. */
9086 xcalloc2 (size_t nmemb, size_t size)
9088 /* Check for overflow. */
9089 if (nmemb >= ~(size_t) 0 / size)
9092 _("Attempt to allocate a zero'ed array with an excessive number of elements: 0x%lx\n"),
9097 return xcalloc (nmemb, size);
9101 free_debug_memory (void)
9107 for (i = 0; i < max; i++)
9108 free_debug_section ((enum dwarf_section_display_enum) i);
9110 if (debug_information != NULL)
9112 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
9114 for (i = 0; i < num_debug_info_entries; i++)
9116 if (!debug_information [i].max_loc_offsets)
9118 free (debug_information [i].loc_offsets);
9119 free (debug_information [i].have_frame_base);
9121 if (!debug_information [i].max_range_lists)
9122 free (debug_information [i].range_lists);
9125 free (debug_information);
9126 debug_information = NULL;
9127 alloc_num_debug_info_entries = num_debug_info_entries = 0;
9132 dwarf_select_sections_by_names (const char *names)
9136 const char * option;
9140 debug_dump_long_opts;
9142 static const debug_dump_long_opts opts_table [] =
9144 /* Please keep this table alpha- sorted. */
9145 { "Ranges", & do_debug_ranges, 1 },
9146 { "abbrev", & do_debug_abbrevs, 1 },
9147 { "addr", & do_debug_addr, 1 },
9148 { "aranges", & do_debug_aranges, 1 },
9149 { "cu_index", & do_debug_cu_index, 1 },
9150 { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
9151 { "frames", & do_debug_frames, 1 },
9152 { "frames-interp", & do_debug_frames_interp, 1 },
9153 /* The special .gdb_index section. */
9154 { "gdb_index", & do_gdb_index, 1 },
9155 { "info", & do_debug_info, 1 },
9156 { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility. */
9157 { "loc", & do_debug_loc, 1 },
9158 { "macro", & do_debug_macinfo, 1 },
9159 { "pubnames", & do_debug_pubnames, 1 },
9160 { "pubtypes", & do_debug_pubtypes, 1 },
9161 /* This entry is for compatibility
9162 with earlier versions of readelf. */
9163 { "ranges", & do_debug_aranges, 1 },
9164 { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
9165 { "str", & do_debug_str, 1 },
9166 /* These trace_* sections are used by Itanium VMS. */
9167 { "trace_abbrev", & do_trace_abbrevs, 1 },
9168 { "trace_aranges", & do_trace_aranges, 1 },
9169 { "trace_info", & do_trace_info, 1 },
9178 const debug_dump_long_opts * entry;
9180 for (entry = opts_table; entry->option; entry++)
9182 size_t len = strlen (entry->option);
9184 if (strncmp (p, entry->option, len) == 0
9185 && (p[len] == ',' || p[len] == '\0'))
9187 * entry->variable |= entry->val;
9189 /* The --debug-dump=frames-interp option also
9190 enables the --debug-dump=frames option. */
9191 if (do_debug_frames_interp)
9192 do_debug_frames = 1;
9199 if (entry->option == NULL)
9201 warn (_("Unrecognized debug option '%s'\n"), p);
9202 p = strchr (p, ',');
9213 dwarf_select_sections_by_letters (const char *letters)
9215 unsigned int lindex = 0;
9217 while (letters[lindex])
9218 switch (letters[lindex++])
9225 do_debug_abbrevs = 1;
9229 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
9233 do_debug_lines |= FLAG_DEBUG_LINES_DECODED;
9237 do_debug_pubnames = 1;
9241 do_debug_pubtypes = 1;
9245 do_debug_aranges = 1;
9249 do_debug_ranges = 1;
9253 do_debug_frames_interp = 1;
9256 do_debug_frames = 1;
9260 do_debug_macinfo = 1;
9272 warn (_("Unrecognized debug option '%s'\n"), letters);
9278 dwarf_select_sections_all (void)
9281 do_debug_abbrevs = 1;
9282 do_debug_lines = FLAG_DEBUG_LINES_RAW;
9283 do_debug_pubnames = 1;
9284 do_debug_pubtypes = 1;
9285 do_debug_aranges = 1;
9286 do_debug_ranges = 1;
9287 do_debug_frames = 1;
9288 do_debug_macinfo = 1;
9293 do_trace_abbrevs = 1;
9294 do_trace_aranges = 1;
9296 do_debug_cu_index = 1;
9299 struct dwarf_section_display debug_displays[] =
9301 { { ".debug_abbrev", ".zdebug_abbrev", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9302 display_debug_abbrev, &do_debug_abbrevs, FALSE },
9303 { { ".debug_aranges", ".zdebug_aranges", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9304 display_debug_aranges, &do_debug_aranges, TRUE },
9305 { { ".debug_frame", ".zdebug_frame", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9306 display_debug_frames, &do_debug_frames, TRUE },
9307 { { ".debug_info", ".zdebug_info", NULL, NULL, 0, 0, abbrev, NULL, 0, NULL },
9308 display_debug_info, &do_debug_info, TRUE },
9309 { { ".debug_line", ".zdebug_line", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9310 display_debug_lines, &do_debug_lines, TRUE },
9311 { { ".debug_pubnames", ".zdebug_pubnames", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9312 display_debug_pubnames, &do_debug_pubnames, FALSE },
9313 { { ".debug_gnu_pubnames", ".zdebug_gnu_pubnames", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9314 display_debug_gnu_pubnames, &do_debug_pubnames, FALSE },
9315 { { ".eh_frame", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9316 display_debug_frames, &do_debug_frames, TRUE },
9317 { { ".debug_macinfo", ".zdebug_macinfo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9318 display_debug_macinfo, &do_debug_macinfo, FALSE },
9319 { { ".debug_macro", ".zdebug_macro", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9320 display_debug_macro, &do_debug_macinfo, TRUE },
9321 { { ".debug_str", ".zdebug_str", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9322 display_debug_str, &do_debug_str, FALSE },
9323 { { ".debug_line_str", ".zdebug_line_str", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9324 display_debug_str, &do_debug_str, FALSE },
9325 { { ".debug_loc", ".zdebug_loc", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9326 display_debug_loc, &do_debug_loc, TRUE },
9327 { { ".debug_loclists", ".zdebug_loclists", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9328 display_debug_loc, &do_debug_loc, TRUE },
9329 { { ".debug_pubtypes", ".zdebug_pubtypes", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9330 display_debug_pubnames, &do_debug_pubtypes, FALSE },
9331 { { ".debug_gnu_pubtypes", ".zdebug_gnu_pubtypes", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9332 display_debug_gnu_pubnames, &do_debug_pubtypes, FALSE },
9333 { { ".debug_ranges", ".zdebug_ranges", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9334 display_debug_ranges, &do_debug_ranges, TRUE },
9335 { { ".debug_rnglists", ".zdebug_rnglists", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9336 display_debug_ranges, &do_debug_ranges, TRUE },
9337 { { ".debug_static_func", ".zdebug_static_func", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9338 display_debug_not_supported, NULL, FALSE },
9339 { { ".debug_static_vars", ".zdebug_static_vars", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9340 display_debug_not_supported, NULL, FALSE },
9341 { { ".debug_types", ".zdebug_types", NULL, NULL, 0, 0, abbrev, NULL, 0, NULL },
9342 display_debug_types, &do_debug_info, TRUE },
9343 { { ".debug_weaknames", ".zdebug_weaknames", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9344 display_debug_not_supported, NULL, FALSE },
9345 { { ".gdb_index", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9346 display_gdb_index, &do_gdb_index, FALSE },
9347 { { ".debug_names", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9348 display_debug_names, &do_gdb_index, FALSE },
9349 { { ".trace_info", "", NULL, NULL, 0, 0, trace_abbrev, NULL, 0, NULL },
9350 display_trace_info, &do_trace_info, TRUE },
9351 { { ".trace_abbrev", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9352 display_debug_abbrev, &do_trace_abbrevs, FALSE },
9353 { { ".trace_aranges", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9354 display_debug_aranges, &do_trace_aranges, FALSE },
9355 { { ".debug_info.dwo", ".zdebug_info.dwo", NULL, NULL, 0, 0, abbrev_dwo, NULL, 0, NULL },
9356 display_debug_info, &do_debug_info, TRUE },
9357 { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9358 display_debug_abbrev, &do_debug_abbrevs, FALSE },
9359 { { ".debug_types.dwo", ".zdebug_types.dwo", NULL, NULL, 0, 0, abbrev_dwo, NULL, 0, NULL },
9360 display_debug_types, &do_debug_info, TRUE },
9361 { { ".debug_line.dwo", ".zdebug_line.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9362 display_debug_lines, &do_debug_lines, TRUE },
9363 { { ".debug_loc.dwo", ".zdebug_loc.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9364 display_debug_loc, &do_debug_loc, TRUE },
9365 { { ".debug_macro.dwo", ".zdebug_macro.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9366 display_debug_macro, &do_debug_macinfo, TRUE },
9367 { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9368 display_debug_macinfo, &do_debug_macinfo, FALSE },
9369 { { ".debug_str.dwo", ".zdebug_str.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9370 display_debug_str, &do_debug_str, TRUE },
9371 { { ".debug_str_offsets", ".zdebug_str_offsets", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9372 display_debug_str_offsets, NULL, FALSE },
9373 { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9374 display_debug_str_offsets, NULL, FALSE },
9375 { { ".debug_addr", ".zdebug_addr", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9376 display_debug_addr, &do_debug_addr, TRUE },
9377 { { ".debug_cu_index", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9378 display_cu_index, &do_debug_cu_index, FALSE },
9379 { { ".debug_tu_index", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
9380 display_cu_index, &do_debug_cu_index, FALSE },
9383 /* A static assertion. */
9384 extern int debug_displays_assert[ARRAY_SIZE (debug_displays) == max ? 1 : -1];