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