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"
32 static const char *regname (unsigned int regno, int row);
34 static int have_frame_base;
35 static int need_base_address;
37 static unsigned int last_pointer_size = 0;
38 static int warned_about_missing_comp_units = FALSE;
40 static unsigned int num_debug_info_entries = 0;
41 static unsigned int alloc_num_debug_info_entries = 0;
42 static debug_info *debug_information = NULL;
43 /* Special value for num_debug_info_entries to indicate
44 that the .debug_info section could not be loaded/parsed. */
45 #define DEBUG_INFO_UNAVAILABLE (unsigned int) -1
47 unsigned int eh_addr_size;
52 int do_debug_pubnames;
53 int do_debug_pubtypes;
57 int do_debug_frames_interp;
66 int do_debug_cu_index;
69 int dwarf_cutoff_level = -1;
70 unsigned long dwarf_start_die;
74 /* Collection of CU/TU section sets from .debug_cu_index and .debug_tu_index
75 sections. For version 1 package files, each set is stored in SHNDX_POOL
76 as a zero-terminated list of section indexes comprising one set of debug
77 sections from a .dwo file. */
79 static int cu_tu_indexes_read = 0;
80 static unsigned int *shndx_pool = NULL;
81 static unsigned int shndx_pool_size = 0;
82 static unsigned int shndx_pool_used = 0;
84 /* For version 2 package files, each set contains an array of section offsets
85 and an array of section sizes, giving the offset and size of the
86 contribution from a CU or TU within one of the debug sections.
87 When displaying debug info from a package file, we need to use these
88 tables to locate the corresponding contributions to each section. */
93 dwarf_vma section_offsets[DW_SECT_MAX];
94 size_t section_sizes[DW_SECT_MAX];
97 static int cu_count = 0;
98 static int tu_count = 0;
99 static struct cu_tu_set *cu_sets = NULL;
100 static struct cu_tu_set *tu_sets = NULL;
102 static void load_cu_tu_indexes (void *file);
104 /* Values for do_debug_lines. */
105 #define FLAG_DEBUG_LINES_RAW 1
106 #define FLAG_DEBUG_LINES_DECODED 2
109 size_of_encoded_value (int encoding)
111 switch (encoding & 0x7)
114 case 0: return eh_addr_size;
122 get_encoded_value (unsigned char **pdata,
124 struct dwarf_section *section,
127 unsigned char * data = * pdata;
128 unsigned int size = size_of_encoded_value (encoding);
131 if (data + size >= end)
133 warn (_("Encoded value extends past end of section\n"));
138 /* PR 17512: file: 002-829853-0.004. */
141 warn (_("Encoded size of %d is too large to read\n"), size);
146 /* PR 17512: file: 1085-5603-0.004. */
149 warn (_("Encoded size of 0 is too small to read\n"));
154 if (encoding & DW_EH_PE_signed)
155 val = byte_get_signed (data, size);
157 val = byte_get (data, size);
159 if ((encoding & 0x70) == DW_EH_PE_pcrel)
160 val += section->address + (data - section->start);
162 * pdata = data + size;
166 #if defined HAVE_LONG_LONG && SIZEOF_LONG_LONG > SIZEOF_LONG
168 # define DWARF_VMA_FMT "ll"
169 # define DWARF_VMA_FMT_LONG "%16.16llx"
171 # define DWARF_VMA_FMT "I64"
172 # define DWARF_VMA_FMT_LONG "%016I64x"
175 # define DWARF_VMA_FMT "l"
176 # define DWARF_VMA_FMT_LONG "%16.16lx"
179 /* Convert a dwarf vma value into a string. Returns a pointer to a static
180 buffer containing the converted VALUE. The value is converted according
181 to the printf formating character FMTCH. If NUM_BYTES is non-zero then
182 it specifies the maximum number of bytes to be displayed in the converted
183 value and FMTCH is ignored - hex is always used. */
186 dwarf_vmatoa_1 (const char *fmtch, dwarf_vma value, unsigned num_bytes)
188 /* As dwarf_vmatoa is used more then once in a printf call
189 for output, we are cycling through an fixed array of pointers
190 for return address. */
191 static int buf_pos = 0;
192 static struct dwarf_vmatoa_buf
198 ret = buf[buf_pos++].place;
199 buf_pos %= ARRAY_SIZE (buf);
203 /* Printf does not have a way of specifying a maximum field width for an
204 integer value, so we print the full value into a buffer and then select
205 the precision we need. */
206 snprintf (ret, sizeof (buf[0].place), DWARF_VMA_FMT_LONG, value);
209 return ret + (16 - 2 * num_bytes);
215 sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch);
216 snprintf (ret, sizeof (buf[0].place), fmt, value);
221 static inline const char *
222 dwarf_vmatoa (const char * fmtch, dwarf_vma value)
224 return dwarf_vmatoa_1 (fmtch, value, 0);
227 /* Print a dwarf_vma value (typically an address, offset or length) in
228 hexadecimal format, followed by a space. The length of the VALUE (and
229 hence the precision displayed) is determined by the NUM_BYTES parameter. */
232 print_dwarf_vma (dwarf_vma value, unsigned num_bytes)
234 printf ("%s ", dwarf_vmatoa_1 (NULL, value, num_bytes));
237 /* Format a 64-bit value, given as two 32-bit values, in hex.
238 For reentrancy, this uses a buffer provided by the caller. */
241 dwarf_vmatoa64 (dwarf_vma hvalue, dwarf_vma lvalue, char *buf,
242 unsigned int buf_len)
247 snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", lvalue);
250 len = snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", hvalue);
251 snprintf (buf + len, buf_len - len,
252 "%08" DWARF_VMA_FMT "x", lvalue);
258 /* Read in a LEB128 encoded value starting at address DATA.
259 If SIGN is true, return a signed LEB128 value.
260 If LENGTH_RETURN is not NULL, return in it the number of bytes read.
261 No bytes will be read at address END or beyond. */
264 read_leb128 (unsigned char *data,
265 unsigned int *length_return,
267 const unsigned char * const end)
269 dwarf_vma result = 0;
270 unsigned int num_read = 0;
271 unsigned int shift = 0;
272 unsigned char byte = 0;
279 result |= ((dwarf_vma) (byte & 0x7f)) << shift;
282 if ((byte & 0x80) == 0)
285 /* PR 17512: file: 0ca183b8.
286 FIXME: Should we signal this error somehow ? */
287 if (shift >= sizeof (result) * 8)
291 if (length_return != NULL)
292 *length_return = num_read;
294 if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
295 result |= -((dwarf_vma) 1 << shift);
300 /* Create a signed version to avoid painful typecasts. */
301 static inline dwarf_signed_vma
302 read_sleb128 (unsigned char * data,
303 unsigned int * length_return,
304 const unsigned char * const end)
306 return (dwarf_signed_vma) read_leb128 (data, length_return, TRUE, end);
309 static inline dwarf_vma
310 read_uleb128 (unsigned char * data,
311 unsigned int * length_return,
312 const unsigned char * const end)
314 return read_leb128 (data, length_return, FALSE, end);
317 #define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END) \
320 unsigned int amount = (AMOUNT); \
321 if (sizeof (VAL) < amount) \
323 error (_("internal error: attempt to read %d bytes of data in to %d sized variable"),\
324 amount, (int) sizeof (VAL)); \
325 amount = sizeof (VAL); \
327 if (((PTR) + amount) >= (END)) \
330 amount = (END) - (PTR); \
334 if (amount == 0 || amount > 8) \
337 VAL = byte_get ((PTR), amount); \
341 #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
344 SAFE_BYTE_GET (VAL, PTR, AMOUNT, END); \
349 #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END) \
352 unsigned int amount = (AMOUNT); \
353 if (((PTR) + amount) >= (END)) \
356 amount = (END) - (PTR); \
361 VAL = byte_get_signed ((PTR), amount); \
367 #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
370 SAFE_SIGNED_BYTE_GET (VAL, PTR, AMOUNT, END); \
375 #define SAFE_BYTE_GET64(PTR, HIGH, LOW, END) \
378 if (((PTR) + 8) <= (END)) \
380 byte_get_64 ((PTR), (HIGH), (LOW)); \
384 * (LOW) = * (HIGH) = 0; \
389 typedef struct State_Machine_Registers
397 unsigned char op_index;
398 unsigned char end_sequence;
399 /* This variable hold the number of the last entry seen
400 in the File Table. */
401 unsigned int last_file_entry;
404 static SMR state_machine_regs;
407 reset_state_machine (int is_stmt)
409 state_machine_regs.address = 0;
410 state_machine_regs.op_index = 0;
411 state_machine_regs.file = 1;
412 state_machine_regs.line = 1;
413 state_machine_regs.column = 0;
414 state_machine_regs.is_stmt = is_stmt;
415 state_machine_regs.basic_block = 0;
416 state_machine_regs.end_sequence = 0;
417 state_machine_regs.last_file_entry = 0;
420 /* Handled an extend line op.
421 Returns the number of bytes read. */
424 process_extended_line_op (unsigned char * data,
428 unsigned char op_code;
429 unsigned int bytes_read;
432 unsigned char *orig_data = data;
435 len = read_uleb128 (data, & bytes_read, end);
438 if (len == 0 || data == end || len > (uintptr_t) (end - data))
440 warn (_("Badly formed extended line op encountered!\n"));
447 printf (_(" Extended opcode %d: "), op_code);
451 case DW_LNE_end_sequence:
452 printf (_("End of Sequence\n\n"));
453 reset_state_machine (is_stmt);
456 case DW_LNE_set_address:
457 /* PR 17512: file: 002-100480-0.004. */
458 if (len - bytes_read - 1 > 8)
460 warn (_("Length (%d) of DW_LNE_set_address op is too long\n"),
461 len - bytes_read - 1);
465 SAFE_BYTE_GET (adr, data, len - bytes_read - 1, end);
466 printf (_("set Address to 0x%s\n"), dwarf_vmatoa ("x", adr));
467 state_machine_regs.address = adr;
468 state_machine_regs.op_index = 0;
471 case DW_LNE_define_file:
472 printf (_("define new File Table entry\n"));
473 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
474 printf (" %d\t", ++state_machine_regs.last_file_entry);
477 data += strnlen ((char *) data, end - data) + 1;
478 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
480 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
482 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
484 printf ("%s\n\n", name);
486 if (((unsigned int) (data - orig_data) != len) || data == end)
487 warn (_("DW_LNE_define_file: Bad opcode length\n"));
490 case DW_LNE_set_discriminator:
491 printf (_("set Discriminator to %s\n"),
492 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
496 case DW_LNE_HP_negate_is_UV_update:
497 printf ("DW_LNE_HP_negate_is_UV_update\n");
499 case DW_LNE_HP_push_context:
500 printf ("DW_LNE_HP_push_context\n");
502 case DW_LNE_HP_pop_context:
503 printf ("DW_LNE_HP_pop_context\n");
505 case DW_LNE_HP_set_file_line_column:
506 printf ("DW_LNE_HP_set_file_line_column\n");
508 case DW_LNE_HP_set_routine_name:
509 printf ("DW_LNE_HP_set_routine_name\n");
511 case DW_LNE_HP_set_sequence:
512 printf ("DW_LNE_HP_set_sequence\n");
514 case DW_LNE_HP_negate_post_semantics:
515 printf ("DW_LNE_HP_negate_post_semantics\n");
517 case DW_LNE_HP_negate_function_exit:
518 printf ("DW_LNE_HP_negate_function_exit\n");
520 case DW_LNE_HP_negate_front_end_logical:
521 printf ("DW_LNE_HP_negate_front_end_logical\n");
523 case DW_LNE_HP_define_proc:
524 printf ("DW_LNE_HP_define_proc\n");
526 case DW_LNE_HP_source_file_correlation:
528 unsigned char *edata = data + len - bytes_read - 1;
530 printf ("DW_LNE_HP_source_file_correlation\n");
536 opc = read_uleb128 (data, & bytes_read, edata);
541 case DW_LNE_HP_SFC_formfeed:
542 printf (" DW_LNE_HP_SFC_formfeed\n");
544 case DW_LNE_HP_SFC_set_listing_line:
545 printf (" DW_LNE_HP_SFC_set_listing_line (%s)\n",
547 read_uleb128 (data, & bytes_read, edata)));
550 case DW_LNE_HP_SFC_associate:
551 printf (" DW_LNE_HP_SFC_associate ");
554 read_uleb128 (data, & bytes_read, edata)));
558 read_uleb128 (data, & bytes_read, edata)));
562 read_uleb128 (data, & bytes_read, edata)));
566 printf (_(" UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc);
576 unsigned int rlen = len - bytes_read - 1;
578 if (op_code >= DW_LNE_lo_user
579 /* The test against DW_LNW_hi_user is redundant due to
580 the limited range of the unsigned char data type used
582 /*&& op_code <= DW_LNE_hi_user*/)
583 printf (_("user defined: "));
585 printf (_("UNKNOWN: "));
586 printf (_("length %d ["), rlen);
588 printf (" %02x", *data++);
597 static const unsigned char *
598 fetch_indirect_string (dwarf_vma offset)
600 struct dwarf_section *section = &debug_displays [str].section;
602 if (section->start == NULL)
603 return (const unsigned char *) _("<no .debug_str section>");
605 if (offset > section->size)
607 warn (_("DW_FORM_strp offset too big: %s\n"),
608 dwarf_vmatoa ("x", offset));
609 return (const unsigned char *) _("<offset is too big>");
612 return (const unsigned char *) section->start + offset;
616 fetch_indexed_string (dwarf_vma idx, struct cu_tu_set *this_set,
617 dwarf_vma offset_size, int dwo)
619 enum dwarf_section_display_enum str_sec_idx = dwo ? str_dwo : str;
620 enum dwarf_section_display_enum idx_sec_idx = dwo ? str_index_dwo : str_index;
621 struct dwarf_section *index_section = &debug_displays [idx_sec_idx].section;
622 struct dwarf_section *str_section = &debug_displays [str_sec_idx].section;
623 dwarf_vma index_offset = idx * offset_size;
624 dwarf_vma str_offset;
626 if (index_section->start == NULL)
627 return (dwo ? _("<no .debug_str_offsets.dwo section>")
628 : _("<no .debug_str_offsets section>"));
630 if (this_set != NULL)
631 index_offset += this_set->section_offsets [DW_SECT_STR_OFFSETS];
632 if (index_offset > index_section->size)
634 warn (_("DW_FORM_GNU_str_index offset too big: %s\n"),
635 dwarf_vmatoa ("x", index_offset));
636 return _("<index offset is too big>");
639 if (str_section->start == NULL)
640 return (dwo ? _("<no .debug_str.dwo section>")
641 : _("<no .debug_str section>"));
643 str_offset = byte_get (index_section->start + index_offset, offset_size);
644 str_offset -= str_section->address;
645 if (str_offset > str_section->size)
647 warn (_("DW_FORM_GNU_str_index indirect offset too big: %s\n"),
648 dwarf_vmatoa ("x", str_offset));
649 return _("<indirect index offset is too big>");
652 return (const char *) str_section->start + str_offset;
656 fetch_indexed_value (dwarf_vma offset, dwarf_vma bytes)
658 struct dwarf_section *section = &debug_displays [debug_addr].section;
660 if (section->start == NULL)
661 return (_("<no .debug_addr section>"));
663 if (offset + bytes > section->size)
665 warn (_("Offset into section %s too big: %s\n"),
666 section->name, dwarf_vmatoa ("x", offset));
667 return "<offset too big>";
670 return dwarf_vmatoa ("x", byte_get (section->start + offset, bytes));
674 /* FIXME: There are better and more efficient ways to handle
675 these structures. For now though, I just want something that
676 is simple to implement. */
677 typedef struct abbrev_attr
679 unsigned long attribute;
681 struct abbrev_attr *next;
685 typedef struct abbrev_entry
690 struct abbrev_attr *first_attr;
691 struct abbrev_attr *last_attr;
692 struct abbrev_entry *next;
696 static abbrev_entry *first_abbrev = NULL;
697 static abbrev_entry *last_abbrev = NULL;
704 for (abbrv = first_abbrev; abbrv;)
706 abbrev_entry *next_abbrev = abbrv->next;
709 for (attr = abbrv->first_attr; attr;)
711 abbrev_attr *next_attr = attr->next;
721 last_abbrev = first_abbrev = NULL;
725 add_abbrev (unsigned long number, unsigned long tag, int children)
729 entry = (abbrev_entry *) malloc (sizeof (*entry));
734 entry->entry = number;
736 entry->children = children;
737 entry->first_attr = NULL;
738 entry->last_attr = NULL;
741 if (first_abbrev == NULL)
742 first_abbrev = entry;
744 last_abbrev->next = entry;
750 add_abbrev_attr (unsigned long attribute, unsigned long form)
754 attr = (abbrev_attr *) malloc (sizeof (*attr));
759 attr->attribute = attribute;
763 if (last_abbrev->first_attr == NULL)
764 last_abbrev->first_attr = attr;
766 last_abbrev->last_attr->next = attr;
768 last_abbrev->last_attr = attr;
771 /* Processes the (partial) contents of a .debug_abbrev section.
772 Returns NULL if the end of the section was encountered.
773 Returns the address after the last byte read if the end of
774 an abbreviation set was found. */
776 static unsigned char *
777 process_abbrev_section (unsigned char *start, unsigned char *end)
779 if (first_abbrev != NULL)
784 unsigned int bytes_read;
787 unsigned long attribute;
790 entry = read_uleb128 (start, & bytes_read, end);
793 /* A single zero is supposed to end the section according
794 to the standard. If there's more, then signal that to
801 tag = read_uleb128 (start, & bytes_read, end);
808 add_abbrev (entry, tag, children);
814 attribute = read_uleb128 (start, & bytes_read, end);
819 form = read_uleb128 (start, & bytes_read, end);
824 add_abbrev_attr (attribute, form);
826 while (attribute != 0);
829 /* Report the missing single zero which ends the section. */
830 error (_(".debug_abbrev section not zero terminated\n"));
836 get_TAG_name (unsigned long tag)
838 const char *name = get_DW_TAG_name ((unsigned int)tag);
842 static char buffer[100];
844 snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag);
852 get_FORM_name (unsigned long form)
857 return "DW_FORM value: 0";
859 name = get_DW_FORM_name (form);
862 static char buffer[100];
864 snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
871 static unsigned char *
872 display_block (unsigned char *data,
874 const unsigned char * const end)
878 printf (_(" %s byte block: "), dwarf_vmatoa ("u", length));
880 return (unsigned char *) end;
882 maxlen = (dwarf_vma) (end - data);
883 length = length > maxlen ? maxlen : length;
886 printf ("%lx ", (unsigned long) byte_get (data++, 1));
892 decode_location_expression (unsigned char * data,
893 unsigned int pointer_size,
894 unsigned int offset_size,
898 struct dwarf_section * section)
901 unsigned int bytes_read;
903 dwarf_signed_vma svalue;
904 unsigned char *end = data + length;
905 int need_frame_base = 0;
914 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
915 printf ("DW_OP_addr: %s", dwarf_vmatoa ("x", uvalue));
918 printf ("DW_OP_deref");
921 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
922 printf ("DW_OP_const1u: %lu", (unsigned long) uvalue);
925 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 1, end);
926 printf ("DW_OP_const1s: %ld", (long) svalue);
929 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
930 printf ("DW_OP_const2u: %lu", (unsigned long) uvalue);
933 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
934 printf ("DW_OP_const2s: %ld", (long) svalue);
937 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
938 printf ("DW_OP_const4u: %lu", (unsigned long) uvalue);
941 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
942 printf ("DW_OP_const4s: %ld", (long) svalue);
945 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
946 printf ("DW_OP_const8u: %lu ", (unsigned long) uvalue);
947 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
948 printf ("%lu", (unsigned long) uvalue);
951 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
952 printf ("DW_OP_const8s: %ld ", (long) svalue);
953 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
954 printf ("%ld", (long) svalue);
957 printf ("DW_OP_constu: %s",
958 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
962 printf ("DW_OP_consts: %s",
963 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
967 printf ("DW_OP_dup");
970 printf ("DW_OP_drop");
973 printf ("DW_OP_over");
976 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
977 printf ("DW_OP_pick: %ld", (unsigned long) uvalue);
980 printf ("DW_OP_swap");
983 printf ("DW_OP_rot");
986 printf ("DW_OP_xderef");
989 printf ("DW_OP_abs");
992 printf ("DW_OP_and");
995 printf ("DW_OP_div");
998 printf ("DW_OP_minus");
1001 printf ("DW_OP_mod");
1004 printf ("DW_OP_mul");
1007 printf ("DW_OP_neg");
1010 printf ("DW_OP_not");
1013 printf ("DW_OP_or");
1016 printf ("DW_OP_plus");
1018 case DW_OP_plus_uconst:
1019 printf ("DW_OP_plus_uconst: %s",
1020 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1024 printf ("DW_OP_shl");
1027 printf ("DW_OP_shr");
1030 printf ("DW_OP_shra");
1033 printf ("DW_OP_xor");
1036 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1037 printf ("DW_OP_bra: %ld", (long) svalue);
1040 printf ("DW_OP_eq");
1043 printf ("DW_OP_ge");
1046 printf ("DW_OP_gt");
1049 printf ("DW_OP_le");
1052 printf ("DW_OP_lt");
1055 printf ("DW_OP_ne");
1058 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1059 printf ("DW_OP_skip: %ld", (long) svalue);
1094 printf ("DW_OP_lit%d", op - DW_OP_lit0);
1129 printf ("DW_OP_reg%d (%s)", op - DW_OP_reg0,
1130 regname (op - DW_OP_reg0, 1));
1165 printf ("DW_OP_breg%d (%s): %s",
1167 regname (op - DW_OP_breg0, 1),
1168 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1173 uvalue = read_uleb128 (data, &bytes_read, end);
1175 printf ("DW_OP_regx: %s (%s)",
1176 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1179 need_frame_base = 1;
1180 printf ("DW_OP_fbreg: %s",
1181 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1185 uvalue = read_uleb128 (data, &bytes_read, end);
1187 printf ("DW_OP_bregx: %s (%s) %s",
1188 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1),
1189 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1193 printf ("DW_OP_piece: %s",
1194 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1197 case DW_OP_deref_size:
1198 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1199 printf ("DW_OP_deref_size: %ld", (long) uvalue);
1201 case DW_OP_xderef_size:
1202 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1203 printf ("DW_OP_xderef_size: %ld", (long) uvalue);
1206 printf ("DW_OP_nop");
1209 /* DWARF 3 extensions. */
1210 case DW_OP_push_object_address:
1211 printf ("DW_OP_push_object_address");
1214 /* XXX: Strictly speaking for 64-bit DWARF3 files
1215 this ought to be an 8-byte wide computation. */
1216 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1217 printf ("DW_OP_call2: <0x%s>",
1218 dwarf_vmatoa ("x", svalue + cu_offset));
1221 /* XXX: Strictly speaking for 64-bit DWARF3 files
1222 this ought to be an 8-byte wide computation. */
1223 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1224 printf ("DW_OP_call4: <0x%s>",
1225 dwarf_vmatoa ("x", svalue + cu_offset));
1227 case DW_OP_call_ref:
1228 /* XXX: Strictly speaking for 64-bit DWARF3 files
1229 this ought to be an 8-byte wide computation. */
1230 if (dwarf_version == -1)
1232 printf (_("(DW_OP_call_ref in frame info)"));
1233 /* No way to tell where the next op is, so just bail. */
1234 return need_frame_base;
1236 if (dwarf_version == 2)
1238 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1242 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1244 printf ("DW_OP_call_ref: <0x%s>", dwarf_vmatoa ("x", uvalue));
1246 case DW_OP_form_tls_address:
1247 printf ("DW_OP_form_tls_address");
1249 case DW_OP_call_frame_cfa:
1250 printf ("DW_OP_call_frame_cfa");
1252 case DW_OP_bit_piece:
1253 printf ("DW_OP_bit_piece: ");
1254 printf (_("size: %s "),
1255 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1257 printf (_("offset: %s "),
1258 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1262 /* DWARF 4 extensions. */
1263 case DW_OP_stack_value:
1264 printf ("DW_OP_stack_value");
1267 case DW_OP_implicit_value:
1268 printf ("DW_OP_implicit_value");
1269 uvalue = read_uleb128 (data, &bytes_read, end);
1271 data = display_block (data, uvalue, end);
1274 /* GNU extensions. */
1275 case DW_OP_GNU_push_tls_address:
1276 printf (_("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown"));
1278 case DW_OP_GNU_uninit:
1279 printf ("DW_OP_GNU_uninit");
1280 /* FIXME: Is there data associated with this OP ? */
1282 case DW_OP_GNU_encoded_addr:
1289 addr = get_encoded_value (&data, encoding, section, end);
1291 printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding);
1292 print_dwarf_vma (addr, pointer_size);
1295 case DW_OP_GNU_implicit_pointer:
1296 /* XXX: Strictly speaking for 64-bit DWARF3 files
1297 this ought to be an 8-byte wide computation. */
1298 if (dwarf_version == -1)
1300 printf (_("(DW_OP_GNU_implicit_pointer in frame info)"));
1301 /* No way to tell where the next op is, so just bail. */
1302 return need_frame_base;
1304 if (dwarf_version == 2)
1306 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1310 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1312 printf ("DW_OP_GNU_implicit_pointer: <0x%s> %s",
1313 dwarf_vmatoa ("x", uvalue),
1314 dwarf_vmatoa ("d", read_sleb128 (data,
1315 &bytes_read, end)));
1318 case DW_OP_GNU_entry_value:
1319 uvalue = read_uleb128 (data, &bytes_read, end);
1321 /* PR 17531: file: 0cc9cd00. */
1322 if (uvalue > (dwarf_vma) (end - data))
1323 uvalue = end - data;
1324 printf ("DW_OP_GNU_entry_value: (");
1325 if (decode_location_expression (data, pointer_size, offset_size,
1326 dwarf_version, uvalue,
1327 cu_offset, section))
1328 need_frame_base = 1;
1334 case DW_OP_GNU_const_type:
1335 uvalue = read_uleb128 (data, &bytes_read, end);
1337 printf ("DW_OP_GNU_const_type: <0x%s> ",
1338 dwarf_vmatoa ("x", cu_offset + uvalue));
1339 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1340 data = display_block (data, uvalue, end);
1342 case DW_OP_GNU_regval_type:
1343 uvalue = read_uleb128 (data, &bytes_read, end);
1345 printf ("DW_OP_GNU_regval_type: %s (%s)",
1346 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1347 uvalue = read_uleb128 (data, &bytes_read, end);
1349 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1351 case DW_OP_GNU_deref_type:
1352 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1353 printf ("DW_OP_GNU_deref_type: %ld", (long) uvalue);
1354 uvalue = read_uleb128 (data, &bytes_read, end);
1356 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1358 case DW_OP_GNU_convert:
1359 uvalue = read_uleb128 (data, &bytes_read, end);
1361 printf ("DW_OP_GNU_convert <0x%s>",
1362 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1364 case DW_OP_GNU_reinterpret:
1365 uvalue = read_uleb128 (data, &bytes_read, end);
1367 printf ("DW_OP_GNU_reinterpret <0x%s>",
1368 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1370 case DW_OP_GNU_parameter_ref:
1371 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1372 printf ("DW_OP_GNU_parameter_ref: <0x%s>",
1373 dwarf_vmatoa ("x", cu_offset + uvalue));
1375 case DW_OP_GNU_addr_index:
1376 uvalue = read_uleb128 (data, &bytes_read, end);
1378 printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1380 case DW_OP_GNU_const_index:
1381 uvalue = read_uleb128 (data, &bytes_read, end);
1383 printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1386 /* HP extensions. */
1387 case DW_OP_HP_is_value:
1388 printf ("DW_OP_HP_is_value");
1389 /* FIXME: Is there data associated with this OP ? */
1391 case DW_OP_HP_fltconst4:
1392 printf ("DW_OP_HP_fltconst4");
1393 /* FIXME: Is there data associated with this OP ? */
1395 case DW_OP_HP_fltconst8:
1396 printf ("DW_OP_HP_fltconst8");
1397 /* FIXME: Is there data associated with this OP ? */
1399 case DW_OP_HP_mod_range:
1400 printf ("DW_OP_HP_mod_range");
1401 /* FIXME: Is there data associated with this OP ? */
1403 case DW_OP_HP_unmod_range:
1404 printf ("DW_OP_HP_unmod_range");
1405 /* FIXME: Is there data associated with this OP ? */
1408 printf ("DW_OP_HP_tls");
1409 /* FIXME: Is there data associated with this OP ? */
1412 /* PGI (STMicroelectronics) extensions. */
1413 case DW_OP_PGI_omp_thread_num:
1414 /* Pushes the thread number for the current thread as it would be
1415 returned by the standard OpenMP library function:
1416 omp_get_thread_num(). The "current thread" is the thread for
1417 which the expression is being evaluated. */
1418 printf ("DW_OP_PGI_omp_thread_num");
1422 if (op >= DW_OP_lo_user
1423 && op <= DW_OP_hi_user)
1424 printf (_("(User defined location op)"));
1426 printf (_("(Unknown location op)"));
1427 /* No way to tell where the next op is, so just bail. */
1428 return need_frame_base;
1431 /* Separate the ops. */
1436 return need_frame_base;
1439 /* Find the CU or TU set corresponding to the given CU_OFFSET.
1440 This is used for DWARF package files. */
1442 static struct cu_tu_set *
1443 find_cu_tu_set_v2 (dwarf_vma cu_offset, int do_types)
1445 struct cu_tu_set *p;
1447 unsigned int dw_sect;
1453 dw_sect = DW_SECT_TYPES;
1459 dw_sect = DW_SECT_INFO;
1463 if (p->section_offsets [dw_sect] == cu_offset)
1471 /* Add INC to HIGH_BITS:LOW_BITS. */
1473 add64 (dwarf_vma * high_bits, dwarf_vma * low_bits, dwarf_vma inc)
1475 dwarf_vma tmp = * low_bits;
1479 /* FIXME: There is probably a better way of handling this:
1481 We need to cope with dwarf_vma being a 32-bit or 64-bit
1482 type. Plus regardless of its size LOW_BITS is meant to
1483 only hold 32-bits, so if there is overflow or wrap around
1484 we must propagate into HIGH_BITS. */
1485 if (tmp < * low_bits)
1489 else if (sizeof (tmp) > 8
1499 static unsigned char *
1500 read_and_display_attr_value (unsigned long attribute,
1502 unsigned char * data,
1503 unsigned char * end,
1504 dwarf_vma cu_offset,
1505 dwarf_vma pointer_size,
1506 dwarf_vma offset_size,
1508 debug_info * debug_info_p,
1510 struct dwarf_section * section,
1511 struct cu_tu_set * this_set)
1513 dwarf_vma uvalue = 0;
1514 unsigned char *block_start = NULL;
1515 unsigned char * orig_data = data;
1516 unsigned int bytes_read;
1518 if (data > end || (data == end && form != DW_FORM_flag_present))
1520 warn (_("Corrupt attribute\n"));
1529 case DW_FORM_ref_addr:
1530 if (dwarf_version == 2)
1531 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1532 else if (dwarf_version == 3 || dwarf_version == 4)
1533 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1535 error (_("Internal error: DWARF version is not 2, 3 or 4.\n"));
1540 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1544 case DW_FORM_sec_offset:
1545 case DW_FORM_GNU_ref_alt:
1546 case DW_FORM_GNU_strp_alt:
1547 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1550 case DW_FORM_flag_present:
1557 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1562 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1567 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1571 uvalue = read_sleb128 (data, & bytes_read, end);
1575 case DW_FORM_GNU_str_index:
1576 uvalue = read_uleb128 (data, & bytes_read, end);
1580 case DW_FORM_ref_udata:
1582 uvalue = read_uleb128 (data, & bytes_read, end);
1586 case DW_FORM_indirect:
1587 form = read_uleb128 (data, & bytes_read, end);
1590 printf (" %s", get_FORM_name (form));
1591 return read_and_display_attr_value (attribute, form, data, end,
1592 cu_offset, pointer_size,
1593 offset_size, dwarf_version,
1594 debug_info_p, do_loc,
1596 case DW_FORM_GNU_addr_index:
1597 uvalue = read_uleb128 (data, & bytes_read, end);
1604 case DW_FORM_ref_addr:
1606 printf (" <0x%s>", dwarf_vmatoa ("x",uvalue));
1609 case DW_FORM_GNU_ref_alt:
1611 printf (" <alt 0x%s>", dwarf_vmatoa ("x",uvalue));
1617 case DW_FORM_ref_udata:
1619 printf (" <0x%s>", dwarf_vmatoa ("x", uvalue + cu_offset));
1624 case DW_FORM_sec_offset:
1626 printf (" 0x%s", dwarf_vmatoa ("x", uvalue));
1629 case DW_FORM_flag_present:
1636 printf (" %s", dwarf_vmatoa ("d", uvalue));
1643 dwarf_vma high_bits;
1647 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1649 if (form == DW_FORM_ref8)
1650 add64 (& high_bits, & utmp, cu_offset);
1652 dwarf_vmatoa64 (high_bits, utmp, buf, sizeof (buf)));
1655 if ((do_loc || do_debug_loc || do_debug_ranges)
1656 && num_debug_info_entries == 0)
1658 if (sizeof (uvalue) == 8)
1659 SAFE_BYTE_GET (uvalue, data, 8, end);
1661 error (_("DW_FORM_data8 is unsupported when sizeof (dwarf_vma) != 8\n"));
1667 case DW_FORM_string:
1669 printf (" %.*s", (int) (end - data), data);
1670 data += strnlen ((char *) data, end - data) + 1;
1674 case DW_FORM_exprloc:
1675 uvalue = read_uleb128 (data, & bytes_read, end);
1676 block_start = data + bytes_read;
1677 if (block_start >= end)
1679 warn (_("Block ends prematurely\n"));
1683 /* FIXME: Testing "(block_start + uvalue) < block_start" miscompiles with
1684 gcc 4.8.3 running on an x86_64 host in 32-bit mode. So we pre-compute
1685 block_start + uvalue here. */
1686 data = block_start + uvalue;
1687 /* PR 17512: file: 008-103549-0.001:0.1. */
1688 if (block_start + uvalue > end || data < block_start)
1690 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1691 uvalue = end - block_start;
1694 data = block_start + uvalue;
1696 data = display_block (block_start, uvalue, end);
1699 case DW_FORM_block1:
1700 SAFE_BYTE_GET (uvalue, data, 1, end);
1701 block_start = data + 1;
1702 if (block_start >= end)
1704 warn (_("Block ends prematurely\n"));
1708 data = block_start + uvalue;
1709 if (block_start + uvalue > end || data < block_start)
1711 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1712 uvalue = end - block_start;
1715 data = block_start + uvalue;
1717 data = display_block (block_start, uvalue, end);
1720 case DW_FORM_block2:
1721 SAFE_BYTE_GET (uvalue, data, 2, end);
1722 block_start = data + 2;
1723 if (block_start >= end)
1725 warn (_("Block ends prematurely\n"));
1729 data = block_start + uvalue;
1730 if (block_start + uvalue > end || data < block_start)
1732 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1733 uvalue = end - block_start;
1736 data = block_start + uvalue;
1738 data = display_block (block_start, uvalue, end);
1741 case DW_FORM_block4:
1742 SAFE_BYTE_GET (uvalue, data, 4, end);
1743 block_start = data + 4;
1744 /* PR 17512: file: 3371-3907-0.004. */
1745 if (block_start >= end)
1747 warn (_("Block ends prematurely\n"));
1751 data = block_start + uvalue;
1752 if (block_start + uvalue > end
1753 /* PR 17531: file: 5b5f0592. */
1754 || data < block_start)
1756 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1757 uvalue = end - block_start;
1760 data = block_start + uvalue;
1762 data = display_block (block_start, uvalue, end);
1767 printf (_(" (indirect string, offset: 0x%s): %s"),
1768 dwarf_vmatoa ("x", uvalue),
1769 fetch_indirect_string (uvalue));
1772 case DW_FORM_GNU_str_index:
1775 const char *suffix = strrchr (section->name, '.');
1776 int dwo = (suffix && strcmp (suffix, ".dwo") == 0) ? 1 : 0;
1778 printf (_(" (indexed string: 0x%s): %s"),
1779 dwarf_vmatoa ("x", uvalue),
1780 fetch_indexed_string (uvalue, this_set, offset_size, dwo));
1784 case DW_FORM_GNU_strp_alt:
1786 printf (_(" (alt indirect string, offset: 0x%s)"),
1787 dwarf_vmatoa ("x", uvalue));
1790 case DW_FORM_indirect:
1791 /* Handled above. */
1794 case DW_FORM_ref_sig8:
1797 dwarf_vma high_bits;
1800 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1801 printf (" signature: 0x%s",
1802 dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf)));
1807 case DW_FORM_GNU_addr_index:
1809 printf (_(" (addr_index: 0x%s): %s"),
1810 dwarf_vmatoa ("x", uvalue),
1811 fetch_indexed_value (uvalue * pointer_size, pointer_size));
1815 warn (_("Unrecognized form: %lu\n"), form);
1819 if ((do_loc || do_debug_loc || do_debug_ranges)
1820 && num_debug_info_entries == 0
1821 && debug_info_p != NULL)
1825 case DW_AT_frame_base:
1826 have_frame_base = 1;
1828 case DW_AT_location:
1829 case DW_AT_string_length:
1830 case DW_AT_return_addr:
1831 case DW_AT_data_member_location:
1832 case DW_AT_vtable_elem_location:
1834 case DW_AT_static_link:
1835 case DW_AT_use_location:
1836 case DW_AT_GNU_call_site_value:
1837 case DW_AT_GNU_call_site_data_value:
1838 case DW_AT_GNU_call_site_target:
1839 case DW_AT_GNU_call_site_target_clobbered:
1840 if ((dwarf_version < 4
1841 && (form == DW_FORM_data4 || form == DW_FORM_data8))
1842 || form == DW_FORM_sec_offset)
1844 /* Process location list. */
1845 unsigned int lmax = debug_info_p->max_loc_offsets;
1846 unsigned int num = debug_info_p->num_loc_offsets;
1848 if (lmax == 0 || num >= lmax)
1851 debug_info_p->loc_offsets = (dwarf_vma *)
1852 xcrealloc (debug_info_p->loc_offsets,
1853 lmax, sizeof (*debug_info_p->loc_offsets));
1854 debug_info_p->have_frame_base = (int *)
1855 xcrealloc (debug_info_p->have_frame_base,
1856 lmax, sizeof (*debug_info_p->have_frame_base));
1857 debug_info_p->max_loc_offsets = lmax;
1859 if (this_set != NULL)
1860 uvalue += this_set->section_offsets [DW_SECT_LOC];
1861 debug_info_p->loc_offsets [num] = uvalue;
1862 debug_info_p->have_frame_base [num] = have_frame_base;
1863 debug_info_p->num_loc_offsets++;
1868 if (need_base_address)
1869 debug_info_p->base_address = uvalue;
1872 case DW_AT_GNU_addr_base:
1873 debug_info_p->addr_base = uvalue;
1876 case DW_AT_GNU_ranges_base:
1877 debug_info_p->ranges_base = uvalue;
1881 if ((dwarf_version < 4
1882 && (form == DW_FORM_data4 || form == DW_FORM_data8))
1883 || form == DW_FORM_sec_offset)
1885 /* Process range list. */
1886 unsigned int lmax = debug_info_p->max_range_lists;
1887 unsigned int num = debug_info_p->num_range_lists;
1889 if (lmax == 0 || num >= lmax)
1892 debug_info_p->range_lists = (dwarf_vma *)
1893 xcrealloc (debug_info_p->range_lists,
1894 lmax, sizeof (*debug_info_p->range_lists));
1895 debug_info_p->max_range_lists = lmax;
1897 debug_info_p->range_lists [num] = uvalue;
1898 debug_info_p->num_range_lists++;
1907 if (do_loc || attribute == 0)
1910 /* For some attributes we can display further information. */
1917 case DW_INL_not_inlined:
1918 printf (_("(not inlined)"));
1920 case DW_INL_inlined:
1921 printf (_("(inlined)"));
1923 case DW_INL_declared_not_inlined:
1924 printf (_("(declared as inline but ignored)"));
1926 case DW_INL_declared_inlined:
1927 printf (_("(declared as inline and inlined)"));
1930 printf (_(" (Unknown inline attribute value: %s)"),
1931 dwarf_vmatoa ("x", uvalue));
1936 case DW_AT_language:
1940 /* Ordered by the numeric value of these constants. */
1941 case DW_LANG_C89: printf ("(ANSI C)"); break;
1942 case DW_LANG_C: printf ("(non-ANSI C)"); break;
1943 case DW_LANG_Ada83: printf ("(Ada)"); break;
1944 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
1945 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
1946 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
1947 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
1948 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
1949 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
1950 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
1951 /* DWARF 2.1 values. */
1952 case DW_LANG_Java: printf ("(Java)"); break;
1953 case DW_LANG_C99: printf ("(ANSI C99)"); break;
1954 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
1955 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
1956 /* DWARF 3 values. */
1957 case DW_LANG_PLI: printf ("(PLI)"); break;
1958 case DW_LANG_ObjC: printf ("(Objective C)"); break;
1959 case DW_LANG_ObjC_plus_plus: printf ("(Objective C++)"); break;
1960 case DW_LANG_UPC: printf ("(Unified Parallel C)"); break;
1961 case DW_LANG_D: printf ("(D)"); break;
1962 /* DWARF 4 values. */
1963 case DW_LANG_Python: printf ("(Python)"); break;
1964 /* DWARF 5 values. */
1965 case DW_LANG_Go: printf ("(Go)"); break;
1966 case DW_LANG_C_plus_plus_11: printf ("(C++11)"); break;
1967 case DW_LANG_C11: printf ("(C11)"); break;
1968 case DW_LANG_C_plus_plus_14: printf ("(C++14)"); break;
1969 case DW_LANG_Fortran03: printf ("(Fortran 03)"); break;
1970 case DW_LANG_Fortran08: printf ("(Fortran 08)"); break;
1971 /* MIPS extension. */
1972 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
1973 /* UPC extension. */
1974 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
1976 if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
1977 printf (_("(implementation defined: %s)"),
1978 dwarf_vmatoa ("x", uvalue));
1980 printf (_("(Unknown: %s)"), dwarf_vmatoa ("x", uvalue));
1985 case DW_AT_encoding:
1989 case DW_ATE_void: printf ("(void)"); break;
1990 case DW_ATE_address: printf ("(machine address)"); break;
1991 case DW_ATE_boolean: printf ("(boolean)"); break;
1992 case DW_ATE_complex_float: printf ("(complex float)"); break;
1993 case DW_ATE_float: printf ("(float)"); break;
1994 case DW_ATE_signed: printf ("(signed)"); break;
1995 case DW_ATE_signed_char: printf ("(signed char)"); break;
1996 case DW_ATE_unsigned: printf ("(unsigned)"); break;
1997 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
1998 /* DWARF 2.1 values: */
1999 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
2000 case DW_ATE_decimal_float: printf ("(decimal float)"); break;
2001 /* DWARF 3 values: */
2002 case DW_ATE_packed_decimal: printf ("(packed_decimal)"); break;
2003 case DW_ATE_numeric_string: printf ("(numeric_string)"); break;
2004 case DW_ATE_edited: printf ("(edited)"); break;
2005 case DW_ATE_signed_fixed: printf ("(signed_fixed)"); break;
2006 case DW_ATE_unsigned_fixed: printf ("(unsigned_fixed)"); break;
2007 /* HP extensions: */
2008 case DW_ATE_HP_float80: printf ("(HP_float80)"); break;
2009 case DW_ATE_HP_complex_float80: printf ("(HP_complex_float80)"); break;
2010 case DW_ATE_HP_float128: printf ("(HP_float128)"); break;
2011 case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
2012 case DW_ATE_HP_floathpintel: printf ("(HP_floathpintel)"); break;
2013 case DW_ATE_HP_imaginary_float80: printf ("(HP_imaginary_float80)"); break;
2014 case DW_ATE_HP_imaginary_float128: printf ("(HP_imaginary_float128)"); break;
2015 /* DWARF 4 values: */
2016 case DW_ATE_UTF: printf ("(unicode string)"); break;
2019 if (uvalue >= DW_ATE_lo_user
2020 && uvalue <= DW_ATE_hi_user)
2021 printf (_("(user defined type)"));
2023 printf (_("(unknown type)"));
2028 case DW_AT_accessibility:
2032 case DW_ACCESS_public: printf ("(public)"); break;
2033 case DW_ACCESS_protected: printf ("(protected)"); break;
2034 case DW_ACCESS_private: printf ("(private)"); break;
2036 printf (_("(unknown accessibility)"));
2041 case DW_AT_visibility:
2045 case DW_VIS_local: printf ("(local)"); break;
2046 case DW_VIS_exported: printf ("(exported)"); break;
2047 case DW_VIS_qualified: printf ("(qualified)"); break;
2048 default: printf (_("(unknown visibility)")); break;
2052 case DW_AT_virtuality:
2056 case DW_VIRTUALITY_none: printf ("(none)"); break;
2057 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
2058 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
2059 default: printf (_("(unknown virtuality)")); break;
2063 case DW_AT_identifier_case:
2067 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
2068 case DW_ID_up_case: printf ("(up_case)"); break;
2069 case DW_ID_down_case: printf ("(down_case)"); break;
2070 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
2071 default: printf (_("(unknown case)")); break;
2075 case DW_AT_calling_convention:
2079 case DW_CC_normal: printf ("(normal)"); break;
2080 case DW_CC_program: printf ("(program)"); break;
2081 case DW_CC_nocall: printf ("(nocall)"); break;
2083 if (uvalue >= DW_CC_lo_user
2084 && uvalue <= DW_CC_hi_user)
2085 printf (_("(user defined)"));
2087 printf (_("(unknown convention)"));
2091 case DW_AT_ordering:
2095 case -1: printf (_("(undefined)")); break;
2096 case 0: printf ("(row major)"); break;
2097 case 1: printf ("(column major)"); break;
2101 case DW_AT_frame_base:
2102 have_frame_base = 1;
2104 case DW_AT_location:
2105 case DW_AT_string_length:
2106 case DW_AT_return_addr:
2107 case DW_AT_data_member_location:
2108 case DW_AT_vtable_elem_location:
2110 case DW_AT_static_link:
2111 case DW_AT_use_location:
2112 case DW_AT_GNU_call_site_value:
2113 case DW_AT_GNU_call_site_data_value:
2114 case DW_AT_GNU_call_site_target:
2115 case DW_AT_GNU_call_site_target_clobbered:
2116 if ((dwarf_version < 4
2117 && (form == DW_FORM_data4 || form == DW_FORM_data8))
2118 || form == DW_FORM_sec_offset)
2119 printf (_(" (location list)"));
2121 case DW_AT_allocated:
2122 case DW_AT_associated:
2123 case DW_AT_data_location:
2125 case DW_AT_upper_bound:
2126 case DW_AT_lower_bound:
2129 int need_frame_base;
2132 need_frame_base = decode_location_expression (block_start,
2137 cu_offset, section);
2139 if (need_frame_base && !have_frame_base)
2140 printf (_(" [without DW_AT_frame_base]"));
2146 if (form == DW_FORM_ref_sig8
2147 || form == DW_FORM_GNU_ref_alt)
2150 if (form == DW_FORM_ref1
2151 || form == DW_FORM_ref2
2152 || form == DW_FORM_ref4
2153 || form == DW_FORM_ref_udata)
2154 uvalue += cu_offset;
2156 if (uvalue >= section->size)
2157 warn (_("Offset %s used as value for DW_AT_import attribute of DIE at offset 0x%lx is too big.\n"),
2158 dwarf_vmatoa ("x", uvalue),
2159 (unsigned long) (orig_data - section->start));
2162 unsigned long abbrev_number;
2163 abbrev_entry * entry;
2165 abbrev_number = read_uleb128 (section->start + uvalue, NULL, end);
2167 printf (_("\t[Abbrev Number: %ld"), abbrev_number);
2168 /* Don't look up abbrev for DW_FORM_ref_addr, as it very often will
2169 use different abbrev table, and we don't track .debug_info chunks
2171 if (form != DW_FORM_ref_addr)
2173 for (entry = first_abbrev; entry != NULL; entry = entry->next)
2174 if (entry->entry == abbrev_number)
2177 printf (" (%s)", get_TAG_name (entry->tag));
2192 get_AT_name (unsigned long attribute)
2197 return "DW_AT value: 0";
2199 /* One value is shared by the MIPS and HP extensions: */
2200 if (attribute == DW_AT_MIPS_fde)
2201 return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
2203 name = get_DW_AT_name (attribute);
2207 static char buffer[100];
2209 snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
2217 static unsigned char *
2218 read_and_display_attr (unsigned long attribute,
2220 unsigned char * data,
2221 unsigned char * end,
2222 dwarf_vma cu_offset,
2223 dwarf_vma pointer_size,
2224 dwarf_vma offset_size,
2226 debug_info * debug_info_p,
2228 struct dwarf_section * section,
2229 struct cu_tu_set * this_set)
2232 printf (" %-18s:", get_AT_name (attribute));
2233 data = read_and_display_attr_value (attribute, form, data, end,
2234 cu_offset, pointer_size, offset_size,
2235 dwarf_version, debug_info_p,
2236 do_loc, section, this_set);
2242 /* Process the contents of a .debug_info section. If do_loc is non-zero
2243 then we are scanning for location lists and we do not want to display
2244 anything to the user. If do_types is non-zero, we are processing
2245 a .debug_types section instead of a .debug_info section. */
2248 process_debug_info (struct dwarf_section *section,
2250 enum dwarf_section_display_enum abbrev_sec,
2254 unsigned char *start = section->start;
2255 unsigned char *end = start + section->size;
2256 unsigned char *section_begin;
2258 unsigned int num_units = 0;
2260 if ((do_loc || do_debug_loc || do_debug_ranges)
2261 && num_debug_info_entries == 0
2266 /* First scan the section to get the number of comp units. */
2267 for (section_begin = start, num_units = 0; section_begin < end;
2270 /* Read the first 4 bytes. For a 32-bit DWARF section, this
2271 will be the length. For a 64-bit DWARF section, it'll be
2272 the escape code 0xffffffff followed by an 8 byte length. */
2273 SAFE_BYTE_GET (length, section_begin, 4, end);
2275 if (length == 0xffffffff)
2277 SAFE_BYTE_GET (length, section_begin + 4, 8, end);
2278 section_begin += length + 12;
2280 else if (length >= 0xfffffff0 && length < 0xffffffff)
2282 warn (_("Reserved length value (0x%s) found in section %s\n"),
2283 dwarf_vmatoa ("x", length), section->name);
2287 section_begin += length + 4;
2289 /* Negative values are illegal, they may even cause infinite
2290 looping. This can happen if we can't accurately apply
2291 relocations to an object file, or if the file is corrupt. */
2292 if ((signed long) length <= 0 || section_begin < start)
2294 warn (_("Corrupt unit length (0x%s) found in section %s\n"),
2295 dwarf_vmatoa ("x", length), section->name);
2302 error (_("No comp units in %s section ?\n"), section->name);
2306 /* Then allocate an array to hold the information. */
2307 debug_information = (debug_info *) cmalloc (num_units,
2308 sizeof (* debug_information));
2309 if (debug_information == NULL)
2311 error (_("Not enough memory for a debug info array of %u entries\n"),
2313 alloc_num_debug_info_entries = num_debug_info_entries = 0;
2316 /* PR 17531: file: 92ca3797.
2317 We cannot rely upon the debug_information array being initialised
2318 before it is used. A corrupt file could easily contain references
2319 to a unit for which information has not been made available. So
2320 we ensure that the array is zeroed here. */
2321 memset (debug_information, 0, num_units * sizeof (*debug_information));
2323 alloc_num_debug_info_entries = num_units;
2328 if (dwarf_start_die == 0)
2329 printf (_("Contents of the %s section:\n\n"), section->name);
2331 load_debug_section (str, file);
2332 load_debug_section (str_dwo, file);
2333 load_debug_section (str_index, file);
2334 load_debug_section (str_index_dwo, file);
2335 load_debug_section (debug_addr, file);
2338 load_debug_section (abbrev_sec, file);
2339 if (debug_displays [abbrev_sec].section.start == NULL)
2341 warn (_("Unable to locate %s section!\n"),
2342 debug_displays [abbrev_sec].section.name);
2346 for (section_begin = start, unit = 0; start < end; unit++)
2348 DWARF2_Internal_CompUnit compunit;
2349 unsigned char *hdrptr;
2350 unsigned char *tags;
2351 int level, last_level, saved_level;
2352 dwarf_vma cu_offset;
2353 unsigned int offset_size;
2354 int initial_length_size;
2355 dwarf_vma signature_high = 0;
2356 dwarf_vma signature_low = 0;
2357 dwarf_vma type_offset = 0;
2358 struct cu_tu_set *this_set;
2359 dwarf_vma abbrev_base;
2364 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 4, end);
2366 if (compunit.cu_length == 0xffffffff)
2368 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 8, end);
2370 initial_length_size = 12;
2375 initial_length_size = 4;
2378 SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end);
2380 cu_offset = start - section_begin;
2382 this_set = find_cu_tu_set_v2 (cu_offset, do_types);
2384 SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
2386 if (this_set == NULL)
2389 abbrev_size = debug_displays [abbrev_sec].section.size;
2393 abbrev_base = this_set->section_offsets [DW_SECT_ABBREV];
2394 abbrev_size = this_set->section_sizes [DW_SECT_ABBREV];
2397 SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
2398 /* PR 17512: file: 001-108546-0.001:0.1. */
2399 if (compunit.cu_pointer_size < 2 || compunit.cu_pointer_size > 8)
2401 warn (_("Invalid pointer size (%d) in compunit header, using %d instead\n"),
2402 compunit.cu_pointer_size, offset_size);
2403 compunit.cu_pointer_size = offset_size;
2408 SAFE_BYTE_GET64 (hdrptr, &signature_high, &signature_low, end);
2410 SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end);
2413 if ((do_loc || do_debug_loc || do_debug_ranges)
2414 && num_debug_info_entries == 0
2417 debug_information [unit].cu_offset = cu_offset;
2418 debug_information [unit].pointer_size
2419 = compunit.cu_pointer_size;
2420 debug_information [unit].offset_size = offset_size;
2421 debug_information [unit].dwarf_version = compunit.cu_version;
2422 debug_information [unit].base_address = 0;
2423 debug_information [unit].addr_base = DEBUG_INFO_UNAVAILABLE;
2424 debug_information [unit].ranges_base = DEBUG_INFO_UNAVAILABLE;
2425 debug_information [unit].loc_offsets = NULL;
2426 debug_information [unit].have_frame_base = NULL;
2427 debug_information [unit].max_loc_offsets = 0;
2428 debug_information [unit].num_loc_offsets = 0;
2429 debug_information [unit].range_lists = NULL;
2430 debug_information [unit].max_range_lists= 0;
2431 debug_information [unit].num_range_lists = 0;
2434 if (!do_loc && dwarf_start_die == 0)
2436 printf (_(" Compilation Unit @ offset 0x%s:\n"),
2437 dwarf_vmatoa ("x", cu_offset));
2438 printf (_(" Length: 0x%s (%s)\n"),
2439 dwarf_vmatoa ("x", compunit.cu_length),
2440 offset_size == 8 ? "64-bit" : "32-bit");
2441 printf (_(" Version: %d\n"), compunit.cu_version);
2442 printf (_(" Abbrev Offset: 0x%s\n"),
2443 dwarf_vmatoa ("x", compunit.cu_abbrev_offset));
2444 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
2449 printf (_(" Signature: 0x%s\n"),
2450 dwarf_vmatoa64 (signature_high, signature_low,
2451 buf, sizeof (buf)));
2452 printf (_(" Type Offset: 0x%s\n"),
2453 dwarf_vmatoa ("x", type_offset));
2455 if (this_set != NULL)
2457 dwarf_vma *offsets = this_set->section_offsets;
2458 size_t *sizes = this_set->section_sizes;
2460 printf (_(" Section contributions:\n"));
2461 printf (_(" .debug_abbrev.dwo: 0x%s 0x%s\n"),
2462 dwarf_vmatoa ("x", offsets [DW_SECT_ABBREV]),
2463 dwarf_vmatoa ("x", sizes [DW_SECT_ABBREV]));
2464 printf (_(" .debug_line.dwo: 0x%s 0x%s\n"),
2465 dwarf_vmatoa ("x", offsets [DW_SECT_LINE]),
2466 dwarf_vmatoa ("x", sizes [DW_SECT_LINE]));
2467 printf (_(" .debug_loc.dwo: 0x%s 0x%s\n"),
2468 dwarf_vmatoa ("x", offsets [DW_SECT_LOC]),
2469 dwarf_vmatoa ("x", sizes [DW_SECT_LOC]));
2470 printf (_(" .debug_str_offsets.dwo: 0x%s 0x%s\n"),
2471 dwarf_vmatoa ("x", offsets [DW_SECT_STR_OFFSETS]),
2472 dwarf_vmatoa ("x", sizes [DW_SECT_STR_OFFSETS]));
2476 if (cu_offset + compunit.cu_length + initial_length_size
2479 warn (_("Debug info is corrupted, length of CU at %s"
2480 " extends beyond end of section (length = %s)\n"),
2481 dwarf_vmatoa ("x", cu_offset),
2482 dwarf_vmatoa ("x", compunit.cu_length));
2487 start += compunit.cu_length + initial_length_size;
2491 warn (_("Debug info is corrupt. CU at %s extends beyond end of section"),
2492 dwarf_vmatoa ("x", cu_offset));
2496 if (compunit.cu_version != 2
2497 && compunit.cu_version != 3
2498 && compunit.cu_version != 4)
2500 warn (_("CU at offset %s contains corrupt or "
2501 "unsupported version number: %d.\n"),
2502 dwarf_vmatoa ("x", cu_offset), compunit.cu_version);
2508 /* Process the abbrevs used by this compilation unit. */
2509 if (compunit.cu_abbrev_offset >= abbrev_size)
2510 warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"),
2511 (unsigned long) compunit.cu_abbrev_offset,
2512 (unsigned long) abbrev_size);
2513 /* PR 17531: file:4bcd9ce9. */
2514 else if ((abbrev_base + abbrev_size)
2515 > debug_displays [abbrev_sec].section.size)
2516 warn (_("Debug info is corrupted, abbrev size (%lx) is larger than abbrev section size (%lx)\n"),
2517 (unsigned long) abbrev_base + abbrev_size,
2518 (unsigned long) debug_displays [abbrev_sec].section.size);
2520 process_abbrev_section
2521 (((unsigned char *) debug_displays [abbrev_sec].section.start
2522 + abbrev_base + compunit.cu_abbrev_offset),
2523 ((unsigned char *) debug_displays [abbrev_sec].section.start
2524 + abbrev_base + abbrev_size));
2529 while (tags < start)
2531 unsigned int bytes_read;
2532 unsigned long abbrev_number;
2533 unsigned long die_offset;
2534 abbrev_entry *entry;
2536 int do_printing = 1;
2538 die_offset = tags - section_begin;
2540 abbrev_number = read_uleb128 (tags, & bytes_read, start);
2543 /* A null DIE marks the end of a list of siblings or it may also be
2544 a section padding. */
2545 if (abbrev_number == 0)
2547 /* Check if it can be a section padding for the last CU. */
2548 if (level == 0 && start == end)
2552 for (chk = tags; chk < start; chk++)
2559 if (!do_loc && die_offset >= dwarf_start_die
2560 && (dwarf_cutoff_level == -1
2561 || level < dwarf_cutoff_level))
2562 printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
2568 static unsigned num_bogus_warns = 0;
2570 if (num_bogus_warns < 3)
2572 warn (_("Bogus end-of-siblings marker detected at offset %lx in %s section\n"),
2573 die_offset, section->name);
2575 if (num_bogus_warns == 3)
2576 warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
2579 if (dwarf_start_die != 0 && level < saved_level)
2586 if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
2590 if (dwarf_start_die != 0 && die_offset == dwarf_start_die)
2591 saved_level = level;
2592 do_printing = (dwarf_cutoff_level == -1
2593 || level < dwarf_cutoff_level);
2595 printf (_(" <%d><%lx>: Abbrev Number: %lu"),
2596 level, die_offset, abbrev_number);
2597 else if (dwarf_cutoff_level == -1
2598 || last_level < dwarf_cutoff_level)
2599 printf (_(" <%d><%lx>: ...\n"), level, die_offset);
2604 /* Scan through the abbreviation list until we reach the
2606 for (entry = first_abbrev;
2607 entry && entry->entry != abbrev_number;
2608 entry = entry->next)
2613 if (!do_loc && do_printing)
2618 warn (_("DIE at offset 0x%lx refers to abbreviation number %lu which does not exist\n"),
2619 die_offset, abbrev_number);
2623 if (!do_loc && do_printing)
2624 printf (" (%s)\n", get_TAG_name (entry->tag));
2629 need_base_address = 0;
2631 case DW_TAG_compile_unit:
2632 need_base_address = 1;
2634 case DW_TAG_entry_point:
2635 case DW_TAG_subprogram:
2636 need_base_address = 0;
2637 /* Assuming that there is no DW_AT_frame_base. */
2638 have_frame_base = 0;
2642 for (attr = entry->first_attr;
2643 attr && attr->attribute;
2648 if (! do_loc && do_printing)
2649 /* Show the offset from where the tag was extracted. */
2650 printf (" <%lx>", (unsigned long)(tags - section_begin));
2652 if (debug_information && unit < alloc_num_debug_info_entries)
2653 arg = debug_information + unit;
2657 tags = read_and_display_attr (attr->attribute,
2662 compunit.cu_pointer_size,
2664 compunit.cu_version,
2666 do_loc || ! do_printing,
2671 if (entry->children)
2676 /* Set num_debug_info_entries here so that it can be used to check if
2677 we need to process .debug_loc and .debug_ranges sections. */
2678 if ((do_loc || do_debug_loc || do_debug_ranges)
2679 && num_debug_info_entries == 0
2682 if (num_units > alloc_num_debug_info_entries)
2683 num_debug_info_entries = alloc_num_debug_info_entries;
2685 num_debug_info_entries = num_units;
2694 /* Locate and scan the .debug_info section in the file and record the pointer
2695 sizes and offsets for the compilation units in it. Usually an executable
2696 will have just one pointer size, but this is not guaranteed, and so we try
2697 not to make any assumptions. Returns zero upon failure, or the number of
2698 compilation units upon success. */
2701 load_debug_info (void * file)
2703 /* Reset the last pointer size so that we can issue correct error
2704 messages if we are displaying the contents of more than one section. */
2705 last_pointer_size = 0;
2706 warned_about_missing_comp_units = FALSE;
2708 /* If we have already tried and failed to load the .debug_info
2709 section then do not bother to repeat the task. */
2710 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
2713 /* If we already have the information there is nothing else to do. */
2714 if (num_debug_info_entries > 0)
2715 return num_debug_info_entries;
2717 /* If this is a DWARF package file, load the CU and TU indexes. */
2718 load_cu_tu_indexes (file);
2720 if (load_debug_section (info, file)
2721 && process_debug_info (&debug_displays [info].section, file, abbrev, 1, 0))
2722 return num_debug_info_entries;
2724 if (load_debug_section (info_dwo, file)
2725 && process_debug_info (&debug_displays [info_dwo].section, file,
2727 return num_debug_info_entries;
2729 num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
2733 /* Read a DWARF .debug_line section header starting at DATA.
2734 Upon success returns an updated DATA pointer and the LINFO
2735 structure and the END_OF_SEQUENCE pointer will be filled in.
2736 Otherwise returns NULL. */
2738 static unsigned char *
2739 read_debug_line_header (struct dwarf_section * section,
2740 unsigned char * data,
2741 unsigned char * end,
2742 DWARF2_Internal_LineInfo * linfo,
2743 unsigned char ** end_of_sequence)
2745 unsigned char *hdrptr;
2746 unsigned int offset_size;
2747 unsigned int initial_length_size;
2749 /* Extract information from the Line Number Program Header.
2750 (section 6.2.4 in the Dwarf3 doc). */
2753 /* Get and check the length of the block. */
2754 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 4, end);
2756 if (linfo->li_length == 0xffffffff)
2758 /* This section is 64-bit DWARF 3. */
2759 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 8, end);
2761 initial_length_size = 12;
2766 initial_length_size = 4;
2769 if (linfo->li_length + initial_length_size > section->size)
2771 /* If the length field has a relocation against it, then we should
2772 not complain if it is inaccurate (and probably negative). This
2773 happens in object files when the .debug_line section is actually
2774 comprised of several different .debug_line.* sections, (some of
2775 which may be removed by linker garbage collection), and a relocation
2776 is used to compute the correct length once that is done. */
2777 if (reloc_at (section, (hdrptr - section->start) - offset_size))
2779 linfo->li_length = (end - data) - initial_length_size;
2783 warn (_("The length field (0x%lx) in the debug_line header is wrong - the section is too small\n"),
2784 (long) linfo->li_length);
2789 /* Get and check the version number. */
2790 SAFE_BYTE_GET_AND_INC (linfo->li_version, hdrptr, 2, end);
2792 if (linfo->li_version != 2
2793 && linfo->li_version != 3
2794 && linfo->li_version != 4)
2796 warn (_("Only DWARF version 2, 3 and 4 line info is currently supported.\n"));
2800 SAFE_BYTE_GET_AND_INC (linfo->li_prologue_length, hdrptr, offset_size, end);
2801 SAFE_BYTE_GET_AND_INC (linfo->li_min_insn_length, hdrptr, 1, end);
2803 if (linfo->li_version >= 4)
2805 SAFE_BYTE_GET_AND_INC (linfo->li_max_ops_per_insn, hdrptr, 1, end);
2807 if (linfo->li_max_ops_per_insn == 0)
2809 warn (_("Invalid maximum operations per insn.\n"));
2814 linfo->li_max_ops_per_insn = 1;
2816 SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end);
2817 SAFE_SIGNED_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
2818 SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end);
2819 SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end);
2821 * end_of_sequence = data + linfo->li_length + initial_length_size;
2822 /* PR 17512: file:002-117414-0.004. */
2823 if (* end_of_sequence > end)
2825 warn (_("Line length %s extends beyond end of section\n"),
2826 dwarf_vmatoa ("u", linfo->li_length));
2827 * end_of_sequence = end;
2835 display_debug_lines_raw (struct dwarf_section *section,
2836 unsigned char *data,
2839 unsigned char *start = section->start;
2841 printf (_("Raw dump of debug contents of section %s:\n\n"),
2846 static DWARF2_Internal_LineInfo saved_linfo;
2847 DWARF2_Internal_LineInfo linfo;
2848 unsigned char *standard_opcodes;
2849 unsigned char *end_of_sequence;
2850 unsigned int last_dir_entry = 0;
2853 if (const_strneq (section->name, ".debug_line.")
2854 /* Note: the following does not apply to .debug_line.dwo sections.
2855 These are full debug_line sections. */
2856 && strcmp (section->name, ".debug_line.dwo") != 0)
2858 /* Sections named .debug_line.<foo> are fragments of a .debug_line
2859 section containing just the Line Number Statements. They are
2860 created by the assembler and intended to be used alongside gcc's
2861 -ffunction-sections command line option. When the linker's
2862 garbage collection decides to discard a .text.<foo> section it
2863 can then also discard the line number information in .debug_line.<foo>.
2865 Since the section is a fragment it does not have the details
2866 needed to fill out a LineInfo structure, so instead we use the
2867 details from the last full debug_line section that we processed. */
2868 end_of_sequence = end;
2869 standard_opcodes = NULL;
2870 linfo = saved_linfo;
2871 /* PR 17531: file: 0522b371. */
2872 if (linfo.li_line_range == 0)
2874 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
2877 reset_state_machine (linfo.li_default_is_stmt);
2881 unsigned char * hdrptr;
2883 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
2884 & end_of_sequence)) == NULL)
2887 printf (_(" Offset: 0x%lx\n"), (long)(data - start));
2888 printf (_(" Length: %ld\n"), (long) linfo.li_length);
2889 printf (_(" DWARF Version: %d\n"), linfo.li_version);
2890 printf (_(" Prologue Length: %d\n"), (int) linfo.li_prologue_length);
2891 printf (_(" Minimum Instruction Length: %d\n"), linfo.li_min_insn_length);
2892 if (linfo.li_version >= 4)
2893 printf (_(" Maximum Ops per Instruction: %d\n"), linfo.li_max_ops_per_insn);
2894 printf (_(" Initial value of 'is_stmt': %d\n"), linfo.li_default_is_stmt);
2895 printf (_(" Line Base: %d\n"), linfo.li_line_base);
2896 printf (_(" Line Range: %d\n"), linfo.li_line_range);
2897 printf (_(" Opcode Base: %d\n"), linfo.li_opcode_base);
2899 /* PR 17512: file: 1665-6428-0.004. */
2900 if (linfo.li_line_range == 0)
2902 warn (_("Line range of 0 is invalid, using 1 instead\n"));
2903 linfo.li_line_range = 1;
2906 reset_state_machine (linfo.li_default_is_stmt);
2908 /* Display the contents of the Opcodes table. */
2909 standard_opcodes = hdrptr;
2911 /* PR 17512: file: 002-417945-0.004. */
2912 if (standard_opcodes + linfo.li_opcode_base >= end)
2914 warn (_("Line Base extends beyond end of section\n"));
2918 printf (_("\n Opcodes:\n"));
2920 for (i = 1; i < linfo.li_opcode_base; i++)
2921 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
2923 /* Display the contents of the Directory table. */
2924 data = standard_opcodes + linfo.li_opcode_base - 1;
2927 printf (_("\n The Directory Table is empty.\n"));
2930 printf (_("\n The Directory Table (offset 0x%lx):\n"),
2931 (long)(data - start));
2933 while (data < end && *data != 0)
2935 printf (" %d\t%.*s\n", ++last_dir_entry, (int) (end - data), data);
2937 data += strnlen ((char *) data, end - data) + 1;
2940 /* PR 17512: file: 002-132094-0.004. */
2941 if (data >= end - 1)
2945 /* Skip the NUL at the end of the table. */
2948 /* Display the contents of the File Name table. */
2950 printf (_("\n The File Name Table is empty.\n"));
2953 printf (_("\n The File Name Table (offset 0x%lx):\n"),
2954 (long)(data - start));
2955 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
2957 while (data < end && *data != 0)
2959 unsigned char *name;
2960 unsigned int bytes_read;
2962 printf (" %d\t", ++state_machine_regs.last_file_entry);
2964 data += strnlen ((char *) data, end - data) + 1;
2967 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2970 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2973 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2975 printf ("%.*s\n", (int)(end - name), name);
2979 warn (_("Corrupt file name table entry\n"));
2985 /* Skip the NUL at the end of the table. */
2988 saved_linfo = linfo;
2991 /* Now display the statements. */
2992 if (data >= end_of_sequence)
2993 printf (_(" No Line Number Statements.\n"));
2996 printf (_(" Line Number Statements:\n"));
2998 while (data < end_of_sequence)
3000 unsigned char op_code;
3001 dwarf_signed_vma adv;
3003 unsigned int bytes_read;
3005 printf (" [0x%08lx]", (long)(data - start));
3009 if (op_code >= linfo.li_opcode_base)
3011 op_code -= linfo.li_opcode_base;
3012 uladv = (op_code / linfo.li_line_range);
3013 if (linfo.li_max_ops_per_insn == 1)
3015 uladv *= linfo.li_min_insn_length;
3016 state_machine_regs.address += uladv;
3017 printf (_(" Special opcode %d: "
3018 "advance Address by %s to 0x%s"),
3019 op_code, dwarf_vmatoa ("u", uladv),
3020 dwarf_vmatoa ("x", state_machine_regs.address));
3024 state_machine_regs.address
3025 += ((state_machine_regs.op_index + uladv)
3026 / linfo.li_max_ops_per_insn)
3027 * linfo.li_min_insn_length;
3028 state_machine_regs.op_index
3029 = (state_machine_regs.op_index + uladv)
3030 % linfo.li_max_ops_per_insn;
3031 printf (_(" Special opcode %d: "
3032 "advance Address by %s to 0x%s[%d]"),
3033 op_code, dwarf_vmatoa ("u", uladv),
3034 dwarf_vmatoa ("x", state_machine_regs.address),
3035 state_machine_regs.op_index);
3037 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
3038 state_machine_regs.line += adv;
3039 printf (_(" and Line by %s to %d\n"),
3040 dwarf_vmatoa ("d", adv), state_machine_regs.line);
3042 else switch (op_code)
3044 case DW_LNS_extended_op:
3045 data += process_extended_line_op (data, linfo.li_default_is_stmt, end);
3049 printf (_(" Copy\n"));
3052 case DW_LNS_advance_pc:
3053 uladv = read_uleb128 (data, & bytes_read, end);
3055 if (linfo.li_max_ops_per_insn == 1)
3057 uladv *= linfo.li_min_insn_length;
3058 state_machine_regs.address += uladv;
3059 printf (_(" Advance PC by %s to 0x%s\n"),
3060 dwarf_vmatoa ("u", uladv),
3061 dwarf_vmatoa ("x", state_machine_regs.address));
3065 state_machine_regs.address
3066 += ((state_machine_regs.op_index + uladv)
3067 / linfo.li_max_ops_per_insn)
3068 * linfo.li_min_insn_length;
3069 state_machine_regs.op_index
3070 = (state_machine_regs.op_index + uladv)
3071 % linfo.li_max_ops_per_insn;
3072 printf (_(" Advance PC by %s to 0x%s[%d]\n"),
3073 dwarf_vmatoa ("u", uladv),
3074 dwarf_vmatoa ("x", state_machine_regs.address),
3075 state_machine_regs.op_index);
3079 case DW_LNS_advance_line:
3080 adv = read_sleb128 (data, & bytes_read, end);
3082 state_machine_regs.line += adv;
3083 printf (_(" Advance Line by %s to %d\n"),
3084 dwarf_vmatoa ("d", adv),
3085 state_machine_regs.line);
3088 case DW_LNS_set_file:
3089 adv = read_uleb128 (data, & bytes_read, end);
3091 printf (_(" Set File Name to entry %s in the File Name Table\n"),
3092 dwarf_vmatoa ("d", adv));
3093 state_machine_regs.file = adv;
3096 case DW_LNS_set_column:
3097 uladv = read_uleb128 (data, & bytes_read, end);
3099 printf (_(" Set column to %s\n"),
3100 dwarf_vmatoa ("u", uladv));
3101 state_machine_regs.column = uladv;
3104 case DW_LNS_negate_stmt:
3105 adv = state_machine_regs.is_stmt;
3107 printf (_(" Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv));
3108 state_machine_regs.is_stmt = adv;
3111 case DW_LNS_set_basic_block:
3112 printf (_(" Set basic block\n"));
3113 state_machine_regs.basic_block = 1;
3116 case DW_LNS_const_add_pc:
3117 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
3118 if (linfo.li_max_ops_per_insn)
3120 uladv *= linfo.li_min_insn_length;
3121 state_machine_regs.address += uladv;
3122 printf (_(" Advance PC by constant %s to 0x%s\n"),
3123 dwarf_vmatoa ("u", uladv),
3124 dwarf_vmatoa ("x", state_machine_regs.address));
3128 state_machine_regs.address
3129 += ((state_machine_regs.op_index + uladv)
3130 / linfo.li_max_ops_per_insn)
3131 * linfo.li_min_insn_length;
3132 state_machine_regs.op_index
3133 = (state_machine_regs.op_index + uladv)
3134 % linfo.li_max_ops_per_insn;
3135 printf (_(" Advance PC by constant %s to 0x%s[%d]\n"),
3136 dwarf_vmatoa ("u", uladv),
3137 dwarf_vmatoa ("x", state_machine_regs.address),
3138 state_machine_regs.op_index);
3142 case DW_LNS_fixed_advance_pc:
3143 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
3144 state_machine_regs.address += uladv;
3145 state_machine_regs.op_index = 0;
3146 printf (_(" Advance PC by fixed size amount %s to 0x%s\n"),
3147 dwarf_vmatoa ("u", uladv),
3148 dwarf_vmatoa ("x", state_machine_regs.address));
3151 case DW_LNS_set_prologue_end:
3152 printf (_(" Set prologue_end to true\n"));
3155 case DW_LNS_set_epilogue_begin:
3156 printf (_(" Set epilogue_begin to true\n"));
3159 case DW_LNS_set_isa:
3160 uladv = read_uleb128 (data, & bytes_read, end);
3162 printf (_(" Set ISA to %s\n"), dwarf_vmatoa ("u", uladv));
3166 printf (_(" Unknown opcode %d with operands: "), op_code);
3168 if (standard_opcodes != NULL)
3169 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
3171 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
3173 i == 1 ? "" : ", ");
3189 unsigned char *name;
3190 unsigned int directory_index;
3191 unsigned int modification_date;
3192 unsigned int length;
3195 /* Output a decoded representation of the .debug_line section. */
3198 display_debug_lines_decoded (struct dwarf_section *section,
3199 unsigned char *data,
3202 static DWARF2_Internal_LineInfo saved_linfo;
3204 printf (_("Decoded dump of debug contents of section %s:\n\n"),
3209 /* This loop amounts to one iteration per compilation unit. */
3210 DWARF2_Internal_LineInfo linfo;
3211 unsigned char *standard_opcodes;
3212 unsigned char *end_of_sequence;
3214 File_Entry *file_table = NULL;
3215 unsigned int n_files = 0;
3216 unsigned char **directory_table = NULL;
3217 unsigned int n_directories = 0;
3219 if (const_strneq (section->name, ".debug_line.")
3220 /* Note: the following does not apply to .debug_line.dwo sections.
3221 These are full debug_line sections. */
3222 && strcmp (section->name, ".debug_line.dwo") != 0)
3224 /* See comment in display_debug_lines_raw(). */
3225 end_of_sequence = end;
3226 standard_opcodes = NULL;
3227 linfo = saved_linfo;
3228 /* PR 17531: file: 0522b371. */
3229 if (linfo.li_line_range == 0)
3231 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
3234 reset_state_machine (linfo.li_default_is_stmt);
3238 unsigned char *hdrptr;
3240 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
3241 & end_of_sequence)) == NULL)
3244 /* PR 17531: file: 0522b371. */
3245 if (linfo.li_line_range == 0)
3247 warn (_("Line range of 0 is invalid, using 1 instead\n"));
3248 linfo.li_line_range = 1;
3250 reset_state_machine (linfo.li_default_is_stmt);
3252 /* Save a pointer to the contents of the Opcodes table. */
3253 standard_opcodes = hdrptr;
3255 /* Traverse the Directory table just to count entries. */
3256 data = standard_opcodes + linfo.li_opcode_base - 1;
3260 warn (_("opcode base of %d extends beyond end of section\n"),
3261 linfo.li_opcode_base);
3267 unsigned char *ptr_directory_table = data;
3269 while (data < end && *data != 0)
3271 data += strnlen ((char *) data, end - data) + 1;
3278 warn (_("directory table ends unexpectedly\n"));
3283 /* Go through the directory table again to save the directories. */
3284 directory_table = (unsigned char **)
3285 xmalloc (n_directories * sizeof (unsigned char *));
3288 while (*ptr_directory_table != 0)
3290 directory_table[i] = ptr_directory_table;
3291 ptr_directory_table += strnlen ((char *) ptr_directory_table,
3292 ptr_directory_table - end) + 1;
3296 /* Skip the NUL at the end of the table. */
3299 /* Traverse the File Name table just to count the entries. */
3300 if (data < end && *data != 0)
3302 unsigned char *ptr_file_name_table = data;
3304 while (data < end && *data != 0)
3306 unsigned int bytes_read;
3308 /* Skip Name, directory index, last modification time and length
3310 data += strnlen ((char *) data, end - data) + 1;
3311 read_uleb128 (data, & bytes_read, end);
3313 read_uleb128 (data, & bytes_read, end);
3315 read_uleb128 (data, & bytes_read, end);
3323 warn (_("file table ends unexpectedly\n"));
3328 /* Go through the file table again to save the strings. */
3329 file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
3332 while (*ptr_file_name_table != 0)
3334 unsigned int bytes_read;
3336 file_table[i].name = ptr_file_name_table;
3337 ptr_file_name_table += strnlen ((char *) ptr_file_name_table,
3338 end - ptr_file_name_table) + 1;
3340 /* We are not interested in directory, time or size. */
3341 file_table[i].directory_index = read_uleb128 (ptr_file_name_table,
3343 ptr_file_name_table += bytes_read;
3344 file_table[i].modification_date = read_uleb128 (ptr_file_name_table,
3346 ptr_file_name_table += bytes_read;
3347 file_table[i].length = read_uleb128 (ptr_file_name_table, & bytes_read, end);
3348 ptr_file_name_table += bytes_read;
3353 /* Print the Compilation Unit's name and a header. */
3354 if (directory_table == NULL)
3356 printf (_("CU: %s:\n"), file_table[0].name);
3357 printf (_("File name Line number Starting address\n"));
3361 unsigned int ix = file_table[0].directory_index;
3362 const char *directory;
3367 else if (n_directories == 0)
3368 directory = _("<unknown>");
3369 else if (ix > n_directories)
3371 warn (_("directory index %u > number of directories %u\n"), ix, n_directories);
3372 directory = _("<corrupt>");
3375 directory = (char *) directory_table[ix - 1];
3377 if (do_wide || strlen (directory) < 76)
3378 printf (_("CU: %s/%s:\n"), directory, file_table[0].name);
3380 printf ("%s:\n", file_table[0].name);
3382 printf (_("File name Line number Starting address\n"));
3386 /* Skip the NUL at the end of the table. */
3389 saved_linfo = linfo;
3392 /* This loop iterates through the Dwarf Line Number Program. */
3393 while (data < end_of_sequence)
3395 unsigned char op_code;
3397 unsigned long int uladv;
3398 unsigned int bytes_read;
3399 int is_special_opcode = 0;
3403 if (op_code >= linfo.li_opcode_base)
3405 op_code -= linfo.li_opcode_base;
3406 uladv = (op_code / linfo.li_line_range);
3407 if (linfo.li_max_ops_per_insn == 1)
3409 uladv *= linfo.li_min_insn_length;
3410 state_machine_regs.address += uladv;
3414 state_machine_regs.address
3415 += ((state_machine_regs.op_index + uladv)
3416 / linfo.li_max_ops_per_insn)
3417 * linfo.li_min_insn_length;
3418 state_machine_regs.op_index
3419 = (state_machine_regs.op_index + uladv)
3420 % linfo.li_max_ops_per_insn;
3423 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
3424 state_machine_regs.line += adv;
3425 is_special_opcode = 1;
3427 else switch (op_code)
3429 case DW_LNS_extended_op:
3431 unsigned int ext_op_code_len;
3432 unsigned char ext_op_code;
3433 unsigned char *op_code_data = data;
3435 ext_op_code_len = read_uleb128 (op_code_data, &bytes_read,
3437 op_code_data += bytes_read;
3439 if (ext_op_code_len == 0)
3441 warn (_("Badly formed extended line op encountered!\n"));
3444 ext_op_code_len += bytes_read;
3445 ext_op_code = *op_code_data++;
3447 switch (ext_op_code)
3449 case DW_LNE_end_sequence:
3450 reset_state_machine (linfo.li_default_is_stmt);
3452 case DW_LNE_set_address:
3453 SAFE_BYTE_GET_AND_INC (state_machine_regs.address,
3455 ext_op_code_len - bytes_read - 1,
3457 state_machine_regs.op_index = 0;
3459 case DW_LNE_define_file:
3461 file_table = (File_Entry *) xrealloc
3462 (file_table, (n_files + 1) * sizeof (File_Entry));
3464 ++state_machine_regs.last_file_entry;
3465 /* Source file name. */
3466 file_table[n_files].name = op_code_data;
3467 op_code_data += strlen ((char *) op_code_data) + 1;
3468 /* Directory index. */
3469 file_table[n_files].directory_index =
3470 read_uleb128 (op_code_data, & bytes_read,
3472 op_code_data += bytes_read;
3473 /* Last modification time. */
3474 file_table[n_files].modification_date =
3475 read_uleb128 (op_code_data, & bytes_read,
3477 op_code_data += bytes_read;
3479 file_table[n_files].length =
3480 read_uleb128 (op_code_data, & bytes_read,
3486 case DW_LNE_set_discriminator:
3487 case DW_LNE_HP_set_sequence:
3488 /* Simply ignored. */
3492 printf (_("UNKNOWN (%u): length %d\n"),
3493 ext_op_code, ext_op_code_len - bytes_read);
3496 data += ext_op_code_len;
3502 case DW_LNS_advance_pc:
3503 uladv = read_uleb128 (data, & bytes_read, end);
3505 if (linfo.li_max_ops_per_insn == 1)
3507 uladv *= linfo.li_min_insn_length;
3508 state_machine_regs.address += uladv;
3512 state_machine_regs.address
3513 += ((state_machine_regs.op_index + uladv)
3514 / linfo.li_max_ops_per_insn)
3515 * linfo.li_min_insn_length;
3516 state_machine_regs.op_index
3517 = (state_machine_regs.op_index + uladv)
3518 % linfo.li_max_ops_per_insn;
3522 case DW_LNS_advance_line:
3523 adv = read_sleb128 (data, & bytes_read, end);
3525 state_machine_regs.line += adv;
3528 case DW_LNS_set_file:
3529 adv = read_uleb128 (data, & bytes_read, end);
3531 state_machine_regs.file = adv;
3534 unsigned file = state_machine_regs.file - 1;
3537 if (file_table == NULL || n_files == 0)
3538 printf (_("\n [Use file table entry %d]\n"), file);
3540 else if (file >= n_files)
3542 warn (_("file index %u > number of files %u\n"), file + 1, n_files);
3543 printf (_("\n <over large file table index %u>"), file);
3545 else if ((dir = file_table[file].directory_index) == 0)
3546 /* If directory index is 0, that means current directory. */
3547 printf ("\n./%s:[++]\n", file_table[file].name);
3548 else if (directory_table == NULL || n_directories == 0)
3549 printf (_("\n [Use file %s in directory table entry %d]\n"),
3550 file_table[file].name, dir);
3552 else if (dir > n_directories)
3554 warn (_("directory index %u > number of directories %u\n"), dir, n_directories);
3555 printf (_("\n <over large directory table entry %u>\n"), dir);
3558 printf ("\n%s/%s:\n",
3559 /* The directory index starts counting at 1. */
3560 directory_table[dir - 1], file_table[file].name);
3564 case DW_LNS_set_column:
3565 uladv = read_uleb128 (data, & bytes_read, end);
3567 state_machine_regs.column = uladv;
3570 case DW_LNS_negate_stmt:
3571 adv = state_machine_regs.is_stmt;
3573 state_machine_regs.is_stmt = adv;
3576 case DW_LNS_set_basic_block:
3577 state_machine_regs.basic_block = 1;
3580 case DW_LNS_const_add_pc:
3581 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
3582 if (linfo.li_max_ops_per_insn == 1)
3584 uladv *= linfo.li_min_insn_length;
3585 state_machine_regs.address += uladv;
3589 state_machine_regs.address
3590 += ((state_machine_regs.op_index + uladv)
3591 / linfo.li_max_ops_per_insn)
3592 * linfo.li_min_insn_length;
3593 state_machine_regs.op_index
3594 = (state_machine_regs.op_index + uladv)
3595 % linfo.li_max_ops_per_insn;
3599 case DW_LNS_fixed_advance_pc:
3600 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
3601 state_machine_regs.address += uladv;
3602 state_machine_regs.op_index = 0;
3605 case DW_LNS_set_prologue_end:
3608 case DW_LNS_set_epilogue_begin:
3611 case DW_LNS_set_isa:
3612 uladv = read_uleb128 (data, & bytes_read, end);
3614 printf (_(" Set ISA to %lu\n"), uladv);
3618 printf (_(" Unknown opcode %d with operands: "), op_code);
3620 if (standard_opcodes != NULL)
3621 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
3623 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
3625 i == 1 ? "" : ", ");
3632 /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
3633 to the DWARF address/line matrix. */
3634 if ((is_special_opcode) || (op_code == DW_LNE_end_sequence)
3635 || (op_code == DW_LNS_copy))
3637 const unsigned int MAX_FILENAME_LENGTH = 35;
3639 char *newFileName = NULL;
3640 size_t fileNameLength;
3644 unsigned indx = state_machine_regs.file - 1;
3646 if (indx >= n_files)
3648 warn (_("corrupt file index %u encountered\n"), indx);
3649 fileName = _("<corrupt>");
3652 fileName = (char *) file_table[indx].name;
3655 fileName = _("<unknown>");
3657 fileNameLength = strlen (fileName);
3659 if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
3661 newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
3662 /* Truncate file name */
3663 strncpy (newFileName,
3664 fileName + fileNameLength - MAX_FILENAME_LENGTH,
3665 MAX_FILENAME_LENGTH + 1);
3669 newFileName = (char *) xmalloc (fileNameLength + 1);
3670 strncpy (newFileName, fileName, fileNameLength + 1);
3673 if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
3675 if (linfo.li_max_ops_per_insn == 1)
3676 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x\n",
3677 newFileName, state_machine_regs.line,
3678 state_machine_regs.address);
3680 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x[%d]\n",
3681 newFileName, state_machine_regs.line,
3682 state_machine_regs.address,
3683 state_machine_regs.op_index);
3687 if (linfo.li_max_ops_per_insn == 1)
3688 printf ("%s %11d %#18" DWARF_VMA_FMT "x\n",
3689 newFileName, state_machine_regs.line,
3690 state_machine_regs.address);
3692 printf ("%s %11d %#18" DWARF_VMA_FMT "x[%d]\n",
3693 newFileName, state_machine_regs.line,
3694 state_machine_regs.address,
3695 state_machine_regs.op_index);
3698 if (op_code == DW_LNE_end_sequence)
3712 if (directory_table)
3714 free (directory_table);
3715 directory_table = NULL;
3726 display_debug_lines (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
3728 unsigned char *data = section->start;
3729 unsigned char *end = data + section->size;
3731 int retValDecoded = 1;
3733 if (do_debug_lines == 0)
3734 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
3736 if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
3737 retValRaw = display_debug_lines_raw (section, data, end);
3739 if (do_debug_lines & FLAG_DEBUG_LINES_DECODED)
3740 retValDecoded = display_debug_lines_decoded (section, data, end);
3742 if (!retValRaw || !retValDecoded)
3749 find_debug_info_for_offset (unsigned long offset)
3753 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
3756 for (i = 0; i < num_debug_info_entries; i++)
3757 if (debug_information[i].cu_offset == offset)
3758 return debug_information + i;
3764 get_gdb_index_symbol_kind_name (gdb_index_symbol_kind kind)
3766 /* See gdb/gdb-index.h. */
3767 static const char * const kinds[] =
3779 return _ (kinds[kind]);
3783 display_debug_pubnames_worker (struct dwarf_section *section,
3784 void *file ATTRIBUTE_UNUSED,
3787 DWARF2_Internal_PubNames names;
3788 unsigned char *start = section->start;
3789 unsigned char *end = start + section->size;
3791 /* It does not matter if this load fails,
3792 we test for that later on. */
3793 load_debug_info (file);
3795 printf (_("Contents of the %s section:\n\n"), section->name);
3799 unsigned char *data;
3802 unsigned int offset_size, initial_length_size;
3806 SAFE_BYTE_GET_AND_INC (names.pn_length, data, 4, end);
3807 if (names.pn_length == 0xffffffff)
3809 SAFE_BYTE_GET_AND_INC (names.pn_length, data, 8, end);
3811 initial_length_size = 12;
3816 initial_length_size = 4;
3819 SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end);
3820 SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end);
3822 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
3823 && num_debug_info_entries > 0
3824 && find_debug_info_for_offset (names.pn_offset) == NULL)
3825 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
3826 (unsigned long) names.pn_offset, section->name);
3828 SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, end);
3830 adr = start + names.pn_length + initial_length_size;
3831 /* PR 17531: file: 7615b6b2. */
3832 if ((dwarf_signed_vma) names.pn_length < 0
3833 /* PR 17531: file: a5dbeaa7. */
3836 warn (_("Negative length for public name: 0x%lx\n"), (long) names.pn_length);
3842 printf (_(" Length: %ld\n"),
3843 (long) names.pn_length);
3844 printf (_(" Version: %d\n"),
3846 printf (_(" Offset into .debug_info section: 0x%lx\n"),
3847 (unsigned long) names.pn_offset);
3848 printf (_(" Size of area in .debug_info section: %ld\n"),
3849 (long) names.pn_size);
3851 if (names.pn_version != 2 && names.pn_version != 3)
3853 static int warned = 0;
3857 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
3865 printf (_("\n Offset Kind Name\n"));
3867 printf (_("\n Offset\tName\n"));
3871 bfd_size_type maxprint;
3873 SAFE_BYTE_GET (offset, data, offset_size, end);
3877 data += offset_size;
3880 maxprint = (end - data) - 1;
3884 unsigned int kind_data;
3885 gdb_index_symbol_kind kind;
3886 const char *kind_name;
3889 SAFE_BYTE_GET (kind_data, data, 1, end);
3892 /* GCC computes the kind as the upper byte in the CU index
3893 word, and then right shifts it by the CU index size.
3894 Left shift KIND to where the gdb-index.h accessor macros
3896 kind_data <<= GDB_INDEX_CU_BITSIZE;
3897 kind = GDB_INDEX_SYMBOL_KIND_VALUE (kind_data);
3898 kind_name = get_gdb_index_symbol_kind_name (kind);
3899 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (kind_data);
3900 printf (" %-6lx %s,%-10s %.*s\n",
3901 (unsigned long) offset, is_static ? _("s") : _("g"),
3902 kind_name, (int) maxprint, data);
3905 printf (" %-6lx\t%.*s\n",
3906 (unsigned long) offset, (int) maxprint, data);
3908 data += strnlen ((char *) data, maxprint) + 1;
3913 while (offset != 0);
3921 display_debug_pubnames (struct dwarf_section *section, void *file)
3923 return display_debug_pubnames_worker (section, file, 0);
3927 display_debug_gnu_pubnames (struct dwarf_section *section, void *file)
3929 return display_debug_pubnames_worker (section, file, 1);
3933 display_debug_macinfo (struct dwarf_section *section,
3934 void *file ATTRIBUTE_UNUSED)
3936 unsigned char *start = section->start;
3937 unsigned char *end = start + section->size;
3938 unsigned char *curr = start;
3939 unsigned int bytes_read;
3940 enum dwarf_macinfo_record_type op;
3942 printf (_("Contents of the %s section:\n\n"), section->name);
3946 unsigned int lineno;
3947 const unsigned char *string;
3949 op = (enum dwarf_macinfo_record_type) *curr;
3954 case DW_MACINFO_start_file:
3956 unsigned int filenum;
3958 lineno = read_uleb128 (curr, & bytes_read, end);
3960 filenum = read_uleb128 (curr, & bytes_read, end);
3963 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
3968 case DW_MACINFO_end_file:
3969 printf (_(" DW_MACINFO_end_file\n"));
3972 case DW_MACINFO_define:
3973 lineno = read_uleb128 (curr, & bytes_read, end);
3976 curr += strnlen ((char *) string, end - string) + 1;
3977 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
3981 case DW_MACINFO_undef:
3982 lineno = read_uleb128 (curr, & bytes_read, end);
3985 curr += strnlen ((char *) string, end - string) + 1;
3986 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
3990 case DW_MACINFO_vendor_ext:
3992 unsigned int constant;
3994 constant = read_uleb128 (curr, & bytes_read, end);
3997 curr += strnlen ((char *) string, end - string) + 1;
3998 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
4008 /* Given LINE_OFFSET into the .debug_line section, attempt to return
4009 filename and dirname corresponding to file name table entry with index
4010 FILEIDX. Return NULL on failure. */
4012 static unsigned char *
4013 get_line_filename_and_dirname (dwarf_vma line_offset,
4015 unsigned char **dir_name)
4017 struct dwarf_section *section = &debug_displays [line].section;
4018 unsigned char *hdrptr, *dirtable, *file_name;
4019 unsigned int offset_size, initial_length_size;
4020 unsigned int version, opcode_base, bytes_read;
4021 dwarf_vma length, diridx;
4022 const unsigned char * end;
4025 if (section->start == NULL
4026 || line_offset >= section->size
4030 hdrptr = section->start + line_offset;
4031 end = section->start + section->size;
4033 SAFE_BYTE_GET_AND_INC (length, hdrptr, 4, end);
4034 if (length == 0xffffffff)
4036 /* This section is 64-bit DWARF 3. */
4037 SAFE_BYTE_GET_AND_INC (length, hdrptr, 8, end);
4039 initial_length_size = 12;
4044 initial_length_size = 4;
4046 if (length + initial_length_size > section->size)
4049 SAFE_BYTE_GET_AND_INC (version, hdrptr, 2, end);
4050 if (version != 2 && version != 3 && version != 4)
4052 hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length. */
4054 hdrptr++; /* Skip max_ops_per_insn. */
4055 hdrptr += 3; /* Skip default_is_stmt, line_base, line_range. */
4057 SAFE_BYTE_GET_AND_INC (opcode_base, hdrptr, 1, end);
4058 if (opcode_base == 0)
4061 hdrptr += opcode_base - 1;
4063 /* Skip over dirname table. */
4064 while (*hdrptr != '\0')
4065 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
4066 hdrptr++; /* Skip the NUL at the end of the table. */
4067 /* Now skip over preceding filename table entries. */
4068 for (; *hdrptr != '\0' && fileidx > 1; fileidx--)
4070 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
4071 read_uleb128 (hdrptr, &bytes_read, end);
4072 hdrptr += bytes_read;
4073 read_uleb128 (hdrptr, &bytes_read, end);
4074 hdrptr += bytes_read;
4075 read_uleb128 (hdrptr, &bytes_read, end);
4076 hdrptr += bytes_read;
4078 if (hdrptr == end || *hdrptr == '\0')
4081 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
4082 diridx = read_uleb128 (hdrptr, &bytes_read, end);
4085 for (; *dirtable != '\0' && diridx > 1; diridx--)
4086 dirtable += strnlen ((char *) dirtable, end - dirtable) + 1;
4087 if (*dirtable == '\0')
4089 *dir_name = dirtable;
4094 display_debug_macro (struct dwarf_section *section,
4097 unsigned char *start = section->start;
4098 unsigned char *end = start + section->size;
4099 unsigned char *curr = start;
4100 unsigned char *extended_op_buf[256];
4101 unsigned int bytes_read;
4103 load_debug_section (str, file);
4104 load_debug_section (line, file);
4106 printf (_("Contents of the %s section:\n\n"), section->name);
4110 unsigned int lineno, version, flags;
4111 unsigned int offset_size = 4;
4112 const unsigned char *string;
4113 dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
4114 unsigned char **extended_ops = NULL;
4116 SAFE_BYTE_GET_AND_INC (version, curr, 2, end);
4119 error (_("Only GNU extension to DWARF 4 of %s is currently supported.\n"),
4124 SAFE_BYTE_GET_AND_INC (flags, curr, 1, end);
4127 printf (_(" Offset: 0x%lx\n"),
4128 (unsigned long) sec_offset);
4129 printf (_(" Version: %d\n"), version);
4130 printf (_(" Offset size: %d\n"), offset_size);
4133 SAFE_BYTE_GET_AND_INC (line_offset, curr, offset_size, end);
4134 printf (_(" Offset into .debug_line: 0x%lx\n"),
4135 (unsigned long) line_offset);
4139 unsigned int i, count, op;
4142 SAFE_BYTE_GET_AND_INC (count, curr, 1, end);
4144 memset (extended_op_buf, 0, sizeof (extended_op_buf));
4145 extended_ops = extended_op_buf;
4148 printf (_(" Extension opcode arguments:\n"));
4149 for (i = 0; i < count; i++)
4151 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
4152 extended_ops[op] = curr;
4153 nargs = read_uleb128 (curr, &bytes_read, end);
4156 printf (_(" DW_MACRO_GNU_%02x has no arguments\n"), op);
4159 printf (_(" DW_MACRO_GNU_%02x arguments: "), op);
4160 for (n = 0; n < nargs; n++)
4164 SAFE_BYTE_GET_AND_INC (form, curr, 1, end);
4165 printf ("%s%s", get_FORM_name (form),
4166 n == nargs - 1 ? "\n" : ", ");
4176 case DW_FORM_block1:
4177 case DW_FORM_block2:
4178 case DW_FORM_block4:
4180 case DW_FORM_string:
4182 case DW_FORM_sec_offset:
4185 error (_("Invalid extension opcode form %s\n"),
4186 get_FORM_name (form));
4202 error (_(".debug_macro section not zero terminated\n"));
4206 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
4212 case DW_MACRO_GNU_start_file:
4214 unsigned int filenum;
4215 unsigned char *file_name = NULL, *dir_name = NULL;
4217 lineno = read_uleb128 (curr, &bytes_read, end);
4219 filenum = read_uleb128 (curr, &bytes_read, end);
4222 if ((flags & 2) == 0)
4223 error (_("DW_MACRO_GNU_start_file used, but no .debug_line offset provided.\n"));
4226 = get_line_filename_and_dirname (line_offset, filenum,
4228 if (file_name == NULL)
4229 printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d\n"),
4232 printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
4234 dir_name != NULL ? (const char *) dir_name : "",
4235 dir_name != NULL ? "/" : "", file_name);
4239 case DW_MACRO_GNU_end_file:
4240 printf (_(" DW_MACRO_GNU_end_file\n"));
4243 case DW_MACRO_GNU_define:
4244 lineno = read_uleb128 (curr, &bytes_read, end);
4247 curr += strnlen ((char *) string, end - string) + 1;
4248 printf (_(" DW_MACRO_GNU_define - lineno : %d macro : %s\n"),
4252 case DW_MACRO_GNU_undef:
4253 lineno = read_uleb128 (curr, &bytes_read, end);
4256 curr += strnlen ((char *) string, end - string) + 1;
4257 printf (_(" DW_MACRO_GNU_undef - lineno : %d macro : %s\n"),
4261 case DW_MACRO_GNU_define_indirect:
4262 lineno = read_uleb128 (curr, &bytes_read, end);
4264 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4265 string = fetch_indirect_string (offset);
4266 printf (_(" DW_MACRO_GNU_define_indirect - lineno : %d macro : %s\n"),
4270 case DW_MACRO_GNU_undef_indirect:
4271 lineno = read_uleb128 (curr, &bytes_read, end);
4273 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4274 string = fetch_indirect_string (offset);
4275 printf (_(" DW_MACRO_GNU_undef_indirect - lineno : %d macro : %s\n"),
4279 case DW_MACRO_GNU_transparent_include:
4280 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4281 printf (_(" DW_MACRO_GNU_transparent_include - offset : 0x%lx\n"),
4282 (unsigned long) offset);
4285 case DW_MACRO_GNU_define_indirect_alt:
4286 lineno = read_uleb128 (curr, &bytes_read, end);
4288 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4289 printf (_(" DW_MACRO_GNU_define_indirect_alt - lineno : %d macro offset : 0x%lx\n"),
4290 lineno, (unsigned long) offset);
4293 case DW_MACRO_GNU_undef_indirect_alt:
4294 lineno = read_uleb128 (curr, &bytes_read, end);
4296 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4297 printf (_(" DW_MACRO_GNU_undef_indirect_alt - lineno : %d macro offset : 0x%lx\n"),
4298 lineno, (unsigned long) offset);
4301 case DW_MACRO_GNU_transparent_include_alt:
4302 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4303 printf (_(" DW_MACRO_GNU_transparent_include_alt - offset : 0x%lx\n"),
4304 (unsigned long) offset);
4308 if (extended_ops == NULL || extended_ops[op] == NULL)
4310 error (_(" Unknown macro opcode %02x seen\n"), op);
4315 /* Skip over unhandled opcodes. */
4317 unsigned char *desc = extended_ops[op];
4318 nargs = read_uleb128 (desc, &bytes_read, end);
4322 printf (_(" DW_MACRO_GNU_%02x\n"), op);
4325 printf (_(" DW_MACRO_GNU_%02x -"), op);
4326 for (n = 0; n < nargs; n++)
4330 SAFE_BYTE_GET_AND_INC (val, desc, 1, end);
4332 = read_and_display_attr_value (0, val,
4333 curr, end, 0, 0, offset_size,
4334 version, NULL, 0, NULL,
4352 display_debug_abbrev (struct dwarf_section *section,
4353 void *file ATTRIBUTE_UNUSED)
4355 abbrev_entry *entry;
4356 unsigned char *start = section->start;
4357 unsigned char *end = start + section->size;
4359 printf (_("Contents of the %s section:\n\n"), section->name);
4363 unsigned char *last;
4368 start = process_abbrev_section (start, end);
4370 if (first_abbrev == NULL)
4373 printf (_(" Number TAG (0x%lx)\n"), (long) (last - section->start));
4375 for (entry = first_abbrev; entry; entry = entry->next)
4379 printf (" %ld %s [%s]\n",
4381 get_TAG_name (entry->tag),
4382 entry->children ? _("has children") : _("no children"));
4384 for (attr = entry->first_attr; attr; attr = attr->next)
4385 printf (" %-18s %s\n",
4386 get_AT_name (attr->attribute),
4387 get_FORM_name (attr->form));
4397 /* Return true when ADDR is the maximum address, when addresses are
4398 POINTER_SIZE bytes long. */
4401 is_max_address (dwarf_vma addr, unsigned int pointer_size)
4403 dwarf_vma mask = ~(~(dwarf_vma) 1 << (pointer_size * 8 - 1));
4404 return ((addr & mask) == mask);
4407 /* Display a location list from a normal (ie, non-dwo) .debug_loc section. */
4410 display_loc_list (struct dwarf_section *section,
4411 unsigned char **start_ptr,
4412 unsigned int debug_info_entry,
4413 unsigned long offset,
4414 unsigned long base_address,
4417 unsigned char *start = *start_ptr;
4418 unsigned char *section_end = section->start + section->size;
4419 unsigned long cu_offset;
4420 unsigned int pointer_size;
4421 unsigned int offset_size;
4426 unsigned short length;
4427 int need_frame_base;
4429 if (debug_info_entry >= num_debug_info_entries)
4431 warn (_("No debug information available for loc lists of entry: %u\n"),
4436 cu_offset = debug_information [debug_info_entry].cu_offset;
4437 pointer_size = debug_information [debug_info_entry].pointer_size;
4438 offset_size = debug_information [debug_info_entry].offset_size;
4439 dwarf_version = debug_information [debug_info_entry].dwarf_version;
4441 if (pointer_size < 2 || pointer_size > 8)
4443 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
4444 pointer_size, debug_info_entry);
4450 unsigned long off = offset + (start - *start_ptr);
4452 if (start + 2 * pointer_size > section_end)
4454 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4459 printf (" %8.8lx ", off);
4461 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
4462 SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
4464 if (begin == 0 && end == 0)
4466 /* PR 18374: In a object file we can have a location list that
4467 starts with a begin and end of 0 because there are relocations
4468 that need to be applied to the addresses. Actually applying
4469 the relocations now does not help as they will probably resolve
4470 to 0, since the object file has not been fully linked. Real
4471 end of list markers will not have any relocations against them. */
4472 if (! reloc_at (section, off)
4473 && ! reloc_at (section, off + pointer_size))
4475 printf (_("<End of list>\n"));
4480 /* Check base address specifiers. */
4481 if (is_max_address (begin, pointer_size)
4482 && !is_max_address (end, pointer_size))
4485 print_dwarf_vma (begin, pointer_size);
4486 print_dwarf_vma (end, pointer_size);
4487 printf (_("(base address)\n"));
4491 if (start + 2 > section_end)
4493 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4498 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
4500 if (start + length > section_end)
4502 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4507 print_dwarf_vma (begin + base_address, pointer_size);
4508 print_dwarf_vma (end + base_address, pointer_size);
4511 need_frame_base = decode_location_expression (start,
4516 cu_offset, section);
4519 if (need_frame_base && !has_frame_base)
4520 printf (_(" [without DW_AT_frame_base]"));
4523 fputs (_(" (start == end)"), stdout);
4524 else if (begin > end)
4525 fputs (_(" (start > end)"), stdout);
4535 /* Print a .debug_addr table index in decimal, surrounded by square brackets,
4536 right-adjusted in a field of length LEN, and followed by a space. */
4539 print_addr_index (unsigned int idx, unsigned int len)
4541 static char buf[15];
4542 snprintf (buf, sizeof (buf), "[%d]", idx);
4543 printf ("%*s ", len, buf);
4546 /* Display a location list from a .dwo section. It uses address indexes rather
4547 than embedded addresses. This code closely follows display_loc_list, but the
4548 two are sufficiently different that combining things is very ugly. */
4551 display_loc_list_dwo (struct dwarf_section *section,
4552 unsigned char **start_ptr,
4553 unsigned int debug_info_entry,
4554 unsigned long offset,
4557 unsigned char *start = *start_ptr;
4558 unsigned char *section_end = section->start + section->size;
4559 unsigned long cu_offset;
4560 unsigned int pointer_size;
4561 unsigned int offset_size;
4564 unsigned short length;
4565 int need_frame_base;
4567 unsigned int bytes_read;
4569 if (debug_info_entry >= num_debug_info_entries)
4571 warn (_("No debug information for loc lists of entry: %u\n"),
4576 cu_offset = debug_information [debug_info_entry].cu_offset;
4577 pointer_size = debug_information [debug_info_entry].pointer_size;
4578 offset_size = debug_information [debug_info_entry].offset_size;
4579 dwarf_version = debug_information [debug_info_entry].dwarf_version;
4581 if (pointer_size < 2 || pointer_size > 8)
4583 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
4584 pointer_size, debug_info_entry);
4590 printf (" %8.8lx ", offset + (start - *start_ptr));
4592 if (start >= section_end)
4594 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4599 SAFE_BYTE_GET_AND_INC (entry_type, start, 1, section_end);
4602 case 0: /* A terminating entry. */
4604 printf (_("<End of list>\n"));
4606 case 1: /* A base-address entry. */
4607 idx = read_uleb128 (start, &bytes_read, section_end);
4608 start += bytes_read;
4609 print_addr_index (idx, 8);
4611 printf (_("(base address selection entry)\n"));
4613 case 2: /* A start/end entry. */
4614 idx = read_uleb128 (start, &bytes_read, section_end);
4615 start += bytes_read;
4616 print_addr_index (idx, 8);
4617 idx = read_uleb128 (start, &bytes_read, section_end);
4618 start += bytes_read;
4619 print_addr_index (idx, 8);
4621 case 3: /* A start/length entry. */
4622 idx = read_uleb128 (start, &bytes_read, section_end);
4623 start += bytes_read;
4624 print_addr_index (idx, 8);
4625 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4626 printf ("%08x ", idx);
4628 case 4: /* An offset pair entry. */
4629 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4630 printf ("%08x ", idx);
4631 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4632 printf ("%08x ", idx);
4635 warn (_("Unknown location list entry type 0x%x.\n"), entry_type);
4640 if (start + 2 > section_end)
4642 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4647 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
4648 if (start + length > section_end)
4650 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4656 need_frame_base = decode_location_expression (start,
4661 cu_offset, section);
4664 if (need_frame_base && !has_frame_base)
4665 printf (_(" [without DW_AT_frame_base]"));
4675 /* Sort array of indexes in ascending order of loc_offsets[idx]. */
4677 static dwarf_vma *loc_offsets;
4680 loc_offsets_compar (const void *ap, const void *bp)
4682 dwarf_vma a = loc_offsets[*(const unsigned int *) ap];
4683 dwarf_vma b = loc_offsets[*(const unsigned int *) bp];
4685 return (a > b) - (b > a);
4689 display_debug_loc (struct dwarf_section *section, void *file)
4691 unsigned char *start = section->start;
4692 unsigned long bytes;
4693 unsigned char *section_begin = start;
4694 unsigned int num_loc_list = 0;
4695 unsigned long last_offset = 0;
4696 unsigned int first = 0;
4699 int seen_first_offset = 0;
4700 int locs_sorted = 1;
4701 unsigned char *next;
4702 unsigned int *array = NULL;
4703 const char *suffix = strrchr (section->name, '.');
4706 if (suffix && strcmp (suffix, ".dwo") == 0)
4709 bytes = section->size;
4713 printf (_("\nThe %s section is empty.\n"), section->name);
4717 if (load_debug_info (file) == 0)
4719 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
4724 /* Check the order of location list in .debug_info section. If
4725 offsets of location lists are in the ascending order, we can
4726 use `debug_information' directly. */
4727 for (i = 0; i < num_debug_info_entries; i++)
4731 num = debug_information [i].num_loc_offsets;
4732 if (num > num_loc_list)
4735 /* Check if we can use `debug_information' directly. */
4736 if (locs_sorted && num != 0)
4738 if (!seen_first_offset)
4740 /* This is the first location list. */
4741 last_offset = debug_information [i].loc_offsets [0];
4743 seen_first_offset = 1;
4749 for (; j < num; j++)
4752 debug_information [i].loc_offsets [j])
4757 last_offset = debug_information [i].loc_offsets [j];
4762 if (!seen_first_offset)
4763 error (_("No location lists in .debug_info section!\n"));
4765 if (debug_information [first].num_loc_offsets > 0
4766 && debug_information [first].loc_offsets [0] != 0)
4767 warn (_("Location lists in %s section start at 0x%s\n"),
4769 dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]));
4772 array = (unsigned int *) xcmalloc (num_loc_list, sizeof (unsigned int));
4773 printf (_("Contents of the %s section:\n\n"), section->name);
4774 if (reloc_at (section, 0))
4775 printf (_(" Warning: This section has relocations - addresses seen here may not be accurate.\n\n"));
4776 printf (_(" Offset Begin End Expression\n"));
4778 seen_first_offset = 0;
4779 for (i = first; i < num_debug_info_entries; i++)
4781 unsigned long offset;
4782 unsigned long base_address;
4788 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
4790 loc_offsets = debug_information [i].loc_offsets;
4791 qsort (array, debug_information [i].num_loc_offsets,
4792 sizeof (*array), loc_offsets_compar);
4795 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
4797 j = locs_sorted ? k : array[k];
4799 && debug_information [i].loc_offsets [locs_sorted
4800 ? k - 1 : array [k - 1]]
4801 == debug_information [i].loc_offsets [j])
4803 has_frame_base = debug_information [i].have_frame_base [j];
4804 offset = debug_information [i].loc_offsets [j];
4805 next = section_begin + offset;
4806 base_address = debug_information [i].base_address;
4808 if (!seen_first_offset)
4809 seen_first_offset = 1;
4813 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
4814 (unsigned long) (start - section_begin),
4815 (unsigned long) offset);
4816 else if (start > next)
4817 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
4818 (unsigned long) (start - section_begin),
4819 (unsigned long) offset);
4823 if (offset >= bytes)
4825 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
4831 display_loc_list_dwo (section, &start, i, offset, has_frame_base);
4833 display_loc_list (section, &start, i, offset, base_address,
4838 if (start < section->start + section->size)
4839 warn (_("There are %ld unused bytes at the end of section %s\n"),
4840 (long) (section->start + section->size - start), section->name);
4847 display_debug_str (struct dwarf_section *section,
4848 void *file ATTRIBUTE_UNUSED)
4850 unsigned char *start = section->start;
4851 unsigned long bytes = section->size;
4852 dwarf_vma addr = section->address;
4856 printf (_("\nThe %s section is empty.\n"), section->name);
4860 printf (_("Contents of the %s section:\n\n"), section->name);
4868 lbytes = (bytes > 16 ? 16 : bytes);
4870 printf (" 0x%8.8lx ", (unsigned long) addr);
4872 for (j = 0; j < 16; j++)
4875 printf ("%2.2x", start[j]);
4883 for (j = 0; j < lbytes; j++)
4886 if (k >= ' ' && k < 0x80)
4905 display_debug_info (struct dwarf_section *section, void *file)
4907 return process_debug_info (section, file, section->abbrev_sec, 0, 0);
4911 display_debug_types (struct dwarf_section *section, void *file)
4913 return process_debug_info (section, file, section->abbrev_sec, 0, 1);
4917 display_trace_info (struct dwarf_section *section, void *file)
4919 return process_debug_info (section, file, section->abbrev_sec, 0, 0);
4923 display_debug_aranges (struct dwarf_section *section,
4924 void *file ATTRIBUTE_UNUSED)
4926 unsigned char *start = section->start;
4927 unsigned char *end = start + section->size;
4929 printf (_("Contents of the %s section:\n\n"), section->name);
4931 /* It does not matter if this load fails,
4932 we test for that later on. */
4933 load_debug_info (file);
4937 unsigned char *hdrptr;
4938 DWARF2_Internal_ARange arange;
4939 unsigned char *addr_ranges;
4942 unsigned char address_size;
4944 unsigned int offset_size;
4945 unsigned int initial_length_size;
4949 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 4, end);
4950 if (arange.ar_length == 0xffffffff)
4952 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 8, end);
4954 initial_length_size = 12;
4959 initial_length_size = 4;
4962 SAFE_BYTE_GET_AND_INC (arange.ar_version, hdrptr, 2, end);
4963 SAFE_BYTE_GET_AND_INC (arange.ar_info_offset, hdrptr, offset_size, end);
4965 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
4966 && num_debug_info_entries > 0
4967 && find_debug_info_for_offset (arange.ar_info_offset) == NULL)
4968 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
4969 (unsigned long) arange.ar_info_offset, section->name);
4971 SAFE_BYTE_GET_AND_INC (arange.ar_pointer_size, hdrptr, 1, end);
4972 SAFE_BYTE_GET_AND_INC (arange.ar_segment_size, hdrptr, 1, end);
4974 if (arange.ar_version != 2 && arange.ar_version != 3)
4976 /* PR 19872: A version number of 0 probably means that there is
4977 padding at the end of the .debug_aranges section. Gold puts
4978 it there when performing an incremental link, for example.
4979 So do not generate a warning in this case. */
4980 if (arange.ar_version)
4981 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
4985 printf (_(" Length: %ld\n"),
4986 (long) arange.ar_length);
4987 printf (_(" Version: %d\n"), arange.ar_version);
4988 printf (_(" Offset into .debug_info: 0x%lx\n"),
4989 (unsigned long) arange.ar_info_offset);
4990 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
4991 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
4993 address_size = arange.ar_pointer_size + arange.ar_segment_size;
4995 /* PR 17512: file: 001-108546-0.001:0.1. */
4996 if (address_size == 0 || address_size > 8)
4998 error (_("Invalid address size in %s section!\n"),
5003 /* The DWARF spec does not require that the address size be a power
5004 of two, but we do. This will have to change if we ever encounter
5005 an uneven architecture. */
5006 if ((address_size & (address_size - 1)) != 0)
5008 warn (_("Pointer size + Segment size is not a power of two.\n"));
5012 if (address_size > 4)
5013 printf (_("\n Address Length\n"));
5015 printf (_("\n Address Length\n"));
5017 addr_ranges = hdrptr;
5019 /* Must pad to an alignment boundary that is twice the address size. */
5020 excess = (hdrptr - start) % (2 * address_size);
5022 addr_ranges += (2 * address_size) - excess;
5024 hdrptr = start + arange.ar_length + initial_length_size;
5025 if (hdrptr < start || hdrptr > end)
5027 error (_("Excessive header length: %lx\n"), (long) arange.ar_length);
5032 while (addr_ranges + 2 * address_size <= start)
5034 SAFE_BYTE_GET_AND_INC (address, addr_ranges, address_size, end);
5035 SAFE_BYTE_GET_AND_INC (length, addr_ranges, address_size, end);
5038 print_dwarf_vma (address, address_size);
5039 print_dwarf_vma (length, address_size);
5049 /* Comparison function for qsort. */
5051 comp_addr_base (const void * v0, const void * v1)
5053 debug_info * info0 = (debug_info *) v0;
5054 debug_info * info1 = (debug_info *) v1;
5055 return info0->addr_base - info1->addr_base;
5058 /* Display the debug_addr section. */
5060 display_debug_addr (struct dwarf_section *section,
5063 debug_info **debug_addr_info;
5064 unsigned char *entry;
5069 if (section->size == 0)
5071 printf (_("\nThe %s section is empty.\n"), section->name);
5075 if (load_debug_info (file) == 0)
5077 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
5082 printf (_("Contents of the %s section:\n\n"), section->name);
5084 /* PR 17531: file: cf38d01b.
5085 We use xcalloc because a corrupt file may not have initialised all of the
5086 fields in the debug_info structure, which means that the sort below might
5087 try to move uninitialised data. */
5088 debug_addr_info = (debug_info **) xcalloc ((num_debug_info_entries + 1),
5089 sizeof (debug_info *));
5092 for (i = 0; i < num_debug_info_entries; i++)
5093 if (debug_information [i].addr_base != DEBUG_INFO_UNAVAILABLE)
5095 /* PR 17531: file: cf38d01b. */
5096 if (debug_information[i].addr_base >= section->size)
5097 warn (_("Corrupt address base (%lx) found in debug section %u\n"),
5098 (unsigned long) debug_information[i].addr_base, i);
5100 debug_addr_info [count++] = debug_information + i;
5103 /* Add a sentinel to make iteration convenient. */
5104 debug_addr_info [count] = (debug_info *) xmalloc (sizeof (debug_info));
5105 debug_addr_info [count]->addr_base = section->size;
5106 qsort (debug_addr_info, count, sizeof (debug_info *), comp_addr_base);
5108 for (i = 0; i < count; i++)
5111 unsigned int address_size = debug_addr_info [i]->pointer_size;
5113 printf (_(" For compilation unit at offset 0x%s:\n"),
5114 dwarf_vmatoa ("x", debug_addr_info [i]->cu_offset));
5116 printf (_("\tIndex\tAddress\n"));
5117 entry = section->start + debug_addr_info [i]->addr_base;
5118 end = section->start + debug_addr_info [i + 1]->addr_base;
5122 dwarf_vma base = byte_get (entry, address_size);
5123 printf (_("\t%d:\t"), idx);
5124 print_dwarf_vma (base, address_size);
5126 entry += address_size;
5132 free (debug_addr_info);
5136 /* Display the .debug_str_offsets and .debug_str_offsets.dwo sections. */
5138 display_debug_str_offsets (struct dwarf_section *section,
5139 void *file ATTRIBUTE_UNUSED)
5141 if (section->size == 0)
5143 printf (_("\nThe %s section is empty.\n"), section->name);
5146 /* TODO: Dump the contents. This is made somewhat difficult by not knowing
5147 what the offset size is for this section. */
5151 /* Each debug_information[x].range_lists[y] gets this representation for
5152 sorting purposes. */
5156 /* The debug_information[x].range_lists[y] value. */
5157 unsigned long ranges_offset;
5159 /* Original debug_information to find parameters of the data. */
5160 debug_info *debug_info_p;
5163 /* Sort struct range_entry in ascending order of its RANGES_OFFSET. */
5166 range_entry_compar (const void *ap, const void *bp)
5168 const struct range_entry *a_re = (const struct range_entry *) ap;
5169 const struct range_entry *b_re = (const struct range_entry *) bp;
5170 const unsigned long a = a_re->ranges_offset;
5171 const unsigned long b = b_re->ranges_offset;
5173 return (a > b) - (b > a);
5177 display_debug_ranges (struct dwarf_section *section,
5178 void *file ATTRIBUTE_UNUSED)
5180 unsigned char *start = section->start;
5181 unsigned char *last_start = start;
5182 unsigned long bytes = section->size;
5183 unsigned char *section_begin = start;
5184 unsigned char *finish = start + bytes;
5185 unsigned int num_range_list, i;
5186 struct range_entry *range_entries, *range_entry_fill;
5190 printf (_("\nThe %s section is empty.\n"), section->name);
5194 if (load_debug_info (file) == 0)
5196 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
5202 for (i = 0; i < num_debug_info_entries; i++)
5203 num_range_list += debug_information [i].num_range_lists;
5205 if (num_range_list == 0)
5207 /* This can happen when the file was compiled with -gsplit-debug
5208 which removes references to range lists from the primary .o file. */
5209 printf (_("No range lists in .debug_info section.\n"));
5213 range_entries = (struct range_entry *)
5214 xmalloc (sizeof (*range_entries) * num_range_list);
5215 range_entry_fill = range_entries;
5217 for (i = 0; i < num_debug_info_entries; i++)
5219 debug_info *debug_info_p = &debug_information[i];
5222 for (j = 0; j < debug_info_p->num_range_lists; j++)
5224 range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
5225 range_entry_fill->debug_info_p = debug_info_p;
5230 qsort (range_entries, num_range_list, sizeof (*range_entries),
5231 range_entry_compar);
5233 if (dwarf_check != 0 && range_entries[0].ranges_offset != 0)
5234 warn (_("Range lists in %s section start at 0x%lx\n"),
5235 section->name, range_entries[0].ranges_offset);
5237 printf (_("Contents of the %s section:\n\n"), section->name);
5238 printf (_(" Offset Begin End\n"));
5240 for (i = 0; i < num_range_list; i++)
5242 struct range_entry *range_entry = &range_entries[i];
5243 debug_info *debug_info_p = range_entry->debug_info_p;
5244 unsigned int pointer_size;
5245 unsigned long offset;
5246 unsigned char *next;
5247 unsigned long base_address;
5249 pointer_size = debug_info_p->pointer_size;
5250 offset = range_entry->ranges_offset;
5251 next = section_begin + offset;
5252 base_address = debug_info_p->base_address;
5254 /* PR 17512: file: 001-101485-0.001:0.1. */
5255 if (pointer_size < 2 || pointer_size > 8)
5257 warn (_("Corrupt pointer size (%d) in debug entry at offset %8.8lx\n"),
5258 pointer_size, offset);
5262 if (dwarf_check != 0 && i > 0)
5265 warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
5266 (unsigned long) (start - section_begin),
5267 (unsigned long) (next - section_begin), section->name);
5268 else if (start > next)
5270 if (next == last_start)
5272 warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
5273 (unsigned long) (start - section_begin),
5274 (unsigned long) (next - section_begin), section->name);
5280 while (start < finish)
5285 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
5286 if (start >= finish)
5288 SAFE_SIGNED_BYTE_GET_AND_INC (end, start, pointer_size, finish);
5290 printf (" %8.8lx ", offset);
5292 if (begin == 0 && end == 0)
5294 printf (_("<End of list>\n"));
5298 /* Check base address specifiers. */
5299 if (is_max_address (begin, pointer_size)
5300 && !is_max_address (end, pointer_size))
5303 print_dwarf_vma (begin, pointer_size);
5304 print_dwarf_vma (end, pointer_size);
5305 printf ("(base address)\n");
5309 print_dwarf_vma (begin + base_address, pointer_size);
5310 print_dwarf_vma (end + base_address, pointer_size);
5313 fputs (_("(start == end)"), stdout);
5314 else if (begin > end)
5315 fputs (_("(start > end)"), stdout);
5322 free (range_entries);
5327 typedef struct Frame_Chunk
5329 struct Frame_Chunk *next;
5330 unsigned char *chunk_start;
5332 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
5333 short int *col_type;
5336 unsigned int code_factor;
5341 dwarf_vma cfa_offset;
5343 unsigned char fde_encoding;
5344 unsigned char cfa_exp;
5345 unsigned char ptr_size;
5346 unsigned char segment_size;
5350 static const char *const *dwarf_regnames;
5351 static unsigned int dwarf_regnames_count;
5353 /* A marker for a col_type that means this column was never referenced
5354 in the frame info. */
5355 #define DW_CFA_unreferenced (-1)
5357 /* Return 0 if no more space is needed, 1 if more space is needed,
5358 -1 for invalid reg. */
5361 frame_need_space (Frame_Chunk *fc, unsigned int reg)
5363 unsigned int prev = fc->ncols;
5365 if (reg < (unsigned int) fc->ncols)
5368 if (dwarf_regnames_count
5369 && reg > dwarf_regnames_count)
5372 fc->ncols = reg + 1;
5373 /* PR 17512: file: 10450-2643-0.004.
5374 If reg == -1 then this can happen... */
5378 /* PR 17512: file: 2844a11d. */
5379 if (fc->ncols > 1024)
5381 error (_("Unfeasibly large register number: %u\n"), reg);
5383 /* FIXME: 1024 is an arbitrary limit. Increase it if
5384 we ever encounter a valid binary that exceeds it. */
5388 fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
5389 sizeof (short int));
5390 fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
5391 /* PR 17512: file:002-10025-0.005. */
5392 if (fc->col_type == NULL || fc->col_offset == NULL)
5394 error (_("Out of memory allocating %u columns in dwarf frame arrays\n"),
5400 while (prev < fc->ncols)
5402 fc->col_type[prev] = DW_CFA_unreferenced;
5403 fc->col_offset[prev] = 0;
5409 static const char *const dwarf_regnames_i386[] =
5411 "eax", "ecx", "edx", "ebx", /* 0 - 3 */
5412 "esp", "ebp", "esi", "edi", /* 4 - 7 */
5413 "eip", "eflags", NULL, /* 8 - 10 */
5414 "st0", "st1", "st2", "st3", /* 11 - 14 */
5415 "st4", "st5", "st6", "st7", /* 15 - 18 */
5416 NULL, NULL, /* 19 - 20 */
5417 "xmm0", "xmm1", "xmm2", "xmm3", /* 21 - 24 */
5418 "xmm4", "xmm5", "xmm6", "xmm7", /* 25 - 28 */
5419 "mm0", "mm1", "mm2", "mm3", /* 29 - 32 */
5420 "mm4", "mm5", "mm6", "mm7", /* 33 - 36 */
5421 "fcw", "fsw", "mxcsr", /* 37 - 39 */
5422 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47 */
5423 "tr", "ldtr", /* 48 - 49 */
5424 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57 */
5425 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65 */
5426 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73 */
5427 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81 */
5428 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89 */
5429 NULL, NULL, NULL, /* 90 - 92 */
5430 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7" /* 93 - 100 */
5433 static const char *const dwarf_regnames_iamcu[] =
5435 "eax", "ecx", "edx", "ebx", /* 0 - 3 */
5436 "esp", "ebp", "esi", "edi", /* 4 - 7 */
5437 "eip", "eflags", NULL, /* 8 - 10 */
5438 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 11 - 18 */
5439 NULL, NULL, /* 19 - 20 */
5440 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 21 - 28 */
5441 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 29 - 36 */
5442 NULL, NULL, NULL, /* 37 - 39 */
5443 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47 */
5444 "tr", "ldtr", /* 48 - 49 */
5445 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57 */
5446 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65 */
5447 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73 */
5448 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81 */
5449 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89 */
5450 NULL, NULL, NULL, /* 90 - 92 */
5451 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL /* 93 - 100 */
5455 init_dwarf_regnames_i386 (void)
5457 dwarf_regnames = dwarf_regnames_i386;
5458 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
5462 init_dwarf_regnames_iamcu (void)
5464 dwarf_regnames = dwarf_regnames_iamcu;
5465 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_iamcu);
5468 static const char *const dwarf_regnames_x86_64[] =
5470 "rax", "rdx", "rcx", "rbx",
5471 "rsi", "rdi", "rbp", "rsp",
5472 "r8", "r9", "r10", "r11",
5473 "r12", "r13", "r14", "r15",
5475 "xmm0", "xmm1", "xmm2", "xmm3",
5476 "xmm4", "xmm5", "xmm6", "xmm7",
5477 "xmm8", "xmm9", "xmm10", "xmm11",
5478 "xmm12", "xmm13", "xmm14", "xmm15",
5479 "st0", "st1", "st2", "st3",
5480 "st4", "st5", "st6", "st7",
5481 "mm0", "mm1", "mm2", "mm3",
5482 "mm4", "mm5", "mm6", "mm7",
5484 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
5485 "fs.base", "gs.base", NULL, NULL,
5487 "mxcsr", "fcw", "fsw",
5488 "xmm16", "xmm17", "xmm18", "xmm19",
5489 "xmm20", "xmm21", "xmm22", "xmm23",
5490 "xmm24", "xmm25", "xmm26", "xmm27",
5491 "xmm28", "xmm29", "xmm30", "xmm31",
5492 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 83 - 90 */
5493 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 91 - 98 */
5494 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 99 - 106 */
5495 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 107 - 114 */
5496 NULL, NULL, NULL, /* 115 - 117 */
5497 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
5501 init_dwarf_regnames_x86_64 (void)
5503 dwarf_regnames = dwarf_regnames_x86_64;
5504 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
5507 static const char *const dwarf_regnames_aarch64[] =
5509 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
5510 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
5511 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
5512 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp",
5513 NULL, "elr", NULL, NULL, NULL, NULL, NULL, NULL,
5514 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5515 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5516 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5517 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
5518 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
5519 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
5520 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
5524 init_dwarf_regnames_aarch64 (void)
5526 dwarf_regnames = dwarf_regnames_aarch64;
5527 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_aarch64);
5530 static const char *const dwarf_regnames_s390[] =
5532 /* Avoid saying "r5 (r5)", so omit the names of r0-r15. */
5533 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5534 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5535 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5536 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15",
5537 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
5538 "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", "cr15",
5539 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7",
5540 "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15",
5543 "v16", "v18", "v20", "v22", "v17", "v19", "v21", "v23",
5544 "v24", "v26", "v28", "v30", "v25", "v27", "v29", "v31",
5548 init_dwarf_regnames_s390 (void)
5550 dwarf_regnames = dwarf_regnames_s390;
5551 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_s390);
5555 init_dwarf_regnames (unsigned int e_machine)
5560 init_dwarf_regnames_i386 ();
5564 init_dwarf_regnames_iamcu ();
5570 init_dwarf_regnames_x86_64 ();
5574 init_dwarf_regnames_aarch64 ();
5578 init_dwarf_regnames_s390 ();
5587 regname (unsigned int regno, int row)
5589 static char reg[64];
5591 && regno < dwarf_regnames_count
5592 && dwarf_regnames [regno] != NULL)
5595 return dwarf_regnames [regno];
5596 snprintf (reg, sizeof (reg), "r%d (%s)", regno,
5597 dwarf_regnames [regno]);
5600 snprintf (reg, sizeof (reg), "r%d", regno);
5605 frame_display_row (Frame_Chunk *fc, int *need_col_headers, unsigned int *max_regs)
5610 if (*max_regs != fc->ncols)
5611 *max_regs = fc->ncols;
5613 if (*need_col_headers)
5615 static const char *sloc = " LOC";
5617 *need_col_headers = 0;
5619 printf ("%-*s CFA ", eh_addr_size * 2, sloc);
5621 for (r = 0; r < *max_regs; r++)
5622 if (fc->col_type[r] != DW_CFA_unreferenced)
5627 printf ("%-5s ", regname (r, 1));
5633 print_dwarf_vma (fc->pc_begin, eh_addr_size);
5635 strcpy (tmp, "exp");
5637 sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), (int) fc->cfa_offset);
5638 printf ("%-8s ", tmp);
5640 for (r = 0; r < fc->ncols; r++)
5642 if (fc->col_type[r] != DW_CFA_unreferenced)
5644 switch (fc->col_type[r])
5646 case DW_CFA_undefined:
5649 case DW_CFA_same_value:
5653 sprintf (tmp, "c%+d", fc->col_offset[r]);
5655 case DW_CFA_val_offset:
5656 sprintf (tmp, "v%+d", fc->col_offset[r]);
5658 case DW_CFA_register:
5659 sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
5661 case DW_CFA_expression:
5662 strcpy (tmp, "exp");
5664 case DW_CFA_val_expression:
5665 strcpy (tmp, "vexp");
5668 strcpy (tmp, "n/a");
5671 printf ("%-5s ", tmp);
5677 #define GET(VAR, N) SAFE_BYTE_GET_AND_INC (VAR, start, N, end)
5678 #define LEB() read_uleb128 (start, & length_return, end); start += length_return
5679 #define SLEB() read_sleb128 (start, & length_return, end); start += length_return
5681 static unsigned char *
5682 read_cie (unsigned char *start, unsigned char *end,
5683 Frame_Chunk **p_cie, int *p_version,
5684 unsigned long *p_aug_len, unsigned char **p_aug)
5688 unsigned int length_return;
5689 unsigned char *augmentation_data = NULL;
5690 unsigned long augmentation_data_len = 0;
5693 /* PR 17512: file: 001-228113-0.004. */
5697 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
5698 memset (fc, 0, sizeof (Frame_Chunk));
5700 fc->col_type = (short int *) xmalloc (sizeof (short int));
5701 fc->col_offset = (int *) xmalloc (sizeof (int));
5705 fc->augmentation = (char *) start;
5706 /* PR 17512: file: 001-228113-0.004.
5707 Skip past augmentation name, but avoid running off the end of the data. */
5709 if (* start ++ == '\0')
5713 warn (_("No terminator for augmentation name\n"));
5717 if (strcmp (fc->augmentation, "eh") == 0)
5718 start += eh_addr_size;
5722 GET (fc->ptr_size, 1);
5723 if (fc->ptr_size < 1 || fc->ptr_size > 8)
5725 warn (_("Invalid pointer size (%d) in CIE data\n"), fc->ptr_size);
5729 GET (fc->segment_size, 1);
5730 /* PR 17512: file: e99d2804. */
5731 if (fc->segment_size > 8 || fc->segment_size + fc->ptr_size > 8)
5733 warn (_("Invalid segment size (%d) in CIE data\n"), fc->segment_size);
5737 eh_addr_size = fc->ptr_size;
5741 fc->ptr_size = eh_addr_size;
5742 fc->segment_size = 0;
5744 fc->code_factor = LEB ();
5745 fc->data_factor = SLEB ();
5755 if (fc->augmentation[0] == 'z')
5757 augmentation_data_len = LEB ();
5758 augmentation_data = start;
5759 start += augmentation_data_len;
5760 /* PR 17512: file: 11042-2589-0.004. */
5763 warn (_("Augmentation data too long: 0x%lx\n"), augmentation_data_len);
5768 if (augmentation_data_len)
5772 unsigned char *qend;
5774 p = (unsigned char *) fc->augmentation + 1;
5775 q = augmentation_data;
5776 qend = q + augmentation_data_len;
5778 /* PR 17531: file: 015adfaa. */
5781 warn (_("Negative augmentation data length: 0x%lx"), augmentation_data_len);
5782 augmentation_data_len = 0;
5785 while (p < end && q < augmentation_data + augmentation_data_len)
5790 q += 1 + size_of_encoded_value (*q);
5792 fc->fde_encoding = *q++;
5799 /* Note - it is OK if this loop terminates with q < qend.
5800 Padding may have been inserted to align the end of the CIE. */
5805 *p_version = version;
5808 *p_aug_len = augmentation_data_len;
5809 *p_aug = augmentation_data;
5815 display_debug_frames (struct dwarf_section *section,
5816 void *file ATTRIBUTE_UNUSED)
5818 unsigned char *start = section->start;
5819 unsigned char *end = start + section->size;
5820 unsigned char *section_start = start;
5821 Frame_Chunk *chunks = 0, *forward_refs = 0;
5822 Frame_Chunk *remembered_state = 0;
5824 int is_eh = strcmp (section->name, ".eh_frame") == 0;
5825 unsigned int length_return;
5826 unsigned int max_regs = 0;
5827 const char *bad_reg = _("bad register: ");
5828 unsigned int saved_eh_addr_size = eh_addr_size;
5830 printf (_("Contents of the %s section:\n"), section->name);
5834 unsigned char *saved_start;
5835 unsigned char *block_end;
5840 int need_col_headers = 1;
5841 unsigned char *augmentation_data = NULL;
5842 unsigned long augmentation_data_len = 0;
5843 unsigned int encoded_ptr_size = saved_eh_addr_size;
5844 unsigned int offset_size;
5845 unsigned int initial_length_size;
5846 bfd_boolean all_nops;
5848 saved_start = start;
5850 SAFE_BYTE_GET_AND_INC (length, start, 4, end);
5854 printf ("\n%08lx ZERO terminator\n\n",
5855 (unsigned long)(saved_start - section_start));
5856 /* Skip any zero terminators that directly follow.
5857 A corrupt section size could have loaded a whole
5858 slew of zero filled memory bytes. eg
5859 PR 17512: file: 070-19381-0.004. */
5860 while (start < end && * start == 0)
5865 if (length == 0xffffffff)
5867 SAFE_BYTE_GET_AND_INC (length, start, 8, end);
5869 initial_length_size = 12;
5874 initial_length_size = 4;
5877 block_end = saved_start + length + initial_length_size;
5878 if (block_end > end || block_end < start)
5880 warn ("Invalid length 0x%s in FDE at %#08lx\n",
5881 dwarf_vmatoa_1 (NULL, length, offset_size),
5882 (unsigned long) (saved_start - section_start));
5886 SAFE_BYTE_GET_AND_INC (cie_id, start, offset_size, end);
5888 if (is_eh ? (cie_id == 0) : ((offset_size == 4 && cie_id == DW_CIE_ID)
5889 || (offset_size == 8 && cie_id == DW64_CIE_ID)))
5894 start = read_cie (start, end, &cie, &version,
5895 &augmentation_data_len, &augmentation_data);
5896 /* PR 17512: file: 027-135133-0.005. */
5903 fc->chunk_start = saved_start;
5904 mreg = max_regs > 0 ? max_regs - 1 : 0;
5907 if (frame_need_space (fc, mreg) < 0)
5909 if (fc->fde_encoding)
5910 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
5912 printf ("\n%08lx ", (unsigned long) (saved_start - section_start));
5913 print_dwarf_vma (length, fc->ptr_size);
5914 print_dwarf_vma (cie_id, offset_size);
5916 if (do_debug_frames_interp)
5918 printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc->augmentation,
5919 fc->code_factor, fc->data_factor, fc->ra);
5924 printf (" Version: %d\n", version);
5925 printf (" Augmentation: \"%s\"\n", fc->augmentation);
5928 printf (" Pointer Size: %u\n", fc->ptr_size);
5929 printf (" Segment Size: %u\n", fc->segment_size);
5931 printf (" Code alignment factor: %u\n", fc->code_factor);
5932 printf (" Data alignment factor: %d\n", fc->data_factor);
5933 printf (" Return address column: %d\n", fc->ra);
5935 if (augmentation_data_len)
5939 printf (" Augmentation data: ");
5940 for (i = 0; i < augmentation_data_len; ++i)
5941 /* FIXME: If do_wide is FALSE, then we should
5942 add carriage returns at 80 columns... */
5943 printf (" %02x", augmentation_data[i]);
5951 unsigned char *look_for;
5952 static Frame_Chunk fde_fc;
5953 unsigned long segment_selector;
5957 dwarf_vma sign = (dwarf_vma) 1 << (offset_size * 8 - 1);
5958 look_for = start - 4 - ((cie_id ^ sign) - sign);
5961 look_for = section_start + cie_id;
5963 if (look_for <= saved_start)
5965 for (cie = chunks; cie ; cie = cie->next)
5966 if (cie->chunk_start == look_for)
5971 for (cie = forward_refs; cie ; cie = cie->next)
5972 if (cie->chunk_start == look_for)
5976 unsigned int off_size;
5977 unsigned char *cie_scan;
5979 cie_scan = look_for;
5981 SAFE_BYTE_GET_AND_INC (length, cie_scan, 4, end);
5982 if (length == 0xffffffff)
5984 SAFE_BYTE_GET_AND_INC (length, cie_scan, 8, end);
5991 SAFE_BYTE_GET_AND_INC (c_id, cie_scan, off_size, end);
5994 : ((off_size == 4 && c_id == DW_CIE_ID)
5995 || (off_size == 8 && c_id == DW64_CIE_ID)))
6000 read_cie (cie_scan, end, &cie, &version,
6001 &augmentation_data_len, &augmentation_data);
6002 /* PR 17512: file: 3450-2098-0.004. */
6005 warn (_("Failed to read CIE information\n"));
6008 cie->next = forward_refs;
6010 cie->chunk_start = look_for;
6011 mreg = max_regs > 0 ? max_regs - 1 : 0;
6014 if (frame_need_space (cie, mreg) < 0)
6016 warn (_("Invalid max register\n"));
6019 if (cie->fde_encoding)
6021 = size_of_encoded_value (cie->fde_encoding);
6028 memset (fc, 0, sizeof (Frame_Chunk));
6032 warn ("Invalid CIE pointer 0x%s in FDE at %#08lx\n",
6033 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
6034 (unsigned long) (saved_start - section_start));
6036 fc->col_type = (short int *) xmalloc (sizeof (short int));
6037 fc->col_offset = (int *) xmalloc (sizeof (int));
6038 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1 : 0) < 0)
6040 warn (_("Invalid max register\n"));
6044 fc->augmentation = "";
6045 fc->fde_encoding = 0;
6046 fc->ptr_size = eh_addr_size;
6047 fc->segment_size = 0;
6051 fc->ncols = cie->ncols;
6052 fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
6053 fc->col_offset = (int *) xcmalloc (fc->ncols, sizeof (int));
6054 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
6055 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
6056 fc->augmentation = cie->augmentation;
6057 fc->ptr_size = cie->ptr_size;
6058 eh_addr_size = cie->ptr_size;
6059 fc->segment_size = cie->segment_size;
6060 fc->code_factor = cie->code_factor;
6061 fc->data_factor = cie->data_factor;
6062 fc->cfa_reg = cie->cfa_reg;
6063 fc->cfa_offset = cie->cfa_offset;
6065 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1: 0) < 0)
6067 warn (_("Invalid max register\n"));
6070 fc->fde_encoding = cie->fde_encoding;
6073 if (fc->fde_encoding)
6074 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
6076 segment_selector = 0;
6077 if (fc->segment_size)
6079 if (fc->segment_size > sizeof (segment_selector))
6081 /* PR 17512: file: 9e196b3e. */
6082 warn (_("Probably corrupt segment size: %d - using 4 instead\n"), fc->segment_size);
6083 fc->segment_size = 4;
6085 SAFE_BYTE_GET_AND_INC (segment_selector, start, fc->segment_size, end);
6088 fc->pc_begin = get_encoded_value (&start, fc->fde_encoding, section, end);
6090 /* FIXME: It appears that sometimes the final pc_range value is
6091 encoded in less than encoded_ptr_size bytes. See the x86_64
6092 run of the "objcopy on compressed debug sections" test for an
6094 SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end);
6096 if (cie->augmentation[0] == 'z')
6098 augmentation_data_len = LEB ();
6099 augmentation_data = start;
6100 start += augmentation_data_len;
6101 /* PR 17512: file: 722-8446-0.004. */
6102 if (start >= end || ((signed long) augmentation_data_len) < 0)
6104 warn (_("Corrupt augmentation data length: %lx\n"),
6105 augmentation_data_len);
6107 augmentation_data = NULL;
6108 augmentation_data_len = 0;
6112 printf ("\n%08lx %s %s FDE cie=%08lx pc=",
6113 (unsigned long)(saved_start - section_start),
6114 dwarf_vmatoa_1 (NULL, length, fc->ptr_size),
6115 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
6116 (unsigned long)(cie->chunk_start - section_start));
6118 if (fc->segment_size)
6119 printf ("%04lx:", segment_selector);
6122 dwarf_vmatoa_1 (NULL, fc->pc_begin, fc->ptr_size),
6123 dwarf_vmatoa_1 (NULL, fc->pc_begin + fc->pc_range, fc->ptr_size));
6125 if (! do_debug_frames_interp && augmentation_data_len)
6129 printf (" Augmentation data: ");
6130 for (i = 0; i < augmentation_data_len; ++i)
6131 printf (" %02x", augmentation_data[i]);
6137 /* At this point, fc is the current chunk, cie (if any) is set, and
6138 we're about to interpret instructions for the chunk. */
6139 /* ??? At present we need to do this always, since this sizes the
6140 fc->col_type and fc->col_offset arrays, which we write into always.
6141 We should probably split the interpreted and non-interpreted bits
6142 into two different routines, since there's so much that doesn't
6143 really overlap between them. */
6144 if (1 || do_debug_frames_interp)
6146 /* Start by making a pass over the chunk, allocating storage
6147 and taking note of what registers are used. */
6148 unsigned char *tmp = start;
6150 while (start < block_end)
6152 unsigned int reg, op, opa;
6154 unsigned char * new_start;
6161 /* Warning: if you add any more cases to this switch, be
6162 sure to add them to the corresponding switch below. */
6165 case DW_CFA_advance_loc:
6169 if (frame_need_space (fc, opa) >= 0)
6170 fc->col_type[opa] = DW_CFA_undefined;
6172 case DW_CFA_restore:
6173 if (frame_need_space (fc, opa) >= 0)
6174 fc->col_type[opa] = DW_CFA_undefined;
6176 case DW_CFA_set_loc:
6177 start += encoded_ptr_size;
6179 case DW_CFA_advance_loc1:
6182 case DW_CFA_advance_loc2:
6185 case DW_CFA_advance_loc4:
6188 case DW_CFA_offset_extended:
6189 case DW_CFA_val_offset:
6190 reg = LEB (); LEB ();
6191 if (frame_need_space (fc, reg) >= 0)
6192 fc->col_type[reg] = DW_CFA_undefined;
6194 case DW_CFA_restore_extended:
6196 if (frame_need_space (fc, reg) >= 0)
6197 fc->col_type[reg] = DW_CFA_undefined;
6199 case DW_CFA_undefined:
6201 if (frame_need_space (fc, reg) >= 0)
6202 fc->col_type[reg] = DW_CFA_undefined;
6204 case DW_CFA_same_value:
6206 if (frame_need_space (fc, reg) >= 0)
6207 fc->col_type[reg] = DW_CFA_undefined;
6209 case DW_CFA_register:
6210 reg = LEB (); LEB ();
6211 if (frame_need_space (fc, reg) >= 0)
6212 fc->col_type[reg] = DW_CFA_undefined;
6214 case DW_CFA_def_cfa:
6217 case DW_CFA_def_cfa_register:
6220 case DW_CFA_def_cfa_offset:
6223 case DW_CFA_def_cfa_expression:
6225 new_start = start + temp;
6226 if (new_start < start)
6228 warn (_("Corrupt CFA_def expression value: %lu\n"), temp);
6234 case DW_CFA_expression:
6235 case DW_CFA_val_expression:
6238 new_start = start + temp;
6239 if (new_start < start)
6241 /* PR 17512: file:306-192417-0.005. */
6242 warn (_("Corrupt CFA expression value: %lu\n"), temp);
6247 if (frame_need_space (fc, reg) >= 0)
6248 fc->col_type[reg] = DW_CFA_undefined;
6250 case DW_CFA_offset_extended_sf:
6251 case DW_CFA_val_offset_sf:
6252 reg = LEB (); SLEB ();
6253 if (frame_need_space (fc, reg) >= 0)
6254 fc->col_type[reg] = DW_CFA_undefined;
6256 case DW_CFA_def_cfa_sf:
6259 case DW_CFA_def_cfa_offset_sf:
6262 case DW_CFA_MIPS_advance_loc8:
6265 case DW_CFA_GNU_args_size:
6268 case DW_CFA_GNU_negative_offset_extended:
6269 reg = LEB (); LEB ();
6270 if (frame_need_space (fc, reg) >= 0)
6271 fc->col_type[reg] = DW_CFA_undefined;
6282 /* Now we know what registers are used, make a second pass over
6283 the chunk, this time actually printing out the info. */
6285 while (start < block_end)
6287 unsigned char * tmp;
6289 unsigned long ul, reg, roffs;
6293 const char *reg_prefix = "";
6300 /* Make a note if something other than DW_CFA_nop happens. */
6301 if (op != DW_CFA_nop)
6304 /* Warning: if you add any more cases to this switch, be
6305 sure to add them to the corresponding switch above. */
6308 case DW_CFA_advance_loc:
6309 if (do_debug_frames_interp)
6310 frame_display_row (fc, &need_col_headers, &max_regs);
6312 printf (" DW_CFA_advance_loc: %d to %s\n",
6313 opa * fc->code_factor,
6314 dwarf_vmatoa_1 (NULL,
6315 fc->pc_begin + opa * fc->code_factor,
6317 fc->pc_begin += opa * fc->code_factor;
6322 if (opa >= (unsigned int) fc->ncols)
6323 reg_prefix = bad_reg;
6324 if (! do_debug_frames_interp || *reg_prefix != '\0')
6325 printf (" DW_CFA_offset: %s%s at cfa%+ld\n",
6326 reg_prefix, regname (opa, 0),
6327 roffs * fc->data_factor);
6328 if (*reg_prefix == '\0')
6330 fc->col_type[opa] = DW_CFA_offset;
6331 fc->col_offset[opa] = roffs * fc->data_factor;
6335 case DW_CFA_restore:
6336 if (opa >= (unsigned int) fc->ncols)
6337 reg_prefix = bad_reg;
6338 if (! do_debug_frames_interp || *reg_prefix != '\0')
6339 printf (" DW_CFA_restore: %s%s\n",
6340 reg_prefix, regname (opa, 0));
6341 if (*reg_prefix != '\0')
6344 if (opa >= (unsigned int) cie->ncols
6345 || (do_debug_frames_interp
6346 && cie->col_type[opa] == DW_CFA_unreferenced))
6348 fc->col_type[opa] = DW_CFA_undefined;
6349 fc->col_offset[opa] = 0;
6353 fc->col_type[opa] = cie->col_type[opa];
6354 fc->col_offset[opa] = cie->col_offset[opa];
6358 case DW_CFA_set_loc:
6359 vma = get_encoded_value (&start, fc->fde_encoding, section, block_end);
6360 if (do_debug_frames_interp)
6361 frame_display_row (fc, &need_col_headers, &max_regs);
6363 printf (" DW_CFA_set_loc: %s\n",
6364 dwarf_vmatoa_1 (NULL, vma, fc->ptr_size));
6368 case DW_CFA_advance_loc1:
6369 SAFE_BYTE_GET_AND_INC (ofs, start, 1, end);
6370 if (do_debug_frames_interp)
6371 frame_display_row (fc, &need_col_headers, &max_regs);
6373 printf (" DW_CFA_advance_loc1: %ld to %s\n",
6374 (unsigned long) (ofs * fc->code_factor),
6375 dwarf_vmatoa_1 (NULL,
6376 fc->pc_begin + ofs * fc->code_factor,
6378 fc->pc_begin += ofs * fc->code_factor;
6381 case DW_CFA_advance_loc2:
6382 SAFE_BYTE_GET_AND_INC (ofs, start, 2, block_end);
6383 if (do_debug_frames_interp)
6384 frame_display_row (fc, &need_col_headers, &max_regs);
6386 printf (" DW_CFA_advance_loc2: %ld to %s\n",
6387 (unsigned long) (ofs * fc->code_factor),
6388 dwarf_vmatoa_1 (NULL,
6389 fc->pc_begin + ofs * fc->code_factor,
6391 fc->pc_begin += ofs * fc->code_factor;
6394 case DW_CFA_advance_loc4:
6395 SAFE_BYTE_GET_AND_INC (ofs, start, 4, block_end);
6396 if (do_debug_frames_interp)
6397 frame_display_row (fc, &need_col_headers, &max_regs);
6399 printf (" DW_CFA_advance_loc4: %ld to %s\n",
6400 (unsigned long) (ofs * fc->code_factor),
6401 dwarf_vmatoa_1 (NULL,
6402 fc->pc_begin + ofs * fc->code_factor,
6404 fc->pc_begin += ofs * fc->code_factor;
6407 case DW_CFA_offset_extended:
6410 if (reg >= (unsigned int) fc->ncols)
6411 reg_prefix = bad_reg;
6412 if (! do_debug_frames_interp || *reg_prefix != '\0')
6413 printf (" DW_CFA_offset_extended: %s%s at cfa%+ld\n",
6414 reg_prefix, regname (reg, 0),
6415 roffs * fc->data_factor);
6416 if (*reg_prefix == '\0')
6418 fc->col_type[reg] = DW_CFA_offset;
6419 fc->col_offset[reg] = roffs * fc->data_factor;
6423 case DW_CFA_val_offset:
6426 if (reg >= (unsigned int) fc->ncols)
6427 reg_prefix = bad_reg;
6428 if (! do_debug_frames_interp || *reg_prefix != '\0')
6429 printf (" DW_CFA_val_offset: %s%s is cfa%+ld\n",
6430 reg_prefix, regname (reg, 0),
6431 roffs * fc->data_factor);
6432 if (*reg_prefix == '\0')
6434 fc->col_type[reg] = DW_CFA_val_offset;
6435 fc->col_offset[reg] = roffs * fc->data_factor;
6439 case DW_CFA_restore_extended:
6441 if (reg >= (unsigned int) fc->ncols)
6442 reg_prefix = bad_reg;
6443 if (! do_debug_frames_interp || *reg_prefix != '\0')
6444 printf (" DW_CFA_restore_extended: %s%s\n",
6445 reg_prefix, regname (reg, 0));
6446 if (*reg_prefix != '\0')
6449 if (reg >= (unsigned int) cie->ncols)
6451 fc->col_type[reg] = DW_CFA_undefined;
6452 fc->col_offset[reg] = 0;
6456 fc->col_type[reg] = cie->col_type[reg];
6457 fc->col_offset[reg] = cie->col_offset[reg];
6461 case DW_CFA_undefined:
6463 if (reg >= (unsigned int) fc->ncols)
6464 reg_prefix = bad_reg;
6465 if (! do_debug_frames_interp || *reg_prefix != '\0')
6466 printf (" DW_CFA_undefined: %s%s\n",
6467 reg_prefix, regname (reg, 0));
6468 if (*reg_prefix == '\0')
6470 fc->col_type[reg] = DW_CFA_undefined;
6471 fc->col_offset[reg] = 0;
6475 case DW_CFA_same_value:
6477 if (reg >= (unsigned int) fc->ncols)
6478 reg_prefix = bad_reg;
6479 if (! do_debug_frames_interp || *reg_prefix != '\0')
6480 printf (" DW_CFA_same_value: %s%s\n",
6481 reg_prefix, regname (reg, 0));
6482 if (*reg_prefix == '\0')
6484 fc->col_type[reg] = DW_CFA_same_value;
6485 fc->col_offset[reg] = 0;
6489 case DW_CFA_register:
6492 if (reg >= (unsigned int) fc->ncols)
6493 reg_prefix = bad_reg;
6494 if (! do_debug_frames_interp || *reg_prefix != '\0')
6496 printf (" DW_CFA_register: %s%s in ",
6497 reg_prefix, regname (reg, 0));
6498 puts (regname (roffs, 0));
6500 if (*reg_prefix == '\0')
6502 fc->col_type[reg] = DW_CFA_register;
6503 fc->col_offset[reg] = roffs;
6507 case DW_CFA_remember_state:
6508 if (! do_debug_frames_interp)
6509 printf (" DW_CFA_remember_state\n");
6510 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
6511 rs->cfa_offset = fc->cfa_offset;
6512 rs->cfa_reg = fc->cfa_reg;
6514 rs->cfa_exp = fc->cfa_exp;
6515 rs->ncols = fc->ncols;
6516 rs->col_type = (short int *) xcmalloc (rs->ncols,
6517 sizeof (* rs->col_type));
6518 rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (* rs->col_offset));
6519 memcpy (rs->col_type, fc->col_type, rs->ncols * sizeof (* fc->col_type));
6520 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (* fc->col_offset));
6521 rs->next = remembered_state;
6522 remembered_state = rs;
6525 case DW_CFA_restore_state:
6526 if (! do_debug_frames_interp)
6527 printf (" DW_CFA_restore_state\n");
6528 rs = remembered_state;
6531 remembered_state = rs->next;
6532 fc->cfa_offset = rs->cfa_offset;
6533 fc->cfa_reg = rs->cfa_reg;
6535 fc->cfa_exp = rs->cfa_exp;
6536 if (frame_need_space (fc, rs->ncols - 1) < 0)
6538 warn (_("Invalid column number in saved frame state\n"));
6542 memcpy (fc->col_type, rs->col_type, rs->ncols * sizeof (* rs->col_type));
6543 memcpy (fc->col_offset, rs->col_offset,
6544 rs->ncols * sizeof (* rs->col_offset));
6545 free (rs->col_type);
6546 free (rs->col_offset);
6549 else if (do_debug_frames_interp)
6550 printf ("Mismatched DW_CFA_restore_state\n");
6553 case DW_CFA_def_cfa:
6554 fc->cfa_reg = LEB ();
6555 fc->cfa_offset = LEB ();
6557 if (! do_debug_frames_interp)
6558 printf (" DW_CFA_def_cfa: %s ofs %d\n",
6559 regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
6562 case DW_CFA_def_cfa_register:
6563 fc->cfa_reg = LEB ();
6565 if (! do_debug_frames_interp)
6566 printf (" DW_CFA_def_cfa_register: %s\n",
6567 regname (fc->cfa_reg, 0));
6570 case DW_CFA_def_cfa_offset:
6571 fc->cfa_offset = LEB ();
6572 if (! do_debug_frames_interp)
6573 printf (" DW_CFA_def_cfa_offset: %d\n", (int) fc->cfa_offset);
6577 if (! do_debug_frames_interp)
6578 printf (" DW_CFA_nop\n");
6581 case DW_CFA_def_cfa_expression:
6583 if (start >= block_end || ul > (unsigned long) (block_end - start))
6585 printf (_(" DW_CFA_def_cfa_expression: <corrupt len %lu>\n"), ul);
6588 if (! do_debug_frames_interp)
6590 printf (" DW_CFA_def_cfa_expression (");
6591 decode_location_expression (start, eh_addr_size, 0, -1,
6599 case DW_CFA_expression:
6602 if (reg >= (unsigned int) fc->ncols)
6603 reg_prefix = bad_reg;
6604 /* PR 17512: file: 069-133014-0.006. */
6605 /* PR 17512: file: 98c02eb4. */
6607 if (start >= block_end || tmp > block_end || tmp < start)
6609 printf (_(" DW_CFA_expression: <corrupt len %lu>\n"), ul);
6612 if (! do_debug_frames_interp || *reg_prefix != '\0')
6614 printf (" DW_CFA_expression: %s%s (",
6615 reg_prefix, regname (reg, 0));
6616 decode_location_expression (start, eh_addr_size, 0, -1,
6620 if (*reg_prefix == '\0')
6621 fc->col_type[reg] = DW_CFA_expression;
6625 case DW_CFA_val_expression:
6628 if (reg >= (unsigned int) fc->ncols)
6629 reg_prefix = bad_reg;
6631 if (start >= block_end || tmp > block_end || tmp < start)
6633 printf (" DW_CFA_val_expression: <corrupt len %lu>\n", ul);
6636 if (! do_debug_frames_interp || *reg_prefix != '\0')
6638 printf (" DW_CFA_val_expression: %s%s (",
6639 reg_prefix, regname (reg, 0));
6640 decode_location_expression (start, eh_addr_size, 0, -1,
6644 if (*reg_prefix == '\0')
6645 fc->col_type[reg] = DW_CFA_val_expression;
6649 case DW_CFA_offset_extended_sf:
6652 if (frame_need_space (fc, reg) < 0)
6653 reg_prefix = bad_reg;
6654 if (! do_debug_frames_interp || *reg_prefix != '\0')
6655 printf (" DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
6656 reg_prefix, regname (reg, 0),
6657 (long)(l * fc->data_factor));
6658 if (*reg_prefix == '\0')
6660 fc->col_type[reg] = DW_CFA_offset;
6661 fc->col_offset[reg] = l * fc->data_factor;
6665 case DW_CFA_val_offset_sf:
6668 if (frame_need_space (fc, reg) < 0)
6669 reg_prefix = bad_reg;
6670 if (! do_debug_frames_interp || *reg_prefix != '\0')
6671 printf (" DW_CFA_val_offset_sf: %s%s is cfa%+ld\n",
6672 reg_prefix, regname (reg, 0),
6673 (long)(l * fc->data_factor));
6674 if (*reg_prefix == '\0')
6676 fc->col_type[reg] = DW_CFA_val_offset;
6677 fc->col_offset[reg] = l * fc->data_factor;
6681 case DW_CFA_def_cfa_sf:
6682 fc->cfa_reg = LEB ();
6683 fc->cfa_offset = SLEB ();
6684 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
6686 if (! do_debug_frames_interp)
6687 printf (" DW_CFA_def_cfa_sf: %s ofs %d\n",
6688 regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
6691 case DW_CFA_def_cfa_offset_sf:
6692 fc->cfa_offset = SLEB ();
6693 fc->cfa_offset *= fc->data_factor;
6694 if (! do_debug_frames_interp)
6695 printf (" DW_CFA_def_cfa_offset_sf: %d\n", (int) fc->cfa_offset);
6698 case DW_CFA_MIPS_advance_loc8:
6699 SAFE_BYTE_GET_AND_INC (ofs, start, 8, block_end);
6700 if (do_debug_frames_interp)
6701 frame_display_row (fc, &need_col_headers, &max_regs);
6703 printf (" DW_CFA_MIPS_advance_loc8: %ld to %s\n",
6704 (unsigned long) (ofs * fc->code_factor),
6705 dwarf_vmatoa_1 (NULL,
6706 fc->pc_begin + ofs * fc->code_factor,
6708 fc->pc_begin += ofs * fc->code_factor;
6711 case DW_CFA_GNU_window_save:
6712 if (! do_debug_frames_interp)
6713 printf (" DW_CFA_GNU_window_save\n");
6716 case DW_CFA_GNU_args_size:
6718 if (! do_debug_frames_interp)
6719 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
6722 case DW_CFA_GNU_negative_offset_extended:
6725 if (frame_need_space (fc, reg) < 0)
6726 reg_prefix = bad_reg;
6727 if (! do_debug_frames_interp || *reg_prefix != '\0')
6728 printf (" DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
6729 reg_prefix, regname (reg, 0),
6730 (long)(l * fc->data_factor));
6731 if (*reg_prefix == '\0')
6733 fc->col_type[reg] = DW_CFA_offset;
6734 fc->col_offset[reg] = l * fc->data_factor;
6739 if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
6740 printf (_(" DW_CFA_??? (User defined call frame op: %#x)\n"), op);
6742 warn (_("Unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
6747 /* Interpret the CFA - as long as it is not completely full of NOPs. */
6748 if (do_debug_frames_interp && ! all_nops)
6749 frame_display_row (fc, &need_col_headers, &max_regs);
6752 eh_addr_size = saved_eh_addr_size;
6765 display_gdb_index (struct dwarf_section *section,
6766 void *file ATTRIBUTE_UNUSED)
6768 unsigned char *start = section->start;
6770 uint32_t cu_list_offset, tu_list_offset;
6771 uint32_t address_table_offset, symbol_table_offset, constant_pool_offset;
6772 unsigned int cu_list_elements, tu_list_elements;
6773 unsigned int address_table_size, symbol_table_slots;
6774 unsigned char *cu_list, *tu_list;
6775 unsigned char *address_table, *symbol_table, *constant_pool;
6778 /* The documentation for the format of this file is in gdb/dwarf2read.c. */
6780 printf (_("Contents of the %s section:\n"), section->name);
6782 if (section->size < 6 * sizeof (uint32_t))
6784 warn (_("Truncated header in the %s section.\n"), section->name);
6788 version = byte_get_little_endian (start, 4);
6789 printf (_("Version %ld\n"), (long) version);
6791 /* Prior versions are obsolete, and future versions may not be
6792 backwards compatible. */
6793 if (version < 3 || version > 8)
6795 warn (_("Unsupported version %lu.\n"), (unsigned long) version);
6799 warn (_("The address table data in version 3 may be wrong.\n"));
6801 warn (_("Version 4 does not support case insensitive lookups.\n"));
6803 warn (_("Version 5 does not include inlined functions.\n"));
6805 warn (_("Version 6 does not include symbol attributes.\n"));
6806 /* Version 7 indices generated by Gold have bad type unit references,
6807 PR binutils/15021. But we don't know if the index was generated by
6808 Gold or not, so to avoid worrying users with gdb-generated indices
6809 we say nothing for version 7 here. */
6811 cu_list_offset = byte_get_little_endian (start + 4, 4);
6812 tu_list_offset = byte_get_little_endian (start + 8, 4);
6813 address_table_offset = byte_get_little_endian (start + 12, 4);
6814 symbol_table_offset = byte_get_little_endian (start + 16, 4);
6815 constant_pool_offset = byte_get_little_endian (start + 20, 4);
6817 if (cu_list_offset > section->size
6818 || tu_list_offset > section->size
6819 || address_table_offset > section->size
6820 || symbol_table_offset > section->size
6821 || constant_pool_offset > section->size)
6823 warn (_("Corrupt header in the %s section.\n"), section->name);
6827 /* PR 17531: file: 418d0a8a. */
6828 if (tu_list_offset < cu_list_offset)
6830 warn (_("TU offset (%x) is less than CU offset (%x)\n"),
6831 tu_list_offset, cu_list_offset);
6835 cu_list_elements = (tu_list_offset - cu_list_offset) / 8;
6837 if (address_table_offset < tu_list_offset)
6839 warn (_("Address table offset (%x) is less than TU offset (%x)\n"),
6840 address_table_offset, tu_list_offset);
6844 tu_list_elements = (address_table_offset - tu_list_offset) / 8;
6846 /* PR 17531: file: 18a47d3d. */
6847 if (symbol_table_offset < address_table_offset)
6849 warn (_("Symbol table offset (%xl) is less then Address table offset (%x)\n"),
6850 symbol_table_offset, address_table_offset);
6854 address_table_size = symbol_table_offset - address_table_offset;
6856 if (constant_pool_offset < symbol_table_offset)
6858 warn (_("Constant pool offset (%x) is less than symbol table offset (%x)\n"),
6859 constant_pool_offset, symbol_table_offset);
6863 symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8;
6865 cu_list = start + cu_list_offset;
6866 tu_list = start + tu_list_offset;
6867 address_table = start + address_table_offset;
6868 symbol_table = start + symbol_table_offset;
6869 constant_pool = start + constant_pool_offset;
6871 if (address_table + address_table_size * (2 + 8 + 4) > section->start + section->size)
6873 warn (_("Address table extends beyond end of section.\n"));
6877 printf (_("\nCU table:\n"));
6878 for (i = 0; i < cu_list_elements; i += 2)
6880 uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8);
6881 uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8);
6883 printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2,
6884 (unsigned long) cu_offset,
6885 (unsigned long) (cu_offset + cu_length - 1));
6888 printf (_("\nTU table:\n"));
6889 for (i = 0; i < tu_list_elements; i += 3)
6891 uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8);
6892 uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8);
6893 uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8);
6895 printf (_("[%3u] 0x%lx 0x%lx "), i / 3,
6896 (unsigned long) tu_offset,
6897 (unsigned long) type_offset);
6898 print_dwarf_vma (signature, 8);
6902 printf (_("\nAddress table:\n"));
6903 for (i = 0; i < address_table_size && i <= address_table_size - (2 * 8 + 4);
6906 uint64_t low = byte_get_little_endian (address_table + i, 8);
6907 uint64_t high = byte_get_little_endian (address_table + i + 8, 8);
6908 uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4);
6910 print_dwarf_vma (low, 8);
6911 print_dwarf_vma (high, 8);
6912 printf (_("%lu\n"), (unsigned long) cu_index);
6915 printf (_("\nSymbol table:\n"));
6916 for (i = 0; i < symbol_table_slots; ++i)
6918 uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4);
6919 uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4);
6920 uint32_t num_cus, cu;
6922 if (name_offset != 0
6923 || cu_vector_offset != 0)
6926 unsigned char * adr;
6928 adr = constant_pool + name_offset;
6929 /* PR 17531: file: 5b7b07ad. */
6930 if (adr < constant_pool || adr >= section->start + section->size)
6932 printf (_("[%3u] <corrupt offset: %x>"), i, name_offset);
6933 warn (_("Corrupt name offset of 0x%x found for symbol table slot %d\n"),
6937 printf ("[%3u] %.*s:", i,
6938 (int) (section->size - (constant_pool_offset + name_offset)),
6939 constant_pool + name_offset);
6941 adr = constant_pool + cu_vector_offset;
6942 if (adr < constant_pool || adr >= section->start + section->size - 3)
6944 printf (_("<invalid CU vector offset: %x>\n"), cu_vector_offset);
6945 warn (_("Corrupt CU vector offset of 0x%x found for symbol table slot %d\n"),
6946 cu_vector_offset, i);
6950 num_cus = byte_get_little_endian (adr, 4);
6952 adr = constant_pool + cu_vector_offset + 4 + num_cus * 4;
6953 if (num_cus * 4 < num_cus
6954 || adr >= section->start + section->size
6955 || adr < constant_pool)
6957 printf ("<invalid number of CUs: %d>\n", num_cus);
6958 warn (_("Invalid number of CUs (0x%x) for symbol table slot %d\n"),
6966 for (j = 0; j < num_cus; ++j)
6969 gdb_index_symbol_kind kind;
6971 cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4);
6972 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu);
6973 kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu);
6974 cu = GDB_INDEX_CU_VALUE (cu);
6975 /* Convert to TU number if it's for a type unit. */
6976 if (cu >= cu_list_elements / 2)
6977 printf ("%cT%lu", num_cus > 1 ? '\t' : ' ',
6978 (unsigned long) (cu - cu_list_elements / 2));
6980 printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu);
6982 printf (" [%s, %s]",
6983 is_static ? _("static") : _("global"),
6984 get_gdb_index_symbol_kind_name (kind));
6996 /* Pre-allocate enough space for the CU/TU sets needed. */
6999 prealloc_cu_tu_list (unsigned int nshndx)
7001 if (shndx_pool == NULL)
7003 shndx_pool_size = nshndx;
7004 shndx_pool_used = 0;
7005 shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size,
7006 sizeof (unsigned int));
7010 shndx_pool_size = shndx_pool_used + nshndx;
7011 shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size,
7012 sizeof (unsigned int));
7017 add_shndx_to_cu_tu_entry (unsigned int shndx)
7019 if (shndx_pool_used >= shndx_pool_size)
7021 error (_("Internal error: out of space in the shndx pool.\n"));
7024 shndx_pool [shndx_pool_used++] = shndx;
7028 end_cu_tu_entry (void)
7030 if (shndx_pool_used >= shndx_pool_size)
7032 error (_("Internal error: out of space in the shndx pool.\n"));
7035 shndx_pool [shndx_pool_used++] = 0;
7038 /* Return the short name of a DWARF section given by a DW_SECT enumerator. */
7041 get_DW_SECT_short_name (unsigned int dw_sect)
7043 static char buf[16];
7051 case DW_SECT_ABBREV:
7057 case DW_SECT_STR_OFFSETS:
7059 case DW_SECT_MACINFO:
7067 snprintf (buf, sizeof (buf), "%d", dw_sect);
7071 /* Process a CU or TU index. If DO_DISPLAY is true, print the contents.
7072 These sections are extensions for Fission.
7073 See http://gcc.gnu.org/wiki/DebugFissionDWP. */
7076 process_cu_tu_index (struct dwarf_section *section, int do_display)
7078 unsigned char *phdr = section->start;
7079 unsigned char *limit = phdr + section->size;
7080 unsigned char *phash;
7081 unsigned char *pindex;
7082 unsigned char *ppool;
7083 unsigned int version;
7084 unsigned int ncols = 0;
7086 unsigned int nslots;
7089 dwarf_vma signature_high;
7090 dwarf_vma signature_low;
7093 /* PR 17512: file: 002-168123-0.004. */
7096 warn (_("Section %s is empty\n"), section->name);
7099 /* PR 17512: file: 002-376-0.004. */
7100 if (section->size < 24)
7102 warn (_("Section %s is too small to contain a CU/TU header\n"),
7107 SAFE_BYTE_GET (version, phdr, 4, limit);
7109 SAFE_BYTE_GET (ncols, phdr + 4, 4, limit);
7110 SAFE_BYTE_GET (nused, phdr + 8, 4, limit);
7111 SAFE_BYTE_GET (nslots, phdr + 12, 4, limit);
7114 pindex = phash + nslots * 8;
7115 ppool = pindex + nslots * 4;
7117 /* PR 17531: file: 45d69832. */
7118 if (pindex < phash || ppool < phdr || (pindex == phash && nslots != 0))
7120 warn (_("Section %s is too small for %d slots\n"),
7121 section->name, nslots);
7127 printf (_("Contents of the %s section:\n\n"), section->name);
7128 printf (_(" Version: %d\n"), version);
7130 printf (_(" Number of columns: %d\n"), ncols);
7131 printf (_(" Number of used entries: %d\n"), nused);
7132 printf (_(" Number of slots: %d\n\n"), nslots);
7135 if (ppool > limit || ppool < phdr)
7137 warn (_("Section %s too small for %d hash table entries\n"),
7138 section->name, nslots);
7145 prealloc_cu_tu_list ((limit - ppool) / 4);
7146 for (i = 0; i < nslots; i++)
7148 unsigned char *shndx_list;
7151 SAFE_BYTE_GET64 (phash, &signature_high, &signature_low, limit);
7152 if (signature_high != 0 || signature_low != 0)
7154 SAFE_BYTE_GET (j, pindex, 4, limit);
7155 shndx_list = ppool + j * 4;
7156 /* PR 17531: file: 705e010d. */
7157 if (shndx_list < ppool)
7159 warn (_("Section index pool located before start of section\n"));
7164 printf (_(" [%3d] Signature: 0x%s Sections: "),
7165 i, dwarf_vmatoa64 (signature_high, signature_low,
7166 buf, sizeof (buf)));
7169 if (shndx_list >= limit)
7171 warn (_("Section %s too small for shndx pool\n"),
7175 SAFE_BYTE_GET (shndx, shndx_list, 4, limit);
7179 printf (" %d", shndx);
7181 add_shndx_to_cu_tu_entry (shndx);
7193 else if (version == 2)
7196 unsigned int dw_sect;
7197 unsigned char *ph = phash;
7198 unsigned char *pi = pindex;
7199 unsigned char *poffsets = ppool + ncols * 4;
7200 unsigned char *psizes = poffsets + nused * ncols * 4;
7201 unsigned char *pend = psizes + nused * ncols * 4;
7202 bfd_boolean is_tu_index;
7203 struct cu_tu_set *this_set = NULL;
7205 unsigned char *prow;
7207 is_tu_index = strcmp (section->name, ".debug_tu_index") == 0;
7209 /* PR 17531: file: 0dd159bf.
7210 Check for wraparound with an overlarge ncols value. */
7211 if (poffsets < ppool || (unsigned int) ((poffsets - ppool) / 4) != ncols)
7213 warn (_("Overlarge number of columns: %x\n"), ncols);
7219 warn (_("Section %s too small for offset and size tables\n"),
7226 printf (_(" Offset table\n"));
7227 printf (" slot %-16s ",
7228 is_tu_index ? _("signature") : _("dwo_id"));
7235 tu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
7241 cu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
7248 for (j = 0; j < ncols; j++)
7250 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
7251 printf (" %8s", get_DW_SECT_short_name (dw_sect));
7256 for (i = 0; i < nslots; i++)
7258 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
7260 SAFE_BYTE_GET (row, pi, 4, limit);
7263 /* PR 17531: file: a05f6ab3. */
7266 warn (_("Row index (%u) is larger than number of used entries (%u)\n"),
7272 memcpy (&this_set[row - 1].signature, ph, sizeof (uint64_t));
7274 prow = poffsets + (row - 1) * ncols * 4;
7275 /* PR 17531: file: b8ce60a8. */
7276 if (prow < poffsets || prow > limit)
7278 warn (_("Row index (%u) * num columns (%u) > space remaining in section\n"),
7284 printf (_(" [%3d] 0x%s"),
7285 i, dwarf_vmatoa64 (signature_high, signature_low,
7286 buf, sizeof (buf)));
7287 for (j = 0; j < ncols; j++)
7289 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
7291 printf (" %8d", val);
7294 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
7296 /* PR 17531: file: 10796eb3. */
7297 if (dw_sect >= DW_SECT_MAX)
7298 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
7300 this_set [row - 1].section_offsets [dw_sect] = val;
7316 printf (_(" Size table\n"));
7317 printf (" slot %-16s ",
7318 is_tu_index ? _("signature") : _("dwo_id"));
7321 for (j = 0; j < ncols; j++)
7323 SAFE_BYTE_GET (val, ppool + j * 4, 4, limit);
7325 printf (" %8s", get_DW_SECT_short_name (val));
7331 for (i = 0; i < nslots; i++)
7333 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
7335 SAFE_BYTE_GET (row, pi, 4, limit);
7338 prow = psizes + (row - 1) * ncols * 4;
7341 printf (_(" [%3d] 0x%s"),
7342 i, dwarf_vmatoa64 (signature_high, signature_low,
7343 buf, sizeof (buf)));
7345 for (j = 0; j < ncols; j++)
7347 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
7349 printf (" %8d", val);
7352 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
7353 if (dw_sect >= DW_SECT_MAX)
7354 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
7356 this_set [row - 1].section_sizes [dw_sect] = val;
7368 else if (do_display)
7369 printf (_(" Unsupported version (%d)\n"), version);
7377 /* Load the CU and TU indexes if present. This will build a list of
7378 section sets that we can use to associate a .debug_info.dwo section
7379 with its associated .debug_abbrev.dwo section in a .dwp file. */
7382 load_cu_tu_indexes (void *file)
7384 /* If we have already loaded (or tried to load) the CU and TU indexes
7385 then do not bother to repeat the task. */
7386 if (cu_tu_indexes_read)
7389 if (load_debug_section (dwp_cu_index, file))
7390 process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0);
7392 if (load_debug_section (dwp_tu_index, file))
7393 process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0);
7395 cu_tu_indexes_read = 1;
7398 /* Find the set of sections that includes section SHNDX. */
7401 find_cu_tu_set (void *file, unsigned int shndx)
7405 load_cu_tu_indexes (file);
7407 /* Find SHNDX in the shndx pool. */
7408 for (i = 0; i < shndx_pool_used; i++)
7409 if (shndx_pool [i] == shndx)
7412 if (i >= shndx_pool_used)
7415 /* Now backup to find the first entry in the set. */
7416 while (i > 0 && shndx_pool [i - 1] != 0)
7419 return shndx_pool + i;
7422 /* Display a .debug_cu_index or .debug_tu_index section. */
7425 display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
7427 return process_cu_tu_index (section, 1);
7431 display_debug_not_supported (struct dwarf_section *section,
7432 void *file ATTRIBUTE_UNUSED)
7434 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
7440 /* Like malloc, but takes two parameters like calloc.
7441 Verifies that the first parameter is not too large.
7442 Note: does *not* initialise the allocated memory to zero. */
7444 cmalloc (size_t nmemb, size_t size)
7446 /* Check for overflow. */
7447 if (nmemb >= ~(size_t) 0 / size)
7450 return xmalloc (nmemb * size);
7453 /* Like xmalloc, but takes two parameters like calloc.
7454 Verifies that the first parameter is not too large.
7455 Note: does *not* initialise the allocated memory to zero. */
7457 xcmalloc (size_t nmemb, size_t size)
7459 /* Check for overflow. */
7460 if (nmemb >= ~(size_t) 0 / size)
7463 _("Attempt to allocate an array with an excessive number of elements: 0x%lx\n"),
7468 return xmalloc (nmemb * size);
7471 /* Like xrealloc, but takes three parameters.
7472 Verifies that the second parameter is not too large.
7473 Note: does *not* initialise any new memory to zero. */
7475 xcrealloc (void *ptr, size_t nmemb, size_t size)
7477 /* Check for overflow. */
7478 if (nmemb >= ~(size_t) 0 / size)
7481 _("Attempt to re-allocate an array with an excessive number of elements: 0x%lx\n"),
7486 return xrealloc (ptr, nmemb * size);
7489 /* Like xcalloc, but verifies that the first parameter is not too large. */
7491 xcalloc2 (size_t nmemb, size_t size)
7493 /* Check for overflow. */
7494 if (nmemb >= ~(size_t) 0 / size)
7497 _("Attempt to allocate a zero'ed array with an excessive number of elements: 0x%lx\n"),
7502 return xcalloc (nmemb, size);
7506 free_debug_memory (void)
7512 for (i = 0; i < max; i++)
7513 free_debug_section ((enum dwarf_section_display_enum) i);
7515 if (debug_information != NULL)
7517 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
7519 for (i = 0; i < num_debug_info_entries; i++)
7521 if (!debug_information [i].max_loc_offsets)
7523 free (debug_information [i].loc_offsets);
7524 free (debug_information [i].have_frame_base);
7526 if (!debug_information [i].max_range_lists)
7527 free (debug_information [i].range_lists);
7530 free (debug_information);
7531 debug_information = NULL;
7532 alloc_num_debug_info_entries = num_debug_info_entries = 0;
7537 dwarf_select_sections_by_names (const char *names)
7541 const char * option;
7545 debug_dump_long_opts;
7547 static const debug_dump_long_opts opts_table [] =
7549 /* Please keep this table alpha- sorted. */
7550 { "Ranges", & do_debug_ranges, 1 },
7551 { "abbrev", & do_debug_abbrevs, 1 },
7552 { "addr", & do_debug_addr, 1 },
7553 { "aranges", & do_debug_aranges, 1 },
7554 { "cu_index", & do_debug_cu_index, 1 },
7555 { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
7556 { "frames", & do_debug_frames, 1 },
7557 { "frames-interp", & do_debug_frames_interp, 1 },
7558 /* The special .gdb_index section. */
7559 { "gdb_index", & do_gdb_index, 1 },
7560 { "info", & do_debug_info, 1 },
7561 { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility. */
7562 { "loc", & do_debug_loc, 1 },
7563 { "macro", & do_debug_macinfo, 1 },
7564 { "pubnames", & do_debug_pubnames, 1 },
7565 { "pubtypes", & do_debug_pubtypes, 1 },
7566 /* This entry is for compatibility
7567 with earlier versions of readelf. */
7568 { "ranges", & do_debug_aranges, 1 },
7569 { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
7570 { "str", & do_debug_str, 1 },
7571 /* These trace_* sections are used by Itanium VMS. */
7572 { "trace_abbrev", & do_trace_abbrevs, 1 },
7573 { "trace_aranges", & do_trace_aranges, 1 },
7574 { "trace_info", & do_trace_info, 1 },
7583 const debug_dump_long_opts * entry;
7585 for (entry = opts_table; entry->option; entry++)
7587 size_t len = strlen (entry->option);
7589 if (strncmp (p, entry->option, len) == 0
7590 && (p[len] == ',' || p[len] == '\0'))
7592 * entry->variable |= entry->val;
7594 /* The --debug-dump=frames-interp option also
7595 enables the --debug-dump=frames option. */
7596 if (do_debug_frames_interp)
7597 do_debug_frames = 1;
7604 if (entry->option == NULL)
7606 warn (_("Unrecognized debug option '%s'\n"), p);
7607 p = strchr (p, ',');
7618 dwarf_select_sections_by_letters (const char *letters)
7620 unsigned int lindex = 0;
7622 while (letters[lindex])
7623 switch (letters[lindex++])
7630 do_debug_abbrevs = 1;
7634 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
7638 do_debug_lines |= FLAG_DEBUG_LINES_DECODED;
7642 do_debug_pubnames = 1;
7646 do_debug_pubtypes = 1;
7650 do_debug_aranges = 1;
7654 do_debug_ranges = 1;
7658 do_debug_frames_interp = 1;
7661 do_debug_frames = 1;
7665 do_debug_macinfo = 1;
7677 warn (_("Unrecognized debug option '%s'\n"), letters);
7683 dwarf_select_sections_all (void)
7686 do_debug_abbrevs = 1;
7687 do_debug_lines = FLAG_DEBUG_LINES_RAW;
7688 do_debug_pubnames = 1;
7689 do_debug_pubtypes = 1;
7690 do_debug_aranges = 1;
7691 do_debug_ranges = 1;
7692 do_debug_frames = 1;
7693 do_debug_macinfo = 1;
7698 do_trace_abbrevs = 1;
7699 do_trace_aranges = 1;
7701 do_debug_cu_index = 1;
7704 struct dwarf_section_display debug_displays[] =
7706 { { ".debug_abbrev", ".zdebug_abbrev", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7707 display_debug_abbrev, &do_debug_abbrevs, FALSE },
7708 { { ".debug_aranges", ".zdebug_aranges", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7709 display_debug_aranges, &do_debug_aranges, TRUE },
7710 { { ".debug_frame", ".zdebug_frame", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7711 display_debug_frames, &do_debug_frames, TRUE },
7712 { { ".debug_info", ".zdebug_info", NULL, NULL, 0, 0, abbrev, NULL, 0, NULL },
7713 display_debug_info, &do_debug_info, TRUE },
7714 { { ".debug_line", ".zdebug_line", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7715 display_debug_lines, &do_debug_lines, TRUE },
7716 { { ".debug_pubnames", ".zdebug_pubnames", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7717 display_debug_pubnames, &do_debug_pubnames, FALSE },
7718 { { ".debug_gnu_pubnames", ".zdebug_gnu_pubnames", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7719 display_debug_gnu_pubnames, &do_debug_pubnames, FALSE },
7720 { { ".eh_frame", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7721 display_debug_frames, &do_debug_frames, TRUE },
7722 { { ".debug_macinfo", ".zdebug_macinfo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7723 display_debug_macinfo, &do_debug_macinfo, FALSE },
7724 { { ".debug_macro", ".zdebug_macro", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7725 display_debug_macro, &do_debug_macinfo, TRUE },
7726 { { ".debug_str", ".zdebug_str", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7727 display_debug_str, &do_debug_str, FALSE },
7728 { { ".debug_loc", ".zdebug_loc", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7729 display_debug_loc, &do_debug_loc, TRUE },
7730 { { ".debug_pubtypes", ".zdebug_pubtypes", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7731 display_debug_pubnames, &do_debug_pubtypes, FALSE },
7732 { { ".debug_gnu_pubtypes", ".zdebug_gnu_pubtypes", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7733 display_debug_gnu_pubnames, &do_debug_pubtypes, FALSE },
7734 { { ".debug_ranges", ".zdebug_ranges", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7735 display_debug_ranges, &do_debug_ranges, TRUE },
7736 { { ".debug_static_func", ".zdebug_static_func", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7737 display_debug_not_supported, NULL, FALSE },
7738 { { ".debug_static_vars", ".zdebug_static_vars", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7739 display_debug_not_supported, NULL, FALSE },
7740 { { ".debug_types", ".zdebug_types", NULL, NULL, 0, 0, abbrev, NULL, 0, NULL },
7741 display_debug_types, &do_debug_info, TRUE },
7742 { { ".debug_weaknames", ".zdebug_weaknames", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7743 display_debug_not_supported, NULL, FALSE },
7744 { { ".gdb_index", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7745 display_gdb_index, &do_gdb_index, FALSE },
7746 { { ".trace_info", "", NULL, NULL, 0, 0, trace_abbrev, NULL, 0, NULL },
7747 display_trace_info, &do_trace_info, TRUE },
7748 { { ".trace_abbrev", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7749 display_debug_abbrev, &do_trace_abbrevs, FALSE },
7750 { { ".trace_aranges", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7751 display_debug_aranges, &do_trace_aranges, FALSE },
7752 { { ".debug_info.dwo", ".zdebug_info.dwo", NULL, NULL, 0, 0, abbrev_dwo, NULL, 0, NULL },
7753 display_debug_info, &do_debug_info, TRUE },
7754 { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7755 display_debug_abbrev, &do_debug_abbrevs, FALSE },
7756 { { ".debug_types.dwo", ".zdebug_types.dwo", NULL, NULL, 0, 0, abbrev_dwo, NULL, 0, NULL },
7757 display_debug_types, &do_debug_info, TRUE },
7758 { { ".debug_line.dwo", ".zdebug_line.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7759 display_debug_lines, &do_debug_lines, TRUE },
7760 { { ".debug_loc.dwo", ".zdebug_loc.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7761 display_debug_loc, &do_debug_loc, TRUE },
7762 { { ".debug_macro.dwo", ".zdebug_macro.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7763 display_debug_macro, &do_debug_macinfo, TRUE },
7764 { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7765 display_debug_macinfo, &do_debug_macinfo, FALSE },
7766 { { ".debug_str.dwo", ".zdebug_str.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7767 display_debug_str, &do_debug_str, TRUE },
7768 { { ".debug_str_offsets", ".zdebug_str_offsets", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7769 display_debug_str_offsets, NULL, FALSE },
7770 { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7771 display_debug_str_offsets, NULL, FALSE },
7772 { { ".debug_addr", ".zdebug_addr", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7773 display_debug_addr, &do_debug_addr, TRUE },
7774 { { ".debug_cu_index", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7775 display_cu_index, &do_debug_cu_index, FALSE },
7776 { { ".debug_tu_index", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7777 display_cu_index, &do_debug_cu_index, FALSE },