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