kernel - support dummy reallocblks in devfs
[dragonfly.git] / contrib / binutils-2.27 / binutils / dwarf.c
blob282e069958d1d59fd8a05a6e451d98ba62a325e7
1 /* dwarf.c -- display DWARF contents of a BFD binary file
2 Copyright (C) 2005-2016 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
19 02110-1301, USA. */
21 #include "sysdep.h"
22 #include "libiberty.h"
23 #include "bfd.h"
24 #include "bfd_stdint.h"
25 #include "bucomm.h"
26 #include "elfcomm.h"
27 #include "elf/common.h"
28 #include "dwarf2.h"
29 #include "dwarf.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;
49 int do_debug_info;
50 int do_debug_abbrevs;
51 int do_debug_lines;
52 int do_debug_pubnames;
53 int do_debug_pubtypes;
54 int do_debug_aranges;
55 int do_debug_ranges;
56 int do_debug_frames;
57 int do_debug_frames_interp;
58 int do_debug_macinfo;
59 int do_debug_str;
60 int do_debug_loc;
61 int do_gdb_index;
62 int do_trace_info;
63 int do_trace_abbrevs;
64 int do_trace_aranges;
65 int do_debug_addr;
66 int do_debug_cu_index;
67 int do_wide;
69 int dwarf_cutoff_level = -1;
70 unsigned long dwarf_start_die;
72 int dwarf_check = 0;
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. */
90 struct cu_tu_set
92 uint64_t signature;
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
108 static unsigned int
109 size_of_encoded_value (int encoding)
111 switch (encoding & 0x7)
113 default: /* ??? */
114 case 0: return eh_addr_size;
115 case 2: return 2;
116 case 3: return 4;
117 case 4: return 8;
121 static dwarf_vma
122 get_encoded_value (unsigned char **pdata,
123 int encoding,
124 struct dwarf_section *section,
125 unsigned char * end)
127 unsigned char * data = * pdata;
128 unsigned int size = size_of_encoded_value (encoding);
129 dwarf_vma val;
131 if (data + size >= end)
133 warn (_("Encoded value extends past end of section\n"));
134 * pdata = end;
135 return 0;
138 /* PR 17512: file: 002-829853-0.004. */
139 if (size > 8)
141 warn (_("Encoded size of %d is too large to read\n"), size);
142 * pdata = end;
143 return 0;
146 /* PR 17512: file: 1085-5603-0.004. */
147 if (size == 0)
149 warn (_("Encoded size of 0 is too small to read\n"));
150 * pdata = end;
151 return 0;
154 if (encoding & DW_EH_PE_signed)
155 val = byte_get_signed (data, size);
156 else
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;
163 return val;
166 #if defined HAVE_LONG_LONG && SIZEOF_LONG_LONG > SIZEOF_LONG
167 # ifndef __MINGW32__
168 # define DWARF_VMA_FMT "ll"
169 # define DWARF_VMA_FMT_LONG "%16.16llx"
170 # else
171 # define DWARF_VMA_FMT "I64"
172 # define DWARF_VMA_FMT_LONG "%016I64x"
173 # endif
174 #else
175 # define DWARF_VMA_FMT "l"
176 # define DWARF_VMA_FMT_LONG "%16.16lx"
177 #endif
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. */
185 static const char *
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
194 char place[64];
195 } buf[16];
196 char *ret;
198 ret = buf[buf_pos++].place;
199 buf_pos %= ARRAY_SIZE (buf);
201 if (num_bytes)
203 /* Printf does not have a way of specifiying a maximum field width for an
204 integer value, so we print the full value into a buffer and then select
205 the precision we need. */
206 snprintf (ret, sizeof (buf[0].place), DWARF_VMA_FMT_LONG, value);
207 if (num_bytes > 8)
208 num_bytes = 8;
209 return ret + (16 - 2 * num_bytes);
211 else
213 char fmt[32];
215 sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch);
216 snprintf (ret, sizeof (buf[0].place), fmt, value);
217 return ret;
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. */
231 static void
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. */
240 static const char *
241 dwarf_vmatoa64 (dwarf_vma hvalue, dwarf_vma lvalue, char *buf,
242 unsigned int buf_len)
244 int len = 0;
246 if (hvalue == 0)
247 snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", lvalue);
248 else
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);
255 return buf;
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. */
263 dwarf_vma
264 read_leb128 (unsigned char *data,
265 unsigned int *length_return,
266 bfd_boolean sign,
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;
274 while (data < end)
276 byte = *data++;
277 num_read++;
279 result |= ((dwarf_vma) (byte & 0x7f)) << shift;
281 shift += 7;
282 if ((byte & 0x80) == 0)
283 break;
285 /* PR 17512: file: 0ca183b8.
286 FIXME: Should we signal this error somehow ? */
287 if (shift >= sizeof (result) * 8)
288 break;
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);
297 return result;
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) \
318 do \
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)) \
329 if ((PTR) < (END)) \
330 amount = (END) - (PTR); \
331 else \
332 amount = 0; \
334 if (amount == 0 || amount > 8) \
335 VAL = 0; \
336 else \
337 VAL = byte_get ((PTR), amount); \
339 while (0)
341 #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
342 do \
344 SAFE_BYTE_GET (VAL, PTR, AMOUNT, END); \
345 PTR += AMOUNT; \
347 while (0)
349 #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END) \
350 do \
352 unsigned int amount = (AMOUNT); \
353 if (((PTR) + amount) >= (END)) \
355 if ((PTR) < (END)) \
356 amount = (END) - (PTR); \
357 else \
358 amount = 0; \
360 if (amount) \
361 VAL = byte_get_signed ((PTR), amount); \
362 else \
363 VAL = 0; \
365 while (0)
367 #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
368 do \
370 SAFE_SIGNED_BYTE_GET (VAL, PTR, AMOUNT, END); \
371 PTR += AMOUNT; \
373 while (0)
375 #define SAFE_BYTE_GET64(PTR, HIGH, LOW, END) \
376 do \
378 if (((PTR) + 8) <= (END)) \
380 byte_get_64 ((PTR), (HIGH), (LOW)); \
382 else \
384 * (LOW) = * (HIGH) = 0; \
387 while (0)
389 typedef struct State_Machine_Registers
391 dwarf_vma address;
392 unsigned int file;
393 unsigned int line;
394 unsigned int column;
395 int is_stmt;
396 int basic_block;
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;
402 } SMR;
404 static SMR state_machine_regs;
406 static void
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. */
423 static int
424 process_extended_line_op (unsigned char * data,
425 int is_stmt,
426 unsigned char * end)
428 unsigned char op_code;
429 unsigned int bytes_read;
430 unsigned int len;
431 unsigned char *name;
432 unsigned char *orig_data = data;
433 dwarf_vma adr;
435 len = read_uleb128 (data, & bytes_read, end);
436 data += bytes_read;
438 if (len == 0 || data == end || len > (uintptr_t) (end - data))
440 warn (_("Badly formed extended line op encountered!\n"));
441 return bytes_read;
444 len += bytes_read;
445 op_code = *data++;
447 printf (_(" Extended opcode %d: "), op_code);
449 switch (op_code)
451 case DW_LNE_end_sequence:
452 printf (_("End of Sequence\n\n"));
453 reset_state_machine (is_stmt);
454 break;
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);
462 adr = 0;
464 else
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;
469 break;
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);
476 name = data;
477 data += strnlen ((char *) data, end - data) + 1;
478 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
479 data += bytes_read;
480 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
481 data += bytes_read;
482 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
483 data += bytes_read;
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"));
488 break;
490 case DW_LNE_set_discriminator:
491 printf (_("set Discriminator to %s\n"),
492 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
493 break;
495 /* HP extensions. */
496 case DW_LNE_HP_negate_is_UV_update:
497 printf ("DW_LNE_HP_negate_is_UV_update\n");
498 break;
499 case DW_LNE_HP_push_context:
500 printf ("DW_LNE_HP_push_context\n");
501 break;
502 case DW_LNE_HP_pop_context:
503 printf ("DW_LNE_HP_pop_context\n");
504 break;
505 case DW_LNE_HP_set_file_line_column:
506 printf ("DW_LNE_HP_set_file_line_column\n");
507 break;
508 case DW_LNE_HP_set_routine_name:
509 printf ("DW_LNE_HP_set_routine_name\n");
510 break;
511 case DW_LNE_HP_set_sequence:
512 printf ("DW_LNE_HP_set_sequence\n");
513 break;
514 case DW_LNE_HP_negate_post_semantics:
515 printf ("DW_LNE_HP_negate_post_semantics\n");
516 break;
517 case DW_LNE_HP_negate_function_exit:
518 printf ("DW_LNE_HP_negate_function_exit\n");
519 break;
520 case DW_LNE_HP_negate_front_end_logical:
521 printf ("DW_LNE_HP_negate_front_end_logical\n");
522 break;
523 case DW_LNE_HP_define_proc:
524 printf ("DW_LNE_HP_define_proc\n");
525 break;
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");
532 while (data < edata)
534 unsigned int opc;
536 opc = read_uleb128 (data, & bytes_read, edata);
537 data += bytes_read;
539 switch (opc)
541 case DW_LNE_HP_SFC_formfeed:
542 printf (" DW_LNE_HP_SFC_formfeed\n");
543 break;
544 case DW_LNE_HP_SFC_set_listing_line:
545 printf (" DW_LNE_HP_SFC_set_listing_line (%s)\n",
546 dwarf_vmatoa ("u",
547 read_uleb128 (data, & bytes_read, edata)));
548 data += bytes_read;
549 break;
550 case DW_LNE_HP_SFC_associate:
551 printf (" DW_LNE_HP_SFC_associate ");
552 printf ("(%s",
553 dwarf_vmatoa ("u",
554 read_uleb128 (data, & bytes_read, edata)));
555 data += bytes_read;
556 printf (",%s",
557 dwarf_vmatoa ("u",
558 read_uleb128 (data, & bytes_read, edata)));
559 data += bytes_read;
560 printf (",%s)\n",
561 dwarf_vmatoa ("u",
562 read_uleb128 (data, & bytes_read, edata)));
563 data += bytes_read;
564 break;
565 default:
566 printf (_(" UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc);
567 data = edata;
568 break;
572 break;
574 default:
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
581 for op_code. */
582 /*&& op_code <= DW_LNE_hi_user*/)
583 printf (_("user defined: "));
584 else
585 printf (_("UNKNOWN: "));
586 printf (_("length %d ["), rlen);
587 for (; rlen; rlen--)
588 printf (" %02x", *data++);
589 printf ("]\n");
591 break;
594 return len;
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;
615 static const char *
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;
655 static const char *
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;
680 unsigned long form;
681 struct abbrev_attr *next;
683 abbrev_attr;
685 typedef struct abbrev_entry
687 unsigned long entry;
688 unsigned long tag;
689 int children;
690 struct abbrev_attr *first_attr;
691 struct abbrev_attr *last_attr;
692 struct abbrev_entry *next;
694 abbrev_entry;
696 static abbrev_entry *first_abbrev = NULL;
697 static abbrev_entry *last_abbrev = NULL;
699 static void
700 free_abbrevs (void)
702 abbrev_entry *abbrv;
704 for (abbrv = first_abbrev; abbrv;)
706 abbrev_entry *next_abbrev = abbrv->next;
707 abbrev_attr *attr;
709 for (attr = abbrv->first_attr; attr;)
711 abbrev_attr *next_attr = attr->next;
713 free (attr);
714 attr = next_attr;
717 free (abbrv);
718 abbrv = next_abbrev;
721 last_abbrev = first_abbrev = NULL;
724 static void
725 add_abbrev (unsigned long number, unsigned long tag, int children)
727 abbrev_entry *entry;
729 entry = (abbrev_entry *) malloc (sizeof (*entry));
730 if (entry == NULL)
731 /* ugg */
732 return;
734 entry->entry = number;
735 entry->tag = tag;
736 entry->children = children;
737 entry->first_attr = NULL;
738 entry->last_attr = NULL;
739 entry->next = NULL;
741 if (first_abbrev == NULL)
742 first_abbrev = entry;
743 else
744 last_abbrev->next = entry;
746 last_abbrev = entry;
749 static void
750 add_abbrev_attr (unsigned long attribute, unsigned long form)
752 abbrev_attr *attr;
754 attr = (abbrev_attr *) malloc (sizeof (*attr));
755 if (attr == NULL)
756 /* ugg */
757 return;
759 attr->attribute = attribute;
760 attr->form = form;
761 attr->next = NULL;
763 if (last_abbrev->first_attr == NULL)
764 last_abbrev->first_attr = attr;
765 else
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)
780 return NULL;
782 while (start < end)
784 unsigned int bytes_read;
785 unsigned long entry;
786 unsigned long tag;
787 unsigned long attribute;
788 int children;
790 entry = read_uleb128 (start, & bytes_read, end);
791 start += bytes_read;
793 /* A single zero is supposed to end the section according
794 to the standard. If there's more, then signal that to
795 the caller. */
796 if (start == end)
797 return NULL;
798 if (entry == 0)
799 return start;
801 tag = read_uleb128 (start, & bytes_read, end);
802 start += bytes_read;
803 if (start == end)
804 return NULL;
806 children = *start++;
808 add_abbrev (entry, tag, children);
812 unsigned long form;
814 attribute = read_uleb128 (start, & bytes_read, end);
815 start += bytes_read;
816 if (start == end)
817 break;
819 form = read_uleb128 (start, & bytes_read, end);
820 start += bytes_read;
821 if (start == end)
822 break;
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"));
832 return NULL;
835 static const char *
836 get_TAG_name (unsigned long tag)
838 const char *name = get_DW_TAG_name ((unsigned int)tag);
840 if (name == NULL)
842 static char buffer[100];
844 snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag);
845 return buffer;
848 return name;
851 static const char *
852 get_FORM_name (unsigned long form)
854 const char *name;
856 if (form == 0)
857 return "DW_FORM value: 0";
859 name = get_DW_FORM_name (form);
860 if (name == NULL)
862 static char buffer[100];
864 snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
865 return buffer;
868 return name;
871 static unsigned char *
872 display_block (unsigned char *data,
873 dwarf_vma length,
874 const unsigned char * const end)
876 dwarf_vma maxlen;
878 printf (_(" %s byte block: "), dwarf_vmatoa ("u", length));
879 if (data > end)
880 return (unsigned char *) end;
882 maxlen = (dwarf_vma) (end - data);
883 length = length > maxlen ? maxlen : length;
885 while (length --)
886 printf ("%lx ", (unsigned long) byte_get (data++, 1));
888 return data;
891 static int
892 decode_location_expression (unsigned char * data,
893 unsigned int pointer_size,
894 unsigned int offset_size,
895 int dwarf_version,
896 dwarf_vma length,
897 dwarf_vma cu_offset,
898 struct dwarf_section * section)
900 unsigned op;
901 unsigned int bytes_read;
902 dwarf_vma uvalue;
903 dwarf_signed_vma svalue;
904 unsigned char *end = data + length;
905 int need_frame_base = 0;
907 while (data < end)
909 op = *data++;
911 switch (op)
913 case DW_OP_addr:
914 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
915 printf ("DW_OP_addr: %s", dwarf_vmatoa ("x", uvalue));
916 break;
917 case DW_OP_deref:
918 printf ("DW_OP_deref");
919 break;
920 case DW_OP_const1u:
921 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
922 printf ("DW_OP_const1u: %lu", (unsigned long) uvalue);
923 break;
924 case DW_OP_const1s:
925 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 1, end);
926 printf ("DW_OP_const1s: %ld", (long) svalue);
927 break;
928 case DW_OP_const2u:
929 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
930 printf ("DW_OP_const2u: %lu", (unsigned long) uvalue);
931 break;
932 case DW_OP_const2s:
933 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
934 printf ("DW_OP_const2s: %ld", (long) svalue);
935 break;
936 case DW_OP_const4u:
937 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
938 printf ("DW_OP_const4u: %lu", (unsigned long) uvalue);
939 break;
940 case DW_OP_const4s:
941 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
942 printf ("DW_OP_const4s: %ld", (long) svalue);
943 break;
944 case DW_OP_const8u:
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);
949 break;
950 case DW_OP_const8s:
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);
955 break;
956 case DW_OP_constu:
957 printf ("DW_OP_constu: %s",
958 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
959 data += bytes_read;
960 break;
961 case DW_OP_consts:
962 printf ("DW_OP_consts: %s",
963 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
964 data += bytes_read;
965 break;
966 case DW_OP_dup:
967 printf ("DW_OP_dup");
968 break;
969 case DW_OP_drop:
970 printf ("DW_OP_drop");
971 break;
972 case DW_OP_over:
973 printf ("DW_OP_over");
974 break;
975 case DW_OP_pick:
976 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
977 printf ("DW_OP_pick: %ld", (unsigned long) uvalue);
978 break;
979 case DW_OP_swap:
980 printf ("DW_OP_swap");
981 break;
982 case DW_OP_rot:
983 printf ("DW_OP_rot");
984 break;
985 case DW_OP_xderef:
986 printf ("DW_OP_xderef");
987 break;
988 case DW_OP_abs:
989 printf ("DW_OP_abs");
990 break;
991 case DW_OP_and:
992 printf ("DW_OP_and");
993 break;
994 case DW_OP_div:
995 printf ("DW_OP_div");
996 break;
997 case DW_OP_minus:
998 printf ("DW_OP_minus");
999 break;
1000 case DW_OP_mod:
1001 printf ("DW_OP_mod");
1002 break;
1003 case DW_OP_mul:
1004 printf ("DW_OP_mul");
1005 break;
1006 case DW_OP_neg:
1007 printf ("DW_OP_neg");
1008 break;
1009 case DW_OP_not:
1010 printf ("DW_OP_not");
1011 break;
1012 case DW_OP_or:
1013 printf ("DW_OP_or");
1014 break;
1015 case DW_OP_plus:
1016 printf ("DW_OP_plus");
1017 break;
1018 case DW_OP_plus_uconst:
1019 printf ("DW_OP_plus_uconst: %s",
1020 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1021 data += bytes_read;
1022 break;
1023 case DW_OP_shl:
1024 printf ("DW_OP_shl");
1025 break;
1026 case DW_OP_shr:
1027 printf ("DW_OP_shr");
1028 break;
1029 case DW_OP_shra:
1030 printf ("DW_OP_shra");
1031 break;
1032 case DW_OP_xor:
1033 printf ("DW_OP_xor");
1034 break;
1035 case DW_OP_bra:
1036 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1037 printf ("DW_OP_bra: %ld", (long) svalue);
1038 break;
1039 case DW_OP_eq:
1040 printf ("DW_OP_eq");
1041 break;
1042 case DW_OP_ge:
1043 printf ("DW_OP_ge");
1044 break;
1045 case DW_OP_gt:
1046 printf ("DW_OP_gt");
1047 break;
1048 case DW_OP_le:
1049 printf ("DW_OP_le");
1050 break;
1051 case DW_OP_lt:
1052 printf ("DW_OP_lt");
1053 break;
1054 case DW_OP_ne:
1055 printf ("DW_OP_ne");
1056 break;
1057 case DW_OP_skip:
1058 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1059 printf ("DW_OP_skip: %ld", (long) svalue);
1060 break;
1062 case DW_OP_lit0:
1063 case DW_OP_lit1:
1064 case DW_OP_lit2:
1065 case DW_OP_lit3:
1066 case DW_OP_lit4:
1067 case DW_OP_lit5:
1068 case DW_OP_lit6:
1069 case DW_OP_lit7:
1070 case DW_OP_lit8:
1071 case DW_OP_lit9:
1072 case DW_OP_lit10:
1073 case DW_OP_lit11:
1074 case DW_OP_lit12:
1075 case DW_OP_lit13:
1076 case DW_OP_lit14:
1077 case DW_OP_lit15:
1078 case DW_OP_lit16:
1079 case DW_OP_lit17:
1080 case DW_OP_lit18:
1081 case DW_OP_lit19:
1082 case DW_OP_lit20:
1083 case DW_OP_lit21:
1084 case DW_OP_lit22:
1085 case DW_OP_lit23:
1086 case DW_OP_lit24:
1087 case DW_OP_lit25:
1088 case DW_OP_lit26:
1089 case DW_OP_lit27:
1090 case DW_OP_lit28:
1091 case DW_OP_lit29:
1092 case DW_OP_lit30:
1093 case DW_OP_lit31:
1094 printf ("DW_OP_lit%d", op - DW_OP_lit0);
1095 break;
1097 case DW_OP_reg0:
1098 case DW_OP_reg1:
1099 case DW_OP_reg2:
1100 case DW_OP_reg3:
1101 case DW_OP_reg4:
1102 case DW_OP_reg5:
1103 case DW_OP_reg6:
1104 case DW_OP_reg7:
1105 case DW_OP_reg8:
1106 case DW_OP_reg9:
1107 case DW_OP_reg10:
1108 case DW_OP_reg11:
1109 case DW_OP_reg12:
1110 case DW_OP_reg13:
1111 case DW_OP_reg14:
1112 case DW_OP_reg15:
1113 case DW_OP_reg16:
1114 case DW_OP_reg17:
1115 case DW_OP_reg18:
1116 case DW_OP_reg19:
1117 case DW_OP_reg20:
1118 case DW_OP_reg21:
1119 case DW_OP_reg22:
1120 case DW_OP_reg23:
1121 case DW_OP_reg24:
1122 case DW_OP_reg25:
1123 case DW_OP_reg26:
1124 case DW_OP_reg27:
1125 case DW_OP_reg28:
1126 case DW_OP_reg29:
1127 case DW_OP_reg30:
1128 case DW_OP_reg31:
1129 printf ("DW_OP_reg%d (%s)", op - DW_OP_reg0,
1130 regname (op - DW_OP_reg0, 1));
1131 break;
1133 case DW_OP_breg0:
1134 case DW_OP_breg1:
1135 case DW_OP_breg2:
1136 case DW_OP_breg3:
1137 case DW_OP_breg4:
1138 case DW_OP_breg5:
1139 case DW_OP_breg6:
1140 case DW_OP_breg7:
1141 case DW_OP_breg8:
1142 case DW_OP_breg9:
1143 case DW_OP_breg10:
1144 case DW_OP_breg11:
1145 case DW_OP_breg12:
1146 case DW_OP_breg13:
1147 case DW_OP_breg14:
1148 case DW_OP_breg15:
1149 case DW_OP_breg16:
1150 case DW_OP_breg17:
1151 case DW_OP_breg18:
1152 case DW_OP_breg19:
1153 case DW_OP_breg20:
1154 case DW_OP_breg21:
1155 case DW_OP_breg22:
1156 case DW_OP_breg23:
1157 case DW_OP_breg24:
1158 case DW_OP_breg25:
1159 case DW_OP_breg26:
1160 case DW_OP_breg27:
1161 case DW_OP_breg28:
1162 case DW_OP_breg29:
1163 case DW_OP_breg30:
1164 case DW_OP_breg31:
1165 printf ("DW_OP_breg%d (%s): %s",
1166 op - DW_OP_breg0,
1167 regname (op - DW_OP_breg0, 1),
1168 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1169 data += bytes_read;
1170 break;
1172 case DW_OP_regx:
1173 uvalue = read_uleb128 (data, &bytes_read, end);
1174 data += bytes_read;
1175 printf ("DW_OP_regx: %s (%s)",
1176 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1177 break;
1178 case DW_OP_fbreg:
1179 need_frame_base = 1;
1180 printf ("DW_OP_fbreg: %s",
1181 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1182 data += bytes_read;
1183 break;
1184 case DW_OP_bregx:
1185 uvalue = read_uleb128 (data, &bytes_read, end);
1186 data += bytes_read;
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)));
1190 data += bytes_read;
1191 break;
1192 case DW_OP_piece:
1193 printf ("DW_OP_piece: %s",
1194 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1195 data += bytes_read;
1196 break;
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);
1200 break;
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);
1204 break;
1205 case DW_OP_nop:
1206 printf ("DW_OP_nop");
1207 break;
1209 /* DWARF 3 extensions. */
1210 case DW_OP_push_object_address:
1211 printf ("DW_OP_push_object_address");
1212 break;
1213 case DW_OP_call2:
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));
1219 break;
1220 case DW_OP_call4:
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));
1226 break;
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);
1240 else
1242 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1244 printf ("DW_OP_call_ref: <0x%s>", dwarf_vmatoa ("x", uvalue));
1245 break;
1246 case DW_OP_form_tls_address:
1247 printf ("DW_OP_form_tls_address");
1248 break;
1249 case DW_OP_call_frame_cfa:
1250 printf ("DW_OP_call_frame_cfa");
1251 break;
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)));
1256 data += bytes_read;
1257 printf (_("offset: %s "),
1258 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1259 data += bytes_read;
1260 break;
1262 /* DWARF 4 extensions. */
1263 case DW_OP_stack_value:
1264 printf ("DW_OP_stack_value");
1265 break;
1267 case DW_OP_implicit_value:
1268 printf ("DW_OP_implicit_value");
1269 uvalue = read_uleb128 (data, &bytes_read, end);
1270 data += bytes_read;
1271 data = display_block (data, uvalue, end);
1272 break;
1274 /* GNU extensions. */
1275 case DW_OP_GNU_push_tls_address:
1276 printf (_("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown"));
1277 break;
1278 case DW_OP_GNU_uninit:
1279 printf ("DW_OP_GNU_uninit");
1280 /* FIXME: Is there data associated with this OP ? */
1281 break;
1282 case DW_OP_GNU_encoded_addr:
1284 int encoding = 0;
1285 dwarf_vma addr;
1287 if (data < end)
1288 encoding = *data++;
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);
1294 break;
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);
1308 else
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)));
1316 data += bytes_read;
1317 break;
1318 case DW_OP_GNU_entry_value:
1319 uvalue = read_uleb128 (data, &bytes_read, end);
1320 data += bytes_read;
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;
1329 putchar (')');
1330 data += uvalue;
1331 if (data > end)
1332 data = end;
1333 break;
1334 case DW_OP_GNU_const_type:
1335 uvalue = read_uleb128 (data, &bytes_read, end);
1336 data += bytes_read;
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);
1341 break;
1342 case DW_OP_GNU_regval_type:
1343 uvalue = read_uleb128 (data, &bytes_read, end);
1344 data += bytes_read;
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);
1348 data += bytes_read;
1349 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1350 break;
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);
1355 data += bytes_read;
1356 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1357 break;
1358 case DW_OP_GNU_convert:
1359 uvalue = read_uleb128 (data, &bytes_read, end);
1360 data += bytes_read;
1361 printf ("DW_OP_GNU_convert <0x%s>",
1362 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1363 break;
1364 case DW_OP_GNU_reinterpret:
1365 uvalue = read_uleb128 (data, &bytes_read, end);
1366 data += bytes_read;
1367 printf ("DW_OP_GNU_reinterpret <0x%s>",
1368 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1369 break;
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));
1374 break;
1375 case DW_OP_GNU_addr_index:
1376 uvalue = read_uleb128 (data, &bytes_read, end);
1377 data += bytes_read;
1378 printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1379 break;
1380 case DW_OP_GNU_const_index:
1381 uvalue = read_uleb128 (data, &bytes_read, end);
1382 data += bytes_read;
1383 printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1384 break;
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 ? */
1390 break;
1391 case DW_OP_HP_fltconst4:
1392 printf ("DW_OP_HP_fltconst4");
1393 /* FIXME: Is there data associated with this OP ? */
1394 break;
1395 case DW_OP_HP_fltconst8:
1396 printf ("DW_OP_HP_fltconst8");
1397 /* FIXME: Is there data associated with this OP ? */
1398 break;
1399 case DW_OP_HP_mod_range:
1400 printf ("DW_OP_HP_mod_range");
1401 /* FIXME: Is there data associated with this OP ? */
1402 break;
1403 case DW_OP_HP_unmod_range:
1404 printf ("DW_OP_HP_unmod_range");
1405 /* FIXME: Is there data associated with this OP ? */
1406 break;
1407 case DW_OP_HP_tls:
1408 printf ("DW_OP_HP_tls");
1409 /* FIXME: Is there data associated with this OP ? */
1410 break;
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");
1419 break;
1421 default:
1422 if (op >= DW_OP_lo_user
1423 && op <= DW_OP_hi_user)
1424 printf (_("(User defined location op)"));
1425 else
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. */
1432 if (data < end)
1433 printf ("; ");
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;
1446 unsigned int nsets;
1447 unsigned int dw_sect;
1449 if (do_types)
1451 p = tu_sets;
1452 nsets = tu_count;
1453 dw_sect = DW_SECT_TYPES;
1455 else
1457 p = cu_sets;
1458 nsets = cu_count;
1459 dw_sect = DW_SECT_INFO;
1461 while (nsets > 0)
1463 if (p->section_offsets [dw_sect] == cu_offset)
1464 return p;
1465 p++;
1466 nsets--;
1468 return NULL;
1471 /* Add INC to HIGH_BITS:LOW_BITS. */
1472 static void
1473 add64 (dwarf_vma * high_bits, dwarf_vma * low_bits, dwarf_vma inc)
1475 dwarf_vma tmp = * low_bits;
1477 tmp += inc;
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)
1487 ++ * high_bits;
1489 else if (sizeof (tmp) > 8
1490 && (tmp >> 31) > 1)
1492 ++ * high_bits;
1493 tmp &= 0xFFFFFFFF;
1496 * low_bits = tmp;
1499 static unsigned char *
1500 read_and_display_attr_value (unsigned long attribute,
1501 unsigned long form,
1502 unsigned char * data,
1503 unsigned char * end,
1504 dwarf_vma cu_offset,
1505 dwarf_vma pointer_size,
1506 dwarf_vma offset_size,
1507 int dwarf_version,
1508 debug_info * debug_info_p,
1509 int do_loc,
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"));
1521 return data;
1524 switch (form)
1526 default:
1527 break;
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);
1534 else
1535 error (_("Internal error: DWARF version is not 2, 3 or 4.\n"));
1537 break;
1539 case DW_FORM_addr:
1540 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1541 break;
1543 case DW_FORM_strp:
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);
1548 break;
1550 case DW_FORM_flag_present:
1551 uvalue = 1;
1552 break;
1554 case DW_FORM_ref1:
1555 case DW_FORM_flag:
1556 case DW_FORM_data1:
1557 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1558 break;
1560 case DW_FORM_ref2:
1561 case DW_FORM_data2:
1562 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1563 break;
1565 case DW_FORM_ref4:
1566 case DW_FORM_data4:
1567 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1568 break;
1570 case DW_FORM_sdata:
1571 uvalue = read_sleb128 (data, & bytes_read, end);
1572 data += bytes_read;
1573 break;
1575 case DW_FORM_GNU_str_index:
1576 uvalue = read_uleb128 (data, & bytes_read, end);
1577 data += bytes_read;
1578 break;
1580 case DW_FORM_ref_udata:
1581 case DW_FORM_udata:
1582 uvalue = read_uleb128 (data, & bytes_read, end);
1583 data += bytes_read;
1584 break;
1586 case DW_FORM_indirect:
1587 form = read_uleb128 (data, & bytes_read, end);
1588 data += bytes_read;
1589 if (!do_loc)
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,
1595 section, this_set);
1596 case DW_FORM_GNU_addr_index:
1597 uvalue = read_uleb128 (data, & bytes_read, end);
1598 data += bytes_read;
1599 break;
1602 switch (form)
1604 case DW_FORM_ref_addr:
1605 if (!do_loc)
1606 printf (" <0x%s>", dwarf_vmatoa ("x",uvalue));
1607 break;
1609 case DW_FORM_GNU_ref_alt:
1610 if (!do_loc)
1611 printf (" <alt 0x%s>", dwarf_vmatoa ("x",uvalue));
1612 break;
1614 case DW_FORM_ref1:
1615 case DW_FORM_ref2:
1616 case DW_FORM_ref4:
1617 case DW_FORM_ref_udata:
1618 if (!do_loc)
1619 printf (" <0x%s>", dwarf_vmatoa ("x", uvalue + cu_offset));
1620 break;
1622 case DW_FORM_data4:
1623 case DW_FORM_addr:
1624 case DW_FORM_sec_offset:
1625 if (!do_loc)
1626 printf (" 0x%s", dwarf_vmatoa ("x", uvalue));
1627 break;
1629 case DW_FORM_flag_present:
1630 case DW_FORM_flag:
1631 case DW_FORM_data1:
1632 case DW_FORM_data2:
1633 case DW_FORM_sdata:
1634 case DW_FORM_udata:
1635 if (!do_loc)
1636 printf (" %s", dwarf_vmatoa ("d", uvalue));
1637 break;
1639 case DW_FORM_ref8:
1640 case DW_FORM_data8:
1641 if (!do_loc)
1643 dwarf_vma high_bits;
1644 dwarf_vma utmp;
1645 char buf[64];
1647 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1648 utmp = uvalue;
1649 if (form == DW_FORM_ref8)
1650 add64 (& high_bits, & utmp, cu_offset);
1651 printf (" 0x%s",
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);
1660 else
1661 error (_("DW_FORM_data8 is unsupported when sizeof (dwarf_vma) != 8\n"));
1664 data += 8;
1665 break;
1667 case DW_FORM_string:
1668 if (!do_loc)
1669 printf (" %.*s", (int) (end - data), data);
1670 data += strnlen ((char *) data, end - data) + 1;
1671 break;
1673 case DW_FORM_block:
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"));
1680 uvalue = 0;
1681 block_start = end;
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;
1693 if (do_loc)
1694 data = block_start + uvalue;
1695 else
1696 data = display_block (block_start, uvalue, end);
1697 break;
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"));
1705 uvalue = 0;
1706 block_start = end;
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;
1714 if (do_loc)
1715 data = block_start + uvalue;
1716 else
1717 data = display_block (block_start, uvalue, end);
1718 break;
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"));
1726 uvalue = 0;
1727 block_start = end;
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;
1735 if (do_loc)
1736 data = block_start + uvalue;
1737 else
1738 data = display_block (block_start, uvalue, end);
1739 break;
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"));
1748 uvalue = 0;
1749 block_start = end;
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;
1759 if (do_loc)
1760 data = block_start + uvalue;
1761 else
1762 data = display_block (block_start, uvalue, end);
1763 break;
1765 case DW_FORM_strp:
1766 if (!do_loc)
1767 printf (_(" (indirect string, offset: 0x%s): %s"),
1768 dwarf_vmatoa ("x", uvalue),
1769 fetch_indirect_string (uvalue));
1770 break;
1772 case DW_FORM_GNU_str_index:
1773 if (!do_loc)
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));
1782 break;
1784 case DW_FORM_GNU_strp_alt:
1785 if (!do_loc)
1786 printf (_(" (alt indirect string, offset: 0x%s)"),
1787 dwarf_vmatoa ("x", uvalue));
1788 break;
1790 case DW_FORM_indirect:
1791 /* Handled above. */
1792 break;
1794 case DW_FORM_ref_sig8:
1795 if (!do_loc)
1797 dwarf_vma high_bits;
1798 char buf[64];
1800 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1801 printf (" signature: 0x%s",
1802 dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf)));
1804 data += 8;
1805 break;
1807 case DW_FORM_GNU_addr_index:
1808 if (!do_loc)
1809 printf (_(" (addr_index: 0x%s): %s"),
1810 dwarf_vmatoa ("x", uvalue),
1811 fetch_indexed_value (uvalue * pointer_size, pointer_size));
1812 break;
1814 default:
1815 warn (_("Unrecognized form: %lu\n"), form);
1816 break;
1819 if ((do_loc || do_debug_loc || do_debug_ranges)
1820 && num_debug_info_entries == 0
1821 && debug_info_p != NULL)
1823 switch (attribute)
1825 case DW_AT_frame_base:
1826 have_frame_base = 1;
1827 case DW_AT_location:
1828 case DW_AT_string_length:
1829 case DW_AT_return_addr:
1830 case DW_AT_data_member_location:
1831 case DW_AT_vtable_elem_location:
1832 case DW_AT_segment:
1833 case DW_AT_static_link:
1834 case DW_AT_use_location:
1835 case DW_AT_GNU_call_site_value:
1836 case DW_AT_GNU_call_site_data_value:
1837 case DW_AT_GNU_call_site_target:
1838 case DW_AT_GNU_call_site_target_clobbered:
1839 if ((dwarf_version < 4
1840 && (form == DW_FORM_data4 || form == DW_FORM_data8))
1841 || form == DW_FORM_sec_offset)
1843 /* Process location list. */
1844 unsigned int lmax = debug_info_p->max_loc_offsets;
1845 unsigned int num = debug_info_p->num_loc_offsets;
1847 if (lmax == 0 || num >= lmax)
1849 lmax += 1024;
1850 debug_info_p->loc_offsets = (dwarf_vma *)
1851 xcrealloc (debug_info_p->loc_offsets,
1852 lmax, sizeof (*debug_info_p->loc_offsets));
1853 debug_info_p->have_frame_base = (int *)
1854 xcrealloc (debug_info_p->have_frame_base,
1855 lmax, sizeof (*debug_info_p->have_frame_base));
1856 debug_info_p->max_loc_offsets = lmax;
1858 if (this_set != NULL)
1859 uvalue += this_set->section_offsets [DW_SECT_LOC];
1860 debug_info_p->loc_offsets [num] = uvalue;
1861 debug_info_p->have_frame_base [num] = have_frame_base;
1862 debug_info_p->num_loc_offsets++;
1864 break;
1866 case DW_AT_low_pc:
1867 if (need_base_address)
1868 debug_info_p->base_address = uvalue;
1869 break;
1871 case DW_AT_GNU_addr_base:
1872 debug_info_p->addr_base = uvalue;
1873 break;
1875 case DW_AT_GNU_ranges_base:
1876 debug_info_p->ranges_base = uvalue;
1877 break;
1879 case DW_AT_ranges:
1880 if ((dwarf_version < 4
1881 && (form == DW_FORM_data4 || form == DW_FORM_data8))
1882 || form == DW_FORM_sec_offset)
1884 /* Process range list. */
1885 unsigned int lmax = debug_info_p->max_range_lists;
1886 unsigned int num = debug_info_p->num_range_lists;
1888 if (lmax == 0 || num >= lmax)
1890 lmax += 1024;
1891 debug_info_p->range_lists = (dwarf_vma *)
1892 xcrealloc (debug_info_p->range_lists,
1893 lmax, sizeof (*debug_info_p->range_lists));
1894 debug_info_p->max_range_lists = lmax;
1896 debug_info_p->range_lists [num] = uvalue;
1897 debug_info_p->num_range_lists++;
1899 break;
1901 default:
1902 break;
1906 if (do_loc || attribute == 0)
1907 return data;
1909 /* For some attributes we can display further information. */
1910 switch (attribute)
1912 case DW_AT_inline:
1913 printf ("\t");
1914 switch (uvalue)
1916 case DW_INL_not_inlined:
1917 printf (_("(not inlined)"));
1918 break;
1919 case DW_INL_inlined:
1920 printf (_("(inlined)"));
1921 break;
1922 case DW_INL_declared_not_inlined:
1923 printf (_("(declared as inline but ignored)"));
1924 break;
1925 case DW_INL_declared_inlined:
1926 printf (_("(declared as inline and inlined)"));
1927 break;
1928 default:
1929 printf (_(" (Unknown inline attribute value: %s)"),
1930 dwarf_vmatoa ("x", uvalue));
1931 break;
1933 break;
1935 case DW_AT_language:
1936 printf ("\t");
1937 switch (uvalue)
1939 /* Ordered by the numeric value of these constants. */
1940 case DW_LANG_C89: printf ("(ANSI C)"); break;
1941 case DW_LANG_C: printf ("(non-ANSI C)"); break;
1942 case DW_LANG_Ada83: printf ("(Ada)"); break;
1943 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
1944 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
1945 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
1946 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
1947 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
1948 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
1949 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
1950 /* DWARF 2.1 values. */
1951 case DW_LANG_Java: printf ("(Java)"); break;
1952 case DW_LANG_C99: printf ("(ANSI C99)"); break;
1953 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
1954 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
1955 /* DWARF 3 values. */
1956 case DW_LANG_PLI: printf ("(PLI)"); break;
1957 case DW_LANG_ObjC: printf ("(Objective C)"); break;
1958 case DW_LANG_ObjC_plus_plus: printf ("(Objective C++)"); break;
1959 case DW_LANG_UPC: printf ("(Unified Parallel C)"); break;
1960 case DW_LANG_D: printf ("(D)"); break;
1961 /* DWARF 4 values. */
1962 case DW_LANG_Python: printf ("(Python)"); break;
1963 /* DWARF 5 values. */
1964 case DW_LANG_Go: printf ("(Go)"); break;
1965 case DW_LANG_C_plus_plus_11: printf ("(C++11)"); break;
1966 case DW_LANG_C11: printf ("(C11)"); break;
1967 case DW_LANG_C_plus_plus_14: printf ("(C++14)"); break;
1968 case DW_LANG_Fortran03: printf ("(Fortran 03)"); break;
1969 case DW_LANG_Fortran08: printf ("(Fortran 08)"); break;
1970 /* MIPS extension. */
1971 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
1972 /* UPC extension. */
1973 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
1974 default:
1975 if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
1976 printf (_("(implementation defined: %s)"),
1977 dwarf_vmatoa ("x", uvalue));
1978 else
1979 printf (_("(Unknown: %s)"), dwarf_vmatoa ("x", uvalue));
1980 break;
1982 break;
1984 case DW_AT_encoding:
1985 printf ("\t");
1986 switch (uvalue)
1988 case DW_ATE_void: printf ("(void)"); break;
1989 case DW_ATE_address: printf ("(machine address)"); break;
1990 case DW_ATE_boolean: printf ("(boolean)"); break;
1991 case DW_ATE_complex_float: printf ("(complex float)"); break;
1992 case DW_ATE_float: printf ("(float)"); break;
1993 case DW_ATE_signed: printf ("(signed)"); break;
1994 case DW_ATE_signed_char: printf ("(signed char)"); break;
1995 case DW_ATE_unsigned: printf ("(unsigned)"); break;
1996 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
1997 /* DWARF 2.1 values: */
1998 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
1999 case DW_ATE_decimal_float: printf ("(decimal float)"); break;
2000 /* DWARF 3 values: */
2001 case DW_ATE_packed_decimal: printf ("(packed_decimal)"); break;
2002 case DW_ATE_numeric_string: printf ("(numeric_string)"); break;
2003 case DW_ATE_edited: printf ("(edited)"); break;
2004 case DW_ATE_signed_fixed: printf ("(signed_fixed)"); break;
2005 case DW_ATE_unsigned_fixed: printf ("(unsigned_fixed)"); break;
2006 /* HP extensions: */
2007 case DW_ATE_HP_float80: printf ("(HP_float80)"); break;
2008 case DW_ATE_HP_complex_float80: printf ("(HP_complex_float80)"); break;
2009 case DW_ATE_HP_float128: printf ("(HP_float128)"); break;
2010 case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
2011 case DW_ATE_HP_floathpintel: printf ("(HP_floathpintel)"); break;
2012 case DW_ATE_HP_imaginary_float80: printf ("(HP_imaginary_float80)"); break;
2013 case DW_ATE_HP_imaginary_float128: printf ("(HP_imaginary_float128)"); break;
2014 /* DWARF 4 values: */
2015 case DW_ATE_UTF: printf ("(unicode string)"); break;
2017 default:
2018 if (uvalue >= DW_ATE_lo_user
2019 && uvalue <= DW_ATE_hi_user)
2020 printf (_("(user defined type)"));
2021 else
2022 printf (_("(unknown type)"));
2023 break;
2025 break;
2027 case DW_AT_accessibility:
2028 printf ("\t");
2029 switch (uvalue)
2031 case DW_ACCESS_public: printf ("(public)"); break;
2032 case DW_ACCESS_protected: printf ("(protected)"); break;
2033 case DW_ACCESS_private: printf ("(private)"); break;
2034 default:
2035 printf (_("(unknown accessibility)"));
2036 break;
2038 break;
2040 case DW_AT_visibility:
2041 printf ("\t");
2042 switch (uvalue)
2044 case DW_VIS_local: printf ("(local)"); break;
2045 case DW_VIS_exported: printf ("(exported)"); break;
2046 case DW_VIS_qualified: printf ("(qualified)"); break;
2047 default: printf (_("(unknown visibility)")); break;
2049 break;
2051 case DW_AT_virtuality:
2052 printf ("\t");
2053 switch (uvalue)
2055 case DW_VIRTUALITY_none: printf ("(none)"); break;
2056 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
2057 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
2058 default: printf (_("(unknown virtuality)")); break;
2060 break;
2062 case DW_AT_identifier_case:
2063 printf ("\t");
2064 switch (uvalue)
2066 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
2067 case DW_ID_up_case: printf ("(up_case)"); break;
2068 case DW_ID_down_case: printf ("(down_case)"); break;
2069 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
2070 default: printf (_("(unknown case)")); break;
2072 break;
2074 case DW_AT_calling_convention:
2075 printf ("\t");
2076 switch (uvalue)
2078 case DW_CC_normal: printf ("(normal)"); break;
2079 case DW_CC_program: printf ("(program)"); break;
2080 case DW_CC_nocall: printf ("(nocall)"); break;
2081 default:
2082 if (uvalue >= DW_CC_lo_user
2083 && uvalue <= DW_CC_hi_user)
2084 printf (_("(user defined)"));
2085 else
2086 printf (_("(unknown convention)"));
2088 break;
2090 case DW_AT_ordering:
2091 printf ("\t");
2092 switch (uvalue)
2094 case -1: printf (_("(undefined)")); break;
2095 case 0: printf ("(row major)"); break;
2096 case 1: printf ("(column major)"); break;
2098 break;
2100 case DW_AT_frame_base:
2101 have_frame_base = 1;
2102 case DW_AT_location:
2103 case DW_AT_string_length:
2104 case DW_AT_return_addr:
2105 case DW_AT_data_member_location:
2106 case DW_AT_vtable_elem_location:
2107 case DW_AT_segment:
2108 case DW_AT_static_link:
2109 case DW_AT_use_location:
2110 case DW_AT_GNU_call_site_value:
2111 case DW_AT_GNU_call_site_data_value:
2112 case DW_AT_GNU_call_site_target:
2113 case DW_AT_GNU_call_site_target_clobbered:
2114 if ((dwarf_version < 4
2115 && (form == DW_FORM_data4 || form == DW_FORM_data8))
2116 || form == DW_FORM_sec_offset)
2117 printf (_(" (location list)"));
2118 /* Fall through. */
2119 case DW_AT_allocated:
2120 case DW_AT_associated:
2121 case DW_AT_data_location:
2122 case DW_AT_stride:
2123 case DW_AT_upper_bound:
2124 case DW_AT_lower_bound:
2125 if (block_start)
2127 int need_frame_base;
2129 printf ("\t(");
2130 need_frame_base = decode_location_expression (block_start,
2131 pointer_size,
2132 offset_size,
2133 dwarf_version,
2134 uvalue,
2135 cu_offset, section);
2136 printf (")");
2137 if (need_frame_base && !have_frame_base)
2138 printf (_(" [without DW_AT_frame_base]"));
2140 break;
2142 case DW_AT_import:
2144 if (form == DW_FORM_ref_sig8
2145 || form == DW_FORM_GNU_ref_alt)
2146 break;
2148 if (form == DW_FORM_ref1
2149 || form == DW_FORM_ref2
2150 || form == DW_FORM_ref4
2151 || form == DW_FORM_ref_udata)
2152 uvalue += cu_offset;
2154 if (uvalue >= section->size)
2155 warn (_("Offset %s used as value for DW_AT_import attribute of DIE at offset 0x%lx is too big.\n"),
2156 dwarf_vmatoa ("x", uvalue),
2157 (unsigned long) (orig_data - section->start));
2158 else
2160 unsigned long abbrev_number;
2161 abbrev_entry * entry;
2163 abbrev_number = read_uleb128 (section->start + uvalue, NULL, end);
2165 printf (_("\t[Abbrev Number: %ld"), abbrev_number);
2166 /* Don't look up abbrev for DW_FORM_ref_addr, as it very often will
2167 use different abbrev table, and we don't track .debug_info chunks
2168 yet. */
2169 if (form != DW_FORM_ref_addr)
2171 for (entry = first_abbrev; entry != NULL; entry = entry->next)
2172 if (entry->entry == abbrev_number)
2173 break;
2174 if (entry != NULL)
2175 printf (" (%s)", get_TAG_name (entry->tag));
2177 printf ("]");
2180 break;
2182 default:
2183 break;
2186 return data;
2189 static const char *
2190 get_AT_name (unsigned long attribute)
2192 const char *name;
2194 if (attribute == 0)
2195 return "DW_AT value: 0";
2197 /* One value is shared by the MIPS and HP extensions: */
2198 if (attribute == DW_AT_MIPS_fde)
2199 return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
2201 name = get_DW_AT_name (attribute);
2203 if (name == NULL)
2205 static char buffer[100];
2207 snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
2208 attribute);
2209 return buffer;
2212 return name;
2215 static unsigned char *
2216 read_and_display_attr (unsigned long attribute,
2217 unsigned long form,
2218 unsigned char * data,
2219 unsigned char * end,
2220 dwarf_vma cu_offset,
2221 dwarf_vma pointer_size,
2222 dwarf_vma offset_size,
2223 int dwarf_version,
2224 debug_info * debug_info_p,
2225 int do_loc,
2226 struct dwarf_section * section,
2227 struct cu_tu_set * this_set)
2229 if (!do_loc)
2230 printf (" %-18s:", get_AT_name (attribute));
2231 data = read_and_display_attr_value (attribute, form, data, end,
2232 cu_offset, pointer_size, offset_size,
2233 dwarf_version, debug_info_p,
2234 do_loc, section, this_set);
2235 if (!do_loc)
2236 printf ("\n");
2237 return data;
2240 /* Process the contents of a .debug_info section. If do_loc is non-zero
2241 then we are scanning for location lists and we do not want to display
2242 anything to the user. If do_types is non-zero, we are processing
2243 a .debug_types section instead of a .debug_info section. */
2245 static int
2246 process_debug_info (struct dwarf_section *section,
2247 void *file,
2248 enum dwarf_section_display_enum abbrev_sec,
2249 int do_loc,
2250 int do_types)
2252 unsigned char *start = section->start;
2253 unsigned char *end = start + section->size;
2254 unsigned char *section_begin;
2255 unsigned int unit;
2256 unsigned int num_units = 0;
2258 if ((do_loc || do_debug_loc || do_debug_ranges)
2259 && num_debug_info_entries == 0
2260 && ! do_types)
2262 dwarf_vma length;
2264 /* First scan the section to get the number of comp units. */
2265 for (section_begin = start, num_units = 0; section_begin < end;
2266 num_units ++)
2268 /* Read the first 4 bytes. For a 32-bit DWARF section, this
2269 will be the length. For a 64-bit DWARF section, it'll be
2270 the escape code 0xffffffff followed by an 8 byte length. */
2271 SAFE_BYTE_GET (length, section_begin, 4, end);
2273 if (length == 0xffffffff)
2275 SAFE_BYTE_GET (length, section_begin + 4, 8, end);
2276 section_begin += length + 12;
2278 else if (length >= 0xfffffff0 && length < 0xffffffff)
2280 warn (_("Reserved length value (0x%s) found in section %s\n"),
2281 dwarf_vmatoa ("x", length), section->name);
2282 return 0;
2284 else
2285 section_begin += length + 4;
2287 /* Negative values are illegal, they may even cause infinite
2288 looping. This can happen if we can't accurately apply
2289 relocations to an object file, or if the file is corrupt. */
2290 if ((signed long) length <= 0 || section_begin < start)
2292 warn (_("Corrupt unit length (0x%s) found in section %s\n"),
2293 dwarf_vmatoa ("x", length), section->name);
2294 return 0;
2298 if (num_units == 0)
2300 error (_("No comp units in %s section ?\n"), section->name);
2301 return 0;
2304 /* Then allocate an array to hold the information. */
2305 debug_information = (debug_info *) cmalloc (num_units,
2306 sizeof (* debug_information));
2307 if (debug_information == NULL)
2309 error (_("Not enough memory for a debug info array of %u entries\n"),
2310 num_units);
2311 alloc_num_debug_info_entries = num_debug_info_entries = 0;
2312 return 0;
2314 /* PR 17531: file: 92ca3797.
2315 We cannot rely upon the debug_information array being initialised
2316 before it is used. A corrupt file could easily contain references
2317 to a unit for which information has not been made available. So
2318 we ensure that the array is zeroed here. */
2319 memset (debug_information, 0, num_units * sizeof (*debug_information));
2321 alloc_num_debug_info_entries = num_units;
2324 if (!do_loc)
2326 if (dwarf_start_die == 0)
2327 printf (_("Contents of the %s section:\n\n"), section->name);
2329 load_debug_section (str, file);
2330 load_debug_section (str_dwo, file);
2331 load_debug_section (str_index, file);
2332 load_debug_section (str_index_dwo, file);
2333 load_debug_section (debug_addr, file);
2336 load_debug_section (abbrev_sec, file);
2337 if (debug_displays [abbrev_sec].section.start == NULL)
2339 warn (_("Unable to locate %s section!\n"),
2340 debug_displays [abbrev_sec].section.name);
2341 return 0;
2344 for (section_begin = start, unit = 0; start < end; unit++)
2346 DWARF2_Internal_CompUnit compunit;
2347 unsigned char *hdrptr;
2348 unsigned char *tags;
2349 int level, last_level, saved_level;
2350 dwarf_vma cu_offset;
2351 unsigned int offset_size;
2352 int initial_length_size;
2353 dwarf_vma signature_high = 0;
2354 dwarf_vma signature_low = 0;
2355 dwarf_vma type_offset = 0;
2356 struct cu_tu_set *this_set;
2357 dwarf_vma abbrev_base;
2358 size_t abbrev_size;
2360 hdrptr = start;
2362 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 4, end);
2364 if (compunit.cu_length == 0xffffffff)
2366 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 8, end);
2367 offset_size = 8;
2368 initial_length_size = 12;
2370 else
2372 offset_size = 4;
2373 initial_length_size = 4;
2376 SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end);
2378 cu_offset = start - section_begin;
2380 this_set = find_cu_tu_set_v2 (cu_offset, do_types);
2382 SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
2384 if (this_set == NULL)
2386 abbrev_base = 0;
2387 abbrev_size = debug_displays [abbrev_sec].section.size;
2389 else
2391 abbrev_base = this_set->section_offsets [DW_SECT_ABBREV];
2392 abbrev_size = this_set->section_sizes [DW_SECT_ABBREV];
2395 SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
2396 /* PR 17512: file: 001-108546-0.001:0.1. */
2397 if (compunit.cu_pointer_size < 2 || compunit.cu_pointer_size > 8)
2399 warn (_("Invalid pointer size (%d) in compunit header, using %d instead\n"),
2400 compunit.cu_pointer_size, offset_size);
2401 compunit.cu_pointer_size = offset_size;
2404 if (do_types)
2406 SAFE_BYTE_GET64 (hdrptr, &signature_high, &signature_low, end);
2407 hdrptr += 8;
2408 SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end);
2411 if ((do_loc || do_debug_loc || do_debug_ranges)
2412 && num_debug_info_entries == 0
2413 && ! do_types)
2415 debug_information [unit].cu_offset = cu_offset;
2416 debug_information [unit].pointer_size
2417 = compunit.cu_pointer_size;
2418 debug_information [unit].offset_size = offset_size;
2419 debug_information [unit].dwarf_version = compunit.cu_version;
2420 debug_information [unit].base_address = 0;
2421 debug_information [unit].addr_base = DEBUG_INFO_UNAVAILABLE;
2422 debug_information [unit].ranges_base = DEBUG_INFO_UNAVAILABLE;
2423 debug_information [unit].loc_offsets = NULL;
2424 debug_information [unit].have_frame_base = NULL;
2425 debug_information [unit].max_loc_offsets = 0;
2426 debug_information [unit].num_loc_offsets = 0;
2427 debug_information [unit].range_lists = NULL;
2428 debug_information [unit].max_range_lists= 0;
2429 debug_information [unit].num_range_lists = 0;
2432 if (!do_loc && dwarf_start_die == 0)
2434 printf (_(" Compilation Unit @ offset 0x%s:\n"),
2435 dwarf_vmatoa ("x", cu_offset));
2436 printf (_(" Length: 0x%s (%s)\n"),
2437 dwarf_vmatoa ("x", compunit.cu_length),
2438 offset_size == 8 ? "64-bit" : "32-bit");
2439 printf (_(" Version: %d\n"), compunit.cu_version);
2440 printf (_(" Abbrev Offset: 0x%s\n"),
2441 dwarf_vmatoa ("x", compunit.cu_abbrev_offset));
2442 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
2443 if (do_types)
2445 char buf[64];
2447 printf (_(" Signature: 0x%s\n"),
2448 dwarf_vmatoa64 (signature_high, signature_low,
2449 buf, sizeof (buf)));
2450 printf (_(" Type Offset: 0x%s\n"),
2451 dwarf_vmatoa ("x", type_offset));
2453 if (this_set != NULL)
2455 dwarf_vma *offsets = this_set->section_offsets;
2456 size_t *sizes = this_set->section_sizes;
2458 printf (_(" Section contributions:\n"));
2459 printf (_(" .debug_abbrev.dwo: 0x%s 0x%s\n"),
2460 dwarf_vmatoa ("x", offsets [DW_SECT_ABBREV]),
2461 dwarf_vmatoa ("x", sizes [DW_SECT_ABBREV]));
2462 printf (_(" .debug_line.dwo: 0x%s 0x%s\n"),
2463 dwarf_vmatoa ("x", offsets [DW_SECT_LINE]),
2464 dwarf_vmatoa ("x", sizes [DW_SECT_LINE]));
2465 printf (_(" .debug_loc.dwo: 0x%s 0x%s\n"),
2466 dwarf_vmatoa ("x", offsets [DW_SECT_LOC]),
2467 dwarf_vmatoa ("x", sizes [DW_SECT_LOC]));
2468 printf (_(" .debug_str_offsets.dwo: 0x%s 0x%s\n"),
2469 dwarf_vmatoa ("x", offsets [DW_SECT_STR_OFFSETS]),
2470 dwarf_vmatoa ("x", sizes [DW_SECT_STR_OFFSETS]));
2474 if (cu_offset + compunit.cu_length + initial_length_size
2475 > section->size)
2477 warn (_("Debug info is corrupted, length of CU at %s"
2478 " extends beyond end of section (length = %s)\n"),
2479 dwarf_vmatoa ("x", cu_offset),
2480 dwarf_vmatoa ("x", compunit.cu_length));
2481 num_units = unit;
2482 break;
2484 tags = hdrptr;
2485 start += compunit.cu_length + initial_length_size;
2487 if (start > end)
2489 warn (_("Debug info is corrupt. CU at %s extends beyond end of section"),
2490 dwarf_vmatoa ("x", cu_offset));
2491 start = end;
2494 if (compunit.cu_version != 2
2495 && compunit.cu_version != 3
2496 && compunit.cu_version != 4)
2498 warn (_("CU at offset %s contains corrupt or "
2499 "unsupported version number: %d.\n"),
2500 dwarf_vmatoa ("x", cu_offset), compunit.cu_version);
2501 continue;
2504 free_abbrevs ();
2506 /* Process the abbrevs used by this compilation unit. */
2507 if (compunit.cu_abbrev_offset >= abbrev_size)
2508 warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"),
2509 (unsigned long) compunit.cu_abbrev_offset,
2510 (unsigned long) abbrev_size);
2511 /* PR 17531: file:4bcd9ce9. */
2512 else if ((abbrev_base + abbrev_size)
2513 > debug_displays [abbrev_sec].section.size)
2514 warn (_("Debug info is corrupted, abbrev size (%lx) is larger than abbrev section size (%lx)\n"),
2515 (unsigned long) abbrev_base + abbrev_size,
2516 (unsigned long) debug_displays [abbrev_sec].section.size);
2517 else
2518 process_abbrev_section
2519 (((unsigned char *) debug_displays [abbrev_sec].section.start
2520 + abbrev_base + compunit.cu_abbrev_offset),
2521 ((unsigned char *) debug_displays [abbrev_sec].section.start
2522 + abbrev_base + abbrev_size));
2524 level = 0;
2525 last_level = level;
2526 saved_level = -1;
2527 while (tags < start)
2529 unsigned int bytes_read;
2530 unsigned long abbrev_number;
2531 unsigned long die_offset;
2532 abbrev_entry *entry;
2533 abbrev_attr *attr;
2534 int do_printing = 1;
2536 die_offset = tags - section_begin;
2538 abbrev_number = read_uleb128 (tags, & bytes_read, start);
2539 tags += bytes_read;
2541 /* A null DIE marks the end of a list of siblings or it may also be
2542 a section padding. */
2543 if (abbrev_number == 0)
2545 /* Check if it can be a section padding for the last CU. */
2546 if (level == 0 && start == end)
2548 unsigned char *chk;
2550 for (chk = tags; chk < start; chk++)
2551 if (*chk != 0)
2552 break;
2553 if (chk == start)
2554 break;
2557 if (!do_loc && die_offset >= dwarf_start_die
2558 && (dwarf_cutoff_level == -1
2559 || level < dwarf_cutoff_level))
2560 printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
2561 level, die_offset);
2563 --level;
2564 if (level < 0)
2566 static unsigned num_bogus_warns = 0;
2568 if (num_bogus_warns < 3)
2570 warn (_("Bogus end-of-siblings marker detected at offset %lx in %s section\n"),
2571 die_offset, section->name);
2572 num_bogus_warns ++;
2573 if (num_bogus_warns == 3)
2574 warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
2577 if (dwarf_start_die != 0 && level < saved_level)
2578 return 1;
2579 continue;
2582 if (!do_loc)
2584 if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
2585 do_printing = 0;
2586 else
2588 if (dwarf_start_die != 0 && die_offset == dwarf_start_die)
2589 saved_level = level;
2590 do_printing = (dwarf_cutoff_level == -1
2591 || level < dwarf_cutoff_level);
2592 if (do_printing)
2593 printf (_(" <%d><%lx>: Abbrev Number: %lu"),
2594 level, die_offset, abbrev_number);
2595 else if (dwarf_cutoff_level == -1
2596 || last_level < dwarf_cutoff_level)
2597 printf (_(" <%d><%lx>: ...\n"), level, die_offset);
2598 last_level = level;
2602 /* Scan through the abbreviation list until we reach the
2603 correct entry. */
2604 for (entry = first_abbrev;
2605 entry && entry->entry != abbrev_number;
2606 entry = entry->next)
2607 continue;
2609 if (entry == NULL)
2611 if (!do_loc && do_printing)
2613 printf ("\n");
2614 fflush (stdout);
2616 warn (_("DIE at offset 0x%lx refers to abbreviation number %lu which does not exist\n"),
2617 die_offset, abbrev_number);
2618 return 0;
2621 if (!do_loc && do_printing)
2622 printf (" (%s)\n", get_TAG_name (entry->tag));
2624 switch (entry->tag)
2626 default:
2627 need_base_address = 0;
2628 break;
2629 case DW_TAG_compile_unit:
2630 need_base_address = 1;
2631 break;
2632 case DW_TAG_entry_point:
2633 case DW_TAG_subprogram:
2634 need_base_address = 0;
2635 /* Assuming that there is no DW_AT_frame_base. */
2636 have_frame_base = 0;
2637 break;
2640 for (attr = entry->first_attr;
2641 attr && attr->attribute;
2642 attr = attr->next)
2644 debug_info *arg;
2646 if (! do_loc && do_printing)
2647 /* Show the offset from where the tag was extracted. */
2648 printf (" <%lx>", (unsigned long)(tags - section_begin));
2650 if (debug_information && unit < alloc_num_debug_info_entries)
2651 arg = debug_information + unit;
2652 else
2653 arg = NULL;
2655 tags = read_and_display_attr (attr->attribute,
2656 attr->form,
2657 tags,
2658 end,
2659 cu_offset,
2660 compunit.cu_pointer_size,
2661 offset_size,
2662 compunit.cu_version,
2663 arg,
2664 do_loc || ! do_printing,
2665 section,
2666 this_set);
2669 if (entry->children)
2670 ++level;
2674 /* Set num_debug_info_entries here so that it can be used to check if
2675 we need to process .debug_loc and .debug_ranges sections. */
2676 if ((do_loc || do_debug_loc || do_debug_ranges)
2677 && num_debug_info_entries == 0
2678 && ! do_types)
2680 if (num_units > alloc_num_debug_info_entries)
2681 num_debug_info_entries = alloc_num_debug_info_entries;
2682 else
2683 num_debug_info_entries = num_units;
2686 if (!do_loc)
2687 printf ("\n");
2689 return 1;
2692 /* Locate and scan the .debug_info section in the file and record the pointer
2693 sizes and offsets for the compilation units in it. Usually an executable
2694 will have just one pointer size, but this is not guaranteed, and so we try
2695 not to make any assumptions. Returns zero upon failure, or the number of
2696 compilation units upon success. */
2698 static unsigned int
2699 load_debug_info (void * file)
2701 /* Reset the last pointer size so that we can issue correct error
2702 messages if we are displaying the contents of more than one section. */
2703 last_pointer_size = 0;
2704 warned_about_missing_comp_units = FALSE;
2706 /* If we have already tried and failed to load the .debug_info
2707 section then do not bother to repeat the task. */
2708 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
2709 return 0;
2711 /* If we already have the information there is nothing else to do. */
2712 if (num_debug_info_entries > 0)
2713 return num_debug_info_entries;
2715 /* If this is a DWARF package file, load the CU and TU indexes. */
2716 load_cu_tu_indexes (file);
2718 if (load_debug_section (info, file)
2719 && process_debug_info (&debug_displays [info].section, file, abbrev, 1, 0))
2720 return num_debug_info_entries;
2722 if (load_debug_section (info_dwo, file)
2723 && process_debug_info (&debug_displays [info_dwo].section, file,
2724 abbrev_dwo, 1, 0))
2725 return num_debug_info_entries;
2727 num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
2728 return 0;
2731 /* Read a DWARF .debug_line section header starting at DATA.
2732 Upon success returns an updated DATA pointer and the LINFO
2733 structure and the END_OF_SEQUENCE pointer will be filled in.
2734 Otherwise returns NULL. */
2736 static unsigned char *
2737 read_debug_line_header (struct dwarf_section * section,
2738 unsigned char * data,
2739 unsigned char * end,
2740 DWARF2_Internal_LineInfo * linfo,
2741 unsigned char ** end_of_sequence)
2743 unsigned char *hdrptr;
2744 unsigned int offset_size;
2745 unsigned int initial_length_size;
2747 /* Extract information from the Line Number Program Header.
2748 (section 6.2.4 in the Dwarf3 doc). */
2749 hdrptr = data;
2751 /* Get and check the length of the block. */
2752 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 4, end);
2754 if (linfo->li_length == 0xffffffff)
2756 /* This section is 64-bit DWARF 3. */
2757 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 8, end);
2758 offset_size = 8;
2759 initial_length_size = 12;
2761 else
2763 offset_size = 4;
2764 initial_length_size = 4;
2767 if (linfo->li_length + initial_length_size > section->size)
2769 /* If the length field has a relocation against it, then we should
2770 not complain if it is inaccurate (and probably negative). This
2771 happens in object files when the .debug_line section is actually
2772 comprised of several different .debug_line.* sections, (some of
2773 which may be removed by linker garbage collection), and a relocation
2774 is used to compute the correct length once that is done. */
2775 if (reloc_at (section, (hdrptr - section->start) - offset_size))
2777 linfo->li_length = (end - data) - initial_length_size;
2779 else
2781 warn (_("The length field (0x%lx) in the debug_line header is wrong - the section is too small\n"),
2782 (long) linfo->li_length);
2783 return NULL;
2787 /* Get and check the version number. */
2788 SAFE_BYTE_GET_AND_INC (linfo->li_version, hdrptr, 2, end);
2790 if (linfo->li_version != 2
2791 && linfo->li_version != 3
2792 && linfo->li_version != 4)
2794 warn (_("Only DWARF version 2, 3 and 4 line info is currently supported.\n"));
2795 return NULL;
2798 SAFE_BYTE_GET_AND_INC (linfo->li_prologue_length, hdrptr, offset_size, end);
2799 SAFE_BYTE_GET_AND_INC (linfo->li_min_insn_length, hdrptr, 1, end);
2801 if (linfo->li_version >= 4)
2803 SAFE_BYTE_GET_AND_INC (linfo->li_max_ops_per_insn, hdrptr, 1, end);
2805 if (linfo->li_max_ops_per_insn == 0)
2807 warn (_("Invalid maximum operations per insn.\n"));
2808 return NULL;
2811 else
2812 linfo->li_max_ops_per_insn = 1;
2814 SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end);
2815 SAFE_SIGNED_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
2816 SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end);
2817 SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end);
2819 * end_of_sequence = data + linfo->li_length + initial_length_size;
2820 /* PR 17512: file:002-117414-0.004. */
2821 if (* end_of_sequence > end)
2823 warn (_("Line length %s extends beyond end of section\n"),
2824 dwarf_vmatoa ("u", linfo->li_length));
2825 * end_of_sequence = end;
2826 return NULL;
2829 return hdrptr;
2832 static int
2833 display_debug_lines_raw (struct dwarf_section *section,
2834 unsigned char *data,
2835 unsigned char *end)
2837 unsigned char *start = section->start;
2839 printf (_("Raw dump of debug contents of section %s:\n\n"),
2840 section->name);
2842 while (data < end)
2844 static DWARF2_Internal_LineInfo saved_linfo;
2845 DWARF2_Internal_LineInfo linfo;
2846 unsigned char *standard_opcodes;
2847 unsigned char *end_of_sequence;
2848 unsigned int last_dir_entry = 0;
2849 int i;
2851 if (const_strneq (section->name, ".debug_line.")
2852 /* Note: the following does not apply to .debug_line.dwo sections.
2853 These are full debug_line sections. */
2854 && strcmp (section->name, ".debug_line.dwo") != 0)
2856 /* Sections named .debug_line.<foo> are fragments of a .debug_line
2857 section containing just the Line Number Statements. They are
2858 created by the assembler and intended to be used alongside gcc's
2859 -ffunction-sections command line option. When the linker's
2860 garbage collection decides to discard a .text.<foo> section it
2861 can then also discard the line number information in .debug_line.<foo>.
2863 Since the section is a fragment it does not have the details
2864 needed to fill out a LineInfo structure, so instead we use the
2865 details from the last full debug_line section that we processed. */
2866 end_of_sequence = end;
2867 standard_opcodes = NULL;
2868 linfo = saved_linfo;
2869 /* PR 17531: file: 0522b371. */
2870 if (linfo.li_line_range == 0)
2872 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
2873 return 0;
2875 reset_state_machine (linfo.li_default_is_stmt);
2877 else
2879 unsigned char * hdrptr;
2881 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
2882 & end_of_sequence)) == NULL)
2883 return 0;
2885 printf (_(" Offset: 0x%lx\n"), (long)(data - start));
2886 printf (_(" Length: %ld\n"), (long) linfo.li_length);
2887 printf (_(" DWARF Version: %d\n"), linfo.li_version);
2888 printf (_(" Prologue Length: %d\n"), (int) linfo.li_prologue_length);
2889 printf (_(" Minimum Instruction Length: %d\n"), linfo.li_min_insn_length);
2890 if (linfo.li_version >= 4)
2891 printf (_(" Maximum Ops per Instruction: %d\n"), linfo.li_max_ops_per_insn);
2892 printf (_(" Initial value of 'is_stmt': %d\n"), linfo.li_default_is_stmt);
2893 printf (_(" Line Base: %d\n"), linfo.li_line_base);
2894 printf (_(" Line Range: %d\n"), linfo.li_line_range);
2895 printf (_(" Opcode Base: %d\n"), linfo.li_opcode_base);
2897 /* PR 17512: file: 1665-6428-0.004. */
2898 if (linfo.li_line_range == 0)
2900 warn (_("Line range of 0 is invalid, using 1 instead\n"));
2901 linfo.li_line_range = 1;
2904 reset_state_machine (linfo.li_default_is_stmt);
2906 /* Display the contents of the Opcodes table. */
2907 standard_opcodes = hdrptr;
2909 /* PR 17512: file: 002-417945-0.004. */
2910 if (standard_opcodes + linfo.li_opcode_base >= end)
2912 warn (_("Line Base extends beyond end of section\n"));
2913 return 0;
2916 printf (_("\n Opcodes:\n"));
2918 for (i = 1; i < linfo.li_opcode_base; i++)
2919 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
2921 /* Display the contents of the Directory table. */
2922 data = standard_opcodes + linfo.li_opcode_base - 1;
2924 if (*data == 0)
2925 printf (_("\n The Directory Table is empty.\n"));
2926 else
2928 printf (_("\n The Directory Table (offset 0x%lx):\n"),
2929 (long)(data - start));
2931 while (data < end && *data != 0)
2933 printf (" %d\t%.*s\n", ++last_dir_entry, (int) (end - data), data);
2935 data += strnlen ((char *) data, end - data) + 1;
2938 /* PR 17512: file: 002-132094-0.004. */
2939 if (data >= end - 1)
2940 break;
2943 /* Skip the NUL at the end of the table. */
2944 data++;
2946 /* Display the contents of the File Name table. */
2947 if (*data == 0)
2948 printf (_("\n The File Name Table is empty.\n"));
2949 else
2951 printf (_("\n The File Name Table (offset 0x%lx):\n"),
2952 (long)(data - start));
2953 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
2955 while (data < end && *data != 0)
2957 unsigned char *name;
2958 unsigned int bytes_read;
2960 printf (" %d\t", ++state_machine_regs.last_file_entry);
2961 name = data;
2962 data += strnlen ((char *) data, end - data) + 1;
2964 printf ("%s\t",
2965 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2966 data += bytes_read;
2967 printf ("%s\t",
2968 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2969 data += bytes_read;
2970 printf ("%s\t",
2971 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2972 data += bytes_read;
2973 printf ("%.*s\n", (int)(end - name), name);
2975 if (data == end)
2977 warn (_("Corrupt file name table entry\n"));
2978 break;
2983 /* Skip the NUL at the end of the table. */
2984 data++;
2985 putchar ('\n');
2986 saved_linfo = linfo;
2989 /* Now display the statements. */
2990 if (data >= end_of_sequence)
2991 printf (_(" No Line Number Statements.\n"));
2992 else
2994 printf (_(" Line Number Statements:\n"));
2996 while (data < end_of_sequence)
2998 unsigned char op_code;
2999 dwarf_signed_vma adv;
3000 dwarf_vma uladv;
3001 unsigned int bytes_read;
3003 printf (" [0x%08lx]", (long)(data - start));
3005 op_code = *data++;
3007 if (op_code >= linfo.li_opcode_base)
3009 op_code -= linfo.li_opcode_base;
3010 uladv = (op_code / linfo.li_line_range);
3011 if (linfo.li_max_ops_per_insn == 1)
3013 uladv *= linfo.li_min_insn_length;
3014 state_machine_regs.address += uladv;
3015 printf (_(" Special opcode %d: "
3016 "advance Address by %s to 0x%s"),
3017 op_code, dwarf_vmatoa ("u", uladv),
3018 dwarf_vmatoa ("x", state_machine_regs.address));
3020 else
3022 state_machine_regs.address
3023 += ((state_machine_regs.op_index + uladv)
3024 / linfo.li_max_ops_per_insn)
3025 * linfo.li_min_insn_length;
3026 state_machine_regs.op_index
3027 = (state_machine_regs.op_index + uladv)
3028 % linfo.li_max_ops_per_insn;
3029 printf (_(" Special opcode %d: "
3030 "advance Address by %s to 0x%s[%d]"),
3031 op_code, dwarf_vmatoa ("u", uladv),
3032 dwarf_vmatoa ("x", state_machine_regs.address),
3033 state_machine_regs.op_index);
3035 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
3036 state_machine_regs.line += adv;
3037 printf (_(" and Line by %s to %d\n"),
3038 dwarf_vmatoa ("d", adv), state_machine_regs.line);
3040 else switch (op_code)
3042 case DW_LNS_extended_op:
3043 data += process_extended_line_op (data, linfo.li_default_is_stmt, end);
3044 break;
3046 case DW_LNS_copy:
3047 printf (_(" Copy\n"));
3048 break;
3050 case DW_LNS_advance_pc:
3051 uladv = read_uleb128 (data, & bytes_read, end);
3052 data += bytes_read;
3053 if (linfo.li_max_ops_per_insn == 1)
3055 uladv *= linfo.li_min_insn_length;
3056 state_machine_regs.address += uladv;
3057 printf (_(" Advance PC by %s to 0x%s\n"),
3058 dwarf_vmatoa ("u", uladv),
3059 dwarf_vmatoa ("x", state_machine_regs.address));
3061 else
3063 state_machine_regs.address
3064 += ((state_machine_regs.op_index + uladv)
3065 / linfo.li_max_ops_per_insn)
3066 * linfo.li_min_insn_length;
3067 state_machine_regs.op_index
3068 = (state_machine_regs.op_index + uladv)
3069 % linfo.li_max_ops_per_insn;
3070 printf (_(" Advance PC by %s to 0x%s[%d]\n"),
3071 dwarf_vmatoa ("u", uladv),
3072 dwarf_vmatoa ("x", state_machine_regs.address),
3073 state_machine_regs.op_index);
3075 break;
3077 case DW_LNS_advance_line:
3078 adv = read_sleb128 (data, & bytes_read, end);
3079 data += bytes_read;
3080 state_machine_regs.line += adv;
3081 printf (_(" Advance Line by %s to %d\n"),
3082 dwarf_vmatoa ("d", adv),
3083 state_machine_regs.line);
3084 break;
3086 case DW_LNS_set_file:
3087 adv = read_uleb128 (data, & bytes_read, end);
3088 data += bytes_read;
3089 printf (_(" Set File Name to entry %s in the File Name Table\n"),
3090 dwarf_vmatoa ("d", adv));
3091 state_machine_regs.file = adv;
3092 break;
3094 case DW_LNS_set_column:
3095 uladv = read_uleb128 (data, & bytes_read, end);
3096 data += bytes_read;
3097 printf (_(" Set column to %s\n"),
3098 dwarf_vmatoa ("u", uladv));
3099 state_machine_regs.column = uladv;
3100 break;
3102 case DW_LNS_negate_stmt:
3103 adv = state_machine_regs.is_stmt;
3104 adv = ! adv;
3105 printf (_(" Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv));
3106 state_machine_regs.is_stmt = adv;
3107 break;
3109 case DW_LNS_set_basic_block:
3110 printf (_(" Set basic block\n"));
3111 state_machine_regs.basic_block = 1;
3112 break;
3114 case DW_LNS_const_add_pc:
3115 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
3116 if (linfo.li_max_ops_per_insn)
3118 uladv *= linfo.li_min_insn_length;
3119 state_machine_regs.address += uladv;
3120 printf (_(" Advance PC by constant %s to 0x%s\n"),
3121 dwarf_vmatoa ("u", uladv),
3122 dwarf_vmatoa ("x", state_machine_regs.address));
3124 else
3126 state_machine_regs.address
3127 += ((state_machine_regs.op_index + uladv)
3128 / linfo.li_max_ops_per_insn)
3129 * linfo.li_min_insn_length;
3130 state_machine_regs.op_index
3131 = (state_machine_regs.op_index + uladv)
3132 % linfo.li_max_ops_per_insn;
3133 printf (_(" Advance PC by constant %s to 0x%s[%d]\n"),
3134 dwarf_vmatoa ("u", uladv),
3135 dwarf_vmatoa ("x", state_machine_regs.address),
3136 state_machine_regs.op_index);
3138 break;
3140 case DW_LNS_fixed_advance_pc:
3141 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
3142 state_machine_regs.address += uladv;
3143 state_machine_regs.op_index = 0;
3144 printf (_(" Advance PC by fixed size amount %s to 0x%s\n"),
3145 dwarf_vmatoa ("u", uladv),
3146 dwarf_vmatoa ("x", state_machine_regs.address));
3147 break;
3149 case DW_LNS_set_prologue_end:
3150 printf (_(" Set prologue_end to true\n"));
3151 break;
3153 case DW_LNS_set_epilogue_begin:
3154 printf (_(" Set epilogue_begin to true\n"));
3155 break;
3157 case DW_LNS_set_isa:
3158 uladv = read_uleb128 (data, & bytes_read, end);
3159 data += bytes_read;
3160 printf (_(" Set ISA to %s\n"), dwarf_vmatoa ("u", uladv));
3161 break;
3163 default:
3164 printf (_(" Unknown opcode %d with operands: "), op_code);
3166 if (standard_opcodes != NULL)
3167 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
3169 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
3170 &bytes_read, end)),
3171 i == 1 ? "" : ", ");
3172 data += bytes_read;
3174 putchar ('\n');
3175 break;
3178 putchar ('\n');
3182 return 1;
3185 typedef struct
3187 unsigned char *name;
3188 unsigned int directory_index;
3189 unsigned int modification_date;
3190 unsigned int length;
3191 } File_Entry;
3193 /* Output a decoded representation of the .debug_line section. */
3195 static int
3196 display_debug_lines_decoded (struct dwarf_section *section,
3197 unsigned char *data,
3198 unsigned char *end)
3200 static DWARF2_Internal_LineInfo saved_linfo;
3202 printf (_("Decoded dump of debug contents of section %s:\n\n"),
3203 section->name);
3205 while (data < end)
3207 /* This loop amounts to one iteration per compilation unit. */
3208 DWARF2_Internal_LineInfo linfo;
3209 unsigned char *standard_opcodes;
3210 unsigned char *end_of_sequence;
3211 int i;
3212 File_Entry *file_table = NULL;
3213 unsigned int n_files = 0;
3214 unsigned char **directory_table = NULL;
3215 unsigned int n_directories = 0;
3217 if (const_strneq (section->name, ".debug_line.")
3218 /* Note: the following does not apply to .debug_line.dwo sections.
3219 These are full debug_line sections. */
3220 && strcmp (section->name, ".debug_line.dwo") != 0)
3222 /* See comment in display_debug_lines_raw(). */
3223 end_of_sequence = end;
3224 standard_opcodes = NULL;
3225 linfo = saved_linfo;
3226 /* PR 17531: file: 0522b371. */
3227 if (linfo.li_line_range == 0)
3229 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
3230 return 0;
3232 reset_state_machine (linfo.li_default_is_stmt);
3234 else
3236 unsigned char *hdrptr;
3238 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
3239 & end_of_sequence)) == NULL)
3240 return 0;
3242 /* PR 17531: file: 0522b371. */
3243 if (linfo.li_line_range == 0)
3245 warn (_("Line range of 0 is invalid, using 1 instead\n"));
3246 linfo.li_line_range = 1;
3248 reset_state_machine (linfo.li_default_is_stmt);
3250 /* Save a pointer to the contents of the Opcodes table. */
3251 standard_opcodes = hdrptr;
3253 /* Traverse the Directory table just to count entries. */
3254 data = standard_opcodes + linfo.li_opcode_base - 1;
3255 if (*data != 0)
3257 unsigned char *ptr_directory_table = data;
3259 while (*data != 0)
3261 data += strnlen ((char *) data, end - data) + 1;
3262 n_directories++;
3265 /* Go through the directory table again to save the directories. */
3266 directory_table = (unsigned char **)
3267 xmalloc (n_directories * sizeof (unsigned char *));
3269 i = 0;
3270 while (*ptr_directory_table != 0)
3272 directory_table[i] = ptr_directory_table;
3273 ptr_directory_table += strnlen ((char *) ptr_directory_table,
3274 ptr_directory_table - end) + 1;
3275 i++;
3278 /* Skip the NUL at the end of the table. */
3279 data++;
3281 /* Traverse the File Name table just to count the entries. */
3282 if (*data != 0)
3284 unsigned char *ptr_file_name_table = data;
3286 while (*data != 0)
3288 unsigned int bytes_read;
3290 /* Skip Name, directory index, last modification time and length
3291 of file. */
3292 data += strnlen ((char *) data, end - data) + 1;
3293 read_uleb128 (data, & bytes_read, end);
3294 data += bytes_read;
3295 read_uleb128 (data, & bytes_read, end);
3296 data += bytes_read;
3297 read_uleb128 (data, & bytes_read, end);
3298 data += bytes_read;
3300 n_files++;
3303 /* Go through the file table again to save the strings. */
3304 file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
3306 i = 0;
3307 while (*ptr_file_name_table != 0)
3309 unsigned int bytes_read;
3311 file_table[i].name = ptr_file_name_table;
3312 ptr_file_name_table += strnlen ((char *) ptr_file_name_table,
3313 end - ptr_file_name_table) + 1;
3315 /* We are not interested in directory, time or size. */
3316 file_table[i].directory_index = read_uleb128 (ptr_file_name_table,
3317 & bytes_read, end);
3318 ptr_file_name_table += bytes_read;
3319 file_table[i].modification_date = read_uleb128 (ptr_file_name_table,
3320 & bytes_read, end);
3321 ptr_file_name_table += bytes_read;
3322 file_table[i].length = read_uleb128 (ptr_file_name_table, & bytes_read, end);
3323 ptr_file_name_table += bytes_read;
3324 i++;
3326 i = 0;
3328 /* Print the Compilation Unit's name and a header. */
3329 if (directory_table == NULL)
3331 printf (_("CU: %s:\n"), file_table[0].name);
3332 printf (_("File name Line number Starting address\n"));
3334 else
3336 unsigned int ix = file_table[0].directory_index;
3337 const char *directory = ix ? (char *)directory_table[ix - 1] : ".";
3339 if (do_wide || strlen (directory) < 76)
3340 printf (_("CU: %s/%s:\n"), directory, file_table[0].name);
3341 else
3342 printf ("%s:\n", file_table[0].name);
3344 printf (_("File name Line number Starting address\n"));
3348 /* Skip the NUL at the end of the table. */
3349 data++;
3351 saved_linfo = linfo;
3354 /* This loop iterates through the Dwarf Line Number Program. */
3355 while (data < end_of_sequence)
3357 unsigned char op_code;
3358 int adv;
3359 unsigned long int uladv;
3360 unsigned int bytes_read;
3361 int is_special_opcode = 0;
3363 op_code = *data++;
3365 if (op_code >= linfo.li_opcode_base)
3367 op_code -= linfo.li_opcode_base;
3368 uladv = (op_code / linfo.li_line_range);
3369 if (linfo.li_max_ops_per_insn == 1)
3371 uladv *= linfo.li_min_insn_length;
3372 state_machine_regs.address += uladv;
3374 else
3376 state_machine_regs.address
3377 += ((state_machine_regs.op_index + uladv)
3378 / linfo.li_max_ops_per_insn)
3379 * linfo.li_min_insn_length;
3380 state_machine_regs.op_index
3381 = (state_machine_regs.op_index + uladv)
3382 % linfo.li_max_ops_per_insn;
3385 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
3386 state_machine_regs.line += adv;
3387 is_special_opcode = 1;
3389 else switch (op_code)
3391 case DW_LNS_extended_op:
3393 unsigned int ext_op_code_len;
3394 unsigned char ext_op_code;
3395 unsigned char *op_code_data = data;
3397 ext_op_code_len = read_uleb128 (op_code_data, &bytes_read,
3398 end_of_sequence);
3399 op_code_data += bytes_read;
3401 if (ext_op_code_len == 0)
3403 warn (_("Badly formed extended line op encountered!\n"));
3404 break;
3406 ext_op_code_len += bytes_read;
3407 ext_op_code = *op_code_data++;
3409 switch (ext_op_code)
3411 case DW_LNE_end_sequence:
3412 reset_state_machine (linfo.li_default_is_stmt);
3413 break;
3414 case DW_LNE_set_address:
3415 SAFE_BYTE_GET_AND_INC (state_machine_regs.address,
3416 op_code_data,
3417 ext_op_code_len - bytes_read - 1,
3418 end);
3419 state_machine_regs.op_index = 0;
3420 break;
3421 case DW_LNE_define_file:
3423 file_table = (File_Entry *) xrealloc
3424 (file_table, (n_files + 1) * sizeof (File_Entry));
3426 ++state_machine_regs.last_file_entry;
3427 /* Source file name. */
3428 file_table[n_files].name = op_code_data;
3429 op_code_data += strlen ((char *) op_code_data) + 1;
3430 /* Directory index. */
3431 file_table[n_files].directory_index =
3432 read_uleb128 (op_code_data, & bytes_read,
3433 end_of_sequence);
3434 op_code_data += bytes_read;
3435 /* Last modification time. */
3436 file_table[n_files].modification_date =
3437 read_uleb128 (op_code_data, & bytes_read,
3438 end_of_sequence);
3439 op_code_data += bytes_read;
3440 /* File length. */
3441 file_table[n_files].length =
3442 read_uleb128 (op_code_data, & bytes_read,
3443 end_of_sequence);
3445 n_files++;
3446 break;
3448 case DW_LNE_set_discriminator:
3449 case DW_LNE_HP_set_sequence:
3450 /* Simply ignored. */
3451 break;
3453 default:
3454 printf (_("UNKNOWN (%u): length %d\n"),
3455 ext_op_code, ext_op_code_len - bytes_read);
3456 break;
3458 data += ext_op_code_len;
3459 break;
3461 case DW_LNS_copy:
3462 break;
3464 case DW_LNS_advance_pc:
3465 uladv = read_uleb128 (data, & bytes_read, end);
3466 data += bytes_read;
3467 if (linfo.li_max_ops_per_insn == 1)
3469 uladv *= linfo.li_min_insn_length;
3470 state_machine_regs.address += uladv;
3472 else
3474 state_machine_regs.address
3475 += ((state_machine_regs.op_index + uladv)
3476 / linfo.li_max_ops_per_insn)
3477 * linfo.li_min_insn_length;
3478 state_machine_regs.op_index
3479 = (state_machine_regs.op_index + uladv)
3480 % linfo.li_max_ops_per_insn;
3482 break;
3484 case DW_LNS_advance_line:
3485 adv = read_sleb128 (data, & bytes_read, end);
3486 data += bytes_read;
3487 state_machine_regs.line += adv;
3488 break;
3490 case DW_LNS_set_file:
3491 adv = read_uleb128 (data, & bytes_read, end);
3492 data += bytes_read;
3493 state_machine_regs.file = adv;
3495 if (file_table == NULL)
3496 printf (_("\n [Use file table entry %d]\n"), state_machine_regs.file - 1);
3497 else if (file_table[state_machine_regs.file - 1].directory_index == 0)
3498 /* If directory index is 0, that means current directory. */
3499 printf ("\n./%s:[++]\n",
3500 file_table[state_machine_regs.file - 1].name);
3501 else if (directory_table == NULL)
3502 printf (_("\n [Use directory table entry %d]\n"),
3503 file_table[state_machine_regs.file - 1].directory_index - 1);
3504 else
3505 /* The directory index starts counting at 1. */
3506 printf ("\n%s/%s:\n",
3507 directory_table[file_table[state_machine_regs.file - 1].directory_index - 1],
3508 file_table[state_machine_regs.file - 1].name);
3509 break;
3511 case DW_LNS_set_column:
3512 uladv = read_uleb128 (data, & bytes_read, end);
3513 data += bytes_read;
3514 state_machine_regs.column = uladv;
3515 break;
3517 case DW_LNS_negate_stmt:
3518 adv = state_machine_regs.is_stmt;
3519 adv = ! adv;
3520 state_machine_regs.is_stmt = adv;
3521 break;
3523 case DW_LNS_set_basic_block:
3524 state_machine_regs.basic_block = 1;
3525 break;
3527 case DW_LNS_const_add_pc:
3528 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
3529 if (linfo.li_max_ops_per_insn == 1)
3531 uladv *= linfo.li_min_insn_length;
3532 state_machine_regs.address += uladv;
3534 else
3536 state_machine_regs.address
3537 += ((state_machine_regs.op_index + uladv)
3538 / linfo.li_max_ops_per_insn)
3539 * linfo.li_min_insn_length;
3540 state_machine_regs.op_index
3541 = (state_machine_regs.op_index + uladv)
3542 % linfo.li_max_ops_per_insn;
3544 break;
3546 case DW_LNS_fixed_advance_pc:
3547 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
3548 state_machine_regs.address += uladv;
3549 state_machine_regs.op_index = 0;
3550 break;
3552 case DW_LNS_set_prologue_end:
3553 break;
3555 case DW_LNS_set_epilogue_begin:
3556 break;
3558 case DW_LNS_set_isa:
3559 uladv = read_uleb128 (data, & bytes_read, end);
3560 data += bytes_read;
3561 printf (_(" Set ISA to %lu\n"), uladv);
3562 break;
3564 default:
3565 printf (_(" Unknown opcode %d with operands: "), op_code);
3567 if (standard_opcodes != NULL)
3568 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
3570 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
3571 &bytes_read, end)),
3572 i == 1 ? "" : ", ");
3573 data += bytes_read;
3575 putchar ('\n');
3576 break;
3579 /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
3580 to the DWARF address/line matrix. */
3581 if ((is_special_opcode) || (op_code == DW_LNE_end_sequence)
3582 || (op_code == DW_LNS_copy))
3584 const unsigned int MAX_FILENAME_LENGTH = 35;
3585 char *fileName;
3586 char *newFileName = NULL;
3587 size_t fileNameLength;
3589 if (file_table)
3590 fileName = (char *) file_table[state_machine_regs.file - 1].name;
3591 else
3592 fileName = "<unknown>";
3594 fileNameLength = strlen (fileName);
3596 if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
3598 newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
3599 /* Truncate file name */
3600 strncpy (newFileName,
3601 fileName + fileNameLength - MAX_FILENAME_LENGTH,
3602 MAX_FILENAME_LENGTH + 1);
3604 else
3606 newFileName = (char *) xmalloc (fileNameLength + 1);
3607 strncpy (newFileName, fileName, fileNameLength + 1);
3610 if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
3612 if (linfo.li_max_ops_per_insn == 1)
3613 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x\n",
3614 newFileName, state_machine_regs.line,
3615 state_machine_regs.address);
3616 else
3617 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x[%d]\n",
3618 newFileName, state_machine_regs.line,
3619 state_machine_regs.address,
3620 state_machine_regs.op_index);
3622 else
3624 if (linfo.li_max_ops_per_insn == 1)
3625 printf ("%s %11d %#18" DWARF_VMA_FMT "x\n",
3626 newFileName, state_machine_regs.line,
3627 state_machine_regs.address);
3628 else
3629 printf ("%s %11d %#18" DWARF_VMA_FMT "x[%d]\n",
3630 newFileName, state_machine_regs.line,
3631 state_machine_regs.address,
3632 state_machine_regs.op_index);
3635 if (op_code == DW_LNE_end_sequence)
3636 printf ("\n");
3638 free (newFileName);
3642 if (file_table)
3644 free (file_table);
3645 file_table = NULL;
3646 n_files = 0;
3649 if (directory_table)
3651 free (directory_table);
3652 directory_table = NULL;
3653 n_directories = 0;
3656 putchar ('\n');
3659 return 1;
3662 static int
3663 display_debug_lines (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
3665 unsigned char *data = section->start;
3666 unsigned char *end = data + section->size;
3667 int retValRaw = 1;
3668 int retValDecoded = 1;
3670 if (do_debug_lines == 0)
3671 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
3673 if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
3674 retValRaw = display_debug_lines_raw (section, data, end);
3676 if (do_debug_lines & FLAG_DEBUG_LINES_DECODED)
3677 retValDecoded = display_debug_lines_decoded (section, data, end);
3679 if (!retValRaw || !retValDecoded)
3680 return 0;
3682 return 1;
3685 static debug_info *
3686 find_debug_info_for_offset (unsigned long offset)
3688 unsigned int i;
3690 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
3691 return NULL;
3693 for (i = 0; i < num_debug_info_entries; i++)
3694 if (debug_information[i].cu_offset == offset)
3695 return debug_information + i;
3697 return NULL;
3700 static const char *
3701 get_gdb_index_symbol_kind_name (gdb_index_symbol_kind kind)
3703 /* See gdb/gdb-index.h. */
3704 static const char * const kinds[] =
3706 N_ ("no info"),
3707 N_ ("type"),
3708 N_ ("variable"),
3709 N_ ("function"),
3710 N_ ("other"),
3711 N_ ("unused5"),
3712 N_ ("unused6"),
3713 N_ ("unused7")
3716 return _ (kinds[kind]);
3719 static int
3720 display_debug_pubnames_worker (struct dwarf_section *section,
3721 void *file ATTRIBUTE_UNUSED,
3722 int is_gnu)
3724 DWARF2_Internal_PubNames names;
3725 unsigned char *start = section->start;
3726 unsigned char *end = start + section->size;
3728 /* It does not matter if this load fails,
3729 we test for that later on. */
3730 load_debug_info (file);
3732 printf (_("Contents of the %s section:\n\n"), section->name);
3734 while (start < end)
3736 unsigned char *data;
3737 unsigned char *adr;
3738 dwarf_vma offset;
3739 unsigned int offset_size, initial_length_size;
3741 data = start;
3743 SAFE_BYTE_GET_AND_INC (names.pn_length, data, 4, end);
3744 if (names.pn_length == 0xffffffff)
3746 SAFE_BYTE_GET_AND_INC (names.pn_length, data, 8, end);
3747 offset_size = 8;
3748 initial_length_size = 12;
3750 else
3752 offset_size = 4;
3753 initial_length_size = 4;
3756 SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end);
3757 SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end);
3759 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
3760 && num_debug_info_entries > 0
3761 && find_debug_info_for_offset (names.pn_offset) == NULL)
3762 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
3763 (unsigned long) names.pn_offset, section->name);
3765 SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, end);
3767 adr = start + names.pn_length + initial_length_size;
3768 /* PR 17531: file: 7615b6b2. */
3769 if ((dwarf_signed_vma) names.pn_length < 0
3770 /* PR 17531: file: a5dbeaa7. */
3771 || adr < start)
3773 warn (_("Negative length for public name: 0x%lx\n"), (long) names.pn_length);
3774 start = end;
3776 else
3777 start = adr;
3779 printf (_(" Length: %ld\n"),
3780 (long) names.pn_length);
3781 printf (_(" Version: %d\n"),
3782 names.pn_version);
3783 printf (_(" Offset into .debug_info section: 0x%lx\n"),
3784 (unsigned long) names.pn_offset);
3785 printf (_(" Size of area in .debug_info section: %ld\n"),
3786 (long) names.pn_size);
3788 if (names.pn_version != 2 && names.pn_version != 3)
3790 static int warned = 0;
3792 if (! warned)
3794 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
3795 warned = 1;
3798 continue;
3801 if (is_gnu)
3802 printf (_("\n Offset Kind Name\n"));
3803 else
3804 printf (_("\n Offset\tName\n"));
3808 bfd_size_type maxprint;
3810 SAFE_BYTE_GET (offset, data, offset_size, end);
3812 if (offset != 0)
3814 data += offset_size;
3815 if (data >= end)
3816 break;
3817 maxprint = (end - data) - 1;
3819 if (is_gnu)
3821 unsigned int kind_data;
3822 gdb_index_symbol_kind kind;
3823 const char *kind_name;
3824 int is_static;
3826 SAFE_BYTE_GET (kind_data, data, 1, end);
3827 data++;
3828 maxprint --;
3829 /* GCC computes the kind as the upper byte in the CU index
3830 word, and then right shifts it by the CU index size.
3831 Left shift KIND to where the gdb-index.h accessor macros
3832 can use it. */
3833 kind_data <<= GDB_INDEX_CU_BITSIZE;
3834 kind = GDB_INDEX_SYMBOL_KIND_VALUE (kind_data);
3835 kind_name = get_gdb_index_symbol_kind_name (kind);
3836 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (kind_data);
3837 printf (" %-6lx %s,%-10s %.*s\n",
3838 (unsigned long) offset, is_static ? _("s") : _("g"),
3839 kind_name, (int) maxprint, data);
3841 else
3842 printf (" %-6lx\t%.*s\n",
3843 (unsigned long) offset, (int) maxprint, data);
3845 data += strnlen ((char *) data, maxprint) + 1;
3846 if (data >= end)
3847 break;
3850 while (offset != 0);
3853 printf ("\n");
3854 return 1;
3857 static int
3858 display_debug_pubnames (struct dwarf_section *section, void *file)
3860 return display_debug_pubnames_worker (section, file, 0);
3863 static int
3864 display_debug_gnu_pubnames (struct dwarf_section *section, void *file)
3866 return display_debug_pubnames_worker (section, file, 1);
3869 static int
3870 display_debug_macinfo (struct dwarf_section *section,
3871 void *file ATTRIBUTE_UNUSED)
3873 unsigned char *start = section->start;
3874 unsigned char *end = start + section->size;
3875 unsigned char *curr = start;
3876 unsigned int bytes_read;
3877 enum dwarf_macinfo_record_type op;
3879 printf (_("Contents of the %s section:\n\n"), section->name);
3881 while (curr < end)
3883 unsigned int lineno;
3884 const unsigned char *string;
3886 op = (enum dwarf_macinfo_record_type) *curr;
3887 curr++;
3889 switch (op)
3891 case DW_MACINFO_start_file:
3893 unsigned int filenum;
3895 lineno = read_uleb128 (curr, & bytes_read, end);
3896 curr += bytes_read;
3897 filenum = read_uleb128 (curr, & bytes_read, end);
3898 curr += bytes_read;
3900 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
3901 lineno, filenum);
3903 break;
3905 case DW_MACINFO_end_file:
3906 printf (_(" DW_MACINFO_end_file\n"));
3907 break;
3909 case DW_MACINFO_define:
3910 lineno = read_uleb128 (curr, & bytes_read, end);
3911 curr += bytes_read;
3912 string = curr;
3913 curr += strnlen ((char *) string, end - string) + 1;
3914 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
3915 lineno, string);
3916 break;
3918 case DW_MACINFO_undef:
3919 lineno = read_uleb128 (curr, & bytes_read, end);
3920 curr += bytes_read;
3921 string = curr;
3922 curr += strnlen ((char *) string, end - string) + 1;
3923 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
3924 lineno, string);
3925 break;
3927 case DW_MACINFO_vendor_ext:
3929 unsigned int constant;
3931 constant = read_uleb128 (curr, & bytes_read, end);
3932 curr += bytes_read;
3933 string = curr;
3934 curr += strnlen ((char *) string, end - string) + 1;
3935 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
3936 constant, string);
3938 break;
3942 return 1;
3945 /* Given LINE_OFFSET into the .debug_line section, attempt to return
3946 filename and dirname corresponding to file name table entry with index
3947 FILEIDX. Return NULL on failure. */
3949 static unsigned char *
3950 get_line_filename_and_dirname (dwarf_vma line_offset,
3951 dwarf_vma fileidx,
3952 unsigned char **dir_name)
3954 struct dwarf_section *section = &debug_displays [line].section;
3955 unsigned char *hdrptr, *dirtable, *file_name;
3956 unsigned int offset_size, initial_length_size;
3957 unsigned int version, opcode_base, bytes_read;
3958 dwarf_vma length, diridx;
3959 const unsigned char * end;
3961 *dir_name = NULL;
3962 if (section->start == NULL
3963 || line_offset >= section->size
3964 || fileidx == 0)
3965 return NULL;
3967 hdrptr = section->start + line_offset;
3968 end = section->start + section->size;
3970 SAFE_BYTE_GET_AND_INC (length, hdrptr, 4, end);
3971 if (length == 0xffffffff)
3973 /* This section is 64-bit DWARF 3. */
3974 SAFE_BYTE_GET_AND_INC (length, hdrptr, 8, end);
3975 offset_size = 8;
3976 initial_length_size = 12;
3978 else
3980 offset_size = 4;
3981 initial_length_size = 4;
3983 if (length + initial_length_size > section->size)
3984 return NULL;
3986 SAFE_BYTE_GET_AND_INC (version, hdrptr, 2, end);
3987 if (version != 2 && version != 3 && version != 4)
3988 return NULL;
3989 hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length. */
3990 if (version >= 4)
3991 hdrptr++; /* Skip max_ops_per_insn. */
3992 hdrptr += 3; /* Skip default_is_stmt, line_base, line_range. */
3994 SAFE_BYTE_GET_AND_INC (opcode_base, hdrptr, 1, end);
3995 if (opcode_base == 0)
3996 return NULL;
3998 hdrptr += opcode_base - 1;
3999 dirtable = hdrptr;
4000 /* Skip over dirname table. */
4001 while (*hdrptr != '\0')
4002 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
4003 hdrptr++; /* Skip the NUL at the end of the table. */
4004 /* Now skip over preceding filename table entries. */
4005 for (; *hdrptr != '\0' && fileidx > 1; fileidx--)
4007 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
4008 read_uleb128 (hdrptr, &bytes_read, end);
4009 hdrptr += bytes_read;
4010 read_uleb128 (hdrptr, &bytes_read, end);
4011 hdrptr += bytes_read;
4012 read_uleb128 (hdrptr, &bytes_read, end);
4013 hdrptr += bytes_read;
4015 if (hdrptr == end || *hdrptr == '\0')
4016 return NULL;
4017 file_name = hdrptr;
4018 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
4019 diridx = read_uleb128 (hdrptr, &bytes_read, end);
4020 if (diridx == 0)
4021 return file_name;
4022 for (; *dirtable != '\0' && diridx > 1; diridx--)
4023 dirtable += strnlen ((char *) dirtable, end - dirtable) + 1;
4024 if (*dirtable == '\0')
4025 return NULL;
4026 *dir_name = dirtable;
4027 return file_name;
4030 static int
4031 display_debug_macro (struct dwarf_section *section,
4032 void *file)
4034 unsigned char *start = section->start;
4035 unsigned char *end = start + section->size;
4036 unsigned char *curr = start;
4037 unsigned char *extended_op_buf[256];
4038 unsigned int bytes_read;
4040 load_debug_section (str, file);
4041 load_debug_section (line, file);
4043 printf (_("Contents of the %s section:\n\n"), section->name);
4045 while (curr < end)
4047 unsigned int lineno, version, flags;
4048 unsigned int offset_size = 4;
4049 const unsigned char *string;
4050 dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
4051 unsigned char **extended_ops = NULL;
4053 SAFE_BYTE_GET_AND_INC (version, curr, 2, end);
4054 if (version != 4)
4056 error (_("Only GNU extension to DWARF 4 of %s is currently supported.\n"),
4057 section->name);
4058 return 0;
4061 SAFE_BYTE_GET_AND_INC (flags, curr, 1, end);
4062 if (flags & 1)
4063 offset_size = 8;
4064 printf (_(" Offset: 0x%lx\n"),
4065 (unsigned long) sec_offset);
4066 printf (_(" Version: %d\n"), version);
4067 printf (_(" Offset size: %d\n"), offset_size);
4068 if (flags & 2)
4070 SAFE_BYTE_GET_AND_INC (line_offset, curr, offset_size, end);
4071 printf (_(" Offset into .debug_line: 0x%lx\n"),
4072 (unsigned long) line_offset);
4074 if (flags & 4)
4076 unsigned int i, count, op;
4077 dwarf_vma nargs, n;
4079 SAFE_BYTE_GET_AND_INC (count, curr, 1, end);
4081 memset (extended_op_buf, 0, sizeof (extended_op_buf));
4082 extended_ops = extended_op_buf;
4083 if (count)
4085 printf (_(" Extension opcode arguments:\n"));
4086 for (i = 0; i < count; i++)
4088 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
4089 extended_ops[op] = curr;
4090 nargs = read_uleb128 (curr, &bytes_read, end);
4091 curr += bytes_read;
4092 if (nargs == 0)
4093 printf (_(" DW_MACRO_GNU_%02x has no arguments\n"), op);
4094 else
4096 printf (_(" DW_MACRO_GNU_%02x arguments: "), op);
4097 for (n = 0; n < nargs; n++)
4099 unsigned int form;
4101 SAFE_BYTE_GET_AND_INC (form, curr, 1, end);
4102 printf ("%s%s", get_FORM_name (form),
4103 n == nargs - 1 ? "\n" : ", ");
4104 switch (form)
4106 case DW_FORM_data1:
4107 case DW_FORM_data2:
4108 case DW_FORM_data4:
4109 case DW_FORM_data8:
4110 case DW_FORM_sdata:
4111 case DW_FORM_udata:
4112 case DW_FORM_block:
4113 case DW_FORM_block1:
4114 case DW_FORM_block2:
4115 case DW_FORM_block4:
4116 case DW_FORM_flag:
4117 case DW_FORM_string:
4118 case DW_FORM_strp:
4119 case DW_FORM_sec_offset:
4120 break;
4121 default:
4122 error (_("Invalid extension opcode form %s\n"),
4123 get_FORM_name (form));
4124 return 0;
4131 printf ("\n");
4133 while (1)
4135 unsigned int op;
4137 if (curr >= end)
4139 error (_(".debug_macro section not zero terminated\n"));
4140 return 0;
4143 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
4144 if (op == 0)
4145 break;
4147 switch (op)
4149 case DW_MACRO_GNU_start_file:
4151 unsigned int filenum;
4152 unsigned char *file_name = NULL, *dir_name = NULL;
4154 lineno = read_uleb128 (curr, &bytes_read, end);
4155 curr += bytes_read;
4156 filenum = read_uleb128 (curr, &bytes_read, end);
4157 curr += bytes_read;
4159 if ((flags & 2) == 0)
4160 error (_("DW_MACRO_GNU_start_file used, but no .debug_line offset provided.\n"));
4161 else
4162 file_name
4163 = get_line_filename_and_dirname (line_offset, filenum,
4164 &dir_name);
4165 if (file_name == NULL)
4166 printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d\n"),
4167 lineno, filenum);
4168 else
4169 printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
4170 lineno, filenum,
4171 dir_name != NULL ? (const char *) dir_name : "",
4172 dir_name != NULL ? "/" : "", file_name);
4174 break;
4176 case DW_MACRO_GNU_end_file:
4177 printf (_(" DW_MACRO_GNU_end_file\n"));
4178 break;
4180 case DW_MACRO_GNU_define:
4181 lineno = read_uleb128 (curr, &bytes_read, end);
4182 curr += bytes_read;
4183 string = curr;
4184 curr += strnlen ((char *) string, end - string) + 1;
4185 printf (_(" DW_MACRO_GNU_define - lineno : %d macro : %s\n"),
4186 lineno, string);
4187 break;
4189 case DW_MACRO_GNU_undef:
4190 lineno = read_uleb128 (curr, &bytes_read, end);
4191 curr += bytes_read;
4192 string = curr;
4193 curr += strnlen ((char *) string, end - string) + 1;
4194 printf (_(" DW_MACRO_GNU_undef - lineno : %d macro : %s\n"),
4195 lineno, string);
4196 break;
4198 case DW_MACRO_GNU_define_indirect:
4199 lineno = read_uleb128 (curr, &bytes_read, end);
4200 curr += bytes_read;
4201 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4202 string = fetch_indirect_string (offset);
4203 printf (_(" DW_MACRO_GNU_define_indirect - lineno : %d macro : %s\n"),
4204 lineno, string);
4205 break;
4207 case DW_MACRO_GNU_undef_indirect:
4208 lineno = read_uleb128 (curr, &bytes_read, end);
4209 curr += bytes_read;
4210 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4211 string = fetch_indirect_string (offset);
4212 printf (_(" DW_MACRO_GNU_undef_indirect - lineno : %d macro : %s\n"),
4213 lineno, string);
4214 break;
4216 case DW_MACRO_GNU_transparent_include:
4217 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4218 printf (_(" DW_MACRO_GNU_transparent_include - offset : 0x%lx\n"),
4219 (unsigned long) offset);
4220 break;
4222 case DW_MACRO_GNU_define_indirect_alt:
4223 lineno = read_uleb128 (curr, &bytes_read, end);
4224 curr += bytes_read;
4225 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4226 printf (_(" DW_MACRO_GNU_define_indirect_alt - lineno : %d macro offset : 0x%lx\n"),
4227 lineno, (unsigned long) offset);
4228 break;
4230 case DW_MACRO_GNU_undef_indirect_alt:
4231 lineno = read_uleb128 (curr, &bytes_read, end);
4232 curr += bytes_read;
4233 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4234 printf (_(" DW_MACRO_GNU_undef_indirect_alt - lineno : %d macro offset : 0x%lx\n"),
4235 lineno, (unsigned long) offset);
4236 break;
4238 case DW_MACRO_GNU_transparent_include_alt:
4239 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4240 printf (_(" DW_MACRO_GNU_transparent_include_alt - offset : 0x%lx\n"),
4241 (unsigned long) offset);
4242 break;
4244 default:
4245 if (extended_ops == NULL || extended_ops[op] == NULL)
4247 error (_(" Unknown macro opcode %02x seen\n"), op);
4248 return 0;
4250 else
4252 /* Skip over unhandled opcodes. */
4253 dwarf_vma nargs, n;
4254 unsigned char *desc = extended_ops[op];
4255 nargs = read_uleb128 (desc, &bytes_read, end);
4256 desc += bytes_read;
4257 if (nargs == 0)
4259 printf (_(" DW_MACRO_GNU_%02x\n"), op);
4260 break;
4262 printf (_(" DW_MACRO_GNU_%02x -"), op);
4263 for (n = 0; n < nargs; n++)
4265 int val;
4267 SAFE_BYTE_GET_AND_INC (val, desc, 1, end);
4268 curr
4269 = read_and_display_attr_value (0, val,
4270 curr, end, 0, 0, offset_size,
4271 version, NULL, 0, NULL,
4272 NULL);
4273 if (n != nargs - 1)
4274 printf (",");
4276 printf ("\n");
4278 break;
4282 printf ("\n");
4285 return 1;
4288 static int
4289 display_debug_abbrev (struct dwarf_section *section,
4290 void *file ATTRIBUTE_UNUSED)
4292 abbrev_entry *entry;
4293 unsigned char *start = section->start;
4294 unsigned char *end = start + section->size;
4296 printf (_("Contents of the %s section:\n\n"), section->name);
4300 unsigned char *last;
4302 free_abbrevs ();
4304 last = start;
4305 start = process_abbrev_section (start, end);
4307 if (first_abbrev == NULL)
4308 continue;
4310 printf (_(" Number TAG (0x%lx)\n"), (long) (last - section->start));
4312 for (entry = first_abbrev; entry; entry = entry->next)
4314 abbrev_attr *attr;
4316 printf (" %ld %s [%s]\n",
4317 entry->entry,
4318 get_TAG_name (entry->tag),
4319 entry->children ? _("has children") : _("no children"));
4321 for (attr = entry->first_attr; attr; attr = attr->next)
4322 printf (" %-18s %s\n",
4323 get_AT_name (attr->attribute),
4324 get_FORM_name (attr->form));
4327 while (start);
4329 printf ("\n");
4331 return 1;
4334 /* Return true when ADDR is the maximum address, when addresses are
4335 POINTER_SIZE bytes long. */
4337 static bfd_boolean
4338 is_max_address (dwarf_vma addr, unsigned int pointer_size)
4340 dwarf_vma mask = ~(~(dwarf_vma) 1 << (pointer_size * 8 - 1));
4341 return ((addr & mask) == mask);
4344 /* Display a location list from a normal (ie, non-dwo) .debug_loc section. */
4346 static void
4347 display_loc_list (struct dwarf_section *section,
4348 unsigned char **start_ptr,
4349 unsigned int debug_info_entry,
4350 unsigned long offset,
4351 unsigned long base_address,
4352 int has_frame_base)
4354 unsigned char *start = *start_ptr;
4355 unsigned char *section_end = section->start + section->size;
4356 unsigned long cu_offset;
4357 unsigned int pointer_size;
4358 unsigned int offset_size;
4359 int dwarf_version;
4361 dwarf_vma begin;
4362 dwarf_vma end;
4363 unsigned short length;
4364 int need_frame_base;
4366 if (debug_info_entry >= num_debug_info_entries)
4368 warn (_("No debug information available for loc lists of entry: %u\n"),
4369 debug_info_entry);
4370 return;
4373 cu_offset = debug_information [debug_info_entry].cu_offset;
4374 pointer_size = debug_information [debug_info_entry].pointer_size;
4375 offset_size = debug_information [debug_info_entry].offset_size;
4376 dwarf_version = debug_information [debug_info_entry].dwarf_version;
4378 if (pointer_size < 2 || pointer_size > 8)
4380 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
4381 pointer_size, debug_info_entry);
4382 return;
4385 while (1)
4387 unsigned long off = offset + (start - *start_ptr);
4389 if (start + 2 * pointer_size > section_end)
4391 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4392 offset);
4393 break;
4396 printf (" %8.8lx ", off);
4398 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
4399 SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
4401 if (begin == 0 && end == 0)
4403 /* PR 18374: In a object file we can have a location list that
4404 starts with a begin and end of 0 because there are relocations
4405 that need to be applied to the addresses. Actually applying
4406 the relocations now does not help as they will probably resolve
4407 to 0, since the object file has not been fully linked. Real
4408 end of list markers will not have any relocations against them. */
4409 if (! reloc_at (section, off)
4410 && ! reloc_at (section, off + pointer_size))
4412 printf (_("<End of list>\n"));
4413 break;
4417 /* Check base address specifiers. */
4418 if (is_max_address (begin, pointer_size)
4419 && !is_max_address (end, pointer_size))
4421 base_address = end;
4422 print_dwarf_vma (begin, pointer_size);
4423 print_dwarf_vma (end, pointer_size);
4424 printf (_("(base address)\n"));
4425 continue;
4428 if (start + 2 > section_end)
4430 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4431 offset);
4432 break;
4435 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
4437 if (start + length > section_end)
4439 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4440 offset);
4441 break;
4444 print_dwarf_vma (begin + base_address, pointer_size);
4445 print_dwarf_vma (end + base_address, pointer_size);
4447 putchar ('(');
4448 need_frame_base = decode_location_expression (start,
4449 pointer_size,
4450 offset_size,
4451 dwarf_version,
4452 length,
4453 cu_offset, section);
4454 putchar (')');
4456 if (need_frame_base && !has_frame_base)
4457 printf (_(" [without DW_AT_frame_base]"));
4459 if (begin == end)
4460 fputs (_(" (start == end)"), stdout);
4461 else if (begin > end)
4462 fputs (_(" (start > end)"), stdout);
4464 putchar ('\n');
4466 start += length;
4469 *start_ptr = start;
4472 /* Print a .debug_addr table index in decimal, surrounded by square brackets,
4473 right-adjusted in a field of length LEN, and followed by a space. */
4475 static void
4476 print_addr_index (unsigned int idx, unsigned int len)
4478 static char buf[15];
4479 snprintf (buf, sizeof (buf), "[%d]", idx);
4480 printf ("%*s ", len, buf);
4483 /* Display a location list from a .dwo section. It uses address indexes rather
4484 than embedded addresses. This code closely follows display_loc_list, but the
4485 two are sufficiently different that combining things is very ugly. */
4487 static void
4488 display_loc_list_dwo (struct dwarf_section *section,
4489 unsigned char **start_ptr,
4490 unsigned int debug_info_entry,
4491 unsigned long offset,
4492 int has_frame_base)
4494 unsigned char *start = *start_ptr;
4495 unsigned char *section_end = section->start + section->size;
4496 unsigned long cu_offset;
4497 unsigned int pointer_size;
4498 unsigned int offset_size;
4499 int dwarf_version;
4500 int entry_type;
4501 unsigned short length;
4502 int need_frame_base;
4503 unsigned int idx;
4504 unsigned int bytes_read;
4506 if (debug_info_entry >= num_debug_info_entries)
4508 warn (_("No debug information for loc lists of entry: %u\n"),
4509 debug_info_entry);
4510 return;
4513 cu_offset = debug_information [debug_info_entry].cu_offset;
4514 pointer_size = debug_information [debug_info_entry].pointer_size;
4515 offset_size = debug_information [debug_info_entry].offset_size;
4516 dwarf_version = debug_information [debug_info_entry].dwarf_version;
4518 if (pointer_size < 2 || pointer_size > 8)
4520 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
4521 pointer_size, debug_info_entry);
4522 return;
4525 while (1)
4527 printf (" %8.8lx ", offset + (start - *start_ptr));
4529 if (start >= section_end)
4531 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4532 offset);
4533 break;
4536 SAFE_BYTE_GET_AND_INC (entry_type, start, 1, section_end);
4537 switch (entry_type)
4539 case 0: /* A terminating entry. */
4540 *start_ptr = start;
4541 printf (_("<End of list>\n"));
4542 return;
4543 case 1: /* A base-address entry. */
4544 idx = read_uleb128 (start, &bytes_read, section_end);
4545 start += bytes_read;
4546 print_addr_index (idx, 8);
4547 printf (" ");
4548 printf (_("(base address selection entry)\n"));
4549 continue;
4550 case 2: /* A start/end entry. */
4551 idx = read_uleb128 (start, &bytes_read, section_end);
4552 start += bytes_read;
4553 print_addr_index (idx, 8);
4554 idx = read_uleb128 (start, &bytes_read, section_end);
4555 start += bytes_read;
4556 print_addr_index (idx, 8);
4557 break;
4558 case 3: /* A start/length entry. */
4559 idx = read_uleb128 (start, &bytes_read, section_end);
4560 start += bytes_read;
4561 print_addr_index (idx, 8);
4562 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4563 printf ("%08x ", idx);
4564 break;
4565 case 4: /* An offset pair entry. */
4566 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4567 printf ("%08x ", idx);
4568 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4569 printf ("%08x ", idx);
4570 break;
4571 default:
4572 warn (_("Unknown location list entry type 0x%x.\n"), entry_type);
4573 *start_ptr = start;
4574 return;
4577 if (start + 2 > section_end)
4579 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4580 offset);
4581 break;
4584 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
4585 if (start + length > section_end)
4587 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4588 offset);
4589 break;
4592 putchar ('(');
4593 need_frame_base = decode_location_expression (start,
4594 pointer_size,
4595 offset_size,
4596 dwarf_version,
4597 length,
4598 cu_offset, section);
4599 putchar (')');
4601 if (need_frame_base && !has_frame_base)
4602 printf (_(" [without DW_AT_frame_base]"));
4604 putchar ('\n');
4606 start += length;
4609 *start_ptr = start;
4612 /* Sort array of indexes in ascending order of loc_offsets[idx]. */
4614 static dwarf_vma *loc_offsets;
4616 static int
4617 loc_offsets_compar (const void *ap, const void *bp)
4619 dwarf_vma a = loc_offsets[*(const unsigned int *) ap];
4620 dwarf_vma b = loc_offsets[*(const unsigned int *) bp];
4622 return (a > b) - (b > a);
4625 static int
4626 display_debug_loc (struct dwarf_section *section, void *file)
4628 unsigned char *start = section->start;
4629 unsigned long bytes;
4630 unsigned char *section_begin = start;
4631 unsigned int num_loc_list = 0;
4632 unsigned long last_offset = 0;
4633 unsigned int first = 0;
4634 unsigned int i;
4635 unsigned int j;
4636 int seen_first_offset = 0;
4637 int locs_sorted = 1;
4638 unsigned char *next;
4639 unsigned int *array = NULL;
4640 const char *suffix = strrchr (section->name, '.');
4641 int is_dwo = 0;
4643 if (suffix && strcmp (suffix, ".dwo") == 0)
4644 is_dwo = 1;
4646 bytes = section->size;
4648 if (bytes == 0)
4650 printf (_("\nThe %s section is empty.\n"), section->name);
4651 return 0;
4654 if (load_debug_info (file) == 0)
4656 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
4657 section->name);
4658 return 0;
4661 /* Check the order of location list in .debug_info section. If
4662 offsets of location lists are in the ascending order, we can
4663 use `debug_information' directly. */
4664 for (i = 0; i < num_debug_info_entries; i++)
4666 unsigned int num;
4668 num = debug_information [i].num_loc_offsets;
4669 if (num > num_loc_list)
4670 num_loc_list = num;
4672 /* Check if we can use `debug_information' directly. */
4673 if (locs_sorted && num != 0)
4675 if (!seen_first_offset)
4677 /* This is the first location list. */
4678 last_offset = debug_information [i].loc_offsets [0];
4679 first = i;
4680 seen_first_offset = 1;
4681 j = 1;
4683 else
4684 j = 0;
4686 for (; j < num; j++)
4688 if (last_offset >
4689 debug_information [i].loc_offsets [j])
4691 locs_sorted = 0;
4692 break;
4694 last_offset = debug_information [i].loc_offsets [j];
4699 if (!seen_first_offset)
4700 error (_("No location lists in .debug_info section!\n"));
4702 if (debug_information [first].num_loc_offsets > 0
4703 && debug_information [first].loc_offsets [0] != 0)
4704 warn (_("Location lists in %s section start at 0x%s\n"),
4705 section->name,
4706 dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]));
4708 if (!locs_sorted)
4709 array = (unsigned int *) xcmalloc (num_loc_list, sizeof (unsigned int));
4710 printf (_("Contents of the %s section:\n\n"), section->name);
4711 if (reloc_at (section, 0))
4712 printf (_(" Warning: This section has relocations - addresses seen here may not be accurate.\n\n"));
4713 printf (_(" Offset Begin End Expression\n"));
4715 seen_first_offset = 0;
4716 for (i = first; i < num_debug_info_entries; i++)
4718 unsigned long offset;
4719 unsigned long base_address;
4720 unsigned int k;
4721 int has_frame_base;
4723 if (!locs_sorted)
4725 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
4726 array[k] = k;
4727 loc_offsets = debug_information [i].loc_offsets;
4728 qsort (array, debug_information [i].num_loc_offsets,
4729 sizeof (*array), loc_offsets_compar);
4732 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
4734 j = locs_sorted ? k : array[k];
4735 if (k
4736 && debug_information [i].loc_offsets [locs_sorted
4737 ? k - 1 : array [k - 1]]
4738 == debug_information [i].loc_offsets [j])
4739 continue;
4740 has_frame_base = debug_information [i].have_frame_base [j];
4741 offset = debug_information [i].loc_offsets [j];
4742 next = section_begin + offset;
4743 base_address = debug_information [i].base_address;
4745 if (!seen_first_offset)
4746 seen_first_offset = 1;
4747 else
4749 if (start < next)
4750 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
4751 (unsigned long) (start - section_begin),
4752 (unsigned long) offset);
4753 else if (start > next)
4754 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
4755 (unsigned long) (start - section_begin),
4756 (unsigned long) offset);
4758 start = next;
4760 if (offset >= bytes)
4762 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
4763 offset);
4764 continue;
4767 if (is_dwo)
4768 display_loc_list_dwo (section, &start, i, offset, has_frame_base);
4769 else
4770 display_loc_list (section, &start, i, offset, base_address,
4771 has_frame_base);
4775 if (start < section->start + section->size)
4776 warn (_("There are %ld unused bytes at the end of section %s\n"),
4777 (long) (section->start + section->size - start), section->name);
4778 putchar ('\n');
4779 free (array);
4780 return 1;
4783 static int
4784 display_debug_str (struct dwarf_section *section,
4785 void *file ATTRIBUTE_UNUSED)
4787 unsigned char *start = section->start;
4788 unsigned long bytes = section->size;
4789 dwarf_vma addr = section->address;
4791 if (bytes == 0)
4793 printf (_("\nThe %s section is empty.\n"), section->name);
4794 return 0;
4797 printf (_("Contents of the %s section:\n\n"), section->name);
4799 while (bytes)
4801 int j;
4802 int k;
4803 int lbytes;
4805 lbytes = (bytes > 16 ? 16 : bytes);
4807 printf (" 0x%8.8lx ", (unsigned long) addr);
4809 for (j = 0; j < 16; j++)
4811 if (j < lbytes)
4812 printf ("%2.2x", start[j]);
4813 else
4814 printf (" ");
4816 if ((j & 3) == 3)
4817 printf (" ");
4820 for (j = 0; j < lbytes; j++)
4822 k = start[j];
4823 if (k >= ' ' && k < 0x80)
4824 printf ("%c", k);
4825 else
4826 printf (".");
4829 putchar ('\n');
4831 start += lbytes;
4832 addr += lbytes;
4833 bytes -= lbytes;
4836 putchar ('\n');
4838 return 1;
4841 static int
4842 display_debug_info (struct dwarf_section *section, void *file)
4844 return process_debug_info (section, file, section->abbrev_sec, 0, 0);
4847 static int
4848 display_debug_types (struct dwarf_section *section, void *file)
4850 return process_debug_info (section, file, section->abbrev_sec, 0, 1);
4853 static int
4854 display_trace_info (struct dwarf_section *section, void *file)
4856 return process_debug_info (section, file, section->abbrev_sec, 0, 0);
4859 static int
4860 display_debug_aranges (struct dwarf_section *section,
4861 void *file ATTRIBUTE_UNUSED)
4863 unsigned char *start = section->start;
4864 unsigned char *end = start + section->size;
4866 printf (_("Contents of the %s section:\n\n"), section->name);
4868 /* It does not matter if this load fails,
4869 we test for that later on. */
4870 load_debug_info (file);
4872 while (start < end)
4874 unsigned char *hdrptr;
4875 DWARF2_Internal_ARange arange;
4876 unsigned char *addr_ranges;
4877 dwarf_vma length;
4878 dwarf_vma address;
4879 unsigned char address_size;
4880 int excess;
4881 unsigned int offset_size;
4882 unsigned int initial_length_size;
4884 hdrptr = start;
4886 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 4, end);
4887 if (arange.ar_length == 0xffffffff)
4889 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 8, end);
4890 offset_size = 8;
4891 initial_length_size = 12;
4893 else
4895 offset_size = 4;
4896 initial_length_size = 4;
4899 SAFE_BYTE_GET_AND_INC (arange.ar_version, hdrptr, 2, end);
4900 SAFE_BYTE_GET_AND_INC (arange.ar_info_offset, hdrptr, offset_size, end);
4902 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
4903 && num_debug_info_entries > 0
4904 && find_debug_info_for_offset (arange.ar_info_offset) == NULL)
4905 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
4906 (unsigned long) arange.ar_info_offset, section->name);
4908 SAFE_BYTE_GET_AND_INC (arange.ar_pointer_size, hdrptr, 1, end);
4909 SAFE_BYTE_GET_AND_INC (arange.ar_segment_size, hdrptr, 1, end);
4911 if (arange.ar_version != 2 && arange.ar_version != 3)
4913 /* PR 19872: A version number of 0 probably means that there is
4914 padding at the end of the .debug_aranges section. Gold puts
4915 it there when performing an incremental link, for example.
4916 So do not generate a warning in this case. */
4917 if (arange.ar_version)
4918 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
4919 break;
4922 printf (_(" Length: %ld\n"),
4923 (long) arange.ar_length);
4924 printf (_(" Version: %d\n"), arange.ar_version);
4925 printf (_(" Offset into .debug_info: 0x%lx\n"),
4926 (unsigned long) arange.ar_info_offset);
4927 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
4928 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
4930 address_size = arange.ar_pointer_size + arange.ar_segment_size;
4932 /* PR 17512: file: 001-108546-0.001:0.1. */
4933 if (address_size == 0 || address_size > 8)
4935 error (_("Invalid address size in %s section!\n"),
4936 section->name);
4937 break;
4940 /* The DWARF spec does not require that the address size be a power
4941 of two, but we do. This will have to change if we ever encounter
4942 an uneven architecture. */
4943 if ((address_size & (address_size - 1)) != 0)
4945 warn (_("Pointer size + Segment size is not a power of two.\n"));
4946 break;
4949 if (address_size > 4)
4950 printf (_("\n Address Length\n"));
4951 else
4952 printf (_("\n Address Length\n"));
4954 addr_ranges = hdrptr;
4956 /* Must pad to an alignment boundary that is twice the address size. */
4957 excess = (hdrptr - start) % (2 * address_size);
4958 if (excess)
4959 addr_ranges += (2 * address_size) - excess;
4961 hdrptr = start + arange.ar_length + initial_length_size;
4962 if (hdrptr < start || hdrptr > end)
4964 error (_("Excessive header length: %lx\n"), (long) arange.ar_length);
4965 break;
4967 start = hdrptr;
4969 while (addr_ranges + 2 * address_size <= start)
4971 SAFE_BYTE_GET_AND_INC (address, addr_ranges, address_size, end);
4972 SAFE_BYTE_GET_AND_INC (length, addr_ranges, address_size, end);
4974 printf (" ");
4975 print_dwarf_vma (address, address_size);
4976 print_dwarf_vma (length, address_size);
4977 putchar ('\n');
4981 printf ("\n");
4983 return 1;
4986 /* Comparison function for qsort. */
4987 static int
4988 comp_addr_base (const void * v0, const void * v1)
4990 debug_info * info0 = (debug_info *) v0;
4991 debug_info * info1 = (debug_info *) v1;
4992 return info0->addr_base - info1->addr_base;
4995 /* Display the debug_addr section. */
4996 static int
4997 display_debug_addr (struct dwarf_section *section,
4998 void *file)
5000 debug_info **debug_addr_info;
5001 unsigned char *entry;
5002 unsigned char *end;
5003 unsigned int i;
5004 unsigned int count;
5006 if (section->size == 0)
5008 printf (_("\nThe %s section is empty.\n"), section->name);
5009 return 0;
5012 if (load_debug_info (file) == 0)
5014 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
5015 section->name);
5016 return 0;
5019 printf (_("Contents of the %s section:\n\n"), section->name);
5021 /* PR 17531: file: cf38d01b.
5022 We use xcalloc because a corrupt file may not have initialised all of the
5023 fields in the debug_info structure, which means that the sort below might
5024 try to move uninitialised data. */
5025 debug_addr_info = (debug_info **) xcalloc ((num_debug_info_entries + 1),
5026 sizeof (debug_info *));
5028 count = 0;
5029 for (i = 0; i < num_debug_info_entries; i++)
5030 if (debug_information [i].addr_base != DEBUG_INFO_UNAVAILABLE)
5032 /* PR 17531: file: cf38d01b. */
5033 if (debug_information[i].addr_base >= section->size)
5034 warn (_("Corrupt address base (%lx) found in debug section %u\n"),
5035 (unsigned long) debug_information[i].addr_base, i);
5036 else
5037 debug_addr_info [count++] = debug_information + i;
5040 /* Add a sentinel to make iteration convenient. */
5041 debug_addr_info [count] = (debug_info *) xmalloc (sizeof (debug_info));
5042 debug_addr_info [count]->addr_base = section->size;
5043 qsort (debug_addr_info, count, sizeof (debug_info *), comp_addr_base);
5045 for (i = 0; i < count; i++)
5047 unsigned int idx;
5048 unsigned int address_size = debug_addr_info [i]->pointer_size;
5050 printf (_(" For compilation unit at offset 0x%s:\n"),
5051 dwarf_vmatoa ("x", debug_addr_info [i]->cu_offset));
5053 printf (_("\tIndex\tAddress\n"));
5054 entry = section->start + debug_addr_info [i]->addr_base;
5055 end = section->start + debug_addr_info [i + 1]->addr_base;
5056 idx = 0;
5057 while (entry < end)
5059 dwarf_vma base = byte_get (entry, address_size);
5060 printf (_("\t%d:\t"), idx);
5061 print_dwarf_vma (base, address_size);
5062 printf ("\n");
5063 entry += address_size;
5064 idx++;
5067 printf ("\n");
5069 free (debug_addr_info);
5070 return 1;
5073 /* Display the .debug_str_offsets and .debug_str_offsets.dwo sections. */
5074 static int
5075 display_debug_str_offsets (struct dwarf_section *section,
5076 void *file ATTRIBUTE_UNUSED)
5078 if (section->size == 0)
5080 printf (_("\nThe %s section is empty.\n"), section->name);
5081 return 0;
5083 /* TODO: Dump the contents. This is made somewhat difficult by not knowing
5084 what the offset size is for this section. */
5085 return 1;
5088 /* Each debug_information[x].range_lists[y] gets this representation for
5089 sorting purposes. */
5091 struct range_entry
5093 /* The debug_information[x].range_lists[y] value. */
5094 unsigned long ranges_offset;
5096 /* Original debug_information to find parameters of the data. */
5097 debug_info *debug_info_p;
5100 /* Sort struct range_entry in ascending order of its RANGES_OFFSET. */
5102 static int
5103 range_entry_compar (const void *ap, const void *bp)
5105 const struct range_entry *a_re = (const struct range_entry *) ap;
5106 const struct range_entry *b_re = (const struct range_entry *) bp;
5107 const unsigned long a = a_re->ranges_offset;
5108 const unsigned long b = b_re->ranges_offset;
5110 return (a > b) - (b > a);
5113 static int
5114 display_debug_ranges (struct dwarf_section *section,
5115 void *file ATTRIBUTE_UNUSED)
5117 unsigned char *start = section->start;
5118 unsigned char *last_start = start;
5119 unsigned long bytes = section->size;
5120 unsigned char *section_begin = start;
5121 unsigned char *finish = start + bytes;
5122 unsigned int num_range_list, i;
5123 struct range_entry *range_entries, *range_entry_fill;
5125 if (bytes == 0)
5127 printf (_("\nThe %s section is empty.\n"), section->name);
5128 return 0;
5131 if (load_debug_info (file) == 0)
5133 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
5134 section->name);
5135 return 0;
5138 num_range_list = 0;
5139 for (i = 0; i < num_debug_info_entries; i++)
5140 num_range_list += debug_information [i].num_range_lists;
5142 if (num_range_list == 0)
5144 /* This can happen when the file was compiled with -gsplit-debug
5145 which removes references to range lists from the primary .o file. */
5146 printf (_("No range lists in .debug_info section.\n"));
5147 return 1;
5150 range_entries = (struct range_entry *)
5151 xmalloc (sizeof (*range_entries) * num_range_list);
5152 range_entry_fill = range_entries;
5154 for (i = 0; i < num_debug_info_entries; i++)
5156 debug_info *debug_info_p = &debug_information[i];
5157 unsigned int j;
5159 for (j = 0; j < debug_info_p->num_range_lists; j++)
5161 range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
5162 range_entry_fill->debug_info_p = debug_info_p;
5163 range_entry_fill++;
5167 qsort (range_entries, num_range_list, sizeof (*range_entries),
5168 range_entry_compar);
5170 if (dwarf_check != 0 && range_entries[0].ranges_offset != 0)
5171 warn (_("Range lists in %s section start at 0x%lx\n"),
5172 section->name, range_entries[0].ranges_offset);
5174 printf (_("Contents of the %s section:\n\n"), section->name);
5175 printf (_(" Offset Begin End\n"));
5177 for (i = 0; i < num_range_list; i++)
5179 struct range_entry *range_entry = &range_entries[i];
5180 debug_info *debug_info_p = range_entry->debug_info_p;
5181 unsigned int pointer_size;
5182 unsigned long offset;
5183 unsigned char *next;
5184 unsigned long base_address;
5186 pointer_size = debug_info_p->pointer_size;
5187 offset = range_entry->ranges_offset;
5188 next = section_begin + offset;
5189 base_address = debug_info_p->base_address;
5191 /* PR 17512: file: 001-101485-0.001:0.1. */
5192 if (pointer_size < 2 || pointer_size > 8)
5194 warn (_("Corrupt pointer size (%d) in debug entry at offset %8.8lx\n"),
5195 pointer_size, offset);
5196 continue;
5199 if (dwarf_check != 0 && i > 0)
5201 if (start < next)
5202 warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
5203 (unsigned long) (start - section_begin),
5204 (unsigned long) (next - section_begin), section->name);
5205 else if (start > next)
5207 if (next == last_start)
5208 continue;
5209 warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
5210 (unsigned long) (start - section_begin),
5211 (unsigned long) (next - section_begin), section->name);
5214 start = next;
5215 last_start = next;
5217 while (start < finish)
5219 dwarf_vma begin;
5220 dwarf_vma end;
5222 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
5223 if (start >= finish)
5224 break;
5225 SAFE_SIGNED_BYTE_GET_AND_INC (end, start, pointer_size, finish);
5227 printf (" %8.8lx ", offset);
5229 if (begin == 0 && end == 0)
5231 printf (_("<End of list>\n"));
5232 break;
5235 /* Check base address specifiers. */
5236 if (is_max_address (begin, pointer_size)
5237 && !is_max_address (end, pointer_size))
5239 base_address = end;
5240 print_dwarf_vma (begin, pointer_size);
5241 print_dwarf_vma (end, pointer_size);
5242 printf ("(base address)\n");
5243 continue;
5246 print_dwarf_vma (begin + base_address, pointer_size);
5247 print_dwarf_vma (end + base_address, pointer_size);
5249 if (begin == end)
5250 fputs (_("(start == end)"), stdout);
5251 else if (begin > end)
5252 fputs (_("(start > end)"), stdout);
5254 putchar ('\n');
5257 putchar ('\n');
5259 free (range_entries);
5261 return 1;
5264 typedef struct Frame_Chunk
5266 struct Frame_Chunk *next;
5267 unsigned char *chunk_start;
5268 unsigned int ncols;
5269 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
5270 short int *col_type;
5271 int *col_offset;
5272 char *augmentation;
5273 unsigned int code_factor;
5274 int data_factor;
5275 dwarf_vma pc_begin;
5276 dwarf_vma pc_range;
5277 int cfa_reg;
5278 dwarf_vma cfa_offset;
5279 unsigned int ra;
5280 unsigned char fde_encoding;
5281 unsigned char cfa_exp;
5282 unsigned char ptr_size;
5283 unsigned char segment_size;
5285 Frame_Chunk;
5287 static const char *const *dwarf_regnames;
5288 static unsigned int dwarf_regnames_count;
5290 /* A marker for a col_type that means this column was never referenced
5291 in the frame info. */
5292 #define DW_CFA_unreferenced (-1)
5294 /* Return 0 if no more space is needed, 1 if more space is needed,
5295 -1 for invalid reg. */
5297 static int
5298 frame_need_space (Frame_Chunk *fc, unsigned int reg)
5300 unsigned int prev = fc->ncols;
5302 if (reg < (unsigned int) fc->ncols)
5303 return 0;
5305 if (dwarf_regnames_count
5306 && reg > dwarf_regnames_count)
5307 return -1;
5309 fc->ncols = reg + 1;
5310 /* PR 17512: file: 10450-2643-0.004.
5311 If reg == -1 then this can happen... */
5312 if (fc->ncols == 0)
5313 return -1;
5315 /* PR 17512: file: 2844a11d. */
5316 if (fc->ncols > 1024)
5318 error (_("Unfeasibly large register number: %u\n"), reg);
5319 fc->ncols = 0;
5320 /* FIXME: 1024 is an arbitrary limit. Increase it if
5321 we ever encounter a valid binary that exceeds it. */
5322 return -1;
5325 fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
5326 sizeof (short int));
5327 fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
5328 /* PR 17512: file:002-10025-0.005. */
5329 if (fc->col_type == NULL || fc->col_offset == NULL)
5331 error (_("Out of memory allocating %u columns in dwarf frame arrays\n"),
5332 fc->ncols);
5333 fc->ncols = 0;
5334 return -1;
5337 while (prev < fc->ncols)
5339 fc->col_type[prev] = DW_CFA_unreferenced;
5340 fc->col_offset[prev] = 0;
5341 prev++;
5343 return 1;
5346 static const char *const dwarf_regnames_i386[] =
5348 "eax", "ecx", "edx", "ebx", /* 0 - 3 */
5349 "esp", "ebp", "esi", "edi", /* 4 - 7 */
5350 "eip", "eflags", NULL, /* 8 - 10 */
5351 "st0", "st1", "st2", "st3", /* 11 - 14 */
5352 "st4", "st5", "st6", "st7", /* 15 - 18 */
5353 NULL, NULL, /* 19 - 20 */
5354 "xmm0", "xmm1", "xmm2", "xmm3", /* 21 - 24 */
5355 "xmm4", "xmm5", "xmm6", "xmm7", /* 25 - 28 */
5356 "mm0", "mm1", "mm2", "mm3", /* 29 - 32 */
5357 "mm4", "mm5", "mm6", "mm7", /* 33 - 36 */
5358 "fcw", "fsw", "mxcsr", /* 37 - 39 */
5359 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47 */
5360 "tr", "ldtr", /* 48 - 49 */
5361 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57 */
5362 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65 */
5363 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73 */
5364 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81 */
5365 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89 */
5366 NULL, NULL, NULL, /* 90 - 92 */
5367 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7" /* 93 - 100 */
5370 static const char *const dwarf_regnames_iamcu[] =
5372 "eax", "ecx", "edx", "ebx", /* 0 - 3 */
5373 "esp", "ebp", "esi", "edi", /* 4 - 7 */
5374 "eip", "eflags", NULL, /* 8 - 10 */
5375 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 11 - 18 */
5376 NULL, NULL, /* 19 - 20 */
5377 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 21 - 28 */
5378 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 29 - 36 */
5379 NULL, NULL, NULL, /* 37 - 39 */
5380 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47 */
5381 "tr", "ldtr", /* 48 - 49 */
5382 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57 */
5383 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65 */
5384 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73 */
5385 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81 */
5386 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89 */
5387 NULL, NULL, NULL, /* 90 - 92 */
5388 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL /* 93 - 100 */
5391 void
5392 init_dwarf_regnames_i386 (void)
5394 dwarf_regnames = dwarf_regnames_i386;
5395 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
5398 void
5399 init_dwarf_regnames_iamcu (void)
5401 dwarf_regnames = dwarf_regnames_iamcu;
5402 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_iamcu);
5405 static const char *const dwarf_regnames_x86_64[] =
5407 "rax", "rdx", "rcx", "rbx",
5408 "rsi", "rdi", "rbp", "rsp",
5409 "r8", "r9", "r10", "r11",
5410 "r12", "r13", "r14", "r15",
5411 "rip",
5412 "xmm0", "xmm1", "xmm2", "xmm3",
5413 "xmm4", "xmm5", "xmm6", "xmm7",
5414 "xmm8", "xmm9", "xmm10", "xmm11",
5415 "xmm12", "xmm13", "xmm14", "xmm15",
5416 "st0", "st1", "st2", "st3",
5417 "st4", "st5", "st6", "st7",
5418 "mm0", "mm1", "mm2", "mm3",
5419 "mm4", "mm5", "mm6", "mm7",
5420 "rflags",
5421 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
5422 "fs.base", "gs.base", NULL, NULL,
5423 "tr", "ldtr",
5424 "mxcsr", "fcw", "fsw",
5425 "xmm16", "xmm17", "xmm18", "xmm19",
5426 "xmm20", "xmm21", "xmm22", "xmm23",
5427 "xmm24", "xmm25", "xmm26", "xmm27",
5428 "xmm28", "xmm29", "xmm30", "xmm31",
5429 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 83 - 90 */
5430 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 91 - 98 */
5431 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 99 - 106 */
5432 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 107 - 114 */
5433 NULL, NULL, NULL, /* 115 - 117 */
5434 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
5437 void
5438 init_dwarf_regnames_x86_64 (void)
5440 dwarf_regnames = dwarf_regnames_x86_64;
5441 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
5444 static const char *const dwarf_regnames_aarch64[] =
5446 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
5447 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
5448 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
5449 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp",
5450 NULL, "elr", NULL, NULL, NULL, NULL, NULL, NULL,
5451 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5452 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5453 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5454 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
5455 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
5456 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
5457 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
5460 void
5461 init_dwarf_regnames_aarch64 (void)
5463 dwarf_regnames = dwarf_regnames_aarch64;
5464 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_aarch64);
5467 static const char *const dwarf_regnames_s390[] =
5469 /* Avoid saying "r5 (r5)", so omit the names of r0-r15. */
5470 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5471 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5472 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5473 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15",
5474 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
5475 "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", "cr15",
5476 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7",
5477 "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15",
5478 "pswm", "pswa",
5479 NULL, NULL,
5480 "v16", "v18", "v20", "v22", "v17", "v19", "v21", "v23",
5481 "v24", "v26", "v28", "v30", "v25", "v27", "v29", "v31",
5484 void
5485 init_dwarf_regnames_s390 (void)
5487 dwarf_regnames = dwarf_regnames_s390;
5488 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_s390);
5491 void
5492 init_dwarf_regnames (unsigned int e_machine)
5494 switch (e_machine)
5496 case EM_386:
5497 init_dwarf_regnames_i386 ();
5498 break;
5500 case EM_IAMCU:
5501 init_dwarf_regnames_iamcu ();
5502 break;
5504 case EM_X86_64:
5505 case EM_L1OM:
5506 case EM_K1OM:
5507 init_dwarf_regnames_x86_64 ();
5508 break;
5510 case EM_AARCH64:
5511 init_dwarf_regnames_aarch64 ();
5512 break;
5514 case EM_S390:
5515 init_dwarf_regnames_s390 ();
5516 break;
5518 default:
5519 break;
5523 static const char *
5524 regname (unsigned int regno, int row)
5526 static char reg[64];
5527 if (dwarf_regnames
5528 && regno < dwarf_regnames_count
5529 && dwarf_regnames [regno] != NULL)
5531 if (row)
5532 return dwarf_regnames [regno];
5533 snprintf (reg, sizeof (reg), "r%d (%s)", regno,
5534 dwarf_regnames [regno]);
5536 else
5537 snprintf (reg, sizeof (reg), "r%d", regno);
5538 return reg;
5541 static void
5542 frame_display_row (Frame_Chunk *fc, int *need_col_headers, unsigned int *max_regs)
5544 unsigned int r;
5545 char tmp[100];
5547 if (*max_regs < fc->ncols)
5548 *max_regs = fc->ncols;
5550 if (*need_col_headers)
5552 static const char *sloc = " LOC";
5554 *need_col_headers = 0;
5556 printf ("%-*s CFA ", eh_addr_size * 2, sloc);
5558 for (r = 0; r < *max_regs; r++)
5559 if (fc->col_type[r] != DW_CFA_unreferenced)
5561 if (r == fc->ra)
5562 printf ("ra ");
5563 else
5564 printf ("%-5s ", regname (r, 1));
5567 printf ("\n");
5570 print_dwarf_vma (fc->pc_begin, eh_addr_size);
5571 if (fc->cfa_exp)
5572 strcpy (tmp, "exp");
5573 else
5574 sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), (int) fc->cfa_offset);
5575 printf ("%-8s ", tmp);
5577 for (r = 0; r < fc->ncols; r++)
5579 if (fc->col_type[r] != DW_CFA_unreferenced)
5581 switch (fc->col_type[r])
5583 case DW_CFA_undefined:
5584 strcpy (tmp, "u");
5585 break;
5586 case DW_CFA_same_value:
5587 strcpy (tmp, "s");
5588 break;
5589 case DW_CFA_offset:
5590 sprintf (tmp, "c%+d", fc->col_offset[r]);
5591 break;
5592 case DW_CFA_val_offset:
5593 sprintf (tmp, "v%+d", fc->col_offset[r]);
5594 break;
5595 case DW_CFA_register:
5596 sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
5597 break;
5598 case DW_CFA_expression:
5599 strcpy (tmp, "exp");
5600 break;
5601 case DW_CFA_val_expression:
5602 strcpy (tmp, "vexp");
5603 break;
5604 default:
5605 strcpy (tmp, "n/a");
5606 break;
5608 printf ("%-5s ", tmp);
5611 printf ("\n");
5614 #define GET(VAR, N) SAFE_BYTE_GET_AND_INC (VAR, start, N, end)
5615 #define LEB() read_uleb128 (start, & length_return, end); start += length_return
5616 #define SLEB() read_sleb128 (start, & length_return, end); start += length_return
5618 static unsigned char *
5619 read_cie (unsigned char *start, unsigned char *end,
5620 Frame_Chunk **p_cie, int *p_version,
5621 unsigned long *p_aug_len, unsigned char **p_aug)
5623 int version;
5624 Frame_Chunk *fc;
5625 unsigned int length_return;
5626 unsigned char *augmentation_data = NULL;
5627 unsigned long augmentation_data_len = 0;
5629 * p_cie = NULL;
5630 /* PR 17512: file: 001-228113-0.004. */
5631 if (start >= end)
5632 return end;
5634 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
5635 memset (fc, 0, sizeof (Frame_Chunk));
5637 fc->col_type = (short int *) xmalloc (sizeof (short int));
5638 fc->col_offset = (int *) xmalloc (sizeof (int));
5640 version = *start++;
5642 fc->augmentation = (char *) start;
5643 /* PR 17512: file: 001-228113-0.004.
5644 Skip past augmentation name, but avoid running off the end of the data. */
5645 while (start < end)
5646 if (* start ++ == '\0')
5647 break;
5648 if (start == end)
5650 warn (_("No terminator for augmentation name\n"));
5651 return start;
5654 if (strcmp (fc->augmentation, "eh") == 0)
5655 start += eh_addr_size;
5657 if (version >= 4)
5659 GET (fc->ptr_size, 1);
5660 if (fc->ptr_size < 1 || fc->ptr_size > 8)
5662 warn (_("Invalid pointer size (%d) in CIE data\n"), fc->ptr_size);
5663 return end;
5666 GET (fc->segment_size, 1);
5667 /* PR 17512: file: e99d2804. */
5668 if (fc->segment_size > 8 || fc->segment_size + fc->ptr_size > 8)
5670 warn (_("Invalid segment size (%d) in CIE data\n"), fc->segment_size);
5671 return end;
5674 eh_addr_size = fc->ptr_size;
5676 else
5678 fc->ptr_size = eh_addr_size;
5679 fc->segment_size = 0;
5681 fc->code_factor = LEB ();
5682 fc->data_factor = SLEB ();
5683 if (version == 1)
5685 GET (fc->ra, 1);
5687 else
5689 fc->ra = LEB ();
5692 if (fc->augmentation[0] == 'z')
5694 augmentation_data_len = LEB ();
5695 augmentation_data = start;
5696 start += augmentation_data_len;
5697 /* PR 17512: file: 11042-2589-0.004. */
5698 if (start > end)
5700 warn (_("Augmentation data too long: 0x%lx\n"), augmentation_data_len);
5701 return end;
5705 if (augmentation_data_len)
5707 unsigned char *p;
5708 unsigned char *q;
5709 unsigned char *qend;
5711 p = (unsigned char *) fc->augmentation + 1;
5712 q = augmentation_data;
5713 qend = q + augmentation_data_len;
5715 /* PR 17531: file: 015adfaa. */
5716 if (qend < q)
5718 warn (_("Negative augmentation data length: 0x%lx"), augmentation_data_len);
5719 augmentation_data_len = 0;
5722 while (p < end && q < augmentation_data + augmentation_data_len)
5724 if (*p == 'L')
5725 q++;
5726 else if (*p == 'P')
5727 q += 1 + size_of_encoded_value (*q);
5728 else if (*p == 'R')
5729 fc->fde_encoding = *q++;
5730 else if (*p == 'S')
5732 else
5733 break;
5734 p++;
5736 /* Note - it is OK if this loop terminates with q < qend.
5737 Padding may have been inserted to align the end of the CIE. */
5740 *p_cie = fc;
5741 if (p_version)
5742 *p_version = version;
5743 if (p_aug_len)
5745 *p_aug_len = augmentation_data_len;
5746 *p_aug = augmentation_data;
5748 return start;
5751 static int
5752 display_debug_frames (struct dwarf_section *section,
5753 void *file ATTRIBUTE_UNUSED)
5755 unsigned char *start = section->start;
5756 unsigned char *end = start + section->size;
5757 unsigned char *section_start = start;
5758 Frame_Chunk *chunks = 0, *forward_refs = 0;
5759 Frame_Chunk *remembered_state = 0;
5760 Frame_Chunk *rs;
5761 int is_eh = strcmp (section->name, ".eh_frame") == 0;
5762 unsigned int length_return;
5763 unsigned int max_regs = 0;
5764 const char *bad_reg = _("bad register: ");
5765 unsigned int saved_eh_addr_size = eh_addr_size;
5767 printf (_("Contents of the %s section:\n"), section->name);
5769 while (start < end)
5771 unsigned char *saved_start;
5772 unsigned char *block_end;
5773 dwarf_vma length;
5774 dwarf_vma cie_id;
5775 Frame_Chunk *fc;
5776 Frame_Chunk *cie;
5777 int need_col_headers = 1;
5778 unsigned char *augmentation_data = NULL;
5779 unsigned long augmentation_data_len = 0;
5780 unsigned int encoded_ptr_size = saved_eh_addr_size;
5781 unsigned int offset_size;
5782 unsigned int initial_length_size;
5783 bfd_boolean all_nops;
5785 saved_start = start;
5787 SAFE_BYTE_GET_AND_INC (length, start, 4, end);
5789 if (length == 0)
5791 printf ("\n%08lx ZERO terminator\n\n",
5792 (unsigned long)(saved_start - section_start));
5793 /* Skip any zero terminators that directly follow.
5794 A corrupt section size could have loaded a whole
5795 slew of zero filled memory bytes. eg
5796 PR 17512: file: 070-19381-0.004. */
5797 while (start < end && * start == 0)
5798 ++ start;
5799 continue;
5802 if (length == 0xffffffff)
5804 SAFE_BYTE_GET_AND_INC (length, start, 8, end);
5805 offset_size = 8;
5806 initial_length_size = 12;
5808 else
5810 offset_size = 4;
5811 initial_length_size = 4;
5814 block_end = saved_start + length + initial_length_size;
5815 if (block_end > end || block_end < start)
5817 warn ("Invalid length 0x%s in FDE at %#08lx\n",
5818 dwarf_vmatoa_1 (NULL, length, offset_size),
5819 (unsigned long) (saved_start - section_start));
5820 block_end = end;
5823 SAFE_BYTE_GET_AND_INC (cie_id, start, offset_size, end);
5825 if (is_eh ? (cie_id == 0) : ((offset_size == 4 && cie_id == DW_CIE_ID)
5826 || (offset_size == 8 && cie_id == DW64_CIE_ID)))
5828 int version;
5829 unsigned int mreg;
5831 start = read_cie (start, end, &cie, &version,
5832 &augmentation_data_len, &augmentation_data);
5833 /* PR 17512: file: 027-135133-0.005. */
5834 if (cie == NULL)
5835 break;
5837 fc = cie;
5838 fc->next = chunks;
5839 chunks = fc;
5840 fc->chunk_start = saved_start;
5841 mreg = max_regs > 0 ? max_regs - 1 : 0;
5842 if (mreg < fc->ra)
5843 mreg = fc->ra;
5844 if (frame_need_space (fc, mreg) < 0)
5845 break;
5846 if (fc->fde_encoding)
5847 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
5849 printf ("\n%08lx ", (unsigned long) (saved_start - section_start));
5850 print_dwarf_vma (length, fc->ptr_size);
5851 print_dwarf_vma (cie_id, offset_size);
5853 if (do_debug_frames_interp)
5855 printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc->augmentation,
5856 fc->code_factor, fc->data_factor, fc->ra);
5858 else
5860 printf ("CIE\n");
5861 printf (" Version: %d\n", version);
5862 printf (" Augmentation: \"%s\"\n", fc->augmentation);
5863 if (version >= 4)
5865 printf (" Pointer Size: %u\n", fc->ptr_size);
5866 printf (" Segment Size: %u\n", fc->segment_size);
5868 printf (" Code alignment factor: %u\n", fc->code_factor);
5869 printf (" Data alignment factor: %d\n", fc->data_factor);
5870 printf (" Return address column: %d\n", fc->ra);
5872 if (augmentation_data_len)
5874 unsigned long i;
5876 printf (" Augmentation data: ");
5877 for (i = 0; i < augmentation_data_len; ++i)
5878 /* FIXME: If do_wide is FALSE, then we should
5879 add carriage returns at 80 columns... */
5880 printf (" %02x", augmentation_data[i]);
5881 putchar ('\n');
5883 putchar ('\n');
5886 else
5888 unsigned char *look_for;
5889 static Frame_Chunk fde_fc;
5890 unsigned long segment_selector;
5892 if (is_eh)
5894 dwarf_vma sign = (dwarf_vma) 1 << (offset_size * 8 - 1);
5895 look_for = start - 4 - ((cie_id ^ sign) - sign);
5897 else
5898 look_for = section_start + cie_id;
5900 if (look_for <= saved_start)
5902 for (cie = chunks; cie ; cie = cie->next)
5903 if (cie->chunk_start == look_for)
5904 break;
5906 else
5908 for (cie = forward_refs; cie ; cie = cie->next)
5909 if (cie->chunk_start == look_for)
5910 break;
5911 if (!cie)
5913 unsigned int off_size;
5914 unsigned char *cie_scan;
5916 cie_scan = look_for;
5917 off_size = 4;
5918 SAFE_BYTE_GET_AND_INC (length, cie_scan, 4, end);
5919 if (length == 0xffffffff)
5921 SAFE_BYTE_GET_AND_INC (length, cie_scan, 8, end);
5922 off_size = 8;
5924 if (length != 0)
5926 dwarf_vma c_id;
5928 SAFE_BYTE_GET_AND_INC (c_id, cie_scan, off_size, end);
5929 if (is_eh
5930 ? c_id == 0
5931 : ((off_size == 4 && c_id == DW_CIE_ID)
5932 || (off_size == 8 && c_id == DW64_CIE_ID)))
5934 int version;
5935 unsigned int mreg;
5937 read_cie (cie_scan, end, &cie, &version,
5938 &augmentation_data_len, &augmentation_data);
5939 /* PR 17512: file: 3450-2098-0.004. */
5940 if (cie == NULL)
5942 warn (_("Failed to read CIE information\n"));
5943 break;
5945 cie->next = forward_refs;
5946 forward_refs = cie;
5947 cie->chunk_start = look_for;
5948 mreg = max_regs > 0 ? max_regs - 1 : 0;
5949 if (mreg < cie->ra)
5950 mreg = cie->ra;
5951 if (frame_need_space (cie, mreg) < 0)
5953 warn (_("Invalid max register\n"));
5954 break;
5956 if (cie->fde_encoding)
5957 encoded_ptr_size
5958 = size_of_encoded_value (cie->fde_encoding);
5964 fc = &fde_fc;
5965 memset (fc, 0, sizeof (Frame_Chunk));
5967 if (!cie)
5969 warn ("Invalid CIE pointer 0x%s in FDE at %#08lx\n",
5970 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
5971 (unsigned long) (saved_start - section_start));
5972 fc->ncols = 0;
5973 fc->col_type = (short int *) xmalloc (sizeof (short int));
5974 fc->col_offset = (int *) xmalloc (sizeof (int));
5975 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1 : 0) < 0)
5977 warn (_("Invalid max register\n"));
5978 break;
5980 cie = fc;
5981 fc->augmentation = "";
5982 fc->fde_encoding = 0;
5983 fc->ptr_size = eh_addr_size;
5984 fc->segment_size = 0;
5986 else
5988 fc->ncols = cie->ncols;
5989 fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
5990 fc->col_offset = (int *) xcmalloc (fc->ncols, sizeof (int));
5991 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
5992 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
5993 fc->augmentation = cie->augmentation;
5994 fc->ptr_size = cie->ptr_size;
5995 eh_addr_size = cie->ptr_size;
5996 fc->segment_size = cie->segment_size;
5997 fc->code_factor = cie->code_factor;
5998 fc->data_factor = cie->data_factor;
5999 fc->cfa_reg = cie->cfa_reg;
6000 fc->cfa_offset = cie->cfa_offset;
6001 fc->ra = cie->ra;
6002 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1: 0) < 0)
6004 warn (_("Invalid max register\n"));
6005 break;
6007 fc->fde_encoding = cie->fde_encoding;
6010 if (fc->fde_encoding)
6011 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
6013 segment_selector = 0;
6014 if (fc->segment_size)
6016 if (fc->segment_size > sizeof (segment_selector))
6018 /* PR 17512: file: 9e196b3e. */
6019 warn (_("Probably corrupt segment size: %d - using 4 instead\n"), fc->segment_size);
6020 fc->segment_size = 4;
6022 SAFE_BYTE_GET_AND_INC (segment_selector, start, fc->segment_size, end);
6025 fc->pc_begin = get_encoded_value (&start, fc->fde_encoding, section, end);
6027 /* FIXME: It appears that sometimes the final pc_range value is
6028 encoded in less than encoded_ptr_size bytes. See the x86_64
6029 run of the "objcopy on compressed debug sections" test for an
6030 example of this. */
6031 SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end);
6033 if (cie->augmentation[0] == 'z')
6035 augmentation_data_len = LEB ();
6036 augmentation_data = start;
6037 start += augmentation_data_len;
6038 /* PR 17512: file: 722-8446-0.004. */
6039 if (start >= end || ((signed long) augmentation_data_len) < 0)
6041 warn (_("Corrupt augmentation data length: %lx\n"),
6042 augmentation_data_len);
6043 start = end;
6044 augmentation_data = NULL;
6045 augmentation_data_len = 0;
6049 printf ("\n%08lx %s %s FDE cie=%08lx pc=",
6050 (unsigned long)(saved_start - section_start),
6051 dwarf_vmatoa_1 (NULL, length, fc->ptr_size),
6052 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
6053 (unsigned long)(cie->chunk_start - section_start));
6055 if (fc->segment_size)
6056 printf ("%04lx:", segment_selector);
6058 printf ("%s..%s\n",
6059 dwarf_vmatoa_1 (NULL, fc->pc_begin, fc->ptr_size),
6060 dwarf_vmatoa_1 (NULL, fc->pc_begin + fc->pc_range, fc->ptr_size));
6062 if (! do_debug_frames_interp && augmentation_data_len)
6064 unsigned long i;
6066 printf (" Augmentation data: ");
6067 for (i = 0; i < augmentation_data_len; ++i)
6068 printf (" %02x", augmentation_data[i]);
6069 putchar ('\n');
6070 putchar ('\n');
6074 /* At this point, fc is the current chunk, cie (if any) is set, and
6075 we're about to interpret instructions for the chunk. */
6076 /* ??? At present we need to do this always, since this sizes the
6077 fc->col_type and fc->col_offset arrays, which we write into always.
6078 We should probably split the interpreted and non-interpreted bits
6079 into two different routines, since there's so much that doesn't
6080 really overlap between them. */
6081 if (1 || do_debug_frames_interp)
6083 /* Start by making a pass over the chunk, allocating storage
6084 and taking note of what registers are used. */
6085 unsigned char *tmp = start;
6087 while (start < block_end)
6089 unsigned int reg, op, opa;
6090 unsigned long temp;
6091 unsigned char * new_start;
6093 op = *start++;
6094 opa = op & 0x3f;
6095 if (op & 0xc0)
6096 op &= 0xc0;
6098 /* Warning: if you add any more cases to this switch, be
6099 sure to add them to the corresponding switch below. */
6100 switch (op)
6102 case DW_CFA_advance_loc:
6103 break;
6104 case DW_CFA_offset:
6105 LEB ();
6106 if (frame_need_space (fc, opa) >= 0)
6107 fc->col_type[opa] = DW_CFA_undefined;
6108 break;
6109 case DW_CFA_restore:
6110 if (frame_need_space (fc, opa) >= 0)
6111 fc->col_type[opa] = DW_CFA_undefined;
6112 break;
6113 case DW_CFA_set_loc:
6114 start += encoded_ptr_size;
6115 break;
6116 case DW_CFA_advance_loc1:
6117 start += 1;
6118 break;
6119 case DW_CFA_advance_loc2:
6120 start += 2;
6121 break;
6122 case DW_CFA_advance_loc4:
6123 start += 4;
6124 break;
6125 case DW_CFA_offset_extended:
6126 case DW_CFA_val_offset:
6127 reg = LEB (); LEB ();
6128 if (frame_need_space (fc, reg) >= 0)
6129 fc->col_type[reg] = DW_CFA_undefined;
6130 break;
6131 case DW_CFA_restore_extended:
6132 reg = LEB ();
6133 if (frame_need_space (fc, reg) >= 0)
6134 fc->col_type[reg] = DW_CFA_undefined;
6135 break;
6136 case DW_CFA_undefined:
6137 reg = LEB ();
6138 if (frame_need_space (fc, reg) >= 0)
6139 fc->col_type[reg] = DW_CFA_undefined;
6140 break;
6141 case DW_CFA_same_value:
6142 reg = LEB ();
6143 if (frame_need_space (fc, reg) >= 0)
6144 fc->col_type[reg] = DW_CFA_undefined;
6145 break;
6146 case DW_CFA_register:
6147 reg = LEB (); LEB ();
6148 if (frame_need_space (fc, reg) >= 0)
6149 fc->col_type[reg] = DW_CFA_undefined;
6150 break;
6151 case DW_CFA_def_cfa:
6152 LEB (); LEB ();
6153 break;
6154 case DW_CFA_def_cfa_register:
6155 LEB ();
6156 break;
6157 case DW_CFA_def_cfa_offset:
6158 LEB ();
6159 break;
6160 case DW_CFA_def_cfa_expression:
6161 temp = LEB ();
6162 new_start = start + temp;
6163 if (new_start < start)
6165 warn (_("Corrupt CFA_def expression value: %lu\n"), temp);
6166 start = block_end;
6168 else
6169 start = new_start;
6170 break;
6171 case DW_CFA_expression:
6172 case DW_CFA_val_expression:
6173 reg = LEB ();
6174 temp = LEB ();
6175 new_start = start + temp;
6176 if (new_start < start)
6178 /* PR 17512: file:306-192417-0.005. */
6179 warn (_("Corrupt CFA expression value: %lu\n"), temp);
6180 start = block_end;
6182 else
6183 start = new_start;
6184 if (frame_need_space (fc, reg) >= 0)
6185 fc->col_type[reg] = DW_CFA_undefined;
6186 break;
6187 case DW_CFA_offset_extended_sf:
6188 case DW_CFA_val_offset_sf:
6189 reg = LEB (); SLEB ();
6190 if (frame_need_space (fc, reg) >= 0)
6191 fc->col_type[reg] = DW_CFA_undefined;
6192 break;
6193 case DW_CFA_def_cfa_sf:
6194 LEB (); SLEB ();
6195 break;
6196 case DW_CFA_def_cfa_offset_sf:
6197 SLEB ();
6198 break;
6199 case DW_CFA_MIPS_advance_loc8:
6200 start += 8;
6201 break;
6202 case DW_CFA_GNU_args_size:
6203 LEB ();
6204 break;
6205 case DW_CFA_GNU_negative_offset_extended:
6206 reg = LEB (); LEB ();
6207 if (frame_need_space (fc, reg) >= 0)
6208 fc->col_type[reg] = DW_CFA_undefined;
6209 break;
6210 default:
6211 break;
6214 start = tmp;
6217 all_nops = TRUE;
6219 /* Now we know what registers are used, make a second pass over
6220 the chunk, this time actually printing out the info. */
6222 while (start < block_end)
6224 unsigned char * tmp;
6225 unsigned op, opa;
6226 unsigned long ul, reg, roffs;
6227 dwarf_vma l;
6228 dwarf_vma ofs;
6229 dwarf_vma vma;
6230 const char *reg_prefix = "";
6232 op = *start++;
6233 opa = op & 0x3f;
6234 if (op & 0xc0)
6235 op &= 0xc0;
6237 /* Make a note if something other than DW_CFA_nop happens. */
6238 if (op != DW_CFA_nop)
6239 all_nops = FALSE;
6241 /* Warning: if you add any more cases to this switch, be
6242 sure to add them to the corresponding switch above. */
6243 switch (op)
6245 case DW_CFA_advance_loc:
6246 if (do_debug_frames_interp)
6247 frame_display_row (fc, &need_col_headers, &max_regs);
6248 else
6249 printf (" DW_CFA_advance_loc: %d to %s\n",
6250 opa * fc->code_factor,
6251 dwarf_vmatoa_1 (NULL,
6252 fc->pc_begin + opa * fc->code_factor,
6253 fc->ptr_size));
6254 fc->pc_begin += opa * fc->code_factor;
6255 break;
6257 case DW_CFA_offset:
6258 roffs = LEB ();
6259 if (opa >= (unsigned int) fc->ncols)
6260 reg_prefix = bad_reg;
6261 if (! do_debug_frames_interp || *reg_prefix != '\0')
6262 printf (" DW_CFA_offset: %s%s at cfa%+ld\n",
6263 reg_prefix, regname (opa, 0),
6264 roffs * fc->data_factor);
6265 if (*reg_prefix == '\0')
6267 fc->col_type[opa] = DW_CFA_offset;
6268 fc->col_offset[opa] = roffs * fc->data_factor;
6270 break;
6272 case DW_CFA_restore:
6273 if (opa >= (unsigned int) cie->ncols
6274 || opa >= (unsigned int) fc->ncols)
6275 reg_prefix = bad_reg;
6276 if (! do_debug_frames_interp || *reg_prefix != '\0')
6277 printf (" DW_CFA_restore: %s%s\n",
6278 reg_prefix, regname (opa, 0));
6279 if (*reg_prefix == '\0')
6281 fc->col_type[opa] = cie->col_type[opa];
6282 fc->col_offset[opa] = cie->col_offset[opa];
6283 if (do_debug_frames_interp
6284 && fc->col_type[opa] == DW_CFA_unreferenced)
6285 fc->col_type[opa] = DW_CFA_undefined;
6287 break;
6289 case DW_CFA_set_loc:
6290 vma = get_encoded_value (&start, fc->fde_encoding, section, block_end);
6291 if (do_debug_frames_interp)
6292 frame_display_row (fc, &need_col_headers, &max_regs);
6293 else
6294 printf (" DW_CFA_set_loc: %s\n",
6295 dwarf_vmatoa_1 (NULL, vma, fc->ptr_size));
6296 fc->pc_begin = vma;
6297 break;
6299 case DW_CFA_advance_loc1:
6300 SAFE_BYTE_GET_AND_INC (ofs, start, 1, end);
6301 if (do_debug_frames_interp)
6302 frame_display_row (fc, &need_col_headers, &max_regs);
6303 else
6304 printf (" DW_CFA_advance_loc1: %ld to %s\n",
6305 (unsigned long) (ofs * fc->code_factor),
6306 dwarf_vmatoa_1 (NULL,
6307 fc->pc_begin + ofs * fc->code_factor,
6308 fc->ptr_size));
6309 fc->pc_begin += ofs * fc->code_factor;
6310 break;
6312 case DW_CFA_advance_loc2:
6313 SAFE_BYTE_GET_AND_INC (ofs, start, 2, block_end);
6314 if (do_debug_frames_interp)
6315 frame_display_row (fc, &need_col_headers, &max_regs);
6316 else
6317 printf (" DW_CFA_advance_loc2: %ld to %s\n",
6318 (unsigned long) (ofs * fc->code_factor),
6319 dwarf_vmatoa_1 (NULL,
6320 fc->pc_begin + ofs * fc->code_factor,
6321 fc->ptr_size));
6322 fc->pc_begin += ofs * fc->code_factor;
6323 break;
6325 case DW_CFA_advance_loc4:
6326 SAFE_BYTE_GET_AND_INC (ofs, start, 4, block_end);
6327 if (do_debug_frames_interp)
6328 frame_display_row (fc, &need_col_headers, &max_regs);
6329 else
6330 printf (" DW_CFA_advance_loc4: %ld to %s\n",
6331 (unsigned long) (ofs * fc->code_factor),
6332 dwarf_vmatoa_1 (NULL,
6333 fc->pc_begin + ofs * fc->code_factor,
6334 fc->ptr_size));
6335 fc->pc_begin += ofs * fc->code_factor;
6336 break;
6338 case DW_CFA_offset_extended:
6339 reg = LEB ();
6340 roffs = LEB ();
6341 if (reg >= (unsigned int) fc->ncols)
6342 reg_prefix = bad_reg;
6343 if (! do_debug_frames_interp || *reg_prefix != '\0')
6344 printf (" DW_CFA_offset_extended: %s%s at cfa%+ld\n",
6345 reg_prefix, regname (reg, 0),
6346 roffs * fc->data_factor);
6347 if (*reg_prefix == '\0')
6349 fc->col_type[reg] = DW_CFA_offset;
6350 fc->col_offset[reg] = roffs * fc->data_factor;
6352 break;
6354 case DW_CFA_val_offset:
6355 reg = LEB ();
6356 roffs = LEB ();
6357 if (reg >= (unsigned int) fc->ncols)
6358 reg_prefix = bad_reg;
6359 if (! do_debug_frames_interp || *reg_prefix != '\0')
6360 printf (" DW_CFA_val_offset: %s%s at cfa%+ld\n",
6361 reg_prefix, regname (reg, 0),
6362 roffs * fc->data_factor);
6363 if (*reg_prefix == '\0')
6365 fc->col_type[reg] = DW_CFA_val_offset;
6366 fc->col_offset[reg] = roffs * fc->data_factor;
6368 break;
6370 case DW_CFA_restore_extended:
6371 reg = LEB ();
6372 if (reg >= (unsigned int) cie->ncols
6373 || reg >= (unsigned int) fc->ncols)
6374 reg_prefix = bad_reg;
6375 if (! do_debug_frames_interp || *reg_prefix != '\0')
6376 printf (" DW_CFA_restore_extended: %s%s\n",
6377 reg_prefix, regname (reg, 0));
6378 if (*reg_prefix == '\0')
6380 fc->col_type[reg] = cie->col_type[reg];
6381 fc->col_offset[reg] = cie->col_offset[reg];
6383 break;
6385 case DW_CFA_undefined:
6386 reg = LEB ();
6387 if (reg >= (unsigned int) fc->ncols)
6388 reg_prefix = bad_reg;
6389 if (! do_debug_frames_interp || *reg_prefix != '\0')
6390 printf (" DW_CFA_undefined: %s%s\n",
6391 reg_prefix, regname (reg, 0));
6392 if (*reg_prefix == '\0')
6394 fc->col_type[reg] = DW_CFA_undefined;
6395 fc->col_offset[reg] = 0;
6397 break;
6399 case DW_CFA_same_value:
6400 reg = LEB ();
6401 if (reg >= (unsigned int) fc->ncols)
6402 reg_prefix = bad_reg;
6403 if (! do_debug_frames_interp || *reg_prefix != '\0')
6404 printf (" DW_CFA_same_value: %s%s\n",
6405 reg_prefix, regname (reg, 0));
6406 if (*reg_prefix == '\0')
6408 fc->col_type[reg] = DW_CFA_same_value;
6409 fc->col_offset[reg] = 0;
6411 break;
6413 case DW_CFA_register:
6414 reg = LEB ();
6415 roffs = LEB ();
6416 if (reg >= (unsigned int) fc->ncols)
6417 reg_prefix = bad_reg;
6418 if (! do_debug_frames_interp || *reg_prefix != '\0')
6420 printf (" DW_CFA_register: %s%s in ",
6421 reg_prefix, regname (reg, 0));
6422 puts (regname (roffs, 0));
6424 if (*reg_prefix == '\0')
6426 fc->col_type[reg] = DW_CFA_register;
6427 fc->col_offset[reg] = roffs;
6429 break;
6431 case DW_CFA_remember_state:
6432 if (! do_debug_frames_interp)
6433 printf (" DW_CFA_remember_state\n");
6434 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
6435 rs->cfa_offset = fc->cfa_offset;
6436 rs->cfa_reg = fc->cfa_reg;
6437 rs->ra = fc->ra;
6438 rs->cfa_exp = fc->cfa_exp;
6439 rs->ncols = fc->ncols;
6440 rs->col_type = (short int *) xcmalloc (rs->ncols,
6441 sizeof (* rs->col_type));
6442 rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (* rs->col_offset));
6443 memcpy (rs->col_type, fc->col_type, rs->ncols * sizeof (* fc->col_type));
6444 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (* fc->col_offset));
6445 rs->next = remembered_state;
6446 remembered_state = rs;
6447 break;
6449 case DW_CFA_restore_state:
6450 if (! do_debug_frames_interp)
6451 printf (" DW_CFA_restore_state\n");
6452 rs = remembered_state;
6453 if (rs)
6455 remembered_state = rs->next;
6456 fc->cfa_offset = rs->cfa_offset;
6457 fc->cfa_reg = rs->cfa_reg;
6458 fc->ra = rs->ra;
6459 fc->cfa_exp = rs->cfa_exp;
6460 if (frame_need_space (fc, rs->ncols - 1) < 0)
6462 warn (_("Invalid column number in saved frame state\n"));
6463 fc->ncols = 0;
6464 break;
6466 memcpy (fc->col_type, rs->col_type, rs->ncols * sizeof (* rs->col_type));
6467 memcpy (fc->col_offset, rs->col_offset,
6468 rs->ncols * sizeof (* rs->col_offset));
6469 free (rs->col_type);
6470 free (rs->col_offset);
6471 free (rs);
6473 else if (do_debug_frames_interp)
6474 printf ("Mismatched DW_CFA_restore_state\n");
6475 break;
6477 case DW_CFA_def_cfa:
6478 fc->cfa_reg = LEB ();
6479 fc->cfa_offset = LEB ();
6480 fc->cfa_exp = 0;
6481 if (! do_debug_frames_interp)
6482 printf (" DW_CFA_def_cfa: %s ofs %d\n",
6483 regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
6484 break;
6486 case DW_CFA_def_cfa_register:
6487 fc->cfa_reg = LEB ();
6488 fc->cfa_exp = 0;
6489 if (! do_debug_frames_interp)
6490 printf (" DW_CFA_def_cfa_register: %s\n",
6491 regname (fc->cfa_reg, 0));
6492 break;
6494 case DW_CFA_def_cfa_offset:
6495 fc->cfa_offset = LEB ();
6496 if (! do_debug_frames_interp)
6497 printf (" DW_CFA_def_cfa_offset: %d\n", (int) fc->cfa_offset);
6498 break;
6500 case DW_CFA_nop:
6501 if (! do_debug_frames_interp)
6502 printf (" DW_CFA_nop\n");
6503 break;
6505 case DW_CFA_def_cfa_expression:
6506 ul = LEB ();
6507 if (start >= block_end || ul > (unsigned long) (block_end - start))
6509 printf (_(" DW_CFA_def_cfa_expression: <corrupt len %lu>\n"), ul);
6510 break;
6512 if (! do_debug_frames_interp)
6514 printf (" DW_CFA_def_cfa_expression (");
6515 decode_location_expression (start, eh_addr_size, 0, -1,
6516 ul, 0, section);
6517 printf (")\n");
6519 fc->cfa_exp = 1;
6520 start += ul;
6521 break;
6523 case DW_CFA_expression:
6524 reg = LEB ();
6525 ul = LEB ();
6526 if (reg >= (unsigned int) fc->ncols)
6527 reg_prefix = bad_reg;
6528 /* PR 17512: file: 069-133014-0.006. */
6529 /* PR 17512: file: 98c02eb4. */
6530 tmp = start + ul;
6531 if (start >= block_end || tmp > block_end || tmp < start)
6533 printf (_(" DW_CFA_expression: <corrupt len %lu>\n"), ul);
6534 break;
6536 if (! do_debug_frames_interp || *reg_prefix != '\0')
6538 printf (" DW_CFA_expression: %s%s (",
6539 reg_prefix, regname (reg, 0));
6540 decode_location_expression (start, eh_addr_size, 0, -1,
6541 ul, 0, section);
6542 printf (")\n");
6544 if (*reg_prefix == '\0')
6545 fc->col_type[reg] = DW_CFA_expression;
6546 start = tmp;
6547 break;
6549 case DW_CFA_val_expression:
6550 reg = LEB ();
6551 ul = LEB ();
6552 if (reg >= (unsigned int) fc->ncols)
6553 reg_prefix = bad_reg;
6554 tmp = start + ul;
6555 if (start >= block_end || tmp > block_end || tmp < start)
6557 printf (" DW_CFA_val_expression: <corrupt len %lu>\n", ul);
6558 break;
6560 if (! do_debug_frames_interp || *reg_prefix != '\0')
6562 printf (" DW_CFA_val_expression: %s%s (",
6563 reg_prefix, regname (reg, 0));
6564 decode_location_expression (start, eh_addr_size, 0, -1,
6565 ul, 0, section);
6566 printf (")\n");
6568 if (*reg_prefix == '\0')
6569 fc->col_type[reg] = DW_CFA_val_expression;
6570 start = tmp;
6571 break;
6573 case DW_CFA_offset_extended_sf:
6574 reg = LEB ();
6575 l = SLEB ();
6576 if (frame_need_space (fc, reg) < 0)
6577 reg_prefix = bad_reg;
6578 if (! do_debug_frames_interp || *reg_prefix != '\0')
6579 printf (" DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
6580 reg_prefix, regname (reg, 0),
6581 (long)(l * fc->data_factor));
6582 if (*reg_prefix == '\0')
6584 fc->col_type[reg] = DW_CFA_offset;
6585 fc->col_offset[reg] = l * fc->data_factor;
6587 break;
6589 case DW_CFA_val_offset_sf:
6590 reg = LEB ();
6591 l = SLEB ();
6592 if (frame_need_space (fc, reg) < 0)
6593 reg_prefix = bad_reg;
6594 if (! do_debug_frames_interp || *reg_prefix != '\0')
6595 printf (" DW_CFA_val_offset_sf: %s%s at cfa%+ld\n",
6596 reg_prefix, regname (reg, 0),
6597 (long)(l * fc->data_factor));
6598 if (*reg_prefix == '\0')
6600 fc->col_type[reg] = DW_CFA_val_offset;
6601 fc->col_offset[reg] = l * fc->data_factor;
6603 break;
6605 case DW_CFA_def_cfa_sf:
6606 fc->cfa_reg = LEB ();
6607 fc->cfa_offset = SLEB ();
6608 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
6609 fc->cfa_exp = 0;
6610 if (! do_debug_frames_interp)
6611 printf (" DW_CFA_def_cfa_sf: %s ofs %d\n",
6612 regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
6613 break;
6615 case DW_CFA_def_cfa_offset_sf:
6616 fc->cfa_offset = SLEB ();
6617 fc->cfa_offset *= fc->data_factor;
6618 if (! do_debug_frames_interp)
6619 printf (" DW_CFA_def_cfa_offset_sf: %d\n", (int) fc->cfa_offset);
6620 break;
6622 case DW_CFA_MIPS_advance_loc8:
6623 SAFE_BYTE_GET_AND_INC (ofs, start, 8, block_end);
6624 if (do_debug_frames_interp)
6625 frame_display_row (fc, &need_col_headers, &max_regs);
6626 else
6627 printf (" DW_CFA_MIPS_advance_loc8: %ld to %s\n",
6628 (unsigned long) (ofs * fc->code_factor),
6629 dwarf_vmatoa_1 (NULL,
6630 fc->pc_begin + ofs * fc->code_factor,
6631 fc->ptr_size));
6632 fc->pc_begin += ofs * fc->code_factor;
6633 break;
6635 case DW_CFA_GNU_window_save:
6636 if (! do_debug_frames_interp)
6637 printf (" DW_CFA_GNU_window_save\n");
6638 break;
6640 case DW_CFA_GNU_args_size:
6641 ul = LEB ();
6642 if (! do_debug_frames_interp)
6643 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
6644 break;
6646 case DW_CFA_GNU_negative_offset_extended:
6647 reg = LEB ();
6648 l = - LEB ();
6649 if (frame_need_space (fc, reg) < 0)
6650 reg_prefix = bad_reg;
6651 if (! do_debug_frames_interp || *reg_prefix != '\0')
6652 printf (" DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
6653 reg_prefix, regname (reg, 0),
6654 (long)(l * fc->data_factor));
6655 if (*reg_prefix == '\0')
6657 fc->col_type[reg] = DW_CFA_offset;
6658 fc->col_offset[reg] = l * fc->data_factor;
6660 break;
6662 default:
6663 if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
6664 printf (_(" DW_CFA_??? (User defined call frame op: %#x)\n"), op);
6665 else
6666 warn (_("Unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
6667 start = block_end;
6671 /* Interpret the CFA - as long as it is not completely full of NOPs. */
6672 if (do_debug_frames_interp && ! all_nops)
6673 frame_display_row (fc, &need_col_headers, &max_regs);
6675 start = block_end;
6676 eh_addr_size = saved_eh_addr_size;
6679 printf ("\n");
6681 return 1;
6684 #undef GET
6685 #undef LEB
6686 #undef SLEB
6688 static int
6689 display_gdb_index (struct dwarf_section *section,
6690 void *file ATTRIBUTE_UNUSED)
6692 unsigned char *start = section->start;
6693 uint32_t version;
6694 uint32_t cu_list_offset, tu_list_offset;
6695 uint32_t address_table_offset, symbol_table_offset, constant_pool_offset;
6696 unsigned int cu_list_elements, tu_list_elements;
6697 unsigned int address_table_size, symbol_table_slots;
6698 unsigned char *cu_list, *tu_list;
6699 unsigned char *address_table, *symbol_table, *constant_pool;
6700 unsigned int i;
6702 /* The documentation for the format of this file is in gdb/dwarf2read.c. */
6704 printf (_("Contents of the %s section:\n"), section->name);
6706 if (section->size < 6 * sizeof (uint32_t))
6708 warn (_("Truncated header in the %s section.\n"), section->name);
6709 return 0;
6712 version = byte_get_little_endian (start, 4);
6713 printf (_("Version %ld\n"), (long) version);
6715 /* Prior versions are obsolete, and future versions may not be
6716 backwards compatible. */
6717 if (version < 3 || version > 8)
6719 warn (_("Unsupported version %lu.\n"), (unsigned long) version);
6720 return 0;
6722 if (version < 4)
6723 warn (_("The address table data in version 3 may be wrong.\n"));
6724 if (version < 5)
6725 warn (_("Version 4 does not support case insensitive lookups.\n"));
6726 if (version < 6)
6727 warn (_("Version 5 does not include inlined functions.\n"));
6728 if (version < 7)
6729 warn (_("Version 6 does not include symbol attributes.\n"));
6730 /* Version 7 indices generated by Gold have bad type unit references,
6731 PR binutils/15021. But we don't know if the index was generated by
6732 Gold or not, so to avoid worrying users with gdb-generated indices
6733 we say nothing for version 7 here. */
6735 cu_list_offset = byte_get_little_endian (start + 4, 4);
6736 tu_list_offset = byte_get_little_endian (start + 8, 4);
6737 address_table_offset = byte_get_little_endian (start + 12, 4);
6738 symbol_table_offset = byte_get_little_endian (start + 16, 4);
6739 constant_pool_offset = byte_get_little_endian (start + 20, 4);
6741 if (cu_list_offset > section->size
6742 || tu_list_offset > section->size
6743 || address_table_offset > section->size
6744 || symbol_table_offset > section->size
6745 || constant_pool_offset > section->size)
6747 warn (_("Corrupt header in the %s section.\n"), section->name);
6748 return 0;
6751 /* PR 17531: file: 418d0a8a. */
6752 if (tu_list_offset < cu_list_offset)
6754 warn (_("TU offset (%x) is less than CU offset (%x)\n"),
6755 tu_list_offset, cu_list_offset);
6756 return 0;
6759 cu_list_elements = (tu_list_offset - cu_list_offset) / 8;
6761 if (address_table_offset < tu_list_offset)
6763 warn (_("Address table offset (%x) is less than TU offset (%x)\n"),
6764 address_table_offset, tu_list_offset);
6765 return 0;
6768 tu_list_elements = (address_table_offset - tu_list_offset) / 8;
6770 /* PR 17531: file: 18a47d3d. */
6771 if (symbol_table_offset < address_table_offset)
6773 warn (_("Symbol table offset (%xl) is less then Address table offset (%x)\n"),
6774 symbol_table_offset, address_table_offset);
6775 return 0;
6778 address_table_size = symbol_table_offset - address_table_offset;
6780 if (constant_pool_offset < symbol_table_offset)
6782 warn (_("Constant pool offset (%x) is less than symbol table offset (%x)\n"),
6783 constant_pool_offset, symbol_table_offset);
6784 return 0;
6787 symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8;
6789 cu_list = start + cu_list_offset;
6790 tu_list = start + tu_list_offset;
6791 address_table = start + address_table_offset;
6792 symbol_table = start + symbol_table_offset;
6793 constant_pool = start + constant_pool_offset;
6795 if (address_table + address_table_size * (2 + 8 + 4) > section->start + section->size)
6797 warn (_("Address table extends beyond end of section.\n"));
6798 return 0;
6801 printf (_("\nCU table:\n"));
6802 for (i = 0; i < cu_list_elements; i += 2)
6804 uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8);
6805 uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8);
6807 printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2,
6808 (unsigned long) cu_offset,
6809 (unsigned long) (cu_offset + cu_length - 1));
6812 printf (_("\nTU table:\n"));
6813 for (i = 0; i < tu_list_elements; i += 3)
6815 uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8);
6816 uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8);
6817 uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8);
6819 printf (_("[%3u] 0x%lx 0x%lx "), i / 3,
6820 (unsigned long) tu_offset,
6821 (unsigned long) type_offset);
6822 print_dwarf_vma (signature, 8);
6823 printf ("\n");
6826 printf (_("\nAddress table:\n"));
6827 for (i = 0; i < address_table_size && i <= address_table_size - (2 * 8 + 4);
6828 i += 2 * 8 + 4)
6830 uint64_t low = byte_get_little_endian (address_table + i, 8);
6831 uint64_t high = byte_get_little_endian (address_table + i + 8, 8);
6832 uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4);
6834 print_dwarf_vma (low, 8);
6835 print_dwarf_vma (high, 8);
6836 printf (_("%lu\n"), (unsigned long) cu_index);
6839 printf (_("\nSymbol table:\n"));
6840 for (i = 0; i < symbol_table_slots; ++i)
6842 uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4);
6843 uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4);
6844 uint32_t num_cus, cu;
6846 if (name_offset != 0
6847 || cu_vector_offset != 0)
6849 unsigned int j;
6850 unsigned char * adr;
6852 adr = constant_pool + name_offset;
6853 /* PR 17531: file: 5b7b07ad. */
6854 if (adr < constant_pool || adr >= section->start + section->size)
6856 printf (_("[%3u] <corrupt offset: %x>"), i, name_offset);
6857 warn (_("Corrupt name offset of 0x%x found for symbol table slot %d\n"),
6858 name_offset, i);
6860 else
6861 printf ("[%3u] %.*s:", i,
6862 (int) (section->size - (constant_pool_offset + name_offset)),
6863 constant_pool + name_offset);
6865 adr = constant_pool + cu_vector_offset;
6866 if (adr < constant_pool || adr >= section->start + section->size - 3)
6868 printf (_("<invalid CU vector offset: %x>\n"), cu_vector_offset);
6869 warn (_("Corrupt CU vector offset of 0x%x found for symbol table slot %d\n"),
6870 cu_vector_offset, i);
6871 continue;
6874 num_cus = byte_get_little_endian (adr, 4);
6876 adr = constant_pool + cu_vector_offset + 4 + num_cus * 4;
6877 if (num_cus * 4 < num_cus
6878 || adr >= section->start + section->size
6879 || adr < constant_pool)
6881 printf ("<invalid number of CUs: %d>\n", num_cus);
6882 warn (_("Invalid number of CUs (0x%x) for symbol table slot %d\n"),
6883 num_cus, i);
6884 continue;
6887 if (num_cus > 1)
6888 printf ("\n");
6890 for (j = 0; j < num_cus; ++j)
6892 int is_static;
6893 gdb_index_symbol_kind kind;
6895 cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4);
6896 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu);
6897 kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu);
6898 cu = GDB_INDEX_CU_VALUE (cu);
6899 /* Convert to TU number if it's for a type unit. */
6900 if (cu >= cu_list_elements / 2)
6901 printf ("%cT%lu", num_cus > 1 ? '\t' : ' ',
6902 (unsigned long) (cu - cu_list_elements / 2));
6903 else
6904 printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu);
6906 printf (" [%s, %s]",
6907 is_static ? _("static") : _("global"),
6908 get_gdb_index_symbol_kind_name (kind));
6909 if (num_cus > 1)
6910 printf ("\n");
6912 if (num_cus <= 1)
6913 printf ("\n");
6917 return 1;
6920 /* Pre-allocate enough space for the CU/TU sets needed. */
6922 static void
6923 prealloc_cu_tu_list (unsigned int nshndx)
6925 if (shndx_pool == NULL)
6927 shndx_pool_size = nshndx;
6928 shndx_pool_used = 0;
6929 shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size,
6930 sizeof (unsigned int));
6932 else
6934 shndx_pool_size = shndx_pool_used + nshndx;
6935 shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size,
6936 sizeof (unsigned int));
6940 static void
6941 add_shndx_to_cu_tu_entry (unsigned int shndx)
6943 if (shndx_pool_used >= shndx_pool_size)
6945 error (_("Internal error: out of space in the shndx pool.\n"));
6946 return;
6948 shndx_pool [shndx_pool_used++] = shndx;
6951 static void
6952 end_cu_tu_entry (void)
6954 if (shndx_pool_used >= shndx_pool_size)
6956 error (_("Internal error: out of space in the shndx pool.\n"));
6957 return;
6959 shndx_pool [shndx_pool_used++] = 0;
6962 /* Return the short name of a DWARF section given by a DW_SECT enumerator. */
6964 static const char *
6965 get_DW_SECT_short_name (unsigned int dw_sect)
6967 static char buf[16];
6969 switch (dw_sect)
6971 case DW_SECT_INFO:
6972 return "info";
6973 case DW_SECT_TYPES:
6974 return "types";
6975 case DW_SECT_ABBREV:
6976 return "abbrev";
6977 case DW_SECT_LINE:
6978 return "line";
6979 case DW_SECT_LOC:
6980 return "loc";
6981 case DW_SECT_STR_OFFSETS:
6982 return "str_off";
6983 case DW_SECT_MACINFO:
6984 return "macinfo";
6985 case DW_SECT_MACRO:
6986 return "macro";
6987 default:
6988 break;
6991 snprintf (buf, sizeof (buf), "%d", dw_sect);
6992 return buf;
6995 /* Process a CU or TU index. If DO_DISPLAY is true, print the contents.
6996 These sections are extensions for Fission.
6997 See http://gcc.gnu.org/wiki/DebugFissionDWP. */
6999 static int
7000 process_cu_tu_index (struct dwarf_section *section, int do_display)
7002 unsigned char *phdr = section->start;
7003 unsigned char *limit = phdr + section->size;
7004 unsigned char *phash;
7005 unsigned char *pindex;
7006 unsigned char *ppool;
7007 unsigned int version;
7008 unsigned int ncols = 0;
7009 unsigned int nused;
7010 unsigned int nslots;
7011 unsigned int i;
7012 unsigned int j;
7013 dwarf_vma signature_high;
7014 dwarf_vma signature_low;
7015 char buf[64];
7017 /* PR 17512: file: 002-168123-0.004. */
7018 if (phdr == NULL)
7020 warn (_("Section %s is empty\n"), section->name);
7021 return 0;
7023 /* PR 17512: file: 002-376-0.004. */
7024 if (section->size < 24)
7026 warn (_("Section %s is too small to contain a CU/TU header\n"),
7027 section->name);
7028 return 0;
7031 SAFE_BYTE_GET (version, phdr, 4, limit);
7032 if (version >= 2)
7033 SAFE_BYTE_GET (ncols, phdr + 4, 4, limit);
7034 SAFE_BYTE_GET (nused, phdr + 8, 4, limit);
7035 SAFE_BYTE_GET (nslots, phdr + 12, 4, limit);
7037 phash = phdr + 16;
7038 pindex = phash + nslots * 8;
7039 ppool = pindex + nslots * 4;
7041 /* PR 17531: file: 45d69832. */
7042 if (pindex < phash || ppool < phdr || (pindex == phash && nslots != 0))
7044 warn (_("Section %s is too small for %d slots\n"),
7045 section->name, nslots);
7046 return 0;
7049 if (do_display)
7051 printf (_("Contents of the %s section:\n\n"), section->name);
7052 printf (_(" Version: %d\n"), version);
7053 if (version >= 2)
7054 printf (_(" Number of columns: %d\n"), ncols);
7055 printf (_(" Number of used entries: %d\n"), nused);
7056 printf (_(" Number of slots: %d\n\n"), nslots);
7059 if (ppool > limit || ppool < phdr)
7061 warn (_("Section %s too small for %d hash table entries\n"),
7062 section->name, nslots);
7063 return 0;
7066 if (version == 1)
7068 if (!do_display)
7069 prealloc_cu_tu_list ((limit - ppool) / 4);
7070 for (i = 0; i < nslots; i++)
7072 unsigned char *shndx_list;
7073 unsigned int shndx;
7075 SAFE_BYTE_GET64 (phash, &signature_high, &signature_low, limit);
7076 if (signature_high != 0 || signature_low != 0)
7078 SAFE_BYTE_GET (j, pindex, 4, limit);
7079 shndx_list = ppool + j * 4;
7080 /* PR 17531: file: 705e010d. */
7081 if (shndx_list < ppool)
7083 warn (_("Section index pool located before start of section\n"));
7084 return 0;
7087 if (do_display)
7088 printf (_(" [%3d] Signature: 0x%s Sections: "),
7089 i, dwarf_vmatoa64 (signature_high, signature_low,
7090 buf, sizeof (buf)));
7091 for (;;)
7093 if (shndx_list >= limit)
7095 warn (_("Section %s too small for shndx pool\n"),
7096 section->name);
7097 return 0;
7099 SAFE_BYTE_GET (shndx, shndx_list, 4, limit);
7100 if (shndx == 0)
7101 break;
7102 if (do_display)
7103 printf (" %d", shndx);
7104 else
7105 add_shndx_to_cu_tu_entry (shndx);
7106 shndx_list += 4;
7108 if (do_display)
7109 printf ("\n");
7110 else
7111 end_cu_tu_entry ();
7113 phash += 8;
7114 pindex += 4;
7117 else if (version == 2)
7119 unsigned int val;
7120 unsigned int dw_sect;
7121 unsigned char *ph = phash;
7122 unsigned char *pi = pindex;
7123 unsigned char *poffsets = ppool + ncols * 4;
7124 unsigned char *psizes = poffsets + nused * ncols * 4;
7125 unsigned char *pend = psizes + nused * ncols * 4;
7126 bfd_boolean is_tu_index;
7127 struct cu_tu_set *this_set = NULL;
7128 unsigned int row;
7129 unsigned char *prow;
7131 is_tu_index = strcmp (section->name, ".debug_tu_index") == 0;
7133 /* PR 17531: file: 0dd159bf.
7134 Check for wraparound with an overlarge ncols value. */
7135 if (poffsets < ppool || (unsigned int) ((poffsets - ppool) / 4) != ncols)
7137 warn (_("Overlarge number of columns: %x\n"), ncols);
7138 return 0;
7141 if (pend > limit)
7143 warn (_("Section %s too small for offset and size tables\n"),
7144 section->name);
7145 return 0;
7148 if (do_display)
7150 printf (_(" Offset table\n"));
7151 printf (" slot %-16s ",
7152 is_tu_index ? _("signature") : _("dwo_id"));
7154 else
7156 if (is_tu_index)
7158 tu_count = nused;
7159 tu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
7160 this_set = tu_sets;
7162 else
7164 cu_count = nused;
7165 cu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
7166 this_set = cu_sets;
7170 if (do_display)
7172 for (j = 0; j < ncols; j++)
7174 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
7175 printf (" %8s", get_DW_SECT_short_name (dw_sect));
7177 printf ("\n");
7180 for (i = 0; i < nslots; i++)
7182 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
7184 SAFE_BYTE_GET (row, pi, 4, limit);
7185 if (row != 0)
7187 /* PR 17531: file: a05f6ab3. */
7188 if (row > nused)
7190 warn (_("Row index (%u) is larger than number of used entries (%u)\n"),
7191 row, nused);
7192 return 0;
7195 if (!do_display)
7196 memcpy (&this_set[row - 1].signature, ph, sizeof (uint64_t));
7198 prow = poffsets + (row - 1) * ncols * 4;
7199 /* PR 17531: file: b8ce60a8. */
7200 if (prow < poffsets || prow > limit)
7202 warn (_("Row index (%u) * num columns (%u) > space remaining in section\n"),
7203 row, ncols);
7204 return 0;
7207 if (do_display)
7208 printf (_(" [%3d] 0x%s"),
7209 i, dwarf_vmatoa64 (signature_high, signature_low,
7210 buf, sizeof (buf)));
7211 for (j = 0; j < ncols; j++)
7213 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
7214 if (do_display)
7215 printf (" %8d", val);
7216 else
7218 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
7220 /* PR 17531: file: 10796eb3. */
7221 if (dw_sect >= DW_SECT_MAX)
7222 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
7223 else
7224 this_set [row - 1].section_offsets [dw_sect] = val;
7228 if (do_display)
7229 printf ("\n");
7231 ph += 8;
7232 pi += 4;
7235 ph = phash;
7236 pi = pindex;
7237 if (do_display)
7239 printf ("\n");
7240 printf (_(" Size table\n"));
7241 printf (" slot %-16s ",
7242 is_tu_index ? _("signature") : _("dwo_id"));
7245 for (j = 0; j < ncols; j++)
7247 SAFE_BYTE_GET (val, ppool + j * 4, 4, limit);
7248 if (do_display)
7249 printf (" %8s", get_DW_SECT_short_name (val));
7252 if (do_display)
7253 printf ("\n");
7255 for (i = 0; i < nslots; i++)
7257 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
7259 SAFE_BYTE_GET (row, pi, 4, limit);
7260 if (row != 0)
7262 prow = psizes + (row - 1) * ncols * 4;
7264 if (do_display)
7265 printf (_(" [%3d] 0x%s"),
7266 i, dwarf_vmatoa64 (signature_high, signature_low,
7267 buf, sizeof (buf)));
7269 for (j = 0; j < ncols; j++)
7271 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
7272 if (do_display)
7273 printf (" %8d", val);
7274 else
7276 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
7277 if (dw_sect >= DW_SECT_MAX)
7278 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
7279 else
7280 this_set [row - 1].section_sizes [dw_sect] = val;
7284 if (do_display)
7285 printf ("\n");
7288 ph += 8;
7289 pi += 4;
7292 else if (do_display)
7293 printf (_(" Unsupported version (%d)\n"), version);
7295 if (do_display)
7296 printf ("\n");
7298 return 1;
7301 /* Load the CU and TU indexes if present. This will build a list of
7302 section sets that we can use to associate a .debug_info.dwo section
7303 with its associated .debug_abbrev.dwo section in a .dwp file. */
7305 static void
7306 load_cu_tu_indexes (void *file)
7308 /* If we have already loaded (or tried to load) the CU and TU indexes
7309 then do not bother to repeat the task. */
7310 if (cu_tu_indexes_read)
7311 return;
7313 if (load_debug_section (dwp_cu_index, file))
7314 process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0);
7316 if (load_debug_section (dwp_tu_index, file))
7317 process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0);
7319 cu_tu_indexes_read = 1;
7322 /* Find the set of sections that includes section SHNDX. */
7324 unsigned int *
7325 find_cu_tu_set (void *file, unsigned int shndx)
7327 unsigned int i;
7329 load_cu_tu_indexes (file);
7331 /* Find SHNDX in the shndx pool. */
7332 for (i = 0; i < shndx_pool_used; i++)
7333 if (shndx_pool [i] == shndx)
7334 break;
7336 if (i >= shndx_pool_used)
7337 return NULL;
7339 /* Now backup to find the first entry in the set. */
7340 while (i > 0 && shndx_pool [i - 1] != 0)
7341 i--;
7343 return shndx_pool + i;
7346 /* Display a .debug_cu_index or .debug_tu_index section. */
7348 static int
7349 display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
7351 return process_cu_tu_index (section, 1);
7354 static int
7355 display_debug_not_supported (struct dwarf_section *section,
7356 void *file ATTRIBUTE_UNUSED)
7358 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
7359 section->name);
7361 return 1;
7364 /* Like malloc, but takes two parameters like calloc.
7365 Verifies that the first parameter is not too large.
7366 Note: does *not* initialise the allocated memory to zero. */
7367 void *
7368 cmalloc (size_t nmemb, size_t size)
7370 /* Check for overflow. */
7371 if (nmemb >= ~(size_t) 0 / size)
7372 return NULL;
7374 return xmalloc (nmemb * size);
7377 /* Like xmalloc, but takes two parameters like calloc.
7378 Verifies that the first parameter is not too large.
7379 Note: does *not* initialise the allocated memory to zero. */
7380 void *
7381 xcmalloc (size_t nmemb, size_t size)
7383 /* Check for overflow. */
7384 if (nmemb >= ~(size_t) 0 / size)
7386 fprintf (stderr,
7387 _("Attempt to allocate an array with an excessive number of elements: 0x%lx\n"),
7388 (long) nmemb);
7389 xexit (1);
7392 return xmalloc (nmemb * size);
7395 /* Like xrealloc, but takes three parameters.
7396 Verifies that the second parameter is not too large.
7397 Note: does *not* initialise any new memory to zero. */
7398 void *
7399 xcrealloc (void *ptr, size_t nmemb, size_t size)
7401 /* Check for overflow. */
7402 if (nmemb >= ~(size_t) 0 / size)
7404 fprintf (stderr,
7405 _("Attempt to re-allocate an array with an excessive number of elements: 0x%lx\n"),
7406 (long) nmemb);
7407 xexit (1);
7410 return xrealloc (ptr, nmemb * size);
7413 /* Like xcalloc, but verifies that the first parameter is not too large. */
7414 void *
7415 xcalloc2 (size_t nmemb, size_t size)
7417 /* Check for overflow. */
7418 if (nmemb >= ~(size_t) 0 / size)
7420 fprintf (stderr,
7421 _("Attempt to allocate a zero'ed array with an excessive number of elements: 0x%lx\n"),
7422 (long) nmemb);
7423 xexit (1);
7426 return xcalloc (nmemb, size);
7429 void
7430 free_debug_memory (void)
7432 unsigned int i;
7434 free_abbrevs ();
7436 for (i = 0; i < max; i++)
7437 free_debug_section ((enum dwarf_section_display_enum) i);
7439 if (debug_information != NULL)
7441 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
7443 for (i = 0; i < num_debug_info_entries; i++)
7445 if (!debug_information [i].max_loc_offsets)
7447 free (debug_information [i].loc_offsets);
7448 free (debug_information [i].have_frame_base);
7450 if (!debug_information [i].max_range_lists)
7451 free (debug_information [i].range_lists);
7454 free (debug_information);
7455 debug_information = NULL;
7456 alloc_num_debug_info_entries = num_debug_info_entries = 0;
7460 void
7461 dwarf_select_sections_by_names (const char *names)
7463 typedef struct
7465 const char * option;
7466 int * variable;
7467 int val;
7469 debug_dump_long_opts;
7471 static const debug_dump_long_opts opts_table [] =
7473 /* Please keep this table alpha- sorted. */
7474 { "Ranges", & do_debug_ranges, 1 },
7475 { "abbrev", & do_debug_abbrevs, 1 },
7476 { "addr", & do_debug_addr, 1 },
7477 { "aranges", & do_debug_aranges, 1 },
7478 { "cu_index", & do_debug_cu_index, 1 },
7479 { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
7480 { "frames", & do_debug_frames, 1 },
7481 { "frames-interp", & do_debug_frames_interp, 1 },
7482 /* The special .gdb_index section. */
7483 { "gdb_index", & do_gdb_index, 1 },
7484 { "info", & do_debug_info, 1 },
7485 { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility. */
7486 { "loc", & do_debug_loc, 1 },
7487 { "macro", & do_debug_macinfo, 1 },
7488 { "pubnames", & do_debug_pubnames, 1 },
7489 { "pubtypes", & do_debug_pubtypes, 1 },
7490 /* This entry is for compatability
7491 with earlier versions of readelf. */
7492 { "ranges", & do_debug_aranges, 1 },
7493 { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
7494 { "str", & do_debug_str, 1 },
7495 /* These trace_* sections are used by Itanium VMS. */
7496 { "trace_abbrev", & do_trace_abbrevs, 1 },
7497 { "trace_aranges", & do_trace_aranges, 1 },
7498 { "trace_info", & do_trace_info, 1 },
7499 { NULL, NULL, 0 }
7502 const char *p;
7504 p = names;
7505 while (*p)
7507 const debug_dump_long_opts * entry;
7509 for (entry = opts_table; entry->option; entry++)
7511 size_t len = strlen (entry->option);
7513 if (strncmp (p, entry->option, len) == 0
7514 && (p[len] == ',' || p[len] == '\0'))
7516 * entry->variable |= entry->val;
7518 /* The --debug-dump=frames-interp option also
7519 enables the --debug-dump=frames option. */
7520 if (do_debug_frames_interp)
7521 do_debug_frames = 1;
7523 p += len;
7524 break;
7528 if (entry->option == NULL)
7530 warn (_("Unrecognized debug option '%s'\n"), p);
7531 p = strchr (p, ',');
7532 if (p == NULL)
7533 break;
7536 if (*p == ',')
7537 p++;
7541 void
7542 dwarf_select_sections_by_letters (const char *letters)
7544 unsigned int lindex = 0;
7546 while (letters[lindex])
7547 switch (letters[lindex++])
7549 case 'i':
7550 do_debug_info = 1;
7551 break;
7553 case 'a':
7554 do_debug_abbrevs = 1;
7555 break;
7557 case 'l':
7558 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
7559 break;
7561 case 'L':
7562 do_debug_lines |= FLAG_DEBUG_LINES_DECODED;
7563 break;
7565 case 'p':
7566 do_debug_pubnames = 1;
7567 break;
7569 case 't':
7570 do_debug_pubtypes = 1;
7571 break;
7573 case 'r':
7574 do_debug_aranges = 1;
7575 break;
7577 case 'R':
7578 do_debug_ranges = 1;
7579 break;
7581 case 'F':
7582 do_debug_frames_interp = 1;
7583 case 'f':
7584 do_debug_frames = 1;
7585 break;
7587 case 'm':
7588 do_debug_macinfo = 1;
7589 break;
7591 case 's':
7592 do_debug_str = 1;
7593 break;
7595 case 'o':
7596 do_debug_loc = 1;
7597 break;
7599 default:
7600 warn (_("Unrecognized debug option '%s'\n"), letters);
7601 break;
7605 void
7606 dwarf_select_sections_all (void)
7608 do_debug_info = 1;
7609 do_debug_abbrevs = 1;
7610 do_debug_lines = FLAG_DEBUG_LINES_RAW;
7611 do_debug_pubnames = 1;
7612 do_debug_pubtypes = 1;
7613 do_debug_aranges = 1;
7614 do_debug_ranges = 1;
7615 do_debug_frames = 1;
7616 do_debug_macinfo = 1;
7617 do_debug_str = 1;
7618 do_debug_loc = 1;
7619 do_gdb_index = 1;
7620 do_trace_info = 1;
7621 do_trace_abbrevs = 1;
7622 do_trace_aranges = 1;
7623 do_debug_addr = 1;
7624 do_debug_cu_index = 1;
7627 struct dwarf_section_display debug_displays[] =
7629 { { ".debug_abbrev", ".zdebug_abbrev", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7630 display_debug_abbrev, &do_debug_abbrevs, FALSE },
7631 { { ".debug_aranges", ".zdebug_aranges", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7632 display_debug_aranges, &do_debug_aranges, TRUE },
7633 { { ".debug_frame", ".zdebug_frame", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7634 display_debug_frames, &do_debug_frames, TRUE },
7635 { { ".debug_info", ".zdebug_info", NULL, NULL, 0, 0, abbrev, NULL, 0, NULL },
7636 display_debug_info, &do_debug_info, TRUE },
7637 { { ".debug_line", ".zdebug_line", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7638 display_debug_lines, &do_debug_lines, TRUE },
7639 { { ".debug_pubnames", ".zdebug_pubnames", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7640 display_debug_pubnames, &do_debug_pubnames, FALSE },
7641 { { ".debug_gnu_pubnames", ".zdebug_gnu_pubnames", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7642 display_debug_gnu_pubnames, &do_debug_pubnames, FALSE },
7643 { { ".eh_frame", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7644 display_debug_frames, &do_debug_frames, TRUE },
7645 { { ".debug_macinfo", ".zdebug_macinfo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7646 display_debug_macinfo, &do_debug_macinfo, FALSE },
7647 { { ".debug_macro", ".zdebug_macro", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7648 display_debug_macro, &do_debug_macinfo, TRUE },
7649 { { ".debug_str", ".zdebug_str", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7650 display_debug_str, &do_debug_str, FALSE },
7651 { { ".debug_loc", ".zdebug_loc", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7652 display_debug_loc, &do_debug_loc, TRUE },
7653 { { ".debug_pubtypes", ".zdebug_pubtypes", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7654 display_debug_pubnames, &do_debug_pubtypes, FALSE },
7655 { { ".debug_gnu_pubtypes", ".zdebug_gnu_pubtypes", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7656 display_debug_gnu_pubnames, &do_debug_pubtypes, FALSE },
7657 { { ".debug_ranges", ".zdebug_ranges", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7658 display_debug_ranges, &do_debug_ranges, TRUE },
7659 { { ".debug_static_func", ".zdebug_static_func", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7660 display_debug_not_supported, NULL, FALSE },
7661 { { ".debug_static_vars", ".zdebug_static_vars", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7662 display_debug_not_supported, NULL, FALSE },
7663 { { ".debug_types", ".zdebug_types", NULL, NULL, 0, 0, abbrev, NULL, 0, NULL },
7664 display_debug_types, &do_debug_info, TRUE },
7665 { { ".debug_weaknames", ".zdebug_weaknames", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7666 display_debug_not_supported, NULL, FALSE },
7667 { { ".gdb_index", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7668 display_gdb_index, &do_gdb_index, FALSE },
7669 { { ".trace_info", "", NULL, NULL, 0, 0, trace_abbrev, NULL, 0, NULL },
7670 display_trace_info, &do_trace_info, TRUE },
7671 { { ".trace_abbrev", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7672 display_debug_abbrev, &do_trace_abbrevs, FALSE },
7673 { { ".trace_aranges", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7674 display_debug_aranges, &do_trace_aranges, FALSE },
7675 { { ".debug_info.dwo", ".zdebug_info.dwo", NULL, NULL, 0, 0, abbrev_dwo, NULL, 0, NULL },
7676 display_debug_info, &do_debug_info, TRUE },
7677 { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7678 display_debug_abbrev, &do_debug_abbrevs, FALSE },
7679 { { ".debug_types.dwo", ".zdebug_types.dwo", NULL, NULL, 0, 0, abbrev_dwo, NULL, 0, NULL },
7680 display_debug_types, &do_debug_info, TRUE },
7681 { { ".debug_line.dwo", ".zdebug_line.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7682 display_debug_lines, &do_debug_lines, TRUE },
7683 { { ".debug_loc.dwo", ".zdebug_loc.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7684 display_debug_loc, &do_debug_loc, TRUE },
7685 { { ".debug_macro.dwo", ".zdebug_macro.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7686 display_debug_macro, &do_debug_macinfo, TRUE },
7687 { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7688 display_debug_macinfo, &do_debug_macinfo, FALSE },
7689 { { ".debug_str.dwo", ".zdebug_str.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7690 display_debug_str, &do_debug_str, TRUE },
7691 { { ".debug_str_offsets", ".zdebug_str_offsets", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7692 display_debug_str_offsets, NULL, FALSE },
7693 { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7694 display_debug_str_offsets, NULL, FALSE },
7695 { { ".debug_addr", ".zdebug_addr", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7696 display_debug_addr, &do_debug_addr, TRUE },
7697 { { ".debug_cu_index", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7698 display_cu_index, &do_debug_cu_index, FALSE },
7699 { { ".debug_tu_index", "", NULL, NULL, 0, 0, 0, NULL, 0, NULL },
7700 display_cu_index, &do_debug_cu_index, FALSE },