1 /* dwarf.c -- display DWARF contents of a BFD binary file
2 Copyright 2005, 2006, 2007
3 Free Software Foundation, Inc.
5 This file is part of GNU Binutils.
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.
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.
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
23 #include "libiberty.h"
26 #include "elf/dwarf2.h"
29 static int have_frame_base
;
30 static int need_base_address
;
32 static unsigned int last_pointer_size
= 0;
33 static int warned_about_missing_comp_units
= FALSE
;
35 static unsigned int num_debug_info_entries
= 0;
36 static debug_info
*debug_information
= NULL
;
38 dwarf_vma eh_addr_size
;
43 int do_debug_pubnames
;
47 int do_debug_frames_interp
;
52 dwarf_vma (*byte_get
) (unsigned char *, int);
55 byte_get_little_endian (unsigned char *field
, int size
)
63 return ((unsigned int) (field
[0]))
64 | (((unsigned int) (field
[1])) << 8);
67 return ((unsigned long) (field
[0]))
68 | (((unsigned long) (field
[1])) << 8)
69 | (((unsigned long) (field
[2])) << 16)
70 | (((unsigned long) (field
[3])) << 24);
73 if (sizeof (dwarf_vma
) == 8)
74 return ((dwarf_vma
) (field
[0]))
75 | (((dwarf_vma
) (field
[1])) << 8)
76 | (((dwarf_vma
) (field
[2])) << 16)
77 | (((dwarf_vma
) (field
[3])) << 24)
78 | (((dwarf_vma
) (field
[4])) << 32)
79 | (((dwarf_vma
) (field
[5])) << 40)
80 | (((dwarf_vma
) (field
[6])) << 48)
81 | (((dwarf_vma
) (field
[7])) << 56);
82 else if (sizeof (dwarf_vma
) == 4)
83 /* We want to extract data from an 8 byte wide field and
84 place it into a 4 byte wide field. Since this is a little
85 endian source we can just use the 4 byte extraction code. */
86 return ((unsigned long) (field
[0]))
87 | (((unsigned long) (field
[1])) << 8)
88 | (((unsigned long) (field
[2])) << 16)
89 | (((unsigned long) (field
[3])) << 24);
92 error (_("Unhandled data length: %d\n"), size
);
98 byte_get_big_endian (unsigned char *field
, int size
)
106 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
109 return ((unsigned long) (field
[3]))
110 | (((unsigned long) (field
[2])) << 8)
111 | (((unsigned long) (field
[1])) << 16)
112 | (((unsigned long) (field
[0])) << 24);
115 if (sizeof (dwarf_vma
) == 8)
116 return ((dwarf_vma
) (field
[7]))
117 | (((dwarf_vma
) (field
[6])) << 8)
118 | (((dwarf_vma
) (field
[5])) << 16)
119 | (((dwarf_vma
) (field
[4])) << 24)
120 | (((dwarf_vma
) (field
[3])) << 32)
121 | (((dwarf_vma
) (field
[2])) << 40)
122 | (((dwarf_vma
) (field
[1])) << 48)
123 | (((dwarf_vma
) (field
[0])) << 56);
124 else if (sizeof (dwarf_vma
) == 4)
126 /* Although we are extracing data from an 8 byte wide field,
127 we are returning only 4 bytes of data. */
129 return ((unsigned long) (field
[3]))
130 | (((unsigned long) (field
[2])) << 8)
131 | (((unsigned long) (field
[1])) << 16)
132 | (((unsigned long) (field
[0])) << 24);
136 error (_("Unhandled data length: %d\n"), size
);
142 byte_get_signed (unsigned char *field
, int size
)
144 dwarf_vma x
= byte_get (field
, size
);
149 return (x
^ 0x80) - 0x80;
151 return (x
^ 0x8000) - 0x8000;
153 return (x
^ 0x80000000) - 0x80000000;
161 static unsigned long int
162 read_leb128 (unsigned char *data
, unsigned int *length_return
, int sign
)
164 unsigned long int result
= 0;
165 unsigned int num_read
= 0;
166 unsigned int shift
= 0;
174 result
|= ((unsigned long int) (byte
& 0x7f)) << shift
;
181 if (length_return
!= NULL
)
182 *length_return
= num_read
;
184 if (sign
&& (shift
< 8 * sizeof (result
)) && (byte
& 0x40))
185 result
|= -1L << shift
;
190 typedef struct State_Machine_Registers
192 unsigned long address
;
199 /* This variable hold the number of the last entry seen
200 in the File Table. */
201 unsigned int last_file_entry
;
204 static SMR state_machine_regs
;
207 reset_state_machine (int is_stmt
)
209 state_machine_regs
.address
= 0;
210 state_machine_regs
.file
= 1;
211 state_machine_regs
.line
= 1;
212 state_machine_regs
.column
= 0;
213 state_machine_regs
.is_stmt
= is_stmt
;
214 state_machine_regs
.basic_block
= 0;
215 state_machine_regs
.end_sequence
= 0;
216 state_machine_regs
.last_file_entry
= 0;
219 /* Handled an extend line op.
220 Returns the number of bytes read. */
223 process_extended_line_op (unsigned char *data
, int is_stmt
)
225 unsigned char op_code
;
226 unsigned int bytes_read
;
231 len
= read_leb128 (data
, & bytes_read
, 0);
236 warn (_("badly formed extended line op encountered!\n"));
243 printf (_(" Extended opcode %d: "), op_code
);
247 case DW_LNE_end_sequence
:
248 printf (_("End of Sequence\n\n"));
249 reset_state_machine (is_stmt
);
252 case DW_LNE_set_address
:
253 adr
= byte_get (data
, len
- bytes_read
- 1);
254 printf (_("set Address to 0x%lx\n"), adr
);
255 state_machine_regs
.address
= adr
;
258 case DW_LNE_define_file
:
259 printf (_(" define new File Table entry\n"));
260 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
262 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
264 data
+= strlen ((char *) data
) + 1;
265 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
267 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
269 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
270 printf (_("%s\n\n"), name
);
274 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
282 fetch_indirect_string (unsigned long offset
)
284 struct dwarf_section
*section
= &debug_displays
[str
].section
;
286 if (section
->start
== NULL
)
287 return _("<no .debug_str section>");
289 /* DWARF sections under Mach-O have non-zero addresses. */
290 offset
-= section
->address
;
291 if (offset
> section
->size
)
293 warn (_("DW_FORM_strp offset too big: %lx\n"), offset
);
294 return _("<offset is too big>");
297 return (const char *) section
->start
+ offset
;
300 /* FIXME: There are better and more efficient ways to handle
301 these structures. For now though, I just want something that
302 is simple to implement. */
303 typedef struct abbrev_attr
305 unsigned long attribute
;
307 struct abbrev_attr
*next
;
311 typedef struct abbrev_entry
316 struct abbrev_attr
*first_attr
;
317 struct abbrev_attr
*last_attr
;
318 struct abbrev_entry
*next
;
322 static abbrev_entry
*first_abbrev
= NULL
;
323 static abbrev_entry
*last_abbrev
= NULL
;
328 abbrev_entry
*abbrev
;
330 for (abbrev
= first_abbrev
; abbrev
;)
332 abbrev_entry
*next
= abbrev
->next
;
335 for (attr
= abbrev
->first_attr
; attr
;)
337 abbrev_attr
*next
= attr
->next
;
347 last_abbrev
= first_abbrev
= NULL
;
351 add_abbrev (unsigned long number
, unsigned long tag
, int children
)
355 entry
= malloc (sizeof (*entry
));
361 entry
->entry
= number
;
363 entry
->children
= children
;
364 entry
->first_attr
= NULL
;
365 entry
->last_attr
= NULL
;
368 if (first_abbrev
== NULL
)
369 first_abbrev
= entry
;
371 last_abbrev
->next
= entry
;
377 add_abbrev_attr (unsigned long attribute
, unsigned long form
)
381 attr
= malloc (sizeof (*attr
));
387 attr
->attribute
= attribute
;
391 if (last_abbrev
->first_attr
== NULL
)
392 last_abbrev
->first_attr
= attr
;
394 last_abbrev
->last_attr
->next
= attr
;
396 last_abbrev
->last_attr
= attr
;
399 /* Processes the (partial) contents of a .debug_abbrev section.
400 Returns NULL if the end of the section was encountered.
401 Returns the address after the last byte read if the end of
402 an abbreviation set was found. */
404 static unsigned char *
405 process_abbrev_section (unsigned char *start
, unsigned char *end
)
407 if (first_abbrev
!= NULL
)
412 unsigned int bytes_read
;
415 unsigned long attribute
;
418 entry
= read_leb128 (start
, & bytes_read
, 0);
421 /* A single zero is supposed to end the section according
422 to the standard. If there's more, then signal that to
425 return start
== end
? NULL
: start
;
427 tag
= read_leb128 (start
, & bytes_read
, 0);
432 add_abbrev (entry
, tag
, children
);
438 attribute
= read_leb128 (start
, & bytes_read
, 0);
441 form
= read_leb128 (start
, & bytes_read
, 0);
445 add_abbrev_attr (attribute
, form
);
447 while (attribute
!= 0);
454 get_TAG_name (unsigned long tag
)
458 case DW_TAG_padding
: return "DW_TAG_padding";
459 case DW_TAG_array_type
: return "DW_TAG_array_type";
460 case DW_TAG_class_type
: return "DW_TAG_class_type";
461 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
462 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
463 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
464 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
465 case DW_TAG_label
: return "DW_TAG_label";
466 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
467 case DW_TAG_member
: return "DW_TAG_member";
468 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
469 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
470 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
471 case DW_TAG_string_type
: return "DW_TAG_string_type";
472 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
473 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
474 case DW_TAG_typedef
: return "DW_TAG_typedef";
475 case DW_TAG_union_type
: return "DW_TAG_union_type";
476 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
477 case DW_TAG_variant
: return "DW_TAG_variant";
478 case DW_TAG_common_block
: return "DW_TAG_common_block";
479 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
480 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
481 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
482 case DW_TAG_module
: return "DW_TAG_module";
483 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
484 case DW_TAG_set_type
: return "DW_TAG_set_type";
485 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
486 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
487 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
488 case DW_TAG_base_type
: return "DW_TAG_base_type";
489 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
490 case DW_TAG_const_type
: return "DW_TAG_const_type";
491 case DW_TAG_constant
: return "DW_TAG_constant";
492 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
493 case DW_TAG_file_type
: return "DW_TAG_file_type";
494 case DW_TAG_friend
: return "DW_TAG_friend";
495 case DW_TAG_namelist
: return "DW_TAG_namelist";
496 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
497 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
498 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
499 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
500 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
501 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
502 case DW_TAG_try_block
: return "DW_TAG_try_block";
503 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
504 case DW_TAG_variable
: return "DW_TAG_variable";
505 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
506 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
507 case DW_TAG_format_label
: return "DW_TAG_format_label";
508 case DW_TAG_function_template
: return "DW_TAG_function_template";
509 case DW_TAG_class_template
: return "DW_TAG_class_template";
510 /* DWARF 2.1 values. */
511 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
512 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
513 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
514 case DW_TAG_namespace
: return "DW_TAG_namespace";
515 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
516 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
517 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
518 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
520 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
521 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
522 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
525 static char buffer
[100];
527 snprintf (buffer
, sizeof (buffer
), _("Unknown TAG value: %lx"), tag
);
534 get_FORM_name (unsigned long form
)
538 case DW_FORM_addr
: return "DW_FORM_addr";
539 case DW_FORM_block2
: return "DW_FORM_block2";
540 case DW_FORM_block4
: return "DW_FORM_block4";
541 case DW_FORM_data2
: return "DW_FORM_data2";
542 case DW_FORM_data4
: return "DW_FORM_data4";
543 case DW_FORM_data8
: return "DW_FORM_data8";
544 case DW_FORM_string
: return "DW_FORM_string";
545 case DW_FORM_block
: return "DW_FORM_block";
546 case DW_FORM_block1
: return "DW_FORM_block1";
547 case DW_FORM_data1
: return "DW_FORM_data1";
548 case DW_FORM_flag
: return "DW_FORM_flag";
549 case DW_FORM_sdata
: return "DW_FORM_sdata";
550 case DW_FORM_strp
: return "DW_FORM_strp";
551 case DW_FORM_udata
: return "DW_FORM_udata";
552 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
553 case DW_FORM_ref1
: return "DW_FORM_ref1";
554 case DW_FORM_ref2
: return "DW_FORM_ref2";
555 case DW_FORM_ref4
: return "DW_FORM_ref4";
556 case DW_FORM_ref8
: return "DW_FORM_ref8";
557 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
558 case DW_FORM_indirect
: return "DW_FORM_indirect";
561 static char buffer
[100];
563 snprintf (buffer
, sizeof (buffer
), _("Unknown FORM value: %lx"), form
);
569 static unsigned char *
570 display_block (unsigned char *data
, unsigned long length
)
572 printf (_(" %lu byte block: "), length
);
575 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
581 decode_location_expression (unsigned char * data
,
582 unsigned int pointer_size
,
583 unsigned long length
,
584 unsigned long cu_offset
)
587 unsigned int bytes_read
;
588 unsigned long uvalue
;
589 unsigned char *end
= data
+ length
;
590 int need_frame_base
= 0;
599 printf ("DW_OP_addr: %lx",
600 (unsigned long) byte_get (data
, pointer_size
));
601 data
+= pointer_size
;
604 printf ("DW_OP_deref");
607 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
610 printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data
++, 1));
613 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
617 printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data
, 2));
621 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
625 printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data
, 4));
629 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
630 (unsigned long) byte_get (data
+ 4, 4));
634 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
635 (long) byte_get (data
+ 4, 4));
639 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
643 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
647 printf ("DW_OP_dup");
650 printf ("DW_OP_drop");
653 printf ("DW_OP_over");
656 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
659 printf ("DW_OP_swap");
662 printf ("DW_OP_rot");
665 printf ("DW_OP_xderef");
668 printf ("DW_OP_abs");
671 printf ("DW_OP_and");
674 printf ("DW_OP_div");
677 printf ("DW_OP_minus");
680 printf ("DW_OP_mod");
683 printf ("DW_OP_mul");
686 printf ("DW_OP_neg");
689 printf ("DW_OP_not");
695 printf ("DW_OP_plus");
697 case DW_OP_plus_uconst
:
698 printf ("DW_OP_plus_uconst: %lu",
699 read_leb128 (data
, &bytes_read
, 0));
703 printf ("DW_OP_shl");
706 printf ("DW_OP_shr");
709 printf ("DW_OP_shra");
712 printf ("DW_OP_xor");
715 printf ("DW_OP_bra: %ld", (long) byte_get_signed (data
, 2));
737 printf ("DW_OP_skip: %ld", (long) byte_get_signed (data
, 2));
773 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
808 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
843 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
844 read_leb128 (data
, &bytes_read
, 1));
849 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
854 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
858 uvalue
= read_leb128 (data
, &bytes_read
, 0);
860 printf ("DW_OP_bregx: %lu %ld", uvalue
,
861 read_leb128 (data
, &bytes_read
, 1));
865 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
868 case DW_OP_deref_size
:
869 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
871 case DW_OP_xderef_size
:
872 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
875 printf ("DW_OP_nop");
878 /* DWARF 3 extensions. */
879 case DW_OP_push_object_address
:
880 printf ("DW_OP_push_object_address");
883 /* XXX: Strictly speaking for 64-bit DWARF3 files
884 this ought to be an 8-byte wide computation. */
885 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2) + cu_offset
);
889 /* XXX: Strictly speaking for 64-bit DWARF3 files
890 this ought to be an 8-byte wide computation. */
891 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4) + cu_offset
);
895 printf ("DW_OP_call_ref");
897 case DW_OP_form_tls_address
:
898 printf ("DW_OP_form_tls_address");
901 /* GNU extensions. */
902 case DW_OP_GNU_push_tls_address
:
903 printf ("DW_OP_GNU_push_tls_address");
907 if (op
>= DW_OP_lo_user
908 && op
<= DW_OP_hi_user
)
909 printf (_("(User defined location op)"));
911 printf (_("(Unknown location op)"));
912 /* No way to tell where the next op is, so just bail. */
913 return need_frame_base
;
916 /* Separate the ops. */
921 return need_frame_base
;
924 static unsigned char *
925 read_and_display_attr_value (unsigned long attribute
,
928 unsigned long cu_offset
,
929 unsigned long pointer_size
,
930 unsigned long offset_size
,
932 debug_info
*debug_info_p
,
935 unsigned long uvalue
= 0;
936 unsigned char *block_start
= NULL
;
937 unsigned int bytes_read
;
944 case DW_FORM_ref_addr
:
945 if (dwarf_version
== 2)
947 uvalue
= byte_get (data
, pointer_size
);
948 data
+= pointer_size
;
950 else if (dwarf_version
== 3)
952 uvalue
= byte_get (data
, offset_size
);
957 error (_("Internal error: DWARF version is not 2 or 3.\n"));
962 uvalue
= byte_get (data
, pointer_size
);
963 data
+= pointer_size
;
967 uvalue
= byte_get (data
, offset_size
);
974 uvalue
= byte_get (data
++, 1);
979 uvalue
= byte_get (data
, 2);
985 uvalue
= byte_get (data
, 4);
990 uvalue
= read_leb128 (data
, & bytes_read
, 1);
994 case DW_FORM_ref_udata
:
996 uvalue
= read_leb128 (data
, & bytes_read
, 0);
1000 case DW_FORM_indirect
:
1001 form
= read_leb128 (data
, & bytes_read
, 0);
1004 printf (" %s", get_FORM_name (form
));
1005 return read_and_display_attr_value (attribute
, form
, data
,
1006 cu_offset
, pointer_size
,
1007 offset_size
, dwarf_version
,
1008 debug_info_p
, do_loc
);
1013 case DW_FORM_ref_addr
:
1015 printf (" <#%lx>", uvalue
);
1021 case DW_FORM_ref_udata
:
1023 printf (" <%lx>", uvalue
+ cu_offset
);
1029 printf (" %#lx", uvalue
);
1038 printf (" %ld", uvalue
);
1045 uvalue
= byte_get (data
, 4);
1046 printf (" %lx", uvalue
);
1047 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
1049 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
1050 && num_debug_info_entries
== 0)
1052 if (sizeof (uvalue
) == 8)
1053 uvalue
= byte_get (data
, 8);
1055 error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
1060 case DW_FORM_string
:
1062 printf (" %s", data
);
1063 data
+= strlen ((char *) data
) + 1;
1067 uvalue
= read_leb128 (data
, & bytes_read
, 0);
1068 block_start
= data
+ bytes_read
;
1070 data
= block_start
+ uvalue
;
1072 data
= display_block (block_start
, uvalue
);
1075 case DW_FORM_block1
:
1076 uvalue
= byte_get (data
, 1);
1077 block_start
= data
+ 1;
1079 data
= block_start
+ uvalue
;
1081 data
= display_block (block_start
, uvalue
);
1084 case DW_FORM_block2
:
1085 uvalue
= byte_get (data
, 2);
1086 block_start
= data
+ 2;
1088 data
= block_start
+ uvalue
;
1090 data
= display_block (block_start
, uvalue
);
1093 case DW_FORM_block4
:
1094 uvalue
= byte_get (data
, 4);
1095 block_start
= data
+ 4;
1097 data
= block_start
+ uvalue
;
1099 data
= display_block (block_start
, uvalue
);
1104 printf (_(" (indirect string, offset: 0x%lx): %s"),
1105 uvalue
, fetch_indirect_string (uvalue
));
1108 case DW_FORM_indirect
:
1109 /* Handled above. */
1113 warn (_("Unrecognized form: %lu\n"), form
);
1117 /* For some attributes we can display further information. */
1118 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
1119 && num_debug_info_entries
== 0)
1123 case DW_AT_frame_base
:
1124 have_frame_base
= 1;
1125 case DW_AT_location
:
1126 case DW_AT_data_member_location
:
1127 case DW_AT_vtable_elem_location
:
1128 case DW_AT_allocated
:
1129 case DW_AT_associated
:
1130 case DW_AT_data_location
:
1132 case DW_AT_upper_bound
:
1133 case DW_AT_lower_bound
:
1134 if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
1136 /* Process location list. */
1137 unsigned int max
= debug_info_p
->max_loc_offsets
;
1138 unsigned int num
= debug_info_p
->num_loc_offsets
;
1140 if (max
== 0 || num
>= max
)
1143 debug_info_p
->loc_offsets
1144 = xcrealloc (debug_info_p
->loc_offsets
,
1145 max
, sizeof (*debug_info_p
->loc_offsets
));
1146 debug_info_p
->have_frame_base
1147 = xcrealloc (debug_info_p
->have_frame_base
,
1148 max
, sizeof (*debug_info_p
->have_frame_base
));
1149 debug_info_p
->max_loc_offsets
= max
;
1151 debug_info_p
->loc_offsets
[num
] = uvalue
;
1152 debug_info_p
->have_frame_base
[num
] = have_frame_base
;
1153 debug_info_p
->num_loc_offsets
++;
1158 if (need_base_address
)
1159 debug_info_p
->base_address
= uvalue
;
1163 if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
1165 /* Process range list. */
1166 unsigned int max
= debug_info_p
->max_range_lists
;
1167 unsigned int num
= debug_info_p
->num_range_lists
;
1169 if (max
== 0 || num
>= max
)
1172 debug_info_p
->range_lists
1173 = xcrealloc (debug_info_p
->range_lists
,
1174 max
, sizeof (*debug_info_p
->range_lists
));
1175 debug_info_p
->max_range_lists
= max
;
1177 debug_info_p
->range_lists
[num
] = uvalue
;
1178 debug_info_p
->num_range_lists
++;
1197 case DW_INL_not_inlined
:
1198 printf (_("(not inlined)"));
1200 case DW_INL_inlined
:
1201 printf (_("(inlined)"));
1203 case DW_INL_declared_not_inlined
:
1204 printf (_("(declared as inline but ignored)"));
1206 case DW_INL_declared_inlined
:
1207 printf (_("(declared as inline and inlined)"));
1210 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
1215 case DW_AT_language
:
1218 /* Ordered by the numeric value of these constants. */
1219 case DW_LANG_C89
: printf ("(ANSI C)"); break;
1220 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
1221 case DW_LANG_Ada83
: printf ("(Ada)"); break;
1222 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
1223 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
1224 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
1225 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
1226 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
1227 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
1228 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
1229 /* DWARF 2.1 values. */
1230 case DW_LANG_Java
: printf ("(Java)"); break;
1231 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
1232 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
1233 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
1234 /* DWARF 3 values. */
1235 case DW_LANG_PLI
: printf ("(PLI)"); break;
1236 case DW_LANG_ObjC
: printf ("(Objective C)"); break;
1237 case DW_LANG_ObjC_plus_plus
: printf ("(Objective C++)"); break;
1238 case DW_LANG_UPC
: printf ("(Unified Parallel C)"); break;
1239 case DW_LANG_D
: printf ("(D)"); break;
1240 /* MIPS extension. */
1241 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
1242 /* UPC extension. */
1243 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
1245 if (uvalue
>= DW_LANG_lo_user
&& uvalue
<= DW_LANG_hi_user
)
1246 printf ("(implementation defined: %lx)", uvalue
);
1248 printf ("(Unknown: %lx)", uvalue
);
1253 case DW_AT_encoding
:
1256 case DW_ATE_void
: printf ("(void)"); break;
1257 case DW_ATE_address
: printf ("(machine address)"); break;
1258 case DW_ATE_boolean
: printf ("(boolean)"); break;
1259 case DW_ATE_complex_float
: printf ("(complex float)"); break;
1260 case DW_ATE_float
: printf ("(float)"); break;
1261 case DW_ATE_signed
: printf ("(signed)"); break;
1262 case DW_ATE_signed_char
: printf ("(signed char)"); break;
1263 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
1264 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
1265 /* DWARF 2.1 value. */
1266 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
1267 case DW_ATE_decimal_float
: printf ("(decimal float)"); break;
1269 if (uvalue
>= DW_ATE_lo_user
1270 && uvalue
<= DW_ATE_hi_user
)
1271 printf ("(user defined type)");
1273 printf ("(unknown type)");
1278 case DW_AT_accessibility
:
1281 case DW_ACCESS_public
: printf ("(public)"); break;
1282 case DW_ACCESS_protected
: printf ("(protected)"); break;
1283 case DW_ACCESS_private
: printf ("(private)"); break;
1285 printf ("(unknown accessibility)");
1290 case DW_AT_visibility
:
1293 case DW_VIS_local
: printf ("(local)"); break;
1294 case DW_VIS_exported
: printf ("(exported)"); break;
1295 case DW_VIS_qualified
: printf ("(qualified)"); break;
1296 default: printf ("(unknown visibility)"); break;
1300 case DW_AT_virtuality
:
1303 case DW_VIRTUALITY_none
: printf ("(none)"); break;
1304 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
1305 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
1306 default: printf ("(unknown virtuality)"); break;
1310 case DW_AT_identifier_case
:
1313 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
1314 case DW_ID_up_case
: printf ("(up_case)"); break;
1315 case DW_ID_down_case
: printf ("(down_case)"); break;
1316 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
1317 default: printf ("(unknown case)"); break;
1321 case DW_AT_calling_convention
:
1324 case DW_CC_normal
: printf ("(normal)"); break;
1325 case DW_CC_program
: printf ("(program)"); break;
1326 case DW_CC_nocall
: printf ("(nocall)"); break;
1328 if (uvalue
>= DW_CC_lo_user
1329 && uvalue
<= DW_CC_hi_user
)
1330 printf ("(user defined)");
1332 printf ("(unknown convention)");
1336 case DW_AT_ordering
:
1339 case -1: printf ("(undefined)"); break;
1340 case 0: printf ("(row major)"); break;
1341 case 1: printf ("(column major)"); break;
1345 case DW_AT_frame_base
:
1346 have_frame_base
= 1;
1347 case DW_AT_location
:
1348 case DW_AT_data_member_location
:
1349 case DW_AT_vtable_elem_location
:
1350 case DW_AT_allocated
:
1351 case DW_AT_associated
:
1352 case DW_AT_data_location
:
1354 case DW_AT_upper_bound
:
1355 case DW_AT_lower_bound
:
1358 int need_frame_base
;
1361 need_frame_base
= decode_location_expression (block_start
,
1366 if (need_frame_base
&& !have_frame_base
)
1367 printf (_(" [without DW_AT_frame_base]"));
1369 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
1370 printf (_("(location list)"));
1382 get_AT_name (unsigned long attribute
)
1386 case DW_AT_sibling
: return "DW_AT_sibling";
1387 case DW_AT_location
: return "DW_AT_location";
1388 case DW_AT_name
: return "DW_AT_name";
1389 case DW_AT_ordering
: return "DW_AT_ordering";
1390 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
1391 case DW_AT_byte_size
: return "DW_AT_byte_size";
1392 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
1393 case DW_AT_bit_size
: return "DW_AT_bit_size";
1394 case DW_AT_element_list
: return "DW_AT_element_list";
1395 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
1396 case DW_AT_low_pc
: return "DW_AT_low_pc";
1397 case DW_AT_high_pc
: return "DW_AT_high_pc";
1398 case DW_AT_language
: return "DW_AT_language";
1399 case DW_AT_member
: return "DW_AT_member";
1400 case DW_AT_discr
: return "DW_AT_discr";
1401 case DW_AT_discr_value
: return "DW_AT_discr_value";
1402 case DW_AT_visibility
: return "DW_AT_visibility";
1403 case DW_AT_import
: return "DW_AT_import";
1404 case DW_AT_string_length
: return "DW_AT_string_length";
1405 case DW_AT_common_reference
: return "DW_AT_common_reference";
1406 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
1407 case DW_AT_const_value
: return "DW_AT_const_value";
1408 case DW_AT_containing_type
: return "DW_AT_containing_type";
1409 case DW_AT_default_value
: return "DW_AT_default_value";
1410 case DW_AT_inline
: return "DW_AT_inline";
1411 case DW_AT_is_optional
: return "DW_AT_is_optional";
1412 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
1413 case DW_AT_producer
: return "DW_AT_producer";
1414 case DW_AT_prototyped
: return "DW_AT_prototyped";
1415 case DW_AT_return_addr
: return "DW_AT_return_addr";
1416 case DW_AT_start_scope
: return "DW_AT_start_scope";
1417 case DW_AT_stride_size
: return "DW_AT_stride_size";
1418 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
1419 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
1420 case DW_AT_accessibility
: return "DW_AT_accessibility";
1421 case DW_AT_address_class
: return "DW_AT_address_class";
1422 case DW_AT_artificial
: return "DW_AT_artificial";
1423 case DW_AT_base_types
: return "DW_AT_base_types";
1424 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
1425 case DW_AT_count
: return "DW_AT_count";
1426 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
1427 case DW_AT_decl_column
: return "DW_AT_decl_column";
1428 case DW_AT_decl_file
: return "DW_AT_decl_file";
1429 case DW_AT_decl_line
: return "DW_AT_decl_line";
1430 case DW_AT_declaration
: return "DW_AT_declaration";
1431 case DW_AT_discr_list
: return "DW_AT_discr_list";
1432 case DW_AT_encoding
: return "DW_AT_encoding";
1433 case DW_AT_external
: return "DW_AT_external";
1434 case DW_AT_frame_base
: return "DW_AT_frame_base";
1435 case DW_AT_friend
: return "DW_AT_friend";
1436 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
1437 case DW_AT_macro_info
: return "DW_AT_macro_info";
1438 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
1439 case DW_AT_priority
: return "DW_AT_priority";
1440 case DW_AT_segment
: return "DW_AT_segment";
1441 case DW_AT_specification
: return "DW_AT_specification";
1442 case DW_AT_static_link
: return "DW_AT_static_link";
1443 case DW_AT_type
: return "DW_AT_type";
1444 case DW_AT_use_location
: return "DW_AT_use_location";
1445 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
1446 case DW_AT_virtuality
: return "DW_AT_virtuality";
1447 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
1448 /* DWARF 2.1 values. */
1449 case DW_AT_allocated
: return "DW_AT_allocated";
1450 case DW_AT_associated
: return "DW_AT_associated";
1451 case DW_AT_data_location
: return "DW_AT_data_location";
1452 case DW_AT_stride
: return "DW_AT_stride";
1453 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
1454 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
1455 case DW_AT_extension
: return "DW_AT_extension";
1456 case DW_AT_ranges
: return "DW_AT_ranges";
1457 case DW_AT_trampoline
: return "DW_AT_trampoline";
1458 case DW_AT_call_column
: return "DW_AT_call_column";
1459 case DW_AT_call_file
: return "DW_AT_call_file";
1460 case DW_AT_call_line
: return "DW_AT_call_line";
1461 /* SGI/MIPS extensions. */
1462 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
1463 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
1464 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
1465 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
1466 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
1467 case DW_AT_MIPS_software_pipeline_depth
:
1468 return "DW_AT_MIPS_software_pipeline_depth";
1469 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
1470 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
1471 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
1472 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
1473 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
1474 /* GNU extensions. */
1475 case DW_AT_sf_names
: return "DW_AT_sf_names";
1476 case DW_AT_src_info
: return "DW_AT_src_info";
1477 case DW_AT_mac_info
: return "DW_AT_mac_info";
1478 case DW_AT_src_coords
: return "DW_AT_src_coords";
1479 case DW_AT_body_begin
: return "DW_AT_body_begin";
1480 case DW_AT_body_end
: return "DW_AT_body_end";
1481 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
1482 /* UPC extension. */
1483 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
1486 static char buffer
[100];
1488 snprintf (buffer
, sizeof (buffer
), _("Unknown AT value: %lx"),
1495 static unsigned char *
1496 read_and_display_attr (unsigned long attribute
,
1498 unsigned char *data
,
1499 unsigned long cu_offset
,
1500 unsigned long pointer_size
,
1501 unsigned long offset_size
,
1503 debug_info
*debug_info_p
,
1507 printf (" %-18s:", get_AT_name (attribute
));
1508 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
1509 pointer_size
, offset_size
,
1510 dwarf_version
, debug_info_p
,
1518 /* Process the contents of a .debug_info section. If do_loc is non-zero
1519 then we are scanning for location lists and we do not want to display
1520 anything to the user. */
1523 process_debug_info (struct dwarf_section
*section
, void *file
,
1526 unsigned char *start
= section
->start
;
1527 unsigned char *end
= start
+ section
->size
;
1528 unsigned char *section_begin
;
1530 unsigned int num_units
= 0;
1532 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
1533 && num_debug_info_entries
== 0)
1535 unsigned long length
;
1537 /* First scan the section to get the number of comp units. */
1538 for (section_begin
= start
, num_units
= 0; section_begin
< end
;
1541 /* Read the first 4 bytes. For a 32-bit DWARF section, this
1542 will be the length. For a 64-bit DWARF section, it'll be
1543 the escape code 0xffffffff followed by an 8 byte length. */
1544 length
= byte_get (section_begin
, 4);
1546 if (length
== 0xffffffff)
1548 length
= byte_get (section_begin
+ 4, 8);
1549 section_begin
+= length
+ 12;
1552 section_begin
+= length
+ 4;
1554 /* Negative values are illegal, they may even cause infinite
1555 looping. This can happen if we can't accurately apply
1556 relocations to an object file. */
1557 if ((signed long) length
<= 0)
1559 warn (_("Corrupt unit length (%lx) found in section %s\n"), length
, section
->name
);
1566 error (_("No comp units in %s section ?"), section
->name
);
1570 /* Then allocate an array to hold the information. */
1571 debug_information
= cmalloc (num_units
,
1572 sizeof (* debug_information
));
1573 if (debug_information
== NULL
)
1575 error (_("Not enough memory for a debug info array of %u entries"),
1583 printf (_("The section %s contains:\n\n"), section
->name
);
1585 load_debug_section (str
, file
);
1588 load_debug_section (abbrev
, file
);
1589 if (debug_displays
[abbrev
].section
.start
== NULL
)
1591 warn (_("Unable to locate %s section!\n"),
1592 debug_displays
[abbrev
].section
.name
);
1596 for (section_begin
= start
, unit
= 0; start
< end
; unit
++)
1598 DWARF2_Internal_CompUnit compunit
;
1599 unsigned char *hdrptr
;
1600 unsigned char *cu_abbrev_offset_ptr
;
1601 unsigned char *tags
;
1603 unsigned long cu_offset
;
1605 int initial_length_size
;
1609 compunit
.cu_length
= byte_get (hdrptr
, 4);
1612 if (compunit
.cu_length
== 0xffffffff)
1614 compunit
.cu_length
= byte_get (hdrptr
, 8);
1617 initial_length_size
= 12;
1622 initial_length_size
= 4;
1625 compunit
.cu_version
= byte_get (hdrptr
, 2);
1628 cu_offset
= start
- section_begin
;
1630 cu_abbrev_offset_ptr
= hdrptr
;
1631 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
1632 hdrptr
+= offset_size
;
1634 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
1636 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
1637 && num_debug_info_entries
== 0)
1639 debug_information
[unit
].cu_offset
= cu_offset
;
1640 debug_information
[unit
].pointer_size
1641 = compunit
.cu_pointer_size
;
1642 debug_information
[unit
].base_address
= 0;
1643 debug_information
[unit
].loc_offsets
= NULL
;
1644 debug_information
[unit
].have_frame_base
= NULL
;
1645 debug_information
[unit
].max_loc_offsets
= 0;
1646 debug_information
[unit
].num_loc_offsets
= 0;
1647 debug_information
[unit
].range_lists
= NULL
;
1648 debug_information
[unit
].max_range_lists
= 0;
1649 debug_information
[unit
].num_range_lists
= 0;
1654 printf (_(" Compilation Unit @ offset 0x%lx:\n"), cu_offset
);
1655 printf (_(" Length: %ld\n"), compunit
.cu_length
);
1656 printf (_(" Version: %d\n"), compunit
.cu_version
);
1657 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
1658 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
1661 if (cu_offset
+ compunit
.cu_length
+ initial_length_size
1664 warn (_("Debug info is corrupted, length is invalid (section is %lu bytes)\n"),
1665 (unsigned long)section
->size
);
1669 start
+= compunit
.cu_length
+ initial_length_size
;
1671 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
1673 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
1679 /* Process the abbrevs used by this compilation unit. DWARF
1680 sections under Mach-O have non-zero addresses. */
1681 if (compunit
.cu_abbrev_offset
>= debug_displays
[abbrev
].section
.size
)
1682 warn (_("Debug info is corrupted, abbrev offset is invalid (section is %lu bytes)\n"),
1683 (unsigned long)debug_displays
[abbrev
].section
.size
);
1685 process_abbrev_section
1686 ((unsigned char *) debug_displays
[abbrev
].section
.start
1687 + compunit
.cu_abbrev_offset
- debug_displays
[abbrev
].section
.address
,
1688 (unsigned char *) debug_displays
[abbrev
].section
.start
1689 + debug_displays
[abbrev
].section
.size
);
1692 while (tags
< start
)
1694 unsigned int bytes_read
;
1695 unsigned long abbrev_number
;
1696 abbrev_entry
*entry
;
1699 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
1702 /* A null DIE marks the end of a list of children. */
1703 if (abbrev_number
== 0)
1710 printf (_(" <%d><%lx>: Abbrev Number: %lu"),
1712 (unsigned long) (tags
- section_begin
1716 /* Scan through the abbreviation list until we reach the
1718 for (entry
= first_abbrev
;
1719 entry
&& entry
->entry
!= abbrev_number
;
1720 entry
= entry
->next
)
1730 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
1736 printf (_(" (%s)\n"), get_TAG_name (entry
->tag
));
1741 need_base_address
= 0;
1743 case DW_TAG_compile_unit
:
1744 need_base_address
= 1;
1746 case DW_TAG_entry_point
:
1747 case DW_TAG_subprogram
:
1748 need_base_address
= 0;
1749 /* Assuming that there is no DW_AT_frame_base. */
1750 have_frame_base
= 0;
1754 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
1757 /* Show the offset from where the tag was extracted. */
1758 printf (" <%2lx>", (unsigned long)(tags
- section_begin
));
1760 tags
= read_and_display_attr (attr
->attribute
,
1763 compunit
.cu_pointer_size
,
1765 compunit
.cu_version
,
1766 &debug_information
[unit
],
1770 if (entry
->children
)
1775 /* Set num_debug_info_entries here so that it can be used to check if
1776 we need to process .debug_loc and .debug_ranges sections. */
1777 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
1778 && num_debug_info_entries
== 0)
1779 num_debug_info_entries
= num_units
;
1789 /* Locate and scan the .debug_info section in the file and record the pointer
1790 sizes and offsets for the compilation units in it. Usually an executable
1791 will have just one pointer size, but this is not guaranteed, and so we try
1792 not to make any assumptions. Returns zero upon failure, or the number of
1793 compilation units upon success. */
1796 load_debug_info (void * file
)
1798 /* Reset the last pointer size so that we can issue correct error
1799 messages if we are displaying the contents of more than one section. */
1800 last_pointer_size
= 0;
1801 warned_about_missing_comp_units
= FALSE
;
1803 /* If we already have the information there is nothing else to do. */
1804 if (num_debug_info_entries
> 0)
1805 return num_debug_info_entries
;
1807 if (load_debug_section (info
, file
)
1808 && process_debug_info (&debug_displays
[info
].section
, file
, 1))
1809 return num_debug_info_entries
;
1815 display_debug_lines (struct dwarf_section
*section
, void *file
)
1817 unsigned char *start
= section
->start
;
1818 unsigned char *data
= start
;
1819 unsigned char *end
= start
+ section
->size
;
1821 printf (_("\nDump of debug contents of section %s:\n\n"),
1824 load_debug_info (file
);
1828 DWARF2_Internal_LineInfo info
;
1829 unsigned char *standard_opcodes
;
1830 unsigned char *end_of_sequence
;
1831 unsigned char *hdrptr
;
1832 unsigned long hdroff
;
1833 int initial_length_size
;
1838 hdroff
= hdrptr
- start
;
1840 /* Check the length of the block. */
1841 info
.li_length
= byte_get (hdrptr
, 4);
1844 if (info
.li_length
== 0xffffffff)
1846 /* This section is 64-bit DWARF 3. */
1847 info
.li_length
= byte_get (hdrptr
, 8);
1850 initial_length_size
= 12;
1855 initial_length_size
= 4;
1858 if (info
.li_length
+ initial_length_size
> section
->size
)
1861 (_("The line info appears to be corrupt - the section is too small\n"));
1865 /* Check its version number. */
1866 info
.li_version
= byte_get (hdrptr
, 2);
1868 if (info
.li_version
!= 2 && info
.li_version
!= 3)
1870 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
1874 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
1875 hdrptr
+= offset_size
;
1876 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
1878 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
1880 info
.li_line_base
= byte_get (hdrptr
, 1);
1882 info
.li_line_range
= byte_get (hdrptr
, 1);
1884 info
.li_opcode_base
= byte_get (hdrptr
, 1);
1887 /* Sign extend the line base field. */
1888 info
.li_line_base
<<= 24;
1889 info
.li_line_base
>>= 24;
1891 printf (_(" Offset: 0x%lx\n"), hdroff
);
1892 printf (_(" Length: %ld\n"), info
.li_length
);
1893 printf (_(" DWARF Version: %d\n"), info
.li_version
);
1894 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
1895 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
1896 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
1897 printf (_(" Line Base: %d\n"), info
.li_line_base
);
1898 printf (_(" Line Range: %d\n"), info
.li_line_range
);
1899 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
1901 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
1903 reset_state_machine (info
.li_default_is_stmt
);
1905 /* Display the contents of the Opcodes table. */
1906 standard_opcodes
= hdrptr
;
1908 printf (_("\n Opcodes:\n"));
1910 for (i
= 1; i
< info
.li_opcode_base
; i
++)
1911 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
1913 /* Display the contents of the Directory table. */
1914 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
1917 printf (_("\n The Directory Table is empty.\n"));
1920 printf (_("\n The Directory Table:\n"));
1924 printf (_(" %s\n"), data
);
1926 data
+= strlen ((char *) data
) + 1;
1930 /* Skip the NUL at the end of the table. */
1933 /* Display the contents of the File Name table. */
1935 printf (_("\n The File Name Table is empty.\n"));
1938 printf (_("\n The File Name Table:\n"));
1939 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
1943 unsigned char *name
;
1944 unsigned int bytes_read
;
1946 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
1949 data
+= strlen ((char *) data
) + 1;
1951 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
1953 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
1955 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
1957 printf (_("%s\n"), name
);
1961 /* Skip the NUL at the end of the table. */
1964 /* Now display the statements. */
1965 printf (_("\n Line Number Statements:\n"));
1967 while (data
< end_of_sequence
)
1969 unsigned char op_code
;
1971 unsigned long int uladv
;
1972 unsigned int bytes_read
;
1976 if (op_code
>= info
.li_opcode_base
)
1978 op_code
-= info
.li_opcode_base
;
1979 uladv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
1980 state_machine_regs
.address
+= uladv
;
1981 printf (_(" Special opcode %d: advance Address by %lu to 0x%lx"),
1982 op_code
, uladv
, state_machine_regs
.address
);
1983 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
1984 state_machine_regs
.line
+= adv
;
1985 printf (_(" and Line by %d to %d\n"),
1986 adv
, state_machine_regs
.line
);
1988 else switch (op_code
)
1990 case DW_LNS_extended_op
:
1991 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
);
1995 printf (_(" Copy\n"));
1998 case DW_LNS_advance_pc
:
1999 uladv
= read_leb128 (data
, & bytes_read
, 0);
2000 uladv
*= info
.li_min_insn_length
;
2002 state_machine_regs
.address
+= uladv
;
2003 printf (_(" Advance PC by %lu to 0x%lx\n"), uladv
,
2004 state_machine_regs
.address
);
2007 case DW_LNS_advance_line
:
2008 adv
= read_leb128 (data
, & bytes_read
, 1);
2010 state_machine_regs
.line
+= adv
;
2011 printf (_(" Advance Line by %d to %d\n"), adv
,
2012 state_machine_regs
.line
);
2015 case DW_LNS_set_file
:
2016 adv
= read_leb128 (data
, & bytes_read
, 0);
2018 printf (_(" Set File Name to entry %d in the File Name Table\n"),
2020 state_machine_regs
.file
= adv
;
2023 case DW_LNS_set_column
:
2024 uladv
= read_leb128 (data
, & bytes_read
, 0);
2026 printf (_(" Set column to %lu\n"), uladv
);
2027 state_machine_regs
.column
= uladv
;
2030 case DW_LNS_negate_stmt
:
2031 adv
= state_machine_regs
.is_stmt
;
2033 printf (_(" Set is_stmt to %d\n"), adv
);
2034 state_machine_regs
.is_stmt
= adv
;
2037 case DW_LNS_set_basic_block
:
2038 printf (_(" Set basic block\n"));
2039 state_machine_regs
.basic_block
= 1;
2042 case DW_LNS_const_add_pc
:
2043 uladv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
2044 * info
.li_min_insn_length
);
2045 state_machine_regs
.address
+= uladv
;
2046 printf (_(" Advance PC by constant %lu to 0x%lx\n"), uladv
,
2047 state_machine_regs
.address
);
2050 case DW_LNS_fixed_advance_pc
:
2051 uladv
= byte_get (data
, 2);
2053 state_machine_regs
.address
+= uladv
;
2054 printf (_(" Advance PC by fixed size amount %lu to 0x%lx\n"),
2055 uladv
, state_machine_regs
.address
);
2058 case DW_LNS_set_prologue_end
:
2059 printf (_(" Set prologue_end to true\n"));
2062 case DW_LNS_set_epilogue_begin
:
2063 printf (_(" Set epilogue_begin to true\n"));
2066 case DW_LNS_set_isa
:
2067 uladv
= read_leb128 (data
, & bytes_read
, 0);
2069 printf (_(" Set ISA to %lu\n"), uladv
);
2073 printf (_(" Unknown opcode %d with operands: "), op_code
);
2075 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
2077 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
2078 i
== 1 ? "" : ", ");
2092 display_debug_pubnames (struct dwarf_section
*section
,
2093 void *file ATTRIBUTE_UNUSED
)
2095 DWARF2_Internal_PubNames pubnames
;
2096 unsigned char *start
= section
->start
;
2097 unsigned char *end
= start
+ section
->size
;
2099 printf (_("Contents of the %s section:\n\n"), section
->name
);
2103 unsigned char *data
;
2104 unsigned long offset
;
2105 int offset_size
, initial_length_size
;
2109 pubnames
.pn_length
= byte_get (data
, 4);
2111 if (pubnames
.pn_length
== 0xffffffff)
2113 pubnames
.pn_length
= byte_get (data
, 8);
2116 initial_length_size
= 12;
2121 initial_length_size
= 4;
2124 pubnames
.pn_version
= byte_get (data
, 2);
2126 pubnames
.pn_offset
= byte_get (data
, offset_size
);
2127 data
+= offset_size
;
2128 pubnames
.pn_size
= byte_get (data
, offset_size
);
2129 data
+= offset_size
;
2131 start
+= pubnames
.pn_length
+ initial_length_size
;
2133 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
2135 static int warned
= 0;
2139 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
2146 printf (_(" Length: %ld\n"),
2147 pubnames
.pn_length
);
2148 printf (_(" Version: %d\n"),
2149 pubnames
.pn_version
);
2150 printf (_(" Offset into .debug_info section: %ld\n"),
2151 pubnames
.pn_offset
);
2152 printf (_(" Size of area in .debug_info section: %ld\n"),
2155 printf (_("\n Offset\tName\n"));
2159 offset
= byte_get (data
, offset_size
);
2163 data
+= offset_size
;
2164 printf (" %-6ld\t\t%s\n", offset
, data
);
2165 data
+= strlen ((char *) data
) + 1;
2168 while (offset
!= 0);
2176 display_debug_macinfo (struct dwarf_section
*section
,
2177 void *file ATTRIBUTE_UNUSED
)
2179 unsigned char *start
= section
->start
;
2180 unsigned char *end
= start
+ section
->size
;
2181 unsigned char *curr
= start
;
2182 unsigned int bytes_read
;
2183 enum dwarf_macinfo_record_type op
;
2185 printf (_("Contents of the %s section:\n\n"), section
->name
);
2189 unsigned int lineno
;
2197 case DW_MACINFO_start_file
:
2199 unsigned int filenum
;
2201 lineno
= read_leb128 (curr
, & bytes_read
, 0);
2203 filenum
= read_leb128 (curr
, & bytes_read
, 0);
2206 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
2211 case DW_MACINFO_end_file
:
2212 printf (_(" DW_MACINFO_end_file\n"));
2215 case DW_MACINFO_define
:
2216 lineno
= read_leb128 (curr
, & bytes_read
, 0);
2218 string
= (char *) curr
;
2219 curr
+= strlen (string
) + 1;
2220 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
2224 case DW_MACINFO_undef
:
2225 lineno
= read_leb128 (curr
, & bytes_read
, 0);
2227 string
= (char *) curr
;
2228 curr
+= strlen (string
) + 1;
2229 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
2233 case DW_MACINFO_vendor_ext
:
2235 unsigned int constant
;
2237 constant
= read_leb128 (curr
, & bytes_read
, 0);
2239 string
= (char *) curr
;
2240 curr
+= strlen (string
) + 1;
2241 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
2252 display_debug_abbrev (struct dwarf_section
*section
,
2253 void *file ATTRIBUTE_UNUSED
)
2255 abbrev_entry
*entry
;
2256 unsigned char *start
= section
->start
;
2257 unsigned char *end
= start
+ section
->size
;
2259 printf (_("Contents of the %s section:\n\n"), section
->name
);
2265 start
= process_abbrev_section (start
, end
);
2267 if (first_abbrev
== NULL
)
2270 printf (_(" Number TAG\n"));
2272 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
2276 printf (_(" %ld %s [%s]\n"),
2278 get_TAG_name (entry
->tag
),
2279 entry
->children
? _("has children") : _("no children"));
2281 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
2282 printf (_(" %-18s %s\n"),
2283 get_AT_name (attr
->attribute
),
2284 get_FORM_name (attr
->form
));
2295 display_debug_loc (struct dwarf_section
*section
, void *file
)
2297 unsigned char *start
= section
->start
;
2298 unsigned char *section_end
;
2299 unsigned long bytes
;
2300 unsigned char *section_begin
= start
;
2301 unsigned int num_loc_list
= 0;
2302 unsigned long last_offset
= 0;
2303 unsigned int first
= 0;
2306 int seen_first_offset
= 0;
2307 int use_debug_info
= 1;
2308 unsigned char *next
;
2310 bytes
= section
->size
;
2311 section_end
= start
+ bytes
;
2315 printf (_("\nThe %s section is empty.\n"), section
->name
);
2319 load_debug_info (file
);
2321 /* Check the order of location list in .debug_info section. If
2322 offsets of location lists are in the ascending order, we can
2323 use `debug_information' directly. */
2324 for (i
= 0; i
< num_debug_info_entries
; i
++)
2328 num
= debug_information
[i
].num_loc_offsets
;
2329 num_loc_list
+= num
;
2331 /* Check if we can use `debug_information' directly. */
2332 if (use_debug_info
&& num
!= 0)
2334 if (!seen_first_offset
)
2336 /* This is the first location list. */
2337 last_offset
= debug_information
[i
].loc_offsets
[0];
2339 seen_first_offset
= 1;
2345 for (; j
< num
; j
++)
2348 debug_information
[i
].loc_offsets
[j
])
2353 last_offset
= debug_information
[i
].loc_offsets
[j
];
2358 if (!use_debug_info
)
2359 /* FIXME: Should we handle this case? */
2360 error (_("Location lists in .debug_info section aren't in ascending order!\n"));
2362 if (!seen_first_offset
)
2363 error (_("No location lists in .debug_info section!\n"));
2365 /* DWARF sections under Mach-O have non-zero addresses. */
2366 if (debug_information
[first
].num_loc_offsets
> 0
2367 && debug_information
[first
].loc_offsets
[0] != section
->address
)
2368 warn (_("Location lists in %s section start at 0x%lx\n"),
2369 section
->name
, debug_information
[first
].loc_offsets
[0]);
2371 printf (_("Contents of the %s section:\n\n"), section
->name
);
2372 printf (_(" Offset Begin End Expression\n"));
2374 seen_first_offset
= 0;
2375 for (i
= first
; i
< num_debug_info_entries
; i
++)
2377 unsigned long begin
;
2379 unsigned short length
;
2380 unsigned long offset
;
2381 unsigned int pointer_size
;
2382 unsigned long cu_offset
;
2383 unsigned long base_address
;
2384 int need_frame_base
;
2387 pointer_size
= debug_information
[i
].pointer_size
;
2388 cu_offset
= debug_information
[i
].cu_offset
;
2390 for (j
= 0; j
< debug_information
[i
].num_loc_offsets
; j
++)
2392 has_frame_base
= debug_information
[i
].have_frame_base
[j
];
2393 /* DWARF sections under Mach-O have non-zero addresses. */
2394 offset
= debug_information
[i
].loc_offsets
[j
] - section
->address
;
2395 next
= section_begin
+ offset
;
2396 base_address
= debug_information
[i
].base_address
;
2398 if (!seen_first_offset
)
2399 seen_first_offset
= 1;
2403 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
2404 (long)(start
- section_begin
), (long)(next
- section_begin
));
2405 else if (start
> next
)
2406 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
2407 (long)(start
- section_begin
), (long)(next
- section_begin
));
2411 if (offset
>= bytes
)
2413 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
2420 if (start
+ 2 * pointer_size
> section_end
)
2422 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
2427 begin
= byte_get (start
, pointer_size
);
2428 start
+= pointer_size
;
2429 end
= byte_get (start
, pointer_size
);
2430 start
+= pointer_size
;
2432 if (begin
== 0 && end
== 0)
2434 printf (_(" %8.8lx <End of list>\n"), offset
);
2438 /* Check base address specifiers. */
2439 if (begin
== -1UL && end
!= -1UL)
2442 printf (_(" %8.8lx %8.8lx %8.8lx (base address)\n"),
2443 offset
, begin
, end
);
2447 if (start
+ 2 > section_end
)
2449 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
2454 length
= byte_get (start
, 2);
2457 if (start
+ length
> section_end
)
2459 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
2464 printf (" %8.8lx %8.8lx %8.8lx (",
2465 offset
, begin
+ base_address
, end
+ base_address
);
2466 need_frame_base
= decode_location_expression (start
,
2472 if (need_frame_base
&& !has_frame_base
)
2473 printf (_(" [without DW_AT_frame_base]"));
2476 fputs (_(" (start == end)"), stdout
);
2477 else if (begin
> end
)
2478 fputs (_(" (start > end)"), stdout
);
2490 display_debug_str (struct dwarf_section
*section
,
2491 void *file ATTRIBUTE_UNUSED
)
2493 unsigned char *start
= section
->start
;
2494 unsigned long bytes
= section
->size
;
2495 dwarf_vma addr
= section
->address
;
2499 printf (_("\nThe %s section is empty.\n"), section
->name
);
2503 printf (_("Contents of the %s section:\n\n"), section
->name
);
2511 lbytes
= (bytes
> 16 ? 16 : bytes
);
2513 printf (" 0x%8.8lx ", (unsigned long) addr
);
2515 for (j
= 0; j
< 16; j
++)
2518 printf ("%2.2x", start
[j
]);
2526 for (j
= 0; j
< lbytes
; j
++)
2529 if (k
>= ' ' && k
< 0x80)
2548 display_debug_info (struct dwarf_section
*section
, void *file
)
2550 return process_debug_info (section
, file
, 0);
2555 display_debug_aranges (struct dwarf_section
*section
,
2556 void *file ATTRIBUTE_UNUSED
)
2558 unsigned char *start
= section
->start
;
2559 unsigned char *end
= start
+ section
->size
;
2561 printf (_("The section %s contains:\n\n"), section
->name
);
2565 unsigned char *hdrptr
;
2566 DWARF2_Internal_ARange arange
;
2567 unsigned char *ranges
;
2568 unsigned long length
;
2569 unsigned long address
;
2570 unsigned char address_size
;
2573 int initial_length_size
;
2577 arange
.ar_length
= byte_get (hdrptr
, 4);
2580 if (arange
.ar_length
== 0xffffffff)
2582 arange
.ar_length
= byte_get (hdrptr
, 8);
2585 initial_length_size
= 12;
2590 initial_length_size
= 4;
2593 arange
.ar_version
= byte_get (hdrptr
, 2);
2596 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
2597 hdrptr
+= offset_size
;
2599 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
2602 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
2605 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
2607 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
2611 printf (_(" Length: %ld\n"), arange
.ar_length
);
2612 printf (_(" Version: %d\n"), arange
.ar_version
);
2613 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
2614 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
2615 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
2617 address_size
= arange
.ar_pointer_size
+ arange
.ar_segment_size
;
2619 /* The DWARF spec does not require that the address size be a power
2620 of two, but we do. This will have to change if we ever encounter
2621 an uneven architecture. */
2622 if ((address_size
& (address_size
- 1)) != 0)
2624 warn (_("Pointer size + Segment size is not a power of two.\n"));
2628 if (address_size
> 4)
2629 printf (_("\n Address Length\n"));
2631 printf (_("\n Address Length\n"));
2635 /* Must pad to an alignment boundary that is twice the address size. */
2636 excess
= (hdrptr
- start
) % (2 * address_size
);
2638 ranges
+= (2 * address_size
) - excess
;
2640 start
+= arange
.ar_length
+ initial_length_size
;
2642 while (ranges
+ 2 * address_size
<= start
)
2644 address
= byte_get (ranges
, address_size
);
2646 ranges
+= address_size
;
2648 length
= byte_get (ranges
, address_size
);
2650 ranges
+= address_size
;
2652 if (address_size
> 4)
2653 printf (" 0x%16.16lx 0x%lx\n", address
, length
);
2655 printf (" 0x%8.8lx 0x%lx\n", address
, length
);
2665 display_debug_ranges (struct dwarf_section
*section
,
2666 void *file ATTRIBUTE_UNUSED
)
2668 unsigned char *start
= section
->start
;
2669 unsigned char *section_end
;
2670 unsigned long bytes
;
2671 unsigned char *section_begin
= start
;
2672 unsigned int num_range_list
= 0;
2673 unsigned long last_offset
= 0;
2674 unsigned int first
= 0;
2677 int seen_first_offset
= 0;
2678 int use_debug_info
= 1;
2679 unsigned char *next
;
2681 bytes
= section
->size
;
2682 section_end
= start
+ bytes
;
2686 printf (_("\nThe %s section is empty.\n"), section
->name
);
2690 load_debug_info (file
);
2692 /* Check the order of range list in .debug_info section. If
2693 offsets of range lists are in the ascending order, we can
2694 use `debug_information' directly. */
2695 for (i
= 0; i
< num_debug_info_entries
; i
++)
2699 num
= debug_information
[i
].num_range_lists
;
2700 num_range_list
+= num
;
2702 /* Check if we can use `debug_information' directly. */
2703 if (use_debug_info
&& num
!= 0)
2705 if (!seen_first_offset
)
2707 /* This is the first range list. */
2708 last_offset
= debug_information
[i
].range_lists
[0];
2710 seen_first_offset
= 1;
2716 for (; j
< num
; j
++)
2719 debug_information
[i
].range_lists
[j
])
2724 last_offset
= debug_information
[i
].range_lists
[j
];
2729 if (!use_debug_info
)
2730 /* FIXME: Should we handle this case? */
2731 error (_("Range lists in .debug_info section aren't in ascending order!\n"));
2733 if (!seen_first_offset
)
2734 error (_("No range lists in .debug_info section!\n"));
2736 /* DWARF sections under Mach-O have non-zero addresses. */
2737 if (debug_information
[first
].num_range_lists
> 0
2738 && debug_information
[first
].range_lists
[0] != section
->address
)
2739 warn (_("Range lists in %s section start at 0x%lx\n"),
2740 section
->name
, debug_information
[first
].range_lists
[0]);
2742 printf (_("Contents of the %s section:\n\n"), section
->name
);
2743 printf (_(" Offset Begin End\n"));
2745 seen_first_offset
= 0;
2746 for (i
= first
; i
< num_debug_info_entries
; i
++)
2748 unsigned long begin
;
2750 unsigned long offset
;
2751 unsigned int pointer_size
;
2752 unsigned long base_address
;
2754 pointer_size
= debug_information
[i
].pointer_size
;
2756 for (j
= 0; j
< debug_information
[i
].num_range_lists
; j
++)
2758 /* DWARF sections under Mach-O have non-zero addresses. */
2759 offset
= debug_information
[i
].range_lists
[j
] - section
->address
;
2760 next
= section_begin
+ offset
;
2761 base_address
= debug_information
[i
].base_address
;
2763 if (!seen_first_offset
)
2764 seen_first_offset
= 1;
2768 warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
2769 (long)(start
- section_begin
),
2770 (long)(next
- section_begin
), section
->name
);
2771 else if (start
> next
)
2772 warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
2773 (long)(start
- section_begin
),
2774 (long)(next
- section_begin
), section
->name
);
2780 begin
= byte_get (start
, pointer_size
);
2781 start
+= pointer_size
;
2782 end
= byte_get (start
, pointer_size
);
2783 start
+= pointer_size
;
2785 if (begin
== 0 && end
== 0)
2787 printf (_(" %8.8lx <End of list>\n"), offset
);
2791 /* Check base address specifiers. */
2792 if (begin
== -1UL && end
!= -1UL)
2795 printf (" %8.8lx %8.8lx %8.8lx (base address)\n",
2796 offset
, begin
, end
);
2800 printf (" %8.8lx %8.8lx %8.8lx",
2801 offset
, begin
+ base_address
, end
+ base_address
);
2804 fputs (_(" (start == end)"), stdout
);
2805 else if (begin
> end
)
2806 fputs (_(" (start > end)"), stdout
);
2816 typedef struct Frame_Chunk
2818 struct Frame_Chunk
*next
;
2819 unsigned char *chunk_start
;
2821 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
2822 short int *col_type
;
2825 unsigned int code_factor
;
2827 unsigned long pc_begin
;
2828 unsigned long pc_range
;
2832 unsigned char fde_encoding
;
2833 unsigned char cfa_exp
;
2837 /* A marker for a col_type that means this column was never referenced
2838 in the frame info. */
2839 #define DW_CFA_unreferenced (-1)
2842 frame_need_space (Frame_Chunk
*fc
, int reg
)
2844 int prev
= fc
->ncols
;
2846 if (reg
< fc
->ncols
)
2849 fc
->ncols
= reg
+ 1;
2850 fc
->col_type
= xcrealloc (fc
->col_type
, fc
->ncols
, sizeof (short int));
2851 fc
->col_offset
= xcrealloc (fc
->col_offset
, fc
->ncols
, sizeof (int));
2853 while (prev
< fc
->ncols
)
2855 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
2856 fc
->col_offset
[prev
] = 0;
2862 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, int *max_regs
)
2867 if (*max_regs
< fc
->ncols
)
2868 *max_regs
= fc
->ncols
;
2870 if (*need_col_headers
)
2872 *need_col_headers
= 0;
2874 printf (" LOC CFA ");
2876 for (r
= 0; r
< *max_regs
; r
++)
2877 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
2882 printf ("r%-4d", r
);
2888 printf ("%08lx ", fc
->pc_begin
);
2890 strcpy (tmp
, "exp");
2892 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
2893 printf ("%-8s ", tmp
);
2895 for (r
= 0; r
< fc
->ncols
; r
++)
2897 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
2899 switch (fc
->col_type
[r
])
2901 case DW_CFA_undefined
:
2904 case DW_CFA_same_value
:
2908 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
2910 case DW_CFA_val_offset
:
2911 sprintf (tmp
, "v%+d", fc
->col_offset
[r
]);
2913 case DW_CFA_register
:
2914 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
2916 case DW_CFA_expression
:
2917 strcpy (tmp
, "exp");
2919 case DW_CFA_val_expression
:
2920 strcpy (tmp
, "vexp");
2923 strcpy (tmp
, "n/a");
2926 printf ("%-5s", tmp
);
2933 size_of_encoded_value (int encoding
)
2935 switch (encoding
& 0x7)
2938 case 0: return eh_addr_size
;
2946 get_encoded_value (unsigned char *data
, int encoding
)
2948 int size
= size_of_encoded_value (encoding
);
2950 if (encoding
& DW_EH_PE_signed
)
2951 return byte_get_signed (data
, size
);
2953 return byte_get (data
, size
);
2956 #define GET(N) byte_get (start, N); start += N
2957 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
2958 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
2961 display_debug_frames (struct dwarf_section
*section
,
2962 void *file ATTRIBUTE_UNUSED
)
2964 unsigned char *start
= section
->start
;
2965 unsigned char *end
= start
+ section
->size
;
2966 unsigned char *section_start
= start
;
2967 Frame_Chunk
*chunks
= 0;
2968 Frame_Chunk
*remembered_state
= 0;
2970 int is_eh
= strcmp (section
->name
, ".eh_frame") == 0;
2971 unsigned int length_return
;
2974 printf (_("The section %s contains:\n"), section
->name
);
2978 unsigned char *saved_start
;
2979 unsigned char *block_end
;
2980 unsigned long length
;
2981 unsigned long cie_id
;
2984 int need_col_headers
= 1;
2985 unsigned char *augmentation_data
= NULL
;
2986 unsigned long augmentation_data_len
= 0;
2987 int encoded_ptr_size
= eh_addr_size
;
2989 int initial_length_size
;
2991 saved_start
= start
;
2992 length
= byte_get (start
, 4); start
+= 4;
2996 printf ("\n%08lx ZERO terminator\n\n",
2997 (unsigned long)(saved_start
- section_start
));
3001 if (length
== 0xffffffff)
3003 length
= byte_get (start
, 8);
3006 initial_length_size
= 12;
3011 initial_length_size
= 4;
3014 block_end
= saved_start
+ length
+ initial_length_size
;
3015 if (block_end
> end
)
3017 warn ("Invalid length %#08lx in FDE at %#08lx\n",
3018 length
, (unsigned long)(saved_start
- section_start
));
3021 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
3023 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
3027 fc
= xmalloc (sizeof (Frame_Chunk
));
3028 memset (fc
, 0, sizeof (Frame_Chunk
));
3032 fc
->chunk_start
= saved_start
;
3034 fc
->col_type
= xmalloc (sizeof (short int));
3035 fc
->col_offset
= xmalloc (sizeof (int));
3036 frame_need_space (fc
, max_regs
-1);
3040 fc
->augmentation
= (char *) start
;
3041 start
= (unsigned char *) strchr ((char *) start
, '\0') + 1;
3043 if (fc
->augmentation
[0] == 'z')
3045 fc
->code_factor
= LEB ();
3046 fc
->data_factor
= SLEB ();
3055 augmentation_data_len
= LEB ();
3056 augmentation_data
= start
;
3057 start
+= augmentation_data_len
;
3059 else if (strcmp (fc
->augmentation
, "eh") == 0)
3061 start
+= eh_addr_size
;
3062 fc
->code_factor
= LEB ();
3063 fc
->data_factor
= SLEB ();
3075 fc
->code_factor
= LEB ();
3076 fc
->data_factor
= SLEB ();
3088 if (do_debug_frames_interp
)
3089 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
3090 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
3091 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
3095 printf ("\n%08lx %08lx %08lx CIE\n",
3096 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
3097 printf (" Version: %d\n", version
);
3098 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
3099 printf (" Code alignment factor: %u\n", fc
->code_factor
);
3100 printf (" Data alignment factor: %d\n", fc
->data_factor
);
3101 printf (" Return address column: %d\n", fc
->ra
);
3103 if (augmentation_data_len
)
3106 printf (" Augmentation data: ");
3107 for (i
= 0; i
< augmentation_data_len
; ++i
)
3108 printf (" %02x", augmentation_data
[i
]);
3114 if (augmentation_data_len
)
3116 unsigned char *p
, *q
;
3117 p
= (unsigned char *) fc
->augmentation
+ 1;
3118 q
= augmentation_data
;
3125 q
+= 1 + size_of_encoded_value (*q
);
3127 fc
->fde_encoding
= *q
++;
3133 if (fc
->fde_encoding
)
3134 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
3137 frame_need_space (fc
, fc
->ra
);
3141 unsigned char *look_for
;
3142 static Frame_Chunk fde_fc
;
3145 memset (fc
, 0, sizeof (Frame_Chunk
));
3147 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
3149 for (cie
= chunks
; cie
; cie
= cie
->next
)
3150 if (cie
->chunk_start
== look_for
)
3155 warn ("Invalid CIE pointer %#08lx in FDE at %#08lx\n",
3156 cie_id
, (unsigned long)(saved_start
- section_start
));
3158 fc
->col_type
= xmalloc (sizeof (short int));
3159 fc
->col_offset
= xmalloc (sizeof (int));
3160 frame_need_space (fc
, max_regs
- 1);
3162 fc
->augmentation
= "";
3163 fc
->fde_encoding
= 0;
3167 fc
->ncols
= cie
->ncols
;
3168 fc
->col_type
= xcmalloc (fc
->ncols
, sizeof (short int));
3169 fc
->col_offset
= xcmalloc (fc
->ncols
, sizeof (int));
3170 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
3171 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
3172 fc
->augmentation
= cie
->augmentation
;
3173 fc
->code_factor
= cie
->code_factor
;
3174 fc
->data_factor
= cie
->data_factor
;
3175 fc
->cfa_reg
= cie
->cfa_reg
;
3176 fc
->cfa_offset
= cie
->cfa_offset
;
3178 frame_need_space (fc
, max_regs
-1);
3179 fc
->fde_encoding
= cie
->fde_encoding
;
3182 if (fc
->fde_encoding
)
3183 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
3185 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
3186 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
3187 fc
->pc_begin
+= section
->address
+ (start
- section_start
);
3188 start
+= encoded_ptr_size
;
3189 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
3190 start
+= encoded_ptr_size
;
3192 if (cie
->augmentation
[0] == 'z')
3194 augmentation_data_len
= LEB ();
3195 augmentation_data
= start
;
3196 start
+= augmentation_data_len
;
3199 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
3200 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
3201 (unsigned long)(cie
->chunk_start
- section_start
),
3202 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
3203 if (! do_debug_frames_interp
&& augmentation_data_len
)
3207 printf (" Augmentation data: ");
3208 for (i
= 0; i
< augmentation_data_len
; ++i
)
3209 printf (" %02x", augmentation_data
[i
]);
3215 /* At this point, fc is the current chunk, cie (if any) is set, and
3216 we're about to interpret instructions for the chunk. */
3217 /* ??? At present we need to do this always, since this sizes the
3218 fc->col_type and fc->col_offset arrays, which we write into always.
3219 We should probably split the interpreted and non-interpreted bits
3220 into two different routines, since there's so much that doesn't
3221 really overlap between them. */
3222 if (1 || do_debug_frames_interp
)
3224 /* Start by making a pass over the chunk, allocating storage
3225 and taking note of what registers are used. */
3226 unsigned char *tmp
= start
;
3228 while (start
< block_end
)
3231 unsigned long reg
, tmp
;
3238 /* Warning: if you add any more cases to this switch, be
3239 sure to add them to the corresponding switch below. */
3242 case DW_CFA_advance_loc
:
3246 frame_need_space (fc
, opa
);
3247 fc
->col_type
[opa
] = DW_CFA_undefined
;
3249 case DW_CFA_restore
:
3250 frame_need_space (fc
, opa
);
3251 fc
->col_type
[opa
] = DW_CFA_undefined
;
3253 case DW_CFA_set_loc
:
3254 start
+= encoded_ptr_size
;
3256 case DW_CFA_advance_loc1
:
3259 case DW_CFA_advance_loc2
:
3262 case DW_CFA_advance_loc4
:
3265 case DW_CFA_offset_extended
:
3266 case DW_CFA_val_offset
:
3267 reg
= LEB (); LEB ();
3268 frame_need_space (fc
, reg
);
3269 fc
->col_type
[reg
] = DW_CFA_undefined
;
3271 case DW_CFA_restore_extended
:
3273 frame_need_space (fc
, reg
);
3274 fc
->col_type
[reg
] = DW_CFA_undefined
;
3276 case DW_CFA_undefined
:
3278 frame_need_space (fc
, reg
);
3279 fc
->col_type
[reg
] = DW_CFA_undefined
;
3281 case DW_CFA_same_value
:
3283 frame_need_space (fc
, reg
);
3284 fc
->col_type
[reg
] = DW_CFA_undefined
;
3286 case DW_CFA_register
:
3287 reg
= LEB (); LEB ();
3288 frame_need_space (fc
, reg
);
3289 fc
->col_type
[reg
] = DW_CFA_undefined
;
3291 case DW_CFA_def_cfa
:
3294 case DW_CFA_def_cfa_register
:
3297 case DW_CFA_def_cfa_offset
:
3300 case DW_CFA_def_cfa_expression
:
3304 case DW_CFA_expression
:
3305 case DW_CFA_val_expression
:
3309 frame_need_space (fc
, reg
);
3310 fc
->col_type
[reg
] = DW_CFA_undefined
;
3312 case DW_CFA_offset_extended_sf
:
3313 case DW_CFA_val_offset_sf
:
3314 reg
= LEB (); SLEB ();
3315 frame_need_space (fc
, reg
);
3316 fc
->col_type
[reg
] = DW_CFA_undefined
;
3318 case DW_CFA_def_cfa_sf
:
3321 case DW_CFA_def_cfa_offset_sf
:
3324 case DW_CFA_MIPS_advance_loc8
:
3327 case DW_CFA_GNU_args_size
:
3330 case DW_CFA_GNU_negative_offset_extended
:
3331 reg
= LEB (); LEB ();
3332 frame_need_space (fc
, reg
);
3333 fc
->col_type
[reg
] = DW_CFA_undefined
;
3342 /* Now we know what registers are used, make a second pass over
3343 the chunk, this time actually printing out the info. */
3345 while (start
< block_end
)
3348 unsigned long ul
, reg
, roffs
;
3357 /* Warning: if you add any more cases to this switch, be
3358 sure to add them to the corresponding switch above. */
3361 case DW_CFA_advance_loc
:
3362 if (do_debug_frames_interp
)
3363 frame_display_row (fc
, &need_col_headers
, &max_regs
);
3365 printf (" DW_CFA_advance_loc: %d to %08lx\n",
3366 opa
* fc
->code_factor
,
3367 fc
->pc_begin
+ opa
* fc
->code_factor
);
3368 fc
->pc_begin
+= opa
* fc
->code_factor
;
3373 if (! do_debug_frames_interp
)
3374 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
3375 opa
, roffs
* fc
->data_factor
);
3376 fc
->col_type
[opa
] = DW_CFA_offset
;
3377 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
3380 case DW_CFA_restore
:
3381 if (! do_debug_frames_interp
)
3382 printf (" DW_CFA_restore: r%d\n", opa
);
3383 fc
->col_type
[opa
] = cie
->col_type
[opa
];
3384 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
3387 case DW_CFA_set_loc
:
3388 vma
= get_encoded_value (start
, fc
->fde_encoding
);
3389 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
3390 vma
+= section
->address
+ (start
- section_start
);
3391 start
+= encoded_ptr_size
;
3392 if (do_debug_frames_interp
)
3393 frame_display_row (fc
, &need_col_headers
, &max_regs
);
3395 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
3399 case DW_CFA_advance_loc1
:
3400 ofs
= byte_get (start
, 1); start
+= 1;
3401 if (do_debug_frames_interp
)
3402 frame_display_row (fc
, &need_col_headers
, &max_regs
);
3404 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
3405 ofs
* fc
->code_factor
,
3406 fc
->pc_begin
+ ofs
* fc
->code_factor
);
3407 fc
->pc_begin
+= ofs
* fc
->code_factor
;
3410 case DW_CFA_advance_loc2
:
3411 ofs
= byte_get (start
, 2); start
+= 2;
3412 if (do_debug_frames_interp
)
3413 frame_display_row (fc
, &need_col_headers
, &max_regs
);
3415 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
3416 ofs
* fc
->code_factor
,
3417 fc
->pc_begin
+ ofs
* fc
->code_factor
);
3418 fc
->pc_begin
+= ofs
* fc
->code_factor
;
3421 case DW_CFA_advance_loc4
:
3422 ofs
= byte_get (start
, 4); start
+= 4;
3423 if (do_debug_frames_interp
)
3424 frame_display_row (fc
, &need_col_headers
, &max_regs
);
3426 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
3427 ofs
* fc
->code_factor
,
3428 fc
->pc_begin
+ ofs
* fc
->code_factor
);
3429 fc
->pc_begin
+= ofs
* fc
->code_factor
;
3432 case DW_CFA_offset_extended
:
3435 if (! do_debug_frames_interp
)
3436 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
3437 reg
, roffs
* fc
->data_factor
);
3438 fc
->col_type
[reg
] = DW_CFA_offset
;
3439 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
3442 case DW_CFA_val_offset
:
3445 if (! do_debug_frames_interp
)
3446 printf (" DW_CFA_val_offset: r%ld at cfa%+ld\n",
3447 reg
, roffs
* fc
->data_factor
);
3448 fc
->col_type
[reg
] = DW_CFA_val_offset
;
3449 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
3452 case DW_CFA_restore_extended
:
3454 if (! do_debug_frames_interp
)
3455 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
3456 fc
->col_type
[reg
] = cie
->col_type
[reg
];
3457 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
3460 case DW_CFA_undefined
:
3462 if (! do_debug_frames_interp
)
3463 printf (" DW_CFA_undefined: r%ld\n", reg
);
3464 fc
->col_type
[reg
] = DW_CFA_undefined
;
3465 fc
->col_offset
[reg
] = 0;
3468 case DW_CFA_same_value
:
3470 if (! do_debug_frames_interp
)
3471 printf (" DW_CFA_same_value: r%ld\n", reg
);
3472 fc
->col_type
[reg
] = DW_CFA_same_value
;
3473 fc
->col_offset
[reg
] = 0;
3476 case DW_CFA_register
:
3479 if (! do_debug_frames_interp
)
3480 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
3481 fc
->col_type
[reg
] = DW_CFA_register
;
3482 fc
->col_offset
[reg
] = roffs
;
3485 case DW_CFA_remember_state
:
3486 if (! do_debug_frames_interp
)
3487 printf (" DW_CFA_remember_state\n");
3488 rs
= xmalloc (sizeof (Frame_Chunk
));
3489 rs
->ncols
= fc
->ncols
;
3490 rs
->col_type
= xcmalloc (rs
->ncols
, sizeof (short int));
3491 rs
->col_offset
= xcmalloc (rs
->ncols
, sizeof (int));
3492 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
3493 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
3494 rs
->next
= remembered_state
;
3495 remembered_state
= rs
;
3498 case DW_CFA_restore_state
:
3499 if (! do_debug_frames_interp
)
3500 printf (" DW_CFA_restore_state\n");
3501 rs
= remembered_state
;
3504 remembered_state
= rs
->next
;
3505 frame_need_space (fc
, rs
->ncols
-1);
3506 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
3507 memcpy (fc
->col_offset
, rs
->col_offset
,
3508 rs
->ncols
* sizeof (int));
3509 free (rs
->col_type
);
3510 free (rs
->col_offset
);
3513 else if (do_debug_frames_interp
)
3514 printf ("Mismatched DW_CFA_restore_state\n");
3517 case DW_CFA_def_cfa
:
3518 fc
->cfa_reg
= LEB ();
3519 fc
->cfa_offset
= LEB ();
3521 if (! do_debug_frames_interp
)
3522 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
3523 fc
->cfa_reg
, fc
->cfa_offset
);
3526 case DW_CFA_def_cfa_register
:
3527 fc
->cfa_reg
= LEB ();
3529 if (! do_debug_frames_interp
)
3530 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
3533 case DW_CFA_def_cfa_offset
:
3534 fc
->cfa_offset
= LEB ();
3535 if (! do_debug_frames_interp
)
3536 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
3540 if (! do_debug_frames_interp
)
3541 printf (" DW_CFA_nop\n");
3544 case DW_CFA_def_cfa_expression
:
3546 if (! do_debug_frames_interp
)
3548 printf (" DW_CFA_def_cfa_expression (");
3549 decode_location_expression (start
, eh_addr_size
, ul
, 0);
3556 case DW_CFA_expression
:
3559 if (! do_debug_frames_interp
)
3561 printf (" DW_CFA_expression: r%ld (", reg
);
3562 decode_location_expression (start
, eh_addr_size
, ul
, 0);
3565 fc
->col_type
[reg
] = DW_CFA_expression
;
3569 case DW_CFA_val_expression
:
3572 if (! do_debug_frames_interp
)
3574 printf (" DW_CFA_val_expression: r%ld (", reg
);
3575 decode_location_expression (start
, eh_addr_size
, ul
, 0);
3578 fc
->col_type
[reg
] = DW_CFA_val_expression
;
3582 case DW_CFA_offset_extended_sf
:
3585 frame_need_space (fc
, reg
);
3586 if (! do_debug_frames_interp
)
3587 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
3588 reg
, l
* fc
->data_factor
);
3589 fc
->col_type
[reg
] = DW_CFA_offset
;
3590 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
3593 case DW_CFA_val_offset_sf
:
3596 frame_need_space (fc
, reg
);
3597 if (! do_debug_frames_interp
)
3598 printf (" DW_CFA_val_offset_sf: r%ld at cfa%+ld\n",
3599 reg
, l
* fc
->data_factor
);
3600 fc
->col_type
[reg
] = DW_CFA_val_offset
;
3601 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
3604 case DW_CFA_def_cfa_sf
:
3605 fc
->cfa_reg
= LEB ();
3606 fc
->cfa_offset
= SLEB ();
3607 fc
->cfa_offset
= fc
->cfa_offset
* fc
->data_factor
;
3609 if (! do_debug_frames_interp
)
3610 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
3611 fc
->cfa_reg
, fc
->cfa_offset
);
3614 case DW_CFA_def_cfa_offset_sf
:
3615 fc
->cfa_offset
= SLEB ();
3616 fc
->cfa_offset
= fc
->cfa_offset
* fc
->data_factor
;
3617 if (! do_debug_frames_interp
)
3618 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
3621 case DW_CFA_MIPS_advance_loc8
:
3622 ofs
= byte_get (start
, 8); start
+= 8;
3623 if (do_debug_frames_interp
)
3624 frame_display_row (fc
, &need_col_headers
, &max_regs
);
3626 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
3627 ofs
* fc
->code_factor
,
3628 fc
->pc_begin
+ ofs
* fc
->code_factor
);
3629 fc
->pc_begin
+= ofs
* fc
->code_factor
;
3632 case DW_CFA_GNU_window_save
:
3633 if (! do_debug_frames_interp
)
3634 printf (" DW_CFA_GNU_window_save\n");
3637 case DW_CFA_GNU_args_size
:
3639 if (! do_debug_frames_interp
)
3640 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
3643 case DW_CFA_GNU_negative_offset_extended
:
3646 frame_need_space (fc
, reg
);
3647 if (! do_debug_frames_interp
)
3648 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
3649 reg
, l
* fc
->data_factor
);
3650 fc
->col_type
[reg
] = DW_CFA_offset
;
3651 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
3655 if (op
>= DW_CFA_lo_user
&& op
<= DW_CFA_hi_user
)
3656 printf (_(" DW_CFA_??? (User defined call frame op: %#x)\n"), op
);
3658 warn (_("unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op
);
3663 if (do_debug_frames_interp
)
3664 frame_display_row (fc
, &need_col_headers
, &max_regs
);
3679 display_debug_not_supported (struct dwarf_section
*section
,
3680 void *file ATTRIBUTE_UNUSED
)
3682 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
3689 cmalloc (size_t nmemb
, size_t size
)
3691 /* Check for overflow. */
3692 if (nmemb
>= ~(size_t) 0 / size
)
3695 return malloc (nmemb
* size
);
3699 xcmalloc (size_t nmemb
, size_t size
)
3701 /* Check for overflow. */
3702 if (nmemb
>= ~(size_t) 0 / size
)
3705 return xmalloc (nmemb
* size
);
3709 xcrealloc (void *ptr
, size_t nmemb
, size_t size
)
3711 /* Check for overflow. */
3712 if (nmemb
>= ~(size_t) 0 / size
)
3715 return xrealloc (ptr
, nmemb
* size
);
3719 error (const char *message
, ...)
3723 va_start (args
, message
);
3724 fprintf (stderr
, _("%s: Error: "), program_name
);
3725 vfprintf (stderr
, message
, args
);
3730 warn (const char *message
, ...)
3734 va_start (args
, message
);
3735 fprintf (stderr
, _("%s: Warning: "), program_name
);
3736 vfprintf (stderr
, message
, args
);
3741 free_debug_memory (void)
3743 enum dwarf_section_display_enum i
;
3747 for (i
= 0; i
< max
; i
++)
3748 free_debug_section (i
);
3750 if (debug_information
)
3752 for (i
= 0; i
< num_debug_info_entries
; i
++)
3754 if (!debug_information
[i
].max_loc_offsets
)
3756 free (debug_information
[i
].loc_offsets
);
3757 free (debug_information
[i
].have_frame_base
);
3759 if (!debug_information
[i
].max_range_lists
)
3760 free (debug_information
[i
].range_lists
);
3762 free (debug_information
);
3763 debug_information
= NULL
;
3764 num_debug_info_entries
= 0;
3769 struct dwarf_section_display debug_displays
[] =
3771 { { ".debug_abbrev", NULL
, 0, 0 },
3772 display_debug_abbrev
, 0, 0 },
3773 { { ".debug_aranges", NULL
, 0, 0 },
3774 display_debug_aranges
, 0, 0 },
3775 { { ".debug_frame", NULL
, 0, 0 },
3776 display_debug_frames
, 1, 0 },
3777 { { ".debug_info", NULL
, 0, 0 },
3778 display_debug_info
, 1, 0 },
3779 { { ".debug_line", NULL
, 0, 0 },
3780 display_debug_lines
, 0, 0 },
3781 { { ".debug_pubnames", NULL
, 0, 0 },
3782 display_debug_pubnames
, 0, 0 },
3783 { { ".eh_frame", NULL
, 0, 0 },
3784 display_debug_frames
, 1, 1 },
3785 { { ".debug_macinfo", NULL
, 0, 0 },
3786 display_debug_macinfo
, 0, 0 },
3787 { { ".debug_str", NULL
, 0, 0 },
3788 display_debug_str
, 0, 0 },
3789 { { ".debug_loc", NULL
, 0, 0 },
3790 display_debug_loc
, 0, 0 },
3791 { { ".debug_pubtypes", NULL
, 0, 0 },
3792 display_debug_pubnames
, 0, 0 },
3793 { { ".debug_ranges", NULL
, 0, 0 },
3794 display_debug_ranges
, 0, 0 },
3795 { { ".debug_static_func", NULL
, 0, 0 },
3796 display_debug_not_supported
, 0, 0 },
3797 { { ".debug_static_vars", NULL
, 0, 0 },
3798 display_debug_not_supported
, 0, 0 },
3799 { { ".debug_types", NULL
, 0, 0 },
3800 display_debug_not_supported
, 0, 0 },
3801 { { ".debug_weaknames", NULL
, 0, 0 },
3802 display_debug_not_supported
, 0, 0 }