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