]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/dwarf.c
Rename EM_486 to EM_IAMCU
[thirdparty/binutils-gdb.git] / binutils / dwarf.c
1 /* dwarf.c -- display DWARF contents of a BFD binary file
2 Copyright (C) 2005-2015 Free Software Foundation, Inc.
3
4 This file is part of GNU Binutils.
5
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.
10
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.
15
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. */
20
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"
31
32 static const char *regname (unsigned int regno, int row);
33
34 static int have_frame_base;
35 static int need_base_address;
36
37 static unsigned int last_pointer_size = 0;
38 static int warned_about_missing_comp_units = FALSE;
39
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
46
47 unsigned int eh_addr_size;
48
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;
68
69 int dwarf_cutoff_level = -1;
70 unsigned long dwarf_start_die;
71
72 int dwarf_check = 0;
73
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. */
78
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;
83
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. */
89
90 struct cu_tu_set
91 {
92 uint64_t signature;
93 dwarf_vma section_offsets[DW_SECT_MAX];
94 size_t section_sizes[DW_SECT_MAX];
95 };
96
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;
101
102 static void load_cu_tu_indexes (void *file);
103
104 /* Values for do_debug_lines. */
105 #define FLAG_DEBUG_LINES_RAW 1
106 #define FLAG_DEBUG_LINES_DECODED 2
107
108 static unsigned int
109 size_of_encoded_value (int encoding)
110 {
111 switch (encoding & 0x7)
112 {
113 default: /* ??? */
114 case 0: return eh_addr_size;
115 case 2: return 2;
116 case 3: return 4;
117 case 4: return 8;
118 }
119 }
120
121 static dwarf_vma
122 get_encoded_value (unsigned char **pdata,
123 int encoding,
124 struct dwarf_section *section,
125 unsigned char * end)
126 {
127 unsigned char * data = * pdata;
128 unsigned int size = size_of_encoded_value (encoding);
129 dwarf_vma val;
130
131 if (data + size >= end)
132 {
133 warn (_("Encoded value extends past end of section\n"));
134 * pdata = end;
135 return 0;
136 }
137
138 /* PR 17512: file: 002-829853-0.004. */
139 if (size > 8)
140 {
141 warn (_("Encoded size of %d is too large to read\n"), size);
142 * pdata = end;
143 return 0;
144 }
145
146 /* PR 17512: file: 1085-5603-0.004. */
147 if (size == 0)
148 {
149 warn (_("Encoded size of 0 is too small to read\n"));
150 * pdata = end;
151 return 0;
152 }
153
154 if (encoding & DW_EH_PE_signed)
155 val = byte_get_signed (data, size);
156 else
157 val = byte_get (data, size);
158
159 if ((encoding & 0x70) == DW_EH_PE_pcrel)
160 val += section->address + (data - section->start);
161
162 * pdata = data + size;
163 return val;
164 }
165
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
178
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. */
184
185 static const char *
186 dwarf_vmatoa_1 (const char *fmtch, dwarf_vma value, unsigned num_bytes)
187 {
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
193 {
194 char place[64];
195 } buf[16];
196 char *ret;
197
198 ret = buf[buf_pos++].place;
199 buf_pos %= ARRAY_SIZE (buf);
200
201 if (num_bytes)
202 {
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);
210 }
211 else
212 {
213 char fmt[32];
214
215 sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch);
216 snprintf (ret, sizeof (buf[0].place), fmt, value);
217 return ret;
218 }
219 }
220
221 static inline const char *
222 dwarf_vmatoa (const char * fmtch, dwarf_vma value)
223 {
224 return dwarf_vmatoa_1 (fmtch, value, 0);
225 }
226
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. */
230
231 static void
232 print_dwarf_vma (dwarf_vma value, unsigned num_bytes)
233 {
234 printf ("%s ", dwarf_vmatoa_1 (NULL, value, num_bytes));
235 }
236
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. */
239
240 static const char *
241 dwarf_vmatoa64 (dwarf_vma hvalue, dwarf_vma lvalue, char *buf,
242 unsigned int buf_len)
243 {
244 int len = 0;
245
246 if (hvalue == 0)
247 snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", lvalue);
248 else
249 {
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);
253 }
254
255 return buf;
256 }
257
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. */
262
263 dwarf_vma
264 read_leb128 (unsigned char *data,
265 unsigned int *length_return,
266 bfd_boolean sign,
267 const unsigned char * const end)
268 {
269 dwarf_vma result = 0;
270 unsigned int num_read = 0;
271 unsigned int shift = 0;
272 unsigned char byte = 0;
273
274 while (data < end)
275 {
276 byte = *data++;
277 num_read++;
278
279 result |= ((dwarf_vma) (byte & 0x7f)) << shift;
280
281 shift += 7;
282 if ((byte & 0x80) == 0)
283 break;
284
285 /* PR 17512: file: 0ca183b8.
286 FIXME: Should we signal this error somehow ? */
287 if (shift >= sizeof (result) * 8)
288 break;
289 }
290
291 if (length_return != NULL)
292 *length_return = num_read;
293
294 if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
295 result |= (dwarf_vma) -1 << shift;
296
297 return result;
298 }
299
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)
305 {
306 return (dwarf_signed_vma) read_leb128 (data, length_return, TRUE, end);
307 }
308
309 static inline dwarf_vma
310 read_uleb128 (unsigned char * data,
311 unsigned int * length_return,
312 const unsigned char * const end)
313 {
314 return read_leb128 (data, length_return, FALSE, end);
315 }
316
317 #define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END) \
318 do \
319 { \
320 int dummy [sizeof (VAL) < (AMOUNT) ? -1 : 1] ATTRIBUTE_UNUSED ; \
321 unsigned int amount = (AMOUNT); \
322 if (((PTR) + amount) >= (END)) \
323 { \
324 if ((PTR) < (END)) \
325 amount = (END) - (PTR); \
326 else \
327 amount = 0; \
328 } \
329 if (amount == 0 || amount > 8) \
330 VAL = 0; \
331 else \
332 VAL = byte_get ((PTR), amount); \
333 } \
334 while (0)
335
336 #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
337 do \
338 { \
339 SAFE_BYTE_GET (VAL, PTR, AMOUNT, END); \
340 PTR += AMOUNT; \
341 } \
342 while (0)
343
344 #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END) \
345 do \
346 { \
347 unsigned int amount = (AMOUNT); \
348 if (((PTR) + amount) >= (END)) \
349 { \
350 if ((PTR) < (END)) \
351 amount = (END) - (PTR); \
352 else \
353 amount = 0; \
354 } \
355 if (amount) \
356 VAL = byte_get_signed ((PTR), amount); \
357 else \
358 VAL = 0; \
359 } \
360 while (0)
361
362 #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
363 do \
364 { \
365 SAFE_SIGNED_BYTE_GET (VAL, PTR, AMOUNT, END); \
366 PTR += AMOUNT; \
367 } \
368 while (0)
369
370 #define SAFE_BYTE_GET64(PTR, HIGH, LOW, END) \
371 do \
372 { \
373 if (((PTR) + 8) <= (END)) \
374 { \
375 byte_get_64 ((PTR), (HIGH), (LOW)); \
376 } \
377 else \
378 { \
379 * (LOW) = * (HIGH) = 0; \
380 } \
381 } \
382 while (0)
383
384 typedef struct State_Machine_Registers
385 {
386 dwarf_vma address;
387 unsigned int file;
388 unsigned int line;
389 unsigned int column;
390 int is_stmt;
391 int basic_block;
392 unsigned char op_index;
393 unsigned char end_sequence;
394 /* This variable hold the number of the last entry seen
395 in the File Table. */
396 unsigned int last_file_entry;
397 } SMR;
398
399 static SMR state_machine_regs;
400
401 static void
402 reset_state_machine (int is_stmt)
403 {
404 state_machine_regs.address = 0;
405 state_machine_regs.op_index = 0;
406 state_machine_regs.file = 1;
407 state_machine_regs.line = 1;
408 state_machine_regs.column = 0;
409 state_machine_regs.is_stmt = is_stmt;
410 state_machine_regs.basic_block = 0;
411 state_machine_regs.end_sequence = 0;
412 state_machine_regs.last_file_entry = 0;
413 }
414
415 /* Handled an extend line op.
416 Returns the number of bytes read. */
417
418 static int
419 process_extended_line_op (unsigned char * data,
420 int is_stmt,
421 unsigned char * end)
422 {
423 unsigned char op_code;
424 unsigned int bytes_read;
425 unsigned int len;
426 unsigned char *name;
427 unsigned char *orig_data = data;
428 dwarf_vma adr;
429
430 len = read_uleb128 (data, & bytes_read, end);
431 data += bytes_read;
432
433 if (len == 0 || data == end || len > (uintptr_t) (end - data))
434 {
435 warn (_("Badly formed extended line op encountered!\n"));
436 return bytes_read;
437 }
438
439 len += bytes_read;
440 op_code = *data++;
441
442 printf (_(" Extended opcode %d: "), op_code);
443
444 switch (op_code)
445 {
446 case DW_LNE_end_sequence:
447 printf (_("End of Sequence\n\n"));
448 reset_state_machine (is_stmt);
449 break;
450
451 case DW_LNE_set_address:
452 /* PR 17512: file: 002-100480-0.004. */
453 if (len - bytes_read - 1 > 8)
454 {
455 warn (_("Length (%d) of DW_LNE_set_address op is too long\n"),
456 len - bytes_read - 1);
457 adr = 0;
458 }
459 else
460 SAFE_BYTE_GET (adr, data, len - bytes_read - 1, end);
461 printf (_("set Address to 0x%s\n"), dwarf_vmatoa ("x", adr));
462 state_machine_regs.address = adr;
463 state_machine_regs.op_index = 0;
464 break;
465
466 case DW_LNE_define_file:
467 printf (_("define new File Table entry\n"));
468 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
469 printf (" %d\t", ++state_machine_regs.last_file_entry);
470
471 name = data;
472 data += strnlen ((char *) data, end - data) + 1;
473 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
474 data += bytes_read;
475 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
476 data += bytes_read;
477 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
478 data += bytes_read;
479 printf ("%s\n\n", name);
480
481 if (((unsigned int) (data - orig_data) != len) || data == end)
482 warn (_("DW_LNE_define_file: Bad opcode length\n"));
483 break;
484
485 case DW_LNE_set_discriminator:
486 printf (_("set Discriminator to %s\n"),
487 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
488 break;
489
490 /* HP extensions. */
491 case DW_LNE_HP_negate_is_UV_update:
492 printf ("DW_LNE_HP_negate_is_UV_update\n");
493 break;
494 case DW_LNE_HP_push_context:
495 printf ("DW_LNE_HP_push_context\n");
496 break;
497 case DW_LNE_HP_pop_context:
498 printf ("DW_LNE_HP_pop_context\n");
499 break;
500 case DW_LNE_HP_set_file_line_column:
501 printf ("DW_LNE_HP_set_file_line_column\n");
502 break;
503 case DW_LNE_HP_set_routine_name:
504 printf ("DW_LNE_HP_set_routine_name\n");
505 break;
506 case DW_LNE_HP_set_sequence:
507 printf ("DW_LNE_HP_set_sequence\n");
508 break;
509 case DW_LNE_HP_negate_post_semantics:
510 printf ("DW_LNE_HP_negate_post_semantics\n");
511 break;
512 case DW_LNE_HP_negate_function_exit:
513 printf ("DW_LNE_HP_negate_function_exit\n");
514 break;
515 case DW_LNE_HP_negate_front_end_logical:
516 printf ("DW_LNE_HP_negate_front_end_logical\n");
517 break;
518 case DW_LNE_HP_define_proc:
519 printf ("DW_LNE_HP_define_proc\n");
520 break;
521 case DW_LNE_HP_source_file_correlation:
522 {
523 unsigned char *edata = data + len - bytes_read - 1;
524
525 printf ("DW_LNE_HP_source_file_correlation\n");
526
527 while (data < edata)
528 {
529 unsigned int opc;
530
531 opc = read_uleb128 (data, & bytes_read, edata);
532 data += bytes_read;
533
534 switch (opc)
535 {
536 case DW_LNE_HP_SFC_formfeed:
537 printf (" DW_LNE_HP_SFC_formfeed\n");
538 break;
539 case DW_LNE_HP_SFC_set_listing_line:
540 printf (" DW_LNE_HP_SFC_set_listing_line (%s)\n",
541 dwarf_vmatoa ("u",
542 read_uleb128 (data, & bytes_read, edata)));
543 data += bytes_read;
544 break;
545 case DW_LNE_HP_SFC_associate:
546 printf (" DW_LNE_HP_SFC_associate ");
547 printf ("(%s",
548 dwarf_vmatoa ("u",
549 read_uleb128 (data, & bytes_read, edata)));
550 data += bytes_read;
551 printf (",%s",
552 dwarf_vmatoa ("u",
553 read_uleb128 (data, & bytes_read, edata)));
554 data += bytes_read;
555 printf (",%s)\n",
556 dwarf_vmatoa ("u",
557 read_uleb128 (data, & bytes_read, edata)));
558 data += bytes_read;
559 break;
560 default:
561 printf (_(" UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc);
562 data = edata;
563 break;
564 }
565 }
566 }
567 break;
568
569 default:
570 {
571 unsigned int rlen = len - bytes_read - 1;
572
573 if (op_code >= DW_LNE_lo_user
574 /* The test against DW_LNW_hi_user is redundant due to
575 the limited range of the unsigned char data type used
576 for op_code. */
577 /*&& op_code <= DW_LNE_hi_user*/)
578 printf (_("user defined: "));
579 else
580 printf (_("UNKNOWN: "));
581 printf (_("length %d ["), rlen);
582 for (; rlen; rlen--)
583 printf (" %02x", *data++);
584 printf ("]\n");
585 }
586 break;
587 }
588
589 return len;
590 }
591
592 static const unsigned char *
593 fetch_indirect_string (dwarf_vma offset)
594 {
595 struct dwarf_section *section = &debug_displays [str].section;
596
597 if (section->start == NULL)
598 return (const unsigned char *) _("<no .debug_str section>");
599
600 if (offset > section->size)
601 {
602 warn (_("DW_FORM_strp offset too big: %s\n"),
603 dwarf_vmatoa ("x", offset));
604 return (const unsigned char *) _("<offset is too big>");
605 }
606
607 return (const unsigned char *) section->start + offset;
608 }
609
610 static const char *
611 fetch_indexed_string (dwarf_vma idx, struct cu_tu_set *this_set,
612 dwarf_vma offset_size, int dwo)
613 {
614 enum dwarf_section_display_enum str_sec_idx = dwo ? str_dwo : str;
615 enum dwarf_section_display_enum idx_sec_idx = dwo ? str_index_dwo : str_index;
616 struct dwarf_section *index_section = &debug_displays [idx_sec_idx].section;
617 struct dwarf_section *str_section = &debug_displays [str_sec_idx].section;
618 dwarf_vma index_offset = idx * offset_size;
619 dwarf_vma str_offset;
620
621 if (index_section->start == NULL)
622 return (dwo ? _("<no .debug_str_offsets.dwo section>")
623 : _("<no .debug_str_offsets section>"));
624
625 if (this_set != NULL)
626 index_offset += this_set->section_offsets [DW_SECT_STR_OFFSETS];
627 if (index_offset > index_section->size)
628 {
629 warn (_("DW_FORM_GNU_str_index offset too big: %s\n"),
630 dwarf_vmatoa ("x", index_offset));
631 return _("<index offset is too big>");
632 }
633
634 if (str_section->start == NULL)
635 return (dwo ? _("<no .debug_str.dwo section>")
636 : _("<no .debug_str section>"));
637
638 str_offset = byte_get (index_section->start + index_offset, offset_size);
639 str_offset -= str_section->address;
640 if (str_offset > str_section->size)
641 {
642 warn (_("DW_FORM_GNU_str_index indirect offset too big: %s\n"),
643 dwarf_vmatoa ("x", str_offset));
644 return _("<indirect index offset is too big>");
645 }
646
647 return (const char *) str_section->start + str_offset;
648 }
649
650 static const char *
651 fetch_indexed_value (dwarf_vma offset, dwarf_vma bytes)
652 {
653 struct dwarf_section *section = &debug_displays [debug_addr].section;
654
655 if (section->start == NULL)
656 return (_("<no .debug_addr section>"));
657
658 if (offset + bytes > section->size)
659 {
660 warn (_("Offset into section %s too big: %s\n"),
661 section->name, dwarf_vmatoa ("x", offset));
662 return "<offset too big>";
663 }
664
665 return dwarf_vmatoa ("x", byte_get (section->start + offset, bytes));
666 }
667
668
669 /* FIXME: There are better and more efficient ways to handle
670 these structures. For now though, I just want something that
671 is simple to implement. */
672 typedef struct abbrev_attr
673 {
674 unsigned long attribute;
675 unsigned long form;
676 struct abbrev_attr *next;
677 }
678 abbrev_attr;
679
680 typedef struct abbrev_entry
681 {
682 unsigned long entry;
683 unsigned long tag;
684 int children;
685 struct abbrev_attr *first_attr;
686 struct abbrev_attr *last_attr;
687 struct abbrev_entry *next;
688 }
689 abbrev_entry;
690
691 static abbrev_entry *first_abbrev = NULL;
692 static abbrev_entry *last_abbrev = NULL;
693
694 static void
695 free_abbrevs (void)
696 {
697 abbrev_entry *abbrv;
698
699 for (abbrv = first_abbrev; abbrv;)
700 {
701 abbrev_entry *next_abbrev = abbrv->next;
702 abbrev_attr *attr;
703
704 for (attr = abbrv->first_attr; attr;)
705 {
706 abbrev_attr *next_attr = attr->next;
707
708 free (attr);
709 attr = next_attr;
710 }
711
712 free (abbrv);
713 abbrv = next_abbrev;
714 }
715
716 last_abbrev = first_abbrev = NULL;
717 }
718
719 static void
720 add_abbrev (unsigned long number, unsigned long tag, int children)
721 {
722 abbrev_entry *entry;
723
724 entry = (abbrev_entry *) malloc (sizeof (*entry));
725 if (entry == NULL)
726 /* ugg */
727 return;
728
729 entry->entry = number;
730 entry->tag = tag;
731 entry->children = children;
732 entry->first_attr = NULL;
733 entry->last_attr = NULL;
734 entry->next = NULL;
735
736 if (first_abbrev == NULL)
737 first_abbrev = entry;
738 else
739 last_abbrev->next = entry;
740
741 last_abbrev = entry;
742 }
743
744 static void
745 add_abbrev_attr (unsigned long attribute, unsigned long form)
746 {
747 abbrev_attr *attr;
748
749 attr = (abbrev_attr *) malloc (sizeof (*attr));
750 if (attr == NULL)
751 /* ugg */
752 return;
753
754 attr->attribute = attribute;
755 attr->form = form;
756 attr->next = NULL;
757
758 if (last_abbrev->first_attr == NULL)
759 last_abbrev->first_attr = attr;
760 else
761 last_abbrev->last_attr->next = attr;
762
763 last_abbrev->last_attr = attr;
764 }
765
766 /* Processes the (partial) contents of a .debug_abbrev section.
767 Returns NULL if the end of the section was encountered.
768 Returns the address after the last byte read if the end of
769 an abbreviation set was found. */
770
771 static unsigned char *
772 process_abbrev_section (unsigned char *start, unsigned char *end)
773 {
774 if (first_abbrev != NULL)
775 return NULL;
776
777 while (start < end)
778 {
779 unsigned int bytes_read;
780 unsigned long entry;
781 unsigned long tag;
782 unsigned long attribute;
783 int children;
784
785 entry = read_uleb128 (start, & bytes_read, end);
786 start += bytes_read;
787
788 /* A single zero is supposed to end the section according
789 to the standard. If there's more, then signal that to
790 the caller. */
791 if (start == end)
792 return NULL;
793 if (entry == 0)
794 return start;
795
796 tag = read_uleb128 (start, & bytes_read, end);
797 start += bytes_read;
798 if (start == end)
799 return NULL;
800
801 children = *start++;
802
803 add_abbrev (entry, tag, children);
804
805 do
806 {
807 unsigned long form;
808
809 attribute = read_uleb128 (start, & bytes_read, end);
810 start += bytes_read;
811 if (start == end)
812 break;
813
814 form = read_uleb128 (start, & bytes_read, end);
815 start += bytes_read;
816 if (start == end)
817 break;
818
819 add_abbrev_attr (attribute, form);
820 }
821 while (attribute != 0);
822 }
823
824 /* Report the missing single zero which ends the section. */
825 error (_(".debug_abbrev section not zero terminated\n"));
826
827 return NULL;
828 }
829
830 static const char *
831 get_TAG_name (unsigned long tag)
832 {
833 const char *name = get_DW_TAG_name ((unsigned int)tag);
834
835 if (name == NULL)
836 {
837 static char buffer[100];
838
839 snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag);
840 return buffer;
841 }
842
843 return name;
844 }
845
846 static const char *
847 get_FORM_name (unsigned long form)
848 {
849 const char *name;
850
851 if (form == 0)
852 return "DW_FORM value: 0";
853
854 name = get_DW_FORM_name (form);
855 if (name == NULL)
856 {
857 static char buffer[100];
858
859 snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
860 return buffer;
861 }
862
863 return name;
864 }
865
866 static unsigned char *
867 display_block (unsigned char *data,
868 dwarf_vma length,
869 const unsigned char * const end)
870 {
871 dwarf_vma maxlen;
872
873 printf (_(" %s byte block: "), dwarf_vmatoa ("u", length));
874 if (data > end)
875 return (unsigned char *) end;
876
877 maxlen = (dwarf_vma) (end - data);
878 length = length > maxlen ? maxlen : length;
879
880 while (length --)
881 printf ("%lx ", (unsigned long) byte_get (data++, 1));
882
883 return data;
884 }
885
886 static int
887 decode_location_expression (unsigned char * data,
888 unsigned int pointer_size,
889 unsigned int offset_size,
890 int dwarf_version,
891 dwarf_vma length,
892 dwarf_vma cu_offset,
893 struct dwarf_section * section)
894 {
895 unsigned op;
896 unsigned int bytes_read;
897 dwarf_vma uvalue;
898 dwarf_signed_vma svalue;
899 unsigned char *end = data + length;
900 int need_frame_base = 0;
901
902 while (data < end)
903 {
904 op = *data++;
905
906 switch (op)
907 {
908 case DW_OP_addr:
909 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
910 printf ("DW_OP_addr: %s", dwarf_vmatoa ("x", uvalue));
911 break;
912 case DW_OP_deref:
913 printf ("DW_OP_deref");
914 break;
915 case DW_OP_const1u:
916 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
917 printf ("DW_OP_const1u: %lu", (unsigned long) uvalue);
918 break;
919 case DW_OP_const1s:
920 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 1, end);
921 printf ("DW_OP_const1s: %ld", (long) svalue);
922 break;
923 case DW_OP_const2u:
924 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
925 printf ("DW_OP_const2u: %lu", (unsigned long) uvalue);
926 break;
927 case DW_OP_const2s:
928 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
929 printf ("DW_OP_const2s: %ld", (long) svalue);
930 break;
931 case DW_OP_const4u:
932 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
933 printf ("DW_OP_const4u: %lu", (unsigned long) uvalue);
934 break;
935 case DW_OP_const4s:
936 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
937 printf ("DW_OP_const4s: %ld", (long) svalue);
938 break;
939 case DW_OP_const8u:
940 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
941 printf ("DW_OP_const8u: %lu ", (unsigned long) uvalue);
942 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
943 printf ("%lu", (unsigned long) uvalue);
944 break;
945 case DW_OP_const8s:
946 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
947 printf ("DW_OP_const8s: %ld ", (long) svalue);
948 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
949 printf ("%ld", (long) svalue);
950 break;
951 case DW_OP_constu:
952 printf ("DW_OP_constu: %s",
953 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
954 data += bytes_read;
955 break;
956 case DW_OP_consts:
957 printf ("DW_OP_consts: %s",
958 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
959 data += bytes_read;
960 break;
961 case DW_OP_dup:
962 printf ("DW_OP_dup");
963 break;
964 case DW_OP_drop:
965 printf ("DW_OP_drop");
966 break;
967 case DW_OP_over:
968 printf ("DW_OP_over");
969 break;
970 case DW_OP_pick:
971 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
972 printf ("DW_OP_pick: %ld", (unsigned long) uvalue);
973 break;
974 case DW_OP_swap:
975 printf ("DW_OP_swap");
976 break;
977 case DW_OP_rot:
978 printf ("DW_OP_rot");
979 break;
980 case DW_OP_xderef:
981 printf ("DW_OP_xderef");
982 break;
983 case DW_OP_abs:
984 printf ("DW_OP_abs");
985 break;
986 case DW_OP_and:
987 printf ("DW_OP_and");
988 break;
989 case DW_OP_div:
990 printf ("DW_OP_div");
991 break;
992 case DW_OP_minus:
993 printf ("DW_OP_minus");
994 break;
995 case DW_OP_mod:
996 printf ("DW_OP_mod");
997 break;
998 case DW_OP_mul:
999 printf ("DW_OP_mul");
1000 break;
1001 case DW_OP_neg:
1002 printf ("DW_OP_neg");
1003 break;
1004 case DW_OP_not:
1005 printf ("DW_OP_not");
1006 break;
1007 case DW_OP_or:
1008 printf ("DW_OP_or");
1009 break;
1010 case DW_OP_plus:
1011 printf ("DW_OP_plus");
1012 break;
1013 case DW_OP_plus_uconst:
1014 printf ("DW_OP_plus_uconst: %s",
1015 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1016 data += bytes_read;
1017 break;
1018 case DW_OP_shl:
1019 printf ("DW_OP_shl");
1020 break;
1021 case DW_OP_shr:
1022 printf ("DW_OP_shr");
1023 break;
1024 case DW_OP_shra:
1025 printf ("DW_OP_shra");
1026 break;
1027 case DW_OP_xor:
1028 printf ("DW_OP_xor");
1029 break;
1030 case DW_OP_bra:
1031 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1032 printf ("DW_OP_bra: %ld", (long) svalue);
1033 break;
1034 case DW_OP_eq:
1035 printf ("DW_OP_eq");
1036 break;
1037 case DW_OP_ge:
1038 printf ("DW_OP_ge");
1039 break;
1040 case DW_OP_gt:
1041 printf ("DW_OP_gt");
1042 break;
1043 case DW_OP_le:
1044 printf ("DW_OP_le");
1045 break;
1046 case DW_OP_lt:
1047 printf ("DW_OP_lt");
1048 break;
1049 case DW_OP_ne:
1050 printf ("DW_OP_ne");
1051 break;
1052 case DW_OP_skip:
1053 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1054 printf ("DW_OP_skip: %ld", (long) svalue);
1055 break;
1056
1057 case DW_OP_lit0:
1058 case DW_OP_lit1:
1059 case DW_OP_lit2:
1060 case DW_OP_lit3:
1061 case DW_OP_lit4:
1062 case DW_OP_lit5:
1063 case DW_OP_lit6:
1064 case DW_OP_lit7:
1065 case DW_OP_lit8:
1066 case DW_OP_lit9:
1067 case DW_OP_lit10:
1068 case DW_OP_lit11:
1069 case DW_OP_lit12:
1070 case DW_OP_lit13:
1071 case DW_OP_lit14:
1072 case DW_OP_lit15:
1073 case DW_OP_lit16:
1074 case DW_OP_lit17:
1075 case DW_OP_lit18:
1076 case DW_OP_lit19:
1077 case DW_OP_lit20:
1078 case DW_OP_lit21:
1079 case DW_OP_lit22:
1080 case DW_OP_lit23:
1081 case DW_OP_lit24:
1082 case DW_OP_lit25:
1083 case DW_OP_lit26:
1084 case DW_OP_lit27:
1085 case DW_OP_lit28:
1086 case DW_OP_lit29:
1087 case DW_OP_lit30:
1088 case DW_OP_lit31:
1089 printf ("DW_OP_lit%d", op - DW_OP_lit0);
1090 break;
1091
1092 case DW_OP_reg0:
1093 case DW_OP_reg1:
1094 case DW_OP_reg2:
1095 case DW_OP_reg3:
1096 case DW_OP_reg4:
1097 case DW_OP_reg5:
1098 case DW_OP_reg6:
1099 case DW_OP_reg7:
1100 case DW_OP_reg8:
1101 case DW_OP_reg9:
1102 case DW_OP_reg10:
1103 case DW_OP_reg11:
1104 case DW_OP_reg12:
1105 case DW_OP_reg13:
1106 case DW_OP_reg14:
1107 case DW_OP_reg15:
1108 case DW_OP_reg16:
1109 case DW_OP_reg17:
1110 case DW_OP_reg18:
1111 case DW_OP_reg19:
1112 case DW_OP_reg20:
1113 case DW_OP_reg21:
1114 case DW_OP_reg22:
1115 case DW_OP_reg23:
1116 case DW_OP_reg24:
1117 case DW_OP_reg25:
1118 case DW_OP_reg26:
1119 case DW_OP_reg27:
1120 case DW_OP_reg28:
1121 case DW_OP_reg29:
1122 case DW_OP_reg30:
1123 case DW_OP_reg31:
1124 printf ("DW_OP_reg%d (%s)", op - DW_OP_reg0,
1125 regname (op - DW_OP_reg0, 1));
1126 break;
1127
1128 case DW_OP_breg0:
1129 case DW_OP_breg1:
1130 case DW_OP_breg2:
1131 case DW_OP_breg3:
1132 case DW_OP_breg4:
1133 case DW_OP_breg5:
1134 case DW_OP_breg6:
1135 case DW_OP_breg7:
1136 case DW_OP_breg8:
1137 case DW_OP_breg9:
1138 case DW_OP_breg10:
1139 case DW_OP_breg11:
1140 case DW_OP_breg12:
1141 case DW_OP_breg13:
1142 case DW_OP_breg14:
1143 case DW_OP_breg15:
1144 case DW_OP_breg16:
1145 case DW_OP_breg17:
1146 case DW_OP_breg18:
1147 case DW_OP_breg19:
1148 case DW_OP_breg20:
1149 case DW_OP_breg21:
1150 case DW_OP_breg22:
1151 case DW_OP_breg23:
1152 case DW_OP_breg24:
1153 case DW_OP_breg25:
1154 case DW_OP_breg26:
1155 case DW_OP_breg27:
1156 case DW_OP_breg28:
1157 case DW_OP_breg29:
1158 case DW_OP_breg30:
1159 case DW_OP_breg31:
1160 printf ("DW_OP_breg%d (%s): %s",
1161 op - DW_OP_breg0,
1162 regname (op - DW_OP_breg0, 1),
1163 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1164 data += bytes_read;
1165 break;
1166
1167 case DW_OP_regx:
1168 uvalue = read_uleb128 (data, &bytes_read, end);
1169 data += bytes_read;
1170 printf ("DW_OP_regx: %s (%s)",
1171 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1172 break;
1173 case DW_OP_fbreg:
1174 need_frame_base = 1;
1175 printf ("DW_OP_fbreg: %s",
1176 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1177 data += bytes_read;
1178 break;
1179 case DW_OP_bregx:
1180 uvalue = read_uleb128 (data, &bytes_read, end);
1181 data += bytes_read;
1182 printf ("DW_OP_bregx: %s (%s) %s",
1183 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1),
1184 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1185 data += bytes_read;
1186 break;
1187 case DW_OP_piece:
1188 printf ("DW_OP_piece: %s",
1189 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1190 data += bytes_read;
1191 break;
1192 case DW_OP_deref_size:
1193 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1194 printf ("DW_OP_deref_size: %ld", (long) uvalue);
1195 break;
1196 case DW_OP_xderef_size:
1197 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1198 printf ("DW_OP_xderef_size: %ld", (long) uvalue);
1199 break;
1200 case DW_OP_nop:
1201 printf ("DW_OP_nop");
1202 break;
1203
1204 /* DWARF 3 extensions. */
1205 case DW_OP_push_object_address:
1206 printf ("DW_OP_push_object_address");
1207 break;
1208 case DW_OP_call2:
1209 /* XXX: Strictly speaking for 64-bit DWARF3 files
1210 this ought to be an 8-byte wide computation. */
1211 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1212 printf ("DW_OP_call2: <0x%s>",
1213 dwarf_vmatoa ("x", svalue + cu_offset));
1214 break;
1215 case DW_OP_call4:
1216 /* XXX: Strictly speaking for 64-bit DWARF3 files
1217 this ought to be an 8-byte wide computation. */
1218 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1219 printf ("DW_OP_call4: <0x%s>",
1220 dwarf_vmatoa ("x", svalue + cu_offset));
1221 break;
1222 case DW_OP_call_ref:
1223 /* XXX: Strictly speaking for 64-bit DWARF3 files
1224 this ought to be an 8-byte wide computation. */
1225 if (dwarf_version == -1)
1226 {
1227 printf (_("(DW_OP_call_ref in frame info)"));
1228 /* No way to tell where the next op is, so just bail. */
1229 return need_frame_base;
1230 }
1231 if (dwarf_version == 2)
1232 {
1233 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1234 }
1235 else
1236 {
1237 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1238 }
1239 printf ("DW_OP_call_ref: <0x%s>", dwarf_vmatoa ("x", uvalue));
1240 break;
1241 case DW_OP_form_tls_address:
1242 printf ("DW_OP_form_tls_address");
1243 break;
1244 case DW_OP_call_frame_cfa:
1245 printf ("DW_OP_call_frame_cfa");
1246 break;
1247 case DW_OP_bit_piece:
1248 printf ("DW_OP_bit_piece: ");
1249 printf (_("size: %s "),
1250 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1251 data += bytes_read;
1252 printf (_("offset: %s "),
1253 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1254 data += bytes_read;
1255 break;
1256
1257 /* DWARF 4 extensions. */
1258 case DW_OP_stack_value:
1259 printf ("DW_OP_stack_value");
1260 break;
1261
1262 case DW_OP_implicit_value:
1263 printf ("DW_OP_implicit_value");
1264 uvalue = read_uleb128 (data, &bytes_read, end);
1265 data += bytes_read;
1266 data = display_block (data, uvalue, end);
1267 break;
1268
1269 /* GNU extensions. */
1270 case DW_OP_GNU_push_tls_address:
1271 printf (_("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown"));
1272 break;
1273 case DW_OP_GNU_uninit:
1274 printf ("DW_OP_GNU_uninit");
1275 /* FIXME: Is there data associated with this OP ? */
1276 break;
1277 case DW_OP_GNU_encoded_addr:
1278 {
1279 int encoding = 0;
1280 dwarf_vma addr;
1281
1282 if (data < end)
1283 encoding = *data++;
1284 addr = get_encoded_value (&data, encoding, section, end);
1285
1286 printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding);
1287 print_dwarf_vma (addr, pointer_size);
1288 }
1289 break;
1290 case DW_OP_GNU_implicit_pointer:
1291 /* XXX: Strictly speaking for 64-bit DWARF3 files
1292 this ought to be an 8-byte wide computation. */
1293 if (dwarf_version == -1)
1294 {
1295 printf (_("(DW_OP_GNU_implicit_pointer in frame info)"));
1296 /* No way to tell where the next op is, so just bail. */
1297 return need_frame_base;
1298 }
1299 if (dwarf_version == 2)
1300 {
1301 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1302 }
1303 else
1304 {
1305 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1306 }
1307 printf ("DW_OP_GNU_implicit_pointer: <0x%s> %s",
1308 dwarf_vmatoa ("x", uvalue),
1309 dwarf_vmatoa ("d", read_sleb128 (data,
1310 &bytes_read, end)));
1311 data += bytes_read;
1312 break;
1313 case DW_OP_GNU_entry_value:
1314 uvalue = read_uleb128 (data, &bytes_read, end);
1315 data += bytes_read;
1316 /* PR 17531: file: 0cc9cd00. */
1317 if (uvalue > (dwarf_vma) (end - data))
1318 uvalue = end - data;
1319 printf ("DW_OP_GNU_entry_value: (");
1320 if (decode_location_expression (data, pointer_size, offset_size,
1321 dwarf_version, uvalue,
1322 cu_offset, section))
1323 need_frame_base = 1;
1324 putchar (')');
1325 data += uvalue;
1326 if (data > end)
1327 data = end;
1328 break;
1329 case DW_OP_GNU_const_type:
1330 uvalue = read_uleb128 (data, &bytes_read, end);
1331 data += bytes_read;
1332 printf ("DW_OP_GNU_const_type: <0x%s> ",
1333 dwarf_vmatoa ("x", cu_offset + uvalue));
1334 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1335 data = display_block (data, uvalue, end);
1336 break;
1337 case DW_OP_GNU_regval_type:
1338 uvalue = read_uleb128 (data, &bytes_read, end);
1339 data += bytes_read;
1340 printf ("DW_OP_GNU_regval_type: %s (%s)",
1341 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1342 uvalue = read_uleb128 (data, &bytes_read, end);
1343 data += bytes_read;
1344 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1345 break;
1346 case DW_OP_GNU_deref_type:
1347 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1348 printf ("DW_OP_GNU_deref_type: %ld", (long) uvalue);
1349 uvalue = read_uleb128 (data, &bytes_read, end);
1350 data += bytes_read;
1351 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1352 break;
1353 case DW_OP_GNU_convert:
1354 uvalue = read_uleb128 (data, &bytes_read, end);
1355 data += bytes_read;
1356 printf ("DW_OP_GNU_convert <0x%s>",
1357 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1358 break;
1359 case DW_OP_GNU_reinterpret:
1360 uvalue = read_uleb128 (data, &bytes_read, end);
1361 data += bytes_read;
1362 printf ("DW_OP_GNU_reinterpret <0x%s>",
1363 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1364 break;
1365 case DW_OP_GNU_parameter_ref:
1366 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1367 printf ("DW_OP_GNU_parameter_ref: <0x%s>",
1368 dwarf_vmatoa ("x", cu_offset + uvalue));
1369 break;
1370 case DW_OP_GNU_addr_index:
1371 uvalue = read_uleb128 (data, &bytes_read, end);
1372 data += bytes_read;
1373 printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1374 break;
1375 case DW_OP_GNU_const_index:
1376 uvalue = read_uleb128 (data, &bytes_read, end);
1377 data += bytes_read;
1378 printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1379 break;
1380
1381 /* HP extensions. */
1382 case DW_OP_HP_is_value:
1383 printf ("DW_OP_HP_is_value");
1384 /* FIXME: Is there data associated with this OP ? */
1385 break;
1386 case DW_OP_HP_fltconst4:
1387 printf ("DW_OP_HP_fltconst4");
1388 /* FIXME: Is there data associated with this OP ? */
1389 break;
1390 case DW_OP_HP_fltconst8:
1391 printf ("DW_OP_HP_fltconst8");
1392 /* FIXME: Is there data associated with this OP ? */
1393 break;
1394 case DW_OP_HP_mod_range:
1395 printf ("DW_OP_HP_mod_range");
1396 /* FIXME: Is there data associated with this OP ? */
1397 break;
1398 case DW_OP_HP_unmod_range:
1399 printf ("DW_OP_HP_unmod_range");
1400 /* FIXME: Is there data associated with this OP ? */
1401 break;
1402 case DW_OP_HP_tls:
1403 printf ("DW_OP_HP_tls");
1404 /* FIXME: Is there data associated with this OP ? */
1405 break;
1406
1407 /* PGI (STMicroelectronics) extensions. */
1408 case DW_OP_PGI_omp_thread_num:
1409 /* Pushes the thread number for the current thread as it would be
1410 returned by the standard OpenMP library function:
1411 omp_get_thread_num(). The "current thread" is the thread for
1412 which the expression is being evaluated. */
1413 printf ("DW_OP_PGI_omp_thread_num");
1414 break;
1415
1416 default:
1417 if (op >= DW_OP_lo_user
1418 && op <= DW_OP_hi_user)
1419 printf (_("(User defined location op)"));
1420 else
1421 printf (_("(Unknown location op)"));
1422 /* No way to tell where the next op is, so just bail. */
1423 return need_frame_base;
1424 }
1425
1426 /* Separate the ops. */
1427 if (data < end)
1428 printf ("; ");
1429 }
1430
1431 return need_frame_base;
1432 }
1433
1434 /* Find the CU or TU set corresponding to the given CU_OFFSET.
1435 This is used for DWARF package files. */
1436
1437 static struct cu_tu_set *
1438 find_cu_tu_set_v2 (dwarf_vma cu_offset, int do_types)
1439 {
1440 struct cu_tu_set *p;
1441 unsigned int nsets;
1442 unsigned int dw_sect;
1443
1444 if (do_types)
1445 {
1446 p = tu_sets;
1447 nsets = tu_count;
1448 dw_sect = DW_SECT_TYPES;
1449 }
1450 else
1451 {
1452 p = cu_sets;
1453 nsets = cu_count;
1454 dw_sect = DW_SECT_INFO;
1455 }
1456 while (nsets > 0)
1457 {
1458 if (p->section_offsets [dw_sect] == cu_offset)
1459 return p;
1460 p++;
1461 nsets--;
1462 }
1463 return NULL;
1464 }
1465
1466 /* Add INC to HIGH_BITS:LOW_BITS. */
1467 static void
1468 add64 (dwarf_vma * high_bits, dwarf_vma * low_bits, dwarf_vma inc)
1469 {
1470 dwarf_vma tmp = * low_bits;
1471
1472 tmp += inc;
1473
1474 /* FIXME: There is probably a better way of handling this:
1475
1476 We need to cope with dwarf_vma being a 32-bit or 64-bit
1477 type. Plus regardless of its size LOW_BITS is meant to
1478 only hold 32-bits, so if there is overflow or wrap around
1479 we must propagate into HIGH_BITS. */
1480 if (tmp < * low_bits)
1481 {
1482 ++ * high_bits;
1483 }
1484 else if (sizeof (tmp) > 8
1485 && (tmp >> 31) > 1)
1486 {
1487 ++ * high_bits;
1488 tmp &= 0xFFFFFFFF;
1489 }
1490
1491 * low_bits = tmp;
1492 }
1493
1494 static unsigned char *
1495 read_and_display_attr_value (unsigned long attribute,
1496 unsigned long form,
1497 unsigned char * data,
1498 unsigned char * end,
1499 dwarf_vma cu_offset,
1500 dwarf_vma pointer_size,
1501 dwarf_vma offset_size,
1502 int dwarf_version,
1503 debug_info * debug_info_p,
1504 int do_loc,
1505 struct dwarf_section * section,
1506 struct cu_tu_set * this_set)
1507 {
1508 dwarf_vma uvalue = 0;
1509 unsigned char *block_start = NULL;
1510 unsigned char * orig_data = data;
1511 unsigned int bytes_read;
1512
1513 if (data > end || (data == end && form != DW_FORM_flag_present))
1514 {
1515 warn (_("Corrupt attribute\n"));
1516 return data;
1517 }
1518
1519 switch (form)
1520 {
1521 default:
1522 break;
1523
1524 case DW_FORM_ref_addr:
1525 if (dwarf_version == 2)
1526 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1527 else if (dwarf_version == 3 || dwarf_version == 4)
1528 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1529 else
1530 error (_("Internal error: DWARF version is not 2, 3 or 4.\n"));
1531
1532 break;
1533
1534 case DW_FORM_addr:
1535 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1536 break;
1537
1538 case DW_FORM_strp:
1539 case DW_FORM_sec_offset:
1540 case DW_FORM_GNU_ref_alt:
1541 case DW_FORM_GNU_strp_alt:
1542 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1543 break;
1544
1545 case DW_FORM_flag_present:
1546 uvalue = 1;
1547 break;
1548
1549 case DW_FORM_ref1:
1550 case DW_FORM_flag:
1551 case DW_FORM_data1:
1552 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1553 break;
1554
1555 case DW_FORM_ref2:
1556 case DW_FORM_data2:
1557 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1558 break;
1559
1560 case DW_FORM_ref4:
1561 case DW_FORM_data4:
1562 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1563 break;
1564
1565 case DW_FORM_sdata:
1566 uvalue = read_sleb128 (data, & bytes_read, end);
1567 data += bytes_read;
1568 break;
1569
1570 case DW_FORM_GNU_str_index:
1571 uvalue = read_uleb128 (data, & bytes_read, end);
1572 data += bytes_read;
1573 break;
1574
1575 case DW_FORM_ref_udata:
1576 case DW_FORM_udata:
1577 uvalue = read_uleb128 (data, & bytes_read, end);
1578 data += bytes_read;
1579 break;
1580
1581 case DW_FORM_indirect:
1582 form = read_uleb128 (data, & bytes_read, end);
1583 data += bytes_read;
1584 if (!do_loc)
1585 printf (" %s", get_FORM_name (form));
1586 return read_and_display_attr_value (attribute, form, data, end,
1587 cu_offset, pointer_size,
1588 offset_size, dwarf_version,
1589 debug_info_p, do_loc,
1590 section, this_set);
1591 case DW_FORM_GNU_addr_index:
1592 uvalue = read_uleb128 (data, & bytes_read, end);
1593 data += bytes_read;
1594 break;
1595 }
1596
1597 switch (form)
1598 {
1599 case DW_FORM_ref_addr:
1600 if (!do_loc)
1601 printf (" <0x%s>", dwarf_vmatoa ("x",uvalue));
1602 break;
1603
1604 case DW_FORM_GNU_ref_alt:
1605 if (!do_loc)
1606 printf (" <alt 0x%s>", dwarf_vmatoa ("x",uvalue));
1607 break;
1608
1609 case DW_FORM_ref1:
1610 case DW_FORM_ref2:
1611 case DW_FORM_ref4:
1612 case DW_FORM_ref_udata:
1613 if (!do_loc)
1614 printf (" <0x%s>", dwarf_vmatoa ("x", uvalue + cu_offset));
1615 break;
1616
1617 case DW_FORM_data4:
1618 case DW_FORM_addr:
1619 case DW_FORM_sec_offset:
1620 if (!do_loc)
1621 printf (" 0x%s", dwarf_vmatoa ("x", uvalue));
1622 break;
1623
1624 case DW_FORM_flag_present:
1625 case DW_FORM_flag:
1626 case DW_FORM_data1:
1627 case DW_FORM_data2:
1628 case DW_FORM_sdata:
1629 case DW_FORM_udata:
1630 if (!do_loc)
1631 printf (" %s", dwarf_vmatoa ("d", uvalue));
1632 break;
1633
1634 case DW_FORM_ref8:
1635 case DW_FORM_data8:
1636 if (!do_loc)
1637 {
1638 dwarf_vma high_bits;
1639 dwarf_vma utmp;
1640 char buf[64];
1641
1642 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1643 utmp = uvalue;
1644 if (form == DW_FORM_ref8)
1645 add64 (& high_bits, & utmp, cu_offset);
1646 printf (" 0x%s",
1647 dwarf_vmatoa64 (high_bits, utmp, buf, sizeof (buf)));
1648 }
1649
1650 if ((do_loc || do_debug_loc || do_debug_ranges)
1651 && num_debug_info_entries == 0)
1652 {
1653 if (sizeof (uvalue) == 8)
1654 SAFE_BYTE_GET (uvalue, data, 8, end);
1655 else
1656 error (_("DW_FORM_data8 is unsupported when sizeof (dwarf_vma) != 8\n"));
1657 }
1658
1659 data += 8;
1660 break;
1661
1662 case DW_FORM_string:
1663 if (!do_loc)
1664 printf (" %.*s", (int) (end - data), data);
1665 data += strnlen ((char *) data, end - data) + 1;
1666 break;
1667
1668 case DW_FORM_block:
1669 case DW_FORM_exprloc:
1670 uvalue = read_uleb128 (data, & bytes_read, end);
1671 block_start = data + bytes_read;
1672 if (block_start >= end)
1673 {
1674 warn (_("Block ends prematurely\n"));
1675 uvalue = 0;
1676 block_start = end;
1677 }
1678 /* FIXME: Testing "(block_start + uvalue) < block_start" miscompiles with
1679 gcc 4.8.3 running on an x86_64 host in 32-bit mode. So we pre-compute
1680 block_start + uvalue here. */
1681 data = block_start + uvalue;
1682 /* PR 17512: file: 008-103549-0.001:0.1. */
1683 if (block_start + uvalue > end || data < block_start)
1684 {
1685 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1686 uvalue = end - block_start;
1687 }
1688 if (do_loc)
1689 data = block_start + uvalue;
1690 else
1691 data = display_block (block_start, uvalue, end);
1692 break;
1693
1694 case DW_FORM_block1:
1695 SAFE_BYTE_GET (uvalue, data, 1, end);
1696 block_start = data + 1;
1697 if (block_start >= end)
1698 {
1699 warn (_("Block ends prematurely\n"));
1700 uvalue = 0;
1701 block_start = end;
1702 }
1703 data = block_start + uvalue;
1704 if (block_start + uvalue > end || data < block_start)
1705 {
1706 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1707 uvalue = end - block_start;
1708 }
1709 if (do_loc)
1710 data = block_start + uvalue;
1711 else
1712 data = display_block (block_start, uvalue, end);
1713 break;
1714
1715 case DW_FORM_block2:
1716 SAFE_BYTE_GET (uvalue, data, 2, end);
1717 block_start = data + 2;
1718 if (block_start >= end)
1719 {
1720 warn (_("Block ends prematurely\n"));
1721 uvalue = 0;
1722 block_start = end;
1723 }
1724 data = block_start + uvalue;
1725 if (block_start + uvalue > end || data < block_start)
1726 {
1727 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1728 uvalue = end - block_start;
1729 }
1730 if (do_loc)
1731 data = block_start + uvalue;
1732 else
1733 data = display_block (block_start, uvalue, end);
1734 break;
1735
1736 case DW_FORM_block4:
1737 SAFE_BYTE_GET (uvalue, data, 4, end);
1738 block_start = data + 4;
1739 /* PR 17512: file: 3371-3907-0.004. */
1740 if (block_start >= end)
1741 {
1742 warn (_("Block ends prematurely\n"));
1743 uvalue = 0;
1744 block_start = end;
1745 }
1746 data = block_start + uvalue;
1747 if (block_start + uvalue > end
1748 /* PR 17531: file: 5b5f0592. */
1749 || data < block_start)
1750 {
1751 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1752 uvalue = end - block_start;
1753 }
1754 if (do_loc)
1755 data = block_start + uvalue;
1756 else
1757 data = display_block (block_start, uvalue, end);
1758 break;
1759
1760 case DW_FORM_strp:
1761 if (!do_loc)
1762 printf (_(" (indirect string, offset: 0x%s): %s"),
1763 dwarf_vmatoa ("x", uvalue),
1764 fetch_indirect_string (uvalue));
1765 break;
1766
1767 case DW_FORM_GNU_str_index:
1768 if (!do_loc)
1769 {
1770 const char *suffix = strrchr (section->name, '.');
1771 int dwo = (suffix && strcmp (suffix, ".dwo") == 0) ? 1 : 0;
1772
1773 printf (_(" (indexed string: 0x%s): %s"),
1774 dwarf_vmatoa ("x", uvalue),
1775 fetch_indexed_string (uvalue, this_set, offset_size, dwo));
1776 }
1777 break;
1778
1779 case DW_FORM_GNU_strp_alt:
1780 if (!do_loc)
1781 printf (_(" (alt indirect string, offset: 0x%s)"),
1782 dwarf_vmatoa ("x", uvalue));
1783 break;
1784
1785 case DW_FORM_indirect:
1786 /* Handled above. */
1787 break;
1788
1789 case DW_FORM_ref_sig8:
1790 if (!do_loc)
1791 {
1792 dwarf_vma high_bits;
1793 char buf[64];
1794
1795 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1796 printf (" signature: 0x%s",
1797 dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf)));
1798 }
1799 data += 8;
1800 break;
1801
1802 case DW_FORM_GNU_addr_index:
1803 if (!do_loc)
1804 printf (_(" (addr_index: 0x%s): %s"),
1805 dwarf_vmatoa ("x", uvalue),
1806 fetch_indexed_value (uvalue * pointer_size, pointer_size));
1807 break;
1808
1809 default:
1810 warn (_("Unrecognized form: %lu\n"), form);
1811 break;
1812 }
1813
1814 if ((do_loc || do_debug_loc || do_debug_ranges)
1815 && num_debug_info_entries == 0
1816 && debug_info_p != NULL)
1817 {
1818 switch (attribute)
1819 {
1820 case DW_AT_frame_base:
1821 have_frame_base = 1;
1822 case DW_AT_location:
1823 case DW_AT_string_length:
1824 case DW_AT_return_addr:
1825 case DW_AT_data_member_location:
1826 case DW_AT_vtable_elem_location:
1827 case DW_AT_segment:
1828 case DW_AT_static_link:
1829 case DW_AT_use_location:
1830 case DW_AT_GNU_call_site_value:
1831 case DW_AT_GNU_call_site_data_value:
1832 case DW_AT_GNU_call_site_target:
1833 case DW_AT_GNU_call_site_target_clobbered:
1834 if ((dwarf_version < 4
1835 && (form == DW_FORM_data4 || form == DW_FORM_data8))
1836 || form == DW_FORM_sec_offset)
1837 {
1838 /* Process location list. */
1839 unsigned int lmax = debug_info_p->max_loc_offsets;
1840 unsigned int num = debug_info_p->num_loc_offsets;
1841
1842 if (lmax == 0 || num >= lmax)
1843 {
1844 lmax += 1024;
1845 debug_info_p->loc_offsets = (dwarf_vma *)
1846 xcrealloc (debug_info_p->loc_offsets,
1847 lmax, sizeof (*debug_info_p->loc_offsets));
1848 debug_info_p->have_frame_base = (int *)
1849 xcrealloc (debug_info_p->have_frame_base,
1850 lmax, sizeof (*debug_info_p->have_frame_base));
1851 debug_info_p->max_loc_offsets = lmax;
1852 }
1853 if (this_set != NULL)
1854 uvalue += this_set->section_offsets [DW_SECT_LOC];
1855 debug_info_p->loc_offsets [num] = uvalue;
1856 debug_info_p->have_frame_base [num] = have_frame_base;
1857 debug_info_p->num_loc_offsets++;
1858 }
1859 break;
1860
1861 case DW_AT_low_pc:
1862 if (need_base_address)
1863 debug_info_p->base_address = uvalue;
1864 break;
1865
1866 case DW_AT_GNU_addr_base:
1867 debug_info_p->addr_base = uvalue;
1868 break;
1869
1870 case DW_AT_GNU_ranges_base:
1871 debug_info_p->ranges_base = uvalue;
1872 break;
1873
1874 case DW_AT_ranges:
1875 if ((dwarf_version < 4
1876 && (form == DW_FORM_data4 || form == DW_FORM_data8))
1877 || form == DW_FORM_sec_offset)
1878 {
1879 /* Process range list. */
1880 unsigned int lmax = debug_info_p->max_range_lists;
1881 unsigned int num = debug_info_p->num_range_lists;
1882
1883 if (lmax == 0 || num >= lmax)
1884 {
1885 lmax += 1024;
1886 debug_info_p->range_lists = (dwarf_vma *)
1887 xcrealloc (debug_info_p->range_lists,
1888 lmax, sizeof (*debug_info_p->range_lists));
1889 debug_info_p->max_range_lists = lmax;
1890 }
1891 debug_info_p->range_lists [num] = uvalue;
1892 debug_info_p->num_range_lists++;
1893 }
1894 break;
1895
1896 default:
1897 break;
1898 }
1899 }
1900
1901 if (do_loc || attribute == 0)
1902 return data;
1903
1904 /* For some attributes we can display further information. */
1905 switch (attribute)
1906 {
1907 case DW_AT_inline:
1908 printf ("\t");
1909 switch (uvalue)
1910 {
1911 case DW_INL_not_inlined:
1912 printf (_("(not inlined)"));
1913 break;
1914 case DW_INL_inlined:
1915 printf (_("(inlined)"));
1916 break;
1917 case DW_INL_declared_not_inlined:
1918 printf (_("(declared as inline but ignored)"));
1919 break;
1920 case DW_INL_declared_inlined:
1921 printf (_("(declared as inline and inlined)"));
1922 break;
1923 default:
1924 printf (_(" (Unknown inline attribute value: %s)"),
1925 dwarf_vmatoa ("x", uvalue));
1926 break;
1927 }
1928 break;
1929
1930 case DW_AT_language:
1931 printf ("\t");
1932 switch (uvalue)
1933 {
1934 /* Ordered by the numeric value of these constants. */
1935 case DW_LANG_C89: printf ("(ANSI C)"); break;
1936 case DW_LANG_C: printf ("(non-ANSI C)"); break;
1937 case DW_LANG_Ada83: printf ("(Ada)"); break;
1938 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
1939 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
1940 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
1941 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
1942 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
1943 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
1944 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
1945 /* DWARF 2.1 values. */
1946 case DW_LANG_Java: printf ("(Java)"); break;
1947 case DW_LANG_C99: printf ("(ANSI C99)"); break;
1948 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
1949 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
1950 /* DWARF 3 values. */
1951 case DW_LANG_PLI: printf ("(PLI)"); break;
1952 case DW_LANG_ObjC: printf ("(Objective C)"); break;
1953 case DW_LANG_ObjC_plus_plus: printf ("(Objective C++)"); break;
1954 case DW_LANG_UPC: printf ("(Unified Parallel C)"); break;
1955 case DW_LANG_D: printf ("(D)"); break;
1956 /* DWARF 4 values. */
1957 case DW_LANG_Python: printf ("(Python)"); break;
1958 /* DWARF 5 values. */
1959 case DW_LANG_Go: printf ("(Go)"); break;
1960 case DW_LANG_C_plus_plus_11: printf ("(C++11)"); break;
1961 case DW_LANG_C11: printf ("(C11)"); break;
1962 case DW_LANG_C_plus_plus_14: printf ("(C++14)"); break;
1963 case DW_LANG_Fortran03: printf ("(Fortran 03)"); break;
1964 case DW_LANG_Fortran08: printf ("(Fortran 08)"); break;
1965 /* MIPS extension. */
1966 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
1967 /* UPC extension. */
1968 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
1969 default:
1970 if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
1971 printf (_("(implementation defined: %s)"),
1972 dwarf_vmatoa ("x", uvalue));
1973 else
1974 printf (_("(Unknown: %s)"), dwarf_vmatoa ("x", uvalue));
1975 break;
1976 }
1977 break;
1978
1979 case DW_AT_encoding:
1980 printf ("\t");
1981 switch (uvalue)
1982 {
1983 case DW_ATE_void: printf ("(void)"); break;
1984 case DW_ATE_address: printf ("(machine address)"); break;
1985 case DW_ATE_boolean: printf ("(boolean)"); break;
1986 case DW_ATE_complex_float: printf ("(complex float)"); break;
1987 case DW_ATE_float: printf ("(float)"); break;
1988 case DW_ATE_signed: printf ("(signed)"); break;
1989 case DW_ATE_signed_char: printf ("(signed char)"); break;
1990 case DW_ATE_unsigned: printf ("(unsigned)"); break;
1991 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
1992 /* DWARF 2.1 values: */
1993 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
1994 case DW_ATE_decimal_float: printf ("(decimal float)"); break;
1995 /* DWARF 3 values: */
1996 case DW_ATE_packed_decimal: printf ("(packed_decimal)"); break;
1997 case DW_ATE_numeric_string: printf ("(numeric_string)"); break;
1998 case DW_ATE_edited: printf ("(edited)"); break;
1999 case DW_ATE_signed_fixed: printf ("(signed_fixed)"); break;
2000 case DW_ATE_unsigned_fixed: printf ("(unsigned_fixed)"); break;
2001 /* HP extensions: */
2002 case DW_ATE_HP_float80: printf ("(HP_float80)"); break;
2003 case DW_ATE_HP_complex_float80: printf ("(HP_complex_float80)"); break;
2004 case DW_ATE_HP_float128: printf ("(HP_float128)"); break;
2005 case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
2006 case DW_ATE_HP_floathpintel: printf ("(HP_floathpintel)"); break;
2007 case DW_ATE_HP_imaginary_float80: printf ("(HP_imaginary_float80)"); break;
2008 case DW_ATE_HP_imaginary_float128: printf ("(HP_imaginary_float128)"); break;
2009 /* DWARF 4 values: */
2010 case DW_ATE_UTF: printf ("(unicode string)"); break;
2011
2012 default:
2013 if (uvalue >= DW_ATE_lo_user
2014 && uvalue <= DW_ATE_hi_user)
2015 printf (_("(user defined type)"));
2016 else
2017 printf (_("(unknown type)"));
2018 break;
2019 }
2020 break;
2021
2022 case DW_AT_accessibility:
2023 printf ("\t");
2024 switch (uvalue)
2025 {
2026 case DW_ACCESS_public: printf ("(public)"); break;
2027 case DW_ACCESS_protected: printf ("(protected)"); break;
2028 case DW_ACCESS_private: printf ("(private)"); break;
2029 default:
2030 printf (_("(unknown accessibility)"));
2031 break;
2032 }
2033 break;
2034
2035 case DW_AT_visibility:
2036 printf ("\t");
2037 switch (uvalue)
2038 {
2039 case DW_VIS_local: printf ("(local)"); break;
2040 case DW_VIS_exported: printf ("(exported)"); break;
2041 case DW_VIS_qualified: printf ("(qualified)"); break;
2042 default: printf (_("(unknown visibility)")); break;
2043 }
2044 break;
2045
2046 case DW_AT_virtuality:
2047 printf ("\t");
2048 switch (uvalue)
2049 {
2050 case DW_VIRTUALITY_none: printf ("(none)"); break;
2051 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
2052 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
2053 default: printf (_("(unknown virtuality)")); break;
2054 }
2055 break;
2056
2057 case DW_AT_identifier_case:
2058 printf ("\t");
2059 switch (uvalue)
2060 {
2061 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
2062 case DW_ID_up_case: printf ("(up_case)"); break;
2063 case DW_ID_down_case: printf ("(down_case)"); break;
2064 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
2065 default: printf (_("(unknown case)")); break;
2066 }
2067 break;
2068
2069 case DW_AT_calling_convention:
2070 printf ("\t");
2071 switch (uvalue)
2072 {
2073 case DW_CC_normal: printf ("(normal)"); break;
2074 case DW_CC_program: printf ("(program)"); break;
2075 case DW_CC_nocall: printf ("(nocall)"); break;
2076 default:
2077 if (uvalue >= DW_CC_lo_user
2078 && uvalue <= DW_CC_hi_user)
2079 printf (_("(user defined)"));
2080 else
2081 printf (_("(unknown convention)"));
2082 }
2083 break;
2084
2085 case DW_AT_ordering:
2086 printf ("\t");
2087 switch (uvalue)
2088 {
2089 case -1: printf (_("(undefined)")); break;
2090 case 0: printf ("(row major)"); break;
2091 case 1: printf ("(column major)"); break;
2092 }
2093 break;
2094
2095 case DW_AT_frame_base:
2096 have_frame_base = 1;
2097 case DW_AT_location:
2098 case DW_AT_string_length:
2099 case DW_AT_return_addr:
2100 case DW_AT_data_member_location:
2101 case DW_AT_vtable_elem_location:
2102 case DW_AT_segment:
2103 case DW_AT_static_link:
2104 case DW_AT_use_location:
2105 case DW_AT_GNU_call_site_value:
2106 case DW_AT_GNU_call_site_data_value:
2107 case DW_AT_GNU_call_site_target:
2108 case DW_AT_GNU_call_site_target_clobbered:
2109 if ((dwarf_version < 4
2110 && (form == DW_FORM_data4 || form == DW_FORM_data8))
2111 || form == DW_FORM_sec_offset)
2112 printf (_(" (location list)"));
2113 /* Fall through. */
2114 case DW_AT_allocated:
2115 case DW_AT_associated:
2116 case DW_AT_data_location:
2117 case DW_AT_stride:
2118 case DW_AT_upper_bound:
2119 case DW_AT_lower_bound:
2120 if (block_start)
2121 {
2122 int need_frame_base;
2123
2124 printf ("\t(");
2125 need_frame_base = decode_location_expression (block_start,
2126 pointer_size,
2127 offset_size,
2128 dwarf_version,
2129 uvalue,
2130 cu_offset, section);
2131 printf (")");
2132 if (need_frame_base && !have_frame_base)
2133 printf (_(" [without DW_AT_frame_base]"));
2134 }
2135 break;
2136
2137 case DW_AT_import:
2138 {
2139 if (form == DW_FORM_ref_sig8
2140 || form == DW_FORM_GNU_ref_alt)
2141 break;
2142
2143 if (form == DW_FORM_ref1
2144 || form == DW_FORM_ref2
2145 || form == DW_FORM_ref4
2146 || form == DW_FORM_ref_udata)
2147 uvalue += cu_offset;
2148
2149 if (uvalue >= section->size)
2150 warn (_("Offset %s used as value for DW_AT_import attribute of DIE at offset 0x%lx is too big.\n"),
2151 dwarf_vmatoa ("x", uvalue),
2152 (unsigned long) (orig_data - section->start));
2153 else
2154 {
2155 unsigned long abbrev_number;
2156 abbrev_entry * entry;
2157
2158 abbrev_number = read_uleb128 (section->start + uvalue, NULL, end);
2159
2160 printf (_("\t[Abbrev Number: %ld"), abbrev_number);
2161 /* Don't look up abbrev for DW_FORM_ref_addr, as it very often will
2162 use different abbrev table, and we don't track .debug_info chunks
2163 yet. */
2164 if (form != DW_FORM_ref_addr)
2165 {
2166 for (entry = first_abbrev; entry != NULL; entry = entry->next)
2167 if (entry->entry == abbrev_number)
2168 break;
2169 if (entry != NULL)
2170 printf (" (%s)", get_TAG_name (entry->tag));
2171 }
2172 printf ("]");
2173 }
2174 }
2175 break;
2176
2177 default:
2178 break;
2179 }
2180
2181 return data;
2182 }
2183
2184 static const char *
2185 get_AT_name (unsigned long attribute)
2186 {
2187 const char *name;
2188
2189 if (attribute == 0)
2190 return "DW_AT value: 0";
2191
2192 /* One value is shared by the MIPS and HP extensions: */
2193 if (attribute == DW_AT_MIPS_fde)
2194 return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
2195
2196 name = get_DW_AT_name (attribute);
2197
2198 if (name == NULL)
2199 {
2200 static char buffer[100];
2201
2202 snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
2203 attribute);
2204 return buffer;
2205 }
2206
2207 return name;
2208 }
2209
2210 static unsigned char *
2211 read_and_display_attr (unsigned long attribute,
2212 unsigned long form,
2213 unsigned char * data,
2214 unsigned char * end,
2215 dwarf_vma cu_offset,
2216 dwarf_vma pointer_size,
2217 dwarf_vma offset_size,
2218 int dwarf_version,
2219 debug_info * debug_info_p,
2220 int do_loc,
2221 struct dwarf_section * section,
2222 struct cu_tu_set * this_set)
2223 {
2224 if (!do_loc)
2225 printf (" %-18s:", get_AT_name (attribute));
2226 data = read_and_display_attr_value (attribute, form, data, end,
2227 cu_offset, pointer_size, offset_size,
2228 dwarf_version, debug_info_p,
2229 do_loc, section, this_set);
2230 if (!do_loc)
2231 printf ("\n");
2232 return data;
2233 }
2234
2235 /* Process the contents of a .debug_info section. If do_loc is non-zero
2236 then we are scanning for location lists and we do not want to display
2237 anything to the user. If do_types is non-zero, we are processing
2238 a .debug_types section instead of a .debug_info section. */
2239
2240 static int
2241 process_debug_info (struct dwarf_section *section,
2242 void *file,
2243 enum dwarf_section_display_enum abbrev_sec,
2244 int do_loc,
2245 int do_types)
2246 {
2247 unsigned char *start = section->start;
2248 unsigned char *end = start + section->size;
2249 unsigned char *section_begin;
2250 unsigned int unit;
2251 unsigned int num_units = 0;
2252
2253 if ((do_loc || do_debug_loc || do_debug_ranges)
2254 && num_debug_info_entries == 0
2255 && ! do_types)
2256 {
2257 dwarf_vma length;
2258
2259 /* First scan the section to get the number of comp units. */
2260 for (section_begin = start, num_units = 0; section_begin < end;
2261 num_units ++)
2262 {
2263 /* Read the first 4 bytes. For a 32-bit DWARF section, this
2264 will be the length. For a 64-bit DWARF section, it'll be
2265 the escape code 0xffffffff followed by an 8 byte length. */
2266 SAFE_BYTE_GET (length, section_begin, 4, end);
2267
2268 if (length == 0xffffffff)
2269 {
2270 SAFE_BYTE_GET (length, section_begin + 4, 8, end);
2271 section_begin += length + 12;
2272 }
2273 else if (length >= 0xfffffff0 && length < 0xffffffff)
2274 {
2275 warn (_("Reserved length value (0x%s) found in section %s\n"),
2276 dwarf_vmatoa ("x", length), section->name);
2277 return 0;
2278 }
2279 else
2280 section_begin += length + 4;
2281
2282 /* Negative values are illegal, they may even cause infinite
2283 looping. This can happen if we can't accurately apply
2284 relocations to an object file, or if the file is corrupt. */
2285 if ((signed long) length <= 0 || section_begin < start)
2286 {
2287 warn (_("Corrupt unit length (0x%s) found in section %s\n"),
2288 dwarf_vmatoa ("x", length), section->name);
2289 return 0;
2290 }
2291 }
2292
2293 if (num_units == 0)
2294 {
2295 error (_("No comp units in %s section ?\n"), section->name);
2296 return 0;
2297 }
2298
2299 /* Then allocate an array to hold the information. */
2300 debug_information = (debug_info *) cmalloc (num_units,
2301 sizeof (* debug_information));
2302 if (debug_information == NULL)
2303 {
2304 error (_("Not enough memory for a debug info array of %u entries\n"),
2305 num_units);
2306 alloc_num_debug_info_entries = num_debug_info_entries = 0;
2307 return 0;
2308 }
2309 /* PR 17531: file: 92ca3797.
2310 We cannot rely upon the debug_information array being initialised
2311 before it is used. A corrupt file could easily contain references
2312 to a unit for which information has not been made available. So
2313 we ensure that the array is zeroed here. */
2314 memset (debug_information, 0, num_units * sizeof (*debug_information));
2315
2316 alloc_num_debug_info_entries = num_units;
2317 }
2318
2319 if (!do_loc)
2320 {
2321 if (dwarf_start_die == 0)
2322 printf (_("Contents of the %s section:\n\n"), section->name);
2323
2324 load_debug_section (str, file);
2325 load_debug_section (str_dwo, file);
2326 load_debug_section (str_index, file);
2327 load_debug_section (str_index_dwo, file);
2328 load_debug_section (debug_addr, file);
2329 }
2330
2331 load_debug_section (abbrev_sec, file);
2332 if (debug_displays [abbrev_sec].section.start == NULL)
2333 {
2334 warn (_("Unable to locate %s section!\n"),
2335 debug_displays [abbrev_sec].section.name);
2336 return 0;
2337 }
2338
2339 for (section_begin = start, unit = 0; start < end; unit++)
2340 {
2341 DWARF2_Internal_CompUnit compunit;
2342 unsigned char *hdrptr;
2343 unsigned char *tags;
2344 int level, last_level, saved_level;
2345 dwarf_vma cu_offset;
2346 unsigned int offset_size;
2347 int initial_length_size;
2348 dwarf_vma signature_high = 0;
2349 dwarf_vma signature_low = 0;
2350 dwarf_vma type_offset = 0;
2351 struct cu_tu_set *this_set;
2352 dwarf_vma abbrev_base;
2353 size_t abbrev_size;
2354
2355 hdrptr = start;
2356
2357 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 4, end);
2358
2359 if (compunit.cu_length == 0xffffffff)
2360 {
2361 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 8, end);
2362 offset_size = 8;
2363 initial_length_size = 12;
2364 }
2365 else
2366 {
2367 offset_size = 4;
2368 initial_length_size = 4;
2369 }
2370
2371 SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end);
2372
2373 cu_offset = start - section_begin;
2374
2375 this_set = find_cu_tu_set_v2 (cu_offset, do_types);
2376
2377 SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
2378
2379 if (this_set == NULL)
2380 {
2381 abbrev_base = 0;
2382 abbrev_size = debug_displays [abbrev_sec].section.size;
2383 }
2384 else
2385 {
2386 abbrev_base = this_set->section_offsets [DW_SECT_ABBREV];
2387 abbrev_size = this_set->section_sizes [DW_SECT_ABBREV];
2388 }
2389
2390 SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
2391 /* PR 17512: file: 001-108546-0.001:0.1. */
2392 if (compunit.cu_pointer_size < 2 || compunit.cu_pointer_size > 8)
2393 {
2394 warn (_("Invalid pointer size (%d) in compunit header, using %d instead\n"),
2395 compunit.cu_pointer_size, offset_size);
2396 compunit.cu_pointer_size = offset_size;
2397 }
2398
2399 if (do_types)
2400 {
2401 SAFE_BYTE_GET64 (hdrptr, &signature_high, &signature_low, end);
2402 hdrptr += 8;
2403 SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end);
2404 }
2405
2406 if ((do_loc || do_debug_loc || do_debug_ranges)
2407 && num_debug_info_entries == 0
2408 && ! do_types)
2409 {
2410 debug_information [unit].cu_offset = cu_offset;
2411 debug_information [unit].pointer_size
2412 = compunit.cu_pointer_size;
2413 debug_information [unit].offset_size = offset_size;
2414 debug_information [unit].dwarf_version = compunit.cu_version;
2415 debug_information [unit].base_address = 0;
2416 debug_information [unit].addr_base = DEBUG_INFO_UNAVAILABLE;
2417 debug_information [unit].ranges_base = DEBUG_INFO_UNAVAILABLE;
2418 debug_information [unit].loc_offsets = NULL;
2419 debug_information [unit].have_frame_base = NULL;
2420 debug_information [unit].max_loc_offsets = 0;
2421 debug_information [unit].num_loc_offsets = 0;
2422 debug_information [unit].range_lists = NULL;
2423 debug_information [unit].max_range_lists= 0;
2424 debug_information [unit].num_range_lists = 0;
2425 }
2426
2427 if (!do_loc && dwarf_start_die == 0)
2428 {
2429 printf (_(" Compilation Unit @ offset 0x%s:\n"),
2430 dwarf_vmatoa ("x", cu_offset));
2431 printf (_(" Length: 0x%s (%s)\n"),
2432 dwarf_vmatoa ("x", compunit.cu_length),
2433 offset_size == 8 ? "64-bit" : "32-bit");
2434 printf (_(" Version: %d\n"), compunit.cu_version);
2435 printf (_(" Abbrev Offset: 0x%s\n"),
2436 dwarf_vmatoa ("x", compunit.cu_abbrev_offset));
2437 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
2438 if (do_types)
2439 {
2440 char buf[64];
2441
2442 printf (_(" Signature: 0x%s\n"),
2443 dwarf_vmatoa64 (signature_high, signature_low,
2444 buf, sizeof (buf)));
2445 printf (_(" Type Offset: 0x%s\n"),
2446 dwarf_vmatoa ("x", type_offset));
2447 }
2448 if (this_set != NULL)
2449 {
2450 dwarf_vma *offsets = this_set->section_offsets;
2451 size_t *sizes = this_set->section_sizes;
2452
2453 printf (_(" Section contributions:\n"));
2454 printf (_(" .debug_abbrev.dwo: 0x%s 0x%s\n"),
2455 dwarf_vmatoa ("x", offsets [DW_SECT_ABBREV]),
2456 dwarf_vmatoa ("x", sizes [DW_SECT_ABBREV]));
2457 printf (_(" .debug_line.dwo: 0x%s 0x%s\n"),
2458 dwarf_vmatoa ("x", offsets [DW_SECT_LINE]),
2459 dwarf_vmatoa ("x", sizes [DW_SECT_LINE]));
2460 printf (_(" .debug_loc.dwo: 0x%s 0x%s\n"),
2461 dwarf_vmatoa ("x", offsets [DW_SECT_LOC]),
2462 dwarf_vmatoa ("x", sizes [DW_SECT_LOC]));
2463 printf (_(" .debug_str_offsets.dwo: 0x%s 0x%s\n"),
2464 dwarf_vmatoa ("x", offsets [DW_SECT_STR_OFFSETS]),
2465 dwarf_vmatoa ("x", sizes [DW_SECT_STR_OFFSETS]));
2466 }
2467 }
2468
2469 if (cu_offset + compunit.cu_length + initial_length_size
2470 > section->size)
2471 {
2472 warn (_("Debug info is corrupted, length of CU at %s"
2473 " extends beyond end of section (length = %s)\n"),
2474 dwarf_vmatoa ("x", cu_offset),
2475 dwarf_vmatoa ("x", compunit.cu_length));
2476 num_units = unit;
2477 break;
2478 }
2479 tags = hdrptr;
2480 start += compunit.cu_length + initial_length_size;
2481
2482 if (start > end)
2483 {
2484 warn (_("Debug info is corrupt. CU at %s extends beyond end of section"),
2485 dwarf_vmatoa ("x", cu_offset));
2486 start = end;
2487 }
2488
2489 if (compunit.cu_version != 2
2490 && compunit.cu_version != 3
2491 && compunit.cu_version != 4)
2492 {
2493 warn (_("CU at offset %s contains corrupt or "
2494 "unsupported version number: %d.\n"),
2495 dwarf_vmatoa ("x", cu_offset), compunit.cu_version);
2496 continue;
2497 }
2498
2499 free_abbrevs ();
2500
2501 /* Process the abbrevs used by this compilation unit. */
2502 if (compunit.cu_abbrev_offset >= abbrev_size)
2503 warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"),
2504 (unsigned long) compunit.cu_abbrev_offset,
2505 (unsigned long) abbrev_size);
2506 /* PR 17531: file:4bcd9ce9. */
2507 else if ((abbrev_base + abbrev_size)
2508 > debug_displays [abbrev_sec].section.size)
2509 warn (_("Debug info is corrupted, abbrev size (%lx) is larger than abbrev section size (%lx)\n"),
2510 (unsigned long) abbrev_base + abbrev_size,
2511 (unsigned long) debug_displays [abbrev_sec].section.size);
2512 else
2513 process_abbrev_section
2514 (((unsigned char *) debug_displays [abbrev_sec].section.start
2515 + abbrev_base + compunit.cu_abbrev_offset),
2516 ((unsigned char *) debug_displays [abbrev_sec].section.start
2517 + abbrev_base + abbrev_size));
2518
2519 level = 0;
2520 last_level = level;
2521 saved_level = -1;
2522 while (tags < start)
2523 {
2524 unsigned int bytes_read;
2525 unsigned long abbrev_number;
2526 unsigned long die_offset;
2527 abbrev_entry *entry;
2528 abbrev_attr *attr;
2529 int do_printing = 1;
2530
2531 die_offset = tags - section_begin;
2532
2533 abbrev_number = read_uleb128 (tags, & bytes_read, start);
2534 tags += bytes_read;
2535
2536 /* A null DIE marks the end of a list of siblings or it may also be
2537 a section padding. */
2538 if (abbrev_number == 0)
2539 {
2540 /* Check if it can be a section padding for the last CU. */
2541 if (level == 0 && start == end)
2542 {
2543 unsigned char *chk;
2544
2545 for (chk = tags; chk < start; chk++)
2546 if (*chk != 0)
2547 break;
2548 if (chk == start)
2549 break;
2550 }
2551
2552 if (!do_loc && die_offset >= dwarf_start_die
2553 && (dwarf_cutoff_level == -1
2554 || level < dwarf_cutoff_level))
2555 printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
2556 level, die_offset);
2557
2558 --level;
2559 if (level < 0)
2560 {
2561 static unsigned num_bogus_warns = 0;
2562
2563 if (num_bogus_warns < 3)
2564 {
2565 warn (_("Bogus end-of-siblings marker detected at offset %lx in %s section\n"),
2566 die_offset, section->name);
2567 num_bogus_warns ++;
2568 if (num_bogus_warns == 3)
2569 warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
2570 }
2571 }
2572 if (dwarf_start_die != 0 && level < saved_level)
2573 return 1;
2574 continue;
2575 }
2576
2577 if (!do_loc)
2578 {
2579 if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
2580 do_printing = 0;
2581 else
2582 {
2583 if (dwarf_start_die != 0 && die_offset == dwarf_start_die)
2584 saved_level = level;
2585 do_printing = (dwarf_cutoff_level == -1
2586 || level < dwarf_cutoff_level);
2587 if (do_printing)
2588 printf (_(" <%d><%lx>: Abbrev Number: %lu"),
2589 level, die_offset, abbrev_number);
2590 else if (dwarf_cutoff_level == -1
2591 || last_level < dwarf_cutoff_level)
2592 printf (_(" <%d><%lx>: ...\n"), level, die_offset);
2593 last_level = level;
2594 }
2595 }
2596
2597 /* Scan through the abbreviation list until we reach the
2598 correct entry. */
2599 for (entry = first_abbrev;
2600 entry && entry->entry != abbrev_number;
2601 entry = entry->next)
2602 continue;
2603
2604 if (entry == NULL)
2605 {
2606 if (!do_loc && do_printing)
2607 {
2608 printf ("\n");
2609 fflush (stdout);
2610 }
2611 warn (_("DIE at offset 0x%lx refers to abbreviation number %lu which does not exist\n"),
2612 die_offset, abbrev_number);
2613 return 0;
2614 }
2615
2616 if (!do_loc && do_printing)
2617 printf (" (%s)\n", get_TAG_name (entry->tag));
2618
2619 switch (entry->tag)
2620 {
2621 default:
2622 need_base_address = 0;
2623 break;
2624 case DW_TAG_compile_unit:
2625 need_base_address = 1;
2626 break;
2627 case DW_TAG_entry_point:
2628 case DW_TAG_subprogram:
2629 need_base_address = 0;
2630 /* Assuming that there is no DW_AT_frame_base. */
2631 have_frame_base = 0;
2632 break;
2633 }
2634
2635 for (attr = entry->first_attr;
2636 attr && attr->attribute;
2637 attr = attr->next)
2638 {
2639 debug_info *arg;
2640
2641 if (! do_loc && do_printing)
2642 /* Show the offset from where the tag was extracted. */
2643 printf (" <%lx>", (unsigned long)(tags - section_begin));
2644
2645 if (debug_information && unit < alloc_num_debug_info_entries)
2646 arg = debug_information + unit;
2647 else
2648 arg = NULL;
2649
2650 tags = read_and_display_attr (attr->attribute,
2651 attr->form,
2652 tags,
2653 end,
2654 cu_offset,
2655 compunit.cu_pointer_size,
2656 offset_size,
2657 compunit.cu_version,
2658 arg,
2659 do_loc || ! do_printing,
2660 section,
2661 this_set);
2662 }
2663
2664 if (entry->children)
2665 ++level;
2666 }
2667 }
2668
2669 /* Set num_debug_info_entries here so that it can be used to check if
2670 we need to process .debug_loc and .debug_ranges sections. */
2671 if ((do_loc || do_debug_loc || do_debug_ranges)
2672 && num_debug_info_entries == 0
2673 && ! do_types)
2674 {
2675 if (num_units > alloc_num_debug_info_entries)
2676 num_debug_info_entries = alloc_num_debug_info_entries;
2677 else
2678 num_debug_info_entries = num_units;
2679 }
2680
2681 if (!do_loc)
2682 printf ("\n");
2683
2684 return 1;
2685 }
2686
2687 /* Locate and scan the .debug_info section in the file and record the pointer
2688 sizes and offsets for the compilation units in it. Usually an executable
2689 will have just one pointer size, but this is not guaranteed, and so we try
2690 not to make any assumptions. Returns zero upon failure, or the number of
2691 compilation units upon success. */
2692
2693 static unsigned int
2694 load_debug_info (void * file)
2695 {
2696 /* Reset the last pointer size so that we can issue correct error
2697 messages if we are displaying the contents of more than one section. */
2698 last_pointer_size = 0;
2699 warned_about_missing_comp_units = FALSE;
2700
2701 /* If we have already tried and failed to load the .debug_info
2702 section then do not bother to repeat the task. */
2703 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
2704 return 0;
2705
2706 /* If we already have the information there is nothing else to do. */
2707 if (num_debug_info_entries > 0)
2708 return num_debug_info_entries;
2709
2710 /* If this is a DWARF package file, load the CU and TU indexes. */
2711 load_cu_tu_indexes (file);
2712
2713 if (load_debug_section (info, file)
2714 && process_debug_info (&debug_displays [info].section, file, abbrev, 1, 0))
2715 return num_debug_info_entries;
2716
2717 if (load_debug_section (info_dwo, file)
2718 && process_debug_info (&debug_displays [info_dwo].section, file,
2719 abbrev_dwo, 1, 0))
2720 return num_debug_info_entries;
2721
2722 num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
2723 return 0;
2724 }
2725
2726 /* Read a DWARF .debug_line section header starting at DATA.
2727 Upon success returns an updated DATA pointer and the LINFO
2728 structure and the END_OF_SEQUENCE pointer will be filled in.
2729 Otherwise returns NULL. */
2730
2731 static unsigned char *
2732 read_debug_line_header (struct dwarf_section * section,
2733 unsigned char * data,
2734 unsigned char * end,
2735 DWARF2_Internal_LineInfo * linfo,
2736 unsigned char ** end_of_sequence)
2737 {
2738 unsigned char *hdrptr;
2739 unsigned int offset_size;
2740 unsigned int initial_length_size;
2741
2742 /* Extract information from the Line Number Program Header.
2743 (section 6.2.4 in the Dwarf3 doc). */
2744 hdrptr = data;
2745
2746 /* Get and check the length of the block. */
2747 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 4, end);
2748
2749 if (linfo->li_length == 0xffffffff)
2750 {
2751 /* This section is 64-bit DWARF 3. */
2752 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 8, end);
2753 offset_size = 8;
2754 initial_length_size = 12;
2755 }
2756 else
2757 {
2758 offset_size = 4;
2759 initial_length_size = 4;
2760 }
2761
2762 if (linfo->li_length + initial_length_size > section->size)
2763 {
2764 /* If the length is just a bias against the initial_length_size then
2765 this means that the field has a relocation against it which has not
2766 been applied. (Ie we are dealing with an object file, not a linked
2767 binary). Do not complain but instead assume that the rest of the
2768 section applies to this particular header. */
2769 if (linfo->li_length == - initial_length_size)
2770 {
2771 linfo->li_length = section->size - initial_length_size;
2772 }
2773 else
2774 {
2775 warn (_("The line info appears to be corrupt - the section is too small\n"));
2776 return NULL;
2777 }
2778 }
2779
2780 /* Get and check the version number. */
2781 SAFE_BYTE_GET_AND_INC (linfo->li_version, hdrptr, 2, end);
2782
2783 if (linfo->li_version != 2
2784 && linfo->li_version != 3
2785 && linfo->li_version != 4)
2786 {
2787 warn (_("Only DWARF version 2, 3 and 4 line info is currently supported.\n"));
2788 return NULL;
2789 }
2790
2791 SAFE_BYTE_GET_AND_INC (linfo->li_prologue_length, hdrptr, offset_size, end);
2792 SAFE_BYTE_GET_AND_INC (linfo->li_min_insn_length, hdrptr, 1, end);
2793
2794 if (linfo->li_version >= 4)
2795 {
2796 SAFE_BYTE_GET_AND_INC (linfo->li_max_ops_per_insn, hdrptr, 1, end);
2797
2798 if (linfo->li_max_ops_per_insn == 0)
2799 {
2800 warn (_("Invalid maximum operations per insn.\n"));
2801 return NULL;
2802 }
2803 }
2804 else
2805 linfo->li_max_ops_per_insn = 1;
2806
2807 SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end);
2808 SAFE_SIGNED_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
2809 SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end);
2810 SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end);
2811
2812 * end_of_sequence = data + linfo->li_length + initial_length_size;
2813 /* PR 17512: file:002-117414-0.004. */
2814 if (* end_of_sequence > end)
2815 {
2816 warn (_("Line length %s extends beyond end of section\n"),
2817 dwarf_vmatoa ("u", linfo->li_length));
2818 * end_of_sequence = end;
2819 return NULL;
2820 }
2821
2822 return hdrptr;
2823 }
2824
2825 static int
2826 display_debug_lines_raw (struct dwarf_section *section,
2827 unsigned char *data,
2828 unsigned char *end)
2829 {
2830 unsigned char *start = section->start;
2831
2832 printf (_("Raw dump of debug contents of section %s:\n\n"),
2833 section->name);
2834
2835 while (data < end)
2836 {
2837 static DWARF2_Internal_LineInfo saved_linfo;
2838 DWARF2_Internal_LineInfo linfo;
2839 unsigned char *standard_opcodes;
2840 unsigned char *end_of_sequence;
2841 unsigned int last_dir_entry = 0;
2842 int i;
2843
2844 if (const_strneq (section->name, ".debug_line.")
2845 /* Note: the following does not apply to .debug_line.dwo sections.
2846 These are full debug_line sections. */
2847 && strcmp (section->name, ".debug_line.dwo") != 0)
2848 {
2849 /* Sections named .debug_line.<foo> are fragments of a .debug_line
2850 section containing just the Line Number Statements. They are
2851 created by the assembler and intended to be used alongside gcc's
2852 -ffunction-sections command line option. When the linker's
2853 garbage collection decides to discard a .text.<foo> section it
2854 can then also discard the line number information in .debug_line.<foo>.
2855
2856 Since the section is a fragment it does not have the details
2857 needed to fill out a LineInfo structure, so instead we use the
2858 details from the last full debug_line section that we processed. */
2859 end_of_sequence = end;
2860 standard_opcodes = NULL;
2861 linfo = saved_linfo;
2862 /* PR 17531: file: 0522b371. */
2863 if (linfo.li_line_range == 0)
2864 {
2865 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
2866 return 0;
2867 }
2868 reset_state_machine (linfo.li_default_is_stmt);
2869 }
2870 else
2871 {
2872 unsigned char * hdrptr;
2873
2874 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
2875 & end_of_sequence)) == NULL)
2876 return 0;
2877
2878 printf (_(" Offset: 0x%lx\n"), (long)(data - start));
2879 printf (_(" Length: %ld\n"), (long) linfo.li_length);
2880 printf (_(" DWARF Version: %d\n"), linfo.li_version);
2881 printf (_(" Prologue Length: %d\n"), (int) linfo.li_prologue_length);
2882 printf (_(" Minimum Instruction Length: %d\n"), linfo.li_min_insn_length);
2883 if (linfo.li_version >= 4)
2884 printf (_(" Maximum Ops per Instruction: %d\n"), linfo.li_max_ops_per_insn);
2885 printf (_(" Initial value of 'is_stmt': %d\n"), linfo.li_default_is_stmt);
2886 printf (_(" Line Base: %d\n"), linfo.li_line_base);
2887 printf (_(" Line Range: %d\n"), linfo.li_line_range);
2888 printf (_(" Opcode Base: %d\n"), linfo.li_opcode_base);
2889
2890 /* PR 17512: file: 1665-6428-0.004. */
2891 if (linfo.li_line_range == 0)
2892 {
2893 warn (_("Line range of 0 is invalid, using 1 instead\n"));
2894 linfo.li_line_range = 1;
2895 }
2896
2897 reset_state_machine (linfo.li_default_is_stmt);
2898
2899 /* Display the contents of the Opcodes table. */
2900 standard_opcodes = hdrptr;
2901
2902 /* PR 17512: file: 002-417945-0.004. */
2903 if (standard_opcodes + linfo.li_opcode_base >= end)
2904 {
2905 warn (_("Line Base extends beyond end of section\n"));
2906 return 0;
2907 }
2908
2909 printf (_("\n Opcodes:\n"));
2910
2911 for (i = 1; i < linfo.li_opcode_base; i++)
2912 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
2913
2914 /* Display the contents of the Directory table. */
2915 data = standard_opcodes + linfo.li_opcode_base - 1;
2916
2917 if (*data == 0)
2918 printf (_("\n The Directory Table is empty.\n"));
2919 else
2920 {
2921 printf (_("\n The Directory Table (offset 0x%lx):\n"),
2922 (long)(data - start));
2923
2924 while (data < end && *data != 0)
2925 {
2926 printf (" %d\t%.*s\n", ++last_dir_entry, (int) (end - data), data);
2927
2928 data += strnlen ((char *) data, end - data) + 1;
2929 }
2930
2931 /* PR 17512: file: 002-132094-0.004. */
2932 if (data >= end - 1)
2933 break;
2934 }
2935
2936 /* Skip the NUL at the end of the table. */
2937 data++;
2938
2939 /* Display the contents of the File Name table. */
2940 if (*data == 0)
2941 printf (_("\n The File Name Table is empty.\n"));
2942 else
2943 {
2944 printf (_("\n The File Name Table (offset 0x%lx):\n"),
2945 (long)(data - start));
2946 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
2947
2948 while (data < end && *data != 0)
2949 {
2950 unsigned char *name;
2951 unsigned int bytes_read;
2952
2953 printf (" %d\t", ++state_machine_regs.last_file_entry);
2954 name = data;
2955 data += strnlen ((char *) data, end - data) + 1;
2956
2957 printf ("%s\t",
2958 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2959 data += bytes_read;
2960 printf ("%s\t",
2961 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2962 data += bytes_read;
2963 printf ("%s\t",
2964 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2965 data += bytes_read;
2966 printf ("%.*s\n", (int)(end - name), name);
2967
2968 if (data == end)
2969 {
2970 warn (_("Corrupt file name table entry\n"));
2971 break;
2972 }
2973 }
2974 }
2975
2976 /* Skip the NUL at the end of the table. */
2977 data++;
2978 putchar ('\n');
2979 saved_linfo = linfo;
2980 }
2981
2982 /* Now display the statements. */
2983 if (data >= end_of_sequence)
2984 printf (_(" No Line Number Statements.\n"));
2985 else
2986 {
2987 printf (_(" Line Number Statements:\n"));
2988
2989 while (data < end_of_sequence)
2990 {
2991 unsigned char op_code;
2992 dwarf_signed_vma adv;
2993 dwarf_vma uladv;
2994 unsigned int bytes_read;
2995
2996 printf (" [0x%08lx]", (long)(data - start));
2997
2998 op_code = *data++;
2999
3000 if (op_code >= linfo.li_opcode_base)
3001 {
3002 op_code -= linfo.li_opcode_base;
3003 uladv = (op_code / linfo.li_line_range);
3004 if (linfo.li_max_ops_per_insn == 1)
3005 {
3006 uladv *= linfo.li_min_insn_length;
3007 state_machine_regs.address += uladv;
3008 printf (_(" Special opcode %d: "
3009 "advance Address by %s to 0x%s"),
3010 op_code, dwarf_vmatoa ("u", uladv),
3011 dwarf_vmatoa ("x", state_machine_regs.address));
3012 }
3013 else
3014 {
3015 state_machine_regs.address
3016 += ((state_machine_regs.op_index + uladv)
3017 / linfo.li_max_ops_per_insn)
3018 * linfo.li_min_insn_length;
3019 state_machine_regs.op_index
3020 = (state_machine_regs.op_index + uladv)
3021 % linfo.li_max_ops_per_insn;
3022 printf (_(" Special opcode %d: "
3023 "advance Address by %s to 0x%s[%d]"),
3024 op_code, dwarf_vmatoa ("u", uladv),
3025 dwarf_vmatoa ("x", state_machine_regs.address),
3026 state_machine_regs.op_index);
3027 }
3028 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
3029 state_machine_regs.line += adv;
3030 printf (_(" and Line by %s to %d\n"),
3031 dwarf_vmatoa ("d", adv), state_machine_regs.line);
3032 }
3033 else switch (op_code)
3034 {
3035 case DW_LNS_extended_op:
3036 data += process_extended_line_op (data, linfo.li_default_is_stmt, end);
3037 break;
3038
3039 case DW_LNS_copy:
3040 printf (_(" Copy\n"));
3041 break;
3042
3043 case DW_LNS_advance_pc:
3044 uladv = read_uleb128 (data, & bytes_read, end);
3045 data += bytes_read;
3046 if (linfo.li_max_ops_per_insn == 1)
3047 {
3048 uladv *= linfo.li_min_insn_length;
3049 state_machine_regs.address += uladv;
3050 printf (_(" Advance PC by %s to 0x%s\n"),
3051 dwarf_vmatoa ("u", uladv),
3052 dwarf_vmatoa ("x", state_machine_regs.address));
3053 }
3054 else
3055 {
3056 state_machine_regs.address
3057 += ((state_machine_regs.op_index + uladv)
3058 / linfo.li_max_ops_per_insn)
3059 * linfo.li_min_insn_length;
3060 state_machine_regs.op_index
3061 = (state_machine_regs.op_index + uladv)
3062 % linfo.li_max_ops_per_insn;
3063 printf (_(" Advance PC by %s to 0x%s[%d]\n"),
3064 dwarf_vmatoa ("u", uladv),
3065 dwarf_vmatoa ("x", state_machine_regs.address),
3066 state_machine_regs.op_index);
3067 }
3068 break;
3069
3070 case DW_LNS_advance_line:
3071 adv = read_sleb128 (data, & bytes_read, end);
3072 data += bytes_read;
3073 state_machine_regs.line += adv;
3074 printf (_(" Advance Line by %s to %d\n"),
3075 dwarf_vmatoa ("d", adv),
3076 state_machine_regs.line);
3077 break;
3078
3079 case DW_LNS_set_file:
3080 adv = read_uleb128 (data, & bytes_read, end);
3081 data += bytes_read;
3082 printf (_(" Set File Name to entry %s in the File Name Table\n"),
3083 dwarf_vmatoa ("d", adv));
3084 state_machine_regs.file = adv;
3085 break;
3086
3087 case DW_LNS_set_column:
3088 uladv = read_uleb128 (data, & bytes_read, end);
3089 data += bytes_read;
3090 printf (_(" Set column to %s\n"),
3091 dwarf_vmatoa ("u", uladv));
3092 state_machine_regs.column = uladv;
3093 break;
3094
3095 case DW_LNS_negate_stmt:
3096 adv = state_machine_regs.is_stmt;
3097 adv = ! adv;
3098 printf (_(" Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv));
3099 state_machine_regs.is_stmt = adv;
3100 break;
3101
3102 case DW_LNS_set_basic_block:
3103 printf (_(" Set basic block\n"));
3104 state_machine_regs.basic_block = 1;
3105 break;
3106
3107 case DW_LNS_const_add_pc:
3108 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
3109 if (linfo.li_max_ops_per_insn)
3110 {
3111 uladv *= linfo.li_min_insn_length;
3112 state_machine_regs.address += uladv;
3113 printf (_(" Advance PC by constant %s to 0x%s\n"),
3114 dwarf_vmatoa ("u", uladv),
3115 dwarf_vmatoa ("x", state_machine_regs.address));
3116 }
3117 else
3118 {
3119 state_machine_regs.address
3120 += ((state_machine_regs.op_index + uladv)
3121 / linfo.li_max_ops_per_insn)
3122 * linfo.li_min_insn_length;
3123 state_machine_regs.op_index
3124 = (state_machine_regs.op_index + uladv)
3125 % linfo.li_max_ops_per_insn;
3126 printf (_(" Advance PC by constant %s to 0x%s[%d]\n"),
3127 dwarf_vmatoa ("u", uladv),
3128 dwarf_vmatoa ("x", state_machine_regs.address),
3129 state_machine_regs.op_index);
3130 }
3131 break;
3132
3133 case DW_LNS_fixed_advance_pc:
3134 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
3135 state_machine_regs.address += uladv;
3136 state_machine_regs.op_index = 0;
3137 printf (_(" Advance PC by fixed size amount %s to 0x%s\n"),
3138 dwarf_vmatoa ("u", uladv),
3139 dwarf_vmatoa ("x", state_machine_regs.address));
3140 break;
3141
3142 case DW_LNS_set_prologue_end:
3143 printf (_(" Set prologue_end to true\n"));
3144 break;
3145
3146 case DW_LNS_set_epilogue_begin:
3147 printf (_(" Set epilogue_begin to true\n"));
3148 break;
3149
3150 case DW_LNS_set_isa:
3151 uladv = read_uleb128 (data, & bytes_read, end);
3152 data += bytes_read;
3153 printf (_(" Set ISA to %s\n"), dwarf_vmatoa ("u", uladv));
3154 break;
3155
3156 default:
3157 printf (_(" Unknown opcode %d with operands: "), op_code);
3158
3159 if (standard_opcodes != NULL)
3160 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
3161 {
3162 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
3163 &bytes_read, end)),
3164 i == 1 ? "" : ", ");
3165 data += bytes_read;
3166 }
3167 putchar ('\n');
3168 break;
3169 }
3170 }
3171 putchar ('\n');
3172 }
3173 }
3174
3175 return 1;
3176 }
3177
3178 typedef struct
3179 {
3180 unsigned char *name;
3181 unsigned int directory_index;
3182 unsigned int modification_date;
3183 unsigned int length;
3184 } File_Entry;
3185
3186 /* Output a decoded representation of the .debug_line section. */
3187
3188 static int
3189 display_debug_lines_decoded (struct dwarf_section *section,
3190 unsigned char *data,
3191 unsigned char *end)
3192 {
3193 static DWARF2_Internal_LineInfo saved_linfo;
3194
3195 printf (_("Decoded dump of debug contents of section %s:\n\n"),
3196 section->name);
3197
3198 while (data < end)
3199 {
3200 /* This loop amounts to one iteration per compilation unit. */
3201 DWARF2_Internal_LineInfo linfo;
3202 unsigned char *standard_opcodes;
3203 unsigned char *end_of_sequence;
3204 int i;
3205 File_Entry *file_table = NULL;
3206 unsigned int n_files = 0;
3207 unsigned char **directory_table = NULL;
3208 unsigned int n_directories = 0;
3209
3210 if (const_strneq (section->name, ".debug_line.")
3211 /* Note: the following does not apply to .debug_line.dwo sections.
3212 These are full debug_line sections. */
3213 && strcmp (section->name, ".debug_line.dwo") != 0)
3214 {
3215 /* See comment in display_debug_lines_raw(). */
3216 end_of_sequence = end;
3217 standard_opcodes = NULL;
3218 linfo = saved_linfo;
3219 /* PR 17531: file: 0522b371. */
3220 if (linfo.li_line_range == 0)
3221 {
3222 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
3223 return 0;
3224 }
3225 reset_state_machine (linfo.li_default_is_stmt);
3226 }
3227 else
3228 {
3229 unsigned char *hdrptr;
3230
3231 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
3232 & end_of_sequence)) == NULL)
3233 return 0;
3234
3235 /* PR 17531: file: 0522b371. */
3236 if (linfo.li_line_range == 0)
3237 {
3238 warn (_("Line range of 0 is invalid, using 1 instead\n"));
3239 linfo.li_line_range = 1;
3240 }
3241 reset_state_machine (linfo.li_default_is_stmt);
3242
3243 /* Save a pointer to the contents of the Opcodes table. */
3244 standard_opcodes = hdrptr;
3245
3246 /* Traverse the Directory table just to count entries. */
3247 data = standard_opcodes + linfo.li_opcode_base - 1;
3248 if (*data != 0)
3249 {
3250 unsigned char *ptr_directory_table = data;
3251
3252 while (*data != 0)
3253 {
3254 data += strnlen ((char *) data, end - data) + 1;
3255 n_directories++;
3256 }
3257
3258 /* Go through the directory table again to save the directories. */
3259 directory_table = (unsigned char **)
3260 xmalloc (n_directories * sizeof (unsigned char *));
3261
3262 i = 0;
3263 while (*ptr_directory_table != 0)
3264 {
3265 directory_table[i] = ptr_directory_table;
3266 ptr_directory_table += strnlen ((char *) ptr_directory_table,
3267 ptr_directory_table - end) + 1;
3268 i++;
3269 }
3270 }
3271 /* Skip the NUL at the end of the table. */
3272 data++;
3273
3274 /* Traverse the File Name table just to count the entries. */
3275 if (*data != 0)
3276 {
3277 unsigned char *ptr_file_name_table = data;
3278
3279 while (*data != 0)
3280 {
3281 unsigned int bytes_read;
3282
3283 /* Skip Name, directory index, last modification time and length
3284 of file. */
3285 data += strnlen ((char *) data, end - data) + 1;
3286 read_uleb128 (data, & bytes_read, end);
3287 data += bytes_read;
3288 read_uleb128 (data, & bytes_read, end);
3289 data += bytes_read;
3290 read_uleb128 (data, & bytes_read, end);
3291 data += bytes_read;
3292
3293 n_files++;
3294 }
3295
3296 /* Go through the file table again to save the strings. */
3297 file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
3298
3299 i = 0;
3300 while (*ptr_file_name_table != 0)
3301 {
3302 unsigned int bytes_read;
3303
3304 file_table[i].name = ptr_file_name_table;
3305 ptr_file_name_table += strnlen ((char *) ptr_file_name_table,
3306 end - ptr_file_name_table) + 1;
3307
3308 /* We are not interested in directory, time or size. */
3309 file_table[i].directory_index = read_uleb128 (ptr_file_name_table,
3310 & bytes_read, end);
3311 ptr_file_name_table += bytes_read;
3312 file_table[i].modification_date = read_uleb128 (ptr_file_name_table,
3313 & bytes_read, end);
3314 ptr_file_name_table += bytes_read;
3315 file_table[i].length = read_uleb128 (ptr_file_name_table, & bytes_read, end);
3316 ptr_file_name_table += bytes_read;
3317 i++;
3318 }
3319 i = 0;
3320
3321 /* Print the Compilation Unit's name and a header. */
3322 if (directory_table == NULL)
3323 {
3324 printf (_("CU: %s:\n"), file_table[0].name);
3325 printf (_("File name Line number Starting address\n"));
3326 }
3327 else
3328 {
3329 unsigned int ix = file_table[0].directory_index;
3330 const char *directory = ix ? (char *)directory_table[ix - 1] : ".";
3331
3332 if (do_wide || strlen (directory) < 76)
3333 printf (_("CU: %s/%s:\n"), directory, file_table[0].name);
3334 else
3335 printf ("%s:\n", file_table[0].name);
3336
3337 printf (_("File name Line number Starting address\n"));
3338 }
3339 }
3340
3341 /* Skip the NUL at the end of the table. */
3342 data++;
3343
3344 saved_linfo = linfo;
3345 }
3346
3347 /* This loop iterates through the Dwarf Line Number Program. */
3348 while (data < end_of_sequence)
3349 {
3350 unsigned char op_code;
3351 int adv;
3352 unsigned long int uladv;
3353 unsigned int bytes_read;
3354 int is_special_opcode = 0;
3355
3356 op_code = *data++;
3357
3358 if (op_code >= linfo.li_opcode_base)
3359 {
3360 op_code -= linfo.li_opcode_base;
3361 uladv = (op_code / linfo.li_line_range);
3362 if (linfo.li_max_ops_per_insn == 1)
3363 {
3364 uladv *= linfo.li_min_insn_length;
3365 state_machine_regs.address += uladv;
3366 }
3367 else
3368 {
3369 state_machine_regs.address
3370 += ((state_machine_regs.op_index + uladv)
3371 / linfo.li_max_ops_per_insn)
3372 * linfo.li_min_insn_length;
3373 state_machine_regs.op_index
3374 = (state_machine_regs.op_index + uladv)
3375 % linfo.li_max_ops_per_insn;
3376 }
3377
3378 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
3379 state_machine_regs.line += adv;
3380 is_special_opcode = 1;
3381 }
3382 else switch (op_code)
3383 {
3384 case DW_LNS_extended_op:
3385 {
3386 unsigned int ext_op_code_len;
3387 unsigned char ext_op_code;
3388 unsigned char *op_code_data = data;
3389
3390 ext_op_code_len = read_uleb128 (op_code_data, &bytes_read,
3391 end_of_sequence);
3392 op_code_data += bytes_read;
3393
3394 if (ext_op_code_len == 0)
3395 {
3396 warn (_("Badly formed extended line op encountered!\n"));
3397 break;
3398 }
3399 ext_op_code_len += bytes_read;
3400 ext_op_code = *op_code_data++;
3401
3402 switch (ext_op_code)
3403 {
3404 case DW_LNE_end_sequence:
3405 reset_state_machine (linfo.li_default_is_stmt);
3406 break;
3407 case DW_LNE_set_address:
3408 SAFE_BYTE_GET_AND_INC (state_machine_regs.address,
3409 op_code_data,
3410 ext_op_code_len - bytes_read - 1,
3411 end);
3412 state_machine_regs.op_index = 0;
3413 break;
3414 case DW_LNE_define_file:
3415 {
3416 file_table = (File_Entry *) xrealloc
3417 (file_table, (n_files + 1) * sizeof (File_Entry));
3418
3419 ++state_machine_regs.last_file_entry;
3420 /* Source file name. */
3421 file_table[n_files].name = op_code_data;
3422 op_code_data += strlen ((char *) op_code_data) + 1;
3423 /* Directory index. */
3424 file_table[n_files].directory_index =
3425 read_uleb128 (op_code_data, & bytes_read,
3426 end_of_sequence);
3427 op_code_data += bytes_read;
3428 /* Last modification time. */
3429 file_table[n_files].modification_date =
3430 read_uleb128 (op_code_data, & bytes_read,
3431 end_of_sequence);
3432 op_code_data += bytes_read;
3433 /* File length. */
3434 file_table[n_files].length =
3435 read_uleb128 (op_code_data, & bytes_read,
3436 end_of_sequence);
3437
3438 n_files++;
3439 break;
3440 }
3441 case DW_LNE_set_discriminator:
3442 case DW_LNE_HP_set_sequence:
3443 /* Simply ignored. */
3444 break;
3445
3446 default:
3447 printf (_("UNKNOWN (%u): length %d\n"),
3448 ext_op_code, ext_op_code_len - bytes_read);
3449 break;
3450 }
3451 data += ext_op_code_len;
3452 break;
3453 }
3454 case DW_LNS_copy:
3455 break;
3456
3457 case DW_LNS_advance_pc:
3458 uladv = read_uleb128 (data, & bytes_read, end);
3459 data += bytes_read;
3460 if (linfo.li_max_ops_per_insn == 1)
3461 {
3462 uladv *= linfo.li_min_insn_length;
3463 state_machine_regs.address += uladv;
3464 }
3465 else
3466 {
3467 state_machine_regs.address
3468 += ((state_machine_regs.op_index + uladv)
3469 / linfo.li_max_ops_per_insn)
3470 * linfo.li_min_insn_length;
3471 state_machine_regs.op_index
3472 = (state_machine_regs.op_index + uladv)
3473 % linfo.li_max_ops_per_insn;
3474 }
3475 break;
3476
3477 case DW_LNS_advance_line:
3478 adv = read_sleb128 (data, & bytes_read, end);
3479 data += bytes_read;
3480 state_machine_regs.line += adv;
3481 break;
3482
3483 case DW_LNS_set_file:
3484 adv = read_uleb128 (data, & bytes_read, end);
3485 data += bytes_read;
3486 state_machine_regs.file = adv;
3487
3488 if (file_table == NULL)
3489 printf (_("\n [Use file table entry %d]\n"), state_machine_regs.file - 1);
3490 else if (file_table[state_machine_regs.file - 1].directory_index == 0)
3491 /* If directory index is 0, that means current directory. */
3492 printf ("\n./%s:[++]\n",
3493 file_table[state_machine_regs.file - 1].name);
3494 else if (directory_table == NULL)
3495 printf (_("\n [Use directory table entry %d]\n"),
3496 file_table[state_machine_regs.file - 1].directory_index - 1);
3497 else
3498 /* The directory index starts counting at 1. */
3499 printf ("\n%s/%s:\n",
3500 directory_table[file_table[state_machine_regs.file - 1].directory_index - 1],
3501 file_table[state_machine_regs.file - 1].name);
3502 break;
3503
3504 case DW_LNS_set_column:
3505 uladv = read_uleb128 (data, & bytes_read, end);
3506 data += bytes_read;
3507 state_machine_regs.column = uladv;
3508 break;
3509
3510 case DW_LNS_negate_stmt:
3511 adv = state_machine_regs.is_stmt;
3512 adv = ! adv;
3513 state_machine_regs.is_stmt = adv;
3514 break;
3515
3516 case DW_LNS_set_basic_block:
3517 state_machine_regs.basic_block = 1;
3518 break;
3519
3520 case DW_LNS_const_add_pc:
3521 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
3522 if (linfo.li_max_ops_per_insn == 1)
3523 {
3524 uladv *= linfo.li_min_insn_length;
3525 state_machine_regs.address += uladv;
3526 }
3527 else
3528 {
3529 state_machine_regs.address
3530 += ((state_machine_regs.op_index + uladv)
3531 / linfo.li_max_ops_per_insn)
3532 * linfo.li_min_insn_length;
3533 state_machine_regs.op_index
3534 = (state_machine_regs.op_index + uladv)
3535 % linfo.li_max_ops_per_insn;
3536 }
3537 break;
3538
3539 case DW_LNS_fixed_advance_pc:
3540 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
3541 state_machine_regs.address += uladv;
3542 state_machine_regs.op_index = 0;
3543 break;
3544
3545 case DW_LNS_set_prologue_end:
3546 break;
3547
3548 case DW_LNS_set_epilogue_begin:
3549 break;
3550
3551 case DW_LNS_set_isa:
3552 uladv = read_uleb128 (data, & bytes_read, end);
3553 data += bytes_read;
3554 printf (_(" Set ISA to %lu\n"), uladv);
3555 break;
3556
3557 default:
3558 printf (_(" Unknown opcode %d with operands: "), op_code);
3559
3560 if (standard_opcodes != NULL)
3561 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
3562 {
3563 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
3564 &bytes_read, end)),
3565 i == 1 ? "" : ", ");
3566 data += bytes_read;
3567 }
3568 putchar ('\n');
3569 break;
3570 }
3571
3572 /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
3573 to the DWARF address/line matrix. */
3574 if ((is_special_opcode) || (op_code == DW_LNE_end_sequence)
3575 || (op_code == DW_LNS_copy))
3576 {
3577 const unsigned int MAX_FILENAME_LENGTH = 35;
3578 char *fileName;
3579 char *newFileName = NULL;
3580 size_t fileNameLength;
3581
3582 if (file_table)
3583 fileName = (char *) file_table[state_machine_regs.file - 1].name;
3584 else
3585 fileName = "<unknown>";
3586
3587 fileNameLength = strlen (fileName);
3588
3589 if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
3590 {
3591 newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
3592 /* Truncate file name */
3593 strncpy (newFileName,
3594 fileName + fileNameLength - MAX_FILENAME_LENGTH,
3595 MAX_FILENAME_LENGTH + 1);
3596 }
3597 else
3598 {
3599 newFileName = (char *) xmalloc (fileNameLength + 1);
3600 strncpy (newFileName, fileName, fileNameLength + 1);
3601 }
3602
3603 if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
3604 {
3605 if (linfo.li_max_ops_per_insn == 1)
3606 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x\n",
3607 newFileName, state_machine_regs.line,
3608 state_machine_regs.address);
3609 else
3610 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x[%d]\n",
3611 newFileName, state_machine_regs.line,
3612 state_machine_regs.address,
3613 state_machine_regs.op_index);
3614 }
3615 else
3616 {
3617 if (linfo.li_max_ops_per_insn == 1)
3618 printf ("%s %11d %#18" DWARF_VMA_FMT "x\n",
3619 newFileName, state_machine_regs.line,
3620 state_machine_regs.address);
3621 else
3622 printf ("%s %11d %#18" DWARF_VMA_FMT "x[%d]\n",
3623 newFileName, state_machine_regs.line,
3624 state_machine_regs.address,
3625 state_machine_regs.op_index);
3626 }
3627
3628 if (op_code == DW_LNE_end_sequence)
3629 printf ("\n");
3630
3631 free (newFileName);
3632 }
3633 }
3634
3635 if (file_table)
3636 {
3637 free (file_table);
3638 file_table = NULL;
3639 n_files = 0;
3640 }
3641
3642 if (directory_table)
3643 {
3644 free (directory_table);
3645 directory_table = NULL;
3646 n_directories = 0;
3647 }
3648
3649 putchar ('\n');
3650 }
3651
3652 return 1;
3653 }
3654
3655 static int
3656 display_debug_lines (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
3657 {
3658 unsigned char *data = section->start;
3659 unsigned char *end = data + section->size;
3660 int retValRaw = 1;
3661 int retValDecoded = 1;
3662
3663 if (do_debug_lines == 0)
3664 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
3665
3666 if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
3667 retValRaw = display_debug_lines_raw (section, data, end);
3668
3669 if (do_debug_lines & FLAG_DEBUG_LINES_DECODED)
3670 retValDecoded = display_debug_lines_decoded (section, data, end);
3671
3672 if (!retValRaw || !retValDecoded)
3673 return 0;
3674
3675 return 1;
3676 }
3677
3678 static debug_info *
3679 find_debug_info_for_offset (unsigned long offset)
3680 {
3681 unsigned int i;
3682
3683 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
3684 return NULL;
3685
3686 for (i = 0; i < num_debug_info_entries; i++)
3687 if (debug_information[i].cu_offset == offset)
3688 return debug_information + i;
3689
3690 return NULL;
3691 }
3692
3693 static const char *
3694 get_gdb_index_symbol_kind_name (gdb_index_symbol_kind kind)
3695 {
3696 /* See gdb/gdb-index.h. */
3697 static const char * const kinds[] =
3698 {
3699 N_ ("no info"),
3700 N_ ("type"),
3701 N_ ("variable"),
3702 N_ ("function"),
3703 N_ ("other"),
3704 N_ ("unused5"),
3705 N_ ("unused6"),
3706 N_ ("unused7")
3707 };
3708
3709 return _ (kinds[kind]);
3710 }
3711
3712 static int
3713 display_debug_pubnames_worker (struct dwarf_section *section,
3714 void *file ATTRIBUTE_UNUSED,
3715 int is_gnu)
3716 {
3717 DWARF2_Internal_PubNames names;
3718 unsigned char *start = section->start;
3719 unsigned char *end = start + section->size;
3720
3721 /* It does not matter if this load fails,
3722 we test for that later on. */
3723 load_debug_info (file);
3724
3725 printf (_("Contents of the %s section:\n\n"), section->name);
3726
3727 while (start < end)
3728 {
3729 unsigned char *data;
3730 unsigned char *adr;
3731 dwarf_vma offset;
3732 unsigned int offset_size, initial_length_size;
3733
3734 data = start;
3735
3736 SAFE_BYTE_GET_AND_INC (names.pn_length, data, 4, end);
3737 if (names.pn_length == 0xffffffff)
3738 {
3739 SAFE_BYTE_GET_AND_INC (names.pn_length, data, 8, end);
3740 offset_size = 8;
3741 initial_length_size = 12;
3742 }
3743 else
3744 {
3745 offset_size = 4;
3746 initial_length_size = 4;
3747 }
3748
3749 SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end);
3750 SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end);
3751
3752 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
3753 && num_debug_info_entries > 0
3754 && find_debug_info_for_offset (names.pn_offset) == NULL)
3755 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
3756 (unsigned long) names.pn_offset, section->name);
3757
3758 SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, end);
3759
3760 adr = start + names.pn_length + initial_length_size;
3761 /* PR 17531: file: 7615b6b2. */
3762 if ((dwarf_signed_vma) names.pn_length < 0
3763 /* PR 17531: file: a5dbeaa7. */
3764 || adr < start)
3765 {
3766 warn (_("Negative length for public name: 0x%lx\n"), (long) names.pn_length);
3767 start = end;
3768 }
3769 else
3770 start = adr;
3771
3772 printf (_(" Length: %ld\n"),
3773 (long) names.pn_length);
3774 printf (_(" Version: %d\n"),
3775 names.pn_version);
3776 printf (_(" Offset into .debug_info section: 0x%lx\n"),
3777 (unsigned long) names.pn_offset);
3778 printf (_(" Size of area in .debug_info section: %ld\n"),
3779 (long) names.pn_size);
3780
3781 if (names.pn_version != 2 && names.pn_version != 3)
3782 {
3783 static int warned = 0;
3784
3785 if (! warned)
3786 {
3787 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
3788 warned = 1;
3789 }
3790
3791 continue;
3792 }
3793
3794 if (is_gnu)
3795 printf (_("\n Offset Kind Name\n"));
3796 else
3797 printf (_("\n Offset\tName\n"));
3798
3799 do
3800 {
3801 bfd_size_type maxprint;
3802
3803 SAFE_BYTE_GET (offset, data, offset_size, end);
3804
3805 if (offset != 0)
3806 {
3807 data += offset_size;
3808 if (data >= end)
3809 break;
3810 maxprint = (end - data) - 1;
3811
3812 if (is_gnu)
3813 {
3814 unsigned int kind_data;
3815 gdb_index_symbol_kind kind;
3816 const char *kind_name;
3817 int is_static;
3818
3819 SAFE_BYTE_GET (kind_data, data, 1, end);
3820 data++;
3821 maxprint --;
3822 /* GCC computes the kind as the upper byte in the CU index
3823 word, and then right shifts it by the CU index size.
3824 Left shift KIND to where the gdb-index.h accessor macros
3825 can use it. */
3826 kind_data <<= GDB_INDEX_CU_BITSIZE;
3827 kind = GDB_INDEX_SYMBOL_KIND_VALUE (kind_data);
3828 kind_name = get_gdb_index_symbol_kind_name (kind);
3829 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (kind_data);
3830 printf (" %-6lx %s,%-10s %.*s\n",
3831 (unsigned long) offset, is_static ? _("s") : _("g"),
3832 kind_name, (int) maxprint, data);
3833 }
3834 else
3835 printf (" %-6lx\t%.*s\n",
3836 (unsigned long) offset, (int) maxprint, data);
3837
3838 data += strnlen ((char *) data, maxprint) + 1;
3839 if (data >= end)
3840 break;
3841 }
3842 }
3843 while (offset != 0);
3844 }
3845
3846 printf ("\n");
3847 return 1;
3848 }
3849
3850 static int
3851 display_debug_pubnames (struct dwarf_section *section, void *file)
3852 {
3853 return display_debug_pubnames_worker (section, file, 0);
3854 }
3855
3856 static int
3857 display_debug_gnu_pubnames (struct dwarf_section *section, void *file)
3858 {
3859 return display_debug_pubnames_worker (section, file, 1);
3860 }
3861
3862 static int
3863 display_debug_macinfo (struct dwarf_section *section,
3864 void *file ATTRIBUTE_UNUSED)
3865 {
3866 unsigned char *start = section->start;
3867 unsigned char *end = start + section->size;
3868 unsigned char *curr = start;
3869 unsigned int bytes_read;
3870 enum dwarf_macinfo_record_type op;
3871
3872 printf (_("Contents of the %s section:\n\n"), section->name);
3873
3874 while (curr < end)
3875 {
3876 unsigned int lineno;
3877 const unsigned char *string;
3878
3879 op = (enum dwarf_macinfo_record_type) *curr;
3880 curr++;
3881
3882 switch (op)
3883 {
3884 case DW_MACINFO_start_file:
3885 {
3886 unsigned int filenum;
3887
3888 lineno = read_uleb128 (curr, & bytes_read, end);
3889 curr += bytes_read;
3890 filenum = read_uleb128 (curr, & bytes_read, end);
3891 curr += bytes_read;
3892
3893 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
3894 lineno, filenum);
3895 }
3896 break;
3897
3898 case DW_MACINFO_end_file:
3899 printf (_(" DW_MACINFO_end_file\n"));
3900 break;
3901
3902 case DW_MACINFO_define:
3903 lineno = read_uleb128 (curr, & bytes_read, end);
3904 curr += bytes_read;
3905 string = curr;
3906 curr += strnlen ((char *) string, end - string) + 1;
3907 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
3908 lineno, string);
3909 break;
3910
3911 case DW_MACINFO_undef:
3912 lineno = read_uleb128 (curr, & bytes_read, end);
3913 curr += bytes_read;
3914 string = curr;
3915 curr += strnlen ((char *) string, end - string) + 1;
3916 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
3917 lineno, string);
3918 break;
3919
3920 case DW_MACINFO_vendor_ext:
3921 {
3922 unsigned int constant;
3923
3924 constant = read_uleb128 (curr, & bytes_read, end);
3925 curr += bytes_read;
3926 string = curr;
3927 curr += strnlen ((char *) string, end - string) + 1;
3928 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
3929 constant, string);
3930 }
3931 break;
3932 }
3933 }
3934
3935 return 1;
3936 }
3937
3938 /* Given LINE_OFFSET into the .debug_line section, attempt to return
3939 filename and dirname corresponding to file name table entry with index
3940 FILEIDX. Return NULL on failure. */
3941
3942 static unsigned char *
3943 get_line_filename_and_dirname (dwarf_vma line_offset,
3944 dwarf_vma fileidx,
3945 unsigned char **dir_name)
3946 {
3947 struct dwarf_section *section = &debug_displays [line].section;
3948 unsigned char *hdrptr, *dirtable, *file_name;
3949 unsigned int offset_size, initial_length_size;
3950 unsigned int version, opcode_base, bytes_read;
3951 dwarf_vma length, diridx;
3952 const unsigned char * end;
3953
3954 *dir_name = NULL;
3955 if (section->start == NULL
3956 || line_offset >= section->size
3957 || fileidx == 0)
3958 return NULL;
3959
3960 hdrptr = section->start + line_offset;
3961 end = section->start + section->size;
3962
3963 SAFE_BYTE_GET_AND_INC (length, hdrptr, 4, end);
3964 if (length == 0xffffffff)
3965 {
3966 /* This section is 64-bit DWARF 3. */
3967 SAFE_BYTE_GET_AND_INC (length, hdrptr, 8, end);
3968 offset_size = 8;
3969 initial_length_size = 12;
3970 }
3971 else
3972 {
3973 offset_size = 4;
3974 initial_length_size = 4;
3975 }
3976 if (length + initial_length_size > section->size)
3977 return NULL;
3978
3979 SAFE_BYTE_GET_AND_INC (version, hdrptr, 2, end);
3980 if (version != 2 && version != 3 && version != 4)
3981 return NULL;
3982 hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length. */
3983 if (version >= 4)
3984 hdrptr++; /* Skip max_ops_per_insn. */
3985 hdrptr += 3; /* Skip default_is_stmt, line_base, line_range. */
3986
3987 SAFE_BYTE_GET_AND_INC (opcode_base, hdrptr, 1, end);
3988 if (opcode_base == 0)
3989 return NULL;
3990
3991 hdrptr += opcode_base - 1;
3992 dirtable = hdrptr;
3993 /* Skip over dirname table. */
3994 while (*hdrptr != '\0')
3995 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
3996 hdrptr++; /* Skip the NUL at the end of the table. */
3997 /* Now skip over preceding filename table entries. */
3998 for (; *hdrptr != '\0' && fileidx > 1; fileidx--)
3999 {
4000 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
4001 read_uleb128 (hdrptr, &bytes_read, end);
4002 hdrptr += bytes_read;
4003 read_uleb128 (hdrptr, &bytes_read, end);
4004 hdrptr += bytes_read;
4005 read_uleb128 (hdrptr, &bytes_read, end);
4006 hdrptr += bytes_read;
4007 }
4008 if (hdrptr == end || *hdrptr == '\0')
4009 return NULL;
4010 file_name = hdrptr;
4011 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
4012 diridx = read_uleb128 (hdrptr, &bytes_read, end);
4013 if (diridx == 0)
4014 return file_name;
4015 for (; *dirtable != '\0' && diridx > 1; diridx--)
4016 dirtable += strnlen ((char *) dirtable, end - dirtable) + 1;
4017 if (*dirtable == '\0')
4018 return NULL;
4019 *dir_name = dirtable;
4020 return file_name;
4021 }
4022
4023 static int
4024 display_debug_macro (struct dwarf_section *section,
4025 void *file)
4026 {
4027 unsigned char *start = section->start;
4028 unsigned char *end = start + section->size;
4029 unsigned char *curr = start;
4030 unsigned char *extended_op_buf[256];
4031 unsigned int bytes_read;
4032
4033 load_debug_section (str, file);
4034 load_debug_section (line, file);
4035
4036 printf (_("Contents of the %s section:\n\n"), section->name);
4037
4038 while (curr < end)
4039 {
4040 unsigned int lineno, version, flags;
4041 unsigned int offset_size = 4;
4042 const unsigned char *string;
4043 dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
4044 unsigned char **extended_ops = NULL;
4045
4046 SAFE_BYTE_GET_AND_INC (version, curr, 2, end);
4047 if (version != 4)
4048 {
4049 error (_("Only GNU extension to DWARF 4 of %s is currently supported.\n"),
4050 section->name);
4051 return 0;
4052 }
4053
4054 SAFE_BYTE_GET_AND_INC (flags, curr, 1, end);
4055 if (flags & 1)
4056 offset_size = 8;
4057 printf (_(" Offset: 0x%lx\n"),
4058 (unsigned long) sec_offset);
4059 printf (_(" Version: %d\n"), version);
4060 printf (_(" Offset size: %d\n"), offset_size);
4061 if (flags & 2)
4062 {
4063 SAFE_BYTE_GET_AND_INC (line_offset, curr, offset_size, end);
4064 printf (_(" Offset into .debug_line: 0x%lx\n"),
4065 (unsigned long) line_offset);
4066 }
4067 if (flags & 4)
4068 {
4069 unsigned int i, count, op;
4070 dwarf_vma nargs, n;
4071
4072 SAFE_BYTE_GET_AND_INC (count, curr, 1, end);
4073
4074 memset (extended_op_buf, 0, sizeof (extended_op_buf));
4075 extended_ops = extended_op_buf;
4076 if (count)
4077 {
4078 printf (_(" Extension opcode arguments:\n"));
4079 for (i = 0; i < count; i++)
4080 {
4081 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
4082 extended_ops[op] = curr;
4083 nargs = read_uleb128 (curr, &bytes_read, end);
4084 curr += bytes_read;
4085 if (nargs == 0)
4086 printf (_(" DW_MACRO_GNU_%02x has no arguments\n"), op);
4087 else
4088 {
4089 printf (_(" DW_MACRO_GNU_%02x arguments: "), op);
4090 for (n = 0; n < nargs; n++)
4091 {
4092 unsigned int form;
4093
4094 SAFE_BYTE_GET_AND_INC (form, curr, 1, end);
4095 printf ("%s%s", get_FORM_name (form),
4096 n == nargs - 1 ? "\n" : ", ");
4097 switch (form)
4098 {
4099 case DW_FORM_data1:
4100 case DW_FORM_data2:
4101 case DW_FORM_data4:
4102 case DW_FORM_data8:
4103 case DW_FORM_sdata:
4104 case DW_FORM_udata:
4105 case DW_FORM_block:
4106 case DW_FORM_block1:
4107 case DW_FORM_block2:
4108 case DW_FORM_block4:
4109 case DW_FORM_flag:
4110 case DW_FORM_string:
4111 case DW_FORM_strp:
4112 case DW_FORM_sec_offset:
4113 break;
4114 default:
4115 error (_("Invalid extension opcode form %s\n"),
4116 get_FORM_name (form));
4117 return 0;
4118 }
4119 }
4120 }
4121 }
4122 }
4123 }
4124 printf ("\n");
4125
4126 while (1)
4127 {
4128 unsigned int op;
4129
4130 if (curr >= end)
4131 {
4132 error (_(".debug_macro section not zero terminated\n"));
4133 return 0;
4134 }
4135
4136 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
4137 if (op == 0)
4138 break;
4139
4140 switch (op)
4141 {
4142 case DW_MACRO_GNU_start_file:
4143 {
4144 unsigned int filenum;
4145 unsigned char *file_name = NULL, *dir_name = NULL;
4146
4147 lineno = read_uleb128 (curr, &bytes_read, end);
4148 curr += bytes_read;
4149 filenum = read_uleb128 (curr, &bytes_read, end);
4150 curr += bytes_read;
4151
4152 if ((flags & 2) == 0)
4153 error (_("DW_MACRO_GNU_start_file used, but no .debug_line offset provided.\n"));
4154 else
4155 file_name
4156 = get_line_filename_and_dirname (line_offset, filenum,
4157 &dir_name);
4158 if (file_name == NULL)
4159 printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d\n"),
4160 lineno, filenum);
4161 else
4162 printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
4163 lineno, filenum,
4164 dir_name != NULL ? (const char *) dir_name : "",
4165 dir_name != NULL ? "/" : "", file_name);
4166 }
4167 break;
4168
4169 case DW_MACRO_GNU_end_file:
4170 printf (_(" DW_MACRO_GNU_end_file\n"));
4171 break;
4172
4173 case DW_MACRO_GNU_define:
4174 lineno = read_uleb128 (curr, &bytes_read, end);
4175 curr += bytes_read;
4176 string = curr;
4177 curr += strnlen ((char *) string, end - string) + 1;
4178 printf (_(" DW_MACRO_GNU_define - lineno : %d macro : %s\n"),
4179 lineno, string);
4180 break;
4181
4182 case DW_MACRO_GNU_undef:
4183 lineno = read_uleb128 (curr, &bytes_read, end);
4184 curr += bytes_read;
4185 string = curr;
4186 curr += strnlen ((char *) string, end - string) + 1;
4187 printf (_(" DW_MACRO_GNU_undef - lineno : %d macro : %s\n"),
4188 lineno, string);
4189 break;
4190
4191 case DW_MACRO_GNU_define_indirect:
4192 lineno = read_uleb128 (curr, &bytes_read, end);
4193 curr += bytes_read;
4194 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4195 string = fetch_indirect_string (offset);
4196 printf (_(" DW_MACRO_GNU_define_indirect - lineno : %d macro : %s\n"),
4197 lineno, string);
4198 break;
4199
4200 case DW_MACRO_GNU_undef_indirect:
4201 lineno = read_uleb128 (curr, &bytes_read, end);
4202 curr += bytes_read;
4203 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4204 string = fetch_indirect_string (offset);
4205 printf (_(" DW_MACRO_GNU_undef_indirect - lineno : %d macro : %s\n"),
4206 lineno, string);
4207 break;
4208
4209 case DW_MACRO_GNU_transparent_include:
4210 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4211 printf (_(" DW_MACRO_GNU_transparent_include - offset : 0x%lx\n"),
4212 (unsigned long) offset);
4213 break;
4214
4215 case DW_MACRO_GNU_define_indirect_alt:
4216 lineno = read_uleb128 (curr, &bytes_read, end);
4217 curr += bytes_read;
4218 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4219 printf (_(" DW_MACRO_GNU_define_indirect_alt - lineno : %d macro offset : 0x%lx\n"),
4220 lineno, (unsigned long) offset);
4221 break;
4222
4223 case DW_MACRO_GNU_undef_indirect_alt:
4224 lineno = read_uleb128 (curr, &bytes_read, end);
4225 curr += bytes_read;
4226 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4227 printf (_(" DW_MACRO_GNU_undef_indirect_alt - lineno : %d macro offset : 0x%lx\n"),
4228 lineno, (unsigned long) offset);
4229 break;
4230
4231 case DW_MACRO_GNU_transparent_include_alt:
4232 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
4233 printf (_(" DW_MACRO_GNU_transparent_include_alt - offset : 0x%lx\n"),
4234 (unsigned long) offset);
4235 break;
4236
4237 default:
4238 if (extended_ops == NULL || extended_ops[op] == NULL)
4239 {
4240 error (_(" Unknown macro opcode %02x seen\n"), op);
4241 return 0;
4242 }
4243 else
4244 {
4245 /* Skip over unhandled opcodes. */
4246 dwarf_vma nargs, n;
4247 unsigned char *desc = extended_ops[op];
4248 nargs = read_uleb128 (desc, &bytes_read, end);
4249 desc += bytes_read;
4250 if (nargs == 0)
4251 {
4252 printf (_(" DW_MACRO_GNU_%02x\n"), op);
4253 break;
4254 }
4255 printf (_(" DW_MACRO_GNU_%02x -"), op);
4256 for (n = 0; n < nargs; n++)
4257 {
4258 int val;
4259
4260 SAFE_BYTE_GET_AND_INC (val, desc, 1, end);
4261 curr
4262 = read_and_display_attr_value (0, val,
4263 curr, end, 0, 0, offset_size,
4264 version, NULL, 0, NULL,
4265 NULL);
4266 if (n != nargs - 1)
4267 printf (",");
4268 }
4269 printf ("\n");
4270 }
4271 break;
4272 }
4273 }
4274
4275 printf ("\n");
4276 }
4277
4278 return 1;
4279 }
4280
4281 static int
4282 display_debug_abbrev (struct dwarf_section *section,
4283 void *file ATTRIBUTE_UNUSED)
4284 {
4285 abbrev_entry *entry;
4286 unsigned char *start = section->start;
4287 unsigned char *end = start + section->size;
4288
4289 printf (_("Contents of the %s section:\n\n"), section->name);
4290
4291 do
4292 {
4293 unsigned char *last;
4294
4295 free_abbrevs ();
4296
4297 last = start;
4298 start = process_abbrev_section (start, end);
4299
4300 if (first_abbrev == NULL)
4301 continue;
4302
4303 printf (_(" Number TAG (0x%lx)\n"), (long) (last - section->start));
4304
4305 for (entry = first_abbrev; entry; entry = entry->next)
4306 {
4307 abbrev_attr *attr;
4308
4309 printf (" %ld %s [%s]\n",
4310 entry->entry,
4311 get_TAG_name (entry->tag),
4312 entry->children ? _("has children") : _("no children"));
4313
4314 for (attr = entry->first_attr; attr; attr = attr->next)
4315 printf (" %-18s %s\n",
4316 get_AT_name (attr->attribute),
4317 get_FORM_name (attr->form));
4318 }
4319 }
4320 while (start);
4321
4322 printf ("\n");
4323
4324 return 1;
4325 }
4326
4327 /* Display a location list from a normal (ie, non-dwo) .debug_loc section. */
4328
4329 static void
4330 display_loc_list (struct dwarf_section *section,
4331 unsigned char **start_ptr,
4332 unsigned int debug_info_entry,
4333 unsigned long offset,
4334 unsigned long base_address,
4335 int has_frame_base)
4336 {
4337 unsigned char *start = *start_ptr;
4338 unsigned char *section_end = section->start + section->size;
4339 unsigned long cu_offset;
4340 unsigned int pointer_size;
4341 unsigned int offset_size;
4342 int dwarf_version;
4343
4344 dwarf_vma begin;
4345 dwarf_vma end;
4346 unsigned short length;
4347 int need_frame_base;
4348
4349 if (debug_info_entry >= num_debug_info_entries)
4350 {
4351 warn (_("No debug information available for loc lists of entry: %u\n"),
4352 debug_info_entry);
4353 return;
4354 }
4355
4356 cu_offset = debug_information [debug_info_entry].cu_offset;
4357 pointer_size = debug_information [debug_info_entry].pointer_size;
4358 offset_size = debug_information [debug_info_entry].offset_size;
4359 dwarf_version = debug_information [debug_info_entry].dwarf_version;
4360
4361 if (pointer_size < 2 || pointer_size > 8)
4362 {
4363 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
4364 pointer_size, debug_info_entry);
4365 return;
4366 }
4367
4368 while (1)
4369 {
4370 if (start + 2 * pointer_size > section_end)
4371 {
4372 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4373 offset);
4374 break;
4375 }
4376
4377 printf (" %8.8lx ", offset + (start - *start_ptr));
4378
4379 /* Note: we use sign extension here in order to be sure that we can detect
4380 the -1 escape value. Sign extension into the top 32 bits of a 32-bit
4381 address will not affect the values that we display since we always show
4382 hex values, and always the bottom 32-bits. */
4383 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
4384 SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
4385
4386 if (begin == 0 && end == 0)
4387 {
4388 printf (_("<End of list>\n"));
4389 break;
4390 }
4391
4392 /* Check base address specifiers. */
4393 if (begin == (dwarf_vma) -1 && end != (dwarf_vma) -1)
4394 {
4395 base_address = end;
4396 print_dwarf_vma (begin, pointer_size);
4397 print_dwarf_vma (end, pointer_size);
4398 printf (_("(base address)\n"));
4399 continue;
4400 }
4401
4402 if (start + 2 > section_end)
4403 {
4404 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4405 offset);
4406 break;
4407 }
4408
4409 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
4410
4411 if (start + length > section_end)
4412 {
4413 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4414 offset);
4415 break;
4416 }
4417
4418 print_dwarf_vma (begin + base_address, pointer_size);
4419 print_dwarf_vma (end + base_address, pointer_size);
4420
4421 putchar ('(');
4422 need_frame_base = decode_location_expression (start,
4423 pointer_size,
4424 offset_size,
4425 dwarf_version,
4426 length,
4427 cu_offset, section);
4428 putchar (')');
4429
4430 if (need_frame_base && !has_frame_base)
4431 printf (_(" [without DW_AT_frame_base]"));
4432
4433 if (begin == end)
4434 fputs (_(" (start == end)"), stdout);
4435 else if (begin > end)
4436 fputs (_(" (start > end)"), stdout);
4437
4438 putchar ('\n');
4439
4440 start += length;
4441 }
4442
4443 *start_ptr = start;
4444 }
4445
4446 /* Print a .debug_addr table index in decimal, surrounded by square brackets,
4447 right-adjusted in a field of length LEN, and followed by a space. */
4448
4449 static void
4450 print_addr_index (unsigned int idx, unsigned int len)
4451 {
4452 static char buf[15];
4453 snprintf (buf, sizeof (buf), "[%d]", idx);
4454 printf ("%*s ", len, buf);
4455 }
4456
4457 /* Display a location list from a .dwo section. It uses address indexes rather
4458 than embedded addresses. This code closely follows display_loc_list, but the
4459 two are sufficiently different that combining things is very ugly. */
4460
4461 static void
4462 display_loc_list_dwo (struct dwarf_section *section,
4463 unsigned char **start_ptr,
4464 unsigned int debug_info_entry,
4465 unsigned long offset,
4466 int has_frame_base)
4467 {
4468 unsigned char *start = *start_ptr;
4469 unsigned char *section_end = section->start + section->size;
4470 unsigned long cu_offset;
4471 unsigned int pointer_size;
4472 unsigned int offset_size;
4473 int dwarf_version;
4474 int entry_type;
4475 unsigned short length;
4476 int need_frame_base;
4477 unsigned int idx;
4478 unsigned int bytes_read;
4479
4480 if (debug_info_entry >= num_debug_info_entries)
4481 {
4482 warn (_("No debug information for loc lists of entry: %u\n"),
4483 debug_info_entry);
4484 return;
4485 }
4486
4487 cu_offset = debug_information [debug_info_entry].cu_offset;
4488 pointer_size = debug_information [debug_info_entry].pointer_size;
4489 offset_size = debug_information [debug_info_entry].offset_size;
4490 dwarf_version = debug_information [debug_info_entry].dwarf_version;
4491
4492 if (pointer_size < 2 || pointer_size > 8)
4493 {
4494 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
4495 pointer_size, debug_info_entry);
4496 return;
4497 }
4498
4499 while (1)
4500 {
4501 printf (" %8.8lx ", offset + (start - *start_ptr));
4502
4503 if (start >= section_end)
4504 {
4505 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4506 offset);
4507 break;
4508 }
4509
4510 SAFE_BYTE_GET_AND_INC (entry_type, start, 1, section_end);
4511 switch (entry_type)
4512 {
4513 case 0: /* A terminating entry. */
4514 *start_ptr = start;
4515 printf (_("<End of list>\n"));
4516 return;
4517 case 1: /* A base-address entry. */
4518 idx = read_uleb128 (start, &bytes_read, section_end);
4519 start += bytes_read;
4520 print_addr_index (idx, 8);
4521 printf (" ");
4522 printf (_("(base address selection entry)\n"));
4523 continue;
4524 case 2: /* A start/end entry. */
4525 idx = read_uleb128 (start, &bytes_read, section_end);
4526 start += bytes_read;
4527 print_addr_index (idx, 8);
4528 idx = read_uleb128 (start, &bytes_read, section_end);
4529 start += bytes_read;
4530 print_addr_index (idx, 8);
4531 break;
4532 case 3: /* A start/length entry. */
4533 idx = read_uleb128 (start, &bytes_read, section_end);
4534 start += bytes_read;
4535 print_addr_index (idx, 8);
4536 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4537 printf ("%08x ", idx);
4538 break;
4539 case 4: /* An offset pair entry. */
4540 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4541 printf ("%08x ", idx);
4542 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4543 printf ("%08x ", idx);
4544 break;
4545 default:
4546 warn (_("Unknown location list entry type 0x%x.\n"), entry_type);
4547 *start_ptr = start;
4548 return;
4549 }
4550
4551 if (start + 2 > section_end)
4552 {
4553 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4554 offset);
4555 break;
4556 }
4557
4558 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
4559 if (start + length > section_end)
4560 {
4561 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4562 offset);
4563 break;
4564 }
4565
4566 putchar ('(');
4567 need_frame_base = decode_location_expression (start,
4568 pointer_size,
4569 offset_size,
4570 dwarf_version,
4571 length,
4572 cu_offset, section);
4573 putchar (')');
4574
4575 if (need_frame_base && !has_frame_base)
4576 printf (_(" [without DW_AT_frame_base]"));
4577
4578 putchar ('\n');
4579
4580 start += length;
4581 }
4582
4583 *start_ptr = start;
4584 }
4585
4586 /* Sort array of indexes in ascending order of loc_offsets[idx]. */
4587
4588 static dwarf_vma *loc_offsets;
4589
4590 static int
4591 loc_offsets_compar (const void *ap, const void *bp)
4592 {
4593 dwarf_vma a = loc_offsets[*(const unsigned int *) ap];
4594 dwarf_vma b = loc_offsets[*(const unsigned int *) bp];
4595
4596 return (a > b) - (b > a);
4597 }
4598
4599 static int
4600 display_debug_loc (struct dwarf_section *section, void *file)
4601 {
4602 unsigned char *start = section->start;
4603 unsigned long bytes;
4604 unsigned char *section_begin = start;
4605 unsigned int num_loc_list = 0;
4606 unsigned long last_offset = 0;
4607 unsigned int first = 0;
4608 unsigned int i;
4609 unsigned int j;
4610 unsigned int k;
4611 int seen_first_offset = 0;
4612 int locs_sorted = 1;
4613 unsigned char *next;
4614 unsigned int *array = NULL;
4615 const char *suffix = strrchr (section->name, '.');
4616 int is_dwo = 0;
4617
4618 if (suffix && strcmp (suffix, ".dwo") == 0)
4619 is_dwo = 1;
4620
4621 bytes = section->size;
4622
4623 if (bytes == 0)
4624 {
4625 printf (_("\nThe %s section is empty.\n"), section->name);
4626 return 0;
4627 }
4628
4629 if (load_debug_info (file) == 0)
4630 {
4631 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
4632 section->name);
4633 return 0;
4634 }
4635
4636 /* Check the order of location list in .debug_info section. If
4637 offsets of location lists are in the ascending order, we can
4638 use `debug_information' directly. */
4639 for (i = 0; i < num_debug_info_entries; i++)
4640 {
4641 unsigned int num;
4642
4643 num = debug_information [i].num_loc_offsets;
4644 if (num > num_loc_list)
4645 num_loc_list = num;
4646
4647 /* Check if we can use `debug_information' directly. */
4648 if (locs_sorted && num != 0)
4649 {
4650 if (!seen_first_offset)
4651 {
4652 /* This is the first location list. */
4653 last_offset = debug_information [i].loc_offsets [0];
4654 first = i;
4655 seen_first_offset = 1;
4656 j = 1;
4657 }
4658 else
4659 j = 0;
4660
4661 for (; j < num; j++)
4662 {
4663 if (last_offset >
4664 debug_information [i].loc_offsets [j])
4665 {
4666 locs_sorted = 0;
4667 break;
4668 }
4669 last_offset = debug_information [i].loc_offsets [j];
4670 }
4671 }
4672 }
4673
4674 if (!seen_first_offset)
4675 error (_("No location lists in .debug_info section!\n"));
4676
4677 if (debug_information [first].num_loc_offsets > 0
4678 && debug_information [first].loc_offsets [0] != 0)
4679 warn (_("Location lists in %s section start at 0x%s\n"),
4680 section->name,
4681 dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]));
4682
4683 if (!locs_sorted)
4684 array = (unsigned int *) xcmalloc (num_loc_list, sizeof (unsigned int));
4685 printf (_("Contents of the %s section:\n\n"), section->name);
4686 printf (_(" Offset Begin End Expression\n"));
4687
4688 seen_first_offset = 0;
4689 for (i = first; i < num_debug_info_entries; i++)
4690 {
4691 unsigned long offset;
4692 unsigned long base_address;
4693 int has_frame_base;
4694
4695 if (!locs_sorted)
4696 {
4697 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
4698 array[k] = k;
4699 loc_offsets = debug_information [i].loc_offsets;
4700 qsort (array, debug_information [i].num_loc_offsets,
4701 sizeof (*array), loc_offsets_compar);
4702 }
4703
4704 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
4705 {
4706 j = locs_sorted ? k : array[k];
4707 if (k
4708 && debug_information [i].loc_offsets [locs_sorted
4709 ? k - 1 : array [k - 1]]
4710 == debug_information [i].loc_offsets [j])
4711 continue;
4712 has_frame_base = debug_information [i].have_frame_base [j];
4713 offset = debug_information [i].loc_offsets [j];
4714 next = section_begin + offset;
4715 base_address = debug_information [i].base_address;
4716
4717 if (!seen_first_offset)
4718 seen_first_offset = 1;
4719 else
4720 {
4721 if (start < next)
4722 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
4723 (unsigned long) (start - section_begin),
4724 (unsigned long) offset);
4725 else if (start > next)
4726 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
4727 (unsigned long) (start - section_begin),
4728 (unsigned long) offset);
4729 }
4730 start = next;
4731
4732 if (offset >= bytes)
4733 {
4734 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
4735 offset);
4736 continue;
4737 }
4738
4739 if (is_dwo)
4740 display_loc_list_dwo (section, &start, i, offset, has_frame_base);
4741 else
4742 display_loc_list (section, &start, i, offset, base_address,
4743 has_frame_base);
4744 }
4745 }
4746
4747 if (start < section->start + section->size)
4748 warn (_("There are %ld unused bytes at the end of section %s\n"),
4749 (long) (section->start + section->size - start), section->name);
4750 putchar ('\n');
4751 free (array);
4752 return 1;
4753 }
4754
4755 static int
4756 display_debug_str (struct dwarf_section *section,
4757 void *file ATTRIBUTE_UNUSED)
4758 {
4759 unsigned char *start = section->start;
4760 unsigned long bytes = section->size;
4761 dwarf_vma addr = section->address;
4762
4763 if (bytes == 0)
4764 {
4765 printf (_("\nThe %s section is empty.\n"), section->name);
4766 return 0;
4767 }
4768
4769 printf (_("Contents of the %s section:\n\n"), section->name);
4770
4771 while (bytes)
4772 {
4773 int j;
4774 int k;
4775 int lbytes;
4776
4777 lbytes = (bytes > 16 ? 16 : bytes);
4778
4779 printf (" 0x%8.8lx ", (unsigned long) addr);
4780
4781 for (j = 0; j < 16; j++)
4782 {
4783 if (j < lbytes)
4784 printf ("%2.2x", start[j]);
4785 else
4786 printf (" ");
4787
4788 if ((j & 3) == 3)
4789 printf (" ");
4790 }
4791
4792 for (j = 0; j < lbytes; j++)
4793 {
4794 k = start[j];
4795 if (k >= ' ' && k < 0x80)
4796 printf ("%c", k);
4797 else
4798 printf (".");
4799 }
4800
4801 putchar ('\n');
4802
4803 start += lbytes;
4804 addr += lbytes;
4805 bytes -= lbytes;
4806 }
4807
4808 putchar ('\n');
4809
4810 return 1;
4811 }
4812
4813 static int
4814 display_debug_info (struct dwarf_section *section, void *file)
4815 {
4816 return process_debug_info (section, file, section->abbrev_sec, 0, 0);
4817 }
4818
4819 static int
4820 display_debug_types (struct dwarf_section *section, void *file)
4821 {
4822 return process_debug_info (section, file, section->abbrev_sec, 0, 1);
4823 }
4824
4825 static int
4826 display_trace_info (struct dwarf_section *section, void *file)
4827 {
4828 return process_debug_info (section, file, section->abbrev_sec, 0, 0);
4829 }
4830
4831 static int
4832 display_debug_aranges (struct dwarf_section *section,
4833 void *file ATTRIBUTE_UNUSED)
4834 {
4835 unsigned char *start = section->start;
4836 unsigned char *end = start + section->size;
4837
4838 printf (_("Contents of the %s section:\n\n"), section->name);
4839
4840 /* It does not matter if this load fails,
4841 we test for that later on. */
4842 load_debug_info (file);
4843
4844 while (start < end)
4845 {
4846 unsigned char *hdrptr;
4847 DWARF2_Internal_ARange arange;
4848 unsigned char *addr_ranges;
4849 dwarf_vma length;
4850 dwarf_vma address;
4851 unsigned char address_size;
4852 int excess;
4853 unsigned int offset_size;
4854 unsigned int initial_length_size;
4855
4856 hdrptr = start;
4857
4858 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 4, end);
4859 if (arange.ar_length == 0xffffffff)
4860 {
4861 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 8, end);
4862 offset_size = 8;
4863 initial_length_size = 12;
4864 }
4865 else
4866 {
4867 offset_size = 4;
4868 initial_length_size = 4;
4869 }
4870
4871 SAFE_BYTE_GET_AND_INC (arange.ar_version, hdrptr, 2, end);
4872 SAFE_BYTE_GET_AND_INC (arange.ar_info_offset, hdrptr, offset_size, end);
4873
4874 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
4875 && num_debug_info_entries > 0
4876 && find_debug_info_for_offset (arange.ar_info_offset) == NULL)
4877 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
4878 (unsigned long) arange.ar_info_offset, section->name);
4879
4880 SAFE_BYTE_GET_AND_INC (arange.ar_pointer_size, hdrptr, 1, end);
4881 SAFE_BYTE_GET_AND_INC (arange.ar_segment_size, hdrptr, 1, end);
4882
4883 if (arange.ar_version != 2 && arange.ar_version != 3)
4884 {
4885 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
4886 break;
4887 }
4888
4889 printf (_(" Length: %ld\n"),
4890 (long) arange.ar_length);
4891 printf (_(" Version: %d\n"), arange.ar_version);
4892 printf (_(" Offset into .debug_info: 0x%lx\n"),
4893 (unsigned long) arange.ar_info_offset);
4894 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
4895 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
4896
4897 address_size = arange.ar_pointer_size + arange.ar_segment_size;
4898
4899 /* PR 17512: file: 001-108546-0.001:0.1. */
4900 if (address_size == 0 || address_size > 8)
4901 {
4902 error (_("Invalid address size in %s section!\n"),
4903 section->name);
4904 break;
4905 }
4906
4907 /* The DWARF spec does not require that the address size be a power
4908 of two, but we do. This will have to change if we ever encounter
4909 an uneven architecture. */
4910 if ((address_size & (address_size - 1)) != 0)
4911 {
4912 warn (_("Pointer size + Segment size is not a power of two.\n"));
4913 break;
4914 }
4915
4916 if (address_size > 4)
4917 printf (_("\n Address Length\n"));
4918 else
4919 printf (_("\n Address Length\n"));
4920
4921 addr_ranges = hdrptr;
4922
4923 /* Must pad to an alignment boundary that is twice the address size. */
4924 excess = (hdrptr - start) % (2 * address_size);
4925 if (excess)
4926 addr_ranges += (2 * address_size) - excess;
4927
4928 hdrptr = start + arange.ar_length + initial_length_size;
4929 if (hdrptr < start || hdrptr > end)
4930 {
4931 error (_("Excessive header length: %lx\n"), (long) arange.ar_length);
4932 break;
4933 }
4934 start = hdrptr;
4935
4936 while (addr_ranges + 2 * address_size <= start)
4937 {
4938 SAFE_BYTE_GET_AND_INC (address, addr_ranges, address_size, end);
4939 SAFE_BYTE_GET_AND_INC (length, addr_ranges, address_size, end);
4940
4941 printf (" ");
4942 print_dwarf_vma (address, address_size);
4943 print_dwarf_vma (length, address_size);
4944 putchar ('\n');
4945 }
4946 }
4947
4948 printf ("\n");
4949
4950 return 1;
4951 }
4952
4953 /* Comparison function for qsort. */
4954 static int
4955 comp_addr_base (const void * v0, const void * v1)
4956 {
4957 debug_info * info0 = (debug_info *) v0;
4958 debug_info * info1 = (debug_info *) v1;
4959 return info0->addr_base - info1->addr_base;
4960 }
4961
4962 /* Display the debug_addr section. */
4963 static int
4964 display_debug_addr (struct dwarf_section *section,
4965 void *file)
4966 {
4967 debug_info **debug_addr_info;
4968 unsigned char *entry;
4969 unsigned char *end;
4970 unsigned int i;
4971 unsigned int count;
4972
4973 if (section->size == 0)
4974 {
4975 printf (_("\nThe %s section is empty.\n"), section->name);
4976 return 0;
4977 }
4978
4979 if (load_debug_info (file) == 0)
4980 {
4981 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
4982 section->name);
4983 return 0;
4984 }
4985
4986 printf (_("Contents of the %s section:\n\n"), section->name);
4987
4988 /* PR 17531: file: cf38d01b.
4989 We use xcalloc because a corrupt file may not have initialised all of the
4990 fields in the debug_info structure, which means that the sort below might
4991 try to move uninitialised data. */
4992 debug_addr_info = (debug_info **) xcalloc ((num_debug_info_entries + 1),
4993 sizeof (debug_info *));
4994
4995 count = 0;
4996 for (i = 0; i < num_debug_info_entries; i++)
4997 if (debug_information [i].addr_base != DEBUG_INFO_UNAVAILABLE)
4998 {
4999 /* PR 17531: file: cf38d01b. */
5000 if (debug_information[i].addr_base >= section->size)
5001 warn (_("Corrupt address base (%lx) found in debug section %u\n"),
5002 (unsigned long) debug_information[i].addr_base, i);
5003 else
5004 debug_addr_info [count++] = debug_information + i;
5005 }
5006
5007 /* Add a sentinel to make iteration convenient. */
5008 debug_addr_info [count] = (debug_info *) xmalloc (sizeof (debug_info));
5009 debug_addr_info [count]->addr_base = section->size;
5010 qsort (debug_addr_info, count, sizeof (debug_info *), comp_addr_base);
5011
5012 for (i = 0; i < count; i++)
5013 {
5014 unsigned int idx;
5015 unsigned int address_size = debug_addr_info [i]->pointer_size;
5016
5017 printf (_(" For compilation unit at offset 0x%s:\n"),
5018 dwarf_vmatoa ("x", debug_addr_info [i]->cu_offset));
5019
5020 printf (_("\tIndex\tAddress\n"));
5021 entry = section->start + debug_addr_info [i]->addr_base;
5022 end = section->start + debug_addr_info [i + 1]->addr_base;
5023 idx = 0;
5024 while (entry < end)
5025 {
5026 dwarf_vma base = byte_get (entry, address_size);
5027 printf (_("\t%d:\t"), idx);
5028 print_dwarf_vma (base, address_size);
5029 printf ("\n");
5030 entry += address_size;
5031 idx++;
5032 }
5033 }
5034 printf ("\n");
5035
5036 free (debug_addr_info);
5037 return 1;
5038 }
5039
5040 /* Display the .debug_str_offsets and .debug_str_offsets.dwo sections. */
5041 static int
5042 display_debug_str_offsets (struct dwarf_section *section,
5043 void *file ATTRIBUTE_UNUSED)
5044 {
5045 if (section->size == 0)
5046 {
5047 printf (_("\nThe %s section is empty.\n"), section->name);
5048 return 0;
5049 }
5050 /* TODO: Dump the contents. This is made somewhat difficult by not knowing
5051 what the offset size is for this section. */
5052 return 1;
5053 }
5054
5055 /* Each debug_information[x].range_lists[y] gets this representation for
5056 sorting purposes. */
5057
5058 struct range_entry
5059 {
5060 /* The debug_information[x].range_lists[y] value. */
5061 unsigned long ranges_offset;
5062
5063 /* Original debug_information to find parameters of the data. */
5064 debug_info *debug_info_p;
5065 };
5066
5067 /* Sort struct range_entry in ascending order of its RANGES_OFFSET. */
5068
5069 static int
5070 range_entry_compar (const void *ap, const void *bp)
5071 {
5072 const struct range_entry *a_re = (const struct range_entry *) ap;
5073 const struct range_entry *b_re = (const struct range_entry *) bp;
5074 const unsigned long a = a_re->ranges_offset;
5075 const unsigned long b = b_re->ranges_offset;
5076
5077 return (a > b) - (b > a);
5078 }
5079
5080 static int
5081 display_debug_ranges (struct dwarf_section *section,
5082 void *file ATTRIBUTE_UNUSED)
5083 {
5084 unsigned char *start = section->start;
5085 unsigned char *last_start = start;
5086 unsigned long bytes = section->size;
5087 unsigned char *section_begin = start;
5088 unsigned char *finish = start + bytes;
5089 unsigned int num_range_list, i;
5090 struct range_entry *range_entries, *range_entry_fill;
5091
5092 if (bytes == 0)
5093 {
5094 printf (_("\nThe %s section is empty.\n"), section->name);
5095 return 0;
5096 }
5097
5098 if (load_debug_info (file) == 0)
5099 {
5100 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
5101 section->name);
5102 return 0;
5103 }
5104
5105 num_range_list = 0;
5106 for (i = 0; i < num_debug_info_entries; i++)
5107 num_range_list += debug_information [i].num_range_lists;
5108
5109 if (num_range_list == 0)
5110 {
5111 /* This can happen when the file was compiled with -gsplit-debug
5112 which removes references to range lists from the primary .o file. */
5113 printf (_("No range lists in .debug_info section.\n"));
5114 return 1;
5115 }
5116
5117 range_entries = (struct range_entry *)
5118 xmalloc (sizeof (*range_entries) * num_range_list);
5119 range_entry_fill = range_entries;
5120
5121 for (i = 0; i < num_debug_info_entries; i++)
5122 {
5123 debug_info *debug_info_p = &debug_information[i];
5124 unsigned int j;
5125
5126 for (j = 0; j < debug_info_p->num_range_lists; j++)
5127 {
5128 range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
5129 range_entry_fill->debug_info_p = debug_info_p;
5130 range_entry_fill++;
5131 }
5132 }
5133
5134 qsort (range_entries, num_range_list, sizeof (*range_entries),
5135 range_entry_compar);
5136
5137 if (dwarf_check != 0 && range_entries[0].ranges_offset != 0)
5138 warn (_("Range lists in %s section start at 0x%lx\n"),
5139 section->name, range_entries[0].ranges_offset);
5140
5141 printf (_("Contents of the %s section:\n\n"), section->name);
5142 printf (_(" Offset Begin End\n"));
5143
5144 for (i = 0; i < num_range_list; i++)
5145 {
5146 struct range_entry *range_entry = &range_entries[i];
5147 debug_info *debug_info_p = range_entry->debug_info_p;
5148 unsigned int pointer_size;
5149 unsigned long offset;
5150 unsigned char *next;
5151 unsigned long base_address;
5152
5153 pointer_size = debug_info_p->pointer_size;
5154 offset = range_entry->ranges_offset;
5155 next = section_begin + offset;
5156 base_address = debug_info_p->base_address;
5157
5158 /* PR 17512: file: 001-101485-0.001:0.1. */
5159 if (pointer_size < 2 || pointer_size > 8)
5160 {
5161 warn (_("Corrupt pointer size (%d) in debug entry at offset %8.8lx\n"),
5162 pointer_size, offset);
5163 continue;
5164 }
5165
5166 if (dwarf_check != 0 && i > 0)
5167 {
5168 if (start < next)
5169 warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
5170 (unsigned long) (start - section_begin),
5171 (unsigned long) (next - section_begin), section->name);
5172 else if (start > next)
5173 {
5174 if (next == last_start)
5175 continue;
5176 warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
5177 (unsigned long) (start - section_begin),
5178 (unsigned long) (next - section_begin), section->name);
5179 }
5180 }
5181 start = next;
5182 last_start = next;
5183
5184 while (start < finish)
5185 {
5186 dwarf_vma begin;
5187 dwarf_vma end;
5188
5189 /* Note: we use sign extension here in order to be sure that
5190 we can detect the -1 escape value. Sign extension into the
5191 top 32 bits of a 32-bit address will not affect the values
5192 that we display since we always show hex values, and always
5193 the bottom 32-bits. */
5194 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
5195 if (start >= finish)
5196 break;
5197 SAFE_SIGNED_BYTE_GET_AND_INC (end, start, pointer_size, finish);
5198
5199 printf (" %8.8lx ", offset);
5200
5201 if (begin == 0 && end == 0)
5202 {
5203 printf (_("<End of list>\n"));
5204 break;
5205 }
5206
5207 /* Check base address specifiers. */
5208 if (begin == (dwarf_vma) -1 && end != (dwarf_vma) -1)
5209 {
5210 base_address = end;
5211 print_dwarf_vma (begin, pointer_size);
5212 print_dwarf_vma (end, pointer_size);
5213 printf ("(base address)\n");
5214 continue;
5215 }
5216
5217 print_dwarf_vma (begin + base_address, pointer_size);
5218 print_dwarf_vma (end + base_address, pointer_size);
5219
5220 if (begin == end)
5221 fputs (_("(start == end)"), stdout);
5222 else if (begin > end)
5223 fputs (_("(start > end)"), stdout);
5224
5225 putchar ('\n');
5226 }
5227 }
5228 putchar ('\n');
5229
5230 free (range_entries);
5231
5232 return 1;
5233 }
5234
5235 typedef struct Frame_Chunk
5236 {
5237 struct Frame_Chunk *next;
5238 unsigned char *chunk_start;
5239 unsigned int ncols;
5240 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
5241 short int *col_type;
5242 int *col_offset;
5243 char *augmentation;
5244 unsigned int code_factor;
5245 int data_factor;
5246 dwarf_vma pc_begin;
5247 dwarf_vma pc_range;
5248 int cfa_reg;
5249 dwarf_vma cfa_offset;
5250 unsigned int ra;
5251 unsigned char fde_encoding;
5252 unsigned char cfa_exp;
5253 unsigned char ptr_size;
5254 unsigned char segment_size;
5255 }
5256 Frame_Chunk;
5257
5258 static const char *const *dwarf_regnames;
5259 static unsigned int dwarf_regnames_count;
5260
5261 /* A marker for a col_type that means this column was never referenced
5262 in the frame info. */
5263 #define DW_CFA_unreferenced (-1)
5264
5265 /* Return 0 if no more space is needed, 1 if more space is needed,
5266 -1 for invalid reg. */
5267
5268 static int
5269 frame_need_space (Frame_Chunk *fc, unsigned int reg)
5270 {
5271 unsigned int prev = fc->ncols;
5272
5273 if (reg < (unsigned int) fc->ncols)
5274 return 0;
5275
5276 if (dwarf_regnames_count
5277 && reg > dwarf_regnames_count)
5278 return -1;
5279
5280 fc->ncols = reg + 1;
5281 /* PR 17512: file: 10450-2643-0.004.
5282 If reg == -1 then this can happen... */
5283 if (fc->ncols == 0)
5284 return -1;
5285
5286 /* PR 17512: file: 2844a11d. */
5287 if (fc->ncols > 1024)
5288 {
5289 error (_("Unfeasibly large register number: %u\n"), reg);
5290 fc->ncols = 0;
5291 /* FIXME: 1024 is an arbitrary limit. Increase it if
5292 we ever encounter a valid binary that exceeds it. */
5293 return -1;
5294 }
5295
5296 fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
5297 sizeof (short int));
5298 fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
5299 /* PR 17512: file:002-10025-0.005. */
5300 if (fc->col_type == NULL || fc->col_offset == NULL)
5301 {
5302 error (_("Out of memory allocating %u columns in dwarf frame arrays\n"),
5303 fc->ncols);
5304 fc->ncols = 0;
5305 return -1;
5306 }
5307
5308 while (prev < fc->ncols)
5309 {
5310 fc->col_type[prev] = DW_CFA_unreferenced;
5311 fc->col_offset[prev] = 0;
5312 prev++;
5313 }
5314 return 1;
5315 }
5316
5317 static const char *const dwarf_regnames_i386[] =
5318 {
5319 "eax", "ecx", "edx", "ebx", /* 0 - 3 */
5320 "esp", "ebp", "esi", "edi", /* 4 - 7 */
5321 "eip", "eflags", NULL, /* 8 - 10 */
5322 "st0", "st1", "st2", "st3", /* 11 - 14 */
5323 "st4", "st5", "st6", "st7", /* 15 - 18 */
5324 NULL, NULL, /* 19 - 20 */
5325 "xmm0", "xmm1", "xmm2", "xmm3", /* 21 - 24 */
5326 "xmm4", "xmm5", "xmm6", "xmm7", /* 25 - 28 */
5327 "mm0", "mm1", "mm2", "mm3", /* 29 - 32 */
5328 "mm4", "mm5", "mm6", "mm7", /* 33 - 36 */
5329 "fcw", "fsw", "mxcsr", /* 37 - 39 */
5330 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47 */
5331 "tr", "ldtr", /* 48 - 49 */
5332 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57 */
5333 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65 */
5334 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73 */
5335 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81 */
5336 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89 */
5337 NULL, NULL, NULL, /* 90 - 92 */
5338 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7" /* 93 - 100 */
5339 };
5340
5341 void
5342 init_dwarf_regnames_i386 (void)
5343 {
5344 dwarf_regnames = dwarf_regnames_i386;
5345 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
5346 }
5347
5348 static const char *const dwarf_regnames_x86_64[] =
5349 {
5350 "rax", "rdx", "rcx", "rbx",
5351 "rsi", "rdi", "rbp", "rsp",
5352 "r8", "r9", "r10", "r11",
5353 "r12", "r13", "r14", "r15",
5354 "rip",
5355 "xmm0", "xmm1", "xmm2", "xmm3",
5356 "xmm4", "xmm5", "xmm6", "xmm7",
5357 "xmm8", "xmm9", "xmm10", "xmm11",
5358 "xmm12", "xmm13", "xmm14", "xmm15",
5359 "st0", "st1", "st2", "st3",
5360 "st4", "st5", "st6", "st7",
5361 "mm0", "mm1", "mm2", "mm3",
5362 "mm4", "mm5", "mm6", "mm7",
5363 "rflags",
5364 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
5365 "fs.base", "gs.base", NULL, NULL,
5366 "tr", "ldtr",
5367 "mxcsr", "fcw", "fsw",
5368 "xmm16", "xmm17", "xmm18", "xmm19",
5369 "xmm20", "xmm21", "xmm22", "xmm23",
5370 "xmm24", "xmm25", "xmm26", "xmm27",
5371 "xmm28", "xmm29", "xmm30", "xmm31",
5372 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 83 - 90 */
5373 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 91 - 98 */
5374 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 99 - 106 */
5375 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 107 - 114 */
5376 NULL, NULL, NULL, /* 115 - 117 */
5377 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
5378 };
5379
5380 void
5381 init_dwarf_regnames_x86_64 (void)
5382 {
5383 dwarf_regnames = dwarf_regnames_x86_64;
5384 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
5385 }
5386
5387 static const char *const dwarf_regnames_aarch64[] =
5388 {
5389 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
5390 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
5391 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
5392 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp",
5393 NULL, "elr", NULL, NULL, NULL, NULL, NULL, NULL,
5394 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5395 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5396 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
5397 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
5398 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
5399 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
5400 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
5401 };
5402
5403 void
5404 init_dwarf_regnames_aarch64 (void)
5405 {
5406 dwarf_regnames = dwarf_regnames_aarch64;
5407 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_aarch64);
5408 }
5409
5410 void
5411 init_dwarf_regnames (unsigned int e_machine)
5412 {
5413 switch (e_machine)
5414 {
5415 case EM_386:
5416 case EM_IAMCU:
5417 init_dwarf_regnames_i386 ();
5418 break;
5419
5420 case EM_X86_64:
5421 case EM_L1OM:
5422 case EM_K1OM:
5423 init_dwarf_regnames_x86_64 ();
5424 break;
5425
5426 case EM_AARCH64:
5427 init_dwarf_regnames_aarch64 ();
5428 break;
5429
5430 default:
5431 break;
5432 }
5433 }
5434
5435 static const char *
5436 regname (unsigned int regno, int row)
5437 {
5438 static char reg[64];
5439 if (dwarf_regnames
5440 && regno < dwarf_regnames_count
5441 && dwarf_regnames [regno] != NULL)
5442 {
5443 if (row)
5444 return dwarf_regnames [regno];
5445 snprintf (reg, sizeof (reg), "r%d (%s)", regno,
5446 dwarf_regnames [regno]);
5447 }
5448 else
5449 snprintf (reg, sizeof (reg), "r%d", regno);
5450 return reg;
5451 }
5452
5453 static void
5454 frame_display_row (Frame_Chunk *fc, int *need_col_headers, unsigned int *max_regs)
5455 {
5456 unsigned int r;
5457 char tmp[100];
5458
5459 if (*max_regs < fc->ncols)
5460 *max_regs = fc->ncols;
5461
5462 if (*need_col_headers)
5463 {
5464 static const char *sloc = " LOC";
5465
5466 *need_col_headers = 0;
5467
5468 printf ("%-*s CFA ", eh_addr_size * 2, sloc);
5469
5470 for (r = 0; r < *max_regs; r++)
5471 if (fc->col_type[r] != DW_CFA_unreferenced)
5472 {
5473 if (r == fc->ra)
5474 printf ("ra ");
5475 else
5476 printf ("%-5s ", regname (r, 1));
5477 }
5478
5479 printf ("\n");
5480 }
5481
5482 print_dwarf_vma (fc->pc_begin, eh_addr_size);
5483 if (fc->cfa_exp)
5484 strcpy (tmp, "exp");
5485 else
5486 sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), (int) fc->cfa_offset);
5487 printf ("%-8s ", tmp);
5488
5489 for (r = 0; r < fc->ncols; r++)
5490 {
5491 if (fc->col_type[r] != DW_CFA_unreferenced)
5492 {
5493 switch (fc->col_type[r])
5494 {
5495 case DW_CFA_undefined:
5496 strcpy (tmp, "u");
5497 break;
5498 case DW_CFA_same_value:
5499 strcpy (tmp, "s");
5500 break;
5501 case DW_CFA_offset:
5502 sprintf (tmp, "c%+d", fc->col_offset[r]);
5503 break;
5504 case DW_CFA_val_offset:
5505 sprintf (tmp, "v%+d", fc->col_offset[r]);
5506 break;
5507 case DW_CFA_register:
5508 sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
5509 break;
5510 case DW_CFA_expression:
5511 strcpy (tmp, "exp");
5512 break;
5513 case DW_CFA_val_expression:
5514 strcpy (tmp, "vexp");
5515 break;
5516 default:
5517 strcpy (tmp, "n/a");
5518 break;
5519 }
5520 printf ("%-5s ", tmp);
5521 }
5522 }
5523 printf ("\n");
5524 }
5525
5526 #define GET(VAR, N) SAFE_BYTE_GET_AND_INC (VAR, start, N, end)
5527 #define LEB() read_uleb128 (start, & length_return, end); start += length_return
5528 #define SLEB() read_sleb128 (start, & length_return, end); start += length_return
5529
5530 static unsigned char *
5531 read_cie (unsigned char *start, unsigned char *end,
5532 Frame_Chunk **p_cie, int *p_version,
5533 unsigned long *p_aug_len, unsigned char **p_aug)
5534 {
5535 int version;
5536 Frame_Chunk *fc;
5537 unsigned int length_return;
5538 unsigned char *augmentation_data = NULL;
5539 unsigned long augmentation_data_len = 0;
5540
5541 * p_cie = NULL;
5542 /* PR 17512: file: 001-228113-0.004. */
5543 if (start >= end)
5544 return end;
5545
5546 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
5547 memset (fc, 0, sizeof (Frame_Chunk));
5548
5549 fc->col_type = (short int *) xmalloc (sizeof (short int));
5550 fc->col_offset = (int *) xmalloc (sizeof (int));
5551
5552 version = *start++;
5553
5554 fc->augmentation = (char *) start;
5555 /* PR 17512: file: 001-228113-0.004.
5556 Skip past augmentation name, but avoid running off the end of the data. */
5557 while (start < end)
5558 if (* start ++ == '\0')
5559 break;
5560 if (start == end)
5561 {
5562 warn (_("No terminator for augmentation name\n"));
5563 return start;
5564 }
5565
5566 if (strcmp (fc->augmentation, "eh") == 0)
5567 start += eh_addr_size;
5568
5569 if (version >= 4)
5570 {
5571 GET (fc->ptr_size, 1);
5572 if (fc->ptr_size < 1 || fc->ptr_size > 8)
5573 {
5574 warn (_("Invalid pointer size (%d) in CIE data\n"), fc->ptr_size);
5575 return end;
5576 }
5577
5578 GET (fc->segment_size, 1);
5579 /* PR 17512: file: e99d2804. */
5580 if (fc->segment_size > 8 || fc->segment_size + fc->ptr_size > 8)
5581 {
5582 warn (_("Invalid segment size (%d) in CIE data\n"), fc->segment_size);
5583 return end;
5584 }
5585
5586 eh_addr_size = fc->ptr_size;
5587 }
5588 else
5589 {
5590 fc->ptr_size = eh_addr_size;
5591 fc->segment_size = 0;
5592 }
5593 fc->code_factor = LEB ();
5594 fc->data_factor = SLEB ();
5595 if (version == 1)
5596 {
5597 GET (fc->ra, 1);
5598 }
5599 else
5600 {
5601 fc->ra = LEB ();
5602 }
5603
5604 if (fc->augmentation[0] == 'z')
5605 {
5606 augmentation_data_len = LEB ();
5607 augmentation_data = start;
5608 start += augmentation_data_len;
5609 /* PR 17512: file: 11042-2589-0.004. */
5610 if (start > end)
5611 {
5612 warn (_("Augmentation data too long: 0x%lx\n"), augmentation_data_len);
5613 return end;
5614 }
5615 }
5616
5617 if (augmentation_data_len)
5618 {
5619 unsigned char *p;
5620 unsigned char *q;
5621 unsigned char *qend;
5622
5623 p = (unsigned char *) fc->augmentation + 1;
5624 q = augmentation_data;
5625 qend = q + augmentation_data_len;
5626
5627 /* PR 17531: file: 015adfaa. */
5628 if (qend < q)
5629 {
5630 warn (_("Negative augmentation data length: 0x%lx"), augmentation_data_len);
5631 augmentation_data_len = 0;
5632 }
5633
5634 while (p < end && q < augmentation_data + augmentation_data_len)
5635 {
5636 if (*p == 'L')
5637 q++;
5638 else if (*p == 'P')
5639 q += 1 + size_of_encoded_value (*q);
5640 else if (*p == 'R')
5641 fc->fde_encoding = *q++;
5642 else if (*p == 'S')
5643 ;
5644 else
5645 break;
5646 p++;
5647 }
5648 /* Note - it is OK if this loop terminates with q < qend.
5649 Padding may have been inserted to align the end of the CIE. */
5650 }
5651
5652 *p_cie = fc;
5653 if (p_version)
5654 *p_version = version;
5655 if (p_aug_len)
5656 {
5657 *p_aug_len = augmentation_data_len;
5658 *p_aug = augmentation_data;
5659 }
5660 return start;
5661 }
5662
5663 static int
5664 display_debug_frames (struct dwarf_section *section,
5665 void *file ATTRIBUTE_UNUSED)
5666 {
5667 unsigned char *start = section->start;
5668 unsigned char *end = start + section->size;
5669 unsigned char *section_start = start;
5670 Frame_Chunk *chunks = 0, *forward_refs = 0;
5671 Frame_Chunk *remembered_state = 0;
5672 Frame_Chunk *rs;
5673 int is_eh = strcmp (section->name, ".eh_frame") == 0;
5674 unsigned int length_return;
5675 unsigned int max_regs = 0;
5676 const char *bad_reg = _("bad register: ");
5677 unsigned int saved_eh_addr_size = eh_addr_size;
5678
5679 printf (_("Contents of the %s section:\n"), section->name);
5680
5681 while (start < end)
5682 {
5683 unsigned char *saved_start;
5684 unsigned char *block_end;
5685 dwarf_vma length;
5686 dwarf_vma cie_id;
5687 Frame_Chunk *fc;
5688 Frame_Chunk *cie;
5689 int need_col_headers = 1;
5690 unsigned char *augmentation_data = NULL;
5691 unsigned long augmentation_data_len = 0;
5692 unsigned int encoded_ptr_size = saved_eh_addr_size;
5693 unsigned int offset_size;
5694 unsigned int initial_length_size;
5695
5696 saved_start = start;
5697
5698 SAFE_BYTE_GET_AND_INC (length, start, 4, end);
5699
5700 if (length == 0)
5701 {
5702 printf ("\n%08lx ZERO terminator\n\n",
5703 (unsigned long)(saved_start - section_start));
5704 /* Skip any zero terminators that directly follow.
5705 A corrupt section size could have loaded a whole
5706 slew of zero filled memory bytes. eg
5707 PR 17512: file: 070-19381-0.004. */
5708 while (start < end && * start == 0)
5709 ++ start;
5710 continue;
5711 }
5712
5713 if (length == 0xffffffff)
5714 {
5715 SAFE_BYTE_GET_AND_INC (length, start, 8, end);
5716 offset_size = 8;
5717 initial_length_size = 12;
5718 }
5719 else
5720 {
5721 offset_size = 4;
5722 initial_length_size = 4;
5723 }
5724
5725 block_end = saved_start + length + initial_length_size;
5726 if (block_end > end || block_end < start)
5727 {
5728 warn ("Invalid length 0x%s in FDE at %#08lx\n",
5729 dwarf_vmatoa_1 (NULL, length, offset_size),
5730 (unsigned long) (saved_start - section_start));
5731 block_end = end;
5732 }
5733
5734 SAFE_BYTE_GET_AND_INC (cie_id, start, offset_size, end);
5735
5736 if (is_eh ? (cie_id == 0) : ((offset_size == 4 && cie_id == DW_CIE_ID)
5737 || (offset_size == 8 && cie_id == DW64_CIE_ID)))
5738 {
5739 int version;
5740 unsigned int mreg;
5741
5742 start = read_cie (start, end, &cie, &version,
5743 &augmentation_data_len, &augmentation_data);
5744 /* PR 17512: file: 027-135133-0.005. */
5745 if (cie == NULL)
5746 break;
5747
5748 fc = cie;
5749 fc->next = chunks;
5750 chunks = fc;
5751 fc->chunk_start = saved_start;
5752 mreg = max_regs > 0 ? max_regs - 1 : 0;
5753 if (mreg < fc->ra)
5754 mreg = fc->ra;
5755 if (frame_need_space (fc, mreg) < 0)
5756 break;
5757 if (fc->fde_encoding)
5758 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
5759
5760 printf ("\n%08lx ", (unsigned long) (saved_start - section_start));
5761 print_dwarf_vma (length, fc->ptr_size);
5762 print_dwarf_vma (cie_id, offset_size);
5763
5764 if (do_debug_frames_interp)
5765 {
5766 printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc->augmentation,
5767 fc->code_factor, fc->data_factor, fc->ra);
5768 }
5769 else
5770 {
5771 printf ("CIE\n");
5772 printf (" Version: %d\n", version);
5773 printf (" Augmentation: \"%s\"\n", fc->augmentation);
5774 if (version >= 4)
5775 {
5776 printf (" Pointer Size: %u\n", fc->ptr_size);
5777 printf (" Segment Size: %u\n", fc->segment_size);
5778 }
5779 printf (" Code alignment factor: %u\n", fc->code_factor);
5780 printf (" Data alignment factor: %d\n", fc->data_factor);
5781 printf (" Return address column: %d\n", fc->ra);
5782
5783 if (augmentation_data_len)
5784 {
5785 unsigned long i;
5786
5787 printf (" Augmentation data: ");
5788 for (i = 0; i < augmentation_data_len; ++i)
5789 /* FIXME: If do_wide is FALSE, then we should
5790 add carriage returns at 80 columns... */
5791 printf (" %02x", augmentation_data[i]);
5792 putchar ('\n');
5793 }
5794 putchar ('\n');
5795 }
5796 }
5797 else
5798 {
5799 unsigned char *look_for;
5800 static Frame_Chunk fde_fc;
5801 unsigned long segment_selector;
5802
5803 if (is_eh)
5804 {
5805 dwarf_vma sign = (dwarf_vma) 1 << (offset_size * 8 - 1);
5806 look_for = start - 4 - ((cie_id ^ sign) - sign);
5807 }
5808 else
5809 look_for = section_start + cie_id;
5810
5811 if (look_for <= saved_start)
5812 {
5813 for (cie = chunks; cie ; cie = cie->next)
5814 if (cie->chunk_start == look_for)
5815 break;
5816 }
5817 else
5818 {
5819 for (cie = forward_refs; cie ; cie = cie->next)
5820 if (cie->chunk_start == look_for)
5821 break;
5822 if (!cie)
5823 {
5824 unsigned int off_size;
5825 unsigned char *cie_scan;
5826
5827 cie_scan = look_for;
5828 off_size = 4;
5829 SAFE_BYTE_GET_AND_INC (length, cie_scan, 4, end);
5830 if (length == 0xffffffff)
5831 {
5832 SAFE_BYTE_GET_AND_INC (length, cie_scan, 8, end);
5833 off_size = 8;
5834 }
5835 if (length != 0)
5836 {
5837 dwarf_vma c_id;
5838
5839 SAFE_BYTE_GET_AND_INC (c_id, cie_scan, off_size, end);
5840 if (is_eh
5841 ? c_id == 0
5842 : ((off_size == 4 && c_id == DW_CIE_ID)
5843 || (off_size == 8 && c_id == DW64_CIE_ID)))
5844 {
5845 int version;
5846 unsigned int mreg;
5847
5848 read_cie (cie_scan, end, &cie, &version,
5849 &augmentation_data_len, &augmentation_data);
5850 /* PR 17512: file: 3450-2098-0.004. */
5851 if (cie == NULL)
5852 {
5853 warn (_("Failed to read CIE information\n"));
5854 break;
5855 }
5856 cie->next = forward_refs;
5857 forward_refs = cie;
5858 cie->chunk_start = look_for;
5859 mreg = max_regs > 0 ? max_regs - 1 : 0;
5860 if (mreg < cie->ra)
5861 mreg = cie->ra;
5862 if (frame_need_space (cie, mreg) < 0)
5863 {
5864 warn (_("Invalid max register\n"));
5865 break;
5866 }
5867 if (cie->fde_encoding)
5868 encoded_ptr_size
5869 = size_of_encoded_value (cie->fde_encoding);
5870 }
5871 }
5872 }
5873 }
5874
5875 fc = &fde_fc;
5876 memset (fc, 0, sizeof (Frame_Chunk));
5877
5878 if (!cie)
5879 {
5880 warn ("Invalid CIE pointer 0x%s in FDE at %#08lx\n",
5881 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
5882 (unsigned long) (saved_start - section_start));
5883 fc->ncols = 0;
5884 fc->col_type = (short int *) xmalloc (sizeof (short int));
5885 fc->col_offset = (int *) xmalloc (sizeof (int));
5886 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1 : 0) < 0)
5887 {
5888 warn (_("Invalid max register\n"));
5889 break;
5890 }
5891 cie = fc;
5892 fc->augmentation = "";
5893 fc->fde_encoding = 0;
5894 fc->ptr_size = eh_addr_size;
5895 fc->segment_size = 0;
5896 }
5897 else
5898 {
5899 fc->ncols = cie->ncols;
5900 fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
5901 fc->col_offset = (int *) xcmalloc (fc->ncols, sizeof (int));
5902 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
5903 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
5904 fc->augmentation = cie->augmentation;
5905 fc->ptr_size = cie->ptr_size;
5906 eh_addr_size = cie->ptr_size;
5907 fc->segment_size = cie->segment_size;
5908 fc->code_factor = cie->code_factor;
5909 fc->data_factor = cie->data_factor;
5910 fc->cfa_reg = cie->cfa_reg;
5911 fc->cfa_offset = cie->cfa_offset;
5912 fc->ra = cie->ra;
5913 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1: 0) < 0)
5914 {
5915 warn (_("Invalid max register\n"));
5916 break;
5917 }
5918 fc->fde_encoding = cie->fde_encoding;
5919 }
5920
5921 if (fc->fde_encoding)
5922 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
5923
5924 segment_selector = 0;
5925 if (fc->segment_size)
5926 {
5927 if (fc->segment_size > sizeof (segment_selector))
5928 {
5929 /* PR 17512: file: 9e196b3e. */
5930 warn (_("Probably corrupt segment size: %d - using 4 instead\n"), fc->segment_size);
5931 fc->segment_size = 4;
5932 }
5933 SAFE_BYTE_GET_AND_INC (segment_selector, start, fc->segment_size, end);
5934 }
5935
5936 fc->pc_begin = get_encoded_value (&start, fc->fde_encoding, section, end);
5937
5938 /* FIXME: It appears that sometimes the final pc_range value is
5939 encoded in less than encoded_ptr_size bytes. See the x86_64
5940 run of the "objcopy on compressed debug sections" test for an
5941 example of this. */
5942 SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end);
5943
5944 if (cie->augmentation[0] == 'z')
5945 {
5946 augmentation_data_len = LEB ();
5947 augmentation_data = start;
5948 start += augmentation_data_len;
5949 /* PR 17512: file: 722-8446-0.004. */
5950 if (start >= end || ((signed long) augmentation_data_len) < 0)
5951 {
5952 warn (_("Corrupt augmentation data length: %lx\n"),
5953 augmentation_data_len);
5954 start = end;
5955 augmentation_data = NULL;
5956 augmentation_data_len = 0;
5957 }
5958 }
5959
5960 printf ("\n%08lx %s %s FDE cie=%08lx pc=",
5961 (unsigned long)(saved_start - section_start),
5962 dwarf_vmatoa_1 (NULL, length, fc->ptr_size),
5963 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
5964 (unsigned long)(cie->chunk_start - section_start));
5965
5966 if (fc->segment_size)
5967 printf ("%04lx:", segment_selector);
5968
5969 printf ("%s..%s\n",
5970 dwarf_vmatoa_1 (NULL, fc->pc_begin, fc->ptr_size),
5971 dwarf_vmatoa_1 (NULL, fc->pc_begin + fc->pc_range, fc->ptr_size));
5972
5973 if (! do_debug_frames_interp && augmentation_data_len)
5974 {
5975 unsigned long i;
5976
5977 printf (" Augmentation data: ");
5978 for (i = 0; i < augmentation_data_len; ++i)
5979 printf (" %02x", augmentation_data[i]);
5980 putchar ('\n');
5981 putchar ('\n');
5982 }
5983 }
5984
5985 /* At this point, fc is the current chunk, cie (if any) is set, and
5986 we're about to interpret instructions for the chunk. */
5987 /* ??? At present we need to do this always, since this sizes the
5988 fc->col_type and fc->col_offset arrays, which we write into always.
5989 We should probably split the interpreted and non-interpreted bits
5990 into two different routines, since there's so much that doesn't
5991 really overlap between them. */
5992 if (1 || do_debug_frames_interp)
5993 {
5994 /* Start by making a pass over the chunk, allocating storage
5995 and taking note of what registers are used. */
5996 unsigned char *tmp = start;
5997
5998 while (start < block_end)
5999 {
6000 unsigned int reg, op, opa;
6001 unsigned long temp;
6002 unsigned char * new_start;
6003
6004 op = *start++;
6005 opa = op & 0x3f;
6006 if (op & 0xc0)
6007 op &= 0xc0;
6008
6009 /* Warning: if you add any more cases to this switch, be
6010 sure to add them to the corresponding switch below. */
6011 switch (op)
6012 {
6013 case DW_CFA_advance_loc:
6014 break;
6015 case DW_CFA_offset:
6016 LEB ();
6017 if (frame_need_space (fc, opa) >= 0)
6018 fc->col_type[opa] = DW_CFA_undefined;
6019 break;
6020 case DW_CFA_restore:
6021 if (frame_need_space (fc, opa) >= 0)
6022 fc->col_type[opa] = DW_CFA_undefined;
6023 break;
6024 case DW_CFA_set_loc:
6025 start += encoded_ptr_size;
6026 break;
6027 case DW_CFA_advance_loc1:
6028 start += 1;
6029 break;
6030 case DW_CFA_advance_loc2:
6031 start += 2;
6032 break;
6033 case DW_CFA_advance_loc4:
6034 start += 4;
6035 break;
6036 case DW_CFA_offset_extended:
6037 case DW_CFA_val_offset:
6038 reg = LEB (); LEB ();
6039 if (frame_need_space (fc, reg) >= 0)
6040 fc->col_type[reg] = DW_CFA_undefined;
6041 break;
6042 case DW_CFA_restore_extended:
6043 reg = LEB ();
6044 if (frame_need_space (fc, reg) >= 0)
6045 fc->col_type[reg] = DW_CFA_undefined;
6046 break;
6047 case DW_CFA_undefined:
6048 reg = LEB ();
6049 if (frame_need_space (fc, reg) >= 0)
6050 fc->col_type[reg] = DW_CFA_undefined;
6051 break;
6052 case DW_CFA_same_value:
6053 reg = LEB ();
6054 if (frame_need_space (fc, reg) >= 0)
6055 fc->col_type[reg] = DW_CFA_undefined;
6056 break;
6057 case DW_CFA_register:
6058 reg = LEB (); LEB ();
6059 if (frame_need_space (fc, reg) >= 0)
6060 fc->col_type[reg] = DW_CFA_undefined;
6061 break;
6062 case DW_CFA_def_cfa:
6063 LEB (); LEB ();
6064 break;
6065 case DW_CFA_def_cfa_register:
6066 LEB ();
6067 break;
6068 case DW_CFA_def_cfa_offset:
6069 LEB ();
6070 break;
6071 case DW_CFA_def_cfa_expression:
6072 temp = LEB ();
6073 new_start = start + temp;
6074 if (new_start < start)
6075 {
6076 warn (_("Corrupt CFA_def expression value: %lu\n"), temp);
6077 start = block_end;
6078 }
6079 else
6080 start = new_start;
6081 break;
6082 case DW_CFA_expression:
6083 case DW_CFA_val_expression:
6084 reg = LEB ();
6085 temp = LEB ();
6086 new_start = start + temp;
6087 if (new_start < start)
6088 {
6089 /* PR 17512: file:306-192417-0.005. */
6090 warn (_("Corrupt CFA expression value: %lu\n"), temp);
6091 start = block_end;
6092 }
6093 else
6094 start = new_start;
6095 if (frame_need_space (fc, reg) >= 0)
6096 fc->col_type[reg] = DW_CFA_undefined;
6097 break;
6098 case DW_CFA_offset_extended_sf:
6099 case DW_CFA_val_offset_sf:
6100 reg = LEB (); SLEB ();
6101 if (frame_need_space (fc, reg) >= 0)
6102 fc->col_type[reg] = DW_CFA_undefined;
6103 break;
6104 case DW_CFA_def_cfa_sf:
6105 LEB (); SLEB ();
6106 break;
6107 case DW_CFA_def_cfa_offset_sf:
6108 SLEB ();
6109 break;
6110 case DW_CFA_MIPS_advance_loc8:
6111 start += 8;
6112 break;
6113 case DW_CFA_GNU_args_size:
6114 LEB ();
6115 break;
6116 case DW_CFA_GNU_negative_offset_extended:
6117 reg = LEB (); LEB ();
6118 if (frame_need_space (fc, reg) >= 0)
6119 fc->col_type[reg] = DW_CFA_undefined;
6120 break;
6121 default:
6122 break;
6123 }
6124 }
6125 start = tmp;
6126 }
6127
6128 /* Now we know what registers are used, make a second pass over
6129 the chunk, this time actually printing out the info. */
6130
6131 while (start < block_end)
6132 {
6133 unsigned char * tmp;
6134 unsigned op, opa;
6135 unsigned long ul, reg, roffs;
6136 dwarf_vma l;
6137 dwarf_vma ofs;
6138 dwarf_vma vma;
6139 const char *reg_prefix = "";
6140
6141 op = *start++;
6142 opa = op & 0x3f;
6143 if (op & 0xc0)
6144 op &= 0xc0;
6145
6146 /* Warning: if you add any more cases to this switch, be
6147 sure to add them to the corresponding switch above. */
6148 switch (op)
6149 {
6150 case DW_CFA_advance_loc:
6151 if (do_debug_frames_interp)
6152 frame_display_row (fc, &need_col_headers, &max_regs);
6153 else
6154 printf (" DW_CFA_advance_loc: %d to %s\n",
6155 opa * fc->code_factor,
6156 dwarf_vmatoa_1 (NULL,
6157 fc->pc_begin + opa * fc->code_factor,
6158 fc->ptr_size));
6159 fc->pc_begin += opa * fc->code_factor;
6160 break;
6161
6162 case DW_CFA_offset:
6163 roffs = LEB ();
6164 if (opa >= (unsigned int) fc->ncols)
6165 reg_prefix = bad_reg;
6166 if (! do_debug_frames_interp || *reg_prefix != '\0')
6167 printf (" DW_CFA_offset: %s%s at cfa%+ld\n",
6168 reg_prefix, regname (opa, 0),
6169 roffs * fc->data_factor);
6170 if (*reg_prefix == '\0')
6171 {
6172 fc->col_type[opa] = DW_CFA_offset;
6173 fc->col_offset[opa] = roffs * fc->data_factor;
6174 }
6175 break;
6176
6177 case DW_CFA_restore:
6178 if (opa >= (unsigned int) cie->ncols
6179 || opa >= (unsigned int) fc->ncols)
6180 reg_prefix = bad_reg;
6181 if (! do_debug_frames_interp || *reg_prefix != '\0')
6182 printf (" DW_CFA_restore: %s%s\n",
6183 reg_prefix, regname (opa, 0));
6184 if (*reg_prefix == '\0')
6185 {
6186 fc->col_type[opa] = cie->col_type[opa];
6187 fc->col_offset[opa] = cie->col_offset[opa];
6188 if (do_debug_frames_interp
6189 && fc->col_type[opa] == DW_CFA_unreferenced)
6190 fc->col_type[opa] = DW_CFA_undefined;
6191 }
6192 break;
6193
6194 case DW_CFA_set_loc:
6195 vma = get_encoded_value (&start, fc->fde_encoding, section, block_end);
6196 if (do_debug_frames_interp)
6197 frame_display_row (fc, &need_col_headers, &max_regs);
6198 else
6199 printf (" DW_CFA_set_loc: %s\n",
6200 dwarf_vmatoa_1 (NULL, vma, fc->ptr_size));
6201 fc->pc_begin = vma;
6202 break;
6203
6204 case DW_CFA_advance_loc1:
6205 SAFE_BYTE_GET_AND_INC (ofs, start, 1, end);
6206 if (do_debug_frames_interp)
6207 frame_display_row (fc, &need_col_headers, &max_regs);
6208 else
6209 printf (" DW_CFA_advance_loc1: %ld to %s\n",
6210 (unsigned long) (ofs * fc->code_factor),
6211 dwarf_vmatoa_1 (NULL,
6212 fc->pc_begin + ofs * fc->code_factor,
6213 fc->ptr_size));
6214 fc->pc_begin += ofs * fc->code_factor;
6215 break;
6216
6217 case DW_CFA_advance_loc2:
6218 SAFE_BYTE_GET_AND_INC (ofs, start, 2, block_end);
6219 if (do_debug_frames_interp)
6220 frame_display_row (fc, &need_col_headers, &max_regs);
6221 else
6222 printf (" DW_CFA_advance_loc2: %ld to %s\n",
6223 (unsigned long) (ofs * fc->code_factor),
6224 dwarf_vmatoa_1 (NULL,
6225 fc->pc_begin + ofs * fc->code_factor,
6226 fc->ptr_size));
6227 fc->pc_begin += ofs * fc->code_factor;
6228 break;
6229
6230 case DW_CFA_advance_loc4:
6231 SAFE_BYTE_GET_AND_INC (ofs, start, 4, block_end);
6232 if (do_debug_frames_interp)
6233 frame_display_row (fc, &need_col_headers, &max_regs);
6234 else
6235 printf (" DW_CFA_advance_loc4: %ld to %s\n",
6236 (unsigned long) (ofs * fc->code_factor),
6237 dwarf_vmatoa_1 (NULL,
6238 fc->pc_begin + ofs * fc->code_factor,
6239 fc->ptr_size));
6240 fc->pc_begin += ofs * fc->code_factor;
6241 break;
6242
6243 case DW_CFA_offset_extended:
6244 reg = LEB ();
6245 roffs = LEB ();
6246 if (reg >= (unsigned int) fc->ncols)
6247 reg_prefix = bad_reg;
6248 if (! do_debug_frames_interp || *reg_prefix != '\0')
6249 printf (" DW_CFA_offset_extended: %s%s at cfa%+ld\n",
6250 reg_prefix, regname (reg, 0),
6251 roffs * fc->data_factor);
6252 if (*reg_prefix == '\0')
6253 {
6254 fc->col_type[reg] = DW_CFA_offset;
6255 fc->col_offset[reg] = roffs * fc->data_factor;
6256 }
6257 break;
6258
6259 case DW_CFA_val_offset:
6260 reg = LEB ();
6261 roffs = LEB ();
6262 if (reg >= (unsigned int) fc->ncols)
6263 reg_prefix = bad_reg;
6264 if (! do_debug_frames_interp || *reg_prefix != '\0')
6265 printf (" DW_CFA_val_offset: %s%s at cfa%+ld\n",
6266 reg_prefix, regname (reg, 0),
6267 roffs * fc->data_factor);
6268 if (*reg_prefix == '\0')
6269 {
6270 fc->col_type[reg] = DW_CFA_val_offset;
6271 fc->col_offset[reg] = roffs * fc->data_factor;
6272 }
6273 break;
6274
6275 case DW_CFA_restore_extended:
6276 reg = LEB ();
6277 if (reg >= (unsigned int) cie->ncols
6278 || reg >= (unsigned int) fc->ncols)
6279 reg_prefix = bad_reg;
6280 if (! do_debug_frames_interp || *reg_prefix != '\0')
6281 printf (" DW_CFA_restore_extended: %s%s\n",
6282 reg_prefix, regname (reg, 0));
6283 if (*reg_prefix == '\0')
6284 {
6285 fc->col_type[reg] = cie->col_type[reg];
6286 fc->col_offset[reg] = cie->col_offset[reg];
6287 }
6288 break;
6289
6290 case DW_CFA_undefined:
6291 reg = LEB ();
6292 if (reg >= (unsigned int) fc->ncols)
6293 reg_prefix = bad_reg;
6294 if (! do_debug_frames_interp || *reg_prefix != '\0')
6295 printf (" DW_CFA_undefined: %s%s\n",
6296 reg_prefix, regname (reg, 0));
6297 if (*reg_prefix == '\0')
6298 {
6299 fc->col_type[reg] = DW_CFA_undefined;
6300 fc->col_offset[reg] = 0;
6301 }
6302 break;
6303
6304 case DW_CFA_same_value:
6305 reg = LEB ();
6306 if (reg >= (unsigned int) fc->ncols)
6307 reg_prefix = bad_reg;
6308 if (! do_debug_frames_interp || *reg_prefix != '\0')
6309 printf (" DW_CFA_same_value: %s%s\n",
6310 reg_prefix, regname (reg, 0));
6311 if (*reg_prefix == '\0')
6312 {
6313 fc->col_type[reg] = DW_CFA_same_value;
6314 fc->col_offset[reg] = 0;
6315 }
6316 break;
6317
6318 case DW_CFA_register:
6319 reg = LEB ();
6320 roffs = LEB ();
6321 if (reg >= (unsigned int) fc->ncols)
6322 reg_prefix = bad_reg;
6323 if (! do_debug_frames_interp || *reg_prefix != '\0')
6324 {
6325 printf (" DW_CFA_register: %s%s in ",
6326 reg_prefix, regname (reg, 0));
6327 puts (regname (roffs, 0));
6328 }
6329 if (*reg_prefix == '\0')
6330 {
6331 fc->col_type[reg] = DW_CFA_register;
6332 fc->col_offset[reg] = roffs;
6333 }
6334 break;
6335
6336 case DW_CFA_remember_state:
6337 if (! do_debug_frames_interp)
6338 printf (" DW_CFA_remember_state\n");
6339 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
6340 rs->cfa_offset = fc->cfa_offset;
6341 rs->cfa_reg = fc->cfa_reg;
6342 rs->ra = fc->ra;
6343 rs->cfa_exp = fc->cfa_exp;
6344 rs->ncols = fc->ncols;
6345 rs->col_type = (short int *) xcmalloc (rs->ncols,
6346 sizeof (* rs->col_type));
6347 rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (* rs->col_offset));
6348 memcpy (rs->col_type, fc->col_type, rs->ncols * sizeof (* fc->col_type));
6349 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (* fc->col_offset));
6350 rs->next = remembered_state;
6351 remembered_state = rs;
6352 break;
6353
6354 case DW_CFA_restore_state:
6355 if (! do_debug_frames_interp)
6356 printf (" DW_CFA_restore_state\n");
6357 rs = remembered_state;
6358 if (rs)
6359 {
6360 remembered_state = rs->next;
6361 fc->cfa_offset = rs->cfa_offset;
6362 fc->cfa_reg = rs->cfa_reg;
6363 fc->ra = rs->ra;
6364 fc->cfa_exp = rs->cfa_exp;
6365 if (frame_need_space (fc, rs->ncols - 1) < 0)
6366 {
6367 warn (_("Invalid column number in saved frame state\n"));
6368 fc->ncols = 0;
6369 break;
6370 }
6371 memcpy (fc->col_type, rs->col_type, rs->ncols * sizeof (* rs->col_type));
6372 memcpy (fc->col_offset, rs->col_offset,
6373 rs->ncols * sizeof (* rs->col_offset));
6374 free (rs->col_type);
6375 free (rs->col_offset);
6376 free (rs);
6377 }
6378 else if (do_debug_frames_interp)
6379 printf ("Mismatched DW_CFA_restore_state\n");
6380 break;
6381
6382 case DW_CFA_def_cfa:
6383 fc->cfa_reg = LEB ();
6384 fc->cfa_offset = LEB ();
6385 fc->cfa_exp = 0;
6386 if (! do_debug_frames_interp)
6387 printf (" DW_CFA_def_cfa: %s ofs %d\n",
6388 regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
6389 break;
6390
6391 case DW_CFA_def_cfa_register:
6392 fc->cfa_reg = LEB ();
6393 fc->cfa_exp = 0;
6394 if (! do_debug_frames_interp)
6395 printf (" DW_CFA_def_cfa_register: %s\n",
6396 regname (fc->cfa_reg, 0));
6397 break;
6398
6399 case DW_CFA_def_cfa_offset:
6400 fc->cfa_offset = LEB ();
6401 if (! do_debug_frames_interp)
6402 printf (" DW_CFA_def_cfa_offset: %d\n", (int) fc->cfa_offset);
6403 break;
6404
6405 case DW_CFA_nop:
6406 if (! do_debug_frames_interp)
6407 printf (" DW_CFA_nop\n");
6408 break;
6409
6410 case DW_CFA_def_cfa_expression:
6411 ul = LEB ();
6412 if (start >= block_end || start + ul > block_end || start + ul < start)
6413 {
6414 printf (_(" DW_CFA_def_cfa_expression: <corrupt len %lu>\n"), ul);
6415 break;
6416 }
6417 if (! do_debug_frames_interp)
6418 {
6419 printf (" DW_CFA_def_cfa_expression (");
6420 decode_location_expression (start, eh_addr_size, 0, -1,
6421 ul, 0, section);
6422 printf (")\n");
6423 }
6424 fc->cfa_exp = 1;
6425 start += ul;
6426 break;
6427
6428 case DW_CFA_expression:
6429 reg = LEB ();
6430 ul = LEB ();
6431 if (reg >= (unsigned int) fc->ncols)
6432 reg_prefix = bad_reg;
6433 /* PR 17512: file: 069-133014-0.006. */
6434 /* PR 17512: file: 98c02eb4. */
6435 tmp = start + ul;
6436 if (start >= block_end || tmp > block_end || tmp < start)
6437 {
6438 printf (_(" DW_CFA_expression: <corrupt len %lu>\n"), ul);
6439 break;
6440 }
6441 if (! do_debug_frames_interp || *reg_prefix != '\0')
6442 {
6443 printf (" DW_CFA_expression: %s%s (",
6444 reg_prefix, regname (reg, 0));
6445 decode_location_expression (start, eh_addr_size, 0, -1,
6446 ul, 0, section);
6447 printf (")\n");
6448 }
6449 if (*reg_prefix == '\0')
6450 fc->col_type[reg] = DW_CFA_expression;
6451 start = tmp;
6452 break;
6453
6454 case DW_CFA_val_expression:
6455 reg = LEB ();
6456 ul = LEB ();
6457 if (reg >= (unsigned int) fc->ncols)
6458 reg_prefix = bad_reg;
6459 tmp = start + ul;
6460 if (start >= block_end || tmp > block_end || tmp < start)
6461 {
6462 printf (" DW_CFA_val_expression: <corrupt len %lu>\n", ul);
6463 break;
6464 }
6465 if (! do_debug_frames_interp || *reg_prefix != '\0')
6466 {
6467 printf (" DW_CFA_val_expression: %s%s (",
6468 reg_prefix, regname (reg, 0));
6469 decode_location_expression (start, eh_addr_size, 0, -1,
6470 ul, 0, section);
6471 printf (")\n");
6472 }
6473 if (*reg_prefix == '\0')
6474 fc->col_type[reg] = DW_CFA_val_expression;
6475 start = tmp;
6476 break;
6477
6478 case DW_CFA_offset_extended_sf:
6479 reg = LEB ();
6480 l = SLEB ();
6481 if (frame_need_space (fc, reg) < 0)
6482 reg_prefix = bad_reg;
6483 if (! do_debug_frames_interp || *reg_prefix != '\0')
6484 printf (" DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
6485 reg_prefix, regname (reg, 0),
6486 (long)(l * fc->data_factor));
6487 if (*reg_prefix == '\0')
6488 {
6489 fc->col_type[reg] = DW_CFA_offset;
6490 fc->col_offset[reg] = l * fc->data_factor;
6491 }
6492 break;
6493
6494 case DW_CFA_val_offset_sf:
6495 reg = LEB ();
6496 l = SLEB ();
6497 if (frame_need_space (fc, reg) < 0)
6498 reg_prefix = bad_reg;
6499 if (! do_debug_frames_interp || *reg_prefix != '\0')
6500 printf (" DW_CFA_val_offset_sf: %s%s at cfa%+ld\n",
6501 reg_prefix, regname (reg, 0),
6502 (long)(l * fc->data_factor));
6503 if (*reg_prefix == '\0')
6504 {
6505 fc->col_type[reg] = DW_CFA_val_offset;
6506 fc->col_offset[reg] = l * fc->data_factor;
6507 }
6508 break;
6509
6510 case DW_CFA_def_cfa_sf:
6511 fc->cfa_reg = LEB ();
6512 fc->cfa_offset = SLEB ();
6513 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
6514 fc->cfa_exp = 0;
6515 if (! do_debug_frames_interp)
6516 printf (" DW_CFA_def_cfa_sf: %s ofs %d\n",
6517 regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
6518 break;
6519
6520 case DW_CFA_def_cfa_offset_sf:
6521 fc->cfa_offset = SLEB ();
6522 fc->cfa_offset *= fc->data_factor;
6523 if (! do_debug_frames_interp)
6524 printf (" DW_CFA_def_cfa_offset_sf: %d\n", (int) fc->cfa_offset);
6525 break;
6526
6527 case DW_CFA_MIPS_advance_loc8:
6528 SAFE_BYTE_GET_AND_INC (ofs, start, 8, block_end);
6529 if (do_debug_frames_interp)
6530 frame_display_row (fc, &need_col_headers, &max_regs);
6531 else
6532 printf (" DW_CFA_MIPS_advance_loc8: %ld to %s\n",
6533 (unsigned long) (ofs * fc->code_factor),
6534 dwarf_vmatoa_1 (NULL,
6535 fc->pc_begin + ofs * fc->code_factor,
6536 fc->ptr_size));
6537 fc->pc_begin += ofs * fc->code_factor;
6538 break;
6539
6540 case DW_CFA_GNU_window_save:
6541 if (! do_debug_frames_interp)
6542 printf (" DW_CFA_GNU_window_save\n");
6543 break;
6544
6545 case DW_CFA_GNU_args_size:
6546 ul = LEB ();
6547 if (! do_debug_frames_interp)
6548 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
6549 break;
6550
6551 case DW_CFA_GNU_negative_offset_extended:
6552 reg = LEB ();
6553 l = - LEB ();
6554 if (frame_need_space (fc, reg) < 0)
6555 reg_prefix = bad_reg;
6556 if (! do_debug_frames_interp || *reg_prefix != '\0')
6557 printf (" DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
6558 reg_prefix, regname (reg, 0),
6559 (long)(l * fc->data_factor));
6560 if (*reg_prefix == '\0')
6561 {
6562 fc->col_type[reg] = DW_CFA_offset;
6563 fc->col_offset[reg] = l * fc->data_factor;
6564 }
6565 break;
6566
6567 default:
6568 if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
6569 printf (_(" DW_CFA_??? (User defined call frame op: %#x)\n"), op);
6570 else
6571 warn (_("Unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
6572 start = block_end;
6573 }
6574 }
6575
6576 if (do_debug_frames_interp)
6577 frame_display_row (fc, &need_col_headers, &max_regs);
6578
6579 start = block_end;
6580 eh_addr_size = saved_eh_addr_size;
6581 }
6582
6583 printf ("\n");
6584
6585 return 1;
6586 }
6587
6588 #undef GET
6589 #undef LEB
6590 #undef SLEB
6591
6592 static int
6593 display_gdb_index (struct dwarf_section *section,
6594 void *file ATTRIBUTE_UNUSED)
6595 {
6596 unsigned char *start = section->start;
6597 uint32_t version;
6598 uint32_t cu_list_offset, tu_list_offset;
6599 uint32_t address_table_offset, symbol_table_offset, constant_pool_offset;
6600 unsigned int cu_list_elements, tu_list_elements;
6601 unsigned int address_table_size, symbol_table_slots;
6602 unsigned char *cu_list, *tu_list;
6603 unsigned char *address_table, *symbol_table, *constant_pool;
6604 unsigned int i;
6605
6606 /* The documentation for the format of this file is in gdb/dwarf2read.c. */
6607
6608 printf (_("Contents of the %s section:\n"), section->name);
6609
6610 if (section->size < 6 * sizeof (uint32_t))
6611 {
6612 warn (_("Truncated header in the %s section.\n"), section->name);
6613 return 0;
6614 }
6615
6616 version = byte_get_little_endian (start, 4);
6617 printf (_("Version %ld\n"), (long) version);
6618
6619 /* Prior versions are obsolete, and future versions may not be
6620 backwards compatible. */
6621 if (version < 3 || version > 8)
6622 {
6623 warn (_("Unsupported version %lu.\n"), (unsigned long) version);
6624 return 0;
6625 }
6626 if (version < 4)
6627 warn (_("The address table data in version 3 may be wrong.\n"));
6628 if (version < 5)
6629 warn (_("Version 4 does not support case insensitive lookups.\n"));
6630 if (version < 6)
6631 warn (_("Version 5 does not include inlined functions.\n"));
6632 if (version < 7)
6633 warn (_("Version 6 does not include symbol attributes.\n"));
6634 /* Version 7 indices generated by Gold have bad type unit references,
6635 PR binutils/15021. But we don't know if the index was generated by
6636 Gold or not, so to avoid worrying users with gdb-generated indices
6637 we say nothing for version 7 here. */
6638
6639 cu_list_offset = byte_get_little_endian (start + 4, 4);
6640 tu_list_offset = byte_get_little_endian (start + 8, 4);
6641 address_table_offset = byte_get_little_endian (start + 12, 4);
6642 symbol_table_offset = byte_get_little_endian (start + 16, 4);
6643 constant_pool_offset = byte_get_little_endian (start + 20, 4);
6644
6645 if (cu_list_offset > section->size
6646 || tu_list_offset > section->size
6647 || address_table_offset > section->size
6648 || symbol_table_offset > section->size
6649 || constant_pool_offset > section->size)
6650 {
6651 warn (_("Corrupt header in the %s section.\n"), section->name);
6652 return 0;
6653 }
6654
6655 /* PR 17531: file: 418d0a8a. */
6656 if (tu_list_offset < cu_list_offset)
6657 {
6658 warn (_("TU offset (%x) is less than CU offset (%x)\n"),
6659 tu_list_offset, cu_list_offset);
6660 return 0;
6661 }
6662
6663 cu_list_elements = (tu_list_offset - cu_list_offset) / 8;
6664
6665 if (address_table_offset < tu_list_offset)
6666 {
6667 warn (_("Address table offset (%x) is less than TU offset (%x)\n"),
6668 address_table_offset, tu_list_offset);
6669 return 0;
6670 }
6671
6672 tu_list_elements = (address_table_offset - tu_list_offset) / 8;
6673
6674 /* PR 17531: file: 18a47d3d. */
6675 if (symbol_table_offset < address_table_offset)
6676 {
6677 warn (_("Symbol table offset (%xl) is less then Address table offset (%x)\n"),
6678 symbol_table_offset, address_table_offset);
6679 return 0;
6680 }
6681
6682 address_table_size = symbol_table_offset - address_table_offset;
6683
6684 if (constant_pool_offset < symbol_table_offset)
6685 {
6686 warn (_("Constant pool offset (%x) is less than symbol table offset (%x)\n"),
6687 constant_pool_offset, symbol_table_offset);
6688 return 0;
6689 }
6690
6691 symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8;
6692
6693 cu_list = start + cu_list_offset;
6694 tu_list = start + tu_list_offset;
6695 address_table = start + address_table_offset;
6696 symbol_table = start + symbol_table_offset;
6697 constant_pool = start + constant_pool_offset;
6698
6699 if (address_table + address_table_size * (2 + 8 + 4) > section->start + section->size)
6700 {
6701 warn (_("Address table extends beyond end of section.\n"));
6702 return 0;
6703 }
6704
6705 printf (_("\nCU table:\n"));
6706 for (i = 0; i < cu_list_elements; i += 2)
6707 {
6708 uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8);
6709 uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8);
6710
6711 printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2,
6712 (unsigned long) cu_offset,
6713 (unsigned long) (cu_offset + cu_length - 1));
6714 }
6715
6716 printf (_("\nTU table:\n"));
6717 for (i = 0; i < tu_list_elements; i += 3)
6718 {
6719 uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8);
6720 uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8);
6721 uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8);
6722
6723 printf (_("[%3u] 0x%lx 0x%lx "), i / 3,
6724 (unsigned long) tu_offset,
6725 (unsigned long) type_offset);
6726 print_dwarf_vma (signature, 8);
6727 printf ("\n");
6728 }
6729
6730 printf (_("\nAddress table:\n"));
6731 for (i = 0; i < address_table_size && i <= address_table_size - (2 * 8 + 4);
6732 i += 2 * 8 + 4)
6733 {
6734 uint64_t low = byte_get_little_endian (address_table + i, 8);
6735 uint64_t high = byte_get_little_endian (address_table + i + 8, 8);
6736 uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4);
6737
6738 print_dwarf_vma (low, 8);
6739 print_dwarf_vma (high, 8);
6740 printf (_("%lu\n"), (unsigned long) cu_index);
6741 }
6742
6743 printf (_("\nSymbol table:\n"));
6744 for (i = 0; i < symbol_table_slots; ++i)
6745 {
6746 uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4);
6747 uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4);
6748 uint32_t num_cus, cu;
6749
6750 if (name_offset != 0
6751 || cu_vector_offset != 0)
6752 {
6753 unsigned int j;
6754 unsigned char * adr;
6755
6756 adr = constant_pool + name_offset;
6757 /* PR 17531: file: 5b7b07ad. */
6758 if (adr < constant_pool || adr >= section->start + section->size)
6759 {
6760 printf (_("[%3u] <corrupt offset: %x>"), i, name_offset);
6761 warn (_("Corrupt name offset of 0x%x found for symbol table slot %d\n"),
6762 name_offset, i);
6763 }
6764 else
6765 printf ("[%3u] %.*s:", i,
6766 (int) (section->size - (constant_pool_offset + name_offset)),
6767 constant_pool + name_offset);
6768
6769 adr = constant_pool + cu_vector_offset;
6770 if (adr < constant_pool || adr >= section->start + section->size - 3)
6771 {
6772 printf (_("<invalid CU vector offset: %x>\n"), cu_vector_offset);
6773 warn (_("Corrupt CU vector offset of 0x%x found for symbol table slot %d\n"),
6774 cu_vector_offset, i);
6775 continue;
6776 }
6777
6778 num_cus = byte_get_little_endian (adr, 4);
6779
6780 adr = constant_pool + cu_vector_offset + 4 + num_cus * 4;
6781 if (num_cus * 4 < num_cus
6782 || adr >= section->start + section->size
6783 || adr < constant_pool)
6784 {
6785 printf ("<invalid number of CUs: %d>\n", num_cus);
6786 warn (_("Invalid number of CUs (0x%x) for symbol table slot %d\n"),
6787 num_cus, i);
6788 continue;
6789 }
6790
6791 if (num_cus > 1)
6792 printf ("\n");
6793
6794 for (j = 0; j < num_cus; ++j)
6795 {
6796 int is_static;
6797 gdb_index_symbol_kind kind;
6798
6799 cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4);
6800 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu);
6801 kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu);
6802 cu = GDB_INDEX_CU_VALUE (cu);
6803 /* Convert to TU number if it's for a type unit. */
6804 if (cu >= cu_list_elements / 2)
6805 printf ("%cT%lu", num_cus > 1 ? '\t' : ' ',
6806 (unsigned long) (cu - cu_list_elements / 2));
6807 else
6808 printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu);
6809
6810 printf (" [%s, %s]",
6811 is_static ? _("static") : _("global"),
6812 get_gdb_index_symbol_kind_name (kind));
6813 if (num_cus > 1)
6814 printf ("\n");
6815 }
6816 if (num_cus <= 1)
6817 printf ("\n");
6818 }
6819 }
6820
6821 return 1;
6822 }
6823
6824 /* Pre-allocate enough space for the CU/TU sets needed. */
6825
6826 static void
6827 prealloc_cu_tu_list (unsigned int nshndx)
6828 {
6829 if (shndx_pool == NULL)
6830 {
6831 shndx_pool_size = nshndx;
6832 shndx_pool_used = 0;
6833 shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size,
6834 sizeof (unsigned int));
6835 }
6836 else
6837 {
6838 shndx_pool_size = shndx_pool_used + nshndx;
6839 shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size,
6840 sizeof (unsigned int));
6841 }
6842 }
6843
6844 static void
6845 add_shndx_to_cu_tu_entry (unsigned int shndx)
6846 {
6847 if (shndx_pool_used >= shndx_pool_size)
6848 {
6849 error (_("Internal error: out of space in the shndx pool.\n"));
6850 return;
6851 }
6852 shndx_pool [shndx_pool_used++] = shndx;
6853 }
6854
6855 static void
6856 end_cu_tu_entry (void)
6857 {
6858 if (shndx_pool_used >= shndx_pool_size)
6859 {
6860 error (_("Internal error: out of space in the shndx pool.\n"));
6861 return;
6862 }
6863 shndx_pool [shndx_pool_used++] = 0;
6864 }
6865
6866 /* Return the short name of a DWARF section given by a DW_SECT enumerator. */
6867
6868 static const char *
6869 get_DW_SECT_short_name (unsigned int dw_sect)
6870 {
6871 static char buf[16];
6872
6873 switch (dw_sect)
6874 {
6875 case DW_SECT_INFO:
6876 return "info";
6877 case DW_SECT_TYPES:
6878 return "types";
6879 case DW_SECT_ABBREV:
6880 return "abbrev";
6881 case DW_SECT_LINE:
6882 return "line";
6883 case DW_SECT_LOC:
6884 return "loc";
6885 case DW_SECT_STR_OFFSETS:
6886 return "str_off";
6887 case DW_SECT_MACINFO:
6888 return "macinfo";
6889 case DW_SECT_MACRO:
6890 return "macro";
6891 default:
6892 break;
6893 }
6894
6895 snprintf (buf, sizeof (buf), "%d", dw_sect);
6896 return buf;
6897 }
6898
6899 /* Process a CU or TU index. If DO_DISPLAY is true, print the contents.
6900 These sections are extensions for Fission.
6901 See http://gcc.gnu.org/wiki/DebugFissionDWP. */
6902
6903 static int
6904 process_cu_tu_index (struct dwarf_section *section, int do_display)
6905 {
6906 unsigned char *phdr = section->start;
6907 unsigned char *limit = phdr + section->size;
6908 unsigned char *phash;
6909 unsigned char *pindex;
6910 unsigned char *ppool;
6911 unsigned int version;
6912 unsigned int ncols = 0;
6913 unsigned int nused;
6914 unsigned int nslots;
6915 unsigned int i;
6916 unsigned int j;
6917 dwarf_vma signature_high;
6918 dwarf_vma signature_low;
6919 char buf[64];
6920
6921 /* PR 17512: file: 002-168123-0.004. */
6922 if (phdr == NULL)
6923 {
6924 warn (_("Section %s is empty\n"), section->name);
6925 return 0;
6926 }
6927 /* PR 17512: file: 002-376-0.004. */
6928 if (section->size < 24)
6929 {
6930 warn (_("Section %s is too small to contain a CU/TU header\n"),
6931 section->name);
6932 return 0;
6933 }
6934
6935 SAFE_BYTE_GET (version, phdr, 4, limit);
6936 if (version >= 2)
6937 SAFE_BYTE_GET (ncols, phdr + 4, 4, limit);
6938 SAFE_BYTE_GET (nused, phdr + 8, 4, limit);
6939 SAFE_BYTE_GET (nslots, phdr + 12, 4, limit);
6940
6941 phash = phdr + 16;
6942 pindex = phash + nslots * 8;
6943 ppool = pindex + nslots * 4;
6944
6945 /* PR 17531: file: 45d69832. */
6946 if (pindex < phash || ppool < phdr || (pindex == phash && nslots != 0))
6947 {
6948 warn (_("Section %s is too small for %d slots\n"),
6949 section->name, nslots);
6950 return 0;
6951 }
6952
6953 if (do_display)
6954 {
6955 printf (_("Contents of the %s section:\n\n"), section->name);
6956 printf (_(" Version: %d\n"), version);
6957 if (version >= 2)
6958 printf (_(" Number of columns: %d\n"), ncols);
6959 printf (_(" Number of used entries: %d\n"), nused);
6960 printf (_(" Number of slots: %d\n\n"), nslots);
6961 }
6962
6963 if (ppool > limit || ppool < phdr)
6964 {
6965 warn (_("Section %s too small for %d hash table entries\n"),
6966 section->name, nslots);
6967 return 0;
6968 }
6969
6970 if (version == 1)
6971 {
6972 if (!do_display)
6973 prealloc_cu_tu_list ((limit - ppool) / 4);
6974 for (i = 0; i < nslots; i++)
6975 {
6976 unsigned char *shndx_list;
6977 unsigned int shndx;
6978
6979 SAFE_BYTE_GET64 (phash, &signature_high, &signature_low, limit);
6980 if (signature_high != 0 || signature_low != 0)
6981 {
6982 SAFE_BYTE_GET (j, pindex, 4, limit);
6983 shndx_list = ppool + j * 4;
6984 /* PR 17531: file: 705e010d. */
6985 if (shndx_list < ppool)
6986 {
6987 warn (_("Section index pool located before start of section\n"));
6988 return 0;
6989 }
6990
6991 if (do_display)
6992 printf (_(" [%3d] Signature: 0x%s Sections: "),
6993 i, dwarf_vmatoa64 (signature_high, signature_low,
6994 buf, sizeof (buf)));
6995 for (;;)
6996 {
6997 if (shndx_list >= limit)
6998 {
6999 warn (_("Section %s too small for shndx pool\n"),
7000 section->name);
7001 return 0;
7002 }
7003 SAFE_BYTE_GET (shndx, shndx_list, 4, limit);
7004 if (shndx == 0)
7005 break;
7006 if (do_display)
7007 printf (" %d", shndx);
7008 else
7009 add_shndx_to_cu_tu_entry (shndx);
7010 shndx_list += 4;
7011 }
7012 if (do_display)
7013 printf ("\n");
7014 else
7015 end_cu_tu_entry ();
7016 }
7017 phash += 8;
7018 pindex += 4;
7019 }
7020 }
7021 else if (version == 2)
7022 {
7023 unsigned int val;
7024 unsigned int dw_sect;
7025 unsigned char *ph = phash;
7026 unsigned char *pi = pindex;
7027 unsigned char *poffsets = ppool + ncols * 4;
7028 unsigned char *psizes = poffsets + nused * ncols * 4;
7029 unsigned char *pend = psizes + nused * ncols * 4;
7030 bfd_boolean is_tu_index;
7031 struct cu_tu_set *this_set = NULL;
7032 unsigned int row;
7033 unsigned char *prow;
7034
7035 is_tu_index = strcmp (section->name, ".debug_tu_index") == 0;
7036
7037 /* PR 17531: file: 0dd159bf.
7038 Check for wraparound with an overlarge ncols value. */
7039 if (poffsets < ppool || (unsigned int) ((poffsets - ppool) / 4) != ncols)
7040 {
7041 warn (_("Overlarge number of columns: %x\n"), ncols);
7042 return 0;
7043 }
7044
7045 if (pend > limit)
7046 {
7047 warn (_("Section %s too small for offset and size tables\n"),
7048 section->name);
7049 return 0;
7050 }
7051
7052 if (do_display)
7053 {
7054 printf (_(" Offset table\n"));
7055 printf (" slot %-16s ",
7056 is_tu_index ? _("signature") : _("dwo_id"));
7057 }
7058 else
7059 {
7060 if (is_tu_index)
7061 {
7062 tu_count = nused;
7063 tu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
7064 this_set = tu_sets;
7065 }
7066 else
7067 {
7068 cu_count = nused;
7069 cu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
7070 this_set = cu_sets;
7071 }
7072 }
7073
7074 if (do_display)
7075 {
7076 for (j = 0; j < ncols; j++)
7077 {
7078 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
7079 printf (" %8s", get_DW_SECT_short_name (dw_sect));
7080 }
7081 printf ("\n");
7082 }
7083
7084 for (i = 0; i < nslots; i++)
7085 {
7086 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
7087
7088 SAFE_BYTE_GET (row, pi, 4, limit);
7089 if (row != 0)
7090 {
7091 /* PR 17531: file: a05f6ab3. */
7092 if (row > nused)
7093 {
7094 warn (_("Row index (%u) is larger than number of used entries (%u)\n"),
7095 row, nused);
7096 return 0;
7097 }
7098
7099 if (!do_display)
7100 memcpy (&this_set[row - 1].signature, ph, sizeof (uint64_t));
7101
7102 prow = poffsets + (row - 1) * ncols * 4;
7103 /* PR 17531: file: b8ce60a8. */
7104 if (prow < poffsets || prow > limit)
7105 {
7106 warn (_("Row index (%u) * num columns (%u) > space remaining in section\n"),
7107 row, ncols);
7108 return 0;
7109 }
7110
7111 if (do_display)
7112 printf (_(" [%3d] 0x%s"),
7113 i, dwarf_vmatoa64 (signature_high, signature_low,
7114 buf, sizeof (buf)));
7115 for (j = 0; j < ncols; j++)
7116 {
7117 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
7118 if (do_display)
7119 printf (" %8d", val);
7120 else
7121 {
7122 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
7123
7124 /* PR 17531: file: 10796eb3. */
7125 if (dw_sect >= DW_SECT_MAX)
7126 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
7127 else
7128 this_set [row - 1].section_offsets [dw_sect] = val;
7129 }
7130 }
7131
7132 if (do_display)
7133 printf ("\n");
7134 }
7135 ph += 8;
7136 pi += 4;
7137 }
7138
7139 ph = phash;
7140 pi = pindex;
7141 if (do_display)
7142 {
7143 printf ("\n");
7144 printf (_(" Size table\n"));
7145 printf (" slot %-16s ",
7146 is_tu_index ? _("signature") : _("dwo_id"));
7147 }
7148
7149 for (j = 0; j < ncols; j++)
7150 {
7151 SAFE_BYTE_GET (val, ppool + j * 4, 4, limit);
7152 if (do_display)
7153 printf (" %8s", get_DW_SECT_short_name (val));
7154 }
7155
7156 if (do_display)
7157 printf ("\n");
7158
7159 for (i = 0; i < nslots; i++)
7160 {
7161 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
7162
7163 SAFE_BYTE_GET (row, pi, 4, limit);
7164 if (row != 0)
7165 {
7166 prow = psizes + (row - 1) * ncols * 4;
7167
7168 if (do_display)
7169 printf (_(" [%3d] 0x%s"),
7170 i, dwarf_vmatoa64 (signature_high, signature_low,
7171 buf, sizeof (buf)));
7172
7173 for (j = 0; j < ncols; j++)
7174 {
7175 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
7176 if (do_display)
7177 printf (" %8d", val);
7178 else
7179 {
7180 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
7181 if (dw_sect >= DW_SECT_MAX)
7182 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
7183 else
7184 this_set [row - 1].section_sizes [dw_sect] = val;
7185 }
7186 }
7187
7188 if (do_display)
7189 printf ("\n");
7190 }
7191
7192 ph += 8;
7193 pi += 4;
7194 }
7195 }
7196 else if (do_display)
7197 printf (_(" Unsupported version (%d)\n"), version);
7198
7199 if (do_display)
7200 printf ("\n");
7201
7202 return 1;
7203 }
7204
7205 /* Load the CU and TU indexes if present. This will build a list of
7206 section sets that we can use to associate a .debug_info.dwo section
7207 with its associated .debug_abbrev.dwo section in a .dwp file. */
7208
7209 static void
7210 load_cu_tu_indexes (void *file)
7211 {
7212 /* If we have already loaded (or tried to load) the CU and TU indexes
7213 then do not bother to repeat the task. */
7214 if (cu_tu_indexes_read)
7215 return;
7216
7217 if (load_debug_section (dwp_cu_index, file))
7218 process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0);
7219
7220 if (load_debug_section (dwp_tu_index, file))
7221 process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0);
7222
7223 cu_tu_indexes_read = 1;
7224 }
7225
7226 /* Find the set of sections that includes section SHNDX. */
7227
7228 unsigned int *
7229 find_cu_tu_set (void *file, unsigned int shndx)
7230 {
7231 unsigned int i;
7232
7233 load_cu_tu_indexes (file);
7234
7235 /* Find SHNDX in the shndx pool. */
7236 for (i = 0; i < shndx_pool_used; i++)
7237 if (shndx_pool [i] == shndx)
7238 break;
7239
7240 if (i >= shndx_pool_used)
7241 return NULL;
7242
7243 /* Now backup to find the first entry in the set. */
7244 while (i > 0 && shndx_pool [i - 1] != 0)
7245 i--;
7246
7247 return shndx_pool + i;
7248 }
7249
7250 /* Display a .debug_cu_index or .debug_tu_index section. */
7251
7252 static int
7253 display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
7254 {
7255 return process_cu_tu_index (section, 1);
7256 }
7257
7258 static int
7259 display_debug_not_supported (struct dwarf_section *section,
7260 void *file ATTRIBUTE_UNUSED)
7261 {
7262 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
7263 section->name);
7264
7265 return 1;
7266 }
7267
7268 /* Like malloc, but takes two parameters like calloc.
7269 Verifies that the first parameter is not too large.
7270 Note: does *not* initialise the allocated memory to zero. */
7271 void *
7272 cmalloc (size_t nmemb, size_t size)
7273 {
7274 /* Check for overflow. */
7275 if (nmemb >= ~(size_t) 0 / size)
7276 return NULL;
7277
7278 return xmalloc (nmemb * size);
7279 }
7280
7281 /* Like xmalloc, but takes two parameters like calloc.
7282 Verifies that the first parameter is not too large.
7283 Note: does *not* initialise the allocated memory to zero. */
7284 void *
7285 xcmalloc (size_t nmemb, size_t size)
7286 {
7287 /* Check for overflow. */
7288 if (nmemb >= ~(size_t) 0 / size)
7289 {
7290 fprintf (stderr,
7291 _("Attempt to allocate an array with an excessive number of elements: 0x%lx\n"),
7292 (long) nmemb);
7293 xexit (1);
7294 }
7295
7296 return xmalloc (nmemb * size);
7297 }
7298
7299 /* Like xrealloc, but takes three parameters.
7300 Verifies that the second parameter is not too large.
7301 Note: does *not* initialise any new memory to zero. */
7302 void *
7303 xcrealloc (void *ptr, size_t nmemb, size_t size)
7304 {
7305 /* Check for overflow. */
7306 if (nmemb >= ~(size_t) 0 / size)
7307 {
7308 fprintf (stderr,
7309 _("Attempt to re-allocate an array with an excessive number of elements: 0x%lx\n"),
7310 (long) nmemb);
7311 xexit (1);
7312 }
7313
7314 return xrealloc (ptr, nmemb * size);
7315 }
7316
7317 /* Like xcalloc, but verifies that the first parameter is not too large. */
7318 void *
7319 xcalloc2 (size_t nmemb, size_t size)
7320 {
7321 /* Check for overflow. */
7322 if (nmemb >= ~(size_t) 0 / size)
7323 {
7324 fprintf (stderr,
7325 _("Attempt to allocate a zero'ed array with an excessive number of elements: 0x%lx\n"),
7326 (long) nmemb);
7327 xexit (1);
7328 }
7329
7330 return xcalloc (nmemb, size);
7331 }
7332
7333 void
7334 free_debug_memory (void)
7335 {
7336 unsigned int i;
7337
7338 free_abbrevs ();
7339
7340 for (i = 0; i < max; i++)
7341 free_debug_section ((enum dwarf_section_display_enum) i);
7342
7343 if (debug_information != NULL)
7344 {
7345 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
7346 {
7347 for (i = 0; i < num_debug_info_entries; i++)
7348 {
7349 if (!debug_information [i].max_loc_offsets)
7350 {
7351 free (debug_information [i].loc_offsets);
7352 free (debug_information [i].have_frame_base);
7353 }
7354 if (!debug_information [i].max_range_lists)
7355 free (debug_information [i].range_lists);
7356 }
7357 }
7358 free (debug_information);
7359 debug_information = NULL;
7360 alloc_num_debug_info_entries = num_debug_info_entries = 0;
7361 }
7362 }
7363
7364 void
7365 dwarf_select_sections_by_names (const char *names)
7366 {
7367 typedef struct
7368 {
7369 const char * option;
7370 int * variable;
7371 int val;
7372 }
7373 debug_dump_long_opts;
7374
7375 static const debug_dump_long_opts opts_table [] =
7376 {
7377 /* Please keep this table alpha- sorted. */
7378 { "Ranges", & do_debug_ranges, 1 },
7379 { "abbrev", & do_debug_abbrevs, 1 },
7380 { "addr", & do_debug_addr, 1 },
7381 { "aranges", & do_debug_aranges, 1 },
7382 { "cu_index", & do_debug_cu_index, 1 },
7383 { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
7384 { "frames", & do_debug_frames, 1 },
7385 { "frames-interp", & do_debug_frames_interp, 1 },
7386 /* The special .gdb_index section. */
7387 { "gdb_index", & do_gdb_index, 1 },
7388 { "info", & do_debug_info, 1 },
7389 { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility. */
7390 { "loc", & do_debug_loc, 1 },
7391 { "macro", & do_debug_macinfo, 1 },
7392 { "pubnames", & do_debug_pubnames, 1 },
7393 { "pubtypes", & do_debug_pubtypes, 1 },
7394 /* This entry is for compatability
7395 with earlier versions of readelf. */
7396 { "ranges", & do_debug_aranges, 1 },
7397 { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
7398 { "str", & do_debug_str, 1 },
7399 /* These trace_* sections are used by Itanium VMS. */
7400 { "trace_abbrev", & do_trace_abbrevs, 1 },
7401 { "trace_aranges", & do_trace_aranges, 1 },
7402 { "trace_info", & do_trace_info, 1 },
7403 { NULL, NULL, 0 }
7404 };
7405
7406 const char *p;
7407
7408 p = names;
7409 while (*p)
7410 {
7411 const debug_dump_long_opts * entry;
7412
7413 for (entry = opts_table; entry->option; entry++)
7414 {
7415 size_t len = strlen (entry->option);
7416
7417 if (strncmp (p, entry->option, len) == 0
7418 && (p[len] == ',' || p[len] == '\0'))
7419 {
7420 * entry->variable |= entry->val;
7421
7422 /* The --debug-dump=frames-interp option also
7423 enables the --debug-dump=frames option. */
7424 if (do_debug_frames_interp)
7425 do_debug_frames = 1;
7426
7427 p += len;
7428 break;
7429 }
7430 }
7431
7432 if (entry->option == NULL)
7433 {
7434 warn (_("Unrecognized debug option '%s'\n"), p);
7435 p = strchr (p, ',');
7436 if (p == NULL)
7437 break;
7438 }
7439
7440 if (*p == ',')
7441 p++;
7442 }
7443 }
7444
7445 void
7446 dwarf_select_sections_by_letters (const char *letters)
7447 {
7448 unsigned int lindex = 0;
7449
7450 while (letters[lindex])
7451 switch (letters[lindex++])
7452 {
7453 case 'i':
7454 do_debug_info = 1;
7455 break;
7456
7457 case 'a':
7458 do_debug_abbrevs = 1;
7459 break;
7460
7461 case 'l':
7462 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
7463 break;
7464
7465 case 'L':
7466 do_debug_lines |= FLAG_DEBUG_LINES_DECODED;
7467 break;
7468
7469 case 'p':
7470 do_debug_pubnames = 1;
7471 break;
7472
7473 case 't':
7474 do_debug_pubtypes = 1;
7475 break;
7476
7477 case 'r':
7478 do_debug_aranges = 1;
7479 break;
7480
7481 case 'R':
7482 do_debug_ranges = 1;
7483 break;
7484
7485 case 'F':
7486 do_debug_frames_interp = 1;
7487 case 'f':
7488 do_debug_frames = 1;
7489 break;
7490
7491 case 'm':
7492 do_debug_macinfo = 1;
7493 break;
7494
7495 case 's':
7496 do_debug_str = 1;
7497 break;
7498
7499 case 'o':
7500 do_debug_loc = 1;
7501 break;
7502
7503 default:
7504 warn (_("Unrecognized debug option '%s'\n"), letters);
7505 break;
7506 }
7507 }
7508
7509 void
7510 dwarf_select_sections_all (void)
7511 {
7512 do_debug_info = 1;
7513 do_debug_abbrevs = 1;
7514 do_debug_lines = FLAG_DEBUG_LINES_RAW;
7515 do_debug_pubnames = 1;
7516 do_debug_pubtypes = 1;
7517 do_debug_aranges = 1;
7518 do_debug_ranges = 1;
7519 do_debug_frames = 1;
7520 do_debug_macinfo = 1;
7521 do_debug_str = 1;
7522 do_debug_loc = 1;
7523 do_gdb_index = 1;
7524 do_trace_info = 1;
7525 do_trace_abbrevs = 1;
7526 do_trace_aranges = 1;
7527 do_debug_addr = 1;
7528 do_debug_cu_index = 1;
7529 }
7530
7531 struct dwarf_section_display debug_displays[] =
7532 {
7533 { { ".debug_abbrev", ".zdebug_abbrev", NULL, NULL, 0, 0, 0, NULL },
7534 display_debug_abbrev, &do_debug_abbrevs, 0 },
7535 { { ".debug_aranges", ".zdebug_aranges", NULL, NULL, 0, 0, 0, NULL },
7536 display_debug_aranges, &do_debug_aranges, 1 },
7537 { { ".debug_frame", ".zdebug_frame", NULL, NULL, 0, 0, 0, NULL },
7538 display_debug_frames, &do_debug_frames, 1 },
7539 { { ".debug_info", ".zdebug_info", NULL, NULL, 0, 0, abbrev, NULL },
7540 display_debug_info, &do_debug_info, 1 },
7541 { { ".debug_line", ".zdebug_line", NULL, NULL, 0, 0, 0, NULL },
7542 display_debug_lines, &do_debug_lines, 1 },
7543 { { ".debug_pubnames", ".zdebug_pubnames", NULL, NULL, 0, 0, 0, NULL },
7544 display_debug_pubnames, &do_debug_pubnames, 0 },
7545 { { ".debug_gnu_pubnames", ".zdebug_gnu_pubnames", NULL, NULL, 0, 0, 0, NULL },
7546 display_debug_gnu_pubnames, &do_debug_pubnames, 0 },
7547 { { ".eh_frame", "", NULL, NULL, 0, 0, 0, NULL },
7548 display_debug_frames, &do_debug_frames, 1 },
7549 { { ".debug_macinfo", ".zdebug_macinfo", NULL, NULL, 0, 0, 0, NULL },
7550 display_debug_macinfo, &do_debug_macinfo, 0 },
7551 { { ".debug_macro", ".zdebug_macro", NULL, NULL, 0, 0, 0, NULL },
7552 display_debug_macro, &do_debug_macinfo, 1 },
7553 { { ".debug_str", ".zdebug_str", NULL, NULL, 0, 0, 0, NULL },
7554 display_debug_str, &do_debug_str, 0 },
7555 { { ".debug_loc", ".zdebug_loc", NULL, NULL, 0, 0, 0, NULL },
7556 display_debug_loc, &do_debug_loc, 1 },
7557 { { ".debug_pubtypes", ".zdebug_pubtypes", NULL, NULL, 0, 0, 0, NULL },
7558 display_debug_pubnames, &do_debug_pubtypes, 0 },
7559 { { ".debug_gnu_pubtypes", ".zdebug_gnu_pubtypes", NULL, NULL, 0, 0, 0, NULL },
7560 display_debug_gnu_pubnames, &do_debug_pubtypes, 0 },
7561 { { ".debug_ranges", ".zdebug_ranges", NULL, NULL, 0, 0, 0, NULL },
7562 display_debug_ranges, &do_debug_ranges, 1 },
7563 { { ".debug_static_func", ".zdebug_static_func", NULL, NULL, 0, 0, 0, NULL },
7564 display_debug_not_supported, NULL, 0 },
7565 { { ".debug_static_vars", ".zdebug_static_vars", NULL, NULL, 0, 0, 0, NULL },
7566 display_debug_not_supported, NULL, 0 },
7567 { { ".debug_types", ".zdebug_types", NULL, NULL, 0, 0, abbrev, NULL },
7568 display_debug_types, &do_debug_info, 1 },
7569 { { ".debug_weaknames", ".zdebug_weaknames", NULL, NULL, 0, 0, 0, NULL },
7570 display_debug_not_supported, NULL, 0 },
7571 { { ".gdb_index", "", NULL, NULL, 0, 0, 0, NULL },
7572 display_gdb_index, &do_gdb_index, 0 },
7573 { { ".trace_info", "", NULL, NULL, 0, 0, trace_abbrev, NULL },
7574 display_trace_info, &do_trace_info, 1 },
7575 { { ".trace_abbrev", "", NULL, NULL, 0, 0, 0, NULL },
7576 display_debug_abbrev, &do_trace_abbrevs, 0 },
7577 { { ".trace_aranges", "", NULL, NULL, 0, 0, 0, NULL },
7578 display_debug_aranges, &do_trace_aranges, 0 },
7579 { { ".debug_info.dwo", ".zdebug_info.dwo", NULL, NULL, 0, 0, abbrev_dwo, NULL },
7580 display_debug_info, &do_debug_info, 1 },
7581 { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", NULL, NULL, 0, 0, 0, NULL },
7582 display_debug_abbrev, &do_debug_abbrevs, 0 },
7583 { { ".debug_types.dwo", ".zdebug_types.dwo", NULL, NULL, 0, 0, abbrev_dwo, NULL },
7584 display_debug_types, &do_debug_info, 1 },
7585 { { ".debug_line.dwo", ".zdebug_line.dwo", NULL, NULL, 0, 0, 0, NULL },
7586 display_debug_lines, &do_debug_lines, 1 },
7587 { { ".debug_loc.dwo", ".zdebug_loc.dwo", NULL, NULL, 0, 0, 0, NULL },
7588 display_debug_loc, &do_debug_loc, 1 },
7589 { { ".debug_macro.dwo", ".zdebug_macro.dwo", NULL, NULL, 0, 0, 0, NULL },
7590 display_debug_macro, &do_debug_macinfo, 1 },
7591 { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NULL, NULL, 0, 0, 0, NULL },
7592 display_debug_macinfo, &do_debug_macinfo, 0 },
7593 { { ".debug_str.dwo", ".zdebug_str.dwo", NULL, NULL, 0, 0, 0, NULL },
7594 display_debug_str, &do_debug_str, 1 },
7595 { { ".debug_str_offsets", ".zdebug_str_offsets", NULL, NULL, 0, 0, 0, NULL },
7596 display_debug_str_offsets, NULL, 0 },
7597 { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NULL, NULL, 0, 0, 0, NULL },
7598 display_debug_str_offsets, NULL, 0 },
7599 { { ".debug_addr", ".zdebug_addr", NULL, NULL, 0, 0, 0, NULL },
7600 display_debug_addr, &do_debug_addr, 1 },
7601 { { ".debug_cu_index", "", NULL, NULL, 0, 0, 0, NULL },
7602 display_cu_index, &do_debug_cu_index, 0 },
7603 { { ".debug_tu_index", "", NULL, NULL, 0, 0, 0, NULL },
7604 display_cu_index, &do_debug_cu_index, 0 },
7605 };