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