GDBserver: Don't assume a current process in D;PID implementation (PR gdb/23377)
[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 return start;
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 return end;
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 return end;
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 READ_ULEB (fc->code_factor);
7317 READ_SLEB (fc->data_factor);
7318 if (version == 1)
7319 {
7320 GET (fc->ra, 1);
7321 }
7322 else
7323 {
7324 READ_ULEB (fc->ra);
7325 }
7326
7327 if (fc->augmentation[0] == 'z')
7328 {
7329 READ_ULEB (augmentation_data_len);
7330 augmentation_data = start;
7331 /* PR 17512: file: 11042-2589-0.004. */
7332 if (augmentation_data_len > (bfd_size_type) (end - start))
7333 {
7334 warn (_("Augmentation data too long: 0x%s, expected at most %#lx\n"),
7335 dwarf_vmatoa ("x", augmentation_data_len),
7336 (unsigned long) (end - start));
7337 return end;
7338 }
7339 start += augmentation_data_len;
7340 }
7341
7342 if (augmentation_data_len)
7343 {
7344 unsigned char *p;
7345 unsigned char *q;
7346 unsigned char *qend;
7347
7348 p = (unsigned char *) fc->augmentation + 1;
7349 q = augmentation_data;
7350 qend = q + augmentation_data_len;
7351
7352 while (p < end && q < qend)
7353 {
7354 if (*p == 'L')
7355 q++;
7356 else if (*p == 'P')
7357 q += 1 + size_of_encoded_value (*q);
7358 else if (*p == 'R')
7359 fc->fde_encoding = *q++;
7360 else if (*p == 'S')
7361 ;
7362 else
7363 break;
7364 p++;
7365 }
7366 /* Note - it is OK if this loop terminates with q < qend.
7367 Padding may have been inserted to align the end of the CIE. */
7368 }
7369
7370 *p_cie = fc;
7371 if (p_version)
7372 *p_version = version;
7373 if (p_aug_len)
7374 {
7375 *p_aug_len = augmentation_data_len;
7376 *p_aug = augmentation_data;
7377 }
7378 return start;
7379 }
7380
7381 /* Prints out the contents on the DATA array formatted as unsigned bytes.
7382 If do_wide is not enabled, then formats the output to fit into 80 columns.
7383 PRINTED contains the number of characters already written to the current
7384 output line. */
7385
7386 static void
7387 display_data (bfd_size_type printed,
7388 const unsigned char * data,
7389 const bfd_size_type len)
7390 {
7391 if (do_wide || len < ((80 - printed) / 3))
7392 for (printed = 0; printed < len; ++printed)
7393 printf (" %02x", data[printed]);
7394 else
7395 {
7396 for (printed = 0; printed < len; ++printed)
7397 {
7398 if (printed % (80 / 3) == 0)
7399 putchar ('\n');
7400 printf (" %02x", data[printed]);
7401 }
7402 }
7403 }
7404
7405 /* Prints out the contents on the augmentation data array.
7406 If do_wide is not enabled, then formats the output to fit into 80 columns. */
7407
7408 static void
7409 display_augmentation_data (const unsigned char * data, const bfd_size_type len)
7410 {
7411 bfd_size_type i;
7412
7413 i = printf (_(" Augmentation data: "));
7414 display_data (i, data, len);
7415 }
7416
7417 static int
7418 display_debug_frames (struct dwarf_section *section,
7419 void *file ATTRIBUTE_UNUSED)
7420 {
7421 unsigned char *start = section->start;
7422 unsigned char *end = start + section->size;
7423 unsigned char *section_start = start;
7424 Frame_Chunk *chunks = 0, *forward_refs = 0;
7425 Frame_Chunk *remembered_state = 0;
7426 Frame_Chunk *rs;
7427 int is_eh = strcmp (section->name, ".eh_frame") == 0;
7428 unsigned int length_return;
7429 unsigned int max_regs = 0;
7430 const char *bad_reg = _("bad register: ");
7431 unsigned int saved_eh_addr_size = eh_addr_size;
7432
7433 introduce (section, FALSE);
7434
7435 while (start < end)
7436 {
7437 unsigned char *saved_start;
7438 unsigned char *block_end;
7439 dwarf_vma length;
7440 dwarf_vma cie_id;
7441 Frame_Chunk *fc;
7442 Frame_Chunk *cie;
7443 int need_col_headers = 1;
7444 unsigned char *augmentation_data = NULL;
7445 bfd_size_type augmentation_data_len = 0;
7446 unsigned int encoded_ptr_size = saved_eh_addr_size;
7447 unsigned int offset_size;
7448 unsigned int initial_length_size;
7449 bfd_boolean all_nops;
7450
7451 saved_start = start;
7452
7453 SAFE_BYTE_GET_AND_INC (length, start, 4, end);
7454
7455 if (length == 0)
7456 {
7457 printf ("\n%08lx ZERO terminator\n\n",
7458 (unsigned long)(saved_start - section_start));
7459 /* Skip any zero terminators that directly follow.
7460 A corrupt section size could have loaded a whole
7461 slew of zero filled memory bytes. eg
7462 PR 17512: file: 070-19381-0.004. */
7463 while (start < end && * start == 0)
7464 ++ start;
7465 continue;
7466 }
7467
7468 if (length == 0xffffffff)
7469 {
7470 SAFE_BYTE_GET_AND_INC (length, start, 8, end);
7471 offset_size = 8;
7472 initial_length_size = 12;
7473 }
7474 else
7475 {
7476 offset_size = 4;
7477 initial_length_size = 4;
7478 }
7479
7480 block_end = saved_start + length + initial_length_size;
7481 if (block_end > end || block_end < start)
7482 {
7483 warn ("Invalid length 0x%s in FDE at %#08lx\n",
7484 dwarf_vmatoa_1 (NULL, length, offset_size),
7485 (unsigned long) (saved_start - section_start));
7486 block_end = end;
7487 }
7488
7489 SAFE_BYTE_GET_AND_INC (cie_id, start, offset_size, end);
7490
7491 if (is_eh ? (cie_id == 0) : ((offset_size == 4 && cie_id == DW_CIE_ID)
7492 || (offset_size == 8 && cie_id == DW64_CIE_ID)))
7493 {
7494 int version;
7495 unsigned int mreg;
7496
7497 start = read_cie (start, end, &cie, &version,
7498 &augmentation_data_len, &augmentation_data);
7499 /* PR 17512: file: 027-135133-0.005. */
7500 if (cie == NULL)
7501 break;
7502
7503 fc = cie;
7504 fc->next = chunks;
7505 chunks = fc;
7506 fc->chunk_start = saved_start;
7507 mreg = max_regs > 0 ? max_regs - 1 : 0;
7508 if (mreg < fc->ra)
7509 mreg = fc->ra;
7510 if (frame_need_space (fc, mreg) < 0)
7511 break;
7512 if (fc->fde_encoding)
7513 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7514
7515 printf ("\n%08lx ", (unsigned long) (saved_start - section_start));
7516 print_dwarf_vma (length, fc->ptr_size);
7517 print_dwarf_vma (cie_id, offset_size);
7518
7519 if (do_debug_frames_interp)
7520 {
7521 printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc->augmentation,
7522 fc->code_factor, fc->data_factor, fc->ra);
7523 }
7524 else
7525 {
7526 printf ("CIE\n");
7527 printf (" Version: %d\n", version);
7528 printf (" Augmentation: \"%s\"\n", fc->augmentation);
7529 if (version >= 4)
7530 {
7531 printf (" Pointer Size: %u\n", fc->ptr_size);
7532 printf (" Segment Size: %u\n", fc->segment_size);
7533 }
7534 printf (" Code alignment factor: %u\n", fc->code_factor);
7535 printf (" Data alignment factor: %d\n", fc->data_factor);
7536 printf (" Return address column: %d\n", fc->ra);
7537
7538 if (augmentation_data_len)
7539 display_augmentation_data (augmentation_data, augmentation_data_len);
7540
7541 putchar ('\n');
7542 }
7543 }
7544 else
7545 {
7546 unsigned char *look_for;
7547 static Frame_Chunk fde_fc;
7548 unsigned long segment_selector;
7549
7550 if (is_eh)
7551 {
7552 dwarf_vma sign = (dwarf_vma) 1 << (offset_size * 8 - 1);
7553 look_for = start - 4 - ((cie_id ^ sign) - sign);
7554 }
7555 else
7556 look_for = section_start + cie_id;
7557
7558 if (look_for <= saved_start)
7559 {
7560 for (cie = chunks; cie ; cie = cie->next)
7561 if (cie->chunk_start == look_for)
7562 break;
7563 }
7564 else
7565 {
7566 for (cie = forward_refs; cie ; cie = cie->next)
7567 if (cie->chunk_start == look_for)
7568 break;
7569 if (!cie)
7570 {
7571 unsigned int off_size;
7572 unsigned char *cie_scan;
7573
7574 cie_scan = look_for;
7575 off_size = 4;
7576 SAFE_BYTE_GET_AND_INC (length, cie_scan, 4, end);
7577 if (length == 0xffffffff)
7578 {
7579 SAFE_BYTE_GET_AND_INC (length, cie_scan, 8, end);
7580 off_size = 8;
7581 }
7582 if (length != 0)
7583 {
7584 dwarf_vma c_id;
7585
7586 SAFE_BYTE_GET_AND_INC (c_id, cie_scan, off_size, end);
7587 if (is_eh
7588 ? c_id == 0
7589 : ((off_size == 4 && c_id == DW_CIE_ID)
7590 || (off_size == 8 && c_id == DW64_CIE_ID)))
7591 {
7592 int version;
7593 unsigned int mreg;
7594
7595 read_cie (cie_scan, end, &cie, &version,
7596 &augmentation_data_len, &augmentation_data);
7597 /* PR 17512: file: 3450-2098-0.004. */
7598 if (cie == NULL)
7599 {
7600 warn (_("Failed to read CIE information\n"));
7601 break;
7602 }
7603 cie->next = forward_refs;
7604 forward_refs = cie;
7605 cie->chunk_start = look_for;
7606 mreg = max_regs > 0 ? max_regs - 1 : 0;
7607 if (mreg < cie->ra)
7608 mreg = cie->ra;
7609 if (frame_need_space (cie, mreg) < 0)
7610 {
7611 warn (_("Invalid max register\n"));
7612 break;
7613 }
7614 if (cie->fde_encoding)
7615 encoded_ptr_size
7616 = size_of_encoded_value (cie->fde_encoding);
7617 }
7618 }
7619 }
7620 }
7621
7622 fc = &fde_fc;
7623 memset (fc, 0, sizeof (Frame_Chunk));
7624
7625 if (!cie)
7626 {
7627 warn ("Invalid CIE pointer 0x%s in FDE at %#08lx\n",
7628 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
7629 (unsigned long) (saved_start - section_start));
7630 fc->ncols = 0;
7631 fc->col_type = (short int *) xmalloc (sizeof (short int));
7632 fc->col_offset = (int *) xmalloc (sizeof (int));
7633 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1 : 0) < 0)
7634 {
7635 warn (_("Invalid max register\n"));
7636 break;
7637 }
7638 cie = fc;
7639 fc->augmentation = "";
7640 fc->fde_encoding = 0;
7641 fc->ptr_size = eh_addr_size;
7642 fc->segment_size = 0;
7643 }
7644 else
7645 {
7646 fc->ncols = cie->ncols;
7647 fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
7648 fc->col_offset = (int *) xcmalloc (fc->ncols, sizeof (int));
7649 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
7650 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
7651 fc->augmentation = cie->augmentation;
7652 fc->ptr_size = cie->ptr_size;
7653 eh_addr_size = cie->ptr_size;
7654 fc->segment_size = cie->segment_size;
7655 fc->code_factor = cie->code_factor;
7656 fc->data_factor = cie->data_factor;
7657 fc->cfa_reg = cie->cfa_reg;
7658 fc->cfa_offset = cie->cfa_offset;
7659 fc->ra = cie->ra;
7660 if (frame_need_space (fc, max_regs > 0 ? max_regs - 1: 0) < 0)
7661 {
7662 warn (_("Invalid max register\n"));
7663 break;
7664 }
7665 fc->fde_encoding = cie->fde_encoding;
7666 }
7667
7668 if (fc->fde_encoding)
7669 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7670
7671 segment_selector = 0;
7672 if (fc->segment_size)
7673 {
7674 if (fc->segment_size > sizeof (segment_selector))
7675 {
7676 /* PR 17512: file: 9e196b3e. */
7677 warn (_("Probably corrupt segment size: %d - using 4 instead\n"), fc->segment_size);
7678 fc->segment_size = 4;
7679 }
7680 SAFE_BYTE_GET_AND_INC (segment_selector, start, fc->segment_size, end);
7681 }
7682
7683 fc->pc_begin = get_encoded_value (&start, fc->fde_encoding, section, end);
7684
7685 /* FIXME: It appears that sometimes the final pc_range value is
7686 encoded in less than encoded_ptr_size bytes. See the x86_64
7687 run of the "objcopy on compressed debug sections" test for an
7688 example of this. */
7689 SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end);
7690
7691 if (cie->augmentation[0] == 'z')
7692 {
7693 READ_ULEB (augmentation_data_len);
7694 augmentation_data = start;
7695 start += augmentation_data_len;
7696 /* PR 17512 file: 722-8446-0.004 and PR 22386. */
7697 if (start >= end
7698 || ((bfd_signed_vma) augmentation_data_len) < 0
7699 || augmentation_data > start)
7700 {
7701 warn (_("Corrupt augmentation data length: 0x%s\n"),
7702 dwarf_vmatoa ("x", augmentation_data_len));
7703 start = end;
7704 augmentation_data = NULL;
7705 augmentation_data_len = 0;
7706 }
7707 }
7708
7709 printf ("\n%08lx %s %s FDE cie=%08lx pc=",
7710 (unsigned long)(saved_start - section_start),
7711 dwarf_vmatoa_1 (NULL, length, fc->ptr_size),
7712 dwarf_vmatoa_1 (NULL, cie_id, offset_size),
7713 (unsigned long)(cie->chunk_start - section_start));
7714
7715 if (fc->segment_size)
7716 printf ("%04lx:", segment_selector);
7717
7718 printf ("%s..%s\n",
7719 dwarf_vmatoa_1 (NULL, fc->pc_begin, fc->ptr_size),
7720 dwarf_vmatoa_1 (NULL, fc->pc_begin + fc->pc_range, fc->ptr_size));
7721
7722 if (! do_debug_frames_interp && augmentation_data_len)
7723 {
7724 display_augmentation_data (augmentation_data, augmentation_data_len);
7725 putchar ('\n');
7726 }
7727 }
7728
7729 /* At this point, fc is the current chunk, cie (if any) is set, and
7730 we're about to interpret instructions for the chunk. */
7731 /* ??? At present we need to do this always, since this sizes the
7732 fc->col_type and fc->col_offset arrays, which we write into always.
7733 We should probably split the interpreted and non-interpreted bits
7734 into two different routines, since there's so much that doesn't
7735 really overlap between them. */
7736 if (1 || do_debug_frames_interp)
7737 {
7738 /* Start by making a pass over the chunk, allocating storage
7739 and taking note of what registers are used. */
7740 unsigned char *tmp = start;
7741
7742 while (start < block_end)
7743 {
7744 unsigned int reg, op, opa;
7745 unsigned long temp;
7746 unsigned char * new_start;
7747
7748 op = *start++;
7749 opa = op & 0x3f;
7750 if (op & 0xc0)
7751 op &= 0xc0;
7752
7753 /* Warning: if you add any more cases to this switch, be
7754 sure to add them to the corresponding switch below. */
7755 switch (op)
7756 {
7757 case DW_CFA_advance_loc:
7758 break;
7759 case DW_CFA_offset:
7760 SKIP_ULEB ();
7761 if (frame_need_space (fc, opa) >= 0)
7762 fc->col_type[opa] = DW_CFA_undefined;
7763 break;
7764 case DW_CFA_restore:
7765 if (frame_need_space (fc, opa) >= 0)
7766 fc->col_type[opa] = DW_CFA_undefined;
7767 break;
7768 case DW_CFA_set_loc:
7769 start += encoded_ptr_size;
7770 break;
7771 case DW_CFA_advance_loc1:
7772 start += 1;
7773 break;
7774 case DW_CFA_advance_loc2:
7775 start += 2;
7776 break;
7777 case DW_CFA_advance_loc4:
7778 start += 4;
7779 break;
7780 case DW_CFA_offset_extended:
7781 case DW_CFA_val_offset:
7782 READ_ULEB (reg);
7783 SKIP_ULEB ();
7784 if (frame_need_space (fc, reg) >= 0)
7785 fc->col_type[reg] = DW_CFA_undefined;
7786 break;
7787 case DW_CFA_restore_extended:
7788 READ_ULEB (reg);
7789 if (frame_need_space (fc, reg) >= 0)
7790 fc->col_type[reg] = DW_CFA_undefined;
7791 break;
7792 case DW_CFA_undefined:
7793 READ_ULEB (reg);
7794 if (frame_need_space (fc, reg) >= 0)
7795 fc->col_type[reg] = DW_CFA_undefined;
7796 break;
7797 case DW_CFA_same_value:
7798 READ_ULEB (reg);
7799 if (frame_need_space (fc, reg) >= 0)
7800 fc->col_type[reg] = DW_CFA_undefined;
7801 break;
7802 case DW_CFA_register:
7803 READ_ULEB (reg);
7804 SKIP_ULEB ();
7805 if (frame_need_space (fc, reg) >= 0)
7806 fc->col_type[reg] = DW_CFA_undefined;
7807 break;
7808 case DW_CFA_def_cfa:
7809 SKIP_ULEB ();
7810 SKIP_ULEB ();
7811 break;
7812 case DW_CFA_def_cfa_register:
7813 SKIP_ULEB ();
7814 break;
7815 case DW_CFA_def_cfa_offset:
7816 SKIP_ULEB ();
7817 break;
7818 case DW_CFA_def_cfa_expression:
7819 READ_ULEB (temp);
7820 new_start = start + temp;
7821 if (new_start < start)
7822 {
7823 warn (_("Corrupt CFA_def expression value: %lu\n"), temp);
7824 start = block_end;
7825 }
7826 else
7827 start = new_start;
7828 break;
7829 case DW_CFA_expression:
7830 case DW_CFA_val_expression:
7831 READ_ULEB (reg);
7832 READ_ULEB (temp);
7833 new_start = start + temp;
7834 if (new_start < start)
7835 {
7836 /* PR 17512: file:306-192417-0.005. */
7837 warn (_("Corrupt CFA expression value: %lu\n"), temp);
7838 start = block_end;
7839 }
7840 else
7841 start = new_start;
7842 if (frame_need_space (fc, reg) >= 0)
7843 fc->col_type[reg] = DW_CFA_undefined;
7844 break;
7845 case DW_CFA_offset_extended_sf:
7846 case DW_CFA_val_offset_sf:
7847 READ_ULEB (reg);
7848 SKIP_SLEB ();
7849 if (frame_need_space (fc, reg) >= 0)
7850 fc->col_type[reg] = DW_CFA_undefined;
7851 break;
7852 case DW_CFA_def_cfa_sf:
7853 SKIP_ULEB ();
7854 SKIP_SLEB ();
7855 break;
7856 case DW_CFA_def_cfa_offset_sf:
7857 SKIP_SLEB ();
7858 break;
7859 case DW_CFA_MIPS_advance_loc8:
7860 start += 8;
7861 break;
7862 case DW_CFA_GNU_args_size:
7863 SKIP_ULEB ();
7864 break;
7865 case DW_CFA_GNU_negative_offset_extended:
7866 READ_ULEB (reg);
7867 SKIP_ULEB ();
7868 if (frame_need_space (fc, reg) >= 0)
7869 fc->col_type[reg] = DW_CFA_undefined;
7870 break;
7871 default:
7872 break;
7873 }
7874 }
7875 start = tmp;
7876 }
7877
7878 all_nops = TRUE;
7879
7880 /* Now we know what registers are used, make a second pass over
7881 the chunk, this time actually printing out the info. */
7882
7883 while (start < block_end)
7884 {
7885 unsigned char * tmp;
7886 unsigned op, opa;
7887 unsigned long ul, roffs;
7888 /* Note: It is tempting to use an unsigned long for 'reg' but there
7889 are various functions, notably frame_space_needed() that assume that
7890 reg is an unsigned int. */
7891 unsigned int reg;
7892 dwarf_signed_vma l;
7893 dwarf_vma ofs;
7894 dwarf_vma vma;
7895 const char *reg_prefix = "";
7896
7897 op = *start++;
7898 opa = op & 0x3f;
7899 if (op & 0xc0)
7900 op &= 0xc0;
7901
7902 /* Make a note if something other than DW_CFA_nop happens. */
7903 if (op != DW_CFA_nop)
7904 all_nops = FALSE;
7905
7906 /* Warning: if you add any more cases to this switch, be
7907 sure to add them to the corresponding switch above. */
7908 switch (op)
7909 {
7910 case DW_CFA_advance_loc:
7911 if (do_debug_frames_interp)
7912 frame_display_row (fc, &need_col_headers, &max_regs);
7913 else
7914 printf (" DW_CFA_advance_loc: %d to %s\n",
7915 opa * fc->code_factor,
7916 dwarf_vmatoa_1 (NULL,
7917 fc->pc_begin + opa * fc->code_factor,
7918 fc->ptr_size));
7919 fc->pc_begin += opa * fc->code_factor;
7920 break;
7921
7922 case DW_CFA_offset:
7923 READ_ULEB (roffs);
7924 if (opa >= (unsigned int) fc->ncols)
7925 reg_prefix = bad_reg;
7926 if (! do_debug_frames_interp || *reg_prefix != '\0')
7927 printf (" DW_CFA_offset: %s%s at cfa%+ld\n",
7928 reg_prefix, regname (opa, 0),
7929 roffs * fc->data_factor);
7930 if (*reg_prefix == '\0')
7931 {
7932 fc->col_type[opa] = DW_CFA_offset;
7933 fc->col_offset[opa] = roffs * fc->data_factor;
7934 }
7935 break;
7936
7937 case DW_CFA_restore:
7938 if (opa >= (unsigned int) fc->ncols)
7939 reg_prefix = bad_reg;
7940 if (! do_debug_frames_interp || *reg_prefix != '\0')
7941 printf (" DW_CFA_restore: %s%s\n",
7942 reg_prefix, regname (opa, 0));
7943 if (*reg_prefix != '\0')
7944 break;
7945
7946 if (opa >= (unsigned int) cie->ncols
7947 || (do_debug_frames_interp
7948 && cie->col_type[opa] == DW_CFA_unreferenced))
7949 {
7950 fc->col_type[opa] = DW_CFA_undefined;
7951 fc->col_offset[opa] = 0;
7952 }
7953 else
7954 {
7955 fc->col_type[opa] = cie->col_type[opa];
7956 fc->col_offset[opa] = cie->col_offset[opa];
7957 }
7958 break;
7959
7960 case DW_CFA_set_loc:
7961 vma = get_encoded_value (&start, fc->fde_encoding, section, block_end);
7962 if (do_debug_frames_interp)
7963 frame_display_row (fc, &need_col_headers, &max_regs);
7964 else
7965 printf (" DW_CFA_set_loc: %s\n",
7966 dwarf_vmatoa_1 (NULL, vma, fc->ptr_size));
7967 fc->pc_begin = vma;
7968 break;
7969
7970 case DW_CFA_advance_loc1:
7971 SAFE_BYTE_GET_AND_INC (ofs, start, 1, end);
7972 if (do_debug_frames_interp)
7973 frame_display_row (fc, &need_col_headers, &max_regs);
7974 else
7975 printf (" DW_CFA_advance_loc1: %ld to %s\n",
7976 (unsigned long) (ofs * fc->code_factor),
7977 dwarf_vmatoa_1 (NULL,
7978 fc->pc_begin + ofs * fc->code_factor,
7979 fc->ptr_size));
7980 fc->pc_begin += ofs * fc->code_factor;
7981 break;
7982
7983 case DW_CFA_advance_loc2:
7984 SAFE_BYTE_GET_AND_INC (ofs, start, 2, block_end);
7985 if (do_debug_frames_interp)
7986 frame_display_row (fc, &need_col_headers, &max_regs);
7987 else
7988 printf (" DW_CFA_advance_loc2: %ld to %s\n",
7989 (unsigned long) (ofs * fc->code_factor),
7990 dwarf_vmatoa_1 (NULL,
7991 fc->pc_begin + ofs * fc->code_factor,
7992 fc->ptr_size));
7993 fc->pc_begin += ofs * fc->code_factor;
7994 break;
7995
7996 case DW_CFA_advance_loc4:
7997 SAFE_BYTE_GET_AND_INC (ofs, start, 4, block_end);
7998 if (do_debug_frames_interp)
7999 frame_display_row (fc, &need_col_headers, &max_regs);
8000 else
8001 printf (" DW_CFA_advance_loc4: %ld to %s\n",
8002 (unsigned long) (ofs * fc->code_factor),
8003 dwarf_vmatoa_1 (NULL,
8004 fc->pc_begin + ofs * fc->code_factor,
8005 fc->ptr_size));
8006 fc->pc_begin += ofs * fc->code_factor;
8007 break;
8008
8009 case DW_CFA_offset_extended:
8010 READ_ULEB (reg);
8011 READ_ULEB (roffs);
8012 if (reg >= (unsigned int) fc->ncols)
8013 reg_prefix = bad_reg;
8014 if (! do_debug_frames_interp || *reg_prefix != '\0')
8015 printf (" DW_CFA_offset_extended: %s%s at cfa%+ld\n",
8016 reg_prefix, regname (reg, 0),
8017 roffs * fc->data_factor);
8018 if (*reg_prefix == '\0')
8019 {
8020 fc->col_type[reg] = DW_CFA_offset;
8021 fc->col_offset[reg] = roffs * fc->data_factor;
8022 }
8023 break;
8024
8025 case DW_CFA_val_offset:
8026 READ_ULEB (reg);
8027 READ_ULEB (roffs);
8028 if (reg >= (unsigned int) fc->ncols)
8029 reg_prefix = bad_reg;
8030 if (! do_debug_frames_interp || *reg_prefix != '\0')
8031 printf (" DW_CFA_val_offset: %s%s is cfa%+ld\n",
8032 reg_prefix, regname (reg, 0),
8033 roffs * fc->data_factor);
8034 if (*reg_prefix == '\0')
8035 {
8036 fc->col_type[reg] = DW_CFA_val_offset;
8037 fc->col_offset[reg] = roffs * fc->data_factor;
8038 }
8039 break;
8040
8041 case DW_CFA_restore_extended:
8042 READ_ULEB (reg);
8043 if (reg >= (unsigned int) fc->ncols)
8044 reg_prefix = bad_reg;
8045 if (! do_debug_frames_interp || *reg_prefix != '\0')
8046 printf (" DW_CFA_restore_extended: %s%s\n",
8047 reg_prefix, regname (reg, 0));
8048 if (*reg_prefix != '\0')
8049 break;
8050
8051 if (reg >= (unsigned int) cie->ncols)
8052 {
8053 fc->col_type[reg] = DW_CFA_undefined;
8054 fc->col_offset[reg] = 0;
8055 }
8056 else
8057 {
8058 fc->col_type[reg] = cie->col_type[reg];
8059 fc->col_offset[reg] = cie->col_offset[reg];
8060 }
8061 break;
8062
8063 case DW_CFA_undefined:
8064 READ_ULEB (reg);
8065 if (reg >= (unsigned int) fc->ncols)
8066 reg_prefix = bad_reg;
8067 if (! do_debug_frames_interp || *reg_prefix != '\0')
8068 printf (" DW_CFA_undefined: %s%s\n",
8069 reg_prefix, regname (reg, 0));
8070 if (*reg_prefix == '\0')
8071 {
8072 fc->col_type[reg] = DW_CFA_undefined;
8073 fc->col_offset[reg] = 0;
8074 }
8075 break;
8076
8077 case DW_CFA_same_value:
8078 READ_ULEB (reg);
8079 if (reg >= (unsigned int) fc->ncols)
8080 reg_prefix = bad_reg;
8081 if (! do_debug_frames_interp || *reg_prefix != '\0')
8082 printf (" DW_CFA_same_value: %s%s\n",
8083 reg_prefix, regname (reg, 0));
8084 if (*reg_prefix == '\0')
8085 {
8086 fc->col_type[reg] = DW_CFA_same_value;
8087 fc->col_offset[reg] = 0;
8088 }
8089 break;
8090
8091 case DW_CFA_register:
8092 READ_ULEB (reg);
8093 READ_ULEB (roffs);
8094 if (reg >= (unsigned int) fc->ncols)
8095 reg_prefix = bad_reg;
8096 if (! do_debug_frames_interp || *reg_prefix != '\0')
8097 {
8098 printf (" DW_CFA_register: %s%s in ",
8099 reg_prefix, regname (reg, 0));
8100 puts (regname (roffs, 0));
8101 }
8102 if (*reg_prefix == '\0')
8103 {
8104 fc->col_type[reg] = DW_CFA_register;
8105 fc->col_offset[reg] = roffs;
8106 }
8107 break;
8108
8109 case DW_CFA_remember_state:
8110 if (! do_debug_frames_interp)
8111 printf (" DW_CFA_remember_state\n");
8112 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8113 rs->cfa_offset = fc->cfa_offset;
8114 rs->cfa_reg = fc->cfa_reg;
8115 rs->ra = fc->ra;
8116 rs->cfa_exp = fc->cfa_exp;
8117 rs->ncols = fc->ncols;
8118 rs->col_type = (short int *) xcmalloc (rs->ncols,
8119 sizeof (* rs->col_type));
8120 rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (* rs->col_offset));
8121 memcpy (rs->col_type, fc->col_type, rs->ncols * sizeof (* fc->col_type));
8122 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (* fc->col_offset));
8123 rs->next = remembered_state;
8124 remembered_state = rs;
8125 break;
8126
8127 case DW_CFA_restore_state:
8128 if (! do_debug_frames_interp)
8129 printf (" DW_CFA_restore_state\n");
8130 rs = remembered_state;
8131 if (rs)
8132 {
8133 remembered_state = rs->next;
8134 fc->cfa_offset = rs->cfa_offset;
8135 fc->cfa_reg = rs->cfa_reg;
8136 fc->ra = rs->ra;
8137 fc->cfa_exp = rs->cfa_exp;
8138 if (frame_need_space (fc, rs->ncols - 1) < 0)
8139 {
8140 warn (_("Invalid column number in saved frame state\n"));
8141 fc->ncols = 0;
8142 break;
8143 }
8144 memcpy (fc->col_type, rs->col_type, rs->ncols * sizeof (* rs->col_type));
8145 memcpy (fc->col_offset, rs->col_offset,
8146 rs->ncols * sizeof (* rs->col_offset));
8147 free (rs->col_type);
8148 free (rs->col_offset);
8149 free (rs);
8150 }
8151 else if (do_debug_frames_interp)
8152 printf ("Mismatched DW_CFA_restore_state\n");
8153 break;
8154
8155 case DW_CFA_def_cfa:
8156 READ_ULEB (fc->cfa_reg);
8157 READ_ULEB (fc->cfa_offset);
8158 fc->cfa_exp = 0;
8159 if (! do_debug_frames_interp)
8160 printf (" DW_CFA_def_cfa: %s ofs %d\n",
8161 regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
8162 break;
8163
8164 case DW_CFA_def_cfa_register:
8165 READ_ULEB (fc->cfa_reg);
8166 fc->cfa_exp = 0;
8167 if (! do_debug_frames_interp)
8168 printf (" DW_CFA_def_cfa_register: %s\n",
8169 regname (fc->cfa_reg, 0));
8170 break;
8171
8172 case DW_CFA_def_cfa_offset:
8173 READ_ULEB (fc->cfa_offset);
8174 if (! do_debug_frames_interp)
8175 printf (" DW_CFA_def_cfa_offset: %d\n", (int) fc->cfa_offset);
8176 break;
8177
8178 case DW_CFA_nop:
8179 if (! do_debug_frames_interp)
8180 printf (" DW_CFA_nop\n");
8181 break;
8182
8183 case DW_CFA_def_cfa_expression:
8184 READ_ULEB (ul);
8185 if (start >= block_end || ul > (unsigned long) (block_end - start))
8186 {
8187 printf (_(" DW_CFA_def_cfa_expression: <corrupt len %lu>\n"), ul);
8188 break;
8189 }
8190 if (! do_debug_frames_interp)
8191 {
8192 printf (" DW_CFA_def_cfa_expression (");
8193 decode_location_expression (start, eh_addr_size, 0, -1,
8194 ul, 0, section);
8195 printf (")\n");
8196 }
8197 fc->cfa_exp = 1;
8198 start += ul;
8199 break;
8200
8201 case DW_CFA_expression:
8202 READ_ULEB (reg);
8203 READ_ULEB (ul);
8204 if (reg >= (unsigned int) fc->ncols)
8205 reg_prefix = bad_reg;
8206 /* PR 17512: file: 069-133014-0.006. */
8207 /* PR 17512: file: 98c02eb4. */
8208 tmp = start + ul;
8209 if (start >= block_end || tmp > block_end || tmp < start)
8210 {
8211 printf (_(" DW_CFA_expression: <corrupt len %lu>\n"), ul);
8212 break;
8213 }
8214 if (! do_debug_frames_interp || *reg_prefix != '\0')
8215 {
8216 printf (" DW_CFA_expression: %s%s (",
8217 reg_prefix, regname (reg, 0));
8218 decode_location_expression (start, eh_addr_size, 0, -1,
8219 ul, 0, section);
8220 printf (")\n");
8221 }
8222 if (*reg_prefix == '\0')
8223 fc->col_type[reg] = DW_CFA_expression;
8224 start = tmp;
8225 break;
8226
8227 case DW_CFA_val_expression:
8228 READ_ULEB (reg);
8229 READ_ULEB (ul);
8230 if (reg >= (unsigned int) fc->ncols)
8231 reg_prefix = bad_reg;
8232 tmp = start + ul;
8233 if (start >= block_end || tmp > block_end || tmp < start)
8234 {
8235 printf (" DW_CFA_val_expression: <corrupt len %lu>\n", ul);
8236 break;
8237 }
8238 if (! do_debug_frames_interp || *reg_prefix != '\0')
8239 {
8240 printf (" DW_CFA_val_expression: %s%s (",
8241 reg_prefix, regname (reg, 0));
8242 decode_location_expression (start, eh_addr_size, 0, -1,
8243 ul, 0, section);
8244 printf (")\n");
8245 }
8246 if (*reg_prefix == '\0')
8247 fc->col_type[reg] = DW_CFA_val_expression;
8248 start = tmp;
8249 break;
8250
8251 case DW_CFA_offset_extended_sf:
8252 READ_ULEB (reg);
8253 READ_SLEB (l);
8254 if (frame_need_space (fc, reg) < 0)
8255 reg_prefix = bad_reg;
8256 if (! do_debug_frames_interp || *reg_prefix != '\0')
8257 printf (" DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
8258 reg_prefix, regname (reg, 0),
8259 (long)(l * fc->data_factor));
8260 if (*reg_prefix == '\0')
8261 {
8262 fc->col_type[reg] = DW_CFA_offset;
8263 fc->col_offset[reg] = l * fc->data_factor;
8264 }
8265 break;
8266
8267 case DW_CFA_val_offset_sf:
8268 READ_ULEB (reg);
8269 READ_SLEB (l);
8270 if (frame_need_space (fc, reg) < 0)
8271 reg_prefix = bad_reg;
8272 if (! do_debug_frames_interp || *reg_prefix != '\0')
8273 printf (" DW_CFA_val_offset_sf: %s%s is cfa%+ld\n",
8274 reg_prefix, regname (reg, 0),
8275 (long)(l * fc->data_factor));
8276 if (*reg_prefix == '\0')
8277 {
8278 fc->col_type[reg] = DW_CFA_val_offset;
8279 fc->col_offset[reg] = l * fc->data_factor;
8280 }
8281 break;
8282
8283 case DW_CFA_def_cfa_sf:
8284 READ_ULEB (fc->cfa_reg);
8285 READ_ULEB (fc->cfa_offset);
8286 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
8287 fc->cfa_exp = 0;
8288 if (! do_debug_frames_interp)
8289 printf (" DW_CFA_def_cfa_sf: %s ofs %d\n",
8290 regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
8291 break;
8292
8293 case DW_CFA_def_cfa_offset_sf:
8294 READ_ULEB (fc->cfa_offset);
8295 fc->cfa_offset *= fc->data_factor;
8296 if (! do_debug_frames_interp)
8297 printf (" DW_CFA_def_cfa_offset_sf: %d\n", (int) fc->cfa_offset);
8298 break;
8299
8300 case DW_CFA_MIPS_advance_loc8:
8301 SAFE_BYTE_GET_AND_INC (ofs, start, 8, block_end);
8302 if (do_debug_frames_interp)
8303 frame_display_row (fc, &need_col_headers, &max_regs);
8304 else
8305 printf (" DW_CFA_MIPS_advance_loc8: %ld to %s\n",
8306 (unsigned long) (ofs * fc->code_factor),
8307 dwarf_vmatoa_1 (NULL,
8308 fc->pc_begin + ofs * fc->code_factor,
8309 fc->ptr_size));
8310 fc->pc_begin += ofs * fc->code_factor;
8311 break;
8312
8313 case DW_CFA_GNU_window_save:
8314 if (! do_debug_frames_interp)
8315 printf (" DW_CFA_GNU_window_save\n");
8316 break;
8317
8318 case DW_CFA_GNU_args_size:
8319 READ_ULEB (ul);
8320 if (! do_debug_frames_interp)
8321 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
8322 break;
8323
8324 case DW_CFA_GNU_negative_offset_extended:
8325 READ_ULEB (reg);
8326 READ_SLEB (l);
8327 l = - l;
8328 if (frame_need_space (fc, reg) < 0)
8329 reg_prefix = bad_reg;
8330 if (! do_debug_frames_interp || *reg_prefix != '\0')
8331 printf (" DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
8332 reg_prefix, regname (reg, 0),
8333 (long)(l * fc->data_factor));
8334 if (*reg_prefix == '\0')
8335 {
8336 fc->col_type[reg] = DW_CFA_offset;
8337 fc->col_offset[reg] = l * fc->data_factor;
8338 }
8339 break;
8340
8341 default:
8342 if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
8343 printf (_(" DW_CFA_??? (User defined call frame op: %#x)\n"), op);
8344 else
8345 warn (_("Unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
8346 start = block_end;
8347 }
8348 }
8349
8350 /* Interpret the CFA - as long as it is not completely full of NOPs. */
8351 if (do_debug_frames_interp && ! all_nops)
8352 frame_display_row (fc, &need_col_headers, &max_regs);
8353
8354 start = block_end;
8355 eh_addr_size = saved_eh_addr_size;
8356 }
8357
8358 printf ("\n");
8359
8360 return 1;
8361 }
8362
8363 #undef GET
8364
8365 static int
8366 display_debug_names (struct dwarf_section *section, void *file)
8367 {
8368 unsigned char *hdrptr = section->start;
8369 dwarf_vma unit_length;
8370 unsigned char *unit_start;
8371 const unsigned char *const section_end = section->start + section->size;
8372 unsigned char *unit_end;
8373
8374 introduce (section, FALSE);
8375
8376 load_debug_section_with_follow (str, file);
8377
8378 for (; hdrptr < section_end; hdrptr = unit_end)
8379 {
8380 unsigned int offset_size;
8381 uint16_t dwarf_version, padding;
8382 uint32_t comp_unit_count, local_type_unit_count, foreign_type_unit_count;
8383 uint32_t bucket_count, name_count, abbrev_table_size;
8384 uint32_t augmentation_string_size;
8385 unsigned int i;
8386 unsigned long sec_off;
8387
8388 unit_start = hdrptr;
8389
8390 /* Get and check the length of the block. */
8391 SAFE_BYTE_GET_AND_INC (unit_length, hdrptr, 4, section_end);
8392
8393 if (unit_length == 0xffffffff)
8394 {
8395 /* This section is 64-bit DWARF. */
8396 SAFE_BYTE_GET_AND_INC (unit_length, hdrptr, 8, section_end);
8397 offset_size = 8;
8398 }
8399 else
8400 offset_size = 4;
8401 unit_end = hdrptr + unit_length;
8402
8403 sec_off = hdrptr - section->start;
8404 if (sec_off + unit_length < sec_off
8405 || sec_off + unit_length > section->size)
8406 {
8407 warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
8408 section->name,
8409 (unsigned long) (unit_start - section->start),
8410 dwarf_vmatoa ("x", unit_length));
8411 return 0;
8412 }
8413
8414 /* Get and check the version number. */
8415 SAFE_BYTE_GET_AND_INC (dwarf_version, hdrptr, 2, unit_end);
8416 printf (_("Version %ld\n"), (long) dwarf_version);
8417
8418 /* Prior versions did not exist, and future versions may not be
8419 backwards compatible. */
8420 if (dwarf_version != 5)
8421 {
8422 warn (_("Only DWARF version 5 .debug_names "
8423 "is currently supported.\n"));
8424 return 0;
8425 }
8426
8427 SAFE_BYTE_GET_AND_INC (padding, hdrptr, 2, unit_end);
8428 if (padding != 0)
8429 warn (_("Padding field of .debug_names must be 0 (found 0x%x)\n"),
8430 padding);
8431
8432 SAFE_BYTE_GET_AND_INC (comp_unit_count, hdrptr, 4, unit_end);
8433 if (comp_unit_count == 0)
8434 warn (_("Compilation unit count must be >= 1 in .debug_names\n"));
8435
8436 SAFE_BYTE_GET_AND_INC (local_type_unit_count, hdrptr, 4, unit_end);
8437 SAFE_BYTE_GET_AND_INC (foreign_type_unit_count, hdrptr, 4, unit_end);
8438 SAFE_BYTE_GET_AND_INC (bucket_count, hdrptr, 4, unit_end);
8439 SAFE_BYTE_GET_AND_INC (name_count, hdrptr, 4, unit_end);
8440 SAFE_BYTE_GET_AND_INC (abbrev_table_size, hdrptr, 4, unit_end);
8441
8442 SAFE_BYTE_GET_AND_INC (augmentation_string_size, hdrptr, 4, unit_end);
8443 if (augmentation_string_size % 4 != 0)
8444 {
8445 warn (_("Augmentation string length %u must be rounded up "
8446 "to a multiple of 4 in .debug_names.\n"),
8447 augmentation_string_size);
8448 augmentation_string_size += (-augmentation_string_size) & 3;
8449 }
8450 printf (_("Augmentation string:"));
8451 for (i = 0; i < augmentation_string_size; i++)
8452 {
8453 unsigned char uc;
8454
8455 SAFE_BYTE_GET_AND_INC (uc, hdrptr, 1, unit_end);
8456 printf (" %02x", uc);
8457 }
8458 putchar ('\n');
8459 putchar ('\n');
8460
8461 printf (_("CU table:\n"));
8462 for (i = 0; i < comp_unit_count; i++)
8463 {
8464 uint64_t cu_offset;
8465
8466 SAFE_BYTE_GET_AND_INC (cu_offset, hdrptr, offset_size, unit_end);
8467 printf (_("[%3u] 0x%lx\n"), i, (unsigned long) cu_offset);
8468 }
8469 putchar ('\n');
8470
8471 printf (_("TU table:\n"));
8472 for (i = 0; i < local_type_unit_count; i++)
8473 {
8474 uint64_t tu_offset;
8475
8476 SAFE_BYTE_GET_AND_INC (tu_offset, hdrptr, offset_size, unit_end);
8477 printf (_("[%3u] 0x%lx\n"), i, (unsigned long) tu_offset);
8478 }
8479 putchar ('\n');
8480
8481 printf (_("Foreign TU table:\n"));
8482 for (i = 0; i < foreign_type_unit_count; i++)
8483 {
8484 uint64_t signature;
8485
8486 SAFE_BYTE_GET_AND_INC (signature, hdrptr, 8, unit_end);
8487 printf (_("[%3u] "), i);
8488 print_dwarf_vma (signature, 8);
8489 putchar ('\n');
8490 }
8491 putchar ('\n');
8492
8493 const uint32_t *const hash_table_buckets = (uint32_t *) hdrptr;
8494 hdrptr += bucket_count * sizeof (uint32_t);
8495 const uint32_t *const hash_table_hashes = (uint32_t *) hdrptr;
8496 hdrptr += name_count * sizeof (uint32_t);
8497 unsigned char *const name_table_string_offsets = hdrptr;
8498 hdrptr += name_count * offset_size;
8499 unsigned char *const name_table_entry_offsets = hdrptr;
8500 hdrptr += name_count * offset_size;
8501 unsigned char *const abbrev_table = hdrptr;
8502 hdrptr += abbrev_table_size;
8503 const unsigned char *const abbrev_table_end = hdrptr;
8504 unsigned char *const entry_pool = hdrptr;
8505 if (hdrptr > unit_end)
8506 {
8507 warn (_("Entry pool offset (0x%lx) exceeds unit size 0x%lx "
8508 "for unit 0x%lx in the debug_names\n"),
8509 (long) (hdrptr - section->start),
8510 (long) (unit_end - section->start),
8511 (long) (unit_start - section->start));
8512 return 0;
8513 }
8514
8515 size_t buckets_filled = 0;
8516 size_t bucketi;
8517 for (bucketi = 0; bucketi < bucket_count; bucketi++)
8518 {
8519 const uint32_t bucket = hash_table_buckets[bucketi];
8520
8521 if (bucket != 0)
8522 ++buckets_filled;
8523 }
8524 printf (ngettext ("Used %zu of %lu bucket.\n",
8525 "Used %zu of %lu buckets.\n",
8526 bucket_count),
8527 buckets_filled, (unsigned long) bucket_count);
8528
8529 uint32_t hash_prev = 0;
8530 size_t hash_clash_count = 0;
8531 size_t longest_clash = 0;
8532 size_t this_length = 0;
8533 size_t hashi;
8534 for (hashi = 0; hashi < name_count; hashi++)
8535 {
8536 const uint32_t hash_this = hash_table_hashes[hashi];
8537
8538 if (hashi > 0)
8539 {
8540 if (hash_prev % bucket_count == hash_this % bucket_count)
8541 {
8542 ++hash_clash_count;
8543 ++this_length;
8544 longest_clash = MAX (longest_clash, this_length);
8545 }
8546 else
8547 this_length = 0;
8548 }
8549 hash_prev = hash_this;
8550 }
8551 printf (_("Out of %lu items there are %zu bucket clashes"
8552 " (longest of %zu entries).\n"),
8553 (unsigned long) name_count, hash_clash_count, longest_clash);
8554 assert (name_count == buckets_filled + hash_clash_count);
8555
8556 struct abbrev_lookup_entry
8557 {
8558 dwarf_vma abbrev_tag;
8559 unsigned char *abbrev_lookup_ptr;
8560 };
8561 struct abbrev_lookup_entry *abbrev_lookup = NULL;
8562 size_t abbrev_lookup_used = 0;
8563 size_t abbrev_lookup_allocated = 0;
8564
8565 unsigned char *abbrevptr = abbrev_table;
8566 for (;;)
8567 {
8568 unsigned int bytes_read;
8569 const dwarf_vma abbrev_tag = read_uleb128 (abbrevptr, &bytes_read,
8570 abbrev_table_end);
8571 abbrevptr += bytes_read;
8572 if (abbrev_tag == 0)
8573 break;
8574 if (abbrev_lookup_used == abbrev_lookup_allocated)
8575 {
8576 abbrev_lookup_allocated = MAX (0x100,
8577 abbrev_lookup_allocated * 2);
8578 abbrev_lookup = xrealloc (abbrev_lookup,
8579 (abbrev_lookup_allocated
8580 * sizeof (*abbrev_lookup)));
8581 }
8582 assert (abbrev_lookup_used < abbrev_lookup_allocated);
8583 struct abbrev_lookup_entry *entry;
8584 for (entry = abbrev_lookup;
8585 entry < abbrev_lookup + abbrev_lookup_used;
8586 entry++)
8587 if (entry->abbrev_tag == abbrev_tag)
8588 {
8589 warn (_("Duplicate abbreviation tag %lu "
8590 "in unit 0x%lx in the debug_names\n"),
8591 (long) abbrev_tag, (long) (unit_start - section->start));
8592 break;
8593 }
8594 entry = &abbrev_lookup[abbrev_lookup_used++];
8595 entry->abbrev_tag = abbrev_tag;
8596 entry->abbrev_lookup_ptr = abbrevptr;
8597
8598 /* Skip DWARF tag. */
8599 read_uleb128 (abbrevptr, &bytes_read, abbrev_table_end);
8600 abbrevptr += bytes_read;
8601 for (;;)
8602 {
8603 const dwarf_vma xindex = read_uleb128 (abbrevptr,
8604 &bytes_read,
8605 abbrev_table_end);
8606 abbrevptr += bytes_read;
8607 const dwarf_vma form = read_uleb128 (abbrevptr, &bytes_read,
8608 abbrev_table_end);
8609 abbrevptr += bytes_read;
8610 if (xindex == 0 && form == 0)
8611 break;
8612 }
8613 }
8614
8615 printf (_("\nSymbol table:\n"));
8616 uint32_t namei;
8617 for (namei = 0; namei < name_count; ++namei)
8618 {
8619 uint64_t string_offset, entry_offset;
8620
8621 SAFE_BYTE_GET (string_offset,
8622 name_table_string_offsets + namei * offset_size,
8623 offset_size, unit_end);
8624 SAFE_BYTE_GET (entry_offset,
8625 name_table_entry_offsets + namei * offset_size,
8626 offset_size, unit_end);
8627
8628 printf ("[%3u] #%08x %s:", namei, hash_table_hashes[namei],
8629 fetch_indirect_string (string_offset));
8630
8631 unsigned char *entryptr = entry_pool + entry_offset;
8632
8633 // We need to scan first whether there is a single or multiple
8634 // entries. TAGNO is -2 for the first entry, it is -1 for the
8635 // initial tag read of the second entry, then it becomes 0 for the
8636 // first entry for real printing etc.
8637 int tagno = -2;
8638 /* Initialize it due to a false compiler warning. */
8639 dwarf_vma second_abbrev_tag = -1;
8640 for (;;)
8641 {
8642 unsigned int bytes_read;
8643 const dwarf_vma abbrev_tag = read_uleb128 (entryptr, &bytes_read,
8644 unit_end);
8645 entryptr += bytes_read;
8646 if (tagno == -1)
8647 {
8648 second_abbrev_tag = abbrev_tag;
8649 tagno = 0;
8650 entryptr = entry_pool + entry_offset;
8651 continue;
8652 }
8653 if (abbrev_tag == 0)
8654 break;
8655 if (tagno >= 0)
8656 printf ("%s<%lu>",
8657 (tagno == 0 && second_abbrev_tag == 0 ? " " : "\n\t"),
8658 (unsigned long) abbrev_tag);
8659
8660 const struct abbrev_lookup_entry *entry;
8661 for (entry = abbrev_lookup;
8662 entry < abbrev_lookup + abbrev_lookup_used;
8663 entry++)
8664 if (entry->abbrev_tag == abbrev_tag)
8665 break;
8666 if (entry >= abbrev_lookup + abbrev_lookup_used)
8667 {
8668 warn (_("Undefined abbreviation tag %lu "
8669 "in unit 0x%lx in the debug_names\n"),
8670 (long) abbrev_tag,
8671 (long) (unit_start - section->start));
8672 break;
8673 }
8674 abbrevptr = entry->abbrev_lookup_ptr;
8675 const dwarf_vma dwarf_tag = read_uleb128 (abbrevptr, &bytes_read,
8676 abbrev_table_end);
8677 abbrevptr += bytes_read;
8678 if (tagno >= 0)
8679 printf (" %s", get_TAG_name (dwarf_tag));
8680 for (;;)
8681 {
8682 const dwarf_vma xindex = read_uleb128 (abbrevptr,
8683 &bytes_read,
8684 abbrev_table_end);
8685 abbrevptr += bytes_read;
8686 const dwarf_vma form = read_uleb128 (abbrevptr, &bytes_read,
8687 abbrev_table_end);
8688 abbrevptr += bytes_read;
8689 if (xindex == 0 && form == 0)
8690 break;
8691
8692 if (tagno >= 0)
8693 printf (" %s", get_IDX_name (xindex));
8694 entryptr = read_and_display_attr_value (0, form, 0, entryptr,
8695 unit_end, 0, 0,
8696 offset_size,
8697 dwarf_version, NULL,
8698 (tagno < 0), NULL,
8699 NULL, '=');
8700 }
8701 ++tagno;
8702 }
8703 if (tagno <= 0)
8704 printf (_(" <no entries>"));
8705 putchar ('\n');
8706 }
8707
8708 free (abbrev_lookup);
8709 }
8710
8711 return 1;
8712 }
8713
8714 static int
8715 display_debug_links (struct dwarf_section * section,
8716 void * file ATTRIBUTE_UNUSED)
8717 {
8718 const unsigned char * filename;
8719 unsigned int filelen;
8720
8721 introduce (section, FALSE);
8722
8723 /* The .gnu_debuglink section is formatted as:
8724 (c-string) Filename.
8725 (padding) If needed to reach a 4 byte boundary.
8726 (uint32_t) CRC32 value.
8727
8728 The .gun_debugaltlink section is formatted as:
8729 (c-string) Filename.
8730 (binary) Build-ID. */
8731
8732 filename = section->start;
8733 filelen = strnlen ((const char *) filename, section->size);
8734 if (filelen == section->size)
8735 {
8736 warn (_("The debuglink filename is corrupt/missing\n"));
8737 return 0;
8738 }
8739
8740 printf (_(" Separate debug info file: %s\n"), filename);
8741
8742 if (const_strneq (section->name, ".gnu_debuglink"))
8743 {
8744 unsigned int crc32;
8745 unsigned int crc_offset;
8746
8747 crc_offset = filelen + 1;
8748 crc_offset = (crc_offset + 3) & ~3;
8749 if (crc_offset + 4 > section->size)
8750 {
8751 warn (_("CRC offset missing/truncated\n"));
8752 return 0;
8753 }
8754
8755 crc32 = byte_get (filename + crc_offset, 4);
8756
8757 printf (_(" CRC value: %#x\n"), crc32);
8758
8759 if (crc_offset + 4 < section->size)
8760 {
8761 warn (_("There are %#lx extraneous bytes at the end of the section\n"),
8762 (long)(section->size - (crc_offset + 4)));
8763 return 0;
8764 }
8765 }
8766 else /* const_strneq (section->name, ".gnu_debugaltlink") */
8767 {
8768 const unsigned char * build_id = section->start + filelen + 1;
8769 bfd_size_type build_id_len = section->size - (filelen + 1);
8770 bfd_size_type printed;
8771
8772 /* FIXME: Should we support smaller build-id notes ? */
8773 if (build_id_len < 0x14)
8774 {
8775 warn (_("Build-ID is too short (%#lx bytes)\n"), (long) build_id_len);
8776 return 0;
8777 }
8778
8779 printed = printf (_(" Build-ID (%#lx bytes):"), (long) build_id_len);
8780 display_data (printed, build_id, build_id_len);
8781 putchar ('\n');
8782 }
8783
8784 putchar ('\n');
8785 return 1;
8786 }
8787
8788 static int
8789 display_gdb_index (struct dwarf_section *section,
8790 void *file ATTRIBUTE_UNUSED)
8791 {
8792 unsigned char *start = section->start;
8793 uint32_t version;
8794 uint32_t cu_list_offset, tu_list_offset;
8795 uint32_t address_table_offset, symbol_table_offset, constant_pool_offset;
8796 unsigned int cu_list_elements, tu_list_elements;
8797 unsigned int address_table_size, symbol_table_slots;
8798 unsigned char *cu_list, *tu_list;
8799 unsigned char *address_table, *symbol_table, *constant_pool;
8800 unsigned int i;
8801
8802 /* The documentation for the format of this file is in gdb/dwarf2read.c. */
8803
8804 introduce (section, FALSE);
8805
8806 if (section->size < 6 * sizeof (uint32_t))
8807 {
8808 warn (_("Truncated header in the %s section.\n"), section->name);
8809 return 0;
8810 }
8811
8812 version = byte_get_little_endian (start, 4);
8813 printf (_("Version %ld\n"), (long) version);
8814
8815 /* Prior versions are obsolete, and future versions may not be
8816 backwards compatible. */
8817 if (version < 3 || version > 8)
8818 {
8819 warn (_("Unsupported version %lu.\n"), (unsigned long) version);
8820 return 0;
8821 }
8822 if (version < 4)
8823 warn (_("The address table data in version 3 may be wrong.\n"));
8824 if (version < 5)
8825 warn (_("Version 4 does not support case insensitive lookups.\n"));
8826 if (version < 6)
8827 warn (_("Version 5 does not include inlined functions.\n"));
8828 if (version < 7)
8829 warn (_("Version 6 does not include symbol attributes.\n"));
8830 /* Version 7 indices generated by Gold have bad type unit references,
8831 PR binutils/15021. But we don't know if the index was generated by
8832 Gold or not, so to avoid worrying users with gdb-generated indices
8833 we say nothing for version 7 here. */
8834
8835 cu_list_offset = byte_get_little_endian (start + 4, 4);
8836 tu_list_offset = byte_get_little_endian (start + 8, 4);
8837 address_table_offset = byte_get_little_endian (start + 12, 4);
8838 symbol_table_offset = byte_get_little_endian (start + 16, 4);
8839 constant_pool_offset = byte_get_little_endian (start + 20, 4);
8840
8841 if (cu_list_offset > section->size
8842 || tu_list_offset > section->size
8843 || address_table_offset > section->size
8844 || symbol_table_offset > section->size
8845 || constant_pool_offset > section->size)
8846 {
8847 warn (_("Corrupt header in the %s section.\n"), section->name);
8848 return 0;
8849 }
8850
8851 /* PR 17531: file: 418d0a8a. */
8852 if (tu_list_offset < cu_list_offset)
8853 {
8854 warn (_("TU offset (%x) is less than CU offset (%x)\n"),
8855 tu_list_offset, cu_list_offset);
8856 return 0;
8857 }
8858
8859 cu_list_elements = (tu_list_offset - cu_list_offset) / 8;
8860
8861 if (address_table_offset < tu_list_offset)
8862 {
8863 warn (_("Address table offset (%x) is less than TU offset (%x)\n"),
8864 address_table_offset, tu_list_offset);
8865 return 0;
8866 }
8867
8868 tu_list_elements = (address_table_offset - tu_list_offset) / 8;
8869
8870 /* PR 17531: file: 18a47d3d. */
8871 if (symbol_table_offset < address_table_offset)
8872 {
8873 warn (_("Symbol table offset (%x) is less then Address table offset (%x)\n"),
8874 symbol_table_offset, address_table_offset);
8875 return 0;
8876 }
8877
8878 address_table_size = symbol_table_offset - address_table_offset;
8879
8880 if (constant_pool_offset < symbol_table_offset)
8881 {
8882 warn (_("Constant pool offset (%x) is less than symbol table offset (%x)\n"),
8883 constant_pool_offset, symbol_table_offset);
8884 return 0;
8885 }
8886
8887 symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8;
8888
8889 cu_list = start + cu_list_offset;
8890 tu_list = start + tu_list_offset;
8891 address_table = start + address_table_offset;
8892 symbol_table = start + symbol_table_offset;
8893 constant_pool = start + constant_pool_offset;
8894
8895 if (address_table + address_table_size > section->start + section->size)
8896 {
8897 warn (_("Address table extends beyond end of section.\n"));
8898 return 0;
8899 }
8900
8901 printf (_("\nCU table:\n"));
8902 for (i = 0; i < cu_list_elements; i += 2)
8903 {
8904 uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8);
8905 uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8);
8906
8907 printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2,
8908 (unsigned long) cu_offset,
8909 (unsigned long) (cu_offset + cu_length - 1));
8910 }
8911
8912 printf (_("\nTU table:\n"));
8913 for (i = 0; i < tu_list_elements; i += 3)
8914 {
8915 uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8);
8916 uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8);
8917 uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8);
8918
8919 printf (_("[%3u] 0x%lx 0x%lx "), i / 3,
8920 (unsigned long) tu_offset,
8921 (unsigned long) type_offset);
8922 print_dwarf_vma (signature, 8);
8923 printf ("\n");
8924 }
8925
8926 printf (_("\nAddress table:\n"));
8927 for (i = 0; i < address_table_size && i <= address_table_size - (2 * 8 + 4);
8928 i += 2 * 8 + 4)
8929 {
8930 uint64_t low = byte_get_little_endian (address_table + i, 8);
8931 uint64_t high = byte_get_little_endian (address_table + i + 8, 8);
8932 uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4);
8933
8934 print_dwarf_vma (low, 8);
8935 print_dwarf_vma (high, 8);
8936 printf (_("%lu\n"), (unsigned long) cu_index);
8937 }
8938
8939 printf (_("\nSymbol table:\n"));
8940 for (i = 0; i < symbol_table_slots; ++i)
8941 {
8942 uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4);
8943 uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4);
8944 uint32_t num_cus, cu;
8945
8946 if (name_offset != 0
8947 || cu_vector_offset != 0)
8948 {
8949 unsigned int j;
8950 unsigned char * adr;
8951
8952 adr = constant_pool + name_offset;
8953 /* PR 17531: file: 5b7b07ad. */
8954 if (adr < constant_pool || adr >= section->start + section->size)
8955 {
8956 printf (_("[%3u] <corrupt offset: %x>"), i, name_offset);
8957 warn (_("Corrupt name offset of 0x%x found for symbol table slot %d\n"),
8958 name_offset, i);
8959 }
8960 else
8961 printf ("[%3u] %.*s:", i,
8962 (int) (section->size - (constant_pool_offset + name_offset)),
8963 constant_pool + name_offset);
8964
8965 adr = constant_pool + cu_vector_offset;
8966 if (adr < constant_pool || adr >= section->start + section->size - 3)
8967 {
8968 printf (_("<invalid CU vector offset: %x>\n"), cu_vector_offset);
8969 warn (_("Corrupt CU vector offset of 0x%x found for symbol table slot %d\n"),
8970 cu_vector_offset, i);
8971 continue;
8972 }
8973
8974 num_cus = byte_get_little_endian (adr, 4);
8975
8976 adr = constant_pool + cu_vector_offset + 4 + num_cus * 4;
8977 if (num_cus * 4 < num_cus
8978 || adr >= section->start + section->size
8979 || adr < constant_pool)
8980 {
8981 printf ("<invalid number of CUs: %d>\n", num_cus);
8982 warn (_("Invalid number of CUs (0x%x) for symbol table slot %d\n"),
8983 num_cus, i);
8984 continue;
8985 }
8986
8987 if (num_cus > 1)
8988 printf ("\n");
8989
8990 for (j = 0; j < num_cus; ++j)
8991 {
8992 int is_static;
8993 gdb_index_symbol_kind kind;
8994
8995 cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4);
8996 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu);
8997 kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu);
8998 cu = GDB_INDEX_CU_VALUE (cu);
8999 /* Convert to TU number if it's for a type unit. */
9000 if (cu >= cu_list_elements / 2)
9001 printf ("%cT%lu", num_cus > 1 ? '\t' : ' ',
9002 (unsigned long) (cu - cu_list_elements / 2));
9003 else
9004 printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu);
9005
9006 printf (" [%s, %s]",
9007 is_static ? _("static") : _("global"),
9008 get_gdb_index_symbol_kind_name (kind));
9009 if (num_cus > 1)
9010 printf ("\n");
9011 }
9012 if (num_cus <= 1)
9013 printf ("\n");
9014 }
9015 }
9016
9017 return 1;
9018 }
9019
9020 /* Pre-allocate enough space for the CU/TU sets needed. */
9021
9022 static void
9023 prealloc_cu_tu_list (unsigned int nshndx)
9024 {
9025 if (shndx_pool == NULL)
9026 {
9027 shndx_pool_size = nshndx;
9028 shndx_pool_used = 0;
9029 shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size,
9030 sizeof (unsigned int));
9031 }
9032 else
9033 {
9034 shndx_pool_size = shndx_pool_used + nshndx;
9035 shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size,
9036 sizeof (unsigned int));
9037 }
9038 }
9039
9040 static void
9041 add_shndx_to_cu_tu_entry (unsigned int shndx)
9042 {
9043 if (shndx_pool_used >= shndx_pool_size)
9044 {
9045 error (_("Internal error: out of space in the shndx pool.\n"));
9046 return;
9047 }
9048 shndx_pool [shndx_pool_used++] = shndx;
9049 }
9050
9051 static void
9052 end_cu_tu_entry (void)
9053 {
9054 if (shndx_pool_used >= shndx_pool_size)
9055 {
9056 error (_("Internal error: out of space in the shndx pool.\n"));
9057 return;
9058 }
9059 shndx_pool [shndx_pool_used++] = 0;
9060 }
9061
9062 /* Return the short name of a DWARF section given by a DW_SECT enumerator. */
9063
9064 static const char *
9065 get_DW_SECT_short_name (unsigned int dw_sect)
9066 {
9067 static char buf[16];
9068
9069 switch (dw_sect)
9070 {
9071 case DW_SECT_INFO:
9072 return "info";
9073 case DW_SECT_TYPES:
9074 return "types";
9075 case DW_SECT_ABBREV:
9076 return "abbrev";
9077 case DW_SECT_LINE:
9078 return "line";
9079 case DW_SECT_LOC:
9080 return "loc";
9081 case DW_SECT_STR_OFFSETS:
9082 return "str_off";
9083 case DW_SECT_MACINFO:
9084 return "macinfo";
9085 case DW_SECT_MACRO:
9086 return "macro";
9087 default:
9088 break;
9089 }
9090
9091 snprintf (buf, sizeof (buf), "%d", dw_sect);
9092 return buf;
9093 }
9094
9095 /* Process a CU or TU index. If DO_DISPLAY is true, print the contents.
9096 These sections are extensions for Fission.
9097 See http://gcc.gnu.org/wiki/DebugFissionDWP. */
9098
9099 static int
9100 process_cu_tu_index (struct dwarf_section *section, int do_display)
9101 {
9102 unsigned char *phdr = section->start;
9103 unsigned char *limit = phdr + section->size;
9104 unsigned char *phash;
9105 unsigned char *pindex;
9106 unsigned char *ppool;
9107 unsigned int version;
9108 unsigned int ncols = 0;
9109 unsigned int nused;
9110 unsigned int nslots;
9111 unsigned int i;
9112 unsigned int j;
9113 dwarf_vma signature_high;
9114 dwarf_vma signature_low;
9115 char buf[64];
9116
9117 /* PR 17512: file: 002-168123-0.004. */
9118 if (phdr == NULL)
9119 {
9120 warn (_("Section %s is empty\n"), section->name);
9121 return 0;
9122 }
9123 /* PR 17512: file: 002-376-0.004. */
9124 if (section->size < 24)
9125 {
9126 warn (_("Section %s is too small to contain a CU/TU header\n"),
9127 section->name);
9128 return 0;
9129 }
9130
9131 SAFE_BYTE_GET (version, phdr, 4, limit);
9132 if (version >= 2)
9133 SAFE_BYTE_GET (ncols, phdr + 4, 4, limit);
9134 SAFE_BYTE_GET (nused, phdr + 8, 4, limit);
9135 SAFE_BYTE_GET (nslots, phdr + 12, 4, limit);
9136
9137 phash = phdr + 16;
9138 pindex = phash + nslots * 8;
9139 ppool = pindex + nslots * 4;
9140
9141 /* PR 17531: file: 45d69832. */
9142 if (pindex < phash || ppool < phdr || (pindex == phash && nslots != 0))
9143 {
9144 warn (ngettext ("Section %s is too small for %d slot\n",
9145 "Section %s is too small for %d slots\n",
9146 nslots),
9147 section->name, nslots);
9148 return 0;
9149 }
9150
9151 if (do_display)
9152 {
9153 introduce (section, FALSE);
9154
9155 printf (_(" Version: %d\n"), version);
9156 if (version >= 2)
9157 printf (_(" Number of columns: %d\n"), ncols);
9158 printf (_(" Number of used entries: %d\n"), nused);
9159 printf (_(" Number of slots: %d\n\n"), nslots);
9160 }
9161
9162 if (ppool > limit || ppool < phdr)
9163 {
9164 warn (_("Section %s too small for %d hash table entries\n"),
9165 section->name, nslots);
9166 return 0;
9167 }
9168
9169 if (version == 1)
9170 {
9171 if (!do_display)
9172 prealloc_cu_tu_list ((limit - ppool) / 4);
9173 for (i = 0; i < nslots; i++)
9174 {
9175 unsigned char *shndx_list;
9176 unsigned int shndx;
9177
9178 SAFE_BYTE_GET64 (phash, &signature_high, &signature_low, limit);
9179 if (signature_high != 0 || signature_low != 0)
9180 {
9181 SAFE_BYTE_GET (j, pindex, 4, limit);
9182 shndx_list = ppool + j * 4;
9183 /* PR 17531: file: 705e010d. */
9184 if (shndx_list < ppool)
9185 {
9186 warn (_("Section index pool located before start of section\n"));
9187 return 0;
9188 }
9189
9190 if (do_display)
9191 printf (_(" [%3d] Signature: 0x%s Sections: "),
9192 i, dwarf_vmatoa64 (signature_high, signature_low,
9193 buf, sizeof (buf)));
9194 for (;;)
9195 {
9196 if (shndx_list >= limit)
9197 {
9198 warn (_("Section %s too small for shndx pool\n"),
9199 section->name);
9200 return 0;
9201 }
9202 SAFE_BYTE_GET (shndx, shndx_list, 4, limit);
9203 if (shndx == 0)
9204 break;
9205 if (do_display)
9206 printf (" %d", shndx);
9207 else
9208 add_shndx_to_cu_tu_entry (shndx);
9209 shndx_list += 4;
9210 }
9211 if (do_display)
9212 printf ("\n");
9213 else
9214 end_cu_tu_entry ();
9215 }
9216 phash += 8;
9217 pindex += 4;
9218 }
9219 }
9220 else if (version == 2)
9221 {
9222 unsigned int val;
9223 unsigned int dw_sect;
9224 unsigned char *ph = phash;
9225 unsigned char *pi = pindex;
9226 unsigned char *poffsets = ppool + ncols * 4;
9227 unsigned char *psizes = poffsets + nused * ncols * 4;
9228 unsigned char *pend = psizes + nused * ncols * 4;
9229 bfd_boolean is_tu_index;
9230 struct cu_tu_set *this_set = NULL;
9231 unsigned int row;
9232 unsigned char *prow;
9233
9234 is_tu_index = strcmp (section->name, ".debug_tu_index") == 0;
9235
9236 /* PR 17531: file: 0dd159bf.
9237 Check for wraparound with an overlarge ncols value. */
9238 if (poffsets < ppool || (unsigned int) ((poffsets - ppool) / 4) != ncols)
9239 {
9240 warn (_("Overlarge number of columns: %x\n"), ncols);
9241 return 0;
9242 }
9243
9244 if (pend > limit)
9245 {
9246 warn (_("Section %s too small for offset and size tables\n"),
9247 section->name);
9248 return 0;
9249 }
9250
9251 if (do_display)
9252 {
9253 printf (_(" Offset table\n"));
9254 printf (" slot %-16s ",
9255 is_tu_index ? _("signature") : _("dwo_id"));
9256 }
9257 else
9258 {
9259 if (is_tu_index)
9260 {
9261 tu_count = nused;
9262 tu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
9263 this_set = tu_sets;
9264 }
9265 else
9266 {
9267 cu_count = nused;
9268 cu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
9269 this_set = cu_sets;
9270 }
9271 }
9272
9273 if (do_display)
9274 {
9275 for (j = 0; j < ncols; j++)
9276 {
9277 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
9278 printf (" %8s", get_DW_SECT_short_name (dw_sect));
9279 }
9280 printf ("\n");
9281 }
9282
9283 for (i = 0; i < nslots; i++)
9284 {
9285 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
9286
9287 SAFE_BYTE_GET (row, pi, 4, limit);
9288 if (row != 0)
9289 {
9290 /* PR 17531: file: a05f6ab3. */
9291 if (row > nused)
9292 {
9293 warn (_("Row index (%u) is larger than number of used entries (%u)\n"),
9294 row, nused);
9295 return 0;
9296 }
9297
9298 if (!do_display)
9299 {
9300 size_t num_copy = sizeof (uint64_t);
9301
9302 /* PR 23064: Beware of buffer overflow. */
9303 if (ph + num_copy < limit)
9304 memcpy (&this_set[row - 1].signature, ph, num_copy);
9305 else
9306 {
9307 warn (_("Signature (%p) extends beyond end of space in section\n"), ph);
9308 return 0;
9309 }
9310 }
9311
9312 prow = poffsets + (row - 1) * ncols * 4;
9313 /* PR 17531: file: b8ce60a8. */
9314 if (prow < poffsets || prow > limit)
9315 {
9316 warn (_("Row index (%u) * num columns (%u) > space remaining in section\n"),
9317 row, ncols);
9318 return 0;
9319 }
9320
9321 if (do_display)
9322 printf (_(" [%3d] 0x%s"),
9323 i, dwarf_vmatoa64 (signature_high, signature_low,
9324 buf, sizeof (buf)));
9325 for (j = 0; j < ncols; j++)
9326 {
9327 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
9328 if (do_display)
9329 printf (" %8d", val);
9330 else
9331 {
9332 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
9333
9334 /* PR 17531: file: 10796eb3. */
9335 if (dw_sect >= DW_SECT_MAX)
9336 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
9337 else
9338 this_set [row - 1].section_offsets [dw_sect] = val;
9339 }
9340 }
9341
9342 if (do_display)
9343 printf ("\n");
9344 }
9345 ph += 8;
9346 pi += 4;
9347 }
9348
9349 ph = phash;
9350 pi = pindex;
9351 if (do_display)
9352 {
9353 printf ("\n");
9354 printf (_(" Size table\n"));
9355 printf (" slot %-16s ",
9356 is_tu_index ? _("signature") : _("dwo_id"));
9357 }
9358
9359 for (j = 0; j < ncols; j++)
9360 {
9361 SAFE_BYTE_GET (val, ppool + j * 4, 4, limit);
9362 if (do_display)
9363 printf (" %8s", get_DW_SECT_short_name (val));
9364 }
9365
9366 if (do_display)
9367 printf ("\n");
9368
9369 for (i = 0; i < nslots; i++)
9370 {
9371 SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
9372
9373 SAFE_BYTE_GET (row, pi, 4, limit);
9374 if (row != 0)
9375 {
9376 prow = psizes + (row - 1) * ncols * 4;
9377
9378 if (do_display)
9379 printf (_(" [%3d] 0x%s"),
9380 i, dwarf_vmatoa64 (signature_high, signature_low,
9381 buf, sizeof (buf)));
9382
9383 for (j = 0; j < ncols; j++)
9384 {
9385 SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
9386 if (do_display)
9387 printf (" %8d", val);
9388 else
9389 {
9390 SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
9391 if (dw_sect >= DW_SECT_MAX)
9392 warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
9393 else
9394 this_set [row - 1].section_sizes [dw_sect] = val;
9395 }
9396 }
9397
9398 if (do_display)
9399 printf ("\n");
9400 }
9401
9402 ph += 8;
9403 pi += 4;
9404 }
9405 }
9406 else if (do_display)
9407 printf (_(" Unsupported version (%d)\n"), version);
9408
9409 if (do_display)
9410 printf ("\n");
9411
9412 return 1;
9413 }
9414
9415 /* Load the CU and TU indexes if present. This will build a list of
9416 section sets that we can use to associate a .debug_info.dwo section
9417 with its associated .debug_abbrev.dwo section in a .dwp file. */
9418
9419 static bfd_boolean
9420 load_cu_tu_indexes (void *file)
9421 {
9422 static int cu_tu_indexes_read = -1; /* Tri-state variable. */
9423
9424 /* If we have already loaded (or tried to load) the CU and TU indexes
9425 then do not bother to repeat the task. */
9426 if (cu_tu_indexes_read == -1)
9427 {
9428 cu_tu_indexes_read = TRUE;
9429
9430 if (load_debug_section_with_follow (dwp_cu_index, file))
9431 if (! process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0))
9432 cu_tu_indexes_read = FALSE;
9433
9434 if (load_debug_section_with_follow (dwp_tu_index, file))
9435 if (! process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0))
9436 cu_tu_indexes_read = FALSE;
9437 }
9438
9439 return (bfd_boolean) cu_tu_indexes_read;
9440 }
9441
9442 /* Find the set of sections that includes section SHNDX. */
9443
9444 unsigned int *
9445 find_cu_tu_set (void *file, unsigned int shndx)
9446 {
9447 unsigned int i;
9448
9449 if (! load_cu_tu_indexes (file))
9450 return NULL;
9451
9452 /* Find SHNDX in the shndx pool. */
9453 for (i = 0; i < shndx_pool_used; i++)
9454 if (shndx_pool [i] == shndx)
9455 break;
9456
9457 if (i >= shndx_pool_used)
9458 return NULL;
9459
9460 /* Now backup to find the first entry in the set. */
9461 while (i > 0 && shndx_pool [i - 1] != 0)
9462 i--;
9463
9464 return shndx_pool + i;
9465 }
9466
9467 /* Display a .debug_cu_index or .debug_tu_index section. */
9468
9469 static int
9470 display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
9471 {
9472 return process_cu_tu_index (section, 1);
9473 }
9474
9475 static int
9476 display_debug_not_supported (struct dwarf_section *section,
9477 void *file ATTRIBUTE_UNUSED)
9478 {
9479 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9480 section->name);
9481
9482 return 1;
9483 }
9484
9485 /* Like malloc, but takes two parameters like calloc.
9486 Verifies that the first parameter is not too large.
9487 Note: does *not* initialise the allocated memory to zero. */
9488
9489 void *
9490 cmalloc (size_t nmemb, size_t size)
9491 {
9492 /* Check for overflow. */
9493 if (nmemb >= ~(size_t) 0 / size)
9494 return NULL;
9495
9496 return xmalloc (nmemb * size);
9497 }
9498
9499 /* Like xmalloc, but takes two parameters like calloc.
9500 Verifies that the first parameter is not too large.
9501 Note: does *not* initialise the allocated memory to zero. */
9502
9503 void *
9504 xcmalloc (size_t nmemb, size_t size)
9505 {
9506 /* Check for overflow. */
9507 if (nmemb >= ~(size_t) 0 / size)
9508 {
9509 fprintf (stderr,
9510 _("Attempt to allocate an array with an excessive number of elements: 0x%lx\n"),
9511 (long) nmemb);
9512 xexit (1);
9513 }
9514
9515 return xmalloc (nmemb * size);
9516 }
9517
9518 /* Like xrealloc, but takes three parameters.
9519 Verifies that the second parameter is not too large.
9520 Note: does *not* initialise any new memory to zero. */
9521
9522 void *
9523 xcrealloc (void *ptr, size_t nmemb, size_t size)
9524 {
9525 /* Check for overflow. */
9526 if (nmemb >= ~(size_t) 0 / size)
9527 {
9528 error (_("Attempt to re-allocate an array with an excessive number of elements: 0x%lx\n"),
9529 (long) nmemb);
9530 xexit (1);
9531 }
9532
9533 return xrealloc (ptr, nmemb * size);
9534 }
9535
9536 /* Like xcalloc, but verifies that the first parameter is not too large. */
9537
9538 void *
9539 xcalloc2 (size_t nmemb, size_t size)
9540 {
9541 /* Check for overflow. */
9542 if (nmemb >= ~(size_t) 0 / size)
9543 {
9544 error (_("Attempt to allocate a zero'ed array with an excessive number of elements: 0x%lx\n"),
9545 (long) nmemb);
9546 xexit (1);
9547 }
9548
9549 return xcalloc (nmemb, size);
9550 }
9551
9552 static unsigned long
9553 calc_gnu_debuglink_crc32 (unsigned long crc,
9554 const unsigned char * buf,
9555 bfd_size_type len)
9556 {
9557 static const unsigned long crc32_table[256] =
9558 {
9559 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
9560 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
9561 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
9562 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
9563 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
9564 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
9565 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
9566 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
9567 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
9568 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
9569 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
9570 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
9571 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
9572 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
9573 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
9574 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
9575 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
9576 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
9577 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
9578 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
9579 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
9580 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
9581 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
9582 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
9583 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
9584 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
9585 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
9586 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
9587 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
9588 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
9589 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
9590 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
9591 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
9592 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
9593 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
9594 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
9595 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
9596 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
9597 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
9598 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
9599 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
9600 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
9601 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
9602 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
9603 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
9604 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
9605 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
9606 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
9607 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
9608 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
9609 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
9610 0x2d02ef8d
9611 };
9612 const unsigned char *end;
9613
9614 crc = ~crc & 0xffffffff;
9615 for (end = buf + len; buf < end; ++ buf)
9616 crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
9617 return ~crc & 0xffffffff;
9618 }
9619
9620 typedef bfd_boolean (* check_func_type) (const char *, void *);
9621 typedef const char * (* parse_func_type) (struct dwarf_section *, void *);
9622
9623 static bfd_boolean
9624 check_gnu_debuglink (const char * pathname, void * crc_pointer)
9625 {
9626 static unsigned char buffer [8 * 1024];
9627 FILE * f;
9628 bfd_size_type count;
9629 unsigned long crc = 0;
9630 void * sep_data;
9631
9632 sep_data = open_debug_file (pathname);
9633 if (sep_data == NULL)
9634 return FALSE;
9635
9636 /* Yes - we are opening the file twice... */
9637 f = fopen (pathname, "rb");
9638 if (f == NULL)
9639 {
9640 /* Paranoia: This should never happen. */
9641 close_debug_file (sep_data);
9642 warn (_("Unable to reopen separate debug info file: %s\n"), pathname);
9643 return FALSE;
9644 }
9645
9646 while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0)
9647 crc = calc_gnu_debuglink_crc32 (crc, buffer, count);
9648
9649 fclose (f);
9650
9651 if (crc != * (unsigned long *) crc_pointer)
9652 {
9653 close_debug_file (sep_data);
9654 warn (_("Separate debug info file %s found, but CRC does not match - ignoring\n"),
9655 pathname);
9656 return FALSE;
9657 }
9658
9659 return TRUE;
9660 }
9661
9662 static const char *
9663 parse_gnu_debuglink (struct dwarf_section * section, void * data)
9664 {
9665 const char * name;
9666 unsigned int crc_offset;
9667 unsigned long * crc32 = (unsigned long *) data;
9668
9669 /* The name is first.
9670 The CRC value is stored after the filename, aligned up to 4 bytes. */
9671 name = (const char *) section->start;
9672
9673 crc_offset = strnlen (name, section->size) + 1;
9674 crc_offset = (crc_offset + 3) & ~3;
9675 if (crc_offset + 4 > section->size)
9676 return NULL;
9677
9678 * crc32 = byte_get (section->start + crc_offset, 4);
9679 return name;
9680 }
9681
9682 static bfd_boolean
9683 check_gnu_debugaltlink (const char * filename, void * data ATTRIBUTE_UNUSED)
9684 {
9685 void * sep_data = open_debug_file (filename);
9686
9687 if (sep_data == NULL)
9688 return FALSE;
9689
9690 /* FIXME: We should now extract the build-id in the separate file
9691 and check it... */
9692
9693 return TRUE;
9694 }
9695
9696 typedef struct build_id_data
9697 {
9698 bfd_size_type len;
9699 const unsigned char * data;
9700 } Build_id_data;
9701
9702 static const char *
9703 parse_gnu_debugaltlink (struct dwarf_section * section, void * data)
9704 {
9705 const char * name;
9706 bfd_size_type namelen;
9707 bfd_size_type id_len;
9708 Build_id_data * build_id_data;
9709
9710 /* The name is first.
9711 The build-id follows immediately, with no padding, up to the section's end. */
9712
9713 name = (const char *) section->start;
9714 namelen = strnlen (name, section->size) + 1;
9715 if (namelen >= section->size)
9716 return NULL;
9717
9718 id_len = section->size - namelen;
9719 if (id_len < 0x14)
9720 return NULL;
9721
9722 build_id_data = calloc (1, sizeof * build_id_data);
9723 if (build_id_data == NULL)
9724 return NULL;
9725
9726 build_id_data->len = id_len;
9727 build_id_data->data = section->start + namelen;
9728
9729 * (Build_id_data **) data = build_id_data;
9730
9731 return name;
9732 }
9733
9734 static void *
9735 load_separate_debug_info (const char * main_filename,
9736 struct dwarf_section * xlink,
9737 parse_func_type parse_func,
9738 check_func_type check_func,
9739 void * func_data)
9740 {
9741 const char * separate_filename;
9742 char * debugfile;
9743 char * canon_dir;
9744 size_t canon_dirlen;
9745 size_t dirlen;
9746
9747 if ((separate_filename = parse_func (xlink, func_data)) == NULL)
9748 {
9749 warn (_("Corrupt debuglink section: %s\n"),
9750 xlink->name ? xlink->name : xlink->uncompressed_name);
9751 return FALSE;
9752 }
9753
9754 /* Attempt to locate the separate file.
9755 This should duplicate the logic in bfd/opncls.c:find_separate_debug_file(). */
9756
9757 canon_dir = lrealpath (main_filename);
9758
9759 for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
9760 if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
9761 break;
9762 canon_dir[canon_dirlen] = '\0';
9763
9764 #ifndef DEBUGDIR
9765 #define DEBUGDIR "/lib/debug"
9766 #endif
9767 #ifndef EXTRA_DEBUG_ROOT1
9768 #define EXTRA_DEBUG_ROOT1 "/usr/lib/debug"
9769 #endif
9770 #ifndef EXTRA_DEBUG_ROOT2
9771 #define EXTRA_DEBUG_ROOT2 "/usr/lib/debug/usr"
9772 #endif
9773
9774 debugfile = (char *) malloc (strlen (DEBUGDIR) + 1
9775 + canon_dirlen
9776 + strlen (".debug/")
9777 #ifdef EXTRA_DEBUG_ROOT1
9778 + strlen (EXTRA_DEBUG_ROOT1)
9779 #endif
9780 #ifdef EXTRA_DEBUG_ROOT2
9781 + strlen (EXTRA_DEBUG_ROOT2)
9782 #endif
9783 + strlen (separate_filename)
9784 + 1);
9785 if (debugfile == NULL)
9786 {
9787 warn (_("Out of memory"));
9788 return NULL;
9789 }
9790
9791 /* First try in the current directory. */
9792 sprintf (debugfile, "%s", separate_filename);
9793 if (check_func (debugfile, func_data))
9794 goto found;
9795
9796 /* Then try in a subdirectory called .debug. */
9797 sprintf (debugfile, ".debug/%s", separate_filename);
9798 if (check_func (debugfile, func_data))
9799 goto found;
9800
9801 /* Then try in the same directory as the original file. */
9802 sprintf (debugfile, "%s%s", canon_dir, separate_filename);
9803 if (check_func (debugfile, func_data))
9804 goto found;
9805
9806 /* And the .debug subdirectory of that directory. */
9807 sprintf (debugfile, "%s.debug/%s", canon_dir, separate_filename);
9808 if (check_func (debugfile, func_data))
9809 goto found;
9810
9811 #ifdef EXTRA_DEBUG_ROOT1
9812 /* Try the first extra debug file root. */
9813 sprintf (debugfile, "%s/%s", EXTRA_DEBUG_ROOT1, separate_filename);
9814 if (check_func (debugfile, func_data))
9815 goto found;
9816 #endif
9817
9818 #ifdef EXTRA_DEBUG_ROOT2
9819 /* Try the second extra debug file root. */
9820 sprintf (debugfile, "%s/%s", EXTRA_DEBUG_ROOT2, separate_filename);
9821 if (check_func (debugfile, func_data))
9822 goto found;
9823 #endif
9824
9825 /* Then try in the global debugfile directory. */
9826 strcpy (debugfile, DEBUGDIR);
9827 dirlen = strlen (DEBUGDIR) - 1;
9828 if (dirlen > 0 && DEBUGDIR[dirlen] != '/')
9829 strcat (debugfile, "/");
9830 strcat (debugfile, (const char *) separate_filename);
9831
9832 if (check_func (debugfile, func_data))
9833 goto found;
9834
9835 /* Failed to find the file. */
9836 warn (_("could not find separate debug file '%s'\n"), separate_filename);
9837 warn (_("tried: %s\n"), debugfile);
9838
9839 #ifdef EXTRA_DEBUG_ROOT2
9840 sprintf (debugfile, "%s/%s", EXTRA_DEBUG_ROOT2, separate_filename);
9841 warn (_("tried: %s\n"), debugfile);
9842 #endif
9843
9844 #ifdef EXTRA_DEBUG_ROOT1
9845 sprintf (debugfile, "%s/%s", EXTRA_DEBUG_ROOT1, separate_filename);
9846 warn (_("tried: %s\n"), debugfile);
9847 #endif
9848
9849 sprintf (debugfile, "%s.debug/%s", canon_dir, separate_filename);
9850 warn (_("tried: %s\n"), debugfile);
9851
9852 sprintf (debugfile, "%s%s", canon_dir, separate_filename);
9853 warn (_("tried: %s\n"), debugfile);
9854
9855 sprintf (debugfile, ".debug/%s", separate_filename);
9856 warn (_("tried: %s\n"), debugfile);
9857
9858 sprintf (debugfile, "%s", separate_filename);
9859 warn (_("tried: %s\n"), debugfile);
9860
9861 free (canon_dir);
9862 free (debugfile);
9863 return NULL;
9864
9865 found:
9866 free (canon_dir);
9867
9868 /* Now open the file.... */
9869 if ((separate_debug_file = open_debug_file (debugfile)) == NULL)
9870 {
9871 warn (_("failed to open separate debug file: %s\n"), debugfile);
9872 free (debugfile);
9873 return FALSE;
9874 }
9875
9876 /* FIXME: We do not check to see if there are any other separate debug info
9877 files that would also match. */
9878
9879 printf (_("%s: Found separate debug info file: %s\n\n"), main_filename, debugfile);
9880 separate_debug_filename = debugfile;
9881
9882 /* Do not free debugfile - it might be referenced inside
9883 the structure returned by open_debug_file(). */
9884 return separate_debug_file;
9885 }
9886
9887 /* Attempt to load a separate dwarf object file. */
9888
9889 static void *
9890 load_dwo_file (const char * main_filename)
9891 {
9892 char * filename;
9893
9894 /* FIXME: Skip adding / if dwo_dir ends in /. */
9895 filename = concat (dwo_dir, "/", dwo_name, NULL);
9896 if (filename == NULL)
9897 {
9898 warn (_("Out of memory allocating dwo filename\n"));
9899 return NULL;
9900 }
9901
9902 if ((separate_debug_file = open_debug_file (filename)) == NULL)
9903 {
9904 warn (_("Unable to load dwo file: %s\n"), filename);
9905 free (filename);
9906 return NULL;
9907 }
9908
9909 /* FIXME: We should check the dwo_id. */
9910
9911 printf (_("%s: Found separate debug object file: %s\n\n"), main_filename, filename);
9912 separate_debug_filename = filename;
9913 return separate_debug_file;
9914 }
9915
9916 /* Load a separate debug info file, if it exists.
9917 Returns the data pointer that is the result of calling open_debug_file
9918 on the separate debug info file, or NULL if there were problems or there
9919 is no such file. */
9920
9921 void *
9922 load_separate_debug_file (void * file, const char * filename)
9923 {
9924 /* Skip this operation if we are not interested in debug links. */
9925 if (! do_follow_links && ! do_debug_links)
9926 return NULL;
9927
9928 /* See if there is a dwo link. */
9929 if (load_debug_section (str, file)
9930 && load_debug_section (abbrev, file)
9931 && load_debug_section (info, file))
9932 {
9933 dwo_name = dwo_dir = NULL;
9934 dwo_id = NULL;
9935 dwo_id_len = 0;
9936
9937 if (process_debug_info (& debug_displays[info].section, file, abbrev, TRUE, FALSE))
9938 {
9939 if (dwo_name != NULL)
9940 {
9941 if (do_debug_links)
9942 {
9943 printf (_("The %s section contains a link to a dwo file:\n"),
9944 debug_displays [info].section.uncompressed_name);
9945 printf (_(" Name: %s\n"), dwo_name);
9946 printf (_(" Directory: %s\n"), dwo_dir ? dwo_dir : _("<not-found>"));
9947 if (dwo_id != NULL)
9948 display_data (printf (_(" ID: ")), dwo_id, dwo_id_len);
9949 else
9950 printf (_(" ID: <unknown>\n"));
9951 printf ("\n\n");
9952 }
9953
9954 /* FIXME: We do not check to see if there are any more dwo links in the file... */
9955 if (do_follow_links)
9956 return load_dwo_file (filename);
9957 }
9958 }
9959 }
9960
9961 if (! do_follow_links)
9962 /* The other debug links will be displayed by display_debug_links()
9963 so we do not need to do any further processing here. */
9964 return NULL;
9965
9966 /* FIXME: We do not check for the presence of both link sections in the same file. */
9967 /* FIXME: We do not check the separate debug info file to see if it too contains debuglinks. */
9968 /* FIXME: We do not check for the presence of multiple, same-name debuglink sections. */
9969 /* FIXME: We do not check for the presence of a dwo link as well as a debuglink. */
9970
9971 if (load_debug_section (gnu_debugaltlink, file))
9972 {
9973 Build_id_data * build_id_data;
9974
9975 return load_separate_debug_info (filename,
9976 & debug_displays[gnu_debugaltlink].section,
9977 parse_gnu_debugaltlink,
9978 check_gnu_debugaltlink,
9979 & build_id_data);
9980 }
9981
9982 if (load_debug_section (gnu_debuglink, file))
9983 {
9984 unsigned long crc32;
9985
9986 return load_separate_debug_info (filename,
9987 & debug_displays[gnu_debuglink].section,
9988 parse_gnu_debuglink,
9989 check_gnu_debuglink,
9990 & crc32);
9991 }
9992
9993 do_follow_links = 0;
9994 return NULL;
9995 }
9996
9997 void
9998 free_debug_memory (void)
9999 {
10000 unsigned int i;
10001
10002 free_abbrevs ();
10003
10004 for (i = 0; i < max; i++)
10005 free_debug_section ((enum dwarf_section_display_enum) i);
10006
10007 if (debug_information != NULL)
10008 {
10009 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
10010 {
10011 for (i = 0; i < num_debug_info_entries; i++)
10012 {
10013 if (!debug_information [i].max_loc_offsets)
10014 {
10015 free (debug_information [i].loc_offsets);
10016 free (debug_information [i].have_frame_base);
10017 }
10018 if (!debug_information [i].max_range_lists)
10019 free (debug_information [i].range_lists);
10020 }
10021 }
10022 free (debug_information);
10023 debug_information = NULL;
10024 alloc_num_debug_info_entries = num_debug_info_entries = 0;
10025 }
10026
10027 if (separate_debug_file != NULL)
10028 {
10029 close_debug_file (separate_debug_file);
10030 separate_debug_file = NULL;
10031
10032 free ((void *) separate_debug_filename);
10033 separate_debug_filename = NULL;
10034 }
10035 }
10036
10037 void
10038 dwarf_select_sections_by_names (const char *names)
10039 {
10040 typedef struct
10041 {
10042 const char * option;
10043 int * variable;
10044 int val;
10045 }
10046 debug_dump_long_opts;
10047
10048 static const debug_dump_long_opts opts_table [] =
10049 {
10050 /* Please keep this table alpha- sorted. */
10051 { "Ranges", & do_debug_ranges, 1 },
10052 { "abbrev", & do_debug_abbrevs, 1 },
10053 { "addr", & do_debug_addr, 1 },
10054 { "aranges", & do_debug_aranges, 1 },
10055 { "cu_index", & do_debug_cu_index, 1 },
10056 { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
10057 { "follow-links", & do_follow_links, 1 },
10058 { "frames", & do_debug_frames, 1 },
10059 { "frames-interp", & do_debug_frames_interp, 1 },
10060 /* The special .gdb_index section. */
10061 { "gdb_index", & do_gdb_index, 1 },
10062 { "info", & do_debug_info, 1 },
10063 { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility. */
10064 { "links", & do_debug_links, 1 },
10065 { "loc", & do_debug_loc, 1 },
10066 { "macro", & do_debug_macinfo, 1 },
10067 { "pubnames", & do_debug_pubnames, 1 },
10068 { "pubtypes", & do_debug_pubtypes, 1 },
10069 /* This entry is for compatibility
10070 with earlier versions of readelf. */
10071 { "ranges", & do_debug_aranges, 1 },
10072 { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
10073 { "str", & do_debug_str, 1 },
10074 /* These trace_* sections are used by Itanium VMS. */
10075 { "trace_abbrev", & do_trace_abbrevs, 1 },
10076 { "trace_aranges", & do_trace_aranges, 1 },
10077 { "trace_info", & do_trace_info, 1 },
10078 { NULL, NULL, 0 }
10079 };
10080
10081 const char *p;
10082
10083 p = names;
10084 while (*p)
10085 {
10086 const debug_dump_long_opts * entry;
10087
10088 for (entry = opts_table; entry->option; entry++)
10089 {
10090 size_t len = strlen (entry->option);
10091
10092 if (strncmp (p, entry->option, len) == 0
10093 && (p[len] == ',' || p[len] == '\0'))
10094 {
10095 * entry->variable |= entry->val;
10096
10097 /* The --debug-dump=frames-interp option also
10098 enables the --debug-dump=frames option. */
10099 if (do_debug_frames_interp)
10100 do_debug_frames = 1;
10101
10102 p += len;
10103 break;
10104 }
10105 }
10106
10107 if (entry->option == NULL)
10108 {
10109 warn (_("Unrecognized debug option '%s'\n"), p);
10110 p = strchr (p, ',');
10111 if (p == NULL)
10112 break;
10113 }
10114
10115 if (*p == ',')
10116 p++;
10117 }
10118 }
10119
10120 void
10121 dwarf_select_sections_by_letters (const char *letters)
10122 {
10123 unsigned int lindex = 0;
10124
10125 while (letters[lindex])
10126 switch (letters[lindex++])
10127 {
10128 case 'A': do_debug_addr = 1; break;
10129 case 'a': do_debug_abbrevs = 1; break;
10130 case 'c': do_debug_cu_index = 1; break;
10131 case 'F': do_debug_frames_interp = 1; /* Fall through. */
10132 case 'f': do_debug_frames = 1; break;
10133 case 'g': do_gdb_index = 1; break;
10134 case 'i': do_debug_info = 1; break;
10135 case 'K': do_follow_links = 1; break;
10136 case 'k': do_debug_links = 1; break;
10137 case 'l': do_debug_lines |= FLAG_DEBUG_LINES_RAW; break;
10138 case 'L': do_debug_lines |= FLAG_DEBUG_LINES_DECODED; break;
10139 case 'm': do_debug_macinfo = 1; break;
10140 case 'o': do_debug_loc = 1; break;
10141 case 'p': do_debug_pubnames = 1; break;
10142 case 'R': do_debug_ranges = 1; break;
10143 case 'r': do_debug_aranges = 1; break;
10144 case 's': do_debug_str = 1; break;
10145 case 'T': do_trace_aranges = 1; break;
10146 case 't': do_debug_pubtypes = 1; break;
10147 case 'U': do_trace_info = 1; break;
10148 case 'u': do_trace_abbrevs = 1; break;
10149
10150 default:
10151 warn (_("Unrecognized debug option '%s'\n"), letters);
10152 break;
10153 }
10154 }
10155
10156 void
10157 dwarf_select_sections_all (void)
10158 {
10159 do_debug_info = 1;
10160 do_debug_abbrevs = 1;
10161 do_debug_lines = FLAG_DEBUG_LINES_RAW;
10162 do_debug_pubnames = 1;
10163 do_debug_pubtypes = 1;
10164 do_debug_aranges = 1;
10165 do_debug_ranges = 1;
10166 do_debug_frames = 1;
10167 do_debug_macinfo = 1;
10168 do_debug_str = 1;
10169 do_debug_loc = 1;
10170 do_gdb_index = 1;
10171 do_trace_info = 1;
10172 do_trace_abbrevs = 1;
10173 do_trace_aranges = 1;
10174 do_debug_addr = 1;
10175 do_debug_cu_index = 1;
10176 do_follow_links = 1;
10177 do_debug_links = 1;
10178 }
10179
10180 #define NO_ABBREVS NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL
10181 #define ABBREV(N) NULL, NULL, NULL, 0, 0, N, NULL, 0, NULL
10182
10183 /* N.B. The order here must match the order in section_display_enum. */
10184
10185 struct dwarf_section_display debug_displays[] =
10186 {
10187 { { ".debug_abbrev", ".zdebug_abbrev", NO_ABBREVS }, display_debug_abbrev, &do_debug_abbrevs, FALSE },
10188 { { ".debug_aranges", ".zdebug_aranges", NO_ABBREVS }, display_debug_aranges, &do_debug_aranges, TRUE },
10189 { { ".debug_frame", ".zdebug_frame", NO_ABBREVS }, display_debug_frames, &do_debug_frames, TRUE },
10190 { { ".debug_info", ".zdebug_info", ABBREV (abbrev)}, display_debug_info, &do_debug_info, TRUE },
10191 { { ".debug_line", ".zdebug_line", NO_ABBREVS }, display_debug_lines, &do_debug_lines, TRUE },
10192 { { ".debug_pubnames", ".zdebug_pubnames", NO_ABBREVS }, display_debug_pubnames, &do_debug_pubnames, FALSE },
10193 { { ".debug_gnu_pubnames", ".zdebug_gnu_pubnames", NO_ABBREVS }, display_debug_gnu_pubnames, &do_debug_pubnames, FALSE },
10194 { { ".eh_frame", "", NO_ABBREVS }, display_debug_frames, &do_debug_frames, TRUE },
10195 { { ".debug_macinfo", ".zdebug_macinfo", NO_ABBREVS }, display_debug_macinfo, &do_debug_macinfo, FALSE },
10196 { { ".debug_macro", ".zdebug_macro", NO_ABBREVS }, display_debug_macro, &do_debug_macinfo, TRUE },
10197 { { ".debug_str", ".zdebug_str", NO_ABBREVS }, display_debug_str, &do_debug_str, FALSE },
10198 { { ".debug_line_str", ".zdebug_line_str", NO_ABBREVS }, display_debug_str, &do_debug_str, FALSE },
10199 { { ".debug_loc", ".zdebug_loc", NO_ABBREVS }, display_debug_loc, &do_debug_loc, TRUE },
10200 { { ".debug_loclists", ".zdebug_loclists", NO_ABBREVS }, display_debug_loc, &do_debug_loc, TRUE },
10201 { { ".debug_pubtypes", ".zdebug_pubtypes", NO_ABBREVS }, display_debug_pubnames, &do_debug_pubtypes, FALSE },
10202 { { ".debug_gnu_pubtypes", ".zdebug_gnu_pubtypes", NO_ABBREVS }, display_debug_gnu_pubnames, &do_debug_pubtypes, FALSE },
10203 { { ".debug_ranges", ".zdebug_ranges", NO_ABBREVS }, display_debug_ranges, &do_debug_ranges, TRUE },
10204 { { ".debug_rnglists", ".zdebug_rnglists", NO_ABBREVS }, display_debug_ranges, &do_debug_ranges, TRUE },
10205 { { ".debug_static_func", ".zdebug_static_func", NO_ABBREVS }, display_debug_not_supported, NULL, FALSE },
10206 { { ".debug_static_vars", ".zdebug_static_vars", NO_ABBREVS }, display_debug_not_supported, NULL, FALSE },
10207 { { ".debug_types", ".zdebug_types", ABBREV (abbrev) }, display_debug_types, &do_debug_info, TRUE },
10208 { { ".debug_weaknames", ".zdebug_weaknames", NO_ABBREVS }, display_debug_not_supported, NULL, FALSE },
10209 { { ".gdb_index", "", NO_ABBREVS }, display_gdb_index, &do_gdb_index, FALSE },
10210 { { ".debug_names", "", NO_ABBREVS }, display_debug_names, &do_gdb_index, FALSE },
10211 { { ".trace_info", "", ABBREV (trace_abbrev) }, display_trace_info, &do_trace_info, TRUE },
10212 { { ".trace_abbrev", "", NO_ABBREVS }, display_debug_abbrev, &do_trace_abbrevs, FALSE },
10213 { { ".trace_aranges", "", NO_ABBREVS }, display_debug_aranges, &do_trace_aranges, FALSE },
10214 { { ".debug_info.dwo", ".zdebug_info.dwo", ABBREV (abbrev_dwo) }, display_debug_info, &do_debug_info, TRUE },
10215 { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", NO_ABBREVS }, display_debug_abbrev, &do_debug_abbrevs, FALSE },
10216 { { ".debug_types.dwo", ".zdebug_types.dwo", ABBREV (abbrev_dwo) }, display_debug_types, &do_debug_info, TRUE },
10217 { { ".debug_line.dwo", ".zdebug_line.dwo", NO_ABBREVS }, display_debug_lines, &do_debug_lines, TRUE },
10218 { { ".debug_loc.dwo", ".zdebug_loc.dwo", NO_ABBREVS }, display_debug_loc, &do_debug_loc, TRUE },
10219 { { ".debug_macro.dwo", ".zdebug_macro.dwo", NO_ABBREVS }, display_debug_macro, &do_debug_macinfo, TRUE },
10220 { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NO_ABBREVS }, display_debug_macinfo, &do_debug_macinfo, FALSE },
10221 { { ".debug_str.dwo", ".zdebug_str.dwo", NO_ABBREVS }, display_debug_str, &do_debug_str, TRUE },
10222 { { ".debug_str_offsets", ".zdebug_str_offsets", NO_ABBREVS }, display_debug_str_offsets, NULL, FALSE },
10223 { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NO_ABBREVS }, display_debug_str_offsets, NULL, FALSE },
10224 { { ".debug_addr", ".zdebug_addr", NO_ABBREVS }, display_debug_addr, &do_debug_addr, TRUE },
10225 { { ".debug_cu_index", "", NO_ABBREVS }, display_cu_index, &do_debug_cu_index, FALSE },
10226 { { ".debug_tu_index", "", NO_ABBREVS }, display_cu_index, &do_debug_cu_index, FALSE },
10227 { { ".gnu_debuglink", "", NO_ABBREVS }, display_debug_links, &do_debug_links, FALSE },
10228 { { ".gnu_debugaltlink", "", NO_ABBREVS }, display_debug_links, &do_debug_links, FALSE },
10229 /* Separate debug info files can containt their own .debug_str section,
10230 and this might be in *addition* to a .debug_str section already present
10231 in the main file. Hence we need to have two entries for .debug_str. */
10232 { { ".debug_str", ".zdebug_str", NO_ABBREVS }, display_debug_str, &do_debug_str, FALSE },
10233 };
10234
10235 /* A static assertion. */
10236 extern int debug_displays_assert[ARRAY_SIZE (debug_displays) == max ? 1 : -1];
This page took 0.288132 seconds and 4 git commands to generate.