SHF_GNU_RETAIN 7a and 7b tests
[binutils-gdb.git] / binutils / dwarf.c
1 /* dwarf.c -- display DWARF contents of a BFD binary file
2 Copyright (C) 2005-2020 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 #include "filenames.h"
32 #include "safe-ctype.h"
33 #include <assert.h>
34
35 #ifdef HAVE_LIBDEBUGINFOD
36 #include <elfutils/debuginfod.h>
37 #endif
38
39 #undef MAX
40 #undef MIN
41 #define MAX(a, b) ((a) > (b) ? (a) : (b))
42 #define MIN(a, b) ((a) < (b) ? (a) : (b))
43
44 static const char *regname (unsigned int regno, int row);
45 static const char *regname_internal_by_table_only (unsigned int regno);
46
47 static int have_frame_base;
48 static int need_base_address;
49
50 static unsigned int num_debug_info_entries = 0;
51 static unsigned int alloc_num_debug_info_entries = 0;
52 static debug_info *debug_information = NULL;
53 /* Special value for num_debug_info_entries to indicate
54 that the .debug_info section could not be loaded/parsed. */
55 #define DEBUG_INFO_UNAVAILABLE (unsigned int) -1
56
57 /* A .debug_info section can contain multiple links to separate
58 DWO object files. We use these structures to record these links. */
59 typedef enum dwo_type
60 {
61 DWO_NAME,
62 DWO_DIR,
63 DWO_ID
64 } dwo_type;
65
66 typedef struct dwo_info
67 {
68 dwo_type type;
69 const char * value;
70 dwarf_vma cu_offset;
71 struct dwo_info * next;
72 } dwo_info;
73
74 static dwo_info * first_dwo_info = NULL;
75 static bfd_boolean need_dwo_info;
76
77 separate_info * first_separate_info = NULL;
78
79 unsigned int eh_addr_size;
80
81 int do_debug_info;
82 int do_debug_abbrevs;
83 int do_debug_lines;
84 int do_debug_pubnames;
85 int do_debug_pubtypes;
86 int do_debug_aranges;
87 int do_debug_ranges;
88 int do_debug_frames;
89 int do_debug_frames_interp;
90 int do_debug_macinfo;
91 int do_debug_str;
92 int do_debug_str_offsets;
93 int do_debug_loc;
94 int do_gdb_index;
95 int do_trace_info;
96 int do_trace_abbrevs;
97 int do_trace_aranges;
98 int do_debug_addr;
99 int do_debug_cu_index;
100 int do_wide;
101 int do_debug_links;
102 int do_follow_links;
103 bfd_boolean do_checks;
104
105 int dwarf_cutoff_level = -1;
106 unsigned long dwarf_start_die;
107
108 int dwarf_check = 0;
109
110 /* Convenient constant, to avoid having to cast -1 to dwarf_vma when
111 testing whether e.g. a locview list is present. */
112 static const dwarf_vma vm1 = -1;
113
114 /* Collection of CU/TU section sets from .debug_cu_index and .debug_tu_index
115 sections. For version 1 package files, each set is stored in SHNDX_POOL
116 as a zero-terminated list of section indexes comprising one set of debug
117 sections from a .dwo file. */
118
119 static unsigned int *shndx_pool = NULL;
120 static unsigned int shndx_pool_size = 0;
121 static unsigned int shndx_pool_used = 0;
122
123 /* For version 2 package files, each set contains an array of section offsets
124 and an array of section sizes, giving the offset and size of the
125 contribution from a CU or TU within one of the debug sections.
126 When displaying debug info from a package file, we need to use these
127 tables to locate the corresponding contributions to each section. */
128
129 struct cu_tu_set
130 {
131 uint64_t signature;
132 dwarf_vma section_offsets[DW_SECT_MAX];
133 size_t section_sizes[DW_SECT_MAX];
134 };
135
136 static int cu_count = 0;
137 static int tu_count = 0;
138 static struct cu_tu_set *cu_sets = NULL;
139 static struct cu_tu_set *tu_sets = NULL;
140
141 static bfd_boolean load_cu_tu_indexes (void *);
142
143 /* An array that indicates for a given level of CU nesting whether
144 the latest DW_AT_type seen for that level was a signed type or
145 an unsigned type. */
146 #define MAX_CU_NESTING (1 << 8)
147 static bfd_boolean level_type_signed[MAX_CU_NESTING];
148
149 /* Values for do_debug_lines. */
150 #define FLAG_DEBUG_LINES_RAW 1
151 #define FLAG_DEBUG_LINES_DECODED 2
152
153 static unsigned int
154 size_of_encoded_value (int encoding)
155 {
156 switch (encoding & 0x7)
157 {
158 default: /* ??? */
159 case 0: return eh_addr_size;
160 case 2: return 2;
161 case 3: return 4;
162 case 4: return 8;
163 }
164 }
165
166 static dwarf_vma
167 get_encoded_value (unsigned char **pdata,
168 int encoding,
169 struct dwarf_section *section,
170 unsigned char * end)
171 {
172 unsigned char * data = * pdata;
173 unsigned int size = size_of_encoded_value (encoding);
174 dwarf_vma val;
175
176 if (data + size >= end)
177 {
178 warn (_("Encoded value extends past end of section\n"));
179 * pdata = end;
180 return 0;
181 }
182
183 /* PR 17512: file: 002-829853-0.004. */
184 if (size > 8)
185 {
186 warn (_("Encoded size of %d is too large to read\n"), size);
187 * pdata = end;
188 return 0;
189 }
190
191 /* PR 17512: file: 1085-5603-0.004. */
192 if (size == 0)
193 {
194 warn (_("Encoded size of 0 is too small to read\n"));
195 * pdata = end;
196 return 0;
197 }
198
199 if (encoding & DW_EH_PE_signed)
200 val = byte_get_signed (data, size);
201 else
202 val = byte_get (data, size);
203
204 if ((encoding & 0x70) == DW_EH_PE_pcrel)
205 val += section->address + (data - section->start);
206
207 * pdata = data + size;
208 return val;
209 }
210
211 #if defined HAVE_LONG_LONG && SIZEOF_LONG_LONG > SIZEOF_LONG
212 # ifndef __MINGW32__
213 # define DWARF_VMA_FMT "ll"
214 # define DWARF_VMA_FMT_LONG "%16.16llx"
215 # else
216 # define DWARF_VMA_FMT "I64"
217 # define DWARF_VMA_FMT_LONG "%016I64x"
218 # endif
219 #else
220 # define DWARF_VMA_FMT "l"
221 # define DWARF_VMA_FMT_LONG "%16.16lx"
222 #endif
223
224 /* Convert a dwarf vma value into a string. Returns a pointer to a static
225 buffer containing the converted VALUE. The value is converted according
226 to the printf formating character FMTCH. If NUM_BYTES is non-zero then
227 it specifies the maximum number of bytes to be displayed in the converted
228 value and FMTCH is ignored - hex is always used. */
229
230 static const char *
231 dwarf_vmatoa_1 (const char *fmtch, dwarf_vma value, unsigned num_bytes)
232 {
233 /* As dwarf_vmatoa is used more then once in a printf call
234 for output, we are cycling through an fixed array of pointers
235 for return address. */
236 static int buf_pos = 0;
237 static struct dwarf_vmatoa_buf
238 {
239 char place[64];
240 } buf[16];
241 char *ret;
242
243 ret = buf[buf_pos++].place;
244 buf_pos %= ARRAY_SIZE (buf);
245
246 if (num_bytes)
247 {
248 /* Printf does not have a way of specifying a maximum field width for an
249 integer value, so we print the full value into a buffer and then select
250 the precision we need. */
251 snprintf (ret, sizeof (buf[0].place), DWARF_VMA_FMT_LONG, value);
252 if (num_bytes > 8)
253 num_bytes = 8;
254 return ret + (16 - 2 * num_bytes);
255 }
256 else
257 {
258 char fmt[32];
259
260 if (fmtch)
261 sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch);
262 else
263 sprintf (fmt, "%%%s", DWARF_VMA_FMT);
264 snprintf (ret, sizeof (buf[0].place), fmt, value);
265 return ret;
266 }
267 }
268
269 static inline const char *
270 dwarf_vmatoa (const char * fmtch, dwarf_vma value)
271 {
272 return dwarf_vmatoa_1 (fmtch, value, 0);
273 }
274
275 /* Print a dwarf_vma value (typically an address, offset or length) in
276 hexadecimal format, followed by a space. The length of the VALUE (and
277 hence the precision displayed) is determined by the NUM_BYTES parameter. */
278
279 static void
280 print_dwarf_vma (dwarf_vma value, unsigned num_bytes)
281 {
282 printf ("%s ", dwarf_vmatoa_1 (NULL, value, num_bytes));
283 }
284
285 /* Print a view number in hexadecimal value, with the same width
286 print_dwarf_vma would have printed it with the same num_bytes.
287 Print blanks for zero view, unless force is nonzero. */
288
289 static void
290 print_dwarf_view (dwarf_vma value, unsigned num_bytes, int force)
291 {
292 int len;
293 if (!num_bytes)
294 len = 4;
295 else
296 len = num_bytes * 2;
297
298 assert (value == (unsigned long) value);
299 if (value || force)
300 printf ("v%0*lx ", len - 1, (unsigned long) value);
301 else
302 printf ("%*s", len + 1, "");
303 }
304
305 /* Format a 64-bit value, given as two 32-bit values, in hex.
306 For reentrancy, this uses a buffer provided by the caller. */
307
308 static const char *
309 dwarf_vmatoa64 (dwarf_vma hvalue, dwarf_vma lvalue, char *buf,
310 unsigned int buf_len)
311 {
312 int len = 0;
313
314 if (hvalue == 0)
315 snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", lvalue);
316 else
317 {
318 len = snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", hvalue);
319 snprintf (buf + len, buf_len - len,
320 "%08" DWARF_VMA_FMT "x", lvalue);
321 }
322
323 return buf;
324 }
325
326 /* Read in a LEB128 encoded value starting at address DATA.
327 If SIGN is true, return a signed LEB128 value.
328 If LENGTH_RETURN is not NULL, return in it the number of bytes read.
329 If STATUS_RETURN in not NULL, return with bit 0 (LSB) set if the
330 terminating byte was not found and with bit 1 set if the value
331 overflows a dwarf_vma.
332 No bytes will be read at address END or beyond. */
333
334 dwarf_vma
335 read_leb128 (unsigned char *data,
336 const unsigned char *const end,
337 bfd_boolean sign,
338 unsigned int *length_return,
339 int *status_return)
340 {
341 dwarf_vma result = 0;
342 unsigned int num_read = 0;
343 unsigned int shift = 0;
344 int status = 1;
345
346 while (data < end)
347 {
348 unsigned char byte = *data++;
349 bfd_boolean cont = (byte & 0x80) ? TRUE : FALSE;
350
351 byte &= 0x7f;
352 num_read++;
353
354 if (shift < sizeof (result) * 8)
355 {
356 result |= ((dwarf_vma) byte) << shift;
357 if (sign)
358 {
359 if ((((dwarf_signed_vma) result >> shift) & 0x7f) != byte)
360 /* Overflow. */
361 status |= 2;
362 }
363 else if ((result >> shift) != byte)
364 {
365 /* Overflow. */
366 status |= 2;
367 }
368
369 shift += 7;
370 }
371 else if (byte != 0)
372 {
373 status |= 2;
374 }
375
376 if (!cont)
377 {
378 status &= ~1;
379 if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
380 result |= -((dwarf_vma) 1 << shift);
381 break;
382 }
383 }
384
385 if (length_return != NULL)
386 *length_return = num_read;
387 if (status_return != NULL)
388 *status_return = status;
389
390 return result;
391 }
392
393 /* Read AMOUNT bytes from PTR and store them in VAL as an unsigned value.
394 Checks to make sure that the read will not reach or pass END
395 and that VAL is big enough to hold AMOUNT bytes. */
396 #define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END) \
397 do \
398 { \
399 unsigned int amount = (AMOUNT); \
400 if (sizeof (VAL) < amount) \
401 { \
402 error (ngettext ("internal error: attempt to read %d byte " \
403 "of data in to %d sized variable", \
404 "internal error: attempt to read %d bytes " \
405 "of data in to %d sized variable", \
406 amount), \
407 amount, (int) sizeof (VAL)); \
408 amount = sizeof (VAL); \
409 } \
410 if (((PTR) + amount) >= (END)) \
411 { \
412 if ((PTR) < (END)) \
413 amount = (END) - (PTR); \
414 else \
415 amount = 0; \
416 } \
417 if (amount == 0 || amount > 8) \
418 VAL = 0; \
419 else \
420 VAL = byte_get ((PTR), amount); \
421 } \
422 while (0)
423
424 /* Like SAFE_BYTE_GET, but also increments PTR by AMOUNT. */
425 #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
426 do \
427 { \
428 SAFE_BYTE_GET (VAL, PTR, AMOUNT, END); \
429 PTR += AMOUNT; \
430 } \
431 while (0)
432
433 /* Like SAFE_BYTE_GET, but reads a signed value. */
434 #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END) \
435 do \
436 { \
437 unsigned int amount = (AMOUNT); \
438 if (((PTR) + amount) >= (END)) \
439 { \
440 if ((PTR) < (END)) \
441 amount = (END) - (PTR); \
442 else \
443 amount = 0; \
444 } \
445 if (amount) \
446 VAL = byte_get_signed ((PTR), amount); \
447 else \
448 VAL = 0; \
449 } \
450 while (0)
451
452 /* Like SAFE_SIGNED_BYTE_GET, but also increments PTR by AMOUNT. */
453 #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
454 do \
455 { \
456 SAFE_SIGNED_BYTE_GET (VAL, PTR, AMOUNT, END); \
457 PTR += AMOUNT; \
458 } \
459 while (0)
460
461 #define SAFE_BYTE_GET64(PTR, HIGH, LOW, END) \
462 do \
463 { \
464 if (((PTR) + 8) <= (END)) \
465 { \
466 byte_get_64 ((PTR), (HIGH), (LOW)); \
467 } \
468 else \
469 { \
470 * (LOW) = * (HIGH) = 0; \
471 } \
472 } \
473 while (0)
474
475 typedef struct State_Machine_Registers
476 {
477 dwarf_vma address;
478 unsigned int view;
479 unsigned int file;
480 unsigned int line;
481 unsigned int column;
482 int is_stmt;
483 int basic_block;
484 unsigned char op_index;
485 unsigned char end_sequence;
486 /* This variable hold the number of the last entry seen
487 in the File Table. */
488 unsigned int last_file_entry;
489 } SMR;
490
491 static SMR state_machine_regs;
492
493 static void
494 reset_state_machine (int is_stmt)
495 {
496 state_machine_regs.address = 0;
497 state_machine_regs.view = 0;
498 state_machine_regs.op_index = 0;
499 state_machine_regs.file = 1;
500 state_machine_regs.line = 1;
501 state_machine_regs.column = 0;
502 state_machine_regs.is_stmt = is_stmt;
503 state_machine_regs.basic_block = 0;
504 state_machine_regs.end_sequence = 0;
505 state_machine_regs.last_file_entry = 0;
506 }
507
508 /* Handled an extend line op.
509 Returns the number of bytes read. */
510
511 static size_t
512 process_extended_line_op (unsigned char * data,
513 int is_stmt,
514 unsigned char * end)
515 {
516 unsigned char op_code;
517 size_t len, header_len;
518 unsigned char *name;
519 unsigned char *orig_data = data;
520 dwarf_vma adr, val;
521
522 READ_ULEB (len, data, end);
523 header_len = data - orig_data;
524
525 if (len == 0 || data == end || len > (size_t) (end - data))
526 {
527 warn (_("Badly formed extended line op encountered!\n"));
528 return header_len;
529 }
530
531 op_code = *data++;
532
533 printf (_(" Extended opcode %d: "), op_code);
534
535 switch (op_code)
536 {
537 case DW_LNE_end_sequence:
538 printf (_("End of Sequence\n\n"));
539 reset_state_machine (is_stmt);
540 break;
541
542 case DW_LNE_set_address:
543 /* PR 17512: file: 002-100480-0.004. */
544 if (len - 1 > 8)
545 {
546 warn (_("Length (%lu) of DW_LNE_set_address op is too long\n"),
547 (unsigned long) len - 1);
548 adr = 0;
549 }
550 else
551 SAFE_BYTE_GET (adr, data, len - 1, end);
552 printf (_("set Address to 0x%s\n"), dwarf_vmatoa ("x", adr));
553 state_machine_regs.address = adr;
554 state_machine_regs.view = 0;
555 state_machine_regs.op_index = 0;
556 break;
557
558 case DW_LNE_define_file:
559 printf (_("define new File Table entry\n"));
560 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
561 printf (" %d\t", ++state_machine_regs.last_file_entry);
562
563 {
564 size_t l;
565
566 name = data;
567 l = strnlen ((char *) data, end - data);
568 data += l + 1;
569 READ_ULEB (val, data, end);
570 printf ("%s\t", dwarf_vmatoa ("u", val));
571 READ_ULEB (val, data, end);
572 printf ("%s\t", dwarf_vmatoa ("u", val));
573 READ_ULEB (val, data, end);
574 printf ("%s\t", dwarf_vmatoa ("u", val));
575 printf ("%.*s\n\n", (int) l, name);
576 }
577
578 if (((size_t) (data - orig_data) != len + header_len) || data == end)
579 warn (_("DW_LNE_define_file: Bad opcode length\n"));
580 break;
581
582 case DW_LNE_set_discriminator:
583 READ_ULEB (val, data, end);
584 printf (_("set Discriminator to %s\n"), dwarf_vmatoa ("u", val));
585 break;
586
587 /* HP extensions. */
588 case DW_LNE_HP_negate_is_UV_update:
589 printf ("DW_LNE_HP_negate_is_UV_update\n");
590 break;
591 case DW_LNE_HP_push_context:
592 printf ("DW_LNE_HP_push_context\n");
593 break;
594 case DW_LNE_HP_pop_context:
595 printf ("DW_LNE_HP_pop_context\n");
596 break;
597 case DW_LNE_HP_set_file_line_column:
598 printf ("DW_LNE_HP_set_file_line_column\n");
599 break;
600 case DW_LNE_HP_set_routine_name:
601 printf ("DW_LNE_HP_set_routine_name\n");
602 break;
603 case DW_LNE_HP_set_sequence:
604 printf ("DW_LNE_HP_set_sequence\n");
605 break;
606 case DW_LNE_HP_negate_post_semantics:
607 printf ("DW_LNE_HP_negate_post_semantics\n");
608 break;
609 case DW_LNE_HP_negate_function_exit:
610 printf ("DW_LNE_HP_negate_function_exit\n");
611 break;
612 case DW_LNE_HP_negate_front_end_logical:
613 printf ("DW_LNE_HP_negate_front_end_logical\n");
614 break;
615 case DW_LNE_HP_define_proc:
616 printf ("DW_LNE_HP_define_proc\n");
617 break;
618 case DW_LNE_HP_source_file_correlation:
619 {
620 unsigned char *edata = data + len - 1;
621
622 printf ("DW_LNE_HP_source_file_correlation\n");
623
624 while (data < edata)
625 {
626 unsigned int opc;
627
628 READ_ULEB (opc, data, edata);
629
630 switch (opc)
631 {
632 case DW_LNE_HP_SFC_formfeed:
633 printf (" DW_LNE_HP_SFC_formfeed\n");
634 break;
635 case DW_LNE_HP_SFC_set_listing_line:
636 READ_ULEB (val, data, edata);
637 printf (" DW_LNE_HP_SFC_set_listing_line (%s)\n",
638 dwarf_vmatoa ("u", val));
639 break;
640 case DW_LNE_HP_SFC_associate:
641 printf (" DW_LNE_HP_SFC_associate ");
642 READ_ULEB (val, data, edata);
643 printf ("(%s", dwarf_vmatoa ("u", val));
644 READ_ULEB (val, data, edata);
645 printf (",%s", dwarf_vmatoa ("u", val));
646 READ_ULEB (val, data, edata);
647 printf (",%s)\n", dwarf_vmatoa ("u", val));
648 break;
649 default:
650 printf (_(" UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc);
651 data = edata;
652 break;
653 }
654 }
655 }
656 break;
657
658 default:
659 {
660 unsigned int rlen = len - 1;
661
662 if (op_code >= DW_LNE_lo_user
663 /* The test against DW_LNW_hi_user is redundant due to
664 the limited range of the unsigned char data type used
665 for op_code. */
666 /*&& op_code <= DW_LNE_hi_user*/)
667 printf (_("user defined: "));
668 else
669 printf (_("UNKNOWN: "));
670 printf (_("length %d ["), rlen);
671 for (; rlen; rlen--)
672 printf (" %02x", *data++);
673 printf ("]\n");
674 }
675 break;
676 }
677
678 return len + header_len;
679 }
680
681 static const unsigned char *
682 fetch_indirect_string (dwarf_vma offset)
683 {
684 struct dwarf_section *section = &debug_displays [str].section;
685 const unsigned char * ret;
686
687 if (section->start == NULL)
688 return (const unsigned char *) _("<no .debug_str section>");
689
690 if (offset >= section->size)
691 {
692 warn (_("DW_FORM_strp offset too big: %s\n"),
693 dwarf_vmatoa ("x", offset));
694 return (const unsigned char *) _("<offset is too big>");
695 }
696
697 ret = section->start + offset;
698 /* Unfortunately we cannot rely upon the .debug_str section ending with a
699 NUL byte. Since our caller is expecting to receive a well formed C
700 string we test for the lack of a terminating byte here. */
701 if (strnlen ((const char *) ret, section->size - offset)
702 == section->size - offset)
703 ret = (const unsigned char *)
704 _("<no NUL byte at end of .debug_str section>");
705
706 return ret;
707 }
708
709 static const unsigned char *
710 fetch_indirect_line_string (dwarf_vma offset)
711 {
712 struct dwarf_section *section = &debug_displays [line_str].section;
713 const unsigned char * ret;
714
715 if (section->start == NULL)
716 return (const unsigned char *) _("<no .debug_line_str section>");
717
718 if (offset >= section->size)
719 {
720 warn (_("DW_FORM_line_strp offset too big: %s\n"),
721 dwarf_vmatoa ("x", offset));
722 return (const unsigned char *) _("<offset is too big>");
723 }
724
725 ret = section->start + offset;
726 /* Unfortunately we cannot rely upon the .debug_line_str section ending
727 with a NUL byte. Since our caller is expecting to receive a well formed
728 C string we test for the lack of a terminating byte here. */
729 if (strnlen ((const char *) ret, section->size - offset)
730 == section->size - offset)
731 ret = (const unsigned char *)
732 _("<no NUL byte at end of .debug_line_str section>");
733
734 return ret;
735 }
736
737 static const char *
738 fetch_indexed_string (dwarf_vma idx, struct cu_tu_set *this_set,
739 dwarf_vma offset_size, bfd_boolean dwo)
740 {
741 enum dwarf_section_display_enum str_sec_idx = dwo ? str_dwo : str;
742 enum dwarf_section_display_enum idx_sec_idx = dwo ? str_index_dwo : str_index;
743 struct dwarf_section *index_section = &debug_displays [idx_sec_idx].section;
744 struct dwarf_section *str_section = &debug_displays [str_sec_idx].section;
745 dwarf_vma index_offset;
746 dwarf_vma str_offset;
747 const char * ret;
748 unsigned char *curr = index_section->start;
749 const unsigned char *end = curr + index_section->size;
750 dwarf_vma length;
751
752 if (index_section->start == NULL)
753 return (dwo ? _("<no .debug_str_offsets.dwo section>")
754 : _("<no .debug_str_offsets section>"));
755
756 if (str_section->start == NULL)
757 return (dwo ? _("<no .debug_str.dwo section>")
758 : _("<no .debug_str section>"));
759
760 /* FIXME: We should cache the length... */
761 SAFE_BYTE_GET_AND_INC (length, curr, 4, end);
762 if (length == 0xffffffff)
763 {
764 if (offset_size != 8)
765 warn (_("Expected offset size of 8 but given %s"), dwarf_vmatoa ("x", offset_size));
766 SAFE_BYTE_GET_AND_INC (length, curr, 8, end);
767 }
768 else if (offset_size != 4)
769 {
770 warn (_("Expected offset size of 4 but given %s"), dwarf_vmatoa ("x", offset_size));
771 }
772
773 if (length == 0)
774 {
775 /* This is probably an old style .debug_str_offset section which
776 just contains offsets and no header (and the first offset is 0). */
777 curr = index_section->start;
778 length = index_section->size;
779 }
780 else
781 {
782 /* Skip the version and padding bytes.
783 We assume that they are correct. */
784 curr += 4;
785
786 /* FIXME: The code below assumes that there is only one table
787 in the .debug_str_offsets section, so check that now. */
788 if ((offset_size == 4 && curr + length < (end - 8))
789 || (offset_size == 8 && curr + length < (end - 16)))
790 {
791 warn (_("index table size is too small %s vs %s\n"),
792 dwarf_vmatoa ("x", length),
793 dwarf_vmatoa ("x", index_section->size));
794 return _("<table too small>");
795 }
796 }
797
798 index_offset = idx * offset_size;
799
800 if (this_set != NULL)
801 index_offset += this_set->section_offsets [DW_SECT_STR_OFFSETS];
802
803 if (index_offset >= length)
804 {
805 warn (_("DW_FORM_GNU_str_index offset too big: %s vs %s\n"),
806 dwarf_vmatoa ("x", index_offset),
807 dwarf_vmatoa ("x", length));
808 return _("<index offset is too big>");
809 }
810
811 str_offset = byte_get (curr + index_offset, offset_size);
812 str_offset -= str_section->address;
813 if (str_offset >= str_section->size)
814 {
815 warn (_("DW_FORM_GNU_str_index indirect offset too big: %s\n"),
816 dwarf_vmatoa ("x", str_offset));
817 return _("<indirect index offset is too big>");
818 }
819
820 ret = (const char *) str_section->start + str_offset;
821 /* Unfortunately we cannot rely upon str_section ending with a NUL byte.
822 Since our caller is expecting to receive a well formed C string we test
823 for the lack of a terminating byte here. */
824 if (strnlen (ret, str_section->size - str_offset)
825 == str_section->size - str_offset)
826 ret = (const char *) _("<no NUL byte at end of section>");
827
828 return ret;
829 }
830
831 static const char *
832 fetch_indexed_value (dwarf_vma offset, dwarf_vma bytes)
833 {
834 struct dwarf_section *section = &debug_displays [debug_addr].section;
835
836 if (section->start == NULL)
837 return (_("<no .debug_addr section>"));
838
839 if (offset + bytes > section->size)
840 {
841 warn (_("Offset into section %s too big: %s\n"),
842 section->name, dwarf_vmatoa ("x", offset));
843 return "<offset too big>";
844 }
845
846 return dwarf_vmatoa ("x", byte_get (section->start + offset, bytes));
847 }
848
849
850 /* FIXME: There are better and more efficient ways to handle
851 these structures. For now though, I just want something that
852 is simple to implement. */
853 /* Records a single attribute in an abbrev. */
854 typedef struct abbrev_attr
855 {
856 unsigned long attribute;
857 unsigned long form;
858 bfd_signed_vma implicit_const;
859 struct abbrev_attr * next;
860 }
861 abbrev_attr;
862
863 /* Records a single abbrev. */
864 typedef struct abbrev_entry
865 {
866 unsigned long number;
867 unsigned long tag;
868 int children;
869 struct abbrev_attr * first_attr;
870 struct abbrev_attr * last_attr;
871 struct abbrev_entry * next;
872 }
873 abbrev_entry;
874
875 /* Records a set of abbreviations. */
876 typedef struct abbrev_list
877 {
878 abbrev_entry * first_abbrev;
879 abbrev_entry * last_abbrev;
880 dwarf_vma abbrev_base;
881 dwarf_vma abbrev_offset;
882 struct abbrev_list * next;
883 unsigned char * start_of_next_abbrevs;
884 }
885 abbrev_list;
886
887 /* Records all the abbrevs found so far. */
888 static struct abbrev_list * abbrev_lists = NULL;
889
890 typedef struct abbrev_map
891 {
892 dwarf_vma start;
893 dwarf_vma end;
894 abbrev_list * list;
895 } abbrev_map;
896
897 /* Maps between CU offsets and abbrev sets. */
898 static abbrev_map * cu_abbrev_map = NULL;
899 static unsigned long num_abbrev_map_entries = 0;
900 static unsigned long next_free_abbrev_map_entry = 0;
901
902 #define INITIAL_NUM_ABBREV_MAP_ENTRIES 8
903 #define ABBREV_MAP_ENTRIES_INCREMENT 8
904
905 static void
906 record_abbrev_list_for_cu (dwarf_vma start, dwarf_vma end, abbrev_list * list)
907 {
908 if (cu_abbrev_map == NULL)
909 {
910 num_abbrev_map_entries = INITIAL_NUM_ABBREV_MAP_ENTRIES;
911 cu_abbrev_map = xmalloc (num_abbrev_map_entries * sizeof (* cu_abbrev_map));
912 }
913 else if (next_free_abbrev_map_entry == num_abbrev_map_entries)
914 {
915 num_abbrev_map_entries += ABBREV_MAP_ENTRIES_INCREMENT;
916 cu_abbrev_map = xrealloc (cu_abbrev_map, num_abbrev_map_entries * sizeof (* cu_abbrev_map));
917 }
918
919 cu_abbrev_map[next_free_abbrev_map_entry].start = start;
920 cu_abbrev_map[next_free_abbrev_map_entry].end = end;
921 cu_abbrev_map[next_free_abbrev_map_entry].list = list;
922 next_free_abbrev_map_entry ++;
923 }
924
925 static void
926 free_all_abbrevs (void)
927 {
928 abbrev_list * list;
929
930 for (list = abbrev_lists; list != NULL;)
931 {
932 abbrev_list * next = list->next;
933 abbrev_entry * abbrv;
934
935 for (abbrv = list->first_abbrev; abbrv != NULL;)
936 {
937 abbrev_entry * next_abbrev = abbrv->next;
938 abbrev_attr * attr;
939
940 for (attr = abbrv->first_attr; attr;)
941 {
942 abbrev_attr *next_attr = attr->next;
943
944 free (attr);
945 attr = next_attr;
946 }
947
948 free (abbrv);
949 abbrv = next_abbrev;
950 }
951
952 free (list);
953 list = next;
954 }
955
956 abbrev_lists = NULL;
957 }
958
959 static abbrev_list *
960 new_abbrev_list (dwarf_vma abbrev_base, dwarf_vma abbrev_offset)
961 {
962 abbrev_list * list = (abbrev_list *) xcalloc (sizeof * list, 1);
963
964 list->abbrev_base = abbrev_base;
965 list->abbrev_offset = abbrev_offset;
966
967 list->next = abbrev_lists;
968 abbrev_lists = list;
969
970 return list;
971 }
972
973 static abbrev_list *
974 find_abbrev_list_by_abbrev_offset (dwarf_vma abbrev_base,
975 dwarf_vma abbrev_offset)
976 {
977 abbrev_list * list;
978
979 for (list = abbrev_lists; list != NULL; list = list->next)
980 if (list->abbrev_base == abbrev_base
981 && list->abbrev_offset == abbrev_offset)
982 return list;
983
984 return NULL;
985 }
986
987 /* Find the abbreviation map for the CU that includes OFFSET.
988 OFFSET is an absolute offset from the start of the .debug_info section. */
989 /* FIXME: This function is going to slow down readelf & objdump.
990 Consider using a better algorithm to mitigate this effect. */
991
992 static abbrev_map *
993 find_abbrev_map_by_offset (dwarf_vma offset)
994 {
995 unsigned long i;
996
997 for (i = 0; i < next_free_abbrev_map_entry; i++)
998 if (cu_abbrev_map[i].start <= offset
999 && cu_abbrev_map[i].end > offset)
1000 return cu_abbrev_map + i;
1001
1002 return NULL;
1003 }
1004
1005 static void
1006 add_abbrev (unsigned long number,
1007 unsigned long tag,
1008 int children,
1009 abbrev_list * list)
1010 {
1011 abbrev_entry * entry;
1012
1013 entry = (abbrev_entry *) xmalloc (sizeof (*entry));
1014
1015 entry->number = number;
1016 entry->tag = tag;
1017 entry->children = children;
1018 entry->first_attr = NULL;
1019 entry->last_attr = NULL;
1020 entry->next = NULL;
1021
1022 assert (list != NULL);
1023
1024 if (list->first_abbrev == NULL)
1025 list->first_abbrev = entry;
1026 else
1027 list->last_abbrev->next = entry;
1028
1029 list->last_abbrev = entry;
1030 }
1031
1032 static void
1033 add_abbrev_attr (unsigned long attribute,
1034 unsigned long form,
1035 bfd_signed_vma implicit_const,
1036 abbrev_list * list)
1037 {
1038 abbrev_attr *attr;
1039
1040 attr = (abbrev_attr *) xmalloc (sizeof (*attr));
1041
1042 attr->attribute = attribute;
1043 attr->form = form;
1044 attr->implicit_const = implicit_const;
1045 attr->next = NULL;
1046
1047 assert (list != NULL && list->last_abbrev != NULL);
1048
1049 if (list->last_abbrev->first_attr == NULL)
1050 list->last_abbrev->first_attr = attr;
1051 else
1052 list->last_abbrev->last_attr->next = attr;
1053
1054 list->last_abbrev->last_attr = attr;
1055 }
1056
1057 /* Processes the (partial) contents of a .debug_abbrev section.
1058 Returns NULL if the end of the section was encountered.
1059 Returns the address after the last byte read if the end of
1060 an abbreviation set was found. */
1061
1062 static unsigned char *
1063 process_abbrev_set (unsigned char * start,
1064 const unsigned char * end,
1065 abbrev_list * list)
1066 {
1067 while (start < end)
1068 {
1069 unsigned long entry;
1070 unsigned long tag;
1071 unsigned long attribute;
1072 int children;
1073
1074 READ_ULEB (entry, start, end);
1075
1076 /* A single zero is supposed to end the set according
1077 to the standard. If there's more, then signal that to
1078 the caller. */
1079 if (start == end)
1080 return NULL;
1081 if (entry == 0)
1082 return start;
1083
1084 READ_ULEB (tag, start, end);
1085 if (start == end)
1086 return NULL;
1087
1088 children = *start++;
1089
1090 add_abbrev (entry, tag, children, list);
1091
1092 do
1093 {
1094 unsigned long form;
1095 /* Initialize it due to a false compiler warning. */
1096 bfd_signed_vma implicit_const = -1;
1097
1098 READ_ULEB (attribute, start, end);
1099 if (start == end)
1100 break;
1101
1102 READ_ULEB (form, start, end);
1103 if (start == end)
1104 break;
1105
1106 if (form == DW_FORM_implicit_const)
1107 {
1108 READ_SLEB (implicit_const, start, end);
1109 if (start == end)
1110 break;
1111 }
1112
1113 add_abbrev_attr (attribute, form, implicit_const, list);
1114 }
1115 while (attribute != 0);
1116 }
1117
1118 /* Report the missing single zero which ends the section. */
1119 error (_(".debug_abbrev section not zero terminated\n"));
1120
1121 return NULL;
1122 }
1123
1124 static const char *
1125 get_TAG_name (unsigned long tag)
1126 {
1127 const char *name = get_DW_TAG_name ((unsigned int) tag);
1128
1129 if (name == NULL)
1130 {
1131 static char buffer[100];
1132
1133 if (tag >= DW_TAG_lo_user && tag <= DW_TAG_hi_user)
1134 snprintf (buffer, sizeof (buffer), _("User TAG value: %#lx"), tag);
1135 else
1136 snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %#lx"), tag);
1137 return buffer;
1138 }
1139
1140 return name;
1141 }
1142
1143 static const char *
1144 get_FORM_name (unsigned long form)
1145 {
1146 const char *name;
1147
1148 if (form == 0)
1149 return "DW_FORM value: 0";
1150
1151 name = get_DW_FORM_name (form);
1152 if (name == NULL)
1153 {
1154 static char buffer[100];
1155
1156 snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
1157 return buffer;
1158 }
1159
1160 return name;
1161 }
1162
1163 static const char *
1164 get_IDX_name (unsigned long idx)
1165 {
1166 const char *name = get_DW_IDX_name ((unsigned int) idx);
1167
1168 if (name == NULL)
1169 {
1170 static char buffer[100];
1171
1172 snprintf (buffer, sizeof (buffer), _("Unknown IDX value: %lx"), idx);
1173 return buffer;
1174 }
1175
1176 return name;
1177 }
1178
1179 static unsigned char *
1180 display_block (unsigned char *data,
1181 dwarf_vma length,
1182 const unsigned char * const end, char delimiter)
1183 {
1184 dwarf_vma maxlen;
1185
1186 printf (_("%c%s byte block: "), delimiter, dwarf_vmatoa ("u", length));
1187 if (data > end)
1188 return (unsigned char *) end;
1189
1190 maxlen = (dwarf_vma) (end - data);
1191 length = length > maxlen ? maxlen : length;
1192
1193 while (length --)
1194 printf ("%lx ", (unsigned long) byte_get (data++, 1));
1195
1196 return data;
1197 }
1198
1199 static int
1200 decode_location_expression (unsigned char * data,
1201 unsigned int pointer_size,
1202 unsigned int offset_size,
1203 int dwarf_version,
1204 dwarf_vma length,
1205 dwarf_vma cu_offset,
1206 struct dwarf_section * section)
1207 {
1208 unsigned op;
1209 dwarf_vma uvalue;
1210 dwarf_signed_vma svalue;
1211 unsigned char *end = data + length;
1212 int need_frame_base = 0;
1213
1214 while (data < end)
1215 {
1216 op = *data++;
1217
1218 switch (op)
1219 {
1220 case DW_OP_addr:
1221 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1222 printf ("DW_OP_addr: %s", dwarf_vmatoa ("x", uvalue));
1223 break;
1224 case DW_OP_deref:
1225 printf ("DW_OP_deref");
1226 break;
1227 case DW_OP_const1u:
1228 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1229 printf ("DW_OP_const1u: %lu", (unsigned long) uvalue);
1230 break;
1231 case DW_OP_const1s:
1232 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 1, end);
1233 printf ("DW_OP_const1s: %ld", (long) svalue);
1234 break;
1235 case DW_OP_const2u:
1236 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1237 printf ("DW_OP_const2u: %lu", (unsigned long) uvalue);
1238 break;
1239 case DW_OP_const2s:
1240 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1241 printf ("DW_OP_const2s: %ld", (long) svalue);
1242 break;
1243 case DW_OP_const4u:
1244 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1245 printf ("DW_OP_const4u: %lu", (unsigned long) uvalue);
1246 break;
1247 case DW_OP_const4s:
1248 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1249 printf ("DW_OP_const4s: %ld", (long) svalue);
1250 break;
1251 case DW_OP_const8u:
1252 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1253 printf ("DW_OP_const8u: %lu ", (unsigned long) uvalue);
1254 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1255 printf ("%lu", (unsigned long) uvalue);
1256 break;
1257 case DW_OP_const8s:
1258 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1259 printf ("DW_OP_const8s: %ld ", (long) svalue);
1260 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1261 printf ("%ld", (long) svalue);
1262 break;
1263 case DW_OP_constu:
1264 READ_ULEB (uvalue, data, end);
1265 printf ("DW_OP_constu: %s", dwarf_vmatoa ("u", uvalue));
1266 break;
1267 case DW_OP_consts:
1268 READ_SLEB (svalue, data, end);
1269 printf ("DW_OP_consts: %s", dwarf_vmatoa ("d", svalue));
1270 break;
1271 case DW_OP_dup:
1272 printf ("DW_OP_dup");
1273 break;
1274 case DW_OP_drop:
1275 printf ("DW_OP_drop");
1276 break;
1277 case DW_OP_over:
1278 printf ("DW_OP_over");
1279 break;
1280 case DW_OP_pick:
1281 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1282 printf ("DW_OP_pick: %ld", (unsigned long) uvalue);
1283 break;
1284 case DW_OP_swap:
1285 printf ("DW_OP_swap");
1286 break;
1287 case DW_OP_rot:
1288 printf ("DW_OP_rot");
1289 break;
1290 case DW_OP_xderef:
1291 printf ("DW_OP_xderef");
1292 break;
1293 case DW_OP_abs:
1294 printf ("DW_OP_abs");
1295 break;
1296 case DW_OP_and:
1297 printf ("DW_OP_and");
1298 break;
1299 case DW_OP_div:
1300 printf ("DW_OP_div");
1301 break;
1302 case DW_OP_minus:
1303 printf ("DW_OP_minus");
1304 break;
1305 case DW_OP_mod:
1306 printf ("DW_OP_mod");
1307 break;
1308 case DW_OP_mul:
1309 printf ("DW_OP_mul");
1310 break;
1311 case DW_OP_neg:
1312 printf ("DW_OP_neg");
1313 break;
1314 case DW_OP_not:
1315 printf ("DW_OP_not");
1316 break;
1317 case DW_OP_or:
1318 printf ("DW_OP_or");
1319 break;
1320 case DW_OP_plus:
1321 printf ("DW_OP_plus");
1322 break;
1323 case DW_OP_plus_uconst:
1324 READ_ULEB (uvalue, data, end);
1325 printf ("DW_OP_plus_uconst: %s", dwarf_vmatoa ("u", uvalue));
1326 break;
1327 case DW_OP_shl:
1328 printf ("DW_OP_shl");
1329 break;
1330 case DW_OP_shr:
1331 printf ("DW_OP_shr");
1332 break;
1333 case DW_OP_shra:
1334 printf ("DW_OP_shra");
1335 break;
1336 case DW_OP_xor:
1337 printf ("DW_OP_xor");
1338 break;
1339 case DW_OP_bra:
1340 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1341 printf ("DW_OP_bra: %ld", (long) svalue);
1342 break;
1343 case DW_OP_eq:
1344 printf ("DW_OP_eq");
1345 break;
1346 case DW_OP_ge:
1347 printf ("DW_OP_ge");
1348 break;
1349 case DW_OP_gt:
1350 printf ("DW_OP_gt");
1351 break;
1352 case DW_OP_le:
1353 printf ("DW_OP_le");
1354 break;
1355 case DW_OP_lt:
1356 printf ("DW_OP_lt");
1357 break;
1358 case DW_OP_ne:
1359 printf ("DW_OP_ne");
1360 break;
1361 case DW_OP_skip:
1362 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1363 printf ("DW_OP_skip: %ld", (long) svalue);
1364 break;
1365
1366 case DW_OP_lit0:
1367 case DW_OP_lit1:
1368 case DW_OP_lit2:
1369 case DW_OP_lit3:
1370 case DW_OP_lit4:
1371 case DW_OP_lit5:
1372 case DW_OP_lit6:
1373 case DW_OP_lit7:
1374 case DW_OP_lit8:
1375 case DW_OP_lit9:
1376 case DW_OP_lit10:
1377 case DW_OP_lit11:
1378 case DW_OP_lit12:
1379 case DW_OP_lit13:
1380 case DW_OP_lit14:
1381 case DW_OP_lit15:
1382 case DW_OP_lit16:
1383 case DW_OP_lit17:
1384 case DW_OP_lit18:
1385 case DW_OP_lit19:
1386 case DW_OP_lit20:
1387 case DW_OP_lit21:
1388 case DW_OP_lit22:
1389 case DW_OP_lit23:
1390 case DW_OP_lit24:
1391 case DW_OP_lit25:
1392 case DW_OP_lit26:
1393 case DW_OP_lit27:
1394 case DW_OP_lit28:
1395 case DW_OP_lit29:
1396 case DW_OP_lit30:
1397 case DW_OP_lit31:
1398 printf ("DW_OP_lit%d", op - DW_OP_lit0);
1399 break;
1400
1401 case DW_OP_reg0:
1402 case DW_OP_reg1:
1403 case DW_OP_reg2:
1404 case DW_OP_reg3:
1405 case DW_OP_reg4:
1406 case DW_OP_reg5:
1407 case DW_OP_reg6:
1408 case DW_OP_reg7:
1409 case DW_OP_reg8:
1410 case DW_OP_reg9:
1411 case DW_OP_reg10:
1412 case DW_OP_reg11:
1413 case DW_OP_reg12:
1414 case DW_OP_reg13:
1415 case DW_OP_reg14:
1416 case DW_OP_reg15:
1417 case DW_OP_reg16:
1418 case DW_OP_reg17:
1419 case DW_OP_reg18:
1420 case DW_OP_reg19:
1421 case DW_OP_reg20:
1422 case DW_OP_reg21:
1423 case DW_OP_reg22:
1424 case DW_OP_reg23:
1425 case DW_OP_reg24:
1426 case DW_OP_reg25:
1427 case DW_OP_reg26:
1428 case DW_OP_reg27:
1429 case DW_OP_reg28:
1430 case DW_OP_reg29:
1431 case DW_OP_reg30:
1432 case DW_OP_reg31:
1433 printf ("DW_OP_reg%d (%s)", op - DW_OP_reg0,
1434 regname (op - DW_OP_reg0, 1));
1435 break;
1436
1437 case DW_OP_breg0:
1438 case DW_OP_breg1:
1439 case DW_OP_breg2:
1440 case DW_OP_breg3:
1441 case DW_OP_breg4:
1442 case DW_OP_breg5:
1443 case DW_OP_breg6:
1444 case DW_OP_breg7:
1445 case DW_OP_breg8:
1446 case DW_OP_breg9:
1447 case DW_OP_breg10:
1448 case DW_OP_breg11:
1449 case DW_OP_breg12:
1450 case DW_OP_breg13:
1451 case DW_OP_breg14:
1452 case DW_OP_breg15:
1453 case DW_OP_breg16:
1454 case DW_OP_breg17:
1455 case DW_OP_breg18:
1456 case DW_OP_breg19:
1457 case DW_OP_breg20:
1458 case DW_OP_breg21:
1459 case DW_OP_breg22:
1460 case DW_OP_breg23:
1461 case DW_OP_breg24:
1462 case DW_OP_breg25:
1463 case DW_OP_breg26:
1464 case DW_OP_breg27:
1465 case DW_OP_breg28:
1466 case DW_OP_breg29:
1467 case DW_OP_breg30:
1468 case DW_OP_breg31:
1469 READ_SLEB (svalue, data, end);
1470 printf ("DW_OP_breg%d (%s): %s", op - DW_OP_breg0,
1471 regname (op - DW_OP_breg0, 1), dwarf_vmatoa ("d", svalue));
1472 break;
1473
1474 case DW_OP_regx:
1475 READ_ULEB (uvalue, data, end);
1476 printf ("DW_OP_regx: %s (%s)",
1477 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1478 break;
1479 case DW_OP_fbreg:
1480 need_frame_base = 1;
1481 READ_SLEB (svalue, data, end);
1482 printf ("DW_OP_fbreg: %s", dwarf_vmatoa ("d", svalue));
1483 break;
1484 case DW_OP_bregx:
1485 READ_ULEB (uvalue, data, end);
1486 READ_SLEB (svalue, data, end);
1487 printf ("DW_OP_bregx: %s (%s) %s",
1488 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1),
1489 dwarf_vmatoa ("d", svalue));
1490 break;
1491 case DW_OP_piece:
1492 READ_ULEB (uvalue, data, end);
1493 printf ("DW_OP_piece: %s", dwarf_vmatoa ("u", uvalue));
1494 break;
1495 case DW_OP_deref_size:
1496 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1497 printf ("DW_OP_deref_size: %ld", (long) uvalue);
1498 break;
1499 case DW_OP_xderef_size:
1500 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1501 printf ("DW_OP_xderef_size: %ld", (long) uvalue);
1502 break;
1503 case DW_OP_nop:
1504 printf ("DW_OP_nop");
1505 break;
1506
1507 /* DWARF 3 extensions. */
1508 case DW_OP_push_object_address:
1509 printf ("DW_OP_push_object_address");
1510 break;
1511 case DW_OP_call2:
1512 /* FIXME: Strictly speaking for 64-bit DWARF3 files
1513 this ought to be an 8-byte wide computation. */
1514 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1515 printf ("DW_OP_call2: <0x%s>",
1516 dwarf_vmatoa ("x", svalue + cu_offset));
1517 break;
1518 case DW_OP_call4:
1519 /* FIXME: Strictly speaking for 64-bit DWARF3 files
1520 this ought to be an 8-byte wide computation. */
1521 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1522 printf ("DW_OP_call4: <0x%s>",
1523 dwarf_vmatoa ("x", svalue + cu_offset));
1524 break;
1525 case DW_OP_call_ref:
1526 /* FIXME: Strictly speaking for 64-bit DWARF3 files
1527 this ought to be an 8-byte wide computation. */
1528 if (dwarf_version == -1)
1529 {
1530 printf (_("(DW_OP_call_ref in frame info)"));
1531 /* No way to tell where the next op is, so just bail. */
1532 return need_frame_base;
1533 }
1534 if (dwarf_version == 2)
1535 {
1536 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1537 }
1538 else
1539 {
1540 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1541 }
1542 printf ("DW_OP_call_ref: <0x%s>", dwarf_vmatoa ("x", uvalue));
1543 break;
1544 case DW_OP_form_tls_address:
1545 printf ("DW_OP_form_tls_address");
1546 break;
1547 case DW_OP_call_frame_cfa:
1548 printf ("DW_OP_call_frame_cfa");
1549 break;
1550 case DW_OP_bit_piece:
1551 printf ("DW_OP_bit_piece: ");
1552 READ_ULEB (uvalue, data, end);
1553 printf (_("size: %s "), dwarf_vmatoa ("u", uvalue));
1554 READ_ULEB (uvalue, data, end);
1555 printf (_("offset: %s "), dwarf_vmatoa ("u", uvalue));
1556 break;
1557
1558 /* DWARF 4 extensions. */
1559 case DW_OP_stack_value:
1560 printf ("DW_OP_stack_value");
1561 break;
1562
1563 case DW_OP_implicit_value:
1564 printf ("DW_OP_implicit_value");
1565 READ_ULEB (uvalue, data, end);
1566 data = display_block (data, uvalue, end, ' ');
1567 break;
1568
1569 /* GNU extensions. */
1570 case DW_OP_GNU_push_tls_address:
1571 printf (_("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown"));
1572 break;
1573 case DW_OP_GNU_uninit:
1574 printf ("DW_OP_GNU_uninit");
1575 /* FIXME: Is there data associated with this OP ? */
1576 break;
1577 case DW_OP_GNU_encoded_addr:
1578 {
1579 int encoding = 0;
1580 dwarf_vma addr;
1581
1582 if (data < end)
1583 encoding = *data++;
1584 addr = get_encoded_value (&data, encoding, section, end);
1585
1586 printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding);
1587 print_dwarf_vma (addr, pointer_size);
1588 }
1589 break;
1590 case DW_OP_implicit_pointer:
1591 case DW_OP_GNU_implicit_pointer:
1592 /* FIXME: Strictly speaking for 64-bit DWARF3 files
1593 this ought to be an 8-byte wide computation. */
1594 if (dwarf_version == -1)
1595 {
1596 printf (_("(%s in frame info)"),
1597 (op == DW_OP_implicit_pointer
1598 ? "DW_OP_implicit_pointer"
1599 : "DW_OP_GNU_implicit_pointer"));
1600 /* No way to tell where the next op is, so just bail. */
1601 return need_frame_base;
1602 }
1603 if (dwarf_version == 2)
1604 {
1605 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1606 }
1607 else
1608 {
1609 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1610 }
1611 READ_SLEB (svalue, data, end);
1612 printf ("%s: <0x%s> %s",
1613 (op == DW_OP_implicit_pointer
1614 ? "DW_OP_implicit_pointer" : "DW_OP_GNU_implicit_pointer"),
1615 dwarf_vmatoa ("x", uvalue),
1616 dwarf_vmatoa ("d", svalue));
1617 break;
1618 case DW_OP_entry_value:
1619 case DW_OP_GNU_entry_value:
1620 READ_ULEB (uvalue, data, end);
1621 /* PR 17531: file: 0cc9cd00. */
1622 if (uvalue > (dwarf_vma) (end - data))
1623 uvalue = end - data;
1624 printf ("%s: (", (op == DW_OP_entry_value ? "DW_OP_entry_value"
1625 : "DW_OP_GNU_entry_value"));
1626 if (decode_location_expression (data, pointer_size, offset_size,
1627 dwarf_version, uvalue,
1628 cu_offset, section))
1629 need_frame_base = 1;
1630 putchar (')');
1631 data += uvalue;
1632 if (data > end)
1633 data = end;
1634 break;
1635 case DW_OP_const_type:
1636 case DW_OP_GNU_const_type:
1637 READ_ULEB (uvalue, data, end);
1638 printf ("%s: <0x%s> ",
1639 (op == DW_OP_const_type ? "DW_OP_const_type"
1640 : "DW_OP_GNU_const_type"),
1641 dwarf_vmatoa ("x", cu_offset + uvalue));
1642 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1643 data = display_block (data, uvalue, end, ' ');
1644 break;
1645 case DW_OP_regval_type:
1646 case DW_OP_GNU_regval_type:
1647 READ_ULEB (uvalue, data, end);
1648 printf ("%s: %s (%s)",
1649 (op == DW_OP_regval_type ? "DW_OP_regval_type"
1650 : "DW_OP_GNU_regval_type"),
1651 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1652 READ_ULEB (uvalue, data, end);
1653 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1654 break;
1655 case DW_OP_deref_type:
1656 case DW_OP_GNU_deref_type:
1657 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1658 printf ("%s: %ld",
1659 (op == DW_OP_deref_type ? "DW_OP_deref_type"
1660 : "DW_OP_GNU_deref_type"),
1661 (long) uvalue);
1662 READ_ULEB (uvalue, data, end);
1663 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1664 break;
1665 case DW_OP_convert:
1666 case DW_OP_GNU_convert:
1667 READ_ULEB (uvalue, data, end);
1668 printf ("%s <0x%s>",
1669 (op == DW_OP_convert ? "DW_OP_convert" : "DW_OP_GNU_convert"),
1670 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1671 break;
1672 case DW_OP_reinterpret:
1673 case DW_OP_GNU_reinterpret:
1674 READ_ULEB (uvalue, data, end);
1675 printf ("%s <0x%s>",
1676 (op == DW_OP_reinterpret ? "DW_OP_reinterpret"
1677 : "DW_OP_GNU_reinterpret"),
1678 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1679 break;
1680 case DW_OP_GNU_parameter_ref:
1681 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1682 printf ("DW_OP_GNU_parameter_ref: <0x%s>",
1683 dwarf_vmatoa ("x", cu_offset + uvalue));
1684 break;
1685 case DW_OP_GNU_addr_index:
1686 READ_ULEB (uvalue, data, end);
1687 printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1688 break;
1689 case DW_OP_GNU_const_index:
1690 READ_ULEB (uvalue, data, end);
1691 printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1692 break;
1693 case DW_OP_GNU_variable_value:
1694 /* FIXME: Strictly speaking for 64-bit DWARF3 files
1695 this ought to be an 8-byte wide computation. */
1696 if (dwarf_version == -1)
1697 {
1698 printf (_("(DW_OP_GNU_variable_value in frame info)"));
1699 /* No way to tell where the next op is, so just bail. */
1700 return need_frame_base;
1701 }
1702 if (dwarf_version == 2)
1703 {
1704 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1705 }
1706 else
1707 {
1708 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1709 }
1710 printf ("DW_OP_GNU_variable_value: <0x%s>", dwarf_vmatoa ("x", uvalue));
1711 break;
1712
1713 /* HP extensions. */
1714 case DW_OP_HP_is_value:
1715 printf ("DW_OP_HP_is_value");
1716 /* FIXME: Is there data associated with this OP ? */
1717 break;
1718 case DW_OP_HP_fltconst4:
1719 printf ("DW_OP_HP_fltconst4");
1720 /* FIXME: Is there data associated with this OP ? */
1721 break;
1722 case DW_OP_HP_fltconst8:
1723 printf ("DW_OP_HP_fltconst8");
1724 /* FIXME: Is there data associated with this OP ? */
1725 break;
1726 case DW_OP_HP_mod_range:
1727 printf ("DW_OP_HP_mod_range");
1728 /* FIXME: Is there data associated with this OP ? */
1729 break;
1730 case DW_OP_HP_unmod_range:
1731 printf ("DW_OP_HP_unmod_range");
1732 /* FIXME: Is there data associated with this OP ? */
1733 break;
1734 case DW_OP_HP_tls:
1735 printf ("DW_OP_HP_tls");
1736 /* FIXME: Is there data associated with this OP ? */
1737 break;
1738
1739 /* PGI (STMicroelectronics) extensions. */
1740 case DW_OP_PGI_omp_thread_num:
1741 /* Pushes the thread number for the current thread as it would be
1742 returned by the standard OpenMP library function:
1743 omp_get_thread_num(). The "current thread" is the thread for
1744 which the expression is being evaluated. */
1745 printf ("DW_OP_PGI_omp_thread_num");
1746 break;
1747
1748 default:
1749 if (op >= DW_OP_lo_user
1750 && op <= DW_OP_hi_user)
1751 printf (_("(User defined location op 0x%x)"), op);
1752 else
1753 printf (_("(Unknown location op 0x%x)"), op);
1754 /* No way to tell where the next op is, so just bail. */
1755 return need_frame_base;
1756 }
1757
1758 /* Separate the ops. */
1759 if (data < end)
1760 printf ("; ");
1761 }
1762
1763 return need_frame_base;
1764 }
1765
1766 /* Find the CU or TU set corresponding to the given CU_OFFSET.
1767 This is used for DWARF package files. */
1768
1769 static struct cu_tu_set *
1770 find_cu_tu_set_v2 (dwarf_vma cu_offset, int do_types)
1771 {
1772 struct cu_tu_set *p;
1773 unsigned int nsets;
1774 unsigned int dw_sect;
1775
1776 if (do_types)
1777 {
1778 p = tu_sets;
1779 nsets = tu_count;
1780 dw_sect = DW_SECT_TYPES;
1781 }
1782 else
1783 {
1784 p = cu_sets;
1785 nsets = cu_count;
1786 dw_sect = DW_SECT_INFO;
1787 }
1788 while (nsets > 0)
1789 {
1790 if (p->section_offsets [dw_sect] == cu_offset)
1791 return p;
1792 p++;
1793 nsets--;
1794 }
1795 return NULL;
1796 }
1797
1798 /* Add INC to HIGH_BITS:LOW_BITS. */
1799 static void
1800 add64 (dwarf_vma * high_bits, dwarf_vma * low_bits, dwarf_vma inc)
1801 {
1802 dwarf_vma tmp = * low_bits;
1803
1804 tmp += inc;
1805
1806 /* FIXME: There is probably a better way of handling this:
1807
1808 We need to cope with dwarf_vma being a 32-bit or 64-bit
1809 type. Plus regardless of its size LOW_BITS is meant to
1810 only hold 32-bits, so if there is overflow or wrap around
1811 we must propagate into HIGH_BITS. */
1812 if (tmp < * low_bits)
1813 {
1814 ++ * high_bits;
1815 }
1816 else if (sizeof (tmp) > 8
1817 && (tmp >> 31) > 1)
1818 {
1819 ++ * high_bits;
1820 tmp &= 0xFFFFFFFF;
1821 }
1822
1823 * low_bits = tmp;
1824 }
1825
1826 static const char *
1827 fetch_alt_indirect_string (dwarf_vma offset)
1828 {
1829 separate_info * i;
1830
1831 if (! do_follow_links)
1832 return "";
1833
1834 if (first_separate_info == NULL)
1835 return _("<no links available>");
1836
1837 for (i = first_separate_info; i != NULL; i = i->next)
1838 {
1839 struct dwarf_section * section;
1840 const char * ret;
1841
1842 if (! load_debug_section (separate_debug_str, i->handle))
1843 continue;
1844
1845 section = &debug_displays [separate_debug_str].section;
1846
1847 if (section->start == NULL)
1848 continue;
1849
1850 if (offset >= section->size)
1851 continue;
1852
1853 ret = (const char *) (section->start + offset);
1854 /* Unfortunately we cannot rely upon the .debug_str section ending with a
1855 NUL byte. Since our caller is expecting to receive a well formed C
1856 string we test for the lack of a terminating byte here. */
1857 if (strnlen ((const char *) ret, section->size - offset)
1858 == section->size - offset)
1859 return _("<no NUL byte at end of alt .debug_str section>");
1860
1861 return ret;
1862 }
1863
1864 warn (_("DW_FORM_GNU_strp_alt offset (%s) too big or no string sections available\n"),
1865 dwarf_vmatoa ("x", offset));
1866 return _("<offset is too big>");
1867 }
1868
1869 static const char *
1870 get_AT_name (unsigned long attribute)
1871 {
1872 const char *name;
1873
1874 if (attribute == 0)
1875 return "DW_AT value: 0";
1876
1877 /* One value is shared by the MIPS and HP extensions: */
1878 if (attribute == DW_AT_MIPS_fde)
1879 return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
1880
1881 name = get_DW_AT_name (attribute);
1882
1883 if (name == NULL)
1884 {
1885 static char buffer[100];
1886
1887 snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
1888 attribute);
1889 return buffer;
1890 }
1891
1892 return name;
1893 }
1894
1895 static void
1896 add_dwo_info (const char * value, dwarf_vma cu_offset, dwo_type type)
1897 {
1898 dwo_info * dwinfo = xmalloc (sizeof * dwinfo);
1899
1900 dwinfo->type = type;
1901 dwinfo->value = value;
1902 dwinfo->cu_offset = cu_offset;
1903 dwinfo->next = first_dwo_info;
1904 first_dwo_info = dwinfo;
1905 }
1906
1907 static void
1908 add_dwo_name (const char * name, dwarf_vma cu_offset)
1909 {
1910 add_dwo_info (name, cu_offset, DWO_NAME);
1911 }
1912
1913 static void
1914 add_dwo_dir (const char * dir, dwarf_vma cu_offset)
1915 {
1916 add_dwo_info (dir, cu_offset, DWO_DIR);
1917 }
1918
1919 static void
1920 add_dwo_id (const char * id, dwarf_vma cu_offset)
1921 {
1922 add_dwo_info (id, cu_offset, DWO_ID);
1923 }
1924
1925 static void
1926 free_dwo_info (void)
1927 {
1928 dwo_info * dwinfo;
1929 dwo_info * next;
1930
1931 for (dwinfo = first_dwo_info; dwinfo != NULL; dwinfo = next)
1932 {
1933 next = dwinfo->next;
1934 free (dwinfo);
1935 }
1936 first_dwo_info = NULL;
1937 }
1938
1939 /* Ensure that START + UVALUE is less than END.
1940 Return an adjusted UVALUE if necessary to ensure this relationship. */
1941
1942 static inline dwarf_vma
1943 check_uvalue (const unsigned char * start,
1944 dwarf_vma uvalue,
1945 const unsigned char * end)
1946 {
1947 dwarf_vma max_uvalue = end - start;
1948
1949 /* See PR 17512: file: 008-103549-0.001:0.1.
1950 and PR 24829 for examples of where these tests are triggered. */
1951 if (uvalue > max_uvalue)
1952 {
1953 warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1954 uvalue = max_uvalue;
1955 }
1956
1957 return uvalue;
1958 }
1959
1960 static unsigned char *
1961 skip_attr_bytes (unsigned long form,
1962 unsigned char * data,
1963 unsigned const char * end,
1964 dwarf_vma pointer_size,
1965 dwarf_vma offset_size,
1966 int dwarf_version,
1967 dwarf_vma * value_return)
1968 {
1969 dwarf_signed_vma svalue;
1970 dwarf_vma uvalue = 0;
1971
1972 * value_return = 0;
1973
1974 switch (form)
1975 {
1976 case DW_FORM_ref_addr:
1977 if (dwarf_version == 2)
1978 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1979 else if (dwarf_version > 2)
1980 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1981 else
1982 return NULL;
1983 break;
1984
1985 case DW_FORM_addr:
1986 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1987 break;
1988
1989 case DW_FORM_strp:
1990 case DW_FORM_line_strp:
1991 case DW_FORM_sec_offset:
1992 case DW_FORM_GNU_ref_alt:
1993 case DW_FORM_GNU_strp_alt:
1994 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1995 break;
1996
1997 case DW_FORM_flag_present:
1998 uvalue = 1;
1999 break;
2000
2001 case DW_FORM_ref1:
2002 case DW_FORM_flag:
2003 case DW_FORM_data1:
2004 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
2005 break;
2006
2007 case DW_FORM_ref2:
2008 case DW_FORM_data2:
2009 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
2010 break;
2011
2012 case DW_FORM_ref4:
2013 case DW_FORM_data4:
2014 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
2015 break;
2016
2017 case DW_FORM_sdata:
2018 READ_SLEB (svalue, data, end);
2019 uvalue = svalue;
2020 break;
2021
2022 case DW_FORM_ref_udata:
2023 case DW_FORM_udata:
2024 case DW_FORM_GNU_str_index:
2025 case DW_FORM_GNU_addr_index:
2026 READ_ULEB (uvalue, data, end);
2027 break;
2028
2029 case DW_FORM_ref8:
2030 {
2031 dwarf_vma high_bits;
2032
2033 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
2034 data += 8;
2035 if (sizeof (uvalue) > 4)
2036 uvalue += high_bits << 32;
2037 else if (high_bits != 0)
2038 {
2039 /* FIXME: What to do ? */
2040 return NULL;
2041 }
2042 break;
2043 }
2044
2045 case DW_FORM_data8:
2046 case DW_FORM_ref_sig8:
2047 data += 8;
2048 break;
2049
2050 case DW_FORM_data16:
2051 data += 16;
2052 break;
2053
2054 case DW_FORM_string:
2055 data += strnlen ((char *) data, end - data) + 1;
2056 break;
2057
2058 case DW_FORM_block:
2059 case DW_FORM_exprloc:
2060 READ_ULEB (uvalue, data, end);
2061 data += uvalue;
2062 break;
2063
2064 case DW_FORM_block1:
2065 SAFE_BYTE_GET (uvalue, data, 1, end);
2066 data += 1 + uvalue;
2067 break;
2068
2069 case DW_FORM_block2:
2070 SAFE_BYTE_GET (uvalue, data, 2, end);
2071 data += 2 + uvalue;
2072 break;
2073
2074 case DW_FORM_block4:
2075 SAFE_BYTE_GET (uvalue, data, 4, end);
2076 data += 4 + uvalue;
2077 break;
2078
2079 case DW_FORM_indirect:
2080 READ_ULEB (form, data, end);
2081 if (form == DW_FORM_implicit_const)
2082 SKIP_ULEB (data, end);
2083 return skip_attr_bytes (form, data, end, pointer_size, offset_size, dwarf_version, value_return);
2084
2085 default:
2086 return NULL;
2087 }
2088
2089 * value_return = uvalue;
2090 if (data > end)
2091 data = (unsigned char *) end;
2092 return data;
2093 }
2094
2095 /* Given form FORM with value UVALUE, locate and return the abbreviation
2096 associated with it. */
2097
2098 static abbrev_entry *
2099 get_type_abbrev_from_form (unsigned long form,
2100 unsigned long uvalue,
2101 dwarf_vma cu_offset,
2102 const struct dwarf_section * section,
2103 unsigned long * abbrev_num_return,
2104 unsigned char ** data_return,
2105 unsigned long * cu_offset_return)
2106 {
2107 unsigned long abbrev_number;
2108 abbrev_map * map;
2109 abbrev_entry * entry;
2110 unsigned char * data;
2111
2112 if (abbrev_num_return != NULL)
2113 * abbrev_num_return = 0;
2114 if (data_return != NULL)
2115 * data_return = NULL;
2116
2117 switch (form)
2118 {
2119 case DW_FORM_GNU_ref_alt:
2120 /* FIXME: We are unable to handle this form at the moment. */
2121 return NULL;
2122
2123 case DW_FORM_ref_addr:
2124 if (uvalue >= section->size)
2125 {
2126 warn (_("Unable to resolve ref_addr form: uvalue %lx > section size %lx (%s)\n"),
2127 uvalue, (long) section->size, section->name);
2128 return NULL;
2129 }
2130 break;
2131
2132 case DW_FORM_ref1:
2133 case DW_FORM_ref2:
2134 case DW_FORM_ref4:
2135 case DW_FORM_ref8:
2136 case DW_FORM_ref_udata:
2137 if (uvalue + cu_offset > section->size)
2138 {
2139 warn (_("Unable to resolve ref form: uvalue %lx + cu_offset %lx > section size %lx\n"),
2140 uvalue, (long) cu_offset, (long) section->size);
2141 return NULL;
2142 }
2143 uvalue += cu_offset;
2144 break;
2145
2146 /* FIXME: Are there other DW_FORMs that can be used by types ? */
2147
2148 default:
2149 warn (_("Unexpected form %lx encountered whilst finding abbreviation for type\n"), form);
2150 return NULL;
2151 }
2152
2153 data = (unsigned char *) section->start + uvalue;
2154 map = find_abbrev_map_by_offset (uvalue);
2155
2156 if (map == NULL)
2157 {
2158 warn (_("Unable to find abbreviations for CU offset %#lx\n"), uvalue);
2159 return NULL;
2160 }
2161 if (map->list == NULL)
2162 {
2163 warn (_("Empty abbreviation list encountered for CU offset %lx\n"), uvalue);
2164 return NULL;
2165 }
2166
2167 if (cu_offset_return != NULL)
2168 {
2169 if (form == DW_FORM_ref_addr)
2170 * cu_offset_return = map->start;
2171 else
2172 * cu_offset_return = cu_offset;
2173 }
2174
2175 READ_ULEB (abbrev_number, data, section->start + section->size);
2176
2177 for (entry = map->list->first_abbrev; entry != NULL; entry = entry->next)
2178 if (entry->number == abbrev_number)
2179 break;
2180
2181 if (abbrev_num_return != NULL)
2182 * abbrev_num_return = abbrev_number;
2183
2184 if (data_return != NULL)
2185 * data_return = data;
2186
2187 if (entry == NULL)
2188 warn (_("Unable to find entry for abbreviation %lu\n"), abbrev_number);
2189
2190 return entry;
2191 }
2192
2193 /* Return IS_SIGNED set to TRUE if the type using abbreviation ENTRY
2194 can be determined to be a signed type. The data for ENTRY can be
2195 found starting at DATA. */
2196
2197 static void
2198 get_type_signedness (abbrev_entry * entry,
2199 const struct dwarf_section * section,
2200 unsigned char * data,
2201 unsigned const char * end,
2202 dwarf_vma cu_offset,
2203 dwarf_vma pointer_size,
2204 dwarf_vma offset_size,
2205 int dwarf_version,
2206 bfd_boolean * is_signed,
2207 unsigned int nesting)
2208 {
2209 abbrev_attr * attr;
2210
2211 * is_signed = FALSE;
2212
2213 #define MAX_NESTING 20
2214 if (nesting > MAX_NESTING)
2215 {
2216 /* FIXME: Warn - or is this expected ?
2217 NB/ We need to avoid infinite recursion. */
2218 return;
2219 }
2220
2221 for (attr = entry->first_attr;
2222 attr != NULL && attr->attribute;
2223 attr = attr->next)
2224 {
2225 unsigned char * orig_data = data;
2226 dwarf_vma uvalue = 0;
2227
2228 data = skip_attr_bytes (attr->form, data, end, pointer_size,
2229 offset_size, dwarf_version, & uvalue);
2230 if (data == NULL)
2231 return;
2232
2233 switch (attr->attribute)
2234 {
2235 case DW_AT_linkage_name:
2236 case DW_AT_name:
2237 if (do_wide)
2238 {
2239 if (attr->form == DW_FORM_strp)
2240 printf (", %s", fetch_indirect_string (uvalue));
2241 else if (attr->form == DW_FORM_string)
2242 printf (", %s", orig_data);
2243 }
2244 break;
2245
2246 case DW_AT_type:
2247 /* Recurse. */
2248 {
2249 abbrev_entry * type_abbrev;
2250 unsigned char * type_data;
2251 unsigned long type_cu_offset;
2252
2253 type_abbrev = get_type_abbrev_from_form (attr->form,
2254 uvalue,
2255 cu_offset,
2256 section,
2257 NULL /* abbrev num return */,
2258 & type_data,
2259 & type_cu_offset);
2260 if (type_abbrev == NULL)
2261 break;
2262
2263 get_type_signedness (type_abbrev, section, type_data, end, type_cu_offset,
2264 pointer_size, offset_size, dwarf_version,
2265 is_signed, nesting + 1);
2266 }
2267 break;
2268
2269 case DW_AT_encoding:
2270 /* Determine signness. */
2271 switch (uvalue)
2272 {
2273 case DW_ATE_address:
2274 /* FIXME - some architectures have signed addresses. */
2275 case DW_ATE_boolean:
2276 case DW_ATE_unsigned:
2277 case DW_ATE_unsigned_char:
2278 case DW_ATE_unsigned_fixed:
2279 * is_signed = FALSE;
2280 break;
2281
2282 default:
2283 case DW_ATE_complex_float:
2284 case DW_ATE_float:
2285 case DW_ATE_signed:
2286 case DW_ATE_signed_char:
2287 case DW_ATE_imaginary_float:
2288 case DW_ATE_decimal_float:
2289 case DW_ATE_signed_fixed:
2290 * is_signed = TRUE;
2291 break;
2292 }
2293 break;
2294 }
2295 }
2296 }
2297
2298 static void
2299 read_and_print_leb128 (unsigned char * data,
2300 unsigned int * bytes_read,
2301 unsigned const char * end,
2302 bfd_boolean is_signed)
2303 {
2304 int status;
2305 dwarf_vma val = read_leb128 (data, end, is_signed, bytes_read, &status);
2306 if (status != 0)
2307 report_leb_status (status, __FILE__, __LINE__);
2308 else
2309 printf ("%s", dwarf_vmatoa (is_signed ? "d" : "u", val));
2310 }
2311
2312 static void
2313 display_discr_list (unsigned long form,
2314 dwarf_vma uvalue,
2315 unsigned char * data,
2316 unsigned const char * end,
2317 int level)
2318 {
2319 if (uvalue == 0)
2320 {
2321 printf ("[default]");
2322 return;
2323 }
2324
2325 switch (form)
2326 {
2327 case DW_FORM_block:
2328 case DW_FORM_block1:
2329 case DW_FORM_block2:
2330 case DW_FORM_block4:
2331 /* Move data pointer back to the start of the byte array. */
2332 data -= uvalue;
2333 break;
2334 default:
2335 printf ("<corrupt>\n");
2336 warn (_("corrupt discr_list - not using a block form\n"));
2337 return;
2338 }
2339
2340 if (uvalue < 2)
2341 {
2342 printf ("<corrupt>\n");
2343 warn (_("corrupt discr_list - block not long enough\n"));
2344 return;
2345 }
2346
2347 bfd_boolean is_signed =
2348 (level > 0 && level <= MAX_CU_NESTING)
2349 ? level_type_signed [level - 1] : FALSE;
2350
2351 printf ("(");
2352 while (uvalue)
2353 {
2354 unsigned char discriminant;
2355 unsigned int bytes_read;
2356
2357 SAFE_BYTE_GET (discriminant, data, 1, end);
2358 -- uvalue;
2359 data ++;
2360
2361 assert (uvalue > 0);
2362 switch (discriminant)
2363 {
2364 case DW_DSC_label:
2365 printf ("label ");
2366 read_and_print_leb128 (data, & bytes_read, end, is_signed);
2367 assert (bytes_read <= uvalue && bytes_read > 0);
2368 uvalue -= bytes_read;
2369 data += bytes_read;
2370 break;
2371
2372 case DW_DSC_range:
2373 printf ("range ");
2374 read_and_print_leb128 (data, & bytes_read, end, is_signed);
2375 assert (bytes_read <= uvalue && bytes_read > 0);
2376 uvalue -= bytes_read;
2377 data += bytes_read;
2378
2379 printf ("..");
2380 read_and_print_leb128 (data, & bytes_read, end, is_signed);
2381 assert (bytes_read <= uvalue && bytes_read > 0);
2382 uvalue -= bytes_read;
2383 data += bytes_read;
2384 break;
2385
2386 default:
2387 printf ("<corrupt>\n");
2388 warn (_("corrupt discr_list - unrecognised discriminant byte %#x\n"),
2389 discriminant);
2390 return;
2391 }
2392
2393 if (uvalue)
2394 printf (", ");
2395 }
2396
2397 if (is_signed)
2398 printf (")(signed)");
2399 else
2400 printf (")(unsigned)");
2401 }
2402
2403 static unsigned char *
2404 read_and_display_attr_value (unsigned long attribute,
2405 unsigned long form,
2406 dwarf_signed_vma implicit_const,
2407 unsigned char * start,
2408 unsigned char * data,
2409 unsigned char * end,
2410 dwarf_vma cu_offset,
2411 dwarf_vma pointer_size,
2412 dwarf_vma offset_size,
2413 int dwarf_version,
2414 debug_info * debug_info_p,
2415 int do_loc,
2416 struct dwarf_section * section,
2417 struct cu_tu_set * this_set,
2418 char delimiter,
2419 int level)
2420 {
2421 dwarf_signed_vma svalue;
2422 dwarf_vma uvalue = 0;
2423 unsigned char * block_start = NULL;
2424 unsigned char * orig_data = data;
2425
2426 if (data > end || (data == end && form != DW_FORM_flag_present))
2427 {
2428 warn (_("Corrupt attribute\n"));
2429 return data;
2430 }
2431
2432 if (do_wide && ! do_loc)
2433 {
2434 /* PR 26847: Display the name of the form. */
2435 const char * name = get_FORM_name (form);
2436
2437 /* For convenience we skip the DW_FORM_ prefix to the name. */
2438 if (name[0] == 'D')
2439 name += 8; /* strlen ("DW_FORM_") */
2440 printf ("%c(%s)", delimiter, name);
2441 }
2442
2443 switch (form)
2444 {
2445 default:
2446 break;
2447
2448 case DW_FORM_ref_addr:
2449 if (dwarf_version == 2)
2450 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
2451 else if (dwarf_version > 2)
2452 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
2453 else
2454 error (_("Internal error: DW_FORM_ref_addr is not supported in DWARF version 1.\n"));
2455 break;
2456
2457 case DW_FORM_addr:
2458 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
2459 break;
2460
2461 case DW_FORM_strp:
2462 case DW_FORM_line_strp:
2463 case DW_FORM_sec_offset:
2464 case DW_FORM_GNU_ref_alt:
2465 case DW_FORM_GNU_strp_alt:
2466 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
2467 break;
2468
2469 case DW_FORM_flag_present:
2470 uvalue = 1;
2471 break;
2472
2473 case DW_FORM_ref1:
2474 case DW_FORM_flag:
2475 case DW_FORM_data1:
2476 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
2477 break;
2478
2479 case DW_FORM_ref2:
2480 case DW_FORM_data2:
2481 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
2482 break;
2483
2484 case DW_FORM_ref4:
2485 case DW_FORM_data4:
2486 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
2487 break;
2488
2489 case DW_FORM_sdata:
2490 READ_SLEB (svalue, data, end);
2491 uvalue = svalue;
2492 break;
2493
2494 case DW_FORM_GNU_str_index:
2495 case DW_FORM_ref_udata:
2496 case DW_FORM_udata:
2497 case DW_FORM_GNU_addr_index:
2498 READ_ULEB (uvalue, data, end);
2499 break;
2500
2501 case DW_FORM_indirect:
2502 READ_ULEB (form, data, end);
2503 if (!do_loc)
2504 printf ("%c%s", delimiter, get_FORM_name (form));
2505 if (form == DW_FORM_implicit_const)
2506 READ_SLEB (implicit_const, data, end);
2507 return read_and_display_attr_value (attribute, form, implicit_const,
2508 start, data, end,
2509 cu_offset, pointer_size,
2510 offset_size, dwarf_version,
2511 debug_info_p, do_loc,
2512 section, this_set, delimiter, level);
2513 }
2514
2515 switch (form)
2516 {
2517 case DW_FORM_ref_addr:
2518 if (!do_loc)
2519 printf ("%c<0x%s>", delimiter, dwarf_vmatoa ("x", uvalue));
2520 break;
2521
2522 case DW_FORM_GNU_ref_alt:
2523 if (!do_loc)
2524 {
2525 if (do_wide)
2526 /* We have already printed the form name. */
2527 printf ("%c<0x%s>", delimiter, dwarf_vmatoa ("x", uvalue));
2528 else
2529 printf ("%c<alt 0x%s>", delimiter, dwarf_vmatoa ("x", uvalue));
2530 }
2531 /* FIXME: Follow the reference... */
2532 break;
2533
2534 case DW_FORM_ref1:
2535 case DW_FORM_ref2:
2536 case DW_FORM_ref4:
2537 case DW_FORM_ref_udata:
2538 if (!do_loc)
2539 printf ("%c<0x%s>", delimiter, dwarf_vmatoa ("x", uvalue + cu_offset));
2540 break;
2541
2542 case DW_FORM_data4:
2543 case DW_FORM_addr:
2544 case DW_FORM_sec_offset:
2545 if (!do_loc)
2546 printf ("%c0x%s", delimiter, dwarf_vmatoa ("x", uvalue));
2547 break;
2548
2549 case DW_FORM_flag_present:
2550 case DW_FORM_flag:
2551 case DW_FORM_data1:
2552 case DW_FORM_data2:
2553 case DW_FORM_sdata:
2554 case DW_FORM_udata:
2555 if (!do_loc)
2556 printf ("%c%s", delimiter, dwarf_vmatoa ("d", uvalue));
2557 break;
2558
2559 case DW_FORM_implicit_const:
2560 if (!do_loc)
2561 printf ("%c%s", delimiter, dwarf_vmatoa ("d", implicit_const));
2562 break;
2563
2564 case DW_FORM_ref8:
2565 case DW_FORM_data8:
2566 if (!do_loc)
2567 {
2568 dwarf_vma high_bits;
2569 dwarf_vma utmp;
2570 char buf[64];
2571
2572 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
2573 utmp = uvalue;
2574 if (form == DW_FORM_ref8)
2575 add64 (& high_bits, & utmp, cu_offset);
2576 printf ("%c0x%s", delimiter,
2577 dwarf_vmatoa64 (high_bits, utmp, buf, sizeof (buf)));
2578 }
2579
2580 if ((do_loc || do_debug_loc || do_debug_ranges)
2581 && num_debug_info_entries == 0)
2582 {
2583 if (sizeof (uvalue) == 8)
2584 SAFE_BYTE_GET (uvalue, data, 8, end);
2585 else
2586 error (_("DW_FORM_data8 is unsupported when sizeof (dwarf_vma) != 8\n"));
2587 }
2588
2589 data += 8;
2590 break;
2591
2592 case DW_FORM_data16:
2593 if (!do_loc)
2594 {
2595 dwarf_vma left_high_bits, left_low_bits;
2596 dwarf_vma right_high_bits, right_low_bits;
2597
2598 SAFE_BYTE_GET64 (data, &left_high_bits, &left_low_bits, end);
2599 SAFE_BYTE_GET64 (data + 8, &right_high_bits, &right_low_bits, end);
2600 if (byte_get == byte_get_little_endian)
2601 {
2602 /* Swap them. */
2603 left_high_bits ^= right_high_bits;
2604 right_high_bits ^= left_high_bits;
2605 left_high_bits ^= right_high_bits;
2606 left_low_bits ^= right_low_bits;
2607 right_low_bits ^= left_low_bits;
2608 left_low_bits ^= right_low_bits;
2609 }
2610 printf (" 0x%08" DWARF_VMA_FMT "x%08" DWARF_VMA_FMT "x"
2611 "%08" DWARF_VMA_FMT "x%08" DWARF_VMA_FMT "x",
2612 left_high_bits, left_low_bits, right_high_bits,
2613 right_low_bits);
2614 }
2615 data += 16;
2616 break;
2617
2618 case DW_FORM_string:
2619 if (!do_loc)
2620 printf ("%c%.*s", delimiter, (int) (end - data), data);
2621 data += strnlen ((char *) data, end - data) + 1;
2622 break;
2623
2624 case DW_FORM_block:
2625 case DW_FORM_exprloc:
2626 READ_ULEB (uvalue, data, end);
2627 do_block:
2628 block_start = data;
2629 if (block_start >= end)
2630 {
2631 warn (_("Block ends prematurely\n"));
2632 uvalue = 0;
2633 block_start = end;
2634 }
2635
2636 uvalue = check_uvalue (block_start, uvalue, end);
2637
2638 if (do_loc)
2639 data = block_start + uvalue;
2640 else
2641 data = display_block (block_start, uvalue, end, delimiter);
2642 break;
2643
2644 case DW_FORM_block1:
2645 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
2646 goto do_block;
2647
2648 case DW_FORM_block2:
2649 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
2650 goto do_block;
2651
2652 case DW_FORM_block4:
2653 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
2654 goto do_block;
2655
2656 case DW_FORM_strp:
2657 if (!do_loc)
2658 {
2659 if (do_wide)
2660 /* We have already displayed the form name. */
2661 printf (_("%c(offset: 0x%s): %s"), delimiter,
2662 dwarf_vmatoa ("x", uvalue),
2663 fetch_indirect_string (uvalue));
2664 else
2665 printf (_("%c(indirect string, offset: 0x%s): %s"), delimiter,
2666 dwarf_vmatoa ("x", uvalue),
2667 fetch_indirect_string (uvalue));
2668 }
2669 break;
2670
2671 case DW_FORM_line_strp:
2672 if (!do_loc)
2673 {
2674 if (do_wide)
2675 /* We have already displayed the form name. */
2676 printf (_("%c(offset: 0x%s): %s"), delimiter,
2677 dwarf_vmatoa ("x", uvalue),
2678 fetch_indirect_line_string (uvalue));
2679 else
2680 printf (_("%c(indirect line string, offset: 0x%s): %s"), delimiter,
2681 dwarf_vmatoa ("x", uvalue),
2682 fetch_indirect_line_string (uvalue));
2683 }
2684 break;
2685
2686 case DW_FORM_GNU_str_index:
2687 if (!do_loc)
2688 {
2689 const char * suffix = strrchr (section->name, '.');
2690 bfd_boolean dwo = (suffix && strcmp (suffix, ".dwo") == 0) ? TRUE : FALSE;
2691
2692 if (do_wide)
2693 /* We have already displayed the form name. */
2694 printf (_("%c(offset: 0x%s): %s"), delimiter,
2695 dwarf_vmatoa ("x", uvalue),
2696 fetch_indexed_string (uvalue, this_set, offset_size, dwo));
2697 else
2698 printf (_("%c(indexed string: 0x%s): %s"), delimiter,
2699 dwarf_vmatoa ("x", uvalue),
2700 fetch_indexed_string (uvalue, this_set, offset_size, dwo));
2701 }
2702 break;
2703
2704 case DW_FORM_GNU_strp_alt:
2705 if (!do_loc)
2706 {
2707 if (do_wide)
2708 /* We have already displayed the form name. */
2709 printf (_("%c(offset: 0x%s) %s"), delimiter,
2710 dwarf_vmatoa ("x", uvalue),
2711 fetch_alt_indirect_string (uvalue));
2712 else
2713 printf (_("%c(alt indirect string, offset: 0x%s) %s"), delimiter,
2714 dwarf_vmatoa ("x", uvalue),
2715 fetch_alt_indirect_string (uvalue));
2716 }
2717 break;
2718
2719 case DW_FORM_indirect:
2720 /* Handled above. */
2721 break;
2722
2723 case DW_FORM_ref_sig8:
2724 if (!do_loc)
2725 {
2726 dwarf_vma high_bits;
2727 char buf[64];
2728
2729 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
2730 if (do_wide)
2731 /* We have already displayed the form name. */
2732 printf ("%c: 0x%s", delimiter,
2733 dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf)));
2734 else
2735 printf ("%csignature: 0x%s", delimiter,
2736 dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf)));
2737 }
2738 data += 8;
2739 break;
2740
2741 case DW_FORM_GNU_addr_index:
2742 if (!do_loc)
2743 {
2744 if (do_wide)
2745 /* We have already displayed the form name. */
2746 printf (_("%c(index: 0x%s): %s"), delimiter,
2747 dwarf_vmatoa ("x", uvalue),
2748 fetch_indexed_value (uvalue * pointer_size, pointer_size));
2749 else
2750 printf (_("%c(addr_index: 0x%s): %s"), delimiter,
2751 dwarf_vmatoa ("x", uvalue),
2752 fetch_indexed_value (uvalue * pointer_size, pointer_size));
2753 }
2754 break;
2755
2756 default:
2757 warn (_("Unrecognized form: %lu\n"), form);
2758 break;
2759 }
2760
2761 if ((do_loc || do_debug_loc || do_debug_ranges)
2762 && num_debug_info_entries == 0
2763 && debug_info_p != NULL)
2764 {
2765 switch (attribute)
2766 {
2767 case DW_AT_frame_base:
2768 have_frame_base = 1;
2769 /* Fall through. */
2770 case DW_AT_location:
2771 case DW_AT_GNU_locviews:
2772 case DW_AT_string_length:
2773 case DW_AT_return_addr:
2774 case DW_AT_data_member_location:
2775 case DW_AT_vtable_elem_location:
2776 case DW_AT_segment:
2777 case DW_AT_static_link:
2778 case DW_AT_use_location:
2779 case DW_AT_call_value:
2780 case DW_AT_GNU_call_site_value:
2781 case DW_AT_call_data_value:
2782 case DW_AT_GNU_call_site_data_value:
2783 case DW_AT_call_target:
2784 case DW_AT_GNU_call_site_target:
2785 case DW_AT_call_target_clobbered:
2786 case DW_AT_GNU_call_site_target_clobbered:
2787 if ((dwarf_version < 4
2788 && (form == DW_FORM_data4 || form == DW_FORM_data8))
2789 || form == DW_FORM_sec_offset)
2790 {
2791 /* Process location list. */
2792 unsigned int lmax = debug_info_p->max_loc_offsets;
2793 unsigned int num = debug_info_p->num_loc_offsets;
2794
2795 if (lmax == 0 || num >= lmax)
2796 {
2797 lmax += 1024;
2798 debug_info_p->loc_offsets = (dwarf_vma *)
2799 xcrealloc (debug_info_p->loc_offsets,
2800 lmax, sizeof (*debug_info_p->loc_offsets));
2801 debug_info_p->loc_views = (dwarf_vma *)
2802 xcrealloc (debug_info_p->loc_views,
2803 lmax, sizeof (*debug_info_p->loc_views));
2804 debug_info_p->have_frame_base = (int *)
2805 xcrealloc (debug_info_p->have_frame_base,
2806 lmax, sizeof (*debug_info_p->have_frame_base));
2807 debug_info_p->max_loc_offsets = lmax;
2808 }
2809 if (this_set != NULL)
2810 uvalue += this_set->section_offsets [DW_SECT_LOC];
2811 debug_info_p->have_frame_base [num] = have_frame_base;
2812 if (attribute != DW_AT_GNU_locviews)
2813 {
2814 /* Corrupt DWARF info can produce more offsets than views.
2815 See PR 23062 for an example. */
2816 if (debug_info_p->num_loc_offsets
2817 > debug_info_p->num_loc_views)
2818 warn (_("More location offset attributes than DW_AT_GNU_locview attributes\n"));
2819 else
2820 {
2821 debug_info_p->loc_offsets [num] = uvalue;
2822 debug_info_p->num_loc_offsets++;
2823 }
2824 }
2825 else
2826 {
2827 assert (debug_info_p->num_loc_views <= num);
2828 num = debug_info_p->num_loc_views;
2829 if (num > debug_info_p->num_loc_offsets)
2830 warn (_("More DW_AT_GNU_locview attributes than location offset attributes\n"));
2831 else
2832 {
2833 debug_info_p->loc_views [num] = uvalue;
2834 debug_info_p->num_loc_views++;
2835 }
2836 }
2837 }
2838 break;
2839
2840 case DW_AT_low_pc:
2841 if (need_base_address)
2842 debug_info_p->base_address = uvalue;
2843 break;
2844
2845 case DW_AT_GNU_addr_base:
2846 debug_info_p->addr_base = uvalue;
2847 break;
2848
2849 case DW_AT_GNU_ranges_base:
2850 debug_info_p->ranges_base = uvalue;
2851 break;
2852
2853 case DW_AT_ranges:
2854 if ((dwarf_version < 4
2855 && (form == DW_FORM_data4 || form == DW_FORM_data8))
2856 || form == DW_FORM_sec_offset)
2857 {
2858 /* Process range list. */
2859 unsigned int lmax = debug_info_p->max_range_lists;
2860 unsigned int num = debug_info_p->num_range_lists;
2861
2862 if (lmax == 0 || num >= lmax)
2863 {
2864 lmax += 1024;
2865 debug_info_p->range_lists = (dwarf_vma *)
2866 xcrealloc (debug_info_p->range_lists,
2867 lmax, sizeof (*debug_info_p->range_lists));
2868 debug_info_p->max_range_lists = lmax;
2869 }
2870 debug_info_p->range_lists [num] = uvalue;
2871 debug_info_p->num_range_lists++;
2872 }
2873 break;
2874
2875 case DW_AT_GNU_dwo_name:
2876 case DW_AT_dwo_name:
2877 if (need_dwo_info)
2878 switch (form)
2879 {
2880 case DW_FORM_strp:
2881 add_dwo_name ((const char *) fetch_indirect_string (uvalue), cu_offset);
2882 break;
2883 case DW_FORM_GNU_strp_alt:
2884 add_dwo_name ((const char *) fetch_alt_indirect_string (uvalue), cu_offset);
2885 break;
2886 case DW_FORM_GNU_str_index:
2887 add_dwo_name (fetch_indexed_string (uvalue, this_set, offset_size, FALSE), cu_offset);
2888 break;
2889 case DW_FORM_string:
2890 add_dwo_name ((const char *) orig_data, cu_offset);
2891 break;
2892 default:
2893 warn (_("Unsupported form (%s) for attribute %s\n"),
2894 get_FORM_name (form), get_AT_name (attribute));
2895 break;
2896 }
2897 break;
2898
2899 case DW_AT_comp_dir:
2900 /* FIXME: Also extract a build-id in a CU/TU. */
2901 if (need_dwo_info)
2902 switch (form)
2903 {
2904 case DW_FORM_strp:
2905 add_dwo_dir ((const char *) fetch_indirect_string (uvalue), cu_offset);
2906 break;
2907 case DW_FORM_GNU_strp_alt:
2908 add_dwo_dir (fetch_alt_indirect_string (uvalue), cu_offset);
2909 break;
2910 case DW_FORM_line_strp:
2911 add_dwo_dir ((const char *) fetch_indirect_line_string (uvalue), cu_offset);
2912 break;
2913 case DW_FORM_GNU_str_index:
2914 add_dwo_dir (fetch_indexed_string (uvalue, this_set, offset_size, FALSE), cu_offset);
2915 break;
2916 case DW_FORM_string:
2917 add_dwo_dir ((const char *) orig_data, cu_offset);
2918 break;
2919 default:
2920 warn (_("Unsupported form (%s) for attribute %s\n"),
2921 get_FORM_name (form), get_AT_name (attribute));
2922 break;
2923 }
2924 break;
2925
2926 case DW_AT_GNU_dwo_id:
2927 if (need_dwo_info)
2928 switch (form)
2929 {
2930 case DW_FORM_data8:
2931 /* FIXME: Record the length of the ID as well ? */
2932 add_dwo_id ((const char *) (data - 8), cu_offset);
2933 break;
2934 default:
2935 warn (_("Unsupported form (%s) for attribute %s\n"),
2936 get_FORM_name (form), get_AT_name (attribute));
2937 break;
2938 }
2939 break;
2940
2941 default:
2942 break;
2943 }
2944 }
2945
2946 if (do_loc || attribute == 0)
2947 return data;
2948
2949 /* For some attributes we can display further information. */
2950 switch (attribute)
2951 {
2952 case DW_AT_type:
2953 if (level >= 0 && level < MAX_CU_NESTING
2954 && uvalue < (size_t) (end - start))
2955 {
2956 bfd_boolean is_signed = FALSE;
2957 abbrev_entry * type_abbrev;
2958 unsigned char * type_data;
2959 unsigned long type_cu_offset;
2960
2961 type_abbrev = get_type_abbrev_from_form (form, uvalue, cu_offset,
2962 section, NULL, & type_data, & type_cu_offset);
2963 if (type_abbrev != NULL)
2964 {
2965 get_type_signedness (type_abbrev, section, type_data, end, type_cu_offset,
2966 pointer_size, offset_size, dwarf_version,
2967 & is_signed, 0);
2968 }
2969 level_type_signed[level] = is_signed;
2970 }
2971 break;
2972
2973 case DW_AT_inline:
2974 printf ("\t");
2975 switch (uvalue)
2976 {
2977 case DW_INL_not_inlined:
2978 printf (_("(not inlined)"));
2979 break;
2980 case DW_INL_inlined:
2981 printf (_("(inlined)"));
2982 break;
2983 case DW_INL_declared_not_inlined:
2984 printf (_("(declared as inline but ignored)"));
2985 break;
2986 case DW_INL_declared_inlined:
2987 printf (_("(declared as inline and inlined)"));
2988 break;
2989 default:
2990 printf (_(" (Unknown inline attribute value: %s)"),
2991 dwarf_vmatoa ("x", uvalue));
2992 break;
2993 }
2994 break;
2995
2996 case DW_AT_language:
2997 printf ("\t");
2998 switch (uvalue)
2999 {
3000 /* Ordered by the numeric value of these constants. */
3001 case DW_LANG_C89: printf ("(ANSI C)"); break;
3002 case DW_LANG_C: printf ("(non-ANSI C)"); break;
3003 case DW_LANG_Ada83: printf ("(Ada)"); break;
3004 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
3005 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
3006 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
3007 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
3008 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
3009 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
3010 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
3011 /* DWARF 2.1 values. */
3012 case DW_LANG_Java: printf ("(Java)"); break;
3013 case DW_LANG_C99: printf ("(ANSI C99)"); break;
3014 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
3015 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
3016 /* DWARF 3 values. */
3017 case DW_LANG_PLI: printf ("(PLI)"); break;
3018 case DW_LANG_ObjC: printf ("(Objective C)"); break;
3019 case DW_LANG_ObjC_plus_plus: printf ("(Objective C++)"); break;
3020 case DW_LANG_UPC: printf ("(Unified Parallel C)"); break;
3021 case DW_LANG_D: printf ("(D)"); break;
3022 /* DWARF 4 values. */
3023 case DW_LANG_Python: printf ("(Python)"); break;
3024 /* DWARF 5 values. */
3025 case DW_LANG_OpenCL: printf ("(OpenCL)"); break;
3026 case DW_LANG_Go: printf ("(Go)"); break;
3027 case DW_LANG_Modula3: printf ("(Modula 3)"); break;
3028 case DW_LANG_Haskell: printf ("(Haskell)"); break;
3029 case DW_LANG_C_plus_plus_03: printf ("(C++03)"); break;
3030 case DW_LANG_C_plus_plus_11: printf ("(C++11)"); break;
3031 case DW_LANG_OCaml: printf ("(OCaml)"); break;
3032 case DW_LANG_Rust: printf ("(Rust)"); break;
3033 case DW_LANG_C11: printf ("(C11)"); break;
3034 case DW_LANG_Swift: printf ("(Swift)"); break;
3035 case DW_LANG_Julia: printf ("(Julia)"); break;
3036 case DW_LANG_Dylan: printf ("(Dylan)"); break;
3037 case DW_LANG_C_plus_plus_14: printf ("(C++14)"); break;
3038 case DW_LANG_Fortran03: printf ("(Fortran 03)"); break;
3039 case DW_LANG_Fortran08: printf ("(Fortran 08)"); break;
3040 case DW_LANG_RenderScript: printf ("(RenderScript)"); break;
3041 /* MIPS extension. */
3042 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
3043 /* UPC extension. */
3044 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
3045 default:
3046 if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
3047 printf (_("(implementation defined: %s)"),
3048 dwarf_vmatoa ("x", uvalue));
3049 else
3050 printf (_("(Unknown: %s)"), dwarf_vmatoa ("x", uvalue));
3051 break;
3052 }
3053 break;
3054
3055 case DW_AT_encoding:
3056 printf ("\t");
3057 switch (uvalue)
3058 {
3059 case DW_ATE_void: printf ("(void)"); break;
3060 case DW_ATE_address: printf ("(machine address)"); break;
3061 case DW_ATE_boolean: printf ("(boolean)"); break;
3062 case DW_ATE_complex_float: printf ("(complex float)"); break;
3063 case DW_ATE_float: printf ("(float)"); break;
3064 case DW_ATE_signed: printf ("(signed)"); break;
3065 case DW_ATE_signed_char: printf ("(signed char)"); break;
3066 case DW_ATE_unsigned: printf ("(unsigned)"); break;
3067 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
3068 /* DWARF 2.1 values: */
3069 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
3070 case DW_ATE_decimal_float: printf ("(decimal float)"); break;
3071 /* DWARF 3 values: */
3072 case DW_ATE_packed_decimal: printf ("(packed_decimal)"); break;
3073 case DW_ATE_numeric_string: printf ("(numeric_string)"); break;
3074 case DW_ATE_edited: printf ("(edited)"); break;
3075 case DW_ATE_signed_fixed: printf ("(signed_fixed)"); break;
3076 case DW_ATE_unsigned_fixed: printf ("(unsigned_fixed)"); break;
3077 /* DWARF 4 values: */
3078 case DW_ATE_UTF: printf ("(unicode string)"); break;
3079 /* DWARF 5 values: */
3080 case DW_ATE_UCS: printf ("(UCS)"); break;
3081 case DW_ATE_ASCII: printf ("(ASCII)"); break;
3082
3083 /* HP extensions: */
3084 case DW_ATE_HP_float80: printf ("(HP_float80)"); break;
3085 case DW_ATE_HP_complex_float80: printf ("(HP_complex_float80)"); break;
3086 case DW_ATE_HP_float128: printf ("(HP_float128)"); break;
3087 case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
3088 case DW_ATE_HP_floathpintel: printf ("(HP_floathpintel)"); break;
3089 case DW_ATE_HP_imaginary_float80: printf ("(HP_imaginary_float80)"); break;
3090 case DW_ATE_HP_imaginary_float128: printf ("(HP_imaginary_float128)"); break;
3091
3092 default:
3093 if (uvalue >= DW_ATE_lo_user
3094 && uvalue <= DW_ATE_hi_user)
3095 printf (_("(user defined type)"));
3096 else
3097 printf (_("(unknown type)"));
3098 break;
3099 }
3100 break;
3101
3102 case DW_AT_accessibility:
3103 printf ("\t");
3104 switch (uvalue)
3105 {
3106 case DW_ACCESS_public: printf ("(public)"); break;
3107 case DW_ACCESS_protected: printf ("(protected)"); break;
3108 case DW_ACCESS_private: printf ("(private)"); break;
3109 default:
3110 printf (_("(unknown accessibility)"));
3111 break;
3112 }
3113 break;
3114
3115 case DW_AT_visibility:
3116 printf ("\t");
3117 switch (uvalue)
3118 {
3119 case DW_VIS_local: printf ("(local)"); break;
3120 case DW_VIS_exported: printf ("(exported)"); break;
3121 case DW_VIS_qualified: printf ("(qualified)"); break;
3122 default: printf (_("(unknown visibility)")); break;
3123 }
3124 break;
3125
3126 case DW_AT_endianity:
3127 printf ("\t");
3128 switch (uvalue)
3129 {
3130 case DW_END_default: printf ("(default)"); break;
3131 case DW_END_big: printf ("(big)"); break;
3132 case DW_END_little: printf ("(little)"); break;
3133 default:
3134 if (uvalue >= DW_END_lo_user && uvalue <= DW_END_hi_user)
3135 printf (_("(user specified)"));
3136 else
3137 printf (_("(unknown endianity)"));
3138 break;
3139 }
3140 break;
3141
3142 case DW_AT_virtuality:
3143 printf ("\t");
3144 switch (uvalue)
3145 {
3146 case DW_VIRTUALITY_none: printf ("(none)"); break;
3147 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
3148 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
3149 default: printf (_("(unknown virtuality)")); break;
3150 }
3151 break;
3152
3153 case DW_AT_identifier_case:
3154 printf ("\t");
3155 switch (uvalue)
3156 {
3157 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
3158 case DW_ID_up_case: printf ("(up_case)"); break;
3159 case DW_ID_down_case: printf ("(down_case)"); break;
3160 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
3161 default: printf (_("(unknown case)")); break;
3162 }
3163 break;
3164
3165 case DW_AT_calling_convention:
3166 printf ("\t");
3167 switch (uvalue)
3168 {
3169 case DW_CC_normal: printf ("(normal)"); break;
3170 case DW_CC_program: printf ("(program)"); break;
3171 case DW_CC_nocall: printf ("(nocall)"); break;
3172 case DW_CC_pass_by_reference: printf ("(pass by ref)"); break;
3173 case DW_CC_pass_by_value: printf ("(pass by value)"); break;
3174 case DW_CC_GNU_renesas_sh: printf ("(Rensas SH)"); break;
3175 case DW_CC_GNU_borland_fastcall_i386: printf ("(Borland fastcall i386)"); break;
3176 default:
3177 if (uvalue >= DW_CC_lo_user
3178 && uvalue <= DW_CC_hi_user)
3179 printf (_("(user defined)"));
3180 else
3181 printf (_("(unknown convention)"));
3182 }
3183 break;
3184
3185 case DW_AT_ordering:
3186 printf ("\t");
3187 switch (uvalue)
3188 {
3189 case 255:
3190 case -1: printf (_("(undefined)")); break;
3191 case 0: printf ("(row major)"); break;
3192 case 1: printf ("(column major)"); break;
3193 }
3194 break;
3195
3196 case DW_AT_decimal_sign:
3197 printf ("\t");
3198 switch (uvalue)
3199 {
3200 case DW_DS_unsigned: printf (_("(unsigned)")); break;
3201 case DW_DS_leading_overpunch: printf (_("(leading overpunch)")); break;
3202 case DW_DS_trailing_overpunch: printf (_("(trailing overpunch)")); break;
3203 case DW_DS_leading_separate: printf (_("(leading separate)")); break;
3204 case DW_DS_trailing_separate: printf (_("(trailing separate)")); break;
3205 default: printf (_("(unrecognised)")); break;
3206 }
3207 break;
3208
3209 case DW_AT_defaulted:
3210 printf ("\t");
3211 switch (uvalue)
3212 {
3213 case DW_DEFAULTED_no: printf (_("(no)")); break;
3214 case DW_DEFAULTED_in_class: printf (_("(in class)")); break;
3215 case DW_DEFAULTED_out_of_class: printf (_("(out of class)")); break;
3216 default: printf (_("(unrecognised)")); break;
3217 }
3218 break;
3219
3220 case DW_AT_discr_list:
3221 printf ("\t");
3222 display_discr_list (form, uvalue, data, end, level);
3223 break;
3224
3225 case DW_AT_frame_base:
3226 have_frame_base = 1;
3227 /* Fall through. */
3228 case DW_AT_location:
3229 case DW_AT_string_length:
3230 case DW_AT_return_addr:
3231 case DW_AT_data_member_location:
3232 case DW_AT_vtable_elem_location:
3233 case DW_AT_segment:
3234 case DW_AT_static_link:
3235 case DW_AT_use_location:
3236 case DW_AT_call_value:
3237 case DW_AT_GNU_call_site_value:
3238 case DW_AT_call_data_value:
3239 case DW_AT_GNU_call_site_data_value:
3240 case DW_AT_call_target:
3241 case DW_AT_GNU_call_site_target:
3242 case DW_AT_call_target_clobbered:
3243 case DW_AT_GNU_call_site_target_clobbered:
3244 if ((dwarf_version < 4
3245 && (form == DW_FORM_data4 || form == DW_FORM_data8))
3246 || form == DW_FORM_sec_offset)
3247 printf (_(" (location list)"));
3248 /* Fall through. */
3249 case DW_AT_allocated:
3250 case DW_AT_associated:
3251 case DW_AT_data_location:
3252 case DW_AT_stride:
3253 case DW_AT_upper_bound:
3254 case DW_AT_lower_bound:
3255 if (block_start)
3256 {
3257 int need_frame_base;
3258
3259 printf ("\t(");
3260 need_frame_base = decode_location_expression (block_start,
3261 pointer_size,
3262 offset_size,
3263 dwarf_version,
3264 uvalue,
3265 cu_offset, section);
3266 printf (")");
3267 if (need_frame_base && !have_frame_base)
3268 printf (_(" [without DW_AT_frame_base]"));
3269 }
3270 break;
3271
3272 case DW_AT_data_bit_offset:
3273 case DW_AT_byte_size:
3274 case DW_AT_bit_size:
3275 case DW_AT_string_length_byte_size:
3276 case DW_AT_string_length_bit_size:
3277 case DW_AT_bit_stride:
3278 if (form == DW_FORM_exprloc)
3279 {
3280 printf ("\t(");
3281 (void) decode_location_expression (block_start, pointer_size,
3282 offset_size, dwarf_version,
3283 uvalue, cu_offset, section);
3284 printf (")");
3285 }
3286 break;
3287
3288 case DW_AT_import:
3289 {
3290 unsigned long abbrev_number;
3291 abbrev_entry *entry;
3292
3293 entry = get_type_abbrev_from_form (form, uvalue, cu_offset,
3294 section, & abbrev_number, NULL, NULL);
3295 if (entry == NULL)
3296 {
3297 if (form != DW_FORM_GNU_ref_alt)
3298 warn (_("Offset %s used as value for DW_AT_import attribute of DIE at offset 0x%lx is too big.\n"),
3299 dwarf_vmatoa ("x", uvalue),
3300 (unsigned long) (orig_data - section->start));
3301 }
3302 else
3303 {
3304 printf (_("\t[Abbrev Number: %ld"), abbrev_number);
3305 printf (" (%s)", get_TAG_name (entry->tag));
3306 printf ("]");
3307 }
3308 }
3309 break;
3310
3311 default:
3312 break;
3313 }
3314
3315 return data;
3316 }
3317
3318 static unsigned char *
3319 read_and_display_attr (unsigned long attribute,
3320 unsigned long form,
3321 dwarf_signed_vma implicit_const,
3322 unsigned char * start,
3323 unsigned char * data,
3324 unsigned char * end,
3325 dwarf_vma cu_offset,
3326 dwarf_vma pointer_size,
3327 dwarf_vma offset_size,
3328 int dwarf_version,
3329 debug_info * debug_info_p,
3330 int do_loc,
3331 struct dwarf_section * section,
3332 struct cu_tu_set * this_set,
3333 int level)
3334 {
3335 if (!do_loc)
3336 printf (" %-18s:", get_AT_name (attribute));
3337 data = read_and_display_attr_value (attribute, form, implicit_const,
3338 start, data, end,
3339 cu_offset, pointer_size, offset_size,
3340 dwarf_version, debug_info_p,
3341 do_loc, section, this_set, ' ', level);
3342 if (!do_loc)
3343 printf ("\n");
3344 return data;
3345 }
3346
3347 /* Like load_debug_section, but if the ordinary call fails, and we are
3348 following debug links, then attempt to load the requested section
3349 from one of the separate debug info files. */
3350
3351 static bfd_boolean
3352 load_debug_section_with_follow (enum dwarf_section_display_enum sec_enum,
3353 void * handle)
3354 {
3355 if (load_debug_section (sec_enum, handle))
3356 {
3357 if (debug_displays[sec_enum].section.filename == NULL)
3358 {
3359 /* See if we can associate a filename with this section. */
3360 separate_info * i;
3361
3362 for (i = first_separate_info; i != NULL; i = i->next)
3363 if (i->handle == handle)
3364 {
3365 debug_displays[sec_enum].section.filename = i->filename;
3366 break;
3367 }
3368 }
3369
3370 return TRUE;
3371 }
3372
3373 if (do_follow_links)
3374 {
3375 separate_info * i;
3376
3377 for (i = first_separate_info; i != NULL; i = i->next)
3378 {
3379 if (load_debug_section (sec_enum, i->handle))
3380 {
3381 debug_displays[sec_enum].section.filename = i->filename;
3382
3383 /* FIXME: We should check to see if any of the remaining debug info
3384 files also contain this section, and, umm, do something about it. */
3385 return TRUE;
3386 }
3387 }
3388 }
3389
3390 return FALSE;
3391 }
3392
3393 static void
3394 introduce (struct dwarf_section * section, bfd_boolean raw)
3395 {
3396 if (raw)
3397 {
3398 if (do_follow_links && section->filename)
3399 printf (_("Raw dump of debug contents of section %s (loaded from %s):\n\n"),
3400 section->name, section->filename);
3401 else
3402 printf (_("Raw dump of debug contents of section %s:\n\n"), section->name);
3403 }
3404 else
3405 {
3406 if (do_follow_links && section->filename)
3407 printf (_("Contents of the %s section (loaded from %s):\n\n"),
3408 section->name, section->filename);
3409 else
3410 printf (_("Contents of the %s section:\n\n"), section->name);
3411 }
3412 }
3413
3414 /* Process the contents of a .debug_info section.
3415 If do_loc is TRUE then we are scanning for location lists and dwo tags
3416 and we do not want to display anything to the user.
3417 If do_types is TRUE, we are processing a .debug_types section instead of
3418 a .debug_info section.
3419 The information displayed is restricted by the values in DWARF_START_DIE
3420 and DWARF_CUTOFF_LEVEL.
3421 Returns TRUE upon success. Otherwise an error or warning message is
3422 printed and FALSE is returned. */
3423
3424 static bfd_boolean
3425 process_debug_info (struct dwarf_section * section,
3426 void * file,
3427 enum dwarf_section_display_enum abbrev_sec,
3428 bfd_boolean do_loc,
3429 bfd_boolean do_types)
3430 {
3431 unsigned char *start = section->start;
3432 unsigned char *end = start + section->size;
3433 unsigned char *section_begin;
3434 unsigned int unit;
3435 unsigned int num_units = 0;
3436
3437 if ((do_loc || do_debug_loc || do_debug_ranges)
3438 && num_debug_info_entries == 0
3439 && ! do_types)
3440 {
3441 dwarf_vma length;
3442
3443 /* First scan the section to get the number of comp units. */
3444 for (section_begin = start, num_units = 0; section_begin < end;
3445 num_units ++)
3446 {
3447 /* Read the first 4 bytes. For a 32-bit DWARF section, this
3448 will be the length. For a 64-bit DWARF section, it'll be
3449 the escape code 0xffffffff followed by an 8 byte length. */
3450 SAFE_BYTE_GET (length, section_begin, 4, end);
3451
3452 if (length == 0xffffffff)
3453 {
3454 SAFE_BYTE_GET (length, section_begin + 4, 8, end);
3455 section_begin += length + 12;
3456 }
3457 else if (length >= 0xfffffff0 && length < 0xffffffff)
3458 {
3459 warn (_("Reserved length value (0x%s) found in section %s\n"),
3460 dwarf_vmatoa ("x", length), section->name);
3461 return FALSE;
3462 }
3463 else
3464 section_begin += length + 4;
3465
3466 /* Negative values are illegal, they may even cause infinite
3467 looping. This can happen if we can't accurately apply
3468 relocations to an object file, or if the file is corrupt. */
3469 if ((signed long) length <= 0 || section_begin < start)
3470 {
3471 warn (_("Corrupt unit length (0x%s) found in section %s\n"),
3472 dwarf_vmatoa ("x", length), section->name);
3473 return FALSE;
3474 }
3475 }
3476
3477 if (num_units == 0)
3478 {
3479 error (_("No comp units in %s section ?\n"), section->name);
3480 return FALSE;
3481 }
3482
3483 /* Then allocate an array to hold the information. */
3484 debug_information = (debug_info *) cmalloc (num_units,
3485 sizeof (* debug_information));
3486 if (debug_information == NULL)
3487 {
3488 error (_("Not enough memory for a debug info array of %u entries\n"),
3489 num_units);
3490 alloc_num_debug_info_entries = num_debug_info_entries = 0;
3491 return FALSE;
3492 }
3493
3494 /* PR 17531: file: 92ca3797.
3495 We cannot rely upon the debug_information array being initialised
3496 before it is used. A corrupt file could easily contain references
3497 to a unit for which information has not been made available. So
3498 we ensure that the array is zeroed here. */
3499 memset (debug_information, 0, num_units * sizeof (*debug_information));
3500
3501 alloc_num_debug_info_entries = num_units;
3502 }
3503
3504 if (!do_loc)
3505 {
3506 load_debug_section_with_follow (str, file);
3507 load_debug_section_with_follow (line_str, file);
3508 load_debug_section_with_follow (str_dwo, file);
3509 load_debug_section_with_follow (str_index, file);
3510 load_debug_section_with_follow (str_index_dwo, file);
3511 load_debug_section_with_follow (debug_addr, file);
3512 }
3513
3514 load_debug_section_with_follow (abbrev_sec, file);
3515 if (debug_displays [abbrev_sec].section.start == NULL)
3516 {
3517 warn (_("Unable to locate %s section!\n"),
3518 debug_displays [abbrev_sec].section.uncompressed_name);
3519 return FALSE;
3520 }
3521
3522 if (!do_loc && dwarf_start_die == 0)
3523 introduce (section, FALSE);
3524
3525 free_all_abbrevs ();
3526 free (cu_abbrev_map);
3527 cu_abbrev_map = NULL;
3528 next_free_abbrev_map_entry = 0;
3529
3530 /* In order to be able to resolve DW_FORM_ref_attr forms we need
3531 to load *all* of the abbrevs for all CUs in this .debug_info
3532 section. This does effectively mean that we (partially) read
3533 every CU header twice. */
3534 for (section_begin = start; start < end;)
3535 {
3536 DWARF2_Internal_CompUnit compunit;
3537 unsigned char * hdrptr;
3538 dwarf_vma abbrev_base;
3539 size_t abbrev_size;
3540 dwarf_vma cu_offset;
3541 unsigned int offset_size;
3542 unsigned int initial_length_size;
3543 struct cu_tu_set * this_set;
3544 abbrev_list * list;
3545
3546 hdrptr = start;
3547
3548 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 4, end);
3549
3550 if (compunit.cu_length == 0xffffffff)
3551 {
3552 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 8, end);
3553 offset_size = 8;
3554 initial_length_size = 12;
3555 }
3556 else
3557 {
3558 offset_size = 4;
3559 initial_length_size = 4;
3560 }
3561
3562 SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end);
3563
3564 cu_offset = start - section_begin;
3565
3566 this_set = find_cu_tu_set_v2 (cu_offset, do_types);
3567
3568 if (compunit.cu_version < 5)
3569 {
3570 compunit.cu_unit_type = DW_UT_compile;
3571 /* Initialize it due to a false compiler warning. */
3572 compunit.cu_pointer_size = -1;
3573 }
3574 else
3575 {
3576 SAFE_BYTE_GET_AND_INC (compunit.cu_unit_type, hdrptr, 1, end);
3577 do_types = (compunit.cu_unit_type == DW_UT_type);
3578
3579 SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
3580 }
3581
3582 SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
3583
3584 if (this_set == NULL)
3585 {
3586 abbrev_base = 0;
3587 abbrev_size = debug_displays [abbrev_sec].section.size;
3588 }
3589 else
3590 {
3591 abbrev_base = this_set->section_offsets [DW_SECT_ABBREV];
3592 abbrev_size = this_set->section_sizes [DW_SECT_ABBREV];
3593 }
3594
3595 list = find_abbrev_list_by_abbrev_offset (abbrev_base,
3596 compunit.cu_abbrev_offset);
3597 if (list == NULL)
3598 {
3599 unsigned char * next;
3600
3601 list = new_abbrev_list (abbrev_base,
3602 compunit.cu_abbrev_offset);
3603 next = process_abbrev_set
3604 (((unsigned char *) debug_displays [abbrev_sec].section.start
3605 + abbrev_base + compunit.cu_abbrev_offset),
3606 ((unsigned char *) debug_displays [abbrev_sec].section.start
3607 + abbrev_base + abbrev_size),
3608 list);
3609 list->start_of_next_abbrevs = next;
3610 }
3611
3612 start = section_begin + cu_offset + compunit.cu_length
3613 + initial_length_size;
3614 record_abbrev_list_for_cu (cu_offset, start - section_begin, list);
3615 }
3616
3617 for (start = section_begin, unit = 0; start < end; unit++)
3618 {
3619 DWARF2_Internal_CompUnit compunit;
3620 unsigned char *hdrptr;
3621 unsigned char *tags;
3622 int level, last_level, saved_level;
3623 dwarf_vma cu_offset;
3624 unsigned long sec_off;
3625 unsigned int offset_size;
3626 unsigned int initial_length_size;
3627 dwarf_vma signature_high = 0;
3628 dwarf_vma signature_low = 0;
3629 dwarf_vma type_offset = 0;
3630 struct cu_tu_set *this_set;
3631 dwarf_vma abbrev_base;
3632 size_t abbrev_size;
3633 abbrev_list * list = NULL;
3634
3635 hdrptr = start;
3636
3637 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 4, end);
3638
3639 if (compunit.cu_length == 0xffffffff)
3640 {
3641 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 8, end);
3642 offset_size = 8;
3643 initial_length_size = 12;
3644 }
3645 else
3646 {
3647 offset_size = 4;
3648 initial_length_size = 4;
3649 }
3650
3651 SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end);
3652
3653 cu_offset = start - section_begin;
3654
3655 this_set = find_cu_tu_set_v2 (cu_offset, do_types);
3656
3657 if (compunit.cu_version < 5)
3658 {
3659 compunit.cu_unit_type = DW_UT_compile;
3660 /* Initialize it due to a false compiler warning. */
3661 compunit.cu_pointer_size = -1;
3662 }
3663 else
3664 {
3665 SAFE_BYTE_GET_AND_INC (compunit.cu_unit_type, hdrptr, 1, end);
3666 do_types = (compunit.cu_unit_type == DW_UT_type);
3667
3668 SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
3669 }
3670
3671 SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
3672
3673 if (this_set == NULL)
3674 {
3675 abbrev_base = 0;
3676 abbrev_size = debug_displays [abbrev_sec].section.size;
3677 }
3678 else
3679 {
3680 abbrev_base = this_set->section_offsets [DW_SECT_ABBREV];
3681 abbrev_size = this_set->section_sizes [DW_SECT_ABBREV];
3682 }
3683
3684 if (compunit.cu_version < 5)
3685 SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
3686
3687 /* PR 17512: file: 001-108546-0.001:0.1. */
3688 if (compunit.cu_pointer_size < 2 || compunit.cu_pointer_size > 8)
3689 {
3690 warn (_("Invalid pointer size (%d) in compunit header, using %d instead\n"),
3691 compunit.cu_pointer_size, offset_size);
3692 compunit.cu_pointer_size = offset_size;
3693 }
3694
3695 if (do_types)
3696 {
3697 SAFE_BYTE_GET64 (hdrptr, &signature_high, &signature_low, end);
3698 hdrptr += 8;
3699 SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end);
3700 }
3701
3702 if (dwarf_start_die > (cu_offset + compunit.cu_length
3703 + initial_length_size))
3704 {
3705 start = section_begin + cu_offset + compunit.cu_length
3706 + initial_length_size;
3707 continue;
3708 }
3709
3710 if ((do_loc || do_debug_loc || do_debug_ranges)
3711 && num_debug_info_entries == 0
3712 && alloc_num_debug_info_entries > unit
3713 && ! do_types)
3714 {
3715 debug_information [unit].cu_offset = cu_offset;
3716 debug_information [unit].pointer_size
3717 = compunit.cu_pointer_size;
3718 debug_information [unit].offset_size = offset_size;
3719 debug_information [unit].dwarf_version = compunit.cu_version;
3720 debug_information [unit].base_address = 0;
3721 debug_information [unit].addr_base = DEBUG_INFO_UNAVAILABLE;
3722 debug_information [unit].ranges_base = DEBUG_INFO_UNAVAILABLE;
3723 debug_information [unit].loc_offsets = NULL;
3724 debug_information [unit].have_frame_base = NULL;
3725 debug_information [unit].max_loc_offsets = 0;
3726 debug_information [unit].num_loc_offsets = 0;
3727 debug_information [unit].range_lists = NULL;
3728 debug_information [unit].max_range_lists= 0;
3729 debug_information [unit].num_range_lists = 0;
3730 }
3731
3732 if (!do_loc && dwarf_start_die == 0)
3733 {
3734 printf (_(" Compilation Unit @ offset 0x%s:\n"),
3735 dwarf_vmatoa ("x", cu_offset));
3736 printf (_(" Length: 0x%s (%s)\n"),
3737 dwarf_vmatoa ("x", compunit.cu_length),
3738 offset_size == 8 ? "64-bit" : "32-bit");
3739 printf (_(" Version: %d\n"), compunit.cu_version);
3740 if (compunit.cu_version >= 5)
3741 printf (_(" Unit Type: %s (%x)\n"),
3742 get_DW_UT_name (compunit.cu_unit_type) ?: "???",
3743 compunit.cu_unit_type);
3744 printf (_(" Abbrev Offset: 0x%s\n"),
3745 dwarf_vmatoa ("x", compunit.cu_abbrev_offset));
3746 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
3747 if (do_types)
3748 {
3749 char buf[64];
3750
3751 printf (_(" Signature: 0x%s\n"),
3752 dwarf_vmatoa64 (signature_high, signature_low,
3753 buf, sizeof (buf)));
3754 printf (_(" Type Offset: 0x%s\n"),
3755 dwarf_vmatoa ("x", type_offset));
3756 }
3757 if (this_set != NULL)
3758 {
3759 dwarf_vma *offsets = this_set->section_offsets;
3760 size_t *sizes = this_set->section_sizes;
3761
3762 printf (_(" Section contributions:\n"));
3763 printf (_(" .debug_abbrev.dwo: 0x%s 0x%s\n"),
3764 dwarf_vmatoa ("x", offsets [DW_SECT_ABBREV]),
3765 dwarf_vmatoa ("x", sizes [DW_SECT_ABBREV]));
3766 printf (_(" .debug_line.dwo: 0x%s 0x%s\n"),
3767 dwarf_vmatoa ("x", offsets [DW_SECT_LINE]),
3768 dwarf_vmatoa ("x", sizes [DW_SECT_LINE]));
3769 printf (_(" .debug_loc.dwo: 0x%s 0x%s\n"),
3770 dwarf_vmatoa ("x", offsets [DW_SECT_LOC]),
3771 dwarf_vmatoa ("x", sizes [DW_SECT_LOC]));
3772 printf (_(" .debug_str_offsets.dwo: 0x%s 0x%s\n"),
3773 dwarf_vmatoa ("x", offsets [DW_SECT_STR_OFFSETS]),
3774 dwarf_vmatoa ("x", sizes [DW_SECT_STR_OFFSETS]));
3775 }
3776 }
3777
3778 sec_off = cu_offset + initial_length_size;
3779 if (sec_off + compunit.cu_length < sec_off
3780 || sec_off + compunit.cu_length > section->size)
3781 {
3782 warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
3783 section->name,
3784 (unsigned long) cu_offset,
3785 dwarf_vmatoa ("x", compunit.cu_length));
3786 num_units = unit;
3787 break;
3788 }
3789
3790 tags = hdrptr;
3791 start += compunit.cu_length + initial_length_size;
3792
3793 if (compunit.cu_version < 2 || compunit.cu_version > 5)
3794 {
3795 warn (_("CU at offset %s contains corrupt or "
3796 "unsupported version number: %d.\n"),
3797 dwarf_vmatoa ("x", cu_offset), compunit.cu_version);
3798 continue;
3799 }
3800
3801 if (compunit.cu_unit_type != DW_UT_compile
3802 && compunit.cu_unit_type != DW_UT_partial
3803 && compunit.cu_unit_type != DW_UT_type)
3804 {
3805 warn (_("CU at offset %s contains corrupt or "
3806 "unsupported unit type: %d.\n"),
3807 dwarf_vmatoa ("x", cu_offset), compunit.cu_unit_type);
3808 continue;
3809 }
3810
3811 /* Process the abbrevs used by this compilation unit. */
3812 if (compunit.cu_abbrev_offset >= abbrev_size)
3813 warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"),
3814 (unsigned long) compunit.cu_abbrev_offset,
3815 (unsigned long) abbrev_size);
3816 /* PR 17531: file:4bcd9ce9. */
3817 else if ((abbrev_base + abbrev_size)
3818 > debug_displays [abbrev_sec].section.size)
3819 warn (_("Debug info is corrupted, abbrev size (%lx) is larger than abbrev section size (%lx)\n"),
3820 (unsigned long) abbrev_base + abbrev_size,
3821 (unsigned long) debug_displays [abbrev_sec].section.size);
3822 else
3823 {
3824 list = find_abbrev_list_by_abbrev_offset (abbrev_base,
3825 compunit.cu_abbrev_offset);
3826 if (list == NULL)
3827 {
3828 unsigned char * next;
3829
3830 list = new_abbrev_list (abbrev_base,
3831 compunit.cu_abbrev_offset);
3832 next = process_abbrev_set
3833 (((unsigned char *) debug_displays [abbrev_sec].section.start
3834 + abbrev_base + compunit.cu_abbrev_offset),
3835 ((unsigned char *) debug_displays [abbrev_sec].section.start
3836 + abbrev_base + abbrev_size),
3837 list);
3838 list->start_of_next_abbrevs = next;
3839 }
3840 }
3841
3842 level = 0;
3843 last_level = level;
3844 saved_level = -1;
3845 while (tags < start)
3846 {
3847 unsigned long abbrev_number;
3848 unsigned long die_offset;
3849 abbrev_entry *entry;
3850 abbrev_attr *attr;
3851 int do_printing = 1;
3852
3853 die_offset = tags - section_begin;
3854
3855 READ_ULEB (abbrev_number, tags, start);
3856
3857 /* A null DIE marks the end of a list of siblings or it may also be
3858 a section padding. */
3859 if (abbrev_number == 0)
3860 {
3861 /* Check if it can be a section padding for the last CU. */
3862 if (level == 0 && start == end)
3863 {
3864 unsigned char *chk;
3865
3866 for (chk = tags; chk < start; chk++)
3867 if (*chk != 0)
3868 break;
3869 if (chk == start)
3870 break;
3871 }
3872
3873 if (!do_loc && die_offset >= dwarf_start_die
3874 && (dwarf_cutoff_level == -1
3875 || level < dwarf_cutoff_level))
3876 printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
3877 level, die_offset);
3878
3879 --level;
3880 if (level < 0)
3881 {
3882 static unsigned num_bogus_warns = 0;
3883
3884 if (num_bogus_warns < 3)
3885 {
3886 warn (_("Bogus end-of-siblings marker detected at offset %lx in %s section\n"),
3887 die_offset, section->name);
3888 num_bogus_warns ++;
3889 if (num_bogus_warns == 3)
3890 warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
3891 }
3892 }
3893 if (dwarf_start_die != 0 && level < saved_level)
3894 return TRUE;
3895 continue;
3896 }
3897
3898 if (!do_loc)
3899 {
3900 if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
3901 do_printing = 0;
3902 else
3903 {
3904 if (dwarf_start_die != 0 && die_offset == dwarf_start_die)
3905 saved_level = level;
3906 do_printing = (dwarf_cutoff_level == -1
3907 || level < dwarf_cutoff_level);
3908 if (do_printing)
3909 printf (_(" <%d><%lx>: Abbrev Number: %lu"),
3910 level, die_offset, abbrev_number);
3911 else if (dwarf_cutoff_level == -1
3912 || last_level < dwarf_cutoff_level)
3913 printf (_(" <%d><%lx>: ...\n"), level, die_offset);
3914 last_level = level;
3915 }
3916 }
3917
3918 /* Scan through the abbreviation list until we reach the
3919 correct entry. */
3920 if (list == NULL)
3921 continue;
3922
3923 for (entry = list->first_abbrev; entry != NULL; entry = entry->next)
3924 if (entry->number == abbrev_number)
3925 break;
3926
3927 if (entry == NULL)
3928 {
3929 if (!do_loc && do_printing)
3930 {
3931 printf ("\n");
3932 fflush (stdout);
3933 }
3934 warn (_("DIE at offset 0x%lx refers to abbreviation number %lu which does not exist\n"),
3935 die_offset, abbrev_number);
3936 return FALSE;
3937 }
3938
3939 if (!do_loc && do_printing)
3940 printf (" (%s)\n", get_TAG_name (entry->tag));
3941
3942 switch (entry->tag)
3943 {
3944 default:
3945 need_base_address = 0;
3946 break;
3947 case DW_TAG_compile_unit:
3948 need_base_address = 1;
3949 need_dwo_info = do_loc;
3950 break;
3951 case DW_TAG_entry_point:
3952 case DW_TAG_subprogram:
3953 need_base_address = 0;
3954 /* Assuming that there is no DW_AT_frame_base. */
3955 have_frame_base = 0;
3956 break;
3957 }
3958
3959 debug_info *debug_info_p =
3960 (debug_information && unit < alloc_num_debug_info_entries)
3961 ? debug_information + unit : NULL;
3962
3963 assert (!debug_info_p
3964 || (debug_info_p->num_loc_offsets
3965 == debug_info_p->num_loc_views));
3966
3967 for (attr = entry->first_attr;
3968 attr && attr->attribute;
3969 attr = attr->next)
3970 {
3971 if (! do_loc && do_printing)
3972 /* Show the offset from where the tag was extracted. */
3973 printf (" <%lx>", (unsigned long)(tags - section_begin));
3974 tags = read_and_display_attr (attr->attribute,
3975 attr->form,
3976 attr->implicit_const,
3977 section_begin,
3978 tags,
3979 end,
3980 cu_offset,
3981 compunit.cu_pointer_size,
3982 offset_size,
3983 compunit.cu_version,
3984 debug_info_p,
3985 do_loc || ! do_printing,
3986 section,
3987 this_set,
3988 level);
3989 }
3990
3991 /* If a locview attribute appears before a location one,
3992 make sure we don't associate it with an earlier
3993 loclist. */
3994 if (debug_info_p)
3995 switch (debug_info_p->num_loc_offsets - debug_info_p->num_loc_views)
3996 {
3997 case 1:
3998 debug_info_p->loc_views [debug_info_p->num_loc_views] = vm1;
3999 debug_info_p->num_loc_views++;
4000 assert (debug_info_p->num_loc_views
4001 == debug_info_p->num_loc_offsets);
4002 break;
4003
4004 case 0:
4005 break;
4006
4007 case -1:
4008 warn(_("DIE has locviews without loclist\n"));
4009 debug_info_p->num_loc_views--;
4010 break;
4011
4012 default:
4013 assert (0);
4014 }
4015
4016 if (entry->children)
4017 ++level;
4018 }
4019 }
4020
4021 /* Set num_debug_info_entries here so that it can be used to check if
4022 we need to process .debug_loc and .debug_ranges sections. */
4023 if ((do_loc || do_debug_loc || do_debug_ranges)
4024 && num_debug_info_entries == 0
4025 && ! do_types)
4026 {
4027 if (num_units > alloc_num_debug_info_entries)
4028 num_debug_info_entries = alloc_num_debug_info_entries;
4029 else
4030 num_debug_info_entries = num_units;
4031 }
4032
4033 if (!do_loc)
4034 printf ("\n");
4035
4036 return TRUE;
4037 }
4038
4039 /* Locate and scan the .debug_info section in the file and record the pointer
4040 sizes and offsets for the compilation units in it. Usually an executable
4041 will have just one pointer size, but this is not guaranteed, and so we try
4042 not to make any assumptions. Returns zero upon failure, or the number of
4043 compilation units upon success. */
4044
4045 static unsigned int
4046 load_debug_info (void * file)
4047 {
4048 /* If we have already tried and failed to load the .debug_info
4049 section then do not bother to repeat the task. */
4050 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
4051 return 0;
4052
4053 /* If we already have the information there is nothing else to do. */
4054 if (num_debug_info_entries > 0)
4055 return num_debug_info_entries;
4056
4057 /* If this is a DWARF package file, load the CU and TU indexes. */
4058 (void) load_cu_tu_indexes (file);
4059
4060 if (load_debug_section_with_follow (info, file)
4061 && process_debug_info (&debug_displays [info].section, file, abbrev, TRUE, FALSE))
4062 return num_debug_info_entries;
4063
4064 if (load_debug_section_with_follow (info_dwo, file)
4065 && process_debug_info (&debug_displays [info_dwo].section, file,
4066 abbrev_dwo, TRUE, FALSE))
4067 return num_debug_info_entries;
4068
4069 num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
4070 return 0;
4071 }
4072
4073 /* Read a DWARF .debug_line section header starting at DATA.
4074 Upon success returns an updated DATA pointer and the LINFO
4075 structure and the END_OF_SEQUENCE pointer will be filled in.
4076 Otherwise returns NULL. */
4077
4078 static unsigned char *
4079 read_debug_line_header (struct dwarf_section * section,
4080 unsigned char * data,
4081 unsigned char * end,
4082 DWARF2_Internal_LineInfo * linfo,
4083 unsigned char ** end_of_sequence)
4084 {
4085 unsigned char *hdrptr;
4086 unsigned int initial_length_size;
4087
4088 /* Extract information from the Line Number Program Header.
4089 (section 6.2.4 in the Dwarf3 doc). */
4090 hdrptr = data;
4091
4092 /* Get and check the length of the block. */
4093 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 4, end);
4094
4095 if (linfo->li_length == 0xffffffff)
4096 {
4097 /* This section is 64-bit DWARF 3. */
4098 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 8, end);
4099 linfo->li_offset_size = 8;
4100 initial_length_size = 12;
4101 }
4102 else
4103 {
4104 linfo->li_offset_size = 4;
4105 initial_length_size = 4;
4106 }
4107
4108 if (linfo->li_length + initial_length_size > section->size)
4109 {
4110 /* If the length field has a relocation against it, then we should
4111 not complain if it is inaccurate (and probably negative). This
4112 happens in object files when the .debug_line section is actually
4113 comprised of several different .debug_line.* sections, (some of
4114 which may be removed by linker garbage collection), and a relocation
4115 is used to compute the correct length once that is done. */
4116 if (reloc_at (section, (hdrptr - section->start) - linfo->li_offset_size))
4117 {
4118 linfo->li_length = (end - data) - initial_length_size;
4119 }
4120 else
4121 {
4122 warn (_("The length field (0x%lx) in the debug_line header is wrong - the section is too small\n"),
4123 (long) linfo->li_length);
4124 return NULL;
4125 }
4126 }
4127
4128 /* Get and check the version number. */
4129 SAFE_BYTE_GET_AND_INC (linfo->li_version, hdrptr, 2, end);
4130
4131 if (linfo->li_version != 2
4132 && linfo->li_version != 3
4133 && linfo->li_version != 4
4134 && linfo->li_version != 5)
4135 {
4136 warn (_("Only DWARF version 2, 3, 4 and 5 line info "
4137 "is currently supported.\n"));
4138 return NULL;
4139 }
4140
4141 if (linfo->li_version >= 5)
4142 {
4143 SAFE_BYTE_GET_AND_INC (linfo->li_address_size, hdrptr, 1, end);
4144
4145 SAFE_BYTE_GET_AND_INC (linfo->li_segment_size, hdrptr, 1, end);
4146 if (linfo->li_segment_size != 0)
4147 {
4148 warn (_("The %s section contains "
4149 "unsupported segment selector size: %d.\n"),
4150 section->name, linfo->li_segment_size);
4151 return NULL;
4152 }
4153 }
4154
4155 SAFE_BYTE_GET_AND_INC (linfo->li_prologue_length, hdrptr,
4156 linfo->li_offset_size, end);
4157 SAFE_BYTE_GET_AND_INC (linfo->li_min_insn_length, hdrptr, 1, end);
4158
4159 if (linfo->li_version >= 4)
4160 {
4161 SAFE_BYTE_GET_AND_INC (linfo->li_max_ops_per_insn, hdrptr, 1, end);
4162
4163 if (linfo->li_max_ops_per_insn == 0)
4164 {
4165 warn (_("Invalid maximum operations per insn.\n"));
4166 return NULL;
4167 }
4168 }
4169 else
4170 linfo->li_max_ops_per_insn = 1;
4171
4172 SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end);
4173 SAFE_SIGNED_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
4174 SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end);
4175 SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end);
4176
4177 * end_of_sequence = data + linfo->li_length + initial_length_size;
4178 /* PR 17512: file:002-117414-0.004. */
4179 if (* end_of_sequence > end)
4180 {
4181 warn (_("Line length %s extends beyond end of section\n"),
4182 dwarf_vmatoa ("u", linfo->li_length));
4183 * end_of_sequence = end;
4184 return NULL;
4185 }
4186
4187 return hdrptr;
4188 }
4189
4190 static unsigned char *
4191 display_formatted_table (unsigned char * data,
4192 unsigned char * start,
4193 unsigned char * end,
4194 const DWARF2_Internal_LineInfo * linfo,
4195 struct dwarf_section * section,
4196 bfd_boolean is_dir)
4197 {
4198 unsigned char *format_start, format_count, *format, formati;
4199 dwarf_vma data_count, datai;
4200 unsigned int namepass, last_entry = 0;
4201 const char * table_name = is_dir ? N_("Directory Table") : N_("File Name Table");
4202
4203 SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
4204 if (do_checks && format_count > 5)
4205 warn (_("Unexpectedly large number of columns in the %s (%u)\n"),
4206 table_name, format_count);
4207
4208 format_start = data;
4209 for (formati = 0; formati < format_count; formati++)
4210 {
4211 SKIP_ULEB (data, end);
4212 SKIP_ULEB (data, end);
4213 if (data == end)
4214 {
4215 warn (_("%s: Corrupt format description entry\n"), table_name);
4216 return data;
4217 }
4218 }
4219
4220 READ_ULEB (data_count, data, end);
4221 if (data_count == 0)
4222 {
4223 printf (_("\n The %s is empty.\n"), table_name);
4224 return data;
4225 }
4226 else if (data == end)
4227 {
4228 warn (_("%s: Corrupt entry count - expected %s but none found\n"),
4229 table_name, dwarf_vmatoa ("x", data_count));
4230 return data;
4231 }
4232
4233 else if (format_count == 0)
4234 {
4235 warn (_("%s: format count is zero, but the table is not empty\n"),
4236 table_name);
4237 return end;
4238 }
4239
4240 printf (_("\n The %s (offset 0x%lx, lines %s, columns %u):\n"),
4241 table_name, (long) (data - start), dwarf_vmatoa ("u", data_count),
4242 format_count);
4243
4244 printf (_(" Entry"));
4245 /* Delay displaying name as the last entry for better screen layout. */
4246 for (namepass = 0; namepass < 2; namepass++)
4247 {
4248 format = format_start;
4249 for (formati = 0; formati < format_count; formati++)
4250 {
4251 dwarf_vma content_type;
4252
4253 READ_ULEB (content_type, format, end);
4254 if ((content_type == DW_LNCT_path) == (namepass == 1))
4255 switch (content_type)
4256 {
4257 case DW_LNCT_path:
4258 printf (_("\tName"));
4259 break;
4260 case DW_LNCT_directory_index:
4261 printf (_("\tDir"));
4262 break;
4263 case DW_LNCT_timestamp:
4264 printf (_("\tTime"));
4265 break;
4266 case DW_LNCT_size:
4267 printf (_("\tSize"));
4268 break;
4269 case DW_LNCT_MD5:
4270 printf (_("\tMD5\t\t\t"));
4271 break;
4272 default:
4273 printf (_("\t(Unknown format content type %s)"),
4274 dwarf_vmatoa ("u", content_type));
4275 }
4276 SKIP_ULEB (format, end);
4277 }
4278 }
4279 putchar ('\n');
4280
4281 for (datai = 0; datai < data_count; datai++)
4282 {
4283 unsigned char *datapass = data;
4284
4285 printf (" %d", last_entry++);
4286 /* Delay displaying name as the last entry for better screen layout. */
4287 for (namepass = 0; namepass < 2; namepass++)
4288 {
4289 format = format_start;
4290 data = datapass;
4291 for (formati = 0; formati < format_count; formati++)
4292 {
4293 dwarf_vma content_type, form;
4294
4295 READ_ULEB (content_type, format, end);
4296 READ_ULEB (form, format, end);
4297 data = read_and_display_attr_value (0, form, 0, start, data, end,
4298 0, 0, linfo->li_offset_size,
4299 linfo->li_version, NULL,
4300 ((content_type == DW_LNCT_path) != (namepass == 1)),
4301 section, NULL, '\t', -1);
4302 }
4303 }
4304
4305 if (data == end && (datai < data_count - 1))
4306 {
4307 warn (_("\n%s: Corrupt entries list\n"), table_name);
4308 return data;
4309 }
4310 putchar ('\n');
4311 }
4312 return data;
4313 }
4314
4315 static int
4316 display_debug_lines_raw (struct dwarf_section * section,
4317 unsigned char * data,
4318 unsigned char * end,
4319 void * file)
4320 {
4321 unsigned char *start = section->start;
4322 int verbose_view = 0;
4323
4324 introduce (section, TRUE);
4325
4326 while (data < end)
4327 {
4328 static DWARF2_Internal_LineInfo saved_linfo;
4329 DWARF2_Internal_LineInfo linfo;
4330 unsigned char *standard_opcodes;
4331 unsigned char *end_of_sequence;
4332 int i;
4333
4334 if (const_strneq (section->name, ".debug_line.")
4335 /* Note: the following does not apply to .debug_line.dwo sections.
4336 These are full debug_line sections. */
4337 && strcmp (section->name, ".debug_line.dwo") != 0)
4338 {
4339 /* Sections named .debug_line.<foo> are fragments of a .debug_line
4340 section containing just the Line Number Statements. They are
4341 created by the assembler and intended to be used alongside gcc's
4342 -ffunction-sections command line option. When the linker's
4343 garbage collection decides to discard a .text.<foo> section it
4344 can then also discard the line number information in .debug_line.<foo>.
4345
4346 Since the section is a fragment it does not have the details
4347 needed to fill out a LineInfo structure, so instead we use the
4348 details from the last full debug_line section that we processed. */
4349 end_of_sequence = end;
4350 standard_opcodes = NULL;
4351 linfo = saved_linfo;
4352 /* PR 17531: file: 0522b371. */
4353 if (linfo.li_line_range == 0)
4354 {
4355 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
4356 return 0;
4357 }
4358 reset_state_machine (linfo.li_default_is_stmt);
4359 }
4360 else
4361 {
4362 unsigned char * hdrptr;
4363
4364 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
4365 & end_of_sequence)) == NULL)
4366 return 0;
4367
4368 printf (_(" Offset: 0x%lx\n"), (long)(data - start));
4369 printf (_(" Length: %ld\n"), (long) linfo.li_length);
4370 printf (_(" DWARF Version: %d\n"), linfo.li_version);
4371 if (linfo.li_version >= 5)
4372 {
4373 printf (_(" Address size (bytes): %d\n"), linfo.li_address_size);
4374 printf (_(" Segment selector (bytes): %d\n"), linfo.li_segment_size);
4375 }
4376 printf (_(" Prologue Length: %d\n"), (int) linfo.li_prologue_length);
4377 printf (_(" Minimum Instruction Length: %d\n"), linfo.li_min_insn_length);
4378 if (linfo.li_version >= 4)
4379 printf (_(" Maximum Ops per Instruction: %d\n"), linfo.li_max_ops_per_insn);
4380 printf (_(" Initial value of 'is_stmt': %d\n"), linfo.li_default_is_stmt);
4381 printf (_(" Line Base: %d\n"), linfo.li_line_base);
4382 printf (_(" Line Range: %d\n"), linfo.li_line_range);
4383 printf (_(" Opcode Base: %d\n"), linfo.li_opcode_base);
4384
4385 /* PR 17512: file: 1665-6428-0.004. */
4386 if (linfo.li_line_range == 0)
4387 {
4388 warn (_("Line range of 0 is invalid, using 1 instead\n"));
4389 linfo.li_line_range = 1;
4390 }
4391
4392 reset_state_machine (linfo.li_default_is_stmt);
4393
4394 /* Display the contents of the Opcodes table. */
4395 standard_opcodes = hdrptr;
4396
4397 /* PR 17512: file: 002-417945-0.004. */
4398 if (standard_opcodes + linfo.li_opcode_base >= end)
4399 {
4400 warn (_("Line Base extends beyond end of section\n"));
4401 return 0;
4402 }
4403
4404 printf (_("\n Opcodes:\n"));
4405
4406 for (i = 1; i < linfo.li_opcode_base; i++)
4407 printf (ngettext (" Opcode %d has %d arg\n",
4408 " Opcode %d has %d args\n",
4409 standard_opcodes[i - 1]),
4410 i, standard_opcodes[i - 1]);
4411
4412 /* Display the contents of the Directory table. */
4413 data = standard_opcodes + linfo.li_opcode_base - 1;
4414
4415 if (linfo.li_version >= 5)
4416 {
4417 load_debug_section_with_follow (line_str, file);
4418
4419 data = display_formatted_table (data, start, end, &linfo, section,
4420 TRUE);
4421 data = display_formatted_table (data, start, end, &linfo, section,
4422 FALSE);
4423 }
4424 else
4425 {
4426 if (*data == 0)
4427 printf (_("\n The Directory Table is empty.\n"));
4428 else
4429 {
4430 unsigned int last_dir_entry = 0;
4431
4432 printf (_("\n The Directory Table (offset 0x%lx):\n"),
4433 (long)(data - start));
4434
4435 while (data < end && *data != 0)
4436 {
4437 printf (" %d\t%.*s\n", ++last_dir_entry, (int) (end - data), data);
4438
4439 data += strnlen ((char *) data, end - data) + 1;
4440 }
4441
4442 /* PR 17512: file: 002-132094-0.004. */
4443 if (data >= end - 1)
4444 break;
4445 }
4446
4447 /* Skip the NUL at the end of the table. */
4448 data++;
4449
4450 /* Display the contents of the File Name table. */
4451 if (*data == 0)
4452 printf (_("\n The File Name Table is empty.\n"));
4453 else
4454 {
4455 printf (_("\n The File Name Table (offset 0x%lx):\n"),
4456 (long)(data - start));
4457 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4458
4459 while (data < end && *data != 0)
4460 {
4461 unsigned char *name;
4462 dwarf_vma val;
4463
4464 printf (" %d\t", ++state_machine_regs.last_file_entry);
4465 name = data;
4466 data += strnlen ((char *) data, end - data) + 1;
4467
4468 READ_ULEB (val, data, end);
4469 printf ("%s\t", dwarf_vmatoa ("u", val));
4470 READ_ULEB (val, data, end);
4471 printf ("%s\t", dwarf_vmatoa ("u", val));
4472 READ_ULEB (val, data, end);
4473 printf ("%s\t", dwarf_vmatoa ("u", val));
4474 printf ("%.*s\n", (int)(end - name), name);
4475
4476 if (data == end)
4477 {
4478 warn (_("Corrupt file name table entry\n"));
4479 break;
4480 }
4481 }
4482 }
4483
4484 /* Skip the NUL at the end of the table. */
4485 data++;
4486 }
4487
4488 putchar ('\n');
4489 saved_linfo = linfo;
4490 }
4491
4492 /* Now display the statements. */
4493 if (data >= end_of_sequence)
4494 printf (_(" No Line Number Statements.\n"));
4495 else
4496 {
4497 printf (_(" Line Number Statements:\n"));
4498
4499 while (data < end_of_sequence)
4500 {
4501 unsigned char op_code;
4502 dwarf_signed_vma adv;
4503 dwarf_vma uladv;
4504
4505 printf (" [0x%08lx]", (long)(data - start));
4506
4507 op_code = *data++;
4508
4509 if (op_code >= linfo.li_opcode_base)
4510 {
4511 op_code -= linfo.li_opcode_base;
4512 uladv = (op_code / linfo.li_line_range);
4513 if (linfo.li_max_ops_per_insn == 1)
4514 {
4515 uladv *= linfo.li_min_insn_length;
4516 state_machine_regs.address += uladv;
4517 if (uladv)
4518 state_machine_regs.view = 0;
4519 printf (_(" Special opcode %d: "
4520 "advance Address by %s to 0x%s%s"),
4521 op_code, dwarf_vmatoa ("u", uladv),
4522 dwarf_vmatoa ("x", state_machine_regs.address),
4523 verbose_view && uladv
4524 ? _(" (reset view)") : "");
4525 }
4526 else
4527 {
4528 unsigned addrdelta
4529 = ((state_machine_regs.op_index + uladv)
4530 / linfo.li_max_ops_per_insn)
4531 * linfo.li_min_insn_length;
4532
4533 state_machine_regs.address += addrdelta;
4534 state_machine_regs.op_index
4535 = (state_machine_regs.op_index + uladv)
4536 % linfo.li_max_ops_per_insn;
4537 if (addrdelta)
4538 state_machine_regs.view = 0;
4539 printf (_(" Special opcode %d: "
4540 "advance Address by %s to 0x%s[%d]%s"),
4541 op_code, dwarf_vmatoa ("u", uladv),
4542 dwarf_vmatoa ("x", state_machine_regs.address),
4543 state_machine_regs.op_index,
4544 verbose_view && addrdelta
4545 ? _(" (reset view)") : "");
4546 }
4547 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
4548 state_machine_regs.line += adv;
4549 printf (_(" and Line by %s to %d"),
4550 dwarf_vmatoa ("d", adv), state_machine_regs.line);
4551 if (verbose_view || state_machine_regs.view)
4552 printf (_(" (view %u)\n"), state_machine_regs.view);
4553 else
4554 putchar ('\n');
4555 state_machine_regs.view++;
4556 }
4557 else
4558 switch (op_code)
4559 {
4560 case DW_LNS_extended_op:
4561 data += process_extended_line_op (data,
4562 linfo.li_default_is_stmt,
4563 end);
4564 break;
4565
4566 case DW_LNS_copy:
4567 printf (_(" Copy"));
4568 if (verbose_view || state_machine_regs.view)
4569 printf (_(" (view %u)\n"), state_machine_regs.view);
4570 else
4571 putchar ('\n');
4572 state_machine_regs.view++;
4573 break;
4574
4575 case DW_LNS_advance_pc:
4576 READ_ULEB (uladv, data, end);
4577 if (linfo.li_max_ops_per_insn == 1)
4578 {
4579 uladv *= linfo.li_min_insn_length;
4580 state_machine_regs.address += uladv;
4581 if (uladv)
4582 state_machine_regs.view = 0;
4583 printf (_(" Advance PC by %s to 0x%s%s\n"),
4584 dwarf_vmatoa ("u", uladv),
4585 dwarf_vmatoa ("x", state_machine_regs.address),
4586 verbose_view && uladv
4587 ? _(" (reset view)") : "");
4588 }
4589 else
4590 {
4591 unsigned addrdelta
4592 = ((state_machine_regs.op_index + uladv)
4593 / linfo.li_max_ops_per_insn)
4594 * linfo.li_min_insn_length;
4595 state_machine_regs.address
4596 += addrdelta;
4597 state_machine_regs.op_index
4598 = (state_machine_regs.op_index + uladv)
4599 % linfo.li_max_ops_per_insn;
4600 if (addrdelta)
4601 state_machine_regs.view = 0;
4602 printf (_(" Advance PC by %s to 0x%s[%d]%s\n"),
4603 dwarf_vmatoa ("u", uladv),
4604 dwarf_vmatoa ("x", state_machine_regs.address),
4605 state_machine_regs.op_index,
4606 verbose_view && addrdelta
4607 ? _(" (reset view)") : "");
4608 }
4609 break;
4610
4611 case DW_LNS_advance_line:
4612 READ_SLEB (adv, data, end);
4613 state_machine_regs.line += adv;
4614 printf (_(" Advance Line by %s to %d\n"),
4615 dwarf_vmatoa ("d", adv),
4616 state_machine_regs.line);
4617 break;
4618
4619 case DW_LNS_set_file:
4620 READ_ULEB (uladv, data, end);
4621 printf (_(" Set File Name to entry %s in the File Name Table\n"),
4622 dwarf_vmatoa ("u", uladv));
4623 state_machine_regs.file = uladv;
4624 break;
4625
4626 case DW_LNS_set_column:
4627 READ_ULEB (uladv, data, end);
4628 printf (_(" Set column to %s\n"),
4629 dwarf_vmatoa ("u", uladv));
4630 state_machine_regs.column = uladv;
4631 break;
4632
4633 case DW_LNS_negate_stmt:
4634 adv = state_machine_regs.is_stmt;
4635 adv = ! adv;
4636 printf (_(" Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv));
4637 state_machine_regs.is_stmt = adv;
4638 break;
4639
4640 case DW_LNS_set_basic_block:
4641 printf (_(" Set basic block\n"));
4642 state_machine_regs.basic_block = 1;
4643 break;
4644
4645 case DW_LNS_const_add_pc:
4646 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
4647 if (linfo.li_max_ops_per_insn)
4648 {
4649 uladv *= linfo.li_min_insn_length;
4650 state_machine_regs.address += uladv;
4651 if (uladv)
4652 state_machine_regs.view = 0;
4653 printf (_(" Advance PC by constant %s to 0x%s%s\n"),
4654 dwarf_vmatoa ("u", uladv),
4655 dwarf_vmatoa ("x", state_machine_regs.address),
4656 verbose_view && uladv
4657 ? _(" (reset view)") : "");
4658 }
4659 else
4660 {
4661 unsigned addrdelta
4662 = ((state_machine_regs.op_index + uladv)
4663 / linfo.li_max_ops_per_insn)
4664 * linfo.li_min_insn_length;
4665 state_machine_regs.address
4666 += addrdelta;
4667 state_machine_regs.op_index
4668 = (state_machine_regs.op_index + uladv)
4669 % linfo.li_max_ops_per_insn;
4670 if (addrdelta)
4671 state_machine_regs.view = 0;
4672 printf (_(" Advance PC by constant %s to 0x%s[%d]%s\n"),
4673 dwarf_vmatoa ("u", uladv),
4674 dwarf_vmatoa ("x", state_machine_regs.address),
4675 state_machine_regs.op_index,
4676 verbose_view && addrdelta
4677 ? _(" (reset view)") : "");
4678 }
4679 break;
4680
4681 case DW_LNS_fixed_advance_pc:
4682 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
4683 state_machine_regs.address += uladv;
4684 state_machine_regs.op_index = 0;
4685 printf (_(" Advance PC by fixed size amount %s to 0x%s\n"),
4686 dwarf_vmatoa ("u", uladv),
4687 dwarf_vmatoa ("x", state_machine_regs.address));
4688 /* Do NOT reset view. */
4689 break;
4690
4691 case DW_LNS_set_prologue_end:
4692 printf (_(" Set prologue_end to true\n"));
4693 break;
4694
4695 case DW_LNS_set_epilogue_begin:
4696 printf (_(" Set epilogue_begin to true\n"));
4697 break;
4698
4699 case DW_LNS_set_isa:
4700 READ_ULEB (uladv, data, end);
4701 printf (_(" Set ISA to %s\n"), dwarf_vmatoa ("u", uladv));
4702 break;
4703
4704 default:
4705 printf (_(" Unknown opcode %d with operands: "), op_code);
4706
4707 if (standard_opcodes != NULL)
4708 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
4709 {
4710 READ_ULEB (uladv, data, end);
4711 printf ("0x%s%s", dwarf_vmatoa ("x", uladv),
4712 i == 1 ? "" : ", ");
4713 }
4714 putchar ('\n');
4715 break;
4716 }
4717 }
4718 putchar ('\n');
4719 }
4720 }
4721
4722 return 1;
4723 }
4724
4725 typedef struct
4726 {
4727 unsigned char *name;
4728 unsigned int directory_index;
4729 unsigned int modification_date;
4730 unsigned int length;
4731 } File_Entry;
4732
4733 /* Output a decoded representation of the .debug_line section. */
4734
4735 static int
4736 display_debug_lines_decoded (struct dwarf_section * section,
4737 unsigned char * start,
4738 unsigned char * data,
4739 unsigned char * end,
4740 void * fileptr)
4741 {
4742 static DWARF2_Internal_LineInfo saved_linfo;
4743
4744 introduce (section, FALSE);
4745
4746 while (data < end)
4747 {
4748 /* This loop amounts to one iteration per compilation unit. */
4749 DWARF2_Internal_LineInfo linfo;
4750 unsigned char *standard_opcodes;
4751 unsigned char *end_of_sequence;
4752 int i;
4753 File_Entry *file_table = NULL;
4754 unsigned int n_files = 0;
4755 unsigned char **directory_table = NULL;
4756 dwarf_vma n_directories = 0;
4757
4758 if (const_strneq (section->name, ".debug_line.")
4759 /* Note: the following does not apply to .debug_line.dwo sections.
4760 These are full debug_line sections. */
4761 && strcmp (section->name, ".debug_line.dwo") != 0)
4762 {
4763 /* See comment in display_debug_lines_raw(). */
4764 end_of_sequence = end;
4765 standard_opcodes = NULL;
4766 linfo = saved_linfo;
4767 /* PR 17531: file: 0522b371. */
4768 if (linfo.li_line_range == 0)
4769 {
4770 warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
4771 return 0;
4772 }
4773 reset_state_machine (linfo.li_default_is_stmt);
4774 }
4775 else
4776 {
4777 unsigned char *hdrptr;
4778
4779 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
4780 & end_of_sequence)) == NULL)
4781 return 0;
4782
4783 /* PR 17531: file: 0522b371. */
4784 if (linfo.li_line_range == 0)
4785 {
4786 warn (_("Line range of 0 is invalid, using 1 instead\n"));
4787 linfo.li_line_range = 1;
4788 }
4789 reset_state_machine (linfo.li_default_is_stmt);
4790
4791 /* Save a pointer to the contents of the Opcodes table. */
4792 standard_opcodes = hdrptr;
4793
4794 /* Traverse the Directory table just to count entries. */
4795 data = standard_opcodes + linfo.li_opcode_base - 1;
4796 /* PR 20440 */
4797 if (data >= end)
4798 {
4799 warn (_("opcode base of %d extends beyond end of section\n"),
4800 linfo.li_opcode_base);
4801 return 0;
4802 }
4803
4804 if (linfo.li_version >= 5)
4805 {
4806 unsigned char *format_start, format_count, *format;
4807 dwarf_vma formati, entryi;
4808
4809 load_debug_section_with_follow (line_str, fileptr);
4810
4811 /* Skip directories format. */
4812 SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
4813 if (do_checks && format_count > 1)
4814 warn (_("Unexpectedly large number of columns in the directory name table (%u)\n"),
4815 format_count);
4816 format_start = data;
4817 for (formati = 0; formati < format_count; formati++)
4818 {
4819 SKIP_ULEB (data, end);
4820 SKIP_ULEB (data, end);
4821 }
4822
4823 READ_ULEB (n_directories, data, end);
4824 if (data == end)
4825 {
4826 warn (_("Corrupt directories list\n"));
4827 break;
4828 }
4829
4830 if (n_directories == 0)
4831 directory_table = NULL;
4832 else
4833 directory_table = (unsigned char **)
4834 xmalloc (n_directories * sizeof (unsigned char *));
4835
4836 for (entryi = 0; entryi < n_directories; entryi++)
4837 {
4838 unsigned char **pathp = &directory_table[entryi];
4839
4840 format = format_start;
4841 for (formati = 0; formati < format_count; formati++)
4842 {
4843 dwarf_vma content_type, form;
4844 dwarf_vma uvalue;
4845
4846 READ_ULEB (content_type, format, end);
4847 READ_ULEB (form, format, end);
4848 if (data == end)
4849 {
4850 warn (_("Corrupt directories list\n"));
4851 break;
4852 }
4853 switch (content_type)
4854 {
4855 case DW_LNCT_path:
4856 switch (form)
4857 {
4858 case DW_FORM_string:
4859 *pathp = data;
4860 break;
4861 case DW_FORM_line_strp:
4862 SAFE_BYTE_GET (uvalue, data, linfo.li_offset_size,
4863 end);
4864 /* Remove const by the cast. */
4865 *pathp = (unsigned char *)
4866 fetch_indirect_line_string (uvalue);
4867 break;
4868 }
4869 break;
4870 }
4871 data = read_and_display_attr_value (0, form, 0, start,
4872 data, end, 0, 0,
4873 linfo.li_offset_size,
4874 linfo.li_version,
4875 NULL, 1, section,
4876 NULL, '\t', -1);
4877 }
4878 if (data == end)
4879 {
4880 warn (_("Corrupt directories list\n"));
4881 break;
4882 }
4883 }
4884
4885 /* Skip files format. */
4886 SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
4887 if (do_checks && format_count > 5)
4888 warn (_("Unexpectedly large number of columns in the file name table (%u)\n"),
4889 format_count);
4890 format_start = data;
4891 for (formati = 0; formati < format_count; formati++)
4892 {
4893 SKIP_ULEB (data, end);
4894 SKIP_ULEB (data, end);
4895 }
4896
4897 READ_ULEB (n_files, data, end);
4898 if (data == end && n_files > 0)
4899 {
4900 warn (_("Corrupt file name list\n"));
4901 break;
4902 }
4903
4904 if (n_files == 0)
4905 file_table = NULL;
4906 else
4907 file_table = (File_Entry *) xcalloc (1, n_files
4908 * sizeof (File_Entry));
4909
4910 for (entryi = 0; entryi < n_files; entryi++)
4911 {
4912 File_Entry *file = &file_table[entryi];
4913
4914 format = format_start;
4915 for (formati = 0; formati < format_count; formati++)
4916 {
4917 dwarf_vma content_type, form;
4918 dwarf_vma uvalue;
4919 unsigned char *tmp;
4920
4921 READ_ULEB (content_type, format, end);
4922 READ_ULEB (form, format, end);
4923 if (data == end)
4924 {
4925 warn (_("Corrupt file name list\n"));
4926 break;
4927 }
4928 switch (content_type)
4929 {
4930 case DW_LNCT_path:
4931 switch (form)
4932 {
4933 case DW_FORM_string:
4934 file->name = data;
4935 break;
4936 case DW_FORM_line_strp:
4937 SAFE_BYTE_GET (uvalue, data, linfo.li_offset_size,
4938 end);
4939 /* Remove const by the cast. */
4940 file->name = (unsigned char *)
4941 fetch_indirect_line_string (uvalue);
4942 break;
4943 }
4944 break;
4945 case DW_LNCT_directory_index:
4946 switch (form)
4947 {
4948 case DW_FORM_data1:
4949 SAFE_BYTE_GET (file->directory_index, data, 1,
4950 end);
4951 break;
4952 case DW_FORM_data2:
4953 SAFE_BYTE_GET (file->directory_index, data, 2,
4954 end);
4955 break;
4956 case DW_FORM_udata:
4957 tmp = data;
4958 READ_ULEB (file->directory_index, tmp, end);
4959 break;
4960 }
4961 break;
4962 }
4963 data = read_and_display_attr_value (0, form, 0, start,
4964 data, end, 0, 0,
4965 linfo.li_offset_size,
4966 linfo.li_version,
4967 NULL, 1, section,
4968 NULL, '\t', -1);
4969 }
4970 if (data == end)
4971 {
4972 warn (_("Corrupt file name list\n"));
4973 break;
4974 }
4975 }
4976 }
4977 else
4978 {
4979 if (*data != 0)
4980 {
4981 unsigned char *ptr_directory_table = data;
4982
4983 while (data < end && *data != 0)
4984 {
4985 data += strnlen ((char *) data, end - data) + 1;
4986 n_directories++;
4987 }
4988
4989 /* PR 20440 */
4990 if (data >= end)
4991 {
4992 warn (_("directory table ends unexpectedly\n"));
4993 n_directories = 0;
4994 break;
4995 }
4996
4997 /* Go through the directory table again to save the directories. */
4998 directory_table = (unsigned char **)
4999 xmalloc (n_directories * sizeof (unsigned char *));
5000
5001 i = 0;
5002 while (*ptr_directory_table != 0)
5003 {
5004 directory_table[i] = ptr_directory_table;
5005 ptr_directory_table += strnlen ((char *) ptr_directory_table,
5006 ptr_directory_table - end) + 1;
5007 i++;
5008 }
5009 }
5010 /* Skip the NUL at the end of the table. */
5011 data++;
5012
5013 /* Traverse the File Name table just to count the entries. */
5014 if (data < end && *data != 0)
5015 {
5016 unsigned char *ptr_file_name_table = data;
5017
5018 while (data < end && *data != 0)
5019 {
5020 /* Skip Name, directory index, last modification
5021 time and length of file. */
5022 data += strnlen ((char *) data, end - data) + 1;
5023 SKIP_ULEB (data, end);
5024 SKIP_ULEB (data, end);
5025 SKIP_ULEB (data, end);
5026 n_files++;
5027 }
5028
5029 if (data >= end)
5030 {
5031 warn (_("file table ends unexpectedly\n"));
5032 n_files = 0;
5033 break;
5034 }
5035
5036 /* Go through the file table again to save the strings. */
5037 file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
5038
5039 i = 0;
5040 while (*ptr_file_name_table != 0)
5041 {
5042 file_table[i].name = ptr_file_name_table;
5043 ptr_file_name_table += strnlen ((char *) ptr_file_name_table,
5044 end - ptr_file_name_table) + 1;
5045
5046 /* We are not interested in directory, time or size. */
5047 READ_ULEB (file_table[i].directory_index,
5048 ptr_file_name_table, end);
5049 READ_ULEB (file_table[i].modification_date,
5050 ptr_file_name_table, end);
5051 READ_ULEB (file_table[i].length,
5052 ptr_file_name_table, end);
5053 i++;
5054 }
5055 i = 0;
5056 }
5057
5058 /* Skip the NUL at the end of the table. */
5059 data++;
5060 }
5061
5062 /* Print the Compilation Unit's name and a header. */
5063 if (file_table == NULL)
5064 printf (_("CU: No directory table\n"));
5065 else if (directory_table == NULL)
5066 printf (_("CU: %s:\n"), file_table[0].name);
5067 else
5068 {
5069 unsigned int ix = file_table[0].directory_index;
5070 const char *directory;
5071
5072 if (ix == 0)
5073 directory = ".";
5074 /* PR 20439 */
5075 else if (n_directories == 0)
5076 directory = _("<unknown>");
5077 else if (ix > n_directories)
5078 {
5079 warn (_("directory index %u > number of directories %s\n"),
5080 ix, dwarf_vmatoa ("u", n_directories));
5081 directory = _("<corrupt>");
5082 }
5083 else
5084 directory = (char *) directory_table[ix - 1];
5085
5086 if (do_wide || strlen (directory) < 76)
5087 printf (_("CU: %s/%s:\n"), directory, file_table[0].name);
5088 else
5089 printf ("%s:\n", file_table[0].name);
5090 }
5091
5092 if (n_files > 0)
5093 printf (_("File name Line number Starting address View Stmt\n"));
5094 else
5095 printf (_("CU: Empty file name table\n"));
5096 saved_linfo = linfo;
5097 }
5098
5099 /* This loop iterates through the Dwarf Line Number Program. */
5100 while (data < end_of_sequence)
5101 {
5102 unsigned char op_code;
5103 int xop;
5104 int adv;
5105 unsigned long int uladv;
5106 int is_special_opcode = 0;
5107
5108 op_code = *data++;
5109 xop = op_code;
5110
5111 if (op_code >= linfo.li_opcode_base)
5112 {
5113 op_code -= linfo.li_opcode_base;
5114 uladv = (op_code / linfo.li_line_range);
5115 if (linfo.li_max_ops_per_insn == 1)
5116 {
5117 uladv *= linfo.li_min_insn_length;
5118 state_machine_regs.address += uladv;
5119 if (uladv)
5120 state_machine_regs.view = 0;
5121 }
5122 else
5123 {
5124 unsigned addrdelta
5125 = ((state_machine_regs.op_index + uladv)
5126 / linfo.li_max_ops_per_insn)
5127 * linfo.li_min_insn_length;
5128 state_machine_regs.address
5129 += addrdelta;
5130 state_machine_regs.op_index
5131 = (state_machine_regs.op_index + uladv)
5132 % linfo.li_max_ops_per_insn;
5133 if (addrdelta)
5134 state_machine_regs.view = 0;
5135 }
5136
5137 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
5138 state_machine_regs.line += adv;
5139 is_special_opcode = 1;
5140 /* Increment view after printing this row. */
5141 }
5142 else
5143 switch (op_code)
5144 {
5145 case DW_LNS_extended_op:
5146 {
5147 unsigned int ext_op_code_len;
5148 unsigned char ext_op_code;
5149 unsigned char *op_code_end;
5150 unsigned char *op_code_data = data;
5151
5152 READ_ULEB (ext_op_code_len, op_code_data, end_of_sequence);
5153 op_code_end = op_code_data + ext_op_code_len;
5154 if (ext_op_code_len == 0 || op_code_end > end_of_sequence)
5155 {
5156 warn (_("Badly formed extended line op encountered!\n"));
5157 break;
5158 }
5159 ext_op_code = *op_code_data++;
5160 xop = ext_op_code;
5161 xop = -xop;
5162
5163 switch (ext_op_code)
5164 {
5165 case DW_LNE_end_sequence:
5166 /* Reset stuff after printing this row. */
5167 break;
5168 case DW_LNE_set_address:
5169 SAFE_BYTE_GET_AND_INC (state_machine_regs.address,
5170 op_code_data,
5171 op_code_end - op_code_data,
5172 op_code_end);
5173 state_machine_regs.op_index = 0;
5174 state_machine_regs.view = 0;
5175 break;
5176 case DW_LNE_define_file:
5177 file_table = (File_Entry *) xrealloc
5178 (file_table, (n_files + 1) * sizeof (File_Entry));
5179
5180 ++state_machine_regs.last_file_entry;
5181 /* Source file name. */
5182 file_table[n_files].name = op_code_data;
5183 op_code_data += strlen ((char *) op_code_data) + 1;
5184 /* Directory index. */
5185 READ_ULEB (file_table[n_files].directory_index,
5186 op_code_data, op_code_end);
5187 /* Last modification time. */
5188 READ_ULEB (file_table[n_files].modification_date,
5189 op_code_data, op_code_end);
5190 /* File length. */
5191 READ_ULEB (file_table[n_files].length,
5192 op_code_data, op_code_end);
5193 n_files++;
5194 break;
5195
5196 case DW_LNE_set_discriminator:
5197 case DW_LNE_HP_set_sequence:
5198 /* Simply ignored. */
5199 break;
5200
5201 default:
5202 printf (_("UNKNOWN (%u): length %ld\n"),
5203 ext_op_code, (long int) (op_code_data - data));
5204 break;
5205 }
5206 data = op_code_end;
5207 break;
5208 }
5209 case DW_LNS_copy:
5210 /* Increment view after printing this row. */
5211 break;
5212
5213 case DW_LNS_advance_pc:
5214 READ_ULEB (uladv, data, end);
5215 if (linfo.li_max_ops_per_insn == 1)
5216 {
5217 uladv *= linfo.li_min_insn_length;
5218 state_machine_regs.address += uladv;
5219 if (uladv)
5220 state_machine_regs.view = 0;
5221 }
5222 else
5223 {
5224 unsigned addrdelta
5225 = ((state_machine_regs.op_index + uladv)
5226 / linfo.li_max_ops_per_insn)
5227 * linfo.li_min_insn_length;
5228 state_machine_regs.address
5229 += addrdelta;
5230 state_machine_regs.op_index
5231 = (state_machine_regs.op_index + uladv)
5232 % linfo.li_max_ops_per_insn;
5233 if (addrdelta)
5234 state_machine_regs.view = 0;
5235 }
5236 break;
5237
5238 case DW_LNS_advance_line:
5239 READ_SLEB (adv, data, end);
5240 state_machine_regs.line += adv;
5241 break;
5242
5243 case DW_LNS_set_file:
5244 READ_ULEB (uladv, data, end);
5245 state_machine_regs.file = uladv;
5246
5247 {
5248 unsigned file = state_machine_regs.file - 1;
5249 unsigned dir;
5250
5251 if (file_table == NULL || n_files == 0)
5252 printf (_("\n [Use file table entry %d]\n"), file);
5253 /* PR 20439 */
5254 else if (file >= n_files)
5255 {
5256 warn (_("file index %u > number of files %u\n"), file + 1, n_files);
5257 printf (_("\n <over large file table index %u>"), file);
5258 }
5259 else if ((dir = file_table[file].directory_index) == 0)
5260 /* If directory index is 0, that means current directory. */
5261 printf ("\n./%s:[++]\n", file_table[file].name);
5262 else if (directory_table == NULL || n_directories == 0)
5263 printf (_("\n [Use file %s in directory table entry %d]\n"),
5264 file_table[file].name, dir);
5265 /* PR 20439 */
5266 else if (dir > n_directories)
5267 {
5268 warn (_("directory index %u > number of directories %s\n"),
5269 dir, dwarf_vmatoa ("u", n_directories));
5270 printf (_("\n <over large directory table entry %u>\n"), dir);
5271 }
5272 else
5273 printf ("\n%s/%s:\n",
5274 /* The directory index starts counting at 1. */
5275 directory_table[dir - 1], file_table[file].name);
5276 }
5277 break;
5278
5279 case DW_LNS_set_column:
5280 READ_ULEB (uladv, data, end);
5281 state_machine_regs.column = uladv;
5282 break;
5283
5284 case DW_LNS_negate_stmt:
5285 adv = state_machine_regs.is_stmt;
5286 adv = ! adv;
5287 state_machine_regs.is_stmt = adv;
5288 break;
5289
5290 case DW_LNS_set_basic_block:
5291 state_machine_regs.basic_block = 1;
5292 break;
5293
5294 case DW_LNS_const_add_pc:
5295 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
5296 if (linfo.li_max_ops_per_insn == 1)
5297 {
5298 uladv *= linfo.li_min_insn_length;
5299 state_machine_regs.address += uladv;
5300 if (uladv)
5301 state_machine_regs.view = 0;
5302 }
5303 else
5304 {
5305 unsigned addrdelta
5306 = ((state_machine_regs.op_index + uladv)
5307 / linfo.li_max_ops_per_insn)
5308 * linfo.li_min_insn_length;
5309 state_machine_regs.address
5310 += addrdelta;
5311 state_machine_regs.op_index
5312 = (state_machine_regs.op_index + uladv)
5313 % linfo.li_max_ops_per_insn;
5314 if (addrdelta)
5315 state_machine_regs.view = 0;
5316 }
5317 break;
5318
5319 case DW_LNS_fixed_advance_pc:
5320 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
5321 state_machine_regs.address += uladv;
5322 state_machine_regs.op_index = 0;
5323 /* Do NOT reset view. */
5324 break;
5325
5326 case DW_LNS_set_prologue_end:
5327 break;
5328
5329 case DW_LNS_set_epilogue_begin:
5330 break;
5331
5332 case DW_LNS_set_isa:
5333 READ_ULEB (uladv, data, end);
5334 printf (_(" Set ISA to %lu\n"), uladv);
5335 break;
5336
5337 default:
5338 printf (_(" Unknown opcode %d with operands: "), op_code);
5339
5340 if (standard_opcodes != NULL)
5341 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
5342 {
5343 dwarf_vma val;
5344
5345 READ_ULEB (val, data, end);
5346 printf ("0x%s%s", dwarf_vmatoa ("x", val),
5347 i == 1 ? "" : ", ");
5348 }
5349 putchar ('\n');
5350 break;
5351 }
5352
5353 /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
5354 to the DWARF address/line matrix. */
5355 if ((is_special_opcode) || (xop == -DW_LNE_end_sequence)
5356 || (xop == DW_LNS_copy))
5357 {
5358 const unsigned int MAX_FILENAME_LENGTH = 35;
5359 char *fileName;
5360 char *newFileName = NULL;
5361 size_t fileNameLength;
5362
5363 if (file_table)
5364 {
5365 unsigned indx = state_machine_regs.file - 1;
5366 /* PR 20439 */
5367 if (indx >= n_files)
5368 {
5369 warn (_("corrupt file index %u encountered\n"), indx);
5370 fileName = _("<corrupt>");
5371 }
5372 else
5373 fileName = (char *) file_table[indx].name;
5374 }
5375 else
5376 fileName = _("<unknown>");
5377
5378 fileNameLength = strlen (fileName);
5379
5380 if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
5381 {
5382 newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
5383 /* Truncate file name */
5384 strncpy (newFileName,
5385 fileName + fileNameLength - MAX_FILENAME_LENGTH,
5386 MAX_FILENAME_LENGTH + 1);
5387 /* FIXME: This is to pacify gcc-10 which can warn that the
5388 strncpy above might leave a non-NUL terminated string
5389 in newFileName. It won't, but gcc's analysis doesn't
5390 quite go far enough to discover this. */
5391 newFileName[MAX_FILENAME_LENGTH] = 0;
5392 }
5393 else
5394 {
5395 newFileName = (char *) xmalloc (fileNameLength + 1);
5396 strncpy (newFileName, fileName, fileNameLength + 1);
5397 }
5398
5399 /* A row with end_seq set to true has a meaningful address, but
5400 the other information in the same row is not significant.
5401 In such a row, print line as "-", and don't print
5402 view/is_stmt. */
5403 if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
5404 {
5405 if (linfo.li_max_ops_per_insn == 1)
5406 {
5407 if (xop == -DW_LNE_end_sequence)
5408 printf ("%-35s %11s %#18" DWARF_VMA_FMT "x",
5409 newFileName, "-",
5410 state_machine_regs.address);
5411 else
5412 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x",
5413 newFileName, state_machine_regs.line,
5414 state_machine_regs.address);
5415 }
5416 else
5417 {
5418 if (xop == -DW_LNE_end_sequence)
5419 printf ("%-35s %11s %#18" DWARF_VMA_FMT "x[%d]",
5420 newFileName, "-",
5421 state_machine_regs.address,
5422 state_machine_regs.op_index);
5423 else
5424 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x[%d]",
5425 newFileName, state_machine_regs.line,
5426 state_machine_regs.address,
5427 state_machine_regs.op_index);
5428 }
5429 }
5430 else
5431 {
5432 if (linfo.li_max_ops_per_insn == 1)
5433 {
5434 if (xop == -DW_LNE_end_sequence)
5435 printf ("%s %11s %#18" DWARF_VMA_FMT "x",
5436 newFileName, "-",
5437 state_machine_regs.address);
5438 else
5439 printf ("%s %11d %#18" DWARF_VMA_FMT "x",
5440 newFileName, state_machine_regs.line,
5441 state_machine_regs.address);
5442 }
5443 else
5444 {
5445 if (xop == -DW_LNE_end_sequence)
5446 printf ("%s %11s %#18" DWARF_VMA_FMT "x[%d]",
5447 newFileName, "-",
5448 state_machine_regs.address,
5449 state_machine_regs.op_index);
5450 else
5451 printf ("%s %11d %#18" DWARF_VMA_FMT "x[%d]",
5452 newFileName, state_machine_regs.line,
5453 state_machine_regs.address,
5454 state_machine_regs.op_index);
5455 }
5456 }
5457
5458 if (xop != -DW_LNE_end_sequence)
5459 {
5460 if (state_machine_regs.view)
5461 printf (" %6u", state_machine_regs.view);
5462 else
5463 printf (" ");
5464
5465 if (state_machine_regs.is_stmt)
5466 printf (" x");
5467 }
5468
5469 putchar ('\n');
5470 state_machine_regs.view++;
5471
5472 if (xop == -DW_LNE_end_sequence)
5473 {
5474 reset_state_machine (linfo.li_default_is_stmt);
5475 putchar ('\n');
5476 }
5477
5478 free (newFileName);
5479 }
5480 }
5481
5482 if (file_table)
5483 {
5484 free (file_table);
5485 file_table = NULL;
5486 n_files = 0;
5487 }
5488
5489 if (directory_table)
5490 {
5491 free (directory_table);
5492 directory_table = NULL;
5493 n_directories = 0;
5494 }
5495
5496 putchar ('\n');
5497 }
5498
5499 return 1;
5500 }
5501
5502 static int
5503 display_debug_lines (struct dwarf_section *section, void *file)
5504 {
5505 unsigned char *data = section->start;
5506 unsigned char *end = data + section->size;
5507 int retValRaw = 1;
5508 int retValDecoded = 1;
5509
5510 if (do_debug_lines == 0)
5511 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
5512
5513 if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
5514 retValRaw = display_debug_lines_raw (section, data, end, file);
5515
5516 if (do_debug_lines & FLAG_DEBUG_LINES_DECODED)
5517 retValDecoded = display_debug_lines_decoded (section, data, data, end, file);
5518
5519 if (!retValRaw || !retValDecoded)
5520 return 0;
5521
5522 return 1;
5523 }
5524
5525 static debug_info *
5526 find_debug_info_for_offset (unsigned long offset)
5527 {
5528 unsigned int i;
5529
5530 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
5531 return NULL;
5532
5533 for (i = 0; i < num_debug_info_entries; i++)
5534 if (debug_information[i].cu_offset == offset)
5535 return debug_information + i;
5536
5537 return NULL;
5538 }
5539
5540 static const char *
5541 get_gdb_index_symbol_kind_name (gdb_index_symbol_kind kind)
5542 {
5543 /* See gdb/gdb-index.h. */
5544 static const char * const kinds[] =
5545 {
5546 N_ ("no info"),
5547 N_ ("type"),
5548 N_ ("variable"),
5549 N_ ("function"),
5550 N_ ("other"),
5551 N_ ("unused5"),
5552 N_ ("unused6"),
5553 N_ ("unused7")
5554 };
5555
5556 return _ (kinds[kind]);
5557 }
5558
5559 static int
5560 display_debug_pubnames_worker (struct dwarf_section *section,
5561 void *file ATTRIBUTE_UNUSED,
5562 int is_gnu)
5563 {
5564 DWARF2_Internal_PubNames names;
5565 unsigned char *start = section->start;
5566 unsigned char *end = start + section->size;
5567
5568 /* It does not matter if this load fails,
5569 we test for that later on. */
5570 load_debug_info (file);
5571
5572 introduce (section, FALSE);
5573
5574 while (start < end)
5575 {
5576 unsigned char *data;
5577 unsigned long sec_off;
5578 unsigned int offset_size, initial_length_size;
5579
5580 SAFE_BYTE_GET_AND_INC (names.pn_length, start, 4, end);
5581 if (names.pn_length == 0xffffffff)
5582 {
5583 SAFE_BYTE_GET_AND_INC (names.pn_length, start, 8, end);
5584 offset_size = 8;
5585 initial_length_size = 12;
5586 }
5587 else
5588 {
5589 offset_size = 4;
5590 initial_length_size = 4;
5591 }
5592
5593 sec_off = start - section->start;
5594 if (sec_off + names.pn_length < sec_off
5595 || sec_off + names.pn_length > section->size)
5596 {
5597 warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
5598 section->name,
5599 sec_off - initial_length_size,
5600 dwarf_vmatoa ("x", names.pn_length));
5601 break;
5602 }
5603
5604 data = start;
5605 start += names.pn_length;
5606
5607 SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end);
5608 SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end);
5609
5610 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
5611 && num_debug_info_entries > 0
5612 && find_debug_info_for_offset (names.pn_offset) == NULL)
5613 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
5614 (unsigned long) names.pn_offset, section->name);
5615
5616 SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, end);
5617
5618 printf (_(" Length: %ld\n"),
5619 (long) names.pn_length);
5620 printf (_(" Version: %d\n"),
5621 names.pn_version);
5622 printf (_(" Offset into .debug_info section: 0x%lx\n"),
5623 (unsigned long) names.pn_offset);
5624 printf (_(" Size of area in .debug_info section: %ld\n"),
5625 (long) names.pn_size);
5626
5627 if (names.pn_version != 2 && names.pn_version != 3)
5628 {
5629 static int warned = 0;
5630
5631 if (! warned)
5632 {
5633 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
5634 warned = 1;
5635 }
5636
5637 continue;
5638 }
5639
5640 if (is_gnu)
5641 printf (_("\n Offset Kind Name\n"));
5642 else
5643 printf (_("\n Offset\tName\n"));
5644
5645 while (1)
5646 {
5647 bfd_size_type maxprint;
5648 dwarf_vma offset;
5649
5650 SAFE_BYTE_GET (offset, data, offset_size, end);
5651
5652 if (offset == 0)
5653 break;
5654
5655 data += offset_size;
5656 if (data >= end)
5657 break;
5658 maxprint = (end - data) - 1;
5659
5660 if (is_gnu)
5661 {
5662 unsigned int kind_data;
5663 gdb_index_symbol_kind kind;
5664 const char *kind_name;
5665 int is_static;
5666
5667 SAFE_BYTE_GET (kind_data, data, 1, end);
5668 data++;
5669 maxprint --;
5670 /* GCC computes the kind as the upper byte in the CU index
5671 word, and then right shifts it by the CU index size.
5672 Left shift KIND to where the gdb-index.h accessor macros
5673 can use it. */
5674 kind_data <<= GDB_INDEX_CU_BITSIZE;
5675 kind = GDB_INDEX_SYMBOL_KIND_VALUE (kind_data);
5676 kind_name = get_gdb_index_symbol_kind_name (kind);
5677 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (kind_data);
5678 printf (" %-6lx %s,%-10s %.*s\n",
5679 (unsigned long) offset, is_static ? _("s") : _("g"),
5680 kind_name, (int) maxprint, data);
5681 }
5682 else
5683 printf (" %-6lx\t%.*s\n",
5684 (unsigned long) offset, (int) maxprint, data);
5685
5686 data += strnlen ((char *) data, maxprint) + 1;
5687 if (data >= end)
5688 break;
5689 }
5690 }
5691
5692 printf ("\n");
5693 return 1;
5694 }
5695
5696 static int
5697 display_debug_pubnames (struct dwarf_section *section, void *file)
5698 {
5699 return display_debug_pubnames_worker (section, file, 0);
5700 }
5701
5702 static int
5703 display_debug_gnu_pubnames (struct dwarf_section *section, void *file)
5704 {
5705 return display_debug_pubnames_worker (section, file, 1);
5706 }
5707
5708 static int
5709 display_debug_macinfo (struct dwarf_section *section,
5710 void *file ATTRIBUTE_UNUSED)
5711 {
5712 unsigned char *start = section->start;
5713 unsigned char *end = start + section->size;
5714 unsigned char *curr = start;
5715 enum dwarf_macinfo_record_type op;
5716
5717 introduce (section, FALSE);
5718
5719 while (curr < end)
5720 {
5721 unsigned int lineno;
5722 const unsigned char *string;
5723
5724 op = (enum dwarf_macinfo_record_type) *curr;
5725 curr++;
5726
5727 switch (op)
5728 {
5729 case DW_MACINFO_start_file:
5730 {
5731 unsigned int filenum;
5732
5733 READ_ULEB (lineno, curr, end);
5734 READ_ULEB (filenum, curr, end);
5735 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
5736 lineno, filenum);
5737 }
5738 break;
5739
5740 case DW_MACINFO_end_file:
5741 printf (_(" DW_MACINFO_end_file\n"));
5742 break;
5743
5744 case DW_MACINFO_define:
5745 READ_ULEB (lineno, curr, end);
5746 string = curr;
5747 curr += strnlen ((char *) string, end - string) + 1;
5748 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
5749 lineno, string);
5750 break;
5751
5752 case DW_MACINFO_undef:
5753 READ_ULEB (lineno, curr, end);
5754 string = curr;
5755 curr += strnlen ((char *) string, end - string) + 1;
5756 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
5757 lineno, string);
5758 break;
5759
5760 case DW_MACINFO_vendor_ext:
5761 {
5762 unsigned int constant;
5763
5764 READ_ULEB (constant, curr, end);
5765 string = curr;
5766 curr += strnlen ((char *) string, end - string) + 1;
5767 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
5768 constant, string);
5769 }
5770 break;
5771 }
5772 }
5773
5774 return 1;
5775 }
5776
5777 /* Given LINE_OFFSET into the .debug_line section, attempt to return
5778 filename and dirname corresponding to file name table entry with index
5779 FILEIDX. Return NULL on failure. */
5780
5781 static unsigned char *
5782 get_line_filename_and_dirname (dwarf_vma line_offset,
5783 dwarf_vma fileidx,
5784 unsigned char **dir_name)
5785 {
5786 struct dwarf_section *section = &debug_displays [line].section;
5787 unsigned char *hdrptr, *dirtable, *file_name;
5788 unsigned int offset_size, initial_length_size;
5789 unsigned int version, opcode_base;
5790 dwarf_vma length, diridx;
5791 const unsigned char * end;
5792
5793 *dir_name = NULL;
5794 if (section->start == NULL
5795 || line_offset >= section->size
5796 || fileidx == 0)
5797 return NULL;
5798
5799 hdrptr = section->start + line_offset;
5800 end = section->start + section->size;
5801
5802 SAFE_BYTE_GET_AND_INC (length, hdrptr, 4, end);
5803 if (length == 0xffffffff)
5804 {
5805 /* This section is 64-bit DWARF 3. */
5806 SAFE_BYTE_GET_AND_INC (length, hdrptr, 8, end);
5807 offset_size = 8;
5808 initial_length_size = 12;
5809 }
5810 else
5811 {
5812 offset_size = 4;
5813 initial_length_size = 4;
5814 }
5815 if (length + initial_length_size < length
5816 || length + initial_length_size > section->size)
5817 return NULL;
5818
5819 SAFE_BYTE_GET_AND_INC (version, hdrptr, 2, end);
5820 if (version != 2 && version != 3 && version != 4)
5821 return NULL;
5822 hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length. */
5823 if (version >= 4)
5824 hdrptr++; /* Skip max_ops_per_insn. */
5825 hdrptr += 3; /* Skip default_is_stmt, line_base, line_range. */
5826
5827 SAFE_BYTE_GET_AND_INC (opcode_base, hdrptr, 1, end);
5828 if (opcode_base == 0)
5829 return NULL;
5830
5831 hdrptr += opcode_base - 1;
5832 if (hdrptr >= end)
5833 return NULL;
5834
5835 dirtable = hdrptr;
5836 /* Skip over dirname table. */
5837 while (*hdrptr != '\0')
5838 {
5839 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
5840 if (hdrptr >= end)
5841 return NULL;
5842 }
5843 hdrptr++; /* Skip the NUL at the end of the table. */
5844
5845 /* Now skip over preceding filename table entries. */
5846 for (; hdrptr < end && *hdrptr != '\0' && fileidx > 1; fileidx--)
5847 {
5848 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
5849 SKIP_ULEB (hdrptr, end);
5850 SKIP_ULEB (hdrptr, end);
5851 SKIP_ULEB (hdrptr, end);
5852 }
5853 if (hdrptr >= end || *hdrptr == '\0')
5854 return NULL;
5855
5856 file_name = hdrptr;
5857 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
5858 if (hdrptr >= end)
5859 return NULL;
5860 READ_ULEB (diridx, hdrptr, end);
5861 if (diridx == 0)
5862 return file_name;
5863 for (; dirtable < end && *dirtable != '\0' && diridx > 1; diridx--)
5864 dirtable += strnlen ((char *) dirtable, end - dirtable) + 1;
5865 if (dirtable >= end || *dirtable == '\0')
5866 return NULL;
5867 *dir_name = dirtable;
5868 return file_name;
5869 }
5870
5871 static int
5872 display_debug_macro (struct dwarf_section *section,
5873 void *file)
5874 {
5875 unsigned char *start = section->start;
5876 unsigned char *end = start + section->size;
5877 unsigned char *curr = start;
5878 unsigned char *extended_op_buf[256];
5879
5880 load_debug_section_with_follow (str, file);
5881 load_debug_section_with_follow (line, file);
5882 load_debug_section_with_follow (str_index, file);
5883
5884 introduce (section, FALSE);
5885
5886 while (curr < end)
5887 {
5888 unsigned int lineno, version, flags;
5889 unsigned int offset_size = 4;
5890 const unsigned char *string;
5891 dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
5892 unsigned char **extended_ops = NULL;
5893
5894 SAFE_BYTE_GET_AND_INC (version, curr, 2, end);
5895 if (version != 4 && version != 5)
5896 {
5897 error (_("Only GNU extension to DWARF 4 or 5 of %s is currently supported.\n"),
5898 section->name);
5899 return 0;
5900 }
5901
5902 SAFE_BYTE_GET_AND_INC (flags, curr, 1, end);
5903 if (flags & 1)
5904 offset_size = 8;
5905 printf (_(" Offset: 0x%lx\n"),
5906 (unsigned long) sec_offset);
5907 printf (_(" Version: %d\n"), version);
5908 printf (_(" Offset size: %d\n"), offset_size);
5909 if (flags & 2)
5910 {
5911 SAFE_BYTE_GET_AND_INC (line_offset, curr, offset_size, end);
5912 printf (_(" Offset into .debug_line: 0x%lx\n"),
5913 (unsigned long) line_offset);
5914 }
5915 if (flags & 4)
5916 {
5917 unsigned int i, count, op;
5918 dwarf_vma nargs, n;
5919
5920 SAFE_BYTE_GET_AND_INC (count, curr, 1, end);
5921
5922 memset (extended_op_buf, 0, sizeof (extended_op_buf));
5923 extended_ops = extended_op_buf;
5924 if (count)
5925 {
5926 printf (_(" Extension opcode arguments:\n"));
5927 for (i = 0; i < count; i++)
5928 {
5929 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
5930 extended_ops[op] = curr;
5931 READ_ULEB (nargs, curr, end);
5932 if (nargs == 0)
5933 printf (_(" DW_MACRO_%02x has no arguments\n"), op);
5934 else
5935 {
5936 printf (_(" DW_MACRO_%02x arguments: "), op);
5937 for (n = 0; n < nargs; n++)
5938 {
5939 unsigned int form;
5940
5941 SAFE_BYTE_GET_AND_INC (form, curr, 1, end);
5942 printf ("%s%s", get_FORM_name (form),
5943 n == nargs - 1 ? "\n" : ", ");
5944 switch (form)
5945 {
5946 case DW_FORM_data1:
5947 case DW_FORM_data2:
5948 case DW_FORM_data4:
5949 case DW_FORM_data8:
5950 case DW_FORM_sdata:
5951 case DW_FORM_udata:
5952 case DW_FORM_block:
5953 case DW_FORM_block1:
5954 case DW_FORM_block2:
5955 case DW_FORM_block4:
5956 case DW_FORM_flag:
5957 case DW_FORM_string:
5958 case DW_FORM_strp:
5959 case DW_FORM_sec_offset:
5960 break;
5961 default:
5962 error (_("Invalid extension opcode form %s\n"),
5963 get_FORM_name (form));
5964 return 0;
5965 }
5966 }
5967 }
5968 }
5969 }
5970 }
5971 printf ("\n");
5972
5973 while (1)
5974 {
5975 unsigned int op;
5976
5977 if (curr >= end)
5978 {
5979 error (_(".debug_macro section not zero terminated\n"));
5980 return 0;
5981 }
5982
5983 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
5984 if (op == 0)
5985 break;
5986
5987 switch (op)
5988 {
5989 case DW_MACRO_define:
5990 READ_ULEB (lineno, curr, end);
5991 string = curr;
5992 curr += strnlen ((char *) string, end - string) + 1;
5993 printf (_(" DW_MACRO_define - lineno : %d macro : %s\n"),
5994 lineno, string);
5995 break;
5996
5997 case DW_MACRO_undef:
5998 READ_ULEB (lineno, curr, end);
5999 string = curr;
6000 curr += strnlen ((char *) string, end - string) + 1;
6001 printf (_(" DW_MACRO_undef - lineno : %d macro : %s\n"),
6002 lineno, string);
6003 break;
6004
6005 case DW_MACRO_start_file:
6006 {
6007 unsigned int filenum;
6008 unsigned char *file_name = NULL, *dir_name = NULL;
6009
6010 READ_ULEB (lineno, curr, end);
6011 READ_ULEB (filenum, curr, end);
6012
6013 if ((flags & 2) == 0)
6014 error (_("DW_MACRO_start_file used, but no .debug_line offset provided.\n"));
6015 else
6016 file_name
6017 = get_line_filename_and_dirname (line_offset, filenum,
6018 &dir_name);
6019 if (file_name == NULL)
6020 printf (_(" DW_MACRO_start_file - lineno: %d filenum: %d\n"),
6021 lineno, filenum);
6022 else
6023 printf (_(" DW_MACRO_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
6024 lineno, filenum,
6025 dir_name != NULL ? (const char *) dir_name : "",
6026 dir_name != NULL ? "/" : "", file_name);
6027 }
6028 break;
6029
6030 case DW_MACRO_end_file:
6031 printf (_(" DW_MACRO_end_file\n"));
6032 break;
6033
6034 case DW_MACRO_define_strp:
6035 READ_ULEB (lineno, curr, end);
6036 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
6037 string = fetch_indirect_string (offset);
6038 printf (_(" DW_MACRO_define_strp - lineno : %d macro : %s\n"),
6039 lineno, string);
6040 break;
6041
6042 case DW_MACRO_undef_strp:
6043 READ_ULEB (lineno, curr, end);
6044 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
6045 string = fetch_indirect_string (offset);
6046 printf (_(" DW_MACRO_undef_strp - lineno : %d macro : %s\n"),
6047 lineno, string);
6048 break;
6049
6050 case DW_MACRO_import:
6051 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
6052 printf (_(" DW_MACRO_import - offset : 0x%lx\n"),
6053 (unsigned long) offset);
6054 break;
6055
6056 case DW_MACRO_define_sup:
6057 READ_ULEB (lineno, curr, end);
6058 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
6059 printf (_(" DW_MACRO_define_sup - lineno : %d macro offset : 0x%lx\n"),
6060 lineno, (unsigned long) offset);
6061 break;
6062
6063 case DW_MACRO_undef_sup:
6064 READ_ULEB (lineno, curr, end);
6065 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
6066 printf (_(" DW_MACRO_undef_sup - lineno : %d macro offset : 0x%lx\n"),
6067 lineno, (unsigned long) offset);
6068 break;
6069
6070 case DW_MACRO_import_sup:
6071 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
6072 printf (_(" DW_MACRO_import_sup - offset : 0x%lx\n"),
6073 (unsigned long) offset);
6074 break;
6075
6076 case DW_MACRO_define_strx:
6077 case DW_MACRO_undef_strx:
6078 READ_ULEB (lineno, curr, end);
6079 READ_ULEB (offset, curr, end);
6080 string = (const unsigned char *)
6081 fetch_indexed_string (offset, NULL, offset_size, FALSE);
6082 if (op == DW_MACRO_define_strx)
6083 printf (" DW_MACRO_define_strx ");
6084 else
6085 printf (" DW_MACRO_undef_strx ");
6086 if (do_wide)
6087 printf (_("(with offset %s) "), dwarf_vmatoa ("x", offset));
6088 printf (_("lineno : %d macro : %s\n"),
6089 lineno, string);
6090 break;
6091
6092 default:
6093 if (op >= DW_MACRO_lo_user && op <= DW_MACRO_hi_user)
6094 {
6095 printf (_(" <Target Specific macro op: %#x - UNHANDLED"), op);
6096 break;
6097 }
6098
6099 if (extended_ops == NULL || extended_ops[op] == NULL)
6100 {
6101 error (_(" Unknown macro opcode %02x seen\n"), op);
6102 return 0;
6103 }
6104 else
6105 {
6106 /* Skip over unhandled opcodes. */
6107 dwarf_vma nargs, n;
6108 unsigned char *desc = extended_ops[op];
6109 READ_ULEB (nargs, desc, end);
6110 if (nargs == 0)
6111 {
6112 printf (_(" DW_MACRO_%02x\n"), op);
6113 break;
6114 }
6115 printf (_(" DW_MACRO_%02x -"), op);
6116 for (n = 0; n < nargs; n++)
6117 {
6118 int val;
6119
6120 /* DW_FORM_implicit_const is not expected here. */
6121 SAFE_BYTE_GET_AND_INC (val, desc, 1, end);
6122 curr
6123 = read_and_display_attr_value (0, val, 0,
6124 start, curr, end, 0, 0, offset_size,
6125 version, NULL, 0, NULL,
6126 NULL, ' ', -1);
6127 if (n != nargs - 1)
6128 printf (",");
6129 }
6130 printf ("\n");
6131 }
6132 break;
6133 }
6134 }
6135
6136 printf ("\n");
6137 }
6138
6139 return 1;
6140 }
6141
6142 static int
6143 display_debug_abbrev (struct dwarf_section *section,
6144 void *file ATTRIBUTE_UNUSED)
6145 {
6146 abbrev_entry *entry;
6147 unsigned char *start = section->start;
6148 const unsigned char *end = start + section->size;
6149
6150 introduce (section, FALSE);
6151
6152 do
6153 {
6154 abbrev_list * list;
6155 dwarf_vma offset;
6156
6157 offset = start - section->start;
6158 list = find_abbrev_list_by_abbrev_offset (0, offset);
6159 if (list == NULL)
6160 {
6161 list = new_abbrev_list (0, offset);
6162 start = process_abbrev_set (start, end, list);
6163 list->start_of_next_abbrevs = start;
6164 }
6165 else
6166 start = list->start_of_next_abbrevs;
6167
6168 if (list->first_abbrev == NULL)
6169 continue;
6170
6171 printf (_(" Number TAG (0x%lx)\n"), (long) offset);
6172
6173 for (entry = list->first_abbrev; entry; entry = entry->next)
6174 {
6175 abbrev_attr *attr;
6176
6177 printf (" %ld %s [%s]\n",
6178 entry->number,
6179 get_TAG_name (entry->tag),
6180 entry->children ? _("has children") : _("no children"));
6181
6182 for (attr = entry->first_attr; attr; attr = attr->next)
6183 {
6184 printf (" %-18s %s",
6185 get_AT_name (attr->attribute),
6186 get_FORM_name (attr->form));
6187 if (attr->form == DW_FORM_implicit_const)
6188 printf (": %" BFD_VMA_FMT "d", attr->implicit_const);
6189 putchar ('\n');
6190 }
6191 }
6192 }
6193 while (start);
6194
6195 printf ("\n");
6196
6197 return 1;
6198 }
6199
6200 /* Return true when ADDR is the maximum address, when addresses are
6201 POINTER_SIZE bytes long. */
6202
6203 static bfd_boolean
6204 is_max_address (dwarf_vma addr, unsigned int pointer_size)
6205 {
6206 dwarf_vma mask = ~(~(dwarf_vma) 1 << (pointer_size * 8 - 1));
6207 return ((addr & mask) == mask);
6208 }
6209
6210 /* Display a view pair list starting at *VSTART_PTR and ending at
6211 VLISTEND within SECTION. */
6212
6213 static void
6214 display_view_pair_list (struct dwarf_section *section,
6215 unsigned char **vstart_ptr,
6216 unsigned int debug_info_entry,
6217 unsigned char *vlistend)
6218 {
6219 unsigned char *vstart = *vstart_ptr;
6220 unsigned char *section_end = section->start + section->size;
6221 unsigned int pointer_size = debug_information [debug_info_entry].pointer_size;
6222
6223 if (vlistend < section_end)
6224 section_end = vlistend;
6225
6226 putchar ('\n');
6227
6228 while (vstart < section_end)
6229 {
6230 dwarf_vma off = vstart - section->start;
6231 dwarf_vma vbegin, vend;
6232
6233 READ_ULEB (vbegin, vstart, section_end);
6234 if (vstart == section_end)
6235 break;
6236
6237 READ_ULEB (vend, vstart, section_end);
6238 printf (" %8.8lx ", (unsigned long) off);
6239
6240 print_dwarf_view (vbegin, pointer_size, 1);
6241 print_dwarf_view (vend, pointer_size, 1);
6242 printf (_("location view pair\n"));
6243 }
6244
6245 putchar ('\n');
6246 *vstart_ptr = vstart;
6247 }
6248
6249 /* Display a location list from a normal (ie, non-dwo) .debug_loc section. */
6250
6251 static void
6252 display_loc_list (struct dwarf_section *section,
6253 unsigned char **start_ptr,
6254 unsigned int debug_info_entry,
6255 dwarf_vma offset,
6256 dwarf_vma base_address,
6257 unsigned char **vstart_ptr,
6258 int has_frame_base)
6259 {
6260 unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
6261 unsigned char *section_end = section->start + section->size;
6262 unsigned long cu_offset;
6263 unsigned int pointer_size;
6264 unsigned int offset_size;
6265 int dwarf_version;
6266
6267 dwarf_vma begin;
6268 dwarf_vma end;
6269 unsigned short length;
6270 int need_frame_base;
6271
6272 if (debug_info_entry >= num_debug_info_entries)
6273 {
6274 warn (_("No debug information available for loc lists of entry: %u\n"),
6275 debug_info_entry);
6276 return;
6277 }
6278
6279 cu_offset = debug_information [debug_info_entry].cu_offset;
6280 pointer_size = debug_information [debug_info_entry].pointer_size;
6281 offset_size = debug_information [debug_info_entry].offset_size;
6282 dwarf_version = debug_information [debug_info_entry].dwarf_version;
6283
6284 if (pointer_size < 2 || pointer_size > 8)
6285 {
6286 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
6287 pointer_size, debug_info_entry);
6288 return;
6289 }
6290
6291 while (1)
6292 {
6293 dwarf_vma off = offset + (start - *start_ptr);
6294 dwarf_vma vbegin = vm1, vend = vm1;
6295
6296 if (start + 2 * pointer_size > section_end)
6297 {
6298 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6299 (unsigned long) offset);
6300 break;
6301 }
6302
6303 printf (" %8.8lx ", (unsigned long) off);
6304
6305 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
6306 SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
6307
6308 if (begin == 0 && end == 0)
6309 {
6310 /* PR 18374: In a object file we can have a location list that
6311 starts with a begin and end of 0 because there are relocations
6312 that need to be applied to the addresses. Actually applying
6313 the relocations now does not help as they will probably resolve
6314 to 0, since the object file has not been fully linked. Real
6315 end of list markers will not have any relocations against them. */
6316 if (! reloc_at (section, off)
6317 && ! reloc_at (section, off + pointer_size))
6318 {
6319 printf (_("<End of list>\n"));
6320 break;
6321 }
6322 }
6323
6324 /* Check base address specifiers. */
6325 if (is_max_address (begin, pointer_size)
6326 && !is_max_address (end, pointer_size))
6327 {
6328 base_address = end;
6329 print_dwarf_vma (begin, pointer_size);
6330 print_dwarf_vma (end, pointer_size);
6331 printf (_("(base address)\n"));
6332 continue;
6333 }
6334
6335 if (vstart)
6336 {
6337 off = offset + (vstart - *start_ptr);
6338
6339 READ_ULEB (vbegin, vstart, section_end);
6340 print_dwarf_view (vbegin, pointer_size, 1);
6341
6342 READ_ULEB (vend, vstart, section_end);
6343 print_dwarf_view (vend, pointer_size, 1);
6344
6345 printf (_("views at %8.8lx for:\n %*s "),
6346 (unsigned long) off, 8, "");
6347 }
6348
6349 if (start + 2 > section_end)
6350 {
6351 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6352 (unsigned long) offset);
6353 break;
6354 }
6355
6356 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
6357
6358 if (start + length > section_end)
6359 {
6360 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6361 (unsigned long) offset);
6362 break;
6363 }
6364
6365 print_dwarf_vma (begin + base_address, pointer_size);
6366 print_dwarf_vma (end + base_address, pointer_size);
6367
6368 putchar ('(');
6369 need_frame_base = decode_location_expression (start,
6370 pointer_size,
6371 offset_size,
6372 dwarf_version,
6373 length,
6374 cu_offset, section);
6375 putchar (')');
6376
6377 if (need_frame_base && !has_frame_base)
6378 printf (_(" [without DW_AT_frame_base]"));
6379
6380 if (begin == end && vbegin == vend)
6381 fputs (_(" (start == end)"), stdout);
6382 else if (begin > end || (begin == end && vbegin > vend))
6383 fputs (_(" (start > end)"), stdout);
6384
6385 putchar ('\n');
6386
6387 start += length;
6388 }
6389
6390 *start_ptr = start;
6391 *vstart_ptr = vstart;
6392 }
6393
6394 /* Display a location list from a normal (ie, non-dwo) .debug_loclists section. */
6395
6396 static void
6397 display_loclists_list (struct dwarf_section *section,
6398 unsigned char **start_ptr,
6399 unsigned int debug_info_entry,
6400 dwarf_vma offset,
6401 dwarf_vma base_address,
6402 unsigned char **vstart_ptr,
6403 int has_frame_base)
6404 {
6405 unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
6406 unsigned char *section_end = section->start + section->size;
6407 unsigned long cu_offset;
6408 unsigned int pointer_size;
6409 unsigned int offset_size;
6410 int dwarf_version;
6411
6412 /* Initialize it due to a false compiler warning. */
6413 dwarf_vma begin = -1, vbegin = -1;
6414 dwarf_vma end = -1, vend = -1;
6415 dwarf_vma length;
6416 int need_frame_base;
6417
6418 if (debug_info_entry >= num_debug_info_entries)
6419 {
6420 warn (_("No debug information available for "
6421 "loclists lists of entry: %u\n"),
6422 debug_info_entry);
6423 return;
6424 }
6425
6426 cu_offset = debug_information [debug_info_entry].cu_offset;
6427 pointer_size = debug_information [debug_info_entry].pointer_size;
6428 offset_size = debug_information [debug_info_entry].offset_size;
6429 dwarf_version = debug_information [debug_info_entry].dwarf_version;
6430
6431 if (pointer_size < 2 || pointer_size > 8)
6432 {
6433 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
6434 pointer_size, debug_info_entry);
6435 return;
6436 }
6437
6438 while (1)
6439 {
6440 dwarf_vma off = offset + (start - *start_ptr);
6441 enum dwarf_location_list_entry_type llet;
6442
6443 if (start + 1 > section_end)
6444 {
6445 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6446 (unsigned long) offset);
6447 break;
6448 }
6449
6450 printf (" %8.8lx ", (unsigned long) off);
6451
6452 SAFE_BYTE_GET_AND_INC (llet, start, 1, section_end);
6453
6454 if (vstart && (llet == DW_LLE_offset_pair
6455 || llet == DW_LLE_start_end
6456 || llet == DW_LLE_start_length))
6457 {
6458 off = offset + (vstart - *start_ptr);
6459
6460 READ_ULEB (vbegin, vstart, section_end);
6461 print_dwarf_view (vbegin, pointer_size, 1);
6462
6463 READ_ULEB (vend, vstart, section_end);
6464 print_dwarf_view (vend, pointer_size, 1);
6465
6466 printf (_("views at %8.8lx for:\n %*s "),
6467 (unsigned long) off, 8, "");
6468 }
6469
6470 switch (llet)
6471 {
6472 case DW_LLE_end_of_list:
6473 printf (_("<End of list>\n"));
6474 break;
6475 case DW_LLE_offset_pair:
6476 READ_ULEB (begin, start, section_end);
6477 begin += base_address;
6478 READ_ULEB (end, start, section_end);
6479 end += base_address;
6480 break;
6481 case DW_LLE_start_end:
6482 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
6483 SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
6484 break;
6485 case DW_LLE_start_length:
6486 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
6487 READ_ULEB (end, start, section_end);
6488 end += begin;
6489 break;
6490 case DW_LLE_base_address:
6491 SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size,
6492 section_end);
6493 print_dwarf_vma (base_address, pointer_size);
6494 printf (_("(base address)\n"));
6495 break;
6496 #ifdef DW_LLE_view_pair
6497 case DW_LLE_view_pair:
6498 if (vstart)
6499 printf (_("View pair entry in loclist with locviews attribute\n"));
6500 READ_ULEB (vbegin, start, section_end);
6501 print_dwarf_view (vbegin, pointer_size, 1);
6502
6503 READ_ULEB (vend, start, section_end);
6504 print_dwarf_view (vend, pointer_size, 1);
6505
6506 printf (_("views for:\n"));
6507 continue;
6508 #endif
6509 default:
6510 error (_("Invalid location list entry type %d\n"), llet);
6511 return;
6512 }
6513 if (llet == DW_LLE_end_of_list)
6514 break;
6515 if (llet != DW_LLE_offset_pair
6516 && llet != DW_LLE_start_end
6517 && llet != DW_LLE_start_length)
6518 continue;
6519
6520 if (start + 2 > section_end)
6521 {
6522 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6523 (unsigned long) offset);
6524 break;
6525 }
6526
6527 READ_ULEB (length, start, section_end);
6528
6529 print_dwarf_vma (begin, pointer_size);
6530 print_dwarf_vma (end, pointer_size);
6531
6532 putchar ('(');
6533 need_frame_base = decode_location_expression (start,
6534 pointer_size,
6535 offset_size,
6536 dwarf_version,
6537 length,
6538 cu_offset, section);
6539 putchar (')');
6540
6541 if (need_frame_base && !has_frame_base)
6542 printf (_(" [without DW_AT_frame_base]"));
6543
6544 if (begin == end && vbegin == vend)
6545 fputs (_(" (start == end)"), stdout);
6546 else if (begin > end || (begin == end && vbegin > vend))
6547 fputs (_(" (start > end)"), stdout);
6548
6549 putchar ('\n');
6550
6551 start += length;
6552 vbegin = vend = -1;
6553 }
6554
6555 if (vbegin != vm1 || vend != vm1)
6556 printf (_("Trailing view pair not used in a range"));
6557
6558 *start_ptr = start;
6559 *vstart_ptr = vstart;
6560 }
6561
6562 /* Print a .debug_addr table index in decimal, surrounded by square brackets,
6563 right-adjusted in a field of length LEN, and followed by a space. */
6564
6565 static void
6566 print_addr_index (unsigned int idx, unsigned int len)
6567 {
6568 static char buf[15];
6569 snprintf (buf, sizeof (buf), "[%d]", idx);
6570 printf ("%*s ", len, buf);
6571 }
6572
6573 /* Display a location list from a .dwo section. It uses address indexes rather
6574 than embedded addresses. This code closely follows display_loc_list, but the
6575 two are sufficiently different that combining things is very ugly. */
6576
6577 static void
6578 display_loc_list_dwo (struct dwarf_section *section,
6579 unsigned char **start_ptr,
6580 unsigned int debug_info_entry,
6581 dwarf_vma offset,
6582 unsigned char **vstart_ptr,
6583 int has_frame_base)
6584 {
6585 unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
6586 unsigned char *section_end = section->start + section->size;
6587 unsigned long cu_offset;
6588 unsigned int pointer_size;
6589 unsigned int offset_size;
6590 int dwarf_version;
6591 int entry_type;
6592 unsigned short length;
6593 int need_frame_base;
6594 unsigned int idx;
6595
6596 if (debug_info_entry >= num_debug_info_entries)
6597 {
6598 warn (_("No debug information for loc lists of entry: %u\n"),
6599 debug_info_entry);
6600 return;
6601 }
6602
6603 cu_offset = debug_information [debug_info_entry].cu_offset;
6604 pointer_size = debug_information [debug_info_entry].pointer_size;
6605 offset_size = debug_information [debug_info_entry].offset_size;
6606 dwarf_version = debug_information [debug_info_entry].dwarf_version;
6607
6608 if (pointer_size < 2 || pointer_size > 8)
6609 {
6610 warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
6611 pointer_size, debug_info_entry);
6612 return;
6613 }
6614
6615 while (1)
6616 {
6617 printf (" %8.8lx ", (unsigned long) (offset + (start - *start_ptr)));
6618
6619 if (start >= section_end)
6620 {
6621 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6622 (unsigned long) offset);
6623 break;
6624 }
6625
6626 SAFE_BYTE_GET_AND_INC (entry_type, start, 1, section_end);
6627
6628 if (vstart)
6629 switch (entry_type)
6630 {
6631 default:
6632 break;
6633
6634 case 2:
6635 case 3:
6636 case 4:
6637 {
6638 dwarf_vma view;
6639 dwarf_vma off = offset + (vstart - *start_ptr);
6640
6641 READ_ULEB (view, vstart, section_end);
6642 print_dwarf_view (view, 8, 1);
6643
6644 READ_ULEB (view, vstart, section_end);
6645 print_dwarf_view (view, 8, 1);
6646
6647 printf (_("views at %8.8lx for:\n %*s "),
6648 (unsigned long) off, 8, "");
6649
6650 }
6651 break;
6652 }
6653
6654 switch (entry_type)
6655 {
6656 case 0: /* A terminating entry. */
6657 *start_ptr = start;
6658 *vstart_ptr = vstart;
6659 printf (_("<End of list>\n"));
6660 return;
6661 case 1: /* A base-address entry. */
6662 READ_ULEB (idx, start, section_end);
6663 print_addr_index (idx, 8);
6664 printf ("%*s", 9 + (vstart ? 2 * 6 : 0), "");
6665 printf (_("(base address selection entry)\n"));
6666 continue;
6667 case 2: /* A start/end entry. */
6668 READ_ULEB (idx, start, section_end);
6669 print_addr_index (idx, 8);
6670 READ_ULEB (idx, start, section_end);
6671 print_addr_index (idx, 8);
6672 break;
6673 case 3: /* A start/length entry. */
6674 READ_ULEB (idx, start, section_end);
6675 print_addr_index (idx, 8);
6676 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
6677 printf ("%08x ", idx);
6678 break;
6679 case 4: /* An offset pair entry. */
6680 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
6681 printf ("%08x ", idx);
6682 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
6683 printf ("%08x ", idx);
6684 break;
6685 default:
6686 warn (_("Unknown location list entry type 0x%x.\n"), entry_type);
6687 *start_ptr = start;
6688 *vstart_ptr = vstart;
6689 return;
6690 }
6691
6692 if (start + 2 > section_end)
6693 {
6694 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6695 (unsigned long) offset);
6696 break;
6697 }
6698
6699 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
6700 if (start + length > section_end)
6701 {
6702 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6703 (unsigned long) offset);
6704 break;
6705 }
6706
6707 putchar ('(');
6708 need_frame_base = decode_location_expression (start,
6709 pointer_size,
6710 offset_size,
6711 dwarf_version,
6712 length,
6713 cu_offset, section);
6714 putchar (')');
6715
6716 if (need_frame_base && !has_frame_base)
6717 printf (_(" [without DW_AT_frame_base]"));
6718
6719 putchar ('\n');
6720
6721 start += length;
6722 }
6723
6724 *start_ptr = start;
6725 *vstart_ptr = vstart;
6726 }
6727
6728 /* Sort array of indexes in ascending order of loc_offsets[idx] and
6729 loc_views. */
6730
6731 static dwarf_vma *loc_offsets, *loc_views;
6732
6733 static int
6734 loc_offsets_compar (const void *ap, const void *bp)
6735 {
6736 dwarf_vma a = loc_offsets[*(const unsigned int *) ap];
6737 dwarf_vma b = loc_offsets[*(const unsigned int *) bp];
6738
6739 int ret = (a > b) - (b > a);
6740 if (ret)
6741 return ret;
6742
6743 a = loc_views[*(const unsigned int *) ap];
6744 b = loc_views[*(const unsigned int *) bp];
6745
6746 ret = (a > b) - (b > a);
6747
6748 return ret;
6749 }
6750
6751 static int
6752 display_debug_loc (struct dwarf_section *section, void *file)
6753 {
6754 unsigned char *start = section->start, *vstart = NULL;
6755 unsigned long bytes;
6756 unsigned char *section_begin = start;
6757 unsigned int num_loc_list = 0;
6758 unsigned long last_offset = 0;
6759 unsigned long last_view = 0;
6760 unsigned int first = 0;
6761 unsigned int i;
6762 unsigned int j;
6763 int seen_first_offset = 0;
6764 int locs_sorted = 1;
6765 unsigned char *next = start, *vnext = vstart;
6766 unsigned int *array = NULL;
6767 const char *suffix = strrchr (section->name, '.');
6768 bfd_boolean is_dwo = FALSE;
6769 int is_loclists = strstr (section->name, "debug_loclists") != NULL;
6770 dwarf_vma expected_start = 0;
6771
6772 if (suffix && strcmp (suffix, ".dwo") == 0)
6773 is_dwo = TRUE;
6774
6775 bytes = section->size;
6776
6777 if (bytes == 0)
6778 {
6779 printf (_("\nThe %s section is empty.\n"), section->name);
6780 return 0;
6781 }
6782
6783 if (is_loclists)
6784 {
6785 unsigned char *hdrptr = section_begin;
6786 dwarf_vma ll_length;
6787 unsigned short ll_version;
6788 unsigned char *end = section_begin + section->size;
6789 unsigned char address_size, segment_selector_size;
6790 uint32_t offset_entry_count;
6791
6792 SAFE_BYTE_GET_AND_INC (ll_length, hdrptr, 4, end);
6793 if (ll_length == 0xffffffff)
6794 SAFE_BYTE_GET_AND_INC (ll_length, hdrptr, 8, end);
6795
6796 SAFE_BYTE_GET_AND_INC (ll_version, hdrptr, 2, end);
6797 if (ll_version != 5)
6798 {
6799 warn (_("The %s section contains corrupt or "
6800 "unsupported version number: %d.\n"),
6801 section->name, ll_version);
6802 return 0;
6803 }
6804
6805 SAFE_BYTE_GET_AND_INC (address_size, hdrptr, 1, end);
6806
6807 SAFE_BYTE_GET_AND_INC (segment_selector_size, hdrptr, 1, end);
6808 if (segment_selector_size != 0)
6809 {
6810 warn (_("The %s section contains "
6811 "unsupported segment selector size: %d.\n"),
6812 section->name, segment_selector_size);
6813 return 0;
6814 }
6815
6816 SAFE_BYTE_GET_AND_INC (offset_entry_count, hdrptr, 4, end);
6817 if (offset_entry_count != 0)
6818 {
6819 warn (_("The %s section contains "
6820 "unsupported offset entry count: %d.\n"),
6821 section->name, offset_entry_count);
6822 return 0;
6823 }
6824
6825 expected_start = hdrptr - section_begin;
6826 }
6827
6828 if (load_debug_info (file) == 0)
6829 {
6830 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
6831 section->name);
6832 return 0;
6833 }
6834
6835 /* Check the order of location list in .debug_info section. If
6836 offsets of location lists are in the ascending order, we can
6837 use `debug_information' directly. */
6838 for (i = 0; i < num_debug_info_entries; i++)
6839 {
6840 unsigned int num;
6841
6842 num = debug_information [i].num_loc_offsets;
6843 if (num > num_loc_list)
6844 num_loc_list = num;
6845
6846 /* Check if we can use `debug_information' directly. */
6847 if (locs_sorted && num != 0)
6848 {
6849 if (!seen_first_offset)
6850 {
6851 /* This is the first location list. */
6852 last_offset = debug_information [i].loc_offsets [0];
6853 last_view = debug_information [i].loc_views [0];
6854 first = i;
6855 seen_first_offset = 1;
6856 j = 1;
6857 }
6858 else
6859 j = 0;
6860
6861 for (; j < num; j++)
6862 {
6863 if (last_offset >
6864 debug_information [i].loc_offsets [j]
6865 || (last_offset == debug_information [i].loc_offsets [j]
6866 && last_view > debug_information [i].loc_views [j]))
6867 {
6868 locs_sorted = 0;
6869 break;
6870 }
6871 last_offset = debug_information [i].loc_offsets [j];
6872 last_view = debug_information [i].loc_views [j];
6873 }
6874 }
6875 }
6876
6877 if (!seen_first_offset)
6878 error (_("No location lists in .debug_info section!\n"));
6879
6880 if (debug_information [first].num_loc_offsets > 0
6881 && debug_information [first].loc_offsets [0] != expected_start
6882 && debug_information [first].loc_views [0] != expected_start)
6883 warn (_("Location lists in %s section start at 0x%s\n"),
6884 section->name,
6885 dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]));
6886
6887 if (!locs_sorted)
6888 array = (unsigned int *) xcmalloc (num_loc_list, sizeof (unsigned int));
6889
6890 introduce (section, FALSE);
6891
6892 if (reloc_at (section, 0))
6893 printf (_(" Warning: This section has relocations - addresses seen here may not be accurate.\n\n"));
6894
6895 printf (_(" Offset Begin End Expression\n"));
6896
6897 seen_first_offset = 0;
6898 for (i = first; i < num_debug_info_entries; i++)
6899 {
6900 dwarf_vma offset, voffset;
6901 dwarf_vma base_address;
6902 unsigned int k;
6903 int has_frame_base;
6904
6905 if (!locs_sorted)
6906 {
6907 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
6908 array[k] = k;
6909 loc_offsets = debug_information [i].loc_offsets;
6910 loc_views = debug_information [i].loc_views;
6911 qsort (array, debug_information [i].num_loc_offsets,
6912 sizeof (*array), loc_offsets_compar);
6913 }
6914
6915 int adjacent_view_loclists = 1;
6916 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
6917 {
6918 j = locs_sorted ? k : array[k];
6919 if (k
6920 && (debug_information [i].loc_offsets [locs_sorted
6921 ? k - 1 : array [k - 1]]
6922 == debug_information [i].loc_offsets [j])
6923 && (debug_information [i].loc_views [locs_sorted
6924 ? k - 1 : array [k - 1]]
6925 == debug_information [i].loc_views [j]))
6926 continue;
6927 has_frame_base = debug_information [i].have_frame_base [j];
6928 offset = debug_information [i].loc_offsets [j];
6929 next = section_begin + offset;
6930 voffset = debug_information [i].loc_views [j];
6931 if (voffset != vm1)
6932 vnext = section_begin + voffset;
6933 else
6934 vnext = NULL;
6935 base_address = debug_information [i].base_address;
6936
6937 if (vnext && vnext < next)
6938 {
6939 vstart = vnext;
6940 display_view_pair_list (section, &vstart, i, next);
6941 if (start == vnext)
6942 start = vstart;
6943 }
6944
6945 if (!seen_first_offset || !adjacent_view_loclists)
6946 seen_first_offset = 1;
6947 else
6948 {
6949 if (start < next)
6950 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
6951 (unsigned long) (start - section_begin),
6952 (unsigned long) offset);
6953 else if (start > next)
6954 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
6955 (unsigned long) (start - section_begin),
6956 (unsigned long) offset);
6957 }
6958 start = next;
6959 vstart = vnext;
6960
6961 if (offset >= bytes)
6962 {
6963 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
6964 (unsigned long) offset);
6965 continue;
6966 }
6967
6968 if (vnext && voffset >= bytes)
6969 {
6970 warn (_("View Offset 0x%lx is bigger than .debug_loc section size.\n"),
6971 (unsigned long) voffset);
6972 continue;
6973 }
6974
6975 if (!is_loclists)
6976 {
6977 if (is_dwo)
6978 display_loc_list_dwo (section, &start, i, offset,
6979 &vstart, has_frame_base);
6980 else
6981 display_loc_list (section, &start, i, offset, base_address,
6982 &vstart, has_frame_base);
6983 }
6984 else
6985 {
6986 if (is_dwo)
6987 warn (_("DWO is not yet supported.\n"));
6988 else
6989 display_loclists_list (section, &start, i, offset, base_address,
6990 &vstart, has_frame_base);
6991 }
6992
6993 /* FIXME: this arrangement is quite simplistic. Nothing
6994 requires locview lists to be adjacent to corresponding
6995 loclists, and a single loclist could be augmented by
6996 different locview lists, and vice-versa, unlikely as it
6997 is that it would make sense to do so. Hopefully we'll
6998 have view pair support built into loclists before we ever
6999 need to address all these possibilities. */
7000 if (adjacent_view_loclists && vnext
7001 && vnext != start && vstart != next)
7002 {
7003 adjacent_view_loclists = 0;
7004 warn (_("Hole and overlap detection requires adjacent view lists and loclists.\n"));
7005 }
7006
7007 if (vnext && vnext == start)
7008 display_view_pair_list (section, &start, i, vstart);
7009 }
7010 }
7011
7012 if (start < section->start + section->size)
7013 warn (ngettext ("There is %ld unused byte at the end of section %s\n",
7014 "There are %ld unused bytes at the end of section %s\n",
7015 (long) (section->start + section->size - start)),
7016 (long) (section->start + section->size - start), section->name);
7017 putchar ('\n');
7018 free (array);
7019 return 1;
7020 }
7021
7022 static int
7023 display_debug_str (struct dwarf_section *section,
7024 void *file ATTRIBUTE_UNUSED)
7025 {
7026 unsigned char *start = section->start;
7027 unsigned long bytes = section->size;
7028 dwarf_vma addr = section->address;
7029
7030 if (bytes == 0)
7031 {
7032 printf (_("\nThe %s section is empty.\n"), section->name);
7033 return 0;
7034 }
7035
7036 introduce (section, FALSE);
7037
7038 while (bytes)
7039 {
7040 int j;
7041 int k;
7042 int lbytes;
7043
7044 lbytes = (bytes > 16 ? 16 : bytes);
7045
7046 printf (" 0x%8.8lx ", (unsigned long) addr);
7047
7048 for (j = 0; j < 16; j++)
7049 {
7050 if (j < lbytes)
7051 printf ("%2.2x", start[j]);
7052 else
7053 printf (" ");
7054
7055 if ((j & 3) == 3)
7056 printf (" ");
7057 }
7058
7059 for (j = 0; j < lbytes; j++)
7060 {
7061 k = start[j];
7062 if (k >= ' ' && k < 0x80)
7063 printf ("%c", k);
7064 else
7065 printf (".");
7066 }
7067
7068 putchar ('\n');
7069
7070 start += lbytes;
7071 addr += lbytes;
7072 bytes -= lbytes;
7073 }
7074
7075 putchar ('\n');
7076
7077 return 1;
7078 }
7079
7080 static int
7081 display_debug_info (struct dwarf_section *section, void *file)
7082 {
7083 return process_debug_info (section, file, section->abbrev_sec, FALSE, FALSE);
7084 }
7085
7086 static int
7087 display_debug_types (struct dwarf_section *section, void *file)
7088 {
7089 return process_debug_info (section, file, section->abbrev_sec, FALSE, TRUE);
7090 }
7091
7092 static int
7093 display_trace_info (struct dwarf_section *section, void *file)
7094 {
7095 return process_debug_info (section, file, section->abbrev_sec, FALSE, TRUE);
7096 }
7097
7098 static int
7099 display_debug_aranges (struct dwarf_section *section,
7100 void *file ATTRIBUTE_UNUSED)
7101 {
7102 unsigned char *start = section->start;
7103 unsigned char *end = start + section->size;
7104
7105 introduce (section, FALSE);
7106
7107 /* It does not matter if this load fails,
7108 we test for that later on. */
7109 load_debug_info (file);
7110
7111 while (start < end)
7112 {
7113 unsigned char *hdrptr;
7114 DWARF2_Internal_ARange arange;
7115 unsigned char *addr_ranges;
7116 dwarf_vma length;
7117 dwarf_vma address;
7118 unsigned long sec_off;
7119 unsigned char address_size;
7120 int excess;
7121 unsigned int offset_size;
7122 unsigned int initial_length_size;
7123
7124 hdrptr = start;
7125
7126 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 4, end);
7127 if (arange.ar_length == 0xffffffff)
7128 {
7129 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 8, end);
7130 offset_size = 8;
7131 initial_length_size = 12;
7132 }
7133 else
7134 {
7135 offset_size = 4;
7136 initial_length_size = 4;
7137 }
7138
7139 sec_off = hdrptr - section->start;
7140 if (sec_off + arange.ar_length < sec_off
7141 || sec_off + arange.ar_length > section->size)
7142 {
7143 warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
7144 section->name,
7145 sec_off - initial_length_size,
7146 dwarf_vmatoa ("x", arange.ar_length));
7147 break;
7148 }
7149
7150 SAFE_BYTE_GET_AND_INC (arange.ar_version, hdrptr, 2, end);
7151 SAFE_BYTE_GET_AND_INC (arange.ar_info_offset, hdrptr, offset_size, end);
7152
7153 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
7154 && num_debug_info_entries > 0
7155 && find_debug_info_for_offset (arange.ar_info_offset) == NULL)
7156 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
7157 (unsigned long) arange.ar_info_offset, section->name);
7158
7159 SAFE_BYTE_GET_AND_INC (arange.ar_pointer_size, hdrptr, 1, end);
7160 SAFE_BYTE_GET_AND_INC (arange.ar_segment_size, hdrptr, 1, end);
7161
7162 if (arange.ar_version != 2 && arange.ar_version != 3)
7163 {
7164 /* PR 19872: A version number of 0 probably means that there is
7165 padding at the end of the .debug_aranges section. Gold puts
7166 it there when performing an incremental link, for example.
7167 So do not generate a warning in this case. */
7168 if (arange.ar_version)
7169 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
7170 break;
7171 }
7172
7173 printf (_(" Length: %ld\n"),
7174 (long) arange.ar_length);
7175 printf (_(" Version: %d\n"), arange.ar_version);
7176 printf (_(" Offset into .debug_info: 0x%lx\n"),
7177 (unsigned long) arange.ar_info_offset);
7178 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
7179 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
7180
7181 address_size = arange.ar_pointer_size + arange.ar_segment_size;
7182
7183 /* PR 17512: file: 001-108546-0.001:0.1. */
7184 if (address_size == 0 || address_size > 8)
7185 {
7186 error (_("Invalid address size in %s section!\n"),
7187 section->name);
7188 break;
7189 }
7190
7191 /* The DWARF spec does not require that the address size be a power
7192 of two, but we do. This will have to change if we ever encounter
7193 an uneven architecture. */
7194 if ((address_size & (address_size - 1)) != 0)
7195 {
7196 warn (_("Pointer size + Segment size is not a power of two.\n"));
7197 break;
7198 }
7199
7200 if (address_size > 4)
7201 printf (_("\n Address Length\n"));
7202 else
7203 printf (_("\n Address Length\n"));
7204
7205 addr_ranges = hdrptr;
7206
7207 /* Must pad to an alignment boundary that is twice the address size. */
7208 excess = (hdrptr - start) % (2 * address_size);
7209 if (excess)
7210 addr_ranges += (2 * address_size) - excess;
7211
7212 start += arange.ar_length + initial_length_size;
7213
7214 while (addr_ranges + 2 * address_size <= start)
7215 {
7216 SAFE_BYTE_GET_AND_INC (address, addr_ranges, address_size, end);
7217 SAFE_BYTE_GET_AND_INC (length, addr_ranges, address_size, end);
7218
7219 printf (" ");
7220 print_dwarf_vma (address, address_size);
7221 print_dwarf_vma (length, address_size);
7222 putchar ('\n');
7223 }
7224 }
7225
7226 printf ("\n");
7227
7228 return 1;
7229 }
7230
7231 /* Comparison function for qsort. */
7232 static int
7233 comp_addr_base (const void * v0, const void * v1)
7234 {
7235 debug_info *info0 = *(debug_info **) v0;
7236 debug_info *info1 = *(debug_info **) v1;
7237 return info0->addr_base - info1->addr_base;
7238 }
7239
7240 /* Display the debug_addr section. */
7241 static int
7242 display_debug_addr (struct dwarf_section *section,
7243 void *file)
7244 {
7245 debug_info **debug_addr_info;
7246 unsigned char *entry;
7247 unsigned char *end;
7248 unsigned int i;
7249 unsigned int count;
7250
7251 if (section->size == 0)
7252 {
7253 printf (_("\nThe %s section is empty.\n"), section->name);
7254 return 0;
7255 }
7256
7257 if (load_debug_info (file) == 0)
7258 {
7259 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
7260 section->name);
7261 return 0;
7262 }
7263
7264 introduce (section, FALSE);
7265
7266 /* PR 17531: file: cf38d01b.
7267 We use xcalloc because a corrupt file may not have initialised all of the
7268 fields in the debug_info structure, which means that the sort below might
7269 try to move uninitialised data. */
7270 debug_addr_info = (debug_info **) xcalloc ((num_debug_info_entries + 1),
7271 sizeof (debug_info *));
7272
7273 count = 0;
7274 for (i = 0; i < num_debug_info_entries; i++)
7275 if (debug_information [i].addr_base != DEBUG_INFO_UNAVAILABLE)
7276 {
7277 /* PR 17531: file: cf38d01b. */
7278 if (debug_information[i].addr_base >= section->size)
7279 warn (_("Corrupt address base (%lx) found in debug section %u\n"),
7280 (unsigned long) debug_information[i].addr_base, i);
7281 else
7282 debug_addr_info [count++] = debug_information + i;
7283 }
7284
7285 /* Add a sentinel to make iteration convenient. */
7286 debug_addr_info [count] = (debug_info *) xmalloc (sizeof (debug_info));
7287 debug_addr_info [count]->addr_base = section->size;
7288 qsort (debug_addr_info, count, sizeof (debug_info *), comp_addr_base);
7289
7290 for (i = 0; i < count; i++)
7291 {
7292 unsigned int idx;
7293 unsigned int address_size = debug_addr_info [i]->pointer_size;
7294
7295 printf (_(" For compilation unit at offset 0x%s:\n"),
7296 dwarf_vmatoa ("x", debug_addr_info [i]->cu_offset));
7297
7298 printf (_("\tIndex\tAddress\n"));
7299 entry = section->start + debug_addr_info [i]->addr_base;
7300 end = section->start + debug_addr_info [i + 1]->addr_base;
7301 idx = 0;
7302 while (entry < end)
7303 {
7304 dwarf_vma base = byte_get (entry, address_size);
7305 printf (_("\t%d:\t"), idx);
7306 print_dwarf_vma (base, address_size);
7307 printf ("\n");
7308 entry += address_size;
7309 idx++;
7310 }
7311 }
7312 printf ("\n");
7313
7314 free (debug_addr_info);
7315 return 1;
7316 }
7317
7318 /* Display the .debug_str_offsets and .debug_str_offsets.dwo sections. */
7319
7320 static int
7321 display_debug_str_offsets (struct dwarf_section *section,
7322 void *file ATTRIBUTE_UNUSED)
7323 {
7324 unsigned long idx;
7325
7326 if (section->size == 0)
7327 {
7328 printf (_("\nThe %s section is empty.\n"), section->name);
7329 return 0;
7330 }
7331
7332 unsigned char *start = section->start;
7333 unsigned char *end = start + section->size;
7334 unsigned char *curr = start;
7335
7336 const char * suffix = strrchr (section->name, '.');
7337 bfd_boolean dwo = (suffix && strcmp (suffix, ".dwo") == 0) ? TRUE : FALSE;
7338
7339 if (dwo)
7340 load_debug_section_with_follow (str_dwo, file);
7341 else
7342 load_debug_section_with_follow (str, file);
7343
7344 introduce (section, FALSE);
7345
7346 while (curr < end)
7347 {
7348 dwarf_vma length;
7349 dwarf_vma entry_length;
7350
7351 SAFE_BYTE_GET_AND_INC (length, curr, 4, end);
7352 /* FIXME: We assume that this means 64-bit DWARF is being used. */
7353 if (length == 0xffffffff)
7354 {
7355 SAFE_BYTE_GET (length, curr, 8, end);
7356 entry_length = 8;
7357 }
7358 else
7359 entry_length = 4;
7360
7361 if (length == 0)
7362 {
7363 /* This is probably an old style .debug_str_offset section which
7364 just contains offsets and no header (and the first offset is 0). */
7365 length = section->size;
7366 curr = section->start;
7367
7368 printf (_(" Length: %#lx\n"), (unsigned long) length);
7369 printf (_(" Index Offset [String]\n"));
7370 }
7371 else
7372 {
7373 int version;
7374 SAFE_BYTE_GET_AND_INC (version, curr, 2, end);
7375 if (version != 5)
7376 warn (_("Unexpected version number in str_offset header: %#x\n"), version);
7377
7378 int padding;
7379 SAFE_BYTE_GET_AND_INC (padding, curr, 2, end);
7380 if (padding != 0)
7381 warn (_("Unexpected value in str_offset header's padding field: %#x\n"), padding);
7382
7383 printf (_(" Length: %#lx\n"), (unsigned long) length);
7384 printf (_(" Version: %#lx\n"), (unsigned long) version);
7385 printf (_(" Index Offset [String]\n"));
7386 }
7387
7388 for (idx = 0; length >= entry_length && curr < end; idx++)
7389 {
7390 dwarf_vma offset;
7391 const unsigned char * string;
7392
7393 SAFE_BYTE_GET_AND_INC (offset, curr, entry_length, end);
7394 if (dwo)
7395 string = (const unsigned char *)
7396 fetch_indexed_string (idx, NULL, entry_length, dwo);
7397 else
7398 string = fetch_indirect_string (offset);
7399
7400 printf (" %8lu %8s %s\n", idx, dwarf_vmatoa ("x", offset),
7401 string);
7402 }
7403 }
7404
7405 return 1;
7406 }
7407
7408 /* Each debug_information[x].range_lists[y] gets this representation for
7409 sorting purposes. */
7410
7411 struct range_entry
7412 {
7413 /* The debug_information[x].range_lists[y] value. */
7414 dwarf_vma ranges_offset;
7415
7416 /* Original debug_information to find parameters of the data. */
7417 debug_info *debug_info_p;
7418 };
7419
7420 /* Sort struct range_entry in ascending order of its RANGES_OFFSET. */
7421
7422 static int
7423 range_entry_compar (const void *ap, const void *bp)
7424 {
7425 const struct range_entry *a_re = (const struct range_entry *) ap;
7426 const struct range_entry *b_re = (const struct range_entry *) bp;
7427 const dwarf_vma a = a_re->ranges_offset;
7428 const dwarf_vma b = b_re->ranges_offset;
7429
7430 return (a > b) - (b > a);
7431 }
7432
7433 static void
7434 display_debug_ranges_list (unsigned char *start, unsigned char *finish,
7435 unsigned int pointer_size, unsigned long offset,
7436 unsigned long base_address)
7437 {
7438 while (start < finish)
7439 {
7440 dwarf_vma begin;
7441 dwarf_vma end;
7442
7443 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
7444 if (start >= finish)
7445 break;
7446 SAFE_SIGNED_BYTE_GET_AND_INC (end, start, pointer_size, finish);
7447
7448 printf (" %8.8lx ", offset);
7449
7450 if (begin == 0 && end == 0)
7451 {
7452 printf (_("<End of list>\n"));
7453 break;
7454 }
7455
7456 /* Check base address specifiers. */
7457 if (is_max_address (begin, pointer_size)
7458 && !is_max_address (end, pointer_size))
7459 {
7460 base_address = end;
7461 print_dwarf_vma (begin, pointer_size);
7462 print_dwarf_vma (end, pointer_size);
7463 printf ("(base address)\n");
7464 continue;
7465 }
7466
7467 print_dwarf_vma (begin + base_address, pointer_size);
7468 print_dwarf_vma (end + base_address, pointer_size);
7469
7470 if (begin == end)
7471 fputs (_("(start == end)"), stdout);
7472 else if (begin > end)
7473 fputs (_("(start > end)"), stdout);
7474
7475 putchar ('\n');
7476 }
7477 }
7478
7479 static void
7480 display_debug_rnglists_list (unsigned char *start, unsigned char *finish,
7481 unsigned int pointer_size, unsigned long offset,
7482 unsigned long base_address)
7483 {
7484 unsigned char *next = start;
7485
7486 while (1)
7487 {
7488 unsigned long off = offset + (start - next);
7489 enum dwarf_range_list_entry rlet;
7490 /* Initialize it due to a false compiler warning. */
7491 dwarf_vma begin = -1, length, end = -1;
7492
7493 if (start + 1 > finish)
7494 {
7495 warn (_("Range list starting at offset 0x%lx is not terminated.\n"),
7496 offset);
7497 break;
7498 }
7499
7500 printf (" %8.8lx ", off);
7501
7502 SAFE_BYTE_GET_AND_INC (rlet, start, 1, finish);
7503
7504 switch (rlet)
7505 {
7506 case DW_RLE_end_of_list:
7507 printf (_("<End of list>\n"));
7508 break;
7509 case DW_RLE_base_address:
7510 SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size, finish);
7511 print_dwarf_vma (base_address, pointer_size);
7512 printf (_("(base address)\n"));
7513 break;
7514 case DW_RLE_start_length:
7515 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
7516 READ_ULEB (length, start, finish);
7517 end = begin + length;
7518 break;
7519 case DW_RLE_offset_pair:
7520 READ_ULEB (begin, start, finish);
7521 READ_ULEB (end, start, finish);
7522 break;
7523 case DW_RLE_start_end:
7524 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
7525 SAFE_BYTE_GET_AND_INC (end, start, pointer_size, finish);
7526 break;
7527 default:
7528 error (_("Invalid range list entry type %d\n"), rlet);
7529 rlet = DW_RLE_end_of_list;
7530 break;
7531 }
7532 if (rlet == DW_RLE_end_of_list)
7533 break;
7534 if (rlet == DW_RLE_base_address)
7535 continue;
7536
7537 /* Only a DW_RLE_offset_pair needs the base address added. */
7538 if (rlet == DW_RLE_offset_pair)
7539 {
7540 begin += base_address;
7541 end += base_address;
7542 }
7543
7544 print_dwarf_vma (begin, pointer_size);
7545 print_dwarf_vma (end, pointer_size);
7546
7547 if (begin == end)
7548 fputs (_("(start == end)"), stdout);
7549 else if (begin > end)
7550 fputs (_("(start > end)"), stdout);
7551
7552 putchar ('\n');
7553 }
7554 }
7555
7556 static int
7557 display_debug_ranges (struct dwarf_section *section,
7558 void *file ATTRIBUTE_UNUSED)
7559 {
7560 unsigned char *start = section->start;
7561 unsigned char *last_start = start;
7562 unsigned long bytes = section->size;
7563 unsigned char *section_begin = start;
7564 unsigned char *finish = start + bytes;
7565 unsigned int num_range_list, i;
7566 struct range_entry *range_entries, *range_entry_fill;
7567 int is_rnglists = strstr (section->name, "debug_rnglists") != NULL;
7568 /* Initialize it due to a false compiler warning. */
7569 unsigned char address_size = 0;
7570 dwarf_vma last_offset = 0;
7571
7572 if (bytes == 0)
7573 {
7574 printf (_("\nThe %s section is empty.\n"), section->name);
7575 return 0;
7576 }
7577
7578 if (is_rnglists)
7579 {
7580 dwarf_vma initial_length;
7581 unsigned int initial_length_size;
7582 unsigned char segment_selector_size;
7583 unsigned int offset_size, offset_entry_count;
7584 unsigned short version;
7585
7586 /* Get and check the length of the block. */
7587 SAFE_BYTE_GET_AND_INC (initial_length, start, 4, finish);
7588
7589 if (initial_length == 0xffffffff)
7590 {
7591 /* This section is 64-bit DWARF 3. */
7592 SAFE_BYTE_GET_AND_INC (initial_length, start, 8, finish);
7593 offset_size = 8;
7594 initial_length_size = 12;
7595 }
7596 else
7597 {
7598 offset_size = 4;
7599 initial_length_size = 4;
7600 }
7601
7602 if (initial_length + initial_length_size > section->size)
7603 {
7604 /* If the length field has a relocation against it, then we should
7605 not complain if it is inaccurate (and probably negative).
7606 It is copied from .debug_line handling code. */
7607 if (reloc_at (section, (start - section->start) - offset_size))
7608 {
7609 initial_length = (finish - start) - initial_length_size;
7610 }
7611 else
7612 {
7613 warn (_("The length field (0x%lx) in the debug_rnglists header is wrong - the section is too small\n"),
7614 (long) initial_length);
7615 return 0;
7616 }
7617 }
7618
7619 /* Get and check the version number. */
7620 SAFE_BYTE_GET_AND_INC (version, start, 2, finish);
7621
7622 if (version != 5)
7623 {
7624 warn (_("Only DWARF version 5 debug_rnglists info "
7625 "is currently supported.\n"));
7626 return 0;
7627 }
7628
7629 SAFE_BYTE_GET_AND_INC (address_size, start, 1, finish);
7630
7631 SAFE_BYTE_GET_AND_INC (segment_selector_size, start, 1, finish);
7632 if (segment_selector_size != 0)
7633 {
7634 warn (_("The %s section contains "
7635 "unsupported segment selector size: %d.\n"),
7636 section->name, segment_selector_size);
7637 return 0;
7638 }
7639
7640 SAFE_BYTE_GET_AND_INC (offset_entry_count, start, 4, finish);
7641 if (offset_entry_count != 0)
7642 {
7643 warn (_("The %s section contains "
7644 "unsupported offset entry count: %u.\n"),
7645 section->name, offset_entry_count);
7646 return 0;
7647 }
7648 }
7649
7650 if (load_debug_info (file) == 0)
7651 {
7652 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
7653 section->name);
7654 return 0;
7655 }
7656
7657 num_range_list = 0;
7658 for (i = 0; i < num_debug_info_entries; i++)
7659 num_range_list += debug_information [i].num_range_lists;
7660
7661 if (num_range_list == 0)
7662 {
7663 /* This can happen when the file was compiled with -gsplit-debug
7664 which removes references to range lists from the primary .o file. */
7665 printf (_("No range lists in .debug_info section.\n"));
7666 return 1;
7667 }
7668
7669 range_entries = (struct range_entry *)
7670 xmalloc (sizeof (*range_entries) * num_range_list);
7671 range_entry_fill = range_entries;
7672
7673 for (i = 0; i < num_debug_info_entries; i++)
7674 {
7675 debug_info *debug_info_p = &debug_information[i];
7676 unsigned int j;
7677
7678 for (j = 0; j < debug_info_p->num_range_lists; j++)
7679 {
7680 range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
7681 range_entry_fill->debug_info_p = debug_info_p;
7682 range_entry_fill++;
7683 }
7684 }
7685
7686 qsort (range_entries, num_range_list, sizeof (*range_entries),
7687 range_entry_compar);
7688
7689 if (dwarf_check != 0 && range_entries[0].ranges_offset != 0)
7690 warn (_("Range lists in %s section start at 0x%lx\n"),
7691 section->name, (unsigned long) range_entries[0].ranges_offset);
7692
7693 introduce (section, FALSE);
7694
7695 printf (_(" Offset Begin End\n"));
7696
7697 for (i = 0; i < num_range_list; i++)
7698 {
7699 struct range_entry *range_entry = &range_entries[i];
7700 debug_info *debug_info_p = range_entry->debug_info_p;
7701 unsigned int pointer_size;
7702 dwarf_vma offset;
7703 unsigned char *next;
7704 dwarf_vma base_address;
7705
7706 pointer_size = (is_rnglists ? address_size : debug_info_p->pointer_size);
7707 offset = range_entry->ranges_offset;
7708 next = section_begin + offset;
7709 base_address = debug_info_p->base_address;
7710
7711 /* PR 17512: file: 001-101485-0.001:0.1. */
7712 if (pointer_size < 2 || pointer_size > 8)
7713 {
7714 warn (_("Corrupt pointer size (%d) in debug entry at offset %8.8lx\n"),
7715 pointer_size, (unsigned long) offset);
7716 continue;
7717 }
7718
7719 if (next < section_begin || next >= finish)
7720 {
7721 warn (_("Corrupt offset (%#8.8lx) in range entry %u\n"),
7722 (unsigned long) offset, i);
7723 continue;
7724 }
7725
7726 /* If multiple DWARF entities reference the same range then we will
7727 have multiple entries in the `range_entries' list for the same
7728 offset. Thanks to the sort above these will all be consecutive in
7729 the `range_entries' list, so we can easily ignore duplicates
7730 here. */
7731 if (i > 0 && last_offset == offset)
7732 continue;
7733 last_offset = offset;
7734
7735 if (dwarf_check != 0 && i > 0)
7736 {
7737 if (start < next)
7738 warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
7739 (unsigned long) (start - section_begin),
7740 (unsigned long) (next - section_begin), section->name);
7741 else if (start > next)
7742 {
7743 if (next == last_start)
7744 continue;
7745 warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
7746 (unsigned long) (start - section_begin),
7747 (unsigned long) (next - section_begin), section->name);
7748 }
7749 }
7750
7751 start = next;
7752 last_start = next;
7753
7754 (is_rnglists ? display_debug_rnglists_list : display_debug_ranges_list)
7755 (start, finish, pointer_size, offset, base_address);
7756 }
7757 putchar ('\n');
7758
7759 free (range_entries);
7760
7761 return 1;
7762 }
7763
7764 typedef struct Frame_Chunk
7765 {
7766 struct Frame_Chunk *next;
7767 unsigned char *chunk_start;
7768 unsigned int ncols;
7769 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7770 short int *col_type;
7771 int *col_offset;
7772 char *augmentation;
7773 unsigned int code_factor;
7774 int data_factor;
7775 dwarf_vma pc_begin;
7776 dwarf_vma pc_range;
7777 unsigned int cfa_reg;
7778 dwarf_vma cfa_offset;
7779 unsigned int ra;
7780 unsigned char fde_encoding;
7781 unsigned char cfa_exp;
7782 unsigned char ptr_size;
7783 unsigned char segment_size;
7784 }
7785 Frame_Chunk;
7786
7787 typedef const char *(*dwarf_regname_lookup_ftype) (unsigned int);
7788 static dwarf_regname_lookup_ftype dwarf_regnames_lookup_func;
7789 static const char *const *dwarf_regnames;
7790 static unsigned int dwarf_regnames_count;
7791
7792
7793 /* A marker for a col_type that means this column was never referenced
7794 in the frame info. */
7795 #define DW_CFA_unreferenced (-1)
7796
7797 /* Return 0 if no more space is needed, 1 if more space is needed,
7798 -1 for invalid reg. */
7799
7800 static int
7801 frame_need_space (Frame_Chunk *fc, unsigned int reg)
7802 {
7803 unsigned int prev = fc->ncols;
7804
7805 if (reg < (unsigned int) fc->ncols)
7806 return 0;
7807
7808 if (dwarf_regnames_count > 0
7809 && reg > dwarf_regnames_count)
7810 return -1;
7811
7812 fc->ncols = reg + 1;
7813 /* PR 17512: file: 10450-2643-0.004.
7814 If reg == -1 then this can happen... */
7815 if (fc->ncols == 0)
7816 return -1;
7817
7818 /* PR 17512: file: 2844a11d. */
7819 if (fc->ncols > 1024 && dwarf_regnames_count == 0)
7820 {
7821 error (_("Unfeasibly large register number: %u\n"), reg);
7822 fc->ncols = 0;
7823 /* FIXME: 1024 is an arbitrary limit. Increase it if
7824 we ever encounter a valid binary that exceeds it. */
7825 return -1;
7826 }
7827
7828 fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
7829 sizeof (short int));
7830 fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
7831 /* PR 17512: file:002-10025-0.005. */
7832 if (fc->col_type == NULL || fc->col_offset == NULL)
7833 {
7834 error (_("Out of memory allocating %u columns in dwarf frame arrays\n"),
7835 fc->ncols);
7836 fc->ncols = 0;
7837 return -1;
7838 }
7839
7840 while (prev < fc->ncols)
7841 {
7842 fc->col_type[prev] = DW_CFA_unreferenced;
7843 fc->col_offset[prev] = 0;
7844 prev++;
7845 }
7846 return 1;
7847 }
7848
7849 static const char *const dwarf_regnames_i386[] =
7850 {
7851 "eax", "ecx", "edx", "ebx", /* 0 - 3 */
7852 "esp", "ebp", "esi", "edi", /* 4 - 7 */
7853 "eip", "eflags", NULL, /* 8 - 10 */
7854 "st0", "st1", "st2", "st3", /* 11 - 14 */
7855 "st4", "st5", "st6", "st7", /* 15 - 18 */
7856 NULL, NULL, /* 19 - 20 */
7857 "xmm0", "xmm1", "xmm2", "xmm3", /* 21 - 24 */
7858 "xmm4", "xmm5", "xmm6", "xmm7", /* 25 - 28 */
7859 "mm0", "mm1", "mm2", "mm3", /* 29 - 32 */
7860 "mm4", "mm5", "mm6", "mm7", /* 33 - 36 */
7861 "fcw", "fsw", "mxcsr", /* 37 - 39 */
7862 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47 */
7863 "tr", "ldtr", /* 48 - 49 */
7864 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57 */
7865 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65 */
7866 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73 */
7867 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81 */
7868 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89 */
7869 NULL, NULL, NULL, /* 90 - 92 */
7870 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7" /* 93 - 100 */
7871 };
7872
7873 static const char *const dwarf_regnames_iamcu[] =
7874 {
7875 "eax", "ecx", "edx", "ebx", /* 0 - 3 */
7876 "esp", "ebp", "esi", "edi", /* 4 - 7 */
7877 "eip", "eflags", NULL, /* 8 - 10 */
7878 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 11 - 18 */
7879 NULL, NULL, /* 19 - 20 */
7880 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 21 - 28 */
7881 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 29 - 36 */
7882 NULL, NULL, NULL, /* 37 - 39 */
7883 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47 */
7884 "tr", "ldtr", /* 48 - 49 */
7885 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57 */
7886 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65 */
7887 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73 */
7888 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81 */
7889 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89 */
7890 NULL, NULL, NULL, /* 90 - 92 */
7891 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL /* 93 - 100 */
7892 };
7893
7894 static void
7895 init_dwarf_regnames_i386 (void)
7896 {
7897 dwarf_regnames = dwarf_regnames_i386;
7898 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
7899 dwarf_regnames_lookup_func = regname_internal_by_table_only;
7900 }
7901
7902 static void
7903 init_dwarf_regnames_iamcu (void)
7904 {
7905 dwarf_regnames = dwarf_regnames_iamcu;
7906 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_iamcu);
7907 dwarf_regnames_lookup_func = regname_internal_by_table_only;
7908 }
7909
7910 static const char *const dwarf_regnames_x86_64[] =
7911 {
7912 "rax", "rdx", "rcx", "rbx",
7913 "rsi", "rdi", "rbp", "rsp",
7914 "r8", "r9", "r10", "r11",
7915 "r12", "r13", "r14", "r15",
7916 "rip",
7917 "xmm0", "xmm1", "xmm2", "xmm3",
7918 "xmm4", "xmm5", "xmm6", "xmm7",
7919 "xmm8", "xmm9", "xmm10", "xmm11",
7920 "xmm12", "xmm13", "xmm14", "xmm15",
7921 "st0", "st1", "st2", "st3",
7922 "st4", "st5", "st6", "st7",
7923 "mm0", "mm1", "mm2", "mm3",
7924 "mm4", "mm5", "mm6", "mm7",
7925 "rflags",
7926 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
7927 "fs.base", "gs.base", NULL, NULL,
7928 "tr", "ldtr",
7929 "mxcsr", "fcw", "fsw",
7930 "xmm16", "xmm17", "xmm18", "xmm19",
7931 "xmm20", "xmm21", "xmm22", "xmm23",
7932 "xmm24", "xmm25", "xmm26", "xmm27",
7933 "xmm28", "xmm29", "xmm30", "xmm31",
7934 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 83 - 90 */
7935 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 91 - 98 */
7936 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 99 - 106 */
7937 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 107 - 114 */
7938 NULL, NULL, NULL, /* 115 - 117 */
7939 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
7940 };
7941
7942 static void
7943 init_dwarf_regnames_x86_64 (void)
7944 {
7945 dwarf_regnames = dwarf_regnames_x86_64;
7946 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
7947 dwarf_regnames_lookup_func = regname_internal_by_table_only;
7948 }
7949
7950 static const char *const dwarf_regnames_aarch64[] =
7951 {
7952 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
7953 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
7954 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
7955 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp",
7956 NULL, "elr", NULL, NULL, NULL, NULL, NULL, NULL,
7957 NULL, NULL, NULL, NULL, NULL, NULL, "vg", "ffr",
7958 "p0", "p1", "p2", "p3", "p4", "p5", "p6", "p7",
7959 "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15",
7960 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
7961 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
7962 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
7963 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
7964 "z0", "z1", "z2", "z3", "z4", "z5", "z6", "z7",
7965 "z8", "z9", "z10", "z11", "z12", "z13", "z14", "z15",
7966 "z16", "z17", "z18", "z19", "z20", "z21", "z22", "z23",
7967 "z24", "z25", "z26", "z27", "z28", "z29", "z30", "z31",
7968 };
7969
7970 static void
7971 init_dwarf_regnames_aarch64 (void)
7972 {
7973 dwarf_regnames = dwarf_regnames_aarch64;
7974 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_aarch64);
7975 dwarf_regnames_lookup_func = regname_internal_by_table_only;
7976 }
7977
7978 static const char *const dwarf_regnames_s390[] =
7979 {
7980 /* Avoid saying "r5 (r5)", so omit the names of r0-r15. */
7981 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7982 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7983 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7984 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15",
7985 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
7986 "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", "cr15",
7987 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7",
7988 "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15",
7989 "pswm", "pswa",
7990 NULL, NULL,
7991 "v16", "v18", "v20", "v22", "v17", "v19", "v21", "v23",
7992 "v24", "v26", "v28", "v30", "v25", "v27", "v29", "v31",
7993 };
7994
7995 static void
7996 init_dwarf_regnames_s390 (void)
7997 {
7998 dwarf_regnames = dwarf_regnames_s390;
7999 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_s390);
8000 dwarf_regnames_lookup_func = regname_internal_by_table_only;
8001 }
8002
8003 static const char *const dwarf_regnames_riscv[] =
8004 {
8005 "zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", /* 0 - 7 */
8006 "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", /* 8 - 15 */
8007 "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", /* 16 - 23 */
8008 "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", /* 24 - 31 */
8009 "ft0", "ft1", "ft2", "ft3", "ft4", "ft5", "ft6", "ft7", /* 32 - 39 */
8010 "fs0", "fs1", /* 40 - 41 */
8011 "fa0", "fa1", "fa2", "fa3", "fa4", "fa5", "fa6", "fa7", /* 42 - 49 */
8012 "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9", /* 50 - 57 */
8013 "fs10", "fs11", /* 58 - 59 */
8014 "ft8", "ft9", "ft10", "ft11" /* 60 - 63 */
8015 };
8016
8017 /* A RISC-V replacement for REGNAME_INTERNAL_BY_TABLE_ONLY which handles
8018 the large number of CSRs. */
8019
8020 static const char *
8021 regname_internal_riscv (unsigned int regno)
8022 {
8023 const char *name = NULL;
8024
8025 /* Lookup in the table first, this covers GPR and FPR. */
8026 if (regno < ARRAY_SIZE (dwarf_regnames_riscv))
8027 name = dwarf_regnames_riscv [regno];
8028 else if (regno >= 4096 && regno <= 8191)
8029 {
8030 /* This might be a CSR, these live in a sparse number space from 4096
8031 to 8191 These numbers are defined in the RISC-V ELF ABI
8032 document. */
8033 switch (regno)
8034 {
8035 #define DECLARE_CSR(NAME,VALUE,CLASS,DEFINE_VER,ABORT_VER) \
8036 case VALUE + 4096: name = #NAME; break;
8037 #include "opcode/riscv-opc.h"
8038 #undef DECLARE_CSR
8039
8040 default:
8041 {
8042 static char csr_name[10];
8043 snprintf (csr_name, sizeof (csr_name), "csr%d", (regno - 4096));
8044 name = csr_name;
8045 }
8046 break;
8047 }
8048 }
8049
8050 return name;
8051 }
8052
8053 static void
8054 init_dwarf_regnames_riscv (void)
8055 {
8056 dwarf_regnames = NULL;
8057 dwarf_regnames_count = 8192;
8058 dwarf_regnames_lookup_func = regname_internal_riscv;
8059 }
8060
8061 void
8062 init_dwarf_regnames_by_elf_machine_code (unsigned int e_machine)
8063 {
8064 dwarf_regnames_lookup_func = NULL;
8065
8066 switch (e_machine)
8067 {
8068 case EM_386:
8069 init_dwarf_regnames_i386 ();
8070 break;
8071
8072 case EM_IAMCU:
8073 init_dwarf_regnames_iamcu ();
8074 break;
8075
8076 case EM_X86_64:
8077 case EM_L1OM:
8078 case EM_K1OM:
8079 init_dwarf_regnames_x86_64 ();
8080 break;
8081
8082 case EM_AARCH64:
8083 init_dwarf_regnames_aarch64 ();
8084 break;
8085
8086 case EM_S390:
8087 init_dwarf_regnames_s390 ();
8088 break;
8089
8090 case EM_RISCV:
8091 init_dwarf_regnames_riscv ();
8092 break;
8093
8094 default:
8095 break;
8096 }
8097 }
8098
8099 /* Initialize the DWARF register name lookup state based on the
8100 architecture and specific machine type of a BFD. */
8101
8102 void
8103 init_dwarf_regnames_by_bfd_arch_and_mach (enum bfd_architecture arch,
8104 unsigned long mach)
8105 {
8106 dwarf_regnames_lookup_func = NULL;
8107
8108 switch (arch)
8109 {
8110 case bfd_arch_i386:
8111 switch (mach)
8112 {
8113 case bfd_mach_x86_64:
8114 case bfd_mach_x86_64_intel_syntax:
8115 case bfd_mach_x64_32:
8116 case bfd_mach_x64_32_intel_syntax:
8117 init_dwarf_regnames_x86_64 ();
8118 break;
8119
8120 default:
8121 init_dwarf_regnames_i386 ();
8122 break;
8123 }
8124 break;
8125
8126 case bfd_arch_iamcu:
8127 init_dwarf_regnames_iamcu ();
8128 break;
8129
8130 case bfd_arch_aarch64:
8131 init_dwarf_regnames_aarch64();
8132 break;
8133
8134 case bfd_arch_s390:
8135 init_dwarf_regnames_s390 ();
8136 break;
8137
8138 case bfd_arch_riscv:
8139 init_dwarf_regnames_riscv ();
8140 break;
8141
8142 default:
8143 break;
8144 }
8145 }
8146
8147 static const char *
8148 regname_internal_by_table_only (unsigned int regno)
8149 {
8150 if (dwarf_regnames != NULL
8151 && regno < dwarf_regnames_count
8152 && dwarf_regnames [regno] != NULL)
8153 return dwarf_regnames [regno];
8154
8155 return NULL;
8156 }
8157
8158 static const char *
8159 regname (unsigned int regno, int name_only_p)
8160 {
8161 static char reg[64];
8162
8163 const char *name = NULL;
8164
8165 if (dwarf_regnames_lookup_func != NULL)
8166 name = dwarf_regnames_lookup_func (regno);
8167
8168 if (name != NULL)
8169 {
8170 if (name_only_p)
8171 return name;
8172 snprintf (reg, sizeof (reg), "r%d (%s)", regno, name);
8173 }
8174 else
8175 snprintf (reg, sizeof (reg), "r%d", regno);
8176 return reg;
8177 }
8178
8179 static void
8180 frame_display_row (Frame_Chunk *fc, int *need_col_headers, unsigned int *max_regs)
8181 {
8182 unsigned int r;
8183 char tmp[100];
8184
8185 if (*max_regs != fc->ncols)
8186 *max_regs = fc->ncols;
8187
8188 if (*need_col_headers)
8189 {
8190 *need_col_headers = 0;
8191
8192 printf ("%-*s CFA ", eh_addr_size * 2, " LOC");
8193
8194 for (r = 0; r < *max_regs; r++)
8195 if (fc->col_type[r] != DW_CFA_unreferenced)
8196 {
8197 if (r == fc->ra)
8198 printf ("ra ");
8199 else
8200 printf ("%-5s ", regname (r, 1));
8201 }
8202
8203 printf ("\n");
8204 }
8205
8206 print_dwarf_vma (fc->pc_begin, eh_addr_size);
8207 if (fc->cfa_exp)
8208 strcpy (tmp, "exp");
8209 else
8210 sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), (int) fc->cfa_offset);
8211 printf ("%-8s ", tmp);
8212
8213 for (r = 0; r < fc->ncols; r++)
8214 {
8215 if (fc->col_type[r] != DW_CFA_unreferenced)
8216 {
8217 switch (fc->col_type[r])
8218 {
8219 case DW_CFA_undefined:
8220 strcpy (tmp, "u");
8221 break;
8222 case DW_CFA_same_value:
8223 strcpy (tmp, "s");
8224 break;
8225 case DW_CFA_offset:
8226 sprintf (tmp, "c%+d", fc->col_offset[r]);
8227 break;
8228 case DW_CFA_val_offset:
8229 sprintf (tmp, "v%+d", fc->col_offset[r]);
8230 break;
8231 case DW_CFA_register:
8232 sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
8233 break;
8234 case DW_CFA_expression:
8235 strcpy (tmp, "exp");
8236 break;
8237 case DW_CFA_val_expression:
8238 strcpy (tmp, "vexp");
8239 break;
8240 default:
8241 strcpy (tmp, "n/a");
8242 break;
8243 }
8244 printf ("%-5s ", tmp);
8245 }
8246 }
8247 printf ("\n");
8248 }
8249
8250 #define GET(VAR, N) SAFE_BYTE_GET_AND_INC (VAR, start, N, end)
8251
8252 static unsigned char *
8253 read_cie (unsigned char *start, unsigned char *end,
8254 Frame_Chunk **p_cie, int *p_version,
8255 bfd_size_type *p_aug_len, unsigned char **p_aug)
8256 {
8257 int version;
8258 Frame_Chunk *fc;
8259 unsigned char *augmentation_data = NULL;
8260 bfd_size_type augmentation_data_len = 0;
8261
8262 * p_cie = NULL;
8263 /* PR 17512: file: 001-228113-0.004. */
8264 if (start >= end)
8265 return end;
8266
8267 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8268 memset (fc, 0, sizeof (Frame_Chunk));
8269
8270 fc->col_type = (short int *) xmalloc (sizeof (short int));
8271 fc->col_offset = (int *) xmalloc (sizeof (int));
8272
8273 version = *start++;
8274
8275 fc->augmentation = (char *) start;
8276 /* PR 17512: file: 001-228113-0.004.
8277 Skip past augmentation name, but avoid running off the end of the data. */
8278 while (start < end)
8279 if (* start ++ == '\0')
8280 break;
8281 if (start == end)
8282 {
8283 warn (_("No terminator for augmentation name\n"));
8284 goto fail;
8285 }
8286
8287 if (strcmp (fc->augmentation, "eh") == 0)
8288 start += eh_addr_size;
8289
8290 if (version >= 4)
8291 {
8292 GET (fc->ptr_size, 1);
8293 if (fc->ptr_size < 1 || fc->ptr_size > 8)
8294 {
8295 warn (_("Invalid pointer size (%d) in CIE data\n"), fc->ptr_size);
8296 goto fail;
8297 }
8298
8299 GET (fc->segment_size, 1);
8300 /* PR 17512: file: e99d2804. */
8301 if (fc->segment_size > 8 || fc->segment_size + fc->ptr_size > 8)
8302 {
8303 warn (_("Invalid segment size (%d) in CIE data\n"), fc->segment_size);
8304 goto fail;
8305 }
8306
8307 eh_addr_size = fc->ptr_size;
8308 }
8309 else
8310 {
8311 fc->ptr_size = eh_addr_size;
8312 fc->segment_size = 0;
8313 }
8314
8315 READ_ULEB (fc->code_factor, start, end);
8316 READ_SLEB (fc->data_factor, start, end);
8317
8318 if (version == 1)
8319 {
8320 GET (fc->ra, 1);
8321 }
8322 else
8323 {
8324 READ_ULEB (fc->ra, start, end);
8325 }
8326
8327 if (fc->augmentation[0] == 'z')
8328 {
8329 READ_ULEB (augmentation_data_len, start, end);
8330 augmentation_data = start;
8331 /* PR 17512: file: 11042-2589-0.004. */
8332 if (augmentation_data_len > (bfd_size_type) (end - start))
8333 {
8334 warn (_("Augmentation data too long: 0x%s, expected at most %#lx\n"),
8335 dwarf_vmatoa ("x", augmentation_data_len),
8336 (unsigned long) (end - start));
8337 goto fail;
8338 }
8339 start += augmentation_data_len;
8340 }
8341
8342 if (augmentation_data_len)
8343 {
8344 unsigned char *p;
8345 unsigned char *q;
8346 unsigned char *qend;
8347
8348 p = (unsigned char *) fc->augmentation + 1;
8349 q = augmentation_data;
8350 qend = q + augmentation_data_len;
8351
8352 while (p < end && q < qend)
8353 {
8354 if (*p == 'L')
8355 q++;
8356 else if (*p == 'P')
8357 q += 1 + size_of_encoded_value (*q);
8358 else if (*p == 'R')
8359 fc->fde_encoding = *q++;
8360 else if (*p == 'S')
8361 ;
8362 else if (*p == 'B')
8363 ;
8364 else
8365 break;
8366 p++;
8367 }
8368 /* Note - it is OK if this loop terminates with q < qend.
8369 Padding may have been inserted to align the end of the CIE. */
8370 }
8371
8372 *p_cie = fc;
8373 if (p_version)
8374 *p_version = version;
8375 if (p_aug_len)
8376 {
8377 *p_aug_len = augmentation_data_len;
8378 *p_aug = augmentation_data;
8379 }
8380 return start;
8381
8382 fail:
8383 free (fc->col_offset);
8384 free (fc->col_type);
8385 free (fc);
8386 return end;
8387 }
8388
8389 /* Prints out the contents on the DATA array formatted as unsigned bytes.
8390 If do_wide is not enabled, then formats the output to fit into 80 columns.
8391 PRINTED contains the number of characters already written to the current
8392 output line. */
8393
8394 static void
8395 display_data (bfd_size_type printed,
8396 const unsigned char * data,
8397 const bfd_size_type len)
8398 {
8399 if (do_wide || len < ((80 - printed) / 3))
8400 for (printed = 0; printed < len; ++printed)
8401 printf (" %02x", data[printed]);
8402 else
8403 {
8404 for (printed = 0; printed < len; ++printed)
8405 {
8406 if (printed % (80 / 3) == 0)
8407 putchar ('\n');
8408 printf (" %02x", data[printed]);
8409 }
8410 }
8411 }
8412
8413 /* Prints out the contents on the augmentation data array.
8414 If do_wide is not enabled, then formats the output to fit into 80 columns. */
8415
8416 static void
8417 display_augmentation_data (const unsigned char * data, const bfd_size_type len)
8418 {
8419 bfd_size_type i;
8420
8421 i = printf (_(" Augmentation data: "));
8422 display_data (i, data, len);
8423 }
8424
8425 static int
8426 display_debug_frames (struct dwarf_section *section,
8427 void *file ATTRIBUTE_UNUSED)
8428 {
8429 unsigned char *start = section->start;
8430 unsigned char *end = start + section->size;
8431 unsigned char *section_start = start;
8432 Frame_Chunk *chunks = NULL, *forward_refs = NULL;
8433 Frame_Chunk *remembered_state = NULL;
8434 Frame_Chunk *rs;
8435 bfd_boolean is_eh = strcmp (section->name, ".eh_frame") == 0;
8436 unsigned int max_regs = 0;
8437 const char *bad_reg = _("bad register: ");
8438 unsigned int saved_eh_addr_size = eh_addr_size;
8439
8440 introduce (section, FALSE);
8441
8442 while (start < end)
8443 {
8444 unsigned char *saved_start;
8445 unsigned char *block_end;
8446 dwarf_vma length;
8447 dwarf_vma cie_id;
8448 Frame_Chunk *fc;
8449 Frame_Chunk *cie;
8450 int need_col_headers = 1;
8451 unsigned char *augmentation_data = NULL;
8452 bfd_size_type augmentation_data_len = 0;
8453 unsigned int encoded_ptr_size = saved_eh_addr_size;
8454 unsigned int offset_size;
8455 unsigned int initial_length_size;
8456 bfd_boolean all_nops;
8457 static Frame_Chunk fde_fc;
8458
8459 saved_start = start;
8460
8461 SAFE_BYTE_GET_AND_INC (length, start, 4, end);
8462
8463 if (length == 0)
8464 {
8465 printf ("\n%08lx ZERO terminator\n\n",
8466 (unsigned long)(saved_start - section_start));
8467 /* Skip any zero terminators that directly follow.
8468 A corrupt section size could have loaded a whole
8469 slew of zero filled memory bytes. eg
8470 PR 17512: file: 070-19381-0.004. */
8471 while (start < end && * start == 0)
8472 ++ start;
8473 continue;
8474 }
8475
8476 if (length == 0xffffffff)
8477 {
8478 SAFE_BYTE_GET_AND_INC (length, start, 8, end);
8479 offset_size = 8;
8480 initial_length_size = 12;
8481 }
8482 else
8483 {
8484 offset_size = 4;
8485 initial_length_size = 4;
8486 }
8487
8488 block_end = saved_start + length + initial_length_size;
8489 if (block_end > end || block_end < start)
8490 {
8491 warn ("Invalid length 0x%s in FDE at %#08lx\n",
8492 dwarf_vmatoa_1 (NULL, length, offset_size),
8493 (unsigned long) (saved_start - section_start));
8494 block_end = end;
8495 }
8496
8497 SAFE_BYTE_GET_AND_INC (cie_id, start, offset_size, end);
8498
8499 if (is_eh ? (cie_id == 0) : ((offset_size == 4 && cie_id == DW_CIE_ID)
8500 || (offset_size == 8 && cie_id == DW64_CIE_ID)))
8501 {
8502 int version;
8503 unsigned int mreg;
8504
8505 start = read_cie (start, end, &cie, &version,
8506 &augmentation_data_len, &augmentation_data);
8507 /* PR 17512: file: 027-135133-0.005. */
8508 if (cie == NULL)
8509 break;
8510
8511 fc = cie;
8512 fc->next = chunks;
8513 chunks = fc;
8514 fc->chunk_start = saved_start;
8515 mreg = max_regs > 0 ? max_regs - 1 : 0;
8516 if (mreg < fc->ra)
8517 mreg = fc->ra;
8518 if (frame_need_space (fc, mreg) < 0)
8519 break;
8520 if (fc->fde_encoding)
8521 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8522
8523 printf ("\n%08lx ", (unsigned long) (saved_start - section_start));
8524 print_dwarf_vma (length, fc->ptr_size);
8525 print_dwarf_vma (cie_id, offset_size);
8526
8527 if (do_debug_frames_interp)
8528 {
8529 printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc->augmentation,
8530 fc->code_factor, fc->data_factor, fc->ra);
8531 }
8532 else
8533 {
8534 printf ("CIE\n");
8535 printf (" Version: %d\n", version);
8536 printf (" Augmentation: \"%s\"\n", fc->augmentation);
8537 if (version >= 4)
8538 {
8539 printf (" Pointer Size: %u\n", fc->ptr_size);
8540 printf (" Segment Size: %u\n", fc->segment_size);
8541 }
8542 printf (" Code alignment factor: %u\n", fc->code_factor);
8543 printf (" Data alignment factor: %d\n", fc->data_factor);
8544 printf (" Return address column: %d\n", fc->ra);
8545
8546 if (augmentation_data_len)
8547 display_augmentation_data (augmentation_data, augmentation_data_len);
8548
8549 putchar ('\n');
8550 }
8551 }
8552 else
8553 {
8554 unsigned char *look_for;
8555 unsigned long segment_selector;
8556
8557 if (is_eh)
8558 {
8559 dwarf_vma sign = (dwarf_vma) 1 << (offset_size * 8 - 1);
8560 look_for = start - 4 - ((cie_id ^ sign) - sign);
8561 }
8562 else
8563 look_for = section_start + cie_id;
8564
8565 if (look_for <= saved_start)
8566 {
8567 for (cie = chunks; cie ; cie = cie->next)
8568 if (cie->chunk_start == look_for)
8569 break;
8570 }
8571 else
8572 {
8573 for (cie = forward_refs; cie ; cie = cie->next)
8574 if (cie->chunk_start == look_for)
8575 break;
8576 if (!cie)
8577 {
8578 unsigned int off_size;
8579 unsigned char *cie_scan;
8580
8581 cie_scan = look_for;
8582 off_size = 4;
8583 SAFE_BYTE_GET_AND_INC (length, cie_scan, 4, end);
8584 if (length == 0xffffffff)
8585 {
8586 SAFE_BYTE_GET_AND_INC (length, cie_scan, 8, end);
8587 off_size = 8;
8588 }
8589 if (length != 0)
8590 {
8591 dwarf_vma c_id;
8592
8593 SAFE_BYTE_GET_AND_INC (c_id, cie_scan, off_size, end);
8594 if (is_eh
8595 ? c_id == 0
8596 : ((off_size == 4 && c_id == DW_CIE_ID)
8597 || (off_size == 8 && c_id == DW64_CIE_ID)))
8598 {
8599 int version;
8600 unsigned int mreg;
8601
8602 read_cie (cie_scan, end, &cie, &version,
8603 &augmentation_data_len, &augmentation_data);
8604 /* PR 17512: file: 3450-2098-0.004. */
8605 if (cie == NULL)
8606 {
8607 warn (_("Failed to read CIE information\n"));
8608 break;
8609 }
8610 cie->next = forward_refs;
8611 forward_refs = cie;
8612 cie->chunk_start = look_for;
8613 mreg = max_regs > 0 ? max_regs - 1 : 0;
8614 if (mreg < cie->ra)
8615 mreg = cie->ra;
8616 if (frame_need_space (cie, mreg) < 0)
8617 {
8618 warn (_("Invalid max register\n"));
8619 break;
8620 }
8621 if (cie->fde_encoding)
8622 encoded_ptr_size
8623 = size_of_encoded_value (cie->fde_encoding);
8624 }
8625 }
8626 }
8627 }
8628
8629 fc = &fde_fc;
8630 memset (fc, 0, sizeof (Frame_Chunk));
8631
8632 if (!cie)
8633 {
8634 warn ("Invalid CIE pointer 0x%s in FDE at %#08lx\n",
8635 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
8636 (unsigned long) (saved_start - section_start));
8637 fc->ncols = 0;
8638 fc->col_type = (short int *) xmalloc (sizeof (short int));
8639 fc->col_offset = (int *) xmalloc (sizeof (int));
8640 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1 : 0) < 0)
8641 {
8642 warn (_("Invalid max register\n"));
8643 break;
8644 }
8645 cie = fc;
8646 fc->augmentation = "";
8647 fc->fde_encoding = 0;
8648 fc->ptr_size = eh_addr_size;
8649 fc->segment_size = 0;
8650 }
8651 else
8652 {
8653 fc->ncols = cie->ncols;
8654 fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
8655 fc->col_offset = (int *) xcmalloc (fc->ncols, sizeof (int));
8656 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8657 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8658 fc->augmentation = cie->augmentation;
8659 fc->ptr_size = cie->ptr_size;
8660 eh_addr_size = cie->ptr_size;
8661 fc->segment_size = cie->segment_size;
8662 fc->code_factor = cie->code_factor;
8663 fc->data_factor = cie->data_factor;
8664 fc->cfa_reg = cie->cfa_reg;
8665 fc->cfa_offset = cie->cfa_offset;
8666 fc->ra = cie->ra;
8667 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1: 0) < 0)
8668 {
8669 warn (_("Invalid max register\n"));
8670 break;
8671 }
8672 fc->fde_encoding = cie->fde_encoding;
8673 }
8674
8675 if (fc->fde_encoding)
8676 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8677
8678 segment_selector = 0;
8679 if (fc->segment_size)
8680 {
8681 if (fc->segment_size > sizeof (segment_selector))
8682 {
8683 /* PR 17512: file: 9e196b3e. */
8684 warn (_("Probably corrupt segment size: %d - using 4 instead\n"), fc->segment_size);
8685 fc->segment_size = 4;
8686 }
8687 SAFE_BYTE_GET_AND_INC (segment_selector, start, fc->segment_size, end);
8688 }
8689
8690 fc->pc_begin = get_encoded_value (&start, fc->fde_encoding, section, end);
8691
8692 /* FIXME: It appears that sometimes the final pc_range value is
8693 encoded in less than encoded_ptr_size bytes. See the x86_64
8694 run of the "objcopy on compressed debug sections" test for an
8695 example of this. */
8696 SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end);
8697
8698 if (cie->augmentation[0] == 'z')
8699 {
8700 READ_ULEB (augmentation_data_len, start, end);
8701 augmentation_data = start;
8702 /* PR 17512 file: 722-8446-0.004 and PR 22386. */
8703 if (augmentation_data_len > (bfd_size_type) (end - start))
8704 {
8705 warn (_("Augmentation data too long: 0x%s, "
8706 "expected at most %#lx\n"),
8707 dwarf_vmatoa ("x", augmentation_data_len),
8708 (unsigned long) (end - start));
8709 start = end;
8710 augmentation_data = NULL;
8711 augmentation_data_len = 0;
8712 }
8713 start += augmentation_data_len;
8714 }
8715
8716 printf ("\n%08lx %s %s FDE cie=%08lx pc=",
8717 (unsigned long)(saved_start - section_start),
8718 dwarf_vmatoa_1 (NULL, length, fc->ptr_size),
8719 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
8720 (unsigned long)(cie->chunk_start - section_start));
8721
8722 if (fc->segment_size)
8723 printf ("%04lx:", segment_selector);
8724
8725 printf ("%s..%s\n",
8726 dwarf_vmatoa_1 (NULL, fc->pc_begin, fc->ptr_size),
8727 dwarf_vmatoa_1 (NULL, fc->pc_begin + fc->pc_range, fc->ptr_size));
8728
8729 if (! do_debug_frames_interp && augmentation_data_len)
8730 {
8731 display_augmentation_data (augmentation_data, augmentation_data_len);
8732 putchar ('\n');
8733 }
8734 }
8735
8736 /* At this point, fc is the current chunk, cie (if any) is set, and
8737 we're about to interpret instructions for the chunk. */
8738 /* ??? At present we need to do this always, since this sizes the
8739 fc->col_type and fc->col_offset arrays, which we write into always.
8740 We should probably split the interpreted and non-interpreted bits
8741 into two different routines, since there's so much that doesn't
8742 really overlap between them. */
8743 if (1 || do_debug_frames_interp)
8744 {
8745 /* Start by making a pass over the chunk, allocating storage
8746 and taking note of what registers are used. */
8747 unsigned char *tmp = start;
8748
8749 while (start < block_end)
8750 {
8751 unsigned int reg, op, opa;
8752 unsigned long temp;
8753 unsigned char * new_start;
8754
8755 op = *start++;
8756 opa = op & 0x3f;
8757 if (op & 0xc0)
8758 op &= 0xc0;
8759
8760 /* Warning: if you add any more cases to this switch, be
8761 sure to add them to the corresponding switch below. */
8762 switch (op)
8763 {
8764 case DW_CFA_advance_loc:
8765 break;
8766 case DW_CFA_offset:
8767 SKIP_ULEB (start, end);
8768 if (frame_need_space (fc, opa) >= 0)
8769 fc->col_type[opa] = DW_CFA_undefined;
8770 break;
8771 case DW_CFA_restore:
8772 if (frame_need_space (fc, opa) >= 0)
8773 fc->col_type[opa] = DW_CFA_undefined;
8774 break;
8775 case DW_CFA_set_loc:
8776 start += encoded_ptr_size;
8777 break;
8778 case DW_CFA_advance_loc1:
8779 start += 1;
8780 break;
8781 case DW_CFA_advance_loc2:
8782 start += 2;
8783 break;
8784 case DW_CFA_advance_loc4:
8785 start += 4;
8786 break;
8787 case DW_CFA_offset_extended:
8788 case DW_CFA_val_offset:
8789 READ_ULEB (reg, start, end);
8790 SKIP_ULEB (start, end);
8791 if (frame_need_space (fc, reg) >= 0)
8792 fc->col_type[reg] = DW_CFA_undefined;
8793 break;
8794 case DW_CFA_restore_extended:
8795 READ_ULEB (reg, start, end);
8796 if (frame_need_space (fc, reg) >= 0)
8797 fc->col_type[reg] = DW_CFA_undefined;
8798 break;
8799 case DW_CFA_undefined:
8800 READ_ULEB (reg, start, end);
8801 if (frame_need_space (fc, reg) >= 0)
8802 fc->col_type[reg] = DW_CFA_undefined;
8803 break;
8804 case DW_CFA_same_value:
8805 READ_ULEB (reg, start, end);
8806 if (frame_need_space (fc, reg) >= 0)
8807 fc->col_type[reg] = DW_CFA_undefined;
8808 break;
8809 case DW_CFA_register:
8810 READ_ULEB (reg, start, end);
8811 SKIP_ULEB (start, end);
8812 if (frame_need_space (fc, reg) >= 0)
8813 fc->col_type[reg] = DW_CFA_undefined;
8814 break;
8815 case DW_CFA_def_cfa:
8816 SKIP_ULEB (start, end);
8817 SKIP_ULEB (start, end);
8818 break;
8819 case DW_CFA_def_cfa_register:
8820 SKIP_ULEB (start, end);
8821 break;
8822 case DW_CFA_def_cfa_offset:
8823 SKIP_ULEB (start, end);
8824 break;
8825 case DW_CFA_def_cfa_expression:
8826 READ_ULEB (temp, start, end);
8827 new_start = start + temp;
8828 if (new_start < start)
8829 {
8830 warn (_("Corrupt CFA_def expression value: %lu\n"), temp);
8831 start = block_end;
8832 }
8833 else
8834 start = new_start;
8835 break;
8836 case DW_CFA_expression:
8837 case DW_CFA_val_expression:
8838 READ_ULEB (reg, start, end);
8839 READ_ULEB (temp, start, end);
8840 new_start = start + temp;
8841 if (new_start < start)
8842 {
8843 /* PR 17512: file:306-192417-0.005. */
8844 warn (_("Corrupt CFA expression value: %lu\n"), temp);
8845 start = block_end;
8846 }
8847 else
8848 start = new_start;
8849 if (frame_need_space (fc, reg) >= 0)
8850 fc->col_type[reg] = DW_CFA_undefined;
8851 break;
8852 case DW_CFA_offset_extended_sf:
8853 case DW_CFA_val_offset_sf:
8854 READ_ULEB (reg, start, end);
8855 SKIP_SLEB (start, end);
8856 if (frame_need_space (fc, reg) >= 0)
8857 fc->col_type[reg] = DW_CFA_undefined;
8858 break;
8859 case DW_CFA_def_cfa_sf:
8860 SKIP_ULEB (start, end);
8861 SKIP_SLEB (start, end);
8862 break;
8863 case DW_CFA_def_cfa_offset_sf:
8864 SKIP_SLEB (start, end);
8865 break;
8866 case DW_CFA_MIPS_advance_loc8:
8867 start += 8;
8868 break;
8869 case DW_CFA_GNU_args_size:
8870 SKIP_ULEB (start, end);
8871 break;
8872 case DW_CFA_GNU_negative_offset_extended:
8873 READ_ULEB (reg, start, end);
8874 SKIP_ULEB (start, end);
8875 if (frame_need_space (fc, reg) >= 0)
8876 fc->col_type[reg] = DW_CFA_undefined;
8877 break;
8878 default:
8879 break;
8880 }
8881 }
8882 start = tmp;
8883 }
8884
8885 all_nops = TRUE;
8886
8887 /* Now we know what registers are used, make a second pass over
8888 the chunk, this time actually printing out the info. */
8889
8890 while (start < block_end)
8891 {
8892 unsigned char * tmp;
8893 unsigned op, opa;
8894 unsigned long ul, roffs;
8895 /* Note: It is tempting to use an unsigned long for 'reg' but there
8896 are various functions, notably frame_space_needed() that assume that
8897 reg is an unsigned int. */
8898 unsigned int reg;
8899 dwarf_signed_vma l;
8900 dwarf_vma ofs;
8901 dwarf_vma vma;
8902 const char *reg_prefix = "";
8903
8904 op = *start++;
8905 opa = op & 0x3f;
8906 if (op & 0xc0)
8907 op &= 0xc0;
8908
8909 /* Make a note if something other than DW_CFA_nop happens. */
8910 if (op != DW_CFA_nop)
8911 all_nops = FALSE;
8912
8913 /* Warning: if you add any more cases to this switch, be
8914 sure to add them to the corresponding switch above. */
8915 switch (op)
8916 {
8917 case DW_CFA_advance_loc:
8918 if (do_debug_frames_interp)
8919 frame_display_row (fc, &need_col_headers, &max_regs);
8920 else
8921 printf (" DW_CFA_advance_loc: %d to %s\n",
8922 opa * fc->code_factor,
8923 dwarf_vmatoa_1 (NULL,
8924 fc->pc_begin + opa * fc->code_factor,
8925 fc->ptr_size));
8926 fc->pc_begin += opa * fc->code_factor;
8927 break;
8928
8929 case DW_CFA_offset:
8930 READ_ULEB (roffs, start, end);
8931 if (opa >= (unsigned int) fc->ncols)
8932 reg_prefix = bad_reg;
8933 if (! do_debug_frames_interp || *reg_prefix != '\0')
8934 printf (" DW_CFA_offset: %s%s at cfa%+ld\n",
8935 reg_prefix, regname (opa, 0),
8936 roffs * fc->data_factor);
8937 if (*reg_prefix == '\0')
8938 {
8939 fc->col_type[opa] = DW_CFA_offset;
8940 fc->col_offset[opa] = roffs * fc->data_factor;
8941 }
8942 break;
8943
8944 case DW_CFA_restore:
8945 if (opa >= (unsigned int) fc->ncols)
8946 reg_prefix = bad_reg;
8947 if (! do_debug_frames_interp || *reg_prefix != '\0')
8948 printf (" DW_CFA_restore: %s%s\n",
8949 reg_prefix, regname (opa, 0));
8950 if (*reg_prefix != '\0')
8951 break;
8952
8953 if (opa >= (unsigned int) cie->ncols
8954 || (do_debug_frames_interp
8955 && cie->col_type[opa] == DW_CFA_unreferenced))
8956 {
8957 fc->col_type[opa] = DW_CFA_undefined;
8958 fc->col_offset[opa] = 0;
8959 }
8960 else
8961 {
8962 fc->col_type[opa] = cie->col_type[opa];
8963 fc->col_offset[opa] = cie->col_offset[opa];
8964 }
8965 break;
8966
8967 case DW_CFA_set_loc:
8968 vma = get_encoded_value (&start, fc->fde_encoding, section, block_end);
8969 if (do_debug_frames_interp)
8970 frame_display_row (fc, &need_col_headers, &max_regs);
8971 else
8972 printf (" DW_CFA_set_loc: %s\n",
8973 dwarf_vmatoa_1 (NULL, vma, fc->ptr_size));
8974 fc->pc_begin = vma;
8975 break;
8976
8977 case DW_CFA_advance_loc1:
8978 SAFE_BYTE_GET_AND_INC (ofs, start, 1, end);
8979 if (do_debug_frames_interp)
8980 frame_display_row (fc, &need_col_headers, &max_regs);
8981 else
8982 printf (" DW_CFA_advance_loc1: %ld to %s\n",
8983 (unsigned long) (ofs * fc->code_factor),
8984 dwarf_vmatoa_1 (NULL,
8985 fc->pc_begin + ofs * fc->code_factor,
8986 fc->ptr_size));
8987 fc->pc_begin += ofs * fc->code_factor;
8988 break;
8989
8990 case DW_CFA_advance_loc2:
8991 SAFE_BYTE_GET_AND_INC (ofs, start, 2, block_end);
8992 if (do_debug_frames_interp)
8993 frame_display_row (fc, &need_col_headers, &max_regs);
8994 else
8995 printf (" DW_CFA_advance_loc2: %ld to %s\n",
8996 (unsigned long) (ofs * fc->code_factor),
8997 dwarf_vmatoa_1 (NULL,
8998 fc->pc_begin + ofs * fc->code_factor,
8999 fc->ptr_size));
9000 fc->pc_begin += ofs * fc->code_factor;
9001 break;
9002
9003 case DW_CFA_advance_loc4:
9004 SAFE_BYTE_GET_AND_INC (ofs, start, 4, block_end);
9005 if (do_debug_frames_interp)
9006 frame_display_row (fc, &need_col_headers, &max_regs);
9007 else
9008 printf (" DW_CFA_advance_loc4: %ld to %s\n",
9009 (unsigned long) (ofs * fc->code_factor),
9010 dwarf_vmatoa_1 (NULL,
9011 fc->pc_begin + ofs * fc->code_factor,
9012 fc->ptr_size));
9013 fc->pc_begin += ofs * fc->code_factor;
9014 break;
9015
9016 case DW_CFA_offset_extended:
9017 READ_ULEB (reg, start, end);
9018 READ_ULEB (roffs, start, end);
9019 if (reg >= (unsigned int) fc->ncols)
9020 reg_prefix = bad_reg;
9021 if (! do_debug_frames_interp || *reg_prefix != '\0')
9022 printf (" DW_CFA_offset_extended: %s%s at cfa%+ld\n",
9023 reg_prefix, regname (reg, 0),
9024 roffs * fc->data_factor);
9025 if (*reg_prefix == '\0')
9026 {
9027 fc->col_type[reg] = DW_CFA_offset;
9028 fc->col_offset[reg] = roffs * fc->data_factor;
9029 }
9030 break;
9031
9032 case DW_CFA_val_offset:
9033 READ_ULEB (reg, start, end);
9034 READ_ULEB (roffs, start, end);
9035 if (reg >= (unsigned int) fc->ncols)
9036 reg_prefix = bad_reg;
9037 if (! do_debug_frames_interp || *reg_prefix != '\0')
9038 printf (" DW_CFA_val_offset: %s%s is cfa%+ld\n",
9039 reg_prefix, regname (reg, 0),
9040 roffs * fc->data_factor);
9041 if (*reg_prefix == '\0')
9042 {
9043 fc->col_type[reg] = DW_CFA_val_offset;
9044 fc->col_offset[reg] = roffs * fc->data_factor;
9045 }
9046 break;
9047
9048 case DW_CFA_restore_extended:
9049 READ_ULEB (reg, start, end);
9050 if (reg >= (unsigned int) fc->ncols)
9051 reg_prefix = bad_reg;
9052 if (! do_debug_frames_interp || *reg_prefix != '\0')
9053 printf (" DW_CFA_restore_extended: %s%s\n",
9054 reg_prefix, regname (reg, 0));
9055 if (*reg_prefix != '\0')
9056 break;
9057
9058 if (reg >= (unsigned int) cie->ncols)
9059 {
9060 fc->col_type[reg] = DW_CFA_undefined;
9061 fc->col_offset[reg] = 0;
9062 }
9063 else
9064 {
9065 fc->col_type[reg] = cie->col_type[reg];
9066 fc->col_offset[reg] = cie->col_offset[reg];
9067 }
9068 break;
9069
9070 case DW_CFA_undefined:
9071 READ_ULEB (reg, start, end);
9072 if (reg >= (unsigned int) fc->ncols)
9073 reg_prefix = bad_reg;
9074 if (! do_debug_frames_interp || *reg_prefix != '\0')
9075 printf (" DW_CFA_undefined: %s%s\n",
9076 reg_prefix, regname (reg, 0));
9077 if (*reg_prefix == '\0')
9078 {
9079 fc->col_type[reg] = DW_CFA_undefined;
9080 fc->col_offset[reg] = 0;
9081 }
9082 break;
9083
9084 case DW_CFA_same_value:
9085 READ_ULEB (reg, start, end);
9086 if (reg >= (unsigned int) fc->ncols)
9087 reg_prefix = bad_reg;
9088 if (! do_debug_frames_interp || *reg_prefix != '\0')
9089 printf (" DW_CFA_same_value: %s%s\n",
9090 reg_prefix, regname (reg, 0));
9091 if (*reg_prefix == '\0')
9092 {
9093 fc->col_type[reg] = DW_CFA_same_value;
9094 fc->col_offset[reg] = 0;
9095 }
9096 break;
9097
9098 case DW_CFA_register:
9099 READ_ULEB (reg, start, end);
9100 READ_ULEB (roffs, start, end);
9101 if (reg >= (unsigned int) fc->ncols)
9102 reg_prefix = bad_reg;
9103 if (! do_debug_frames_interp || *reg_prefix != '\0')
9104 {
9105 printf (" DW_CFA_register: %s%s in ",
9106 reg_prefix, regname (reg, 0));
9107 puts (regname (roffs, 0));
9108 }
9109 if (*reg_prefix == '\0')
9110 {
9111 fc->col_type[reg] = DW_CFA_register;
9112 fc->col_offset[reg] = roffs;
9113 }
9114 break;
9115
9116 case DW_CFA_remember_state:
9117 if (! do_debug_frames_interp)
9118 printf (" DW_CFA_remember_state\n");
9119 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
9120 rs->cfa_offset = fc->cfa_offset;
9121 rs->cfa_reg = fc->cfa_reg;
9122 rs->ra = fc->ra;
9123 rs->cfa_exp = fc->cfa_exp;
9124 rs->ncols = fc->ncols;
9125 rs->col_type = (short int *) xcmalloc (rs->ncols,
9126 sizeof (* rs->col_type));
9127 rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (* rs->col_offset));
9128 memcpy (rs->col_type, fc->col_type, rs->ncols * sizeof (* fc->col_type));
9129 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (* fc->col_offset));
9130 rs->next = remembered_state;
9131 remembered_state = rs;
9132 break;
9133
9134 case DW_CFA_restore_state:
9135 if (! do_debug_frames_interp)
9136 printf (" DW_CFA_restore_state\n");
9137 rs = remembered_state;
9138 if (rs)
9139 {
9140 remembered_state = rs->next;
9141 fc->cfa_offset = rs->cfa_offset;
9142 fc->cfa_reg = rs->cfa_reg;
9143 fc->ra = rs->ra;
9144 fc->cfa_exp = rs->cfa_exp;
9145 if (frame_need_space (fc, rs->ncols - 1) < 0)
9146 {
9147 warn (_("Invalid column number in saved frame state\n"));
9148 fc->ncols = 0;
9149 break;
9150 }
9151 memcpy (fc->col_type, rs->col_type, rs->ncols * sizeof (* rs->col_type));
9152 memcpy (fc->col_offset, rs->col_offset,
9153 rs->ncols * sizeof (* rs->col_offset));
9154 free (rs->col_type);
9155 free (rs->col_offset);
9156 free (rs);
9157 }
9158 else if (do_debug_frames_interp)
9159 printf ("Mismatched DW_CFA_restore_state\n");
9160 break;
9161
9162 case DW_CFA_def_cfa:
9163 READ_ULEB (fc->cfa_reg, start, end);
9164 READ_ULEB (fc->cfa_offset, start, end);
9165 fc->cfa_exp = 0;
9166 if (! do_debug_frames_interp)
9167 printf (" DW_CFA_def_cfa: %s ofs %d\n",
9168 regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
9169 break;
9170
9171 case DW_CFA_def_cfa_register:
9172 READ_ULEB (fc->cfa_reg, start, end);
9173 fc->cfa_exp = 0;
9174 if (! do_debug_frames_interp)
9175 printf (" DW_CFA_def_cfa_register: %s\n",
9176 regname (fc->cfa_reg, 0));
9177 break;
9178
9179 case DW_CFA_def_cfa_offset:
9180 READ_ULEB (fc->cfa_offset, start, end);
9181 if (! do_debug_frames_interp)
9182 printf (" DW_CFA_def_cfa_offset: %d\n", (int) fc->cfa_offset);
9183 break;
9184
9185 case DW_CFA_nop:
9186 if (! do_debug_frames_interp)
9187 printf (" DW_CFA_nop\n");
9188 break;
9189
9190 case DW_CFA_def_cfa_expression:
9191 READ_ULEB (ul, start, end);
9192 if (start >= block_end || ul > (unsigned long) (block_end - start))
9193 {
9194 printf (_(" DW_CFA_def_cfa_expression: <corrupt len %lu>\n"), ul);
9195 break;
9196 }
9197 if (! do_debug_frames_interp)
9198 {
9199 printf (" DW_CFA_def_cfa_expression (");
9200 decode_location_expression (start, eh_addr_size, 0, -1,
9201 ul, 0, section);
9202 printf (")\n");
9203 }
9204 fc->cfa_exp = 1;
9205 start += ul;
9206 break;
9207
9208 case DW_CFA_expression:
9209 READ_ULEB (reg, start, end);
9210 READ_ULEB (ul, start, end);
9211 if (reg >= (unsigned int) fc->ncols)
9212 reg_prefix = bad_reg;
9213 /* PR 17512: file: 069-133014-0.006. */
9214 /* PR 17512: file: 98c02eb4. */
9215 tmp = start + ul;
9216 if (start >= block_end || tmp > block_end || tmp < start)
9217 {
9218 printf (_(" DW_CFA_expression: <corrupt len %lu>\n"), ul);
9219 break;
9220 }
9221 if (! do_debug_frames_interp || *reg_prefix != '\0')
9222 {
9223 printf (" DW_CFA_expression: %s%s (",
9224 reg_prefix, regname (reg, 0));
9225 decode_location_expression (start, eh_addr_size, 0, -1,
9226 ul, 0, section);
9227 printf (")\n");
9228 }
9229 if (*reg_prefix == '\0')
9230 fc->col_type[reg] = DW_CFA_expression;
9231 start = tmp;
9232 break;
9233
9234 case DW_CFA_val_expression:
9235 READ_ULEB (reg, start, end);
9236 READ_ULEB (ul, start, end);
9237 if (reg >= (unsigned int) fc->ncols)
9238 reg_prefix = bad_reg;
9239 tmp = start + ul;
9240 if (start >= block_end || tmp > block_end || tmp < start)
9241 {
9242 printf (" DW_CFA_val_expression: <corrupt len %lu>\n", ul);
9243 break;
9244 }
9245 if (! do_debug_frames_interp || *reg_prefix != '\0')
9246 {
9247 printf (" DW_CFA_val_expression: %s%s (",
9248 reg_prefix, regname (reg, 0));
9249 decode_location_expression (start, eh_addr_size, 0, -1,
9250 ul, 0, section);
9251 printf (")\n");
9252 }
9253 if (*reg_prefix == '\0')
9254 fc->col_type[reg] = DW_CFA_val_expression;
9255 start = tmp;
9256 break;
9257
9258 case DW_CFA_offset_extended_sf:
9259 READ_ULEB (reg, start, end);
9260 READ_SLEB (l, start, end);
9261 if (frame_need_space (fc, reg) < 0)
9262 reg_prefix = bad_reg;
9263 if (! do_debug_frames_interp || *reg_prefix != '\0')
9264 printf (" DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
9265 reg_prefix, regname (reg, 0),
9266 (long)(l * fc->data_factor));
9267 if (*reg_prefix == '\0')
9268 {
9269 fc->col_type[reg] = DW_CFA_offset;
9270 fc->col_offset[reg] = l * fc->data_factor;
9271 }
9272 break;
9273
9274 case DW_CFA_val_offset_sf:
9275 READ_ULEB (reg, start, end);
9276 READ_SLEB (l, start, end);
9277 if (frame_need_space (fc, reg) < 0)
9278 reg_prefix = bad_reg;
9279 if (! do_debug_frames_interp || *reg_prefix != '\0')
9280 printf (" DW_CFA_val_offset_sf: %s%s is cfa%+ld\n",
9281 reg_prefix, regname (reg, 0),
9282 (long)(l * fc->data_factor));
9283 if (*reg_prefix == '\0')
9284 {
9285 fc->col_type[reg] = DW_CFA_val_offset;
9286 fc->col_offset[reg] = l * fc->data_factor;
9287 }
9288 break;
9289
9290 case DW_CFA_def_cfa_sf:
9291 READ_ULEB (fc->cfa_reg, start, end);
9292 READ_ULEB (fc->cfa_offset, start, end);
9293 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
9294 fc->cfa_exp = 0;
9295 if (! do_debug_frames_interp)
9296 printf (" DW_CFA_def_cfa_sf: %s ofs %d\n",
9297 regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
9298 break;
9299
9300 case DW_CFA_def_cfa_offset_sf:
9301 READ_ULEB (fc->cfa_offset, start, end);
9302 fc->cfa_offset *= fc->data_factor;
9303 if (! do_debug_frames_interp)
9304 printf (" DW_CFA_def_cfa_offset_sf: %d\n", (int) fc->cfa_offset);
9305 break;
9306
9307 case DW_CFA_MIPS_advance_loc8:
9308 SAFE_BYTE_GET_AND_INC (ofs, start, 8, block_end);
9309 if (do_debug_frames_interp)
9310 frame_display_row (fc, &need_col_headers, &max_regs);
9311 else
9312 printf (" DW_CFA_MIPS_advance_loc8: %ld to %s\n",
9313 (unsigned long) (ofs * fc->code_factor),
9314 dwarf_vmatoa_1 (NULL,
9315 fc->pc_begin + ofs * fc->code_factor,
9316 fc->ptr_size));
9317 fc->pc_begin += ofs * fc->code_factor;
9318 break;
9319
9320 case DW_CFA_GNU_window_save:
9321 if (! do_debug_frames_interp)
9322 printf (" DW_CFA_GNU_window_save\n");
9323 break;
9324
9325 case DW_CFA_GNU_args_size:
9326 READ_ULEB (ul, start, end);
9327 if (! do_debug_frames_interp)
9328 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
9329 break;
9330
9331 case DW_CFA_GNU_negative_offset_extended:
9332 READ_ULEB (reg, start, end);
9333 READ_SLEB (l, start, end);
9334 l = - l;
9335 if (frame_need_space (fc, reg) < 0)
9336 reg_prefix = bad_reg;
9337 if (! do_debug_frames_interp || *reg_prefix != '\0')
9338 printf (" DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
9339 reg_prefix, regname (reg, 0),
9340 (long)(l * fc->data_factor));
9341 if (*reg_prefix == '\0')
9342 {
9343 fc->col_type[reg] = DW_CFA_offset;
9344 fc->col_offset[reg] = l * fc->data_factor;
9345 }
9346 break;
9347
9348 default:
9349 if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
9350 printf (_(" DW_CFA_??? (User defined call frame op: %#x)\n"), op);
9351 else
9352 warn (_("Unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
9353 start = block_end;
9354 }
9355 }
9356
9357 /* Interpret the CFA - as long as it is not completely full of NOPs. */
9358 if (do_debug_frames_interp && ! all_nops)
9359 frame_display_row (fc, &need_col_headers, &max_regs);
9360
9361 if (fde_fc.col_type != NULL)
9362 {
9363 free (fde_fc.col_type);
9364 fde_fc.col_type = NULL;
9365 }
9366 if (fde_fc.col_offset != NULL)
9367 {
9368 free (fde_fc.col_offset);
9369 fde_fc.col_offset = NULL;
9370 }
9371
9372 start = block_end;
9373 eh_addr_size = saved_eh_addr_size;
9374 }
9375
9376 printf ("\n");
9377
9378 while (remembered_state != NULL)
9379 {
9380 rs = remembered_state;
9381 remembered_state = rs->next;
9382 free (rs->col_type);
9383 free (rs->col_offset);
9384 rs->next = NULL; /* Paranoia. */
9385 free (rs);
9386 }
9387
9388 while (chunks != NULL)
9389 {
9390 rs = chunks;
9391 chunks = rs->next;
9392 free (rs->col_type);
9393 free (rs->col_offset);
9394 rs->next = NULL; /* Paranoia. */
9395 free (rs);
9396 }
9397
9398 while (forward_refs != NULL)
9399 {
9400 rs = forward_refs;
9401 forward_refs = rs->next;
9402 free (rs->col_type);
9403 free (rs->col_offset);
9404 rs->next = NULL; /* Paranoia. */
9405 free (rs);
9406 }
9407
9408 return 1;
9409 }
9410
9411 #undef GET
9412
9413 static int
9414 display_debug_names (struct dwarf_section *section, void *file)
9415 {
9416 unsigned char *hdrptr = section->start;
9417 dwarf_vma unit_length;
9418 unsigned char *unit_start;
9419 const unsigned char *const section_end = section->start + section->size;
9420 unsigned char *unit_end;
9421
9422 introduce (section, FALSE);
9423
9424 load_debug_section_with_follow (str, file);
9425
9426 for (; hdrptr < section_end; hdrptr = unit_end)
9427 {
9428 unsigned int offset_size;
9429 uint16_t dwarf_version, padding;
9430 uint32_t comp_unit_count, local_type_unit_count, foreign_type_unit_count;
9431 uint32_t bucket_count, name_count, abbrev_table_size;
9432 uint32_t augmentation_string_size;
9433 unsigned int i;
9434 unsigned long sec_off;
9435 bfd_boolean augmentation_printable;
9436 const char *augmentation_string;
9437
9438 unit_start = hdrptr;
9439
9440 /* Get and check the length of the block. */
9441 SAFE_BYTE_GET_AND_INC (unit_length, hdrptr, 4, section_end);
9442
9443 if (unit_length == 0xffffffff)
9444 {
9445 /* This section is 64-bit DWARF. */
9446 SAFE_BYTE_GET_AND_INC (unit_length, hdrptr, 8, section_end);
9447 offset_size = 8;
9448 }
9449 else
9450 offset_size = 4;
9451 unit_end = hdrptr + unit_length;
9452
9453 sec_off = hdrptr - section->start;
9454 if (sec_off + unit_length < sec_off
9455 || sec_off + unit_length > section->size)
9456 {
9457 warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
9458 section->name,
9459 (unsigned long) (unit_start - section->start),
9460 dwarf_vmatoa ("x", unit_length));
9461 return 0;
9462 }
9463
9464 /* Get and check the version number. */
9465 SAFE_BYTE_GET_AND_INC (dwarf_version, hdrptr, 2, unit_end);
9466 printf (_("Version %ld\n"), (long) dwarf_version);
9467
9468 /* Prior versions did not exist, and future versions may not be
9469 backwards compatible. */
9470 if (dwarf_version != 5)
9471 {
9472 warn (_("Only DWARF version 5 .debug_names "
9473 "is currently supported.\n"));
9474 return 0;
9475 }
9476
9477 SAFE_BYTE_GET_AND_INC (padding, hdrptr, 2, unit_end);
9478 if (padding != 0)
9479 warn (_("Padding field of .debug_names must be 0 (found 0x%x)\n"),
9480 padding);
9481
9482 SAFE_BYTE_GET_AND_INC (comp_unit_count, hdrptr, 4, unit_end);
9483 if (comp_unit_count == 0)
9484 warn (_("Compilation unit count must be >= 1 in .debug_names\n"));
9485
9486 SAFE_BYTE_GET_AND_INC (local_type_unit_count, hdrptr, 4, unit_end);
9487 SAFE_BYTE_GET_AND_INC (foreign_type_unit_count, hdrptr, 4, unit_end);
9488 SAFE_BYTE_GET_AND_INC (bucket_count, hdrptr, 4, unit_end);
9489 SAFE_BYTE_GET_AND_INC (name_count, hdrptr, 4, unit_end);
9490 SAFE_BYTE_GET_AND_INC (abbrev_table_size, hdrptr, 4, unit_end);
9491
9492 SAFE_BYTE_GET_AND_INC (augmentation_string_size, hdrptr, 4, unit_end);
9493 if (augmentation_string_size % 4 != 0)
9494 {
9495 warn (_("Augmentation string length %u must be rounded up "
9496 "to a multiple of 4 in .debug_names.\n"),
9497 augmentation_string_size);
9498 augmentation_string_size += (-augmentation_string_size) & 3;
9499 }
9500
9501 printf (_("Augmentation string:"));
9502
9503 augmentation_printable = TRUE;
9504 augmentation_string = (const char *) hdrptr;
9505
9506 for (i = 0; i < augmentation_string_size; i++)
9507 {
9508 unsigned char uc;
9509
9510 SAFE_BYTE_GET_AND_INC (uc, hdrptr, 1, unit_end);
9511 printf (" %02x", uc);
9512
9513 if (uc != 0 && !ISPRINT (uc))
9514 augmentation_printable = FALSE;
9515 }
9516
9517 if (augmentation_printable)
9518 {
9519 printf (" (\"");
9520 for (i = 0;
9521 i < augmentation_string_size && augmentation_string[i];
9522 ++i)
9523 putchar (augmentation_string[i]);
9524 printf ("\")");
9525 }
9526 putchar ('\n');
9527
9528 printf (_("CU table:\n"));
9529 for (i = 0; i < comp_unit_count; i++)
9530 {
9531 uint64_t cu_offset;
9532
9533 SAFE_BYTE_GET_AND_INC (cu_offset, hdrptr, offset_size, unit_end);
9534 printf (_("[%3u] 0x%lx\n"), i, (unsigned long) cu_offset);
9535 }
9536 putchar ('\n');
9537
9538 printf (_("TU table:\n"));
9539 for (i = 0; i < local_type_unit_count; i++)
9540 {
9541 uint64_t tu_offset;
9542
9543 SAFE_BYTE_GET_AND_INC (tu_offset, hdrptr, offset_size, unit_end);
9544 printf (_("[%3u] 0x%lx\n"), i, (unsigned long) tu_offset);
9545 }
9546 putchar ('\n');
9547
9548 printf (_("Foreign TU table:\n"));
9549 for (i = 0; i < foreign_type_unit_count; i++)
9550 {
9551 uint64_t signature;
9552
9553 SAFE_BYTE_GET_AND_INC (signature, hdrptr, 8, unit_end);
9554 printf (_("[%3u] "), i);
9555 print_dwarf_vma (signature, 8);
9556 putchar ('\n');
9557 }
9558 putchar ('\n');
9559
9560 const uint32_t *const hash_table_buckets = (uint32_t *) hdrptr;
9561 hdrptr += bucket_count * sizeof (uint32_t);
9562 const uint32_t *const hash_table_hashes = (uint32_t *) hdrptr;
9563 hdrptr += name_count * sizeof (uint32_t);
9564 unsigned char *const name_table_string_offsets = hdrptr;
9565 hdrptr += name_count * offset_size;
9566 unsigned char *const name_table_entry_offsets = hdrptr;
9567 hdrptr += name_count * offset_size;
9568 unsigned char *const abbrev_table = hdrptr;
9569 hdrptr += abbrev_table_size;
9570 const unsigned char *const abbrev_table_end = hdrptr;
9571 unsigned char *const entry_pool = hdrptr;
9572 if (hdrptr > unit_end)
9573 {
9574 warn (_("Entry pool offset (0x%lx) exceeds unit size 0x%lx "
9575 "for unit 0x%lx in the debug_names\n"),
9576 (long) (hdrptr - section->start),
9577 (long) (unit_end - section->start),
9578 (long) (unit_start - section->start));
9579 return 0;
9580 }
9581
9582 size_t buckets_filled = 0;
9583 size_t bucketi;
9584 for (bucketi = 0; bucketi < bucket_count; bucketi++)
9585 {
9586 const uint32_t bucket = hash_table_buckets[bucketi];
9587
9588 if (bucket != 0)
9589 ++buckets_filled;
9590 }
9591 printf (ngettext ("Used %zu of %lu bucket.\n",
9592 "Used %zu of %lu buckets.\n",
9593 bucket_count),
9594 buckets_filled, (unsigned long) bucket_count);
9595
9596 uint32_t hash_prev = 0;
9597 size_t hash_clash_count = 0;
9598 size_t longest_clash = 0;
9599 size_t this_length = 0;
9600 size_t hashi;
9601 for (hashi = 0; hashi < name_count; hashi++)
9602 {
9603 const uint32_t hash_this = hash_table_hashes[hashi];
9604
9605 if (hashi > 0)
9606 {
9607 if (hash_prev % bucket_count == hash_this % bucket_count)
9608 {
9609 ++hash_clash_count;
9610 ++this_length;
9611 longest_clash = MAX (longest_clash, this_length);
9612 }
9613 else
9614 this_length = 0;
9615 }
9616 hash_prev = hash_this;
9617 }
9618 printf (_("Out of %lu items there are %zu bucket clashes"
9619 " (longest of %zu entries).\n"),
9620 (unsigned long) name_count, hash_clash_count, longest_clash);
9621 assert (name_count == buckets_filled + hash_clash_count);
9622
9623 struct abbrev_lookup_entry
9624 {
9625 dwarf_vma abbrev_tag;
9626 unsigned char *abbrev_lookup_ptr;
9627 };
9628 struct abbrev_lookup_entry *abbrev_lookup = NULL;
9629 size_t abbrev_lookup_used = 0;
9630 size_t abbrev_lookup_allocated = 0;
9631
9632 unsigned char *abbrevptr = abbrev_table;
9633 for (;;)
9634 {
9635 dwarf_vma abbrev_tag;
9636
9637 READ_ULEB (abbrev_tag, abbrevptr, abbrev_table_end);
9638 if (abbrev_tag == 0)
9639 break;
9640 if (abbrev_lookup_used == abbrev_lookup_allocated)
9641 {
9642 abbrev_lookup_allocated = MAX (0x100,
9643 abbrev_lookup_allocated * 2);
9644 abbrev_lookup = xrealloc (abbrev_lookup,
9645 (abbrev_lookup_allocated
9646 * sizeof (*abbrev_lookup)));
9647 }
9648 assert (abbrev_lookup_used < abbrev_lookup_allocated);
9649 struct abbrev_lookup_entry *entry;
9650 for (entry = abbrev_lookup;
9651 entry < abbrev_lookup + abbrev_lookup_used;
9652 entry++)
9653 if (entry->abbrev_tag == abbrev_tag)
9654 {
9655 warn (_("Duplicate abbreviation tag %lu "
9656 "in unit 0x%lx in the debug_names\n"),
9657 (long) abbrev_tag, (long) (unit_start - section->start));
9658 break;
9659 }
9660 entry = &abbrev_lookup[abbrev_lookup_used++];
9661 entry->abbrev_tag = abbrev_tag;
9662 entry->abbrev_lookup_ptr = abbrevptr;
9663
9664 /* Skip DWARF tag. */
9665 SKIP_ULEB (abbrevptr, abbrev_table_end);
9666 for (;;)
9667 {
9668 dwarf_vma xindex, form;
9669
9670 READ_ULEB (xindex, abbrevptr, abbrev_table_end);
9671 READ_ULEB (form, abbrevptr, abbrev_table_end);
9672 if (xindex == 0 && form == 0)
9673 break;
9674 }
9675 }
9676
9677 printf (_("\nSymbol table:\n"));
9678 uint32_t namei;
9679 for (namei = 0; namei < name_count; ++namei)
9680 {
9681 uint64_t string_offset, entry_offset;
9682
9683 SAFE_BYTE_GET (string_offset,
9684 name_table_string_offsets + namei * offset_size,
9685 offset_size, unit_end);
9686 SAFE_BYTE_GET (entry_offset,
9687 name_table_entry_offsets + namei * offset_size,
9688 offset_size, unit_end);
9689
9690 printf ("[%3u] #%08x %s:", namei, hash_table_hashes[namei],
9691 fetch_indirect_string (string_offset));
9692
9693 unsigned char *entryptr = entry_pool + entry_offset;
9694
9695 /* We need to scan first whether there is a single or multiple
9696 entries. TAGNO is -2 for the first entry, it is -1 for the
9697 initial tag read of the second entry, then it becomes 0 for the
9698 first entry for real printing etc. */
9699 int tagno = -2;
9700 /* Initialize it due to a false compiler warning. */
9701 dwarf_vma second_abbrev_tag = -1;
9702 for (;;)
9703 {
9704 dwarf_vma abbrev_tag;
9705 dwarf_vma dwarf_tag;
9706 const struct abbrev_lookup_entry *entry;
9707
9708 READ_ULEB (abbrev_tag, entryptr, unit_end);
9709 if (tagno == -1)
9710 {
9711 second_abbrev_tag = abbrev_tag;
9712 tagno = 0;
9713 entryptr = entry_pool + entry_offset;
9714 continue;
9715 }
9716 if (abbrev_tag == 0)
9717 break;
9718 if (tagno >= 0)
9719 printf ("%s<%lu>",
9720 (tagno == 0 && second_abbrev_tag == 0 ? " " : "\n\t"),
9721 (unsigned long) abbrev_tag);
9722
9723 for (entry = abbrev_lookup;
9724 entry < abbrev_lookup + abbrev_lookup_used;
9725 entry++)
9726 if (entry->abbrev_tag == abbrev_tag)
9727 break;
9728 if (entry >= abbrev_lookup + abbrev_lookup_used)
9729 {
9730 warn (_("Undefined abbreviation tag %lu "
9731 "in unit 0x%lx in the debug_names\n"),
9732 (long) abbrev_tag,
9733 (long) (unit_start - section->start));
9734 break;
9735 }
9736 abbrevptr = entry->abbrev_lookup_ptr;
9737 READ_ULEB (dwarf_tag, abbrevptr, abbrev_table_end);
9738 if (tagno >= 0)
9739 printf (" %s", get_TAG_name (dwarf_tag));
9740 for (;;)
9741 {
9742 dwarf_vma xindex, form;
9743
9744 READ_ULEB (xindex, abbrevptr, abbrev_table_end);
9745 READ_ULEB (form, abbrevptr, abbrev_table_end);
9746 if (xindex == 0 && form == 0)
9747 break;
9748
9749 if (tagno >= 0)
9750 printf (" %s", get_IDX_name (xindex));
9751 entryptr = read_and_display_attr_value (0, form, 0,
9752 unit_start, entryptr, unit_end,
9753 0, 0, offset_size,
9754 dwarf_version, NULL,
9755 (tagno < 0), NULL,
9756 NULL, '=', -1);
9757 }
9758 ++tagno;
9759 }
9760 if (tagno <= 0)
9761 printf (_(" <no entries>"));
9762 putchar ('\n');
9763 }
9764
9765 free (abbrev_lookup);
9766 }
9767
9768 return 1;
9769 }
9770
9771 static int
9772 display_debug_links (struct dwarf_section * section,
9773 void * file ATTRIBUTE_UNUSED)
9774 {
9775 const unsigned char * filename;
9776 unsigned int filelen;
9777
9778 introduce (section, FALSE);
9779
9780 /* The .gnu_debuglink section is formatted as:
9781 (c-string) Filename.
9782 (padding) If needed to reach a 4 byte boundary.
9783 (uint32_t) CRC32 value.
9784
9785 The .gun_debugaltlink section is formatted as:
9786 (c-string) Filename.
9787 (binary) Build-ID. */
9788
9789 filename = section->start;
9790 filelen = strnlen ((const char *) filename, section->size);
9791 if (filelen == section->size)
9792 {
9793 warn (_("The debuglink filename is corrupt/missing\n"));
9794 return 0;
9795 }
9796
9797 printf (_(" Separate debug info file: %s\n"), filename);
9798
9799 if (const_strneq (section->name, ".gnu_debuglink"))
9800 {
9801 unsigned int crc32;
9802 unsigned int crc_offset;
9803
9804 crc_offset = filelen + 1;
9805 crc_offset = (crc_offset + 3) & ~3;
9806 if (crc_offset + 4 > section->size)
9807 {
9808 warn (_("CRC offset missing/truncated\n"));
9809 return 0;
9810 }
9811
9812 crc32 = byte_get (filename + crc_offset, 4);
9813
9814 printf (_(" CRC value: %#x\n"), crc32);
9815
9816 if (crc_offset + 4 < section->size)
9817 {
9818 warn (_("There are %#lx extraneous bytes at the end of the section\n"),
9819 (long)(section->size - (crc_offset + 4)));
9820 return 0;
9821 }
9822 }
9823 else /* const_strneq (section->name, ".gnu_debugaltlink") */
9824 {
9825 const unsigned char * build_id = section->start + filelen + 1;
9826 bfd_size_type build_id_len = section->size - (filelen + 1);
9827 bfd_size_type printed;
9828
9829 /* FIXME: Should we support smaller build-id notes ? */
9830 if (build_id_len < 0x14)
9831 {
9832 warn (_("Build-ID is too short (%#lx bytes)\n"), (long) build_id_len);
9833 return 0;
9834 }
9835
9836 printed = printf (_(" Build-ID (%#lx bytes):"), (long) build_id_len);
9837 display_data (printed, build_id, build_id_len);
9838 putchar ('\n');
9839 }
9840
9841 putchar ('\n');
9842 return 1;
9843 }
9844
9845 static int
9846 display_gdb_index (struct dwarf_section *section,
9847 void *file ATTRIBUTE_UNUSED)
9848 {
9849 unsigned char *start = section->start;
9850 uint32_t version;
9851 uint32_t cu_list_offset, tu_list_offset;
9852 uint32_t address_table_offset, symbol_table_offset, constant_pool_offset;
9853 unsigned int cu_list_elements, tu_list_elements;
9854 unsigned int address_table_size, symbol_table_slots;
9855 unsigned char *cu_list, *tu_list;
9856 unsigned char *address_table, *symbol_table, *constant_pool;
9857 unsigned int i;
9858
9859 /* The documentation for the format of this file is in gdb/dwarf2read.c. */
9860
9861 introduce (section, FALSE);
9862
9863 if (section->size < 6 * sizeof (uint32_t))
9864 {
9865 warn (_("Truncated header in the %s section.\n"), section->name);
9866 return 0;
9867 }
9868
9869 version = byte_get_little_endian (start, 4);
9870 printf (_("Version %ld\n"), (long) version);
9871
9872 /* Prior versions are obsolete, and future versions may not be
9873 backwards compatible. */
9874 if (version < 3 || version > 8)
9875 {
9876 warn (_("Unsupported version %lu.\n"), (unsigned long) version);
9877 return 0;
9878 }
9879 if (version < 4)
9880 warn (_("The address table data in version 3 may be wrong.\n"));
9881 if (version < 5)
9882 warn (_("Version 4 does not support case insensitive lookups.\n"));
9883 if (version < 6)
9884 warn (_("Version 5 does not include inlined functions.\n"));
9885 if (version < 7)
9886 warn (_("Version 6 does not include symbol attributes.\n"));
9887 /* Version 7 indices generated by Gold have bad type unit references,
9888 PR binutils/15021. But we don't know if the index was generated by
9889 Gold or not, so to avoid worrying users with gdb-generated indices
9890 we say nothing for version 7 here. */
9891
9892 cu_list_offset = byte_get_little_endian (start + 4, 4);
9893 tu_list_offset = byte_get_little_endian (start + 8, 4);
9894 address_table_offset = byte_get_little_endian (start + 12, 4);
9895 symbol_table_offset = byte_get_little_endian (start + 16, 4);
9896 constant_pool_offset = byte_get_little_endian (start + 20, 4);
9897
9898 if (cu_list_offset > section->size
9899 || tu_list_offset > section->size
9900 || address_table_offset > section->size
9901 || symbol_table_offset > section->size
9902 || constant_pool_offset > section->size)
9903 {
9904 warn (_("Corrupt header in the %s section.\n"), section->name);
9905 return 0;
9906 }
9907
9908 /* PR 17531: file: 418d0a8a. */
9909 if (tu_list_offset < cu_list_offset)
9910 {
9911 warn (_("TU offset (%x) is less than CU offset (%x)\n"),
9912 tu_list_offset, cu_list_offset);
9913 return 0;
9914 }
9915
9916 cu_list_elements = (tu_list_offset - cu_list_offset) / 8;
9917
9918 if (address_table_offset < tu_list_offset)
9919 {
9920 warn (_("Address table offset (%x) is less than TU offset (%x)\n"),
9921 address_table_offset, tu_list_offset);
9922 return 0;
9923 }
9924
9925 tu_list_elements = (address_table_offset - tu_list_offset) / 8;
9926
9927 /* PR 17531: file: 18a47d3d. */
9928 if (symbol_table_offset < address_table_offset)
9929 {
9930 warn (_("Symbol table offset (%x) is less then Address table offset (%x)\n"),
9931 symbol_table_offset, address_table_offset);
9932 return 0;
9933 }
9934
9935 address_table_size = symbol_table_offset - address_table_offset;
9936
9937 if (constant_pool_offset < symbol_table_offset)
9938 {
9939 warn (_("Constant pool offset (%x) is less than symbol table offset (%x)\n"),
9940 constant_pool_offset, symbol_table_offset);
9941 return 0;
9942 }
9943
9944 symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8;
9945
9946 cu_list = start + cu_list_offset;
9947 tu_list = start + tu_list_offset;
9948 address_table = start + address_table_offset;
9949 symbol_table = start + symbol_table_offset;
9950 constant_pool = start + constant_pool_offset;
9951
9952 if (address_table + address_table_size > section->start + section->size)
9953 {
9954 warn (_("Address table extends beyond end of section.\n"));
9955 return 0;
9956 }
9957
9958 printf (_("\nCU table:\n"));
9959 for (i = 0; i < cu_list_elements; i += 2)
9960 {
9961 uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8);
9962 uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8);
9963
9964 printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2,
9965 (unsigned long) cu_offset,
9966 (unsigned long) (cu_offset + cu_length - 1));
9967 }
9968
9969 printf (_("\nTU table:\n"));
9970 for (i = 0; i < tu_list_elements; i += 3)
9971 {
9972 uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8);
9973 uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8);
9974 uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8);
9975
9976 printf (_("[%3u] 0x%lx 0x%lx "), i / 3,
9977 (unsigned long) tu_offset,
9978 (unsigned long) type_offset);
9979 print_dwarf_vma (signature, 8);
9980 printf ("\n");
9981 }
9982
9983 printf (_("\nAddress table:\n"));
9984 for (i = 0; i < address_table_size && i <= address_table_size - (2 * 8 + 4);
9985 i += 2 * 8 + 4)
9986 {
9987 uint64_t low = byte_get_little_endian (address_table + i, 8);
9988 uint64_t high = byte_get_little_endian (address_table + i + 8, 8);
9989 uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4);
9990
9991 print_dwarf_vma (low, 8);
9992 print_dwarf_vma (high, 8);
9993 printf (_("%lu\n"), (unsigned long) cu_index);
9994 }
9995
9996 printf (_("\nSymbol table:\n"));
9997 for (i = 0; i < symbol_table_slots; ++i)
9998 {
9999 uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4);
10000 uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4);
10001 uint32_t num_cus, cu;
10002
10003 if (name_offset != 0
10004 || cu_vector_offset != 0)
10005 {
10006 unsigned int j;
10007 unsigned char * adr;
10008
10009 adr = constant_pool + name_offset;
10010 /* PR 17531: file: 5b7b07ad. */
10011 if (adr < constant_pool || adr >= section->start + section->size)
10012 {
10013 printf (_("[%3u] <corrupt offset: %x>"), i, name_offset);
10014 warn (_("Corrupt name offset of 0x%x found for symbol table slot %d\n"),
10015 name_offset, i);
10016 }
10017 else
10018 printf ("[%3u] %.*s:", i,
10019 (int) (section->size - (constant_pool_offset + name_offset)),
10020 constant_pool + name_offset);
10021
10022 adr = constant_pool + cu_vector_offset;
10023 if (adr < constant_pool || adr >= section->start + section->size - 3)
10024 {
10025 printf (_("<invalid CU vector offset: %x>\n"), cu_vector_offset);
10026 warn (_("Corrupt CU vector offset of 0x%x found for symbol table slot %d\n"),
10027 cu_vector_offset, i);
10028 continue;
10029 }
10030
10031 num_cus = byte_get_little_endian (adr, 4);
10032
10033 adr = constant_pool + cu_vector_offset + 4 + num_cus * 4;
10034 if (num_cus * 4 < num_cus
10035 || adr >= section->start + section->size
10036 || adr < constant_pool)
10037 {
10038 printf ("<invalid number of CUs: %d>\n", num_cus);
10039 warn (_("Invalid number of CUs (0x%x) for symbol table slot %d\n"),
10040 num_cus, i);
10041 continue;
10042 }
10043
10044 if (num_cus > 1)
10045 printf ("\n");
10046
10047 for (j = 0; j < num_cus; ++j)
10048 {
10049 int is_static;
10050 gdb_index_symbol_kind kind;
10051
10052 cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4);
10053 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu);
10054 kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu);
10055 cu = GDB_INDEX_CU_VALUE (cu);
10056 /* Convert to TU number if it's for a type unit. */
10057 if (cu >= cu_list_elements / 2)
10058 printf ("%cT%lu", num_cus > 1 ? '\t' : ' ',
10059 (unsigned long) (cu - cu_list_elements / 2));
10060 else
10061 printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu);
10062
10063 printf (" [%s, %s]",
10064 is_static ? _("static") : _("global"),
10065 get_gdb_index_symbol_kind_name (kind));
10066 if (num_cus > 1)
10067 printf ("\n");
10068 }
10069 if (num_cus <= 1)
10070 printf ("\n");
10071 }
10072 }
10073
10074 return 1;
10075 }
10076
10077 /* Pre-allocate enough space for the CU/TU sets needed. */
10078
10079 static void
10080 prealloc_cu_tu_list (unsigned int nshndx)
10081 {
10082 if (shndx_pool == NULL)
10083 {
10084 shndx_pool_size = nshndx;
10085 shndx_pool_used = 0;
10086 shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size,
10087 sizeof (unsigned int));
10088 }
10089 else
10090 {
10091 shndx_pool_size = shndx_pool_used + nshndx;
10092 shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size,
10093 sizeof (unsigned int));
10094 }
10095 }
10096
10097 static void
10098 add_shndx_to_cu_tu_entry (unsigned int shndx)
10099 {
10100 if (shndx_pool_used >= shndx_pool_size)
10101 {
10102 error (_("Internal error: out of space in the shndx pool.\n"));
10103 return;
10104 }
10105 shndx_pool [shndx_pool_used++] = shndx;
10106 }
10107
10108 static void
10109 end_cu_tu_entry (void)
10110 {
10111 if (shndx_pool_used >= shndx_pool_size)
10112 {
10113 error (_("Internal error: out of space in the shndx pool.\n"));
10114 return;
10115 }
10116 shndx_pool [shndx_pool_used++] = 0;
10117 }
10118
10119 /* Return the short name of a DWARF section given by a DW_SECT enumerator. */
10120
10121 static const char *
10122 get_DW_SECT_short_name (unsigned int dw_sect)
10123 {
10124 static char buf[16];
10125
10126 switch (dw_sect)
10127 {
10128 case DW_SECT_INFO:
10129 return "info";
10130 case DW_SECT_TYPES:
10131 return "types";
10132 case DW_SECT_ABBREV:
10133 return "abbrev";
10134 case DW_SECT_LINE:
10135 return "line";
10136 case DW_SECT_LOC:
10137 return "loc";
10138 case DW_SECT_STR_OFFSETS:
10139 return "str_off";
10140 case DW_SECT_MACINFO:
10141 return "macinfo";
10142 case DW_SECT_MACRO:
10143 return "macro";
10144 default:
10145 break;
10146 }
10147
10148 snprintf (buf, sizeof (buf), "%d", dw_sect);
10149 return buf;
10150 }
10151
10152 /* Process a CU or TU index. If DO_DISPLAY is true, print the contents.
10153 These sections are extensions for Fission.
10154 See http://gcc.gnu.org/wiki/DebugFissionDWP. */
10155
10156 static int
10157 process_cu_tu_index (struct dwarf_section *section, int do_display)
10158 {
10159 unsigned char *phdr = section->start;
10160 unsigned char *limit = phdr + section->size;
10161 unsigned char *phash;
10162 unsigned char *pindex;
10163 unsigned char *ppool;
10164 unsigned int version;
10165 unsigned int ncols = 0;
10166 unsigned int nused;
10167 unsigned int nslots;
10168 unsigned int i;
10169 unsigned int j;
10170 dwarf_vma signature_high;
10171 dwarf_vma signature_low;
10172 char buf[64];
10173
10174 /* PR 17512: file: 002-168123-0.004. */
10175 if (phdr == NULL)
10176 {
10177 warn (_("Section %s is empty\n"), section->name);
10178 return 0;
10179 }
10180 /* PR 17512: file: 002-376-0.004. */
10181 if (section->size < 24)
10182 {
10183 warn (_("Section %s is too small to contain a CU/TU header\n"),
10184 section->name);
10185 return 0;
10186 }
10187
10188 SAFE_BYTE_GET (version, phdr, 4, limit);
10189 if (version >= 2)
10190 SAFE_BYTE_GET (ncols, phdr + 4, 4, limit);
10191 SAFE_BYTE_GET (nused, phdr + 8, 4, limit);
10192 SAFE_BYTE_GET (nslots, phdr + 12, 4, limit);
10193
10194 phash = phdr + 16;
10195 pindex = phash + (size_t) nslots * 8;
10196 ppool = pindex + (size_t) nslots * 4;
10197
10198 if (do_display)
10199 {
10200 introduce (section, FALSE);
10201
10202 printf (_(" Version: %u\n"), version);
10203 if (version >= 2)
10204 printf (_(" Number of columns: %u\n"), ncols);
10205 printf (_(" Number of used entries: %u\n"), nused);
10206 printf (_(" Number of slots: %u\n\n"), nslots);
10207 }
10208
10209 /* PR 17531: file: 45d69832. */
10210 if ((size_t) nslots * 8 / 8 != nslots
10211 || phash < phdr || phash > limit
10212 || pindex < phash || pindex > limit
10213 || ppool < pindex || ppool > limit)
10214 {
10215 warn (ngettext ("Section %s is too small for %u slot\n",
10216 "Section %s is too small for %u slots\n",
10217 nslots),
10218 section->name, nslots);
10219 return 0;
10220 }
10221
10222 if (version == 1)
10223 {
10224 if (!do_display)
10225 prealloc_cu_tu_list ((limit - ppool) / 4);
10226 for (i = 0; i < nslots; i++)
10227 {
10228 unsigned char *shndx_list;
10229 unsigned int shndx;
10230
10231 SAFE_BYTE_GET64 (phash, &signature_high, &signature_low, limit);
10232 if (signature_high != 0 || signature_low != 0)
10233 {
10234 SAFE_BYTE_GET (j, pindex, 4, limit);
10235 shndx_list = ppool + j * 4;
10236 /* PR 17531: file: 705e010d. */
10237 if (shndx_list < ppool)
10238 {
10239 warn (_("Section index pool located before start of section\n"));
10240 return 0;
10241 }
10242
10243 if (do_display)
10244 printf (_(" [%3d] Signature: 0x%s Sections: "),
10245 i, dwarf_vmatoa64 (signature_high, signature_low,
10246 buf, sizeof (buf)));
10247 for (;;)
10248 {
10249 if (shndx_list >= limit)
10250 {
10251 warn (_("Section %s too small for shndx pool\n"),
10252 section->name);
10253 return 0;
10254 }
10255 SAFE_BYTE_GET (shndx, shndx_list, 4, limit);
10256 if (shndx == 0)
10257 break;
10258 if (do_display)
10259 printf (" %d", shndx);
10260 else
10261 add_shndx_to_cu_tu_entry (shndx);
10262 shndx_list += 4;
10263 }
10264 if (do_display)
10265 printf ("\n");
10266 else
10267 end_cu_tu_entry ();
10268 }
10269 phash += 8;
10270 pindex += 4;
10271 }
10272 }
10273 else if (version == 2)
10274 {
10275 unsigned int val;
10276 unsigned int dw_sect;
10277 unsigned char *ph = phash;
10278 unsigned char *pi = pindex;
10279 unsigned char *poffsets = ppool + (size_t) ncols * 4;
10280 unsigned char *psizes = poffsets + (size_t) nused * ncols * 4;
10281 unsigned char *pend = psizes + (size_t) nused * ncols * 4;
10282 bfd_boolean is_tu_index;
10283 struct cu_tu_set *this_set = NULL;
10284 unsigned int row;
10285 unsigned char *prow;
10286
10287 is_tu_index = strcmp (section->name, ".debug_tu_index") == 0;
10288
10289 /* PR 17531: file: 0dd159bf.
10290 Check for integer overflow (can occur when size_t is 32-bit)
10291 with overlarge ncols or nused values. */
10292 if (ncols > 0
10293 && ((size_t) ncols * 4 / 4 != ncols
10294 || (size_t) nused * ncols * 4 / ((size_t) ncols * 4) != nused
10295 || poffsets < ppool || poffsets > limit
10296 || psizes < poffsets || psizes > limit
10297 || pend < psizes || pend > limit))
10298 {
10299 warn (_("Section %s too small for offset and size tables\n"),
10300 section->name);
10301 return 0;
10302 }
10303
10304 if (do_display)
10305 {
10306 printf (_(" Offset table\n"));
10307 printf (" slot %-16s ",
10308 is_tu_index ? _("signature") : _("dwo_id"));
10309 }
10310 else
10311 {
10312 if (is_tu_index)
10313 {
10314 tu_count = nused;
10315 tu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
10316 this_set = tu_sets;
10317 }
10318 else
10319 {
10320 cu_count = nused;
10321 cu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
10322 this_set = cu_sets;
10323 }
10324 }
10325
10326 if (do_display)
10327 {
10328 for (j = 0; j < ncols; j++)
10329 {
10330 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
10331 printf (" %8s", get_DW_SECT_short_name (dw_sect));
10332 }
10333 printf ("\n");
10334 }
10335
10336 for (i = 0; i < nslots; i++)
10337 {
10338 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
10339
10340 SAFE_BYTE_GET (row, pi, 4, limit);
10341 if (row != 0)
10342 {
10343 /* PR 17531: file: a05f6ab3. */
10344 if (row > nused)
10345 {
10346 warn (_("Row index (%u) is larger than number of used entries (%u)\n"),
10347 row, nused);
10348 return 0;
10349 }
10350
10351 if (!do_display)
10352 {
10353 size_t num_copy = sizeof (uint64_t);
10354
10355 /* PR 23064: Beware of buffer overflow. */
10356 if (ph + num_copy < limit)
10357 memcpy (&this_set[row - 1].signature, ph, num_copy);
10358 else
10359 {
10360 warn (_("Signature (%p) extends beyond end of space in section\n"), ph);
10361 return 0;
10362 }
10363 }
10364
10365 prow = poffsets + (row - 1) * ncols * 4;
10366 /* PR 17531: file: b8ce60a8. */
10367 if (prow < poffsets || prow > limit)
10368 {
10369 warn (_("Row index (%u) * num columns (%u) > space remaining in section\n"),
10370 row, ncols);
10371 return 0;
10372 }
10373
10374 if (do_display)
10375 printf (_(" [%3d] 0x%s"),
10376 i, dwarf_vmatoa64 (signature_high, signature_low,
10377 buf, sizeof (buf)));
10378 for (j = 0; j < ncols; j++)
10379 {
10380 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
10381 if (do_display)
10382 printf (" %8d", val);
10383 else
10384 {
10385 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
10386
10387 /* PR 17531: file: 10796eb3. */
10388 if (dw_sect >= DW_SECT_MAX)
10389 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
10390 else
10391 this_set [row - 1].section_offsets [dw_sect] = val;
10392 }
10393 }
10394
10395 if (do_display)
10396 printf ("\n");
10397 }
10398 ph += 8;
10399 pi += 4;
10400 }
10401
10402 ph = phash;
10403 pi = pindex;
10404 if (do_display)
10405 {
10406 printf ("\n");
10407 printf (_(" Size table\n"));
10408 printf (" slot %-16s ",
10409 is_tu_index ? _("signature") : _("dwo_id"));
10410 }
10411
10412 for (j = 0; j < ncols; j++)
10413 {
10414 SAFE_BYTE_GET (val, ppool + j * 4, 4, limit);
10415 if (do_display)
10416 printf (" %8s", get_DW_SECT_short_name (val));
10417 }
10418
10419 if (do_display)
10420 printf ("\n");
10421
10422 for (i = 0; i < nslots; i++)
10423 {
10424 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
10425
10426 SAFE_BYTE_GET (row, pi, 4, limit);
10427 if (row != 0)
10428 {
10429 prow = psizes + (row - 1) * ncols * 4;
10430
10431 if (do_display)
10432 printf (_(" [%3d] 0x%s"),
10433 i, dwarf_vmatoa64 (signature_high, signature_low,
10434 buf, sizeof (buf)));
10435
10436 for (j = 0; j < ncols; j++)
10437 {
10438 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
10439 if (do_display)
10440 printf (" %8d", val);
10441 else
10442 {
10443 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
10444 if (dw_sect >= DW_SECT_MAX)
10445 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
10446 else
10447 this_set [row - 1].section_sizes [dw_sect] = val;
10448 }
10449 }
10450
10451 if (do_display)
10452 printf ("\n");
10453 }
10454
10455 ph += 8;
10456 pi += 4;
10457 }
10458 }
10459 else if (do_display)
10460 printf (_(" Unsupported version (%d)\n"), version);
10461
10462 if (do_display)
10463 printf ("\n");
10464
10465 return 1;
10466 }
10467
10468 static int cu_tu_indexes_read = -1; /* Tri-state variable. */
10469
10470 /* Load the CU and TU indexes if present. This will build a list of
10471 section sets that we can use to associate a .debug_info.dwo section
10472 with its associated .debug_abbrev.dwo section in a .dwp file. */
10473
10474 static bfd_boolean
10475 load_cu_tu_indexes (void *file)
10476 {
10477 /* If we have already loaded (or tried to load) the CU and TU indexes
10478 then do not bother to repeat the task. */
10479 if (cu_tu_indexes_read == -1)
10480 {
10481 cu_tu_indexes_read = TRUE;
10482
10483 if (load_debug_section_with_follow (dwp_cu_index, file))
10484 if (! process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0))
10485 cu_tu_indexes_read = FALSE;
10486
10487 if (load_debug_section_with_follow (dwp_tu_index, file))
10488 if (! process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0))
10489 cu_tu_indexes_read = FALSE;
10490 }
10491
10492 return (bfd_boolean) cu_tu_indexes_read;
10493 }
10494
10495 /* Find the set of sections that includes section SHNDX. */
10496
10497 unsigned int *
10498 find_cu_tu_set (void *file, unsigned int shndx)
10499 {
10500 unsigned int i;
10501
10502 if (! load_cu_tu_indexes (file))
10503 return NULL;
10504
10505 /* Find SHNDX in the shndx pool. */
10506 for (i = 0; i < shndx_pool_used; i++)
10507 if (shndx_pool [i] == shndx)
10508 break;
10509
10510 if (i >= shndx_pool_used)
10511 return NULL;
10512
10513 /* Now backup to find the first entry in the set. */
10514 while (i > 0 && shndx_pool [i - 1] != 0)
10515 i--;
10516
10517 return shndx_pool + i;
10518 }
10519
10520 /* Display a .debug_cu_index or .debug_tu_index section. */
10521
10522 static int
10523 display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
10524 {
10525 return process_cu_tu_index (section, 1);
10526 }
10527
10528 static int
10529 display_debug_not_supported (struct dwarf_section *section,
10530 void *file ATTRIBUTE_UNUSED)
10531 {
10532 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
10533 section->name);
10534
10535 return 1;
10536 }
10537
10538 /* Like malloc, but takes two parameters like calloc.
10539 Verifies that the first parameter is not too large.
10540 Note: does *not* initialise the allocated memory to zero. */
10541
10542 void *
10543 cmalloc (size_t nmemb, size_t size)
10544 {
10545 /* Check for overflow. */
10546 if (nmemb >= ~(size_t) 0 / size)
10547 return NULL;
10548
10549 return xmalloc (nmemb * size);
10550 }
10551
10552 /* Like xmalloc, but takes two parameters like calloc.
10553 Verifies that the first parameter is not too large.
10554 Note: does *not* initialise the allocated memory to zero. */
10555
10556 void *
10557 xcmalloc (size_t nmemb, size_t size)
10558 {
10559 /* Check for overflow. */
10560 if (nmemb >= ~(size_t) 0 / size)
10561 {
10562 fprintf (stderr,
10563 _("Attempt to allocate an array with an excessive number of elements: 0x%lx\n"),
10564 (long) nmemb);
10565 xexit (1);
10566 }
10567
10568 return xmalloc (nmemb * size);
10569 }
10570
10571 /* Like xrealloc, but takes three parameters.
10572 Verifies that the second parameter is not too large.
10573 Note: does *not* initialise any new memory to zero. */
10574
10575 void *
10576 xcrealloc (void *ptr, size_t nmemb, size_t size)
10577 {
10578 /* Check for overflow. */
10579 if (nmemb >= ~(size_t) 0 / size)
10580 {
10581 error (_("Attempt to re-allocate an array with an excessive number of elements: 0x%lx\n"),
10582 (long) nmemb);
10583 xexit (1);
10584 }
10585
10586 return xrealloc (ptr, nmemb * size);
10587 }
10588
10589 /* Like xcalloc, but verifies that the first parameter is not too large. */
10590
10591 void *
10592 xcalloc2 (size_t nmemb, size_t size)
10593 {
10594 /* Check for overflow. */
10595 if (nmemb >= ~(size_t) 0 / size)
10596 {
10597 error (_("Attempt to allocate a zero'ed array with an excessive number of elements: 0x%lx\n"),
10598 (long) nmemb);
10599 xexit (1);
10600 }
10601
10602 return xcalloc (nmemb, size);
10603 }
10604
10605 static unsigned long
10606 calc_gnu_debuglink_crc32 (unsigned long crc,
10607 const unsigned char * buf,
10608 bfd_size_type len)
10609 {
10610 static const unsigned long crc32_table[256] =
10611 {
10612 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
10613 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
10614 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
10615 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
10616 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
10617 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
10618 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
10619 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
10620 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
10621 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
10622 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
10623 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
10624 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
10625 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
10626 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
10627 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
10628 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
10629 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
10630 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
10631 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
10632 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
10633 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
10634 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
10635 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
10636 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
10637 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
10638 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
10639 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
10640 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
10641 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
10642 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
10643 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
10644 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
10645 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
10646 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
10647 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
10648 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
10649 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
10650 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
10651 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
10652 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
10653 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
10654 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
10655 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
10656 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
10657 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
10658 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
10659 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
10660 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
10661 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
10662 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
10663 0x2d02ef8d
10664 };
10665 const unsigned char *end;
10666
10667 crc = ~crc & 0xffffffff;
10668 for (end = buf + len; buf < end; ++ buf)
10669 crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
10670 return ~crc & 0xffffffff;
10671 }
10672
10673 typedef bfd_boolean (* check_func_type) (const char *, void *);
10674 typedef const char * (* parse_func_type) (struct dwarf_section *, void *);
10675
10676 static bfd_boolean
10677 check_gnu_debuglink (const char * pathname, void * crc_pointer)
10678 {
10679 static unsigned char buffer [8 * 1024];
10680 FILE * f;
10681 bfd_size_type count;
10682 unsigned long crc = 0;
10683 void * sep_data;
10684
10685 sep_data = open_debug_file (pathname);
10686 if (sep_data == NULL)
10687 return FALSE;
10688
10689 /* Yes - we are opening the file twice... */
10690 f = fopen (pathname, "rb");
10691 if (f == NULL)
10692 {
10693 /* Paranoia: This should never happen. */
10694 close_debug_file (sep_data);
10695 warn (_("Unable to reopen separate debug info file: %s\n"), pathname);
10696 return FALSE;
10697 }
10698
10699 while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0)
10700 crc = calc_gnu_debuglink_crc32 (crc, buffer, count);
10701
10702 fclose (f);
10703
10704 if (crc != * (unsigned long *) crc_pointer)
10705 {
10706 close_debug_file (sep_data);
10707 warn (_("Separate debug info file %s found, but CRC does not match - ignoring\n"),
10708 pathname);
10709 return FALSE;
10710 }
10711
10712 return TRUE;
10713 }
10714
10715 static const char *
10716 parse_gnu_debuglink (struct dwarf_section * section, void * data)
10717 {
10718 const char * name;
10719 unsigned int crc_offset;
10720 unsigned long * crc32 = (unsigned long *) data;
10721
10722 /* The name is first.
10723 The CRC value is stored after the filename, aligned up to 4 bytes. */
10724 name = (const char *) section->start;
10725
10726 crc_offset = strnlen (name, section->size) + 1;
10727 crc_offset = (crc_offset + 3) & ~3;
10728 if (crc_offset + 4 > section->size)
10729 return NULL;
10730
10731 * crc32 = byte_get (section->start + crc_offset, 4);
10732 return name;
10733 }
10734
10735 static bfd_boolean
10736 check_gnu_debugaltlink (const char * filename, void * data ATTRIBUTE_UNUSED)
10737 {
10738 void * sep_data = open_debug_file (filename);
10739
10740 if (sep_data == NULL)
10741 return FALSE;
10742
10743 /* FIXME: We should now extract the build-id in the separate file
10744 and check it... */
10745
10746 return TRUE;
10747 }
10748
10749 typedef struct build_id_data
10750 {
10751 bfd_size_type len;
10752 const unsigned char * data;
10753 } Build_id_data;
10754
10755 static const char *
10756 parse_gnu_debugaltlink (struct dwarf_section * section, void * data)
10757 {
10758 const char * name;
10759 bfd_size_type namelen;
10760 bfd_size_type id_len;
10761 Build_id_data * build_id_data;
10762
10763 /* The name is first.
10764 The build-id follows immediately, with no padding, up to the section's end. */
10765
10766 name = (const char *) section->start;
10767 namelen = strnlen (name, section->size) + 1;
10768 if (namelen >= section->size)
10769 return NULL;
10770
10771 id_len = section->size - namelen;
10772 if (id_len < 0x14)
10773 return NULL;
10774
10775 build_id_data = (Build_id_data *) data;
10776 build_id_data->len = id_len;
10777 build_id_data->data = section->start + namelen;
10778
10779 return name;
10780 }
10781
10782 static void
10783 add_separate_debug_file (const char * filename, void * handle)
10784 {
10785 separate_info * i = xmalloc (sizeof * i);
10786
10787 i->filename = filename;
10788 i->handle = handle;
10789 i->next = first_separate_info;
10790 first_separate_info = i;
10791 }
10792
10793 #if HAVE_LIBDEBUGINFOD
10794 /* Query debuginfod servers for the target debuglink or debugaltlink
10795 file. If successful, store the path of the file in filename and
10796 return TRUE, otherwise return FALSE. */
10797
10798 static bfd_boolean
10799 debuginfod_fetch_separate_debug_info (struct dwarf_section * section,
10800 char ** filename,
10801 void * file)
10802 {
10803 size_t build_id_len;
10804 unsigned char * build_id;
10805
10806 if (strcmp (section->uncompressed_name, ".gnu_debuglink") == 0)
10807 {
10808 /* Get the build-id of file. */
10809 build_id = get_build_id (file);
10810 build_id_len = 0;
10811 }
10812 else if (strcmp (section->uncompressed_name, ".gnu_debugaltlink") == 0)
10813 {
10814 /* Get the build-id of the debugaltlink file. */
10815 unsigned int filelen;
10816
10817 filelen = strnlen ((const char *)section->start, section->size);
10818 if (filelen == section->size)
10819 /* Corrupt debugaltlink. */
10820 return FALSE;
10821
10822 build_id = section->start + filelen + 1;
10823 build_id_len = section->size - (filelen + 1);
10824
10825 if (build_id_len == 0)
10826 return FALSE;
10827 }
10828 else
10829 return FALSE;
10830
10831 if (build_id)
10832 {
10833 int fd;
10834 debuginfod_client * client;
10835
10836 client = debuginfod_begin ();
10837 if (client == NULL)
10838 return FALSE;
10839
10840 /* Query debuginfod servers for the target file. If found its path
10841 will be stored in filename. */
10842 fd = debuginfod_find_debuginfo (client, build_id, build_id_len, filename);
10843 debuginfod_end (client);
10844
10845 /* Only free build_id if we allocated space for a hex string
10846 in get_build_id (). */
10847 if (build_id_len == 0)
10848 free (build_id);
10849
10850 if (fd >= 0)
10851 {
10852 /* File successfully retrieved. Close fd since we want to
10853 use open_debug_file () on filename instead. */
10854 close (fd);
10855 return TRUE;
10856 }
10857 }
10858
10859 return FALSE;
10860 }
10861 #endif
10862
10863 static void *
10864 load_separate_debug_info (const char * main_filename,
10865 struct dwarf_section * xlink,
10866 parse_func_type parse_func,
10867 check_func_type check_func,
10868 void * func_data,
10869 void * file ATTRIBUTE_UNUSED)
10870 {
10871 const char * separate_filename;
10872 char * debug_filename;
10873 char * canon_dir;
10874 size_t canon_dirlen;
10875 size_t dirlen;
10876
10877 if ((separate_filename = parse_func (xlink, func_data)) == NULL)
10878 {
10879 warn (_("Corrupt debuglink section: %s\n"),
10880 xlink->name ? xlink->name : xlink->uncompressed_name);
10881 return NULL;
10882 }
10883
10884 /* Attempt to locate the separate file.
10885 This should duplicate the logic in bfd/opncls.c:find_separate_debug_file(). */
10886
10887 canon_dir = lrealpath (main_filename);
10888
10889 for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
10890 if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
10891 break;
10892 canon_dir[canon_dirlen] = '\0';
10893
10894 #ifndef DEBUGDIR
10895 #define DEBUGDIR "/lib/debug"
10896 #endif
10897 #ifndef EXTRA_DEBUG_ROOT1
10898 #define EXTRA_DEBUG_ROOT1 "/usr/lib/debug"
10899 #endif
10900 #ifndef EXTRA_DEBUG_ROOT2
10901 #define EXTRA_DEBUG_ROOT2 "/usr/lib/debug/usr"
10902 #endif
10903
10904 debug_filename = (char *) malloc (strlen (DEBUGDIR) + 1
10905 + canon_dirlen
10906 + strlen (".debug/")
10907 #ifdef EXTRA_DEBUG_ROOT1
10908 + strlen (EXTRA_DEBUG_ROOT1)
10909 #endif
10910 #ifdef EXTRA_DEBUG_ROOT2
10911 + strlen (EXTRA_DEBUG_ROOT2)
10912 #endif
10913 + strlen (separate_filename)
10914 + 1);
10915 if (debug_filename == NULL)
10916 {
10917 warn (_("Out of memory"));
10918 free (canon_dir);
10919 return NULL;
10920 }
10921
10922 /* First try in the current directory. */
10923 sprintf (debug_filename, "%s", separate_filename);
10924 if (check_func (debug_filename, func_data))
10925 goto found;
10926
10927 /* Then try in a subdirectory called .debug. */
10928 sprintf (debug_filename, ".debug/%s", separate_filename);
10929 if (check_func (debug_filename, func_data))
10930 goto found;
10931
10932 /* Then try in the same directory as the original file. */
10933 sprintf (debug_filename, "%s%s", canon_dir, separate_filename);
10934 if (check_func (debug_filename, func_data))
10935 goto found;
10936
10937 /* And the .debug subdirectory of that directory. */
10938 sprintf (debug_filename, "%s.debug/%s", canon_dir, separate_filename);
10939 if (check_func (debug_filename, func_data))
10940 goto found;
10941
10942 #ifdef EXTRA_DEBUG_ROOT1
10943 /* Try the first extra debug file root. */
10944 sprintf (debug_filename, "%s/%s", EXTRA_DEBUG_ROOT1, separate_filename);
10945 if (check_func (debug_filename, func_data))
10946 goto found;
10947
10948 /* Try the first extra debug file root. */
10949 sprintf (debug_filename, "%s/%s/%s", EXTRA_DEBUG_ROOT1, canon_dir, separate_filename);
10950 if (check_func (debug_filename, func_data))
10951 goto found;
10952 #endif
10953
10954 #ifdef EXTRA_DEBUG_ROOT2
10955 /* Try the second extra debug file root. */
10956 sprintf (debug_filename, "%s/%s", EXTRA_DEBUG_ROOT2, separate_filename);
10957 if (check_func (debug_filename, func_data))
10958 goto found;
10959 #endif
10960
10961 /* Then try in the global debug_filename directory. */
10962 strcpy (debug_filename, DEBUGDIR);
10963 dirlen = strlen (DEBUGDIR) - 1;
10964 if (dirlen > 0 && DEBUGDIR[dirlen] != '/')
10965 strcat (debug_filename, "/");
10966 strcat (debug_filename, (const char *) separate_filename);
10967
10968 if (check_func (debug_filename, func_data))
10969 goto found;
10970
10971 #if HAVE_LIBDEBUGINFOD
10972 {
10973 char * tmp_filename;
10974
10975 if (debuginfod_fetch_separate_debug_info (xlink,
10976 & tmp_filename,
10977 file))
10978 {
10979 /* File successfully downloaded from server, replace
10980 debug_filename with the file's path. */
10981 free (debug_filename);
10982 debug_filename = tmp_filename;
10983 goto found;
10984 }
10985 }
10986 #endif
10987
10988 /* Failed to find the file. */
10989 warn (_("could not find separate debug file '%s'\n"), separate_filename);
10990 warn (_("tried: %s\n"), debug_filename);
10991
10992 #ifdef EXTRA_DEBUG_ROOT2
10993 sprintf (debug_filename, "%s/%s", EXTRA_DEBUG_ROOT2, separate_filename);
10994 warn (_("tried: %s\n"), debug_filename);
10995 #endif
10996
10997 #ifdef EXTRA_DEBUG_ROOT1
10998 sprintf (debug_filename, "%s/%s/%s", EXTRA_DEBUG_ROOT1, canon_dir, separate_filename);
10999 warn (_("tried: %s\n"), debug_filename);
11000
11001 sprintf (debug_filename, "%s/%s", EXTRA_DEBUG_ROOT1, separate_filename);
11002 warn (_("tried: %s\n"), debug_filename);
11003 #endif
11004
11005 sprintf (debug_filename, "%s.debug/%s", canon_dir, separate_filename);
11006 warn (_("tried: %s\n"), debug_filename);
11007
11008 sprintf (debug_filename, "%s%s", canon_dir, separate_filename);
11009 warn (_("tried: %s\n"), debug_filename);
11010
11011 sprintf (debug_filename, ".debug/%s", separate_filename);
11012 warn (_("tried: %s\n"), debug_filename);
11013
11014 sprintf (debug_filename, "%s", separate_filename);
11015 warn (_("tried: %s\n"), debug_filename);
11016
11017 #if HAVE_LIBDEBUGINFOD
11018 {
11019 char *urls = getenv (DEBUGINFOD_URLS_ENV_VAR);
11020 if (urls == NULL)
11021 urls = "";
11022
11023 warn (_("tried: DEBUGINFOD_URLS=%s\n"), urls);
11024 }
11025 #endif
11026
11027 free (canon_dir);
11028 free (debug_filename);
11029 return NULL;
11030
11031 found:
11032 free (canon_dir);
11033
11034 void * debug_handle;
11035
11036 /* Now open the file.... */
11037 if ((debug_handle = open_debug_file (debug_filename)) == NULL)
11038 {
11039 warn (_("failed to open separate debug file: %s\n"), debug_filename);
11040 free (debug_filename);
11041 return NULL;
11042 }
11043
11044 /* FIXME: We do not check to see if there are any other separate debug info
11045 files that would also match. */
11046
11047 printf (_("%s: Found separate debug info file: %s\n\n"), main_filename, debug_filename);
11048 add_separate_debug_file (debug_filename, debug_handle);
11049
11050 /* Do not free debug_filename - it might be referenced inside
11051 the structure returned by open_debug_file(). */
11052 return debug_handle;
11053 }
11054
11055 /* Attempt to load a separate dwarf object file. */
11056
11057 static void *
11058 load_dwo_file (const char * main_filename, const char * name, const char * dir, const char * id ATTRIBUTE_UNUSED)
11059 {
11060 char * separate_filename;
11061 void * separate_handle;
11062
11063 /* FIXME: Skip adding / if dwo_dir ends in /. */
11064 separate_filename = concat (dir, "/", name, NULL);
11065 if (separate_filename == NULL)
11066 {
11067 warn (_("Out of memory allocating dwo filename\n"));
11068 return NULL;
11069 }
11070
11071 if ((separate_handle = open_debug_file (separate_filename)) == NULL)
11072 {
11073 warn (_("Unable to load dwo file: %s\n"), separate_filename);
11074 free (separate_filename);
11075 return NULL;
11076 }
11077
11078 /* FIXME: We should check the dwo_id. */
11079
11080 printf (_("%s: Found separate debug object file: %s\n\n"), main_filename, separate_filename);
11081 add_separate_debug_file (separate_filename, separate_handle);
11082 /* Note - separate_filename will be freed in free_debug_memory(). */
11083 return separate_handle;
11084 }
11085
11086 /* Load a debuglink section and/or a debugaltlink section, if either are present.
11087 Recursively check the loaded files for more of these sections.
11088 FIXME: Should also check for DWO_* entries in the newlu loaded files. */
11089
11090 static void
11091 check_for_and_load_links (void * file, const char * filename)
11092 {
11093 void * handle = NULL;
11094
11095 if (load_debug_section (gnu_debugaltlink, file))
11096 {
11097 Build_id_data build_id_data;
11098
11099 handle = load_separate_debug_info (filename,
11100 & debug_displays[gnu_debugaltlink].section,
11101 parse_gnu_debugaltlink,
11102 check_gnu_debugaltlink,
11103 & build_id_data,
11104 file);
11105 if (handle)
11106 {
11107 assert (handle == first_separate_info->handle);
11108 check_for_and_load_links (first_separate_info->handle,
11109 first_separate_info->filename);
11110 }
11111 }
11112
11113 if (load_debug_section (gnu_debuglink, file))
11114 {
11115 unsigned long crc32;
11116
11117 handle = load_separate_debug_info (filename,
11118 & debug_displays[gnu_debuglink].section,
11119 parse_gnu_debuglink,
11120 check_gnu_debuglink,
11121 & crc32,
11122 file);
11123 if (handle)
11124 {
11125 assert (handle == first_separate_info->handle);
11126 check_for_and_load_links (first_separate_info->handle,
11127 first_separate_info->filename);
11128 }
11129 }
11130 }
11131
11132 /* Load the separate debug info file(s) attached to FILE, if any exist.
11133 Returns TRUE if any were found, FALSE otherwise.
11134 If TRUE is returned then the linked list starting at first_separate_info
11135 will be populated with open file handles. */
11136
11137 bfd_boolean
11138 load_separate_debug_files (void * file, const char * filename)
11139 {
11140 /* Skip this operation if we are not interested in debug links. */
11141 if (! do_follow_links && ! do_debug_links)
11142 return FALSE;
11143
11144 /* See if there are any dwo links. */
11145 if (load_debug_section (str, file)
11146 && load_debug_section (abbrev, file)
11147 && load_debug_section (info, file))
11148 {
11149 free_dwo_info ();
11150
11151 if (process_debug_info (& debug_displays[info].section, file, abbrev,
11152 TRUE, FALSE))
11153 {
11154 bfd_boolean introduced = FALSE;
11155 dwo_info * dwinfo;
11156 const char * dir = NULL;
11157 const char * id = NULL;
11158 const char * name = NULL;
11159
11160 for (dwinfo = first_dwo_info; dwinfo != NULL; dwinfo = dwinfo->next)
11161 {
11162 /* Accumulate NAME, DIR and ID fields. */
11163 switch (dwinfo->type)
11164 {
11165 case DWO_NAME:
11166 if (name != NULL)
11167 warn (_("Multiple DWO_NAMEs encountered for the same CU\n"));
11168 name = dwinfo->value;
11169 break;
11170
11171 case DWO_DIR:
11172 /* There can be multiple DW_AT_comp_dir entries in a CU,
11173 so do not complain. */
11174 dir = dwinfo->value;
11175 break;
11176
11177 case DWO_ID:
11178 if (id != NULL)
11179 warn (_("multiple DWO_IDs encountered for the same CU\n"));
11180 id = dwinfo->value;
11181 break;
11182
11183 default:
11184 error (_("Unexpected DWO INFO type"));
11185 break;
11186 }
11187
11188 /* If we have reached the end of our list, or we are changing
11189 CUs, then display the information that we have accumulated
11190 so far. */
11191 if (name != NULL
11192 && (dwinfo->next == NULL
11193 || dwinfo->next->cu_offset != dwinfo->cu_offset))
11194 {
11195 if (do_debug_links)
11196 {
11197 if (! introduced)
11198 {
11199 printf (_("The %s section contains link(s) to dwo file(s):\n\n"),
11200 debug_displays [info].section.uncompressed_name);
11201 introduced = TRUE;
11202 }
11203
11204 printf (_(" Name: %s\n"), name);
11205 printf (_(" Directory: %s\n"), dir ? dir : _("<not-found>"));
11206 if (id != NULL)
11207 display_data (printf (_(" ID: ")), (unsigned char *) id, 8);
11208 else
11209 printf (_(" ID: <not specified>\n"));
11210 printf ("\n\n");
11211 }
11212
11213 if (do_follow_links)
11214 load_dwo_file (filename, name, dir, id);
11215
11216 name = dir = id = NULL;
11217 }
11218 }
11219 }
11220 }
11221
11222 if (! do_follow_links)
11223 /* The other debug links will be displayed by display_debug_links()
11224 so we do not need to do any further processing here. */
11225 return FALSE;
11226
11227 /* FIXME: We do not check for the presence of both link sections in the same file. */
11228 /* FIXME: We do not check for the presence of multiple, same-name debuglink sections. */
11229 /* FIXME: We do not check for the presence of a dwo link as well as a debuglink. */
11230
11231 check_for_and_load_links (file, filename);
11232 if (first_separate_info != NULL)
11233 return TRUE;
11234
11235 do_follow_links = 0;
11236 return FALSE;
11237 }
11238
11239 void
11240 free_debug_memory (void)
11241 {
11242 unsigned int i;
11243
11244 free_all_abbrevs ();
11245
11246 free (cu_abbrev_map);
11247 cu_abbrev_map = NULL;
11248 next_free_abbrev_map_entry = 0;
11249
11250 free (shndx_pool);
11251 shndx_pool = NULL;
11252 shndx_pool_size = 0;
11253 shndx_pool_used = 0;
11254 free (cu_sets);
11255 cu_sets = NULL;
11256 cu_count = 0;
11257 free (tu_sets);
11258 tu_sets = NULL;
11259 tu_count = 0;
11260
11261 memset (level_type_signed, 0, sizeof level_type_signed);
11262 cu_tu_indexes_read = -1;
11263
11264 for (i = 0; i < max; i++)
11265 free_debug_section ((enum dwarf_section_display_enum) i);
11266
11267 if (debug_information != NULL)
11268 {
11269 for (i = 0; i < alloc_num_debug_info_entries; i++)
11270 {
11271 if (debug_information [i].max_loc_offsets)
11272 {
11273 free (debug_information [i].loc_offsets);
11274 free (debug_information [i].have_frame_base);
11275 }
11276 if (debug_information [i].max_range_lists)
11277 free (debug_information [i].range_lists);
11278 }
11279 free (debug_information);
11280 debug_information = NULL;
11281 alloc_num_debug_info_entries = num_debug_info_entries = 0;
11282 }
11283
11284 separate_info * d;
11285 separate_info * next;
11286
11287 for (d = first_separate_info; d != NULL; d = next)
11288 {
11289 close_debug_file (d->handle);
11290 free ((void *) d->filename);
11291 next = d->next;
11292 free ((void *) d);
11293 }
11294 first_separate_info = NULL;
11295
11296 free_dwo_info ();
11297 }
11298
11299 void
11300 dwarf_select_sections_by_names (const char *names)
11301 {
11302 typedef struct
11303 {
11304 const char * option;
11305 int * variable;
11306 int val;
11307 }
11308 debug_dump_long_opts;
11309
11310 static const debug_dump_long_opts opts_table [] =
11311 {
11312 /* Please keep this table alpha- sorted. */
11313 { "Ranges", & do_debug_ranges, 1 },
11314 { "abbrev", & do_debug_abbrevs, 1 },
11315 { "addr", & do_debug_addr, 1 },
11316 { "aranges", & do_debug_aranges, 1 },
11317 { "cu_index", & do_debug_cu_index, 1 },
11318 { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
11319 { "follow-links", & do_follow_links, 1 },
11320 { "frames", & do_debug_frames, 1 },
11321 { "frames-interp", & do_debug_frames_interp, 1 },
11322 /* The special .gdb_index section. */
11323 { "gdb_index", & do_gdb_index, 1 },
11324 { "info", & do_debug_info, 1 },
11325 { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility. */
11326 { "links", & do_debug_links, 1 },
11327 { "loc", & do_debug_loc, 1 },
11328 { "macro", & do_debug_macinfo, 1 },
11329 { "pubnames", & do_debug_pubnames, 1 },
11330 { "pubtypes", & do_debug_pubtypes, 1 },
11331 /* This entry is for compatibility
11332 with earlier versions of readelf. */
11333 { "ranges", & do_debug_aranges, 1 },
11334 { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
11335 { "str", & do_debug_str, 1 },
11336 { "str-offsets", & do_debug_str_offsets, 1 },
11337 /* These trace_* sections are used by Itanium VMS. */
11338 { "trace_abbrev", & do_trace_abbrevs, 1 },
11339 { "trace_aranges", & do_trace_aranges, 1 },
11340 { "trace_info", & do_trace_info, 1 },
11341 { NULL, NULL, 0 }
11342 };
11343
11344 const char *p;
11345
11346 p = names;
11347 while (*p)
11348 {
11349 const debug_dump_long_opts * entry;
11350
11351 for (entry = opts_table; entry->option; entry++)
11352 {
11353 size_t len = strlen (entry->option);
11354
11355 if (strncmp (p, entry->option, len) == 0
11356 && (p[len] == ',' || p[len] == '\0'))
11357 {
11358 * entry->variable |= entry->val;
11359
11360 /* The --debug-dump=frames-interp option also
11361 enables the --debug-dump=frames option. */
11362 if (do_debug_frames_interp)
11363 do_debug_frames = 1;
11364
11365 p += len;
11366 break;
11367 }
11368 }
11369
11370 if (entry->option == NULL)
11371 {
11372 warn (_("Unrecognized debug option '%s'\n"), p);
11373 p = strchr (p, ',');
11374 if (p == NULL)
11375 break;
11376 }
11377
11378 if (*p == ',')
11379 p++;
11380 }
11381 }
11382
11383 void
11384 dwarf_select_sections_by_letters (const char *letters)
11385 {
11386 unsigned int lindex = 0;
11387
11388 while (letters[lindex])
11389 switch (letters[lindex++])
11390 {
11391 case 'A': do_debug_addr = 1; break;
11392 case 'a': do_debug_abbrevs = 1; break;
11393 case 'c': do_debug_cu_index = 1; break;
11394 case 'F': do_debug_frames_interp = 1; /* Fall through. */
11395 case 'f': do_debug_frames = 1; break;
11396 case 'g': do_gdb_index = 1; break;
11397 case 'i': do_debug_info = 1; break;
11398 case 'K': do_follow_links = 1; break;
11399 case 'k': do_debug_links = 1; break;
11400 case 'l': do_debug_lines |= FLAG_DEBUG_LINES_RAW; break;
11401 case 'L': do_debug_lines |= FLAG_DEBUG_LINES_DECODED; break;
11402 case 'm': do_debug_macinfo = 1; break;
11403 case 'O': do_debug_str_offsets = 1; break;
11404 case 'o': do_debug_loc = 1; break;
11405 case 'p': do_debug_pubnames = 1; break;
11406 case 'R': do_debug_ranges = 1; break;
11407 case 'r': do_debug_aranges = 1; break;
11408 case 's': do_debug_str = 1; break;
11409 case 'T': do_trace_aranges = 1; break;
11410 case 't': do_debug_pubtypes = 1; break;
11411 case 'U': do_trace_info = 1; break;
11412 case 'u': do_trace_abbrevs = 1; break;
11413
11414 default:
11415 warn (_("Unrecognized debug option '%s'\n"), letters);
11416 break;
11417 }
11418 }
11419
11420 void
11421 dwarf_select_sections_all (void)
11422 {
11423 do_debug_info = 1;
11424 do_debug_abbrevs = 1;
11425 do_debug_lines = FLAG_DEBUG_LINES_RAW;
11426 do_debug_pubnames = 1;
11427 do_debug_pubtypes = 1;
11428 do_debug_aranges = 1;
11429 do_debug_ranges = 1;
11430 do_debug_frames = 1;
11431 do_debug_macinfo = 1;
11432 do_debug_str = 1;
11433 do_debug_loc = 1;
11434 do_gdb_index = 1;
11435 do_trace_info = 1;
11436 do_trace_abbrevs = 1;
11437 do_trace_aranges = 1;
11438 do_debug_addr = 1;
11439 do_debug_cu_index = 1;
11440 do_follow_links = 1;
11441 do_debug_links = 1;
11442 do_debug_str_offsets = 1;
11443 }
11444
11445 #define NO_ABBREVS NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL
11446 #define ABBREV(N) NULL, NULL, NULL, 0, 0, N, NULL, 0, NULL
11447
11448 /* N.B. The order here must match the order in section_display_enum. */
11449
11450 struct dwarf_section_display debug_displays[] =
11451 {
11452 { { ".debug_abbrev", ".zdebug_abbrev", NO_ABBREVS }, display_debug_abbrev, &do_debug_abbrevs, FALSE },
11453 { { ".debug_aranges", ".zdebug_aranges", NO_ABBREVS }, display_debug_aranges, &do_debug_aranges, TRUE },
11454 { { ".debug_frame", ".zdebug_frame", NO_ABBREVS }, display_debug_frames, &do_debug_frames, TRUE },
11455 { { ".debug_info", ".zdebug_info", ABBREV (abbrev)}, display_debug_info, &do_debug_info, TRUE },
11456 { { ".debug_line", ".zdebug_line", NO_ABBREVS }, display_debug_lines, &do_debug_lines, TRUE },
11457 { { ".debug_pubnames", ".zdebug_pubnames", NO_ABBREVS }, display_debug_pubnames, &do_debug_pubnames, FALSE },
11458 { { ".debug_gnu_pubnames", ".zdebug_gnu_pubnames", NO_ABBREVS }, display_debug_gnu_pubnames, &do_debug_pubnames, FALSE },
11459 { { ".eh_frame", "", NO_ABBREVS }, display_debug_frames, &do_debug_frames, TRUE },
11460 { { ".debug_macinfo", ".zdebug_macinfo", NO_ABBREVS }, display_debug_macinfo, &do_debug_macinfo, FALSE },
11461 { { ".debug_macro", ".zdebug_macro", NO_ABBREVS }, display_debug_macro, &do_debug_macinfo, TRUE },
11462 { { ".debug_str", ".zdebug_str", NO_ABBREVS }, display_debug_str, &do_debug_str, FALSE },
11463 { { ".debug_line_str", ".zdebug_line_str", NO_ABBREVS }, display_debug_str, &do_debug_str, FALSE },
11464 { { ".debug_loc", ".zdebug_loc", NO_ABBREVS }, display_debug_loc, &do_debug_loc, TRUE },
11465 { { ".debug_loclists", ".zdebug_loclists", NO_ABBREVS }, display_debug_loc, &do_debug_loc, TRUE },
11466 { { ".debug_pubtypes", ".zdebug_pubtypes", NO_ABBREVS }, display_debug_pubnames, &do_debug_pubtypes, FALSE },
11467 { { ".debug_gnu_pubtypes", ".zdebug_gnu_pubtypes", NO_ABBREVS }, display_debug_gnu_pubnames, &do_debug_pubtypes, FALSE },
11468 { { ".debug_ranges", ".zdebug_ranges", NO_ABBREVS }, display_debug_ranges, &do_debug_ranges, TRUE },
11469 { { ".debug_rnglists", ".zdebug_rnglists", NO_ABBREVS }, display_debug_ranges, &do_debug_ranges, TRUE },
11470 { { ".debug_static_func", ".zdebug_static_func", NO_ABBREVS }, display_debug_not_supported, NULL, FALSE },
11471 { { ".debug_static_vars", ".zdebug_static_vars", NO_ABBREVS }, display_debug_not_supported, NULL, FALSE },
11472 { { ".debug_types", ".zdebug_types", ABBREV (abbrev) }, display_debug_types, &do_debug_info, TRUE },
11473 { { ".debug_weaknames", ".zdebug_weaknames", NO_ABBREVS }, display_debug_not_supported, NULL, FALSE },
11474 { { ".gdb_index", "", NO_ABBREVS }, display_gdb_index, &do_gdb_index, FALSE },
11475 { { ".debug_names", "", NO_ABBREVS }, display_debug_names, &do_gdb_index, FALSE },
11476 { { ".trace_info", "", ABBREV (trace_abbrev) }, display_trace_info, &do_trace_info, TRUE },
11477 { { ".trace_abbrev", "", NO_ABBREVS }, display_debug_abbrev, &do_trace_abbrevs, FALSE },
11478 { { ".trace_aranges", "", NO_ABBREVS }, display_debug_aranges, &do_trace_aranges, FALSE },
11479 { { ".debug_info.dwo", ".zdebug_info.dwo", ABBREV (abbrev_dwo) }, display_debug_info, &do_debug_info, TRUE },
11480 { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", NO_ABBREVS }, display_debug_abbrev, &do_debug_abbrevs, FALSE },
11481 { { ".debug_types.dwo", ".zdebug_types.dwo", ABBREV (abbrev_dwo) }, display_debug_types, &do_debug_info, TRUE },
11482 { { ".debug_line.dwo", ".zdebug_line.dwo", NO_ABBREVS }, display_debug_lines, &do_debug_lines, TRUE },
11483 { { ".debug_loc.dwo", ".zdebug_loc.dwo", NO_ABBREVS }, display_debug_loc, &do_debug_loc, TRUE },
11484 { { ".debug_macro.dwo", ".zdebug_macro.dwo", NO_ABBREVS }, display_debug_macro, &do_debug_macinfo, TRUE },
11485 { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NO_ABBREVS }, display_debug_macinfo, &do_debug_macinfo, FALSE },
11486 { { ".debug_str.dwo", ".zdebug_str.dwo", NO_ABBREVS }, display_debug_str, &do_debug_str, TRUE },
11487 { { ".debug_str_offsets", ".zdebug_str_offsets", NO_ABBREVS }, display_debug_str_offsets, &do_debug_str_offsets, TRUE },
11488 { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NO_ABBREVS }, display_debug_str_offsets, &do_debug_str_offsets, TRUE },
11489 { { ".debug_addr", ".zdebug_addr", NO_ABBREVS }, display_debug_addr, &do_debug_addr, TRUE },
11490 { { ".debug_cu_index", "", NO_ABBREVS }, display_cu_index, &do_debug_cu_index, FALSE },
11491 { { ".debug_tu_index", "", NO_ABBREVS }, display_cu_index, &do_debug_cu_index, FALSE },
11492 { { ".gnu_debuglink", "", NO_ABBREVS }, display_debug_links, &do_debug_links, FALSE },
11493 { { ".gnu_debugaltlink", "", NO_ABBREVS }, display_debug_links, &do_debug_links, FALSE },
11494 /* Separate debug info files can containt their own .debug_str section,
11495 and this might be in *addition* to a .debug_str section already present
11496 in the main file. Hence we need to have two entries for .debug_str. */
11497 { { ".debug_str", ".zdebug_str", NO_ABBREVS }, display_debug_str, &do_debug_str, FALSE },
11498 };
11499
11500 /* A static assertion. */
11501 extern int debug_displays_assert[ARRAY_SIZE (debug_displays) == max ? 1 : -1];