OSDN Git Service

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