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