dwarf.c revision 214082
1/* dwarf.c -- display DWARF contents of a BFD binary file
2   Copyright 2005, 2006
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
29static int have_frame_base;
30static int need_base_address;
31
32static unsigned int last_pointer_size = 0;
33static int warned_about_missing_comp_units = FALSE;
34
35static unsigned int num_debug_info_entries = 0;
36static debug_info *debug_information = NULL;
37
38dwarf_vma eh_addr_size;
39int is_relocatable;
40
41int do_debug_info;
42int do_debug_abbrevs;
43int do_debug_lines;
44int do_debug_pubnames;
45int do_debug_aranges;
46int do_debug_ranges;
47int do_debug_frames;
48int do_debug_frames_interp;
49int do_debug_macinfo;
50int do_debug_str;
51int do_debug_loc;
52
53dwarf_vma (*byte_get) (unsigned char *, int);
54
55dwarf_vma
56byte_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
98dwarf_vma
99byte_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
142static dwarf_vma
143byte_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
162static unsigned long int
163read_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
191typedef 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
205static SMR state_machine_regs;
206
207static void
208reset_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
223static int
224process_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
282static const char *
283fetch_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.  */
304typedef struct abbrev_attr
305{
306  unsigned long attribute;
307  unsigned long form;
308  struct abbrev_attr *next;
309}
310abbrev_attr;
311
312typedef 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}
321abbrev_entry;
322
323static abbrev_entry *first_abbrev = NULL;
324static abbrev_entry *last_abbrev = NULL;
325
326static void
327free_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
351static void
352add_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
377static void
378add_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
405static unsigned char *
406process_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
454static char *
455get_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
534static char *
535get_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
570static unsigned char *
571display_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
581static int
582decode_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
922static unsigned char *
923read_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	case DW_LANG_C:			printf ("(non-ANSI C)"); break;
1217	case DW_LANG_C89:		printf ("(ANSI C)"); break;
1218	case DW_LANG_C_plus_plus:	printf ("(C++)"); break;
1219	case DW_LANG_Fortran77:		printf ("(FORTRAN 77)"); break;
1220	case DW_LANG_Fortran90:		printf ("(Fortran 90)"); break;
1221	case DW_LANG_Modula2:		printf ("(Modula 2)"); break;
1222	case DW_LANG_Pascal83:		printf ("(ANSI Pascal)"); break;
1223	case DW_LANG_Ada83:		printf ("(Ada)"); break;
1224	case DW_LANG_Cobol74:		printf ("(Cobol 74)"); break;
1225	case DW_LANG_Cobol85:		printf ("(Cobol 85)"); break;
1226	  /* DWARF 2.1 values.	*/
1227	case DW_LANG_C99:		printf ("(ANSI C99)"); break;
1228	case DW_LANG_Ada95:		printf ("(ADA 95)"); break;
1229	case DW_LANG_Fortran95:		printf ("(Fortran 95)"); break;
1230	  /* MIPS extension.  */
1231	case DW_LANG_Mips_Assembler:	printf ("(MIPS assembler)"); break;
1232	  /* UPC extension.  */
1233	case DW_LANG_Upc:		printf ("(Unified Parallel C)"); break;
1234	default:
1235	  printf ("(Unknown: %lx)", uvalue);
1236	  break;
1237	}
1238      break;
1239
1240    case DW_AT_encoding:
1241      switch (uvalue)
1242	{
1243	case DW_ATE_void:		printf ("(void)"); break;
1244	case DW_ATE_address:		printf ("(machine address)"); break;
1245	case DW_ATE_boolean:		printf ("(boolean)"); break;
1246	case DW_ATE_complex_float:	printf ("(complex float)"); break;
1247	case DW_ATE_float:		printf ("(float)"); break;
1248	case DW_ATE_signed:		printf ("(signed)"); break;
1249	case DW_ATE_signed_char:	printf ("(signed char)"); break;
1250	case DW_ATE_unsigned:		printf ("(unsigned)"); break;
1251	case DW_ATE_unsigned_char:	printf ("(unsigned char)"); break;
1252	  /* DWARF 2.1 value.  */
1253	case DW_ATE_imaginary_float:	printf ("(imaginary float)"); break;
1254	case DW_ATE_decimal_float:	printf ("(decimal float)"); break;
1255	default:
1256	  if (uvalue >= DW_ATE_lo_user
1257	      && uvalue <= DW_ATE_hi_user)
1258	    printf ("(user defined type)");
1259	  else
1260	    printf ("(unknown type)");
1261	  break;
1262	}
1263      break;
1264
1265    case DW_AT_accessibility:
1266      switch (uvalue)
1267	{
1268	case DW_ACCESS_public:		printf ("(public)"); break;
1269	case DW_ACCESS_protected:	printf ("(protected)"); break;
1270	case DW_ACCESS_private:		printf ("(private)"); break;
1271	default:
1272	  printf ("(unknown accessibility)");
1273	  break;
1274	}
1275      break;
1276
1277    case DW_AT_visibility:
1278      switch (uvalue)
1279	{
1280	case DW_VIS_local:		printf ("(local)"); break;
1281	case DW_VIS_exported:		printf ("(exported)"); break;
1282	case DW_VIS_qualified:		printf ("(qualified)"); break;
1283	default:			printf ("(unknown visibility)"); break;
1284	}
1285      break;
1286
1287    case DW_AT_virtuality:
1288      switch (uvalue)
1289	{
1290	case DW_VIRTUALITY_none:	printf ("(none)"); break;
1291	case DW_VIRTUALITY_virtual:	printf ("(virtual)"); break;
1292	case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
1293	default:			printf ("(unknown virtuality)"); break;
1294	}
1295      break;
1296
1297    case DW_AT_identifier_case:
1298      switch (uvalue)
1299	{
1300	case DW_ID_case_sensitive:	printf ("(case_sensitive)"); break;
1301	case DW_ID_up_case:		printf ("(up_case)"); break;
1302	case DW_ID_down_case:		printf ("(down_case)"); break;
1303	case DW_ID_case_insensitive:	printf ("(case_insensitive)"); break;
1304	default:			printf ("(unknown case)"); break;
1305	}
1306      break;
1307
1308    case DW_AT_calling_convention:
1309      switch (uvalue)
1310	{
1311	case DW_CC_normal:	printf ("(normal)"); break;
1312	case DW_CC_program:	printf ("(program)"); break;
1313	case DW_CC_nocall:	printf ("(nocall)"); break;
1314	default:
1315	  if (uvalue >= DW_CC_lo_user
1316	      && uvalue <= DW_CC_hi_user)
1317	    printf ("(user defined)");
1318	  else
1319	    printf ("(unknown convention)");
1320	}
1321      break;
1322
1323    case DW_AT_ordering:
1324      switch (uvalue)
1325	{
1326	case -1: printf ("(undefined)"); break;
1327	case 0:  printf ("(row major)"); break;
1328	case 1:  printf ("(column major)"); break;
1329	}
1330      break;
1331
1332    case DW_AT_frame_base:
1333      have_frame_base = 1;
1334    case DW_AT_location:
1335    case DW_AT_data_member_location:
1336    case DW_AT_vtable_elem_location:
1337    case DW_AT_allocated:
1338    case DW_AT_associated:
1339    case DW_AT_data_location:
1340    case DW_AT_stride:
1341    case DW_AT_upper_bound:
1342    case DW_AT_lower_bound:
1343      if (block_start)
1344	{
1345	  int need_frame_base;
1346
1347	  printf ("(");
1348	  need_frame_base = decode_location_expression (block_start,
1349							pointer_size,
1350							uvalue,
1351							cu_offset);
1352	  printf (")");
1353	  if (need_frame_base && !have_frame_base)
1354	    printf (_(" [without DW_AT_frame_base]"));
1355	}
1356      else if (form == DW_FORM_data4 || form == DW_FORM_data8)
1357	printf (_("(location list)"));
1358
1359      break;
1360
1361    default:
1362      break;
1363    }
1364
1365  return data;
1366}
1367
1368static char *
1369get_AT_name (unsigned long attribute)
1370{
1371  switch (attribute)
1372    {
1373    case DW_AT_sibling:			return "DW_AT_sibling";
1374    case DW_AT_location:		return "DW_AT_location";
1375    case DW_AT_name:			return "DW_AT_name";
1376    case DW_AT_ordering:		return "DW_AT_ordering";
1377    case DW_AT_subscr_data:		return "DW_AT_subscr_data";
1378    case DW_AT_byte_size:		return "DW_AT_byte_size";
1379    case DW_AT_bit_offset:		return "DW_AT_bit_offset";
1380    case DW_AT_bit_size:		return "DW_AT_bit_size";
1381    case DW_AT_element_list:		return "DW_AT_element_list";
1382    case DW_AT_stmt_list:		return "DW_AT_stmt_list";
1383    case DW_AT_low_pc:			return "DW_AT_low_pc";
1384    case DW_AT_high_pc:			return "DW_AT_high_pc";
1385    case DW_AT_language:		return "DW_AT_language";
1386    case DW_AT_member:			return "DW_AT_member";
1387    case DW_AT_discr:			return "DW_AT_discr";
1388    case DW_AT_discr_value:		return "DW_AT_discr_value";
1389    case DW_AT_visibility:		return "DW_AT_visibility";
1390    case DW_AT_import:			return "DW_AT_import";
1391    case DW_AT_string_length:		return "DW_AT_string_length";
1392    case DW_AT_common_reference:	return "DW_AT_common_reference";
1393    case DW_AT_comp_dir:		return "DW_AT_comp_dir";
1394    case DW_AT_const_value:		return "DW_AT_const_value";
1395    case DW_AT_containing_type:		return "DW_AT_containing_type";
1396    case DW_AT_default_value:		return "DW_AT_default_value";
1397    case DW_AT_inline:			return "DW_AT_inline";
1398    case DW_AT_is_optional:		return "DW_AT_is_optional";
1399    case DW_AT_lower_bound:		return "DW_AT_lower_bound";
1400    case DW_AT_producer:		return "DW_AT_producer";
1401    case DW_AT_prototyped:		return "DW_AT_prototyped";
1402    case DW_AT_return_addr:		return "DW_AT_return_addr";
1403    case DW_AT_start_scope:		return "DW_AT_start_scope";
1404    case DW_AT_stride_size:		return "DW_AT_stride_size";
1405    case DW_AT_upper_bound:		return "DW_AT_upper_bound";
1406    case DW_AT_abstract_origin:		return "DW_AT_abstract_origin";
1407    case DW_AT_accessibility:		return "DW_AT_accessibility";
1408    case DW_AT_address_class:		return "DW_AT_address_class";
1409    case DW_AT_artificial:		return "DW_AT_artificial";
1410    case DW_AT_base_types:		return "DW_AT_base_types";
1411    case DW_AT_calling_convention:	return "DW_AT_calling_convention";
1412    case DW_AT_count:			return "DW_AT_count";
1413    case DW_AT_data_member_location:	return "DW_AT_data_member_location";
1414    case DW_AT_decl_column:		return "DW_AT_decl_column";
1415    case DW_AT_decl_file:		return "DW_AT_decl_file";
1416    case DW_AT_decl_line:		return "DW_AT_decl_line";
1417    case DW_AT_declaration:		return "DW_AT_declaration";
1418    case DW_AT_discr_list:		return "DW_AT_discr_list";
1419    case DW_AT_encoding:		return "DW_AT_encoding";
1420    case DW_AT_external:		return "DW_AT_external";
1421    case DW_AT_frame_base:		return "DW_AT_frame_base";
1422    case DW_AT_friend:			return "DW_AT_friend";
1423    case DW_AT_identifier_case:		return "DW_AT_identifier_case";
1424    case DW_AT_macro_info:		return "DW_AT_macro_info";
1425    case DW_AT_namelist_items:		return "DW_AT_namelist_items";
1426    case DW_AT_priority:		return "DW_AT_priority";
1427    case DW_AT_segment:			return "DW_AT_segment";
1428    case DW_AT_specification:		return "DW_AT_specification";
1429    case DW_AT_static_link:		return "DW_AT_static_link";
1430    case DW_AT_type:			return "DW_AT_type";
1431    case DW_AT_use_location:		return "DW_AT_use_location";
1432    case DW_AT_variable_parameter:	return "DW_AT_variable_parameter";
1433    case DW_AT_virtuality:		return "DW_AT_virtuality";
1434    case DW_AT_vtable_elem_location:	return "DW_AT_vtable_elem_location";
1435      /* DWARF 2.1 values.  */
1436    case DW_AT_allocated:		return "DW_AT_allocated";
1437    case DW_AT_associated:		return "DW_AT_associated";
1438    case DW_AT_data_location:		return "DW_AT_data_location";
1439    case DW_AT_stride:			return "DW_AT_stride";
1440    case DW_AT_entry_pc:		return "DW_AT_entry_pc";
1441    case DW_AT_use_UTF8:		return "DW_AT_use_UTF8";
1442    case DW_AT_extension:		return "DW_AT_extension";
1443    case DW_AT_ranges:			return "DW_AT_ranges";
1444    case DW_AT_trampoline:		return "DW_AT_trampoline";
1445    case DW_AT_call_column:		return "DW_AT_call_column";
1446    case DW_AT_call_file:		return "DW_AT_call_file";
1447    case DW_AT_call_line:		return "DW_AT_call_line";
1448      /* SGI/MIPS extensions.  */
1449    case DW_AT_MIPS_fde:		return "DW_AT_MIPS_fde";
1450    case DW_AT_MIPS_loop_begin:		return "DW_AT_MIPS_loop_begin";
1451    case DW_AT_MIPS_tail_loop_begin:	return "DW_AT_MIPS_tail_loop_begin";
1452    case DW_AT_MIPS_epilog_begin:	return "DW_AT_MIPS_epilog_begin";
1453    case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
1454    case DW_AT_MIPS_software_pipeline_depth:
1455      return "DW_AT_MIPS_software_pipeline_depth";
1456    case DW_AT_MIPS_linkage_name:	return "DW_AT_MIPS_linkage_name";
1457    case DW_AT_MIPS_stride:		return "DW_AT_MIPS_stride";
1458    case DW_AT_MIPS_abstract_name:	return "DW_AT_MIPS_abstract_name";
1459    case DW_AT_MIPS_clone_origin:	return "DW_AT_MIPS_clone_origin";
1460    case DW_AT_MIPS_has_inlines:	return "DW_AT_MIPS_has_inlines";
1461      /* GNU extensions.  */
1462    case DW_AT_sf_names:		return "DW_AT_sf_names";
1463    case DW_AT_src_info:		return "DW_AT_src_info";
1464    case DW_AT_mac_info:		return "DW_AT_mac_info";
1465    case DW_AT_src_coords:		return "DW_AT_src_coords";
1466    case DW_AT_body_begin:		return "DW_AT_body_begin";
1467    case DW_AT_body_end:		return "DW_AT_body_end";
1468    case DW_AT_GNU_vector:		return "DW_AT_GNU_vector";
1469      /* UPC extension.  */
1470    case DW_AT_upc_threads_scaled:	return "DW_AT_upc_threads_scaled";
1471    default:
1472      {
1473	static char buffer[100];
1474
1475	snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
1476		  attribute);
1477	return buffer;
1478      }
1479    }
1480}
1481
1482static unsigned char *
1483read_and_display_attr (unsigned long attribute,
1484		       unsigned long form,
1485		       unsigned char *data,
1486		       unsigned long cu_offset,
1487		       unsigned long pointer_size,
1488		       unsigned long offset_size,
1489		       int dwarf_version,
1490		       debug_info *debug_info_p,
1491		       int do_loc)
1492{
1493  if (!do_loc)
1494    printf ("     %-18s:", get_AT_name (attribute));
1495  data = read_and_display_attr_value (attribute, form, data, cu_offset,
1496				      pointer_size, offset_size,
1497				      dwarf_version, debug_info_p,
1498				      do_loc);
1499  if (!do_loc)
1500    printf ("\n");
1501  return data;
1502}
1503
1504
1505/* Process the contents of a .debug_info section.  If do_loc is non-zero
1506   then we are scanning for location lists and we do not want to display
1507   anything to the user.  */
1508
1509static int
1510process_debug_info (struct dwarf_section *section, void *file,
1511		    int do_loc)
1512{
1513  unsigned char *start = section->start;
1514  unsigned char *end = start + section->size;
1515  unsigned char *section_begin;
1516  unsigned int unit;
1517  unsigned int num_units = 0;
1518
1519  if ((do_loc || do_debug_loc || do_debug_ranges)
1520      && num_debug_info_entries == 0)
1521    {
1522      unsigned long length;
1523
1524      /* First scan the section to get the number of comp units.  */
1525      for (section_begin = start, num_units = 0; section_begin < end;
1526	   num_units ++)
1527	{
1528	  /* Read the first 4 bytes.  For a 32-bit DWARF section, this
1529	     will be the length.  For a 64-bit DWARF section, it'll be
1530	     the escape code 0xffffffff followed by an 8 byte length.  */
1531	  length = byte_get (section_begin, 4);
1532
1533	  if (length == 0xffffffff)
1534	    {
1535	      length = byte_get (section_begin + 4, 8);
1536	      section_begin += length + 12;
1537	    }
1538	  else
1539	    section_begin += length + 4;
1540	}
1541
1542      if (num_units == 0)
1543	{
1544	  error (_("No comp units in %s section ?"), section->name);
1545	  return 0;
1546	}
1547
1548      /* Then allocate an array to hold the information.  */
1549      debug_information = cmalloc (num_units,
1550				   sizeof (* debug_information));
1551      if (debug_information == NULL)
1552	{
1553	  error (_("Not enough memory for a debug info array of %u entries"),
1554		 num_units);
1555	  return 0;
1556	}
1557    }
1558
1559  if (!do_loc)
1560    {
1561      printf (_("The section %s contains:\n\n"), section->name);
1562
1563      load_debug_section (str, file);
1564    }
1565
1566  load_debug_section (abbrev, file);
1567  if (debug_displays [abbrev].section.start == NULL)
1568    {
1569      warn (_("Unable to locate %s section!\n"),
1570	    debug_displays [abbrev].section.name);
1571      return 0;
1572    }
1573
1574  for (section_begin = start, unit = 0; start < end; unit++)
1575    {
1576      DWARF2_Internal_CompUnit compunit;
1577      unsigned char *hdrptr;
1578      unsigned char *cu_abbrev_offset_ptr;
1579      unsigned char *tags;
1580      int level;
1581      unsigned long cu_offset;
1582      int offset_size;
1583      int initial_length_size;
1584
1585      hdrptr = start;
1586
1587      compunit.cu_length = byte_get (hdrptr, 4);
1588      hdrptr += 4;
1589
1590      if (compunit.cu_length == 0xffffffff)
1591	{
1592	  compunit.cu_length = byte_get (hdrptr, 8);
1593	  hdrptr += 8;
1594	  offset_size = 8;
1595	  initial_length_size = 12;
1596	}
1597      else
1598	{
1599	  offset_size = 4;
1600	  initial_length_size = 4;
1601	}
1602
1603      compunit.cu_version = byte_get (hdrptr, 2);
1604      hdrptr += 2;
1605
1606      cu_offset = start - section_begin;
1607      start += compunit.cu_length + initial_length_size;
1608
1609      cu_abbrev_offset_ptr = hdrptr;
1610      compunit.cu_abbrev_offset = byte_get (hdrptr, offset_size);
1611      hdrptr += offset_size;
1612
1613      compunit.cu_pointer_size = byte_get (hdrptr, 1);
1614      hdrptr += 1;
1615      if ((do_loc || do_debug_loc || do_debug_ranges)
1616	  && num_debug_info_entries == 0)
1617	{
1618	  debug_information [unit].cu_offset = cu_offset;
1619	  debug_information [unit].pointer_size
1620	    = compunit.cu_pointer_size;
1621	  debug_information [unit].base_address = 0;
1622	  debug_information [unit].loc_offsets = NULL;
1623	  debug_information [unit].have_frame_base = NULL;
1624	  debug_information [unit].max_loc_offsets = 0;
1625	  debug_information [unit].num_loc_offsets = 0;
1626	  debug_information [unit].range_lists = NULL;
1627	  debug_information [unit].max_range_lists= 0;
1628	  debug_information [unit].num_range_lists = 0;
1629	}
1630
1631      tags = hdrptr;
1632
1633      if (!do_loc)
1634	{
1635	  printf (_("  Compilation Unit @ offset 0x%lx:\n"), cu_offset);
1636	  printf (_("   Length:        %ld\n"), compunit.cu_length);
1637	  printf (_("   Version:       %d\n"), compunit.cu_version);
1638	  printf (_("   Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
1639	  printf (_("   Pointer Size:  %d\n"), compunit.cu_pointer_size);
1640	}
1641
1642      if (compunit.cu_version != 2 && compunit.cu_version != 3)
1643	{
1644	  warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
1645	  continue;
1646	}
1647
1648      free_abbrevs ();
1649
1650      /* Process the abbrevs used by this compilation unit. DWARF
1651	 sections under Mach-O have non-zero addresses.  */
1652      process_abbrev_section
1653	((unsigned char *) debug_displays [abbrev].section.start
1654	 + compunit.cu_abbrev_offset - debug_displays [abbrev].section.address,
1655	 (unsigned char *) debug_displays [abbrev].section.start
1656	 + debug_displays [abbrev].section.size);
1657
1658      level = 0;
1659      while (tags < start)
1660	{
1661	  unsigned int bytes_read;
1662	  unsigned long abbrev_number;
1663	  abbrev_entry *entry;
1664	  abbrev_attr *attr;
1665
1666	  abbrev_number = read_leb128 (tags, & bytes_read, 0);
1667	  tags += bytes_read;
1668
1669	  /* A null DIE marks the end of a list of children.  */
1670	  if (abbrev_number == 0)
1671	    {
1672	      --level;
1673	      continue;
1674	    }
1675
1676	  /* Scan through the abbreviation list until we reach the
1677	     correct entry.  */
1678	  for (entry = first_abbrev;
1679	       entry && entry->entry != abbrev_number;
1680	       entry = entry->next)
1681	    continue;
1682
1683	  if (entry == NULL)
1684	    {
1685	      warn (_("Unable to locate entry %lu in the abbreviation table\n"),
1686		    abbrev_number);
1687	      return 0;
1688	    }
1689
1690	  if (!do_loc)
1691	    printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
1692		    level,
1693		    (unsigned long) (tags - section_begin
1694				     - bytes_read),
1695		    abbrev_number,
1696		    get_TAG_name (entry->tag));
1697
1698	  switch (entry->tag)
1699	    {
1700	    default:
1701	      need_base_address = 0;
1702	      break;
1703	    case DW_TAG_compile_unit:
1704	      need_base_address = 1;
1705	      break;
1706	    case DW_TAG_entry_point:
1707	    case DW_TAG_inlined_subroutine:
1708	    case DW_TAG_subprogram:
1709	      need_base_address = 0;
1710	      /* Assuming that there is no DW_AT_frame_base.  */
1711	      have_frame_base = 0;
1712	      break;
1713	    }
1714
1715	  for (attr = entry->first_attr; attr; attr = attr->next)
1716	    tags = read_and_display_attr (attr->attribute,
1717					  attr->form,
1718					  tags, cu_offset,
1719					  compunit.cu_pointer_size,
1720					  offset_size,
1721					  compunit.cu_version,
1722					  &debug_information [unit],
1723					  do_loc);
1724
1725 	  if (entry->children)
1726 	    ++level;
1727 	}
1728    }
1729
1730  /* Set num_debug_info_entries here so that it can be used to check if
1731     we need to process .debug_loc and .debug_ranges sections.  */
1732  if ((do_loc || do_debug_loc || do_debug_ranges)
1733      && num_debug_info_entries == 0)
1734    num_debug_info_entries = num_units;
1735
1736  if (!do_loc)
1737    {
1738      printf ("\n");
1739    }
1740
1741  return 1;
1742}
1743
1744/* Locate and scan the .debug_info section in the file and record the pointer
1745   sizes and offsets for the compilation units in it.  Usually an executable
1746   will have just one pointer size, but this is not guaranteed, and so we try
1747   not to make any assumptions.  Returns zero upon failure, or the number of
1748   compilation units upon success.  */
1749
1750static unsigned int
1751load_debug_info (void * file)
1752{
1753  /* Reset the last pointer size so that we can issue correct error
1754     messages if we are displaying the contents of more than one section.  */
1755  last_pointer_size = 0;
1756  warned_about_missing_comp_units = FALSE;
1757
1758  /* If we already have the information there is nothing else to do.  */
1759  if (num_debug_info_entries > 0)
1760    return num_debug_info_entries;
1761
1762  if (load_debug_section (info, file)
1763      && process_debug_info (&debug_displays [info].section, file, 1))
1764    return num_debug_info_entries;
1765  else
1766    return 0;
1767}
1768
1769static int
1770display_debug_lines (struct dwarf_section *section, void *file)
1771{
1772  unsigned char *start = section->start;
1773  unsigned char *data = start;
1774  unsigned char *end = start + section->size;
1775
1776  printf (_("\nDump of debug contents of section %s:\n\n"),
1777	  section->name);
1778
1779  load_debug_info (file);
1780
1781  while (data < end)
1782    {
1783      DWARF2_Internal_LineInfo info;
1784      unsigned char *standard_opcodes;
1785      unsigned char *end_of_sequence;
1786      unsigned char *hdrptr;
1787      int initial_length_size;
1788      int offset_size;
1789      int i;
1790
1791      hdrptr = data;
1792
1793      /* Check the length of the block.  */
1794      info.li_length = byte_get (hdrptr, 4);
1795      hdrptr += 4;
1796
1797      if (info.li_length == 0xffffffff)
1798	{
1799	  /* This section is 64-bit DWARF 3.  */
1800	  info.li_length = byte_get (hdrptr, 8);
1801	  hdrptr += 8;
1802	  offset_size = 8;
1803	  initial_length_size = 12;
1804	}
1805      else
1806	{
1807	  offset_size = 4;
1808	  initial_length_size = 4;
1809	}
1810
1811      if (info.li_length + initial_length_size > section->size)
1812	{
1813	  warn
1814	    (_("The line info appears to be corrupt - the section is too small\n"));
1815	  return 0;
1816	}
1817
1818      /* Check its version number.  */
1819      info.li_version = byte_get (hdrptr, 2);
1820      hdrptr += 2;
1821      if (info.li_version != 2 && info.li_version != 3)
1822	{
1823	  warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
1824	  return 0;
1825	}
1826
1827      info.li_prologue_length = byte_get (hdrptr, offset_size);
1828      hdrptr += offset_size;
1829      info.li_min_insn_length = byte_get (hdrptr, 1);
1830      hdrptr++;
1831      info.li_default_is_stmt = byte_get (hdrptr, 1);
1832      hdrptr++;
1833      info.li_line_base = byte_get (hdrptr, 1);
1834      hdrptr++;
1835      info.li_line_range = byte_get (hdrptr, 1);
1836      hdrptr++;
1837      info.li_opcode_base = byte_get (hdrptr, 1);
1838      hdrptr++;
1839
1840      /* Sign extend the line base field.  */
1841      info.li_line_base <<= 24;
1842      info.li_line_base >>= 24;
1843
1844      printf (_("  Length:                      %ld\n"), info.li_length);
1845      printf (_("  DWARF Version:               %d\n"), info.li_version);
1846      printf (_("  Prologue Length:             %d\n"), info.li_prologue_length);
1847      printf (_("  Minimum Instruction Length:  %d\n"), info.li_min_insn_length);
1848      printf (_("  Initial value of 'is_stmt':  %d\n"), info.li_default_is_stmt);
1849      printf (_("  Line Base:                   %d\n"), info.li_line_base);
1850      printf (_("  Line Range:                  %d\n"), info.li_line_range);
1851      printf (_("  Opcode Base:                 %d\n"), info.li_opcode_base);
1852
1853      end_of_sequence = data + info.li_length + initial_length_size;
1854
1855      reset_state_machine (info.li_default_is_stmt);
1856
1857      /* Display the contents of the Opcodes table.  */
1858      standard_opcodes = hdrptr;
1859
1860      printf (_("\n Opcodes:\n"));
1861
1862      for (i = 1; i < info.li_opcode_base; i++)
1863	printf (_("  Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
1864
1865      /* Display the contents of the Directory table.  */
1866      data = standard_opcodes + info.li_opcode_base - 1;
1867
1868      if (*data == 0)
1869	printf (_("\n The Directory Table is empty.\n"));
1870      else
1871	{
1872	  printf (_("\n The Directory Table:\n"));
1873
1874	  while (*data != 0)
1875	    {
1876	      printf (_("  %s\n"), data);
1877
1878	      data += strlen ((char *) data) + 1;
1879	    }
1880	}
1881
1882      /* Skip the NUL at the end of the table.  */
1883      data++;
1884
1885      /* Display the contents of the File Name table.  */
1886      if (*data == 0)
1887	printf (_("\n The File Name Table is empty.\n"));
1888      else
1889	{
1890	  printf (_("\n The File Name Table:\n"));
1891	  printf (_("  Entry\tDir\tTime\tSize\tName\n"));
1892
1893	  while (*data != 0)
1894	    {
1895	      unsigned char *name;
1896	      unsigned int bytes_read;
1897
1898	      printf (_("  %d\t"), ++state_machine_regs.last_file_entry);
1899	      name = data;
1900
1901	      data += strlen ((char *) data) + 1;
1902
1903	      printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
1904	      data += bytes_read;
1905	      printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
1906	      data += bytes_read;
1907	      printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
1908	      data += bytes_read;
1909	      printf (_("%s\n"), name);
1910	    }
1911	}
1912
1913      /* Skip the NUL at the end of the table.  */
1914      data++;
1915
1916      /* Now display the statements.  */
1917      printf (_("\n Line Number Statements:\n"));
1918
1919      while (data < end_of_sequence)
1920	{
1921	  unsigned char op_code;
1922	  int adv;
1923	  unsigned long int uladv;
1924	  unsigned int bytes_read;
1925
1926	  op_code = *data++;
1927
1928	  if (op_code >= info.li_opcode_base)
1929	    {
1930	      op_code -= info.li_opcode_base;
1931	      uladv = (op_code / info.li_line_range) * info.li_min_insn_length;
1932	      state_machine_regs.address += uladv;
1933	      printf (_("  Special opcode %d: advance Address by %lu to 0x%lx"),
1934		      op_code, uladv, state_machine_regs.address);
1935	      adv = (op_code % info.li_line_range) + info.li_line_base;
1936	      state_machine_regs.line += adv;
1937	      printf (_(" and Line by %d to %d\n"),
1938		      adv, state_machine_regs.line);
1939	    }
1940	  else switch (op_code)
1941	    {
1942	    case DW_LNS_extended_op:
1943	      data += process_extended_line_op (data, info.li_default_is_stmt);
1944	      break;
1945
1946	    case DW_LNS_copy:
1947	      printf (_("  Copy\n"));
1948	      break;
1949
1950	    case DW_LNS_advance_pc:
1951	      uladv = read_leb128 (data, & bytes_read, 0);
1952	      uladv *= info.li_min_insn_length;
1953	      data += bytes_read;
1954	      state_machine_regs.address += uladv;
1955	      printf (_("  Advance PC by %lu to 0x%lx\n"), uladv,
1956		      state_machine_regs.address);
1957	      break;
1958
1959	    case DW_LNS_advance_line:
1960	      adv = read_leb128 (data, & bytes_read, 1);
1961	      data += bytes_read;
1962	      state_machine_regs.line += adv;
1963	      printf (_("  Advance Line by %d to %d\n"), adv,
1964		      state_machine_regs.line);
1965	      break;
1966
1967	    case DW_LNS_set_file:
1968	      adv = read_leb128 (data, & bytes_read, 0);
1969	      data += bytes_read;
1970	      printf (_("  Set File Name to entry %d in the File Name Table\n"),
1971		      adv);
1972	      state_machine_regs.file = adv;
1973	      break;
1974
1975	    case DW_LNS_set_column:
1976	      uladv = read_leb128 (data, & bytes_read, 0);
1977	      data += bytes_read;
1978	      printf (_("  Set column to %lu\n"), uladv);
1979	      state_machine_regs.column = uladv;
1980	      break;
1981
1982	    case DW_LNS_negate_stmt:
1983	      adv = state_machine_regs.is_stmt;
1984	      adv = ! adv;
1985	      printf (_("  Set is_stmt to %d\n"), adv);
1986	      state_machine_regs.is_stmt = adv;
1987	      break;
1988
1989	    case DW_LNS_set_basic_block:
1990	      printf (_("  Set basic block\n"));
1991	      state_machine_regs.basic_block = 1;
1992	      break;
1993
1994	    case DW_LNS_const_add_pc:
1995	      uladv = (((255 - info.li_opcode_base) / info.li_line_range)
1996		      * info.li_min_insn_length);
1997	      state_machine_regs.address += uladv;
1998	      printf (_("  Advance PC by constant %lu to 0x%lx\n"), uladv,
1999		      state_machine_regs.address);
2000	      break;
2001
2002	    case DW_LNS_fixed_advance_pc:
2003	      uladv = byte_get (data, 2);
2004	      data += 2;
2005	      state_machine_regs.address += uladv;
2006	      printf (_("  Advance PC by fixed size amount %lu to 0x%lx\n"),
2007		      uladv, state_machine_regs.address);
2008	      break;
2009
2010	    case DW_LNS_set_prologue_end:
2011	      printf (_("  Set prologue_end to true\n"));
2012	      break;
2013
2014	    case DW_LNS_set_epilogue_begin:
2015	      printf (_("  Set epilogue_begin to true\n"));
2016	      break;
2017
2018	    case DW_LNS_set_isa:
2019	      uladv = read_leb128 (data, & bytes_read, 0);
2020	      data += bytes_read;
2021	      printf (_("  Set ISA to %lu\n"), uladv);
2022	      break;
2023
2024	    default:
2025	      printf (_("  Unknown opcode %d with operands: "), op_code);
2026
2027	      for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
2028		{
2029		  printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
2030			  i == 1 ? "" : ", ");
2031		  data += bytes_read;
2032		}
2033	      putchar ('\n');
2034	      break;
2035	    }
2036	}
2037      putchar ('\n');
2038    }
2039
2040  return 1;
2041}
2042
2043static int
2044display_debug_pubnames (struct dwarf_section *section,
2045			void *file ATTRIBUTE_UNUSED)
2046{
2047  DWARF2_Internal_PubNames pubnames;
2048  unsigned char *start = section->start;
2049  unsigned char *end = start + section->size;
2050
2051  printf (_("Contents of the %s section:\n\n"), section->name);
2052
2053  while (start < end)
2054    {
2055      unsigned char *data;
2056      unsigned long offset;
2057      int offset_size, initial_length_size;
2058
2059      data = start;
2060
2061      pubnames.pn_length = byte_get (data, 4);
2062      data += 4;
2063      if (pubnames.pn_length == 0xffffffff)
2064	{
2065	  pubnames.pn_length = byte_get (data, 8);
2066	  data += 8;
2067	  offset_size = 8;
2068	  initial_length_size = 12;
2069	}
2070      else
2071	{
2072	  offset_size = 4;
2073	  initial_length_size = 4;
2074	}
2075
2076      pubnames.pn_version = byte_get (data, 2);
2077      data += 2;
2078      pubnames.pn_offset = byte_get (data, offset_size);
2079      data += offset_size;
2080      pubnames.pn_size = byte_get (data, offset_size);
2081      data += offset_size;
2082
2083      start += pubnames.pn_length + initial_length_size;
2084
2085      if (pubnames.pn_version != 2 && pubnames.pn_version != 3)
2086	{
2087	  static int warned = 0;
2088
2089	  if (! warned)
2090	    {
2091	      warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
2092	      warned = 1;
2093	    }
2094
2095	  continue;
2096	}
2097
2098      printf (_("  Length:                              %ld\n"),
2099	      pubnames.pn_length);
2100      printf (_("  Version:                             %d\n"),
2101	      pubnames.pn_version);
2102      printf (_("  Offset into .debug_info section:     %ld\n"),
2103	      pubnames.pn_offset);
2104      printf (_("  Size of area in .debug_info section: %ld\n"),
2105	      pubnames.pn_size);
2106
2107      printf (_("\n    Offset\tName\n"));
2108
2109      do
2110	{
2111	  offset = byte_get (data, offset_size);
2112
2113	  if (offset != 0)
2114	    {
2115	      data += offset_size;
2116	      printf ("    %-6ld\t\t%s\n", offset, data);
2117	      data += strlen ((char *) data) + 1;
2118	    }
2119	}
2120      while (offset != 0);
2121    }
2122
2123  printf ("\n");
2124  return 1;
2125}
2126
2127static int
2128display_debug_macinfo (struct dwarf_section *section,
2129		       void *file ATTRIBUTE_UNUSED)
2130{
2131  unsigned char *start = section->start;
2132  unsigned char *end = start + section->size;
2133  unsigned char *curr = start;
2134  unsigned int bytes_read;
2135  enum dwarf_macinfo_record_type op;
2136
2137  printf (_("Contents of the %s section:\n\n"), section->name);
2138
2139  while (curr < end)
2140    {
2141      unsigned int lineno;
2142      const char *string;
2143
2144      op = *curr;
2145      curr++;
2146
2147      switch (op)
2148	{
2149	case DW_MACINFO_start_file:
2150	  {
2151	    unsigned int filenum;
2152
2153	    lineno = read_leb128 (curr, & bytes_read, 0);
2154	    curr += bytes_read;
2155	    filenum = read_leb128 (curr, & bytes_read, 0);
2156	    curr += bytes_read;
2157
2158	    printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
2159		    lineno, filenum);
2160	  }
2161	  break;
2162
2163	case DW_MACINFO_end_file:
2164	  printf (_(" DW_MACINFO_end_file\n"));
2165	  break;
2166
2167	case DW_MACINFO_define:
2168	  lineno = read_leb128 (curr, & bytes_read, 0);
2169	  curr += bytes_read;
2170	  string = (char *) curr;
2171	  curr += strlen (string) + 1;
2172	  printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
2173		  lineno, string);
2174	  break;
2175
2176	case DW_MACINFO_undef:
2177	  lineno = read_leb128 (curr, & bytes_read, 0);
2178	  curr += bytes_read;
2179	  string = (char *) curr;
2180	  curr += strlen (string) + 1;
2181	  printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
2182		  lineno, string);
2183	  break;
2184
2185	case DW_MACINFO_vendor_ext:
2186	  {
2187	    unsigned int constant;
2188
2189	    constant = read_leb128 (curr, & bytes_read, 0);
2190	    curr += bytes_read;
2191	    string = (char *) curr;
2192	    curr += strlen (string) + 1;
2193	    printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
2194		    constant, string);
2195	  }
2196	  break;
2197	}
2198    }
2199
2200  return 1;
2201}
2202
2203static int
2204display_debug_abbrev (struct dwarf_section *section,
2205		      void *file ATTRIBUTE_UNUSED)
2206{
2207  abbrev_entry *entry;
2208  unsigned char *start = section->start;
2209  unsigned char *end = start + section->size;
2210
2211  printf (_("Contents of the %s section:\n\n"), section->name);
2212
2213  do
2214    {
2215      free_abbrevs ();
2216
2217      start = process_abbrev_section (start, end);
2218
2219      if (first_abbrev == NULL)
2220	continue;
2221
2222      printf (_("  Number TAG\n"));
2223
2224      for (entry = first_abbrev; entry; entry = entry->next)
2225	{
2226	  abbrev_attr *attr;
2227
2228	  printf (_("   %ld      %s    [%s]\n"),
2229		  entry->entry,
2230		  get_TAG_name (entry->tag),
2231		  entry->children ? _("has children") : _("no children"));
2232
2233	  for (attr = entry->first_attr; attr; attr = attr->next)
2234	    printf (_("    %-18s %s\n"),
2235		    get_AT_name (attr->attribute),
2236		    get_FORM_name (attr->form));
2237	}
2238    }
2239  while (start);
2240
2241  printf ("\n");
2242
2243  return 1;
2244}
2245
2246static int
2247display_debug_loc (struct dwarf_section *section, void *file)
2248{
2249  unsigned char *start = section->start;
2250  unsigned char *section_end;
2251  unsigned long bytes;
2252  unsigned char *section_begin = start;
2253  unsigned int num_loc_list = 0;
2254  unsigned long last_offset = 0;
2255  unsigned int first = 0;
2256  unsigned int i;
2257  unsigned int j;
2258  int seen_first_offset = 0;
2259  int use_debug_info = 1;
2260  unsigned char *next;
2261
2262  bytes = section->size;
2263  section_end = start + bytes;
2264
2265  if (bytes == 0)
2266    {
2267      printf (_("\nThe %s section is empty.\n"), section->name);
2268      return 0;
2269    }
2270
2271  load_debug_info (file);
2272
2273  /* Check the order of location list in .debug_info section. If
2274     offsets of location lists are in the ascending order, we can
2275     use `debug_information' directly.  */
2276  for (i = 0; i < num_debug_info_entries; i++)
2277    {
2278      unsigned int num;
2279
2280      num = debug_information [i].num_loc_offsets;
2281      num_loc_list += num;
2282
2283      /* Check if we can use `debug_information' directly.  */
2284      if (use_debug_info && num != 0)
2285	{
2286	  if (!seen_first_offset)
2287	    {
2288	      /* This is the first location list.  */
2289	      last_offset = debug_information [i].loc_offsets [0];
2290	      first = i;
2291	      seen_first_offset = 1;
2292	      j = 1;
2293	    }
2294	  else
2295	    j = 0;
2296
2297	  for (; j < num; j++)
2298	    {
2299	      if (last_offset >
2300		  debug_information [i].loc_offsets [j])
2301		{
2302		  use_debug_info = 0;
2303		  break;
2304		}
2305	      last_offset = debug_information [i].loc_offsets [j];
2306	    }
2307	}
2308    }
2309
2310  if (!use_debug_info)
2311    /* FIXME: Should we handle this case?  */
2312    error (_("Location lists in .debug_info section aren't in ascending order!\n"));
2313
2314  if (!seen_first_offset)
2315    error (_("No location lists in .debug_info section!\n"));
2316
2317  /* DWARF sections under Mach-O have non-zero addresses.  */
2318  if (debug_information [first].loc_offsets [0] != section->address)
2319    warn (_("Location lists in %s section start at 0x%lx\n"),
2320	  section->name, debug_information [first].loc_offsets [0]);
2321
2322  printf (_("Contents of the %s section:\n\n"), section->name);
2323  printf (_("    Offset   Begin    End      Expression\n"));
2324
2325  seen_first_offset = 0;
2326  for (i = first; i < num_debug_info_entries; i++)
2327    {
2328      unsigned long begin;
2329      unsigned long end;
2330      unsigned short length;
2331      unsigned long offset;
2332      unsigned int pointer_size;
2333      unsigned long cu_offset;
2334      unsigned long base_address;
2335      int need_frame_base;
2336      int has_frame_base;
2337
2338      pointer_size = debug_information [i].pointer_size;
2339      cu_offset = debug_information [i].cu_offset;
2340
2341      for (j = 0; j < debug_information [i].num_loc_offsets; j++)
2342	{
2343	  has_frame_base = debug_information [i].have_frame_base [j];
2344	  /* DWARF sections under Mach-O have non-zero addresses.  */
2345	  offset = debug_information [i].loc_offsets [j] - section->address;
2346	  next = section_begin + offset;
2347	  base_address = debug_information [i].base_address;
2348
2349	  if (!seen_first_offset)
2350	    seen_first_offset = 1;
2351	  else
2352	    {
2353	      if (start < next)
2354		warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
2355		      (long)(start - section_begin), (long)(next - section_begin));
2356	      else if (start > next)
2357		warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
2358		      (long)(start - section_begin), (long)(next - section_begin));
2359	    }
2360	  start = next;
2361
2362	  if (offset >= bytes)
2363	    {
2364	      warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
2365		    offset);
2366	      continue;
2367	    }
2368
2369	  while (1)
2370	    {
2371	      if (start + 2 * pointer_size > section_end)
2372		{
2373		  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
2374			offset);
2375		  break;
2376		}
2377
2378	      begin = byte_get (start, pointer_size);
2379	      start += pointer_size;
2380	      end = byte_get (start, pointer_size);
2381	      start += pointer_size;
2382
2383	      if (begin == 0 && end == 0)
2384		{
2385		  printf (_("    %8.8lx <End of list>\n"), offset);
2386		  break;
2387		}
2388
2389	      /* Check base address specifiers.  */
2390	      if (begin == -1UL && end != -1UL)
2391		{
2392		  base_address = end;
2393		  printf (_("    %8.8lx %8.8lx %8.8lx (base address)\n"),
2394			  offset, begin, end);
2395		  continue;
2396		}
2397
2398	      if (start + 2 > section_end)
2399		{
2400		  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
2401			offset);
2402		  break;
2403		}
2404
2405	      length = byte_get (start, 2);
2406	      start += 2;
2407
2408	      if (start + length > section_end)
2409		{
2410		  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
2411			offset);
2412		  break;
2413		}
2414
2415	      printf ("    %8.8lx %8.8lx %8.8lx (",
2416		      offset, begin + base_address, end + base_address);
2417	      need_frame_base = decode_location_expression (start,
2418							    pointer_size,
2419							    length,
2420							    cu_offset);
2421	      putchar (')');
2422
2423	      if (need_frame_base && !has_frame_base)
2424		printf (_(" [without DW_AT_frame_base]"));
2425
2426	      if (begin == end)
2427		fputs (_(" (start == end)"), stdout);
2428	      else if (begin > end)
2429		fputs (_(" (start > end)"), stdout);
2430
2431	      putchar ('\n');
2432
2433	      start += length;
2434	    }
2435	}
2436    }
2437  return 1;
2438}
2439
2440static int
2441display_debug_str (struct dwarf_section *section,
2442		   void *file ATTRIBUTE_UNUSED)
2443{
2444  unsigned char *start = section->start;
2445  unsigned long bytes = section->size;
2446  dwarf_vma addr = section->address;
2447
2448  if (bytes == 0)
2449    {
2450      printf (_("\nThe %s section is empty.\n"), section->name);
2451      return 0;
2452    }
2453
2454  printf (_("Contents of the %s section:\n\n"), section->name);
2455
2456  while (bytes)
2457    {
2458      int j;
2459      int k;
2460      int lbytes;
2461
2462      lbytes = (bytes > 16 ? 16 : bytes);
2463
2464      printf ("  0x%8.8lx ", (unsigned long) addr);
2465
2466      for (j = 0; j < 16; j++)
2467	{
2468	  if (j < lbytes)
2469	    printf ("%2.2x", start[j]);
2470	  else
2471	    printf ("  ");
2472
2473	  if ((j & 3) == 3)
2474	    printf (" ");
2475	}
2476
2477      for (j = 0; j < lbytes; j++)
2478	{
2479	  k = start[j];
2480	  if (k >= ' ' && k < 0x80)
2481	    printf ("%c", k);
2482	  else
2483	    printf (".");
2484	}
2485
2486      putchar ('\n');
2487
2488      start += lbytes;
2489      addr  += lbytes;
2490      bytes -= lbytes;
2491    }
2492
2493  putchar ('\n');
2494
2495  return 1;
2496}
2497
2498
2499static int
2500display_debug_info (struct dwarf_section *section, void *file)
2501{
2502  return process_debug_info (section, file, 0);
2503}
2504
2505
2506static int
2507display_debug_aranges (struct dwarf_section *section,
2508		       void *file ATTRIBUTE_UNUSED)
2509{
2510  unsigned char *start = section->start;
2511  unsigned char *end = start + section->size;
2512
2513  printf (_("The section %s contains:\n\n"), section->name);
2514
2515  while (start < end)
2516    {
2517      unsigned char *hdrptr;
2518      DWARF2_Internal_ARange arange;
2519      unsigned char *ranges;
2520      unsigned long length;
2521      unsigned long address;
2522      int excess;
2523      int offset_size;
2524      int initial_length_size;
2525
2526      hdrptr = start;
2527
2528      arange.ar_length = byte_get (hdrptr, 4);
2529      hdrptr += 4;
2530
2531      if (arange.ar_length == 0xffffffff)
2532	{
2533	  arange.ar_length = byte_get (hdrptr, 8);
2534	  hdrptr += 8;
2535	  offset_size = 8;
2536	  initial_length_size = 12;
2537	}
2538      else
2539	{
2540	  offset_size = 4;
2541	  initial_length_size = 4;
2542	}
2543
2544      arange.ar_version = byte_get (hdrptr, 2);
2545      hdrptr += 2;
2546
2547      arange.ar_info_offset = byte_get (hdrptr, offset_size);
2548      hdrptr += offset_size;
2549
2550      arange.ar_pointer_size = byte_get (hdrptr, 1);
2551      hdrptr += 1;
2552
2553      arange.ar_segment_size = byte_get (hdrptr, 1);
2554      hdrptr += 1;
2555
2556      if (arange.ar_version != 2 && arange.ar_version != 3)
2557	{
2558	  warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
2559	  break;
2560	}
2561
2562      printf (_("  Length:                   %ld\n"), arange.ar_length);
2563      printf (_("  Version:                  %d\n"), arange.ar_version);
2564      printf (_("  Offset into .debug_info:  %lx\n"), arange.ar_info_offset);
2565      printf (_("  Pointer Size:             %d\n"), arange.ar_pointer_size);
2566      printf (_("  Segment Size:             %d\n"), arange.ar_segment_size);
2567
2568      printf (_("\n    Address  Length\n"));
2569
2570      ranges = hdrptr;
2571
2572      /* Must pad to an alignment boundary that is twice the pointer size.  */
2573      excess = (hdrptr - start) % (2 * arange.ar_pointer_size);
2574      if (excess)
2575	ranges += (2 * arange.ar_pointer_size) - excess;
2576
2577      start += arange.ar_length + initial_length_size;
2578
2579      while (ranges + 2 * arange.ar_pointer_size <= start)
2580	{
2581	  address = byte_get (ranges, arange.ar_pointer_size);
2582
2583	  ranges += arange.ar_pointer_size;
2584
2585	  length  = byte_get (ranges, arange.ar_pointer_size);
2586
2587	  ranges += arange.ar_pointer_size;
2588
2589	  printf ("    %8.8lx %lu\n", address, length);
2590	}
2591    }
2592
2593  printf ("\n");
2594
2595  return 1;
2596}
2597
2598static int
2599display_debug_ranges (struct dwarf_section *section,
2600		      void *file ATTRIBUTE_UNUSED)
2601{
2602  unsigned char *start = section->start;
2603  unsigned char *section_end;
2604  unsigned long bytes;
2605  unsigned char *section_begin = start;
2606  unsigned int num_range_list = 0;
2607  unsigned long last_offset = 0;
2608  unsigned int first = 0;
2609  unsigned int i;
2610  unsigned int j;
2611  int seen_first_offset = 0;
2612  int use_debug_info = 1;
2613  unsigned char *next;
2614
2615  bytes = section->size;
2616  section_end = start + bytes;
2617
2618  if (bytes == 0)
2619    {
2620      printf (_("\nThe %s section is empty.\n"), section->name);
2621      return 0;
2622    }
2623
2624  load_debug_info (file);
2625
2626  /* Check the order of range list in .debug_info section. If
2627     offsets of range lists are in the ascending order, we can
2628     use `debug_information' directly.  */
2629  for (i = 0; i < num_debug_info_entries; i++)
2630    {
2631      unsigned int num;
2632
2633      num = debug_information [i].num_range_lists;
2634      num_range_list += num;
2635
2636      /* Check if we can use `debug_information' directly.  */
2637      if (use_debug_info && num != 0)
2638	{
2639	  if (!seen_first_offset)
2640	    {
2641	      /* This is the first range list.  */
2642	      last_offset = debug_information [i].range_lists [0];
2643	      first = i;
2644	      seen_first_offset = 1;
2645	      j = 1;
2646	    }
2647	  else
2648	    j = 0;
2649
2650	  for (; j < num; j++)
2651	    {
2652	      if (last_offset >
2653		  debug_information [i].range_lists [j])
2654		{
2655		  use_debug_info = 0;
2656		  break;
2657		}
2658	      last_offset = debug_information [i].range_lists [j];
2659	    }
2660	}
2661    }
2662
2663  if (!use_debug_info)
2664    /* FIXME: Should we handle this case?  */
2665    error (_("Range lists in .debug_info section aren't in ascending order!\n"));
2666
2667  if (!seen_first_offset)
2668    error (_("No range lists in .debug_info section!\n"));
2669
2670  /* DWARF sections under Mach-O have non-zero addresses.  */
2671  if (debug_information [first].range_lists [0] != section->address)
2672    warn (_("Range lists in %s section start at 0x%lx\n"),
2673	  section->name, debug_information [first].range_lists [0]);
2674
2675  printf (_("Contents of the %s section:\n\n"), section->name);
2676  printf (_("    Offset   Begin    End\n"));
2677
2678  seen_first_offset = 0;
2679  for (i = first; i < num_debug_info_entries; i++)
2680    {
2681      unsigned long begin;
2682      unsigned long end;
2683      unsigned long offset;
2684      unsigned int pointer_size;
2685      unsigned long base_address;
2686
2687      pointer_size = debug_information [i].pointer_size;
2688
2689      for (j = 0; j < debug_information [i].num_range_lists; j++)
2690	{
2691	  /* DWARF sections under Mach-O have non-zero addresses.  */
2692	  offset = debug_information [i].range_lists [j] - section->address;
2693	  next = section_begin + offset;
2694	  base_address = debug_information [i].base_address;
2695
2696	  if (!seen_first_offset)
2697	    seen_first_offset = 1;
2698	  else
2699	    {
2700	      if (start < next)
2701		warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
2702		      (long)(start - section_begin),
2703		      (long)(next - section_begin), section->name);
2704	      else if (start > next)
2705		warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
2706		      (long)(start - section_begin),
2707		      (long)(next - section_begin), section->name);
2708	    }
2709	  start = next;
2710
2711	  while (1)
2712	    {
2713	      begin = byte_get (start, pointer_size);
2714	      start += pointer_size;
2715	      end = byte_get (start, pointer_size);
2716	      start += pointer_size;
2717
2718	      if (begin == 0 && end == 0)
2719		{
2720		  printf (_("    %8.8lx <End of list>\n"), offset);
2721		  break;
2722		}
2723
2724	      /* Check base address specifiers.  */
2725	      if (begin == -1UL && end != -1UL)
2726		{
2727		  base_address = end;
2728		  printf ("    %8.8lx %8.8lx %8.8lx (base address)\n",
2729			  offset, begin, end);
2730		  continue;
2731		}
2732
2733	      printf ("    %8.8lx %8.8lx %8.8lx",
2734		      offset, begin + base_address, end + base_address);
2735
2736	      if (begin == end)
2737		fputs (_(" (start == end)"), stdout);
2738	      else if (begin > end)
2739		fputs (_(" (start > end)"), stdout);
2740
2741	      putchar ('\n');
2742	    }
2743	}
2744    }
2745  putchar ('\n');
2746  return 1;
2747}
2748
2749typedef struct Frame_Chunk
2750{
2751  struct Frame_Chunk *next;
2752  unsigned char *chunk_start;
2753  int ncols;
2754  /* DW_CFA_{undefined,same_value,offset,register,unreferenced}  */
2755  short int *col_type;
2756  int *col_offset;
2757  char *augmentation;
2758  unsigned int code_factor;
2759  int data_factor;
2760  unsigned long pc_begin;
2761  unsigned long pc_range;
2762  int cfa_reg;
2763  int cfa_offset;
2764  int ra;
2765  unsigned char fde_encoding;
2766  unsigned char cfa_exp;
2767}
2768Frame_Chunk;
2769
2770/* A marker for a col_type that means this column was never referenced
2771   in the frame info.  */
2772#define DW_CFA_unreferenced (-1)
2773
2774static void
2775frame_need_space (Frame_Chunk *fc, int reg)
2776{
2777  int prev = fc->ncols;
2778
2779  if (reg < fc->ncols)
2780    return;
2781
2782  fc->ncols = reg + 1;
2783  fc->col_type = xcrealloc (fc->col_type, fc->ncols, sizeof (short int));
2784  fc->col_offset = xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
2785
2786  while (prev < fc->ncols)
2787    {
2788      fc->col_type[prev] = DW_CFA_unreferenced;
2789      fc->col_offset[prev] = 0;
2790      prev++;
2791    }
2792}
2793
2794static void
2795frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
2796{
2797  int r;
2798  char tmp[100];
2799
2800  if (*max_regs < fc->ncols)
2801    *max_regs = fc->ncols;
2802
2803  if (*need_col_headers)
2804    {
2805      *need_col_headers = 0;
2806
2807      printf ("   LOC   CFA      ");
2808
2809      for (r = 0; r < *max_regs; r++)
2810	if (fc->col_type[r] != DW_CFA_unreferenced)
2811	  {
2812	    if (r == fc->ra)
2813	      printf ("ra   ");
2814	    else
2815	      printf ("r%-4d", r);
2816	  }
2817
2818      printf ("\n");
2819    }
2820
2821  printf ("%08lx ", fc->pc_begin);
2822  if (fc->cfa_exp)
2823    strcpy (tmp, "exp");
2824  else
2825    sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
2826  printf ("%-8s ", tmp);
2827
2828  for (r = 0; r < fc->ncols; r++)
2829    {
2830      if (fc->col_type[r] != DW_CFA_unreferenced)
2831	{
2832	  switch (fc->col_type[r])
2833	    {
2834	    case DW_CFA_undefined:
2835	      strcpy (tmp, "u");
2836	      break;
2837	    case DW_CFA_same_value:
2838	      strcpy (tmp, "s");
2839	      break;
2840	    case DW_CFA_offset:
2841	      sprintf (tmp, "c%+d", fc->col_offset[r]);
2842	      break;
2843	    case DW_CFA_val_offset:
2844	      sprintf (tmp, "v%+d", fc->col_offset[r]);
2845	      break;
2846	    case DW_CFA_register:
2847	      sprintf (tmp, "r%d", fc->col_offset[r]);
2848	      break;
2849	    case DW_CFA_expression:
2850	      strcpy (tmp, "exp");
2851	      break;
2852	    case DW_CFA_val_expression:
2853	      strcpy (tmp, "vexp");
2854	      break;
2855	    default:
2856	      strcpy (tmp, "n/a");
2857	      break;
2858	    }
2859	  printf ("%-5s", tmp);
2860	}
2861    }
2862  printf ("\n");
2863}
2864
2865static int
2866size_of_encoded_value (int encoding)
2867{
2868  switch (encoding & 0x7)
2869    {
2870    default:	/* ??? */
2871    case 0:	return eh_addr_size;
2872    case 2:	return 2;
2873    case 3:	return 4;
2874    case 4:	return 8;
2875    }
2876}
2877
2878static dwarf_vma
2879get_encoded_value (unsigned char *data, int encoding)
2880{
2881  int size = size_of_encoded_value (encoding);
2882  if (encoding & DW_EH_PE_signed)
2883    return byte_get_signed (data, size);
2884  else
2885    return byte_get (data, size);
2886}
2887
2888#define GET(N)	byte_get (start, N); start += N
2889#define LEB()	read_leb128 (start, & length_return, 0); start += length_return
2890#define SLEB()	read_leb128 (start, & length_return, 1); start += length_return
2891
2892static int
2893display_debug_frames (struct dwarf_section *section,
2894		      void *file ATTRIBUTE_UNUSED)
2895{
2896  unsigned char *start = section->start;
2897  unsigned char *end = start + section->size;
2898  unsigned char *section_start = start;
2899  Frame_Chunk *chunks = 0;
2900  Frame_Chunk *remembered_state = 0;
2901  Frame_Chunk *rs;
2902  int is_eh = strcmp (section->name, ".eh_frame") == 0;
2903  unsigned int length_return;
2904  int max_regs = 0;
2905
2906  printf (_("The section %s contains:\n"), section->name);
2907
2908  while (start < end)
2909    {
2910      unsigned char *saved_start;
2911      unsigned char *block_end;
2912      unsigned long length;
2913      unsigned long cie_id;
2914      Frame_Chunk *fc;
2915      Frame_Chunk *cie;
2916      int need_col_headers = 1;
2917      unsigned char *augmentation_data = NULL;
2918      unsigned long augmentation_data_len = 0;
2919      int encoded_ptr_size = eh_addr_size;
2920      int offset_size;
2921      int initial_length_size;
2922
2923      saved_start = start;
2924      length = byte_get (start, 4); start += 4;
2925
2926      if (length == 0)
2927	{
2928	  printf ("\n%08lx ZERO terminator\n\n",
2929		    (unsigned long)(saved_start - section_start));
2930	  return 1;
2931	}
2932
2933      if (length == 0xffffffff)
2934	{
2935	  length = byte_get (start, 8);
2936	  start += 8;
2937	  offset_size = 8;
2938	  initial_length_size = 12;
2939	}
2940      else
2941	{
2942	  offset_size = 4;
2943	  initial_length_size = 4;
2944	}
2945
2946      block_end = saved_start + length + initial_length_size;
2947      cie_id = byte_get (start, offset_size); start += offset_size;
2948
2949      if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
2950	{
2951	  int version;
2952
2953	  fc = xmalloc (sizeof (Frame_Chunk));
2954	  memset (fc, 0, sizeof (Frame_Chunk));
2955
2956	  fc->next = chunks;
2957	  chunks = fc;
2958	  fc->chunk_start = saved_start;
2959	  fc->ncols = 0;
2960	  fc->col_type = xmalloc (sizeof (short int));
2961	  fc->col_offset = xmalloc (sizeof (int));
2962	  frame_need_space (fc, max_regs-1);
2963
2964	  version = *start++;
2965
2966	  fc->augmentation = (char *) start;
2967	  start = (unsigned char *) strchr ((char *) start, '\0') + 1;
2968
2969	  if (fc->augmentation[0] == 'z')
2970	    {
2971	      fc->code_factor = LEB ();
2972	      fc->data_factor = SLEB ();
2973	      if (version == 1)
2974		{
2975		  fc->ra = GET (1);
2976		}
2977	      else
2978		{
2979		  fc->ra = LEB ();
2980		}
2981	      augmentation_data_len = LEB ();
2982	      augmentation_data = start;
2983	      start += augmentation_data_len;
2984	    }
2985	  else if (strcmp (fc->augmentation, "eh") == 0)
2986	    {
2987	      start += eh_addr_size;
2988	      fc->code_factor = LEB ();
2989	      fc->data_factor = SLEB ();
2990	      if (version == 1)
2991		{
2992		  fc->ra = GET (1);
2993		}
2994	      else
2995		{
2996		  fc->ra = LEB ();
2997		}
2998	    }
2999	  else
3000	    {
3001	      fc->code_factor = LEB ();
3002	      fc->data_factor = SLEB ();
3003	      if (version == 1)
3004		{
3005		  fc->ra = GET (1);
3006		}
3007	      else
3008		{
3009		  fc->ra = LEB ();
3010		}
3011	    }
3012	  cie = fc;
3013
3014	  if (do_debug_frames_interp)
3015	    printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
3016		    (unsigned long)(saved_start - section_start), length, cie_id,
3017		    fc->augmentation, fc->code_factor, fc->data_factor,
3018		    fc->ra);
3019	  else
3020	    {
3021	      printf ("\n%08lx %08lx %08lx CIE\n",
3022		      (unsigned long)(saved_start - section_start), length, cie_id);
3023	      printf ("  Version:               %d\n", version);
3024	      printf ("  Augmentation:          \"%s\"\n", fc->augmentation);
3025	      printf ("  Code alignment factor: %u\n", fc->code_factor);
3026	      printf ("  Data alignment factor: %d\n", fc->data_factor);
3027	      printf ("  Return address column: %d\n", fc->ra);
3028
3029	      if (augmentation_data_len)
3030		{
3031		  unsigned long i;
3032		  printf ("  Augmentation data:    ");
3033		  for (i = 0; i < augmentation_data_len; ++i)
3034		    printf (" %02x", augmentation_data[i]);
3035		  putchar ('\n');
3036		}
3037	      putchar ('\n');
3038	    }
3039
3040	  if (augmentation_data_len)
3041	    {
3042	      unsigned char *p, *q;
3043	      p = (unsigned char *) fc->augmentation + 1;
3044	      q = augmentation_data;
3045
3046	      while (1)
3047		{
3048		  if (*p == 'L')
3049		    q++;
3050		  else if (*p == 'P')
3051		    q += 1 + size_of_encoded_value (*q);
3052		  else if (*p == 'R')
3053		    fc->fde_encoding = *q++;
3054		  else
3055		    break;
3056		  p++;
3057		}
3058
3059	      if (fc->fde_encoding)
3060		encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
3061	    }
3062
3063	  frame_need_space (fc, fc->ra);
3064	}
3065      else
3066	{
3067	  unsigned char *look_for;
3068	  static Frame_Chunk fde_fc;
3069
3070	  fc = & fde_fc;
3071	  memset (fc, 0, sizeof (Frame_Chunk));
3072
3073	  look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
3074
3075	  for (cie = chunks; cie ; cie = cie->next)
3076	    if (cie->chunk_start == look_for)
3077	      break;
3078
3079	  if (!cie)
3080	    {
3081	      warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
3082		    cie_id, (unsigned long)(saved_start - section_start));
3083	      start = block_end;
3084	      fc->ncols = 0;
3085	      fc->col_type = xmalloc (sizeof (short int));
3086	      fc->col_offset = xmalloc (sizeof (int));
3087	      frame_need_space (fc, max_regs - 1);
3088	      cie = fc;
3089	      fc->augmentation = "";
3090	      fc->fde_encoding = 0;
3091	    }
3092	  else
3093	    {
3094	      fc->ncols = cie->ncols;
3095	      fc->col_type = xcmalloc (fc->ncols, sizeof (short int));
3096	      fc->col_offset = xcmalloc (fc->ncols, sizeof (int));
3097	      memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
3098	      memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
3099	      fc->augmentation = cie->augmentation;
3100	      fc->code_factor = cie->code_factor;
3101	      fc->data_factor = cie->data_factor;
3102	      fc->cfa_reg = cie->cfa_reg;
3103	      fc->cfa_offset = cie->cfa_offset;
3104	      fc->ra = cie->ra;
3105	      frame_need_space (fc, max_regs-1);
3106	      fc->fde_encoding = cie->fde_encoding;
3107	    }
3108
3109	  if (fc->fde_encoding)
3110	    encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
3111
3112	  fc->pc_begin = get_encoded_value (start, fc->fde_encoding);
3113	  if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel
3114	      /* Don't adjust for relocatable file since there's
3115		 invariably a pcrel reloc here, which we haven't
3116		 applied.  */
3117	      && !is_relocatable)
3118	    fc->pc_begin += section->address + (start - section_start);
3119	  start += encoded_ptr_size;
3120	  fc->pc_range = byte_get (start, encoded_ptr_size);
3121	  start += encoded_ptr_size;
3122
3123	  if (cie->augmentation[0] == 'z')
3124	    {
3125	      augmentation_data_len = LEB ();
3126	      augmentation_data = start;
3127	      start += augmentation_data_len;
3128	    }
3129
3130	  printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
3131		  (unsigned long)(saved_start - section_start), length, cie_id,
3132		  (unsigned long)(cie->chunk_start - section_start),
3133		  fc->pc_begin, fc->pc_begin + fc->pc_range);
3134	  if (! do_debug_frames_interp && augmentation_data_len)
3135	    {
3136	      unsigned long i;
3137
3138	      printf ("  Augmentation data:    ");
3139	      for (i = 0; i < augmentation_data_len; ++i)
3140		printf (" %02x", augmentation_data[i]);
3141	      putchar ('\n');
3142	      putchar ('\n');
3143	    }
3144	}
3145
3146      /* At this point, fc is the current chunk, cie (if any) is set, and
3147	 we're about to interpret instructions for the chunk.  */
3148      /* ??? At present we need to do this always, since this sizes the
3149	 fc->col_type and fc->col_offset arrays, which we write into always.
3150	 We should probably split the interpreted and non-interpreted bits
3151	 into two different routines, since there's so much that doesn't
3152	 really overlap between them.  */
3153      if (1 || do_debug_frames_interp)
3154	{
3155	  /* Start by making a pass over the chunk, allocating storage
3156	     and taking note of what registers are used.  */
3157	  unsigned char *tmp = start;
3158
3159	  while (start < block_end)
3160	    {
3161	      unsigned op, opa;
3162	      unsigned long reg, tmp;
3163
3164	      op = *start++;
3165	      opa = op & 0x3f;
3166	      if (op & 0xc0)
3167		op &= 0xc0;
3168
3169	      /* Warning: if you add any more cases to this switch, be
3170		 sure to add them to the corresponding switch below.  */
3171	      switch (op)
3172		{
3173		case DW_CFA_advance_loc:
3174		  break;
3175		case DW_CFA_offset:
3176		  LEB ();
3177		  frame_need_space (fc, opa);
3178		  fc->col_type[opa] = DW_CFA_undefined;
3179		  break;
3180		case DW_CFA_restore:
3181		  frame_need_space (fc, opa);
3182		  fc->col_type[opa] = DW_CFA_undefined;
3183		  break;
3184		case DW_CFA_set_loc:
3185		  start += encoded_ptr_size;
3186		  break;
3187		case DW_CFA_advance_loc1:
3188		  start += 1;
3189		  break;
3190		case DW_CFA_advance_loc2:
3191		  start += 2;
3192		  break;
3193		case DW_CFA_advance_loc4:
3194		  start += 4;
3195		  break;
3196		case DW_CFA_offset_extended:
3197		case DW_CFA_val_offset:
3198		  reg = LEB (); LEB ();
3199		  frame_need_space (fc, reg);
3200		  fc->col_type[reg] = DW_CFA_undefined;
3201		  break;
3202		case DW_CFA_restore_extended:
3203		  reg = LEB ();
3204		  frame_need_space (fc, reg);
3205		  fc->col_type[reg] = DW_CFA_undefined;
3206		  break;
3207		case DW_CFA_undefined:
3208		  reg = LEB ();
3209		  frame_need_space (fc, reg);
3210		  fc->col_type[reg] = DW_CFA_undefined;
3211		  break;
3212		case DW_CFA_same_value:
3213		  reg = LEB ();
3214		  frame_need_space (fc, reg);
3215		  fc->col_type[reg] = DW_CFA_undefined;
3216		  break;
3217		case DW_CFA_register:
3218		  reg = LEB (); LEB ();
3219		  frame_need_space (fc, reg);
3220		  fc->col_type[reg] = DW_CFA_undefined;
3221		  break;
3222		case DW_CFA_def_cfa:
3223		  LEB (); LEB ();
3224		  break;
3225		case DW_CFA_def_cfa_register:
3226		  LEB ();
3227		  break;
3228		case DW_CFA_def_cfa_offset:
3229		  LEB ();
3230		  break;
3231		case DW_CFA_def_cfa_expression:
3232		  tmp = LEB ();
3233		  start += tmp;
3234		  break;
3235		case DW_CFA_expression:
3236		case DW_CFA_val_expression:
3237		  reg = LEB ();
3238		  tmp = LEB ();
3239		  start += tmp;
3240		  frame_need_space (fc, reg);
3241		  fc->col_type[reg] = DW_CFA_undefined;
3242		  break;
3243		case DW_CFA_offset_extended_sf:
3244		case DW_CFA_val_offset_sf:
3245		  reg = LEB (); SLEB ();
3246		  frame_need_space (fc, reg);
3247		  fc->col_type[reg] = DW_CFA_undefined;
3248		  break;
3249		case DW_CFA_def_cfa_sf:
3250		  LEB (); SLEB ();
3251		  break;
3252		case DW_CFA_def_cfa_offset_sf:
3253		  SLEB ();
3254		  break;
3255		case DW_CFA_MIPS_advance_loc8:
3256		  start += 8;
3257		  break;
3258		case DW_CFA_GNU_args_size:
3259		  LEB ();
3260		  break;
3261		case DW_CFA_GNU_negative_offset_extended:
3262		  reg = LEB (); LEB ();
3263		  frame_need_space (fc, reg);
3264		  fc->col_type[reg] = DW_CFA_undefined;
3265
3266		default:
3267		  break;
3268		}
3269	    }
3270	  start = tmp;
3271	}
3272
3273      /* Now we know what registers are used, make a second pass over
3274	 the chunk, this time actually printing out the info.  */
3275
3276      while (start < block_end)
3277	{
3278	  unsigned op, opa;
3279	  unsigned long ul, reg, roffs;
3280	  long l, ofs;
3281	  dwarf_vma vma;
3282
3283	  op = *start++;
3284	  opa = op & 0x3f;
3285	  if (op & 0xc0)
3286	    op &= 0xc0;
3287
3288	  /* Warning: if you add any more cases to this switch, be
3289	     sure to add them to the corresponding switch above.  */
3290	  switch (op)
3291	    {
3292	    case DW_CFA_advance_loc:
3293	      if (do_debug_frames_interp)
3294		frame_display_row (fc, &need_col_headers, &max_regs);
3295	      else
3296		printf ("  DW_CFA_advance_loc: %d to %08lx\n",
3297			opa * fc->code_factor,
3298			fc->pc_begin + opa * fc->code_factor);
3299	      fc->pc_begin += opa * fc->code_factor;
3300	      break;
3301
3302	    case DW_CFA_offset:
3303	      roffs = LEB ();
3304	      if (! do_debug_frames_interp)
3305		printf ("  DW_CFA_offset: r%d at cfa%+ld\n",
3306			opa, roffs * fc->data_factor);
3307	      fc->col_type[opa] = DW_CFA_offset;
3308	      fc->col_offset[opa] = roffs * fc->data_factor;
3309	      break;
3310
3311	    case DW_CFA_restore:
3312	      if (! do_debug_frames_interp)
3313		printf ("  DW_CFA_restore: r%d\n", opa);
3314	      fc->col_type[opa] = cie->col_type[opa];
3315	      fc->col_offset[opa] = cie->col_offset[opa];
3316	      break;
3317
3318	    case DW_CFA_set_loc:
3319	      vma = get_encoded_value (start, fc->fde_encoding);
3320	      if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel
3321		  && !is_relocatable)
3322		vma += section->address + (start - section_start);
3323	      start += encoded_ptr_size;
3324	      if (do_debug_frames_interp)
3325		frame_display_row (fc, &need_col_headers, &max_regs);
3326	      else
3327		printf ("  DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
3328	      fc->pc_begin = vma;
3329	      break;
3330
3331	    case DW_CFA_advance_loc1:
3332	      ofs = byte_get (start, 1); start += 1;
3333	      if (do_debug_frames_interp)
3334		frame_display_row (fc, &need_col_headers, &max_regs);
3335	      else
3336		printf ("  DW_CFA_advance_loc1: %ld to %08lx\n",
3337			ofs * fc->code_factor,
3338			fc->pc_begin + ofs * fc->code_factor);
3339	      fc->pc_begin += ofs * fc->code_factor;
3340	      break;
3341
3342	    case DW_CFA_advance_loc2:
3343	      ofs = byte_get (start, 2); start += 2;
3344	      if (do_debug_frames_interp)
3345		frame_display_row (fc, &need_col_headers, &max_regs);
3346	      else
3347		printf ("  DW_CFA_advance_loc2: %ld to %08lx\n",
3348			ofs * fc->code_factor,
3349			fc->pc_begin + ofs * fc->code_factor);
3350	      fc->pc_begin += ofs * fc->code_factor;
3351	      break;
3352
3353	    case DW_CFA_advance_loc4:
3354	      ofs = byte_get (start, 4); start += 4;
3355	      if (do_debug_frames_interp)
3356		frame_display_row (fc, &need_col_headers, &max_regs);
3357	      else
3358		printf ("  DW_CFA_advance_loc4: %ld to %08lx\n",
3359			ofs * fc->code_factor,
3360			fc->pc_begin + ofs * fc->code_factor);
3361	      fc->pc_begin += ofs * fc->code_factor;
3362	      break;
3363
3364	    case DW_CFA_offset_extended:
3365	      reg = LEB ();
3366	      roffs = LEB ();
3367	      if (! do_debug_frames_interp)
3368		printf ("  DW_CFA_offset_extended: r%ld at cfa%+ld\n",
3369			reg, roffs * fc->data_factor);
3370	      fc->col_type[reg] = DW_CFA_offset;
3371	      fc->col_offset[reg] = roffs * fc->data_factor;
3372	      break;
3373
3374	    case DW_CFA_val_offset:
3375	      reg = LEB ();
3376	      roffs = LEB ();
3377	      if (! do_debug_frames_interp)
3378		printf ("  DW_CFA_val_offset: r%ld at cfa%+ld\n",
3379			reg, roffs * fc->data_factor);
3380	      fc->col_type[reg] = DW_CFA_val_offset;
3381	      fc->col_offset[reg] = roffs * fc->data_factor;
3382	      break;
3383
3384	    case DW_CFA_restore_extended:
3385	      reg = LEB ();
3386	      if (! do_debug_frames_interp)
3387		printf ("  DW_CFA_restore_extended: r%ld\n", reg);
3388	      fc->col_type[reg] = cie->col_type[reg];
3389	      fc->col_offset[reg] = cie->col_offset[reg];
3390	      break;
3391
3392	    case DW_CFA_undefined:
3393	      reg = LEB ();
3394	      if (! do_debug_frames_interp)
3395		printf ("  DW_CFA_undefined: r%ld\n", reg);
3396	      fc->col_type[reg] = DW_CFA_undefined;
3397	      fc->col_offset[reg] = 0;
3398	      break;
3399
3400	    case DW_CFA_same_value:
3401	      reg = LEB ();
3402	      if (! do_debug_frames_interp)
3403		printf ("  DW_CFA_same_value: r%ld\n", reg);
3404	      fc->col_type[reg] = DW_CFA_same_value;
3405	      fc->col_offset[reg] = 0;
3406	      break;
3407
3408	    case DW_CFA_register:
3409	      reg = LEB ();
3410	      roffs = LEB ();
3411	      if (! do_debug_frames_interp)
3412		printf ("  DW_CFA_register: r%ld in r%ld\n", reg, roffs);
3413	      fc->col_type[reg] = DW_CFA_register;
3414	      fc->col_offset[reg] = roffs;
3415	      break;
3416
3417	    case DW_CFA_remember_state:
3418	      if (! do_debug_frames_interp)
3419		printf ("  DW_CFA_remember_state\n");
3420	      rs = xmalloc (sizeof (Frame_Chunk));
3421	      rs->ncols = fc->ncols;
3422	      rs->col_type = xcmalloc (rs->ncols, sizeof (short int));
3423	      rs->col_offset = xcmalloc (rs->ncols, sizeof (int));
3424	      memcpy (rs->col_type, fc->col_type, rs->ncols);
3425	      memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
3426	      rs->next = remembered_state;
3427	      remembered_state = rs;
3428	      break;
3429
3430	    case DW_CFA_restore_state:
3431	      if (! do_debug_frames_interp)
3432		printf ("  DW_CFA_restore_state\n");
3433	      rs = remembered_state;
3434	      if (rs)
3435		{
3436		  remembered_state = rs->next;
3437		  frame_need_space (fc, rs->ncols-1);
3438		  memcpy (fc->col_type, rs->col_type, rs->ncols);
3439		  memcpy (fc->col_offset, rs->col_offset,
3440			  rs->ncols * sizeof (int));
3441		  free (rs->col_type);
3442		  free (rs->col_offset);
3443		  free (rs);
3444		}
3445	      else if (do_debug_frames_interp)
3446		printf ("Mismatched DW_CFA_restore_state\n");
3447	      break;
3448
3449	    case DW_CFA_def_cfa:
3450	      fc->cfa_reg = LEB ();
3451	      fc->cfa_offset = LEB ();
3452	      fc->cfa_exp = 0;
3453	      if (! do_debug_frames_interp)
3454		printf ("  DW_CFA_def_cfa: r%d ofs %d\n",
3455			fc->cfa_reg, fc->cfa_offset);
3456	      break;
3457
3458	    case DW_CFA_def_cfa_register:
3459	      fc->cfa_reg = LEB ();
3460	      fc->cfa_exp = 0;
3461	      if (! do_debug_frames_interp)
3462		printf ("  DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
3463	      break;
3464
3465	    case DW_CFA_def_cfa_offset:
3466	      fc->cfa_offset = LEB ();
3467	      if (! do_debug_frames_interp)
3468		printf ("  DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
3469	      break;
3470
3471	    case DW_CFA_nop:
3472	      if (! do_debug_frames_interp)
3473		printf ("  DW_CFA_nop\n");
3474	      break;
3475
3476	    case DW_CFA_def_cfa_expression:
3477	      ul = LEB ();
3478	      if (! do_debug_frames_interp)
3479		{
3480		  printf ("  DW_CFA_def_cfa_expression (");
3481		  decode_location_expression (start, eh_addr_size, ul, 0);
3482		  printf (")\n");
3483		}
3484	      fc->cfa_exp = 1;
3485	      start += ul;
3486	      break;
3487
3488	    case DW_CFA_expression:
3489	      reg = LEB ();
3490	      ul = LEB ();
3491	      if (! do_debug_frames_interp)
3492		{
3493		  printf ("  DW_CFA_expression: r%ld (", reg);
3494		  decode_location_expression (start, eh_addr_size, ul, 0);
3495		  printf (")\n");
3496		}
3497	      fc->col_type[reg] = DW_CFA_expression;
3498	      start += ul;
3499	      break;
3500
3501	    case DW_CFA_val_expression:
3502	      reg = LEB ();
3503	      ul = LEB ();
3504	      if (! do_debug_frames_interp)
3505		{
3506		  printf ("  DW_CFA_val_expression: r%ld (", reg);
3507		  decode_location_expression (start, eh_addr_size, ul, 0);
3508		  printf (")\n");
3509		}
3510	      fc->col_type[reg] = DW_CFA_val_expression;
3511	      start += ul;
3512	      break;
3513
3514	    case DW_CFA_offset_extended_sf:
3515	      reg = LEB ();
3516	      l = SLEB ();
3517	      frame_need_space (fc, reg);
3518	      if (! do_debug_frames_interp)
3519		printf ("  DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
3520			reg, l * fc->data_factor);
3521	      fc->col_type[reg] = DW_CFA_offset;
3522	      fc->col_offset[reg] = l * fc->data_factor;
3523	      break;
3524
3525	    case DW_CFA_val_offset_sf:
3526	      reg = LEB ();
3527	      l = SLEB ();
3528	      frame_need_space (fc, reg);
3529	      if (! do_debug_frames_interp)
3530		printf ("  DW_CFA_val_offset_sf: r%ld at cfa%+ld\n",
3531			reg, l * fc->data_factor);
3532	      fc->col_type[reg] = DW_CFA_val_offset;
3533	      fc->col_offset[reg] = l * fc->data_factor;
3534	      break;
3535
3536	    case DW_CFA_def_cfa_sf:
3537	      fc->cfa_reg = LEB ();
3538	      fc->cfa_offset = SLEB ();
3539	      fc->cfa_offset = fc->cfa_offset * fc->data_factor;
3540	      fc->cfa_exp = 0;
3541	      if (! do_debug_frames_interp)
3542		printf ("  DW_CFA_def_cfa_sf: r%d ofs %d\n",
3543			fc->cfa_reg, fc->cfa_offset);
3544	      break;
3545
3546	    case DW_CFA_def_cfa_offset_sf:
3547	      fc->cfa_offset = SLEB ();
3548	      fc->cfa_offset = fc->cfa_offset * fc->data_factor;
3549	      if (! do_debug_frames_interp)
3550		printf ("  DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
3551	      break;
3552
3553	    case DW_CFA_MIPS_advance_loc8:
3554	      ofs = byte_get (start, 8); start += 8;
3555	      if (do_debug_frames_interp)
3556		frame_display_row (fc, &need_col_headers, &max_regs);
3557	      else
3558		printf ("  DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
3559			ofs * fc->code_factor,
3560			fc->pc_begin + ofs * fc->code_factor);
3561	      fc->pc_begin += ofs * fc->code_factor;
3562	      break;
3563
3564	    case DW_CFA_GNU_window_save:
3565	      if (! do_debug_frames_interp)
3566		printf ("  DW_CFA_GNU_window_save\n");
3567	      break;
3568
3569	    case DW_CFA_GNU_args_size:
3570	      ul = LEB ();
3571	      if (! do_debug_frames_interp)
3572		printf ("  DW_CFA_GNU_args_size: %ld\n", ul);
3573	      break;
3574
3575	    case DW_CFA_GNU_negative_offset_extended:
3576	      reg = LEB ();
3577	      l = - LEB ();
3578	      frame_need_space (fc, reg);
3579	      if (! do_debug_frames_interp)
3580		printf ("  DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
3581			reg, l * fc->data_factor);
3582	      fc->col_type[reg] = DW_CFA_offset;
3583	      fc->col_offset[reg] = l * fc->data_factor;
3584	      break;
3585
3586	    default:
3587	      warn (_("unsupported or unknown DW_CFA_%d\n"), op);
3588	      start = block_end;
3589	    }
3590	}
3591
3592      if (do_debug_frames_interp)
3593	frame_display_row (fc, &need_col_headers, &max_regs);
3594
3595      start = block_end;
3596    }
3597
3598  printf ("\n");
3599
3600  return 1;
3601}
3602
3603#undef GET
3604#undef LEB
3605#undef SLEB
3606
3607static int
3608display_debug_not_supported (struct dwarf_section *section,
3609			     void *file ATTRIBUTE_UNUSED)
3610{
3611  printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
3612	    section->name);
3613
3614  return 1;
3615}
3616
3617void *
3618cmalloc (size_t nmemb, size_t size)
3619{
3620  /* Check for overflow.  */
3621  if (nmemb >= ~(size_t) 0 / size)
3622    return NULL;
3623  else
3624    return malloc (nmemb * size);
3625}
3626
3627void *
3628xcmalloc (size_t nmemb, size_t size)
3629{
3630  /* Check for overflow.  */
3631  if (nmemb >= ~(size_t) 0 / size)
3632    return NULL;
3633  else
3634    return xmalloc (nmemb * size);
3635}
3636
3637void *
3638xcrealloc (void *ptr, size_t nmemb, size_t size)
3639{
3640  /* Check for overflow.  */
3641  if (nmemb >= ~(size_t) 0 / size)
3642    return NULL;
3643  else
3644    return xrealloc (ptr, nmemb * size);
3645}
3646
3647void
3648error (const char *message, ...)
3649{
3650  va_list args;
3651
3652  va_start (args, message);
3653  fprintf (stderr, _("%s: Error: "), program_name);
3654  vfprintf (stderr, message, args);
3655  va_end (args);
3656}
3657
3658void
3659warn (const char *message, ...)
3660{
3661  va_list args;
3662
3663  va_start (args, message);
3664  fprintf (stderr, _("%s: Warning: "), program_name);
3665  vfprintf (stderr, message, args);
3666  va_end (args);
3667}
3668
3669void
3670free_debug_memory (void)
3671{
3672  enum dwarf_section_display_enum i;
3673
3674  free_abbrevs ();
3675
3676  for (i = 0; i < max; i++)
3677    free_debug_section (i);
3678
3679  if (debug_information)
3680    {
3681      for (i = 0; i < num_debug_info_entries; i++)
3682	{
3683	  if (!debug_information [i].max_loc_offsets)
3684	    {
3685	      free (debug_information [i].loc_offsets);
3686	      free (debug_information [i].have_frame_base);
3687	    }
3688	  if (!debug_information [i].max_range_lists)
3689	    free (debug_information [i].range_lists);
3690	}
3691      free (debug_information);
3692      debug_information = NULL;
3693      num_debug_info_entries = 0;
3694    }
3695
3696}
3697
3698struct dwarf_section_display debug_displays[] =
3699{
3700  { { ".debug_abbrev",		NULL,	0,	0 },
3701    display_debug_abbrev,		0,	0 },
3702  { { ".debug_aranges",		NULL,	0,	0 },
3703    display_debug_aranges,		0,	0 },
3704  { { ".debug_frame",		NULL,	0,	0 },
3705    display_debug_frames,		1,	0 },
3706  { { ".debug_info",		NULL,	0,	0 },
3707    display_debug_info,			1,	0 },
3708  { { ".debug_line",		NULL,	0,	0 },
3709    display_debug_lines,		0,	0 },
3710  { { ".debug_pubnames",	NULL,	0,	0 },
3711    display_debug_pubnames,		0,	0 },
3712  { { ".eh_frame",		NULL,	0,	0 },
3713    display_debug_frames,		1,	1 },
3714  { { ".debug_macinfo",		NULL,	0,	0 },
3715    display_debug_macinfo,		0,	0 },
3716  { { ".debug_str",		NULL,	0,	0 },
3717    display_debug_str,			0,	0 },
3718  { { ".debug_loc",		NULL,	0,	0 },
3719    display_debug_loc,			0,	0 },
3720  { { ".debug_pubtypes",	NULL,	0,	0 },
3721    display_debug_pubnames,		0,	0 },
3722  { { ".debug_ranges",		NULL,	0,	0 },
3723    display_debug_ranges,		0,	0 },
3724  { { ".debug_static_func",	NULL,	0,	0 },
3725    display_debug_not_supported,	0,	0 },
3726  { { ".debug_static_vars",	NULL,	0,	0 },
3727    display_debug_not_supported,	0,	0 },
3728  { { ".debug_types",		NULL,	0,	0 },
3729    display_debug_not_supported,	0,	0 },
3730  { { ".debug_weaknames",	NULL,	0,	0 },
3731    display_debug_not_supported,	0,	0 }
3732};
3733