OSDN Git Service

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