d5f7baf33a152368358cdbbbf583e767c97765ea
[external/binutils.git] / binutils / dwarf.c
1 /* dwarf.c -- display DWARF contents of a BFD binary file
2    Copyright 2005-2013 Free Software Foundation, Inc.
3
4    This file is part of GNU Binutils.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
19    02110-1301, USA.  */
20
21 #include "sysdep.h"
22 #include "libiberty.h"
23 #include "bfd.h"
24 #include "bfd_stdint.h"
25 #include "bucomm.h"
26 #include "elfcomm.h"
27 #include "elf/common.h"
28 #include "dwarf2.h"
29 #include "dwarf.h"
30 #include "gdb/gdb-index.h"
31
32 #if !HAVE_DECL_STRNLEN
33 size_t strnlen (const char *, size_t);
34 #endif
35
36 static const char *regname (unsigned int regno, int row);
37
38 static int have_frame_base;
39 static int need_base_address;
40
41 static unsigned int last_pointer_size = 0;
42 static int warned_about_missing_comp_units = FALSE;
43
44 static unsigned int num_debug_info_entries = 0;
45 static debug_info *debug_information = NULL;
46 /* Special value for num_debug_info_entries to indicate
47    that the .debug_info section could not be loaded/parsed.  */
48 #define DEBUG_INFO_UNAVAILABLE  (unsigned int) -1
49
50 int eh_addr_size;
51
52 int do_debug_info;
53 int do_debug_abbrevs;
54 int do_debug_lines;
55 int do_debug_pubnames;
56 int do_debug_pubtypes;
57 int do_debug_aranges;
58 int do_debug_ranges;
59 int do_debug_frames;
60 int do_debug_frames_interp;
61 int do_debug_macinfo;
62 int do_debug_str;
63 int do_debug_loc;
64 int do_gdb_index;
65 int do_trace_info;
66 int do_trace_abbrevs;
67 int do_trace_aranges;
68 int do_debug_addr;
69 int do_debug_cu_index;
70 int do_wide;
71
72 int dwarf_cutoff_level = -1;
73 unsigned long dwarf_start_die;
74
75 int dwarf_check = 0;
76
77 /* Collection of CU/TU section sets from .debug_cu_index and .debug_tu_index
78    sections.  For version 1 package files, each set is stored in SHNDX_POOL
79    as a zero-terminated list of section indexes comprising one set of debug
80    sections from a .dwo file.  */
81
82 static int cu_tu_indexes_read = 0;
83 static unsigned int *shndx_pool = NULL;
84 static unsigned int shndx_pool_size = 0;
85 static unsigned int shndx_pool_used = 0;
86
87 /* For version 2 package files, each set contains an array of section offsets
88    and an array of section sizes, giving the offset and size of the
89    contribution from a CU or TU within one of the debug sections.
90    When displaying debug info from a package file, we need to use these
91    tables to locate the corresponding contributions to each section.  */
92
93 struct cu_tu_set
94 {
95   uint64_t signature;
96   dwarf_vma section_offsets[DW_SECT_MAX];
97   size_t section_sizes[DW_SECT_MAX];
98 };
99
100 static int cu_count = 0;
101 static int tu_count = 0;
102 static struct cu_tu_set *cu_sets = NULL;
103 static struct cu_tu_set *tu_sets = NULL;
104
105 static void load_cu_tu_indexes (void *file);
106
107 /* Values for do_debug_lines.  */
108 #define FLAG_DEBUG_LINES_RAW     1
109 #define FLAG_DEBUG_LINES_DECODED 2
110
111 static int
112 size_of_encoded_value (int encoding)
113 {
114   switch (encoding & 0x7)
115     {
116     default:    /* ??? */
117     case 0:     return eh_addr_size;
118     case 2:     return 2;
119     case 3:     return 4;
120     case 4:     return 8;
121     }
122 }
123
124 static dwarf_vma
125 get_encoded_value (unsigned char *data,
126                    int encoding,
127                    struct dwarf_section *section)
128 {
129   int size = size_of_encoded_value (encoding);
130   dwarf_vma val;
131
132   if (encoding & DW_EH_PE_signed)
133     val = byte_get_signed (data, size);
134   else
135     val = byte_get (data, size);
136
137   if ((encoding & 0x70) == DW_EH_PE_pcrel)
138     val += section->address + (data - section->start);
139   return val;
140 }
141
142 #if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
143 #ifndef __MINGW32__
144 #define  DWARF_VMA_FMT       "ll"
145 #define  DWARF_VMA_FMT_LONG  "%16.16llx"
146 #else
147 #define  DWARF_VMA_FMT       "I64"
148 #define  DWARF_VMA_FMT_LONG  "%016I64x"
149 #endif
150 #else
151 #define  DWARF_VMA_FMT       "l"
152 #define  DWARF_VMA_FMT_LONG  "%16.16lx"
153 #endif
154
155 /* Convert a dwarf vma value into a string.  Returns a pointer to a static
156    buffer containing the converted VALUE.  The value is converted according
157    to the printf formating character FMTCH.  If NUM_BYTES is non-zero then
158    it specifies the maximum number of bytes to be displayed in the converted
159    value and FMTCH is ignored - hex is always used.  */
160
161 static const char *
162 dwarf_vmatoa_1 (const char *fmtch, dwarf_vma value, unsigned num_bytes)
163 {
164   /* As dwarf_vmatoa is used more then once in a printf call
165      for output, we are cycling through an fixed array of pointers
166      for return address.  */
167   static int buf_pos = 0;
168   static struct dwarf_vmatoa_buf
169   {
170     char place[64];
171   } buf[16];
172   char *ret;
173
174   ret = buf[buf_pos++].place;
175   buf_pos %= ARRAY_SIZE (buf);
176
177   if (num_bytes)
178     {
179       /* Printf does not have a way of specifiying a maximum field width for an
180          integer value, so we print the full value into a buffer and then select
181          the precision we need.  */
182       snprintf (ret, sizeof (buf[0].place), DWARF_VMA_FMT_LONG, value);
183       if (num_bytes > 8)
184         num_bytes = 8;
185       return ret + (16 - 2 * num_bytes);
186     }
187   else
188     {
189       char fmt[32];
190
191       sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch);
192       snprintf (ret, sizeof (buf[0].place), fmt, value);
193       return ret;
194     }
195 }
196
197 static inline const char *
198 dwarf_vmatoa (const char * fmtch, dwarf_vma value)
199 {
200   return dwarf_vmatoa_1 (fmtch, value, 0);
201 }
202
203 /* Print a dwarf_vma value (typically an address, offset or length) in
204    hexadecimal format, followed by a space.  The length of the VALUE (and
205    hence the precision displayed) is determined by the NUM_BYTES parameter.  */
206
207 static void
208 print_dwarf_vma (dwarf_vma value, unsigned num_bytes)
209 {
210   printf ("%s ", dwarf_vmatoa_1 (NULL, value, num_bytes));
211 }
212
213 /* Format a 64-bit value, given as two 32-bit values, in hex.
214    For reentrancy, this uses a buffer provided by the caller.  */
215
216 static const char *
217 dwarf_vmatoa64 (dwarf_vma hvalue, dwarf_vma lvalue, char *buf,
218                 unsigned int buf_len)
219 {
220   int len = 0;
221
222   if (hvalue == 0)
223     snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", lvalue);
224   else
225     {
226       len = snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", hvalue);
227       snprintf (buf + len, buf_len - len,
228                 "%08" DWARF_VMA_FMT "x", lvalue);
229     }
230
231   return buf;
232 }
233
234 /* Read in a LEB128 encoded value starting at address DATA.
235    If SIGN is true, return a signed LEB128 value.
236    If LENGTH_RETURN is not NULL, return in it the number of bytes read.
237    No bytes will be read at address END or beyond.  */
238
239 dwarf_vma
240 read_leb128 (unsigned char *data,
241              unsigned int *length_return,
242              bfd_boolean sign,
243              const unsigned char * const end)
244 {
245   dwarf_vma result = 0;
246   unsigned int num_read = 0;
247   unsigned int shift = 0;
248   unsigned char byte = 0;
249
250   while (data < end)
251     {
252       byte = *data++;
253       num_read++;
254
255       result |= ((dwarf_vma) (byte & 0x7f)) << shift;
256
257       shift += 7;
258       if ((byte & 0x80) == 0)
259         break;
260     }
261
262   if (length_return != NULL)
263     *length_return = num_read;
264
265   if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
266     result |= -1L << shift;
267
268   return result;
269 }
270
271 /* Create a signed version to avoid painful typecasts.  */
272 static inline dwarf_signed_vma
273 read_sleb128 (unsigned char * data,
274               unsigned int *  length_return,
275               const unsigned char * const end)
276 {
277   return (dwarf_signed_vma) read_leb128 (data, length_return, TRUE, end);
278 }
279
280 static inline dwarf_vma
281 read_uleb128 (unsigned char * data,
282               unsigned int *  length_return,
283               const unsigned char * const end)
284 {
285   return read_leb128 (data, length_return, FALSE, end);
286 }
287
288 #define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END)    \
289   do                                            \
290     {                                           \
291       int dummy [sizeof (VAL) < (AMOUNT) ? -1 : 1] ATTRIBUTE_UNUSED ; \
292       unsigned int amount = (AMOUNT);           \
293       if (((PTR) + amount) >= (END))            \
294         {                                       \
295           if ((PTR) < (END))                    \
296             amount = (END) - (PTR);             \
297           else                                  \
298             amount = 0;                         \
299         }                                       \
300       if (amount)                               \
301         VAL = byte_get ((PTR), amount);         \
302       else                                      \
303         VAL = 0;                                \
304     }                                           \
305   while (0)
306
307 #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END)    \
308   do                                                    \
309     {                                                   \
310       SAFE_BYTE_GET (VAL, PTR, AMOUNT, END);            \
311       PTR += AMOUNT;                                    \
312     }                                                   \
313   while (0)
314
315 #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END)     \
316   do                                                    \
317     {                                                   \
318       unsigned int amount = (AMOUNT);                   \
319       if (((PTR) + amount) >= (END))                    \
320         {                                               \
321           if ((PTR) < (END))                            \
322             amount = (END) - (PTR);                     \
323           else                                          \
324             amount = 0;                                 \
325         }                                               \
326       if (amount)                                       \
327         VAL = byte_get_signed ((PTR), amount);          \
328       else                                              \
329         VAL = 0;                                        \
330     }                                                   \
331   while (0)
332
333 #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END)     \
334   do                                                            \
335     {                                                           \
336       SAFE_SIGNED_BYTE_GET (VAL, PTR, AMOUNT, END);             \
337       PTR += AMOUNT;                                            \
338     }                                                           \
339   while (0)
340
341 #define SAFE_BYTE_GET64(PTR, HIGH, LOW, END)            \
342   do                                                    \
343     {                                                   \
344       if (((PTR) + 8) <= (END))                         \
345         {                                               \
346           byte_get_64 ((PTR), (HIGH), (LOW));           \
347         }                                               \
348       else                                              \
349         {                                               \
350           * (LOW) = * (HIGH) = 0;                       \
351         }                                               \
352     }                                                   \
353   while (0)
354
355 typedef struct State_Machine_Registers
356 {
357   dwarf_vma address;
358   unsigned int file;
359   unsigned int line;
360   unsigned int column;
361   int is_stmt;
362   int basic_block;
363   unsigned char op_index;
364   unsigned char end_sequence;
365 /* This variable hold the number of the last entry seen
366    in the File Table.  */
367   unsigned int last_file_entry;
368 } SMR;
369
370 static SMR state_machine_regs;
371
372 static void
373 reset_state_machine (int is_stmt)
374 {
375   state_machine_regs.address = 0;
376   state_machine_regs.op_index = 0;
377   state_machine_regs.file = 1;
378   state_machine_regs.line = 1;
379   state_machine_regs.column = 0;
380   state_machine_regs.is_stmt = is_stmt;
381   state_machine_regs.basic_block = 0;
382   state_machine_regs.end_sequence = 0;
383   state_machine_regs.last_file_entry = 0;
384 }
385
386 /* Handled an extend line op.
387    Returns the number of bytes read.  */
388
389 static int
390 process_extended_line_op (unsigned char * data,
391                           int is_stmt,
392                           unsigned char * end)
393 {
394   unsigned char op_code;
395   unsigned int bytes_read;
396   unsigned int len;
397   unsigned char *name;
398   unsigned char *orig_data = data;
399   dwarf_vma adr;
400
401   len = read_uleb128 (data, & bytes_read, end);
402   data += bytes_read;
403
404   if (len == 0 || data == end)
405     {
406       warn (_("badly formed extended line op encountered!\n"));
407       return bytes_read;
408     }
409
410   len += bytes_read;
411   op_code = *data++;
412
413   printf (_("  Extended opcode %d: "), op_code);
414
415   switch (op_code)
416     {
417     case DW_LNE_end_sequence:
418       printf (_("End of Sequence\n\n"));
419       reset_state_machine (is_stmt);
420       break;
421
422     case DW_LNE_set_address:
423       SAFE_BYTE_GET (adr, data, len - bytes_read - 1, end);
424       printf (_("set Address to 0x%s\n"), dwarf_vmatoa ("x", adr));
425       state_machine_regs.address = adr;
426       state_machine_regs.op_index = 0;
427       break;
428
429     case DW_LNE_define_file:
430       printf (_("define new File Table entry\n"));
431       printf (_("  Entry\tDir\tTime\tSize\tName\n"));
432       printf ("   %d\t", ++state_machine_regs.last_file_entry);
433
434       name = data;
435       data += strnlen ((char *) data, end - data) + 1;
436       printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
437       data += bytes_read;
438       printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
439       data += bytes_read;
440       printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
441       data += bytes_read;
442       printf ("%s\n\n", name);
443
444       if (((unsigned int) (data - orig_data) != len) || data == end)
445         warn (_("DW_LNE_define_file: Bad opcode length\n"));
446       break;
447
448     case DW_LNE_set_discriminator:
449       printf (_("set Discriminator to %s\n"),
450               dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
451       break;
452
453     /* HP extensions.  */
454     case DW_LNE_HP_negate_is_UV_update:
455       printf ("DW_LNE_HP_negate_is_UV_update\n");
456       break;
457     case DW_LNE_HP_push_context:
458       printf ("DW_LNE_HP_push_context\n");
459       break;
460     case DW_LNE_HP_pop_context:
461       printf ("DW_LNE_HP_pop_context\n");
462       break;
463     case DW_LNE_HP_set_file_line_column:
464       printf ("DW_LNE_HP_set_file_line_column\n");
465       break;
466     case DW_LNE_HP_set_routine_name:
467       printf ("DW_LNE_HP_set_routine_name\n");
468       break;
469     case DW_LNE_HP_set_sequence:
470       printf ("DW_LNE_HP_set_sequence\n");
471       break;
472     case DW_LNE_HP_negate_post_semantics:
473       printf ("DW_LNE_HP_negate_post_semantics\n");
474       break;
475     case DW_LNE_HP_negate_function_exit:
476       printf ("DW_LNE_HP_negate_function_exit\n");
477       break;
478     case DW_LNE_HP_negate_front_end_logical:
479       printf ("DW_LNE_HP_negate_front_end_logical\n");
480       break;
481     case DW_LNE_HP_define_proc:
482       printf ("DW_LNE_HP_define_proc\n");
483       break;
484     case DW_LNE_HP_source_file_correlation:
485       {
486         unsigned char *edata = data + len - bytes_read - 1;
487
488         printf ("DW_LNE_HP_source_file_correlation\n");
489
490         while (data < edata)
491           {
492             unsigned int opc;
493
494             opc = read_uleb128 (data, & bytes_read, edata);
495             data += bytes_read;
496
497             switch (opc)
498               {
499               case DW_LNE_HP_SFC_formfeed:
500                 printf ("    DW_LNE_HP_SFC_formfeed\n");
501                 break;
502               case DW_LNE_HP_SFC_set_listing_line:
503                 printf ("    DW_LNE_HP_SFC_set_listing_line (%s)\n",
504                         dwarf_vmatoa ("u",
505                                       read_uleb128 (data, & bytes_read, edata)));
506                 data += bytes_read;
507                 break;
508               case DW_LNE_HP_SFC_associate:
509                 printf ("    DW_LNE_HP_SFC_associate ");
510                 printf ("(%s",
511                         dwarf_vmatoa ("u",
512                                       read_uleb128 (data, & bytes_read, edata)));
513                 data += bytes_read;
514                 printf (",%s",
515                         dwarf_vmatoa ("u",
516                                       read_uleb128 (data, & bytes_read, edata)));
517                 data += bytes_read;
518                 printf (",%s)\n",
519                         dwarf_vmatoa ("u",
520                                       read_uleb128 (data, & bytes_read, edata)));
521                 data += bytes_read;
522                 break;
523               default:
524                 printf (_("    UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc);
525                 data = edata;
526                 break;
527               }
528           }
529       }
530       break;
531
532     default:
533       {
534         unsigned int rlen = len - bytes_read - 1;
535
536         if (op_code >= DW_LNE_lo_user
537             /* The test against DW_LNW_hi_user is redundant due to
538                the limited range of the unsigned char data type used
539                for op_code.  */
540             /*&& op_code <= DW_LNE_hi_user*/)
541           printf (_("user defined: "));
542         else
543           printf (_("UNKNOWN: "));
544         printf (_("length %d ["), rlen);
545         for (; rlen; rlen--)
546           printf (" %02x", *data++);
547         printf ("]\n");
548       }
549       break;
550     }
551
552   return len;
553 }
554
555 static const unsigned char *
556 fetch_indirect_string (dwarf_vma offset)
557 {
558   struct dwarf_section *section = &debug_displays [str].section;
559
560   if (section->start == NULL)
561     return (const unsigned char *) _("<no .debug_str section>");
562
563   /* DWARF sections under Mach-O have non-zero addresses.  */
564   offset -= section->address;
565   if (offset > section->size)
566     {
567       warn (_("DW_FORM_strp offset too big: %s\n"),
568             dwarf_vmatoa ("x", offset));
569       return (const unsigned char *) _("<offset is too big>");
570     }
571
572   return (const unsigned char *) section->start + offset;
573 }
574
575 static const char *
576 fetch_indexed_string (dwarf_vma idx, struct cu_tu_set *this_set,
577                       dwarf_vma offset_size, int dwo)
578 {
579   enum dwarf_section_display_enum str_sec_idx = dwo ? str_dwo : str;
580   enum dwarf_section_display_enum idx_sec_idx = dwo ? str_index_dwo : str_index;
581   struct dwarf_section *index_section = &debug_displays [idx_sec_idx].section;
582   struct dwarf_section *str_section = &debug_displays [str_sec_idx].section;
583   dwarf_vma index_offset = idx * offset_size;
584   dwarf_vma str_offset;
585
586   if (index_section->start == NULL)
587     return (dwo ? _("<no .debug_str_offsets.dwo section>")
588                 : _("<no .debug_str_offsets section>"));
589
590   /* DWARF sections under Mach-O have non-zero addresses.  */
591   index_offset -= index_section->address;
592   if (this_set != NULL)
593     index_offset += this_set->section_offsets [DW_SECT_STR_OFFSETS];
594   if (index_offset > index_section->size)
595     {
596       warn (_("DW_FORM_GNU_str_index offset too big: %s\n"),
597             dwarf_vmatoa ("x", index_offset));
598       return _("<index offset is too big>");
599     }
600
601   if (str_section->start == NULL)
602     return (dwo ? _("<no .debug_str.dwo section>")
603                 : _("<no .debug_str section>"));
604
605   str_offset = byte_get (index_section->start + index_offset, offset_size);
606   str_offset -= str_section->address;
607   if (str_offset > str_section->size)
608     {
609       warn (_("DW_FORM_GNU_str_index indirect offset too big: %s\n"),
610             dwarf_vmatoa ("x", str_offset));
611       return _("<indirect index offset is too big>");
612     }
613
614   return (const char *) str_section->start + str_offset;
615 }
616
617 static const char *
618 fetch_indexed_value (dwarf_vma offset, dwarf_vma bytes)
619 {
620   struct dwarf_section *section = &debug_displays [debug_addr].section;
621
622   if (section->start == NULL)
623     return (_("<no .debug_addr section>"));
624
625   if (offset + bytes > section->size)
626     {
627       warn (_("Offset into section %s too big: %s\n"),
628             section->name, dwarf_vmatoa ("x", offset));
629       return "<offset too big>";
630     }
631
632   return dwarf_vmatoa ("x", byte_get (section->start + offset, bytes));
633 }
634
635
636 /* FIXME:  There are better and more efficient ways to handle
637    these structures.  For now though, I just want something that
638    is simple to implement.  */
639 typedef struct abbrev_attr
640 {
641   unsigned long attribute;
642   unsigned long form;
643   struct abbrev_attr *next;
644 }
645 abbrev_attr;
646
647 typedef struct abbrev_entry
648 {
649   unsigned long entry;
650   unsigned long tag;
651   int children;
652   struct abbrev_attr *first_attr;
653   struct abbrev_attr *last_attr;
654   struct abbrev_entry *next;
655 }
656 abbrev_entry;
657
658 static abbrev_entry *first_abbrev = NULL;
659 static abbrev_entry *last_abbrev = NULL;
660
661 static void
662 free_abbrevs (void)
663 {
664   abbrev_entry *abbrv;
665
666   for (abbrv = first_abbrev; abbrv;)
667     {
668       abbrev_entry *next_abbrev = abbrv->next;
669       abbrev_attr *attr;
670
671       for (attr = abbrv->first_attr; attr;)
672         {
673           abbrev_attr *next_attr = attr->next;
674
675           free (attr);
676           attr = next_attr;
677         }
678
679       free (abbrv);
680       abbrv = next_abbrev;
681     }
682
683   last_abbrev = first_abbrev = NULL;
684 }
685
686 static void
687 add_abbrev (unsigned long number, unsigned long tag, int children)
688 {
689   abbrev_entry *entry;
690
691   entry = (abbrev_entry *) malloc (sizeof (*entry));
692   if (entry == NULL)
693     /* ugg */
694     return;
695
696   entry->entry      = number;
697   entry->tag        = tag;
698   entry->children   = children;
699   entry->first_attr = NULL;
700   entry->last_attr  = NULL;
701   entry->next       = NULL;
702
703   if (first_abbrev == NULL)
704     first_abbrev = entry;
705   else
706     last_abbrev->next = entry;
707
708   last_abbrev = entry;
709 }
710
711 static void
712 add_abbrev_attr (unsigned long attribute, unsigned long form)
713 {
714   abbrev_attr *attr;
715
716   attr = (abbrev_attr *) malloc (sizeof (*attr));
717   if (attr == NULL)
718     /* ugg */
719     return;
720
721   attr->attribute = attribute;
722   attr->form      = form;
723   attr->next      = NULL;
724
725   if (last_abbrev->first_attr == NULL)
726     last_abbrev->first_attr = attr;
727   else
728     last_abbrev->last_attr->next = attr;
729
730   last_abbrev->last_attr = attr;
731 }
732
733 /* Processes the (partial) contents of a .debug_abbrev section.
734    Returns NULL if the end of the section was encountered.
735    Returns the address after the last byte read if the end of
736    an abbreviation set was found.  */
737
738 static unsigned char *
739 process_abbrev_section (unsigned char *start, unsigned char *end)
740 {
741   if (first_abbrev != NULL)
742     return NULL;
743
744   while (start < end)
745     {
746       unsigned int bytes_read;
747       unsigned long entry;
748       unsigned long tag;
749       unsigned long attribute;
750       int children;
751
752       entry = read_uleb128 (start, & bytes_read, end);
753       start += bytes_read;
754
755       /* A single zero is supposed to end the section according
756          to the standard.  If there's more, then signal that to
757          the caller.  */
758       if (start == end)
759         return NULL;
760       if (entry == 0)
761         return start;
762
763       tag = read_uleb128 (start, & bytes_read, end);
764       start += bytes_read;
765       if (start == end)
766         return NULL;
767
768       children = *start++;
769
770       add_abbrev (entry, tag, children);
771
772       do
773         {
774           unsigned long form;
775
776           attribute = read_uleb128 (start, & bytes_read, end);
777           start += bytes_read;
778           if (start == end)
779             break;
780
781           form = read_uleb128 (start, & bytes_read, end);
782           start += bytes_read;
783           if (start == end)
784             break;
785
786           add_abbrev_attr (attribute, form);
787         }
788       while (attribute != 0);
789     }
790
791   /* Report the missing single zero which ends the section.  */
792   error (_(".debug_abbrev section not zero terminated\n"));
793
794   return NULL;
795 }
796
797 static const char *
798 get_TAG_name (unsigned long tag)
799 {
800   const char *name = get_DW_TAG_name ((unsigned int)tag);
801
802   if (name == NULL)
803     {
804       static char buffer[100];
805
806       snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag);
807       return buffer;
808     }
809
810   return name;
811 }
812
813 static const char *
814 get_FORM_name (unsigned long form)
815 {
816   const char *name;
817
818   if (form == 0)
819     return "DW_FORM value: 0";
820
821   name = get_DW_FORM_name (form);
822   if (name == NULL)
823     {
824       static char buffer[100];
825
826       snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
827       return buffer;
828     }
829
830   return name;
831 }
832
833 static unsigned char *
834 display_block (unsigned char *data,
835                dwarf_vma length,
836                const unsigned char * const end)
837 {
838   dwarf_vma maxlen;
839
840   printf (_(" %s byte block: "), dwarf_vmatoa ("u", length));
841
842   maxlen = (dwarf_vma) (end - data);
843   length = length > maxlen ? maxlen : length;
844
845   while (length --)
846     printf ("%lx ", (unsigned long) byte_get (data++, 1));
847
848   return data;
849 }
850
851 static int
852 decode_location_expression (unsigned char * data,
853                             unsigned int pointer_size,
854                             unsigned int offset_size,
855                             int dwarf_version,
856                             dwarf_vma length,
857                             dwarf_vma cu_offset,
858                             struct dwarf_section * section)
859 {
860   unsigned op;
861   unsigned int bytes_read;
862   dwarf_vma uvalue;
863   dwarf_signed_vma svalue;
864   unsigned char *end = data + length;
865   int need_frame_base = 0;
866
867   while (data < end)
868     {
869       op = *data++;
870
871       switch (op)
872         {
873         case DW_OP_addr:
874           SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
875           printf ("DW_OP_addr: %s", dwarf_vmatoa ("x", uvalue));
876           break;
877         case DW_OP_deref:
878           printf ("DW_OP_deref");
879           break;
880         case DW_OP_const1u:
881           SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
882           printf ("DW_OP_const1u: %lu", (unsigned long) uvalue);
883           break;
884         case DW_OP_const1s:
885           SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 1, end);
886           printf ("DW_OP_const1s: %ld", (long) svalue);
887           break;
888         case DW_OP_const2u:
889           SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
890           printf ("DW_OP_const2u: %lu", (unsigned long) uvalue);
891           break;
892         case DW_OP_const2s:
893           SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
894           printf ("DW_OP_const2s: %ld", (long) svalue);
895           break;
896         case DW_OP_const4u:
897           SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
898           printf ("DW_OP_const4u: %lu", (unsigned long) uvalue);
899           break;
900         case DW_OP_const4s:
901           SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
902           printf ("DW_OP_const4s: %ld", (long) svalue);
903           break;
904         case DW_OP_const8u:
905           SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
906           printf ("DW_OP_const8u: %lu ", (unsigned long) uvalue);
907           SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
908           printf ("%lu", (unsigned long) uvalue);
909           break;
910         case DW_OP_const8s:
911           SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
912           printf ("DW_OP_const8s: %ld ", (long) svalue);
913           SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
914           printf ("%ld", (long) svalue);
915           break;
916         case DW_OP_constu:
917           printf ("DW_OP_constu: %s",
918                   dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
919           data += bytes_read;
920           break;
921         case DW_OP_consts:
922           printf ("DW_OP_consts: %s",
923                   dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
924           data += bytes_read;
925           break;
926         case DW_OP_dup:
927           printf ("DW_OP_dup");
928           break;
929         case DW_OP_drop:
930           printf ("DW_OP_drop");
931           break;
932         case DW_OP_over:
933           printf ("DW_OP_over");
934           break;
935         case DW_OP_pick:
936           SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
937           printf ("DW_OP_pick: %ld", (unsigned long) uvalue);
938           break;
939         case DW_OP_swap:
940           printf ("DW_OP_swap");
941           break;
942         case DW_OP_rot:
943           printf ("DW_OP_rot");
944           break;
945         case DW_OP_xderef:
946           printf ("DW_OP_xderef");
947           break;
948         case DW_OP_abs:
949           printf ("DW_OP_abs");
950           break;
951         case DW_OP_and:
952           printf ("DW_OP_and");
953           break;
954         case DW_OP_div:
955           printf ("DW_OP_div");
956           break;
957         case DW_OP_minus:
958           printf ("DW_OP_minus");
959           break;
960         case DW_OP_mod:
961           printf ("DW_OP_mod");
962           break;
963         case DW_OP_mul:
964           printf ("DW_OP_mul");
965           break;
966         case DW_OP_neg:
967           printf ("DW_OP_neg");
968           break;
969         case DW_OP_not:
970           printf ("DW_OP_not");
971           break;
972         case DW_OP_or:
973           printf ("DW_OP_or");
974           break;
975         case DW_OP_plus:
976           printf ("DW_OP_plus");
977           break;
978         case DW_OP_plus_uconst:
979           printf ("DW_OP_plus_uconst: %s",
980                   dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
981           data += bytes_read;
982           break;
983         case DW_OP_shl:
984           printf ("DW_OP_shl");
985           break;
986         case DW_OP_shr:
987           printf ("DW_OP_shr");
988           break;
989         case DW_OP_shra:
990           printf ("DW_OP_shra");
991           break;
992         case DW_OP_xor:
993           printf ("DW_OP_xor");
994           break;
995         case DW_OP_bra:
996           SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
997           printf ("DW_OP_bra: %ld", (long) svalue);
998           break;
999         case DW_OP_eq:
1000           printf ("DW_OP_eq");
1001           break;
1002         case DW_OP_ge:
1003           printf ("DW_OP_ge");
1004           break;
1005         case DW_OP_gt:
1006           printf ("DW_OP_gt");
1007           break;
1008         case DW_OP_le:
1009           printf ("DW_OP_le");
1010           break;
1011         case DW_OP_lt:
1012           printf ("DW_OP_lt");
1013           break;
1014         case DW_OP_ne:
1015           printf ("DW_OP_ne");
1016           break;
1017         case DW_OP_skip:
1018           SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1019           printf ("DW_OP_skip: %ld", (long) svalue);
1020           break;
1021
1022         case DW_OP_lit0:
1023         case DW_OP_lit1:
1024         case DW_OP_lit2:
1025         case DW_OP_lit3:
1026         case DW_OP_lit4:
1027         case DW_OP_lit5:
1028         case DW_OP_lit6:
1029         case DW_OP_lit7:
1030         case DW_OP_lit8:
1031         case DW_OP_lit9:
1032         case DW_OP_lit10:
1033         case DW_OP_lit11:
1034         case DW_OP_lit12:
1035         case DW_OP_lit13:
1036         case DW_OP_lit14:
1037         case DW_OP_lit15:
1038         case DW_OP_lit16:
1039         case DW_OP_lit17:
1040         case DW_OP_lit18:
1041         case DW_OP_lit19:
1042         case DW_OP_lit20:
1043         case DW_OP_lit21:
1044         case DW_OP_lit22:
1045         case DW_OP_lit23:
1046         case DW_OP_lit24:
1047         case DW_OP_lit25:
1048         case DW_OP_lit26:
1049         case DW_OP_lit27:
1050         case DW_OP_lit28:
1051         case DW_OP_lit29:
1052         case DW_OP_lit30:
1053         case DW_OP_lit31:
1054           printf ("DW_OP_lit%d", op - DW_OP_lit0);
1055           break;
1056
1057         case DW_OP_reg0:
1058         case DW_OP_reg1:
1059         case DW_OP_reg2:
1060         case DW_OP_reg3:
1061         case DW_OP_reg4:
1062         case DW_OP_reg5:
1063         case DW_OP_reg6:
1064         case DW_OP_reg7:
1065         case DW_OP_reg8:
1066         case DW_OP_reg9:
1067         case DW_OP_reg10:
1068         case DW_OP_reg11:
1069         case DW_OP_reg12:
1070         case DW_OP_reg13:
1071         case DW_OP_reg14:
1072         case DW_OP_reg15:
1073         case DW_OP_reg16:
1074         case DW_OP_reg17:
1075         case DW_OP_reg18:
1076         case DW_OP_reg19:
1077         case DW_OP_reg20:
1078         case DW_OP_reg21:
1079         case DW_OP_reg22:
1080         case DW_OP_reg23:
1081         case DW_OP_reg24:
1082         case DW_OP_reg25:
1083         case DW_OP_reg26:
1084         case DW_OP_reg27:
1085         case DW_OP_reg28:
1086         case DW_OP_reg29:
1087         case DW_OP_reg30:
1088         case DW_OP_reg31:
1089           printf ("DW_OP_reg%d (%s)", op - DW_OP_reg0,
1090                   regname (op - DW_OP_reg0, 1));
1091           break;
1092
1093         case DW_OP_breg0:
1094         case DW_OP_breg1:
1095         case DW_OP_breg2:
1096         case DW_OP_breg3:
1097         case DW_OP_breg4:
1098         case DW_OP_breg5:
1099         case DW_OP_breg6:
1100         case DW_OP_breg7:
1101         case DW_OP_breg8:
1102         case DW_OP_breg9:
1103         case DW_OP_breg10:
1104         case DW_OP_breg11:
1105         case DW_OP_breg12:
1106         case DW_OP_breg13:
1107         case DW_OP_breg14:
1108         case DW_OP_breg15:
1109         case DW_OP_breg16:
1110         case DW_OP_breg17:
1111         case DW_OP_breg18:
1112         case DW_OP_breg19:
1113         case DW_OP_breg20:
1114         case DW_OP_breg21:
1115         case DW_OP_breg22:
1116         case DW_OP_breg23:
1117         case DW_OP_breg24:
1118         case DW_OP_breg25:
1119         case DW_OP_breg26:
1120         case DW_OP_breg27:
1121         case DW_OP_breg28:
1122         case DW_OP_breg29:
1123         case DW_OP_breg30:
1124         case DW_OP_breg31:
1125           printf ("DW_OP_breg%d (%s): %s",
1126                   op - DW_OP_breg0,
1127                   regname (op - DW_OP_breg0, 1),
1128                   dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1129           data += bytes_read;
1130           break;
1131
1132         case DW_OP_regx:
1133           uvalue = read_uleb128 (data, &bytes_read, end);
1134           data += bytes_read;
1135           printf ("DW_OP_regx: %s (%s)",
1136                   dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1137           break;
1138         case DW_OP_fbreg:
1139           need_frame_base = 1;
1140           printf ("DW_OP_fbreg: %s",
1141                   dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1142           data += bytes_read;
1143           break;
1144         case DW_OP_bregx:
1145           uvalue = read_uleb128 (data, &bytes_read, end);
1146           data += bytes_read;
1147           printf ("DW_OP_bregx: %s (%s) %s",
1148                   dwarf_vmatoa ("u", uvalue), regname (uvalue, 1),
1149                   dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end)));
1150           data += bytes_read;
1151           break;
1152         case DW_OP_piece:
1153           printf ("DW_OP_piece: %s",
1154                   dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1155           data += bytes_read;
1156           break;
1157         case DW_OP_deref_size:
1158           SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1159           printf ("DW_OP_deref_size: %ld", (long) uvalue);
1160           break;
1161         case DW_OP_xderef_size:
1162           SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1163           printf ("DW_OP_xderef_size: %ld", (long) uvalue);
1164           break;
1165         case DW_OP_nop:
1166           printf ("DW_OP_nop");
1167           break;
1168
1169           /* DWARF 3 extensions.  */
1170         case DW_OP_push_object_address:
1171           printf ("DW_OP_push_object_address");
1172           break;
1173         case DW_OP_call2:
1174           /* XXX: Strictly speaking for 64-bit DWARF3 files
1175              this ought to be an 8-byte wide computation.  */
1176           SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1177           printf ("DW_OP_call2: <0x%s>",
1178                   dwarf_vmatoa ("x", svalue + cu_offset));
1179           break;
1180         case DW_OP_call4:
1181           /* XXX: Strictly speaking for 64-bit DWARF3 files
1182              this ought to be an 8-byte wide computation.  */
1183           SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1184           printf ("DW_OP_call4: <0x%s>",
1185                   dwarf_vmatoa ("x", svalue + cu_offset));
1186           break;
1187         case DW_OP_call_ref:
1188           /* XXX: Strictly speaking for 64-bit DWARF3 files
1189              this ought to be an 8-byte wide computation.  */
1190           if (dwarf_version == -1)
1191             {
1192               printf (_("(DW_OP_call_ref in frame info)"));
1193               /* No way to tell where the next op is, so just bail.  */
1194               return need_frame_base;
1195             }
1196           if (dwarf_version == 2)
1197             {
1198               SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1199             }
1200           else
1201             {
1202               SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1203             }
1204           printf ("DW_OP_call_ref: <0x%s>", dwarf_vmatoa ("x", uvalue));
1205           break;
1206         case DW_OP_form_tls_address:
1207           printf ("DW_OP_form_tls_address");
1208           break;
1209         case DW_OP_call_frame_cfa:
1210           printf ("DW_OP_call_frame_cfa");
1211           break;
1212         case DW_OP_bit_piece:
1213           printf ("DW_OP_bit_piece: ");
1214           printf (_("size: %s "),
1215                   dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1216           data += bytes_read;
1217           printf (_("offset: %s "),
1218                   dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end)));
1219           data += bytes_read;
1220           break;
1221
1222           /* DWARF 4 extensions.  */
1223         case DW_OP_stack_value:
1224           printf ("DW_OP_stack_value");
1225           break;
1226
1227         case DW_OP_implicit_value:
1228           printf ("DW_OP_implicit_value");
1229           uvalue = read_uleb128 (data, &bytes_read, end);
1230           data += bytes_read;
1231           display_block (data, uvalue, end);
1232           data += uvalue;
1233           break;
1234
1235           /* GNU extensions.  */
1236         case DW_OP_GNU_push_tls_address:
1237           printf (_("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown"));
1238           break;
1239         case DW_OP_GNU_uninit:
1240           printf ("DW_OP_GNU_uninit");
1241           /* FIXME: Is there data associated with this OP ?  */
1242           break;
1243         case DW_OP_GNU_encoded_addr:
1244           {
1245             int encoding;
1246             dwarf_vma addr;
1247
1248             encoding = *data++;
1249             addr = get_encoded_value (data, encoding, section);
1250             data += size_of_encoded_value (encoding);
1251
1252             printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding);
1253             print_dwarf_vma (addr, pointer_size);
1254           }
1255           break;
1256         case DW_OP_GNU_implicit_pointer:
1257           /* XXX: Strictly speaking for 64-bit DWARF3 files
1258              this ought to be an 8-byte wide computation.  */
1259           if (dwarf_version == -1)
1260             {
1261               printf (_("(DW_OP_GNU_implicit_pointer in frame info)"));
1262               /* No way to tell where the next op is, so just bail.  */
1263               return need_frame_base;
1264             }
1265           if (dwarf_version == 2)
1266             {
1267               SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1268             }
1269           else
1270             {
1271               SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1272             }
1273           printf ("DW_OP_GNU_implicit_pointer: <0x%s> %s",
1274                   dwarf_vmatoa ("x", uvalue),
1275                   dwarf_vmatoa ("d", read_sleb128 (data,
1276                                                    &bytes_read, end)));
1277           data += bytes_read;
1278           break;
1279         case DW_OP_GNU_entry_value:
1280           uvalue = read_uleb128 (data, &bytes_read, end);
1281           data += bytes_read;
1282           printf ("DW_OP_GNU_entry_value: (");
1283           if (decode_location_expression (data, pointer_size, offset_size,
1284                                           dwarf_version, uvalue,
1285                                           cu_offset, section))
1286             need_frame_base = 1;
1287           putchar (')');
1288           data += uvalue;
1289           break;
1290         case DW_OP_GNU_const_type:
1291           uvalue = read_uleb128 (data, &bytes_read, end);
1292           data += bytes_read;
1293           printf ("DW_OP_GNU_const_type: <0x%s> ",
1294                   dwarf_vmatoa ("x", cu_offset + uvalue));
1295           SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1296           display_block (data, uvalue, end);
1297           data += uvalue;
1298           break;
1299         case DW_OP_GNU_regval_type:
1300           uvalue = read_uleb128 (data, &bytes_read, end);
1301           data += bytes_read;
1302           printf ("DW_OP_GNU_regval_type: %s (%s)",
1303                   dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1304           uvalue = read_uleb128 (data, &bytes_read, end);
1305           data += bytes_read;
1306           printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1307           break;
1308         case DW_OP_GNU_deref_type:
1309           SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1310           printf ("DW_OP_GNU_deref_type: %ld", (long) uvalue);
1311           uvalue = read_uleb128 (data, &bytes_read, end);
1312           data += bytes_read;
1313           printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1314           break;
1315         case DW_OP_GNU_convert:
1316           uvalue = read_uleb128 (data, &bytes_read, end);
1317           data += bytes_read;
1318           printf ("DW_OP_GNU_convert <0x%s>",
1319                   dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1320           break;
1321         case DW_OP_GNU_reinterpret:
1322           uvalue = read_uleb128 (data, &bytes_read, end);
1323           data += bytes_read;
1324           printf ("DW_OP_GNU_reinterpret <0x%s>",
1325                   dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1326           break;
1327         case DW_OP_GNU_parameter_ref:
1328           SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1329           printf ("DW_OP_GNU_parameter_ref: <0x%s>",
1330                   dwarf_vmatoa ("x", cu_offset + uvalue));
1331           break;
1332         case DW_OP_GNU_addr_index:
1333           uvalue = read_uleb128 (data, &bytes_read, end);
1334           data += bytes_read;
1335           printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1336           break;
1337         case DW_OP_GNU_const_index:
1338           uvalue = read_uleb128 (data, &bytes_read, end);
1339           data += bytes_read;
1340           printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1341           break;
1342
1343           /* HP extensions.  */
1344         case DW_OP_HP_is_value:
1345           printf ("DW_OP_HP_is_value");
1346           /* FIXME: Is there data associated with this OP ?  */
1347           break;
1348         case DW_OP_HP_fltconst4:
1349           printf ("DW_OP_HP_fltconst4");
1350           /* FIXME: Is there data associated with this OP ?  */
1351           break;
1352         case DW_OP_HP_fltconst8:
1353           printf ("DW_OP_HP_fltconst8");
1354           /* FIXME: Is there data associated with this OP ?  */
1355           break;
1356         case DW_OP_HP_mod_range:
1357           printf ("DW_OP_HP_mod_range");
1358           /* FIXME: Is there data associated with this OP ?  */
1359           break;
1360         case DW_OP_HP_unmod_range:
1361           printf ("DW_OP_HP_unmod_range");
1362           /* FIXME: Is there data associated with this OP ?  */
1363           break;
1364         case DW_OP_HP_tls:
1365           printf ("DW_OP_HP_tls");
1366           /* FIXME: Is there data associated with this OP ?  */
1367           break;
1368
1369           /* PGI (STMicroelectronics) extensions.  */
1370         case DW_OP_PGI_omp_thread_num:
1371           /* Pushes the thread number for the current thread as it would be
1372              returned by the standard OpenMP library function:
1373              omp_get_thread_num().  The "current thread" is the thread for
1374              which the expression is being evaluated.  */
1375           printf ("DW_OP_PGI_omp_thread_num");
1376           break;
1377
1378         default:
1379           if (op >= DW_OP_lo_user
1380               && op <= DW_OP_hi_user)
1381             printf (_("(User defined location op)"));
1382           else
1383             printf (_("(Unknown location op)"));
1384           /* No way to tell where the next op is, so just bail.  */
1385           return need_frame_base;
1386         }
1387
1388       /* Separate the ops.  */
1389       if (data < end)
1390         printf ("; ");
1391     }
1392
1393   return need_frame_base;
1394 }
1395
1396 /* Find the CU or TU set corresponding to the given CU_OFFSET.
1397    This is used for DWARF package files.  */
1398
1399 static struct cu_tu_set *
1400 find_cu_tu_set_v2 (dwarf_vma cu_offset, int do_types)
1401 {
1402   struct cu_tu_set *p;
1403   unsigned int nsets;
1404   unsigned int dw_sect;
1405
1406   if (do_types)
1407     {
1408       p = tu_sets;
1409       nsets = tu_count;
1410       dw_sect = DW_SECT_TYPES;
1411     }
1412   else
1413     {
1414       p = cu_sets;
1415       nsets = cu_count;
1416       dw_sect = DW_SECT_INFO;
1417     }
1418   while (nsets > 0)
1419     {
1420       if (p->section_offsets [dw_sect] == cu_offset)
1421         return p;
1422       p++;
1423       nsets--;
1424     }
1425   return NULL;
1426 }
1427
1428 /* Add INC to HIGH_BITS:LOW_BITS.  */
1429 static void
1430 add64 (dwarf_vma * high_bits, dwarf_vma * low_bits, dwarf_vma inc)
1431 {
1432   dwarf_vma tmp = * low_bits;
1433
1434   tmp += inc;
1435
1436   /* FIXME: There is probably a better way of handling this:
1437
1438      We need to cope with dwarf_vma being a 32-bit or 64-bit
1439      type.  Plus regardless of its size LOW_BITS is meant to
1440      only hold 32-bits, so if there is overflow or wrap around
1441      we must propagate into HIGH_BITS.  */
1442   if (tmp < * low_bits)
1443     {
1444       ++ * high_bits;
1445     }
1446   else if (sizeof (tmp) > 8
1447            && (tmp >> 31) > 1)
1448     {
1449       ++ * high_bits;
1450       tmp &= 0xFFFFFFFF;
1451     }
1452
1453   * low_bits = tmp;
1454 }
1455
1456 static unsigned char *
1457 read_and_display_attr_value (unsigned long attribute,
1458                              unsigned long form,
1459                              unsigned char * data,
1460                              unsigned char * end,
1461                              dwarf_vma cu_offset,
1462                              dwarf_vma pointer_size,
1463                              dwarf_vma offset_size,
1464                              int dwarf_version,
1465                              debug_info * debug_info_p,
1466                              int do_loc,
1467                              struct dwarf_section * section,
1468                              struct cu_tu_set * this_set)
1469 {
1470   dwarf_vma uvalue = 0;
1471   unsigned char *block_start = NULL;
1472   unsigned char * orig_data = data;
1473   unsigned int bytes_read;
1474
1475   if (data == end)
1476     {
1477       warn (_("corrupt attribute\n"));
1478       return data;
1479     }
1480
1481   switch (form)
1482     {
1483     default:
1484       break;
1485
1486     case DW_FORM_ref_addr:
1487       if (dwarf_version == 2)
1488         SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1489       else if (dwarf_version == 3 || dwarf_version == 4)
1490         SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1491       else
1492         error (_("Internal error: DWARF version is not 2, 3 or 4.\n"));
1493
1494       break;
1495
1496     case DW_FORM_addr:
1497       SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1498       break;
1499
1500     case DW_FORM_strp:
1501     case DW_FORM_sec_offset:
1502     case DW_FORM_GNU_ref_alt:
1503     case DW_FORM_GNU_strp_alt:
1504       SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1505       break;
1506
1507     case DW_FORM_flag_present:
1508       uvalue = 1;
1509       break;
1510
1511     case DW_FORM_ref1:
1512     case DW_FORM_flag:
1513     case DW_FORM_data1:
1514       SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1515       break;
1516
1517     case DW_FORM_ref2:
1518     case DW_FORM_data2:
1519       SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1520       break;
1521
1522     case DW_FORM_ref4:
1523     case DW_FORM_data4:
1524       SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1525       break;
1526
1527     case DW_FORM_sdata:
1528       uvalue = read_sleb128 (data, & bytes_read, end);
1529       data += bytes_read;
1530       break;
1531
1532     case DW_FORM_GNU_str_index:
1533       uvalue = read_uleb128 (data, & bytes_read, end);
1534       data += bytes_read;
1535       break;
1536
1537     case DW_FORM_ref_udata:
1538     case DW_FORM_udata:
1539       uvalue = read_uleb128 (data, & bytes_read, end);
1540       data += bytes_read;
1541       break;
1542
1543     case DW_FORM_indirect:
1544       form = read_uleb128 (data, & bytes_read, end);
1545       data += bytes_read;
1546       if (!do_loc)
1547         printf (" %s", get_FORM_name (form));
1548       return read_and_display_attr_value (attribute, form, data, end,
1549                                           cu_offset, pointer_size,
1550                                           offset_size, dwarf_version,
1551                                           debug_info_p, do_loc,
1552                                           section, this_set);
1553     case DW_FORM_GNU_addr_index:
1554       uvalue = read_uleb128 (data, & bytes_read, end);
1555       data += bytes_read;
1556       break;
1557     }
1558
1559   switch (form)
1560     {
1561     case DW_FORM_ref_addr:
1562       if (!do_loc)
1563         printf (" <0x%s>", dwarf_vmatoa ("x",uvalue));
1564       break;
1565
1566     case DW_FORM_GNU_ref_alt:
1567       if (!do_loc)
1568         printf (" <alt 0x%s>", dwarf_vmatoa ("x",uvalue));
1569       break;
1570
1571     case DW_FORM_ref1:
1572     case DW_FORM_ref2:
1573     case DW_FORM_ref4:
1574     case DW_FORM_ref_udata:
1575       if (!do_loc)
1576         printf (" <0x%s>", dwarf_vmatoa ("x", uvalue + cu_offset));
1577       break;
1578
1579     case DW_FORM_data4:
1580     case DW_FORM_addr:
1581     case DW_FORM_sec_offset:
1582       if (!do_loc)
1583         printf (" 0x%s", dwarf_vmatoa ("x", uvalue));
1584       break;
1585
1586     case DW_FORM_flag_present:
1587     case DW_FORM_flag:
1588     case DW_FORM_data1:
1589     case DW_FORM_data2:
1590     case DW_FORM_sdata:
1591     case DW_FORM_udata:
1592       if (!do_loc)
1593         printf (" %s", dwarf_vmatoa ("d", uvalue));
1594       break;
1595
1596     case DW_FORM_ref8:
1597     case DW_FORM_data8:
1598         {
1599           dwarf_vma high_bits;
1600           dwarf_vma utmp;
1601           char buf[64];
1602
1603           SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1604           utmp = uvalue;
1605           if (form == DW_FORM_ref8)
1606             add64 (& high_bits, & utmp, cu_offset);
1607           printf (" 0x%s",
1608                   dwarf_vmatoa64 (high_bits, utmp, buf, sizeof (buf)));
1609         }
1610
1611       if ((do_loc || do_debug_loc || do_debug_ranges)
1612           && num_debug_info_entries == 0)
1613         {
1614           if (sizeof (uvalue) == 8)
1615             SAFE_BYTE_GET (uvalue, data, 8, end);
1616           else
1617             error (_("DW_FORM_data8 is unsupported when sizeof (dwarf_vma) != 8\n"));
1618         }
1619
1620       data += 8;
1621       break;
1622
1623     case DW_FORM_string:
1624       if (!do_loc)
1625         printf (" %.*s", (int) (end - data), data);
1626       data += strnlen ((char *) data, end - data) + 1;
1627       break;
1628
1629     case DW_FORM_block:
1630     case DW_FORM_exprloc:
1631       uvalue = read_uleb128 (data, & bytes_read, end);
1632       block_start = data + bytes_read;
1633       if (do_loc)
1634         data = block_start + uvalue;
1635       else
1636         data = display_block (block_start, uvalue, end);
1637       break;
1638
1639     case DW_FORM_block1:
1640       SAFE_BYTE_GET (uvalue, data, 1, end);
1641       block_start = data + 1;
1642       if (do_loc)
1643         data = block_start + uvalue;
1644       else
1645         data = display_block (block_start, uvalue, end);
1646       break;
1647
1648     case DW_FORM_block2:
1649       SAFE_BYTE_GET (uvalue, data, 2, end);
1650       block_start = data + 2;
1651       if (do_loc)
1652         data = block_start + uvalue;
1653       else
1654         data = display_block (block_start, uvalue, end);
1655       break;
1656
1657     case DW_FORM_block4:
1658       SAFE_BYTE_GET (uvalue, data, 4, end);
1659       block_start = data + 4;
1660       if (do_loc)
1661         data = block_start + uvalue;
1662       else
1663         data = display_block (block_start, uvalue, end);
1664       break;
1665
1666     case DW_FORM_strp:
1667       if (!do_loc)
1668         printf (_(" (indirect string, offset: 0x%s): %s"),
1669                 dwarf_vmatoa ("x", uvalue),
1670                 fetch_indirect_string (uvalue));
1671       break;
1672
1673     case DW_FORM_GNU_str_index:
1674       if (!do_loc)
1675         {
1676           const char *suffix = strrchr (section->name, '.');
1677           int dwo = (suffix && strcmp (suffix, ".dwo") == 0) ? 1 : 0;
1678
1679           printf (_(" (indexed string: 0x%s): %s"),
1680                   dwarf_vmatoa ("x", uvalue),
1681                   fetch_indexed_string (uvalue, this_set, offset_size, dwo));
1682         }
1683       break;
1684
1685     case DW_FORM_GNU_strp_alt:
1686       if (!do_loc)
1687         printf (_(" (alt indirect string, offset: 0x%s)"),
1688                 dwarf_vmatoa ("x", uvalue));
1689       break;
1690
1691     case DW_FORM_indirect:
1692       /* Handled above.  */
1693       break;
1694
1695     case DW_FORM_ref_sig8:
1696       if (!do_loc)
1697         {
1698           dwarf_vma high_bits;
1699           char buf[64];
1700
1701           SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
1702           printf (" signature: 0x%s",
1703                   dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf)));
1704         }
1705       data += 8;
1706       break;
1707
1708     case DW_FORM_GNU_addr_index:
1709       if (!do_loc)
1710         printf (_(" (addr_index: 0x%s): %s"),
1711                 dwarf_vmatoa ("x", uvalue),
1712                 fetch_indexed_value (uvalue * pointer_size, pointer_size));
1713       break;
1714
1715     default:
1716       warn (_("Unrecognized form: %lu\n"), form);
1717       break;
1718     }
1719
1720   if ((do_loc || do_debug_loc || do_debug_ranges)
1721       && num_debug_info_entries == 0
1722       && debug_info_p != NULL)
1723     {
1724       switch (attribute)
1725         {
1726         case DW_AT_frame_base:
1727           have_frame_base = 1;
1728         case DW_AT_location:
1729         case DW_AT_string_length:
1730         case DW_AT_return_addr:
1731         case DW_AT_data_member_location:
1732         case DW_AT_vtable_elem_location:
1733         case DW_AT_segment:
1734         case DW_AT_static_link:
1735         case DW_AT_use_location:
1736         case DW_AT_GNU_call_site_value:
1737         case DW_AT_GNU_call_site_data_value:
1738         case DW_AT_GNU_call_site_target:
1739         case DW_AT_GNU_call_site_target_clobbered:
1740           if ((dwarf_version < 4
1741                && (form == DW_FORM_data4 || form == DW_FORM_data8))
1742               || form == DW_FORM_sec_offset)
1743             {
1744               /* Process location list.  */
1745               unsigned int lmax = debug_info_p->max_loc_offsets;
1746               unsigned int num = debug_info_p->num_loc_offsets;
1747
1748               if (lmax == 0 || num >= lmax)
1749                 {
1750                   lmax += 1024;
1751                   debug_info_p->loc_offsets = (dwarf_vma *)
1752                       xcrealloc (debug_info_p->loc_offsets,
1753                                  lmax, sizeof (*debug_info_p->loc_offsets));
1754                   debug_info_p->have_frame_base = (int *)
1755                       xcrealloc (debug_info_p->have_frame_base,
1756                                  lmax, sizeof (*debug_info_p->have_frame_base));
1757                   debug_info_p->max_loc_offsets = lmax;
1758                 }
1759               if (this_set != NULL)
1760                 uvalue += this_set->section_offsets [DW_SECT_LOC];
1761               debug_info_p->loc_offsets [num] = uvalue;
1762               debug_info_p->have_frame_base [num] = have_frame_base;
1763               debug_info_p->num_loc_offsets++;
1764             }
1765           break;
1766
1767         case DW_AT_low_pc:
1768           if (need_base_address)
1769             debug_info_p->base_address = uvalue;
1770           break;
1771
1772         case DW_AT_GNU_addr_base:
1773           debug_info_p->addr_base = uvalue;
1774           break;
1775
1776         case DW_AT_GNU_ranges_base:
1777           debug_info_p->ranges_base = uvalue;
1778           break;
1779
1780         case DW_AT_ranges:
1781           if ((dwarf_version < 4
1782                && (form == DW_FORM_data4 || form == DW_FORM_data8))
1783               || form == DW_FORM_sec_offset)
1784             {
1785               /* Process range list.  */
1786               unsigned int lmax = debug_info_p->max_range_lists;
1787               unsigned int num = debug_info_p->num_range_lists;
1788
1789               if (lmax == 0 || num >= lmax)
1790                 {
1791                   lmax += 1024;
1792                   debug_info_p->range_lists = (dwarf_vma *)
1793                       xcrealloc (debug_info_p->range_lists,
1794                                  lmax, sizeof (*debug_info_p->range_lists));
1795                   debug_info_p->max_range_lists = lmax;
1796                 }
1797               debug_info_p->range_lists [num] = uvalue;
1798               debug_info_p->num_range_lists++;
1799             }
1800           break;
1801
1802         default:
1803           break;
1804         }
1805     }
1806
1807   if (do_loc || attribute == 0)
1808     return data;
1809
1810   /* For some attributes we can display further information.  */
1811   printf ("\t");
1812
1813   switch (attribute)
1814     {
1815     case DW_AT_inline:
1816       switch (uvalue)
1817         {
1818         case DW_INL_not_inlined:
1819           printf (_("(not inlined)"));
1820           break;
1821         case DW_INL_inlined:
1822           printf (_("(inlined)"));
1823           break;
1824         case DW_INL_declared_not_inlined:
1825           printf (_("(declared as inline but ignored)"));
1826           break;
1827         case DW_INL_declared_inlined:
1828           printf (_("(declared as inline and inlined)"));
1829           break;
1830         default:
1831           printf (_("  (Unknown inline attribute value: %s)"),
1832                   dwarf_vmatoa ("x", uvalue));
1833           break;
1834         }
1835       break;
1836
1837     case DW_AT_language:
1838       switch (uvalue)
1839         {
1840           /* Ordered by the numeric value of these constants.  */
1841         case DW_LANG_C89:               printf ("(ANSI C)"); break;
1842         case DW_LANG_C:                 printf ("(non-ANSI C)"); break;
1843         case DW_LANG_Ada83:             printf ("(Ada)"); break;
1844         case DW_LANG_C_plus_plus:       printf ("(C++)"); break;
1845         case DW_LANG_Cobol74:           printf ("(Cobol 74)"); break;
1846         case DW_LANG_Cobol85:           printf ("(Cobol 85)"); break;
1847         case DW_LANG_Fortran77:         printf ("(FORTRAN 77)"); break;
1848         case DW_LANG_Fortran90:         printf ("(Fortran 90)"); break;
1849         case DW_LANG_Pascal83:          printf ("(ANSI Pascal)"); break;
1850         case DW_LANG_Modula2:           printf ("(Modula 2)"); break;
1851           /* DWARF 2.1 values.  */
1852         case DW_LANG_Java:              printf ("(Java)"); break;
1853         case DW_LANG_C99:               printf ("(ANSI C99)"); break;
1854         case DW_LANG_Ada95:             printf ("(ADA 95)"); break;
1855         case DW_LANG_Fortran95:         printf ("(Fortran 95)"); break;
1856           /* DWARF 3 values.  */
1857         case DW_LANG_PLI:               printf ("(PLI)"); break;
1858         case DW_LANG_ObjC:              printf ("(Objective C)"); break;
1859         case DW_LANG_ObjC_plus_plus:    printf ("(Objective C++)"); break;
1860         case DW_LANG_UPC:               printf ("(Unified Parallel C)"); break;
1861         case DW_LANG_D:                 printf ("(D)"); break;
1862           /* DWARF 4 values.  */
1863         case DW_LANG_Python:            printf ("(Python)"); break;
1864           /* DWARF 5 values.  */
1865         case DW_LANG_Go:                printf ("(Go)"); break;
1866           /* MIPS extension.  */
1867         case DW_LANG_Mips_Assembler:    printf ("(MIPS assembler)"); break;
1868           /* UPC extension.  */
1869         case DW_LANG_Upc:               printf ("(Unified Parallel C)"); break;
1870         default:
1871           if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
1872             printf (_("(implementation defined: %s)"),
1873                     dwarf_vmatoa ("x", uvalue));
1874           else
1875             printf (_("(Unknown: %s)"), dwarf_vmatoa ("x", uvalue));
1876           break;
1877         }
1878       break;
1879
1880     case DW_AT_encoding:
1881       switch (uvalue)
1882         {
1883         case DW_ATE_void:               printf ("(void)"); break;
1884         case DW_ATE_address:            printf ("(machine address)"); break;
1885         case DW_ATE_boolean:            printf ("(boolean)"); break;
1886         case DW_ATE_complex_float:      printf ("(complex float)"); break;
1887         case DW_ATE_float:              printf ("(float)"); break;
1888         case DW_ATE_signed:             printf ("(signed)"); break;
1889         case DW_ATE_signed_char:        printf ("(signed char)"); break;
1890         case DW_ATE_unsigned:           printf ("(unsigned)"); break;
1891         case DW_ATE_unsigned_char:      printf ("(unsigned char)"); break;
1892           /* DWARF 2.1 values:  */
1893         case DW_ATE_imaginary_float:    printf ("(imaginary float)"); break;
1894         case DW_ATE_decimal_float:      printf ("(decimal float)"); break;
1895           /* DWARF 3 values:  */
1896         case DW_ATE_packed_decimal:     printf ("(packed_decimal)"); break;
1897         case DW_ATE_numeric_string:     printf ("(numeric_string)"); break;
1898         case DW_ATE_edited:             printf ("(edited)"); break;
1899         case DW_ATE_signed_fixed:       printf ("(signed_fixed)"); break;
1900         case DW_ATE_unsigned_fixed:     printf ("(unsigned_fixed)"); break;
1901           /* HP extensions:  */
1902         case DW_ATE_HP_float80:         printf ("(HP_float80)"); break;
1903         case DW_ATE_HP_complex_float80: printf ("(HP_complex_float80)"); break;
1904         case DW_ATE_HP_float128:        printf ("(HP_float128)"); break;
1905         case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
1906         case DW_ATE_HP_floathpintel:    printf ("(HP_floathpintel)"); break;
1907         case DW_ATE_HP_imaginary_float80:       printf ("(HP_imaginary_float80)"); break;
1908         case DW_ATE_HP_imaginary_float128:      printf ("(HP_imaginary_float128)"); break;
1909
1910         default:
1911           if (uvalue >= DW_ATE_lo_user
1912               && uvalue <= DW_ATE_hi_user)
1913             printf (_("(user defined type)"));
1914           else
1915             printf (_("(unknown type)"));
1916           break;
1917         }
1918       break;
1919
1920     case DW_AT_accessibility:
1921       switch (uvalue)
1922         {
1923         case DW_ACCESS_public:          printf ("(public)"); break;
1924         case DW_ACCESS_protected:       printf ("(protected)"); break;
1925         case DW_ACCESS_private:         printf ("(private)"); break;
1926         default:
1927           printf (_("(unknown accessibility)"));
1928           break;
1929         }
1930       break;
1931
1932     case DW_AT_visibility:
1933       switch (uvalue)
1934         {
1935         case DW_VIS_local:              printf ("(local)"); break;
1936         case DW_VIS_exported:           printf ("(exported)"); break;
1937         case DW_VIS_qualified:          printf ("(qualified)"); break;
1938         default:                        printf (_("(unknown visibility)")); break;
1939         }
1940       break;
1941
1942     case DW_AT_virtuality:
1943       switch (uvalue)
1944         {
1945         case DW_VIRTUALITY_none:        printf ("(none)"); break;
1946         case DW_VIRTUALITY_virtual:     printf ("(virtual)"); break;
1947         case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
1948         default:                        printf (_("(unknown virtuality)")); break;
1949         }
1950       break;
1951
1952     case DW_AT_identifier_case:
1953       switch (uvalue)
1954         {
1955         case DW_ID_case_sensitive:      printf ("(case_sensitive)"); break;
1956         case DW_ID_up_case:             printf ("(up_case)"); break;
1957         case DW_ID_down_case:           printf ("(down_case)"); break;
1958         case DW_ID_case_insensitive:    printf ("(case_insensitive)"); break;
1959         default:                        printf (_("(unknown case)")); break;
1960         }
1961       break;
1962
1963     case DW_AT_calling_convention:
1964       switch (uvalue)
1965         {
1966         case DW_CC_normal:      printf ("(normal)"); break;
1967         case DW_CC_program:     printf ("(program)"); break;
1968         case DW_CC_nocall:      printf ("(nocall)"); break;
1969         default:
1970           if (uvalue >= DW_CC_lo_user
1971               && uvalue <= DW_CC_hi_user)
1972             printf (_("(user defined)"));
1973           else
1974             printf (_("(unknown convention)"));
1975         }
1976       break;
1977
1978     case DW_AT_ordering:
1979       switch (uvalue)
1980         {
1981         case -1: printf (_("(undefined)")); break;
1982         case 0:  printf ("(row major)"); break;
1983         case 1:  printf ("(column major)"); break;
1984         }
1985       break;
1986
1987     case DW_AT_frame_base:
1988       have_frame_base = 1;
1989     case DW_AT_location:
1990     case DW_AT_string_length:
1991     case DW_AT_return_addr:
1992     case DW_AT_data_member_location:
1993     case DW_AT_vtable_elem_location:
1994     case DW_AT_segment:
1995     case DW_AT_static_link:
1996     case DW_AT_use_location:
1997     case DW_AT_GNU_call_site_value:
1998     case DW_AT_GNU_call_site_data_value:
1999     case DW_AT_GNU_call_site_target:
2000     case DW_AT_GNU_call_site_target_clobbered:
2001       if ((dwarf_version < 4
2002            && (form == DW_FORM_data4 || form == DW_FORM_data8))
2003           || form == DW_FORM_sec_offset)
2004         printf (_("(location list)"));
2005       /* Fall through.  */
2006     case DW_AT_allocated:
2007     case DW_AT_associated:
2008     case DW_AT_data_location:
2009     case DW_AT_stride:
2010     case DW_AT_upper_bound:
2011     case DW_AT_lower_bound:
2012       if (block_start)
2013         {
2014           int need_frame_base;
2015
2016           printf ("(");
2017           need_frame_base = decode_location_expression (block_start,
2018                                                         pointer_size,
2019                                                         offset_size,
2020                                                         dwarf_version,
2021                                                         uvalue,
2022                                                         cu_offset, section);
2023           printf (")");
2024           if (need_frame_base && !have_frame_base)
2025             printf (_(" [without DW_AT_frame_base]"));
2026         }
2027       break;
2028
2029     case DW_AT_import:
2030       {
2031         if (form == DW_FORM_ref_sig8
2032             || form == DW_FORM_GNU_ref_alt)
2033           break;
2034
2035         if (form == DW_FORM_ref1
2036             || form == DW_FORM_ref2
2037             || form == DW_FORM_ref4
2038             || form == DW_FORM_ref_udata)
2039           uvalue += cu_offset;
2040
2041         if (uvalue >= section->size)
2042           warn (_("Offset %s used as value for DW_AT_import attribute of DIE at offset %lx is too big.\n"),
2043                 dwarf_vmatoa ("x", uvalue),
2044                 (unsigned long) (orig_data - section->start));
2045         else
2046           {
2047             unsigned long abbrev_number;
2048             abbrev_entry * entry;
2049
2050             abbrev_number = read_uleb128 (section->start + uvalue, NULL, end);
2051
2052             printf (_("[Abbrev Number: %ld"), abbrev_number);
2053             /* Don't look up abbrev for DW_FORM_ref_addr, as it very often will
2054                use different abbrev table, and we don't track .debug_info chunks
2055                yet.  */
2056             if (form != DW_FORM_ref_addr)
2057               {
2058                 for (entry = first_abbrev; entry != NULL; entry = entry->next)
2059                   if (entry->entry == abbrev_number)
2060                     break;
2061                 if (entry != NULL)
2062                   printf (" (%s)", get_TAG_name (entry->tag));
2063               }
2064             printf ("]");
2065           }
2066       }
2067       break;
2068
2069     default:
2070       break;
2071     }
2072
2073   return data;
2074 }
2075
2076 static const char *
2077 get_AT_name (unsigned long attribute)
2078 {
2079   const char *name;
2080
2081   if (attribute == 0)
2082     return "DW_AT value: 0";
2083
2084   /* One value is shared by the MIPS and HP extensions:  */
2085   if (attribute == DW_AT_MIPS_fde)
2086     return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
2087
2088   name = get_DW_AT_name (attribute);
2089
2090   if (name == NULL)
2091     {
2092       static char buffer[100];
2093
2094       snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
2095                 attribute);
2096       return buffer;
2097     }
2098
2099   return name;
2100 }
2101
2102 static unsigned char *
2103 read_and_display_attr (unsigned long attribute,
2104                        unsigned long form,
2105                        unsigned char * data,
2106                        unsigned char * end,
2107                        dwarf_vma cu_offset,
2108                        dwarf_vma pointer_size,
2109                        dwarf_vma offset_size,
2110                        int dwarf_version,
2111                        debug_info * debug_info_p,
2112                        int do_loc,
2113                        struct dwarf_section * section,
2114                        struct cu_tu_set * this_set)
2115 {
2116   if (!do_loc)
2117     printf ("   %-18s:", get_AT_name (attribute));
2118   data = read_and_display_attr_value (attribute, form, data, end,
2119                                       cu_offset, pointer_size, offset_size,
2120                                       dwarf_version, debug_info_p,
2121                                       do_loc, section, this_set);
2122   if (!do_loc)
2123     printf ("\n");
2124   return data;
2125 }
2126
2127 /* Process the contents of a .debug_info section.  If do_loc is non-zero
2128    then we are scanning for location lists and we do not want to display
2129    anything to the user.  If do_types is non-zero, we are processing
2130    a .debug_types section instead of a .debug_info section.  */
2131
2132 static int
2133 process_debug_info (struct dwarf_section *section,
2134                     void *file,
2135                     enum dwarf_section_display_enum abbrev_sec,
2136                     int do_loc,
2137                     int do_types)
2138 {
2139   unsigned char *start = section->start;
2140   unsigned char *end = start + section->size;
2141   unsigned char *section_begin;
2142   unsigned int unit;
2143   unsigned int num_units = 0;
2144
2145   if ((do_loc || do_debug_loc || do_debug_ranges)
2146       && num_debug_info_entries == 0
2147       && ! do_types)
2148     {
2149       dwarf_vma length;
2150
2151       /* First scan the section to get the number of comp units.  */
2152       for (section_begin = start, num_units = 0; section_begin < end;
2153            num_units ++)
2154         {
2155           /* Read the first 4 bytes.  For a 32-bit DWARF section, this
2156              will be the length.  For a 64-bit DWARF section, it'll be
2157              the escape code 0xffffffff followed by an 8 byte length.  */
2158           SAFE_BYTE_GET (length, section_begin, 4, end);
2159
2160           if (length == 0xffffffff)
2161             {
2162               SAFE_BYTE_GET (length, section_begin + 4, 8, end);
2163               section_begin += length + 12;
2164             }
2165           else if (length >= 0xfffffff0 && length < 0xffffffff)
2166             {
2167               warn (_("Reserved length value (0x%s) found in section %s\n"),
2168                     dwarf_vmatoa ("x", length), section->name);
2169               return 0;
2170             }
2171           else
2172             section_begin += length + 4;
2173
2174           /* Negative values are illegal, they may even cause infinite
2175              looping.  This can happen if we can't accurately apply
2176              relocations to an object file.  */
2177           if ((signed long) length <= 0)
2178             {
2179               warn (_("Corrupt unit length (0x%s) found in section %s\n"),
2180                     dwarf_vmatoa ("x", length), section->name);
2181               return 0;
2182             }
2183         }
2184
2185       if (num_units == 0)
2186         {
2187           error (_("No comp units in %s section ?"), section->name);
2188           return 0;
2189         }
2190
2191       /* Then allocate an array to hold the information.  */
2192       debug_information = (debug_info *) cmalloc (num_units,
2193                                                   sizeof (* debug_information));
2194       if (debug_information == NULL)
2195         {
2196           error (_("Not enough memory for a debug info array of %u entries"),
2197                  num_units);
2198           return 0;
2199         }
2200     }
2201
2202   if (!do_loc)
2203     {
2204       if (dwarf_start_die == 0)
2205         printf (_("Contents of the %s section:\n\n"), section->name);
2206
2207       load_debug_section (str, file);
2208       load_debug_section (str_dwo, file);
2209       load_debug_section (str_index, file);
2210       load_debug_section (str_index_dwo, file);
2211       load_debug_section (debug_addr, file);
2212     }
2213
2214   load_debug_section (abbrev_sec, file);
2215   if (debug_displays [abbrev_sec].section.start == NULL)
2216     {
2217       warn (_("Unable to locate %s section!\n"),
2218             debug_displays [abbrev_sec].section.name);
2219       return 0;
2220     }
2221
2222   for (section_begin = start, unit = 0; start < end; unit++)
2223     {
2224       DWARF2_Internal_CompUnit compunit;
2225       unsigned char *hdrptr;
2226       unsigned char *tags;
2227       int level, last_level, saved_level;
2228       dwarf_vma cu_offset;
2229       unsigned int offset_size;
2230       int initial_length_size;
2231       dwarf_vma signature_high = 0;
2232       dwarf_vma signature_low = 0;
2233       dwarf_vma type_offset = 0;
2234       struct cu_tu_set *this_set;
2235       dwarf_vma abbrev_base;
2236       size_t abbrev_size;
2237
2238       hdrptr = start;
2239
2240       SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 4, end);
2241
2242       if (compunit.cu_length == 0xffffffff)
2243         {
2244           SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 8, end);
2245           offset_size = 8;
2246           initial_length_size = 12;
2247         }
2248       else
2249         {
2250           offset_size = 4;
2251           initial_length_size = 4;
2252         }
2253
2254       SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end);
2255
2256       cu_offset = start - section_begin;
2257
2258       this_set = find_cu_tu_set_v2 (cu_offset, do_types);
2259
2260       SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
2261
2262       if (this_set == NULL)
2263         {
2264           abbrev_base = 0;
2265           abbrev_size = debug_displays [abbrev_sec].section.size;
2266         }
2267       else
2268         {
2269           abbrev_base = this_set->section_offsets [DW_SECT_ABBREV];
2270           abbrev_size = this_set->section_sizes [DW_SECT_ABBREV];
2271         }
2272
2273       SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
2274
2275       if (do_types)
2276         {
2277           SAFE_BYTE_GET64 (hdrptr, &signature_high, &signature_low, end);
2278           hdrptr += 8;
2279           SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end);
2280         }
2281
2282       if ((do_loc || do_debug_loc || do_debug_ranges)
2283           && num_debug_info_entries == 0
2284           && ! do_types)
2285         {
2286           debug_information [unit].cu_offset = cu_offset;
2287           debug_information [unit].pointer_size
2288             = compunit.cu_pointer_size;
2289           debug_information [unit].offset_size = offset_size;
2290           debug_information [unit].dwarf_version = compunit.cu_version;
2291           debug_information [unit].base_address = 0;
2292           debug_information [unit].addr_base = DEBUG_INFO_UNAVAILABLE;
2293           debug_information [unit].ranges_base = DEBUG_INFO_UNAVAILABLE;
2294           debug_information [unit].loc_offsets = NULL;
2295           debug_information [unit].have_frame_base = NULL;
2296           debug_information [unit].max_loc_offsets = 0;
2297           debug_information [unit].num_loc_offsets = 0;
2298           debug_information [unit].range_lists = NULL;
2299           debug_information [unit].max_range_lists= 0;
2300           debug_information [unit].num_range_lists = 0;
2301         }
2302
2303       if (!do_loc && dwarf_start_die == 0)
2304         {
2305           printf (_("  Compilation Unit @ offset 0x%s:\n"),
2306                   dwarf_vmatoa ("x", cu_offset));
2307           printf (_("   Length:        0x%s (%s)\n"),
2308                   dwarf_vmatoa ("x", compunit.cu_length),
2309                   offset_size == 8 ? "64-bit" : "32-bit");
2310           printf (_("   Version:       %d\n"), compunit.cu_version);
2311           printf (_("   Abbrev Offset: 0x%s\n"),
2312                   dwarf_vmatoa ("x", compunit.cu_abbrev_offset));
2313           printf (_("   Pointer Size:  %d\n"), compunit.cu_pointer_size);
2314           if (do_types)
2315             {
2316               char buf[64];
2317
2318               printf (_("   Signature:     0x%s\n"),
2319                       dwarf_vmatoa64 (signature_high, signature_low,
2320                                       buf, sizeof (buf)));
2321               printf (_("   Type Offset:   0x%s\n"),
2322                       dwarf_vmatoa ("x", type_offset));
2323             }
2324           if (this_set != NULL)
2325             {
2326               dwarf_vma *offsets = this_set->section_offsets;
2327               size_t *sizes = this_set->section_sizes;
2328
2329               printf (_("   Section contributions:\n"));
2330               printf (_("    .debug_abbrev.dwo:       0x%s  0x%s\n"),
2331                       dwarf_vmatoa ("x", offsets [DW_SECT_ABBREV]),
2332                       dwarf_vmatoa ("x", sizes [DW_SECT_ABBREV]));
2333               printf (_("    .debug_line.dwo:         0x%s  0x%s\n"),
2334                       dwarf_vmatoa ("x", offsets [DW_SECT_LINE]),
2335                       dwarf_vmatoa ("x", sizes [DW_SECT_LINE]));
2336               printf (_("    .debug_loc.dwo:          0x%s  0x%s\n"),
2337                       dwarf_vmatoa ("x", offsets [DW_SECT_LOC]),
2338                       dwarf_vmatoa ("x", sizes [DW_SECT_LOC]));
2339               printf (_("    .debug_str_offsets.dwo:  0x%s  0x%s\n"),
2340                       dwarf_vmatoa ("x", offsets [DW_SECT_STR_OFFSETS]),
2341                       dwarf_vmatoa ("x", sizes [DW_SECT_STR_OFFSETS]));
2342             }
2343         }
2344
2345       if (cu_offset + compunit.cu_length + initial_length_size
2346           > section->size)
2347         {
2348           warn (_("Debug info is corrupted, length of CU at %s"
2349                   " extends beyond end of section (length = %s)\n"),
2350                 dwarf_vmatoa ("x", cu_offset),
2351                 dwarf_vmatoa ("x", compunit.cu_length));
2352           break;
2353         }
2354       tags = hdrptr;
2355       start += compunit.cu_length + initial_length_size;
2356
2357       if (compunit.cu_version != 2
2358           && compunit.cu_version != 3
2359           && compunit.cu_version != 4)
2360         {
2361           warn (_("CU at offset %s contains corrupt or "
2362                   "unsupported version number: %d.\n"),
2363                 dwarf_vmatoa ("x", cu_offset), compunit.cu_version);
2364           continue;
2365         }
2366
2367       free_abbrevs ();
2368
2369       /* Process the abbrevs used by this compilation unit. DWARF
2370          sections under Mach-O have non-zero addresses.  */
2371       if (compunit.cu_abbrev_offset >= abbrev_size)
2372         warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"),
2373               (unsigned long) compunit.cu_abbrev_offset,
2374               (unsigned long) abbrev_size);
2375       else
2376         process_abbrev_section
2377           (((unsigned char *) debug_displays [abbrev_sec].section.start
2378             + abbrev_base + compunit.cu_abbrev_offset),
2379            ((unsigned char *) debug_displays [abbrev_sec].section.start
2380             + abbrev_base + abbrev_size));
2381
2382       level = 0;
2383       last_level = level;
2384       saved_level = -1;
2385       while (tags < start)
2386         {
2387           unsigned int bytes_read;
2388           unsigned long abbrev_number;
2389           unsigned long die_offset;
2390           abbrev_entry *entry;
2391           abbrev_attr *attr;
2392           int do_printing = 1;
2393
2394           die_offset = tags - section_begin;
2395
2396           abbrev_number = read_uleb128 (tags, & bytes_read, start);
2397           tags += bytes_read;
2398
2399           /* A null DIE marks the end of a list of siblings or it may also be
2400              a section padding.  */
2401           if (abbrev_number == 0)
2402             {
2403               /* Check if it can be a section padding for the last CU.  */
2404               if (level == 0 && start == end)
2405                 {
2406                   unsigned char *chk;
2407
2408                   for (chk = tags; chk < start; chk++)
2409                     if (*chk != 0)
2410                       break;
2411                   if (chk == start)
2412                     break;
2413                 }
2414
2415               if (!do_loc && die_offset >= dwarf_start_die
2416                   && (dwarf_cutoff_level == -1
2417                       || level < dwarf_cutoff_level))
2418                 printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
2419                         level, die_offset);
2420
2421               --level;
2422               if (level < 0)
2423                 {
2424                   static unsigned num_bogus_warns = 0;
2425
2426                   if (num_bogus_warns < 3)
2427                     {
2428                       warn (_("Bogus end-of-siblings marker detected at offset %lx in %s section\n"),
2429                             die_offset, section->name);
2430                       num_bogus_warns ++;
2431                       if (num_bogus_warns == 3)
2432                         warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
2433                     }
2434                 }
2435               if (dwarf_start_die != 0 && level < saved_level)
2436                 return 1;
2437               continue;
2438             }
2439
2440           if (!do_loc)
2441             {
2442               if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
2443                 do_printing = 0;
2444               else
2445                 {
2446                   if (dwarf_start_die != 0 && die_offset == dwarf_start_die)
2447                     saved_level = level;
2448                   do_printing = (dwarf_cutoff_level == -1
2449                                  || level < dwarf_cutoff_level);
2450                   if (do_printing)
2451                     printf (_(" <%d><%lx>: Abbrev Number: %lu"),
2452                             level, die_offset, abbrev_number);
2453                   else if (dwarf_cutoff_level == -1
2454                            || last_level < dwarf_cutoff_level)
2455                     printf (_(" <%d><%lx>: ...\n"), level, die_offset);
2456                   last_level = level;
2457                 }
2458             }
2459
2460           /* Scan through the abbreviation list until we reach the
2461              correct entry.  */
2462           for (entry = first_abbrev;
2463                entry && entry->entry != abbrev_number;
2464                entry = entry->next)
2465             continue;
2466
2467           if (entry == NULL)
2468             {
2469               if (!do_loc && do_printing)
2470                 {
2471                   printf ("\n");
2472                   fflush (stdout);
2473                 }
2474               warn (_("DIE at offset %lx refers to abbreviation number %lu which does not exist\n"),
2475                     die_offset, abbrev_number);
2476               return 0;
2477             }
2478
2479           if (!do_loc && do_printing)
2480             printf (" (%s)\n", get_TAG_name (entry->tag));
2481
2482           switch (entry->tag)
2483             {
2484             default:
2485               need_base_address = 0;
2486               break;
2487             case DW_TAG_compile_unit:
2488               need_base_address = 1;
2489               break;
2490             case DW_TAG_entry_point:
2491             case DW_TAG_subprogram:
2492               need_base_address = 0;
2493               /* Assuming that there is no DW_AT_frame_base.  */
2494               have_frame_base = 0;
2495               break;
2496             }
2497
2498           for (attr = entry->first_attr;
2499                attr && attr->attribute;
2500                attr = attr->next)
2501             {
2502               debug_info *arg;
2503
2504               if (! do_loc && do_printing)
2505                 /* Show the offset from where the tag was extracted.  */
2506                 printf ("    <%lx>", (unsigned long)(tags - section_begin));
2507
2508               arg = debug_information;
2509               if (debug_information)
2510                 arg += unit;
2511
2512               tags = read_and_display_attr (attr->attribute,
2513                                             attr->form,
2514                                             tags,
2515                                             end,
2516                                             cu_offset,
2517                                             compunit.cu_pointer_size,
2518                                             offset_size,
2519                                             compunit.cu_version,
2520                                             arg,
2521                                             do_loc || ! do_printing,
2522                                             section,
2523                                             this_set);
2524             }
2525
2526           if (entry->children)
2527             ++level;
2528         }
2529     }
2530
2531   /* Set num_debug_info_entries here so that it can be used to check if
2532      we need to process .debug_loc and .debug_ranges sections.  */
2533   if ((do_loc || do_debug_loc || do_debug_ranges)
2534       && num_debug_info_entries == 0
2535       && ! do_types)
2536     num_debug_info_entries = num_units;
2537
2538   if (!do_loc)
2539     printf ("\n");
2540
2541   return 1;
2542 }
2543
2544 /* Locate and scan the .debug_info section in the file and record the pointer
2545    sizes and offsets for the compilation units in it.  Usually an executable
2546    will have just one pointer size, but this is not guaranteed, and so we try
2547    not to make any assumptions.  Returns zero upon failure, or the number of
2548    compilation units upon success.  */
2549
2550 static unsigned int
2551 load_debug_info (void * file)
2552 {
2553   /* Reset the last pointer size so that we can issue correct error
2554      messages if we are displaying the contents of more than one section.  */
2555   last_pointer_size = 0;
2556   warned_about_missing_comp_units = FALSE;
2557
2558   /* If we have already tried and failed to load the .debug_info
2559      section then do not bother to repeat the task.  */
2560   if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
2561     return 0;
2562
2563   /* If we already have the information there is nothing else to do.  */
2564   if (num_debug_info_entries > 0)
2565     return num_debug_info_entries;
2566
2567   /* If this is a DWARF package file, load the CU and TU indexes.  */
2568   load_cu_tu_indexes (file);
2569
2570   if (load_debug_section (info, file)
2571       && process_debug_info (&debug_displays [info].section, file, abbrev, 1, 0))
2572     return num_debug_info_entries;
2573   else if (load_debug_section (info_dwo, file)
2574            && process_debug_info (&debug_displays [info_dwo].section, file,
2575                                   abbrev_dwo, 1, 0))
2576     return num_debug_info_entries;
2577
2578   num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
2579   return 0;
2580 }
2581
2582 /* Read a DWARF .debug_line section header starting at DATA.
2583    Upon success returns an updated DATA pointer and the LINFO
2584    structure and the END_OF_SEQUENCE pointer will be filled in.
2585    Otherwise returns NULL.  */
2586
2587 static unsigned char *
2588 read_debug_line_header (struct dwarf_section * section,
2589                         unsigned char * data,
2590                         unsigned char * end,
2591                         DWARF2_Internal_LineInfo * linfo,
2592                         unsigned char ** end_of_sequence)
2593 {
2594   unsigned char *hdrptr;
2595   unsigned int offset_size;
2596   unsigned int initial_length_size;
2597
2598   /* Extract information from the Line Number Program Header.
2599      (section 6.2.4 in the Dwarf3 doc).  */
2600       hdrptr = data;
2601
2602   /* Get and check the length of the block.  */
2603   SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 4, end);
2604
2605   if (linfo->li_length == 0xffffffff)
2606         {
2607           /* This section is 64-bit DWARF 3.  */
2608       SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 8, end);
2609           offset_size = 8;
2610           initial_length_size = 12;
2611         }
2612       else
2613         {
2614           offset_size = 4;
2615           initial_length_size = 4;
2616         }
2617
2618   if (linfo->li_length + initial_length_size > section->size)
2619         {
2620       /* If the length is just a bias against the initial_length_size then
2621          this means that the field has a relocation against it which has not
2622          been applied.  (Ie we are dealing with an object file, not a linked
2623          binary).  Do not complain but instead assume that the rest of the
2624          section applies to this particular header.  */
2625       if (linfo->li_length == - initial_length_size)
2626         {
2627           linfo->li_length = section->size - initial_length_size;
2628         }
2629       else
2630         {
2631           warn (_("The line info appears to be corrupt - "
2632                   "the section is too small\n"));
2633           return NULL;
2634         }
2635         }
2636
2637   /* Get and check the version number.  */
2638   SAFE_BYTE_GET_AND_INC (linfo->li_version, hdrptr, 2, end);
2639
2640   if (linfo->li_version != 2
2641       && linfo->li_version != 3
2642       && linfo->li_version != 4)
2643         {
2644           warn (_("Only DWARF version 2, 3 and 4 line info is currently supported.\n"));
2645       return NULL;
2646         }
2647
2648   SAFE_BYTE_GET_AND_INC (linfo->li_prologue_length, hdrptr, offset_size, end);
2649   SAFE_BYTE_GET_AND_INC (linfo->li_min_insn_length, hdrptr, 1, end);
2650
2651   if (linfo->li_version >= 4)
2652         {
2653       SAFE_BYTE_GET_AND_INC (linfo->li_max_ops_per_insn, hdrptr, 1, end);
2654
2655       if (linfo->li_max_ops_per_insn == 0)
2656             {
2657               warn (_("Invalid maximum operations per insn.\n"));
2658           return NULL;
2659             }
2660         }
2661       else
2662     linfo->li_max_ops_per_insn = 1;
2663
2664   SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end);
2665   SAFE_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
2666   SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end);
2667   SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end);
2668
2669       /* Sign extend the line base field.  */
2670   linfo->li_line_base <<= 24;
2671   linfo->li_line_base >>= 24;
2672
2673   * end_of_sequence = data + linfo->li_length + initial_length_size;
2674   return hdrptr;
2675 }
2676
2677 static int
2678 display_debug_lines_raw (struct dwarf_section *section,
2679                          unsigned char *data,
2680                          unsigned char *end)
2681 {
2682   unsigned char *start = section->start;
2683
2684   printf (_("Raw dump of debug contents of section %s:\n\n"),
2685           section->name);
2686
2687   while (data < end)
2688     {
2689       static DWARF2_Internal_LineInfo saved_linfo;
2690       DWARF2_Internal_LineInfo linfo;
2691       unsigned char *standard_opcodes;
2692       unsigned char *end_of_sequence;
2693       unsigned int last_dir_entry = 0;
2694       int i;
2695
2696       if (const_strneq (section->name, ".debug_line.")
2697           /* Note: the following does not apply to .debug_line.dwo sections.
2698              These are full debug_line sections.  */
2699           && strcmp (section->name, ".debug_line.dwo") != 0)
2700         {
2701           /* Sections named .debug_line.<foo> are fragments of a .debug_line
2702              section containing just the Line Number Statements.  They are
2703              created by the assembler and intended to be used alongside gcc's
2704              -ffunction-sections command line option.  When the linker's
2705              garbage collection decides to discard a .text.<foo> section it
2706              can then also discard the line number information in .debug_line.<foo>.
2707
2708              Since the section is a fragment it does not have the details
2709              needed to fill out a LineInfo structure, so instead we use the
2710              details from the last full debug_line section that we processed.  */
2711           end_of_sequence = end;
2712           standard_opcodes = NULL;
2713           linfo = saved_linfo;
2714           reset_state_machine (linfo.li_default_is_stmt);
2715         }
2716       else
2717         {
2718           unsigned char * hdrptr;
2719
2720           if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
2721                                                 & end_of_sequence)) == NULL)
2722             return 0;
2723
2724           printf (_("  Offset:                      0x%lx\n"), (long)(data - start));
2725           printf (_("  Length:                      %ld\n"), (long) linfo.li_length);
2726           printf (_("  DWARF Version:               %d\n"), linfo.li_version);
2727           printf (_("  Prologue Length:             %d\n"), linfo.li_prologue_length);
2728           printf (_("  Minimum Instruction Length:  %d\n"), linfo.li_min_insn_length);
2729           if (linfo.li_version >= 4)
2730             printf (_("  Maximum Ops per Instruction: %d\n"), linfo.li_max_ops_per_insn);
2731           printf (_("  Initial value of 'is_stmt':  %d\n"), linfo.li_default_is_stmt);
2732           printf (_("  Line Base:                   %d\n"), linfo.li_line_base);
2733           printf (_("  Line Range:                  %d\n"), linfo.li_line_range);
2734           printf (_("  Opcode Base:                 %d\n"), linfo.li_opcode_base);
2735
2736           reset_state_machine (linfo.li_default_is_stmt);
2737
2738           /* Display the contents of the Opcodes table.  */
2739           standard_opcodes = hdrptr;
2740
2741           printf (_("\n Opcodes:\n"));
2742
2743           for (i = 1; i < linfo.li_opcode_base; i++)
2744             printf (_("  Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
2745
2746           /* Display the contents of the Directory table.  */
2747           data = standard_opcodes + linfo.li_opcode_base - 1;
2748
2749           if (*data == 0)
2750             printf (_("\n The Directory Table is empty.\n"));
2751           else
2752             {
2753               printf (_("\n The Directory Table (offset 0x%lx):\n"),
2754                       (long)(data - start));
2755
2756               while (*data != 0)
2757                 {
2758                   printf ("  %d\t%s\n", ++last_dir_entry, data);
2759
2760                   data += strnlen ((char *) data, end - data) + 1;
2761                 }
2762             }
2763
2764           /* Skip the NUL at the end of the table.  */
2765           data++;
2766
2767           /* Display the contents of the File Name table.  */
2768           if (*data == 0)
2769             printf (_("\n The File Name Table is empty.\n"));
2770           else
2771             {
2772               printf (_("\n The File Name Table (offset 0x%lx):\n"),
2773                       (long)(data - start));
2774               printf (_("  Entry\tDir\tTime\tSize\tName\n"));
2775
2776               while (*data != 0)
2777                 {
2778                   unsigned char *name;
2779                   unsigned int bytes_read;
2780
2781                   printf ("  %d\t", ++state_machine_regs.last_file_entry);
2782                   name = data;
2783                   data += strnlen ((char *) data, end - data) + 1;
2784
2785                   printf ("%s\t",
2786                           dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2787                   data += bytes_read;
2788                   printf ("%s\t",
2789                           dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2790                   data += bytes_read;
2791                   printf ("%s\t",
2792                           dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end)));
2793                   data += bytes_read;
2794                   printf ("%s\n", name);
2795
2796                   if (data == end)
2797                     {
2798                       warn (_("Corrupt file name table entry\n"));
2799                       break;
2800                     }
2801                 }
2802             }
2803
2804           /* Skip the NUL at the end of the table.  */
2805           data++;
2806           putchar ('\n');
2807           saved_linfo = linfo;
2808         }
2809
2810       /* Now display the statements.  */
2811       if (data >= end_of_sequence)
2812         printf (_(" No Line Number Statements.\n"));
2813       else
2814         {
2815           printf (_(" Line Number Statements:\n"));
2816
2817           while (data < end_of_sequence)
2818             {
2819               unsigned char op_code;
2820               dwarf_signed_vma adv;
2821               dwarf_vma uladv;
2822               unsigned int bytes_read;
2823
2824               printf ("  [0x%08lx]", (long)(data - start));
2825
2826               op_code = *data++;
2827
2828               if (op_code >= linfo.li_opcode_base)
2829                 {
2830                   op_code -= linfo.li_opcode_base;
2831                   uladv = (op_code / linfo.li_line_range);
2832                   if (linfo.li_max_ops_per_insn == 1)
2833                     {
2834                       uladv *= linfo.li_min_insn_length;
2835                       state_machine_regs.address += uladv;
2836                       printf (_("  Special opcode %d: "
2837                                 "advance Address by %s to 0x%s"),
2838                               op_code, dwarf_vmatoa ("u", uladv),
2839                               dwarf_vmatoa ("x", state_machine_regs.address));
2840                     }
2841                   else
2842                     {
2843                       state_machine_regs.address
2844                         += ((state_machine_regs.op_index + uladv)
2845                             / linfo.li_max_ops_per_insn)
2846                         * linfo.li_min_insn_length;
2847                       state_machine_regs.op_index
2848                         = (state_machine_regs.op_index + uladv)
2849                         % linfo.li_max_ops_per_insn;
2850                       printf (_("  Special opcode %d: "
2851                                 "advance Address by %s to 0x%s[%d]"),
2852                               op_code, dwarf_vmatoa ("u", uladv),
2853                               dwarf_vmatoa ("x", state_machine_regs.address),
2854                               state_machine_regs.op_index);
2855                     }
2856                   adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
2857                   state_machine_regs.line += adv;
2858                   printf (_(" and Line by %s to %d\n"),
2859                           dwarf_vmatoa ("d", adv), state_machine_regs.line);
2860                 }
2861               else switch (op_code)
2862                      {
2863                      case DW_LNS_extended_op:
2864                        data += process_extended_line_op (data, linfo.li_default_is_stmt, end);
2865                        break;
2866
2867                      case DW_LNS_copy:
2868                        printf (_("  Copy\n"));
2869                        break;
2870
2871                      case DW_LNS_advance_pc:
2872                        uladv = read_uleb128 (data, & bytes_read, end);
2873                        data += bytes_read;
2874                        if (linfo.li_max_ops_per_insn == 1)
2875                          {
2876                            uladv *= linfo.li_min_insn_length;
2877                            state_machine_regs.address += uladv;
2878                            printf (_("  Advance PC by %s to 0x%s\n"),
2879                                    dwarf_vmatoa ("u", uladv),
2880                                    dwarf_vmatoa ("x", state_machine_regs.address));
2881                          }
2882                        else
2883                          {
2884                            state_machine_regs.address
2885                              += ((state_machine_regs.op_index + uladv)
2886                                  / linfo.li_max_ops_per_insn)
2887                              * linfo.li_min_insn_length;
2888                            state_machine_regs.op_index
2889                              = (state_machine_regs.op_index + uladv)
2890                              % linfo.li_max_ops_per_insn;
2891                            printf (_("  Advance PC by %s to 0x%s[%d]\n"),
2892                                    dwarf_vmatoa ("u", uladv),
2893                                    dwarf_vmatoa ("x", state_machine_regs.address),
2894                                    state_machine_regs.op_index);
2895                          }
2896                        break;
2897
2898                      case DW_LNS_advance_line:
2899                        adv = read_sleb128 (data, & bytes_read, end);
2900                        data += bytes_read;
2901                        state_machine_regs.line += adv;
2902                        printf (_("  Advance Line by %s to %d\n"),
2903                                dwarf_vmatoa ("d", adv),
2904                                state_machine_regs.line);
2905                        break;
2906
2907                      case DW_LNS_set_file:
2908                        adv = read_uleb128 (data, & bytes_read, end);
2909                        data += bytes_read;
2910                        printf (_("  Set File Name to entry %s in the File Name Table\n"),
2911                                dwarf_vmatoa ("d", adv));
2912                        state_machine_regs.file = adv;
2913                        break;
2914
2915                      case DW_LNS_set_column:
2916                        uladv = read_uleb128 (data, & bytes_read, end);
2917                        data += bytes_read;
2918                        printf (_("  Set column to %s\n"),
2919                                dwarf_vmatoa ("u", uladv));
2920                        state_machine_regs.column = uladv;
2921                        break;
2922
2923                      case DW_LNS_negate_stmt:
2924                        adv = state_machine_regs.is_stmt;
2925                        adv = ! adv;
2926                        printf (_("  Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv));
2927                        state_machine_regs.is_stmt = adv;
2928                        break;
2929
2930                      case DW_LNS_set_basic_block:
2931                        printf (_("  Set basic block\n"));
2932                        state_machine_regs.basic_block = 1;
2933                        break;
2934
2935                      case DW_LNS_const_add_pc:
2936                        uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
2937                        if (linfo.li_max_ops_per_insn)
2938                          {
2939                            uladv *= linfo.li_min_insn_length;
2940                            state_machine_regs.address += uladv;
2941                            printf (_("  Advance PC by constant %s to 0x%s\n"),
2942                                    dwarf_vmatoa ("u", uladv),
2943                                    dwarf_vmatoa ("x", state_machine_regs.address));
2944                          }
2945                        else
2946                          {
2947                            state_machine_regs.address
2948                              += ((state_machine_regs.op_index + uladv)
2949                                  / linfo.li_max_ops_per_insn)
2950                              * linfo.li_min_insn_length;
2951                            state_machine_regs.op_index
2952                              = (state_machine_regs.op_index + uladv)
2953                              % linfo.li_max_ops_per_insn;
2954                            printf (_("  Advance PC by constant %s to 0x%s[%d]\n"),
2955                                    dwarf_vmatoa ("u", uladv),
2956                                    dwarf_vmatoa ("x", state_machine_regs.address),
2957                                    state_machine_regs.op_index);
2958                          }
2959                        break;
2960
2961                      case DW_LNS_fixed_advance_pc:
2962                        SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
2963                        state_machine_regs.address += uladv;
2964                        state_machine_regs.op_index = 0;
2965                        printf (_("  Advance PC by fixed size amount %s to 0x%s\n"),
2966                                dwarf_vmatoa ("u", uladv),
2967                                dwarf_vmatoa ("x", state_machine_regs.address));
2968                        break;
2969
2970                      case DW_LNS_set_prologue_end:
2971                        printf (_("  Set prologue_end to true\n"));
2972                        break;
2973
2974                      case DW_LNS_set_epilogue_begin:
2975                        printf (_("  Set epilogue_begin to true\n"));
2976                        break;
2977
2978                      case DW_LNS_set_isa:
2979                        uladv = read_uleb128 (data, & bytes_read, end);
2980                        data += bytes_read;
2981                        printf (_("  Set ISA to %s\n"), dwarf_vmatoa ("u", uladv));
2982                        break;
2983
2984                      default:
2985                        printf (_("  Unknown opcode %d with operands: "), op_code);
2986
2987                        if (standard_opcodes != NULL)
2988                          for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
2989                            {
2990                              printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
2991                                                                                 &bytes_read, end)),
2992                                      i == 1 ? "" : ", ");
2993                              data += bytes_read;
2994                            }
2995                        putchar ('\n');
2996                        break;
2997                      }
2998             }
2999           putchar ('\n');
3000         }
3001     }
3002
3003   return 1;
3004 }
3005
3006 typedef struct
3007 {
3008   unsigned char *name;
3009   unsigned int directory_index;
3010   unsigned int modification_date;
3011   unsigned int length;
3012 } File_Entry;
3013
3014 /* Output a decoded representation of the .debug_line section.  */
3015
3016 static int
3017 display_debug_lines_decoded (struct dwarf_section *section,
3018                              unsigned char *data,
3019                              unsigned char *end)
3020 {
3021   static DWARF2_Internal_LineInfo saved_linfo;
3022
3023   printf (_("Decoded dump of debug contents of section %s:\n\n"),
3024           section->name);
3025
3026   while (data < end)
3027     {
3028       /* This loop amounts to one iteration per compilation unit.  */
3029       DWARF2_Internal_LineInfo linfo;
3030       unsigned char *standard_opcodes;
3031       unsigned char *end_of_sequence;
3032       int i;
3033       File_Entry *file_table = NULL;
3034       unsigned int n_files = 0;
3035       unsigned char **directory_table = NULL;
3036       unsigned int n_directories = 0;
3037
3038       if (const_strneq (section->name, ".debug_line.")
3039           /* Note: the following does not apply to .debug_line.dwo sections.
3040              These are full debug_line sections.  */
3041           && strcmp (section->name, ".debug_line.dwo") != 0)
3042         {
3043           /* See comment in display_debug_lines_raw().  */
3044           end_of_sequence = end;
3045           standard_opcodes = NULL;
3046           linfo = saved_linfo;
3047           reset_state_machine (linfo.li_default_is_stmt);
3048         }
3049       else
3050         {
3051           unsigned char *hdrptr;
3052
3053           if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
3054                                                 & end_of_sequence)) == NULL)
3055               return 0;
3056
3057           reset_state_machine (linfo.li_default_is_stmt);
3058
3059           /* Save a pointer to the contents of the Opcodes table.  */
3060           standard_opcodes = hdrptr;
3061
3062           /* Traverse the Directory table just to count entries.  */
3063           data = standard_opcodes + linfo.li_opcode_base - 1;
3064           if (*data != 0)
3065             {
3066               unsigned char *ptr_directory_table = data;
3067
3068               while (*data != 0)
3069                 {
3070                   data += strnlen ((char *) data, end - data) + 1;
3071                   n_directories++;
3072                 }
3073
3074               /* Go through the directory table again to save the directories.  */
3075               directory_table = (unsigned char **)
3076                 xmalloc (n_directories * sizeof (unsigned char *));
3077
3078               i = 0;
3079               while (*ptr_directory_table != 0)
3080                 {
3081                   directory_table[i] = ptr_directory_table;
3082                   ptr_directory_table += strnlen ((char *) ptr_directory_table,
3083                                                   ptr_directory_table - end) + 1;
3084                   i++;
3085                 }
3086             }
3087           /* Skip the NUL at the end of the table.  */
3088           data++;
3089
3090           /* Traverse the File Name table just to count the entries.  */
3091           if (*data != 0)
3092             {
3093               unsigned char *ptr_file_name_table = data;
3094
3095               while (*data != 0)
3096                 {
3097                   unsigned int bytes_read;
3098
3099                   /* Skip Name, directory index, last modification time and length
3100                      of file.  */
3101                   data += strnlen ((char *) data, end - data) + 1;
3102                   read_uleb128 (data, & bytes_read, end);
3103                   data += bytes_read;
3104                   read_uleb128 (data, & bytes_read, end);
3105                   data += bytes_read;
3106                   read_uleb128 (data, & bytes_read, end);
3107                   data += bytes_read;
3108
3109                   n_files++;
3110                 }
3111
3112               /* Go through the file table again to save the strings.  */
3113               file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
3114
3115               i = 0;
3116               while (*ptr_file_name_table != 0)
3117                 {
3118                   unsigned int bytes_read;
3119
3120                   file_table[i].name = ptr_file_name_table;
3121                   ptr_file_name_table += strnlen ((char *) ptr_file_name_table,
3122                                                   end - ptr_file_name_table) + 1;
3123
3124                   /* We are not interested in directory, time or size.  */
3125                   file_table[i].directory_index = read_uleb128 (ptr_file_name_table,
3126                                                                 & bytes_read, end);
3127                   ptr_file_name_table += bytes_read;
3128                   file_table[i].modification_date = read_uleb128 (ptr_file_name_table,
3129                                                                   & bytes_read, end);
3130                   ptr_file_name_table += bytes_read;
3131                   file_table[i].length = read_uleb128 (ptr_file_name_table, & bytes_read, end);
3132                   ptr_file_name_table += bytes_read;
3133                   i++;
3134                 }
3135               i = 0;
3136
3137               /* Print the Compilation Unit's name and a header.  */
3138               if (directory_table == NULL)
3139                 {
3140                   printf (_("CU: %s:\n"), file_table[0].name);
3141                   printf (_("File name                            Line number    Starting address\n"));
3142                 }
3143               else
3144                 {
3145                   unsigned int ix = file_table[0].directory_index;
3146                   const char *directory = ix ? (char *)directory_table[ix - 1] : ".";
3147
3148                   if (do_wide || strlen (directory) < 76)
3149                     printf (_("CU: %s/%s:\n"), directory, file_table[0].name);
3150                   else
3151                     printf ("%s:\n", file_table[0].name);
3152
3153                   printf (_("File name                            Line number    Starting address\n"));
3154                 }
3155             }
3156
3157           /* Skip the NUL at the end of the table.  */
3158           data++;
3159
3160           saved_linfo = linfo;
3161         }
3162
3163       /* This loop iterates through the Dwarf Line Number Program.  */
3164       while (data < end_of_sequence)
3165         {
3166           unsigned char op_code;
3167           int adv;
3168           unsigned long int uladv;
3169           unsigned int bytes_read;
3170           int is_special_opcode = 0;
3171
3172           op_code = *data++;
3173
3174           if (op_code >= linfo.li_opcode_base)
3175             {
3176               op_code -= linfo.li_opcode_base;
3177               uladv = (op_code / linfo.li_line_range);
3178               if (linfo.li_max_ops_per_insn == 1)
3179                 {
3180                   uladv *= linfo.li_min_insn_length;
3181                   state_machine_regs.address += uladv;
3182                 }
3183               else
3184                 {
3185                   state_machine_regs.address
3186                     += ((state_machine_regs.op_index + uladv)
3187                         / linfo.li_max_ops_per_insn)
3188                     * linfo.li_min_insn_length;
3189                   state_machine_regs.op_index
3190                     = (state_machine_regs.op_index + uladv)
3191                     % linfo.li_max_ops_per_insn;
3192                 }
3193
3194               adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
3195               state_machine_regs.line += adv;
3196               is_special_opcode = 1;
3197             }
3198           else switch (op_code)
3199                  {
3200                  case DW_LNS_extended_op:
3201                    {
3202                      unsigned int ext_op_code_len;
3203                      unsigned char ext_op_code;
3204                      unsigned char *op_code_data = data;
3205
3206                      ext_op_code_len = read_uleb128 (op_code_data, &bytes_read,
3207                                                      end_of_sequence);
3208                      op_code_data += bytes_read;
3209
3210                      if (ext_op_code_len == 0)
3211                        {
3212                          warn (_("badly formed extended line op encountered!\n"));
3213                          break;
3214                        }
3215                      ext_op_code_len += bytes_read;
3216                      ext_op_code = *op_code_data++;
3217
3218                      switch (ext_op_code)
3219                        {
3220                        case DW_LNE_end_sequence:
3221                          reset_state_machine (linfo.li_default_is_stmt);
3222                          break;
3223                        case DW_LNE_set_address:
3224                          SAFE_BYTE_GET_AND_INC (state_machine_regs.address,
3225                                                 op_code_data,
3226                                                 ext_op_code_len - bytes_read - 1,
3227                                                 end);
3228                          state_machine_regs.op_index = 0;
3229                          break;
3230                        case DW_LNE_define_file:
3231                          {
3232                            file_table = (File_Entry *) xrealloc
3233                              (file_table, (n_files + 1) * sizeof (File_Entry));
3234
3235                            ++state_machine_regs.last_file_entry;
3236                            /* Source file name.  */
3237                            file_table[n_files].name = op_code_data;
3238                            op_code_data += strlen ((char *) op_code_data) + 1;
3239                            /* Directory index.  */
3240                            file_table[n_files].directory_index =
3241                              read_uleb128 (op_code_data, & bytes_read,
3242                                            end_of_sequence);
3243                            op_code_data += bytes_read;
3244                            /* Last modification time.  */
3245                            file_table[n_files].modification_date =
3246                              read_uleb128 (op_code_data, & bytes_read,
3247                                            end_of_sequence);
3248                            op_code_data += bytes_read;
3249                            /* File length.  */
3250                            file_table[n_files].length =
3251                              read_uleb128 (op_code_data, & bytes_read,
3252                                            end_of_sequence);
3253
3254                            n_files++;
3255                            break;
3256                          }
3257                        case DW_LNE_set_discriminator:
3258                        case DW_LNE_HP_set_sequence:
3259                          /* Simply ignored.  */
3260                          break;
3261
3262                        default:
3263                          printf (_("UNKNOWN (%u): length %d\n"),
3264                                  ext_op_code, ext_op_code_len - bytes_read);
3265                          break;
3266                        }
3267                      data += ext_op_code_len;
3268                      break;
3269                    }
3270                  case DW_LNS_copy:
3271                    break;
3272
3273                  case DW_LNS_advance_pc:
3274                    uladv = read_uleb128 (data, & bytes_read, end);
3275                    data += bytes_read;
3276                    if (linfo.li_max_ops_per_insn == 1)
3277                      {
3278                        uladv *= linfo.li_min_insn_length;
3279                        state_machine_regs.address += uladv;
3280                      }
3281                    else
3282                      {
3283                        state_machine_regs.address
3284                          += ((state_machine_regs.op_index + uladv)
3285                              / linfo.li_max_ops_per_insn)
3286                          * linfo.li_min_insn_length;
3287                        state_machine_regs.op_index
3288                          = (state_machine_regs.op_index + uladv)
3289                          % linfo.li_max_ops_per_insn;
3290                      }
3291                    break;
3292
3293                  case DW_LNS_advance_line:
3294                    adv = read_sleb128 (data, & bytes_read, end);
3295                    data += bytes_read;
3296                    state_machine_regs.line += adv;
3297                    break;
3298
3299                  case DW_LNS_set_file:
3300                    adv = read_uleb128 (data, & bytes_read, end);
3301                    data += bytes_read;
3302                    state_machine_regs.file = adv;
3303
3304                    if (file_table == NULL)
3305                      printf (_("\n [Use file table entry %d]\n"), state_machine_regs.file - 1);
3306                    else if (file_table[state_machine_regs.file - 1].directory_index == 0)
3307                      /* If directory index is 0, that means current directory.  */
3308                      printf ("\n./%s:[++]\n",
3309                              file_table[state_machine_regs.file - 1].name);
3310                    else if (directory_table == NULL)
3311                      printf (_("\n [Use directory table entry %d]\n"),
3312                              file_table[state_machine_regs.file - 1].directory_index - 1);
3313                    else
3314                      /* The directory index starts counting at 1.  */
3315                      printf ("\n%s/%s:\n",
3316                              directory_table[file_table[state_machine_regs.file - 1].directory_index - 1],
3317                              file_table[state_machine_regs.file - 1].name);
3318                    break;
3319
3320                  case DW_LNS_set_column:
3321                    uladv = read_uleb128 (data, & bytes_read, end);
3322                    data += bytes_read;
3323                    state_machine_regs.column = uladv;
3324                    break;
3325
3326                  case DW_LNS_negate_stmt:
3327                    adv = state_machine_regs.is_stmt;
3328                    adv = ! adv;
3329                    state_machine_regs.is_stmt = adv;
3330                    break;
3331
3332                  case DW_LNS_set_basic_block:
3333                    state_machine_regs.basic_block = 1;
3334                    break;
3335
3336                  case DW_LNS_const_add_pc:
3337                    uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
3338                    if (linfo.li_max_ops_per_insn == 1)
3339                      {
3340                        uladv *= linfo.li_min_insn_length;
3341                        state_machine_regs.address += uladv;
3342                      }
3343                    else
3344                      {
3345                        state_machine_regs.address
3346                          += ((state_machine_regs.op_index + uladv)
3347                              / linfo.li_max_ops_per_insn)
3348                          * linfo.li_min_insn_length;
3349                        state_machine_regs.op_index
3350                          = (state_machine_regs.op_index + uladv)
3351                          % linfo.li_max_ops_per_insn;
3352                      }
3353                    break;
3354
3355                  case DW_LNS_fixed_advance_pc:
3356                    SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
3357                    state_machine_regs.address += uladv;
3358                    state_machine_regs.op_index = 0;
3359                    break;
3360
3361                  case DW_LNS_set_prologue_end:
3362                    break;
3363
3364                  case DW_LNS_set_epilogue_begin:
3365                    break;
3366
3367                  case DW_LNS_set_isa:
3368                    uladv = read_uleb128 (data, & bytes_read, end);
3369                    data += bytes_read;
3370                    printf (_("  Set ISA to %lu\n"), uladv);
3371                    break;
3372
3373                  default:
3374                    printf (_("  Unknown opcode %d with operands: "), op_code);
3375
3376                    if (standard_opcodes != NULL)
3377                      for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
3378                        {
3379                          printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data,
3380                                                                             &bytes_read, end)),
3381                                  i == 1 ? "" : ", ");
3382                          data += bytes_read;
3383                        }
3384                    putchar ('\n');
3385                    break;
3386                  }
3387
3388           /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
3389              to the DWARF address/line matrix.  */
3390           if ((is_special_opcode) || (op_code == DW_LNE_end_sequence)
3391               || (op_code == DW_LNS_copy))
3392             {
3393               const unsigned int MAX_FILENAME_LENGTH = 35;
3394               char *fileName;
3395               char *newFileName = NULL;
3396               size_t fileNameLength;
3397
3398               if (file_table)
3399                 fileName = (char *) file_table[state_machine_regs.file - 1].name;
3400               else
3401                 fileName = "<unknown>";
3402
3403               fileNameLength = strlen (fileName);
3404
3405               if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
3406                 {
3407                   newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
3408                   /* Truncate file name */
3409                   strncpy (newFileName,
3410                            fileName + fileNameLength - MAX_FILENAME_LENGTH,
3411                            MAX_FILENAME_LENGTH + 1);
3412                 }
3413               else
3414                 {
3415                   newFileName = (char *) xmalloc (fileNameLength + 1);
3416                   strncpy (newFileName, fileName, fileNameLength + 1);
3417                 }
3418
3419               if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
3420                 {
3421                   if (linfo.li_max_ops_per_insn == 1)
3422                     printf ("%-35s  %11d  %#18" DWARF_VMA_FMT "x\n",
3423                             newFileName, state_machine_regs.line,
3424                             state_machine_regs.address);
3425                   else
3426                     printf ("%-35s  %11d  %#18" DWARF_VMA_FMT "x[%d]\n",
3427                             newFileName, state_machine_regs.line,
3428                             state_machine_regs.address,
3429                             state_machine_regs.op_index);
3430                 }
3431               else
3432                 {
3433                   if (linfo.li_max_ops_per_insn == 1)
3434                     printf ("%s  %11d  %#18" DWARF_VMA_FMT "x\n",
3435                             newFileName, state_machine_regs.line,
3436                             state_machine_regs.address);
3437                   else
3438                     printf ("%s  %11d  %#18" DWARF_VMA_FMT "x[%d]\n",
3439                             newFileName, state_machine_regs.line,
3440                             state_machine_regs.address,
3441                             state_machine_regs.op_index);
3442                 }
3443
3444               if (op_code == DW_LNE_end_sequence)
3445                 printf ("\n");
3446
3447               free (newFileName);
3448             }
3449         }
3450
3451       if (file_table)
3452         {
3453           free (file_table);
3454           file_table = NULL;
3455           n_files = 0;
3456         }
3457
3458       if (directory_table)
3459         {
3460           free (directory_table);
3461           directory_table = NULL;
3462           n_directories = 0;
3463         }
3464
3465       putchar ('\n');
3466     }
3467
3468   return 1;
3469 }
3470
3471 static int
3472 display_debug_lines (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
3473 {
3474   unsigned char *data = section->start;
3475   unsigned char *end = data + section->size;
3476   int retValRaw = 1;
3477   int retValDecoded = 1;
3478
3479   if (do_debug_lines == 0)
3480     do_debug_lines |= FLAG_DEBUG_LINES_RAW;
3481
3482   if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
3483     retValRaw = display_debug_lines_raw (section, data, end);
3484
3485   if (do_debug_lines & FLAG_DEBUG_LINES_DECODED)
3486     retValDecoded = display_debug_lines_decoded (section, data, end);
3487
3488   if (!retValRaw || !retValDecoded)
3489     return 0;
3490
3491   return 1;
3492 }
3493
3494 static debug_info *
3495 find_debug_info_for_offset (unsigned long offset)
3496 {
3497   unsigned int i;
3498
3499   if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
3500     return NULL;
3501
3502   for (i = 0; i < num_debug_info_entries; i++)
3503     if (debug_information[i].cu_offset == offset)
3504       return debug_information + i;
3505
3506   return NULL;
3507 }
3508
3509 static int
3510 display_debug_pubnames (struct dwarf_section *section,
3511                         void *file ATTRIBUTE_UNUSED)
3512 {
3513   DWARF2_Internal_PubNames names;
3514   unsigned char *start = section->start;
3515   unsigned char *end = start + section->size;
3516
3517   /* It does not matter if this load fails,
3518      we test for that later on.  */
3519   load_debug_info (file);
3520
3521   printf (_("Contents of the %s section:\n\n"), section->name);
3522
3523   while (start < end)
3524     {
3525       unsigned char *data;
3526       unsigned long offset;
3527       unsigned int offset_size, initial_length_size;
3528
3529       data = start;
3530
3531       SAFE_BYTE_GET_AND_INC (names.pn_length, data, 4, end);
3532       if (names.pn_length == 0xffffffff)
3533         {
3534           SAFE_BYTE_GET_AND_INC (names.pn_length, data, 8, end);
3535           offset_size = 8;
3536           initial_length_size = 12;
3537         }
3538       else
3539         {
3540           offset_size = 4;
3541           initial_length_size = 4;
3542         }
3543
3544       SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end);
3545       SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end);
3546
3547       if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
3548           && num_debug_info_entries > 0
3549           && find_debug_info_for_offset (names.pn_offset) == NULL)
3550         warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
3551               (unsigned long) names.pn_offset, section->name);
3552
3553       SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, end);
3554
3555       start += names.pn_length + initial_length_size;
3556
3557       if (names.pn_version != 2 && names.pn_version != 3)
3558         {
3559           static int warned = 0;
3560
3561           if (! warned)
3562             {
3563               warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
3564               warned = 1;
3565             }
3566
3567           continue;
3568         }
3569
3570       printf (_("  Length:                              %ld\n"),
3571               (long) names.pn_length);
3572       printf (_("  Version:                             %d\n"),
3573               names.pn_version);
3574       printf (_("  Offset into .debug_info section:     0x%lx\n"),
3575               (unsigned long) names.pn_offset);
3576       printf (_("  Size of area in .debug_info section: %ld\n"),
3577               (long) names.pn_size);
3578
3579       printf (_("\n    Offset\tName\n"));
3580
3581       do
3582         {
3583           SAFE_BYTE_GET (offset, data, offset_size, end);
3584
3585           if (offset != 0)
3586             {
3587               data += offset_size;
3588               printf ("    %-6lx\t%s\n", offset, data);
3589               data += strnlen ((char *) data, end - data) + 1;
3590             }
3591         }
3592       while (offset != 0);
3593     }
3594
3595   printf ("\n");
3596   return 1;
3597 }
3598
3599 static int
3600 display_debug_macinfo (struct dwarf_section *section,
3601                        void *file ATTRIBUTE_UNUSED)
3602 {
3603   unsigned char *start = section->start;
3604   unsigned char *end = start + section->size;
3605   unsigned char *curr = start;
3606   unsigned int bytes_read;
3607   enum dwarf_macinfo_record_type op;
3608
3609   printf (_("Contents of the %s section:\n\n"), section->name);
3610
3611   while (curr < end)
3612     {
3613       unsigned int lineno;
3614       const unsigned char *string;
3615
3616       op = (enum dwarf_macinfo_record_type) *curr;
3617       curr++;
3618
3619       switch (op)
3620         {
3621         case DW_MACINFO_start_file:
3622           {
3623             unsigned int filenum;
3624
3625             lineno = read_uleb128 (curr, & bytes_read, end);
3626             curr += bytes_read;
3627             filenum = read_uleb128 (curr, & bytes_read, end);
3628             curr += bytes_read;
3629
3630             printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
3631                     lineno, filenum);
3632           }
3633           break;
3634
3635         case DW_MACINFO_end_file:
3636           printf (_(" DW_MACINFO_end_file\n"));
3637           break;
3638
3639         case DW_MACINFO_define:
3640           lineno = read_uleb128 (curr, & bytes_read, end);
3641           curr += bytes_read;
3642           string = curr;
3643           curr += strnlen ((char *) string, end - string) + 1;
3644           printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
3645                   lineno, string);
3646           break;
3647
3648         case DW_MACINFO_undef:
3649           lineno = read_uleb128 (curr, & bytes_read, end);
3650           curr += bytes_read;
3651           string = curr;
3652           curr += strnlen ((char *) string, end - string) + 1;
3653           printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
3654                   lineno, string);
3655           break;
3656
3657         case DW_MACINFO_vendor_ext:
3658           {
3659             unsigned int constant;
3660
3661             constant = read_uleb128 (curr, & bytes_read, end);
3662             curr += bytes_read;
3663             string = curr;
3664             curr += strnlen ((char *) string, end - string) + 1;
3665             printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
3666                     constant, string);
3667           }
3668           break;
3669         }
3670     }
3671
3672   return 1;
3673 }
3674
3675 /* Given LINE_OFFSET into the .debug_line section, attempt to return
3676    filename and dirname corresponding to file name table entry with index
3677    FILEIDX.  Return NULL on failure.  */
3678
3679 static unsigned char *
3680 get_line_filename_and_dirname (dwarf_vma line_offset,
3681                                dwarf_vma fileidx,
3682                                unsigned char **dir_name)
3683 {
3684   struct dwarf_section *section = &debug_displays [line].section;
3685   unsigned char *hdrptr, *dirtable, *file_name;
3686   unsigned int offset_size, initial_length_size;
3687   unsigned int version, opcode_base, bytes_read;
3688   dwarf_vma length, diridx;
3689   const unsigned char * end;
3690
3691   *dir_name = NULL;
3692   if (section->start == NULL
3693       || line_offset >= section->size
3694       || fileidx == 0)
3695     return NULL;
3696
3697   hdrptr = section->start + line_offset;
3698   end = section->start + section->size;
3699
3700   SAFE_BYTE_GET_AND_INC (length, hdrptr, 4, end);
3701   if (length == 0xffffffff)
3702     {
3703       /* This section is 64-bit DWARF 3.  */
3704       SAFE_BYTE_GET_AND_INC (length, hdrptr, 8, end);
3705       offset_size = 8;
3706       initial_length_size = 12;
3707     }
3708   else
3709     {
3710       offset_size = 4;
3711       initial_length_size = 4;
3712     }
3713   if (length + initial_length_size > section->size)
3714     return NULL;
3715
3716   SAFE_BYTE_GET_AND_INC (version, hdrptr, 2, end);
3717   if (version != 2 && version != 3 && version != 4)
3718     return NULL;
3719   hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length.  */
3720   if (version >= 4)
3721     hdrptr++;               /* Skip max_ops_per_insn.  */
3722   hdrptr += 3;              /* Skip default_is_stmt, line_base, line_range.  */
3723
3724   SAFE_BYTE_GET_AND_INC (opcode_base, hdrptr, 1, end);
3725   if (opcode_base == 0)
3726     return NULL;
3727
3728   hdrptr += opcode_base - 1;
3729   dirtable = hdrptr;
3730   /* Skip over dirname table.  */
3731   while (*hdrptr != '\0')
3732     hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
3733   hdrptr++;                 /* Skip the NUL at the end of the table.  */
3734   /* Now skip over preceding filename table entries.  */
3735   for (; *hdrptr != '\0' && fileidx > 1; fileidx--)
3736     {
3737       hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
3738       read_uleb128 (hdrptr, &bytes_read, end);
3739       hdrptr += bytes_read;
3740       read_uleb128 (hdrptr, &bytes_read, end);
3741       hdrptr += bytes_read;
3742       read_uleb128 (hdrptr, &bytes_read, end);
3743       hdrptr += bytes_read;
3744     }
3745   if (hdrptr == end || *hdrptr == '\0')
3746     return NULL;
3747   file_name = hdrptr;
3748   hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
3749   diridx = read_uleb128 (hdrptr, &bytes_read, end);
3750   if (diridx == 0)
3751     return file_name;
3752   for (; *dirtable != '\0' && diridx > 1; diridx--)
3753     dirtable += strnlen ((char *) dirtable, end - dirtable) + 1;
3754   if (*dirtable == '\0')
3755     return NULL;
3756   *dir_name = dirtable;
3757   return file_name;
3758 }
3759
3760 static int
3761 display_debug_macro (struct dwarf_section *section,
3762                      void *file)
3763 {
3764   unsigned char *start = section->start;
3765   unsigned char *end = start + section->size;
3766   unsigned char *curr = start;
3767   unsigned char *extended_op_buf[256];
3768   unsigned int bytes_read;
3769
3770   load_debug_section (str, file);
3771   load_debug_section (line, file);
3772
3773   printf (_("Contents of the %s section:\n\n"), section->name);
3774
3775   while (curr < end)
3776     {
3777       unsigned int lineno, version, flags;
3778       unsigned int offset_size = 4;
3779       const unsigned char *string;
3780       dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
3781       unsigned char **extended_ops = NULL;
3782
3783       SAFE_BYTE_GET_AND_INC (version, curr, 2, end);
3784       if (version != 4)
3785         {
3786           error (_("Only GNU extension to DWARF 4 of %s is currently supported.\n"),
3787                  section->name);
3788           return 0;
3789         }
3790
3791       SAFE_BYTE_GET_AND_INC (flags, curr, 1, end);
3792       if (flags & 1)
3793         offset_size = 8;
3794       printf (_("  Offset:                      0x%lx\n"),
3795               (unsigned long) sec_offset);
3796       printf (_("  Version:                     %d\n"), version);
3797       printf (_("  Offset size:                 %d\n"), offset_size);
3798       if (flags & 2)
3799         {
3800           SAFE_BYTE_GET_AND_INC (line_offset, curr, offset_size, end);
3801           printf (_("  Offset into .debug_line:     0x%lx\n"),
3802                   (unsigned long) line_offset);
3803         }
3804       if (flags & 4)
3805         {
3806           unsigned int i, count, op;
3807           dwarf_vma nargs, n;
3808
3809           SAFE_BYTE_GET_AND_INC (count, curr, 1, end);
3810
3811           memset (extended_op_buf, 0, sizeof (extended_op_buf));
3812           extended_ops = extended_op_buf;
3813           if (count)
3814             {
3815               printf (_("  Extension opcode arguments:\n"));
3816               for (i = 0; i < count; i++)
3817                 {
3818                   SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
3819                   extended_ops[op] = curr;
3820                   nargs = read_uleb128 (curr, &bytes_read, end);
3821                   curr += bytes_read;
3822                   if (nargs == 0)
3823                     printf (_("    DW_MACRO_GNU_%02x has no arguments\n"), op);
3824                   else
3825                     {
3826                       printf (_("    DW_MACRO_GNU_%02x arguments: "), op);
3827                       for (n = 0; n < nargs; n++)
3828                         {
3829                           unsigned int form;
3830
3831                           SAFE_BYTE_GET_AND_INC (form, curr, 1, end);
3832                           printf ("%s%s", get_FORM_name (form),
3833                                   n == nargs - 1 ? "\n" : ", ");
3834                           switch (form)
3835                             {
3836                             case DW_FORM_data1:
3837                             case DW_FORM_data2:
3838                             case DW_FORM_data4:
3839                             case DW_FORM_data8:
3840                             case DW_FORM_sdata:
3841                             case DW_FORM_udata:
3842                             case DW_FORM_block:
3843                             case DW_FORM_block1:
3844                             case DW_FORM_block2:
3845                             case DW_FORM_block4:
3846                             case DW_FORM_flag:
3847                             case DW_FORM_string:
3848                             case DW_FORM_strp:
3849                             case DW_FORM_sec_offset:
3850                               break;
3851                             default:
3852                               error (_("Invalid extension opcode form %s\n"),
3853                                      get_FORM_name (form));
3854                               return 0;
3855                             }
3856                         }
3857                     }
3858                 }
3859             }
3860         }
3861       printf ("\n");
3862
3863       while (1)
3864         {
3865           unsigned int op;
3866
3867           if (curr >= end)
3868             {
3869               error (_(".debug_macro section not zero terminated\n"));
3870               return 0;
3871             }
3872
3873           SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
3874           if (op == 0)
3875             break;
3876
3877           switch (op)
3878             {
3879             case DW_MACRO_GNU_start_file:
3880               {
3881                 unsigned int filenum;
3882                 unsigned char *file_name = NULL, *dir_name = NULL;
3883
3884                 lineno = read_uleb128 (curr, &bytes_read, end);
3885                 curr += bytes_read;
3886                 filenum = read_uleb128 (curr, &bytes_read, end);
3887                 curr += bytes_read;
3888
3889                 if ((flags & 2) == 0)
3890                   error (_("DW_MACRO_GNU_start_file used, but no .debug_line offset provided.\n"));
3891                 else
3892                   file_name
3893                     = get_line_filename_and_dirname (line_offset, filenum,
3894                                                      &dir_name);
3895                 if (file_name == NULL)
3896                   printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d\n"),
3897                           lineno, filenum);
3898                 else
3899                   printf (_(" DW_MACRO_GNU_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
3900                           lineno, filenum,
3901                           dir_name != NULL ? (const char *) dir_name : "",
3902                           dir_name != NULL ? "/" : "", file_name);
3903               }
3904               break;
3905
3906             case DW_MACRO_GNU_end_file:
3907               printf (_(" DW_MACRO_GNU_end_file\n"));
3908               break;
3909
3910             case DW_MACRO_GNU_define:
3911               lineno = read_uleb128 (curr, &bytes_read, end);
3912               curr += bytes_read;
3913               string = curr;
3914               curr += strnlen ((char *) string, end - string) + 1;
3915               printf (_(" DW_MACRO_GNU_define - lineno : %d macro : %s\n"),
3916                       lineno, string);
3917               break;
3918
3919             case DW_MACRO_GNU_undef:
3920               lineno = read_uleb128 (curr, &bytes_read, end);
3921               curr += bytes_read;
3922               string = curr;
3923               curr += strnlen ((char *) string, end - string) + 1;
3924               printf (_(" DW_MACRO_GNU_undef - lineno : %d macro : %s\n"),
3925                       lineno, string);
3926               break;
3927
3928             case DW_MACRO_GNU_define_indirect:
3929               lineno = read_uleb128 (curr, &bytes_read, end);
3930               curr += bytes_read;
3931               SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
3932               string = fetch_indirect_string (offset);
3933               printf (_(" DW_MACRO_GNU_define_indirect - lineno : %d macro : %s\n"),
3934                       lineno, string);
3935               break;
3936
3937             case DW_MACRO_GNU_undef_indirect:
3938               lineno = read_uleb128 (curr, &bytes_read, end);
3939               curr += bytes_read;
3940               SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
3941               string = fetch_indirect_string (offset);
3942               printf (_(" DW_MACRO_GNU_undef_indirect - lineno : %d macro : %s\n"),
3943                       lineno, string);
3944               break;
3945
3946             case DW_MACRO_GNU_transparent_include:
3947               SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
3948               printf (_(" DW_MACRO_GNU_transparent_include - offset : 0x%lx\n"),
3949                       (unsigned long) offset);
3950               break;
3951
3952             case DW_MACRO_GNU_define_indirect_alt:
3953               lineno = read_uleb128 (curr, &bytes_read, end);
3954               curr += bytes_read;
3955               SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
3956               printf (_(" DW_MACRO_GNU_define_indirect_alt - lineno : %d macro offset : 0x%lx\n"),
3957                       lineno, (unsigned long) offset);
3958               break;
3959
3960             case DW_MACRO_GNU_undef_indirect_alt:
3961               lineno = read_uleb128 (curr, &bytes_read, end);
3962               curr += bytes_read;
3963               SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
3964               printf (_(" DW_MACRO_GNU_undef_indirect_alt - lineno : %d macro offset : 0x%lx\n"),
3965                       lineno, (unsigned long) offset);
3966               break;
3967
3968             case DW_MACRO_GNU_transparent_include_alt:
3969               SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
3970               printf (_(" DW_MACRO_GNU_transparent_include_alt - offset : 0x%lx\n"),
3971                       (unsigned long) offset);
3972               break;
3973
3974             default:
3975               if (extended_ops == NULL || extended_ops[op] == NULL)
3976                 {
3977                   error (_(" Unknown macro opcode %02x seen\n"), op);
3978                   return 0;
3979                 }
3980               else
3981                 {
3982                   /* Skip over unhandled opcodes.  */
3983                   dwarf_vma nargs, n;
3984                   unsigned char *desc = extended_ops[op];
3985                   nargs = read_uleb128 (desc, &bytes_read, end);
3986                   desc += bytes_read;
3987                   if (nargs == 0)
3988                     {
3989                       printf (_(" DW_MACRO_GNU_%02x\n"), op);
3990                       break;
3991                     }
3992                   printf (_(" DW_MACRO_GNU_%02x -"), op);
3993                   for (n = 0; n < nargs; n++)
3994                     {
3995                       int val;
3996
3997                       SAFE_BYTE_GET_AND_INC (val, desc, 1, end);
3998                       curr
3999                         = read_and_display_attr_value (0, val,
4000                                                        curr, end, 0, 0, offset_size,
4001                                                        version, NULL, 0, NULL,
4002                                                        NULL);
4003                       if (n != nargs - 1)
4004                         printf (",");
4005                     }
4006                   printf ("\n");
4007                 }
4008               break;
4009             }
4010         }
4011
4012       printf ("\n");
4013     }   
4014
4015   return 1;
4016 }
4017
4018 static int
4019 display_debug_abbrev (struct dwarf_section *section,
4020                       void *file ATTRIBUTE_UNUSED)
4021 {
4022   abbrev_entry *entry;
4023   unsigned char *start = section->start;
4024   unsigned char *end = start + section->size;
4025
4026   printf (_("Contents of the %s section:\n\n"), section->name);
4027
4028   do
4029     {
4030       unsigned char *last;
4031
4032       free_abbrevs ();
4033
4034       last = start;
4035       start = process_abbrev_section (start, end);
4036
4037       if (first_abbrev == NULL)
4038         continue;
4039
4040       printf (_("  Number TAG (0x%lx)\n"), (long) (last - section->start));
4041
4042       for (entry = first_abbrev; entry; entry = entry->next)
4043         {
4044           abbrev_attr *attr;
4045
4046           printf ("   %ld      %s    [%s]\n",
4047                   entry->entry,
4048                   get_TAG_name (entry->tag),
4049                   entry->children ? _("has children") : _("no children"));
4050
4051           for (attr = entry->first_attr; attr; attr = attr->next)
4052             printf ("    %-18s %s\n",
4053                     get_AT_name (attr->attribute),
4054                     get_FORM_name (attr->form));
4055         }
4056     }
4057   while (start);
4058
4059   printf ("\n");
4060
4061   return 1;
4062 }
4063
4064 /* Display a location list from a normal (ie, non-dwo) .debug_loc section.  */
4065
4066 static void
4067 display_loc_list (struct dwarf_section *section,
4068                   unsigned char **start_ptr,
4069                   int debug_info_entry,
4070                   unsigned long offset,
4071                   unsigned long base_address,
4072                   int has_frame_base)
4073 {
4074   unsigned char *start = *start_ptr;
4075   unsigned char *section_end = section->start + section->size;
4076   unsigned long cu_offset = debug_information [debug_info_entry].cu_offset;
4077   unsigned int pointer_size = debug_information [debug_info_entry].pointer_size;
4078   unsigned int offset_size = debug_information [debug_info_entry].offset_size;
4079   int dwarf_version = debug_information [debug_info_entry].dwarf_version;
4080
4081   dwarf_vma begin;
4082   dwarf_vma end;
4083   unsigned short length;
4084   int need_frame_base;
4085
4086   while (1)
4087     {
4088       if (start + 2 * pointer_size > section_end)
4089         {
4090           warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4091                 offset);
4092           break;
4093         }
4094
4095       printf ("    %8.8lx ", offset + (start - *start_ptr));
4096
4097       /* Note: we use sign extension here in order to be sure that we can detect
4098          the -1 escape value.  Sign extension into the top 32 bits of a 32-bit
4099          address will not affect the values that we display since we always show
4100          hex values, and always the bottom 32-bits.  */
4101       SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
4102       SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
4103
4104       if (begin == 0 && end == 0)
4105         {
4106           printf (_("<End of list>\n"));
4107           break;
4108         }
4109
4110       /* Check base address specifiers.  */
4111       if (begin == (dwarf_vma) -1 && end != (dwarf_vma) -1)
4112         {
4113           base_address = end;
4114           print_dwarf_vma (begin, pointer_size);
4115           print_dwarf_vma (end, pointer_size);
4116           printf (_("(base address)\n"));
4117           continue;
4118         }
4119
4120       if (start + 2 > section_end)
4121         {
4122           warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4123                 offset);
4124           break;
4125         }
4126
4127       SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
4128
4129       if (start + length > section_end)
4130         {
4131           warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4132                 offset);
4133           break;
4134         }
4135
4136       print_dwarf_vma (begin + base_address, pointer_size);
4137       print_dwarf_vma (end + base_address, pointer_size);
4138
4139       putchar ('(');
4140       need_frame_base = decode_location_expression (start,
4141                                                     pointer_size,
4142                                                     offset_size,
4143                                                     dwarf_version,
4144                                                     length,
4145                                                     cu_offset, section);
4146       putchar (')');
4147
4148       if (need_frame_base && !has_frame_base)
4149         printf (_(" [without DW_AT_frame_base]"));
4150
4151       if (begin == end)
4152         fputs (_(" (start == end)"), stdout);
4153       else if (begin > end)
4154         fputs (_(" (start > end)"), stdout);
4155
4156       putchar ('\n');
4157
4158       start += length;
4159     }
4160
4161   *start_ptr = start;
4162 }
4163
4164 /* Print a .debug_addr table index in decimal, surrounded by square brackets,
4165    right-adjusted in a field of length LEN, and followed by a space.  */
4166
4167 static void
4168 print_addr_index (unsigned int idx, unsigned int len)
4169 {
4170   static char buf[15];
4171   snprintf (buf, sizeof (buf), "[%d]", idx);
4172   printf ("%*s ", len, buf);
4173 }
4174
4175 /* Display a location list from a .dwo section. It uses address indexes rather
4176    than embedded addresses.  This code closely follows display_loc_list, but the
4177    two are sufficiently different that combining things is very ugly.  */
4178
4179 static void
4180 display_loc_list_dwo (struct dwarf_section *section,
4181                       unsigned char **start_ptr,
4182                       int debug_info_entry,
4183                       unsigned long offset,
4184                       int has_frame_base)
4185 {
4186   unsigned char *start = *start_ptr;
4187   unsigned char *section_end = section->start + section->size;
4188   unsigned long cu_offset = debug_information [debug_info_entry].cu_offset;
4189   unsigned int pointer_size = debug_information [debug_info_entry].pointer_size;
4190   unsigned int offset_size = debug_information [debug_info_entry].offset_size;
4191   int dwarf_version = debug_information [debug_info_entry].dwarf_version;
4192   int entry_type;
4193   unsigned short length;
4194   int need_frame_base;
4195   unsigned int idx;
4196   unsigned int bytes_read;
4197
4198   while (1)
4199     {
4200       printf ("    %8.8lx ", offset + (start - *start_ptr));
4201
4202       if (start >= section_end)
4203         {
4204           warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4205                 offset);
4206           break;
4207         }
4208
4209       SAFE_BYTE_GET_AND_INC (entry_type, start, 1, section_end);
4210       switch (entry_type)
4211         {
4212           case 0: /* A terminating entry.  */
4213             *start_ptr = start;
4214             printf (_("<End of list>\n"));
4215             return;
4216           case 1: /* A base-address entry.  */
4217             idx = read_uleb128 (start, &bytes_read, section_end);
4218             start += bytes_read;
4219             print_addr_index (idx, 8);
4220             printf ("         ");
4221             printf (_("(base address selection entry)\n"));
4222             continue;
4223           case 2: /* A start/end entry.  */
4224             idx = read_uleb128 (start, &bytes_read, section_end);
4225             start += bytes_read;
4226             print_addr_index (idx, 8);
4227             idx = read_uleb128 (start, &bytes_read, section_end);
4228             start += bytes_read;
4229             print_addr_index (idx, 8);
4230             break;
4231           case 3: /* A start/length entry.  */
4232             idx = read_uleb128 (start, &bytes_read, section_end);
4233             start += bytes_read;
4234             print_addr_index (idx, 8);
4235             SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4236             printf ("%08x ", idx);
4237             break;
4238           case 4: /* An offset pair entry.  */
4239             SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4240             printf ("%08x ", idx);
4241             SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
4242             printf ("%08x ", idx);
4243             break;
4244           default:
4245             warn (_("Unknown location list entry type 0x%x.\n"), entry_type);
4246             *start_ptr = start;
4247             return;
4248         }
4249
4250       if (start + 2 > section_end)
4251         {
4252           warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4253                 offset);
4254           break;
4255         }
4256
4257       SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
4258       if (start + length > section_end)
4259         {
4260           warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
4261                 offset);
4262           break;
4263         }
4264
4265       putchar ('(');
4266       need_frame_base = decode_location_expression (start,
4267                                                     pointer_size,
4268                                                     offset_size,
4269                                                     dwarf_version,
4270                                                     length,
4271                                                     cu_offset, section);
4272       putchar (')');
4273
4274       if (need_frame_base && !has_frame_base)
4275         printf (_(" [without DW_AT_frame_base]"));
4276
4277       putchar ('\n');
4278
4279       start += length;
4280     }
4281
4282   *start_ptr = start;
4283 }
4284
4285 /* Sort array of indexes in ascending order of loc_offsets[idx].  */
4286
4287 static dwarf_vma *loc_offsets;
4288
4289 static int
4290 loc_offsets_compar (const void *ap, const void *bp)
4291 {
4292   dwarf_vma a = loc_offsets[*(const unsigned int *) ap];
4293   dwarf_vma b = loc_offsets[*(const unsigned int *) bp];
4294
4295   return (a > b) - (b > a);
4296 }
4297
4298 static int
4299 display_debug_loc (struct dwarf_section *section, void *file)
4300 {
4301   unsigned char *start = section->start;
4302   unsigned long bytes;
4303   unsigned char *section_begin = start;
4304   unsigned int num_loc_list = 0;
4305   unsigned long last_offset = 0;
4306   unsigned int first = 0;
4307   unsigned int i;
4308   unsigned int j;
4309   unsigned int k;
4310   int seen_first_offset = 0;
4311   int locs_sorted = 1;
4312   unsigned char *next;
4313   unsigned int *array = NULL;
4314   const char *suffix = strrchr (section->name, '.');
4315   int is_dwo = 0;
4316
4317   if (suffix && strcmp (suffix, ".dwo") == 0)
4318     is_dwo = 1;
4319
4320   bytes = section->size;
4321
4322   if (bytes == 0)
4323     {
4324       printf (_("\nThe %s section is empty.\n"), section->name);
4325       return 0;
4326     }
4327
4328   if (load_debug_info (file) == 0)
4329     {
4330       warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
4331             section->name);
4332       return 0;
4333     }
4334
4335   /* Check the order of location list in .debug_info section. If
4336      offsets of location lists are in the ascending order, we can
4337      use `debug_information' directly.  */
4338   for (i = 0; i < num_debug_info_entries; i++)
4339     {
4340       unsigned int num;
4341
4342       num = debug_information [i].num_loc_offsets;
4343       if (num > num_loc_list)
4344         num_loc_list = num;
4345
4346       /* Check if we can use `debug_information' directly.  */
4347       if (locs_sorted && num != 0)
4348         {
4349           if (!seen_first_offset)
4350             {
4351               /* This is the first location list.  */
4352               last_offset = debug_information [i].loc_offsets [0];
4353               first = i;
4354               seen_first_offset = 1;
4355               j = 1;
4356             }
4357           else
4358             j = 0;
4359
4360           for (; j < num; j++)
4361             {
4362               if (last_offset >
4363                   debug_information [i].loc_offsets [j])
4364                 {
4365                   locs_sorted = 0;
4366                   break;
4367                 }
4368               last_offset = debug_information [i].loc_offsets [j];
4369             }
4370         }
4371     }
4372
4373   if (!seen_first_offset)
4374     error (_("No location lists in .debug_info section!\n"));
4375
4376   /* DWARF sections under Mach-O have non-zero addresses.  */
4377   if (debug_information [first].num_loc_offsets > 0
4378       && debug_information [first].loc_offsets [0] != section->address)
4379     warn (_("Location lists in %s section start at 0x%s\n"),
4380           section->name,
4381           dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]));
4382
4383   if (!locs_sorted)
4384     array = (unsigned int *) xcmalloc (num_loc_list, sizeof (unsigned int));
4385   printf (_("Contents of the %s section:\n\n"), section->name);
4386   printf (_("    Offset   Begin    End      Expression\n"));
4387
4388   seen_first_offset = 0;
4389   for (i = first; i < num_debug_info_entries; i++)
4390     {
4391       unsigned long offset;
4392       unsigned long base_address;
4393       int has_frame_base;
4394
4395       if (!locs_sorted)
4396         {
4397           for (k = 0; k < debug_information [i].num_loc_offsets; k++)
4398             array[k] = k;
4399           loc_offsets = debug_information [i].loc_offsets;
4400           qsort (array, debug_information [i].num_loc_offsets,
4401                  sizeof (*array), loc_offsets_compar);
4402         }
4403
4404       for (k = 0; k < debug_information [i].num_loc_offsets; k++)
4405         {
4406           j = locs_sorted ? k : array[k];
4407           if (k
4408               && debug_information [i].loc_offsets [locs_sorted
4409                                                     ? k - 1 : array [k - 1]]
4410                  == debug_information [i].loc_offsets [j])
4411             continue;
4412           has_frame_base = debug_information [i].have_frame_base [j];
4413           /* DWARF sections under Mach-O have non-zero addresses.  */
4414           offset = debug_information [i].loc_offsets [j] - section->address;
4415           next = section_begin + offset;
4416           base_address = debug_information [i].base_address;
4417
4418           if (!seen_first_offset)
4419             seen_first_offset = 1;
4420           else
4421             {
4422               if (start < next)
4423                 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
4424                       (unsigned long) (start - section_begin),
4425                       (unsigned long) (next - section_begin));
4426               else if (start > next)
4427                 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
4428                       (unsigned long) (start - section_begin),
4429                       (unsigned long) (next - section_begin));
4430             }
4431           start = next;
4432
4433           if (offset >= bytes)
4434             {
4435               warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
4436                     offset);
4437               continue;
4438             }
4439
4440           if (is_dwo)
4441             display_loc_list_dwo (section, &start, i, offset, has_frame_base);
4442           else
4443             display_loc_list (section, &start, i, offset, base_address,
4444                               has_frame_base);
4445         }
4446     }
4447
4448   if (start < section->start + section->size)
4449     warn (_("There are %ld unused bytes at the end of section %s\n"),
4450           (long) (section->start + section->size - start), section->name);
4451   putchar ('\n');
4452   free (array);
4453   return 1;
4454 }
4455
4456 static int
4457 display_debug_str (struct dwarf_section *section,
4458                    void *file ATTRIBUTE_UNUSED)
4459 {
4460   unsigned char *start = section->start;
4461   unsigned long bytes = section->size;
4462   dwarf_vma addr = section->address;
4463
4464   if (bytes == 0)
4465     {
4466       printf (_("\nThe %s section is empty.\n"), section->name);
4467       return 0;
4468     }
4469
4470   printf (_("Contents of the %s section:\n\n"), section->name);
4471
4472   while (bytes)
4473     {
4474       int j;
4475       int k;
4476       int lbytes;
4477
4478       lbytes = (bytes > 16 ? 16 : bytes);
4479
4480       printf ("  0x%8.8lx ", (unsigned long) addr);
4481
4482       for (j = 0; j < 16; j++)
4483         {
4484           if (j < lbytes)
4485             printf ("%2.2x", start[j]);
4486           else
4487             printf ("  ");
4488
4489           if ((j & 3) == 3)
4490             printf (" ");
4491         }
4492
4493       for (j = 0; j < lbytes; j++)
4494         {
4495           k = start[j];
4496           if (k >= ' ' && k < 0x80)
4497             printf ("%c", k);
4498           else
4499             printf (".");
4500         }
4501
4502       putchar ('\n');
4503
4504       start += lbytes;
4505       addr  += lbytes;
4506       bytes -= lbytes;
4507     }
4508
4509   putchar ('\n');
4510
4511   return 1;
4512 }
4513
4514 static int
4515 display_debug_info (struct dwarf_section *section, void *file)
4516 {
4517   return process_debug_info (section, file, section->abbrev_sec, 0, 0);
4518 }
4519
4520 static int
4521 display_debug_types (struct dwarf_section *section, void *file)
4522 {
4523   return process_debug_info (section, file, section->abbrev_sec, 0, 1);
4524 }
4525
4526 static int
4527 display_trace_info (struct dwarf_section *section, void *file)
4528 {
4529   return process_debug_info (section, file, section->abbrev_sec, 0, 0);
4530 }
4531
4532 static int
4533 display_debug_aranges (struct dwarf_section *section,
4534                        void *file ATTRIBUTE_UNUSED)
4535 {
4536   unsigned char *start = section->start;
4537   unsigned char *end = start + section->size;
4538
4539   printf (_("Contents of the %s section:\n\n"), section->name);
4540
4541   /* It does not matter if this load fails,
4542      we test for that later on.  */
4543   load_debug_info (file);
4544
4545   while (start < end)
4546     {
4547       unsigned char *hdrptr;
4548       DWARF2_Internal_ARange arange;
4549       unsigned char *addr_ranges;
4550       dwarf_vma length;
4551       dwarf_vma address;
4552       unsigned char address_size;
4553       int excess;
4554       unsigned int offset_size;
4555       unsigned int initial_length_size;
4556
4557       hdrptr = start;
4558
4559       SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 4, end);
4560       if (arange.ar_length == 0xffffffff)
4561         {
4562           SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 8, end);
4563           offset_size = 8;
4564           initial_length_size = 12;
4565         }
4566       else
4567         {
4568           offset_size = 4;
4569           initial_length_size = 4;
4570         }
4571
4572       SAFE_BYTE_GET_AND_INC (arange.ar_version, hdrptr, 2, end);
4573       SAFE_BYTE_GET_AND_INC (arange.ar_info_offset, hdrptr, offset_size, end);
4574
4575       if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
4576           && num_debug_info_entries > 0
4577           && find_debug_info_for_offset (arange.ar_info_offset) == NULL)
4578         warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
4579               (unsigned long) arange.ar_info_offset, section->name);
4580
4581       SAFE_BYTE_GET_AND_INC (arange.ar_pointer_size, hdrptr, 1, end);
4582       SAFE_BYTE_GET_AND_INC (arange.ar_segment_size, hdrptr, 1, end);
4583
4584       if (arange.ar_version != 2 && arange.ar_version != 3)
4585         {
4586           warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
4587           break;
4588         }
4589
4590       printf (_("  Length:                   %ld\n"),
4591               (long) arange.ar_length);
4592       printf (_("  Version:                  %d\n"), arange.ar_version);
4593       printf (_("  Offset into .debug_info:  0x%lx\n"),
4594               (unsigned long) arange.ar_info_offset);
4595       printf (_("  Pointer Size:             %d\n"), arange.ar_pointer_size);
4596       printf (_("  Segment Size:             %d\n"), arange.ar_segment_size);
4597
4598       address_size = arange.ar_pointer_size + arange.ar_segment_size;
4599
4600       if (address_size == 0)
4601         {
4602           error (_("Invalid address size in %s section!\n"),
4603                  section->name);
4604           break;
4605         }
4606
4607       /* The DWARF spec does not require that the address size be a power
4608          of two, but we do.  This will have to change if we ever encounter
4609          an uneven architecture.  */
4610       if ((address_size & (address_size - 1)) != 0)
4611         {
4612           warn (_("Pointer size + Segment size is not a power of two.\n"));
4613           break;
4614         }
4615
4616       if (address_size > 4)
4617         printf (_("\n    Address            Length\n"));
4618       else
4619         printf (_("\n    Address    Length\n"));
4620
4621       addr_ranges = hdrptr;
4622
4623       /* Must pad to an alignment boundary that is twice the address size.  */
4624       excess = (hdrptr - start) % (2 * address_size);
4625       if (excess)
4626         addr_ranges += (2 * address_size) - excess;
4627
4628       start += arange.ar_length + initial_length_size;
4629
4630       while (addr_ranges + 2 * address_size <= start)
4631         {
4632           SAFE_BYTE_GET_AND_INC (address, addr_ranges, address_size, end);
4633           SAFE_BYTE_GET_AND_INC (length, addr_ranges, address_size, end);
4634
4635           printf ("    ");
4636           print_dwarf_vma (address, address_size);
4637           print_dwarf_vma (length, address_size);
4638           putchar ('\n');
4639         }
4640     }
4641
4642   printf ("\n");
4643
4644   return 1;
4645 }
4646
4647 /* Comparison function for qsort.  */
4648 static int
4649 comp_addr_base (const void * v0, const void * v1)
4650 {
4651   debug_info * info0 = (debug_info *) v0;
4652   debug_info * info1 = (debug_info *) v1;
4653   return info0->addr_base - info1->addr_base;
4654 }
4655
4656 /* Display the debug_addr section.  */
4657 static int
4658 display_debug_addr (struct dwarf_section *section,
4659                     void *file)
4660 {
4661   debug_info **debug_addr_info;
4662   unsigned char *entry;
4663   unsigned char *end;
4664   unsigned int i;
4665   unsigned int count;
4666
4667   if (section->size == 0)
4668     {
4669       printf (_("\nThe %s section is empty.\n"), section->name);
4670       return 0;
4671     }
4672
4673   if (load_debug_info (file) == 0)
4674     {
4675       warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
4676             section->name);
4677       return 0;
4678     }
4679
4680   printf (_("Contents of the %s section:\n\n"), section->name);
4681
4682   debug_addr_info = (debug_info **) xmalloc ((num_debug_info_entries + 1)
4683                                              * sizeof (debug_info *));
4684
4685   count = 0;
4686   for (i = 0; i < num_debug_info_entries; i++)
4687     {
4688       if (debug_information [i].addr_base != DEBUG_INFO_UNAVAILABLE)
4689         debug_addr_info [count++] = &debug_information [i];
4690     }
4691
4692   /* Add a sentinel to make iteration convenient.  */
4693   debug_addr_info [count] = (debug_info *) xmalloc (sizeof (debug_info));
4694   debug_addr_info [count]->addr_base = section->size;
4695
4696   qsort (debug_addr_info, count, sizeof (debug_info *), comp_addr_base);
4697   for (i = 0; i < count; i++)
4698     {
4699       unsigned int idx;
4700       unsigned int address_size = debug_addr_info [i]->pointer_size;
4701
4702       printf (_("  For compilation unit at offset 0x%s:\n"),
4703               dwarf_vmatoa ("x", debug_addr_info [i]->cu_offset));
4704
4705       printf (_("\tIndex\tAddress\n"));
4706       entry = section->start + debug_addr_info [i]->addr_base;
4707       end = section->start + debug_addr_info [i + 1]->addr_base;
4708       idx = 0;
4709       while (entry < end)
4710         {
4711           dwarf_vma base = byte_get (entry, address_size);
4712           printf (_("\t%d:\t"), idx);
4713           print_dwarf_vma (base, address_size);
4714           printf ("\n");
4715           entry += address_size;
4716           idx++;
4717         }
4718     }
4719   printf ("\n");
4720
4721   free (debug_addr_info);
4722   return 1;
4723 }
4724
4725 /* Display the .debug_str_offsets and .debug_str_offsets.dwo sections.  */
4726 static int
4727 display_debug_str_offsets (struct dwarf_section *section,
4728                            void *file ATTRIBUTE_UNUSED)
4729 {
4730   if (section->size == 0)
4731     {
4732       printf (_("\nThe %s section is empty.\n"), section->name);
4733       return 0;
4734     }
4735   /* TODO: Dump the contents.  This is made somewhat difficult by not knowing
4736      what the offset size is for this section.  */
4737   return 1;
4738 }
4739
4740 /* Each debug_information[x].range_lists[y] gets this representation for
4741    sorting purposes.  */
4742
4743 struct range_entry
4744 {
4745   /* The debug_information[x].range_lists[y] value.  */
4746   unsigned long ranges_offset;
4747
4748   /* Original debug_information to find parameters of the data.  */
4749   debug_info *debug_info_p;
4750 };
4751
4752 /* Sort struct range_entry in ascending order of its RANGES_OFFSET.  */
4753
4754 static int
4755 range_entry_compar (const void *ap, const void *bp)
4756 {
4757   const struct range_entry *a_re = (const struct range_entry *) ap;
4758   const struct range_entry *b_re = (const struct range_entry *) bp;
4759   const unsigned long a = a_re->ranges_offset;
4760   const unsigned long b = b_re->ranges_offset;
4761
4762   return (a > b) - (b > a);
4763 }
4764
4765 static int
4766 display_debug_ranges (struct dwarf_section *section,
4767                       void *file ATTRIBUTE_UNUSED)
4768 {
4769   unsigned char *start = section->start;
4770   unsigned char *last_start = start;
4771   unsigned long bytes = section->size;
4772   unsigned char *section_begin = start;
4773   unsigned char *finish = start + bytes;
4774   unsigned int num_range_list, i;
4775   struct range_entry *range_entries, *range_entry_fill;
4776
4777   if (bytes == 0)
4778     {
4779       printf (_("\nThe %s section is empty.\n"), section->name);
4780       return 0;
4781     }
4782
4783   if (load_debug_info (file) == 0)
4784     {
4785       warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
4786             section->name);
4787       return 0;
4788     }
4789
4790   num_range_list = 0;
4791   for (i = 0; i < num_debug_info_entries; i++)
4792     num_range_list += debug_information [i].num_range_lists;
4793
4794   if (num_range_list == 0)
4795     {
4796       /* This can happen when the file was compiled with -gsplit-debug
4797          which removes references to range lists from the primary .o file.  */
4798       printf (_("No range lists in .debug_info section.\n"));
4799       return 1;
4800     }
4801
4802   range_entries = (struct range_entry *)
4803       xmalloc (sizeof (*range_entries) * num_range_list);
4804   range_entry_fill = range_entries;
4805
4806   for (i = 0; i < num_debug_info_entries; i++)
4807     {
4808       debug_info *debug_info_p = &debug_information[i];
4809       unsigned int j;
4810
4811       for (j = 0; j < debug_info_p->num_range_lists; j++)
4812         {
4813           range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
4814           range_entry_fill->debug_info_p = debug_info_p;
4815           range_entry_fill++;
4816         }
4817     }
4818
4819   qsort (range_entries, num_range_list, sizeof (*range_entries),
4820          range_entry_compar);
4821
4822   /* DWARF sections under Mach-O have non-zero addresses.  */
4823   if (dwarf_check != 0 && range_entries[0].ranges_offset != section->address)
4824     warn (_("Range lists in %s section start at 0x%lx\n"),
4825           section->name, range_entries[0].ranges_offset);
4826
4827   printf (_("Contents of the %s section:\n\n"), section->name);
4828   printf (_("    Offset   Begin    End\n"));
4829
4830   for (i = 0; i < num_range_list; i++)
4831     {
4832       struct range_entry *range_entry = &range_entries[i];
4833       debug_info *debug_info_p = range_entry->debug_info_p;
4834       unsigned int pointer_size;
4835       unsigned long offset;
4836       unsigned char *next;
4837       unsigned long base_address;
4838
4839       pointer_size = debug_info_p->pointer_size;
4840
4841       /* DWARF sections under Mach-O have non-zero addresses.  */
4842       offset = range_entry->ranges_offset - section->address;
4843       next = section_begin + offset;
4844       base_address = debug_info_p->base_address;
4845
4846       if (dwarf_check != 0 && i > 0)
4847         {
4848           if (start < next)
4849             warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
4850                   (unsigned long) (start - section_begin),
4851                   (unsigned long) (next - section_begin), section->name);
4852           else if (start > next)
4853             {
4854               if (next == last_start)
4855                 continue;
4856               warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
4857                     (unsigned long) (start - section_begin),
4858                     (unsigned long) (next - section_begin), section->name);
4859             }
4860         }
4861       start = next;
4862       last_start = next;
4863
4864       while (start < finish)
4865         {
4866           dwarf_vma begin;
4867           dwarf_vma end;
4868
4869           /* Note: we use sign extension here in order to be sure that
4870              we can detect the -1 escape value.  Sign extension into the
4871              top 32 bits of a 32-bit address will not affect the values
4872              that we display since we always show hex values, and always
4873              the bottom 32-bits.  */
4874           SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
4875           if (start >= finish)
4876             break;
4877           SAFE_SIGNED_BYTE_GET_AND_INC (end, start, pointer_size, finish);
4878
4879           printf ("    %8.8lx ", offset);
4880
4881           if (begin == 0 && end == 0)
4882             {
4883               printf (_("<End of list>\n"));
4884               break;
4885             }
4886
4887           /* Check base address specifiers.  */
4888           if (begin == (dwarf_vma) -1 && end != (dwarf_vma) -1)
4889             {
4890               base_address = end;
4891               print_dwarf_vma (begin, pointer_size);
4892               print_dwarf_vma (end, pointer_size);
4893               printf ("(base address)\n");
4894               continue;
4895             }
4896
4897           print_dwarf_vma (begin + base_address, pointer_size);
4898           print_dwarf_vma (end + base_address, pointer_size);
4899
4900           if (begin == end)
4901             fputs (_("(start == end)"), stdout);
4902           else if (begin > end)
4903             fputs (_("(start > end)"), stdout);
4904
4905           putchar ('\n');
4906         }
4907     }
4908   putchar ('\n');
4909
4910   free (range_entries);
4911
4912   return 1;
4913 }
4914
4915 typedef struct Frame_Chunk
4916 {
4917   struct Frame_Chunk *next;
4918   unsigned char *chunk_start;
4919   int ncols;
4920   /* DW_CFA_{undefined,same_value,offset,register,unreferenced}  */
4921   short int *col_type;
4922   int *col_offset;
4923   char *augmentation;
4924   unsigned int code_factor;
4925   int data_factor;
4926   dwarf_vma pc_begin;
4927   dwarf_vma pc_range;
4928   int cfa_reg;
4929   int cfa_offset;
4930   int ra;
4931   unsigned char fde_encoding;
4932   unsigned char cfa_exp;
4933   unsigned char ptr_size;
4934   unsigned char segment_size;
4935 }
4936 Frame_Chunk;
4937
4938 static const char *const *dwarf_regnames;
4939 static unsigned int dwarf_regnames_count;
4940
4941 /* A marker for a col_type that means this column was never referenced
4942    in the frame info.  */
4943 #define DW_CFA_unreferenced (-1)
4944
4945 /* Return 0 if not more space is needed, 1 if more space is needed,
4946    -1 for invalid reg.  */
4947
4948 static int
4949 frame_need_space (Frame_Chunk *fc, unsigned int reg)
4950 {
4951   int prev = fc->ncols;
4952
4953   if (reg < (unsigned int) fc->ncols)
4954     return 0;
4955
4956   if (dwarf_regnames_count
4957       && reg > dwarf_regnames_count)
4958     return -1;
4959
4960   fc->ncols = reg + 1;
4961   fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
4962                                           sizeof (short int));
4963   fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
4964
4965   while (prev < fc->ncols)
4966     {
4967       fc->col_type[prev] = DW_CFA_unreferenced;
4968       fc->col_offset[prev] = 0;
4969       prev++;
4970     }
4971   return 1;
4972 }
4973
4974 static const char *const dwarf_regnames_i386[] =
4975 {
4976   "eax", "ecx", "edx", "ebx",                     /* 0 - 3  */
4977   "esp", "ebp", "esi", "edi",                     /* 4 - 7  */
4978   "eip", "eflags", NULL,                          /* 8 - 10  */
4979   "st0", "st1", "st2", "st3",                     /* 11 - 14  */
4980   "st4", "st5", "st6", "st7",                     /* 15 - 18  */
4981   NULL, NULL,                                     /* 19 - 20  */
4982   "xmm0", "xmm1", "xmm2", "xmm3",                 /* 21 - 24  */
4983   "xmm4", "xmm5", "xmm6", "xmm7",                 /* 25 - 28  */
4984   "mm0", "mm1", "mm2", "mm3",                     /* 29 - 32  */
4985   "mm4", "mm5", "mm6", "mm7",                     /* 33 - 36  */
4986   "fcw", "fsw", "mxcsr",                          /* 37 - 39  */
4987   "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47  */
4988   "tr", "ldtr",                                   /* 48 - 49  */
4989   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57  */
4990   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65  */
4991   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73  */
4992   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81  */
4993   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89  */
4994   NULL, NULL, NULL,                               /* 90 - 92  */
4995   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"  /* 93 - 100  */
4996 };
4997
4998 void
4999 init_dwarf_regnames_i386 (void)
5000 {
5001   dwarf_regnames = dwarf_regnames_i386;
5002   dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
5003 }
5004
5005 static const char *const dwarf_regnames_x86_64[] =
5006 {
5007   "rax", "rdx", "rcx", "rbx",
5008   "rsi", "rdi", "rbp", "rsp",
5009   "r8",  "r9",  "r10", "r11",
5010   "r12", "r13", "r14", "r15",
5011   "rip",
5012   "xmm0",  "xmm1",  "xmm2",  "xmm3",
5013   "xmm4",  "xmm5",  "xmm6",  "xmm7",
5014   "xmm8",  "xmm9",  "xmm10", "xmm11",
5015   "xmm12", "xmm13", "xmm14", "xmm15",
5016   "st0", "st1", "st2", "st3",
5017   "st4", "st5", "st6", "st7",
5018   "mm0", "mm1", "mm2", "mm3",
5019   "mm4", "mm5", "mm6", "mm7",
5020   "rflags",
5021   "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
5022   "fs.base", "gs.base", NULL, NULL,
5023   "tr", "ldtr",
5024   "mxcsr", "fcw", "fsw",
5025   "xmm16",  "xmm17",  "xmm18",  "xmm19",
5026   "xmm20",  "xmm21",  "xmm22",  "xmm23",
5027   "xmm24",  "xmm25",  "xmm26",  "xmm27",
5028   "xmm28",  "xmm29",  "xmm30",  "xmm31",
5029   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 83 - 90  */
5030   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 91 - 98  */
5031   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 99 - 106  */
5032   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 107 - 114  */
5033   NULL, NULL, NULL,                               /* 115 - 117  */
5034   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
5035 };
5036
5037 void
5038 init_dwarf_regnames_x86_64 (void)
5039 {
5040   dwarf_regnames = dwarf_regnames_x86_64;
5041   dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
5042 }
5043
5044 void
5045 init_dwarf_regnames (unsigned int e_machine)
5046 {
5047   switch (e_machine)
5048     {
5049     case EM_386:
5050     case EM_486:
5051       init_dwarf_regnames_i386 ();
5052       break;
5053
5054     case EM_X86_64:
5055     case EM_L1OM:
5056     case EM_K1OM:
5057       init_dwarf_regnames_x86_64 ();
5058       break;
5059
5060     default:
5061       break;
5062     }
5063 }
5064
5065 static const char *
5066 regname (unsigned int regno, int row)
5067 {
5068   static char reg[64];
5069   if (dwarf_regnames
5070       && regno < dwarf_regnames_count
5071       && dwarf_regnames [regno] != NULL)
5072     {
5073       if (row)
5074         return dwarf_regnames [regno];
5075       snprintf (reg, sizeof (reg), "r%d (%s)", regno,
5076                 dwarf_regnames [regno]);
5077     }
5078   else
5079     snprintf (reg, sizeof (reg), "r%d", regno);
5080   return reg;
5081 }
5082
5083 static void
5084 frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
5085 {
5086   int r;
5087   char tmp[100];
5088
5089   if (*max_regs < fc->ncols)
5090     *max_regs = fc->ncols;
5091
5092   if (*need_col_headers)
5093     {
5094       static const char *sloc = "   LOC";
5095
5096       *need_col_headers = 0;
5097
5098       printf ("%-*s CFA      ", eh_addr_size * 2, sloc);
5099
5100       for (r = 0; r < *max_regs; r++)
5101         if (fc->col_type[r] != DW_CFA_unreferenced)
5102           {
5103             if (r == fc->ra)
5104               printf ("ra      ");
5105             else
5106               printf ("%-5s ", regname (r, 1));
5107           }
5108
5109       printf ("\n");
5110     }
5111
5112   print_dwarf_vma (fc->pc_begin, eh_addr_size);
5113   if (fc->cfa_exp)
5114     strcpy (tmp, "exp");
5115   else
5116     sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), fc->cfa_offset);
5117   printf ("%-8s ", tmp);
5118
5119   for (r = 0; r < fc->ncols; r++)
5120     {
5121       if (fc->col_type[r] != DW_CFA_unreferenced)
5122         {
5123           switch (fc->col_type[r])
5124             {
5125             case DW_CFA_undefined:
5126               strcpy (tmp, "u");
5127               break;
5128             case DW_CFA_same_value:
5129               strcpy (tmp, "s");
5130               break;
5131             case DW_CFA_offset:
5132               sprintf (tmp, "c%+d", fc->col_offset[r]);
5133               break;
5134             case DW_CFA_val_offset:
5135               sprintf (tmp, "v%+d", fc->col_offset[r]);
5136               break;
5137             case DW_CFA_register:
5138               sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
5139               break;
5140             case DW_CFA_expression:
5141               strcpy (tmp, "exp");
5142               break;
5143             case DW_CFA_val_expression:
5144               strcpy (tmp, "vexp");
5145               break;
5146             default:
5147               strcpy (tmp, "n/a");
5148               break;
5149             }
5150           printf ("%-5s ", tmp);
5151         }
5152     }
5153   printf ("\n");
5154 }
5155
5156 #define GET(VAR, N)     SAFE_BYTE_GET_AND_INC (VAR, start, N, end);
5157 #define LEB()   read_uleb128 (start, & length_return, end); start += length_return
5158 #define SLEB()  read_sleb128 (start, & length_return, end); start += length_return
5159
5160 static int
5161 display_debug_frames (struct dwarf_section *section,
5162                       void *file ATTRIBUTE_UNUSED)
5163 {
5164   unsigned char *start = section->start;
5165   unsigned char *end = start + section->size;
5166   unsigned char *section_start = start;
5167   Frame_Chunk *chunks = 0;
5168   Frame_Chunk *remembered_state = 0;
5169   Frame_Chunk *rs;
5170   int is_eh = strcmp (section->name, ".eh_frame") == 0;
5171   unsigned int length_return;
5172   int max_regs = 0;
5173   const char *bad_reg = _("bad register: ");
5174   int saved_eh_addr_size = eh_addr_size;
5175
5176   printf (_("Contents of the %s section:\n"), section->name);
5177
5178   while (start < end)
5179     {
5180       unsigned char *saved_start;
5181       unsigned char *block_end;
5182       dwarf_vma length;
5183       dwarf_vma cie_id;
5184       Frame_Chunk *fc;
5185       Frame_Chunk *cie;
5186       int need_col_headers = 1;
5187       unsigned char *augmentation_data = NULL;
5188       unsigned long augmentation_data_len = 0;
5189       unsigned int encoded_ptr_size = saved_eh_addr_size;
5190       unsigned int offset_size;
5191       unsigned int initial_length_size;
5192
5193       saved_start = start;
5194
5195       SAFE_BYTE_GET_AND_INC (length, start, 4, end);
5196       if (length == 0)
5197         {
5198           printf ("\n%08lx ZERO terminator\n\n",
5199                     (unsigned long)(saved_start - section_start));
5200           continue;
5201         }
5202
5203       if (length == 0xffffffff)
5204         {
5205           SAFE_BYTE_GET_AND_INC (length, start, 8, end);
5206           offset_size = 8;
5207           initial_length_size = 12;
5208         }
5209       else
5210         {
5211           offset_size = 4;
5212           initial_length_size = 4;
5213         }
5214
5215       block_end = saved_start + length + initial_length_size;
5216       if (block_end > end)
5217         {
5218           warn ("Invalid length 0x%s in FDE at %#08lx\n",
5219                 dwarf_vmatoa_1 (NULL, length, offset_size),
5220                 (unsigned long) (saved_start - section_start));
5221           block_end = end;
5222         }
5223
5224       SAFE_BYTE_GET_AND_INC (cie_id, start, offset_size, end);
5225
5226       if (is_eh ? (cie_id == 0) : ((offset_size == 4 && cie_id == DW_CIE_ID)
5227                                    || (offset_size == 8 && cie_id == DW64_CIE_ID)))
5228         {
5229           int version;
5230
5231           fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
5232           memset (fc, 0, sizeof (Frame_Chunk));
5233
5234           fc->next = chunks;
5235           chunks = fc;
5236           fc->chunk_start = saved_start;
5237           fc->ncols = 0;
5238           fc->col_type = (short int *) xmalloc (sizeof (short int));
5239           fc->col_offset = (int *) xmalloc (sizeof (int));
5240           frame_need_space (fc, max_regs - 1);
5241
5242           version = *start++;
5243
5244           fc->augmentation = (char *) start;
5245           start = (unsigned char *) strchr ((char *) start, '\0') + 1;
5246
5247           if (strcmp (fc->augmentation, "eh") == 0)
5248             start += eh_addr_size;
5249
5250           if (version >= 4)
5251             {
5252               GET (fc->ptr_size, 1);
5253               GET (fc->segment_size, 1);
5254               eh_addr_size = fc->ptr_size;
5255             }
5256           else
5257             {
5258               fc->ptr_size = eh_addr_size;
5259               fc->segment_size = 0;
5260             }
5261           fc->code_factor = LEB ();
5262           fc->data_factor = SLEB ();
5263           if (version == 1)
5264             {
5265               GET (fc->ra, 1);
5266             }
5267           else
5268             {
5269               fc->ra = LEB ();
5270             }
5271
5272           if (fc->augmentation[0] == 'z')
5273             {
5274               augmentation_data_len = LEB ();
5275               augmentation_data = start;
5276               start += augmentation_data_len;
5277             }
5278           cie = fc;
5279
5280           printf ("\n%08lx ", (unsigned long) (saved_start - section_start));
5281           print_dwarf_vma (length, fc->ptr_size);
5282           print_dwarf_vma (cie_id, offset_size);
5283
5284           if (do_debug_frames_interp)
5285             {
5286               printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc->augmentation,
5287                       fc->code_factor, fc->data_factor, fc->ra);
5288             }
5289           else
5290             {
5291               printf ("CIE\n");
5292               printf ("  Version:               %d\n", version);
5293               printf ("  Augmentation:          \"%s\"\n", fc->augmentation);
5294               if (version >= 4)
5295                 {
5296                   printf ("  Pointer Size:          %u\n", fc->ptr_size);
5297                   printf ("  Segment Size:          %u\n", fc->segment_size);
5298                 }
5299               printf ("  Code alignment factor: %u\n", fc->code_factor);
5300               printf ("  Data alignment factor: %d\n", fc->data_factor);
5301               printf ("  Return address column: %d\n", fc->ra);
5302
5303               if (augmentation_data_len)
5304                 {
5305                   unsigned long i;
5306                   printf ("  Augmentation data:    ");
5307                   for (i = 0; i < augmentation_data_len; ++i)
5308                     printf (" %02x", augmentation_data[i]);
5309                   putchar ('\n');
5310                 }
5311               putchar ('\n');
5312             }
5313
5314           if (augmentation_data_len)
5315             {
5316               unsigned char *p, *q;
5317               p = (unsigned char *) fc->augmentation + 1;
5318               q = augmentation_data;
5319
5320               while (1)
5321                 {
5322                   if (*p == 'L')
5323                     q++;
5324                   else if (*p == 'P')
5325                     q += 1 + size_of_encoded_value (*q);
5326                   else if (*p == 'R')
5327                     fc->fde_encoding = *q++;
5328                   else if (*p == 'S')
5329                     ;
5330                   else
5331                     break;
5332                   p++;
5333                 }
5334
5335               if (fc->fde_encoding)
5336                 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
5337             }
5338
5339           frame_need_space (fc, fc->ra);
5340         }
5341       else
5342         {
5343           unsigned char *look_for;
5344           static Frame_Chunk fde_fc;
5345           unsigned long segment_selector;
5346
5347           fc = & fde_fc;
5348           memset (fc, 0, sizeof (Frame_Chunk));
5349
5350           look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
5351
5352           for (cie = chunks; cie ; cie = cie->next)
5353             if (cie->chunk_start == look_for)
5354               break;
5355
5356           if (!cie)
5357             {
5358               warn ("Invalid CIE pointer 0x%s in FDE at %#08lx\n",
5359                     dwarf_vmatoa_1 (NULL, cie_id, offset_size),
5360                     (unsigned long) (saved_start - section_start));
5361               fc->ncols = 0;
5362               fc->col_type = (short int *) xmalloc (sizeof (short int));
5363               fc->col_offset = (int *) xmalloc (sizeof (int));
5364               frame_need_space (fc, max_regs - 1);
5365               cie = fc;
5366               fc->augmentation = "";
5367               fc->fde_encoding = 0;
5368               fc->ptr_size = eh_addr_size;
5369               fc->segment_size = 0;
5370             }
5371           else
5372             {
5373               fc->ncols = cie->ncols;
5374               fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
5375               fc->col_offset =  (int *) xcmalloc (fc->ncols, sizeof (int));
5376               memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
5377               memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
5378               fc->augmentation = cie->augmentation;
5379               fc->ptr_size = cie->ptr_size;
5380               eh_addr_size = cie->ptr_size;
5381               fc->segment_size = cie->segment_size;
5382               fc->code_factor = cie->code_factor;
5383               fc->data_factor = cie->data_factor;
5384               fc->cfa_reg = cie->cfa_reg;
5385               fc->cfa_offset = cie->cfa_offset;
5386               fc->ra = cie->ra;
5387               frame_need_space (fc, max_regs - 1);
5388               fc->fde_encoding = cie->fde_encoding;
5389             }
5390
5391           if (fc->fde_encoding)
5392             encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
5393
5394           segment_selector = 0;
5395           if (fc->segment_size)
5396             {
5397               SAFE_BYTE_GET_AND_INC (segment_selector, start, fc->segment_size, end);
5398             }
5399           fc->pc_begin = get_encoded_value (start, fc->fde_encoding, section);
5400           start += encoded_ptr_size;
5401
5402           /* FIXME: It appears that sometimes the final pc_range value is
5403              encoded in less than encoded_ptr_size bytes.  See the x86_64
5404              run of the "objcopy on compressed debug sections" test for an
5405              example of this.  */
5406           SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end);
5407
5408           if (cie->augmentation[0] == 'z')
5409             {
5410               augmentation_data_len = LEB ();
5411               augmentation_data = start;
5412               start += augmentation_data_len;
5413             }
5414
5415           printf ("\n%08lx %s %s FDE cie=%08lx pc=",
5416                   (unsigned long)(saved_start - section_start),
5417                   dwarf_vmatoa_1 (NULL, length, fc->ptr_size),
5418                   dwarf_vmatoa_1 (NULL, cie_id, offset_size),
5419                   (unsigned long)(cie->chunk_start - section_start));
5420
5421           if (fc->segment_size)
5422             printf ("%04lx:", segment_selector);
5423
5424           printf ("%s..%s\n",
5425                   dwarf_vmatoa_1 (NULL, fc->pc_begin, fc->ptr_size),
5426                   dwarf_vmatoa_1 (NULL, fc->pc_begin + fc->pc_range, fc->ptr_size));
5427
5428           if (! do_debug_frames_interp && augmentation_data_len)
5429             {
5430               unsigned long i;
5431
5432               printf ("  Augmentation data:    ");
5433               for (i = 0; i < augmentation_data_len; ++i)
5434                 printf (" %02x", augmentation_data[i]);
5435               putchar ('\n');
5436               putchar ('\n');
5437             }
5438         }
5439
5440       /* At this point, fc is the current chunk, cie (if any) is set, and
5441          we're about to interpret instructions for the chunk.  */
5442       /* ??? At present we need to do this always, since this sizes the
5443          fc->col_type and fc->col_offset arrays, which we write into always.
5444          We should probably split the interpreted and non-interpreted bits
5445          into two different routines, since there's so much that doesn't
5446          really overlap between them.  */
5447       if (1 || do_debug_frames_interp)
5448         {
5449           /* Start by making a pass over the chunk, allocating storage
5450              and taking note of what registers are used.  */
5451           unsigned char *tmp = start;
5452
5453           while (start < block_end)
5454             {
5455               unsigned op, opa;
5456               unsigned long reg, temp;
5457
5458               op = *start++;
5459               opa = op & 0x3f;
5460               if (op & 0xc0)
5461                 op &= 0xc0;
5462
5463               /* Warning: if you add any more cases to this switch, be
5464                  sure to add them to the corresponding switch below.  */
5465               switch (op)
5466                 {
5467                 case DW_CFA_advance_loc:
5468                   break;
5469                 case DW_CFA_offset:
5470                   LEB ();
5471                   if (frame_need_space (fc, opa) >= 0)
5472                     fc->col_type[opa] = DW_CFA_undefined;
5473                   break;
5474                 case DW_CFA_restore:
5475                   if (frame_need_space (fc, opa) >= 0)
5476                     fc->col_type[opa] = DW_CFA_undefined;
5477                   break;
5478                 case DW_CFA_set_loc:
5479                   start += encoded_ptr_size;
5480                   break;
5481                 case DW_CFA_advance_loc1:
5482                   start += 1;
5483                   break;
5484                 case DW_CFA_advance_loc2:
5485                   start += 2;
5486                   break;
5487                 case DW_CFA_advance_loc4:
5488                   start += 4;
5489                   break;
5490                 case DW_CFA_offset_extended:
5491                 case DW_CFA_val_offset:
5492                   reg = LEB (); LEB ();
5493                   if (frame_need_space (fc, reg) >= 0)
5494                     fc->col_type[reg] = DW_CFA_undefined;
5495                   break;
5496                 case DW_CFA_restore_extended:
5497                   reg = LEB ();
5498                   frame_need_space (fc, reg);
5499                   if (frame_need_space (fc, reg) >= 0)
5500                     fc->col_type[reg] = DW_CFA_undefined;
5501                   break;
5502                 case DW_CFA_undefined:
5503                   reg = LEB ();
5504                   if (frame_need_space (fc, reg) >= 0)
5505                     fc->col_type[reg] = DW_CFA_undefined;
5506                   break;
5507                 case DW_CFA_same_value:
5508                   reg = LEB ();
5509                   if (frame_need_space (fc, reg) >= 0)
5510                     fc->col_type[reg] = DW_CFA_undefined;
5511                   break;
5512                 case DW_CFA_register:
5513                   reg = LEB (); LEB ();
5514                   if (frame_need_space (fc, reg) >= 0)
5515                     fc->col_type[reg] = DW_CFA_undefined;
5516                   break;
5517                 case DW_CFA_def_cfa:
5518                   LEB (); LEB ();
5519                   break;
5520                 case DW_CFA_def_cfa_register:
5521                   LEB ();
5522                   break;
5523                 case DW_CFA_def_cfa_offset:
5524                   LEB ();
5525                   break;
5526                 case DW_CFA_def_cfa_expression:
5527                   temp = LEB ();
5528                   start += temp;
5529                   break;
5530                 case DW_CFA_expression:
5531                 case DW_CFA_val_expression:
5532                   reg = LEB ();
5533                   temp = LEB ();
5534                   start += temp;
5535                   if (frame_need_space (fc, reg) >= 0)
5536                     fc->col_type[reg] = DW_CFA_undefined;
5537                   break;
5538                 case DW_CFA_offset_extended_sf:
5539                 case DW_CFA_val_offset_sf:
5540                   reg = LEB (); SLEB ();
5541                   if (frame_need_space (fc, reg) >= 0)
5542                     fc->col_type[reg] = DW_CFA_undefined;
5543                   break;
5544                 case DW_CFA_def_cfa_sf:
5545                   LEB (); SLEB ();
5546                   break;
5547                 case DW_CFA_def_cfa_offset_sf:
5548                   SLEB ();
5549                   break;
5550                 case DW_CFA_MIPS_advance_loc8:
5551                   start += 8;
5552                   break;
5553                 case DW_CFA_GNU_args_size:
5554                   LEB ();
5555                   break;
5556                 case DW_CFA_GNU_negative_offset_extended:
5557                   reg = LEB (); LEB ();
5558                   if (frame_need_space (fc, reg) >= 0)
5559                     fc->col_type[reg] = DW_CFA_undefined;
5560                   break;
5561                 default:
5562                   break;
5563                 }
5564             }
5565           start = tmp;
5566         }
5567
5568       /* Now we know what registers are used, make a second pass over
5569          the chunk, this time actually printing out the info.  */
5570
5571       while (start < block_end)
5572         {
5573           unsigned op, opa;
5574           unsigned long ul, reg, roffs;
5575           long l;
5576           dwarf_vma ofs;
5577           dwarf_vma vma;
5578           const char *reg_prefix = "";
5579
5580           op = *start++;
5581           opa = op & 0x3f;
5582           if (op & 0xc0)
5583             op &= 0xc0;
5584
5585           /* Warning: if you add any more cases to this switch, be
5586              sure to add them to the corresponding switch above.  */
5587           switch (op)
5588             {
5589             case DW_CFA_advance_loc:
5590               if (do_debug_frames_interp)
5591                 frame_display_row (fc, &need_col_headers, &max_regs);
5592               else
5593                 printf ("  DW_CFA_advance_loc: %d to %s\n",
5594                         opa * fc->code_factor,
5595                         dwarf_vmatoa_1 (NULL, 
5596                                         fc->pc_begin + opa * fc->code_factor,
5597                                         fc->ptr_size));
5598               fc->pc_begin += opa * fc->code_factor;
5599               break;
5600
5601             case DW_CFA_offset:
5602               roffs = LEB ();
5603               if (opa >= (unsigned int) fc->ncols)
5604                 reg_prefix = bad_reg;
5605               if (! do_debug_frames_interp || *reg_prefix != '\0')
5606                 printf ("  DW_CFA_offset: %s%s at cfa%+ld\n",
5607                         reg_prefix, regname (opa, 0),
5608                         roffs * fc->data_factor);
5609               if (*reg_prefix == '\0')
5610                 {
5611                   fc->col_type[opa] = DW_CFA_offset;
5612                   fc->col_offset[opa] = roffs * fc->data_factor;
5613                 }
5614               break;
5615
5616             case DW_CFA_restore:
5617               if (opa >= (unsigned int) cie->ncols
5618                   || opa >= (unsigned int) fc->ncols)
5619                 reg_prefix = bad_reg;
5620               if (! do_debug_frames_interp || *reg_prefix != '\0')
5621                 printf ("  DW_CFA_restore: %s%s\n",
5622                         reg_prefix, regname (opa, 0));
5623               if (*reg_prefix == '\0')
5624                 {
5625                   fc->col_type[opa] = cie->col_type[opa];
5626                   fc->col_offset[opa] = cie->col_offset[opa];
5627                   if (do_debug_frames_interp
5628                       && fc->col_type[opa] == DW_CFA_unreferenced)
5629                     fc->col_type[opa] = DW_CFA_undefined;
5630                 }
5631               break;
5632
5633             case DW_CFA_set_loc:
5634               vma = get_encoded_value (start, fc->fde_encoding, section);
5635               start += encoded_ptr_size;
5636               if (do_debug_frames_interp)
5637                 frame_display_row (fc, &need_col_headers, &max_regs);
5638               else
5639                 printf ("  DW_CFA_set_loc: %s\n",
5640                         dwarf_vmatoa_1 (NULL, vma, fc->ptr_size));
5641               fc->pc_begin = vma;
5642               break;
5643
5644             case DW_CFA_advance_loc1:
5645               SAFE_BYTE_GET_AND_INC (ofs, start, 1, end);
5646               if (do_debug_frames_interp)
5647                 frame_display_row (fc, &need_col_headers, &max_regs);
5648               else
5649                 printf ("  DW_CFA_advance_loc1: %ld to %s\n",
5650                         (unsigned long) (ofs * fc->code_factor),
5651                         dwarf_vmatoa_1 (NULL,
5652                                         fc->pc_begin + ofs * fc->code_factor,
5653                                         fc->ptr_size));
5654               fc->pc_begin += ofs * fc->code_factor;
5655               break;
5656
5657             case DW_CFA_advance_loc2:
5658               SAFE_BYTE_GET_AND_INC (ofs, start, 2, end);
5659               if (do_debug_frames_interp)
5660                 frame_display_row (fc, &need_col_headers, &max_regs);
5661               else
5662                 printf ("  DW_CFA_advance_loc2: %ld to %s\n",
5663                         (unsigned long) (ofs * fc->code_factor),
5664                         dwarf_vmatoa_1 (NULL,
5665                                         fc->pc_begin + ofs * fc->code_factor,
5666                                         fc->ptr_size));
5667               fc->pc_begin += ofs * fc->code_factor;
5668               break;
5669
5670             case DW_CFA_advance_loc4:
5671               SAFE_BYTE_GET_AND_INC (ofs, start, 4, end);
5672               if (do_debug_frames_interp)
5673                 frame_display_row (fc, &need_col_headers, &max_regs);
5674               else
5675                 printf ("  DW_CFA_advance_loc4: %ld to %s\n",
5676                         (unsigned long) (ofs * fc->code_factor),
5677                         dwarf_vmatoa_1 (NULL,
5678                                         fc->pc_begin + ofs * fc->code_factor,
5679                                         fc->ptr_size));
5680               fc->pc_begin += ofs * fc->code_factor;
5681               break;
5682
5683             case DW_CFA_offset_extended:
5684               reg = LEB ();
5685               roffs = LEB ();
5686               if (reg >= (unsigned int) fc->ncols)
5687                 reg_prefix = bad_reg;
5688               if (! do_debug_frames_interp || *reg_prefix != '\0')
5689                 printf ("  DW_CFA_offset_extended: %s%s at cfa%+ld\n",
5690                         reg_prefix, regname (reg, 0),
5691                         roffs * fc->data_factor);
5692               if (*reg_prefix == '\0')
5693                 {
5694                   fc->col_type[reg] = DW_CFA_offset;
5695                   fc->col_offset[reg] = roffs * fc->data_factor;
5696                 }
5697               break;
5698
5699             case DW_CFA_val_offset:
5700               reg = LEB ();
5701               roffs = LEB ();
5702               if (reg >= (unsigned int) fc->ncols)
5703                 reg_prefix = bad_reg;
5704               if (! do_debug_frames_interp || *reg_prefix != '\0')
5705                 printf ("  DW_CFA_val_offset: %s%s at cfa%+ld\n",
5706                         reg_prefix, regname (reg, 0),
5707                         roffs * fc->data_factor);
5708               if (*reg_prefix == '\0')
5709                 {
5710                   fc->col_type[reg] = DW_CFA_val_offset;
5711                   fc->col_offset[reg] = roffs * fc->data_factor;
5712                 }
5713               break;
5714
5715             case DW_CFA_restore_extended:
5716               reg = LEB ();
5717               if (reg >= (unsigned int) cie->ncols
5718                   || reg >= (unsigned int) fc->ncols)
5719                 reg_prefix = bad_reg;
5720               if (! do_debug_frames_interp || *reg_prefix != '\0')
5721                 printf ("  DW_CFA_restore_extended: %s%s\n",
5722                         reg_prefix, regname (reg, 0));
5723               if (*reg_prefix == '\0')
5724                 {
5725                   fc->col_type[reg] = cie->col_type[reg];
5726                   fc->col_offset[reg] = cie->col_offset[reg];
5727                 }
5728               break;
5729
5730             case DW_CFA_undefined:
5731               reg = LEB ();
5732               if (reg >= (unsigned int) fc->ncols)
5733                 reg_prefix = bad_reg;
5734               if (! do_debug_frames_interp || *reg_prefix != '\0')
5735                 printf ("  DW_CFA_undefined: %s%s\n",
5736                         reg_prefix, regname (reg, 0));
5737               if (*reg_prefix == '\0')
5738                 {
5739                   fc->col_type[reg] = DW_CFA_undefined;
5740                   fc->col_offset[reg] = 0;
5741                 }
5742               break;
5743
5744             case DW_CFA_same_value:
5745               reg = LEB ();
5746               if (reg >= (unsigned int) fc->ncols)
5747                 reg_prefix = bad_reg;
5748               if (! do_debug_frames_interp || *reg_prefix != '\0')
5749                 printf ("  DW_CFA_same_value: %s%s\n",
5750                         reg_prefix, regname (reg, 0));
5751               if (*reg_prefix == '\0')
5752                 {
5753                   fc->col_type[reg] = DW_CFA_same_value;
5754                   fc->col_offset[reg] = 0;
5755                 }
5756               break;
5757
5758             case DW_CFA_register:
5759               reg = LEB ();
5760               roffs = LEB ();
5761               if (reg >= (unsigned int) fc->ncols)
5762                 reg_prefix = bad_reg;
5763               if (! do_debug_frames_interp || *reg_prefix != '\0')
5764                 {
5765                   printf ("  DW_CFA_register: %s%s in ",
5766                           reg_prefix, regname (reg, 0));
5767                   puts (regname (roffs, 0));
5768                 }
5769               if (*reg_prefix == '\0')
5770                 {
5771                   fc->col_type[reg] = DW_CFA_register;
5772                   fc->col_offset[reg] = roffs;
5773                 }
5774               break;
5775
5776             case DW_CFA_remember_state:
5777               if (! do_debug_frames_interp)
5778                 printf ("  DW_CFA_remember_state\n");
5779               rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
5780               rs->ncols = fc->ncols;
5781               rs->col_type = (short int *) xcmalloc (rs->ncols,
5782                                                      sizeof (short int));
5783               rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (int));
5784               memcpy (rs->col_type, fc->col_type, rs->ncols);
5785               memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
5786               rs->next = remembered_state;
5787               remembered_state = rs;
5788               break;
5789
5790             case DW_CFA_restore_state:
5791               if (! do_debug_frames_interp)
5792                 printf ("  DW_CFA_restore_state\n");
5793               rs = remembered_state;
5794               if (rs)
5795                 {
5796                   remembered_state = rs->next;
5797                   frame_need_space (fc, rs->ncols - 1);
5798                   memcpy (fc->col_type, rs->col_type, rs->ncols);
5799                   memcpy (fc->col_offset, rs->col_offset,
5800                           rs->ncols * sizeof (int));
5801                   free (rs->col_type);
5802                   free (rs->col_offset);
5803                   free (rs);
5804                 }
5805               else if (do_debug_frames_interp)
5806                 printf ("Mismatched DW_CFA_restore_state\n");
5807               break;
5808
5809             case DW_CFA_def_cfa:
5810               fc->cfa_reg = LEB ();
5811               fc->cfa_offset = LEB ();
5812               fc->cfa_exp = 0;
5813               if (! do_debug_frames_interp)
5814                 printf ("  DW_CFA_def_cfa: %s ofs %d\n",
5815                         regname (fc->cfa_reg, 0), fc->cfa_offset);
5816               break;
5817
5818             case DW_CFA_def_cfa_register:
5819               fc->cfa_reg = LEB ();
5820               fc->cfa_exp = 0;
5821               if (! do_debug_frames_interp)
5822                 printf ("  DW_CFA_def_cfa_register: %s\n",
5823                         regname (fc->cfa_reg, 0));
5824               break;
5825
5826             case DW_CFA_def_cfa_offset:
5827               fc->cfa_offset = LEB ();
5828               if (! do_debug_frames_interp)
5829                 printf ("  DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
5830               break;
5831
5832             case DW_CFA_nop:
5833               if (! do_debug_frames_interp)
5834                 printf ("  DW_CFA_nop\n");
5835               break;
5836
5837             case DW_CFA_def_cfa_expression:
5838               ul = LEB ();
5839               if (! do_debug_frames_interp)
5840                 {
5841                   printf ("  DW_CFA_def_cfa_expression (");
5842                   decode_location_expression (start, eh_addr_size, 0, -1,
5843                                               ul, 0, section);
5844                   printf (")\n");
5845                 }
5846               fc->cfa_exp = 1;
5847               start += ul;
5848               break;
5849
5850             case DW_CFA_expression:
5851               reg = LEB ();
5852               ul = LEB ();
5853               if (reg >= (unsigned int) fc->ncols)
5854                 reg_prefix = bad_reg;
5855               if (! do_debug_frames_interp || *reg_prefix != '\0')
5856                 {
5857                   printf ("  DW_CFA_expression: %s%s (",
5858                           reg_prefix, regname (reg, 0));
5859                   decode_location_expression (start, eh_addr_size, 0, -1,
5860                                               ul, 0, section);
5861                   printf (")\n");
5862                 }
5863               if (*reg_prefix == '\0')
5864                 fc->col_type[reg] = DW_CFA_expression;
5865               start += ul;
5866               break;
5867
5868             case DW_CFA_val_expression:
5869               reg = LEB ();
5870               ul = LEB ();
5871               if (reg >= (unsigned int) fc->ncols)
5872                 reg_prefix = bad_reg;
5873               if (! do_debug_frames_interp || *reg_prefix != '\0')
5874                 {
5875                   printf ("  DW_CFA_val_expression: %s%s (",
5876                           reg_prefix, regname (reg, 0));
5877                   decode_location_expression (start, eh_addr_size, 0, -1,
5878                                               ul, 0, section);
5879                   printf (")\n");
5880                 }
5881               if (*reg_prefix == '\0')
5882                 fc->col_type[reg] = DW_CFA_val_expression;
5883               start += ul;
5884               break;
5885
5886             case DW_CFA_offset_extended_sf:
5887               reg = LEB ();
5888               l = SLEB ();
5889               if (frame_need_space (fc, reg) < 0)
5890                 reg_prefix = bad_reg;
5891               if (! do_debug_frames_interp || *reg_prefix != '\0')
5892                 printf ("  DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
5893                         reg_prefix, regname (reg, 0),
5894                         l * fc->data_factor);
5895               if (*reg_prefix == '\0')
5896                 {
5897                   fc->col_type[reg] = DW_CFA_offset;
5898                   fc->col_offset[reg] = l * fc->data_factor;
5899                 }
5900               break;
5901
5902             case DW_CFA_val_offset_sf:
5903               reg = LEB ();
5904               l = SLEB ();
5905               if (frame_need_space (fc, reg) < 0)
5906                 reg_prefix = bad_reg;
5907               if (! do_debug_frames_interp || *reg_prefix != '\0')
5908                 printf ("  DW_CFA_val_offset_sf: %s%s at cfa%+ld\n",
5909                         reg_prefix, regname (reg, 0),
5910                         l * fc->data_factor);
5911               if (*reg_prefix == '\0')
5912                 {
5913                   fc->col_type[reg] = DW_CFA_val_offset;
5914                   fc->col_offset[reg] = l * fc->data_factor;
5915                 }
5916               break;
5917
5918             case DW_CFA_def_cfa_sf:
5919               fc->cfa_reg = LEB ();
5920               fc->cfa_offset = SLEB ();
5921               fc->cfa_offset = fc->cfa_offset * fc->data_factor;
5922               fc->cfa_exp = 0;
5923               if (! do_debug_frames_interp)
5924                 printf ("  DW_CFA_def_cfa_sf: %s ofs %d\n",
5925                         regname (fc->cfa_reg, 0), fc->cfa_offset);
5926               break;
5927
5928             case DW_CFA_def_cfa_offset_sf:
5929               fc->cfa_offset = SLEB ();
5930               fc->cfa_offset = fc->cfa_offset * fc->data_factor;
5931               if (! do_debug_frames_interp)
5932                 printf ("  DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
5933               break;
5934
5935             case DW_CFA_MIPS_advance_loc8:
5936               SAFE_BYTE_GET_AND_INC (ofs, start, 8, end);
5937               if (do_debug_frames_interp)
5938                 frame_display_row (fc, &need_col_headers, &max_regs);
5939               else
5940                 printf ("  DW_CFA_MIPS_advance_loc8: %ld to %s\n",
5941                         (unsigned long) (ofs * fc->code_factor),
5942                         dwarf_vmatoa_1 (NULL,
5943                                         fc->pc_begin + ofs * fc->code_factor,
5944                                         fc->ptr_size));
5945               fc->pc_begin += ofs * fc->code_factor;
5946               break;
5947
5948             case DW_CFA_GNU_window_save:
5949               if (! do_debug_frames_interp)
5950                 printf ("  DW_CFA_GNU_window_save\n");
5951               break;
5952
5953             case DW_CFA_GNU_args_size:
5954               ul = LEB ();
5955               if (! do_debug_frames_interp)
5956                 printf ("  DW_CFA_GNU_args_size: %ld\n", ul);
5957               break;
5958
5959             case DW_CFA_GNU_negative_offset_extended:
5960               reg = LEB ();
5961               l = - LEB ();
5962               if (frame_need_space (fc, reg) < 0)
5963                 reg_prefix = bad_reg;
5964               if (! do_debug_frames_interp || *reg_prefix != '\0')
5965                 printf ("  DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
5966                         reg_prefix, regname (reg, 0),
5967                         l * fc->data_factor);
5968               if (*reg_prefix == '\0')
5969                 {
5970                   fc->col_type[reg] = DW_CFA_offset;
5971                   fc->col_offset[reg] = l * fc->data_factor;
5972                 }
5973               break;
5974
5975             default:
5976               if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
5977                 printf (_("  DW_CFA_??? (User defined call frame op: %#x)\n"), op);
5978               else
5979                 warn (_("unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
5980               start = block_end;
5981             }
5982         }
5983
5984       if (do_debug_frames_interp)
5985         frame_display_row (fc, &need_col_headers, &max_regs);
5986
5987       start = block_end;
5988       eh_addr_size = saved_eh_addr_size;
5989     }
5990
5991   printf ("\n");
5992
5993   return 1;
5994 }
5995
5996 #undef GET
5997 #undef LEB
5998 #undef SLEB
5999
6000 static int
6001 display_gdb_index (struct dwarf_section *section,
6002                    void *file ATTRIBUTE_UNUSED)
6003 {
6004   unsigned char *start = section->start;
6005   uint32_t version;
6006   uint32_t cu_list_offset, tu_list_offset;
6007   uint32_t address_table_offset, symbol_table_offset, constant_pool_offset;
6008   unsigned int cu_list_elements, tu_list_elements;
6009   unsigned int address_table_size, symbol_table_slots;
6010   unsigned char *cu_list, *tu_list;
6011   unsigned char *address_table, *symbol_table, *constant_pool;
6012   unsigned int i;
6013
6014   /* The documentation for the format of this file is in gdb/dwarf2read.c.  */
6015
6016   printf (_("Contents of the %s section:\n"), section->name);
6017
6018   if (section->size < 6 * sizeof (uint32_t))
6019     {
6020       warn (_("Truncated header in the %s section.\n"), section->name);
6021       return 0;
6022     }
6023
6024   version = byte_get_little_endian (start, 4);
6025   printf (_("Version %ld\n"), (long) version);
6026
6027   /* Prior versions are obsolete, and future versions may not be
6028      backwards compatible.  */
6029   if (version < 3 || version > 8)
6030     {
6031       warn (_("Unsupported version %lu.\n"), (unsigned long) version);
6032       return 0;
6033     }
6034   if (version < 4)
6035     warn (_("The address table data in version 3 may be wrong.\n"));
6036   if (version < 5)
6037     warn (_("Version 4 does not support case insensitive lookups.\n"));
6038   if (version < 6)
6039     warn (_("Version 5 does not include inlined functions.\n"));
6040   if (version < 7)
6041       warn (_("Version 6 does not include symbol attributes.\n"));
6042   /* Version 7 indices generated by Gold have bad type unit references,
6043      PR binutils/15021.  But we don't know if the index was generated by
6044      Gold or not, so to avoid worrying users with gdb-generated indices
6045      we say nothing for version 7 here.  */
6046
6047   cu_list_offset = byte_get_little_endian (start + 4, 4);
6048   tu_list_offset = byte_get_little_endian (start + 8, 4);
6049   address_table_offset = byte_get_little_endian (start + 12, 4);
6050   symbol_table_offset = byte_get_little_endian (start + 16, 4);
6051   constant_pool_offset = byte_get_little_endian (start + 20, 4);
6052
6053   if (cu_list_offset > section->size
6054       || tu_list_offset > section->size
6055       || address_table_offset > section->size
6056       || symbol_table_offset > section->size
6057       || constant_pool_offset > section->size)
6058     {
6059       warn (_("Corrupt header in the %s section.\n"), section->name);
6060       return 0;
6061     }
6062
6063   cu_list_elements = (tu_list_offset - cu_list_offset) / 8;
6064   tu_list_elements = (address_table_offset - tu_list_offset) / 8;
6065   address_table_size = symbol_table_offset - address_table_offset;
6066   symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8;
6067
6068   cu_list = start + cu_list_offset;
6069   tu_list = start + tu_list_offset;
6070   address_table = start + address_table_offset;
6071   symbol_table = start + symbol_table_offset;
6072   constant_pool = start + constant_pool_offset;
6073
6074   printf (_("\nCU table:\n"));
6075   for (i = 0; i < cu_list_elements; i += 2)
6076     {
6077       uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8);
6078       uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8);
6079
6080       printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2,
6081               (unsigned long) cu_offset,
6082               (unsigned long) (cu_offset + cu_length - 1));
6083     }
6084
6085   printf (_("\nTU table:\n"));
6086   for (i = 0; i < tu_list_elements; i += 3)
6087     {
6088       uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8);
6089       uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8);
6090       uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8);
6091
6092       printf (_("[%3u] 0x%lx 0x%lx "), i / 3,
6093               (unsigned long) tu_offset,
6094               (unsigned long) type_offset);
6095       print_dwarf_vma (signature, 8);
6096       printf ("\n");
6097     }
6098
6099   printf (_("\nAddress table:\n"));
6100   for (i = 0; i < address_table_size; i += 2 * 8 + 4)
6101     {
6102       uint64_t low = byte_get_little_endian (address_table + i, 8);
6103       uint64_t high = byte_get_little_endian (address_table + i + 8, 8);
6104       uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4);
6105
6106       print_dwarf_vma (low, 8);
6107       print_dwarf_vma (high, 8);
6108       printf (_("%lu\n"), (unsigned long) cu_index);
6109     }
6110
6111   printf (_("\nSymbol table:\n"));
6112   for (i = 0; i < symbol_table_slots; ++i)
6113     {
6114       uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4);
6115       uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4);
6116       uint32_t num_cus, cu;
6117
6118       if (name_offset != 0
6119           || cu_vector_offset != 0)
6120         {
6121           unsigned int j;
6122
6123           printf ("[%3u] %s:", i, constant_pool + name_offset);
6124           num_cus = byte_get_little_endian (constant_pool + cu_vector_offset, 4);
6125           if (num_cus > 1)
6126             printf ("\n");
6127           for (j = 0; j < num_cus; ++j)
6128             {
6129               int is_static;
6130               gdb_index_symbol_kind kind;
6131
6132               cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4);
6133               is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu);
6134               kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu);
6135               cu = GDB_INDEX_CU_VALUE (cu);
6136               /* Convert to TU number if it's for a type unit.  */
6137               if (cu >= cu_list_elements / 2)
6138                 printf ("%cT%lu", num_cus > 1 ? '\t' : ' ',
6139                         (unsigned long) (cu - cu_list_elements / 2));
6140               else
6141                 printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu);
6142
6143               switch (kind)
6144                 {
6145                 case GDB_INDEX_SYMBOL_KIND_NONE:
6146                   printf (_(" [no symbol information]"));
6147                   break;
6148                 case GDB_INDEX_SYMBOL_KIND_TYPE:
6149                   printf (is_static
6150                           ? _(" [static type]")
6151                           : _(" [global type]"));
6152                   break;
6153                 case GDB_INDEX_SYMBOL_KIND_VARIABLE:
6154                   printf (is_static
6155                           ? _(" [static variable]")
6156                           : _(" [global variable]"));
6157                   break;
6158                 case GDB_INDEX_SYMBOL_KIND_FUNCTION:
6159                   printf (is_static
6160                           ? _(" [static function]")
6161                           : _(" [global function]"));
6162                   break;
6163                 case GDB_INDEX_SYMBOL_KIND_OTHER:
6164                   printf (is_static
6165                           ? _(" [static other]")
6166                           : _(" [global other]"));
6167                   break;
6168                 default:
6169                   printf (is_static
6170                           ? _(" [static unknown: %d]")
6171                           : _(" [global unknown: %d]"),
6172                           kind);
6173                   break;
6174                 }
6175               if (num_cus > 1)
6176                 printf ("\n");
6177             }
6178           if (num_cus <= 1)
6179             printf ("\n");
6180         }
6181     }
6182
6183   return 1;
6184 }
6185
6186 /* Pre-allocate enough space for the CU/TU sets needed.  */
6187
6188 static void
6189 prealloc_cu_tu_list (unsigned int nshndx)
6190 {
6191   if (shndx_pool == NULL)
6192     {
6193       shndx_pool_size = nshndx;
6194       shndx_pool_used = 0;
6195       shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size,
6196                                               sizeof (unsigned int));
6197     }
6198   else
6199     {
6200       shndx_pool_size = shndx_pool_used + nshndx;
6201       shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size,
6202                                                sizeof (unsigned int));
6203     }
6204 }
6205
6206 static void
6207 add_shndx_to_cu_tu_entry (unsigned int shndx)
6208 {
6209   if (shndx_pool_used >= shndx_pool_size)
6210     {
6211       error (_("Internal error: out of space in the shndx pool.\n"));
6212       return;
6213     }
6214   shndx_pool [shndx_pool_used++] = shndx;
6215 }
6216
6217 static void
6218 end_cu_tu_entry (void)
6219 {
6220   if (shndx_pool_used >= shndx_pool_size)
6221     {
6222       error (_("Internal error: out of space in the shndx pool.\n"));
6223       return;
6224     }
6225   shndx_pool [shndx_pool_used++] = 0;
6226 }
6227
6228 /* Return the short name of a DWARF section given by a DW_SECT enumerator.  */
6229
6230 static const char *
6231 get_DW_SECT_short_name (unsigned int dw_sect)
6232 {
6233   static char buf[16];
6234
6235   switch (dw_sect)
6236     {
6237       case DW_SECT_INFO:
6238         return "info";
6239       case DW_SECT_TYPES:
6240         return "types";
6241       case DW_SECT_ABBREV:
6242         return "abbrev";
6243       case DW_SECT_LINE:
6244         return "line";
6245       case DW_SECT_LOC:
6246         return "loc";
6247       case DW_SECT_STR_OFFSETS:
6248         return "str_off";
6249       case DW_SECT_MACINFO:
6250         return "macinfo";
6251       case DW_SECT_MACRO:
6252         return "macro";
6253       default:
6254         break;
6255     }
6256
6257   snprintf (buf, sizeof (buf), "%d", dw_sect);
6258   return buf;
6259 }
6260
6261 /* Process a CU or TU index.  If DO_DISPLAY is true, print the contents.
6262    These sections are extensions for Fission.
6263    See http://gcc.gnu.org/wiki/DebugFissionDWP.  */
6264
6265 static int
6266 process_cu_tu_index (struct dwarf_section *section, int do_display)
6267 {
6268   unsigned char *phdr = section->start;
6269   unsigned char *limit = phdr + section->size;
6270   unsigned char *phash;
6271   unsigned char *pindex;
6272   unsigned char *ppool;
6273   unsigned int version;
6274   unsigned int ncols = 0;
6275   unsigned int nused;
6276   unsigned int nslots;
6277   unsigned int i;
6278   unsigned int j;
6279   dwarf_vma signature_high;
6280   dwarf_vma signature_low;
6281   char buf[64];
6282
6283   version = byte_get (phdr, 4);
6284   if (version >= 2)
6285     ncols = byte_get (phdr + 4, 4);
6286   nused = byte_get (phdr + 8, 4);
6287   nslots = byte_get (phdr + 12, 4);
6288   phash = phdr + 16;
6289   pindex = phash + nslots * 8;
6290   ppool = pindex + nslots * 4;
6291
6292   if (do_display)
6293     {
6294       printf (_("Contents of the %s section:\n\n"), section->name);
6295       printf (_("  Version:                 %d\n"), version);
6296       if (version >= 2)
6297         printf (_("  Number of columns:       %d\n"), ncols);
6298       printf (_("  Number of used entries:  %d\n"), nused);
6299       printf (_("  Number of slots:         %d\n\n"), nslots);
6300     }
6301
6302   if (ppool > limit)
6303     {
6304       warn (_("Section %s too small for %d hash table entries\n"),
6305             section->name, nslots);
6306       return 0;
6307     }
6308
6309   if (version == 1)
6310     {
6311       if (!do_display)
6312         prealloc_cu_tu_list ((limit - ppool) / 4);
6313       for (i = 0; i < nslots; i++)
6314         {
6315           unsigned char *shndx_list;
6316           unsigned int shndx;
6317
6318           byte_get_64 (phash, &signature_high, &signature_low);
6319           if (signature_high != 0 || signature_low != 0)
6320             {
6321               j = byte_get (pindex, 4);
6322               shndx_list = ppool + j * 4;
6323               if (do_display)
6324                 printf (_("  [%3d] Signature:  0x%s  Sections: "),
6325                         i, dwarf_vmatoa64 (signature_high, signature_low,
6326                                            buf, sizeof (buf)));
6327               for (;;)
6328                 {
6329                   if (shndx_list >= limit)
6330                     {
6331                       warn (_("Section %s too small for shndx pool\n"),
6332                             section->name);
6333                       return 0;
6334                     }
6335                   shndx = byte_get (shndx_list, 4);
6336                   if (shndx == 0)
6337                     break;
6338                   if (do_display)
6339                     printf (" %d", shndx);
6340                   else
6341                     add_shndx_to_cu_tu_entry (shndx);
6342                   shndx_list += 4;
6343                 }
6344               if (do_display)
6345                 printf ("\n");
6346               else
6347                 end_cu_tu_entry ();
6348             }
6349           phash += 8;
6350           pindex += 4;
6351         }
6352     }
6353   else if (version == 2)
6354     {
6355       unsigned int val;
6356       unsigned int dw_sect;
6357       unsigned char *ph = phash;
6358       unsigned char *pi = pindex;
6359       unsigned char *poffsets = ppool + ncols * 4;
6360       unsigned char *psizes = poffsets + nused * ncols * 4;
6361       unsigned char *pend = psizes + nused * ncols * 4;
6362       bfd_boolean is_tu_index;
6363       struct cu_tu_set *this_set = NULL;
6364       unsigned int row;
6365       unsigned char *prow;
6366
6367       is_tu_index = strcmp (section->name, ".debug_tu_index") == 0;
6368
6369       if (pend > limit)
6370         {
6371           warn (_("Section %s too small for offset and size tables\n"),
6372                 section->name);
6373           return 0;
6374         }
6375
6376       if (do_display)
6377         {
6378           printf (_("  Offset table\n"));
6379           printf ("  slot  %-16s  ",
6380                  is_tu_index ? _("signature") : _("dwo_id"));
6381         }
6382       else
6383         {
6384           if (is_tu_index)
6385             {
6386               tu_count = nused;
6387               tu_sets = xcmalloc (nused, sizeof (struct cu_tu_set));
6388               this_set = tu_sets;
6389             }
6390           else
6391             {
6392               cu_count = nused;
6393               cu_sets = xcmalloc (nused, sizeof (struct cu_tu_set));
6394               this_set = cu_sets;
6395             }
6396         }
6397       if (do_display)
6398         {
6399           for (j = 0; j < ncols; j++)
6400             {
6401               dw_sect = byte_get (ppool + j * 4, 4);
6402               printf (" %8s", get_DW_SECT_short_name (dw_sect));
6403             }
6404           printf ("\n");
6405         }
6406       for (i = 0; i < nslots; i++)
6407         {
6408           byte_get_64 (ph, &signature_high, &signature_low);
6409           row = byte_get (pi, 4);
6410           if (row != 0)
6411             {
6412               if (!do_display)
6413                 memcpy (&this_set[row - 1].signature, ph, sizeof (uint64_t));
6414               prow = poffsets + (row - 1) * ncols * 4;
6415               if (do_display)
6416                 printf (_("  [%3d] 0x%s"),
6417                         i, dwarf_vmatoa64 (signature_high, signature_low,
6418                                            buf, sizeof (buf)));
6419               for (j = 0; j < ncols; j++)
6420                 {
6421                   val = byte_get (prow + j * 4, 4);
6422                   if (do_display)
6423                     printf (" %8d", val);
6424                   else
6425                     {
6426                       dw_sect = byte_get (ppool + j * 4, 4);
6427                       this_set [row - 1].section_offsets [dw_sect] = val;
6428                     }
6429                 }
6430               if (do_display)
6431                 printf ("\n");
6432             }
6433           ph += 8;
6434           pi += 4;
6435         }
6436
6437       ph = phash;
6438       pi = pindex;
6439       if (do_display)
6440         {
6441           printf ("\n");
6442           printf (_("  Size table\n"));
6443           printf ("  slot  %-16s  ",
6444                  is_tu_index ? _("signature") : _("dwo_id"));
6445         }
6446       for (j = 0; j < ncols; j++)
6447         {
6448           val = byte_get (ppool + j * 4, 4);
6449           if (do_display)
6450             printf (" %8s", get_DW_SECT_short_name (val));
6451         }
6452       if (do_display)
6453         printf ("\n");
6454       for (i = 0; i < nslots; i++)
6455         {
6456           byte_get_64 (ph, &signature_high, &signature_low);
6457           row = byte_get (pi, 4);
6458           if (row != 0)
6459             {
6460               prow = psizes + (row - 1) * ncols * 4;
6461               if (do_display)
6462                 printf (_("  [%3d] 0x%s"),
6463                         i, dwarf_vmatoa64 (signature_high, signature_low,
6464                                            buf, sizeof (buf)));
6465               for (j = 0; j < ncols; j++)
6466                 {
6467                   val = byte_get (prow + j * 4, 4);
6468                   if (do_display)
6469                     printf (" %8d", val);
6470                   else
6471                     {
6472                       dw_sect = byte_get (ppool + j * 4, 4);
6473                       this_set [row - 1].section_sizes [dw_sect] = val;
6474                     }
6475                 }
6476               if (do_display)
6477                 printf ("\n");
6478             }
6479           ph += 8;
6480           pi += 4;
6481         }
6482     }
6483   else if (do_display)
6484     printf (_("  Unsupported version\n"));
6485
6486   if (do_display)
6487       printf ("\n");
6488
6489   return 1;
6490 }
6491
6492 /* Load the CU and TU indexes if present.  This will build a list of
6493    section sets that we can use to associate a .debug_info.dwo section
6494    with its associated .debug_abbrev.dwo section in a .dwp file.  */
6495
6496 static void
6497 load_cu_tu_indexes (void *file)
6498 {
6499   /* If we have already loaded (or tried to load) the CU and TU indexes
6500      then do not bother to repeat the task.  */
6501   if (cu_tu_indexes_read)
6502     return;
6503
6504   if (load_debug_section (dwp_cu_index, file))
6505     process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0);
6506
6507   if (load_debug_section (dwp_tu_index, file))
6508     process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0);
6509
6510   cu_tu_indexes_read = 1;
6511 }
6512
6513 /* Find the set of sections that includes section SHNDX.  */
6514
6515 unsigned int *
6516 find_cu_tu_set (void *file, unsigned int shndx)
6517 {
6518   unsigned int i;
6519
6520   load_cu_tu_indexes (file);
6521
6522   /* Find SHNDX in the shndx pool.  */
6523   for (i = 0; i < shndx_pool_used; i++)
6524     if (shndx_pool [i] == shndx)
6525       break;
6526
6527   if (i >= shndx_pool_used)
6528     return NULL;
6529
6530   /* Now backup to find the first entry in the set.  */
6531   while (i > 0 && shndx_pool [i - 1] != 0)
6532     i--;
6533
6534   return shndx_pool + i;
6535 }
6536
6537 /* Display a .debug_cu_index or .debug_tu_index section.  */
6538
6539 static int
6540 display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
6541 {
6542   return process_cu_tu_index (section, 1);
6543 }
6544
6545 static int
6546 display_debug_not_supported (struct dwarf_section *section,
6547                              void *file ATTRIBUTE_UNUSED)
6548 {
6549   printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6550             section->name);
6551
6552   return 1;
6553 }
6554
6555 void *
6556 cmalloc (size_t nmemb, size_t size)
6557 {
6558   /* Check for overflow.  */
6559   if (nmemb >= ~(size_t) 0 / size)
6560     return NULL;
6561   else
6562     return malloc (nmemb * size);
6563 }
6564
6565 void *
6566 xcmalloc (size_t nmemb, size_t size)
6567 {
6568   /* Check for overflow.  */
6569   if (nmemb >= ~(size_t) 0 / size)
6570     return NULL;
6571   else
6572     return xmalloc (nmemb * size);
6573 }
6574
6575 void *
6576 xcrealloc (void *ptr, size_t nmemb, size_t size)
6577 {
6578   /* Check for overflow.  */
6579   if (nmemb >= ~(size_t) 0 / size)
6580     return NULL;
6581   else
6582     return xrealloc (ptr, nmemb * size);
6583 }
6584
6585 void
6586 free_debug_memory (void)
6587 {
6588   unsigned int i;
6589
6590   free_abbrevs ();
6591
6592   for (i = 0; i < max; i++)
6593     free_debug_section ((enum dwarf_section_display_enum) i);
6594
6595   if (debug_information != NULL)
6596     {
6597       if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
6598         {
6599           for (i = 0; i < num_debug_info_entries; i++)
6600             {
6601               if (!debug_information [i].max_loc_offsets)
6602                 {
6603                   free (debug_information [i].loc_offsets);
6604                   free (debug_information [i].have_frame_base);
6605                 }
6606               if (!debug_information [i].max_range_lists)
6607                 free (debug_information [i].range_lists);
6608             }
6609         }
6610
6611       free (debug_information);
6612       debug_information = NULL;
6613       num_debug_info_entries = 0;
6614     }
6615 }
6616
6617 void
6618 dwarf_select_sections_by_names (const char *names)
6619 {
6620   typedef struct
6621   {
6622     const char * option;
6623     int *        variable;
6624     int          val;
6625   }
6626   debug_dump_long_opts;
6627
6628   static const debug_dump_long_opts opts_table [] =
6629     {
6630       /* Please keep this table alpha- sorted.  */
6631       { "Ranges", & do_debug_ranges, 1 },
6632       { "abbrev", & do_debug_abbrevs, 1 },
6633       { "addr", & do_debug_addr, 1 },
6634       { "aranges", & do_debug_aranges, 1 },
6635       { "cu_index", & do_debug_cu_index, 1 },
6636       { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
6637       { "frames", & do_debug_frames, 1 },
6638       { "frames-interp", & do_debug_frames_interp, 1 },
6639       /* The special .gdb_index section.  */
6640       { "gdb_index", & do_gdb_index, 1 },
6641       { "info", & do_debug_info, 1 },
6642       { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility.  */
6643       { "loc",  & do_debug_loc, 1 },
6644       { "macro", & do_debug_macinfo, 1 },
6645       { "pubnames", & do_debug_pubnames, 1 },
6646       { "pubtypes", & do_debug_pubtypes, 1 },
6647       /* This entry is for compatability
6648          with earlier versions of readelf.  */
6649       { "ranges", & do_debug_aranges, 1 },
6650       { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
6651       { "str", & do_debug_str, 1 },
6652       /* These trace_* sections are used by Itanium VMS.  */
6653       { "trace_abbrev", & do_trace_abbrevs, 1 },
6654       { "trace_aranges", & do_trace_aranges, 1 },
6655       { "trace_info", & do_trace_info, 1 },
6656       { NULL, NULL, 0 }
6657     };
6658
6659   const char *p;
6660
6661   p = names;
6662   while (*p)
6663     {
6664       const debug_dump_long_opts * entry;
6665
6666       for (entry = opts_table; entry->option; entry++)
6667         {
6668           size_t len = strlen (entry->option);
6669
6670           if (strncmp (p, entry->option, len) == 0
6671               && (p[len] == ',' || p[len] == '\0'))
6672             {
6673               * entry->variable |= entry->val;
6674
6675               /* The --debug-dump=frames-interp option also
6676                  enables the --debug-dump=frames option.  */
6677               if (do_debug_frames_interp)
6678                 do_debug_frames = 1;
6679
6680               p += len;
6681               break;
6682             }
6683         }
6684
6685       if (entry->option == NULL)
6686         {
6687           warn (_("Unrecognized debug option '%s'\n"), p);
6688           p = strchr (p, ',');
6689           if (p == NULL)
6690             break;
6691         }
6692
6693       if (*p == ',')
6694         p++;
6695     }
6696 }
6697
6698 void
6699 dwarf_select_sections_by_letters (const char *letters)
6700 {
6701   unsigned int lindex = 0;
6702
6703   while (letters[lindex])
6704     switch (letters[lindex++])
6705       {
6706       case 'i':
6707         do_debug_info = 1;
6708         break;
6709
6710       case 'a':
6711         do_debug_abbrevs = 1;
6712         break;
6713
6714       case 'l':
6715         do_debug_lines |= FLAG_DEBUG_LINES_RAW;
6716         break;
6717
6718       case 'L':
6719         do_debug_lines |= FLAG_DEBUG_LINES_DECODED;
6720         break;
6721
6722       case 'p':
6723         do_debug_pubnames = 1;
6724         break;
6725
6726       case 't':
6727         do_debug_pubtypes = 1;
6728         break;
6729
6730       case 'r':
6731         do_debug_aranges = 1;
6732         break;
6733
6734       case 'R':
6735         do_debug_ranges = 1;
6736         break;
6737
6738       case 'F':
6739         do_debug_frames_interp = 1;
6740       case 'f':
6741         do_debug_frames = 1;
6742         break;
6743
6744       case 'm':
6745         do_debug_macinfo = 1;
6746         break;
6747
6748       case 's':
6749         do_debug_str = 1;
6750         break;
6751
6752       case 'o':
6753         do_debug_loc = 1;
6754         break;
6755
6756       default:
6757         warn (_("Unrecognized debug option '%s'\n"), optarg);
6758         break;
6759       }
6760 }
6761
6762 void
6763 dwarf_select_sections_all (void)
6764 {
6765   do_debug_info = 1;
6766   do_debug_abbrevs = 1;
6767   do_debug_lines = FLAG_DEBUG_LINES_RAW;
6768   do_debug_pubnames = 1;
6769   do_debug_pubtypes = 1;
6770   do_debug_aranges = 1;
6771   do_debug_ranges = 1;
6772   do_debug_frames = 1;
6773   do_debug_macinfo = 1;
6774   do_debug_str = 1;
6775   do_debug_loc = 1;
6776   do_gdb_index = 1;
6777   do_trace_info = 1;
6778   do_trace_abbrevs = 1;
6779   do_trace_aranges = 1;
6780   do_debug_addr = 1;
6781   do_debug_cu_index = 1;
6782 }
6783
6784 struct dwarf_section_display debug_displays[] =
6785 {
6786   { { ".debug_abbrev",      ".zdebug_abbrev",   NULL, NULL, 0, 0, 0 },
6787     display_debug_abbrev,   &do_debug_abbrevs,  0 },
6788   { { ".debug_aranges",     ".zdebug_aranges",  NULL, NULL, 0, 0, 0 },
6789     display_debug_aranges,  &do_debug_aranges,  1 },
6790   { { ".debug_frame",       ".zdebug_frame",    NULL, NULL, 0, 0, 0 },
6791     display_debug_frames,   &do_debug_frames,   1 },
6792   { { ".debug_info",        ".zdebug_info",     NULL, NULL, 0, 0, abbrev },
6793     display_debug_info,     &do_debug_info,     1 },
6794   { { ".debug_line",        ".zdebug_line",     NULL, NULL, 0, 0, 0 },
6795     display_debug_lines,    &do_debug_lines,    1 },
6796   { { ".debug_pubnames",    ".zdebug_pubnames", NULL, NULL, 0, 0, 0 },
6797     display_debug_pubnames, &do_debug_pubnames, 0 },
6798   { { ".eh_frame",          "",                 NULL, NULL, 0, 0, 0 },
6799     display_debug_frames,   &do_debug_frames,   1 },
6800   { { ".debug_macinfo",     ".zdebug_macinfo",  NULL, NULL, 0, 0, 0 },
6801     display_debug_macinfo,  &do_debug_macinfo,  0 },
6802   { { ".debug_macro",       ".zdebug_macro",    NULL, NULL, 0, 0, 0 },
6803     display_debug_macro,    &do_debug_macinfo,  1 },
6804   { { ".debug_str",         ".zdebug_str",      NULL, NULL, 0, 0, 0 },
6805     display_debug_str,      &do_debug_str,      0 },
6806   { { ".debug_loc",         ".zdebug_loc",      NULL, NULL, 0, 0, 0 },
6807     display_debug_loc,      &do_debug_loc,      1 },
6808   { { ".debug_pubtypes",    ".zdebug_pubtypes", NULL, NULL, 0, 0, 0 },
6809     display_debug_pubnames, &do_debug_pubtypes, 0 },
6810   { { ".debug_ranges",      ".zdebug_ranges",   NULL, NULL, 0, 0, 0 },
6811     display_debug_ranges,   &do_debug_ranges,   1 },
6812   { { ".debug_static_func", ".zdebug_static_func", NULL, NULL, 0, 0, 0 },
6813     display_debug_not_supported, NULL,          0 },
6814   { { ".debug_static_vars", ".zdebug_static_vars", NULL, NULL, 0, 0, 0 },
6815     display_debug_not_supported, NULL,          0 },
6816   { { ".debug_types",       ".zdebug_types",    NULL, NULL, 0, 0, abbrev },
6817     display_debug_types,    &do_debug_info,     1 },
6818   { { ".debug_weaknames",   ".zdebug_weaknames", NULL, NULL, 0, 0, 0 },
6819     display_debug_not_supported, NULL,          0 },
6820   { { ".gdb_index",         "",                 NULL, NULL, 0, 0, 0 },
6821     display_gdb_index,      &do_gdb_index,      0 },
6822   { { ".trace_info",        "",                 NULL, NULL, 0, 0, trace_abbrev },
6823     display_trace_info,     &do_trace_info,     1 },
6824   { { ".trace_abbrev",      "",                 NULL, NULL, 0, 0, 0 },
6825     display_debug_abbrev,   &do_trace_abbrevs,  0 },
6826   { { ".trace_aranges",     "",                 NULL, NULL, 0, 0, 0 },
6827     display_debug_aranges,  &do_trace_aranges,  0 },
6828   { { ".debug_info.dwo",    ".zdebug_info.dwo", NULL, NULL, 0, 0, abbrev_dwo },
6829     display_debug_info,     &do_debug_info,     1 },
6830   { { ".debug_abbrev.dwo",  ".zdebug_abbrev.dwo", NULL, NULL, 0, 0, 0 },
6831     display_debug_abbrev,   &do_debug_abbrevs,  0 },
6832   { { ".debug_types.dwo",   ".zdebug_types.dwo", NULL, NULL, 0, 0, abbrev_dwo },
6833     display_debug_types,    &do_debug_info,     1 },
6834   { { ".debug_line.dwo",    ".zdebug_line.dwo", NULL, NULL, 0, 0, 0 },
6835     display_debug_lines,    &do_debug_lines,    1 },
6836   { { ".debug_loc.dwo",     ".zdebug_loc.dwo",  NULL, NULL, 0, 0, 0 },
6837     display_debug_loc,      &do_debug_loc,      1 },
6838   { { ".debug_macro.dwo",   ".zdebug_macro.dwo", NULL, NULL, 0, 0, 0 },
6839     display_debug_macro,    &do_debug_macinfo,  1 },
6840   { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NULL, NULL, 0, 0, 0 },
6841     display_debug_macinfo,  &do_debug_macinfo,  0 },
6842   { { ".debug_str.dwo",     ".zdebug_str.dwo",  NULL, NULL, 0, 0, 0 },
6843     display_debug_str,      &do_debug_str,      1 },
6844   { { ".debug_str_offsets", ".zdebug_str_offsets", NULL, NULL, 0, 0, 0 },
6845     display_debug_str_offsets, NULL,            0 },
6846   { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NULL, NULL, 0, 0, 0 },
6847     display_debug_str_offsets, NULL,            0 },
6848   { { ".debug_addr",        ".zdebug_addr",     NULL, NULL, 0, 0, 0 },
6849     display_debug_addr,     &do_debug_addr,     1 },
6850   { { ".debug_cu_index",    "",                 NULL, NULL, 0, 0, 0 },
6851     display_cu_index,       &do_debug_cu_index, 0 },
6852   { { ".debug_tu_index",    "",                 NULL, NULL, 0, 0, 0 },
6853     display_cu_index,       &do_debug_cu_index, 0 },
6854 };