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