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