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