Add missing cast to (unsigned long)
[external/binutils.git] / binutils / dwarf.c
1 /* dwarf.c -- display DWARF contents of a BFD binary file
2    Copyright 2005, 2006, 2007
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 2 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 <stdio.h>
23
24 #include "dwarf.h"
25
26 #include "bucomm.h"
27 #include "libiberty.h"
28
29 static int have_frame_base;
30 static int need_base_address;
31
32 static unsigned int last_pointer_size = 0;
33 static int warned_about_missing_comp_units = FALSE;
34
35 static unsigned int num_debug_info_entries = 0;
36 static debug_info *debug_information = NULL;
37
38 dwarf_vma eh_addr_size;
39 int is_relocatable;
40
41 int do_debug_info;
42 int do_debug_abbrevs;
43 int do_debug_lines;
44 int do_debug_pubnames;
45 int do_debug_aranges;
46 int do_debug_ranges;
47 int do_debug_frames;
48 int do_debug_frames_interp;
49 int do_debug_macinfo;
50 int do_debug_str;
51 int do_debug_loc;
52
53 dwarf_vma (*byte_get) (unsigned char *, int);
54
55 dwarf_vma
56 byte_get_little_endian (unsigned char *field, int size)
57 {
58   switch (size)
59     {
60     case 1:
61       return *field;
62
63     case 2:
64       return  ((unsigned int) (field[0]))
65         |    (((unsigned int) (field[1])) << 8);
66
67     case 4:
68       return  ((unsigned long) (field[0]))
69         |    (((unsigned long) (field[1])) << 8)
70         |    (((unsigned long) (field[2])) << 16)
71         |    (((unsigned long) (field[3])) << 24);
72
73     case 8:
74       if (sizeof (dwarf_vma) == 8)
75         return  ((dwarf_vma) (field[0]))
76           |    (((dwarf_vma) (field[1])) << 8)
77           |    (((dwarf_vma) (field[2])) << 16)
78           |    (((dwarf_vma) (field[3])) << 24)
79           |    (((dwarf_vma) (field[4])) << 32)
80           |    (((dwarf_vma) (field[5])) << 40)
81           |    (((dwarf_vma) (field[6])) << 48)
82           |    (((dwarf_vma) (field[7])) << 56);
83       else if (sizeof (dwarf_vma) == 4)
84         /* We want to extract data from an 8 byte wide field and
85            place it into a 4 byte wide field.  Since this is a little
86            endian source we can just use the 4 byte extraction code.  */
87         return  ((unsigned long) (field[0]))
88           |    (((unsigned long) (field[1])) << 8)
89           |    (((unsigned long) (field[2])) << 16)
90           |    (((unsigned long) (field[3])) << 24);
91
92     default:
93       error (_("Unhandled data length: %d\n"), size);
94       abort ();
95     }
96 }
97
98 dwarf_vma
99 byte_get_big_endian (unsigned char *field, int size)
100 {
101   switch (size)
102     {
103     case 1:
104       return *field;
105
106     case 2:
107       return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
108
109     case 4:
110       return ((unsigned long) (field[3]))
111         |   (((unsigned long) (field[2])) << 8)
112         |   (((unsigned long) (field[1])) << 16)
113         |   (((unsigned long) (field[0])) << 24);
114
115     case 8:
116       if (sizeof (dwarf_vma) == 8)
117         return ((dwarf_vma) (field[7]))
118           |   (((dwarf_vma) (field[6])) << 8)
119           |   (((dwarf_vma) (field[5])) << 16)
120           |   (((dwarf_vma) (field[4])) << 24)
121           |   (((dwarf_vma) (field[3])) << 32)
122           |   (((dwarf_vma) (field[2])) << 40)
123           |   (((dwarf_vma) (field[1])) << 48)
124           |   (((dwarf_vma) (field[0])) << 56);
125       else if (sizeof (dwarf_vma) == 4)
126         {
127           /* Although we are extracing data from an 8 byte wide field,
128              we are returning only 4 bytes of data.  */
129           field += 4;
130           return ((unsigned long) (field[3]))
131             |   (((unsigned long) (field[2])) << 8)
132             |   (((unsigned long) (field[1])) << 16)
133             |   (((unsigned long) (field[0])) << 24);
134         }
135
136     default:
137       error (_("Unhandled data length: %d\n"), size);
138       abort ();
139     }
140 }
141
142 static dwarf_vma
143 byte_get_signed (unsigned char *field, int size)
144 {
145   dwarf_vma x = byte_get (field, size);
146
147   switch (size)
148     {
149     case 1:
150       return (x ^ 0x80) - 0x80;
151     case 2:
152       return (x ^ 0x8000) - 0x8000;
153     case 4:
154       return (x ^ 0x80000000) - 0x80000000;
155     case 8:
156       return x;
157     default:
158       abort ();
159     }
160 }
161
162 static unsigned long int
163 read_leb128 (unsigned char *data, unsigned int *length_return, int sign)
164 {
165   unsigned long int result = 0;
166   unsigned int num_read = 0;
167   unsigned int shift = 0;
168   unsigned char byte;
169
170   do
171     {
172       byte = *data++;
173       num_read++;
174
175       result |= ((unsigned long int) (byte & 0x7f)) << shift;
176
177       shift += 7;
178
179     }
180   while (byte & 0x80);
181
182   if (length_return != NULL)
183     *length_return = num_read;
184
185   if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
186     result |= -1L << shift;
187
188   return result;
189 }
190
191 typedef struct State_Machine_Registers
192 {
193   unsigned long address;
194   unsigned int file;
195   unsigned int line;
196   unsigned int column;
197   int is_stmt;
198   int basic_block;
199   int end_sequence;
200 /* This variable hold the number of the last entry seen
201    in the File Table.  */
202   unsigned int last_file_entry;
203 } SMR;
204
205 static SMR state_machine_regs;
206
207 static void
208 reset_state_machine (int is_stmt)
209 {
210   state_machine_regs.address = 0;
211   state_machine_regs.file = 1;
212   state_machine_regs.line = 1;
213   state_machine_regs.column = 0;
214   state_machine_regs.is_stmt = is_stmt;
215   state_machine_regs.basic_block = 0;
216   state_machine_regs.end_sequence = 0;
217   state_machine_regs.last_file_entry = 0;
218 }
219
220 /* Handled an extend line op.
221    Returns the number of bytes read.  */
222
223 static int
224 process_extended_line_op (unsigned char *data, int is_stmt)
225 {
226   unsigned char op_code;
227   unsigned int bytes_read;
228   unsigned int len;
229   unsigned char *name;
230   unsigned long adr;
231
232   len = read_leb128 (data, & bytes_read, 0);
233   data += bytes_read;
234
235   if (len == 0)
236     {
237       warn (_("badly formed extended line op encountered!\n"));
238       return bytes_read;
239     }
240
241   len += bytes_read;
242   op_code = *data++;
243
244   printf (_("  Extended opcode %d: "), op_code);
245
246   switch (op_code)
247     {
248     case DW_LNE_end_sequence:
249       printf (_("End of Sequence\n\n"));
250       reset_state_machine (is_stmt);
251       break;
252
253     case DW_LNE_set_address:
254       adr = byte_get (data, len - bytes_read - 1);
255       printf (_("set Address to 0x%lx\n"), adr);
256       state_machine_regs.address = adr;
257       break;
258
259     case DW_LNE_define_file:
260       printf (_("  define new File Table entry\n"));
261       printf (_("  Entry\tDir\tTime\tSize\tName\n"));
262
263       printf (_("   %d\t"), ++state_machine_regs.last_file_entry);
264       name = data;
265       data += strlen ((char *) data) + 1;
266       printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
267       data += bytes_read;
268       printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
269       data += bytes_read;
270       printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
271       printf (_("%s\n\n"), name);
272       break;
273
274     default:
275       printf (_("UNKNOWN: length %d\n"), len - bytes_read);
276       break;
277     }
278
279   return len;
280 }
281
282 static const char *
283 fetch_indirect_string (unsigned long offset)
284 {
285   struct dwarf_section *section = &debug_displays [str].section;
286
287   if (section->start == NULL)
288     return _("<no .debug_str section>");
289
290   /* DWARF sections under Mach-O have non-zero addresses.  */
291   offset -= section->address;
292   if (offset > section->size)
293     {
294       warn (_("DW_FORM_strp offset too big: %lx\n"), offset);
295       return _("<offset is too big>");
296     }
297
298   return (const char *) section->start + offset;
299 }
300
301 /* FIXME:  There are better and more efficient ways to handle
302    these structures.  For now though, I just want something that
303    is simple to implement.  */
304 typedef struct abbrev_attr
305 {
306   unsigned long attribute;
307   unsigned long form;
308   struct abbrev_attr *next;
309 }
310 abbrev_attr;
311
312 typedef struct abbrev_entry
313 {
314   unsigned long entry;
315   unsigned long tag;
316   int children;
317   struct abbrev_attr *first_attr;
318   struct abbrev_attr *last_attr;
319   struct abbrev_entry *next;
320 }
321 abbrev_entry;
322
323 static abbrev_entry *first_abbrev = NULL;
324 static abbrev_entry *last_abbrev = NULL;
325
326 static void
327 free_abbrevs (void)
328 {
329   abbrev_entry *abbrev;
330
331   for (abbrev = first_abbrev; abbrev;)
332     {
333       abbrev_entry *next = abbrev->next;
334       abbrev_attr *attr;
335
336       for (attr = abbrev->first_attr; attr;)
337         {
338           abbrev_attr *next = attr->next;
339
340           free (attr);
341           attr = next;
342         }
343
344       free (abbrev);
345       abbrev = next;
346     }
347
348   last_abbrev = first_abbrev = NULL;
349 }
350
351 static void
352 add_abbrev (unsigned long number, unsigned long tag, int children)
353 {
354   abbrev_entry *entry;
355
356   entry = malloc (sizeof (*entry));
357
358   if (entry == NULL)
359     /* ugg */
360     return;
361
362   entry->entry      = number;
363   entry->tag        = tag;
364   entry->children   = children;
365   entry->first_attr = NULL;
366   entry->last_attr  = NULL;
367   entry->next       = NULL;
368
369   if (first_abbrev == NULL)
370     first_abbrev = entry;
371   else
372     last_abbrev->next = entry;
373
374   last_abbrev = entry;
375 }
376
377 static void
378 add_abbrev_attr (unsigned long attribute, unsigned long form)
379 {
380   abbrev_attr *attr;
381
382   attr = malloc (sizeof (*attr));
383
384   if (attr == NULL)
385     /* ugg */
386     return;
387
388   attr->attribute = attribute;
389   attr->form      = form;
390   attr->next      = NULL;
391
392   if (last_abbrev->first_attr == NULL)
393     last_abbrev->first_attr = attr;
394   else
395     last_abbrev->last_attr->next = attr;
396
397   last_abbrev->last_attr = attr;
398 }
399
400 /* Processes the (partial) contents of a .debug_abbrev section.
401    Returns NULL if the end of the section was encountered.
402    Returns the address after the last byte read if the end of
403    an abbreviation set was found.  */
404
405 static unsigned char *
406 process_abbrev_section (unsigned char *start, unsigned char *end)
407 {
408   if (first_abbrev != NULL)
409     return NULL;
410
411   while (start < end)
412     {
413       unsigned int bytes_read;
414       unsigned long entry;
415       unsigned long tag;
416       unsigned long attribute;
417       int children;
418
419       entry = read_leb128 (start, & bytes_read, 0);
420       start += bytes_read;
421
422       /* A single zero is supposed to end the section according
423          to the standard.  If there's more, then signal that to
424          the caller.  */
425       if (entry == 0)
426         return start == end ? NULL : start;
427
428       tag = read_leb128 (start, & bytes_read, 0);
429       start += bytes_read;
430
431       children = *start++;
432
433       add_abbrev (entry, tag, children);
434
435       do
436         {
437           unsigned long form;
438
439           attribute = read_leb128 (start, & bytes_read, 0);
440           start += bytes_read;
441
442           form = read_leb128 (start, & bytes_read, 0);
443           start += bytes_read;
444
445           if (attribute != 0)
446             add_abbrev_attr (attribute, form);
447         }
448       while (attribute != 0);
449     }
450
451   return NULL;
452 }
453
454 static char *
455 get_TAG_name (unsigned long tag)
456 {
457   switch (tag)
458     {
459     case DW_TAG_padding:                return "DW_TAG_padding";
460     case DW_TAG_array_type:             return "DW_TAG_array_type";
461     case DW_TAG_class_type:             return "DW_TAG_class_type";
462     case DW_TAG_entry_point:            return "DW_TAG_entry_point";
463     case DW_TAG_enumeration_type:       return "DW_TAG_enumeration_type";
464     case DW_TAG_formal_parameter:       return "DW_TAG_formal_parameter";
465     case DW_TAG_imported_declaration:   return "DW_TAG_imported_declaration";
466     case DW_TAG_label:                  return "DW_TAG_label";
467     case DW_TAG_lexical_block:          return "DW_TAG_lexical_block";
468     case DW_TAG_member:                 return "DW_TAG_member";
469     case DW_TAG_pointer_type:           return "DW_TAG_pointer_type";
470     case DW_TAG_reference_type:         return "DW_TAG_reference_type";
471     case DW_TAG_compile_unit:           return "DW_TAG_compile_unit";
472     case DW_TAG_string_type:            return "DW_TAG_string_type";
473     case DW_TAG_structure_type:         return "DW_TAG_structure_type";
474     case DW_TAG_subroutine_type:        return "DW_TAG_subroutine_type";
475     case DW_TAG_typedef:                return "DW_TAG_typedef";
476     case DW_TAG_union_type:             return "DW_TAG_union_type";
477     case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
478     case DW_TAG_variant:                return "DW_TAG_variant";
479     case DW_TAG_common_block:           return "DW_TAG_common_block";
480     case DW_TAG_common_inclusion:       return "DW_TAG_common_inclusion";
481     case DW_TAG_inheritance:            return "DW_TAG_inheritance";
482     case DW_TAG_inlined_subroutine:     return "DW_TAG_inlined_subroutine";
483     case DW_TAG_module:                 return "DW_TAG_module";
484     case DW_TAG_ptr_to_member_type:     return "DW_TAG_ptr_to_member_type";
485     case DW_TAG_set_type:               return "DW_TAG_set_type";
486     case DW_TAG_subrange_type:          return "DW_TAG_subrange_type";
487     case DW_TAG_with_stmt:              return "DW_TAG_with_stmt";
488     case DW_TAG_access_declaration:     return "DW_TAG_access_declaration";
489     case DW_TAG_base_type:              return "DW_TAG_base_type";
490     case DW_TAG_catch_block:            return "DW_TAG_catch_block";
491     case DW_TAG_const_type:             return "DW_TAG_const_type";
492     case DW_TAG_constant:               return "DW_TAG_constant";
493     case DW_TAG_enumerator:             return "DW_TAG_enumerator";
494     case DW_TAG_file_type:              return "DW_TAG_file_type";
495     case DW_TAG_friend:                 return "DW_TAG_friend";
496     case DW_TAG_namelist:               return "DW_TAG_namelist";
497     case DW_TAG_namelist_item:          return "DW_TAG_namelist_item";
498     case DW_TAG_packed_type:            return "DW_TAG_packed_type";
499     case DW_TAG_subprogram:             return "DW_TAG_subprogram";
500     case DW_TAG_template_type_param:    return "DW_TAG_template_type_param";
501     case DW_TAG_template_value_param:   return "DW_TAG_template_value_param";
502     case DW_TAG_thrown_type:            return "DW_TAG_thrown_type";
503     case DW_TAG_try_block:              return "DW_TAG_try_block";
504     case DW_TAG_variant_part:           return "DW_TAG_variant_part";
505     case DW_TAG_variable:               return "DW_TAG_variable";
506     case DW_TAG_volatile_type:          return "DW_TAG_volatile_type";
507     case DW_TAG_MIPS_loop:              return "DW_TAG_MIPS_loop";
508     case DW_TAG_format_label:           return "DW_TAG_format_label";
509     case DW_TAG_function_template:      return "DW_TAG_function_template";
510     case DW_TAG_class_template:         return "DW_TAG_class_template";
511       /* DWARF 2.1 values.  */
512     case DW_TAG_dwarf_procedure:        return "DW_TAG_dwarf_procedure";
513     case DW_TAG_restrict_type:          return "DW_TAG_restrict_type";
514     case DW_TAG_interface_type:         return "DW_TAG_interface_type";
515     case DW_TAG_namespace:              return "DW_TAG_namespace";
516     case DW_TAG_imported_module:        return "DW_TAG_imported_module";
517     case DW_TAG_unspecified_type:       return "DW_TAG_unspecified_type";
518     case DW_TAG_partial_unit:           return "DW_TAG_partial_unit";
519     case DW_TAG_imported_unit:          return "DW_TAG_imported_unit";
520       /* UPC values.  */
521     case DW_TAG_upc_shared_type:        return "DW_TAG_upc_shared_type";
522     case DW_TAG_upc_strict_type:        return "DW_TAG_upc_strict_type";
523     case DW_TAG_upc_relaxed_type:       return "DW_TAG_upc_relaxed_type";
524     default:
525       {
526         static char buffer[100];
527
528         snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag);
529         return buffer;
530       }
531     }
532 }
533
534 static char *
535 get_FORM_name (unsigned long form)
536 {
537   switch (form)
538     {
539     case DW_FORM_addr:          return "DW_FORM_addr";
540     case DW_FORM_block2:        return "DW_FORM_block2";
541     case DW_FORM_block4:        return "DW_FORM_block4";
542     case DW_FORM_data2:         return "DW_FORM_data2";
543     case DW_FORM_data4:         return "DW_FORM_data4";
544     case DW_FORM_data8:         return "DW_FORM_data8";
545     case DW_FORM_string:        return "DW_FORM_string";
546     case DW_FORM_block:         return "DW_FORM_block";
547     case DW_FORM_block1:        return "DW_FORM_block1";
548     case DW_FORM_data1:         return "DW_FORM_data1";
549     case DW_FORM_flag:          return "DW_FORM_flag";
550     case DW_FORM_sdata:         return "DW_FORM_sdata";
551     case DW_FORM_strp:          return "DW_FORM_strp";
552     case DW_FORM_udata:         return "DW_FORM_udata";
553     case DW_FORM_ref_addr:      return "DW_FORM_ref_addr";
554     case DW_FORM_ref1:          return "DW_FORM_ref1";
555     case DW_FORM_ref2:          return "DW_FORM_ref2";
556     case DW_FORM_ref4:          return "DW_FORM_ref4";
557     case DW_FORM_ref8:          return "DW_FORM_ref8";
558     case DW_FORM_ref_udata:     return "DW_FORM_ref_udata";
559     case DW_FORM_indirect:      return "DW_FORM_indirect";
560     default:
561       {
562         static char buffer[100];
563
564         snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
565         return buffer;
566       }
567     }
568 }
569
570 static unsigned char *
571 display_block (unsigned char *data, unsigned long length)
572 {
573   printf (_(" %lu byte block: "), length);
574
575   while (length --)
576     printf ("%lx ", (unsigned long) byte_get (data++, 1));
577
578   return data;
579 }
580
581 static int
582 decode_location_expression (unsigned char * data,
583                             unsigned int pointer_size,
584                             unsigned long length,
585                             unsigned long cu_offset)
586 {
587   unsigned op;
588   unsigned int bytes_read;
589   unsigned long uvalue;
590   unsigned char *end = data + length;
591   int need_frame_base = 0;
592
593   while (data < end)
594     {
595       op = *data++;
596
597       switch (op)
598         {
599         case DW_OP_addr:
600           printf ("DW_OP_addr: %lx",
601                   (unsigned long) byte_get (data, pointer_size));
602           data += pointer_size;
603           break;
604         case DW_OP_deref:
605           printf ("DW_OP_deref");
606           break;
607         case DW_OP_const1u:
608           printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
609           break;
610         case DW_OP_const1s:
611           printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data++, 1));
612           break;
613         case DW_OP_const2u:
614           printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
615           data += 2;
616           break;
617         case DW_OP_const2s:
618           printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data, 2));
619           data += 2;
620           break;
621         case DW_OP_const4u:
622           printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
623           data += 4;
624           break;
625         case DW_OP_const4s:
626           printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data, 4));
627           data += 4;
628           break;
629         case DW_OP_const8u:
630           printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
631                   (unsigned long) byte_get (data + 4, 4));
632           data += 8;
633           break;
634         case DW_OP_const8s:
635           printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
636                   (long) byte_get (data + 4, 4));
637           data += 8;
638           break;
639         case DW_OP_constu:
640           printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
641           data += bytes_read;
642           break;
643         case DW_OP_consts:
644           printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
645           data += bytes_read;
646           break;
647         case DW_OP_dup:
648           printf ("DW_OP_dup");
649           break;
650         case DW_OP_drop:
651           printf ("DW_OP_drop");
652           break;
653         case DW_OP_over:
654           printf ("DW_OP_over");
655           break;
656         case DW_OP_pick:
657           printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
658           break;
659         case DW_OP_swap:
660           printf ("DW_OP_swap");
661           break;
662         case DW_OP_rot:
663           printf ("DW_OP_rot");
664           break;
665         case DW_OP_xderef:
666           printf ("DW_OP_xderef");
667           break;
668         case DW_OP_abs:
669           printf ("DW_OP_abs");
670           break;
671         case DW_OP_and:
672           printf ("DW_OP_and");
673           break;
674         case DW_OP_div:
675           printf ("DW_OP_div");
676           break;
677         case DW_OP_minus:
678           printf ("DW_OP_minus");
679           break;
680         case DW_OP_mod:
681           printf ("DW_OP_mod");
682           break;
683         case DW_OP_mul:
684           printf ("DW_OP_mul");
685           break;
686         case DW_OP_neg:
687           printf ("DW_OP_neg");
688           break;
689         case DW_OP_not:
690           printf ("DW_OP_not");
691           break;
692         case DW_OP_or:
693           printf ("DW_OP_or");
694           break;
695         case DW_OP_plus:
696           printf ("DW_OP_plus");
697           break;
698         case DW_OP_plus_uconst:
699           printf ("DW_OP_plus_uconst: %lu",
700                   read_leb128 (data, &bytes_read, 0));
701           data += bytes_read;
702           break;
703         case DW_OP_shl:
704           printf ("DW_OP_shl");
705           break;
706         case DW_OP_shr:
707           printf ("DW_OP_shr");
708           break;
709         case DW_OP_shra:
710           printf ("DW_OP_shra");
711           break;
712         case DW_OP_xor:
713           printf ("DW_OP_xor");
714           break;
715         case DW_OP_bra:
716           printf ("DW_OP_bra: %ld", (long) byte_get_signed (data, 2));
717           data += 2;
718           break;
719         case DW_OP_eq:
720           printf ("DW_OP_eq");
721           break;
722         case DW_OP_ge:
723           printf ("DW_OP_ge");
724           break;
725         case DW_OP_gt:
726           printf ("DW_OP_gt");
727           break;
728         case DW_OP_le:
729           printf ("DW_OP_le");
730           break;
731         case DW_OP_lt:
732           printf ("DW_OP_lt");
733           break;
734         case DW_OP_ne:
735           printf ("DW_OP_ne");
736           break;
737         case DW_OP_skip:
738           printf ("DW_OP_skip: %ld", (long) byte_get_signed (data, 2));
739           data += 2;
740           break;
741
742         case DW_OP_lit0:
743         case DW_OP_lit1:
744         case DW_OP_lit2:
745         case DW_OP_lit3:
746         case DW_OP_lit4:
747         case DW_OP_lit5:
748         case DW_OP_lit6:
749         case DW_OP_lit7:
750         case DW_OP_lit8:
751         case DW_OP_lit9:
752         case DW_OP_lit10:
753         case DW_OP_lit11:
754         case DW_OP_lit12:
755         case DW_OP_lit13:
756         case DW_OP_lit14:
757         case DW_OP_lit15:
758         case DW_OP_lit16:
759         case DW_OP_lit17:
760         case DW_OP_lit18:
761         case DW_OP_lit19:
762         case DW_OP_lit20:
763         case DW_OP_lit21:
764         case DW_OP_lit22:
765         case DW_OP_lit23:
766         case DW_OP_lit24:
767         case DW_OP_lit25:
768         case DW_OP_lit26:
769         case DW_OP_lit27:
770         case DW_OP_lit28:
771         case DW_OP_lit29:
772         case DW_OP_lit30:
773         case DW_OP_lit31:
774           printf ("DW_OP_lit%d", op - DW_OP_lit0);
775           break;
776
777         case DW_OP_reg0:
778         case DW_OP_reg1:
779         case DW_OP_reg2:
780         case DW_OP_reg3:
781         case DW_OP_reg4:
782         case DW_OP_reg5:
783         case DW_OP_reg6:
784         case DW_OP_reg7:
785         case DW_OP_reg8:
786         case DW_OP_reg9:
787         case DW_OP_reg10:
788         case DW_OP_reg11:
789         case DW_OP_reg12:
790         case DW_OP_reg13:
791         case DW_OP_reg14:
792         case DW_OP_reg15:
793         case DW_OP_reg16:
794         case DW_OP_reg17:
795         case DW_OP_reg18:
796         case DW_OP_reg19:
797         case DW_OP_reg20:
798         case DW_OP_reg21:
799         case DW_OP_reg22:
800         case DW_OP_reg23:
801         case DW_OP_reg24:
802         case DW_OP_reg25:
803         case DW_OP_reg26:
804         case DW_OP_reg27:
805         case DW_OP_reg28:
806         case DW_OP_reg29:
807         case DW_OP_reg30:
808         case DW_OP_reg31:
809           printf ("DW_OP_reg%d", op - DW_OP_reg0);
810           break;
811
812         case DW_OP_breg0:
813         case DW_OP_breg1:
814         case DW_OP_breg2:
815         case DW_OP_breg3:
816         case DW_OP_breg4:
817         case DW_OP_breg5:
818         case DW_OP_breg6:
819         case DW_OP_breg7:
820         case DW_OP_breg8:
821         case DW_OP_breg9:
822         case DW_OP_breg10:
823         case DW_OP_breg11:
824         case DW_OP_breg12:
825         case DW_OP_breg13:
826         case DW_OP_breg14:
827         case DW_OP_breg15:
828         case DW_OP_breg16:
829         case DW_OP_breg17:
830         case DW_OP_breg18:
831         case DW_OP_breg19:
832         case DW_OP_breg20:
833         case DW_OP_breg21:
834         case DW_OP_breg22:
835         case DW_OP_breg23:
836         case DW_OP_breg24:
837         case DW_OP_breg25:
838         case DW_OP_breg26:
839         case DW_OP_breg27:
840         case DW_OP_breg28:
841         case DW_OP_breg29:
842         case DW_OP_breg30:
843         case DW_OP_breg31:
844           printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
845                   read_leb128 (data, &bytes_read, 1));
846           data += bytes_read;
847           break;
848
849         case DW_OP_regx:
850           printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
851           data += bytes_read;
852           break;
853         case DW_OP_fbreg:
854           need_frame_base = 1;
855           printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
856           data += bytes_read;
857           break;
858         case DW_OP_bregx:
859           uvalue = read_leb128 (data, &bytes_read, 0);
860           data += bytes_read;
861           printf ("DW_OP_bregx: %lu %ld", uvalue,
862                   read_leb128 (data, &bytes_read, 1));
863           data += bytes_read;
864           break;
865         case DW_OP_piece:
866           printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
867           data += bytes_read;
868           break;
869         case DW_OP_deref_size:
870           printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
871           break;
872         case DW_OP_xderef_size:
873           printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
874           break;
875         case DW_OP_nop:
876           printf ("DW_OP_nop");
877           break;
878
879           /* DWARF 3 extensions.  */
880         case DW_OP_push_object_address:
881           printf ("DW_OP_push_object_address");
882           break;
883         case DW_OP_call2:
884           /* XXX: Strictly speaking for 64-bit DWARF3 files
885              this ought to be an 8-byte wide computation.  */
886           printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2) + cu_offset);
887           data += 2;
888           break;
889         case DW_OP_call4:
890           /* XXX: Strictly speaking for 64-bit DWARF3 files
891              this ought to be an 8-byte wide computation.  */
892           printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4) + cu_offset);
893           data += 4;
894           break;
895         case DW_OP_call_ref:
896           printf ("DW_OP_call_ref");
897           break;
898
899           /* GNU extensions.  */
900         case DW_OP_GNU_push_tls_address:
901           printf ("DW_OP_GNU_push_tls_address");
902           break;
903
904         default:
905           if (op >= DW_OP_lo_user
906               && op <= DW_OP_hi_user)
907             printf (_("(User defined location op)"));
908           else
909             printf (_("(Unknown location op)"));
910           /* No way to tell where the next op is, so just bail.  */
911           return need_frame_base;
912         }
913
914       /* Separate the ops.  */
915       if (data < end)
916         printf ("; ");
917     }
918
919   return need_frame_base;
920 }
921
922 static unsigned char *
923 read_and_display_attr_value (unsigned long attribute,
924                              unsigned long form,
925                              unsigned char *data,
926                              unsigned long cu_offset,
927                              unsigned long pointer_size,
928                              unsigned long offset_size,
929                              int dwarf_version,
930                              debug_info *debug_info_p,
931                              int do_loc)
932 {
933   unsigned long uvalue = 0;
934   unsigned char *block_start = NULL;
935   unsigned int bytes_read;
936
937   switch (form)
938     {
939     default:
940       break;
941
942     case DW_FORM_ref_addr:
943       if (dwarf_version == 2)
944         {
945           uvalue = byte_get (data, pointer_size);
946           data += pointer_size;
947         }
948       else if (dwarf_version == 3)
949         {
950           uvalue = byte_get (data, offset_size);
951           data += offset_size;
952         }
953       else
954         {
955           error (_("Internal error: DWARF version is not 2 or 3.\n"));
956         }
957       break;
958
959     case DW_FORM_addr:
960       uvalue = byte_get (data, pointer_size);
961       data += pointer_size;
962       break;
963
964     case DW_FORM_strp:
965       uvalue = byte_get (data, offset_size);
966       data += offset_size;
967       break;
968
969     case DW_FORM_ref1:
970     case DW_FORM_flag:
971     case DW_FORM_data1:
972       uvalue = byte_get (data++, 1);
973       break;
974
975     case DW_FORM_ref2:
976     case DW_FORM_data2:
977       uvalue = byte_get (data, 2);
978       data += 2;
979       break;
980
981     case DW_FORM_ref4:
982     case DW_FORM_data4:
983       uvalue = byte_get (data, 4);
984       data += 4;
985       break;
986
987     case DW_FORM_sdata:
988       uvalue = read_leb128 (data, & bytes_read, 1);
989       data += bytes_read;
990       break;
991
992     case DW_FORM_ref_udata:
993     case DW_FORM_udata:
994       uvalue = read_leb128 (data, & bytes_read, 0);
995       data += bytes_read;
996       break;
997
998     case DW_FORM_indirect:
999       form = read_leb128 (data, & bytes_read, 0);
1000       data += bytes_read;
1001       if (!do_loc)
1002         printf (" %s", get_FORM_name (form));
1003       return read_and_display_attr_value (attribute, form, data,
1004                                           cu_offset, pointer_size,
1005                                           offset_size, dwarf_version,
1006                                           debug_info_p, do_loc);
1007     }
1008
1009   switch (form)
1010     {
1011     case DW_FORM_ref_addr:
1012       if (!do_loc)
1013         printf (" <#%lx>", uvalue);
1014       break;
1015
1016     case DW_FORM_ref1:
1017     case DW_FORM_ref2:
1018     case DW_FORM_ref4:
1019     case DW_FORM_ref_udata:
1020       if (!do_loc)
1021         printf (" <%lx>", uvalue + cu_offset);
1022       break;
1023
1024     case DW_FORM_data4:
1025     case DW_FORM_addr:
1026       if (!do_loc)
1027         printf (" %#lx", uvalue);
1028       break;
1029
1030     case DW_FORM_flag:
1031     case DW_FORM_data1:
1032     case DW_FORM_data2:
1033     case DW_FORM_sdata:
1034     case DW_FORM_udata:
1035       if (!do_loc)
1036         printf (" %ld", uvalue);
1037       break;
1038
1039     case DW_FORM_ref8:
1040     case DW_FORM_data8:
1041       if (!do_loc)
1042         {
1043           uvalue = byte_get (data, 4);
1044           printf (" %lx", uvalue);
1045           printf (" %lx", (unsigned long) byte_get (data + 4, 4));
1046         }
1047       if ((do_loc || do_debug_loc || do_debug_ranges)
1048           && num_debug_info_entries == 0)
1049         {
1050           if (sizeof (uvalue) == 8)
1051             uvalue = byte_get (data, 8);
1052           else
1053             error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
1054         }
1055       data += 8;
1056       break;
1057
1058     case DW_FORM_string:
1059       if (!do_loc)
1060         printf (" %s", data);
1061       data += strlen ((char *) data) + 1;
1062       break;
1063
1064     case DW_FORM_block:
1065       uvalue = read_leb128 (data, & bytes_read, 0);
1066       block_start = data + bytes_read;
1067       if (do_loc)
1068         data = block_start + uvalue;
1069       else
1070         data = display_block (block_start, uvalue);
1071       break;
1072
1073     case DW_FORM_block1:
1074       uvalue = byte_get (data, 1);
1075       block_start = data + 1;
1076       if (do_loc)
1077         data = block_start + uvalue;
1078       else
1079         data = display_block (block_start, uvalue);
1080       break;
1081
1082     case DW_FORM_block2:
1083       uvalue = byte_get (data, 2);
1084       block_start = data + 2;
1085       if (do_loc)
1086         data = block_start + uvalue;
1087       else
1088         data = display_block (block_start, uvalue);
1089       break;
1090
1091     case DW_FORM_block4:
1092       uvalue = byte_get (data, 4);
1093       block_start = data + 4;
1094       if (do_loc)
1095         data = block_start + uvalue;
1096       else
1097         data = display_block (block_start, uvalue);
1098       break;
1099
1100     case DW_FORM_strp:
1101       if (!do_loc)
1102         printf (_(" (indirect string, offset: 0x%lx): %s"),
1103                 uvalue, fetch_indirect_string (uvalue));
1104       break;
1105
1106     case DW_FORM_indirect:
1107       /* Handled above.  */
1108       break;
1109
1110     default:
1111       warn (_("Unrecognized form: %lu\n"), form);
1112       break;
1113     }
1114
1115   /* For some attributes we can display further information.  */
1116   if ((do_loc || do_debug_loc || do_debug_ranges)
1117       && num_debug_info_entries == 0)
1118     {
1119       switch (attribute)
1120         {
1121         case DW_AT_frame_base:
1122           have_frame_base = 1;
1123         case DW_AT_location:
1124         case DW_AT_data_member_location:
1125         case DW_AT_vtable_elem_location:
1126         case DW_AT_allocated:
1127         case DW_AT_associated:
1128         case DW_AT_data_location:
1129         case DW_AT_stride:
1130         case DW_AT_upper_bound:
1131         case DW_AT_lower_bound:
1132           if (form == DW_FORM_data4 || form == DW_FORM_data8)
1133             {
1134               /* Process location list.  */
1135               unsigned int max = debug_info_p->max_loc_offsets;
1136               unsigned int num = debug_info_p->num_loc_offsets;
1137
1138               if (max == 0 || num >= max)
1139                 {
1140                   max += 1024;
1141                   debug_info_p->loc_offsets
1142                     = xcrealloc (debug_info_p->loc_offsets,
1143                                  max, sizeof (*debug_info_p->loc_offsets));
1144                   debug_info_p->have_frame_base
1145                     = xcrealloc (debug_info_p->have_frame_base,
1146                                  max, sizeof (*debug_info_p->have_frame_base));
1147                   debug_info_p->max_loc_offsets = max;
1148                 }
1149               debug_info_p->loc_offsets [num] = uvalue;
1150               debug_info_p->have_frame_base [num] = have_frame_base;
1151               debug_info_p->num_loc_offsets++;
1152             }
1153           break;
1154         
1155         case DW_AT_low_pc:
1156           if (need_base_address)
1157             debug_info_p->base_address = uvalue;
1158           break;
1159
1160         case DW_AT_ranges:
1161           if (form == DW_FORM_data4 || form == DW_FORM_data8)
1162             {
1163               /* Process range list.  */
1164               unsigned int max = debug_info_p->max_range_lists;
1165               unsigned int num = debug_info_p->num_range_lists;
1166
1167               if (max == 0 || num >= max)
1168                 {
1169                   max += 1024;
1170                   debug_info_p->range_lists
1171                     = xcrealloc (debug_info_p->range_lists,
1172                                  max, sizeof (*debug_info_p->range_lists));
1173                   debug_info_p->max_range_lists = max;
1174                 }
1175               debug_info_p->range_lists [num] = uvalue;
1176               debug_info_p->num_range_lists++;
1177             }
1178           break;
1179
1180         default:
1181           break;
1182         }
1183     }
1184
1185   if (do_loc)
1186     return data;
1187
1188   printf ("\t");
1189
1190   switch (attribute)
1191     {
1192     case DW_AT_inline:
1193       switch (uvalue)
1194         {
1195         case DW_INL_not_inlined:
1196           printf (_("(not inlined)"));
1197           break;
1198         case DW_INL_inlined:
1199           printf (_("(inlined)"));
1200           break;
1201         case DW_INL_declared_not_inlined:
1202           printf (_("(declared as inline but ignored)"));
1203           break;
1204         case DW_INL_declared_inlined:
1205           printf (_("(declared as inline and inlined)"));
1206           break;
1207         default:
1208           printf (_("  (Unknown inline attribute value: %lx)"), uvalue);
1209           break;
1210         }
1211       break;
1212
1213     case DW_AT_language:
1214       switch (uvalue)
1215         {
1216           /* Ordered by the numeric value of these constants.  */
1217         case DW_LANG_C89:               printf ("(ANSI C)"); break;
1218         case DW_LANG_C:                 printf ("(non-ANSI C)"); break;
1219         case DW_LANG_Ada83:             printf ("(Ada)"); break;
1220         case DW_LANG_C_plus_plus:       printf ("(C++)"); break;
1221         case DW_LANG_Cobol74:           printf ("(Cobol 74)"); break;
1222         case DW_LANG_Cobol85:           printf ("(Cobol 85)"); break;
1223         case DW_LANG_Fortran77:         printf ("(FORTRAN 77)"); break;
1224         case DW_LANG_Fortran90:         printf ("(Fortran 90)"); break;
1225         case DW_LANG_Pascal83:          printf ("(ANSI Pascal)"); break;
1226         case DW_LANG_Modula2:           printf ("(Modula 2)"); break;
1227           /* DWARF 2.1 values.  */
1228         case DW_LANG_Java:              printf ("(Java)"); break;
1229         case DW_LANG_C99:               printf ("(ANSI C99)"); break;
1230         case DW_LANG_Ada95:             printf ("(ADA 95)"); break;
1231         case DW_LANG_Fortran95:         printf ("(Fortran 95)"); break;
1232           /* DWARF 3 values.  */
1233         case DW_LANG_PLI:               printf ("(PLI)"); break;
1234         case DW_LANG_ObjC:              printf ("(Objective C)"); break;
1235         case DW_LANG_ObjC_plus_plus:    printf ("(Objective C++)"); break;
1236         case DW_LANG_UPC:               printf ("(Unified Parallel C)"); break;
1237         case DW_LANG_D:                 printf ("(D)"); break;
1238           /* MIPS extension.  */
1239         case DW_LANG_Mips_Assembler:    printf ("(MIPS assembler)"); break;
1240           /* UPC extension.  */
1241         case DW_LANG_Upc:               printf ("(Unified Parallel C)"); break;
1242         default:
1243           if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
1244             printf ("(implementation defined: %lx)", uvalue);
1245           else
1246             printf ("(Unknown: %lx)", uvalue);
1247           break;
1248         }
1249       break;
1250
1251     case DW_AT_encoding:
1252       switch (uvalue)
1253         {
1254         case DW_ATE_void:               printf ("(void)"); break;
1255         case DW_ATE_address:            printf ("(machine address)"); break;
1256         case DW_ATE_boolean:            printf ("(boolean)"); break;
1257         case DW_ATE_complex_float:      printf ("(complex float)"); break;
1258         case DW_ATE_float:              printf ("(float)"); break;
1259         case DW_ATE_signed:             printf ("(signed)"); break;
1260         case DW_ATE_signed_char:        printf ("(signed char)"); break;
1261         case DW_ATE_unsigned:           printf ("(unsigned)"); break;
1262         case DW_ATE_unsigned_char:      printf ("(unsigned char)"); break;
1263           /* DWARF 2.1 value.  */
1264         case DW_ATE_imaginary_float:    printf ("(imaginary float)"); break;
1265         case DW_ATE_decimal_float:      printf ("(decimal float)"); break;
1266         default:
1267           if (uvalue >= DW_ATE_lo_user
1268               && uvalue <= DW_ATE_hi_user)
1269             printf ("(user defined type)");
1270           else
1271             printf ("(unknown type)");
1272           break;
1273         }
1274       break;
1275
1276     case DW_AT_accessibility:
1277       switch (uvalue)
1278         {
1279         case DW_ACCESS_public:          printf ("(public)"); break;
1280         case DW_ACCESS_protected:       printf ("(protected)"); break;
1281         case DW_ACCESS_private:         printf ("(private)"); break;
1282         default:
1283           printf ("(unknown accessibility)");
1284           break;
1285         }
1286       break;
1287
1288     case DW_AT_visibility:
1289       switch (uvalue)
1290         {
1291         case DW_VIS_local:              printf ("(local)"); break;
1292         case DW_VIS_exported:           printf ("(exported)"); break;
1293         case DW_VIS_qualified:          printf ("(qualified)"); break;
1294         default:                        printf ("(unknown visibility)"); break;
1295         }
1296       break;
1297
1298     case DW_AT_virtuality:
1299       switch (uvalue)
1300         {
1301         case DW_VIRTUALITY_none:        printf ("(none)"); break;
1302         case DW_VIRTUALITY_virtual:     printf ("(virtual)"); break;
1303         case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
1304         default:                        printf ("(unknown virtuality)"); break;
1305         }
1306       break;
1307
1308     case DW_AT_identifier_case:
1309       switch (uvalue)
1310         {
1311         case DW_ID_case_sensitive:      printf ("(case_sensitive)"); break;
1312         case DW_ID_up_case:             printf ("(up_case)"); break;
1313         case DW_ID_down_case:           printf ("(down_case)"); break;
1314         case DW_ID_case_insensitive:    printf ("(case_insensitive)"); break;
1315         default:                        printf ("(unknown case)"); break;
1316         }
1317       break;
1318
1319     case DW_AT_calling_convention:
1320       switch (uvalue)
1321         {
1322         case DW_CC_normal:      printf ("(normal)"); break;
1323         case DW_CC_program:     printf ("(program)"); break;
1324         case DW_CC_nocall:      printf ("(nocall)"); break;
1325         default:
1326           if (uvalue >= DW_CC_lo_user
1327               && uvalue <= DW_CC_hi_user)
1328             printf ("(user defined)");
1329           else
1330             printf ("(unknown convention)");
1331         }
1332       break;
1333
1334     case DW_AT_ordering:
1335       switch (uvalue)
1336         {
1337         case -1: printf ("(undefined)"); break;
1338         case 0:  printf ("(row major)"); break;
1339         case 1:  printf ("(column major)"); break;
1340         }
1341       break;
1342
1343     case DW_AT_frame_base:
1344       have_frame_base = 1;
1345     case DW_AT_location:
1346     case DW_AT_data_member_location:
1347     case DW_AT_vtable_elem_location:
1348     case DW_AT_allocated:
1349     case DW_AT_associated:
1350     case DW_AT_data_location:
1351     case DW_AT_stride:
1352     case DW_AT_upper_bound:
1353     case DW_AT_lower_bound:
1354       if (block_start)
1355         {
1356           int need_frame_base;
1357
1358           printf ("(");
1359           need_frame_base = decode_location_expression (block_start,
1360                                                         pointer_size,
1361                                                         uvalue,
1362                                                         cu_offset);
1363           printf (")");
1364           if (need_frame_base && !have_frame_base)
1365             printf (_(" [without DW_AT_frame_base]"));
1366         }
1367       else if (form == DW_FORM_data4 || form == DW_FORM_data8)
1368         printf (_("(location list)"));
1369
1370       break;
1371
1372     default:
1373       break;
1374     }
1375
1376   return data;
1377 }
1378
1379 static char *
1380 get_AT_name (unsigned long attribute)
1381 {
1382   switch (attribute)
1383     {
1384     case DW_AT_sibling:                 return "DW_AT_sibling";
1385     case DW_AT_location:                return "DW_AT_location";
1386     case DW_AT_name:                    return "DW_AT_name";
1387     case DW_AT_ordering:                return "DW_AT_ordering";
1388     case DW_AT_subscr_data:             return "DW_AT_subscr_data";
1389     case DW_AT_byte_size:               return "DW_AT_byte_size";
1390     case DW_AT_bit_offset:              return "DW_AT_bit_offset";
1391     case DW_AT_bit_size:                return "DW_AT_bit_size";
1392     case DW_AT_element_list:            return "DW_AT_element_list";
1393     case DW_AT_stmt_list:               return "DW_AT_stmt_list";
1394     case DW_AT_low_pc:                  return "DW_AT_low_pc";
1395     case DW_AT_high_pc:                 return "DW_AT_high_pc";
1396     case DW_AT_language:                return "DW_AT_language";
1397     case DW_AT_member:                  return "DW_AT_member";
1398     case DW_AT_discr:                   return "DW_AT_discr";
1399     case DW_AT_discr_value:             return "DW_AT_discr_value";
1400     case DW_AT_visibility:              return "DW_AT_visibility";
1401     case DW_AT_import:                  return "DW_AT_import";
1402     case DW_AT_string_length:           return "DW_AT_string_length";
1403     case DW_AT_common_reference:        return "DW_AT_common_reference";
1404     case DW_AT_comp_dir:                return "DW_AT_comp_dir";
1405     case DW_AT_const_value:             return "DW_AT_const_value";
1406     case DW_AT_containing_type:         return "DW_AT_containing_type";
1407     case DW_AT_default_value:           return "DW_AT_default_value";
1408     case DW_AT_inline:                  return "DW_AT_inline";
1409     case DW_AT_is_optional:             return "DW_AT_is_optional";
1410     case DW_AT_lower_bound:             return "DW_AT_lower_bound";
1411     case DW_AT_producer:                return "DW_AT_producer";
1412     case DW_AT_prototyped:              return "DW_AT_prototyped";
1413     case DW_AT_return_addr:             return "DW_AT_return_addr";
1414     case DW_AT_start_scope:             return "DW_AT_start_scope";
1415     case DW_AT_stride_size:             return "DW_AT_stride_size";
1416     case DW_AT_upper_bound:             return "DW_AT_upper_bound";
1417     case DW_AT_abstract_origin:         return "DW_AT_abstract_origin";
1418     case DW_AT_accessibility:           return "DW_AT_accessibility";
1419     case DW_AT_address_class:           return "DW_AT_address_class";
1420     case DW_AT_artificial:              return "DW_AT_artificial";
1421     case DW_AT_base_types:              return "DW_AT_base_types";
1422     case DW_AT_calling_convention:      return "DW_AT_calling_convention";
1423     case DW_AT_count:                   return "DW_AT_count";
1424     case DW_AT_data_member_location:    return "DW_AT_data_member_location";
1425     case DW_AT_decl_column:             return "DW_AT_decl_column";
1426     case DW_AT_decl_file:               return "DW_AT_decl_file";
1427     case DW_AT_decl_line:               return "DW_AT_decl_line";
1428     case DW_AT_declaration:             return "DW_AT_declaration";
1429     case DW_AT_discr_list:              return "DW_AT_discr_list";
1430     case DW_AT_encoding:                return "DW_AT_encoding";
1431     case DW_AT_external:                return "DW_AT_external";
1432     case DW_AT_frame_base:              return "DW_AT_frame_base";
1433     case DW_AT_friend:                  return "DW_AT_friend";
1434     case DW_AT_identifier_case:         return "DW_AT_identifier_case";
1435     case DW_AT_macro_info:              return "DW_AT_macro_info";
1436     case DW_AT_namelist_items:          return "DW_AT_namelist_items";
1437     case DW_AT_priority:                return "DW_AT_priority";
1438     case DW_AT_segment:                 return "DW_AT_segment";
1439     case DW_AT_specification:           return "DW_AT_specification";
1440     case DW_AT_static_link:             return "DW_AT_static_link";
1441     case DW_AT_type:                    return "DW_AT_type";
1442     case DW_AT_use_location:            return "DW_AT_use_location";
1443     case DW_AT_variable_parameter:      return "DW_AT_variable_parameter";
1444     case DW_AT_virtuality:              return "DW_AT_virtuality";
1445     case DW_AT_vtable_elem_location:    return "DW_AT_vtable_elem_location";
1446       /* DWARF 2.1 values.  */
1447     case DW_AT_allocated:               return "DW_AT_allocated";
1448     case DW_AT_associated:              return "DW_AT_associated";
1449     case DW_AT_data_location:           return "DW_AT_data_location";
1450     case DW_AT_stride:                  return "DW_AT_stride";
1451     case DW_AT_entry_pc:                return "DW_AT_entry_pc";
1452     case DW_AT_use_UTF8:                return "DW_AT_use_UTF8";
1453     case DW_AT_extension:               return "DW_AT_extension";
1454     case DW_AT_ranges:                  return "DW_AT_ranges";
1455     case DW_AT_trampoline:              return "DW_AT_trampoline";
1456     case DW_AT_call_column:             return "DW_AT_call_column";
1457     case DW_AT_call_file:               return "DW_AT_call_file";
1458     case DW_AT_call_line:               return "DW_AT_call_line";
1459       /* SGI/MIPS extensions.  */
1460     case DW_AT_MIPS_fde:                return "DW_AT_MIPS_fde";
1461     case DW_AT_MIPS_loop_begin:         return "DW_AT_MIPS_loop_begin";
1462     case DW_AT_MIPS_tail_loop_begin:    return "DW_AT_MIPS_tail_loop_begin";
1463     case DW_AT_MIPS_epilog_begin:       return "DW_AT_MIPS_epilog_begin";
1464     case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
1465     case DW_AT_MIPS_software_pipeline_depth:
1466       return "DW_AT_MIPS_software_pipeline_depth";
1467     case DW_AT_MIPS_linkage_name:       return "DW_AT_MIPS_linkage_name";
1468     case DW_AT_MIPS_stride:             return "DW_AT_MIPS_stride";
1469     case DW_AT_MIPS_abstract_name:      return "DW_AT_MIPS_abstract_name";
1470     case DW_AT_MIPS_clone_origin:       return "DW_AT_MIPS_clone_origin";
1471     case DW_AT_MIPS_has_inlines:        return "DW_AT_MIPS_has_inlines";
1472       /* GNU extensions.  */
1473     case DW_AT_sf_names:                return "DW_AT_sf_names";
1474     case DW_AT_src_info:                return "DW_AT_src_info";
1475     case DW_AT_mac_info:                return "DW_AT_mac_info";
1476     case DW_AT_src_coords:              return "DW_AT_src_coords";
1477     case DW_AT_body_begin:              return "DW_AT_body_begin";
1478     case DW_AT_body_end:                return "DW_AT_body_end";
1479     case DW_AT_GNU_vector:              return "DW_AT_GNU_vector";
1480       /* UPC extension.  */
1481     case DW_AT_upc_threads_scaled:      return "DW_AT_upc_threads_scaled";
1482     default:
1483       {
1484         static char buffer[100];
1485
1486         snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
1487                   attribute);
1488         return buffer;
1489       }
1490     }
1491 }
1492
1493 static unsigned char *
1494 read_and_display_attr (unsigned long attribute,
1495                        unsigned long form,
1496                        unsigned char *data,
1497                        unsigned long cu_offset,
1498                        unsigned long pointer_size,
1499                        unsigned long offset_size,
1500                        int dwarf_version,
1501                        debug_info *debug_info_p,
1502                        int do_loc)
1503 {
1504   if (!do_loc)
1505     printf ("     %-18s:", get_AT_name (attribute));
1506   data = read_and_display_attr_value (attribute, form, data, cu_offset,
1507                                       pointer_size, offset_size,
1508                                       dwarf_version, debug_info_p,
1509                                       do_loc);
1510   if (!do_loc)
1511     printf ("\n");
1512   return data;
1513 }
1514
1515
1516 /* Process the contents of a .debug_info section.  If do_loc is non-zero
1517    then we are scanning for location lists and we do not want to display
1518    anything to the user.  */
1519
1520 static int
1521 process_debug_info (struct dwarf_section *section, void *file,
1522                     int do_loc)
1523 {
1524   unsigned char *start = section->start;
1525   unsigned char *end = start + section->size;
1526   unsigned char *section_begin;
1527   unsigned int unit;
1528   unsigned int num_units = 0;
1529
1530   if ((do_loc || do_debug_loc || do_debug_ranges)
1531       && num_debug_info_entries == 0)
1532     {
1533       unsigned long length;
1534
1535       /* First scan the section to get the number of comp units.  */
1536       for (section_begin = start, num_units = 0; section_begin < end;
1537            num_units ++)
1538         {
1539           /* Read the first 4 bytes.  For a 32-bit DWARF section, this
1540              will be the length.  For a 64-bit DWARF section, it'll be
1541              the escape code 0xffffffff followed by an 8 byte length.  */
1542           length = byte_get (section_begin, 4);
1543
1544           if (length == 0xffffffff)
1545             {
1546               length = byte_get (section_begin + 4, 8);
1547               section_begin += length + 12;
1548             }
1549           else
1550             section_begin += length + 4;
1551         }
1552
1553       if (num_units == 0)
1554         {
1555           error (_("No comp units in %s section ?"), section->name);
1556           return 0;
1557         }
1558
1559       /* Then allocate an array to hold the information.  */
1560       debug_information = cmalloc (num_units,
1561                                    sizeof (* debug_information));
1562       if (debug_information == NULL)
1563         {
1564           error (_("Not enough memory for a debug info array of %u entries"),
1565                  num_units);
1566           return 0;
1567         }
1568     }
1569
1570   if (!do_loc)
1571     {
1572       printf (_("The section %s contains:\n\n"), section->name);
1573
1574       load_debug_section (str, file);
1575     }
1576
1577   load_debug_section (abbrev, file);
1578   if (debug_displays [abbrev].section.start == NULL)
1579     {
1580       warn (_("Unable to locate %s section!\n"),
1581             debug_displays [abbrev].section.name);
1582       return 0;
1583     }
1584
1585   for (section_begin = start, unit = 0; start < end; unit++)
1586     {
1587       DWARF2_Internal_CompUnit compunit;
1588       unsigned char *hdrptr;
1589       unsigned char *cu_abbrev_offset_ptr;
1590       unsigned char *tags;
1591       int level;
1592       unsigned long cu_offset;
1593       int offset_size;
1594       int initial_length_size;
1595
1596       hdrptr = start;
1597
1598       compunit.cu_length = byte_get (hdrptr, 4);
1599       hdrptr += 4;
1600
1601       if (compunit.cu_length == 0xffffffff)
1602         {
1603           compunit.cu_length = byte_get (hdrptr, 8);
1604           hdrptr += 8;
1605           offset_size = 8;
1606           initial_length_size = 12;
1607         }
1608       else
1609         {
1610           offset_size = 4;
1611           initial_length_size = 4;
1612         }
1613
1614       compunit.cu_version = byte_get (hdrptr, 2);
1615       hdrptr += 2;
1616
1617       cu_offset = start - section_begin;
1618
1619       cu_abbrev_offset_ptr = hdrptr;
1620       compunit.cu_abbrev_offset = byte_get (hdrptr, offset_size);
1621       hdrptr += offset_size;
1622
1623       compunit.cu_pointer_size = byte_get (hdrptr, 1);
1624       hdrptr += 1;
1625       if ((do_loc || do_debug_loc || do_debug_ranges)
1626           && num_debug_info_entries == 0)
1627         {
1628           debug_information [unit].cu_offset = cu_offset;
1629           debug_information [unit].pointer_size
1630             = compunit.cu_pointer_size;
1631           debug_information [unit].base_address = 0;
1632           debug_information [unit].loc_offsets = NULL;
1633           debug_information [unit].have_frame_base = NULL;
1634           debug_information [unit].max_loc_offsets = 0;
1635           debug_information [unit].num_loc_offsets = 0;
1636           debug_information [unit].range_lists = NULL;
1637           debug_information [unit].max_range_lists= 0;
1638           debug_information [unit].num_range_lists = 0;
1639         }
1640
1641       if (!do_loc)
1642         {
1643           printf (_("  Compilation Unit @ offset 0x%lx:\n"), cu_offset);
1644           printf (_("   Length:        %ld\n"), compunit.cu_length);
1645           printf (_("   Version:       %d\n"), compunit.cu_version);
1646           printf (_("   Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
1647           printf (_("   Pointer Size:  %d\n"), compunit.cu_pointer_size);
1648         }
1649
1650       if (cu_offset + compunit.cu_length + initial_length_size
1651           > section->size)
1652         {
1653           warn (_("Debug info is corrupted, length is invalid (section is %lu bytes)\n"),
1654                 (unsigned long)section->size);
1655           break;
1656         }
1657       tags = hdrptr;
1658       start += compunit.cu_length + initial_length_size;
1659
1660       if (compunit.cu_version != 2 && compunit.cu_version != 3)
1661         {
1662           warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
1663           continue;
1664         }
1665
1666       free_abbrevs ();
1667
1668       /* Process the abbrevs used by this compilation unit. DWARF
1669          sections under Mach-O have non-zero addresses.  */
1670       if (compunit.cu_abbrev_offset >= debug_displays [abbrev].section.size)
1671         warn (_("Debug info is corrupted, abbrev offset is invalid (section is %lu bytes)\n"),
1672               (unsigned long)debug_displays [abbrev].section.size);
1673       else
1674         process_abbrev_section
1675           ((unsigned char *) debug_displays [abbrev].section.start
1676            + compunit.cu_abbrev_offset - debug_displays [abbrev].section.address,
1677            (unsigned char *) debug_displays [abbrev].section.start
1678            + debug_displays [abbrev].section.size);
1679
1680       level = 0;
1681       while (tags < start)
1682         {
1683           unsigned int bytes_read;
1684           unsigned long abbrev_number;
1685           abbrev_entry *entry;
1686           abbrev_attr *attr;
1687
1688           abbrev_number = read_leb128 (tags, & bytes_read, 0);
1689           tags += bytes_read;
1690
1691           /* A null DIE marks the end of a list of children.  */
1692           if (abbrev_number == 0)
1693             {
1694               --level;
1695               continue;
1696             }
1697
1698           if (!do_loc)
1699             printf (_(" <%d><%lx>: Abbrev Number: %lu"),
1700                     level,
1701                     (unsigned long) (tags - section_begin
1702                                      - bytes_read),
1703                     abbrev_number);
1704  
1705           /* Scan through the abbreviation list until we reach the
1706              correct entry.  */
1707           for (entry = first_abbrev;
1708                entry && entry->entry != abbrev_number;
1709                entry = entry->next)
1710             continue;
1711
1712           if (entry == NULL)
1713             {
1714               if (!do_loc)
1715                 {
1716                   printf ("\n");
1717                   fflush (stdout);
1718                 }
1719               warn (_("Unable to locate entry %lu in the abbreviation table\n"),
1720                     abbrev_number);
1721               return 0;
1722             }
1723
1724           if (!do_loc)
1725             printf (_(" (%s)\n"), get_TAG_name (entry->tag));
1726  
1727           switch (entry->tag)
1728             {
1729             default:
1730               need_base_address = 0;
1731               break;
1732             case DW_TAG_compile_unit:
1733               need_base_address = 1;
1734               break;
1735             case DW_TAG_entry_point:
1736             case DW_TAG_inlined_subroutine:
1737             case DW_TAG_subprogram:
1738               need_base_address = 0;
1739               /* Assuming that there is no DW_AT_frame_base.  */
1740               have_frame_base = 0;
1741               break;
1742             }
1743
1744           for (attr = entry->first_attr; attr; attr = attr->next)
1745             {
1746               if (! do_loc)
1747                 /* Show the offset from where the tag was extracted.  */
1748                 printf ("  <%2lx>", (unsigned long)(tags - section_begin));
1749
1750               tags = read_and_display_attr (attr->attribute,
1751                                             attr->form,
1752                                             tags, cu_offset,
1753                                             compunit.cu_pointer_size,
1754                                             offset_size,
1755                                             compunit.cu_version,
1756                                             &debug_information [unit],
1757                                             do_loc);
1758             }
1759  
1760           if (entry->children)
1761             ++level;
1762         }
1763     }
1764  
1765   /* Set num_debug_info_entries here so that it can be used to check if
1766      we need to process .debug_loc and .debug_ranges sections.  */
1767   if ((do_loc || do_debug_loc || do_debug_ranges)
1768       && num_debug_info_entries == 0)
1769     num_debug_info_entries = num_units;
1770       
1771   if (!do_loc)
1772     {
1773       printf ("\n");
1774     }
1775  
1776   return 1;
1777 }
1778
1779 /* Locate and scan the .debug_info section in the file and record the pointer
1780    sizes and offsets for the compilation units in it.  Usually an executable
1781    will have just one pointer size, but this is not guaranteed, and so we try
1782    not to make any assumptions.  Returns zero upon failure, or the number of
1783    compilation units upon success.  */
1784
1785 static unsigned int
1786 load_debug_info (void * file)
1787 {
1788   /* Reset the last pointer size so that we can issue correct error
1789      messages if we are displaying the contents of more than one section.  */
1790   last_pointer_size = 0;
1791   warned_about_missing_comp_units = FALSE;
1792
1793   /* If we already have the information there is nothing else to do.  */
1794   if (num_debug_info_entries > 0)
1795     return num_debug_info_entries;
1796
1797   if (load_debug_section (info, file)
1798       && process_debug_info (&debug_displays [info].section, file, 1))
1799     return num_debug_info_entries;
1800   else
1801     return 0;
1802 }
1803
1804 static int
1805 display_debug_lines (struct dwarf_section *section, void *file)
1806 {
1807   unsigned char *start = section->start;
1808   unsigned char *data = start;
1809   unsigned char *end = start + section->size;
1810
1811   printf (_("\nDump of debug contents of section %s:\n\n"),
1812           section->name);
1813
1814   load_debug_info (file);
1815
1816   while (data < end)
1817     {
1818       DWARF2_Internal_LineInfo info;
1819       unsigned char *standard_opcodes;
1820       unsigned char *end_of_sequence;
1821       unsigned char *hdrptr;
1822       int initial_length_size;
1823       int offset_size;
1824       int i;
1825
1826       hdrptr = data;
1827
1828       /* Check the length of the block.  */
1829       info.li_length = byte_get (hdrptr, 4);
1830       hdrptr += 4;
1831
1832       if (info.li_length == 0xffffffff)
1833         {
1834           /* This section is 64-bit DWARF 3.  */
1835           info.li_length = byte_get (hdrptr, 8);
1836           hdrptr += 8;
1837           offset_size = 8;
1838           initial_length_size = 12;
1839         }
1840       else
1841         {
1842           offset_size = 4;
1843           initial_length_size = 4;
1844         }
1845
1846       if (info.li_length + initial_length_size > section->size)
1847         {
1848           warn
1849             (_("The line info appears to be corrupt - the section is too small\n"));
1850           return 0;
1851         }
1852
1853       /* Check its version number.  */
1854       info.li_version = byte_get (hdrptr, 2);
1855       hdrptr += 2;
1856       if (info.li_version != 2 && info.li_version != 3)
1857         {
1858           warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
1859           return 0;
1860         }
1861
1862       info.li_prologue_length = byte_get (hdrptr, offset_size);
1863       hdrptr += offset_size;
1864       info.li_min_insn_length = byte_get (hdrptr, 1);
1865       hdrptr++;
1866       info.li_default_is_stmt = byte_get (hdrptr, 1);
1867       hdrptr++;
1868       info.li_line_base = byte_get (hdrptr, 1);
1869       hdrptr++;
1870       info.li_line_range = byte_get (hdrptr, 1);
1871       hdrptr++;
1872       info.li_opcode_base = byte_get (hdrptr, 1);
1873       hdrptr++;
1874
1875       /* Sign extend the line base field.  */
1876       info.li_line_base <<= 24;
1877       info.li_line_base >>= 24;
1878
1879       printf (_("  Length:                      %ld\n"), info.li_length);
1880       printf (_("  DWARF Version:               %d\n"), info.li_version);
1881       printf (_("  Prologue Length:             %d\n"), info.li_prologue_length);
1882       printf (_("  Minimum Instruction Length:  %d\n"), info.li_min_insn_length);
1883       printf (_("  Initial value of 'is_stmt':  %d\n"), info.li_default_is_stmt);
1884       printf (_("  Line Base:                   %d\n"), info.li_line_base);
1885       printf (_("  Line Range:                  %d\n"), info.li_line_range);
1886       printf (_("  Opcode Base:                 %d\n"), info.li_opcode_base);
1887
1888       end_of_sequence = data + info.li_length + initial_length_size;
1889
1890       reset_state_machine (info.li_default_is_stmt);
1891
1892       /* Display the contents of the Opcodes table.  */
1893       standard_opcodes = hdrptr;
1894
1895       printf (_("\n Opcodes:\n"));
1896
1897       for (i = 1; i < info.li_opcode_base; i++)
1898         printf (_("  Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
1899
1900       /* Display the contents of the Directory table.  */
1901       data = standard_opcodes + info.li_opcode_base - 1;
1902
1903       if (*data == 0)
1904         printf (_("\n The Directory Table is empty.\n"));
1905       else
1906         {
1907           printf (_("\n The Directory Table:\n"));
1908
1909           while (*data != 0)
1910             {
1911               printf (_("  %s\n"), data);
1912
1913               data += strlen ((char *) data) + 1;
1914             }
1915         }
1916
1917       /* Skip the NUL at the end of the table.  */
1918       data++;
1919
1920       /* Display the contents of the File Name table.  */
1921       if (*data == 0)
1922         printf (_("\n The File Name Table is empty.\n"));
1923       else
1924         {
1925           printf (_("\n The File Name Table:\n"));
1926           printf (_("  Entry\tDir\tTime\tSize\tName\n"));
1927
1928           while (*data != 0)
1929             {
1930               unsigned char *name;
1931               unsigned int bytes_read;
1932
1933               printf (_("  %d\t"), ++state_machine_regs.last_file_entry);
1934               name = data;
1935
1936               data += strlen ((char *) data) + 1;
1937
1938               printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
1939               data += bytes_read;
1940               printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
1941               data += bytes_read;
1942               printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
1943               data += bytes_read;
1944               printf (_("%s\n"), name);
1945             }
1946         }
1947
1948       /* Skip the NUL at the end of the table.  */
1949       data++;
1950
1951       /* Now display the statements.  */
1952       printf (_("\n Line Number Statements:\n"));
1953
1954       while (data < end_of_sequence)
1955         {
1956           unsigned char op_code;
1957           int adv;
1958           unsigned long int uladv;
1959           unsigned int bytes_read;
1960
1961           op_code = *data++;
1962
1963           if (op_code >= info.li_opcode_base)
1964             {
1965               op_code -= info.li_opcode_base;
1966               uladv = (op_code / info.li_line_range) * info.li_min_insn_length;
1967               state_machine_regs.address += uladv;
1968               printf (_("  Special opcode %d: advance Address by %lu to 0x%lx"),
1969                       op_code, uladv, state_machine_regs.address);
1970               adv = (op_code % info.li_line_range) + info.li_line_base;
1971               state_machine_regs.line += adv;
1972               printf (_(" and Line by %d to %d\n"),
1973                       adv, state_machine_regs.line);
1974             }
1975           else switch (op_code)
1976             {
1977             case DW_LNS_extended_op:
1978               data += process_extended_line_op (data, info.li_default_is_stmt);
1979               break;
1980
1981             case DW_LNS_copy:
1982               printf (_("  Copy\n"));
1983               break;
1984
1985             case DW_LNS_advance_pc:
1986               uladv = read_leb128 (data, & bytes_read, 0);
1987               uladv *= info.li_min_insn_length;
1988               data += bytes_read;
1989               state_machine_regs.address += uladv;
1990               printf (_("  Advance PC by %lu to 0x%lx\n"), uladv,
1991                       state_machine_regs.address);
1992               break;
1993
1994             case DW_LNS_advance_line:
1995               adv = read_leb128 (data, & bytes_read, 1);
1996               data += bytes_read;
1997               state_machine_regs.line += adv;
1998               printf (_("  Advance Line by %d to %d\n"), adv,
1999                       state_machine_regs.line);
2000               break;
2001
2002             case DW_LNS_set_file:
2003               adv = read_leb128 (data, & bytes_read, 0);
2004               data += bytes_read;
2005               printf (_("  Set File Name to entry %d in the File Name Table\n"),
2006                       adv);
2007               state_machine_regs.file = adv;
2008               break;
2009
2010             case DW_LNS_set_column:
2011               uladv = read_leb128 (data, & bytes_read, 0);
2012               data += bytes_read;
2013               printf (_("  Set column to %lu\n"), uladv);
2014               state_machine_regs.column = uladv;
2015               break;
2016
2017             case DW_LNS_negate_stmt:
2018               adv = state_machine_regs.is_stmt;
2019               adv = ! adv;
2020               printf (_("  Set is_stmt to %d\n"), adv);
2021               state_machine_regs.is_stmt = adv;
2022               break;
2023
2024             case DW_LNS_set_basic_block:
2025               printf (_("  Set basic block\n"));
2026               state_machine_regs.basic_block = 1;
2027               break;
2028
2029             case DW_LNS_const_add_pc:
2030               uladv = (((255 - info.li_opcode_base) / info.li_line_range)
2031                       * info.li_min_insn_length);
2032               state_machine_regs.address += uladv;
2033               printf (_("  Advance PC by constant %lu to 0x%lx\n"), uladv,
2034                       state_machine_regs.address);
2035               break;
2036
2037             case DW_LNS_fixed_advance_pc:
2038               uladv = byte_get (data, 2);
2039               data += 2;
2040               state_machine_regs.address += uladv;
2041               printf (_("  Advance PC by fixed size amount %lu to 0x%lx\n"),
2042                       uladv, state_machine_regs.address);
2043               break;
2044
2045             case DW_LNS_set_prologue_end:
2046               printf (_("  Set prologue_end to true\n"));
2047               break;
2048
2049             case DW_LNS_set_epilogue_begin:
2050               printf (_("  Set epilogue_begin to true\n"));
2051               break;
2052
2053             case DW_LNS_set_isa:
2054               uladv = read_leb128 (data, & bytes_read, 0);
2055               data += bytes_read;
2056               printf (_("  Set ISA to %lu\n"), uladv);
2057               break;
2058
2059             default:
2060               printf (_("  Unknown opcode %d with operands: "), op_code);
2061
2062               for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
2063                 {
2064                   printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
2065                           i == 1 ? "" : ", ");
2066                   data += bytes_read;
2067                 }
2068               putchar ('\n');
2069               break;
2070             }
2071         }
2072       putchar ('\n');
2073     }
2074
2075   return 1;
2076 }
2077
2078 static int
2079 display_debug_pubnames (struct dwarf_section *section,
2080                         void *file ATTRIBUTE_UNUSED)
2081 {
2082   DWARF2_Internal_PubNames pubnames;
2083   unsigned char *start = section->start;
2084   unsigned char *end = start + section->size;
2085
2086   printf (_("Contents of the %s section:\n\n"), section->name);
2087
2088   while (start < end)
2089     {
2090       unsigned char *data;
2091       unsigned long offset;
2092       int offset_size, initial_length_size;
2093
2094       data = start;
2095
2096       pubnames.pn_length = byte_get (data, 4);
2097       data += 4;
2098       if (pubnames.pn_length == 0xffffffff)
2099         {
2100           pubnames.pn_length = byte_get (data, 8);
2101           data += 8;
2102           offset_size = 8;
2103           initial_length_size = 12;
2104         }
2105       else
2106         {
2107           offset_size = 4;
2108           initial_length_size = 4;
2109         }
2110
2111       pubnames.pn_version = byte_get (data, 2);
2112       data += 2;
2113       pubnames.pn_offset = byte_get (data, offset_size);
2114       data += offset_size;
2115       pubnames.pn_size = byte_get (data, offset_size);
2116       data += offset_size;
2117
2118       start += pubnames.pn_length + initial_length_size;
2119
2120       if (pubnames.pn_version != 2 && pubnames.pn_version != 3)
2121         {
2122           static int warned = 0;
2123
2124           if (! warned)
2125             {
2126               warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
2127               warned = 1;
2128             }
2129
2130           continue;
2131         }
2132
2133       printf (_("  Length:                              %ld\n"),
2134               pubnames.pn_length);
2135       printf (_("  Version:                             %d\n"),
2136               pubnames.pn_version);
2137       printf (_("  Offset into .debug_info section:     %ld\n"),
2138               pubnames.pn_offset);
2139       printf (_("  Size of area in .debug_info section: %ld\n"),
2140               pubnames.pn_size);
2141
2142       printf (_("\n    Offset\tName\n"));
2143
2144       do
2145         {
2146           offset = byte_get (data, offset_size);
2147
2148           if (offset != 0)
2149             {
2150               data += offset_size;
2151               printf ("    %-6ld\t\t%s\n", offset, data);
2152               data += strlen ((char *) data) + 1;
2153             }
2154         }
2155       while (offset != 0);
2156     }
2157
2158   printf ("\n");
2159   return 1;
2160 }
2161
2162 static int
2163 display_debug_macinfo (struct dwarf_section *section,
2164                        void *file ATTRIBUTE_UNUSED)
2165 {
2166   unsigned char *start = section->start;
2167   unsigned char *end = start + section->size;
2168   unsigned char *curr = start;
2169   unsigned int bytes_read;
2170   enum dwarf_macinfo_record_type op;
2171
2172   printf (_("Contents of the %s section:\n\n"), section->name);
2173
2174   while (curr < end)
2175     {
2176       unsigned int lineno;
2177       const char *string;
2178
2179       op = *curr;
2180       curr++;
2181
2182       switch (op)
2183         {
2184         case DW_MACINFO_start_file:
2185           {
2186             unsigned int filenum;
2187
2188             lineno = read_leb128 (curr, & bytes_read, 0);
2189             curr += bytes_read;
2190             filenum = read_leb128 (curr, & bytes_read, 0);
2191             curr += bytes_read;
2192
2193             printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
2194                     lineno, filenum);
2195           }
2196           break;
2197
2198         case DW_MACINFO_end_file:
2199           printf (_(" DW_MACINFO_end_file\n"));
2200           break;
2201
2202         case DW_MACINFO_define:
2203           lineno = read_leb128 (curr, & bytes_read, 0);
2204           curr += bytes_read;
2205           string = (char *) curr;
2206           curr += strlen (string) + 1;
2207           printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
2208                   lineno, string);
2209           break;
2210
2211         case DW_MACINFO_undef:
2212           lineno = read_leb128 (curr, & bytes_read, 0);
2213           curr += bytes_read;
2214           string = (char *) curr;
2215           curr += strlen (string) + 1;
2216           printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
2217                   lineno, string);
2218           break;
2219
2220         case DW_MACINFO_vendor_ext:
2221           {
2222             unsigned int constant;
2223
2224             constant = read_leb128 (curr, & bytes_read, 0);
2225             curr += bytes_read;
2226             string = (char *) curr;
2227             curr += strlen (string) + 1;
2228             printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
2229                     constant, string);
2230           }
2231           break;
2232         }
2233     }
2234
2235   return 1;
2236 }
2237
2238 static int
2239 display_debug_abbrev (struct dwarf_section *section,
2240                       void *file ATTRIBUTE_UNUSED)
2241 {
2242   abbrev_entry *entry;
2243   unsigned char *start = section->start;
2244   unsigned char *end = start + section->size;
2245
2246   printf (_("Contents of the %s section:\n\n"), section->name);
2247
2248   do
2249     {
2250       free_abbrevs ();
2251
2252       start = process_abbrev_section (start, end);
2253
2254       if (first_abbrev == NULL)
2255         continue;
2256
2257       printf (_("  Number TAG\n"));
2258
2259       for (entry = first_abbrev; entry; entry = entry->next)
2260         {
2261           abbrev_attr *attr;
2262
2263           printf (_("   %ld      %s    [%s]\n"),
2264                   entry->entry,
2265                   get_TAG_name (entry->tag),
2266                   entry->children ? _("has children") : _("no children"));
2267
2268           for (attr = entry->first_attr; attr; attr = attr->next)
2269             printf (_("    %-18s %s\n"),
2270                     get_AT_name (attr->attribute),
2271                     get_FORM_name (attr->form));
2272         }
2273     }
2274   while (start);
2275
2276   printf ("\n");
2277
2278   return 1;
2279 }
2280
2281 static int
2282 display_debug_loc (struct dwarf_section *section, void *file)
2283 {
2284   unsigned char *start = section->start;
2285   unsigned char *section_end;
2286   unsigned long bytes;
2287   unsigned char *section_begin = start;
2288   unsigned int num_loc_list = 0;
2289   unsigned long last_offset = 0;
2290   unsigned int first = 0;
2291   unsigned int i;
2292   unsigned int j;
2293   int seen_first_offset = 0;
2294   int use_debug_info = 1;
2295   unsigned char *next;
2296
2297   bytes = section->size;
2298   section_end = start + bytes;
2299
2300   if (bytes == 0)
2301     {
2302       printf (_("\nThe %s section is empty.\n"), section->name);
2303       return 0;
2304     }
2305
2306   load_debug_info (file);
2307
2308   /* Check the order of location list in .debug_info section. If
2309      offsets of location lists are in the ascending order, we can
2310      use `debug_information' directly.  */
2311   for (i = 0; i < num_debug_info_entries; i++)
2312     {
2313       unsigned int num;
2314
2315       num = debug_information [i].num_loc_offsets;
2316       num_loc_list += num;
2317
2318       /* Check if we can use `debug_information' directly.  */
2319       if (use_debug_info && num != 0)
2320         {
2321           if (!seen_first_offset)
2322             {
2323               /* This is the first location list.  */
2324               last_offset = debug_information [i].loc_offsets [0];
2325               first = i;
2326               seen_first_offset = 1;
2327               j = 1;
2328             }
2329           else
2330             j = 0;
2331
2332           for (; j < num; j++)
2333             {
2334               if (last_offset >
2335                   debug_information [i].loc_offsets [j])
2336                 {
2337                   use_debug_info = 0;
2338                   break;
2339                 }
2340               last_offset = debug_information [i].loc_offsets [j];
2341             }
2342         }
2343     }
2344
2345   if (!use_debug_info)
2346     /* FIXME: Should we handle this case?  */
2347     error (_("Location lists in .debug_info section aren't in ascending order!\n"));
2348
2349   if (!seen_first_offset)
2350     error (_("No location lists in .debug_info section!\n"));
2351
2352   /* DWARF sections under Mach-O have non-zero addresses.  */
2353   if (debug_information [first].num_loc_offsets > 0
2354       && debug_information [first].loc_offsets [0] != section->address)
2355     warn (_("Location lists in %s section start at 0x%lx\n"),
2356           section->name, debug_information [first].loc_offsets [0]);
2357
2358   printf (_("Contents of the %s section:\n\n"), section->name);
2359   printf (_("    Offset   Begin    End      Expression\n"));
2360
2361   seen_first_offset = 0;
2362   for (i = first; i < num_debug_info_entries; i++)
2363     {
2364       unsigned long begin;
2365       unsigned long end;
2366       unsigned short length;
2367       unsigned long offset;
2368       unsigned int pointer_size;
2369       unsigned long cu_offset;
2370       unsigned long base_address;
2371       int need_frame_base;
2372       int has_frame_base;
2373
2374       pointer_size = debug_information [i].pointer_size;
2375       cu_offset = debug_information [i].cu_offset;
2376
2377       for (j = 0; j < debug_information [i].num_loc_offsets; j++)
2378         {
2379           has_frame_base = debug_information [i].have_frame_base [j];
2380           /* DWARF sections under Mach-O have non-zero addresses.  */
2381           offset = debug_information [i].loc_offsets [j] - section->address; 
2382           next = section_begin + offset;
2383           base_address = debug_information [i].base_address;
2384
2385           if (!seen_first_offset)
2386             seen_first_offset = 1;
2387           else
2388             {
2389               if (start < next)
2390                 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
2391                       (long)(start - section_begin), (long)(next - section_begin));
2392               else if (start > next)
2393                 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
2394                       (long)(start - section_begin), (long)(next - section_begin));
2395             }
2396           start = next;
2397
2398           if (offset >= bytes)
2399             {
2400               warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
2401                     offset);
2402               continue;
2403             }
2404
2405           while (1)
2406             {
2407               if (start + 2 * pointer_size > section_end)
2408                 {
2409                   warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
2410                         offset);
2411                   break;
2412                 }
2413
2414               begin = byte_get (start, pointer_size);
2415               start += pointer_size;
2416               end = byte_get (start, pointer_size);
2417               start += pointer_size;
2418
2419               if (begin == 0 && end == 0)
2420                 {
2421                   printf (_("    %8.8lx <End of list>\n"), offset);
2422                   break;
2423                 }
2424
2425               /* Check base address specifiers.  */
2426               if (begin == -1UL && end != -1UL)
2427                 {
2428                   base_address = end;
2429                   printf (_("    %8.8lx %8.8lx %8.8lx (base address)\n"),
2430                           offset, begin, end);
2431                   continue;
2432                 }
2433
2434               if (start + 2 > section_end)
2435                 {
2436                   warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
2437                         offset);
2438                   break;
2439                 }
2440
2441               length = byte_get (start, 2);
2442               start += 2;
2443
2444               if (start + length > section_end)
2445                 {
2446                   warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
2447                         offset);
2448                   break;
2449                 }
2450
2451               printf ("    %8.8lx %8.8lx %8.8lx (",
2452                       offset, begin + base_address, end + base_address);
2453               need_frame_base = decode_location_expression (start,
2454                                                             pointer_size,
2455                                                             length,
2456                                                             cu_offset);
2457               putchar (')');
2458
2459               if (need_frame_base && !has_frame_base)
2460                 printf (_(" [without DW_AT_frame_base]"));
2461
2462               if (begin == end)
2463                 fputs (_(" (start == end)"), stdout);
2464               else if (begin > end)
2465                 fputs (_(" (start > end)"), stdout);
2466
2467               putchar ('\n');
2468
2469               start += length;
2470             }
2471         }
2472     }
2473   return 1;
2474 }
2475
2476 static int
2477 display_debug_str (struct dwarf_section *section,
2478                    void *file ATTRIBUTE_UNUSED)
2479 {
2480   unsigned char *start = section->start;
2481   unsigned long bytes = section->size;
2482   dwarf_vma addr = section->address;
2483
2484   if (bytes == 0)
2485     {
2486       printf (_("\nThe %s section is empty.\n"), section->name);
2487       return 0;
2488     }
2489
2490   printf (_("Contents of the %s section:\n\n"), section->name);
2491
2492   while (bytes)
2493     {
2494       int j;
2495       int k;
2496       int lbytes;
2497
2498       lbytes = (bytes > 16 ? 16 : bytes);
2499
2500       printf ("  0x%8.8lx ", (unsigned long) addr);
2501
2502       for (j = 0; j < 16; j++)
2503         {
2504           if (j < lbytes)
2505             printf ("%2.2x", start[j]);
2506           else
2507             printf ("  ");
2508
2509           if ((j & 3) == 3)
2510             printf (" ");
2511         }
2512
2513       for (j = 0; j < lbytes; j++)
2514         {
2515           k = start[j];
2516           if (k >= ' ' && k < 0x80)
2517             printf ("%c", k);
2518           else
2519             printf (".");
2520         }
2521
2522       putchar ('\n');
2523
2524       start += lbytes;
2525       addr  += lbytes;
2526       bytes -= lbytes;
2527     }
2528
2529   putchar ('\n');
2530
2531   return 1;
2532 }
2533
2534 static int
2535 display_debug_info (struct dwarf_section *section, void *file)
2536 {
2537   return process_debug_info (section, file, 0);
2538 }
2539
2540
2541 static int
2542 display_debug_aranges (struct dwarf_section *section,
2543                        void *file ATTRIBUTE_UNUSED)
2544 {
2545   unsigned char *start = section->start;
2546   unsigned char *end = start + section->size;
2547
2548   printf (_("The section %s contains:\n\n"), section->name);
2549
2550   while (start < end)
2551     {
2552       unsigned char *hdrptr;
2553       DWARF2_Internal_ARange arange;
2554       unsigned char *ranges;
2555       unsigned long length;
2556       unsigned long address;
2557       unsigned char address_size;
2558       int excess;
2559       int offset_size;
2560       int initial_length_size;
2561
2562       hdrptr = start;
2563
2564       arange.ar_length = byte_get (hdrptr, 4);
2565       hdrptr += 4;
2566
2567       if (arange.ar_length == 0xffffffff)
2568         {
2569           arange.ar_length = byte_get (hdrptr, 8);
2570           hdrptr += 8;
2571           offset_size = 8;
2572           initial_length_size = 12;
2573         }
2574       else
2575         {
2576           offset_size = 4;
2577           initial_length_size = 4;
2578         }
2579
2580       arange.ar_version = byte_get (hdrptr, 2);
2581       hdrptr += 2;
2582
2583       arange.ar_info_offset = byte_get (hdrptr, offset_size);
2584       hdrptr += offset_size;
2585
2586       arange.ar_pointer_size = byte_get (hdrptr, 1);
2587       hdrptr += 1;
2588
2589       arange.ar_segment_size = byte_get (hdrptr, 1);
2590       hdrptr += 1;
2591
2592       if (arange.ar_version != 2 && arange.ar_version != 3)
2593         {
2594           warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
2595           break;
2596         }
2597
2598       printf (_("  Length:                   %ld\n"), arange.ar_length);
2599       printf (_("  Version:                  %d\n"), arange.ar_version);
2600       printf (_("  Offset into .debug_info:  %lx\n"), arange.ar_info_offset);
2601       printf (_("  Pointer Size:             %d\n"), arange.ar_pointer_size);
2602       printf (_("  Segment Size:             %d\n"), arange.ar_segment_size);
2603
2604       address_size = arange.ar_pointer_size + arange.ar_segment_size;
2605
2606       /* The DWARF spec does not require that the address size be a power
2607          of two, but we do.  This will have to change if we ever encounter
2608          an uneven architecture.  */
2609       if ((address_size & (address_size - 1)) != 0)
2610         {
2611           warn (_("Pointer size + Segment size is not a power of two.\n"));
2612           break;
2613         }
2614       
2615       if (address_size > 4)
2616         printf (_("\n    Address            Length\n"));
2617       else
2618         printf (_("\n    Address    Length\n"));
2619
2620       ranges = hdrptr;
2621
2622       /* Must pad to an alignment boundary that is twice the address size.  */
2623       excess = (hdrptr - start) % (2 * address_size);
2624       if (excess)
2625         ranges += (2 * address_size) - excess;
2626
2627       start += arange.ar_length + initial_length_size;
2628
2629       while (ranges + 2 * address_size <= start)
2630         {
2631           address = byte_get (ranges, address_size);
2632
2633           ranges += address_size;
2634
2635           length  = byte_get (ranges, address_size);
2636
2637           ranges += address_size;
2638
2639           if (address_size > 4)
2640             printf ("    0x%16.16lx 0x%lx\n", address, length);
2641           else
2642             printf ("    0x%8.8lx 0x%lx\n", address, length);       
2643         }
2644     }
2645
2646   printf ("\n");
2647
2648   return 1;
2649 }
2650
2651 static int
2652 display_debug_ranges (struct dwarf_section *section,
2653                       void *file ATTRIBUTE_UNUSED)
2654 {
2655   unsigned char *start = section->start;
2656   unsigned char *section_end;
2657   unsigned long bytes;
2658   unsigned char *section_begin = start;
2659   unsigned int num_range_list = 0;
2660   unsigned long last_offset = 0;
2661   unsigned int first = 0;
2662   unsigned int i;
2663   unsigned int j;
2664   int seen_first_offset = 0;
2665   int use_debug_info = 1;
2666   unsigned char *next;
2667
2668   bytes = section->size;
2669   section_end = start + bytes;
2670
2671   if (bytes == 0)
2672     {
2673       printf (_("\nThe %s section is empty.\n"), section->name);
2674       return 0;
2675     }
2676
2677   load_debug_info (file);
2678
2679   /* Check the order of range list in .debug_info section. If
2680      offsets of range lists are in the ascending order, we can
2681      use `debug_information' directly.  */
2682   for (i = 0; i < num_debug_info_entries; i++)
2683     {
2684       unsigned int num;
2685
2686       num = debug_information [i].num_range_lists;
2687       num_range_list += num;
2688
2689       /* Check if we can use `debug_information' directly.  */
2690       if (use_debug_info && num != 0)
2691         {
2692           if (!seen_first_offset)
2693             {
2694               /* This is the first range list.  */
2695               last_offset = debug_information [i].range_lists [0];
2696               first = i;
2697               seen_first_offset = 1;
2698               j = 1;
2699             }
2700           else
2701             j = 0;
2702
2703           for (; j < num; j++)
2704             {
2705               if (last_offset >
2706                   debug_information [i].range_lists [j])
2707                 {
2708                   use_debug_info = 0;
2709                   break;
2710                 }
2711               last_offset = debug_information [i].range_lists [j];
2712             }
2713         }
2714     }
2715
2716   if (!use_debug_info)
2717     /* FIXME: Should we handle this case?  */
2718     error (_("Range lists in .debug_info section aren't in ascending order!\n"));
2719
2720   if (!seen_first_offset)
2721     error (_("No range lists in .debug_info section!\n"));
2722
2723   /* DWARF sections under Mach-O have non-zero addresses.  */
2724   if (debug_information [first].num_range_lists > 0
2725       && debug_information [first].range_lists [0] != section->address)
2726     warn (_("Range lists in %s section start at 0x%lx\n"),
2727           section->name, debug_information [first].range_lists [0]);
2728
2729   printf (_("Contents of the %s section:\n\n"), section->name);
2730   printf (_("    Offset   Begin    End\n"));
2731
2732   seen_first_offset = 0;
2733   for (i = first; i < num_debug_info_entries; i++)
2734     {
2735       unsigned long begin;
2736       unsigned long end;
2737       unsigned long offset;
2738       unsigned int pointer_size;
2739       unsigned long base_address;
2740
2741       pointer_size = debug_information [i].pointer_size;
2742
2743       for (j = 0; j < debug_information [i].num_range_lists; j++)
2744         {
2745           /* DWARF sections under Mach-O have non-zero addresses.  */
2746           offset = debug_information [i].range_lists [j] - section->address;
2747           next = section_begin + offset;
2748           base_address = debug_information [i].base_address;
2749
2750           if (!seen_first_offset)
2751             seen_first_offset = 1;
2752           else
2753             {
2754               if (start < next)
2755                 warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
2756                       (long)(start - section_begin),
2757                       (long)(next - section_begin), section->name);
2758               else if (start > next)
2759                 warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
2760                       (long)(start - section_begin),
2761                       (long)(next - section_begin), section->name);
2762             }
2763           start = next;
2764
2765           while (1)
2766             {
2767               begin = byte_get (start, pointer_size);
2768               start += pointer_size;
2769               end = byte_get (start, pointer_size);
2770               start += pointer_size;
2771
2772               if (begin == 0 && end == 0)
2773                 {
2774                   printf (_("    %8.8lx <End of list>\n"), offset);
2775                   break;
2776                 }
2777
2778               /* Check base address specifiers.  */
2779               if (begin == -1UL && end != -1UL)
2780                 {
2781                   base_address = end;
2782                   printf ("    %8.8lx %8.8lx %8.8lx (base address)\n",
2783                           offset, begin, end);
2784                   continue;
2785                 }
2786
2787               printf ("    %8.8lx %8.8lx %8.8lx",
2788                       offset, begin + base_address, end + base_address);
2789
2790               if (begin == end)
2791                 fputs (_(" (start == end)"), stdout);
2792               else if (begin > end)
2793                 fputs (_(" (start > end)"), stdout);
2794
2795               putchar ('\n');
2796             }
2797         }
2798     }
2799   putchar ('\n');
2800   return 1;
2801 }
2802
2803 typedef struct Frame_Chunk
2804 {
2805   struct Frame_Chunk *next;
2806   unsigned char *chunk_start;
2807   int ncols;
2808   /* DW_CFA_{undefined,same_value,offset,register,unreferenced}  */
2809   short int *col_type;
2810   int *col_offset;
2811   char *augmentation;
2812   unsigned int code_factor;
2813   int data_factor;
2814   unsigned long pc_begin;
2815   unsigned long pc_range;
2816   int cfa_reg;
2817   int cfa_offset;
2818   int ra;
2819   unsigned char fde_encoding;
2820   unsigned char cfa_exp;
2821 }
2822 Frame_Chunk;
2823
2824 /* A marker for a col_type that means this column was never referenced
2825    in the frame info.  */
2826 #define DW_CFA_unreferenced (-1)
2827
2828 static void
2829 frame_need_space (Frame_Chunk *fc, int reg)
2830 {
2831   int prev = fc->ncols;
2832
2833   if (reg < fc->ncols)
2834     return;
2835
2836   fc->ncols = reg + 1;
2837   fc->col_type = xcrealloc (fc->col_type, fc->ncols, sizeof (short int));
2838   fc->col_offset = xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
2839
2840   while (prev < fc->ncols)
2841     {
2842       fc->col_type[prev] = DW_CFA_unreferenced;
2843       fc->col_offset[prev] = 0;
2844       prev++;
2845     }
2846 }
2847
2848 static void
2849 frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
2850 {
2851   int r;
2852   char tmp[100];
2853
2854   if (*max_regs < fc->ncols)
2855     *max_regs = fc->ncols;
2856
2857   if (*need_col_headers)
2858     {
2859       *need_col_headers = 0;
2860
2861       printf ("   LOC   CFA      ");
2862
2863       for (r = 0; r < *max_regs; r++)
2864         if (fc->col_type[r] != DW_CFA_unreferenced)
2865           {
2866             if (r == fc->ra)
2867               printf ("ra   ");
2868             else
2869               printf ("r%-4d", r);
2870           }
2871
2872       printf ("\n");
2873     }
2874
2875   printf ("%08lx ", fc->pc_begin);
2876   if (fc->cfa_exp)
2877     strcpy (tmp, "exp");
2878   else
2879     sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
2880   printf ("%-8s ", tmp);
2881
2882   for (r = 0; r < fc->ncols; r++)
2883     {
2884       if (fc->col_type[r] != DW_CFA_unreferenced)
2885         {
2886           switch (fc->col_type[r])
2887             {
2888             case DW_CFA_undefined:
2889               strcpy (tmp, "u");
2890               break;
2891             case DW_CFA_same_value:
2892               strcpy (tmp, "s");
2893               break;
2894             case DW_CFA_offset:
2895               sprintf (tmp, "c%+d", fc->col_offset[r]);
2896               break;
2897             case DW_CFA_val_offset:
2898               sprintf (tmp, "v%+d", fc->col_offset[r]);
2899               break;
2900             case DW_CFA_register:
2901               sprintf (tmp, "r%d", fc->col_offset[r]);
2902               break;
2903             case DW_CFA_expression:
2904               strcpy (tmp, "exp");
2905               break;
2906             case DW_CFA_val_expression:
2907               strcpy (tmp, "vexp");
2908               break;
2909             default:
2910               strcpy (tmp, "n/a");
2911               break;
2912             }
2913           printf ("%-5s", tmp);
2914         }
2915     }
2916   printf ("\n");
2917 }
2918
2919 static int
2920 size_of_encoded_value (int encoding)
2921 {
2922   switch (encoding & 0x7)
2923     {
2924     default:    /* ??? */
2925     case 0:     return eh_addr_size;
2926     case 2:     return 2;
2927     case 3:     return 4;
2928     case 4:     return 8;
2929     }
2930 }
2931
2932 static dwarf_vma
2933 get_encoded_value (unsigned char *data, int encoding)
2934 {
2935   int size = size_of_encoded_value (encoding);
2936
2937   if (encoding & DW_EH_PE_signed)
2938     return byte_get_signed (data, size);
2939   else
2940     return byte_get (data, size);
2941 }
2942
2943 #define GET(N)  byte_get (start, N); start += N
2944 #define LEB()   read_leb128 (start, & length_return, 0); start += length_return
2945 #define SLEB()  read_leb128 (start, & length_return, 1); start += length_return
2946
2947 static int
2948 display_debug_frames (struct dwarf_section *section,
2949                       void *file ATTRIBUTE_UNUSED)
2950 {
2951   unsigned char *start = section->start;
2952   unsigned char *end = start + section->size;
2953   unsigned char *section_start = start;
2954   Frame_Chunk *chunks = 0;
2955   Frame_Chunk *remembered_state = 0;
2956   Frame_Chunk *rs;
2957   int is_eh = strcmp (section->name, ".eh_frame") == 0;
2958   unsigned int length_return;
2959   int max_regs = 0;
2960
2961   printf (_("The section %s contains:\n"), section->name);
2962
2963   while (start < end)
2964     {
2965       unsigned char *saved_start;
2966       unsigned char *block_end;
2967       unsigned long length;
2968       unsigned long cie_id;
2969       Frame_Chunk *fc;
2970       Frame_Chunk *cie;
2971       int need_col_headers = 1;
2972       unsigned char *augmentation_data = NULL;
2973       unsigned long augmentation_data_len = 0;
2974       int encoded_ptr_size = eh_addr_size;
2975       int offset_size;
2976       int initial_length_size;
2977
2978       saved_start = start;
2979       length = byte_get (start, 4); start += 4;
2980
2981       if (length == 0)
2982         {
2983           printf ("\n%08lx ZERO terminator\n\n",
2984                     (unsigned long)(saved_start - section_start));
2985           continue;
2986         }
2987
2988       if (length == 0xffffffff)
2989         {
2990           length = byte_get (start, 8);
2991           start += 8;
2992           offset_size = 8;
2993           initial_length_size = 12;
2994         }
2995       else
2996         {
2997           offset_size = 4;
2998           initial_length_size = 4;
2999         }
3000
3001       block_end = saved_start + length + initial_length_size;
3002       if (block_end > end)
3003         {
3004           warn ("Invalid length %#08lx in FDE at %#08lx\n",
3005                 length, (unsigned long)(saved_start - section_start));
3006           block_end = end;
3007         }
3008       cie_id = byte_get (start, offset_size); start += offset_size;
3009
3010       if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
3011         {
3012           int version;
3013
3014           fc = xmalloc (sizeof (Frame_Chunk));
3015           memset (fc, 0, sizeof (Frame_Chunk));
3016
3017           fc->next = chunks;
3018           chunks = fc;
3019           fc->chunk_start = saved_start;
3020           fc->ncols = 0;
3021           fc->col_type = xmalloc (sizeof (short int));
3022           fc->col_offset = xmalloc (sizeof (int));
3023           frame_need_space (fc, max_regs-1);
3024
3025           version = *start++;
3026
3027           fc->augmentation = (char *) start;
3028           start = (unsigned char *) strchr ((char *) start, '\0') + 1;
3029
3030           if (fc->augmentation[0] == 'z')
3031             {
3032               fc->code_factor = LEB ();
3033               fc->data_factor = SLEB ();
3034               if (version == 1)
3035                 {
3036                   fc->ra = GET (1);
3037                 }
3038               else
3039                 {
3040                   fc->ra = LEB ();
3041                 }
3042               augmentation_data_len = LEB ();
3043               augmentation_data = start;
3044               start += augmentation_data_len;
3045             }
3046           else if (strcmp (fc->augmentation, "eh") == 0)
3047             {
3048               start += eh_addr_size;
3049               fc->code_factor = LEB ();
3050               fc->data_factor = SLEB ();
3051               if (version == 1)
3052                 {
3053                   fc->ra = GET (1);
3054                 }
3055               else
3056                 {
3057                   fc->ra = LEB ();
3058                 }
3059             }
3060           else
3061             {
3062               fc->code_factor = LEB ();
3063               fc->data_factor = SLEB ();
3064               if (version == 1)
3065                 {
3066                   fc->ra = GET (1);
3067                 }
3068               else
3069                 {
3070                   fc->ra = LEB ();
3071                 }
3072             }
3073           cie = fc;
3074
3075           if (do_debug_frames_interp)
3076             printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
3077                     (unsigned long)(saved_start - section_start), length, cie_id,
3078                     fc->augmentation, fc->code_factor, fc->data_factor,
3079                     fc->ra);
3080           else
3081             {
3082               printf ("\n%08lx %08lx %08lx CIE\n",
3083                       (unsigned long)(saved_start - section_start), length, cie_id);
3084               printf ("  Version:               %d\n", version);
3085               printf ("  Augmentation:          \"%s\"\n", fc->augmentation);
3086               printf ("  Code alignment factor: %u\n", fc->code_factor);
3087               printf ("  Data alignment factor: %d\n", fc->data_factor);
3088               printf ("  Return address column: %d\n", fc->ra);
3089
3090               if (augmentation_data_len)
3091                 {
3092                   unsigned long i;
3093                   printf ("  Augmentation data:    ");
3094                   for (i = 0; i < augmentation_data_len; ++i)
3095                     printf (" %02x", augmentation_data[i]);
3096                   putchar ('\n');
3097                 }
3098               putchar ('\n');
3099             }
3100
3101           if (augmentation_data_len)
3102             {
3103               unsigned char *p, *q;
3104               p = (unsigned char *) fc->augmentation + 1;
3105               q = augmentation_data;
3106
3107               while (1)
3108                 {
3109                   if (*p == 'L')
3110                     q++;
3111                   else if (*p == 'P')
3112                     q += 1 + size_of_encoded_value (*q);
3113                   else if (*p == 'R')
3114                     fc->fde_encoding = *q++;
3115                   else
3116                     break;
3117                   p++;
3118                 }
3119
3120               if (fc->fde_encoding)
3121                 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
3122             }
3123
3124           frame_need_space (fc, fc->ra);
3125         }
3126       else
3127         {
3128           unsigned char *look_for;
3129           static Frame_Chunk fde_fc;
3130
3131           fc = & fde_fc;
3132           memset (fc, 0, sizeof (Frame_Chunk));
3133
3134           look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
3135
3136           for (cie = chunks; cie ; cie = cie->next)
3137             if (cie->chunk_start == look_for)
3138               break;
3139
3140           if (!cie)
3141             {
3142               warn ("Invalid CIE pointer %#08lx in FDE at %#08lx\n",
3143                     cie_id, (unsigned long)(saved_start - section_start));
3144               fc->ncols = 0;
3145               fc->col_type = xmalloc (sizeof (short int));
3146               fc->col_offset = xmalloc (sizeof (int));
3147               frame_need_space (fc, max_regs - 1);
3148               cie = fc;
3149               fc->augmentation = "";
3150               fc->fde_encoding = 0;
3151             }
3152           else
3153             {
3154               fc->ncols = cie->ncols;
3155               fc->col_type = xcmalloc (fc->ncols, sizeof (short int));
3156               fc->col_offset = xcmalloc (fc->ncols, sizeof (int));
3157               memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
3158               memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
3159               fc->augmentation = cie->augmentation;
3160               fc->code_factor = cie->code_factor;
3161               fc->data_factor = cie->data_factor;
3162               fc->cfa_reg = cie->cfa_reg;
3163               fc->cfa_offset = cie->cfa_offset;
3164               fc->ra = cie->ra;
3165               frame_need_space (fc, max_regs-1);
3166               fc->fde_encoding = cie->fde_encoding;
3167             }
3168
3169           if (fc->fde_encoding)
3170             encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
3171
3172           fc->pc_begin = get_encoded_value (start, fc->fde_encoding);
3173           if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel
3174               /* Don't adjust for relocatable file since there's
3175                  invariably a pcrel reloc here, which we haven't
3176                  applied.  */
3177               && !is_relocatable)
3178             fc->pc_begin += section->address + (start - section_start);
3179           start += encoded_ptr_size;
3180           fc->pc_range = byte_get (start, encoded_ptr_size);
3181           start += encoded_ptr_size;
3182
3183           if (cie->augmentation[0] == 'z')
3184             {
3185               augmentation_data_len = LEB ();
3186               augmentation_data = start;
3187               start += augmentation_data_len;
3188             }
3189
3190           printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
3191                   (unsigned long)(saved_start - section_start), length, cie_id,
3192                   (unsigned long)(cie->chunk_start - section_start),
3193                   fc->pc_begin, fc->pc_begin + fc->pc_range);
3194           if (! do_debug_frames_interp && augmentation_data_len)
3195             {
3196               unsigned long i;
3197
3198               printf ("  Augmentation data:    ");
3199               for (i = 0; i < augmentation_data_len; ++i)
3200                 printf (" %02x", augmentation_data[i]);
3201               putchar ('\n');
3202               putchar ('\n');
3203             }
3204         }
3205
3206       /* At this point, fc is the current chunk, cie (if any) is set, and
3207          we're about to interpret instructions for the chunk.  */
3208       /* ??? At present we need to do this always, since this sizes the
3209          fc->col_type and fc->col_offset arrays, which we write into always.
3210          We should probably split the interpreted and non-interpreted bits
3211          into two different routines, since there's so much that doesn't
3212          really overlap between them.  */
3213       if (1 || do_debug_frames_interp)
3214         {
3215           /* Start by making a pass over the chunk, allocating storage
3216              and taking note of what registers are used.  */
3217           unsigned char *tmp = start;
3218
3219           while (start < block_end)
3220             {
3221               unsigned op, opa;
3222               unsigned long reg, tmp;
3223
3224               op = *start++;
3225               opa = op & 0x3f;
3226               if (op & 0xc0)
3227                 op &= 0xc0;
3228
3229               /* Warning: if you add any more cases to this switch, be
3230                  sure to add them to the corresponding switch below.  */
3231               switch (op)
3232                 {
3233                 case DW_CFA_advance_loc:
3234                   break;
3235                 case DW_CFA_offset:
3236                   LEB ();
3237                   frame_need_space (fc, opa);
3238                   fc->col_type[opa] = DW_CFA_undefined;
3239                   break;
3240                 case DW_CFA_restore:
3241                   frame_need_space (fc, opa);
3242                   fc->col_type[opa] = DW_CFA_undefined;
3243                   break;
3244                 case DW_CFA_set_loc:
3245                   start += encoded_ptr_size;
3246                   break;
3247                 case DW_CFA_advance_loc1:
3248                   start += 1;
3249                   break;
3250                 case DW_CFA_advance_loc2:
3251                   start += 2;
3252                   break;
3253                 case DW_CFA_advance_loc4:
3254                   start += 4;
3255                   break;
3256                 case DW_CFA_offset_extended:
3257                 case DW_CFA_val_offset:
3258                   reg = LEB (); LEB ();
3259                   frame_need_space (fc, reg);
3260                   fc->col_type[reg] = DW_CFA_undefined;
3261                   break;
3262                 case DW_CFA_restore_extended:
3263                   reg = LEB ();
3264                   frame_need_space (fc, reg);
3265                   fc->col_type[reg] = DW_CFA_undefined;
3266                   break;
3267                 case DW_CFA_undefined:
3268                   reg = LEB ();
3269                   frame_need_space (fc, reg);
3270                   fc->col_type[reg] = DW_CFA_undefined;
3271                   break;
3272                 case DW_CFA_same_value:
3273                   reg = LEB ();
3274                   frame_need_space (fc, reg);
3275                   fc->col_type[reg] = DW_CFA_undefined;
3276                   break;
3277                 case DW_CFA_register:
3278                   reg = LEB (); LEB ();
3279                   frame_need_space (fc, reg);
3280                   fc->col_type[reg] = DW_CFA_undefined;
3281                   break;
3282                 case DW_CFA_def_cfa:
3283                   LEB (); LEB ();
3284                   break;
3285                 case DW_CFA_def_cfa_register:
3286                   LEB ();
3287                   break;
3288                 case DW_CFA_def_cfa_offset:
3289                   LEB ();
3290                   break;
3291                 case DW_CFA_def_cfa_expression:
3292                   tmp = LEB ();
3293                   start += tmp;
3294                   break;
3295                 case DW_CFA_expression:
3296                 case DW_CFA_val_expression:
3297                   reg = LEB ();
3298                   tmp = LEB ();
3299                   start += tmp;
3300                   frame_need_space (fc, reg);
3301                   fc->col_type[reg] = DW_CFA_undefined;
3302                   break;
3303                 case DW_CFA_offset_extended_sf:
3304                 case DW_CFA_val_offset_sf:
3305                   reg = LEB (); SLEB ();
3306                   frame_need_space (fc, reg);
3307                   fc->col_type[reg] = DW_CFA_undefined;
3308                   break;
3309                 case DW_CFA_def_cfa_sf:
3310                   LEB (); SLEB ();
3311                   break;
3312                 case DW_CFA_def_cfa_offset_sf:
3313                   SLEB ();
3314                   break;
3315                 case DW_CFA_MIPS_advance_loc8:
3316                   start += 8;
3317                   break;
3318                 case DW_CFA_GNU_args_size:
3319                   LEB ();
3320                   break;
3321                 case DW_CFA_GNU_negative_offset_extended:
3322                   reg = LEB (); LEB ();
3323                   frame_need_space (fc, reg);
3324                   fc->col_type[reg] = DW_CFA_undefined;
3325
3326                 default:
3327                   break;
3328                 }
3329             }
3330           start = tmp;
3331         }
3332
3333       /* Now we know what registers are used, make a second pass over
3334          the chunk, this time actually printing out the info.  */
3335
3336       while (start < block_end)
3337         {
3338           unsigned op, opa;
3339           unsigned long ul, reg, roffs;
3340           long l, ofs;
3341           dwarf_vma vma;
3342
3343           op = *start++;
3344           opa = op & 0x3f;
3345           if (op & 0xc0)
3346             op &= 0xc0;
3347
3348           /* Warning: if you add any more cases to this switch, be
3349              sure to add them to the corresponding switch above.  */
3350           switch (op)
3351             {
3352             case DW_CFA_advance_loc:
3353               if (do_debug_frames_interp)
3354                 frame_display_row (fc, &need_col_headers, &max_regs);
3355               else
3356                 printf ("  DW_CFA_advance_loc: %d to %08lx\n",
3357                         opa * fc->code_factor,
3358                         fc->pc_begin + opa * fc->code_factor);
3359               fc->pc_begin += opa * fc->code_factor;
3360               break;
3361
3362             case DW_CFA_offset:
3363               roffs = LEB ();
3364               if (! do_debug_frames_interp)
3365                 printf ("  DW_CFA_offset: r%d at cfa%+ld\n",
3366                         opa, roffs * fc->data_factor);
3367               fc->col_type[opa] = DW_CFA_offset;
3368               fc->col_offset[opa] = roffs * fc->data_factor;
3369               break;
3370
3371             case DW_CFA_restore:
3372               if (! do_debug_frames_interp)
3373                 printf ("  DW_CFA_restore: r%d\n", opa);
3374               fc->col_type[opa] = cie->col_type[opa];
3375               fc->col_offset[opa] = cie->col_offset[opa];
3376               break;
3377
3378             case DW_CFA_set_loc:
3379               vma = get_encoded_value (start, fc->fde_encoding);
3380               if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel
3381                   && !is_relocatable)
3382                 vma += section->address + (start - section_start);
3383               start += encoded_ptr_size;
3384               if (do_debug_frames_interp)
3385                 frame_display_row (fc, &need_col_headers, &max_regs);
3386               else
3387                 printf ("  DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
3388               fc->pc_begin = vma;
3389               break;
3390
3391             case DW_CFA_advance_loc1:
3392               ofs = byte_get (start, 1); start += 1;
3393               if (do_debug_frames_interp)
3394                 frame_display_row (fc, &need_col_headers, &max_regs);
3395               else
3396                 printf ("  DW_CFA_advance_loc1: %ld to %08lx\n",
3397                         ofs * fc->code_factor,
3398                         fc->pc_begin + ofs * fc->code_factor);
3399               fc->pc_begin += ofs * fc->code_factor;
3400               break;
3401
3402             case DW_CFA_advance_loc2:
3403               ofs = byte_get (start, 2); start += 2;
3404               if (do_debug_frames_interp)
3405                 frame_display_row (fc, &need_col_headers, &max_regs);
3406               else
3407                 printf ("  DW_CFA_advance_loc2: %ld to %08lx\n",
3408                         ofs * fc->code_factor,
3409                         fc->pc_begin + ofs * fc->code_factor);
3410               fc->pc_begin += ofs * fc->code_factor;
3411               break;
3412
3413             case DW_CFA_advance_loc4:
3414               ofs = byte_get (start, 4); start += 4;
3415               if (do_debug_frames_interp)
3416                 frame_display_row (fc, &need_col_headers, &max_regs);
3417               else
3418                 printf ("  DW_CFA_advance_loc4: %ld to %08lx\n",
3419                         ofs * fc->code_factor,
3420                         fc->pc_begin + ofs * fc->code_factor);
3421               fc->pc_begin += ofs * fc->code_factor;
3422               break;
3423
3424             case DW_CFA_offset_extended:
3425               reg = LEB ();
3426               roffs = LEB ();
3427               if (! do_debug_frames_interp)
3428                 printf ("  DW_CFA_offset_extended: r%ld at cfa%+ld\n",
3429                         reg, roffs * fc->data_factor);
3430               fc->col_type[reg] = DW_CFA_offset;
3431               fc->col_offset[reg] = roffs * fc->data_factor;
3432               break;
3433
3434             case DW_CFA_val_offset:
3435               reg = LEB ();
3436               roffs = LEB ();
3437               if (! do_debug_frames_interp)
3438                 printf ("  DW_CFA_val_offset: r%ld at cfa%+ld\n",
3439                         reg, roffs * fc->data_factor);
3440               fc->col_type[reg] = DW_CFA_val_offset;
3441               fc->col_offset[reg] = roffs * fc->data_factor;
3442               break;
3443
3444             case DW_CFA_restore_extended:
3445               reg = LEB ();
3446               if (! do_debug_frames_interp)
3447                 printf ("  DW_CFA_restore_extended: r%ld\n", reg);
3448               fc->col_type[reg] = cie->col_type[reg];
3449               fc->col_offset[reg] = cie->col_offset[reg];
3450               break;
3451
3452             case DW_CFA_undefined:
3453               reg = LEB ();
3454               if (! do_debug_frames_interp)
3455                 printf ("  DW_CFA_undefined: r%ld\n", reg);
3456               fc->col_type[reg] = DW_CFA_undefined;
3457               fc->col_offset[reg] = 0;
3458               break;
3459
3460             case DW_CFA_same_value:
3461               reg = LEB ();
3462               if (! do_debug_frames_interp)
3463                 printf ("  DW_CFA_same_value: r%ld\n", reg);
3464               fc->col_type[reg] = DW_CFA_same_value;
3465               fc->col_offset[reg] = 0;
3466               break;
3467
3468             case DW_CFA_register:
3469               reg = LEB ();
3470               roffs = LEB ();
3471               if (! do_debug_frames_interp)
3472                 printf ("  DW_CFA_register: r%ld in r%ld\n", reg, roffs);
3473               fc->col_type[reg] = DW_CFA_register;
3474               fc->col_offset[reg] = roffs;
3475               break;
3476
3477             case DW_CFA_remember_state:
3478               if (! do_debug_frames_interp)
3479                 printf ("  DW_CFA_remember_state\n");
3480               rs = xmalloc (sizeof (Frame_Chunk));
3481               rs->ncols = fc->ncols;
3482               rs->col_type = xcmalloc (rs->ncols, sizeof (short int));
3483               rs->col_offset = xcmalloc (rs->ncols, sizeof (int));
3484               memcpy (rs->col_type, fc->col_type, rs->ncols);
3485               memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
3486               rs->next = remembered_state;
3487               remembered_state = rs;
3488               break;
3489
3490             case DW_CFA_restore_state:
3491               if (! do_debug_frames_interp)
3492                 printf ("  DW_CFA_restore_state\n");
3493               rs = remembered_state;
3494               if (rs)
3495                 {
3496                   remembered_state = rs->next;
3497                   frame_need_space (fc, rs->ncols-1);
3498                   memcpy (fc->col_type, rs->col_type, rs->ncols);
3499                   memcpy (fc->col_offset, rs->col_offset,
3500                           rs->ncols * sizeof (int));
3501                   free (rs->col_type);
3502                   free (rs->col_offset);
3503                   free (rs);
3504                 }
3505               else if (do_debug_frames_interp)
3506                 printf ("Mismatched DW_CFA_restore_state\n");
3507               break;
3508
3509             case DW_CFA_def_cfa:
3510               fc->cfa_reg = LEB ();
3511               fc->cfa_offset = LEB ();
3512               fc->cfa_exp = 0;
3513               if (! do_debug_frames_interp)
3514                 printf ("  DW_CFA_def_cfa: r%d ofs %d\n",
3515                         fc->cfa_reg, fc->cfa_offset);
3516               break;
3517
3518             case DW_CFA_def_cfa_register:
3519               fc->cfa_reg = LEB ();
3520               fc->cfa_exp = 0;
3521               if (! do_debug_frames_interp)
3522                 printf ("  DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
3523               break;
3524
3525             case DW_CFA_def_cfa_offset:
3526               fc->cfa_offset = LEB ();
3527               if (! do_debug_frames_interp)
3528                 printf ("  DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
3529               break;
3530
3531             case DW_CFA_nop:
3532               if (! do_debug_frames_interp)
3533                 printf ("  DW_CFA_nop\n");
3534               break;
3535
3536             case DW_CFA_def_cfa_expression:
3537               ul = LEB ();
3538               if (! do_debug_frames_interp)
3539                 {
3540                   printf ("  DW_CFA_def_cfa_expression (");
3541                   decode_location_expression (start, eh_addr_size, ul, 0);
3542                   printf (")\n");
3543                 }
3544               fc->cfa_exp = 1;
3545               start += ul;
3546               break;
3547
3548             case DW_CFA_expression:
3549               reg = LEB ();
3550               ul = LEB ();
3551               if (! do_debug_frames_interp)
3552                 {
3553                   printf ("  DW_CFA_expression: r%ld (", reg);
3554                   decode_location_expression (start, eh_addr_size, ul, 0);
3555                   printf (")\n");
3556                 }
3557               fc->col_type[reg] = DW_CFA_expression;
3558               start += ul;
3559               break;
3560
3561             case DW_CFA_val_expression:
3562               reg = LEB ();
3563               ul = LEB ();
3564               if (! do_debug_frames_interp)
3565                 {
3566                   printf ("  DW_CFA_val_expression: r%ld (", reg);
3567                   decode_location_expression (start, eh_addr_size, ul, 0);
3568                   printf (")\n");
3569                 }
3570               fc->col_type[reg] = DW_CFA_val_expression;
3571               start += ul;
3572               break;
3573
3574             case DW_CFA_offset_extended_sf:
3575               reg = LEB ();
3576               l = SLEB ();
3577               frame_need_space (fc, reg);
3578               if (! do_debug_frames_interp)
3579                 printf ("  DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
3580                         reg, l * fc->data_factor);
3581               fc->col_type[reg] = DW_CFA_offset;
3582               fc->col_offset[reg] = l * fc->data_factor;
3583               break;
3584
3585             case DW_CFA_val_offset_sf:
3586               reg = LEB ();
3587               l = SLEB ();
3588               frame_need_space (fc, reg);
3589               if (! do_debug_frames_interp)
3590                 printf ("  DW_CFA_val_offset_sf: r%ld at cfa%+ld\n",
3591                         reg, l * fc->data_factor);
3592               fc->col_type[reg] = DW_CFA_val_offset;
3593               fc->col_offset[reg] = l * fc->data_factor;
3594               break;
3595
3596             case DW_CFA_def_cfa_sf:
3597               fc->cfa_reg = LEB ();
3598               fc->cfa_offset = SLEB ();
3599               fc->cfa_offset = fc->cfa_offset * fc->data_factor;
3600               fc->cfa_exp = 0;
3601               if (! do_debug_frames_interp)
3602                 printf ("  DW_CFA_def_cfa_sf: r%d ofs %d\n",
3603                         fc->cfa_reg, fc->cfa_offset);
3604               break;
3605
3606             case DW_CFA_def_cfa_offset_sf:
3607               fc->cfa_offset = SLEB ();
3608               fc->cfa_offset = fc->cfa_offset * fc->data_factor;
3609               if (! do_debug_frames_interp)
3610                 printf ("  DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
3611               break;
3612
3613             case DW_CFA_MIPS_advance_loc8:
3614               ofs = byte_get (start, 8); start += 8;
3615               if (do_debug_frames_interp)
3616                 frame_display_row (fc, &need_col_headers, &max_regs);
3617               else
3618                 printf ("  DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
3619                         ofs * fc->code_factor,
3620                         fc->pc_begin + ofs * fc->code_factor);
3621               fc->pc_begin += ofs * fc->code_factor;
3622               break;
3623
3624             case DW_CFA_GNU_window_save:
3625               if (! do_debug_frames_interp)
3626                 printf ("  DW_CFA_GNU_window_save\n");
3627               break;
3628
3629             case DW_CFA_GNU_args_size:
3630               ul = LEB ();
3631               if (! do_debug_frames_interp)
3632                 printf ("  DW_CFA_GNU_args_size: %ld\n", ul);
3633               break;
3634
3635             case DW_CFA_GNU_negative_offset_extended:
3636               reg = LEB ();
3637               l = - LEB ();
3638               frame_need_space (fc, reg);
3639               if (! do_debug_frames_interp)
3640                 printf ("  DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
3641                         reg, l * fc->data_factor);
3642               fc->col_type[reg] = DW_CFA_offset;
3643               fc->col_offset[reg] = l * fc->data_factor;
3644               break;
3645
3646             default:
3647               if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
3648                 printf (_("  DW_CFA_??? (User defined call frame op: %#x)\n"), op);
3649               else
3650                 warn (_("unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);              
3651               start = block_end;
3652             }
3653         }
3654
3655       if (do_debug_frames_interp)
3656         frame_display_row (fc, &need_col_headers, &max_regs);
3657
3658       start = block_end;
3659     }
3660
3661   printf ("\n");
3662
3663   return 1;
3664 }
3665
3666 #undef GET
3667 #undef LEB
3668 #undef SLEB
3669
3670 static int
3671 display_debug_not_supported (struct dwarf_section *section,
3672                              void *file ATTRIBUTE_UNUSED)
3673 {
3674   printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
3675             section->name);
3676
3677   return 1;
3678 }
3679
3680 void *
3681 cmalloc (size_t nmemb, size_t size)
3682 {
3683   /* Check for overflow.  */
3684   if (nmemb >= ~(size_t) 0 / size)
3685     return NULL;
3686   else
3687     return malloc (nmemb * size);
3688 }
3689
3690 void *
3691 xcmalloc (size_t nmemb, size_t size)
3692 {
3693   /* Check for overflow.  */
3694   if (nmemb >= ~(size_t) 0 / size)
3695     return NULL;
3696   else
3697     return xmalloc (nmemb * size);
3698 }
3699
3700 void *
3701 xcrealloc (void *ptr, size_t nmemb, size_t size)
3702 {
3703   /* Check for overflow.  */
3704   if (nmemb >= ~(size_t) 0 / size)
3705     return NULL;
3706   else
3707     return xrealloc (ptr, nmemb * size);
3708 }
3709
3710 void
3711 error (const char *message, ...)
3712 {
3713   va_list args;
3714
3715   va_start (args, message);
3716   fprintf (stderr, _("%s: Error: "), program_name);
3717   vfprintf (stderr, message, args);
3718   va_end (args);
3719 }
3720
3721 void
3722 warn (const char *message, ...)
3723 {
3724   va_list args;
3725
3726   va_start (args, message);
3727   fprintf (stderr, _("%s: Warning: "), program_name);
3728   vfprintf (stderr, message, args);
3729   va_end (args);
3730 }
3731
3732 void
3733 free_debug_memory (void)
3734 {
3735   enum dwarf_section_display_enum i;
3736
3737   free_abbrevs ();
3738
3739   for (i = 0; i < max; i++)
3740     free_debug_section (i);
3741
3742   if (debug_information)
3743     {
3744       for (i = 0; i < num_debug_info_entries; i++)
3745         {
3746           if (!debug_information [i].max_loc_offsets)
3747             {
3748               free (debug_information [i].loc_offsets);
3749               free (debug_information [i].have_frame_base);
3750             }
3751           if (!debug_information [i].max_range_lists)
3752             free (debug_information [i].range_lists);
3753         }
3754       free (debug_information);
3755       debug_information = NULL;
3756       num_debug_info_entries = 0;
3757     }
3758
3759 }
3760
3761 struct dwarf_section_display debug_displays[] =
3762 {
3763   { { ".debug_abbrev",          NULL,   0,      0 },
3764     display_debug_abbrev,               0,      0 },
3765   { { ".debug_aranges",         NULL,   0,      0 },
3766     display_debug_aranges,              0,      0 },
3767   { { ".debug_frame",           NULL,   0,      0 },
3768     display_debug_frames,               1,      0 },
3769   { { ".debug_info",            NULL,   0,      0 },
3770     display_debug_info,                 1,      0 },
3771   { { ".debug_line",            NULL,   0,      0 },
3772     display_debug_lines,                0,      0 },
3773   { { ".debug_pubnames",        NULL,   0,      0 },
3774     display_debug_pubnames,             0,      0 },
3775   { { ".eh_frame",              NULL,   0,      0 },
3776     display_debug_frames,               1,      1 },
3777   { { ".debug_macinfo",         NULL,   0,      0 },
3778     display_debug_macinfo,              0,      0 },
3779   { { ".debug_str",             NULL,   0,      0 },
3780     display_debug_str,                  0,      0 },
3781   { { ".debug_loc",             NULL,   0,      0 },
3782     display_debug_loc,                  0,      0 },
3783   { { ".debug_pubtypes",        NULL,   0,      0 },
3784     display_debug_pubnames,             0,      0 },
3785   { { ".debug_ranges",          NULL,   0,      0 },
3786     display_debug_ranges,               0,      0 },
3787   { { ".debug_static_func",     NULL,   0,      0 },
3788     display_debug_not_supported,        0,      0 },
3789   { { ".debug_static_vars",     NULL,   0,      0 },
3790     display_debug_not_supported,        0,      0 },
3791   { { ".debug_types",           NULL,   0,      0 },
3792     display_debug_not_supported,        0,      0 },
3793   { { ".debug_weaknames",       NULL,   0,      0 },
3794     display_debug_not_supported,        0,      0 }
3795 };