* dwarf.c (display_debug_lines_raw): Do not treat .debug_line.dwo
[binutils-gdb.git] / binutils / dwarf.c
1 /* dwarf.c -- display DWARF contents of a BFD binary file
2 Copyright 2005-2013 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
32 #if !HAVE_DECL_STRNLEN
33 size_t strnlen (const char *, size_t);
34 #endif
35
36 static const char *regname (unsigned int regno, int row);
37
38 static int have_frame_base;
39 static int need_base_address;
40
41 static unsigned int last_pointer_size = 0;
42 static int warned_about_missing_comp_units = FALSE;
43
44 static unsigned int num_debug_info_entries = 0;
45 static debug_info *debug_information = NULL;
46 /* Special value for num_debug_info_entries to indicate
47 that the .debug_info section could not be loaded/parsed. */
48 #define DEBUG_INFO_UNAVAILABLE (unsigned int) -1
49
50 int eh_addr_size;
51
52 int do_debug_info;
53 int do_debug_abbrevs;
54 int do_debug_lines;
55 int do_debug_pubnames;
56 int do_debug_pubtypes;
57 int do_debug_aranges;
58 int do_debug_ranges;
59 int do_debug_frames;
60 int do_debug_frames_interp;
61 int do_debug_macinfo;
62 int do_debug_str;
63 int do_debug_loc;
64 int do_gdb_index;
65 int do_trace_info;
66 int do_trace_abbrevs;
67 int do_trace_aranges;
68 int do_debug_addr;
69 int do_debug_cu_index;
70 int do_wide;
71
72 int dwarf_cutoff_level = -1;
73 unsigned long dwarf_start_die;
74
75 int dwarf_check = 0;
76
77 /* Collection of CU/TU section sets from .debug_cu_index and .debug_tu_index
78 sections. For version 1 package files, each set is stored in SHNDX_POOL
79 as a zero-terminated list of section indexes comprising one set of debug
80 sections from a .dwo file. */
81
82 static int cu_tu_indexes_read = 0;
83 static unsigned int *shndx_pool = NULL;
84 static unsigned int shndx_pool_size = 0;
85 static unsigned int shndx_pool_used = 0;
86
87 /* For version 2 package files, each set contains an array of section offsets
88 and an array of section sizes, giving the offset and size of the
89 contribution from a CU or TU within one of the debug sections.
90 When displaying debug info from a package file, we need to use these
91 tables to locate the corresponding contributions to each section. */
92
93 struct cu_tu_set
94 {
95 uint64_t signature;
96 dwarf_vma section_offsets[DW_SECT_MAX];
97 size_t section_sizes[DW_SECT_MAX];
98 };
99
100 static int cu_count = 0;
101 static int tu_count = 0;
102 static struct cu_tu_set *cu_sets = NULL;
103 static struct cu_tu_set *tu_sets = NULL;
104
105 static void load_cu_tu_indexes (void *file);
106
107 /* Values for do_debug_lines. */
108 #define FLAG_DEBUG_LINES_RAW 1
109 #define FLAG_DEBUG_LINES_DECODED 2
110
111 static int
112 size_of_encoded_value (int encoding)
113 {
114 switch (encoding & 0x7)
115 {
116 default: /* ??? */
117 case 0: return eh_addr_size;
118 case 2: return 2;
119 case 3: return 4;
120 case 4: return 8;
121 }
122 }
123
124 static dwarf_vma
125 get_encoded_value (unsigned char *data,
126 int encoding,
127 struct dwarf_section *section)
128 {
129 int size = size_of_encoded_value (encoding);
130 dwarf_vma val;
131
132 if (encoding & DW_EH_PE_signed)
133 val = byte_get_signed (data, size);
134 else
135 val = byte_get (data, size);
136
137 if ((encoding & 0x70) == DW_EH_PE_pcrel)
138 val += section->address + (data - section->start);
139 return val;
140 }
141
142 /* Print a dwarf_vma value (typically an address, offset or length) in
143 hexadecimal format, followed by a space. The length of the value (and
144 hence the precision displayed) is determined by the byte_size parameter. */
145
146 static void
147 print_dwarf_vma (dwarf_vma val, unsigned byte_size)
148 {
149 static char buff[18];
150 int offset = 0;
151
152 /* Printf does not have a way of specifiying a maximum field width for an
153 integer value, so we print the full value into a buffer and then select
154 the precision we need. */
155 #if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
156 #ifndef __MINGW32__
157 snprintf (buff, sizeof (buff), "%16.16llx ", val);
158 #else
159 snprintf (buff, sizeof (buff), "%016I64x ", val);
160 #endif
161 #else
162 snprintf (buff, sizeof (buff), "%16.16lx ", val);
163 #endif
164
165 if (byte_size != 0)
166 {
167 if (byte_size > 0 && byte_size <= 8)
168 offset = 16 - 2 * byte_size;
169 else
170 error (_("Wrong size in print_dwarf_vma"));
171 }
172
173 fputs (buff + offset, stdout);
174 }
175
176 #if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
177 #ifndef __MINGW32__
178 #define DWARF_VMA_FMT "ll"
179 #else
180 #define DWARF_VMA_FMT "I64"
181 #endif
182 #else
183 #define DWARF_VMA_FMT "l"
184 #endif
185
186 static const char *
187 dwarf_vmatoa (const char *fmtch, dwarf_vma value)
188 {
189 /* As dwarf_vmatoa is used more then once in a printf call
190 for output, we are cycling through an fixed array of pointers
191 for return address. */
192 static int buf_pos = 0;
193 static struct dwarf_vmatoa_buf
194 {
195 char place[64];
196 } buf[16];
197 char fmt[32];
198 char *ret;
199
200 sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch);
201
202 ret = buf[buf_pos++].place;
203 buf_pos %= ARRAY_SIZE (buf);
204
205 snprintf (ret, sizeof (buf[0].place), fmt, value);
206
207 return ret;
208 }
209
210 /* Format a 64-bit value, given as two 32-bit values, in hex.
211 For reentrancy, this uses a buffer provided by the caller. */
212
213 static const char *
214 dwarf_vmatoa64 (dwarf_vma hvalue, dwarf_vma lvalue, char *buf,
215 unsigned int buf_len)
216 {
217 int len = 0;
218
219 if (hvalue == 0)
220 snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", lvalue);
221 else
222 {
223 len = snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", hvalue);
224 snprintf (buf + len, buf_len - len,
225 "%08" DWARF_VMA_FMT "x", lvalue);
226 }
227
228 return buf;
229 }
230
231 /* Read in a LEB128 encoded value starting at address DATA.
232 If SIGN is true, return a signed LEB128 value.
233 If LENGTH_RETURN is not NULL, return in it the number of bytes read.
234 No bytes will be read at address END or beyond. */
235
236 dwarf_vma
237 read_leb128 (unsigned char *data,
238 unsigned int *length_return,
239 bfd_boolean sign,
240 const unsigned char * const end)
241 {
242 dwarf_vma result = 0;
243 unsigned int num_read = 0;
244 unsigned int shift = 0;
245 unsigned char byte = 0;
246
247 while (data < end)
248 {
249 byte = *data++;
250 num_read++;
251
252 result |= ((dwarf_vma) (byte & 0x7f)) << shift;
253
254 shift += 7;
255 if ((byte & 0x80) == 0)
256 break;
257 }
258
259 if (length_return != NULL)
260 *length_return = num_read;
261
262 if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
263 result |= -1L << shift;
264
265 return result;
266 }
267
268 /* Create a signed version to avoid painful typecasts. */
269 static inline dwarf_signed_vma
270 read_sleb128 (unsigned char * data,
271 unsigned int * length_return,
272 const unsigned char * const end)
273 {
274 return (dwarf_signed_vma) read_leb128 (data, length_return, TRUE, end);
275 }
276
277 static inline dwarf_vma
278 read_uleb128 (unsigned char * data,
279 unsigned int * length_return,
280 const unsigned char * const end)
281 {
282 return read_leb128 (data, length_return, FALSE, end);
283 }
284
285 #define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END) \
286 do \
287 { \
288 unsigned int amount = (AMOUNT); \
289 if (((PTR) + amount) >= (END)) \
290 { \
291 if ((PTR) < (END)) \
292 amount = (END) - (PTR); \
293 else \
294 amount = 0; \
295 } \
296 if (amount) \
297 VAL = byte_get ((PTR), amount); \
298 else \
299 VAL = 0; \
300 } \
301 while (0)
302
303 #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
304 do \
305 { \
306 SAFE_BYTE_GET (VAL, PTR, AMOUNT, END); \
307 PTR += AMOUNT; \
308 } \
309 while (0)
310
311 #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END) \
312 do \
313 { \
314 unsigned int amount = (AMOUNT); \
315 if (((PTR) + amount) >= (END)) \
316 { \
317 if ((PTR) < (END)) \
318 amount = (END) - (PTR); \
319 else \
320 amount = 0; \
321 } \
322 if (amount) \
323 VAL = byte_get_signed ((PTR), amount); \
324 else \
325 VAL = 0; \
326 } \
327 while (0)
328
329 #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END) \
330 do \
331 { \
332 SAFE_SIGNED_BYTE_GET (VAL, PTR, AMOUNT, END); \
333 PTR += AMOUNT; \
334 } \
335 while (0)
336
337 #define SAFE_BYTE_GET64(PTR, HIGH, LOW, END) \
338 do \
339 { \
340 if (((PTR) + 8) < (END)) \
341 { \
342 byte_get_64 ((PTR), (HIGH), (LOW)); \
343 } \
344 else \
345 { \
346 PTR = END; \
347 * (LOW) = * (HIGH) = 0; \
348 } \
349 } \
350 while (0)
351
352 typedef struct State_Machine_Registers
353 {
354 dwarf_vma address;
355 unsigned int file;
356 unsigned int line;
357 unsigned int column;
358 int is_stmt;
359 int basic_block;
360 unsigned char op_index;
361 unsigned char end_sequence;
362 /* This variable hold the number of the last entry seen
363 in the File Table. */
364 unsigned int last_file_entry;
365 } SMR;
366
367 static SMR state_machine_regs;
368
369 static void
370 reset_state_machine (int is_stmt)
371 {
372 state_machine_regs.address = 0;
373 state_machine_regs.op_index = 0;
374 state_machine_regs.file = 1;
375 state_machine_regs.line = 1;
376 state_machine_regs.column = 0;
377 state_machine_regs.is_stmt = is_stmt;
378 state_machine_regs.basic_block = 0;
379 state_machine_regs.end_sequence = 0;
380 state_machine_regs.last_file_entry = 0;
381 }
382
383 /* Handled an extend line op.
384 Returns the number of bytes read. */
385
386 static int
387 process_extended_line_op (unsigned char * data,
388 int is_stmt,
389 unsigned char * end)
390 {
391 unsigned char op_code;
392 unsigned int bytes_read;
393 unsigned int len;
394 unsigned char *name;
395 unsigned char *orig_data = data;
396 dwarf_vma adr;
397
398 len = read_uleb128 (data, & bytes_read, end);
399 data += bytes_read;
400
401 if (len == 0 || data == end)
402 {
403 warn (_("badly formed extended line op encountered!\n"));
404 return bytes_read;
405 }
406
407 len += bytes_read;
408 op_code = *data++;
409
410 printf (_(" Extended opcode %d: "), op_code);
411
412 switch (op_code)
413 {
414 case DW_LNE_end_sequence:
415 printf (_("End of Sequence\n\n"));
416 reset_state_machine (is_stmt);
417 break;
418
419 case DW_LNE_set_address:
420 SAFE_BYTE_GET (adr, data, len - bytes_read - 1, end);
421 printf (_("set Address to 0x%s\n"), dwarf_vmatoa ("x", adr));
422 state_machine_regs.address = adr;
423 state_machine_regs.op_index = 0;
424 break;
425
426 case DW_LNE_define_file:
427 printf (_("define new File Table entry\n"));
428 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
429 printf (" %d\t", ++state_machine_regs.last_file_entry);
430
431 name = data;
432 data += strnlen ((char *) data, end - data) + 1;
433 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
434 data += bytes_read;
435 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
436 data += bytes_read;
437 printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
438 data += bytes_read;
439 printf ("%s\n\n", name);
440
441 if (((unsigned int) (data - orig_data) != len) || data == end)
442 warn (_("DW_LNE_define_file: Bad opcode length\n"));
443 break;
444
445 case DW_LNE_set_discriminator:
446 printf (_("set Discriminator to %s\n"),
447 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
448 break;
449
450 /* HP extensions. */
451 case DW_LNE_HP_negate_is_UV_update:
452 printf ("DW_LNE_HP_negate_is_UV_update\n");
453 break;
454 case DW_LNE_HP_push_context:
455 printf ("DW_LNE_HP_push_context\n");
456 break;
457 case DW_LNE_HP_pop_context:
458 printf ("DW_LNE_HP_pop_context\n");
459 break;
460 case DW_LNE_HP_set_file_line_column:
461 printf ("DW_LNE_HP_set_file_line_column\n");
462 break;
463 case DW_LNE_HP_set_routine_name:
464 printf ("DW_LNE_HP_set_routine_name\n");
465 break;
466 case DW_LNE_HP_set_sequence:
467 printf ("DW_LNE_HP_set_sequence\n");
468 break;
469 case DW_LNE_HP_negate_post_semantics:
470 printf ("DW_LNE_HP_negate_post_semantics\n");
471 break;
472 case DW_LNE_HP_negate_function_exit:
473 printf ("DW_LNE_HP_negate_function_exit\n");
474 break;
475 case DW_LNE_HP_negate_front_end_logical:
476 printf ("DW_LNE_HP_negate_front_end_logical\n");
477 break;
478 case DW_LNE_HP_define_proc:
479 printf ("DW_LNE_HP_define_proc\n");
480 break;
481 case DW_LNE_HP_source_file_correlation:
482 {
483 unsigned char *edata = data + len - bytes_read - 1;
484
485 printf ("DW_LNE_HP_source_file_correlation\n");
486
487 while (data < edata)
488 {
489 unsigned int opc;
490
491 opc = read_uleb128 (data, & bytes_read, edata);
492 data += bytes_read;
493
494 switch (opc)
495 {
496 case DW_LNE_HP_SFC_formfeed:
497 printf (" DW_LNE_HP_SFC_formfeed\n");
498 break;
499 case DW_LNE_HP_SFC_set_listing_line:
500 printf (" DW_LNE_HP_SFC_set_listing_line (%s)\n",
501 dwarf_vmatoa ("u",
502 read_uleb128 (data, & bytes_read, edata)));
503 data += bytes_read;
504 break;
505 case DW_LNE_HP_SFC_associate:
506 printf (" DW_LNE_HP_SFC_associate ");
507 printf ("(%s",
508 dwarf_vmatoa ("u",
509 read_uleb128 (data, & bytes_read, edata)));
510 data += bytes_read;
511 printf (",%s",
512 dwarf_vmatoa ("u",
513 read_uleb128 (data, & bytes_read, edata)));
514 data += bytes_read;
515 printf (",%s)\n",
516 dwarf_vmatoa ("u",
517 read_uleb128 (data, & bytes_read, edata)));
518 data += bytes_read;
519 break;
520 default:
521 printf (_(" UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc);
522 data = edata;
523 break;
524 }
525 }
526 }
527 break;
528
529 default:
530 {
531 unsigned int rlen = len - bytes_read - 1;
532
533 if (op_code >= DW_LNE_lo_user
534 /* The test against DW_LNW_hi_user is redundant due to
535 the limited range of the unsigned char data type used
536 for op_code. */
537 /*&& op_code <= DW_LNE_hi_user*/)
538 printf (_("user defined: "));
539 else
540 printf (_("UNKNOWN: "));
541 printf (_("length %d ["), rlen);
542 for (; rlen; rlen--)
543 printf (" %02x", *data++);
544 printf ("]\n");
545 }
546 break;
547 }
548
549 return len;
550 }
551
552 static const unsigned char *
553 fetch_indirect_string (dwarf_vma offset)
554 {
555 struct dwarf_section *section = &debug_displays [str].section;
556
557 if (section->start == NULL)
558 return (const unsigned char *) _("<no .debug_str section>");
559
560 /* DWARF sections under Mach-O have non-zero addresses. */
561 offset -= section->address;
562 if (offset > section->size)
563 {
564 warn (_("DW_FORM_strp offset too big: %s\n"),
565 dwarf_vmatoa ("x", offset));
566 return (const unsigned char *) _("<offset is too big>");
567 }
568
569 return (const unsigned char *) section->start + offset;
570 }
571
572 static const char *
573 fetch_indexed_string (dwarf_vma idx, struct cu_tu_set *this_set,
574 dwarf_vma offset_size, int dwo)
575 {
576 enum dwarf_section_display_enum str_sec_idx = dwo ? str_dwo : str;
577 enum dwarf_section_display_enum idx_sec_idx = dwo ? str_index_dwo : str_index;
578 struct dwarf_section *index_section = &debug_displays [idx_sec_idx].section;
579 struct dwarf_section *str_section = &debug_displays [str_sec_idx].section;
580 dwarf_vma index_offset = idx * offset_size;
581 dwarf_vma str_offset;
582
583 if (index_section->start == NULL)
584 return (dwo ? _("<no .debug_str_offsets.dwo section>")
585 : _("<no .debug_str_offsets section>"));
586
587 /* DWARF sections under Mach-O have non-zero addresses. */
588 index_offset -= index_section->address;
589 if (this_set != NULL)
590 index_offset += this_set->section_offsets [DW_SECT_STR_OFFSETS];
591 if (index_offset > index_section->size)
592 {
593 warn (_("DW_FORM_GNU_str_index offset too big: %s\n"),
594 dwarf_vmatoa ("x", index_offset));
595 return _("<index offset is too big>");
596 }
597
598 if (str_section->start == NULL)
599 return (dwo ? _("<no .debug_str.dwo section>")
600 : _("<no .debug_str section>"));
601
602 str_offset = byte_get (index_section->start + index_offset, offset_size);
603 str_offset -= str_section->address;
604 if (str_offset > str_section->size)
605 {
606 warn (_("DW_FORM_GNU_str_index indirect offset too big: %s\n"),
607 dwarf_vmatoa ("x", str_offset));
608 return _("<indirect index offset is too big>");
609 }
610
611 return (const char *) str_section->start + str_offset;
612 }
613
614 static const char *
615 fetch_indexed_value (dwarf_vma offset, dwarf_vma bytes)
616 {
617 struct dwarf_section *section = &debug_displays [debug_addr].section;
618
619 if (section->start == NULL)
620 return (_("<no .debug_addr section>"));
621
622 if (offset + bytes > section->size)
623 {
624 warn (_("Offset into section %s too big: %s\n"),
625 section->name, dwarf_vmatoa ("x", offset));
626 return "<offset too big>";
627 }
628
629 return dwarf_vmatoa ("x", byte_get (section->start + offset, bytes));
630 }
631
632
633 /* FIXME: There are better and more efficient ways to handle
634 these structures. For now though, I just want something that
635 is simple to implement. */
636 typedef struct abbrev_attr
637 {
638 unsigned long attribute;
639 unsigned long form;
640 struct abbrev_attr *next;
641 }
642 abbrev_attr;
643
644 typedef struct abbrev_entry
645 {
646 unsigned long entry;
647 unsigned long tag;
648 int children;
649 struct abbrev_attr *first_attr;
650 struct abbrev_attr *last_attr;
651 struct abbrev_entry *next;
652 }
653 abbrev_entry;
654
655 static abbrev_entry *first_abbrev = NULL;
656 static abbrev_entry *last_abbrev = NULL;
657
658 static void
659 free_abbrevs (void)
660 {
661 abbrev_entry *abbrv;
662
663 for (abbrv = first_abbrev; abbrv;)
664 {
665 abbrev_entry *next_abbrev = abbrv->next;
666 abbrev_attr *attr;
667
668 for (attr = abbrv->first_attr; attr;)
669 {
670 abbrev_attr *next_attr = attr->next;
671
672 free (attr);
673 attr = next_attr;
674 }
675
676 free (abbrv);
677 abbrv = next_abbrev;
678 }
679
680 last_abbrev = first_abbrev = NULL;
681 }
682
683 static void
684 add_abbrev (unsigned long number, unsigned long tag, int children)
685 {
686 abbrev_entry *entry;
687
688 entry = (abbrev_entry *) malloc (sizeof (*entry));
689 if (entry == NULL)
690 /* ugg */
691 return;
692
693 entry->entry = number;
694 entry->tag = tag;
695 entry->children = children;
696 entry->first_attr = NULL;
697 entry->last_attr = NULL;
698 entry->next = NULL;
699
700 if (first_abbrev == NULL)
701 first_abbrev = entry;
702 else
703 last_abbrev->next = entry;
704
705 last_abbrev = entry;
706 }
707
708 static void
709 add_abbrev_attr (unsigned long attribute, unsigned long form)
710 {
711 abbrev_attr *attr;
712
713 attr = (abbrev_attr *) malloc (sizeof (*attr));
714 if (attr == NULL)
715 /* ugg */
716 return;
717
718 attr->attribute = attribute;
719 attr->form = form;
720 attr->next = NULL;
721
722 if (last_abbrev->first_attr == NULL)
723 last_abbrev->first_attr = attr;
724 else
725 last_abbrev->last_attr->next = attr;
726
727 last_abbrev->last_attr = attr;
728 }
729
730 /* Processes the (partial) contents of a .debug_abbrev section.
731 Returns NULL if the end of the section was encountered.
732 Returns the address after the last byte read if the end of
733 an abbreviation set was found. */
734
735 static unsigned char *
736 process_abbrev_section (unsigned char *start, unsigned char *end)
737 {
738 if (first_abbrev != NULL)
739 return NULL;
740
741 while (start < end)
742 {
743 unsigned int bytes_read;
744 unsigned long entry;
745 unsigned long tag;
746 unsigned long attribute;
747 int children;
748
749 entry = read_uleb128 (start, & bytes_read, end);
750 start += bytes_read;
751
752 /* A single zero is supposed to end the section according
753 to the standard. If there's more, then signal that to
754 the caller. */
755 if (start == end)
756 return NULL;
757 if (entry == 0)
758 return start;
759
760 tag = read_uleb128 (start, & bytes_read, end);
761 start += bytes_read;
762 if (start == end)
763 return NULL;
764
765 children = *start++;
766
767 add_abbrev (entry, tag, children);
768
769 do
770 {
771 unsigned long form;
772
773 attribute = read_uleb128 (start, & bytes_read, end);
774 start += bytes_read;
775 if (start == end)
776 break;
777
778 form = read_uleb128 (start, & bytes_read, end);
779 start += bytes_read;
780 if (start == end)
781 break;
782
783 add_abbrev_attr (attribute, form);
784 }
785 while (attribute != 0);
786 }
787
788 /* Report the missing single zero which ends the section. */
789 error (_(".debug_abbrev section not zero terminated\n"));
790
791 return NULL;
792 }
793
794 static const char *
795 get_TAG_name (unsigned long tag)
796 {
797 const char *name = get_DW_TAG_name ((unsigned int)tag);
798
799 if (name == NULL)
800 {
801 static char buffer[100];
802
803 snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag);
804 return buffer;
805 }
806
807 return name;
808 }
809
810 static const char *
811 get_FORM_name (unsigned long form)
812 {
813 const char *name;
814
815 if (form == 0)
816 return "DW_FORM value: 0";
817
818 name = get_DW_FORM_name (form);
819 if (name == NULL)
820 {
821 static char buffer[100];
822
823 snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
824 return buffer;
825 }
826
827 return name;
828 }
829
830 static unsigned char *
831 display_block (unsigned char *data,
832 dwarf_vma length,
833 const unsigned char * const end)
834 {
835 dwarf_vma maxlen;
836
837 printf (_(" %s byte block: "), dwarf_vmatoa ("u", length));
838
839 maxlen = (dwarf_vma) (end - data);
840 length = length > maxlen ? maxlen : length;
841
842 while (length --)
843 printf ("%lx ", (unsigned long) byte_get (data++, 1));
844
845 return data;
846 }
847
848 static int
849 decode_location_expression (unsigned char * data,
850 unsigned int pointer_size,
851 unsigned int offset_size,
852 int dwarf_version,
853 dwarf_vma length,
854 dwarf_vma cu_offset,
855 struct dwarf_section * section)
856 {
857 unsigned op;
858 unsigned int bytes_read;
859 dwarf_vma uvalue;
860 dwarf_signed_vma svalue;
861 unsigned char *end = data + length;
862 int need_frame_base = 0;
863
864 while (data < end)
865 {
866 op = *data++;
867
868 switch (op)
869 {
870 case DW_OP_addr:
871 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
872 printf ("DW_OP_addr: %s", dwarf_vmatoa ("x", uvalue));
873 break;
874 case DW_OP_deref:
875 printf ("DW_OP_deref");
876 break;
877 case DW_OP_const1u:
878 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
879 printf ("DW_OP_const1u: %lu", (unsigned long) uvalue);
880 break;
881 case DW_OP_const1s:
882 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 1, end);
883 printf ("DW_OP_const1s: %ld", (long) svalue);
884 break;
885 case DW_OP_const2u:
886 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
887 printf ("DW_OP_const2u: %lu", (unsigned long) uvalue);
888 break;
889 case DW_OP_const2s:
890 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
891 printf ("DW_OP_const2s: %ld", (long) svalue);
892 break;
893 case DW_OP_const4u:
894 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
895 printf ("DW_OP_const4u: %lu", (unsigned long) uvalue);
896 break;
897 case DW_OP_const4s:
898 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
899 printf ("DW_OP_const4s: %ld", (long) svalue);
900 break;
901 case DW_OP_const8u:
902 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
903 printf ("DW_OP_const8u: %lu ", (unsigned long) uvalue);
904 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
905 printf ("%lu", (unsigned long) uvalue);
906 break;
907 case DW_OP_const8s:
908 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
909 printf ("DW_OP_const8s: %ld ", (long) svalue);
910 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
911 printf ("%ld", (long) svalue);
912 break;
913 case DW_OP_constu:
914 printf ("DW_OP_constu: %s",
915 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
916 data += bytes_read;
917 break;
918 case DW_OP_consts:
919 printf ("DW_OP_consts: %s",
920 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
921 data += bytes_read;
922 break;
923 case DW_OP_dup:
924 printf ("DW_OP_dup");
925 break;
926 case DW_OP_drop:
927 printf ("DW_OP_drop");
928 break;
929 case DW_OP_over:
930 printf ("DW_OP_over");
931 break;
932 case DW_OP_pick:
933 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
934 printf ("DW_OP_pick: %ld", (unsigned long) uvalue);
935 break;
936 case DW_OP_swap:
937 printf ("DW_OP_swap");
938 break;
939 case DW_OP_rot:
940 printf ("DW_OP_rot");
941 break;
942 case DW_OP_xderef:
943 printf ("DW_OP_xderef");
944 break;
945 case DW_OP_abs:
946 printf ("DW_OP_abs");
947 break;
948 case DW_OP_and:
949 printf ("DW_OP_and");
950 break;
951 case DW_OP_div:
952 printf ("DW_OP_div");
953 break;
954 case DW_OP_minus:
955 printf ("DW_OP_minus");
956 break;
957 case DW_OP_mod:
958 printf ("DW_OP_mod");
959 break;
960 case DW_OP_mul:
961 printf ("DW_OP_mul");
962 break;
963 case DW_OP_neg:
964 printf ("DW_OP_neg");
965 break;
966 case DW_OP_not:
967 printf ("DW_OP_not");
968 break;
969 case DW_OP_or:
970 printf ("DW_OP_or");
971 break;
972 case DW_OP_plus:
973 printf ("DW_OP_plus");
974 break;
975 case DW_OP_plus_uconst:
976 printf ("DW_OP_plus_uconst: %s",
977 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
978 data += bytes_read;
979 break;
980 case DW_OP_shl:
981 printf ("DW_OP_shl");
982 break;
983 case DW_OP_shr:
984 printf ("DW_OP_shr");
985 break;
986 case DW_OP_shra:
987 printf ("DW_OP_shra");
988 break;
989 case DW_OP_xor:
990 printf ("DW_OP_xor");
991 break;
992 case DW_OP_bra:
993 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
994 printf ("DW_OP_bra: %ld", (long) svalue);
995 break;
996 case DW_OP_eq:
997 printf ("DW_OP_eq");
998 break;
999 case DW_OP_ge:
1000 printf ("DW_OP_ge");
1001 break;
1002 case DW_OP_gt:
1003 printf ("DW_OP_gt");
1004 break;
1005 case DW_OP_le:
1006 printf ("DW_OP_le");
1007 break;
1008 case DW_OP_lt:
1009 printf ("DW_OP_lt");
1010 break;
1011 case DW_OP_ne:
1012 printf ("DW_OP_ne");
1013 break;
1014 case DW_OP_skip:
1015 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1016 printf ("DW_OP_skip: %ld", (long) svalue);
1017 break;
1018
1019 case DW_OP_lit0:
1020 case DW_OP_lit1:
1021 case DW_OP_lit2:
1022 case DW_OP_lit3:
1023 case DW_OP_lit4:
1024 case DW_OP_lit5:
1025 case DW_OP_lit6:
1026 case DW_OP_lit7:
1027 case DW_OP_lit8:
1028 case DW_OP_lit9:
1029 case DW_OP_lit10:
1030 case DW_OP_lit11:
1031 case DW_OP_lit12:
1032 case DW_OP_lit13:
1033 case DW_OP_lit14:
1034 case DW_OP_lit15:
1035 case DW_OP_lit16:
1036 case DW_OP_lit17:
1037 case DW_OP_lit18:
1038 case DW_OP_lit19:
1039 case DW_OP_lit20:
1040 case DW_OP_lit21:
1041 case DW_OP_lit22:
1042 case DW_OP_lit23:
1043 case DW_OP_lit24:
1044 case DW_OP_lit25:
1045 case DW_OP_lit26:
1046 case DW_OP_lit27:
1047 case DW_OP_lit28:
1048 case DW_OP_lit29:
1049 case DW_OP_lit30:
1050 case DW_OP_lit31:
1051 printf ("DW_OP_lit%d", op - DW_OP_lit0);
1052 break;
1053
1054 case DW_OP_reg0:
1055 case DW_OP_reg1:
1056 case DW_OP_reg2:
1057 case DW_OP_reg3:
1058 case DW_OP_reg4:
1059 case DW_OP_reg5:
1060 case DW_OP_reg6:
1061 case DW_OP_reg7:
1062 case DW_OP_reg8:
1063 case DW_OP_reg9:
1064 case DW_OP_reg10:
1065 case DW_OP_reg11:
1066 case DW_OP_reg12:
1067 case DW_OP_reg13:
1068 case DW_OP_reg14:
1069 case DW_OP_reg15:
1070 case DW_OP_reg16:
1071 case DW_OP_reg17:
1072 case DW_OP_reg18:
1073 case DW_OP_reg19:
1074 case DW_OP_reg20:
1075 case DW_OP_reg21:
1076 case DW_OP_reg22:
1077 case DW_OP_reg23:
1078 case DW_OP_reg24:
1079 case DW_OP_reg25:
1080 case DW_OP_reg26:
1081 case DW_OP_reg27:
1082 case DW_OP_reg28:
1083 case DW_OP_reg29:
1084 case DW_OP_reg30:
1085 case DW_OP_reg31:
1086 printf ("DW_OP_reg%d (%s)", op - DW_OP_reg0,
1087 regname (op - DW_OP_reg0, 1));
1088 break;
1089
1090 case DW_OP_breg0:
1091 case DW_OP_breg1:
1092 case DW_OP_breg2:
1093 case DW_OP_breg3:
1094 case DW_OP_breg4:
1095 case DW_OP_breg5:
1096 case DW_OP_breg6:
1097 case DW_OP_breg7:
1098 case DW_OP_breg8:
1099 case DW_OP_breg9:
1100 case DW_OP_breg10:
1101 case DW_OP_breg11:
1102 case DW_OP_breg12:
1103 case DW_OP_breg13:
1104 case DW_OP_breg14:
1105 case DW_OP_breg15:
1106 case DW_OP_breg16:
1107 case DW_OP_breg17:
1108 case DW_OP_breg18:
1109 case DW_OP_breg19:
1110 case DW_OP_breg20:
1111 case DW_OP_breg21:
1112 case DW_OP_breg22:
1113 case DW_OP_breg23:
1114 case DW_OP_breg24:
1115 case DW_OP_breg25:
1116 case DW_OP_breg26:
1117 case DW_OP_breg27:
1118 case DW_OP_breg28:
1119 case DW_OP_breg29:
1120 case DW_OP_breg30:
1121 case DW_OP_breg31:
1122 printf ("DW_OP_breg%d (%s): %s",
1123 op - DW_OP_breg0,
1124 regname (op - DW_OP_breg0, 1),
1125 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1126 data += bytes_read;
1127 break;
1128
1129 case DW_OP_regx:
1130 uvalue = read_uleb128 (data, &bytes_read, end);
1131 data += bytes_read;
1132 printf ("DW_OP_regx: %s (%s)",
1133 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1134 break;
1135 case DW_OP_fbreg:
1136 need_frame_base = 1;
1137 printf ("DW_OP_fbreg: %s",
1138 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1139 data += bytes_read;
1140 break;
1141 case DW_OP_bregx:
1142 uvalue = read_uleb128 (data, &bytes_read, end);
1143 data += bytes_read;
1144 printf ("DW_OP_bregx: %s (%s) %s",
1145 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1),
1146 dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1147 data += bytes_read;
1148 break;
1149 case DW_OP_piece:
1150 printf ("DW_OP_piece: %s",
1151 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1152 data += bytes_read;
1153 break;
1154 case DW_OP_deref_size:
1155 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1156 printf ("DW_OP_deref_size: %ld", (long) uvalue);
1157 break;
1158 case DW_OP_xderef_size:
1159 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1160 printf ("DW_OP_xderef_size: %ld", (long) uvalue);
1161 break;
1162 case DW_OP_nop:
1163 printf ("DW_OP_nop");
1164 break;
1165
1166 /* DWARF 3 extensions. */
1167 case DW_OP_push_object_address:
1168 printf ("DW_OP_push_object_address");
1169 break;
1170 case DW_OP_call2:
1171 /* XXX: Strictly speaking for 64-bit DWARF3 files
1172 this ought to be an 8-byte wide computation. */
1173 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1174 printf ("DW_OP_call2: <0x%s>",
1175 dwarf_vmatoa ("x", svalue + cu_offset));
1176 break;
1177 case DW_OP_call4:
1178 /* XXX: Strictly speaking for 64-bit DWARF3 files
1179 this ought to be an 8-byte wide computation. */
1180 SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1181 printf ("DW_OP_call4: <0x%s>",
1182 dwarf_vmatoa ("x", svalue + cu_offset));
1183 break;
1184 case DW_OP_call_ref:
1185 /* XXX: Strictly speaking for 64-bit DWARF3 files
1186 this ought to be an 8-byte wide computation. */
1187 if (dwarf_version == -1)
1188 {
1189 printf (_("(DW_OP_call_ref in frame info)"));
1190 /* No way to tell where the next op is, so just bail. */
1191 return need_frame_base;
1192 }
1193 if (dwarf_version == 2)
1194 {
1195 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1196 }
1197 else
1198 {
1199 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1200 }
1201 printf ("DW_OP_call_ref: <0x%s>", dwarf_vmatoa ("x", uvalue));
1202 break;
1203 case DW_OP_form_tls_address:
1204 printf ("DW_OP_form_tls_address");
1205 break;
1206 case DW_OP_call_frame_cfa:
1207 printf ("DW_OP_call_frame_cfa");
1208 break;
1209 case DW_OP_bit_piece:
1210 printf ("DW_OP_bit_piece: ");
1211 printf (_("size: %s "),
1212 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1213 data += bytes_read;
1214 printf (_("offset: %s "),
1215 dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1216 data += bytes_read;
1217 break;
1218
1219 /* DWARF 4 extensions. */
1220 case DW_OP_stack_value:
1221 printf ("DW_OP_stack_value");
1222 break;
1223
1224 case DW_OP_implicit_value:
1225 printf ("DW_OP_implicit_value");
1226 uvalue = read_uleb128 (data, &bytes_read, end);
1227 data += bytes_read;
1228 display_block (data, uvalue, end);
1229 data += uvalue;
1230 break;
1231
1232 /* GNU extensions. */
1233 case DW_OP_GNU_push_tls_address:
1234 printf (_("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown"));
1235 break;
1236 case DW_OP_GNU_uninit:
1237 printf ("DW_OP_GNU_uninit");
1238 /* FIXME: Is there data associated with this OP ? */
1239 break;
1240 case DW_OP_GNU_encoded_addr:
1241 {
1242 int encoding;
1243 dwarf_vma addr;
1244
1245 encoding = *data++;
1246 addr = get_encoded_value (data, encoding, section);
1247 data += size_of_encoded_value (encoding);
1248
1249 printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding);
1250 print_dwarf_vma (addr, pointer_size);
1251 }
1252 break;
1253 case DW_OP_GNU_implicit_pointer:
1254 /* XXX: Strictly speaking for 64-bit DWARF3 files
1255 this ought to be an 8-byte wide computation. */
1256 if (dwarf_version == -1)
1257 {
1258 printf (_("(DW_OP_GNU_implicit_pointer in frame info)"));
1259 /* No way to tell where the next op is, so just bail. */
1260 return need_frame_base;
1261 }
1262 if (dwarf_version == 2)
1263 {
1264 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1265 }
1266 else
1267 {
1268 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1269 }
1270 printf ("DW_OP_GNU_implicit_pointer: <0x%s> %s",
1271 dwarf_vmatoa ("x", uvalue),
1272 dwarf_vmatoa ("d", read_sleb128 (data,
1273 &bytes_read, end)));
1274 data += bytes_read;
1275 break;
1276 case DW_OP_GNU_entry_value:
1277 uvalue = read_uleb128 (data, &bytes_read, end);
1278 data += bytes_read;
1279 printf ("DW_OP_GNU_entry_value: (");
1280 if (decode_location_expression (data, pointer_size, offset_size,
1281 dwarf_version, uvalue,
1282 cu_offset, section))
1283 need_frame_base = 1;
1284 putchar (')');
1285 data += uvalue;
1286 break;
1287 case DW_OP_GNU_const_type:
1288 uvalue = read_uleb128 (data, &bytes_read, end);
1289 data += bytes_read;
1290 printf ("DW_OP_GNU_const_type: <0x%s> ",
1291 dwarf_vmatoa ("x", cu_offset + uvalue));
1292 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1293 display_block (data, uvalue, end);
1294 data += uvalue;
1295 break;
1296 case DW_OP_GNU_regval_type:
1297 uvalue = read_uleb128 (data, &bytes_read, end);
1298 data += bytes_read;
1299 printf ("DW_OP_GNU_regval_type: %s (%s)",
1300 dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1301 uvalue = read_uleb128 (data, &bytes_read, end);
1302 data += bytes_read;
1303 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1304 break;
1305 case DW_OP_GNU_deref_type:
1306 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1307 printf ("DW_OP_GNU_deref_type: %ld", (long) uvalue);
1308 uvalue = read_uleb128 (data, &bytes_read, end);
1309 data += bytes_read;
1310 printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1311 break;
1312 case DW_OP_GNU_convert:
1313 uvalue = read_uleb128 (data, &bytes_read, end);
1314 data += bytes_read;
1315 printf ("DW_OP_GNU_convert <0x%s>",
1316 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1317 break;
1318 case DW_OP_GNU_reinterpret:
1319 uvalue = read_uleb128 (data, &bytes_read, end);
1320 data += bytes_read;
1321 printf ("DW_OP_GNU_reinterpret <0x%s>",
1322 dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1323 break;
1324 case DW_OP_GNU_parameter_ref:
1325 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1326 printf ("DW_OP_GNU_parameter_ref: <0x%s>",
1327 dwarf_vmatoa ("x", cu_offset + uvalue));
1328 break;
1329 case DW_OP_GNU_addr_index:
1330 uvalue = read_uleb128 (data, &bytes_read, end);
1331 data += bytes_read;
1332 printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1333 break;
1334 case DW_OP_GNU_const_index:
1335 uvalue = read_uleb128 (data, &bytes_read, end);
1336 data += bytes_read;
1337 printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1338 break;
1339
1340 /* HP extensions. */
1341 case DW_OP_HP_is_value:
1342 printf ("DW_OP_HP_is_value");
1343 /* FIXME: Is there data associated with this OP ? */
1344 break;
1345 case DW_OP_HP_fltconst4:
1346 printf ("DW_OP_HP_fltconst4");
1347 /* FIXME: Is there data associated with this OP ? */
1348 break;
1349 case DW_OP_HP_fltconst8:
1350 printf ("DW_OP_HP_fltconst8");
1351 /* FIXME: Is there data associated with this OP ? */
1352 break;
1353 case DW_OP_HP_mod_range:
1354 printf ("DW_OP_HP_mod_range");
1355 /* FIXME: Is there data associated with this OP ? */
1356 break;
1357 case DW_OP_HP_unmod_range:
1358 printf ("DW_OP_HP_unmod_range");
1359 /* FIXME: Is there data associated with this OP ? */
1360 break;
1361 case DW_OP_HP_tls:
1362 printf ("DW_OP_HP_tls");
1363 /* FIXME: Is there data associated with this OP ? */
1364 break;
1365
1366 /* PGI (STMicroelectronics) extensions. */
1367 case DW_OP_PGI_omp_thread_num:
1368 /* Pushes the thread number for the current thread as it would be
1369 returned by the standard OpenMP library function:
1370 omp_get_thread_num(). The "current thread" is the thread for
1371 which the expression is being evaluated. */
1372 printf ("DW_OP_PGI_omp_thread_num");
1373 break;
1374
1375 default:
1376 if (op >= DW_OP_lo_user
1377 && op <= DW_OP_hi_user)
1378 printf (_("(User defined location op)"));
1379 else
1380 printf (_("(Unknown location op)"));
1381 /* No way to tell where the next op is, so just bail. */
1382 return need_frame_base;
1383 }
1384
1385 /* Separate the ops. */
1386 if (data < end)
1387 printf ("; ");
1388 }
1389
1390 return need_frame_base;
1391 }
1392
1393 /* Find the CU or TU set corresponding to the given CU_OFFSET.
1394 This is used for DWARF package files. */
1395
1396 static struct cu_tu_set *
1397 find_cu_tu_set_v2 (dwarf_vma cu_offset, int do_types)
1398 {
1399 struct cu_tu_set *p;
1400 unsigned int nsets;
1401 unsigned int dw_sect;
1402
1403 if (do_types)
1404 {
1405 p = tu_sets;
1406 nsets = tu_count;
1407 dw_sect = DW_SECT_TYPES;
1408 }
1409 else
1410 {
1411 p = cu_sets;
1412 nsets = cu_count;
1413 dw_sect = DW_SECT_INFO;
1414 }
1415 while (nsets > 0)
1416 {
1417 if (p->section_offsets [dw_sect] == cu_offset)
1418 return p;
1419 p++;
1420 nsets--;
1421 }
1422 return NULL;
1423 }
1424
1425 static unsigned char *
1426 read_and_display_attr_value (unsigned long attribute,
1427 unsigned long form,
1428 unsigned char * data,
1429 unsigned char * end,
1430 dwarf_vma cu_offset,
1431 dwarf_vma pointer_size,
1432 dwarf_vma offset_size,
1433 int dwarf_version,
1434 debug_info * debug_info_p,
1435 int do_loc,
1436 struct dwarf_section * section,
1437 struct cu_tu_set * this_set)
1438 {
1439 dwarf_vma uvalue = 0;
1440 unsigned char *block_start = NULL;
1441 unsigned char * orig_data = data;
1442 unsigned int bytes_read;
1443
1444 if (data == end)
1445 {
1446 warn (_("corrupt attribute\n"));
1447 return data;
1448 }
1449
1450 switch (form)
1451 {
1452 default:
1453 break;
1454
1455 case DW_FORM_ref_addr:
1456 if (dwarf_version == 2)
1457 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1458 else if (dwarf_version == 3 || dwarf_version == 4)
1459 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1460 else
1461 error (_("Internal error: DWARF version is not 2, 3 or 4.\n"));
1462
1463 break;
1464
1465 case DW_FORM_addr:
1466 SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1467 break;
1468
1469 case DW_FORM_strp:
1470 case DW_FORM_sec_offset:
1471 case DW_FORM_GNU_ref_alt:
1472 case DW_FORM_GNU_strp_alt:
1473 SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1474 break;
1475
1476 case DW_FORM_flag_present:
1477 uvalue = 1;
1478 break;
1479
1480 case DW_FORM_ref1:
1481 case DW_FORM_flag:
1482 case DW_FORM_data1:
1483 SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1484 break;
1485
1486 case DW_FORM_ref2:
1487 case DW_FORM_data2:
1488 SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1489 break;
1490
1491 case DW_FORM_ref4:
1492 case DW_FORM_data4:
1493 SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1494 break;
1495
1496 case DW_FORM_sdata:
1497 uvalue = read_sleb128 (data, & bytes_read, end);
1498 data += bytes_read;
1499 break;
1500
1501 case DW_FORM_GNU_str_index:
1502 uvalue = read_uleb128 (data, & bytes_read, end);
1503 data += bytes_read;
1504 break;
1505
1506 case DW_FORM_ref_udata:
1507 case DW_FORM_udata:
1508 uvalue = read_uleb128 (data, & bytes_read, end);
1509 data += bytes_read;
1510 break;
1511
1512 case DW_FORM_indirect:
1513 form = read_uleb128 (data, & bytes_read, end);
1514 data += bytes_read;
1515 if (!do_loc)
1516 printf (" %s", get_FORM_name (form));
1517 return read_and_display_attr_value (attribute, form, data, end,
1518 cu_offset, pointer_size,
1519 offset_size, dwarf_version,
1520 debug_info_p, do_loc,
1521 section, this_set);
1522 case DW_FORM_GNU_addr_index:
1523 uvalue = read_uleb128 (data, & bytes_read, end);
1524 data += bytes_read;
1525 break;
1526 }
1527
1528 switch (form)
1529 {
1530 case DW_FORM_ref_addr:
1531 if (!do_loc)
1532 printf (" <0x%s>", dwarf_vmatoa ("x",uvalue));
1533 break;
1534
1535 case DW_FORM_GNU_ref_alt:
1536 if (!do_loc)
1537 printf (" <alt 0x%s>", dwarf_vmatoa ("x",uvalue));
1538 break;
1539
1540 case DW_FORM_ref1:
1541 case DW_FORM_ref2:
1542 case DW_FORM_ref4:
1543 case DW_FORM_ref_udata:
1544 if (!do_loc)
1545 printf (" <0x%s>", dwarf_vmatoa ("x", uvalue + cu_offset));
1546 break;
1547
1548 case DW_FORM_data4:
1549 case DW_FORM_addr:
1550 case DW_FORM_sec_offset:
1551 if (!do_loc)
1552 printf (" 0x%s", dwarf_vmatoa ("x", uvalue));
1553 break;
1554
1555 case DW_FORM_flag_present:
1556 case DW_FORM_flag:
1557 case DW_FORM_data1:
1558 case DW_FORM_data2:
1559 case DW_FORM_sdata:
1560 case DW_FORM_udata:
1561 if (!do_loc)
1562 printf (" %s", dwarf_vmatoa ("d", uvalue));
1563 break;
1564
1565 case DW_FORM_ref8:
1566 case DW_FORM_data8:
1567 if (!do_loc)
1568 {
1569 dwarf_vma high_bits;
1570 char buf[64];
1571
1572 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1573
1574 printf (" 0x%s",
1575 dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf)));
1576 }
1577
1578 if ((do_loc || do_debug_loc || do_debug_ranges)
1579 && num_debug_info_entries == 0)
1580 {
1581 if (sizeof (uvalue) == 8)
1582 SAFE_BYTE_GET (uvalue, data, 8, end);
1583 else
1584 error (_("DW_FORM_data8 is unsupported when sizeof (dwarf_vma) != 8\n"));
1585 }
1586
1587 data += 8;
1588 break;
1589
1590 case DW_FORM_string:
1591 if (!do_loc)
1592 printf (" %.*s", (int) (end - data), data);
1593 data += strnlen ((char *) data, end - data) + 1;
1594 break;
1595
1596 case DW_FORM_block:
1597 case DW_FORM_exprloc:
1598 uvalue = read_uleb128 (data, & bytes_read, end);
1599 block_start = data + bytes_read;
1600 if (do_loc)
1601 data = block_start + uvalue;
1602 else
1603 data = display_block (block_start, uvalue, end);
1604 break;
1605
1606 case DW_FORM_block1:
1607 SAFE_BYTE_GET (uvalue, data, 1, end);
1608 block_start = data + 1;
1609 if (do_loc)
1610 data = block_start + uvalue;
1611 else
1612 data = display_block (block_start, uvalue, end);
1613 break;
1614
1615 case DW_FORM_block2:
1616 SAFE_BYTE_GET (uvalue, data, 2, end);
1617 block_start = data + 2;
1618 if (do_loc)
1619 data = block_start + uvalue;
1620 else
1621 data = display_block (block_start, uvalue, end);
1622 break;
1623
1624 case DW_FORM_block4:
1625 SAFE_BYTE_GET (uvalue, data, 4, end);
1626 block_start = data + 4;
1627 if (do_loc)
1628 data = block_start + uvalue;
1629 else
1630 data = display_block (block_start, uvalue, end);
1631 break;
1632
1633 case DW_FORM_strp:
1634 if (!do_loc)
1635 printf (_(" (indirect string, offset: 0x%s): %s"),
1636 dwarf_vmatoa ("x", uvalue),
1637 fetch_indirect_string (uvalue));
1638 break;
1639
1640 case DW_FORM_GNU_str_index:
1641 if (!do_loc)
1642 {
1643 const char *suffix = strrchr (section->name, '.');
1644 int dwo = (suffix && strcmp (suffix, ".dwo") == 0) ? 1 : 0;
1645
1646 printf (_(" (indexed string: 0x%s): %s"),
1647 dwarf_vmatoa ("x", uvalue),
1648 fetch_indexed_string (uvalue, this_set, offset_size, dwo));
1649 }
1650 break;
1651
1652 case DW_FORM_GNU_strp_alt:
1653 if (!do_loc)
1654 printf (_(" (alt indirect string, offset: 0x%s)"),
1655 dwarf_vmatoa ("x", uvalue));
1656 break;
1657
1658 case DW_FORM_indirect:
1659 /* Handled above. */
1660 break;
1661
1662 case DW_FORM_ref_sig8:
1663 if (!do_loc)
1664 {
1665 dwarf_vma high_bits;
1666 char buf[64];
1667
1668 SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1669 printf (" signature: 0x%s",
1670 dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf)));
1671 }
1672 data += 8;
1673 break;
1674
1675 case DW_FORM_GNU_addr_index:
1676 if (!do_loc)
1677 printf (_(" (addr_index: 0x%s): %s"),
1678 dwarf_vmatoa ("x", uvalue),
1679 fetch_indexed_value (uvalue * pointer_size, pointer_size));
1680 break;
1681
1682 default:
1683 warn (_("Unrecognized form: %lu\n"), form);
1684 break;
1685 }
1686
1687 if ((do_loc || do_debug_loc || do_debug_ranges)
1688 && num_debug_info_entries == 0
1689 && debug_info_p != NULL)
1690 {
1691 switch (attribute)
1692 {
1693 case DW_AT_frame_base:
1694 have_frame_base = 1;
1695 case DW_AT_location:
1696 case DW_AT_string_length:
1697 case DW_AT_return_addr:
1698 case DW_AT_data_member_location:
1699 case DW_AT_vtable_elem_location:
1700 case DW_AT_segment:
1701 case DW_AT_static_link:
1702 case DW_AT_use_location:
1703 case DW_AT_GNU_call_site_value:
1704 case DW_AT_GNU_call_site_data_value:
1705 case DW_AT_GNU_call_site_target:
1706 case DW_AT_GNU_call_site_target_clobbered:
1707 if ((dwarf_version < 4
1708 && (form == DW_FORM_data4 || form == DW_FORM_data8))
1709 || form == DW_FORM_sec_offset)
1710 {
1711 /* Process location list. */
1712 unsigned int lmax = debug_info_p->max_loc_offsets;
1713 unsigned int num = debug_info_p->num_loc_offsets;
1714
1715 if (lmax == 0 || num >= lmax)
1716 {
1717 lmax += 1024;
1718 debug_info_p->loc_offsets = (dwarf_vma *)
1719 xcrealloc (debug_info_p->loc_offsets,
1720 lmax, sizeof (*debug_info_p->loc_offsets));
1721 debug_info_p->have_frame_base = (int *)
1722 xcrealloc (debug_info_p->have_frame_base,
1723 lmax, sizeof (*debug_info_p->have_frame_base));
1724 debug_info_p->max_loc_offsets = lmax;
1725 }
1726 if (this_set != NULL)
1727 uvalue += this_set->section_offsets [DW_SECT_LOC];
1728 debug_info_p->loc_offsets [num] = uvalue;
1729 debug_info_p->have_frame_base [num] = have_frame_base;
1730 debug_info_p->num_loc_offsets++;
1731 }
1732 break;
1733
1734 case DW_AT_low_pc:
1735 if (need_base_address)
1736 debug_info_p->base_address = uvalue;
1737 break;
1738
1739 case DW_AT_GNU_addr_base:
1740 debug_info_p->addr_base = uvalue;
1741 break;
1742
1743 case DW_AT_GNU_ranges_base:
1744 debug_info_p->ranges_base = uvalue;
1745 break;
1746
1747 case DW_AT_ranges:
1748 if ((dwarf_version < 4
1749 && (form == DW_FORM_data4 || form == DW_FORM_data8))
1750 || form == DW_FORM_sec_offset)
1751 {
1752 /* Process range list. */
1753 unsigned int lmax = debug_info_p->max_range_lists;
1754 unsigned int num = debug_info_p->num_range_lists;
1755
1756 if (lmax == 0 || num >= lmax)
1757 {
1758 lmax += 1024;
1759 debug_info_p->range_lists = (dwarf_vma *)
1760 xcrealloc (debug_info_p->range_lists,
1761 lmax, sizeof (*debug_info_p->range_lists));
1762 debug_info_p->max_range_lists = lmax;
1763 }
1764 debug_info_p->range_lists [num] = uvalue;
1765 debug_info_p->num_range_lists++;
1766 }
1767 break;
1768
1769 default:
1770 break;
1771 }
1772 }
1773
1774 if (do_loc || attribute == 0)
1775 return data;
1776
1777 /* For some attributes we can display further information. */
1778 printf ("\t");
1779
1780 switch (attribute)
1781 {
1782 case DW_AT_inline:
1783 switch (uvalue)
1784 {
1785 case DW_INL_not_inlined:
1786 printf (_("(not inlined)"));
1787 break;
1788 case DW_INL_inlined:
1789 printf (_("(inlined)"));
1790 break;
1791 case DW_INL_declared_not_inlined:
1792 printf (_("(declared as inline but ignored)"));
1793 break;
1794 case DW_INL_declared_inlined:
1795 printf (_("(declared as inline and inlined)"));
1796 break;
1797 default:
1798 printf (_(" (Unknown inline attribute value: %s)"),
1799 dwarf_vmatoa ("x", uvalue));
1800 break;
1801 }
1802 break;
1803
1804 case DW_AT_language:
1805 switch (uvalue)
1806 {
1807 /* Ordered by the numeric value of these constants. */
1808 case DW_LANG_C89: printf ("(ANSI C)"); break;
1809 case DW_LANG_C: printf ("(non-ANSI C)"); break;
1810 case DW_LANG_Ada83: printf ("(Ada)"); break;
1811 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
1812 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
1813 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
1814 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
1815 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
1816 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
1817 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
1818 /* DWARF 2.1 values. */
1819 case DW_LANG_Java: printf ("(Java)"); break;
1820 case DW_LANG_C99: printf ("(ANSI C99)"); break;
1821 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
1822 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
1823 /* DWARF 3 values. */
1824 case DW_LANG_PLI: printf ("(PLI)"); break;
1825 case DW_LANG_ObjC: printf ("(Objective C)"); break;
1826 case DW_LANG_ObjC_plus_plus: printf ("(Objective C++)"); break;
1827 case DW_LANG_UPC: printf ("(Unified Parallel C)"); break;
1828 case DW_LANG_D: printf ("(D)"); break;
1829 /* DWARF 4 values. */
1830 case DW_LANG_Python: printf ("(Python)"); break;
1831 /* DWARF 5 values. */
1832 case DW_LANG_Go: printf ("(Go)"); break;
1833 /* MIPS extension. */
1834 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
1835 /* UPC extension. */
1836 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
1837 default:
1838 if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
1839 printf (_("(implementation defined: %s)"),
1840 dwarf_vmatoa ("x", uvalue));
1841 else
1842 printf (_("(Unknown: %s)"), dwarf_vmatoa ("x", uvalue));
1843 break;
1844 }
1845 break;
1846
1847 case DW_AT_encoding:
1848 switch (uvalue)
1849 {
1850 case DW_ATE_void: printf ("(void)"); break;
1851 case DW_ATE_address: printf ("(machine address)"); break;
1852 case DW_ATE_boolean: printf ("(boolean)"); break;
1853 case DW_ATE_complex_float: printf ("(complex float)"); break;
1854 case DW_ATE_float: printf ("(float)"); break;
1855 case DW_ATE_signed: printf ("(signed)"); break;
1856 case DW_ATE_signed_char: printf ("(signed char)"); break;
1857 case DW_ATE_unsigned: printf ("(unsigned)"); break;
1858 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
1859 /* DWARF 2.1 values: */
1860 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
1861 case DW_ATE_decimal_float: printf ("(decimal float)"); break;
1862 /* DWARF 3 values: */
1863 case DW_ATE_packed_decimal: printf ("(packed_decimal)"); break;
1864 case DW_ATE_numeric_string: printf ("(numeric_string)"); break;
1865 case DW_ATE_edited: printf ("(edited)"); break;
1866 case DW_ATE_signed_fixed: printf ("(signed_fixed)"); break;
1867 case DW_ATE_unsigned_fixed: printf ("(unsigned_fixed)"); break;
1868 /* HP extensions: */
1869 case DW_ATE_HP_float80: printf ("(HP_float80)"); break;
1870 case DW_ATE_HP_complex_float80: printf ("(HP_complex_float80)"); break;
1871 case DW_ATE_HP_float128: printf ("(HP_float128)"); break;
1872 case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
1873 case DW_ATE_HP_floathpintel: printf ("(HP_floathpintel)"); break;
1874 case DW_ATE_HP_imaginary_float80: printf ("(HP_imaginary_float80)"); break;
1875 case DW_ATE_HP_imaginary_float128: printf ("(HP_imaginary_float128)"); break;
1876
1877 default:
1878 if (uvalue >= DW_ATE_lo_user
1879 && uvalue <= DW_ATE_hi_user)
1880 printf (_("(user defined type)"));
1881 else
1882 printf (_("(unknown type)"));
1883 break;
1884 }
1885 break;
1886
1887 case DW_AT_accessibility:
1888 switch (uvalue)
1889 {
1890 case DW_ACCESS_public: printf ("(public)"); break;
1891 case DW_ACCESS_protected: printf ("(protected)"); break;
1892 case DW_ACCESS_private: printf ("(private)"); break;
1893 default:
1894 printf (_("(unknown accessibility)"));
1895 break;
1896 }
1897 break;
1898
1899 case DW_AT_visibility:
1900 switch (uvalue)
1901 {
1902 case DW_VIS_local: printf ("(local)"); break;
1903 case DW_VIS_exported: printf ("(exported)"); break;
1904 case DW_VIS_qualified: printf ("(qualified)"); break;
1905 default: printf (_("(unknown visibility)")); break;
1906 }
1907 break;
1908
1909 case DW_AT_virtuality:
1910 switch (uvalue)
1911 {
1912 case DW_VIRTUALITY_none: printf ("(none)"); break;
1913 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
1914 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
1915 default: printf (_("(unknown virtuality)")); break;
1916 }
1917 break;
1918
1919 case DW_AT_identifier_case:
1920 switch (uvalue)
1921 {
1922 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
1923 case DW_ID_up_case: printf ("(up_case)"); break;
1924 case DW_ID_down_case: printf ("(down_case)"); break;
1925 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
1926 default: printf (_("(unknown case)")); break;
1927 }
1928 break;
1929
1930 case DW_AT_calling_convention:
1931 switch (uvalue)
1932 {
1933 case DW_CC_normal: printf ("(normal)"); break;
1934 case DW_CC_program: printf ("(program)"); break;
1935 case DW_CC_nocall: printf ("(nocall)"); break;
1936 default:
1937 if (uvalue >= DW_CC_lo_user
1938 && uvalue <= DW_CC_hi_user)
1939 printf (_("(user defined)"));
1940 else
1941 printf (_("(unknown convention)"));
1942 }
1943 break;
1944
1945 case DW_AT_ordering:
1946 switch (uvalue)
1947 {
1948 case -1: printf (_("(undefined)")); break;
1949 case 0: printf ("(row major)"); break;
1950 case 1: printf ("(column major)"); break;
1951 }
1952 break;
1953
1954 case DW_AT_frame_base:
1955 have_frame_base = 1;
1956 case DW_AT_location:
1957 case DW_AT_string_length:
1958 case DW_AT_return_addr:
1959 case DW_AT_data_member_location:
1960 case DW_AT_vtable_elem_location:
1961 case DW_AT_segment:
1962 case DW_AT_static_link:
1963 case DW_AT_use_location:
1964 case DW_AT_GNU_call_site_value:
1965 case DW_AT_GNU_call_site_data_value:
1966 case DW_AT_GNU_call_site_target:
1967 case DW_AT_GNU_call_site_target_clobbered:
1968 if ((dwarf_version < 4
1969 && (form == DW_FORM_data4 || form == DW_FORM_data8))
1970 || form == DW_FORM_sec_offset)
1971 printf (_("(location list)"));
1972 /* Fall through. */
1973 case DW_AT_allocated:
1974 case DW_AT_associated:
1975 case DW_AT_data_location:
1976 case DW_AT_stride:
1977 case DW_AT_upper_bound:
1978 case DW_AT_lower_bound:
1979 if (block_start)
1980 {
1981 int need_frame_base;
1982
1983 printf ("(");
1984 need_frame_base = decode_location_expression (block_start,
1985 pointer_size,
1986 offset_size,
1987 dwarf_version,
1988 uvalue,
1989 cu_offset, section);
1990 printf (")");
1991 if (need_frame_base && !have_frame_base)
1992 printf (_(" [without DW_AT_frame_base]"));
1993 }
1994 break;
1995
1996 case DW_AT_import:
1997 {
1998 if (form == DW_FORM_ref_sig8
1999 || form == DW_FORM_GNU_ref_alt)
2000 break;
2001
2002 if (form == DW_FORM_ref1
2003 || form == DW_FORM_ref2
2004 || form == DW_FORM_ref4
2005 || form == DW_FORM_ref_udata)
2006 uvalue += cu_offset;
2007
2008 if (uvalue >= section->size)
2009 warn (_("Offset %s used as value for DW_AT_import attribute of DIE at offset %lx is too big.\n"),
2010 dwarf_vmatoa ("x", uvalue),
2011 (unsigned long) (orig_data - section->start));
2012 else
2013 {
2014 unsigned long abbrev_number;
2015 abbrev_entry * entry;
2016
2017 abbrev_number = read_uleb128 (section->start + uvalue, NULL, end);
2018
2019 printf (_("[Abbrev Number: %ld"), abbrev_number);
2020 /* Don't look up abbrev for DW_FORM_ref_addr, as it very often will
2021 use different abbrev table, and we don't track .debug_info chunks
2022 yet. */
2023 if (form != DW_FORM_ref_addr)
2024 {
2025 for (entry = first_abbrev; entry != NULL; entry = entry->next)
2026 if (entry->entry == abbrev_number)
2027 break;
2028 if (entry != NULL)
2029 printf (" (%s)", get_TAG_name (entry->tag));
2030 }
2031 printf ("]");
2032 }
2033 }
2034 break;
2035
2036 default:
2037 break;
2038 }
2039
2040 return data;
2041 }
2042
2043 static const char *
2044 get_AT_name (unsigned long attribute)
2045 {
2046 const char *name;
2047
2048 if (attribute == 0)
2049 return "DW_AT value: 0";
2050
2051 /* One value is shared by the MIPS and HP extensions: */
2052 if (attribute == DW_AT_MIPS_fde)
2053 return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
2054
2055 name = get_DW_AT_name (attribute);
2056
2057 if (name == NULL)
2058 {
2059 static char buffer[100];
2060
2061 snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
2062 attribute);
2063 return buffer;
2064 }
2065
2066 return name;
2067 }
2068
2069 static unsigned char *
2070 read_and_display_attr (unsigned long attribute,
2071 unsigned long form,
2072 unsigned char * data,
2073 unsigned char * end,
2074 dwarf_vma cu_offset,
2075 dwarf_vma pointer_size,
2076 dwarf_vma offset_size,
2077 int dwarf_version,
2078 debug_info * debug_info_p,
2079 int do_loc,
2080 struct dwarf_section * section,
2081 struct cu_tu_set * this_set)
2082 {
2083 if (!do_loc)
2084 printf (" %-18s:", get_AT_name (attribute));
2085 data = read_and_display_attr_value (attribute, form, data, end,
2086 cu_offset, pointer_size, offset_size,
2087 dwarf_version, debug_info_p,
2088 do_loc, section, this_set);
2089 if (!do_loc)
2090 printf ("\n");
2091 return data;
2092 }
2093
2094 /* Process the contents of a .debug_info section. If do_loc is non-zero
2095 then we are scanning for location lists and we do not want to display
2096 anything to the user. If do_types is non-zero, we are processing
2097 a .debug_types section instead of a .debug_info section. */
2098
2099 static int
2100 process_debug_info (struct dwarf_section *section,
2101 void *file,
2102 enum dwarf_section_display_enum abbrev_sec,
2103 int do_loc,
2104 int do_types)
2105 {
2106 unsigned char *start = section->start;
2107 unsigned char *end = start + section->size;
2108 unsigned char *section_begin;
2109 unsigned int unit;
2110 unsigned int num_units = 0;
2111
2112 if ((do_loc || do_debug_loc || do_debug_ranges)
2113 && num_debug_info_entries == 0
2114 && ! do_types)
2115 {
2116 dwarf_vma length;
2117
2118 /* First scan the section to get the number of comp units. */
2119 for (section_begin = start, num_units = 0; section_begin < end;
2120 num_units ++)
2121 {
2122 /* Read the first 4 bytes. For a 32-bit DWARF section, this
2123 will be the length. For a 64-bit DWARF section, it'll be
2124 the escape code 0xffffffff followed by an 8 byte length. */
2125 SAFE_BYTE_GET (length, section_begin, 4, end);
2126
2127 if (length == 0xffffffff)
2128 {
2129 SAFE_BYTE_GET (length, section_begin + 4, 8, end);
2130 section_begin += length + 12;
2131 }
2132 else if (length >= 0xfffffff0 && length < 0xffffffff)
2133 {
2134 warn (_("Reserved length value (0x%s) found in section %s\n"),
2135 dwarf_vmatoa ("x", length), section->name);
2136 return 0;
2137 }
2138 else
2139 section_begin += length + 4;
2140
2141 /* Negative values are illegal, they may even cause infinite
2142 looping. This can happen if we can't accurately apply
2143 relocations to an object file. */
2144 if ((signed long) length <= 0)
2145 {
2146 warn (_("Corrupt unit length (0x%s) found in section %s\n"),
2147 dwarf_vmatoa ("x", length), section->name);
2148 return 0;
2149 }
2150 }
2151
2152 if (num_units == 0)
2153 {
2154 error (_("No comp units in %s section ?"), section->name);
2155 return 0;
2156 }
2157
2158 /* Then allocate an array to hold the information. */
2159 debug_information = (debug_info *) cmalloc (num_units,
2160 sizeof (* debug_information));
2161 if (debug_information == NULL)
2162 {
2163 error (_("Not enough memory for a debug info array of %u entries"),
2164 num_units);
2165 return 0;
2166 }
2167 }
2168
2169 if (!do_loc)
2170 {
2171 if (dwarf_start_die == 0)
2172 printf (_("Contents of the %s section:\n\n"), section->name);
2173
2174 load_debug_section (str, file);
2175 load_debug_section (str_dwo, file);
2176 load_debug_section (str_index, file);
2177 load_debug_section (str_index_dwo, file);
2178 load_debug_section (debug_addr, file);
2179 }
2180
2181 load_debug_section (abbrev_sec, file);
2182 if (debug_displays [abbrev_sec].section.start == NULL)
2183 {
2184 warn (_("Unable to locate %s section!\n"),
2185 debug_displays [abbrev_sec].section.name);
2186 return 0;
2187 }
2188
2189 for (section_begin = start, unit = 0; start < end; unit++)
2190 {
2191 DWARF2_Internal_CompUnit compunit;
2192 unsigned char *hdrptr;
2193 unsigned char *tags;
2194 int level, last_level, saved_level;
2195 dwarf_vma cu_offset;
2196 int offset_size;
2197 int initial_length_size;
2198 dwarf_vma signature_high = 0;
2199 dwarf_vma signature_low = 0;
2200 dwarf_vma type_offset = 0;
2201 struct cu_tu_set *this_set;
2202 dwarf_vma abbrev_base;
2203 size_t abbrev_size;
2204
2205 hdrptr = start;
2206
2207 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 4, end);
2208
2209 if (compunit.cu_length == 0xffffffff)
2210 {
2211 SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 8, end);
2212 offset_size = 8;
2213 initial_length_size = 12;
2214 }
2215 else
2216 {
2217 offset_size = 4;
2218 initial_length_size = 4;
2219 }
2220
2221 SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end);
2222
2223 cu_offset = start - section_begin;
2224
2225 this_set = find_cu_tu_set_v2 (cu_offset, do_types);
2226
2227 SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
2228
2229 if (this_set == NULL)
2230 {
2231 abbrev_base = 0;
2232 abbrev_size = debug_displays [abbrev_sec].section.size;
2233 }
2234 else
2235 {
2236 abbrev_base = this_set->section_offsets [DW_SECT_ABBREV];
2237 abbrev_size = this_set->section_sizes [DW_SECT_ABBREV];
2238 }
2239
2240 SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
2241
2242 if (do_types)
2243 {
2244 SAFE_BYTE_GET64 (hdrptr, &signature_high, &signature_low, end);
2245 hdrptr += 8;
2246 SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end);
2247 }
2248
2249 if ((do_loc || do_debug_loc || do_debug_ranges)
2250 && num_debug_info_entries == 0
2251 && ! do_types)
2252 {
2253 debug_information [unit].cu_offset = cu_offset;
2254 debug_information [unit].pointer_size
2255 = compunit.cu_pointer_size;
2256 debug_information [unit].offset_size = offset_size;
2257 debug_information [unit].dwarf_version = compunit.cu_version;
2258 debug_information [unit].base_address = 0;
2259 debug_information [unit].addr_base = DEBUG_INFO_UNAVAILABLE;
2260 debug_information [unit].ranges_base = DEBUG_INFO_UNAVAILABLE;
2261 debug_information [unit].loc_offsets = NULL;
2262 debug_information [unit].have_frame_base = NULL;
2263 debug_information [unit].max_loc_offsets = 0;
2264 debug_information [unit].num_loc_offsets = 0;
2265 debug_information [unit].range_lists = NULL;
2266 debug_information [unit].max_range_lists= 0;
2267 debug_information [unit].num_range_lists = 0;
2268 }
2269
2270 if (!do_loc && dwarf_start_die == 0)
2271 {
2272 printf (_(" Compilation Unit @ offset 0x%s:\n"),
2273 dwarf_vmatoa ("x", cu_offset));
2274 printf (_(" Length: 0x%s (%s)\n"),
2275 dwarf_vmatoa ("x", compunit.cu_length),
2276 offset_size == 8 ? "64-bit" : "32-bit");
2277 printf (_(" Version: %d\n"), compunit.cu_version);
2278 printf (_(" Abbrev Offset: 0x%s\n"),
2279 dwarf_vmatoa ("x", compunit.cu_abbrev_offset));
2280 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
2281 if (do_types)
2282 {
2283 char buf[64];
2284
2285 printf (_(" Signature: 0x%s\n"),
2286 dwarf_vmatoa64 (signature_high, signature_low,
2287 buf, sizeof (buf)));
2288 printf (_(" Type Offset: 0x%s\n"),
2289 dwarf_vmatoa ("x", type_offset));
2290 }
2291 if (this_set != NULL)
2292 {
2293 dwarf_vma *offsets = this_set->section_offsets;
2294 size_t *sizes = this_set->section_sizes;
2295
2296 printf (_(" Section contributions:\n"));
2297 printf (_(" .debug_abbrev.dwo: 0x%s 0x%s\n"),
2298 dwarf_vmatoa ("x", offsets [DW_SECT_ABBREV]),
2299 dwarf_vmatoa ("x", sizes [DW_SECT_ABBREV]));
2300 printf (_(" .debug_line.dwo: 0x%s 0x%s\n"),
2301 dwarf_vmatoa ("x", offsets [DW_SECT_LINE]),
2302 dwarf_vmatoa ("x", sizes [DW_SECT_LINE]));
2303 printf (_(" .debug_loc.dwo: 0x%s 0x%s\n"),
2304 dwarf_vmatoa ("x", offsets [DW_SECT_LOC]),
2305 dwarf_vmatoa ("x", sizes [DW_SECT_LOC]));
2306 printf (_(" .debug_str_offsets.dwo: 0x%s 0x%s\n"),
2307 dwarf_vmatoa ("x", offsets [DW_SECT_STR_OFFSETS]),
2308 dwarf_vmatoa ("x", sizes [DW_SECT_STR_OFFSETS]));
2309 }
2310 }
2311
2312 if (cu_offset + compunit.cu_length + initial_length_size
2313 > section->size)
2314 {
2315 warn (_("Debug info is corrupted, length of CU at %s"
2316 " extends beyond end of section (length = %s)\n"),
2317 dwarf_vmatoa ("x", cu_offset),
2318 dwarf_vmatoa ("x", compunit.cu_length));
2319 break;
2320 }
2321 tags = hdrptr;
2322 start += compunit.cu_length + initial_length_size;
2323
2324 if (compunit.cu_version != 2
2325 && compunit.cu_version != 3
2326 && compunit.cu_version != 4)
2327 {
2328 warn (_("CU at offset %s contains corrupt or "
2329 "unsupported version number: %d.\n"),
2330 dwarf_vmatoa ("x", cu_offset), compunit.cu_version);
2331 continue;
2332 }
2333
2334 free_abbrevs ();
2335
2336 /* Process the abbrevs used by this compilation unit. DWARF
2337 sections under Mach-O have non-zero addresses. */
2338 if (compunit.cu_abbrev_offset >= abbrev_size)
2339 warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"),
2340 (unsigned long) compunit.cu_abbrev_offset,
2341 (unsigned long) abbrev_size);
2342 else
2343 process_abbrev_section
2344 (((unsigned char *) debug_displays [abbrev_sec].section.start
2345 + abbrev_base + compunit.cu_abbrev_offset),
2346 ((unsigned char *) debug_displays [abbrev_sec].section.start
2347 + abbrev_base + abbrev_size));
2348
2349 level = 0;
2350 last_level = level;
2351 saved_level = -1;
2352 while (tags < start)
2353 {
2354 unsigned int bytes_read;
2355 unsigned long abbrev_number;
2356 unsigned long die_offset;
2357 abbrev_entry *entry;
2358 abbrev_attr *attr;
2359 int do_printing = 1;
2360
2361 die_offset = tags - section_begin;
2362
2363 abbrev_number = read_uleb128 (tags, & bytes_read, start);
2364 tags += bytes_read;
2365
2366 /* A null DIE marks the end of a list of siblings or it may also be
2367 a section padding. */
2368 if (abbrev_number == 0)
2369 {
2370 /* Check if it can be a section padding for the last CU. */
2371 if (level == 0 && start == end)
2372 {
2373 unsigned char *chk;
2374
2375 for (chk = tags; chk < start; chk++)
2376 if (*chk != 0)
2377 break;
2378 if (chk == start)
2379 break;
2380 }
2381
2382 if (!do_loc && die_offset >= dwarf_start_die
2383 && (dwarf_cutoff_level == -1
2384 || level < dwarf_cutoff_level))
2385 printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
2386 level, die_offset);
2387
2388 --level;
2389 if (level < 0)
2390 {
2391 static unsigned num_bogus_warns = 0;
2392
2393 if (num_bogus_warns < 3)
2394 {
2395 warn (_("Bogus end-of-siblings marker detected at offset %lx in %s section\n"),
2396 die_offset, section->name);
2397 num_bogus_warns ++;
2398 if (num_bogus_warns == 3)
2399 warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
2400 }
2401 }
2402 if (dwarf_start_die != 0 && level < saved_level)
2403 return 1;
2404 continue;
2405 }
2406
2407 if (!do_loc)
2408 {
2409 if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
2410 do_printing = 0;
2411 else
2412 {
2413 if (dwarf_start_die != 0 && die_offset == dwarf_start_die)
2414 saved_level = level;
2415 do_printing = (dwarf_cutoff_level == -1
2416 || level < dwarf_cutoff_level);
2417 if (do_printing)
2418 printf (_(" <%d><%lx>: Abbrev Number: %lu"),
2419 level, die_offset, abbrev_number);
2420 else if (dwarf_cutoff_level == -1
2421 || last_level < dwarf_cutoff_level)
2422 printf (_(" <%d><%lx>: ...\n"), level, die_offset);
2423 last_level = level;
2424 }
2425 }
2426
2427 /* Scan through the abbreviation list until we reach the
2428 correct entry. */
2429 for (entry = first_abbrev;
2430 entry && entry->entry != abbrev_number;
2431 entry = entry->next)
2432 continue;
2433
2434 if (entry == NULL)
2435 {
2436 if (!do_loc && do_printing)
2437 {
2438 printf ("\n");
2439 fflush (stdout);
2440 }
2441 warn (_("DIE at offset %lx refers to abbreviation number %lu which does not exist\n"),
2442 die_offset, abbrev_number);
2443 return 0;
2444 }
2445
2446 if (!do_loc && do_printing)
2447 printf (" (%s)\n", get_TAG_name (entry->tag));
2448
2449 switch (entry->tag)
2450 {
2451 default:
2452 need_base_address = 0;
2453 break;
2454 case DW_TAG_compile_unit:
2455 need_base_address = 1;
2456 break;
2457 case DW_TAG_entry_point:
2458 case DW_TAG_subprogram:
2459 need_base_address = 0;
2460 /* Assuming that there is no DW_AT_frame_base. */
2461 have_frame_base = 0;
2462 break;
2463 }
2464
2465 for (attr = entry->first_attr;
2466 attr && attr->attribute;
2467 attr = attr->next)
2468 {
2469 debug_info *arg;
2470
2471 if (! do_loc && do_printing)
2472 /* Show the offset from where the tag was extracted. */
2473 printf (" <%lx>", (unsigned long)(tags - section_begin));
2474
2475 arg = debug_information;
2476 if (debug_information)
2477 arg += unit;
2478
2479 tags = read_and_display_attr (attr->attribute,
2480 attr->form,
2481 tags,
2482 end,
2483 cu_offset,
2484 compunit.cu_pointer_size,
2485 offset_size,
2486 compunit.cu_version,
2487 arg,
2488 do_loc || ! do_printing,
2489 section,
2490 this_set);
2491 }
2492
2493 if (entry->children)
2494 ++level;
2495 }
2496 }
2497
2498 /* Set num_debug_info_entries here so that it can be used to check if
2499 we need to process .debug_loc and .debug_ranges sections. */
2500 if ((do_loc || do_debug_loc || do_debug_ranges)
2501 && num_debug_info_entries == 0
2502 && ! do_types)
2503 num_debug_info_entries = num_units;
2504
2505 if (!do_loc)
2506 printf ("\n");
2507
2508 return 1;
2509 }
2510
2511 /* Locate and scan the .debug_info section in the file and record the pointer
2512 sizes and offsets for the compilation units in it. Usually an executable
2513 will have just one pointer size, but this is not guaranteed, and so we try
2514 not to make any assumptions. Returns zero upon failure, or the number of
2515 compilation units upon success. */
2516
2517 static unsigned int
2518 load_debug_info (void * file)
2519 {
2520 /* Reset the last pointer size so that we can issue correct error
2521 messages if we are displaying the contents of more than one section. */
2522 last_pointer_size = 0;
2523 warned_about_missing_comp_units = FALSE;
2524
2525 /* If we have already tried and failed to load the .debug_info
2526 section then do not bother to repeat the task. */
2527 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
2528 return 0;
2529
2530 /* If we already have the information there is nothing else to do. */
2531 if (num_debug_info_entries > 0)
2532 return num_debug_info_entries;
2533
2534 /* If this is a DWARF package file, load the CU and TU indexes. */
2535 load_cu_tu_indexes (file);
2536
2537 if (load_debug_section (info, file)
2538 && process_debug_info (&debug_displays [info].section, file, abbrev, 1, 0))
2539 return num_debug_info_entries;
2540 else if (load_debug_section (info_dwo, file)
2541 && process_debug_info (&debug_displays [info_dwo].section, file,
2542 abbrev_dwo, 1, 0))
2543 return num_debug_info_entries;
2544
2545 num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
2546 return 0;
2547 }
2548
2549 /* Read a DWARF .debug_line section header starting at DATA.
2550 Upon success returns an updated DATA pointer and the LINFO
2551 structure and the END_OF_SEQUENCE pointer will be filled in.
2552 Otherwise returns NULL. */
2553
2554 static unsigned char *
2555 read_debug_line_header (struct dwarf_section * section,
2556 unsigned char * data,
2557 unsigned char * end,
2558 DWARF2_Internal_LineInfo * linfo,
2559 unsigned char ** end_of_sequence)
2560 {
2561 unsigned char *hdrptr;
2562 unsigned int offset_size;
2563 unsigned int initial_length_size;
2564
2565 /* Extract information from the Line Number Program Header.
2566 (section 6.2.4 in the Dwarf3 doc). */
2567 hdrptr = data;
2568
2569 /* Get and check the length of the block. */
2570 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 4, end);
2571
2572 if (linfo->li_length == 0xffffffff)
2573 {
2574 /* This section is 64-bit DWARF 3. */
2575 SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 8, end);
2576 offset_size = 8;
2577 initial_length_size = 12;
2578 }
2579 else
2580 {
2581 offset_size = 4;
2582 initial_length_size = 4;
2583 }
2584
2585 if (linfo->li_length + initial_length_size > section->size)
2586 {
2587 /* If the length is just a bias against the initial_length_size then
2588 this means that the field has a relocation against it which has not
2589 been applied. (Ie we are dealing with an object file, not a linked
2590 binary). Do not complain but instead assume that the rest of the
2591 section applies to this particular header. */
2592 if (linfo->li_length == - initial_length_size)
2593 {
2594 linfo->li_length = section->size - initial_length_size;
2595 }
2596 else
2597 {
2598 warn (_("The line info appears to be corrupt - "
2599 "the section is too small\n"));
2600 return NULL;
2601 }
2602 }
2603
2604 /* Get and check the version number. */
2605 SAFE_BYTE_GET_AND_INC (linfo->li_version, hdrptr, 2, end);
2606
2607 if (linfo->li_version != 2
2608 && linfo->li_version != 3
2609 && linfo->li_version != 4)
2610 {
2611 warn (_("Only DWARF version 2, 3 and 4 line info is currently supported.\n"));
2612 return NULL;
2613 }
2614
2615 SAFE_BYTE_GET_AND_INC (linfo->li_prologue_length, hdrptr, offset_size, end);
2616 SAFE_BYTE_GET_AND_INC (linfo->li_min_insn_length, hdrptr, 1, end);
2617
2618 if (linfo->li_version >= 4)
2619 {
2620 SAFE_BYTE_GET_AND_INC (linfo->li_max_ops_per_insn, hdrptr, 1, end);
2621
2622 if (linfo->li_max_ops_per_insn == 0)
2623 {
2624 warn (_("Invalid maximum operations per insn.\n"));
2625 return NULL;
2626 }
2627 }
2628 else
2629 linfo->li_max_ops_per_insn = 1;
2630
2631 SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end);
2632 SAFE_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
2633 SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end);
2634 SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end);
2635
2636 /* Sign extend the line base field. */
2637 linfo->li_line_base <<= 24;
2638 linfo->li_line_base >>= 24;
2639
2640 * end_of_sequence = data + linfo->li_length + initial_length_size;
2641 return hdrptr;
2642 }
2643
2644 static int
2645 display_debug_lines_raw (struct dwarf_section *section,
2646 unsigned char *data,
2647 unsigned char *end)
2648 {
2649 unsigned char *start = section->start;
2650
2651 printf (_("Raw dump of debug contents of section %s:\n\n"),
2652 section->name);
2653
2654 while (data < end)
2655 {
2656 static DWARF2_Internal_LineInfo saved_linfo;
2657 DWARF2_Internal_LineInfo linfo;
2658 unsigned char *standard_opcodes;
2659 unsigned char *end_of_sequence;
2660 int i;
2661
2662 if (const_strneq (section->name, ".debug_line.")
2663 /* Note: the following does not apply to .debug_line.dwo sections.
2664 These are full debug_line sections. */
2665 && strcmp (section->name, ".debug_line.dwo") != 0)
2666 {
2667 /* Sections named .debug_line.<foo> are fragments of a .debug_line
2668 section containing just the Line Number Statements. They are
2669 created by the assembler and intended to be used alongside gcc's
2670 -ffunction-sections command line option. When the linker's
2671 garbage collection decides to discard a .text.<foo> section it
2672 can then also discard the line number information in .debug_line.<foo>.
2673
2674 Since the section is a fragment it does not have the details
2675 needed to fill out a LineInfo structure, so instead we use the
2676 details from the last full debug_line section that we processed. */
2677 end_of_sequence = end;
2678 standard_opcodes = NULL;
2679 linfo = saved_linfo;
2680 reset_state_machine (linfo.li_default_is_stmt);
2681 }
2682 else
2683 {
2684 unsigned char * hdrptr;
2685
2686 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
2687 & end_of_sequence)) == NULL)
2688 return 0;
2689
2690 printf (_(" Offset: 0x%lx\n"), (long)(data - start));
2691 printf (_(" Length: %ld\n"), (long) linfo.li_length);
2692 printf (_(" DWARF Version: %d\n"), linfo.li_version);
2693 printf (_(" Prologue Length: %d\n"), linfo.li_prologue_length);
2694 printf (_(" Minimum Instruction Length: %d\n"), linfo.li_min_insn_length);
2695 if (linfo.li_version >= 4)
2696 printf (_(" Maximum Ops per Instruction: %d\n"), linfo.li_max_ops_per_insn);
2697 printf (_(" Initial value of 'is_stmt': %d\n"), linfo.li_default_is_stmt);
2698 printf (_(" Line Base: %d\n"), linfo.li_line_base);
2699 printf (_(" Line Range: %d\n"), linfo.li_line_range);
2700 printf (_(" Opcode Base: %d\n"), linfo.li_opcode_base);
2701
2702 reset_state_machine (linfo.li_default_is_stmt);
2703
2704 /* Display the contents of the Opcodes table. */
2705 standard_opcodes = hdrptr;
2706
2707 printf (_("\n Opcodes:\n"));
2708
2709 for (i = 1; i < linfo.li_opcode_base; i++)
2710 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
2711
2712 /* Display the contents of the Directory table. */
2713 data = standard_opcodes + linfo.li_opcode_base - 1;
2714
2715 if (*data == 0)
2716 printf (_("\n The Directory Table is empty.\n"));
2717 else
2718 {
2719 printf (_("\n The Directory Table:\n"));
2720
2721 while (*data != 0)
2722 {
2723 printf (" %s\n", data);
2724
2725 data += strnlen ((char *) data, end - data) + 1;
2726 }
2727 }
2728
2729 /* Skip the NUL at the end of the table. */
2730 data++;
2731
2732 /* Display the contents of the File Name table. */
2733 if (*data == 0)
2734 printf (_("\n The File Name Table is empty.\n"));
2735 else
2736 {
2737 printf (_("\n The File Name Table:\n"));
2738 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
2739
2740 while (*data != 0)
2741 {
2742 unsigned char *name;
2743 unsigned int bytes_read;
2744
2745 printf (" %d\t", ++state_machine_regs.last_file_entry);
2746 name = data;
2747 data += strnlen ((char *) data, end - data) + 1;
2748
2749 printf ("%s\t",
2750 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2751 data += bytes_read;
2752 printf ("%s\t",
2753 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2754 data += bytes_read;
2755 printf ("%s\t",
2756 dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2757 data += bytes_read;
2758 printf ("%s\n", name);
2759
2760 if (data == end)
2761 {
2762 warn (_("Corrupt file name table entry\n"));
2763 break;
2764 }
2765 }
2766 }
2767
2768 /* Skip the NUL at the end of the table. */
2769 data++;
2770 putchar ('\n');
2771 saved_linfo = linfo;
2772 }
2773
2774 /* Now display the statements. */
2775 if (data >= end_of_sequence)
2776 printf (_(" No Line Number Statements.\n"));
2777 else
2778 {
2779 printf (_(" Line Number Statements:\n"));
2780
2781 while (data < end_of_sequence)
2782 {
2783 unsigned char op_code;
2784 dwarf_signed_vma adv;
2785 dwarf_vma uladv;
2786 unsigned int bytes_read;
2787
2788 op_code = *data++;
2789
2790 if (op_code >= linfo.li_opcode_base)
2791 {
2792 op_code -= linfo.li_opcode_base;
2793 uladv = (op_code / linfo.li_line_range);
2794 if (linfo.li_max_ops_per_insn == 1)
2795 {
2796 uladv *= linfo.li_min_insn_length;
2797 state_machine_regs.address += uladv;
2798 printf (_(" Special opcode %d: "
2799 "advance Address by %s to 0x%s"),
2800 op_code, dwarf_vmatoa ("u", uladv),
2801 dwarf_vmatoa ("x", state_machine_regs.address));
2802 }
2803 else
2804 {
2805 state_machine_regs.address
2806 += ((state_machine_regs.op_index + uladv)
2807 / linfo.li_max_ops_per_insn)
2808 * linfo.li_min_insn_length;
2809 state_machine_regs.op_index
2810 = (state_machine_regs.op_index + uladv)
2811 % linfo.li_max_ops_per_insn;
2812 printf (_(" Special opcode %d: "
2813 "advance Address by %s to 0x%s[%d]"),
2814 op_code, dwarf_vmatoa ("u", uladv),
2815 dwarf_vmatoa ("x", state_machine_regs.address),
2816 state_machine_regs.op_index);
2817 }
2818 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
2819 state_machine_regs.line += adv;
2820 printf (_(" and Line by %s to %d\n"),
2821 dwarf_vmatoa ("d", adv), state_machine_regs.line);
2822 }
2823 else switch (op_code)
2824 {
2825 case DW_LNS_extended_op:
2826 data += process_extended_line_op (data, linfo.li_default_is_stmt, end);
2827 break;
2828
2829 case DW_LNS_copy:
2830 printf (_(" Copy\n"));
2831 break;
2832
2833 case DW_LNS_advance_pc:
2834 uladv = read_uleb128 (data, & bytes_read, end);
2835 data += bytes_read;
2836 if (linfo.li_max_ops_per_insn == 1)
2837 {
2838 uladv *= linfo.li_min_insn_length;
2839 state_machine_regs.address += uladv;
2840 printf (_(" Advance PC by %s to 0x%s\n"),
2841 dwarf_vmatoa ("u", uladv),
2842 dwarf_vmatoa ("x", state_machine_regs.address));
2843 }
2844 else
2845 {
2846 state_machine_regs.address
2847 += ((state_machine_regs.op_index + uladv)
2848 / linfo.li_max_ops_per_insn)
2849 * linfo.li_min_insn_length;
2850 state_machine_regs.op_index
2851 = (state_machine_regs.op_index + uladv)
2852 % linfo.li_max_ops_per_insn;
2853 printf (_(" Advance PC by %s to 0x%s[%d]\n"),
2854 dwarf_vmatoa ("u", uladv),
2855 dwarf_vmatoa ("x", state_machine_regs.address),
2856 state_machine_regs.op_index);
2857 }
2858 break;
2859
2860 case DW_LNS_advance_line:
2861 adv = read_sleb128 (data, & bytes_read, end);
2862 data += bytes_read;
2863 state_machine_regs.line += adv;
2864 printf (_(" Advance Line by %s to %d\n"),
2865 dwarf_vmatoa ("d", adv),
2866 state_machine_regs.line);
2867 break;
2868
2869 case DW_LNS_set_file:
2870 adv = read_uleb128 (data, & bytes_read, end);
2871 data += bytes_read;
2872 printf (_(" Set File Name to entry %s in the File Name Table\n"),
2873 dwarf_vmatoa ("d", adv));
2874 state_machine_regs.file = adv;
2875 break;
2876
2877 case DW_LNS_set_column:
2878 uladv = read_uleb128 (data, & bytes_read, end);
2879 data += bytes_read;
2880 printf (_(" Set column to %s\n"),
2881 dwarf_vmatoa ("u", uladv));
2882 state_machine_regs.column = uladv;
2883 break;
2884
2885 case DW_LNS_negate_stmt:
2886 adv = state_machine_regs.is_stmt;
2887 adv = ! adv;
2888 printf (_(" Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv));
2889 state_machine_regs.is_stmt = adv;
2890 break;
2891
2892 case DW_LNS_set_basic_block:
2893 printf (_(" Set basic block\n"));
2894 state_machine_regs.basic_block = 1;
2895 break;
2896
2897 case DW_LNS_const_add_pc:
2898 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
2899 if (linfo.li_max_ops_per_insn)
2900 {
2901 uladv *= linfo.li_min_insn_length;
2902 state_machine_regs.address += uladv;
2903 printf (_(" Advance PC by constant %s to 0x%s\n"),
2904 dwarf_vmatoa ("u", uladv),
2905 dwarf_vmatoa ("x", state_machine_regs.address));
2906 }
2907 else
2908 {
2909 state_machine_regs.address
2910 += ((state_machine_regs.op_index + uladv)
2911 / linfo.li_max_ops_per_insn)
2912 * linfo.li_min_insn_length;
2913 state_machine_regs.op_index
2914 = (state_machine_regs.op_index + uladv)
2915 % linfo.li_max_ops_per_insn;
2916 printf (_(" Advance PC by constant %s to 0x%s[%d]\n"),
2917 dwarf_vmatoa ("u", uladv),
2918 dwarf_vmatoa ("x", state_machine_regs.address),
2919 state_machine_regs.op_index);
2920 }
2921 break;
2922
2923 case DW_LNS_fixed_advance_pc:
2924 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
2925 state_machine_regs.address += uladv;
2926 state_machine_regs.op_index = 0;
2927 printf (_(" Advance PC by fixed size amount %s to 0x%s\n"),
2928 dwarf_vmatoa ("u", uladv),
2929 dwarf_vmatoa ("x", state_machine_regs.address));
2930 break;
2931
2932 case DW_LNS_set_prologue_end:
2933 printf (_(" Set prologue_end to true\n"));
2934 break;
2935
2936 case DW_LNS_set_epilogue_begin:
2937 printf (_(" Set epilogue_begin to true\n"));
2938 break;
2939
2940 case DW_LNS_set_isa:
2941 uladv = read_uleb128 (data, & bytes_read, end);
2942 data += bytes_read;
2943 printf (_(" Set ISA to %s\n"), dwarf_vmatoa ("u", uladv));
2944 break;
2945
2946 default:
2947 printf (_(" Unknown opcode %d with operands: "), op_code);
2948
2949 if (standard_opcodes != NULL)
2950 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
2951 {
2952 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
2953 &bytes_read, end)),
2954 i == 1 ? "" : ", ");
2955 data += bytes_read;
2956 }
2957 putchar ('\n');
2958 break;
2959 }
2960 }
2961 putchar ('\n');
2962 }
2963 }
2964
2965 return 1;
2966 }
2967
2968 typedef struct
2969 {
2970 unsigned char *name;
2971 unsigned int directory_index;
2972 unsigned int modification_date;
2973 unsigned int length;
2974 } File_Entry;
2975
2976 /* Output a decoded representation of the .debug_line section. */
2977
2978 static int
2979 display_debug_lines_decoded (struct dwarf_section *section,
2980 unsigned char *data,
2981 unsigned char *end)
2982 {
2983 static DWARF2_Internal_LineInfo saved_linfo;
2984
2985 printf (_("Decoded dump of debug contents of section %s:\n\n"),
2986 section->name);
2987
2988 while (data < end)
2989 {
2990 /* This loop amounts to one iteration per compilation unit. */
2991 DWARF2_Internal_LineInfo linfo;
2992 unsigned char *standard_opcodes;
2993 unsigned char *end_of_sequence;
2994 int i;
2995 File_Entry *file_table = NULL;
2996 unsigned int n_files = 0;
2997 unsigned char **directory_table = NULL;
2998 unsigned int n_directories = 0;
2999
3000 if (const_strneq (section->name, ".debug_line.")
3001 /* Note: the following does not apply to .debug_line.dwo sections.
3002 These are full debug_line sections. */
3003 && strcmp (section->name, ".debug_line.dwo") != 0)
3004 {
3005 /* See comment in display_debug_lines_raw(). */
3006 end_of_sequence = end;
3007 standard_opcodes = NULL;
3008 linfo = saved_linfo;
3009 reset_state_machine (linfo.li_default_is_stmt);
3010 }
3011 else
3012 {
3013 unsigned char *hdrptr;
3014
3015 if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
3016 & end_of_sequence)) == NULL)
3017 return 0;
3018
3019 reset_state_machine (linfo.li_default_is_stmt);
3020
3021 /* Save a pointer to the contents of the Opcodes table. */
3022 standard_opcodes = hdrptr;
3023
3024 /* Traverse the Directory table just to count entries. */
3025 data = standard_opcodes + linfo.li_opcode_base - 1;
3026 if (*data != 0)
3027 {
3028 unsigned char *ptr_directory_table = data;
3029
3030 while (*data != 0)
3031 {
3032 data += strnlen ((char *) data, end - data) + 1;
3033 n_directories++;
3034 }
3035
3036 /* Go through the directory table again to save the directories. */
3037 directory_table = (unsigned char **)
3038 xmalloc (n_directories * sizeof (unsigned char *));
3039
3040 i = 0;
3041 while (*ptr_directory_table != 0)
3042 {
3043 directory_table[i] = ptr_directory_table;
3044 ptr_directory_table += strnlen ((char *) ptr_directory_table,
3045 ptr_directory_table - end) + 1;
3046 i++;
3047 }
3048 }
3049 /* Skip the NUL at the end of the table. */
3050 data++;
3051
3052 /* Traverse the File Name table just to count the entries. */
3053 if (*data != 0)
3054 {
3055 unsigned char *ptr_file_name_table = data;
3056
3057 while (*data != 0)
3058 {
3059 unsigned int bytes_read;
3060
3061 /* Skip Name, directory index, last modification time and length
3062 of file. */
3063 data += strnlen ((char *) data, end - data) + 1;
3064 read_uleb128 (data, & bytes_read, end);
3065 data += bytes_read;
3066 read_uleb128 (data, & bytes_read, end);
3067 data += bytes_read;
3068 read_uleb128 (data, & bytes_read, end);
3069 data += bytes_read;
3070
3071 n_files++;
3072 }
3073
3074 /* Go through the file table again to save the strings. */
3075 file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
3076
3077 i = 0;
3078 while (*ptr_file_name_table != 0)
3079 {
3080 unsigned int bytes_read;
3081
3082 file_table[i].name = ptr_file_name_table;
3083 ptr_file_name_table += strnlen ((char *) ptr_file_name_table,
3084 end - ptr_file_name_table) + 1;
3085
3086 /* We are not interested in directory, time or size. */
3087 file_table[i].directory_index = read_uleb128 (ptr_file_name_table,
3088 & bytes_read, end);
3089 ptr_file_name_table += bytes_read;
3090 file_table[i].modification_date = read_uleb128 (ptr_file_name_table,
3091 & bytes_read, end);
3092 ptr_file_name_table += bytes_read;
3093 file_table[i].length = read_uleb128 (ptr_file_name_table, & bytes_read, end);
3094 ptr_file_name_table += bytes_read;
3095 i++;
3096 }
3097 i = 0;
3098
3099 /* Print the Compilation Unit's name and a header. */
3100 if (directory_table == NULL)
3101 {
3102 printf (_("CU: %s:\n"), file_table[0].name);
3103 printf (_("File name Line number Starting address\n"));
3104 }
3105 else
3106 {
3107 unsigned int ix = file_table[0].directory_index;
3108 const char *directory = ix ? (char *)directory_table[ix - 1] : ".";
3109
3110 if (do_wide || strlen (directory) < 76)
3111 printf (_("CU: %s/%s:\n"), directory, file_table[0].name);
3112 else
3113 printf ("%s:\n", file_table[0].name);
3114
3115 printf (_("File name Line number Starting address\n"));
3116 }
3117 }
3118
3119 /* Skip the NUL at the end of the table. */
3120 data++;
3121
3122 saved_linfo = linfo;
3123 }
3124
3125 /* This loop iterates through the Dwarf Line Number Program. */
3126 while (data < end_of_sequence)
3127 {
3128 unsigned char op_code;
3129 int adv;
3130 unsigned long int uladv;
3131 unsigned int bytes_read;
3132 int is_special_opcode = 0;
3133
3134 op_code = *data++;
3135
3136 if (op_code >= linfo.li_opcode_base)
3137 {
3138 op_code -= linfo.li_opcode_base;
3139 uladv = (op_code / linfo.li_line_range);
3140 if (linfo.li_max_ops_per_insn == 1)
3141 {
3142 uladv *= linfo.li_min_insn_length;
3143 state_machine_regs.address += uladv;
3144 }
3145 else
3146 {
3147 state_machine_regs.address
3148 += ((state_machine_regs.op_index + uladv)
3149 / linfo.li_max_ops_per_insn)
3150 * linfo.li_min_insn_length;
3151 state_machine_regs.op_index
3152 = (state_machine_regs.op_index + uladv)
3153 % linfo.li_max_ops_per_insn;
3154 }
3155
3156 adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
3157 state_machine_regs.line += adv;
3158 is_special_opcode = 1;
3159 }
3160 else switch (op_code)
3161 {
3162 case DW_LNS_extended_op:
3163 {
3164 unsigned int ext_op_code_len;
3165 unsigned char ext_op_code;
3166 unsigned char *op_code_data = data;
3167
3168 ext_op_code_len = read_uleb128 (op_code_data, &bytes_read,
3169 end_of_sequence);
3170 op_code_data += bytes_read;
3171
3172 if (ext_op_code_len == 0)
3173 {
3174 warn (_("badly formed extended line op encountered!\n"));
3175 break;
3176 }
3177 ext_op_code_len += bytes_read;
3178 ext_op_code = *op_code_data++;
3179
3180 switch (ext_op_code)
3181 {
3182 case DW_LNE_end_sequence:
3183 reset_state_machine (linfo.li_default_is_stmt);
3184 break;
3185 case DW_LNE_set_address:
3186 SAFE_BYTE_GET_AND_INC (state_machine_regs.address,
3187 op_code_data, ext_op_code_len - bytes_read - 1,
3188 end);
3189 state_machine_regs.op_index = 0;
3190 break;
3191 case DW_LNE_define_file:
3192 {
3193 file_table = (File_Entry *) xrealloc
3194 (file_table, (n_files + 1) * sizeof (File_Entry));
3195
3196 ++state_machine_regs.last_file_entry;
3197 /* Source file name. */
3198 file_table[n_files].name = op_code_data;
3199 op_code_data += strlen ((char *) op_code_data) + 1;
3200 /* Directory index. */
3201 file_table[n_files].directory_index =
3202 read_uleb128 (op_code_data, & bytes_read,
3203 end_of_sequence);
3204 op_code_data += bytes_read;
3205 /* Last modification time. */
3206 file_table[n_files].modification_date =
3207 read_uleb128 (op_code_data, & bytes_read,
3208 end_of_sequence);
3209 op_code_data += bytes_read;
3210 /* File length. */
3211 file_table[n_files].length =
3212 read_uleb128 (op_code_data, & bytes_read,
3213 end_of_sequence);
3214
3215 n_files++;
3216 break;
3217 }
3218 case DW_LNE_set_discriminator:
3219 case DW_LNE_HP_set_sequence:
3220 /* Simply ignored. */
3221 break;
3222
3223 default:
3224 printf (_("UNKNOWN (%u): length %d\n"),
3225 ext_op_code, ext_op_code_len - bytes_read);
3226 break;
3227 }
3228 data += ext_op_code_len;
3229 break;
3230 }
3231 case DW_LNS_copy:
3232 break;
3233
3234 case DW_LNS_advance_pc:
3235 uladv = read_uleb128 (data, & bytes_read, end);
3236 data += bytes_read;
3237 if (linfo.li_max_ops_per_insn == 1)
3238 {
3239 uladv *= linfo.li_min_insn_length;
3240 state_machine_regs.address += uladv;
3241 }
3242 else
3243 {
3244 state_machine_regs.address
3245 += ((state_machine_regs.op_index + uladv)
3246 / linfo.li_max_ops_per_insn)
3247 * linfo.li_min_insn_length;
3248 state_machine_regs.op_index
3249 = (state_machine_regs.op_index + uladv)
3250 % linfo.li_max_ops_per_insn;
3251 }
3252 break;
3253
3254 case DW_LNS_advance_line:
3255 adv = read_sleb128 (data, & bytes_read, end);
3256 data += bytes_read;
3257 state_machine_regs.line += adv;
3258 break;
3259
3260 case DW_LNS_set_file:
3261 adv = read_uleb128 (data, & bytes_read, end);
3262 data += bytes_read;
3263 state_machine_regs.file = adv;
3264
3265 if (file_table == NULL)
3266 printf (_("\n [Use file table entry %d]\n"), state_machine_regs.file - 1);
3267 else if (file_table[state_machine_regs.file - 1].directory_index == 0)
3268 /* If directory index is 0, that means current directory. */
3269 printf ("\n./%s:[++]\n",
3270 file_table[state_machine_regs.file - 1].name);
3271 else if (directory_table == NULL)
3272 printf (_("\n [Use directory table entry %d]\n"),
3273 file_table[state_machine_regs.file - 1].directory_index - 1);
3274 else
3275 /* The directory index starts counting at 1. */
3276 printf ("\n%s/%s:\n",
3277 directory_table[file_table[state_machine_regs.file - 1].directory_index - 1],
3278 file_table[state_machine_regs.file - 1].name);
3279 break;
3280
3281 case DW_LNS_set_column:
3282 uladv = read_uleb128 (data, & bytes_read, end);
3283 data += bytes_read;
3284 state_machine_regs.column = uladv;
3285 break;
3286
3287 case DW_LNS_negate_stmt:
3288 adv = state_machine_regs.is_stmt;
3289 adv = ! adv;
3290 state_machine_regs.is_stmt = adv;
3291 break;
3292
3293 case DW_LNS_set_basic_block:
3294 state_machine_regs.basic_block = 1;
3295 break;
3296
3297 case DW_LNS_const_add_pc:
3298 uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
3299 if (linfo.li_max_ops_per_insn == 1)
3300 {
3301 uladv *= linfo.li_min_insn_length;
3302 state_machine_regs.address += uladv;
3303 }
3304 else
3305 {
3306 state_machine_regs.address
3307 += ((state_machine_regs.op_index + uladv)
3308 / linfo.li_max_ops_per_insn)
3309 * linfo.li_min_insn_length;
3310 state_machine_regs.op_index
3311 = (state_machine_regs.op_index + uladv)
3312 % linfo.li_max_ops_per_insn;
3313 }
3314 break;
3315
3316 case DW_LNS_fixed_advance_pc:
3317 SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
3318 state_machine_regs.address += uladv;
3319 state_machine_regs.op_index = 0;
3320 break;
3321
3322 case DW_LNS_set_prologue_end:
3323 break;
3324
3325 case DW_LNS_set_epilogue_begin:
3326 break;
3327
3328 case DW_LNS_set_isa:
3329 uladv = read_uleb128 (data, & bytes_read, end);
3330 data += bytes_read;
3331 printf (_(" Set ISA to %lu\n"), uladv);
3332 break;
3333
3334 default:
3335 printf (_(" Unknown opcode %d with operands: "), op_code);
3336
3337 if (standard_opcodes != NULL)
3338 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
3339 {
3340 printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
3341 &bytes_read, end)),
3342 i == 1 ? "" : ", ");
3343 data += bytes_read;
3344 }
3345 putchar ('\n');
3346 break;
3347 }
3348
3349 /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
3350 to the DWARF address/line matrix. */
3351 if ((is_special_opcode) || (op_code == DW_LNE_end_sequence)
3352 || (op_code == DW_LNS_copy))
3353 {
3354 const unsigned int MAX_FILENAME_LENGTH = 35;
3355 char *fileName;
3356 char *newFileName = NULL;
3357 size_t fileNameLength;
3358
3359 if (file_table)
3360 fileName = (char *) file_table[state_machine_regs.file - 1].name;
3361 else
3362 fileName = "<unknown>";
3363
3364 fileNameLength = strlen (fileName);
3365
3366 if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
3367 {
3368 newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
3369 /* Truncate file name */
3370 strncpy (newFileName,
3371 fileName + fileNameLength - MAX_FILENAME_LENGTH,
3372 MAX_FILENAME_LENGTH + 1);
3373 }
3374 else
3375 {
3376 newFileName = (char *) xmalloc (fileNameLength + 1);
3377 strncpy (newFileName, fileName, fileNameLength + 1);
3378 }
3379
3380 if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
3381 {
3382 if (linfo.li_max_ops_per_insn == 1)
3383 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x\n",
3384 newFileName, state_machine_regs.line,
3385 state_machine_regs.address);
3386 else
3387 printf ("%-35s %11d %#18" DWARF_VMA_FMT "x[%d]\n",
3388 newFileName, state_machine_regs.line,
3389 state_machine_regs.address,
3390 state_machine_regs.op_index);
3391 }
3392 else
3393 {
3394 if (linfo.li_max_ops_per_insn == 1)
3395 printf ("%s %11d %#18" DWARF_VMA_FMT "x\n",
3396 newFileName, state_machine_regs.line,
3397 state_machine_regs.address);
3398 else
3399 printf ("%s %11d %#18" DWARF_VMA_FMT "x[%d]\n",
3400 newFileName, state_machine_regs.line,
3401 state_machine_regs.address,
3402 state_machine_regs.op_index);
3403 }
3404
3405 if (op_code == DW_LNE_end_sequence)
3406 printf ("\n");
3407
3408 free (newFileName);
3409 }
3410 }
3411
3412 if (file_table)
3413 {
3414 free (file_table);
3415 file_table = NULL;
3416 n_files = 0;
3417 }
3418
3419 if (directory_table)
3420 {
3421 free (directory_table);
3422 directory_table = NULL;
3423 n_directories = 0;
3424 }
3425
3426 putchar ('\n');
3427 }
3428
3429 return 1;
3430 }
3431
3432 static int
3433 display_debug_lines (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
3434 {
3435 unsigned char *data = section->start;
3436 unsigned char *end = data + section->size;
3437 int retValRaw = 1;
3438 int retValDecoded = 1;
3439
3440 if (do_debug_lines == 0)
3441 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
3442
3443 if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
3444 retValRaw = display_debug_lines_raw (section, data, end);
3445
3446 if (do_debug_lines & FLAG_DEBUG_LINES_DECODED)
3447 retValDecoded = display_debug_lines_decoded (section, data, end);
3448
3449 if (!retValRaw || !retValDecoded)
3450 return 0;
3451
3452 return 1;
3453 }
3454
3455 static debug_info *
3456 find_debug_info_for_offset (unsigned long offset)
3457 {
3458 unsigned int i;
3459
3460 if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
3461 return NULL;
3462
3463 for (i = 0; i < num_debug_info_entries; i++)
3464 if (debug_information[i].cu_offset == offset)
3465 return debug_information + i;
3466
3467 return NULL;
3468 }
3469
3470 static int
3471 display_debug_pubnames (struct dwarf_section *section,
3472 void *file ATTRIBUTE_UNUSED)
3473 {
3474 DWARF2_Internal_PubNames names;
3475 unsigned char *start = section->start;
3476 unsigned char *end = start + section->size;
3477
3478 /* It does not matter if this load fails,
3479 we test for that later on. */
3480 load_debug_info (file);
3481
3482 printf (_("Contents of the %s section:\n\n"), section->name);
3483
3484 while (start < end)
3485 {
3486 unsigned char *data;
3487 unsigned long offset;
3488 int offset_size, initial_length_size;
3489
3490 data = start;
3491
3492 SAFE_BYTE_GET_AND_INC (names.pn_length, data, 4, end);
3493 if (names.pn_length == 0xffffffff)
3494 {
3495 SAFE_BYTE_GET_AND_INC (names.pn_length, data, 8, end);
3496 offset_size = 8;
3497 initial_length_size = 12;
3498 }
3499 else
3500 {
3501 offset_size = 4;
3502 initial_length_size = 4;
3503 }
3504
3505 SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end);
3506 SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end);
3507
3508 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
3509 && num_debug_info_entries > 0
3510 && find_debug_info_for_offset (names.pn_offset) == NULL)
3511 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
3512 (unsigned long) names.pn_offset, section->name);
3513
3514 SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, end);
3515
3516 start += names.pn_length + initial_length_size;
3517
3518 if (names.pn_version != 2 && names.pn_version != 3)
3519 {
3520 static int warned = 0;
3521
3522 if (! warned)
3523 {
3524 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
3525 warned = 1;
3526 }
3527
3528 continue;
3529 }
3530
3531 printf (_(" Length: %ld\n"),
3532 (long) names.pn_length);
3533 printf (_(" Version: %d\n"),
3534 names.pn_version);
3535 printf (_(" Offset into .debug_info section: 0x%lx\n"),
3536 (unsigned long) names.pn_offset);
3537 printf (_(" Size of area in .debug_info section: %ld\n"),
3538 (long) names.pn_size);
3539
3540 printf (_("\n Offset\tName\n"));
3541
3542 do
3543 {
3544 SAFE_BYTE_GET (offset, data, offset_size, end);
3545
3546 if (offset != 0)
3547 {
3548 data += offset_size;
3549 printf (" %-6lx\t%s\n", offset, data);
3550 data += strnlen ((char *) data, end - data) + 1;
3551 }
3552 }
3553 while (offset != 0);
3554 }
3555
3556 printf ("\n");
3557 return 1;
3558 }
3559
3560 static int
3561 display_debug_macinfo (struct dwarf_section *section,
3562 void *file ATTRIBUTE_UNUSED)
3563 {
3564 unsigned char *start = section->start;
3565 unsigned char *end = start + section->size;
3566 unsigned char *curr = start;
3567 unsigned int bytes_read;
3568 enum dwarf_macinfo_record_type op;
3569
3570 printf (_("Contents of the %s section:\n\n"), section->name);
3571
3572 while (curr < end)
3573 {
3574 unsigned int lineno;
3575 const unsigned char *string;
3576
3577 op = (enum dwarf_macinfo_record_type) *curr;
3578 curr++;
3579
3580 switch (op)
3581 {
3582 case DW_MACINFO_start_file:
3583 {
3584 unsigned int filenum;
3585
3586 lineno = read_uleb128 (curr, & bytes_read, end);
3587 curr += bytes_read;
3588 filenum = read_uleb128 (curr, & bytes_read, end);
3589 curr += bytes_read;
3590
3591 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
3592 lineno, filenum);
3593 }
3594 break;
3595
3596 case DW_MACINFO_end_file:
3597 printf (_(" DW_MACINFO_end_file\n"));
3598 break;
3599
3600 case DW_MACINFO_define:
3601 lineno = read_uleb128 (curr, & bytes_read, end);
3602 curr += bytes_read;
3603 string = curr;
3604 curr += strnlen ((char *) string, end - string) + 1;
3605 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
3606 lineno, string);
3607 break;
3608
3609 case DW_MACINFO_undef:
3610 lineno = read_uleb128 (curr, & bytes_read, end);
3611 curr += bytes_read;
3612 string = curr;
3613 curr += strnlen ((char *) string, end - string) + 1;
3614 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
3615 lineno, string);
3616 break;
3617
3618 case DW_MACINFO_vendor_ext:
3619 {
3620 unsigned int constant;
3621
3622 constant = read_uleb128 (curr, & bytes_read, end);
3623 curr += bytes_read;
3624 string = curr;
3625 curr += strnlen ((char *) string, end - string) + 1;
3626 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
3627 constant, string);
3628 }
3629 break;
3630 }
3631 }
3632
3633 return 1;
3634 }
3635
3636 /* Given LINE_OFFSET into the .debug_line section, attempt to return
3637 filename and dirname corresponding to file name table entry with index
3638 FILEIDX. Return NULL on failure. */
3639
3640 static unsigned char *
3641 get_line_filename_and_dirname (dwarf_vma line_offset,
3642 dwarf_vma fileidx,
3643 unsigned char **dir_name)
3644 {
3645 struct dwarf_section *section = &debug_displays [line].section;
3646 unsigned char *hdrptr, *dirtable, *file_name;
3647 unsigned int offset_size, initial_length_size;
3648 unsigned int version, opcode_base, bytes_read;
3649 dwarf_vma length, diridx;
3650 const unsigned char * end;
3651
3652 *dir_name = NULL;
3653 if (section->start == NULL
3654 || line_offset >= section->size
3655 || fileidx == 0)
3656 return NULL;
3657
3658 hdrptr = section->start + line_offset;
3659 end = section->start + section->size;
3660
3661 SAFE_BYTE_GET_AND_INC (length, hdrptr, 4, end);
3662 if (length == 0xffffffff)
3663 {
3664 /* This section is 64-bit DWARF 3. */
3665 SAFE_BYTE_GET_AND_INC (length, hdrptr, 8, end);
3666 offset_size = 8;
3667 initial_length_size = 12;
3668 }
3669 else
3670 {
3671 offset_size = 4;
3672 initial_length_size = 4;
3673 }
3674 if (length + initial_length_size > section->size)
3675 return NULL;
3676
3677 SAFE_BYTE_GET_AND_INC (version, hdrptr, 2, end);
3678 if (version != 2 && version != 3 && version != 4)
3679 return NULL;
3680 hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length. */
3681 if (version >= 4)
3682 hdrptr++; /* Skip max_ops_per_insn. */
3683 hdrptr += 3; /* Skip default_is_stmt, line_base, line_range. */
3684
3685 SAFE_BYTE_GET_AND_INC (opcode_base, hdrptr, 1, end);
3686 if (opcode_base == 0)
3687 return NULL;
3688
3689 hdrptr += opcode_base - 1;
3690 dirtable = hdrptr;
3691 /* Skip over dirname table. */
3692 while (*hdrptr != '\0')
3693 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
3694 hdrptr++; /* Skip the NUL at the end of the table. */
3695 /* Now skip over preceding filename table entries. */
3696 for (; *hdrptr != '\0' && fileidx > 1; fileidx--)
3697 {
3698 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
3699 read_uleb128 (hdrptr, &bytes_read, end);
3700 hdrptr += bytes_read;
3701 read_uleb128 (hdrptr, &bytes_read, end);
3702 hdrptr += bytes_read;
3703 read_uleb128 (hdrptr, &bytes_read, end);
3704 hdrptr += bytes_read;
3705 }
3706 if (hdrptr == end || *hdrptr == '\0')
3707 return NULL;
3708 file_name = hdrptr;
3709 hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
3710 diridx = read_uleb128 (hdrptr, &bytes_read, end);
3711 if (diridx == 0)
3712 return file_name;
3713 for (; *dirtable != '\0' && diridx > 1; diridx--)
3714 dirtable += strnlen ((char *) dirtable, end - dirtable) + 1;
3715 if (*dirtable == '\0')
3716 return NULL;
3717 *dir_name = dirtable;
3718 return file_name;
3719 }
3720
3721 static int
3722 display_debug_macro (struct dwarf_section *section,
3723 void *file)
3724 {
3725 unsigned char *start = section->start;
3726 unsigned char *end = start + section->size;
3727 unsigned char *curr = start;
3728 unsigned char *extended_op_buf[256];
3729 unsigned int bytes_read;
3730
3731 load_debug_section (str, file);
3732 load_debug_section (line, file);
3733
3734 printf (_("Contents of the %s section:\n\n"), section->name);
3735
3736 while (curr < end)
3737 {
3738 unsigned int lineno, version, flags;
3739 unsigned int offset_size = 4;
3740 const unsigned char *string;
3741 dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
3742 unsigned char **extended_ops = NULL;
3743
3744 SAFE_BYTE_GET_AND_INC (version, curr, 2, end);
3745 if (version != 4)
3746 {
3747 error (_("Only GNU extension to DWARF 4 of %s is currently supported.\n"),
3748 section->name);
3749 return 0;
3750 }
3751
3752 SAFE_BYTE_GET_AND_INC (flags, curr, 1, end);
3753 if (flags & 1)
3754 offset_size = 8;
3755 printf (_(" Offset: 0x%lx\n"),
3756 (unsigned long) sec_offset);
3757 printf (_(" Version: %d\n"), version);
3758 printf (_(" Offset size: %d\n"), offset_size);
3759 if (flags & 2)
3760 {
3761 SAFE_BYTE_GET_AND_INC (line_offset, curr, offset_size, end);
3762 printf (_(" Offset into .debug_line: 0x%lx\n"),
3763 (unsigned long) line_offset);
3764 }
3765 if (flags & 4)
3766 {
3767 unsigned int i, count, op;
3768 dwarf_vma nargs, n;
3769
3770 SAFE_BYTE_GET_AND_INC (count, curr, 1, end);
3771
3772 memset (extended_op_buf, 0, sizeof (extended_op_buf));
3773 extended_ops = extended_op_buf;
3774 if (count)
3775 {
3776 printf (_(" Extension opcode arguments:\n"));
3777 for (i = 0; i < count; i++)
3778 {
3779 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
3780 extended_ops[op] = curr;
3781 nargs = read_uleb128 (curr, &bytes_read, end);
3782 curr += bytes_read;
3783 if (nargs == 0)
3784 printf (_(" DW_MACRO_GNU_%02x has no arguments\n"), op);
3785 else
3786 {
3787 printf (_(" DW_MACRO_GNU_%02x arguments: "), op);
3788 for (n = 0; n < nargs; n++)
3789 {
3790 unsigned int form;
3791
3792 SAFE_BYTE_GET_AND_INC (form, curr, 1, end);
3793 printf ("%s%s", get_FORM_name (form),
3794 n == nargs - 1 ? "\n" : ", ");
3795 switch (form)
3796 {
3797 case DW_FORM_data1:
3798 case DW_FORM_data2:
3799 case DW_FORM_data4:
3800 case DW_FORM_data8:
3801 case DW_FORM_sdata:
3802 case DW_FORM_udata:
3803 case DW_FORM_block:
3804 case DW_FORM_block1:
3805 case DW_FORM_block2:
3806 case DW_FORM_block4:
3807 case DW_FORM_flag:
3808 case DW_FORM_string:
3809 case DW_FORM_strp:
3810 case DW_FORM_sec_offset:
3811 break;
3812 default:
3813 error (_("Invalid extension opcode form %s\n"),
3814 get_FORM_name (form));
3815 return 0;
3816 }
3817 }
3818 }
3819 }
3820 }
3821 }
3822 printf ("\n");
3823
3824 while (1)
3825 {
3826 unsigned int op;
3827
3828 if (curr >= end)
3829 {
3830 error (_(".debug_macro section not zero terminated\n"));
3831 return 0;
3832 }
3833
3834 SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
3835 if (op == 0)
3836 break;
3837
3838 switch (op)
3839 {
3840 case DW_MACRO_GNU_start_file:
3841 {
3842 unsigned int filenum;
3843 unsigned char *file_name = NULL, *dir_name = NULL;
3844
3845 lineno = read_uleb128 (curr, &bytes_read, end);
3846 curr += bytes_read;
3847 filenum = read_uleb128 (curr, &bytes_read, end);
3848 curr += bytes_read;
3849
3850 if ((flags & 2) == 0)
3851 error (_("DW_MACRO_GNU_start_file used, but no .debug_line offset provided.\n"));
3852 else
3853 file_name
3854 = get_line_filename_and_dirname (line_offset, filenum,
3855 &dir_name);
3856 if (file_name == NULL)
3857 printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d\n"),
3858 lineno, filenum);
3859 else
3860 printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
3861 lineno, filenum,
3862 dir_name != NULL ? (const char *) dir_name : "",
3863 dir_name != NULL ? "/" : "", file_name);
3864 }
3865 break;
3866
3867 case DW_MACRO_GNU_end_file:
3868 printf (_(" DW_MACRO_GNU_end_file\n"));
3869 break;
3870
3871 case DW_MACRO_GNU_define:
3872 lineno = read_uleb128 (curr, &bytes_read, end);
3873 curr += bytes_read;
3874 string = curr;
3875 curr += strnlen ((char *) string, end - string) + 1;
3876 printf (_(" DW_MACRO_GNU_define - lineno : %d macro : %s\n"),
3877 lineno, string);
3878 break;
3879
3880 case DW_MACRO_GNU_undef:
3881 lineno = read_uleb128 (curr, &bytes_read, end);
3882 curr += bytes_read;
3883 string = curr;
3884 curr += strnlen ((char *) string, end - string) + 1;
3885 printf (_(" DW_MACRO_GNU_undef - lineno : %d macro : %s\n"),
3886 lineno, string);
3887 break;
3888
3889 case DW_MACRO_GNU_define_indirect:
3890 lineno = read_uleb128 (curr, &bytes_read, end);
3891 curr += bytes_read;
3892 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
3893 string = fetch_indirect_string (offset);
3894 printf (_(" DW_MACRO_GNU_define_indirect - lineno : %d macro : %s\n"),
3895 lineno, string);
3896 break;
3897
3898 case DW_MACRO_GNU_undef_indirect:
3899 lineno = read_uleb128 (curr, &bytes_read, end);
3900 curr += bytes_read;
3901 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
3902 string = fetch_indirect_string (offset);
3903 printf (_(" DW_MACRO_GNU_undef_indirect - lineno : %d macro : %s\n"),
3904 lineno, string);
3905 break;
3906
3907 case DW_MACRO_GNU_transparent_include:
3908 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
3909 printf (_(" DW_MACRO_GNU_transparent_include - offset : 0x%lx\n"),
3910 (unsigned long) offset);
3911 break;
3912
3913 case DW_MACRO_GNU_define_indirect_alt:
3914 lineno = read_uleb128 (curr, &bytes_read, end);
3915 curr += bytes_read;
3916 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
3917 printf (_(" DW_MACRO_GNU_define_indirect_alt - lineno : %d macro offset : 0x%lx\n"),
3918 lineno, (unsigned long) offset);
3919 break;
3920
3921 case DW_MACRO_GNU_undef_indirect_alt:
3922 lineno = read_uleb128 (curr, &bytes_read, end);
3923 curr += bytes_read;
3924 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
3925 printf (_(" DW_MACRO_GNU_undef_indirect_alt - lineno : %d macro offset : 0x%lx\n"),
3926 lineno, (unsigned long) offset);
3927 break;
3928
3929 case DW_MACRO_GNU_transparent_include_alt:
3930 SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
3931 printf (_(" DW_MACRO_GNU_transparent_include_alt - offset : 0x%lx\n"),
3932 (unsigned long) offset);
3933 break;
3934
3935 default:
3936 if (extended_ops == NULL || extended_ops[op] == NULL)
3937 {
3938 error (_(" Unknown macro opcode %02x seen\n"), op);
3939 return 0;
3940 }
3941 else
3942 {
3943 /* Skip over unhandled opcodes. */
3944 dwarf_vma nargs, n;
3945 unsigned char *desc = extended_ops[op];
3946 nargs = read_uleb128 (desc, &bytes_read, end);
3947 desc += bytes_read;
3948 if (nargs == 0)
3949 {
3950 printf (_(" DW_MACRO_GNU_%02x\n"), op);
3951 break;
3952 }
3953 printf (_(" DW_MACRO_GNU_%02x -"), op);
3954 for (n = 0; n < nargs; n++)
3955 {
3956 int val;
3957
3958 SAFE_BYTE_GET_AND_INC (val, desc, 1, end);
3959 curr
3960 = read_and_display_attr_value (0, val,
3961 curr, end, 0, 0, offset_size,
3962 version, NULL, 0, NULL,
3963 NULL);
3964 if (n != nargs - 1)
3965 printf (",");
3966 }
3967 printf ("\n");
3968 }
3969 break;
3970 }
3971 }
3972
3973 printf ("\n");
3974 }
3975
3976 return 1;
3977 }
3978
3979 static int
3980 display_debug_abbrev (struct dwarf_section *section,
3981 void *file ATTRIBUTE_UNUSED)
3982 {
3983 abbrev_entry *entry;
3984 unsigned char *start = section->start;
3985 unsigned char *end = start + section->size;
3986
3987 printf (_("Contents of the %s section:\n\n"), section->name);
3988
3989 do
3990 {
3991 unsigned char *last;
3992
3993 free_abbrevs ();
3994
3995 last = start;
3996 start = process_abbrev_section (start, end);
3997
3998 if (first_abbrev == NULL)
3999 continue;
4000
4001 printf (_(" Number TAG (0x%lx)\n"), (long) (last - section->start));
4002
4003 for (entry = first_abbrev; entry; entry = entry->next)
4004 {
4005 abbrev_attr *attr;
4006
4007 printf (" %ld %s [%s]\n",
4008 entry->entry,
4009 get_TAG_name (entry->tag),
4010 entry->children ? _("has children") : _("no children"));
4011
4012 for (attr = entry->first_attr; attr; attr = attr->next)
4013 printf (" %-18s %s\n",
4014 get_AT_name (attr->attribute),
4015 get_FORM_name (attr->form));
4016 }
4017 }
4018 while (start);
4019
4020 printf ("\n");
4021
4022 return 1;
4023 }
4024
4025 /* Display a location list from a normal (ie, non-dwo) .debug_loc section. */
4026
4027 static void
4028 display_loc_list (struct dwarf_section *section,
4029 unsigned char **start_ptr,
4030 int debug_info_entry,
4031 unsigned long offset,
4032 unsigned long base_address,
4033 int has_frame_base)
4034 {
4035 unsigned char *start = *start_ptr;
4036 unsigned char *section_end = section->start + section->size;
4037 unsigned long cu_offset = debug_information [debug_info_entry].cu_offset;
4038 unsigned int pointer_size = debug_information [debug_info_entry].pointer_size;
4039 unsigned int offset_size = debug_information [debug_info_entry].offset_size;
4040 int dwarf_version = debug_information [debug_info_entry].dwarf_version;
4041
4042 dwarf_vma begin;
4043 dwarf_vma end;
4044 unsigned short length;
4045 int need_frame_base;
4046
4047 while (1)
4048 {
4049 if (start + 2 * pointer_size > section_end)
4050 {
4051 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4052 offset);
4053 break;
4054 }
4055
4056 printf (" %8.8lx ", offset + (start - *start_ptr));
4057
4058 /* Note: we use sign extension here in order to be sure that we can detect
4059 the -1 escape value. Sign extension into the top 32 bits of a 32-bit
4060 address will not affect the values that we display since we always show
4061 hex values, and always the bottom 32-bits. */
4062 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
4063 SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
4064
4065 if (begin == 0 && end == 0)
4066 {
4067 printf (_("<End of list>\n"));
4068 break;
4069 }
4070
4071 /* Check base address specifiers. */
4072 if (begin == (dwarf_vma) -1 && end != (dwarf_vma) -1)
4073 {
4074 base_address = end;
4075 print_dwarf_vma (begin, pointer_size);
4076 print_dwarf_vma (end, pointer_size);
4077 printf (_("(base address)\n"));
4078 continue;
4079 }
4080
4081 if (start + 2 > section_end)
4082 {
4083 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4084 offset);
4085 break;
4086 }
4087
4088 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
4089
4090 if (start + length > section_end)
4091 {
4092 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4093 offset);
4094 break;
4095 }
4096
4097 print_dwarf_vma (begin + base_address, pointer_size);
4098 print_dwarf_vma (end + base_address, pointer_size);
4099
4100 putchar ('(');
4101 need_frame_base = decode_location_expression (start,
4102 pointer_size,
4103 offset_size,
4104 dwarf_version,
4105 length,
4106 cu_offset, section);
4107 putchar (')');
4108
4109 if (need_frame_base && !has_frame_base)
4110 printf (_(" [without DW_AT_frame_base]"));
4111
4112 if (begin == end)
4113 fputs (_(" (start == end)"), stdout);
4114 else if (begin > end)
4115 fputs (_(" (start > end)"), stdout);
4116
4117 putchar ('\n');
4118
4119 start += length;
4120 }
4121
4122 *start_ptr = start;
4123 }
4124
4125 /* Print a .debug_addr table index in decimal, surrounded by square brackets,
4126 right-adjusted in a field of length LEN, and followed by a space. */
4127
4128 static void
4129 print_addr_index (unsigned int idx, unsigned int len)
4130 {
4131 static char buf[15];
4132 snprintf (buf, sizeof (buf), "[%d]", idx);
4133 printf ("%*s ", len, buf);
4134 }
4135
4136 /* Display a location list from a .dwo section. It uses address indexes rather
4137 than embedded addresses. This code closely follows display_loc_list, but the
4138 two are sufficiently different that combining things is very ugly. */
4139
4140 static void
4141 display_loc_list_dwo (struct dwarf_section *section,
4142 unsigned char **start_ptr,
4143 int debug_info_entry,
4144 unsigned long offset,
4145 int has_frame_base)
4146 {
4147 unsigned char *start = *start_ptr;
4148 unsigned char *section_end = section->start + section->size;
4149 unsigned long cu_offset = debug_information [debug_info_entry].cu_offset;
4150 unsigned int pointer_size = debug_information [debug_info_entry].pointer_size;
4151 unsigned int offset_size = debug_information [debug_info_entry].offset_size;
4152 int dwarf_version = debug_information [debug_info_entry].dwarf_version;
4153 int entry_type;
4154 unsigned short length;
4155 int need_frame_base;
4156 unsigned int idx;
4157 unsigned int bytes_read;
4158
4159 while (1)
4160 {
4161 printf (" %8.8lx ", offset + (start - *start_ptr));
4162
4163 if (start >= section_end)
4164 {
4165 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4166 offset);
4167 break;
4168 }
4169
4170 SAFE_BYTE_GET_AND_INC (entry_type, start, 1, section_end);
4171 switch (entry_type)
4172 {
4173 case 0: /* A terminating entry. */
4174 *start_ptr = start;
4175 printf (_("<End of list>\n"));
4176 return;
4177 case 1: /* A base-address entry. */
4178 idx = read_uleb128 (start, &bytes_read, section_end);
4179 start += bytes_read;
4180 print_addr_index (idx, 8);
4181 printf (" ");
4182 printf (_("(base address selection entry)\n"));
4183 continue;
4184 case 2: /* A start/end entry. */
4185 idx = read_uleb128 (start, &bytes_read, section_end);
4186 start += bytes_read;
4187 print_addr_index (idx, 8);
4188 idx = read_uleb128 (start, &bytes_read, section_end);
4189 start += bytes_read;
4190 print_addr_index (idx, 8);
4191 break;
4192 case 3: /* A start/length entry. */
4193 idx = read_uleb128 (start, &bytes_read, section_end);
4194 start += bytes_read;
4195 print_addr_index (idx, 8);
4196 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4197 printf ("%08x ", idx);
4198 break;
4199 case 4: /* An offset pair entry. */
4200 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4201 printf ("%08x ", idx);
4202 SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4203 printf ("%08x ", idx);
4204 break;
4205 default:
4206 warn (_("Unknown location list entry type 0x%x.\n"), entry_type);
4207 *start_ptr = start;
4208 return;
4209 }
4210
4211 if (start + 2 > section_end)
4212 {
4213 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4214 offset);
4215 break;
4216 }
4217
4218 SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
4219 if (start + length > section_end)
4220 {
4221 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4222 offset);
4223 break;
4224 }
4225
4226 putchar ('(');
4227 need_frame_base = decode_location_expression (start,
4228 pointer_size,
4229 offset_size,
4230 dwarf_version,
4231 length,
4232 cu_offset, section);
4233 putchar (')');
4234
4235 if (need_frame_base && !has_frame_base)
4236 printf (_(" [without DW_AT_frame_base]"));
4237
4238 putchar ('\n');
4239
4240 start += length;
4241 }
4242
4243 *start_ptr = start;
4244 }
4245
4246 /* Sort array of indexes in ascending order of loc_offsets[idx]. */
4247
4248 static dwarf_vma *loc_offsets;
4249
4250 static int
4251 loc_offsets_compar (const void *ap, const void *bp)
4252 {
4253 dwarf_vma a = loc_offsets[*(const unsigned int *) ap];
4254 dwarf_vma b = loc_offsets[*(const unsigned int *) bp];
4255
4256 return (a > b) - (b > a);
4257 }
4258
4259 static int
4260 display_debug_loc (struct dwarf_section *section, void *file)
4261 {
4262 unsigned char *start = section->start;
4263 unsigned long bytes;
4264 unsigned char *section_begin = start;
4265 unsigned int num_loc_list = 0;
4266 unsigned long last_offset = 0;
4267 unsigned int first = 0;
4268 unsigned int i;
4269 unsigned int j;
4270 unsigned int k;
4271 int seen_first_offset = 0;
4272 int locs_sorted = 1;
4273 unsigned char *next;
4274 unsigned int *array = NULL;
4275 const char *suffix = strrchr (section->name, '.');
4276 int is_dwo = 0;
4277
4278 if (suffix && strcmp (suffix, ".dwo") == 0)
4279 is_dwo = 1;
4280
4281 bytes = section->size;
4282
4283 if (bytes == 0)
4284 {
4285 printf (_("\nThe %s section is empty.\n"), section->name);
4286 return 0;
4287 }
4288
4289 if (load_debug_info (file) == 0)
4290 {
4291 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
4292 section->name);
4293 return 0;
4294 }
4295
4296 /* Check the order of location list in .debug_info section. If
4297 offsets of location lists are in the ascending order, we can
4298 use `debug_information' directly. */
4299 for (i = 0; i < num_debug_info_entries; i++)
4300 {
4301 unsigned int num;
4302
4303 num = debug_information [i].num_loc_offsets;
4304 if (num > num_loc_list)
4305 num_loc_list = num;
4306
4307 /* Check if we can use `debug_information' directly. */
4308 if (locs_sorted && num != 0)
4309 {
4310 if (!seen_first_offset)
4311 {
4312 /* This is the first location list. */
4313 last_offset = debug_information [i].loc_offsets [0];
4314 first = i;
4315 seen_first_offset = 1;
4316 j = 1;
4317 }
4318 else
4319 j = 0;
4320
4321 for (; j < num; j++)
4322 {
4323 if (last_offset >
4324 debug_information [i].loc_offsets [j])
4325 {
4326 locs_sorted = 0;
4327 break;
4328 }
4329 last_offset = debug_information [i].loc_offsets [j];
4330 }
4331 }
4332 }
4333
4334 if (!seen_first_offset)
4335 error (_("No location lists in .debug_info section!\n"));
4336
4337 /* DWARF sections under Mach-O have non-zero addresses. */
4338 if (debug_information [first].num_loc_offsets > 0
4339 && debug_information [first].loc_offsets [0] != section->address)
4340 warn (_("Location lists in %s section start at 0x%s\n"),
4341 section->name,
4342 dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]));
4343
4344 if (!locs_sorted)
4345 array = (unsigned int *) xcmalloc (num_loc_list, sizeof (unsigned int));
4346 printf (_("Contents of the %s section:\n\n"), section->name);
4347 printf (_(" Offset Begin End Expression\n"));
4348
4349 seen_first_offset = 0;
4350 for (i = first; i < num_debug_info_entries; i++)
4351 {
4352 unsigned long offset;
4353 unsigned long base_address;
4354 int has_frame_base;
4355
4356 if (!locs_sorted)
4357 {
4358 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
4359 array[k] = k;
4360 loc_offsets = debug_information [i].loc_offsets;
4361 qsort (array, debug_information [i].num_loc_offsets,
4362 sizeof (*array), loc_offsets_compar);
4363 }
4364
4365 for (k = 0; k < debug_information [i].num_loc_offsets; k++)
4366 {
4367 j = locs_sorted ? k : array[k];
4368 if (k
4369 && debug_information [i].loc_offsets [locs_sorted
4370 ? k - 1 : array [k - 1]]
4371 == debug_information [i].loc_offsets [j])
4372 continue;
4373 has_frame_base = debug_information [i].have_frame_base [j];
4374 /* DWARF sections under Mach-O have non-zero addresses. */
4375 offset = debug_information [i].loc_offsets [j] - section->address;
4376 next = section_begin + offset;
4377 base_address = debug_information [i].base_address;
4378
4379 if (!seen_first_offset)
4380 seen_first_offset = 1;
4381 else
4382 {
4383 if (start < next)
4384 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
4385 (unsigned long) (start - section_begin),
4386 (unsigned long) (next - section_begin));
4387 else if (start > next)
4388 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
4389 (unsigned long) (start - section_begin),
4390 (unsigned long) (next - section_begin));
4391 }
4392 start = next;
4393
4394 if (offset >= bytes)
4395 {
4396 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
4397 offset);
4398 continue;
4399 }
4400
4401 if (is_dwo)
4402 display_loc_list_dwo (section, &start, i, offset, has_frame_base);
4403 else
4404 display_loc_list (section, &start, i, offset, base_address,
4405 has_frame_base);
4406 }
4407 }
4408
4409 if (start < section->start + section->size)
4410 warn (_("There are %ld unused bytes at the end of section %s\n"),
4411 (long) (section->start + section->size - start), section->name);
4412 putchar ('\n');
4413 free (array);
4414 return 1;
4415 }
4416
4417 static int
4418 display_debug_str (struct dwarf_section *section,
4419 void *file ATTRIBUTE_UNUSED)
4420 {
4421 unsigned char *start = section->start;
4422 unsigned long bytes = section->size;
4423 dwarf_vma addr = section->address;
4424
4425 if (bytes == 0)
4426 {
4427 printf (_("\nThe %s section is empty.\n"), section->name);
4428 return 0;
4429 }
4430
4431 printf (_("Contents of the %s section:\n\n"), section->name);
4432
4433 while (bytes)
4434 {
4435 int j;
4436 int k;
4437 int lbytes;
4438
4439 lbytes = (bytes > 16 ? 16 : bytes);
4440
4441 printf (" 0x%8.8lx ", (unsigned long) addr);
4442
4443 for (j = 0; j < 16; j++)
4444 {
4445 if (j < lbytes)
4446 printf ("%2.2x", start[j]);
4447 else
4448 printf (" ");
4449
4450 if ((j & 3) == 3)
4451 printf (" ");
4452 }
4453
4454 for (j = 0; j < lbytes; j++)
4455 {
4456 k = start[j];
4457 if (k >= ' ' && k < 0x80)
4458 printf ("%c", k);
4459 else
4460 printf (".");
4461 }
4462
4463 putchar ('\n');
4464
4465 start += lbytes;
4466 addr += lbytes;
4467 bytes -= lbytes;
4468 }
4469
4470 putchar ('\n');
4471
4472 return 1;
4473 }
4474
4475 static int
4476 display_debug_info (struct dwarf_section *section, void *file)
4477 {
4478 return process_debug_info (section, file, section->abbrev_sec, 0, 0);
4479 }
4480
4481 static int
4482 display_debug_types (struct dwarf_section *section, void *file)
4483 {
4484 return process_debug_info (section, file, section->abbrev_sec, 0, 1);
4485 }
4486
4487 static int
4488 display_trace_info (struct dwarf_section *section, void *file)
4489 {
4490 return process_debug_info (section, file, section->abbrev_sec, 0, 0);
4491 }
4492
4493 static int
4494 display_debug_aranges (struct dwarf_section *section,
4495 void *file ATTRIBUTE_UNUSED)
4496 {
4497 unsigned char *start = section->start;
4498 unsigned char *end = start + section->size;
4499
4500 printf (_("Contents of the %s section:\n\n"), section->name);
4501
4502 /* It does not matter if this load fails,
4503 we test for that later on. */
4504 load_debug_info (file);
4505
4506 while (start < end)
4507 {
4508 unsigned char *hdrptr;
4509 DWARF2_Internal_ARange arange;
4510 unsigned char *addr_ranges;
4511 dwarf_vma length;
4512 dwarf_vma address;
4513 unsigned char address_size;
4514 int excess;
4515 int offset_size;
4516 int initial_length_size;
4517
4518 hdrptr = start;
4519
4520 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 4, end);
4521 if (arange.ar_length == 0xffffffff)
4522 {
4523 SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 8, end);
4524 offset_size = 8;
4525 initial_length_size = 12;
4526 }
4527 else
4528 {
4529 offset_size = 4;
4530 initial_length_size = 4;
4531 }
4532
4533 SAFE_BYTE_GET_AND_INC (arange.ar_version, hdrptr, 2, end);
4534 SAFE_BYTE_GET_AND_INC (arange.ar_info_offset, hdrptr, offset_size, end);
4535
4536 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
4537 && num_debug_info_entries > 0
4538 && find_debug_info_for_offset (arange.ar_info_offset) == NULL)
4539 warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
4540 (unsigned long) arange.ar_info_offset, section->name);
4541
4542 SAFE_BYTE_GET_AND_INC (arange.ar_pointer_size, hdrptr, 1, end);
4543 SAFE_BYTE_GET_AND_INC (arange.ar_segment_size, hdrptr, 1, end);
4544
4545 if (arange.ar_version != 2 && arange.ar_version != 3)
4546 {
4547 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
4548 break;
4549 }
4550
4551 printf (_(" Length: %ld\n"),
4552 (long) arange.ar_length);
4553 printf (_(" Version: %d\n"), arange.ar_version);
4554 printf (_(" Offset into .debug_info: 0x%lx\n"),
4555 (unsigned long) arange.ar_info_offset);
4556 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
4557 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
4558
4559 address_size = arange.ar_pointer_size + arange.ar_segment_size;
4560
4561 if (address_size == 0)
4562 {
4563 error (_("Invalid address size in %s section!\n"),
4564 section->name);
4565 break;
4566 }
4567
4568 /* The DWARF spec does not require that the address size be a power
4569 of two, but we do. This will have to change if we ever encounter
4570 an uneven architecture. */
4571 if ((address_size & (address_size - 1)) != 0)
4572 {
4573 warn (_("Pointer size + Segment size is not a power of two.\n"));
4574 break;
4575 }
4576
4577 if (address_size > 4)
4578 printf (_("\n Address Length\n"));
4579 else
4580 printf (_("\n Address Length\n"));
4581
4582 addr_ranges = hdrptr;
4583
4584 /* Must pad to an alignment boundary that is twice the address size. */
4585 excess = (hdrptr - start) % (2 * address_size);
4586 if (excess)
4587 addr_ranges += (2 * address_size) - excess;
4588
4589 start += arange.ar_length + initial_length_size;
4590
4591 while (addr_ranges + 2 * address_size <= start)
4592 {
4593 SAFE_BYTE_GET_AND_INC (address, addr_ranges, address_size, end);
4594 SAFE_BYTE_GET_AND_INC (length, addr_ranges, address_size, end);
4595
4596 printf (" ");
4597 print_dwarf_vma (address, address_size);
4598 print_dwarf_vma (length, address_size);
4599 putchar ('\n');
4600 }
4601 }
4602
4603 printf ("\n");
4604
4605 return 1;
4606 }
4607
4608 /* Comparison function for qsort. */
4609 static int
4610 comp_addr_base (const void * v0, const void * v1)
4611 {
4612 debug_info * info0 = (debug_info *) v0;
4613 debug_info * info1 = (debug_info *) v1;
4614 return info0->addr_base - info1->addr_base;
4615 }
4616
4617 /* Display the debug_addr section. */
4618 static int
4619 display_debug_addr (struct dwarf_section *section,
4620 void *file)
4621 {
4622 debug_info **debug_addr_info;
4623 unsigned char *entry;
4624 unsigned char *end;
4625 unsigned int i;
4626 unsigned int count;
4627
4628 if (section->size == 0)
4629 {
4630 printf (_("\nThe %s section is empty.\n"), section->name);
4631 return 0;
4632 }
4633
4634 if (load_debug_info (file) == 0)
4635 {
4636 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
4637 section->name);
4638 return 0;
4639 }
4640
4641 printf (_("Contents of the %s section:\n\n"), section->name);
4642
4643 debug_addr_info = (debug_info **) xmalloc ((num_debug_info_entries + 1)
4644 * sizeof (debug_info *));
4645
4646 count = 0;
4647 for (i = 0; i < num_debug_info_entries; i++)
4648 {
4649 if (debug_information [i].addr_base != DEBUG_INFO_UNAVAILABLE)
4650 debug_addr_info [count++] = &debug_information [i];
4651 }
4652
4653 /* Add a sentinel to make iteration convenient. */
4654 debug_addr_info [count] = (debug_info *) xmalloc (sizeof (debug_info));
4655 debug_addr_info [count]->addr_base = section->size;
4656
4657 qsort (debug_addr_info, count, sizeof (debug_info *), comp_addr_base);
4658 for (i = 0; i < count; i++)
4659 {
4660 unsigned int idx;
4661 unsigned int address_size = debug_addr_info [i]->pointer_size;
4662
4663 printf (_(" For compilation unit at offset 0x%s:\n"),
4664 dwarf_vmatoa ("x", debug_addr_info [i]->cu_offset));
4665
4666 printf (_("\tIndex\tAddress\n"));
4667 entry = section->start + debug_addr_info [i]->addr_base;
4668 end = section->start + debug_addr_info [i + 1]->addr_base;
4669 idx = 0;
4670 while (entry < end)
4671 {
4672 dwarf_vma base = byte_get (entry, address_size);
4673 printf (_("\t%d:\t"), idx);
4674 print_dwarf_vma (base, address_size);
4675 printf ("\n");
4676 entry += address_size;
4677 idx++;
4678 }
4679 }
4680 printf ("\n");
4681
4682 free (debug_addr_info);
4683 return 1;
4684 }
4685
4686 /* Display the .debug_str_offsets and .debug_str_offsets.dwo sections. */
4687 static int
4688 display_debug_str_offsets (struct dwarf_section *section,
4689 void *file ATTRIBUTE_UNUSED)
4690 {
4691 if (section->size == 0)
4692 {
4693 printf (_("\nThe %s section is empty.\n"), section->name);
4694 return 0;
4695 }
4696 /* TODO: Dump the contents. This is made somewhat difficult by not knowing
4697 what the offset size is for this section. */
4698 return 1;
4699 }
4700
4701 /* Each debug_information[x].range_lists[y] gets this representation for
4702 sorting purposes. */
4703
4704 struct range_entry
4705 {
4706 /* The debug_information[x].range_lists[y] value. */
4707 unsigned long ranges_offset;
4708
4709 /* Original debug_information to find parameters of the data. */
4710 debug_info *debug_info_p;
4711 };
4712
4713 /* Sort struct range_entry in ascending order of its RANGES_OFFSET. */
4714
4715 static int
4716 range_entry_compar (const void *ap, const void *bp)
4717 {
4718 const struct range_entry *a_re = (const struct range_entry *) ap;
4719 const struct range_entry *b_re = (const struct range_entry *) bp;
4720 const unsigned long a = a_re->ranges_offset;
4721 const unsigned long b = b_re->ranges_offset;
4722
4723 return (a > b) - (b > a);
4724 }
4725
4726 static int
4727 display_debug_ranges (struct dwarf_section *section,
4728 void *file ATTRIBUTE_UNUSED)
4729 {
4730 unsigned char *start = section->start;
4731 unsigned char *last_start = start;
4732 unsigned long bytes = section->size;
4733 unsigned char *section_begin = start;
4734 unsigned char *finish = start + bytes;
4735 unsigned int num_range_list, i;
4736 struct range_entry *range_entries, *range_entry_fill;
4737
4738 if (bytes == 0)
4739 {
4740 printf (_("\nThe %s section is empty.\n"), section->name);
4741 return 0;
4742 }
4743
4744 if (load_debug_info (file) == 0)
4745 {
4746 warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
4747 section->name);
4748 return 0;
4749 }
4750
4751 num_range_list = 0;
4752 for (i = 0; i < num_debug_info_entries; i++)
4753 num_range_list += debug_information [i].num_range_lists;
4754
4755 if (num_range_list == 0)
4756 {
4757 /* This can happen when the file was compiled with -gsplit-debug
4758 which removes references to range lists from the primary .o file. */
4759 printf (_("No range lists in .debug_info section.\n"));
4760 return 1;
4761 }
4762
4763 range_entries = (struct range_entry *)
4764 xmalloc (sizeof (*range_entries) * num_range_list);
4765 range_entry_fill = range_entries;
4766
4767 for (i = 0; i < num_debug_info_entries; i++)
4768 {
4769 debug_info *debug_info_p = &debug_information[i];
4770 unsigned int j;
4771
4772 for (j = 0; j < debug_info_p->num_range_lists; j++)
4773 {
4774 range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
4775 range_entry_fill->debug_info_p = debug_info_p;
4776 range_entry_fill++;
4777 }
4778 }
4779
4780 qsort (range_entries, num_range_list, sizeof (*range_entries),
4781 range_entry_compar);
4782
4783 /* DWARF sections under Mach-O have non-zero addresses. */
4784 if (dwarf_check != 0 && range_entries[0].ranges_offset != section->address)
4785 warn (_("Range lists in %s section start at 0x%lx\n"),
4786 section->name, range_entries[0].ranges_offset);
4787
4788 printf (_("Contents of the %s section:\n\n"), section->name);
4789 printf (_(" Offset Begin End\n"));
4790
4791 for (i = 0; i < num_range_list; i++)
4792 {
4793 struct range_entry *range_entry = &range_entries[i];
4794 debug_info *debug_info_p = range_entry->debug_info_p;
4795 unsigned int pointer_size;
4796 unsigned long offset;
4797 unsigned char *next;
4798 unsigned long base_address;
4799
4800 pointer_size = debug_info_p->pointer_size;
4801
4802 /* DWARF sections under Mach-O have non-zero addresses. */
4803 offset = range_entry->ranges_offset - section->address;
4804 next = section_begin + offset;
4805 base_address = debug_info_p->base_address;
4806
4807 if (dwarf_check != 0 && i > 0)
4808 {
4809 if (start < next)
4810 warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
4811 (unsigned long) (start - section_begin),
4812 (unsigned long) (next - section_begin), section->name);
4813 else if (start > next)
4814 {
4815 if (next == last_start)
4816 continue;
4817 warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
4818 (unsigned long) (start - section_begin),
4819 (unsigned long) (next - section_begin), section->name);
4820 }
4821 }
4822 start = next;
4823 last_start = next;
4824
4825 while (start < finish)
4826 {
4827 dwarf_vma begin;
4828 dwarf_vma end;
4829
4830 /* Note: we use sign extension here in order to be sure that
4831 we can detect the -1 escape value. Sign extension into the
4832 top 32 bits of a 32-bit address will not affect the values
4833 that we display since we always show hex values, and always
4834 the bottom 32-bits. */
4835 SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
4836 if (start >= finish)
4837 break;
4838 SAFE_SIGNED_BYTE_GET_AND_INC (end, start, pointer_size, finish);
4839
4840 printf (" %8.8lx ", offset);
4841
4842 if (begin == 0 && end == 0)
4843 {
4844 printf (_("<End of list>\n"));
4845 break;
4846 }
4847
4848 /* Check base address specifiers. */
4849 if (begin == (dwarf_vma) -1 && end != (dwarf_vma) -1)
4850 {
4851 base_address = end;
4852 print_dwarf_vma (begin, pointer_size);
4853 print_dwarf_vma (end, pointer_size);
4854 printf ("(base address)\n");
4855 continue;
4856 }
4857
4858 print_dwarf_vma (begin + base_address, pointer_size);
4859 print_dwarf_vma (end + base_address, pointer_size);
4860
4861 if (begin == end)
4862 fputs (_("(start == end)"), stdout);
4863 else if (begin > end)
4864 fputs (_("(start > end)"), stdout);
4865
4866 putchar ('\n');
4867 }
4868 }
4869 putchar ('\n');
4870
4871 free (range_entries);
4872
4873 return 1;
4874 }
4875
4876 typedef struct Frame_Chunk
4877 {
4878 struct Frame_Chunk *next;
4879 unsigned char *chunk_start;
4880 int ncols;
4881 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
4882 short int *col_type;
4883 int *col_offset;
4884 char *augmentation;
4885 unsigned int code_factor;
4886 int data_factor;
4887 unsigned long pc_begin;
4888 unsigned long pc_range;
4889 int cfa_reg;
4890 int cfa_offset;
4891 int ra;
4892 unsigned char fde_encoding;
4893 unsigned char cfa_exp;
4894 unsigned char ptr_size;
4895 unsigned char segment_size;
4896 }
4897 Frame_Chunk;
4898
4899 static const char *const *dwarf_regnames;
4900 static unsigned int dwarf_regnames_count;
4901
4902 /* A marker for a col_type that means this column was never referenced
4903 in the frame info. */
4904 #define DW_CFA_unreferenced (-1)
4905
4906 /* Return 0 if not more space is needed, 1 if more space is needed,
4907 -1 for invalid reg. */
4908
4909 static int
4910 frame_need_space (Frame_Chunk *fc, unsigned int reg)
4911 {
4912 int prev = fc->ncols;
4913
4914 if (reg < (unsigned int) fc->ncols)
4915 return 0;
4916
4917 if (dwarf_regnames_count
4918 && reg > dwarf_regnames_count)
4919 return -1;
4920
4921 fc->ncols = reg + 1;
4922 fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
4923 sizeof (short int));
4924 fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
4925
4926 while (prev < fc->ncols)
4927 {
4928 fc->col_type[prev] = DW_CFA_unreferenced;
4929 fc->col_offset[prev] = 0;
4930 prev++;
4931 }
4932 return 1;
4933 }
4934
4935 static const char *const dwarf_regnames_i386[] =
4936 {
4937 "eax", "ecx", "edx", "ebx",
4938 "esp", "ebp", "esi", "edi",
4939 "eip", "eflags", NULL,
4940 "st0", "st1", "st2", "st3",
4941 "st4", "st5", "st6", "st7",
4942 NULL, NULL,
4943 "xmm0", "xmm1", "xmm2", "xmm3",
4944 "xmm4", "xmm5", "xmm6", "xmm7",
4945 "mm0", "mm1", "mm2", "mm3",
4946 "mm4", "mm5", "mm6", "mm7",
4947 "fcw", "fsw", "mxcsr",
4948 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
4949 "tr", "ldtr"
4950 };
4951
4952 void
4953 init_dwarf_regnames_i386 (void)
4954 {
4955 dwarf_regnames = dwarf_regnames_i386;
4956 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
4957 }
4958
4959 static const char *const dwarf_regnames_x86_64[] =
4960 {
4961 "rax", "rdx", "rcx", "rbx",
4962 "rsi", "rdi", "rbp", "rsp",
4963 "r8", "r9", "r10", "r11",
4964 "r12", "r13", "r14", "r15",
4965 "rip",
4966 "xmm0", "xmm1", "xmm2", "xmm3",
4967 "xmm4", "xmm5", "xmm6", "xmm7",
4968 "xmm8", "xmm9", "xmm10", "xmm11",
4969 "xmm12", "xmm13", "xmm14", "xmm15",
4970 "st0", "st1", "st2", "st3",
4971 "st4", "st5", "st6", "st7",
4972 "mm0", "mm1", "mm2", "mm3",
4973 "mm4", "mm5", "mm6", "mm7",
4974 "rflags",
4975 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
4976 "fs.base", "gs.base", NULL, NULL,
4977 "tr", "ldtr",
4978 "mxcsr", "fcw", "fsw"
4979 };
4980
4981 void
4982 init_dwarf_regnames_x86_64 (void)
4983 {
4984 dwarf_regnames = dwarf_regnames_x86_64;
4985 dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
4986 }
4987
4988 void
4989 init_dwarf_regnames (unsigned int e_machine)
4990 {
4991 switch (e_machine)
4992 {
4993 case EM_386:
4994 case EM_486:
4995 init_dwarf_regnames_i386 ();
4996 break;
4997
4998 case EM_X86_64:
4999 case EM_L1OM:
5000 case EM_K1OM:
5001 init_dwarf_regnames_x86_64 ();
5002 break;
5003
5004 default:
5005 break;
5006 }
5007 }
5008
5009 static const char *
5010 regname (unsigned int regno, int row)
5011 {
5012 static char reg[64];
5013 if (dwarf_regnames
5014 && regno < dwarf_regnames_count
5015 && dwarf_regnames [regno] != NULL)
5016 {
5017 if (row)
5018 return dwarf_regnames [regno];
5019 snprintf (reg, sizeof (reg), "r%d (%s)", regno,
5020 dwarf_regnames [regno]);
5021 }
5022 else
5023 snprintf (reg, sizeof (reg), "r%d", regno);
5024 return reg;
5025 }
5026
5027 static void
5028 frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
5029 {
5030 int r;
5031 char tmp[100];
5032
5033 if (*max_regs < fc->ncols)
5034 *max_regs = fc->ncols;
5035
5036 if (*need_col_headers)
5037 {
5038 static const char *sloc = " LOC";
5039
5040 *need_col_headers = 0;
5041
5042 printf ("%-*s CFA ", eh_addr_size * 2, sloc);
5043
5044 for (r = 0; r < *max_regs; r++)
5045 if (fc->col_type[r] != DW_CFA_unreferenced)
5046 {
5047 if (r == fc->ra)
5048 printf ("ra ");
5049 else
5050 printf ("%-5s ", regname (r, 1));
5051 }
5052
5053 printf ("\n");
5054 }
5055
5056 printf ("%0*lx ", eh_addr_size * 2, fc->pc_begin);
5057 if (fc->cfa_exp)
5058 strcpy (tmp, "exp");
5059 else
5060 sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), fc->cfa_offset);
5061 printf ("%-8s ", tmp);
5062
5063 for (r = 0; r < fc->ncols; r++)
5064 {
5065 if (fc->col_type[r] != DW_CFA_unreferenced)
5066 {
5067 switch (fc->col_type[r])
5068 {
5069 case DW_CFA_undefined:
5070 strcpy (tmp, "u");
5071 break;
5072 case DW_CFA_same_value:
5073 strcpy (tmp, "s");
5074 break;
5075 case DW_CFA_offset:
5076 sprintf (tmp, "c%+d", fc->col_offset[r]);
5077 break;
5078 case DW_CFA_val_offset:
5079 sprintf (tmp, "v%+d", fc->col_offset[r]);
5080 break;
5081 case DW_CFA_register:
5082 sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
5083 break;
5084 case DW_CFA_expression:
5085 strcpy (tmp, "exp");
5086 break;
5087 case DW_CFA_val_expression:
5088 strcpy (tmp, "vexp");
5089 break;
5090 default:
5091 strcpy (tmp, "n/a");
5092 break;
5093 }
5094 printf ("%-5s ", tmp);
5095 }
5096 }
5097 printf ("\n");
5098 }
5099
5100 #define GET(VAR, N) SAFE_BYTE_GET_AND_INC (VAR, start, N, end);
5101 #define LEB() read_uleb128 (start, & length_return, end); start += length_return
5102 #define SLEB() read_sleb128 (start, & length_return, end); start += length_return
5103
5104 static int
5105 display_debug_frames (struct dwarf_section *section,
5106 void *file ATTRIBUTE_UNUSED)
5107 {
5108 unsigned char *start = section->start;
5109 unsigned char *end = start + section->size;
5110 unsigned char *section_start = start;
5111 Frame_Chunk *chunks = 0;
5112 Frame_Chunk *remembered_state = 0;
5113 Frame_Chunk *rs;
5114 int is_eh = strcmp (section->name, ".eh_frame") == 0;
5115 unsigned int length_return;
5116 int max_regs = 0;
5117 const char *bad_reg = _("bad register: ");
5118 int saved_eh_addr_size = eh_addr_size;
5119
5120 printf (_("Contents of the %s section:\n"), section->name);
5121
5122 while (start < end)
5123 {
5124 unsigned char *saved_start;
5125 unsigned char *block_end;
5126 unsigned long length;
5127 unsigned long cie_id;
5128 Frame_Chunk *fc;
5129 Frame_Chunk *cie;
5130 int need_col_headers = 1;
5131 unsigned char *augmentation_data = NULL;
5132 unsigned long augmentation_data_len = 0;
5133 int encoded_ptr_size = saved_eh_addr_size;
5134 int offset_size;
5135 int initial_length_size;
5136
5137 saved_start = start;
5138
5139 SAFE_BYTE_GET_AND_INC (length, start, 4, end);
5140 if (length == 0)
5141 {
5142 printf ("\n%08lx ZERO terminator\n\n",
5143 (unsigned long)(saved_start - section_start));
5144 continue;
5145 }
5146
5147 if (length == 0xffffffff)
5148 {
5149 SAFE_BYTE_GET_AND_INC (length, start, 8, end);
5150 offset_size = 8;
5151 initial_length_size = 12;
5152 }
5153 else
5154 {
5155 offset_size = 4;
5156 initial_length_size = 4;
5157 }
5158
5159 block_end = saved_start + length + initial_length_size;
5160 if (block_end > end)
5161 {
5162 warn ("Invalid length %#08lx in FDE at %#08lx\n",
5163 length, (unsigned long)(saved_start - section_start));
5164 block_end = end;
5165 }
5166
5167 SAFE_BYTE_GET_AND_INC (cie_id, start, offset_size, end);
5168
5169 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
5170 {
5171 int version;
5172
5173 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
5174 memset (fc, 0, sizeof (Frame_Chunk));
5175
5176 fc->next = chunks;
5177 chunks = fc;
5178 fc->chunk_start = saved_start;
5179 fc->ncols = 0;
5180 fc->col_type = (short int *) xmalloc (sizeof (short int));
5181 fc->col_offset = (int *) xmalloc (sizeof (int));
5182 frame_need_space (fc, max_regs - 1);
5183
5184 version = *start++;
5185
5186 fc->augmentation = (char *) start;
5187 start = (unsigned char *) strchr ((char *) start, '\0') + 1;
5188
5189 if (strcmp (fc->augmentation, "eh") == 0)
5190 start += eh_addr_size;
5191
5192 if (version >= 4)
5193 {
5194 GET (fc->ptr_size, 1);
5195 GET (fc->segment_size, 1);
5196 eh_addr_size = fc->ptr_size;
5197 }
5198 else
5199 {
5200 fc->ptr_size = eh_addr_size;
5201 fc->segment_size = 0;
5202 }
5203 fc->code_factor = LEB ();
5204 fc->data_factor = SLEB ();
5205 if (version == 1)
5206 {
5207 GET (fc->ra, 1);
5208 }
5209 else
5210 {
5211 fc->ra = LEB ();
5212 }
5213
5214 if (fc->augmentation[0] == 'z')
5215 {
5216 augmentation_data_len = LEB ();
5217 augmentation_data = start;
5218 start += augmentation_data_len;
5219 }
5220 cie = fc;
5221
5222 if (do_debug_frames_interp)
5223 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
5224 (unsigned long)(saved_start - section_start), length, cie_id,
5225 fc->augmentation, fc->code_factor, fc->data_factor,
5226 fc->ra);
5227 else
5228 {
5229 printf ("\n%08lx %08lx %08lx CIE\n",
5230 (unsigned long)(saved_start - section_start), length, cie_id);
5231 printf (" Version: %d\n", version);
5232 printf (" Augmentation: \"%s\"\n", fc->augmentation);
5233 if (version >= 4)
5234 {
5235 printf (" Pointer Size: %u\n", fc->ptr_size);
5236 printf (" Segment Size: %u\n", fc->segment_size);
5237 }
5238 printf (" Code alignment factor: %u\n", fc->code_factor);
5239 printf (" Data alignment factor: %d\n", fc->data_factor);
5240 printf (" Return address column: %d\n", fc->ra);
5241
5242 if (augmentation_data_len)
5243 {
5244 unsigned long i;
5245 printf (" Augmentation data: ");
5246 for (i = 0; i < augmentation_data_len; ++i)
5247 printf (" %02x", augmentation_data[i]);
5248 putchar ('\n');
5249 }
5250 putchar ('\n');
5251 }
5252
5253 if (augmentation_data_len)
5254 {
5255 unsigned char *p, *q;
5256 p = (unsigned char *) fc->augmentation + 1;
5257 q = augmentation_data;
5258
5259 while (1)
5260 {
5261 if (*p == 'L')
5262 q++;
5263 else if (*p == 'P')
5264 q += 1 + size_of_encoded_value (*q);
5265 else if (*p == 'R')
5266 fc->fde_encoding = *q++;
5267 else if (*p == 'S')
5268 ;
5269 else
5270 break;
5271 p++;
5272 }
5273
5274 if (fc->fde_encoding)
5275 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
5276 }
5277
5278 frame_need_space (fc, fc->ra);
5279 }
5280 else
5281 {
5282 unsigned char *look_for;
5283 static Frame_Chunk fde_fc;
5284 unsigned long segment_selector;
5285
5286 fc = & fde_fc;
5287 memset (fc, 0, sizeof (Frame_Chunk));
5288
5289 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
5290
5291 for (cie = chunks; cie ; cie = cie->next)
5292 if (cie->chunk_start == look_for)
5293 break;
5294
5295 if (!cie)
5296 {
5297 warn ("Invalid CIE pointer %#08lx in FDE at %#08lx\n",
5298 cie_id, (unsigned long)(saved_start - section_start));
5299 fc->ncols = 0;
5300 fc->col_type = (short int *) xmalloc (sizeof (short int));
5301 fc->col_offset = (int *) xmalloc (sizeof (int));
5302 frame_need_space (fc, max_regs - 1);
5303 cie = fc;
5304 fc->augmentation = "";
5305 fc->fde_encoding = 0;
5306 fc->ptr_size = eh_addr_size;
5307 fc->segment_size = 0;
5308 }
5309 else
5310 {
5311 fc->ncols = cie->ncols;
5312 fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
5313 fc->col_offset = (int *) xcmalloc (fc->ncols, sizeof (int));
5314 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
5315 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
5316 fc->augmentation = cie->augmentation;
5317 fc->ptr_size = cie->ptr_size;
5318 eh_addr_size = cie->ptr_size;
5319 fc->segment_size = cie->segment_size;
5320 fc->code_factor = cie->code_factor;
5321 fc->data_factor = cie->data_factor;
5322 fc->cfa_reg = cie->cfa_reg;
5323 fc->cfa_offset = cie->cfa_offset;
5324 fc->ra = cie->ra;
5325 frame_need_space (fc, max_regs - 1);
5326 fc->fde_encoding = cie->fde_encoding;
5327 }
5328
5329 if (fc->fde_encoding)
5330 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
5331
5332 segment_selector = 0;
5333 if (fc->segment_size)
5334 {
5335 SAFE_BYTE_GET_AND_INC (segment_selector, start, fc->segment_size, end);
5336 }
5337 fc->pc_begin = get_encoded_value (start, fc->fde_encoding, section);
5338 start += encoded_ptr_size;
5339
5340 /* FIXME: It appears that sometimes the final pc_range value is
5341 encoded in less than encoded_ptr_size bytes. See the x86_64
5342 run of the "objcopy on compressed debug sections" test for an
5343 example of this. */
5344 SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end);
5345
5346 if (cie->augmentation[0] == 'z')
5347 {
5348 augmentation_data_len = LEB ();
5349 augmentation_data = start;
5350 start += augmentation_data_len;
5351 }
5352
5353 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=",
5354 (unsigned long)(saved_start - section_start), length, cie_id,
5355 (unsigned long)(cie->chunk_start - section_start));
5356 if (fc->segment_size)
5357 printf ("%04lx:", segment_selector);
5358 printf ("%08lx..%08lx\n", fc->pc_begin, fc->pc_begin + fc->pc_range);
5359 if (! do_debug_frames_interp && augmentation_data_len)
5360 {
5361 unsigned long i;
5362
5363 printf (" Augmentation data: ");
5364 for (i = 0; i < augmentation_data_len; ++i)
5365 printf (" %02x", augmentation_data[i]);
5366 putchar ('\n');
5367 putchar ('\n');
5368 }
5369 }
5370
5371 /* At this point, fc is the current chunk, cie (if any) is set, and
5372 we're about to interpret instructions for the chunk. */
5373 /* ??? At present we need to do this always, since this sizes the
5374 fc->col_type and fc->col_offset arrays, which we write into always.
5375 We should probably split the interpreted and non-interpreted bits
5376 into two different routines, since there's so much that doesn't
5377 really overlap between them. */
5378 if (1 || do_debug_frames_interp)
5379 {
5380 /* Start by making a pass over the chunk, allocating storage
5381 and taking note of what registers are used. */
5382 unsigned char *tmp = start;
5383
5384 while (start < block_end)
5385 {
5386 unsigned op, opa;
5387 unsigned long reg, temp;
5388
5389 op = *start++;
5390 opa = op & 0x3f;
5391 if (op & 0xc0)
5392 op &= 0xc0;
5393
5394 /* Warning: if you add any more cases to this switch, be
5395 sure to add them to the corresponding switch below. */
5396 switch (op)
5397 {
5398 case DW_CFA_advance_loc:
5399 break;
5400 case DW_CFA_offset:
5401 LEB ();
5402 if (frame_need_space (fc, opa) >= 0)
5403 fc->col_type[opa] = DW_CFA_undefined;
5404 break;
5405 case DW_CFA_restore:
5406 if (frame_need_space (fc, opa) >= 0)
5407 fc->col_type[opa] = DW_CFA_undefined;
5408 break;
5409 case DW_CFA_set_loc:
5410 start += encoded_ptr_size;
5411 break;
5412 case DW_CFA_advance_loc1:
5413 start += 1;
5414 break;
5415 case DW_CFA_advance_loc2:
5416 start += 2;
5417 break;
5418 case DW_CFA_advance_loc4:
5419 start += 4;
5420 break;
5421 case DW_CFA_offset_extended:
5422 case DW_CFA_val_offset:
5423 reg = LEB (); LEB ();
5424 if (frame_need_space (fc, reg) >= 0)
5425 fc->col_type[reg] = DW_CFA_undefined;
5426 break;
5427 case DW_CFA_restore_extended:
5428 reg = LEB ();
5429 frame_need_space (fc, reg);
5430 if (frame_need_space (fc, reg) >= 0)
5431 fc->col_type[reg] = DW_CFA_undefined;
5432 break;
5433 case DW_CFA_undefined:
5434 reg = LEB ();
5435 if (frame_need_space (fc, reg) >= 0)
5436 fc->col_type[reg] = DW_CFA_undefined;
5437 break;
5438 case DW_CFA_same_value:
5439 reg = LEB ();
5440 if (frame_need_space (fc, reg) >= 0)
5441 fc->col_type[reg] = DW_CFA_undefined;
5442 break;
5443 case DW_CFA_register:
5444 reg = LEB (); LEB ();
5445 if (frame_need_space (fc, reg) >= 0)
5446 fc->col_type[reg] = DW_CFA_undefined;
5447 break;
5448 case DW_CFA_def_cfa:
5449 LEB (); LEB ();
5450 break;
5451 case DW_CFA_def_cfa_register:
5452 LEB ();
5453 break;
5454 case DW_CFA_def_cfa_offset:
5455 LEB ();
5456 break;
5457 case DW_CFA_def_cfa_expression:
5458 temp = LEB ();
5459 start += temp;
5460 break;
5461 case DW_CFA_expression:
5462 case DW_CFA_val_expression:
5463 reg = LEB ();
5464 temp = LEB ();
5465 start += temp;
5466 if (frame_need_space (fc, reg) >= 0)
5467 fc->col_type[reg] = DW_CFA_undefined;
5468 break;
5469 case DW_CFA_offset_extended_sf:
5470 case DW_CFA_val_offset_sf:
5471 reg = LEB (); SLEB ();
5472 if (frame_need_space (fc, reg) >= 0)
5473 fc->col_type[reg] = DW_CFA_undefined;
5474 break;
5475 case DW_CFA_def_cfa_sf:
5476 LEB (); SLEB ();
5477 break;
5478 case DW_CFA_def_cfa_offset_sf:
5479 SLEB ();
5480 break;
5481 case DW_CFA_MIPS_advance_loc8:
5482 start += 8;
5483 break;
5484 case DW_CFA_GNU_args_size:
5485 LEB ();
5486 break;
5487 case DW_CFA_GNU_negative_offset_extended:
5488 reg = LEB (); LEB ();
5489 if (frame_need_space (fc, reg) >= 0)
5490 fc->col_type[reg] = DW_CFA_undefined;
5491 break;
5492 default:
5493 break;
5494 }
5495 }
5496 start = tmp;
5497 }
5498
5499 /* Now we know what registers are used, make a second pass over
5500 the chunk, this time actually printing out the info. */
5501
5502 while (start < block_end)
5503 {
5504 unsigned op, opa;
5505 unsigned long ul, reg, roffs;
5506 long l, ofs;
5507 dwarf_vma vma;
5508 const char *reg_prefix = "";
5509
5510 op = *start++;
5511 opa = op & 0x3f;
5512 if (op & 0xc0)
5513 op &= 0xc0;
5514
5515 /* Warning: if you add any more cases to this switch, be
5516 sure to add them to the corresponding switch above. */
5517 switch (op)
5518 {
5519 case DW_CFA_advance_loc:
5520 if (do_debug_frames_interp)
5521 frame_display_row (fc, &need_col_headers, &max_regs);
5522 else
5523 printf (" DW_CFA_advance_loc: %d to %08lx\n",
5524 opa * fc->code_factor,
5525 fc->pc_begin + opa * fc->code_factor);
5526 fc->pc_begin += opa * fc->code_factor;
5527 break;
5528
5529 case DW_CFA_offset:
5530 roffs = LEB ();
5531 if (opa >= (unsigned int) fc->ncols)
5532 reg_prefix = bad_reg;
5533 if (! do_debug_frames_interp || *reg_prefix != '\0')
5534 printf (" DW_CFA_offset: %s%s at cfa%+ld\n",
5535 reg_prefix, regname (opa, 0),
5536 roffs * fc->data_factor);
5537 if (*reg_prefix == '\0')
5538 {
5539 fc->col_type[opa] = DW_CFA_offset;
5540 fc->col_offset[opa] = roffs * fc->data_factor;
5541 }
5542 break;
5543
5544 case DW_CFA_restore:
5545 if (opa >= (unsigned int) cie->ncols
5546 || opa >= (unsigned int) fc->ncols)
5547 reg_prefix = bad_reg;
5548 if (! do_debug_frames_interp || *reg_prefix != '\0')
5549 printf (" DW_CFA_restore: %s%s\n",
5550 reg_prefix, regname (opa, 0));
5551 if (*reg_prefix == '\0')
5552 {
5553 fc->col_type[opa] = cie->col_type[opa];
5554 fc->col_offset[opa] = cie->col_offset[opa];
5555 if (do_debug_frames_interp
5556 && fc->col_type[opa] == DW_CFA_unreferenced)
5557 fc->col_type[opa] = DW_CFA_undefined;
5558 }
5559 break;
5560
5561 case DW_CFA_set_loc:
5562 vma = get_encoded_value (start, fc->fde_encoding, section);
5563 start += encoded_ptr_size;
5564 if (do_debug_frames_interp)
5565 frame_display_row (fc, &need_col_headers, &max_regs);
5566 else
5567 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
5568 fc->pc_begin = vma;
5569 break;
5570
5571 case DW_CFA_advance_loc1:
5572 SAFE_BYTE_GET_AND_INC (ofs, start, 1, end);
5573 if (do_debug_frames_interp)
5574 frame_display_row (fc, &need_col_headers, &max_regs);
5575 else
5576 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
5577 ofs * fc->code_factor,
5578 fc->pc_begin + ofs * fc->code_factor);
5579 fc->pc_begin += ofs * fc->code_factor;
5580 break;
5581
5582 case DW_CFA_advance_loc2:
5583 SAFE_BYTE_GET_AND_INC (ofs, start, 2, end);
5584 if (do_debug_frames_interp)
5585 frame_display_row (fc, &need_col_headers, &max_regs);
5586 else
5587 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
5588 ofs * fc->code_factor,
5589 fc->pc_begin + ofs * fc->code_factor);
5590 fc->pc_begin += ofs * fc->code_factor;
5591 break;
5592
5593 case DW_CFA_advance_loc4:
5594 SAFE_BYTE_GET_AND_INC (ofs, start, 4, end);
5595 if (do_debug_frames_interp)
5596 frame_display_row (fc, &need_col_headers, &max_regs);
5597 else
5598 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
5599 ofs * fc->code_factor,
5600 fc->pc_begin + ofs * fc->code_factor);
5601 fc->pc_begin += ofs * fc->code_factor;
5602 break;
5603
5604 case DW_CFA_offset_extended:
5605 reg = LEB ();
5606 roffs = LEB ();
5607 if (reg >= (unsigned int) fc->ncols)
5608 reg_prefix = bad_reg;
5609 if (! do_debug_frames_interp || *reg_prefix != '\0')
5610 printf (" DW_CFA_offset_extended: %s%s at cfa%+ld\n",
5611 reg_prefix, regname (reg, 0),
5612 roffs * fc->data_factor);
5613 if (*reg_prefix == '\0')
5614 {
5615 fc->col_type[reg] = DW_CFA_offset;
5616 fc->col_offset[reg] = roffs * fc->data_factor;
5617 }
5618 break;
5619
5620 case DW_CFA_val_offset:
5621 reg = LEB ();
5622 roffs = LEB ();
5623 if (reg >= (unsigned int) fc->ncols)
5624 reg_prefix = bad_reg;
5625 if (! do_debug_frames_interp || *reg_prefix != '\0')
5626 printf (" DW_CFA_val_offset: %s%s at cfa%+ld\n",
5627 reg_prefix, regname (reg, 0),
5628 roffs * fc->data_factor);
5629 if (*reg_prefix == '\0')
5630 {
5631 fc->col_type[reg] = DW_CFA_val_offset;
5632 fc->col_offset[reg] = roffs * fc->data_factor;
5633 }
5634 break;
5635
5636 case DW_CFA_restore_extended:
5637 reg = LEB ();
5638 if (reg >= (unsigned int) cie->ncols
5639 || reg >= (unsigned int) fc->ncols)
5640 reg_prefix = bad_reg;
5641 if (! do_debug_frames_interp || *reg_prefix != '\0')
5642 printf (" DW_CFA_restore_extended: %s%s\n",
5643 reg_prefix, regname (reg, 0));
5644 if (*reg_prefix == '\0')
5645 {
5646 fc->col_type[reg] = cie->col_type[reg];
5647 fc->col_offset[reg] = cie->col_offset[reg];
5648 }
5649 break;
5650
5651 case DW_CFA_undefined:
5652 reg = LEB ();
5653 if (reg >= (unsigned int) fc->ncols)
5654 reg_prefix = bad_reg;
5655 if (! do_debug_frames_interp || *reg_prefix != '\0')
5656 printf (" DW_CFA_undefined: %s%s\n",
5657 reg_prefix, regname (reg, 0));
5658 if (*reg_prefix == '\0')
5659 {
5660 fc->col_type[reg] = DW_CFA_undefined;
5661 fc->col_offset[reg] = 0;
5662 }
5663 break;
5664
5665 case DW_CFA_same_value:
5666 reg = LEB ();
5667 if (reg >= (unsigned int) fc->ncols)
5668 reg_prefix = bad_reg;
5669 if (! do_debug_frames_interp || *reg_prefix != '\0')
5670 printf (" DW_CFA_same_value: %s%s\n",
5671 reg_prefix, regname (reg, 0));
5672 if (*reg_prefix == '\0')
5673 {
5674 fc->col_type[reg] = DW_CFA_same_value;
5675 fc->col_offset[reg] = 0;
5676 }
5677 break;
5678
5679 case DW_CFA_register:
5680 reg = LEB ();
5681 roffs = LEB ();
5682 if (reg >= (unsigned int) fc->ncols)
5683 reg_prefix = bad_reg;
5684 if (! do_debug_frames_interp || *reg_prefix != '\0')
5685 {
5686 printf (" DW_CFA_register: %s%s in ",
5687 reg_prefix, regname (reg, 0));
5688 puts (regname (roffs, 0));
5689 }
5690 if (*reg_prefix == '\0')
5691 {
5692 fc->col_type[reg] = DW_CFA_register;
5693 fc->col_offset[reg] = roffs;
5694 }
5695 break;
5696
5697 case DW_CFA_remember_state:
5698 if (! do_debug_frames_interp)
5699 printf (" DW_CFA_remember_state\n");
5700 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
5701 rs->ncols = fc->ncols;
5702 rs->col_type = (short int *) xcmalloc (rs->ncols,
5703 sizeof (short int));
5704 rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (int));
5705 memcpy (rs->col_type, fc->col_type, rs->ncols);
5706 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
5707 rs->next = remembered_state;
5708 remembered_state = rs;
5709 break;
5710
5711 case DW_CFA_restore_state:
5712 if (! do_debug_frames_interp)
5713 printf (" DW_CFA_restore_state\n");
5714 rs = remembered_state;
5715 if (rs)
5716 {
5717 remembered_state = rs->next;
5718 frame_need_space (fc, rs->ncols - 1);
5719 memcpy (fc->col_type, rs->col_type, rs->ncols);
5720 memcpy (fc->col_offset, rs->col_offset,
5721 rs->ncols * sizeof (int));
5722 free (rs->col_type);
5723 free (rs->col_offset);
5724 free (rs);
5725 }
5726 else if (do_debug_frames_interp)
5727 printf ("Mismatched DW_CFA_restore_state\n");
5728 break;
5729
5730 case DW_CFA_def_cfa:
5731 fc->cfa_reg = LEB ();
5732 fc->cfa_offset = LEB ();
5733 fc->cfa_exp = 0;
5734 if (! do_debug_frames_interp)
5735 printf (" DW_CFA_def_cfa: %s ofs %d\n",
5736 regname (fc->cfa_reg, 0), fc->cfa_offset);
5737 break;
5738
5739 case DW_CFA_def_cfa_register:
5740 fc->cfa_reg = LEB ();
5741 fc->cfa_exp = 0;
5742 if (! do_debug_frames_interp)
5743 printf (" DW_CFA_def_cfa_register: %s\n",
5744 regname (fc->cfa_reg, 0));
5745 break;
5746
5747 case DW_CFA_def_cfa_offset:
5748 fc->cfa_offset = LEB ();
5749 if (! do_debug_frames_interp)
5750 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
5751 break;
5752
5753 case DW_CFA_nop:
5754 if (! do_debug_frames_interp)
5755 printf (" DW_CFA_nop\n");
5756 break;
5757
5758 case DW_CFA_def_cfa_expression:
5759 ul = LEB ();
5760 if (! do_debug_frames_interp)
5761 {
5762 printf (" DW_CFA_def_cfa_expression (");
5763 decode_location_expression (start, eh_addr_size, 0, -1,
5764 ul, 0, section);
5765 printf (")\n");
5766 }
5767 fc->cfa_exp = 1;
5768 start += ul;
5769 break;
5770
5771 case DW_CFA_expression:
5772 reg = LEB ();
5773 ul = LEB ();
5774 if (reg >= (unsigned int) fc->ncols)
5775 reg_prefix = bad_reg;
5776 if (! do_debug_frames_interp || *reg_prefix != '\0')
5777 {
5778 printf (" DW_CFA_expression: %s%s (",
5779 reg_prefix, regname (reg, 0));
5780 decode_location_expression (start, eh_addr_size, 0, -1,
5781 ul, 0, section);
5782 printf (")\n");
5783 }
5784 if (*reg_prefix == '\0')
5785 fc->col_type[reg] = DW_CFA_expression;
5786 start += ul;
5787 break;
5788
5789 case DW_CFA_val_expression:
5790 reg = LEB ();
5791 ul = LEB ();
5792 if (reg >= (unsigned int) fc->ncols)
5793 reg_prefix = bad_reg;
5794 if (! do_debug_frames_interp || *reg_prefix != '\0')
5795 {
5796 printf (" DW_CFA_val_expression: %s%s (",
5797 reg_prefix, regname (reg, 0));
5798 decode_location_expression (start, eh_addr_size, 0, -1,
5799 ul, 0, section);
5800 printf (")\n");
5801 }
5802 if (*reg_prefix == '\0')
5803 fc->col_type[reg] = DW_CFA_val_expression;
5804 start += ul;
5805 break;
5806
5807 case DW_CFA_offset_extended_sf:
5808 reg = LEB ();
5809 l = SLEB ();
5810 if (frame_need_space (fc, reg) < 0)
5811 reg_prefix = bad_reg;
5812 if (! do_debug_frames_interp || *reg_prefix != '\0')
5813 printf (" DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
5814 reg_prefix, regname (reg, 0),
5815 l * fc->data_factor);
5816 if (*reg_prefix == '\0')
5817 {
5818 fc->col_type[reg] = DW_CFA_offset;
5819 fc->col_offset[reg] = l * fc->data_factor;
5820 }
5821 break;
5822
5823 case DW_CFA_val_offset_sf:
5824 reg = LEB ();
5825 l = SLEB ();
5826 if (frame_need_space (fc, reg) < 0)
5827 reg_prefix = bad_reg;
5828 if (! do_debug_frames_interp || *reg_prefix != '\0')
5829 printf (" DW_CFA_val_offset_sf: %s%s at cfa%+ld\n",
5830 reg_prefix, regname (reg, 0),
5831 l * fc->data_factor);
5832 if (*reg_prefix == '\0')
5833 {
5834 fc->col_type[reg] = DW_CFA_val_offset;
5835 fc->col_offset[reg] = l * fc->data_factor;
5836 }
5837 break;
5838
5839 case DW_CFA_def_cfa_sf:
5840 fc->cfa_reg = LEB ();
5841 fc->cfa_offset = SLEB ();
5842 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
5843 fc->cfa_exp = 0;
5844 if (! do_debug_frames_interp)
5845 printf (" DW_CFA_def_cfa_sf: %s ofs %d\n",
5846 regname (fc->cfa_reg, 0), fc->cfa_offset);
5847 break;
5848
5849 case DW_CFA_def_cfa_offset_sf:
5850 fc->cfa_offset = SLEB ();
5851 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
5852 if (! do_debug_frames_interp)
5853 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
5854 break;
5855
5856 case DW_CFA_MIPS_advance_loc8:
5857 SAFE_BYTE_GET_AND_INC (ofs, start, 8, end);
5858 if (do_debug_frames_interp)
5859 frame_display_row (fc, &need_col_headers, &max_regs);
5860 else
5861 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
5862 ofs * fc->code_factor,
5863 fc->pc_begin + ofs * fc->code_factor);
5864 fc->pc_begin += ofs * fc->code_factor;
5865 break;
5866
5867 case DW_CFA_GNU_window_save:
5868 if (! do_debug_frames_interp)
5869 printf (" DW_CFA_GNU_window_save\n");
5870 break;
5871
5872 case DW_CFA_GNU_args_size:
5873 ul = LEB ();
5874 if (! do_debug_frames_interp)
5875 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
5876 break;
5877
5878 case DW_CFA_GNU_negative_offset_extended:
5879 reg = LEB ();
5880 l = - LEB ();
5881 if (frame_need_space (fc, reg) < 0)
5882 reg_prefix = bad_reg;
5883 if (! do_debug_frames_interp || *reg_prefix != '\0')
5884 printf (" DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
5885 reg_prefix, regname (reg, 0),
5886 l * fc->data_factor);
5887 if (*reg_prefix == '\0')
5888 {
5889 fc->col_type[reg] = DW_CFA_offset;
5890 fc->col_offset[reg] = l * fc->data_factor;
5891 }
5892 break;
5893
5894 default:
5895 if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
5896 printf (_(" DW_CFA_??? (User defined call frame op: %#x)\n"), op);
5897 else
5898 warn (_("unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
5899 start = block_end;
5900 }
5901 }
5902
5903 if (do_debug_frames_interp)
5904 frame_display_row (fc, &need_col_headers, &max_regs);
5905
5906 start = block_end;
5907 eh_addr_size = saved_eh_addr_size;
5908 }
5909
5910 printf ("\n");
5911
5912 return 1;
5913 }
5914
5915 #undef GET
5916 #undef LEB
5917 #undef SLEB
5918
5919 static int
5920 display_gdb_index (struct dwarf_section *section,
5921 void *file ATTRIBUTE_UNUSED)
5922 {
5923 unsigned char *start = section->start;
5924 uint32_t version;
5925 uint32_t cu_list_offset, tu_list_offset;
5926 uint32_t address_table_offset, symbol_table_offset, constant_pool_offset;
5927 unsigned int cu_list_elements, tu_list_elements;
5928 unsigned int address_table_size, symbol_table_slots;
5929 unsigned char *cu_list, *tu_list;
5930 unsigned char *address_table, *symbol_table, *constant_pool;
5931 unsigned int i;
5932
5933 /* The documentation for the format of this file is in gdb/dwarf2read.c. */
5934
5935 printf (_("Contents of the %s section:\n"), section->name);
5936
5937 if (section->size < 6 * sizeof (uint32_t))
5938 {
5939 warn (_("Truncated header in the %s section.\n"), section->name);
5940 return 0;
5941 }
5942
5943 version = byte_get_little_endian (start, 4);
5944 printf (_("Version %ld\n"), (long) version);
5945
5946 /* Prior versions are obsolete, and future versions may not be
5947 backwards compatible. */
5948 if (version < 3 || version > 8)
5949 {
5950 warn (_("Unsupported version %lu.\n"), (unsigned long) version);
5951 return 0;
5952 }
5953 if (version < 4)
5954 warn (_("The address table data in version 3 may be wrong.\n"));
5955 if (version < 5)
5956 warn (_("Version 4 does not support case insensitive lookups.\n"));
5957 if (version < 6)
5958 warn (_("Version 5 does not include inlined functions.\n"));
5959 if (version < 7)
5960 warn (_("Version 6 does not include symbol attributes.\n"));
5961 /* Version 7 indices generated by Gold have bad type unit references,
5962 PR binutils/15021. But we don't know if the index was generated by
5963 Gold or not, so to avoid worrying users with gdb-generated indices
5964 we say nothing for version 7 here. */
5965
5966 cu_list_offset = byte_get_little_endian (start + 4, 4);
5967 tu_list_offset = byte_get_little_endian (start + 8, 4);
5968 address_table_offset = byte_get_little_endian (start + 12, 4);
5969 symbol_table_offset = byte_get_little_endian (start + 16, 4);
5970 constant_pool_offset = byte_get_little_endian (start + 20, 4);
5971
5972 if (cu_list_offset > section->size
5973 || tu_list_offset > section->size
5974 || address_table_offset > section->size
5975 || symbol_table_offset > section->size
5976 || constant_pool_offset > section->size)
5977 {
5978 warn (_("Corrupt header in the %s section.\n"), section->name);
5979 return 0;
5980 }
5981
5982 cu_list_elements = (tu_list_offset - cu_list_offset) / 8;
5983 tu_list_elements = (address_table_offset - tu_list_offset) / 8;
5984 address_table_size = symbol_table_offset - address_table_offset;
5985 symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8;
5986
5987 cu_list = start + cu_list_offset;
5988 tu_list = start + tu_list_offset;
5989 address_table = start + address_table_offset;
5990 symbol_table = start + symbol_table_offset;
5991 constant_pool = start + constant_pool_offset;
5992
5993 printf (_("\nCU table:\n"));
5994 for (i = 0; i < cu_list_elements; i += 2)
5995 {
5996 uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8);
5997 uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8);
5998
5999 printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2,
6000 (unsigned long) cu_offset,
6001 (unsigned long) (cu_offset + cu_length - 1));
6002 }
6003
6004 printf (_("\nTU table:\n"));
6005 for (i = 0; i < tu_list_elements; i += 3)
6006 {
6007 uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8);
6008 uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8);
6009 uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8);
6010
6011 printf (_("[%3u] 0x%lx 0x%lx "), i / 3,
6012 (unsigned long) tu_offset,
6013 (unsigned long) type_offset);
6014 print_dwarf_vma (signature, 8);
6015 printf ("\n");
6016 }
6017
6018 printf (_("\nAddress table:\n"));
6019 for (i = 0; i < address_table_size; i += 2 * 8 + 4)
6020 {
6021 uint64_t low = byte_get_little_endian (address_table + i, 8);
6022 uint64_t high = byte_get_little_endian (address_table + i + 8, 8);
6023 uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4);
6024
6025 print_dwarf_vma (low, 8);
6026 print_dwarf_vma (high, 8);
6027 printf (_("%lu\n"), (unsigned long) cu_index);
6028 }
6029
6030 printf (_("\nSymbol table:\n"));
6031 for (i = 0; i < symbol_table_slots; ++i)
6032 {
6033 uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4);
6034 uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4);
6035 uint32_t num_cus, cu;
6036
6037 if (name_offset != 0
6038 || cu_vector_offset != 0)
6039 {
6040 unsigned int j;
6041
6042 printf ("[%3u] %s:", i, constant_pool + name_offset);
6043 num_cus = byte_get_little_endian (constant_pool + cu_vector_offset, 4);
6044 if (num_cus > 1)
6045 printf ("\n");
6046 for (j = 0; j < num_cus; ++j)
6047 {
6048 int is_static;
6049 gdb_index_symbol_kind kind;
6050
6051 cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4);
6052 is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu);
6053 kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu);
6054 cu = GDB_INDEX_CU_VALUE (cu);
6055 /* Convert to TU number if it's for a type unit. */
6056 if (cu >= cu_list_elements / 2)
6057 printf ("%cT%lu", num_cus > 1 ? '\t' : ' ',
6058 (unsigned long) (cu - cu_list_elements / 2));
6059 else
6060 printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu);
6061
6062 switch (kind)
6063 {
6064 case GDB_INDEX_SYMBOL_KIND_NONE:
6065 printf (_(" [no symbol information]"));
6066 break;
6067 case GDB_INDEX_SYMBOL_KIND_TYPE:
6068 printf (is_static
6069 ? _(" [static type]")
6070 : _(" [global type]"));
6071 break;
6072 case GDB_INDEX_SYMBOL_KIND_VARIABLE:
6073 printf (is_static
6074 ? _(" [static variable]")
6075 : _(" [global variable]"));
6076 break;
6077 case GDB_INDEX_SYMBOL_KIND_FUNCTION:
6078 printf (is_static
6079 ? _(" [static function]")
6080 : _(" [global function]"));
6081 break;
6082 case GDB_INDEX_SYMBOL_KIND_OTHER:
6083 printf (is_static
6084 ? _(" [static other]")
6085 : _(" [global other]"));
6086 break;
6087 default:
6088 printf (is_static
6089 ? _(" [static unknown: %d]")
6090 : _(" [global unknown: %d]"),
6091 kind);
6092 break;
6093 }
6094 if (num_cus > 1)
6095 printf ("\n");
6096 }
6097 if (num_cus <= 1)
6098 printf ("\n");
6099 }
6100 }
6101
6102 return 1;
6103 }
6104
6105 /* Pre-allocate enough space for the CU/TU sets needed. */
6106
6107 static void
6108 prealloc_cu_tu_list (unsigned int nshndx)
6109 {
6110 if (shndx_pool == NULL)
6111 {
6112 shndx_pool_size = nshndx;
6113 shndx_pool_used = 0;
6114 shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size,
6115 sizeof (unsigned int));
6116 }
6117 else
6118 {
6119 shndx_pool_size = shndx_pool_used + nshndx;
6120 shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size,
6121 sizeof (unsigned int));
6122 }
6123 }
6124
6125 static void
6126 add_shndx_to_cu_tu_entry (unsigned int shndx)
6127 {
6128 if (shndx_pool_used >= shndx_pool_size)
6129 {
6130 error (_("Internal error: out of space in the shndx pool.\n"));
6131 return;
6132 }
6133 shndx_pool [shndx_pool_used++] = shndx;
6134 }
6135
6136 static void
6137 end_cu_tu_entry (void)
6138 {
6139 if (shndx_pool_used >= shndx_pool_size)
6140 {
6141 error (_("Internal error: out of space in the shndx pool.\n"));
6142 return;
6143 }
6144 shndx_pool [shndx_pool_used++] = 0;
6145 }
6146
6147 /* Return the short name of a DWARF section given by a DW_SECT enumerator. */
6148
6149 static const char *
6150 get_DW_SECT_short_name (unsigned int dw_sect)
6151 {
6152 static char buf[16];
6153
6154 switch (dw_sect)
6155 {
6156 case DW_SECT_INFO:
6157 return "info";
6158 case DW_SECT_TYPES:
6159 return "types";
6160 case DW_SECT_ABBREV:
6161 return "abbrev";
6162 case DW_SECT_LINE:
6163 return "line";
6164 case DW_SECT_LOC:
6165 return "loc";
6166 case DW_SECT_STR_OFFSETS:
6167 return "str_off";
6168 case DW_SECT_MACINFO:
6169 return "macinfo";
6170 case DW_SECT_MACRO:
6171 return "macro";
6172 default:
6173 break;
6174 }
6175
6176 snprintf (buf, sizeof (buf), "%d", dw_sect);
6177 return buf;
6178 }
6179
6180 /* Process a CU or TU index. If DO_DISPLAY is true, print the contents.
6181 These sections are extensions for Fission.
6182 See http://gcc.gnu.org/wiki/DebugFissionDWP. */
6183
6184 static int
6185 process_cu_tu_index (struct dwarf_section *section, int do_display)
6186 {
6187 unsigned char *phdr = section->start;
6188 unsigned char *limit = phdr + section->size;
6189 unsigned char *phash;
6190 unsigned char *pindex;
6191 unsigned char *ppool;
6192 unsigned int version;
6193 unsigned int ncols = 0;
6194 unsigned int nused;
6195 unsigned int nslots;
6196 unsigned int i;
6197 unsigned int j;
6198 dwarf_vma signature_high;
6199 dwarf_vma signature_low;
6200 char buf[64];
6201
6202 version = byte_get (phdr, 4);
6203 if (version >= 2)
6204 ncols = byte_get (phdr + 4, 4);
6205 nused = byte_get (phdr + 8, 4);
6206 nslots = byte_get (phdr + 12, 4);
6207 phash = phdr + 16;
6208 pindex = phash + nslots * 8;
6209 ppool = pindex + nslots * 4;
6210
6211 if (do_display)
6212 {
6213 printf (_("Contents of the %s section:\n\n"), section->name);
6214 printf (_(" Version: %d\n"), version);
6215 if (version >= 2)
6216 printf (_(" Number of columns: %d\n"), ncols);
6217 printf (_(" Number of used entries: %d\n"), nused);
6218 printf (_(" Number of slots: %d\n\n"), nslots);
6219 }
6220
6221 if (ppool > limit)
6222 {
6223 warn (_("Section %s too small for %d hash table entries\n"),
6224 section->name, nslots);
6225 return 0;
6226 }
6227
6228 if (version == 1)
6229 {
6230 if (!do_display)
6231 prealloc_cu_tu_list ((limit - ppool) / 4);
6232 for (i = 0; i < nslots; i++)
6233 {
6234 unsigned char *shndx_list;
6235 unsigned int shndx;
6236
6237 byte_get_64 (phash, &signature_high, &signature_low);
6238 if (signature_high != 0 || signature_low != 0)
6239 {
6240 j = byte_get (pindex, 4);
6241 shndx_list = ppool + j * 4;
6242 if (do_display)
6243 printf (_(" [%3d] Signature: 0x%s Sections: "),
6244 i, dwarf_vmatoa64 (signature_high, signature_low,
6245 buf, sizeof (buf)));
6246 for (;;)
6247 {
6248 if (shndx_list >= limit)
6249 {
6250 warn (_("Section %s too small for shndx pool\n"),
6251 section->name);
6252 return 0;
6253 }
6254 shndx = byte_get (shndx_list, 4);
6255 if (shndx == 0)
6256 break;
6257 if (do_display)
6258 printf (" %d", shndx);
6259 else
6260 add_shndx_to_cu_tu_entry (shndx);
6261 shndx_list += 4;
6262 }
6263 if (do_display)
6264 printf ("\n");
6265 else
6266 end_cu_tu_entry ();
6267 }
6268 phash += 8;
6269 pindex += 4;
6270 }
6271 }
6272 else if (version == 2)
6273 {
6274 unsigned int val;
6275 unsigned int dw_sect;
6276 unsigned char *ph = phash;
6277 unsigned char *pi = pindex;
6278 unsigned char *poffsets = ppool + ncols * 4;
6279 unsigned char *psizes = poffsets + nused * ncols * 4;
6280 unsigned char *pend = psizes + nused * ncols * 4;
6281 bfd_boolean is_tu_index;
6282 struct cu_tu_set *this_set = NULL;
6283 unsigned int row;
6284 unsigned char *prow;
6285
6286 is_tu_index = strcmp (section->name, ".debug_tu_index") == 0;
6287
6288 if (pend > limit)
6289 {
6290 warn (_("Section %s too small for offset and size tables\n"),
6291 section->name);
6292 return 0;
6293 }
6294
6295 if (do_display)
6296 {
6297 printf (_(" Offset table\n"));
6298 printf (" slot %-16s ",
6299 is_tu_index ? _("signature") : _("dwo_id"));
6300 }
6301 else
6302 {
6303 if (is_tu_index)
6304 {
6305 tu_count = nused;
6306 tu_sets = xcmalloc (nused, sizeof (struct cu_tu_set));
6307 this_set = tu_sets;
6308 }
6309 else
6310 {
6311 cu_count = nused;
6312 cu_sets = xcmalloc (nused, sizeof (struct cu_tu_set));
6313 this_set = cu_sets;
6314 }
6315 }
6316 if (do_display)
6317 {
6318 for (j = 0; j < ncols; j++)
6319 {
6320 dw_sect = byte_get (ppool + j * 4, 4);
6321 printf (" %8s", get_DW_SECT_short_name (dw_sect));
6322 }
6323 printf ("\n");
6324 }
6325 for (i = 0; i < nslots; i++)
6326 {
6327 byte_get_64 (ph, &signature_high, &signature_low);
6328 row = byte_get (pi, 4);
6329 if (row != 0)
6330 {
6331 if (!do_display)
6332 memcpy (&this_set[row - 1].signature, ph, sizeof (uint64_t));
6333 prow = poffsets + (row - 1) * ncols * 4;
6334 if (do_display)
6335 printf (_(" [%3d] 0x%s"),
6336 i, dwarf_vmatoa64 (signature_high, signature_low,
6337 buf, sizeof (buf)));
6338 for (j = 0; j < ncols; j++)
6339 {
6340 val = byte_get (prow + j * 4, 4);
6341 if (do_display)
6342 printf (" %8d", val);
6343 else
6344 {
6345 dw_sect = byte_get (ppool + j * 4, 4);
6346 this_set [row - 1].section_offsets [dw_sect] = val;
6347 }
6348 }
6349 if (do_display)
6350 printf ("\n");
6351 }
6352 ph += 8;
6353 pi += 4;
6354 }
6355
6356 ph = phash;
6357 pi = pindex;
6358 if (do_display)
6359 {
6360 printf ("\n");
6361 printf (_(" Size table\n"));
6362 printf (" slot %-16s ",
6363 is_tu_index ? _("signature") : _("dwo_id"));
6364 }
6365 for (j = 0; j < ncols; j++)
6366 {
6367 val = byte_get (ppool + j * 4, 4);
6368 if (do_display)
6369 printf (" %8s", get_DW_SECT_short_name (val));
6370 }
6371 if (do_display)
6372 printf ("\n");
6373 for (i = 0; i < nslots; i++)
6374 {
6375 byte_get_64 (ph, &signature_high, &signature_low);
6376 row = byte_get (pi, 4);
6377 if (row != 0)
6378 {
6379 prow = psizes + (row - 1) * ncols * 4;
6380 if (do_display)
6381 printf (_(" [%3d] 0x%s"),
6382 i, dwarf_vmatoa64 (signature_high, signature_low,
6383 buf, sizeof (buf)));
6384 for (j = 0; j < ncols; j++)
6385 {
6386 val = byte_get (prow + j * 4, 4);
6387 if (do_display)
6388 printf (" %8d", val);
6389 else
6390 {
6391 dw_sect = byte_get (ppool + j * 4, 4);
6392 this_set [row - 1].section_sizes [dw_sect] = val;
6393 }
6394 }
6395 if (do_display)
6396 printf ("\n");
6397 }
6398 ph += 8;
6399 pi += 4;
6400 }
6401 }
6402 else if (do_display)
6403 printf (_(" Unsupported version\n"));
6404
6405 if (do_display)
6406 printf ("\n");
6407
6408 return 1;
6409 }
6410
6411 /* Load the CU and TU indexes if present. This will build a list of
6412 section sets that we can use to associate a .debug_info.dwo section
6413 with its associated .debug_abbrev.dwo section in a .dwp file. */
6414
6415 static void
6416 load_cu_tu_indexes (void *file)
6417 {
6418 /* If we have already loaded (or tried to load) the CU and TU indexes
6419 then do not bother to repeat the task. */
6420 if (cu_tu_indexes_read)
6421 return;
6422
6423 if (load_debug_section (dwp_cu_index, file))
6424 process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0);
6425
6426 if (load_debug_section (dwp_tu_index, file))
6427 process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0);
6428
6429 cu_tu_indexes_read = 1;
6430 }
6431
6432 /* Find the set of sections that includes section SHNDX. */
6433
6434 unsigned int *
6435 find_cu_tu_set (void *file, unsigned int shndx)
6436 {
6437 unsigned int i;
6438
6439 load_cu_tu_indexes (file);
6440
6441 /* Find SHNDX in the shndx pool. */
6442 for (i = 0; i < shndx_pool_used; i++)
6443 if (shndx_pool [i] == shndx)
6444 break;
6445
6446 if (i >= shndx_pool_used)
6447 return NULL;
6448
6449 /* Now backup to find the first entry in the set. */
6450 while (i > 0 && shndx_pool [i - 1] != 0)
6451 i--;
6452
6453 return shndx_pool + i;
6454 }
6455
6456 /* Display a .debug_cu_index or .debug_tu_index section. */
6457
6458 static int
6459 display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
6460 {
6461 return process_cu_tu_index (section, 1);
6462 }
6463
6464 static int
6465 display_debug_not_supported (struct dwarf_section *section,
6466 void *file ATTRIBUTE_UNUSED)
6467 {
6468 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6469 section->name);
6470
6471 return 1;
6472 }
6473
6474 void *
6475 cmalloc (size_t nmemb, size_t size)
6476 {
6477 /* Check for overflow. */
6478 if (nmemb >= ~(size_t) 0 / size)
6479 return NULL;
6480 else
6481 return malloc (nmemb * size);
6482 }
6483
6484 void *
6485 xcmalloc (size_t nmemb, size_t size)
6486 {
6487 /* Check for overflow. */
6488 if (nmemb >= ~(size_t) 0 / size)
6489 return NULL;
6490 else
6491 return xmalloc (nmemb * size);
6492 }
6493
6494 void *
6495 xcrealloc (void *ptr, size_t nmemb, size_t size)
6496 {
6497 /* Check for overflow. */
6498 if (nmemb >= ~(size_t) 0 / size)
6499 return NULL;
6500 else
6501 return xrealloc (ptr, nmemb * size);
6502 }
6503
6504 void
6505 free_debug_memory (void)
6506 {
6507 unsigned int i;
6508
6509 free_abbrevs ();
6510
6511 for (i = 0; i < max; i++)
6512 free_debug_section ((enum dwarf_section_display_enum) i);
6513
6514 if (debug_information != NULL)
6515 {
6516 if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
6517 {
6518 for (i = 0; i < num_debug_info_entries; i++)
6519 {
6520 if (!debug_information [i].max_loc_offsets)
6521 {
6522 free (debug_information [i].loc_offsets);
6523 free (debug_information [i].have_frame_base);
6524 }
6525 if (!debug_information [i].max_range_lists)
6526 free (debug_information [i].range_lists);
6527 }
6528 }
6529
6530 free (debug_information);
6531 debug_information = NULL;
6532 num_debug_info_entries = 0;
6533 }
6534 }
6535
6536 void
6537 dwarf_select_sections_by_names (const char *names)
6538 {
6539 typedef struct
6540 {
6541 const char * option;
6542 int * variable;
6543 int val;
6544 }
6545 debug_dump_long_opts;
6546
6547 static const debug_dump_long_opts opts_table [] =
6548 {
6549 /* Please keep this table alpha- sorted. */
6550 { "Ranges", & do_debug_ranges, 1 },
6551 { "abbrev", & do_debug_abbrevs, 1 },
6552 { "addr", & do_debug_addr, 1 },
6553 { "aranges", & do_debug_aranges, 1 },
6554 { "cu_index", & do_debug_cu_index, 1 },
6555 { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
6556 { "frames", & do_debug_frames, 1 },
6557 { "frames-interp", & do_debug_frames_interp, 1 },
6558 /* The special .gdb_index section. */
6559 { "gdb_index", & do_gdb_index, 1 },
6560 { "info", & do_debug_info, 1 },
6561 { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility. */
6562 { "loc", & do_debug_loc, 1 },
6563 { "macro", & do_debug_macinfo, 1 },
6564 { "pubnames", & do_debug_pubnames, 1 },
6565 { "pubtypes", & do_debug_pubtypes, 1 },
6566 /* This entry is for compatability
6567 with earlier versions of readelf. */
6568 { "ranges", & do_debug_aranges, 1 },
6569 { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
6570 { "str", & do_debug_str, 1 },
6571 /* These trace_* sections are used by Itanium VMS. */
6572 { "trace_abbrev", & do_trace_abbrevs, 1 },
6573 { "trace_aranges", & do_trace_aranges, 1 },
6574 { "trace_info", & do_trace_info, 1 },
6575 { NULL, NULL, 0 }
6576 };
6577
6578 const char *p;
6579
6580 p = names;
6581 while (*p)
6582 {
6583 const debug_dump_long_opts * entry;
6584
6585 for (entry = opts_table; entry->option; entry++)
6586 {
6587 size_t len = strlen (entry->option);
6588
6589 if (strncmp (p, entry->option, len) == 0
6590 && (p[len] == ',' || p[len] == '\0'))
6591 {
6592 * entry->variable |= entry->val;
6593
6594 /* The --debug-dump=frames-interp option also
6595 enables the --debug-dump=frames option. */
6596 if (do_debug_frames_interp)
6597 do_debug_frames = 1;
6598
6599 p += len;
6600 break;
6601 }
6602 }
6603
6604 if (entry->option == NULL)
6605 {
6606 warn (_("Unrecognized debug option '%s'\n"), p);
6607 p = strchr (p, ',');
6608 if (p == NULL)
6609 break;
6610 }
6611
6612 if (*p == ',')
6613 p++;
6614 }
6615 }
6616
6617 void
6618 dwarf_select_sections_by_letters (const char *letters)
6619 {
6620 unsigned int lindex = 0;
6621
6622 while (letters[lindex])
6623 switch (letters[lindex++])
6624 {
6625 case 'i':
6626 do_debug_info = 1;
6627 break;
6628
6629 case 'a':
6630 do_debug_abbrevs = 1;
6631 break;
6632
6633 case 'l':
6634 do_debug_lines |= FLAG_DEBUG_LINES_RAW;
6635 break;
6636
6637 case 'L':
6638 do_debug_lines |= FLAG_DEBUG_LINES_DECODED;
6639 break;
6640
6641 case 'p':
6642 do_debug_pubnames = 1;
6643 break;
6644
6645 case 't':
6646 do_debug_pubtypes = 1;
6647 break;
6648
6649 case 'r':
6650 do_debug_aranges = 1;
6651 break;
6652
6653 case 'R':
6654 do_debug_ranges = 1;
6655 break;
6656
6657 case 'F':
6658 do_debug_frames_interp = 1;
6659 case 'f':
6660 do_debug_frames = 1;
6661 break;
6662
6663 case 'm':
6664 do_debug_macinfo = 1;
6665 break;
6666
6667 case 's':
6668 do_debug_str = 1;
6669 break;
6670
6671 case 'o':
6672 do_debug_loc = 1;
6673 break;
6674
6675 default:
6676 warn (_("Unrecognized debug option '%s'\n"), optarg);
6677 break;
6678 }
6679 }
6680
6681 void
6682 dwarf_select_sections_all (void)
6683 {
6684 do_debug_info = 1;
6685 do_debug_abbrevs = 1;
6686 do_debug_lines = FLAG_DEBUG_LINES_RAW;
6687 do_debug_pubnames = 1;
6688 do_debug_pubtypes = 1;
6689 do_debug_aranges = 1;
6690 do_debug_ranges = 1;
6691 do_debug_frames = 1;
6692 do_debug_macinfo = 1;
6693 do_debug_str = 1;
6694 do_debug_loc = 1;
6695 do_gdb_index = 1;
6696 do_trace_info = 1;
6697 do_trace_abbrevs = 1;
6698 do_trace_aranges = 1;
6699 do_debug_addr = 1;
6700 do_debug_cu_index = 1;
6701 }
6702
6703 struct dwarf_section_display debug_displays[] =
6704 {
6705 { { ".debug_abbrev", ".zdebug_abbrev", NULL, NULL, 0, 0, 0 },
6706 display_debug_abbrev, &do_debug_abbrevs, 0 },
6707 { { ".debug_aranges", ".zdebug_aranges", NULL, NULL, 0, 0, 0 },
6708 display_debug_aranges, &do_debug_aranges, 1 },
6709 { { ".debug_frame", ".zdebug_frame", NULL, NULL, 0, 0, 0 },
6710 display_debug_frames, &do_debug_frames, 1 },
6711 { { ".debug_info", ".zdebug_info", NULL, NULL, 0, 0, abbrev },
6712 display_debug_info, &do_debug_info, 1 },
6713 { { ".debug_line", ".zdebug_line", NULL, NULL, 0, 0, 0 },
6714 display_debug_lines, &do_debug_lines, 1 },
6715 { { ".debug_pubnames", ".zdebug_pubnames", NULL, NULL, 0, 0, 0 },
6716 display_debug_pubnames, &do_debug_pubnames, 0 },
6717 { { ".eh_frame", "", NULL, NULL, 0, 0, 0 },
6718 display_debug_frames, &do_debug_frames, 1 },
6719 { { ".debug_macinfo", ".zdebug_macinfo", NULL, NULL, 0, 0, 0 },
6720 display_debug_macinfo, &do_debug_macinfo, 0 },
6721 { { ".debug_macro", ".zdebug_macro", NULL, NULL, 0, 0, 0 },
6722 display_debug_macro, &do_debug_macinfo, 1 },
6723 { { ".debug_str", ".zdebug_str", NULL, NULL, 0, 0, 0 },
6724 display_debug_str, &do_debug_str, 0 },
6725 { { ".debug_loc", ".zdebug_loc", NULL, NULL, 0, 0, 0 },
6726 display_debug_loc, &do_debug_loc, 1 },
6727 { { ".debug_pubtypes", ".zdebug_pubtypes", NULL, NULL, 0, 0, 0 },
6728 display_debug_pubnames, &do_debug_pubtypes, 0 },
6729 { { ".debug_ranges", ".zdebug_ranges", NULL, NULL, 0, 0, 0 },
6730 display_debug_ranges, &do_debug_ranges, 1 },
6731 { { ".debug_static_func", ".zdebug_static_func", NULL, NULL, 0, 0, 0 },
6732 display_debug_not_supported, NULL, 0 },
6733 { { ".debug_static_vars", ".zdebug_static_vars", NULL, NULL, 0, 0, 0 },
6734 display_debug_not_supported, NULL, 0 },
6735 { { ".debug_types", ".zdebug_types", NULL, NULL, 0, 0, abbrev },
6736 display_debug_types, &do_debug_info, 1 },
6737 { { ".debug_weaknames", ".zdebug_weaknames", NULL, NULL, 0, 0, 0 },
6738 display_debug_not_supported, NULL, 0 },
6739 { { ".gdb_index", "", NULL, NULL, 0, 0, 0 },
6740 display_gdb_index, &do_gdb_index, 0 },
6741 { { ".trace_info", "", NULL, NULL, 0, 0, trace_abbrev },
6742 display_trace_info, &do_trace_info, 1 },
6743 { { ".trace_abbrev", "", NULL, NULL, 0, 0, 0 },
6744 display_debug_abbrev, &do_trace_abbrevs, 0 },
6745 { { ".trace_aranges", "", NULL, NULL, 0, 0, 0 },
6746 display_debug_aranges, &do_trace_aranges, 0 },
6747 { { ".debug_info.dwo", ".zdebug_info.dwo", NULL, NULL, 0, 0, abbrev_dwo },
6748 display_debug_info, &do_debug_info, 1 },
6749 { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", NULL, NULL, 0, 0, 0 },
6750 display_debug_abbrev, &do_debug_abbrevs, 0 },
6751 { { ".debug_types.dwo", ".zdebug_types.dwo", NULL, NULL, 0, 0, abbrev_dwo },
6752 display_debug_types, &do_debug_info, 1 },
6753 { { ".debug_line.dwo", ".zdebug_line.dwo", NULL, NULL, 0, 0, 0 },
6754 display_debug_lines, &do_debug_lines, 1 },
6755 { { ".debug_loc.dwo", ".zdebug_loc.dwo", NULL, NULL, 0, 0, 0 },
6756 display_debug_loc, &do_debug_loc, 1 },
6757 { { ".debug_macro.dwo", ".zdebug_macro.dwo", NULL, NULL, 0, 0, 0 },
6758 display_debug_macro, &do_debug_macinfo, 1 },
6759 { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NULL, NULL, 0, 0, 0 },
6760 display_debug_macinfo, &do_debug_macinfo, 0 },
6761 { { ".debug_str.dwo", ".zdebug_str.dwo", NULL, NULL, 0, 0, 0 },
6762 display_debug_str, &do_debug_str, 1 },
6763 { { ".debug_str_offsets", ".zdebug_str_offsets", NULL, NULL, 0, 0, 0 },
6764 display_debug_str_offsets, NULL, 0 },
6765 { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NULL, NULL, 0, 0, 0 },
6766 display_debug_str_offsets, NULL, 0 },
6767 { { ".debug_addr", ".zdebug_addr", NULL, NULL, 0, 0, 0 },
6768 display_debug_addr, &do_debug_addr, 1 },
6769 { { ".debug_cu_index", "", NULL, NULL, 0, 0, 0 },
6770 display_cu_index, &do_debug_cu_index, 0 },
6771 { { ".debug_tu_index", "", NULL, NULL, 0, 0, 0 },
6772 display_cu_index, &do_debug_cu_index, 0 },
6773 };