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