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