Convert the DWARF reader to new-style buildysm
[deliverable/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 = NULL, *forward_refs = NULL;
7433 Frame_Chunk *remembered_state = NULL;
7434 Frame_Chunk *rs;
7435 bfd_boolean 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 while (remembered_state != NULL)
8369 {
8370 rs = remembered_state;
8371 remembered_state = rs->next;
8372 free (rs->col_type);
8373 free (rs->col_offset);
8374 rs->next = NULL; /* Paranoia. */
8375 free (rs);
8376 }
8377
8378 while (chunks != NULL)
8379 {
8380 rs = chunks;
8381 chunks = rs->next;
8382 free (rs->col_type);
8383 free (rs->col_offset);
8384 rs->next = NULL; /* Paranoia. */
8385 free (rs);
8386 }
8387
8388 while (forward_refs != NULL)
8389 {
8390 rs = forward_refs;
8391 forward_refs = rs->next;
8392 free (rs->col_type);
8393 free (rs->col_offset);
8394 rs->next = NULL; /* Paranoia. */
8395 free (rs);
8396 }
8397
8398 return 1;
8399 }
8400
8401 #undef GET
8402
8403 static int
8404 display_debug_names (struct dwarf_section *section, void *file)
8405 {
8406 unsigned char *hdrptr = section->start;
8407 dwarf_vma unit_length;
8408 unsigned char *unit_start;
8409 const unsigned char *const section_end = section->start + section->size;
8410 unsigned char *unit_end;
8411
8412 introduce (section, FALSE);
8413
8414 load_debug_section_with_follow (str, file);
8415
8416 for (; hdrptr < section_end; hdrptr = unit_end)
8417 {
8418 unsigned int offset_size;
8419 uint16_t dwarf_version, padding;
8420 uint32_t comp_unit_count, local_type_unit_count, foreign_type_unit_count;
8421 uint32_t bucket_count, name_count, abbrev_table_size;
8422 uint32_t augmentation_string_size;
8423 unsigned int i;
8424 unsigned long sec_off;
8425
8426 unit_start = hdrptr;
8427
8428 /* Get and check the length of the block. */
8429 SAFE_BYTE_GET_AND_INC (unit_length, hdrptr, 4, section_end);
8430
8431 if (unit_length == 0xffffffff)
8432 {
8433 /* This section is 64-bit DWARF. */
8434 SAFE_BYTE_GET_AND_INC (unit_length, hdrptr, 8, section_end);
8435 offset_size = 8;
8436 }
8437 else
8438 offset_size = 4;
8439 unit_end = hdrptr + unit_length;
8440
8441 sec_off = hdrptr - section->start;
8442 if (sec_off + unit_length < sec_off
8443 || sec_off + unit_length > section->size)
8444 {
8445 warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
8446 section->name,
8447 (unsigned long) (unit_start - section->start),
8448 dwarf_vmatoa ("x", unit_length));
8449 return 0;
8450 }
8451
8452 /* Get and check the version number. */
8453 SAFE_BYTE_GET_AND_INC (dwarf_version, hdrptr, 2, unit_end);
8454 printf (_("Version %ld\n"), (long) dwarf_version);
8455
8456 /* Prior versions did not exist, and future versions may not be
8457 backwards compatible. */
8458 if (dwarf_version != 5)
8459 {
8460 warn (_("Only DWARF version 5 .debug_names "
8461 "is currently supported.\n"));
8462 return 0;
8463 }
8464
8465 SAFE_BYTE_GET_AND_INC (padding, hdrptr, 2, unit_end);
8466 if (padding != 0)
8467 warn (_("Padding field of .debug_names must be 0 (found 0x%x)\n"),
8468 padding);
8469
8470 SAFE_BYTE_GET_AND_INC (comp_unit_count, hdrptr, 4, unit_end);
8471 if (comp_unit_count == 0)
8472 warn (_("Compilation unit count must be >= 1 in .debug_names\n"));
8473
8474 SAFE_BYTE_GET_AND_INC (local_type_unit_count, hdrptr, 4, unit_end);
8475 SAFE_BYTE_GET_AND_INC (foreign_type_unit_count, hdrptr, 4, unit_end);
8476 SAFE_BYTE_GET_AND_INC (bucket_count, hdrptr, 4, unit_end);
8477 SAFE_BYTE_GET_AND_INC (name_count, hdrptr, 4, unit_end);
8478 SAFE_BYTE_GET_AND_INC (abbrev_table_size, hdrptr, 4, unit_end);
8479
8480 SAFE_BYTE_GET_AND_INC (augmentation_string_size, hdrptr, 4, unit_end);
8481 if (augmentation_string_size % 4 != 0)
8482 {
8483 warn (_("Augmentation string length %u must be rounded up "
8484 "to a multiple of 4 in .debug_names.\n"),
8485 augmentation_string_size);
8486 augmentation_string_size += (-augmentation_string_size) & 3;
8487 }
8488 printf (_("Augmentation string:"));
8489 for (i = 0; i < augmentation_string_size; i++)
8490 {
8491 unsigned char uc;
8492
8493 SAFE_BYTE_GET_AND_INC (uc, hdrptr, 1, unit_end);
8494 printf (" %02x", uc);
8495 }
8496 putchar ('\n');
8497 putchar ('\n');
8498
8499 printf (_("CU table:\n"));
8500 for (i = 0; i < comp_unit_count; i++)
8501 {
8502 uint64_t cu_offset;
8503
8504 SAFE_BYTE_GET_AND_INC (cu_offset, hdrptr, offset_size, unit_end);
8505 printf (_("[%3u] 0x%lx\n"), i, (unsigned long) cu_offset);
8506 }
8507 putchar ('\n');
8508
8509 printf (_("TU table:\n"));
8510 for (i = 0; i < local_type_unit_count; i++)
8511 {
8512 uint64_t tu_offset;
8513
8514 SAFE_BYTE_GET_AND_INC (tu_offset, hdrptr, offset_size, unit_end);
8515 printf (_("[%3u] 0x%lx\n"), i, (unsigned long) tu_offset);
8516 }
8517 putchar ('\n');
8518
8519 printf (_("Foreign TU table:\n"));
8520 for (i = 0; i < foreign_type_unit_count; i++)
8521 {
8522 uint64_t signature;
8523
8524 SAFE_BYTE_GET_AND_INC (signature, hdrptr, 8, unit_end);
8525 printf (_("[%3u] "), i);
8526 print_dwarf_vma (signature, 8);
8527 putchar ('\n');
8528 }
8529 putchar ('\n');
8530
8531 const uint32_t *const hash_table_buckets = (uint32_t *) hdrptr;
8532 hdrptr += bucket_count * sizeof (uint32_t);
8533 const uint32_t *const hash_table_hashes = (uint32_t *) hdrptr;
8534 hdrptr += name_count * sizeof (uint32_t);
8535 unsigned char *const name_table_string_offsets = hdrptr;
8536 hdrptr += name_count * offset_size;
8537 unsigned char *const name_table_entry_offsets = hdrptr;
8538 hdrptr += name_count * offset_size;
8539 unsigned char *const abbrev_table = hdrptr;
8540 hdrptr += abbrev_table_size;
8541 const unsigned char *const abbrev_table_end = hdrptr;
8542 unsigned char *const entry_pool = hdrptr;
8543 if (hdrptr > unit_end)
8544 {
8545 warn (_("Entry pool offset (0x%lx) exceeds unit size 0x%lx "
8546 "for unit 0x%lx in the debug_names\n"),
8547 (long) (hdrptr - section->start),
8548 (long) (unit_end - section->start),
8549 (long) (unit_start - section->start));
8550 return 0;
8551 }
8552
8553 size_t buckets_filled = 0;
8554 size_t bucketi;
8555 for (bucketi = 0; bucketi < bucket_count; bucketi++)
8556 {
8557 const uint32_t bucket = hash_table_buckets[bucketi];
8558
8559 if (bucket != 0)
8560 ++buckets_filled;
8561 }
8562 printf (ngettext ("Used %zu of %lu bucket.\n",
8563 "Used %zu of %lu buckets.\n",
8564 bucket_count),
8565 buckets_filled, (unsigned long) bucket_count);
8566
8567 uint32_t hash_prev = 0;
8568 size_t hash_clash_count = 0;
8569 size_t longest_clash = 0;
8570 size_t this_length = 0;
8571 size_t hashi;
8572 for (hashi = 0; hashi < name_count; hashi++)
8573 {
8574 const uint32_t hash_this = hash_table_hashes[hashi];
8575
8576 if (hashi > 0)
8577 {
8578 if (hash_prev % bucket_count == hash_this % bucket_count)
8579 {
8580 ++hash_clash_count;
8581 ++this_length;
8582 longest_clash = MAX (longest_clash, this_length);
8583 }
8584 else
8585 this_length = 0;
8586 }
8587 hash_prev = hash_this;
8588 }
8589 printf (_("Out of %lu items there are %zu bucket clashes"
8590 " (longest of %zu entries).\n"),
8591 (unsigned long) name_count, hash_clash_count, longest_clash);
8592 assert (name_count == buckets_filled + hash_clash_count);
8593
8594 struct abbrev_lookup_entry
8595 {
8596 dwarf_vma abbrev_tag;
8597 unsigned char *abbrev_lookup_ptr;
8598 };
8599 struct abbrev_lookup_entry *abbrev_lookup = NULL;
8600 size_t abbrev_lookup_used = 0;
8601 size_t abbrev_lookup_allocated = 0;
8602
8603 unsigned char *abbrevptr = abbrev_table;
8604 for (;;)
8605 {
8606 unsigned int bytes_read;
8607 const dwarf_vma abbrev_tag = read_uleb128 (abbrevptr, &bytes_read,
8608 abbrev_table_end);
8609 abbrevptr += bytes_read;
8610 if (abbrev_tag == 0)
8611 break;
8612 if (abbrev_lookup_used == abbrev_lookup_allocated)
8613 {
8614 abbrev_lookup_allocated = MAX (0x100,
8615 abbrev_lookup_allocated * 2);
8616 abbrev_lookup = xrealloc (abbrev_lookup,
8617 (abbrev_lookup_allocated
8618 * sizeof (*abbrev_lookup)));
8619 }
8620 assert (abbrev_lookup_used < abbrev_lookup_allocated);
8621 struct abbrev_lookup_entry *entry;
8622 for (entry = abbrev_lookup;
8623 entry < abbrev_lookup + abbrev_lookup_used;
8624 entry++)
8625 if (entry->abbrev_tag == abbrev_tag)
8626 {
8627 warn (_("Duplicate abbreviation tag %lu "
8628 "in unit 0x%lx in the debug_names\n"),
8629 (long) abbrev_tag, (long) (unit_start - section->start));
8630 break;
8631 }
8632 entry = &abbrev_lookup[abbrev_lookup_used++];
8633 entry->abbrev_tag = abbrev_tag;
8634 entry->abbrev_lookup_ptr = abbrevptr;
8635
8636 /* Skip DWARF tag. */
8637 read_uleb128 (abbrevptr, &bytes_read, abbrev_table_end);
8638 abbrevptr += bytes_read;
8639 for (;;)
8640 {
8641 const dwarf_vma xindex = read_uleb128 (abbrevptr,
8642 &bytes_read,
8643 abbrev_table_end);
8644 abbrevptr += bytes_read;
8645 const dwarf_vma form = read_uleb128 (abbrevptr, &bytes_read,
8646 abbrev_table_end);
8647 abbrevptr += bytes_read;
8648 if (xindex == 0 && form == 0)
8649 break;
8650 }
8651 }
8652
8653 printf (_("\nSymbol table:\n"));
8654 uint32_t namei;
8655 for (namei = 0; namei < name_count; ++namei)
8656 {
8657 uint64_t string_offset, entry_offset;
8658
8659 SAFE_BYTE_GET (string_offset,
8660 name_table_string_offsets + namei * offset_size,
8661 offset_size, unit_end);
8662 SAFE_BYTE_GET (entry_offset,
8663 name_table_entry_offsets + namei * offset_size,
8664 offset_size, unit_end);
8665
8666 printf ("[%3u] #%08x %s:", namei, hash_table_hashes[namei],
8667 fetch_indirect_string (string_offset));
8668
8669 unsigned char *entryptr = entry_pool + entry_offset;
8670
8671 // We need to scan first whether there is a single or multiple
8672 // entries. TAGNO is -2 for the first entry, it is -1 for the
8673 // initial tag read of the second entry, then it becomes 0 for the
8674 // first entry for real printing etc.
8675 int tagno = -2;
8676 /* Initialize it due to a false compiler warning. */
8677 dwarf_vma second_abbrev_tag = -1;
8678 for (;;)
8679 {
8680 unsigned int bytes_read;
8681 const dwarf_vma abbrev_tag = read_uleb128 (entryptr, &bytes_read,
8682 unit_end);
8683 entryptr += bytes_read;
8684 if (tagno == -1)
8685 {
8686 second_abbrev_tag = abbrev_tag;
8687 tagno = 0;
8688 entryptr = entry_pool + entry_offset;
8689 continue;
8690 }
8691 if (abbrev_tag == 0)
8692 break;
8693 if (tagno >= 0)
8694 printf ("%s<%lu>",
8695 (tagno == 0 && second_abbrev_tag == 0 ? " " : "\n\t"),
8696 (unsigned long) abbrev_tag);
8697
8698 const struct abbrev_lookup_entry *entry;
8699 for (entry = abbrev_lookup;
8700 entry < abbrev_lookup + abbrev_lookup_used;
8701 entry++)
8702 if (entry->abbrev_tag == abbrev_tag)
8703 break;
8704 if (entry >= abbrev_lookup + abbrev_lookup_used)
8705 {
8706 warn (_("Undefined abbreviation tag %lu "
8707 "in unit 0x%lx in the debug_names\n"),
8708 (long) abbrev_tag,
8709 (long) (unit_start - section->start));
8710 break;
8711 }
8712 abbrevptr = entry->abbrev_lookup_ptr;
8713 const dwarf_vma dwarf_tag = read_uleb128 (abbrevptr, &bytes_read,
8714 abbrev_table_end);
8715 abbrevptr += bytes_read;
8716 if (tagno >= 0)
8717 printf (" %s", get_TAG_name (dwarf_tag));
8718 for (;;)
8719 {
8720 const dwarf_vma xindex = read_uleb128 (abbrevptr,
8721 &bytes_read,
8722 abbrev_table_end);
8723 abbrevptr += bytes_read;
8724 const dwarf_vma form = read_uleb128 (abbrevptr, &bytes_read,
8725 abbrev_table_end);
8726 abbrevptr += bytes_read;
8727 if (xindex == 0 && form == 0)
8728 break;
8729
8730 if (tagno >= 0)
8731 printf (" %s", get_IDX_name (xindex));
8732 entryptr = read_and_display_attr_value (0, form, 0, entryptr,
8733 unit_end, 0, 0,
8734 offset_size,
8735 dwarf_version, NULL,
8736 (tagno < 0), NULL,
8737 NULL, '=');
8738 }
8739 ++tagno;
8740 }
8741 if (tagno <= 0)
8742 printf (_(" <no entries>"));
8743 putchar ('\n');
8744 }
8745
8746 free (abbrev_lookup);
8747 }
8748
8749 return 1;
8750 }
8751
8752 static int
8753 display_debug_links (struct dwarf_section * section,
8754 void * file ATTRIBUTE_UNUSED)
8755 {
8756 const unsigned char * filename;
8757 unsigned int filelen;
8758
8759 introduce (section, FALSE);
8760
8761 /* The .gnu_debuglink section is formatted as:
8762 (c-string) Filename.
8763 (padding) If needed to reach a 4 byte boundary.
8764 (uint32_t) CRC32 value.
8765
8766 The .gun_debugaltlink section is formatted as:
8767 (c-string) Filename.
8768 (binary) Build-ID. */
8769
8770 filename = section->start;
8771 filelen = strnlen ((const char *) filename, section->size);
8772 if (filelen == section->size)
8773 {
8774 warn (_("The debuglink filename is corrupt/missing\n"));
8775 return 0;
8776 }
8777
8778 printf (_(" Separate debug info file: %s\n"), filename);
8779
8780 if (const_strneq (section->name, ".gnu_debuglink"))
8781 {
8782 unsigned int crc32;
8783 unsigned int crc_offset;
8784
8785 crc_offset = filelen + 1;
8786 crc_offset = (crc_offset + 3) & ~3;
8787 if (crc_offset + 4 > section->size)
8788 {
8789 warn (_("CRC offset missing/truncated\n"));
8790 return 0;
8791 }
8792
8793 crc32 = byte_get (filename + crc_offset, 4);
8794
8795 printf (_(" CRC value: %#x\n"), crc32);
8796
8797 if (crc_offset + 4 < section->size)
8798 {
8799 warn (_("There are %#lx extraneous bytes at the end of the section\n"),
8800 (long)(section->size - (crc_offset + 4)));
8801 return 0;
8802 }
8803 }
8804 else /* const_strneq (section->name, ".gnu_debugaltlink") */
8805 {
8806 const unsigned char * build_id = section->start + filelen + 1;
8807 bfd_size_type build_id_len = section->size - (filelen + 1);
8808 bfd_size_type printed;
8809
8810 /* FIXME: Should we support smaller build-id notes ? */
8811 if (build_id_len < 0x14)
8812 {
8813 warn (_("Build-ID is too short (%#lx bytes)\n"), (long) build_id_len);
8814 return 0;
8815 }
8816
8817 printed = printf (_(" Build-ID (%#lx bytes):"), (long) build_id_len);
8818 display_data (printed, build_id, build_id_len);
8819 putchar ('\n');
8820 }
8821
8822 putchar ('\n');
8823 return 1;
8824 }
8825
8826 static int
8827 display_gdb_index (struct dwarf_section *section,
8828 void *file ATTRIBUTE_UNUSED)
8829 {
8830 unsigned char *start = section->start;
8831 uint32_t version;
8832 uint32_t cu_list_offset, tu_list_offset;
8833 uint32_t address_table_offset, symbol_table_offset, constant_pool_offset;
8834 unsigned int cu_list_elements, tu_list_elements;
8835 unsigned int address_table_size, symbol_table_slots;
8836 unsigned char *cu_list, *tu_list;
8837 unsigned char *address_table, *symbol_table, *constant_pool;
8838 unsigned int i;
8839
8840 /* The documentation for the format of this file is in gdb/dwarf2read.c. */
8841
8842 introduce (section, FALSE);
8843
8844 if (section->size < 6 * sizeof (uint32_t))
8845 {
8846 warn (_("Truncated header in the %s section.\n"), section->name);
8847 return 0;
8848 }
8849
8850 version = byte_get_little_endian (start, 4);
8851 printf (_("Version %ld\n"), (long) version);
8852
8853 /* Prior versions are obsolete, and future versions may not be
8854 backwards compatible. */
8855 if (version < 3 || version > 8)
8856 {
8857 warn (_("Unsupported version %lu.\n"), (unsigned long) version);
8858 return 0;
8859 }
8860 if (version < 4)
8861 warn (_("The address table data in version 3 may be wrong.\n"));
8862 if (version < 5)
8863 warn (_("Version 4 does not support case insensitive lookups.\n"));
8864 if (version < 6)
8865 warn (_("Version 5 does not include inlined functions.\n"));
8866 if (version < 7)
8867 warn (_("Version 6 does not include symbol attributes.\n"));
8868 /* Version 7 indices generated by Gold have bad type unit references,
8869 PR binutils/15021. But we don't know if the index was generated by
8870 Gold or not, so to avoid worrying users with gdb-generated indices
8871 we say nothing for version 7 here. */
8872
8873 cu_list_offset = byte_get_little_endian (start + 4, 4);
8874 tu_list_offset = byte_get_little_endian (start + 8, 4);
8875 address_table_offset = byte_get_little_endian (start + 12, 4);
8876 symbol_table_offset = byte_get_little_endian (start + 16, 4);
8877 constant_pool_offset = byte_get_little_endian (start + 20, 4);
8878
8879 if (cu_list_offset > section->size
8880 || tu_list_offset > section->size
8881 || address_table_offset > section->size
8882 || symbol_table_offset > section->size
8883 || constant_pool_offset > section->size)
8884 {
8885 warn (_("Corrupt header in the %s section.\n"), section->name);
8886 return 0;
8887 }
8888
8889 /* PR 17531: file: 418d0a8a. */
8890 if (tu_list_offset < cu_list_offset)
8891 {
8892 warn (_("TU offset (%x) is less than CU offset (%x)\n"),
8893 tu_list_offset, cu_list_offset);
8894 return 0;
8895 }
8896
8897 cu_list_elements = (tu_list_offset - cu_list_offset) / 8;
8898
8899 if (address_table_offset < tu_list_offset)
8900 {
8901 warn (_("Address table offset (%x) is less than TU offset (%x)\n"),
8902 address_table_offset, tu_list_offset);
8903 return 0;
8904 }
8905
8906 tu_list_elements = (address_table_offset - tu_list_offset) / 8;
8907
8908 /* PR 17531: file: 18a47d3d. */
8909 if (symbol_table_offset < address_table_offset)
8910 {
8911 warn (_("Symbol table offset (%x) is less then Address table offset (%x)\n"),
8912 symbol_table_offset, address_table_offset);
8913 return 0;
8914 }
8915
8916 address_table_size = symbol_table_offset - address_table_offset;
8917
8918 if (constant_pool_offset < symbol_table_offset)
8919 {
8920 warn (_("Constant pool offset (%x) is less than symbol table offset (%x)\n"),
8921 constant_pool_offset, symbol_table_offset);
8922 return 0;
8923 }
8924
8925 symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8;
8926
8927 cu_list = start + cu_list_offset;
8928 tu_list = start + tu_list_offset;
8929 address_table = start + address_table_offset;
8930 symbol_table = start + symbol_table_offset;
8931 constant_pool = start + constant_pool_offset;
8932
8933 if (address_table + address_table_size > section->start + section->size)
8934 {
8935 warn (_("Address table extends beyond end of section.\n"));
8936 return 0;
8937 }
8938
8939 printf (_("\nCU table:\n"));
8940 for (i = 0; i < cu_list_elements; i += 2)
8941 {
8942 uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8);
8943 uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8);
8944
8945 printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2,
8946 (unsigned long) cu_offset,
8947 (unsigned long) (cu_offset + cu_length - 1));
8948 }
8949
8950 printf (_("\nTU table:\n"));
8951 for (i = 0; i < tu_list_elements; i += 3)
8952 {
8953 uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8);
8954 uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8);
8955 uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8);
8956
8957 printf (_("[%3u] 0x%lx 0x%lx "), i / 3,
8958 (unsigned long) tu_offset,
8959 (unsigned long) type_offset);
8960 print_dwarf_vma (signature, 8);
8961 printf ("\n");
8962 }
8963
8964 printf (_("\nAddress table:\n"));
8965 for (i = 0; i < address_table_size && i <= address_table_size - (2 * 8 + 4);
8966 i += 2 * 8 + 4)
8967 {
8968 uint64_t low = byte_get_little_endian (address_table + i, 8);
8969 uint64_t high = byte_get_little_endian (address_table + i + 8, 8);
8970 uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4);
8971
8972 print_dwarf_vma (low, 8);
8973 print_dwarf_vma (high, 8);
8974 printf (_("%lu\n"), (unsigned long) cu_index);
8975 }
8976
8977 printf (_("\nSymbol table:\n"));
8978 for (i = 0; i < symbol_table_slots; ++i)
8979 {
8980 uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4);
8981 uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4);
8982 uint32_t num_cus, cu;
8983
8984 if (name_offset != 0
8985 || cu_vector_offset != 0)
8986 {
8987 unsigned int j;
8988 unsigned char * adr;
8989
8990 adr = constant_pool + name_offset;
8991 /* PR 17531: file: 5b7b07ad. */
8992 if (adr < constant_pool || adr >= section->start + section->size)
8993 {
8994 printf (_("[%3u] <corrupt offset: %x>"), i, name_offset);
8995 warn (_("Corrupt name offset of 0x%x found for symbol table slot %d\n"),
8996 name_offset, i);
8997 }
8998 else
8999 printf ("[%3u] %.*s:", i,
9000 (int) (section->size - (constant_pool_offset + name_offset)),
9001 constant_pool + name_offset);
9002
9003 adr = constant_pool + cu_vector_offset;
9004 if (adr < constant_pool || adr >= section->start + section->size - 3)
9005 {
9006 printf (_("<invalid CU vector offset: %x>\n"), cu_vector_offset);
9007 warn (_("Corrupt CU vector offset of 0x%x found for symbol table slot %d\n"),
9008 cu_vector_offset, i);
9009 continue;
9010 }
9011
9012 num_cus = byte_get_little_endian (adr, 4);
9013
9014 adr = constant_pool + cu_vector_offset + 4 + num_cus * 4;
9015 if (num_cus * 4 < num_cus
9016 || adr >= section->start + section->size
9017 || adr < constant_pool)
9018 {
9019 printf ("<invalid number of CUs: %d>\n", num_cus);
9020 warn (_("Invalid number of CUs (0x%x) for symbol table slot %d\n"),
9021 num_cus, i);
9022 continue;
9023 }
9024
9025 if (num_cus > 1)
9026 printf ("\n");
9027
9028 for (j = 0; j < num_cus; ++j)
9029 {
9030 int is_static;
9031 gdb_index_symbol_kind kind;
9032
9033 cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4);
9034 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu);
9035 kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu);
9036 cu = GDB_INDEX_CU_VALUE (cu);
9037 /* Convert to TU number if it's for a type unit. */
9038 if (cu >= cu_list_elements / 2)
9039 printf ("%cT%lu", num_cus > 1 ? '\t' : ' ',
9040 (unsigned long) (cu - cu_list_elements / 2));
9041 else
9042 printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu);
9043
9044 printf (" [%s, %s]",
9045 is_static ? _("static") : _("global"),
9046 get_gdb_index_symbol_kind_name (kind));
9047 if (num_cus > 1)
9048 printf ("\n");
9049 }
9050 if (num_cus <= 1)
9051 printf ("\n");
9052 }
9053 }
9054
9055 return 1;
9056 }
9057
9058 /* Pre-allocate enough space for the CU/TU sets needed. */
9059
9060 static void
9061 prealloc_cu_tu_list (unsigned int nshndx)
9062 {
9063 if (shndx_pool == NULL)
9064 {
9065 shndx_pool_size = nshndx;
9066 shndx_pool_used = 0;
9067 shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size,
9068 sizeof (unsigned int));
9069 }
9070 else
9071 {
9072 shndx_pool_size = shndx_pool_used + nshndx;
9073 shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size,
9074 sizeof (unsigned int));
9075 }
9076 }
9077
9078 static void
9079 add_shndx_to_cu_tu_entry (unsigned int shndx)
9080 {
9081 if (shndx_pool_used >= shndx_pool_size)
9082 {
9083 error (_("Internal error: out of space in the shndx pool.\n"));
9084 return;
9085 }
9086 shndx_pool [shndx_pool_used++] = shndx;
9087 }
9088
9089 static void
9090 end_cu_tu_entry (void)
9091 {
9092 if (shndx_pool_used >= shndx_pool_size)
9093 {
9094 error (_("Internal error: out of space in the shndx pool.\n"));
9095 return;
9096 }
9097 shndx_pool [shndx_pool_used++] = 0;
9098 }
9099
9100 /* Return the short name of a DWARF section given by a DW_SECT enumerator. */
9101
9102 static const char *
9103 get_DW_SECT_short_name (unsigned int dw_sect)
9104 {
9105 static char buf[16];
9106
9107 switch (dw_sect)
9108 {
9109 case DW_SECT_INFO:
9110 return "info";
9111 case DW_SECT_TYPES:
9112 return "types";
9113 case DW_SECT_ABBREV:
9114 return "abbrev";
9115 case DW_SECT_LINE:
9116 return "line";
9117 case DW_SECT_LOC:
9118 return "loc";
9119 case DW_SECT_STR_OFFSETS:
9120 return "str_off";
9121 case DW_SECT_MACINFO:
9122 return "macinfo";
9123 case DW_SECT_MACRO:
9124 return "macro";
9125 default:
9126 break;
9127 }
9128
9129 snprintf (buf, sizeof (buf), "%d", dw_sect);
9130 return buf;
9131 }
9132
9133 /* Process a CU or TU index. If DO_DISPLAY is true, print the contents.
9134 These sections are extensions for Fission.
9135 See http://gcc.gnu.org/wiki/DebugFissionDWP. */
9136
9137 static int
9138 process_cu_tu_index (struct dwarf_section *section, int do_display)
9139 {
9140 unsigned char *phdr = section->start;
9141 unsigned char *limit = phdr + section->size;
9142 unsigned char *phash;
9143 unsigned char *pindex;
9144 unsigned char *ppool;
9145 unsigned int version;
9146 unsigned int ncols = 0;
9147 unsigned int nused;
9148 unsigned int nslots;
9149 unsigned int i;
9150 unsigned int j;
9151 dwarf_vma signature_high;
9152 dwarf_vma signature_low;
9153 char buf[64];
9154
9155 /* PR 17512: file: 002-168123-0.004. */
9156 if (phdr == NULL)
9157 {
9158 warn (_("Section %s is empty\n"), section->name);
9159 return 0;
9160 }
9161 /* PR 17512: file: 002-376-0.004. */
9162 if (section->size < 24)
9163 {
9164 warn (_("Section %s is too small to contain a CU/TU header\n"),
9165 section->name);
9166 return 0;
9167 }
9168
9169 SAFE_BYTE_GET (version, phdr, 4, limit);
9170 if (version >= 2)
9171 SAFE_BYTE_GET (ncols, phdr + 4, 4, limit);
9172 SAFE_BYTE_GET (nused, phdr + 8, 4, limit);
9173 SAFE_BYTE_GET (nslots, phdr + 12, 4, limit);
9174
9175 phash = phdr + 16;
9176 pindex = phash + nslots * 8;
9177 ppool = pindex + nslots * 4;
9178
9179 /* PR 17531: file: 45d69832. */
9180 if (pindex < phash || ppool < phdr || (pindex == phash && nslots != 0))
9181 {
9182 warn (ngettext ("Section %s is too small for %d slot\n",
9183 "Section %s is too small for %d slots\n",
9184 nslots),
9185 section->name, nslots);
9186 return 0;
9187 }
9188
9189 if (do_display)
9190 {
9191 introduce (section, FALSE);
9192
9193 printf (_(" Version: %d\n"), version);
9194 if (version >= 2)
9195 printf (_(" Number of columns: %d\n"), ncols);
9196 printf (_(" Number of used entries: %d\n"), nused);
9197 printf (_(" Number of slots: %d\n\n"), nslots);
9198 }
9199
9200 if (ppool > limit || ppool < phdr)
9201 {
9202 warn (_("Section %s too small for %d hash table entries\n"),
9203 section->name, nslots);
9204 return 0;
9205 }
9206
9207 if (version == 1)
9208 {
9209 if (!do_display)
9210 prealloc_cu_tu_list ((limit - ppool) / 4);
9211 for (i = 0; i < nslots; i++)
9212 {
9213 unsigned char *shndx_list;
9214 unsigned int shndx;
9215
9216 SAFE_BYTE_GET64 (phash, &signature_high, &signature_low, limit);
9217 if (signature_high != 0 || signature_low != 0)
9218 {
9219 SAFE_BYTE_GET (j, pindex, 4, limit);
9220 shndx_list = ppool + j * 4;
9221 /* PR 17531: file: 705e010d. */
9222 if (shndx_list < ppool)
9223 {
9224 warn (_("Section index pool located before start of section\n"));
9225 return 0;
9226 }
9227
9228 if (do_display)
9229 printf (_(" [%3d] Signature: 0x%s Sections: "),
9230 i, dwarf_vmatoa64 (signature_high, signature_low,
9231 buf, sizeof (buf)));
9232 for (;;)
9233 {
9234 if (shndx_list >= limit)
9235 {
9236 warn (_("Section %s too small for shndx pool\n"),
9237 section->name);
9238 return 0;
9239 }
9240 SAFE_BYTE_GET (shndx, shndx_list, 4, limit);
9241 if (shndx == 0)
9242 break;
9243 if (do_display)
9244 printf (" %d", shndx);
9245 else
9246 add_shndx_to_cu_tu_entry (shndx);
9247 shndx_list += 4;
9248 }
9249 if (do_display)
9250 printf ("\n");
9251 else
9252 end_cu_tu_entry ();
9253 }
9254 phash += 8;
9255 pindex += 4;
9256 }
9257 }
9258 else if (version == 2)
9259 {
9260 unsigned int val;
9261 unsigned int dw_sect;
9262 unsigned char *ph = phash;
9263 unsigned char *pi = pindex;
9264 unsigned char *poffsets = ppool + ncols * 4;
9265 unsigned char *psizes = poffsets + nused * ncols * 4;
9266 unsigned char *pend = psizes + nused * ncols * 4;
9267 bfd_boolean is_tu_index;
9268 struct cu_tu_set *this_set = NULL;
9269 unsigned int row;
9270 unsigned char *prow;
9271
9272 is_tu_index = strcmp (section->name, ".debug_tu_index") == 0;
9273
9274 /* PR 17531: file: 0dd159bf.
9275 Check for wraparound with an overlarge ncols value. */
9276 if (poffsets < ppool || (unsigned int) ((poffsets - ppool) / 4) != ncols)
9277 {
9278 warn (_("Overlarge number of columns: %x\n"), ncols);
9279 return 0;
9280 }
9281
9282 if (pend > limit)
9283 {
9284 warn (_("Section %s too small for offset and size tables\n"),
9285 section->name);
9286 return 0;
9287 }
9288
9289 if (do_display)
9290 {
9291 printf (_(" Offset table\n"));
9292 printf (" slot %-16s ",
9293 is_tu_index ? _("signature") : _("dwo_id"));
9294 }
9295 else
9296 {
9297 if (is_tu_index)
9298 {
9299 tu_count = nused;
9300 tu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
9301 this_set = tu_sets;
9302 }
9303 else
9304 {
9305 cu_count = nused;
9306 cu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
9307 this_set = cu_sets;
9308 }
9309 }
9310
9311 if (do_display)
9312 {
9313 for (j = 0; j < ncols; j++)
9314 {
9315 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
9316 printf (" %8s", get_DW_SECT_short_name (dw_sect));
9317 }
9318 printf ("\n");
9319 }
9320
9321 for (i = 0; i < nslots; i++)
9322 {
9323 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
9324
9325 SAFE_BYTE_GET (row, pi, 4, limit);
9326 if (row != 0)
9327 {
9328 /* PR 17531: file: a05f6ab3. */
9329 if (row > nused)
9330 {
9331 warn (_("Row index (%u) is larger than number of used entries (%u)\n"),
9332 row, nused);
9333 return 0;
9334 }
9335
9336 if (!do_display)
9337 {
9338 size_t num_copy = sizeof (uint64_t);
9339
9340 /* PR 23064: Beware of buffer overflow. */
9341 if (ph + num_copy < limit)
9342 memcpy (&this_set[row - 1].signature, ph, num_copy);
9343 else
9344 {
9345 warn (_("Signature (%p) extends beyond end of space in section\n"), ph);
9346 return 0;
9347 }
9348 }
9349
9350 prow = poffsets + (row - 1) * ncols * 4;
9351 /* PR 17531: file: b8ce60a8. */
9352 if (prow < poffsets || prow > limit)
9353 {
9354 warn (_("Row index (%u) * num columns (%u) > space remaining in section\n"),
9355 row, ncols);
9356 return 0;
9357 }
9358
9359 if (do_display)
9360 printf (_(" [%3d] 0x%s"),
9361 i, dwarf_vmatoa64 (signature_high, signature_low,
9362 buf, sizeof (buf)));
9363 for (j = 0; j < ncols; j++)
9364 {
9365 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
9366 if (do_display)
9367 printf (" %8d", val);
9368 else
9369 {
9370 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
9371
9372 /* PR 17531: file: 10796eb3. */
9373 if (dw_sect >= DW_SECT_MAX)
9374 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
9375 else
9376 this_set [row - 1].section_offsets [dw_sect] = val;
9377 }
9378 }
9379
9380 if (do_display)
9381 printf ("\n");
9382 }
9383 ph += 8;
9384 pi += 4;
9385 }
9386
9387 ph = phash;
9388 pi = pindex;
9389 if (do_display)
9390 {
9391 printf ("\n");
9392 printf (_(" Size table\n"));
9393 printf (" slot %-16s ",
9394 is_tu_index ? _("signature") : _("dwo_id"));
9395 }
9396
9397 for (j = 0; j < ncols; j++)
9398 {
9399 SAFE_BYTE_GET (val, ppool + j * 4, 4, limit);
9400 if (do_display)
9401 printf (" %8s", get_DW_SECT_short_name (val));
9402 }
9403
9404 if (do_display)
9405 printf ("\n");
9406
9407 for (i = 0; i < nslots; i++)
9408 {
9409 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
9410
9411 SAFE_BYTE_GET (row, pi, 4, limit);
9412 if (row != 0)
9413 {
9414 prow = psizes + (row - 1) * ncols * 4;
9415
9416 if (do_display)
9417 printf (_(" [%3d] 0x%s"),
9418 i, dwarf_vmatoa64 (signature_high, signature_low,
9419 buf, sizeof (buf)));
9420
9421 for (j = 0; j < ncols; j++)
9422 {
9423 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
9424 if (do_display)
9425 printf (" %8d", val);
9426 else
9427 {
9428 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
9429 if (dw_sect >= DW_SECT_MAX)
9430 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
9431 else
9432 this_set [row - 1].section_sizes [dw_sect] = val;
9433 }
9434 }
9435
9436 if (do_display)
9437 printf ("\n");
9438 }
9439
9440 ph += 8;
9441 pi += 4;
9442 }
9443 }
9444 else if (do_display)
9445 printf (_(" Unsupported version (%d)\n"), version);
9446
9447 if (do_display)
9448 printf ("\n");
9449
9450 return 1;
9451 }
9452
9453 /* Load the CU and TU indexes if present. This will build a list of
9454 section sets that we can use to associate a .debug_info.dwo section
9455 with its associated .debug_abbrev.dwo section in a .dwp file. */
9456
9457 static bfd_boolean
9458 load_cu_tu_indexes (void *file)
9459 {
9460 static int cu_tu_indexes_read = -1; /* Tri-state variable. */
9461
9462 /* If we have already loaded (or tried to load) the CU and TU indexes
9463 then do not bother to repeat the task. */
9464 if (cu_tu_indexes_read == -1)
9465 {
9466 cu_tu_indexes_read = TRUE;
9467
9468 if (load_debug_section_with_follow (dwp_cu_index, file))
9469 if (! process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0))
9470 cu_tu_indexes_read = FALSE;
9471
9472 if (load_debug_section_with_follow (dwp_tu_index, file))
9473 if (! process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0))
9474 cu_tu_indexes_read = FALSE;
9475 }
9476
9477 return (bfd_boolean) cu_tu_indexes_read;
9478 }
9479
9480 /* Find the set of sections that includes section SHNDX. */
9481
9482 unsigned int *
9483 find_cu_tu_set (void *file, unsigned int shndx)
9484 {
9485 unsigned int i;
9486
9487 if (! load_cu_tu_indexes (file))
9488 return NULL;
9489
9490 /* Find SHNDX in the shndx pool. */
9491 for (i = 0; i < shndx_pool_used; i++)
9492 if (shndx_pool [i] == shndx)
9493 break;
9494
9495 if (i >= shndx_pool_used)
9496 return NULL;
9497
9498 /* Now backup to find the first entry in the set. */
9499 while (i > 0 && shndx_pool [i - 1] != 0)
9500 i--;
9501
9502 return shndx_pool + i;
9503 }
9504
9505 /* Display a .debug_cu_index or .debug_tu_index section. */
9506
9507 static int
9508 display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
9509 {
9510 return process_cu_tu_index (section, 1);
9511 }
9512
9513 static int
9514 display_debug_not_supported (struct dwarf_section *section,
9515 void *file ATTRIBUTE_UNUSED)
9516 {
9517 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9518 section->name);
9519
9520 return 1;
9521 }
9522
9523 /* Like malloc, but takes two parameters like calloc.
9524 Verifies that the first parameter is not too large.
9525 Note: does *not* initialise the allocated memory to zero. */
9526
9527 void *
9528 cmalloc (size_t nmemb, size_t size)
9529 {
9530 /* Check for overflow. */
9531 if (nmemb >= ~(size_t) 0 / size)
9532 return NULL;
9533
9534 return xmalloc (nmemb * size);
9535 }
9536
9537 /* Like xmalloc, but takes two parameters like calloc.
9538 Verifies that the first parameter is not too large.
9539 Note: does *not* initialise the allocated memory to zero. */
9540
9541 void *
9542 xcmalloc (size_t nmemb, size_t size)
9543 {
9544 /* Check for overflow. */
9545 if (nmemb >= ~(size_t) 0 / size)
9546 {
9547 fprintf (stderr,
9548 _("Attempt to allocate an array with an excessive number of elements: 0x%lx\n"),
9549 (long) nmemb);
9550 xexit (1);
9551 }
9552
9553 return xmalloc (nmemb * size);
9554 }
9555
9556 /* Like xrealloc, but takes three parameters.
9557 Verifies that the second parameter is not too large.
9558 Note: does *not* initialise any new memory to zero. */
9559
9560 void *
9561 xcrealloc (void *ptr, size_t nmemb, size_t size)
9562 {
9563 /* Check for overflow. */
9564 if (nmemb >= ~(size_t) 0 / size)
9565 {
9566 error (_("Attempt to re-allocate an array with an excessive number of elements: 0x%lx\n"),
9567 (long) nmemb);
9568 xexit (1);
9569 }
9570
9571 return xrealloc (ptr, nmemb * size);
9572 }
9573
9574 /* Like xcalloc, but verifies that the first parameter is not too large. */
9575
9576 void *
9577 xcalloc2 (size_t nmemb, size_t size)
9578 {
9579 /* Check for overflow. */
9580 if (nmemb >= ~(size_t) 0 / size)
9581 {
9582 error (_("Attempt to allocate a zero'ed array with an excessive number of elements: 0x%lx\n"),
9583 (long) nmemb);
9584 xexit (1);
9585 }
9586
9587 return xcalloc (nmemb, size);
9588 }
9589
9590 static unsigned long
9591 calc_gnu_debuglink_crc32 (unsigned long crc,
9592 const unsigned char * buf,
9593 bfd_size_type len)
9594 {
9595 static const unsigned long crc32_table[256] =
9596 {
9597 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
9598 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
9599 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
9600 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
9601 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
9602 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
9603 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
9604 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
9605 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
9606 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
9607 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
9608 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
9609 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
9610 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
9611 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
9612 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
9613 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
9614 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
9615 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
9616 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
9617 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
9618 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
9619 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
9620 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
9621 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
9622 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
9623 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
9624 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
9625 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
9626 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
9627 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
9628 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
9629 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
9630 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
9631 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
9632 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
9633 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
9634 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
9635 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
9636 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
9637 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
9638 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
9639 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
9640 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
9641 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
9642 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
9643 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
9644 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
9645 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
9646 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
9647 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
9648 0x2d02ef8d
9649 };
9650 const unsigned char *end;
9651
9652 crc = ~crc & 0xffffffff;
9653 for (end = buf + len; buf < end; ++ buf)
9654 crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
9655 return ~crc & 0xffffffff;
9656 }
9657
9658 typedef bfd_boolean (* check_func_type) (const char *, void *);
9659 typedef const char * (* parse_func_type) (struct dwarf_section *, void *);
9660
9661 static bfd_boolean
9662 check_gnu_debuglink (const char * pathname, void * crc_pointer)
9663 {
9664 static unsigned char buffer [8 * 1024];
9665 FILE * f;
9666 bfd_size_type count;
9667 unsigned long crc = 0;
9668 void * sep_data;
9669
9670 sep_data = open_debug_file (pathname);
9671 if (sep_data == NULL)
9672 return FALSE;
9673
9674 /* Yes - we are opening the file twice... */
9675 f = fopen (pathname, "rb");
9676 if (f == NULL)
9677 {
9678 /* Paranoia: This should never happen. */
9679 close_debug_file (sep_data);
9680 warn (_("Unable to reopen separate debug info file: %s\n"), pathname);
9681 return FALSE;
9682 }
9683
9684 while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0)
9685 crc = calc_gnu_debuglink_crc32 (crc, buffer, count);
9686
9687 fclose (f);
9688
9689 if (crc != * (unsigned long *) crc_pointer)
9690 {
9691 close_debug_file (sep_data);
9692 warn (_("Separate debug info file %s found, but CRC does not match - ignoring\n"),
9693 pathname);
9694 return FALSE;
9695 }
9696
9697 return TRUE;
9698 }
9699
9700 static const char *
9701 parse_gnu_debuglink (struct dwarf_section * section, void * data)
9702 {
9703 const char * name;
9704 unsigned int crc_offset;
9705 unsigned long * crc32 = (unsigned long *) data;
9706
9707 /* The name is first.
9708 The CRC value is stored after the filename, aligned up to 4 bytes. */
9709 name = (const char *) section->start;
9710
9711 crc_offset = strnlen (name, section->size) + 1;
9712 crc_offset = (crc_offset + 3) & ~3;
9713 if (crc_offset + 4 > section->size)
9714 return NULL;
9715
9716 * crc32 = byte_get (section->start + crc_offset, 4);
9717 return name;
9718 }
9719
9720 static bfd_boolean
9721 check_gnu_debugaltlink (const char * filename, void * data ATTRIBUTE_UNUSED)
9722 {
9723 void * sep_data = open_debug_file (filename);
9724
9725 if (sep_data == NULL)
9726 return FALSE;
9727
9728 /* FIXME: We should now extract the build-id in the separate file
9729 and check it... */
9730
9731 return TRUE;
9732 }
9733
9734 typedef struct build_id_data
9735 {
9736 bfd_size_type len;
9737 const unsigned char * data;
9738 } Build_id_data;
9739
9740 static const char *
9741 parse_gnu_debugaltlink (struct dwarf_section * section, void * data)
9742 {
9743 const char * name;
9744 bfd_size_type namelen;
9745 bfd_size_type id_len;
9746 Build_id_data * build_id_data;
9747
9748 /* The name is first.
9749 The build-id follows immediately, with no padding, up to the section's end. */
9750
9751 name = (const char *) section->start;
9752 namelen = strnlen (name, section->size) + 1;
9753 if (namelen >= section->size)
9754 return NULL;
9755
9756 id_len = section->size - namelen;
9757 if (id_len < 0x14)
9758 return NULL;
9759
9760 build_id_data = calloc (1, sizeof * build_id_data);
9761 if (build_id_data == NULL)
9762 return NULL;
9763
9764 build_id_data->len = id_len;
9765 build_id_data->data = section->start + namelen;
9766
9767 * (Build_id_data **) data = build_id_data;
9768
9769 return name;
9770 }
9771
9772 static void *
9773 load_separate_debug_info (const char * main_filename,
9774 struct dwarf_section * xlink,
9775 parse_func_type parse_func,
9776 check_func_type check_func,
9777 void * func_data)
9778 {
9779 const char * separate_filename;
9780 char * debugfile;
9781 char * canon_dir;
9782 size_t canon_dirlen;
9783 size_t dirlen;
9784
9785 if ((separate_filename = parse_func (xlink, func_data)) == NULL)
9786 {
9787 warn (_("Corrupt debuglink section: %s\n"),
9788 xlink->name ? xlink->name : xlink->uncompressed_name);
9789 return FALSE;
9790 }
9791
9792 /* Attempt to locate the separate file.
9793 This should duplicate the logic in bfd/opncls.c:find_separate_debug_file(). */
9794
9795 canon_dir = lrealpath (main_filename);
9796
9797 for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
9798 if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
9799 break;
9800 canon_dir[canon_dirlen] = '\0';
9801
9802 #ifndef DEBUGDIR
9803 #define DEBUGDIR "/lib/debug"
9804 #endif
9805 #ifndef EXTRA_DEBUG_ROOT1
9806 #define EXTRA_DEBUG_ROOT1 "/usr/lib/debug"
9807 #endif
9808 #ifndef EXTRA_DEBUG_ROOT2
9809 #define EXTRA_DEBUG_ROOT2 "/usr/lib/debug/usr"
9810 #endif
9811
9812 debugfile = (char *) malloc (strlen (DEBUGDIR) + 1
9813 + canon_dirlen
9814 + strlen (".debug/")
9815 #ifdef EXTRA_DEBUG_ROOT1
9816 + strlen (EXTRA_DEBUG_ROOT1)
9817 #endif
9818 #ifdef EXTRA_DEBUG_ROOT2
9819 + strlen (EXTRA_DEBUG_ROOT2)
9820 #endif
9821 + strlen (separate_filename)
9822 + 1);
9823 if (debugfile == NULL)
9824 {
9825 warn (_("Out of memory"));
9826 free (canon_dir);
9827 return NULL;
9828 }
9829
9830 /* First try in the current directory. */
9831 sprintf (debugfile, "%s", separate_filename);
9832 if (check_func (debugfile, func_data))
9833 goto found;
9834
9835 /* Then try in a subdirectory called .debug. */
9836 sprintf (debugfile, ".debug/%s", separate_filename);
9837 if (check_func (debugfile, func_data))
9838 goto found;
9839
9840 /* Then try in the same directory as the original file. */
9841 sprintf (debugfile, "%s%s", canon_dir, separate_filename);
9842 if (check_func (debugfile, func_data))
9843 goto found;
9844
9845 /* And the .debug subdirectory of that directory. */
9846 sprintf (debugfile, "%s.debug/%s", canon_dir, separate_filename);
9847 if (check_func (debugfile, func_data))
9848 goto found;
9849
9850 #ifdef EXTRA_DEBUG_ROOT1
9851 /* Try the first extra debug file root. */
9852 sprintf (debugfile, "%s/%s", EXTRA_DEBUG_ROOT1, separate_filename);
9853 if (check_func (debugfile, func_data))
9854 goto found;
9855 #endif
9856
9857 #ifdef EXTRA_DEBUG_ROOT2
9858 /* Try the second extra debug file root. */
9859 sprintf (debugfile, "%s/%s", EXTRA_DEBUG_ROOT2, separate_filename);
9860 if (check_func (debugfile, func_data))
9861 goto found;
9862 #endif
9863
9864 /* Then try in the global debugfile directory. */
9865 strcpy (debugfile, DEBUGDIR);
9866 dirlen = strlen (DEBUGDIR) - 1;
9867 if (dirlen > 0 && DEBUGDIR[dirlen] != '/')
9868 strcat (debugfile, "/");
9869 strcat (debugfile, (const char *) separate_filename);
9870
9871 if (check_func (debugfile, func_data))
9872 goto found;
9873
9874 /* Failed to find the file. */
9875 warn (_("could not find separate debug file '%s'\n"), separate_filename);
9876 warn (_("tried: %s\n"), debugfile);
9877
9878 #ifdef EXTRA_DEBUG_ROOT2
9879 sprintf (debugfile, "%s/%s", EXTRA_DEBUG_ROOT2, separate_filename);
9880 warn (_("tried: %s\n"), debugfile);
9881 #endif
9882
9883 #ifdef EXTRA_DEBUG_ROOT1
9884 sprintf (debugfile, "%s/%s", EXTRA_DEBUG_ROOT1, separate_filename);
9885 warn (_("tried: %s\n"), debugfile);
9886 #endif
9887
9888 sprintf (debugfile, "%s.debug/%s", canon_dir, separate_filename);
9889 warn (_("tried: %s\n"), debugfile);
9890
9891 sprintf (debugfile, "%s%s", canon_dir, separate_filename);
9892 warn (_("tried: %s\n"), debugfile);
9893
9894 sprintf (debugfile, ".debug/%s", separate_filename);
9895 warn (_("tried: %s\n"), debugfile);
9896
9897 sprintf (debugfile, "%s", separate_filename);
9898 warn (_("tried: %s\n"), debugfile);
9899
9900 free (canon_dir);
9901 free (debugfile);
9902 return NULL;
9903
9904 found:
9905 free (canon_dir);
9906
9907 /* Now open the file.... */
9908 if ((separate_debug_file = open_debug_file (debugfile)) == NULL)
9909 {
9910 warn (_("failed to open separate debug file: %s\n"), debugfile);
9911 free (debugfile);
9912 return FALSE;
9913 }
9914
9915 /* FIXME: We do not check to see if there are any other separate debug info
9916 files that would also match. */
9917
9918 printf (_("%s: Found separate debug info file: %s\n\n"), main_filename, debugfile);
9919 separate_debug_filename = debugfile;
9920
9921 /* Do not free debugfile - it might be referenced inside
9922 the structure returned by open_debug_file(). */
9923 return separate_debug_file;
9924 }
9925
9926 /* Attempt to load a separate dwarf object file. */
9927
9928 static void *
9929 load_dwo_file (const char * main_filename)
9930 {
9931 char * filename;
9932
9933 /* FIXME: Skip adding / if dwo_dir ends in /. */
9934 filename = concat (dwo_dir, "/", dwo_name, NULL);
9935 if (filename == NULL)
9936 {
9937 warn (_("Out of memory allocating dwo filename\n"));
9938 return NULL;
9939 }
9940
9941 if ((separate_debug_file = open_debug_file (filename)) == NULL)
9942 {
9943 warn (_("Unable to load dwo file: %s\n"), filename);
9944 free (filename);
9945 return NULL;
9946 }
9947
9948 /* FIXME: We should check the dwo_id. */
9949
9950 printf (_("%s: Found separate debug object file: %s\n\n"), main_filename, filename);
9951 separate_debug_filename = filename;
9952 return separate_debug_file;
9953 }
9954
9955 /* Load a separate debug info file, if it exists.
9956 Returns the data pointer that is the result of calling open_debug_file
9957 on the separate debug info file, or NULL if there were problems or there
9958 is no such file. */
9959
9960 void *
9961 load_separate_debug_file (void * file, const char * filename)
9962 {
9963 /* Skip this operation if we are not interested in debug links. */
9964 if (! do_follow_links && ! do_debug_links)
9965 return NULL;
9966
9967 /* See if there is a dwo link. */
9968 if (load_debug_section (str, file)
9969 && load_debug_section (abbrev, file)
9970 && load_debug_section (info, file))
9971 {
9972 dwo_name = dwo_dir = NULL;
9973 dwo_id = NULL;
9974 dwo_id_len = 0;
9975
9976 if (process_debug_info (& debug_displays[info].section, file, abbrev, TRUE, FALSE))
9977 {
9978 if (dwo_name != NULL)
9979 {
9980 if (do_debug_links)
9981 {
9982 printf (_("The %s section contains a link to a dwo file:\n"),
9983 debug_displays [info].section.uncompressed_name);
9984 printf (_(" Name: %s\n"), dwo_name);
9985 printf (_(" Directory: %s\n"), dwo_dir ? dwo_dir : _("<not-found>"));
9986 if (dwo_id != NULL)
9987 display_data (printf (_(" ID: ")), dwo_id, dwo_id_len);
9988 else
9989 printf (_(" ID: <unknown>\n"));
9990 printf ("\n\n");
9991 }
9992
9993 /* FIXME: We do not check to see if there are any more dwo links in the file... */
9994 if (do_follow_links)
9995 return load_dwo_file (filename);
9996 }
9997 }
9998 }
9999
10000 if (! do_follow_links)
10001 /* The other debug links will be displayed by display_debug_links()
10002 so we do not need to do any further processing here. */
10003 return NULL;
10004
10005 /* FIXME: We do not check for the presence of both link sections in the same file. */
10006 /* FIXME: We do not check the separate debug info file to see if it too contains debuglinks. */
10007 /* FIXME: We do not check for the presence of multiple, same-name debuglink sections. */
10008 /* FIXME: We do not check for the presence of a dwo link as well as a debuglink. */
10009
10010 if (load_debug_section (gnu_debugaltlink, file))
10011 {
10012 Build_id_data * build_id_data;
10013
10014 return load_separate_debug_info (filename,
10015 & debug_displays[gnu_debugaltlink].section,
10016 parse_gnu_debugaltlink,
10017 check_gnu_debugaltlink,
10018 & build_id_data);
10019 }
10020
10021 if (load_debug_section (gnu_debuglink, file))
10022 {
10023 unsigned long crc32;
10024
10025 return load_separate_debug_info (filename,
10026 & debug_displays[gnu_debuglink].section,
10027 parse_gnu_debuglink,
10028 check_gnu_debuglink,
10029 & crc32);
10030 }
10031
10032 do_follow_links = 0;
10033 return NULL;
10034 }
10035
10036 void
10037 free_debug_memory (void)
10038 {
10039 unsigned int i;
10040
10041 free_abbrevs ();
10042
10043 for (i = 0; i < max; i++)
10044 free_debug_section ((enum dwarf_section_display_enum) i);
10045
10046 if (debug_information != NULL)
10047 {
10048 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
10049 {
10050 for (i = 0; i < num_debug_info_entries; i++)
10051 {
10052 if (!debug_information [i].max_loc_offsets)
10053 {
10054 free (debug_information [i].loc_offsets);
10055 free (debug_information [i].have_frame_base);
10056 }
10057 if (!debug_information [i].max_range_lists)
10058 free (debug_information [i].range_lists);
10059 }
10060 }
10061 free (debug_information);
10062 debug_information = NULL;
10063 alloc_num_debug_info_entries = num_debug_info_entries = 0;
10064 }
10065
10066 if (separate_debug_file != NULL)
10067 {
10068 close_debug_file (separate_debug_file);
10069 separate_debug_file = NULL;
10070
10071 free ((void *) separate_debug_filename);
10072 separate_debug_filename = NULL;
10073 }
10074 }
10075
10076 void
10077 dwarf_select_sections_by_names (const char *names)
10078 {
10079 typedef struct
10080 {
10081 const char * option;
10082 int * variable;
10083 int val;
10084 }
10085 debug_dump_long_opts;
10086
10087 static const debug_dump_long_opts opts_table [] =
10088 {
10089 /* Please keep this table alpha- sorted. */
10090 { "Ranges", & do_debug_ranges, 1 },
10091 { "abbrev", & do_debug_abbrevs, 1 },
10092 { "addr", & do_debug_addr, 1 },
10093 { "aranges", & do_debug_aranges, 1 },
10094 { "cu_index", & do_debug_cu_index, 1 },
10095 { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
10096 { "follow-links", & do_follow_links, 1 },
10097 { "frames", & do_debug_frames, 1 },
10098 { "frames-interp", & do_debug_frames_interp, 1 },
10099 /* The special .gdb_index section. */
10100 { "gdb_index", & do_gdb_index, 1 },
10101 { "info", & do_debug_info, 1 },
10102 { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility. */
10103 { "links", & do_debug_links, 1 },
10104 { "loc", & do_debug_loc, 1 },
10105 { "macro", & do_debug_macinfo, 1 },
10106 { "pubnames", & do_debug_pubnames, 1 },
10107 { "pubtypes", & do_debug_pubtypes, 1 },
10108 /* This entry is for compatibility
10109 with earlier versions of readelf. */
10110 { "ranges", & do_debug_aranges, 1 },
10111 { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
10112 { "str", & do_debug_str, 1 },
10113 /* These trace_* sections are used by Itanium VMS. */
10114 { "trace_abbrev", & do_trace_abbrevs, 1 },
10115 { "trace_aranges", & do_trace_aranges, 1 },
10116 { "trace_info", & do_trace_info, 1 },
10117 { NULL, NULL, 0 }
10118 };
10119
10120 const char *p;
10121
10122 p = names;
10123 while (*p)
10124 {
10125 const debug_dump_long_opts * entry;
10126
10127 for (entry = opts_table; entry->option; entry++)
10128 {
10129 size_t len = strlen (entry->option);
10130
10131 if (strncmp (p, entry->option, len) == 0
10132 && (p[len] == ',' || p[len] == '\0'))
10133 {
10134 * entry->variable |= entry->val;
10135
10136 /* The --debug-dump=frames-interp option also
10137 enables the --debug-dump=frames option. */
10138 if (do_debug_frames_interp)
10139 do_debug_frames = 1;
10140
10141 p += len;
10142 break;
10143 }
10144 }
10145
10146 if (entry->option == NULL)
10147 {
10148 warn (_("Unrecognized debug option '%s'\n"), p);
10149 p = strchr (p, ',');
10150 if (p == NULL)
10151 break;
10152 }
10153
10154 if (*p == ',')
10155 p++;
10156 }
10157 }
10158
10159 void
10160 dwarf_select_sections_by_letters (const char *letters)
10161 {
10162 unsigned int lindex = 0;
10163
10164 while (letters[lindex])
10165 switch (letters[lindex++])
10166 {
10167 case 'A': do_debug_addr = 1; break;
10168 case 'a': do_debug_abbrevs = 1; break;
10169 case 'c': do_debug_cu_index = 1; break;
10170 case 'F': do_debug_frames_interp = 1; /* Fall through. */
10171 case 'f': do_debug_frames = 1; break;
10172 case 'g': do_gdb_index = 1; break;
10173 case 'i': do_debug_info = 1; break;
10174 case 'K': do_follow_links = 1; break;
10175 case 'k': do_debug_links = 1; break;
10176 case 'l': do_debug_lines |= FLAG_DEBUG_LINES_RAW; break;
10177 case 'L': do_debug_lines |= FLAG_DEBUG_LINES_DECODED; break;
10178 case 'm': do_debug_macinfo = 1; break;
10179 case 'o': do_debug_loc = 1; break;
10180 case 'p': do_debug_pubnames = 1; break;
10181 case 'R': do_debug_ranges = 1; break;
10182 case 'r': do_debug_aranges = 1; break;
10183 case 's': do_debug_str = 1; break;
10184 case 'T': do_trace_aranges = 1; break;
10185 case 't': do_debug_pubtypes = 1; break;
10186 case 'U': do_trace_info = 1; break;
10187 case 'u': do_trace_abbrevs = 1; break;
10188
10189 default:
10190 warn (_("Unrecognized debug option '%s'\n"), letters);
10191 break;
10192 }
10193 }
10194
10195 void
10196 dwarf_select_sections_all (void)
10197 {
10198 do_debug_info = 1;
10199 do_debug_abbrevs = 1;
10200 do_debug_lines = FLAG_DEBUG_LINES_RAW;
10201 do_debug_pubnames = 1;
10202 do_debug_pubtypes = 1;
10203 do_debug_aranges = 1;
10204 do_debug_ranges = 1;
10205 do_debug_frames = 1;
10206 do_debug_macinfo = 1;
10207 do_debug_str = 1;
10208 do_debug_loc = 1;
10209 do_gdb_index = 1;
10210 do_trace_info = 1;
10211 do_trace_abbrevs = 1;
10212 do_trace_aranges = 1;
10213 do_debug_addr = 1;
10214 do_debug_cu_index = 1;
10215 do_follow_links = 1;
10216 do_debug_links = 1;
10217 }
10218
10219 #define NO_ABBREVS NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL
10220 #define ABBREV(N) NULL, NULL, NULL, 0, 0, N, NULL, 0, NULL
10221
10222 /* N.B. The order here must match the order in section_display_enum. */
10223
10224 struct dwarf_section_display debug_displays[] =
10225 {
10226 { { ".debug_abbrev", ".zdebug_abbrev", NO_ABBREVS }, display_debug_abbrev, &do_debug_abbrevs, FALSE },
10227 { { ".debug_aranges", ".zdebug_aranges", NO_ABBREVS }, display_debug_aranges, &do_debug_aranges, TRUE },
10228 { { ".debug_frame", ".zdebug_frame", NO_ABBREVS }, display_debug_frames, &do_debug_frames, TRUE },
10229 { { ".debug_info", ".zdebug_info", ABBREV (abbrev)}, display_debug_info, &do_debug_info, TRUE },
10230 { { ".debug_line", ".zdebug_line", NO_ABBREVS }, display_debug_lines, &do_debug_lines, TRUE },
10231 { { ".debug_pubnames", ".zdebug_pubnames", NO_ABBREVS }, display_debug_pubnames, &do_debug_pubnames, FALSE },
10232 { { ".debug_gnu_pubnames", ".zdebug_gnu_pubnames", NO_ABBREVS }, display_debug_gnu_pubnames, &do_debug_pubnames, FALSE },
10233 { { ".eh_frame", "", NO_ABBREVS }, display_debug_frames, &do_debug_frames, TRUE },
10234 { { ".debug_macinfo", ".zdebug_macinfo", NO_ABBREVS }, display_debug_macinfo, &do_debug_macinfo, FALSE },
10235 { { ".debug_macro", ".zdebug_macro", NO_ABBREVS }, display_debug_macro, &do_debug_macinfo, TRUE },
10236 { { ".debug_str", ".zdebug_str", NO_ABBREVS }, display_debug_str, &do_debug_str, FALSE },
10237 { { ".debug_line_str", ".zdebug_line_str", NO_ABBREVS }, display_debug_str, &do_debug_str, FALSE },
10238 { { ".debug_loc", ".zdebug_loc", NO_ABBREVS }, display_debug_loc, &do_debug_loc, TRUE },
10239 { { ".debug_loclists", ".zdebug_loclists", NO_ABBREVS }, display_debug_loc, &do_debug_loc, TRUE },
10240 { { ".debug_pubtypes", ".zdebug_pubtypes", NO_ABBREVS }, display_debug_pubnames, &do_debug_pubtypes, FALSE },
10241 { { ".debug_gnu_pubtypes", ".zdebug_gnu_pubtypes", NO_ABBREVS }, display_debug_gnu_pubnames, &do_debug_pubtypes, FALSE },
10242 { { ".debug_ranges", ".zdebug_ranges", NO_ABBREVS }, display_debug_ranges, &do_debug_ranges, TRUE },
10243 { { ".debug_rnglists", ".zdebug_rnglists", NO_ABBREVS }, display_debug_ranges, &do_debug_ranges, TRUE },
10244 { { ".debug_static_func", ".zdebug_static_func", NO_ABBREVS }, display_debug_not_supported, NULL, FALSE },
10245 { { ".debug_static_vars", ".zdebug_static_vars", NO_ABBREVS }, display_debug_not_supported, NULL, FALSE },
10246 { { ".debug_types", ".zdebug_types", ABBREV (abbrev) }, display_debug_types, &do_debug_info, TRUE },
10247 { { ".debug_weaknames", ".zdebug_weaknames", NO_ABBREVS }, display_debug_not_supported, NULL, FALSE },
10248 { { ".gdb_index", "", NO_ABBREVS }, display_gdb_index, &do_gdb_index, FALSE },
10249 { { ".debug_names", "", NO_ABBREVS }, display_debug_names, &do_gdb_index, FALSE },
10250 { { ".trace_info", "", ABBREV (trace_abbrev) }, display_trace_info, &do_trace_info, TRUE },
10251 { { ".trace_abbrev", "", NO_ABBREVS }, display_debug_abbrev, &do_trace_abbrevs, FALSE },
10252 { { ".trace_aranges", "", NO_ABBREVS }, display_debug_aranges, &do_trace_aranges, FALSE },
10253 { { ".debug_info.dwo", ".zdebug_info.dwo", ABBREV (abbrev_dwo) }, display_debug_info, &do_debug_info, TRUE },
10254 { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", NO_ABBREVS }, display_debug_abbrev, &do_debug_abbrevs, FALSE },
10255 { { ".debug_types.dwo", ".zdebug_types.dwo", ABBREV (abbrev_dwo) }, display_debug_types, &do_debug_info, TRUE },
10256 { { ".debug_line.dwo", ".zdebug_line.dwo", NO_ABBREVS }, display_debug_lines, &do_debug_lines, TRUE },
10257 { { ".debug_loc.dwo", ".zdebug_loc.dwo", NO_ABBREVS }, display_debug_loc, &do_debug_loc, TRUE },
10258 { { ".debug_macro.dwo", ".zdebug_macro.dwo", NO_ABBREVS }, display_debug_macro, &do_debug_macinfo, TRUE },
10259 { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NO_ABBREVS }, display_debug_macinfo, &do_debug_macinfo, FALSE },
10260 { { ".debug_str.dwo", ".zdebug_str.dwo", NO_ABBREVS }, display_debug_str, &do_debug_str, TRUE },
10261 { { ".debug_str_offsets", ".zdebug_str_offsets", NO_ABBREVS }, display_debug_str_offsets, NULL, FALSE },
10262 { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NO_ABBREVS }, display_debug_str_offsets, NULL, FALSE },
10263 { { ".debug_addr", ".zdebug_addr", NO_ABBREVS }, display_debug_addr, &do_debug_addr, TRUE },
10264 { { ".debug_cu_index", "", NO_ABBREVS }, display_cu_index, &do_debug_cu_index, FALSE },
10265 { { ".debug_tu_index", "", NO_ABBREVS }, display_cu_index, &do_debug_cu_index, FALSE },
10266 { { ".gnu_debuglink", "", NO_ABBREVS }, display_debug_links, &do_debug_links, FALSE },
10267 { { ".gnu_debugaltlink", "", NO_ABBREVS }, display_debug_links, &do_debug_links, FALSE },
10268 /* Separate debug info files can containt their own .debug_str section,
10269 and this might be in *addition* to a .debug_str section already present
10270 in the main file. Hence we need to have two entries for .debug_str. */
10271 { { ".debug_str", ".zdebug_str", NO_ABBREVS }, display_debug_str, &do_debug_str, FALSE },
10272 };
10273
10274 /* A static assertion. */
10275 extern int debug_displays_assert[ARRAY_SIZE (debug_displays) == max ? 1 : -1];
This page took 0.291629 seconds and 4 git commands to generate.