1 /* dwarf.c -- display DWARF contents of a BFD binary file
2    Copyright (C) 2005-2020 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 #include "filenames.h"
32 #include "safe-ctype.h"
33 #include <assert.h>
34 
35 #ifdef HAVE_LIBDEBUGINFOD
36 #include <elfutils/debuginfod.h>
37 #endif
38 
39 #undef MAX
40 #undef MIN
41 #define MAX(a, b) ((a) > (b) ? (a) : (b))
42 #define MIN(a, b) ((a) < (b) ? (a) : (b))
43 
44 static const char *regname (unsigned int regno, int row);
45 static const char *regname_internal_by_table_only (unsigned int regno);
46 
47 static int have_frame_base;
48 static int need_base_address;
49 
50 static unsigned int num_debug_info_entries = 0;
51 static unsigned int alloc_num_debug_info_entries = 0;
52 static debug_info *debug_information = NULL;
53 /* Special value for num_debug_info_entries to indicate
54    that the .debug_info section could not be loaded/parsed.  */
55 #define DEBUG_INFO_UNAVAILABLE  (unsigned int) -1
56 
57 /* A .debug_info section can contain multiple links to separate
58    DWO object files.  We use these structures to record these links.  */
59 typedef enum dwo_type
60 {
61  DWO_NAME,
62  DWO_DIR,
63  DWO_ID
64 } dwo_type;
65 
66 typedef struct dwo_info
67 {
68   dwo_type          type;
69   const char *      value;
70   struct dwo_info * next;
71 } dwo_info;
72 
73 static dwo_info *   first_dwo_info = NULL;
74 static bfd_boolean  need_dwo_info;
75 
76 separate_info * first_separate_info = NULL;
77 
78 unsigned int eh_addr_size;
79 
80 int do_debug_info;
81 int do_debug_abbrevs;
82 int do_debug_lines;
83 int do_debug_pubnames;
84 int do_debug_pubtypes;
85 int do_debug_aranges;
86 int do_debug_ranges;
87 int do_debug_frames;
88 int do_debug_frames_interp;
89 int do_debug_macinfo;
90 int do_debug_str;
91 int do_debug_loc;
92 int do_gdb_index;
93 int do_trace_info;
94 int do_trace_abbrevs;
95 int do_trace_aranges;
96 int do_debug_addr;
97 int do_debug_cu_index;
98 int do_wide;
99 int do_debug_links;
100 int do_follow_links;
101 
102 int dwarf_cutoff_level = -1;
103 unsigned long dwarf_start_die;
104 
105 int dwarf_check = 0;
106 
107 /* Convenient constant, to avoid having to cast -1 to dwarf_vma when
108    testing whether e.g. a locview list is present.  */
109 static const dwarf_vma vm1 = -1;
110 
111 /* Collection of CU/TU section sets from .debug_cu_index and .debug_tu_index
112    sections.  For version 1 package files, each set is stored in SHNDX_POOL
113    as a zero-terminated list of section indexes comprising one set of debug
114    sections from a .dwo file.  */
115 
116 static unsigned int *shndx_pool = NULL;
117 static unsigned int shndx_pool_size = 0;
118 static unsigned int shndx_pool_used = 0;
119 
120 /* For version 2 package files, each set contains an array of section offsets
121    and an array of section sizes, giving the offset and size of the
122    contribution from a CU or TU within one of the debug sections.
123    When displaying debug info from a package file, we need to use these
124    tables to locate the corresponding contributions to each section.  */
125 
126 struct cu_tu_set
127 {
128   uint64_t   signature;
129   dwarf_vma  section_offsets[DW_SECT_MAX];
130   size_t     section_sizes[DW_SECT_MAX];
131 };
132 
133 static int cu_count = 0;
134 static int tu_count = 0;
135 static struct cu_tu_set *cu_sets = NULL;
136 static struct cu_tu_set *tu_sets = NULL;
137 
138 static bfd_boolean load_cu_tu_indexes (void *);
139 
140 /* An array that indicates for a given level of CU nesting whether
141    the latest DW_AT_type seen for that level was a signed type or
142    an unsigned type.  */
143 #define MAX_CU_NESTING (1 << 8)
144 static bfd_boolean level_type_signed[MAX_CU_NESTING];
145 
146 /* Values for do_debug_lines.  */
147 #define FLAG_DEBUG_LINES_RAW	 1
148 #define FLAG_DEBUG_LINES_DECODED 2
149 
150 static unsigned int
151 size_of_encoded_value (int encoding)
152 {
153   switch (encoding & 0x7)
154     {
155     default:	/* ??? */
156     case 0:	return eh_addr_size;
157     case 2:	return 2;
158     case 3:	return 4;
159     case 4:	return 8;
160     }
161 }
162 
163 static dwarf_vma
164 get_encoded_value (unsigned char **pdata,
165 		   int encoding,
166 		   struct dwarf_section *section,
167 		   unsigned char * end)
168 {
169   unsigned char * data = * pdata;
170   unsigned int size = size_of_encoded_value (encoding);
171   dwarf_vma val;
172 
173   if (data + size >= end)
174     {
175       warn (_("Encoded value extends past end of section\n"));
176       * pdata = end;
177       return 0;
178     }
179 
180   /* PR 17512: file: 002-829853-0.004.  */
181   if (size > 8)
182     {
183       warn (_("Encoded size of %d is too large to read\n"), size);
184       * pdata = end;
185       return 0;
186     }
187 
188   /* PR 17512: file: 1085-5603-0.004.  */
189   if (size == 0)
190     {
191       warn (_("Encoded size of 0 is too small to read\n"));
192       * pdata = end;
193       return 0;
194     }
195 
196   if (encoding & DW_EH_PE_signed)
197     val = byte_get_signed (data, size);
198   else
199     val = byte_get (data, size);
200 
201   if ((encoding & 0x70) == DW_EH_PE_pcrel)
202     val += section->address + (data - section->start);
203 
204   * pdata = data + size;
205   return val;
206 }
207 
208 #if defined HAVE_LONG_LONG && SIZEOF_LONG_LONG > SIZEOF_LONG
209 # ifndef __MINGW32__
210 #  define DWARF_VMA_FMT		"ll"
211 #  define DWARF_VMA_FMT_LONG	"%16.16llx"
212 # else
213 #  define DWARF_VMA_FMT		"I64"
214 #  define DWARF_VMA_FMT_LONG	"%016I64x"
215 # endif
216 #else
217 # define DWARF_VMA_FMT		"l"
218 # define DWARF_VMA_FMT_LONG	"%16.16lx"
219 #endif
220 
221 /* Convert a dwarf vma value into a string.  Returns a pointer to a static
222    buffer containing the converted VALUE.  The value is converted according
223    to the printf formating character FMTCH.  If NUM_BYTES is non-zero then
224    it specifies the maximum number of bytes to be displayed in the converted
225    value and FMTCH is ignored - hex is always used.  */
226 
227 static const char *
228 dwarf_vmatoa_1 (const char *fmtch, dwarf_vma value, unsigned num_bytes)
229 {
230   /* As dwarf_vmatoa is used more then once in a printf call
231      for output, we are cycling through an fixed array of pointers
232      for return address.  */
233   static int buf_pos = 0;
234   static struct dwarf_vmatoa_buf
235   {
236     char place[64];
237   } buf[16];
238   char *ret;
239 
240   ret = buf[buf_pos++].place;
241   buf_pos %= ARRAY_SIZE (buf);
242 
243   if (num_bytes)
244     {
245       /* Printf does not have a way of specifying a maximum field width for an
246 	 integer value, so we print the full value into a buffer and then select
247 	 the precision we need.  */
248       snprintf (ret, sizeof (buf[0].place), DWARF_VMA_FMT_LONG, value);
249       if (num_bytes > 8)
250 	num_bytes = 8;
251       return ret + (16 - 2 * num_bytes);
252     }
253   else
254     {
255       char fmt[32];
256 
257       if (fmtch)
258 	sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch);
259       else
260 	sprintf (fmt, "%%%s", DWARF_VMA_FMT);
261       snprintf (ret, sizeof (buf[0].place), fmt, value);
262       return ret;
263     }
264 }
265 
266 static inline const char *
267 dwarf_vmatoa (const char * fmtch, dwarf_vma value)
268 {
269   return dwarf_vmatoa_1 (fmtch, value, 0);
270 }
271 
272 /* Print a dwarf_vma value (typically an address, offset or length) in
273    hexadecimal format, followed by a space.  The length of the VALUE (and
274    hence the precision displayed) is determined by the NUM_BYTES parameter.  */
275 
276 static void
277 print_dwarf_vma (dwarf_vma value, unsigned num_bytes)
278 {
279   printf ("%s ", dwarf_vmatoa_1 (NULL, value, num_bytes));
280 }
281 
282 /* Print a view number in hexadecimal value, with the same width
283    print_dwarf_vma would have printed it with the same num_bytes.
284    Print blanks for zero view, unless force is nonzero.  */
285 
286 static void
287 print_dwarf_view (dwarf_vma value, unsigned num_bytes, int force)
288 {
289   int len;
290   if (!num_bytes)
291     len = 4;
292   else
293     len = num_bytes * 2;
294 
295   assert (value == (unsigned long) value);
296   if (value || force)
297     printf ("v%0*lx ", len - 1, (unsigned long) value);
298   else
299     printf ("%*s", len + 1, "");
300 }
301 
302 /* Format a 64-bit value, given as two 32-bit values, in hex.
303    For reentrancy, this uses a buffer provided by the caller.  */
304 
305 static const char *
306 dwarf_vmatoa64 (dwarf_vma hvalue, dwarf_vma lvalue, char *buf,
307 		unsigned int buf_len)
308 {
309   int len = 0;
310 
311   if (hvalue == 0)
312     snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", lvalue);
313   else
314     {
315       len = snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", hvalue);
316       snprintf (buf + len, buf_len - len,
317 		"%08" DWARF_VMA_FMT "x", lvalue);
318     }
319 
320   return buf;
321 }
322 
323 /* Read in a LEB128 encoded value starting at address DATA.
324    If SIGN is true, return a signed LEB128 value.
325    If LENGTH_RETURN is not NULL, return in it the number of bytes read.
326    If STATUS_RETURN in not NULL, return with bit 0 (LSB) set if the
327    terminating byte was not found and with bit 1 set if the value
328    overflows a dwarf_vma.
329    No bytes will be read at address END or beyond.  */
330 
331 dwarf_vma
332 read_leb128 (unsigned char *data,
333 	     const unsigned char *const end,
334 	     bfd_boolean sign,
335 	     unsigned int *length_return,
336 	     int *status_return)
337 {
338   dwarf_vma result = 0;
339   unsigned int num_read = 0;
340   unsigned int shift = 0;
341   int status = 1;
342 
343   while (data < end)
344     {
345       unsigned char byte = *data++;
346       num_read++;
347 
348       if (shift < sizeof (result) * 8)
349 	{
350 	  result |= ((dwarf_vma) (byte & 0x7f)) << shift;
351 	  if ((result >> shift) != (byte & 0x7f))
352 	    /* Overflow.  */
353 	    status |= 2;
354 	  shift += 7;
355 	}
356       else if ((byte & 0x7f) != 0)
357 	status |= 2;
358 
359       if ((byte & 0x80) == 0)
360 	{
361 	  status &= ~1;
362 	  if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
363 	    result |= -((dwarf_vma) 1 << shift);
364 	  break;
365 	}
366     }
367 
368   if (length_return != NULL)
369     *length_return = num_read;
370   if (status_return != NULL)
371     *status_return = status;
372 
373   return result;
374 }
375 
376 /* Read AMOUNT bytes from PTR and store them in VAL as an unsigned value.
377    Checks to make sure that the read will not reach or pass END
378    and that VAL is big enough to hold AMOUNT bytes.  */
379 #define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END)	\
380   do						\
381     {						\
382       unsigned int amount = (AMOUNT);		\
383       if (sizeof (VAL) < amount)		\
384 	{					\
385 	  error (ngettext ("internal error: attempt to read %d byte "	\
386 			   "of data in to %d sized variable",		\
387 			   "internal error: attempt to read %d bytes "	\
388 			   "of data in to %d sized variable",		\
389 			   amount),					\
390 		 amount, (int) sizeof (VAL));	\
391 	  amount = sizeof (VAL);		\
392 	}					\
393       if (((PTR) + amount) >= (END))		\
394 	{					\
395 	  if ((PTR) < (END))			\
396 	    amount = (END) - (PTR);		\
397 	  else					\
398 	    amount = 0;				\
399 	}					\
400       if (amount == 0 || amount > 8)		\
401 	VAL = 0;				\
402       else					\
403 	VAL = byte_get ((PTR), amount);		\
404     }						\
405   while (0)
406 
407 /* Like SAFE_BYTE_GET, but also increments PTR by AMOUNT.  */
408 #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END)	\
409   do							\
410     {							\
411       SAFE_BYTE_GET (VAL, PTR, AMOUNT, END);		\
412       PTR += AMOUNT;					\
413     }							\
414   while (0)
415 
416 /* Like SAFE_BYTE_GET, but reads a signed value.  */
417 #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END)	\
418   do							\
419     {							\
420       unsigned int amount = (AMOUNT);			\
421       if (((PTR) + amount) >= (END))			\
422 	{						\
423 	  if ((PTR) < (END))				\
424 	    amount = (END) - (PTR);			\
425 	  else						\
426 	    amount = 0;					\
427 	}						\
428       if (amount)					\
429 	VAL = byte_get_signed ((PTR), amount);		\
430       else						\
431 	VAL = 0;					\
432     }							\
433   while (0)
434 
435 /* Like SAFE_SIGNED_BYTE_GET, but also increments PTR by AMOUNT.  */
436 #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END)	\
437   do								\
438     {								\
439       SAFE_SIGNED_BYTE_GET (VAL, PTR, AMOUNT, END);		\
440       PTR += AMOUNT;						\
441     }								\
442   while (0)
443 
444 #define SAFE_BYTE_GET64(PTR, HIGH, LOW, END)		\
445   do							\
446     {							\
447       if (((PTR) + 8) <= (END))				\
448 	{						\
449 	  byte_get_64 ((PTR), (HIGH), (LOW));		\
450 	}						\
451       else						\
452 	{						\
453 	  * (LOW) = * (HIGH) = 0;			\
454 	}						\
455     }							\
456   while (0)
457 
458 typedef struct State_Machine_Registers
459 {
460   dwarf_vma address;
461   unsigned int view;
462   unsigned int file;
463   unsigned int line;
464   unsigned int column;
465   int is_stmt;
466   int basic_block;
467   unsigned char op_index;
468   unsigned char end_sequence;
469   /* This variable hold the number of the last entry seen
470      in the File Table.  */
471   unsigned int last_file_entry;
472 } SMR;
473 
474 static SMR state_machine_regs;
475 
476 static void
477 reset_state_machine (int is_stmt)
478 {
479   state_machine_regs.address = 0;
480   state_machine_regs.view = 0;
481   state_machine_regs.op_index = 0;
482   state_machine_regs.file = 1;
483   state_machine_regs.line = 1;
484   state_machine_regs.column = 0;
485   state_machine_regs.is_stmt = is_stmt;
486   state_machine_regs.basic_block = 0;
487   state_machine_regs.end_sequence = 0;
488   state_machine_regs.last_file_entry = 0;
489 }
490 
491 /* Handled an extend line op.
492    Returns the number of bytes read.  */
493 
494 static size_t
495 process_extended_line_op (unsigned char * data,
496 			  int is_stmt,
497 			  unsigned char * end)
498 {
499   unsigned char op_code;
500   size_t len, header_len;
501   unsigned char *name;
502   unsigned char *orig_data = data;
503   dwarf_vma adr, val;
504 
505   READ_ULEB (len, data, end);
506   header_len = data - orig_data;
507 
508   if (len == 0 || data == end || len > (size_t) (end - data))
509     {
510       warn (_("Badly formed extended line op encountered!\n"));
511       return header_len;
512     }
513 
514   op_code = *data++;
515 
516   printf (_("  Extended opcode %d: "), op_code);
517 
518   switch (op_code)
519     {
520     case DW_LNE_end_sequence:
521       printf (_("End of Sequence\n\n"));
522       reset_state_machine (is_stmt);
523       break;
524 
525     case DW_LNE_set_address:
526       /* PR 17512: file: 002-100480-0.004.  */
527       if (len - 1 > 8)
528 	{
529 	  warn (_("Length (%lu) of DW_LNE_set_address op is too long\n"),
530 		(unsigned long) len - 1);
531 	  adr = 0;
532 	}
533       else
534 	SAFE_BYTE_GET (adr, data, len - 1, end);
535       printf (_("set Address to 0x%s\n"), dwarf_vmatoa ("x", adr));
536       state_machine_regs.address = adr;
537       state_machine_regs.view = 0;
538       state_machine_regs.op_index = 0;
539       break;
540 
541     case DW_LNE_define_file:
542       printf (_("define new File Table entry\n"));
543       printf (_("  Entry\tDir\tTime\tSize\tName\n"));
544       printf ("   %d\t", ++state_machine_regs.last_file_entry);
545 
546       {
547 	size_t l;
548 
549 	name = data;
550 	l = strnlen ((char *) data, end - data);
551 	data += l + 1;
552 	READ_ULEB (val, data, end);
553 	printf ("%s\t", dwarf_vmatoa ("u", val));
554 	READ_ULEB (val, data, end);
555 	printf ("%s\t", dwarf_vmatoa ("u", val));
556 	READ_ULEB (val, data, end);
557 	printf ("%s\t", dwarf_vmatoa ("u", val));
558 	printf ("%.*s\n\n", (int) l, name);
559       }
560 
561       if (((size_t) (data - orig_data) != len + header_len) || data == end)
562 	warn (_("DW_LNE_define_file: Bad opcode length\n"));
563       break;
564 
565     case DW_LNE_set_discriminator:
566       READ_ULEB (val, data, end);
567       printf (_("set Discriminator to %s\n"), dwarf_vmatoa ("u", val));
568       break;
569 
570     /* HP extensions.  */
571     case DW_LNE_HP_negate_is_UV_update:
572       printf ("DW_LNE_HP_negate_is_UV_update\n");
573       break;
574     case DW_LNE_HP_push_context:
575       printf ("DW_LNE_HP_push_context\n");
576       break;
577     case DW_LNE_HP_pop_context:
578       printf ("DW_LNE_HP_pop_context\n");
579       break;
580     case DW_LNE_HP_set_file_line_column:
581       printf ("DW_LNE_HP_set_file_line_column\n");
582       break;
583     case DW_LNE_HP_set_routine_name:
584       printf ("DW_LNE_HP_set_routine_name\n");
585       break;
586     case DW_LNE_HP_set_sequence:
587       printf ("DW_LNE_HP_set_sequence\n");
588       break;
589     case DW_LNE_HP_negate_post_semantics:
590       printf ("DW_LNE_HP_negate_post_semantics\n");
591       break;
592     case DW_LNE_HP_negate_function_exit:
593       printf ("DW_LNE_HP_negate_function_exit\n");
594       break;
595     case DW_LNE_HP_negate_front_end_logical:
596       printf ("DW_LNE_HP_negate_front_end_logical\n");
597       break;
598     case DW_LNE_HP_define_proc:
599       printf ("DW_LNE_HP_define_proc\n");
600       break;
601     case DW_LNE_HP_source_file_correlation:
602       {
603 	unsigned char *edata = data + len - 1;
604 
605 	printf ("DW_LNE_HP_source_file_correlation\n");
606 
607 	while (data < edata)
608 	  {
609 	    unsigned int opc;
610 
611 	    READ_ULEB (opc, data, edata);
612 
613 	    switch (opc)
614 	      {
615 	      case DW_LNE_HP_SFC_formfeed:
616 		printf ("    DW_LNE_HP_SFC_formfeed\n");
617 		break;
618 	      case DW_LNE_HP_SFC_set_listing_line:
619 		READ_ULEB (val, data, edata);
620 		printf ("    DW_LNE_HP_SFC_set_listing_line (%s)\n",
621 			dwarf_vmatoa ("u", val));
622 		break;
623 	      case DW_LNE_HP_SFC_associate:
624 		printf ("    DW_LNE_HP_SFC_associate ");
625 		READ_ULEB (val, data, edata);
626 		printf ("(%s", dwarf_vmatoa ("u", val));
627 		READ_ULEB (val, data, edata);
628 		printf (",%s", dwarf_vmatoa ("u", val));
629 		READ_ULEB (val, data, edata);
630 		printf (",%s)\n", dwarf_vmatoa ("u", val));
631 		break;
632 	      default:
633 		printf (_("    UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc);
634 		data = edata;
635 		break;
636 	      }
637 	  }
638       }
639       break;
640 
641     default:
642       {
643 	unsigned int rlen = len - 1;
644 
645 	if (op_code >= DW_LNE_lo_user
646 	    /* The test against DW_LNW_hi_user is redundant due to
647 	       the limited range of the unsigned char data type used
648 	       for op_code.  */
649 	    /*&& op_code <= DW_LNE_hi_user*/)
650 	  printf (_("user defined: "));
651 	else
652 	  printf (_("UNKNOWN: "));
653 	printf (_("length %d ["), rlen);
654 	for (; rlen; rlen--)
655 	  printf (" %02x", *data++);
656 	printf ("]\n");
657       }
658       break;
659     }
660 
661   return len + header_len;
662 }
663 
664 static const unsigned char *
665 fetch_indirect_string (dwarf_vma offset)
666 {
667   struct dwarf_section *section = &debug_displays [str].section;
668   const unsigned char * ret;
669 
670   if (section->start == NULL)
671     return (const unsigned char *) _("<no .debug_str section>");
672 
673   if (offset >= section->size)
674     {
675       warn (_("DW_FORM_strp offset too big: %s\n"),
676 	    dwarf_vmatoa ("x", offset));
677       return (const unsigned char *) _("<offset is too big>");
678     }
679 
680   ret = section->start + offset;
681   /* Unfortunately we cannot rely upon the .debug_str section ending with a
682      NUL byte.  Since our caller is expecting to receive a well formed C
683      string we test for the lack of a terminating byte here.  */
684   if (strnlen ((const char *) ret, section->size - offset)
685       == section->size - offset)
686     ret = (const unsigned char *)
687       _("<no NUL byte at end of .debug_str section>");
688 
689   return ret;
690 }
691 
692 static const unsigned char *
693 fetch_indirect_line_string (dwarf_vma offset)
694 {
695   struct dwarf_section *section = &debug_displays [line_str].section;
696   const unsigned char * ret;
697 
698   if (section->start == NULL)
699     return (const unsigned char *) _("<no .debug_line_str section>");
700 
701   if (offset >= section->size)
702     {
703       warn (_("DW_FORM_line_strp offset too big: %s\n"),
704 	    dwarf_vmatoa ("x", offset));
705       return (const unsigned char *) _("<offset is too big>");
706     }
707 
708   ret = section->start + offset;
709   /* Unfortunately we cannot rely upon the .debug_line_str section ending
710      with a NUL byte.  Since our caller is expecting to receive a well formed
711      C string we test for the lack of a terminating byte here.  */
712   if (strnlen ((const char *) ret, section->size - offset)
713       == section->size - offset)
714     ret = (const unsigned char *)
715       _("<no NUL byte at end of .debug_line_str section>");
716 
717   return ret;
718 }
719 
720 static const char *
721 fetch_indexed_string (dwarf_vma idx, struct cu_tu_set *this_set,
722 		      dwarf_vma offset_size, bfd_boolean dwo)
723 {
724   enum dwarf_section_display_enum str_sec_idx = dwo ? str_dwo : str;
725   enum dwarf_section_display_enum idx_sec_idx = dwo ? str_index_dwo : str_index;
726   struct dwarf_section *index_section = &debug_displays [idx_sec_idx].section;
727   struct dwarf_section *str_section = &debug_displays [str_sec_idx].section;
728   dwarf_vma index_offset = idx * offset_size;
729   dwarf_vma str_offset;
730   const char * ret;
731 
732   if (index_section->start == NULL)
733     return (dwo ? _("<no .debug_str_offsets.dwo section>")
734 		: _("<no .debug_str_offsets section>"));
735 
736   if (this_set != NULL)
737     index_offset += this_set->section_offsets [DW_SECT_STR_OFFSETS];
738   if (index_offset >= index_section->size)
739     {
740       warn (_("DW_FORM_GNU_str_index offset too big: %s\n"),
741 	    dwarf_vmatoa ("x", index_offset));
742       return _("<index offset is too big>");
743     }
744 
745   if (str_section->start == NULL)
746     return (dwo ? _("<no .debug_str.dwo section>")
747 		: _("<no .debug_str section>"));
748 
749   str_offset = byte_get (index_section->start + index_offset, offset_size);
750   str_offset -= str_section->address;
751   if (str_offset >= str_section->size)
752     {
753       warn (_("DW_FORM_GNU_str_index indirect offset too big: %s\n"),
754 	    dwarf_vmatoa ("x", str_offset));
755       return _("<indirect index offset is too big>");
756     }
757 
758   ret = (const char *) str_section->start + str_offset;
759   /* Unfortunately we cannot rely upon str_section ending with a NUL byte.
760      Since our caller is expecting to receive a well formed C string we test
761      for the lack of a terminating byte here.  */
762   if (strnlen (ret, str_section->size - str_offset)
763       == str_section->size - str_offset)
764     ret = (const char *) _("<no NUL byte at end of section>");
765 
766   return ret;
767 }
768 
769 static const char *
770 fetch_indexed_value (dwarf_vma offset, dwarf_vma bytes)
771 {
772   struct dwarf_section *section = &debug_displays [debug_addr].section;
773 
774   if (section->start == NULL)
775     return (_("<no .debug_addr section>"));
776 
777   if (offset + bytes > section->size)
778     {
779       warn (_("Offset into section %s too big: %s\n"),
780 	    section->name, dwarf_vmatoa ("x", offset));
781       return "<offset too big>";
782     }
783 
784   return dwarf_vmatoa ("x", byte_get (section->start + offset, bytes));
785 }
786 
787 
788 /* FIXME:  There are better and more efficient ways to handle
789    these structures.  For now though, I just want something that
790    is simple to implement.  */
791 typedef struct abbrev_attr
792 {
793   unsigned long attribute;
794   unsigned long form;
795   bfd_signed_vma implicit_const;
796   struct abbrev_attr *next;
797 }
798 abbrev_attr;
799 
800 typedef struct abbrev_entry
801 {
802   unsigned long entry;
803   unsigned long tag;
804   int children;
805   struct abbrev_attr *first_attr;
806   struct abbrev_attr *last_attr;
807   struct abbrev_entry *next;
808 }
809 abbrev_entry;
810 
811 static abbrev_entry *first_abbrev = NULL;
812 static abbrev_entry *last_abbrev = NULL;
813 
814 static void
815 free_abbrevs (void)
816 {
817   abbrev_entry *abbrv;
818 
819   for (abbrv = first_abbrev; abbrv;)
820     {
821       abbrev_entry *next_abbrev = abbrv->next;
822       abbrev_attr *attr;
823 
824       for (attr = abbrv->first_attr; attr;)
825 	{
826 	  abbrev_attr *next_attr = attr->next;
827 
828 	  free (attr);
829 	  attr = next_attr;
830 	}
831 
832       free (abbrv);
833       abbrv = next_abbrev;
834     }
835 
836   last_abbrev = first_abbrev = NULL;
837 }
838 
839 static void
840 add_abbrev (unsigned long number, unsigned long tag, int children)
841 {
842   abbrev_entry *entry;
843 
844   entry = (abbrev_entry *) malloc (sizeof (*entry));
845   if (entry == NULL)
846     /* ugg */
847     return;
848 
849   entry->entry      = number;
850   entry->tag        = tag;
851   entry->children   = children;
852   entry->first_attr = NULL;
853   entry->last_attr  = NULL;
854   entry->next       = NULL;
855 
856   if (first_abbrev == NULL)
857     first_abbrev = entry;
858   else
859     last_abbrev->next = entry;
860 
861   last_abbrev = entry;
862 }
863 
864 static void
865 add_abbrev_attr (unsigned long attribute, unsigned long form,
866 		 bfd_signed_vma implicit_const)
867 {
868   abbrev_attr *attr;
869 
870   attr = (abbrev_attr *) malloc (sizeof (*attr));
871   if (attr == NULL)
872     /* ugg */
873     return;
874 
875   attr->attribute = attribute;
876   attr->form      = form;
877   attr->implicit_const = implicit_const;
878   attr->next      = NULL;
879 
880   if (last_abbrev->first_attr == NULL)
881     last_abbrev->first_attr = attr;
882   else
883     last_abbrev->last_attr->next = attr;
884 
885   last_abbrev->last_attr = attr;
886 }
887 
888 /* Processes the (partial) contents of a .debug_abbrev section.
889    Returns NULL if the end of the section was encountered.
890    Returns the address after the last byte read if the end of
891    an abbreviation set was found.  */
892 
893 static unsigned char *
894 process_abbrev_section (unsigned char *start, unsigned char *end)
895 {
896   if (first_abbrev != NULL)
897     return NULL;
898 
899   while (start < end)
900     {
901       unsigned long entry;
902       unsigned long tag;
903       unsigned long attribute;
904       int children;
905 
906       READ_ULEB (entry, start, end);
907 
908       /* A single zero is supposed to end the section according
909 	 to the standard.  If there's more, then signal that to
910 	 the caller.  */
911       if (start == end)
912 	return NULL;
913       if (entry == 0)
914 	return start;
915 
916       READ_ULEB (tag, start, end);
917       if (start == end)
918 	return NULL;
919 
920       children = *start++;
921 
922       add_abbrev (entry, tag, children);
923 
924       do
925 	{
926 	  unsigned long form;
927 	  /* Initialize it due to a false compiler warning.  */
928 	  bfd_signed_vma implicit_const = -1;
929 
930 	  READ_ULEB (attribute, start, end);
931 	  if (start == end)
932 	    break;
933 
934 	  READ_ULEB (form, start, end);
935 	  if (start == end)
936 	    break;
937 
938 	  if (form == DW_FORM_implicit_const)
939 	    {
940 	      READ_SLEB (implicit_const, start, end);
941 	      if (start == end)
942 		break;
943 	    }
944 
945 	  add_abbrev_attr (attribute, form, implicit_const);
946 	}
947       while (attribute != 0);
948     }
949 
950   /* Report the missing single zero which ends the section.  */
951   error (_(".debug_abbrev section not zero terminated\n"));
952 
953   return NULL;
954 }
955 
956 static const char *
957 get_TAG_name (unsigned long tag)
958 {
959   const char *name = get_DW_TAG_name ((unsigned int) tag);
960 
961   if (name == NULL)
962     {
963       static char buffer[100];
964 
965       if (tag >= DW_TAG_lo_user && tag <= DW_TAG_hi_user)
966 	snprintf (buffer, sizeof (buffer), _("User TAG value: %#lx"), tag);
967       else
968 	snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %#lx"), tag);
969       return buffer;
970     }
971 
972   return name;
973 }
974 
975 static const char *
976 get_FORM_name (unsigned long form)
977 {
978   const char *name;
979 
980   if (form == 0)
981     return "DW_FORM value: 0";
982 
983   name = get_DW_FORM_name (form);
984   if (name == NULL)
985     {
986       static char buffer[100];
987 
988       snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
989       return buffer;
990     }
991 
992   return name;
993 }
994 
995 static const char *
996 get_IDX_name (unsigned long idx)
997 {
998   const char *name = get_DW_IDX_name ((unsigned int) idx);
999 
1000   if (name == NULL)
1001     {
1002       static char buffer[100];
1003 
1004       snprintf (buffer, sizeof (buffer), _("Unknown IDX value: %lx"), idx);
1005       return buffer;
1006     }
1007 
1008   return name;
1009 }
1010 
1011 static unsigned char *
1012 display_block (unsigned char *data,
1013 	       dwarf_vma length,
1014 	       const unsigned char * const end, char delimiter)
1015 {
1016   dwarf_vma maxlen;
1017 
1018   printf (_("%c%s byte block: "), delimiter, dwarf_vmatoa ("u", length));
1019   if (data > end)
1020     return (unsigned char *) end;
1021 
1022   maxlen = (dwarf_vma) (end - data);
1023   length = length > maxlen ? maxlen : length;
1024 
1025   while (length --)
1026     printf ("%lx ", (unsigned long) byte_get (data++, 1));
1027 
1028   return data;
1029 }
1030 
1031 static int
1032 decode_location_expression (unsigned char * data,
1033 			    unsigned int pointer_size,
1034 			    unsigned int offset_size,
1035 			    int dwarf_version,
1036 			    dwarf_vma length,
1037 			    dwarf_vma cu_offset,
1038 			    struct dwarf_section * section)
1039 {
1040   unsigned op;
1041   dwarf_vma uvalue;
1042   dwarf_signed_vma svalue;
1043   unsigned char *end = data + length;
1044   int need_frame_base = 0;
1045 
1046   while (data < end)
1047     {
1048       op = *data++;
1049 
1050       switch (op)
1051 	{
1052 	case DW_OP_addr:
1053 	  SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1054 	  printf ("DW_OP_addr: %s", dwarf_vmatoa ("x", uvalue));
1055 	  break;
1056 	case DW_OP_deref:
1057 	  printf ("DW_OP_deref");
1058 	  break;
1059 	case DW_OP_const1u:
1060 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1061 	  printf ("DW_OP_const1u: %lu", (unsigned long) uvalue);
1062 	  break;
1063 	case DW_OP_const1s:
1064 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 1, end);
1065 	  printf ("DW_OP_const1s: %ld", (long) svalue);
1066 	  break;
1067 	case DW_OP_const2u:
1068 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1069 	  printf ("DW_OP_const2u: %lu", (unsigned long) uvalue);
1070 	  break;
1071 	case DW_OP_const2s:
1072 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1073 	  printf ("DW_OP_const2s: %ld", (long) svalue);
1074 	  break;
1075 	case DW_OP_const4u:
1076 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1077 	  printf ("DW_OP_const4u: %lu", (unsigned long) uvalue);
1078 	  break;
1079 	case DW_OP_const4s:
1080 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1081 	  printf ("DW_OP_const4s: %ld", (long) svalue);
1082 	  break;
1083 	case DW_OP_const8u:
1084 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1085 	  printf ("DW_OP_const8u: %lu ", (unsigned long) uvalue);
1086 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1087 	  printf ("%lu", (unsigned long) uvalue);
1088 	  break;
1089 	case DW_OP_const8s:
1090 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1091 	  printf ("DW_OP_const8s: %ld ", (long) svalue);
1092 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1093 	  printf ("%ld", (long) svalue);
1094 	  break;
1095 	case DW_OP_constu:
1096 	  READ_ULEB (uvalue, data, end);
1097 	  printf ("DW_OP_constu: %s", dwarf_vmatoa ("u", uvalue));
1098 	  break;
1099 	case DW_OP_consts:
1100 	  READ_SLEB (svalue, data, end);
1101 	  printf ("DW_OP_consts: %s", dwarf_vmatoa ("d", svalue));
1102 	  break;
1103 	case DW_OP_dup:
1104 	  printf ("DW_OP_dup");
1105 	  break;
1106 	case DW_OP_drop:
1107 	  printf ("DW_OP_drop");
1108 	  break;
1109 	case DW_OP_over:
1110 	  printf ("DW_OP_over");
1111 	  break;
1112 	case DW_OP_pick:
1113 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1114 	  printf ("DW_OP_pick: %ld", (unsigned long) uvalue);
1115 	  break;
1116 	case DW_OP_swap:
1117 	  printf ("DW_OP_swap");
1118 	  break;
1119 	case DW_OP_rot:
1120 	  printf ("DW_OP_rot");
1121 	  break;
1122 	case DW_OP_xderef:
1123 	  printf ("DW_OP_xderef");
1124 	  break;
1125 	case DW_OP_abs:
1126 	  printf ("DW_OP_abs");
1127 	  break;
1128 	case DW_OP_and:
1129 	  printf ("DW_OP_and");
1130 	  break;
1131 	case DW_OP_div:
1132 	  printf ("DW_OP_div");
1133 	  break;
1134 	case DW_OP_minus:
1135 	  printf ("DW_OP_minus");
1136 	  break;
1137 	case DW_OP_mod:
1138 	  printf ("DW_OP_mod");
1139 	  break;
1140 	case DW_OP_mul:
1141 	  printf ("DW_OP_mul");
1142 	  break;
1143 	case DW_OP_neg:
1144 	  printf ("DW_OP_neg");
1145 	  break;
1146 	case DW_OP_not:
1147 	  printf ("DW_OP_not");
1148 	  break;
1149 	case DW_OP_or:
1150 	  printf ("DW_OP_or");
1151 	  break;
1152 	case DW_OP_plus:
1153 	  printf ("DW_OP_plus");
1154 	  break;
1155 	case DW_OP_plus_uconst:
1156 	  READ_ULEB (uvalue, data, end);
1157 	  printf ("DW_OP_plus_uconst: %s", dwarf_vmatoa ("u", uvalue));
1158 	  break;
1159 	case DW_OP_shl:
1160 	  printf ("DW_OP_shl");
1161 	  break;
1162 	case DW_OP_shr:
1163 	  printf ("DW_OP_shr");
1164 	  break;
1165 	case DW_OP_shra:
1166 	  printf ("DW_OP_shra");
1167 	  break;
1168 	case DW_OP_xor:
1169 	  printf ("DW_OP_xor");
1170 	  break;
1171 	case DW_OP_bra:
1172 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1173 	  printf ("DW_OP_bra: %ld", (long) svalue);
1174 	  break;
1175 	case DW_OP_eq:
1176 	  printf ("DW_OP_eq");
1177 	  break;
1178 	case DW_OP_ge:
1179 	  printf ("DW_OP_ge");
1180 	  break;
1181 	case DW_OP_gt:
1182 	  printf ("DW_OP_gt");
1183 	  break;
1184 	case DW_OP_le:
1185 	  printf ("DW_OP_le");
1186 	  break;
1187 	case DW_OP_lt:
1188 	  printf ("DW_OP_lt");
1189 	  break;
1190 	case DW_OP_ne:
1191 	  printf ("DW_OP_ne");
1192 	  break;
1193 	case DW_OP_skip:
1194 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1195 	  printf ("DW_OP_skip: %ld", (long) svalue);
1196 	  break;
1197 
1198 	case DW_OP_lit0:
1199 	case DW_OP_lit1:
1200 	case DW_OP_lit2:
1201 	case DW_OP_lit3:
1202 	case DW_OP_lit4:
1203 	case DW_OP_lit5:
1204 	case DW_OP_lit6:
1205 	case DW_OP_lit7:
1206 	case DW_OP_lit8:
1207 	case DW_OP_lit9:
1208 	case DW_OP_lit10:
1209 	case DW_OP_lit11:
1210 	case DW_OP_lit12:
1211 	case DW_OP_lit13:
1212 	case DW_OP_lit14:
1213 	case DW_OP_lit15:
1214 	case DW_OP_lit16:
1215 	case DW_OP_lit17:
1216 	case DW_OP_lit18:
1217 	case DW_OP_lit19:
1218 	case DW_OP_lit20:
1219 	case DW_OP_lit21:
1220 	case DW_OP_lit22:
1221 	case DW_OP_lit23:
1222 	case DW_OP_lit24:
1223 	case DW_OP_lit25:
1224 	case DW_OP_lit26:
1225 	case DW_OP_lit27:
1226 	case DW_OP_lit28:
1227 	case DW_OP_lit29:
1228 	case DW_OP_lit30:
1229 	case DW_OP_lit31:
1230 	  printf ("DW_OP_lit%d", op - DW_OP_lit0);
1231 	  break;
1232 
1233 	case DW_OP_reg0:
1234 	case DW_OP_reg1:
1235 	case DW_OP_reg2:
1236 	case DW_OP_reg3:
1237 	case DW_OP_reg4:
1238 	case DW_OP_reg5:
1239 	case DW_OP_reg6:
1240 	case DW_OP_reg7:
1241 	case DW_OP_reg8:
1242 	case DW_OP_reg9:
1243 	case DW_OP_reg10:
1244 	case DW_OP_reg11:
1245 	case DW_OP_reg12:
1246 	case DW_OP_reg13:
1247 	case DW_OP_reg14:
1248 	case DW_OP_reg15:
1249 	case DW_OP_reg16:
1250 	case DW_OP_reg17:
1251 	case DW_OP_reg18:
1252 	case DW_OP_reg19:
1253 	case DW_OP_reg20:
1254 	case DW_OP_reg21:
1255 	case DW_OP_reg22:
1256 	case DW_OP_reg23:
1257 	case DW_OP_reg24:
1258 	case DW_OP_reg25:
1259 	case DW_OP_reg26:
1260 	case DW_OP_reg27:
1261 	case DW_OP_reg28:
1262 	case DW_OP_reg29:
1263 	case DW_OP_reg30:
1264 	case DW_OP_reg31:
1265 	  printf ("DW_OP_reg%d (%s)", op - DW_OP_reg0,
1266 		  regname (op - DW_OP_reg0, 1));
1267 	  break;
1268 
1269 	case DW_OP_breg0:
1270 	case DW_OP_breg1:
1271 	case DW_OP_breg2:
1272 	case DW_OP_breg3:
1273 	case DW_OP_breg4:
1274 	case DW_OP_breg5:
1275 	case DW_OP_breg6:
1276 	case DW_OP_breg7:
1277 	case DW_OP_breg8:
1278 	case DW_OP_breg9:
1279 	case DW_OP_breg10:
1280 	case DW_OP_breg11:
1281 	case DW_OP_breg12:
1282 	case DW_OP_breg13:
1283 	case DW_OP_breg14:
1284 	case DW_OP_breg15:
1285 	case DW_OP_breg16:
1286 	case DW_OP_breg17:
1287 	case DW_OP_breg18:
1288 	case DW_OP_breg19:
1289 	case DW_OP_breg20:
1290 	case DW_OP_breg21:
1291 	case DW_OP_breg22:
1292 	case DW_OP_breg23:
1293 	case DW_OP_breg24:
1294 	case DW_OP_breg25:
1295 	case DW_OP_breg26:
1296 	case DW_OP_breg27:
1297 	case DW_OP_breg28:
1298 	case DW_OP_breg29:
1299 	case DW_OP_breg30:
1300 	case DW_OP_breg31:
1301 	  READ_SLEB (svalue, data, end);
1302 	  printf ("DW_OP_breg%d (%s): %s", op - DW_OP_breg0,
1303 		  regname (op - DW_OP_breg0, 1), dwarf_vmatoa ("d", svalue));
1304 	  break;
1305 
1306 	case DW_OP_regx:
1307 	  READ_ULEB (uvalue, data, end);
1308 	  printf ("DW_OP_regx: %s (%s)",
1309 		  dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1310 	  break;
1311 	case DW_OP_fbreg:
1312 	  need_frame_base = 1;
1313 	  READ_SLEB (svalue, data, end);
1314 	  printf ("DW_OP_fbreg: %s", dwarf_vmatoa ("d", svalue));
1315 	  break;
1316 	case DW_OP_bregx:
1317 	  READ_ULEB (uvalue, data, end);
1318 	  READ_SLEB (svalue, data, end);
1319 	  printf ("DW_OP_bregx: %s (%s) %s",
1320 		  dwarf_vmatoa ("u", uvalue), regname (uvalue, 1),
1321 		  dwarf_vmatoa ("d", svalue));
1322 	  break;
1323 	case DW_OP_piece:
1324 	  READ_ULEB (uvalue, data, end);
1325 	  printf ("DW_OP_piece: %s", dwarf_vmatoa ("u", uvalue));
1326 	  break;
1327 	case DW_OP_deref_size:
1328 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1329 	  printf ("DW_OP_deref_size: %ld", (long) uvalue);
1330 	  break;
1331 	case DW_OP_xderef_size:
1332 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1333 	  printf ("DW_OP_xderef_size: %ld", (long) uvalue);
1334 	  break;
1335 	case DW_OP_nop:
1336 	  printf ("DW_OP_nop");
1337 	  break;
1338 
1339 	  /* DWARF 3 extensions.  */
1340 	case DW_OP_push_object_address:
1341 	  printf ("DW_OP_push_object_address");
1342 	  break;
1343 	case DW_OP_call2:
1344 	  /* FIXME: Strictly speaking for 64-bit DWARF3 files
1345 	     this ought to be an 8-byte wide computation.  */
1346 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1347 	  printf ("DW_OP_call2: <0x%s>",
1348 		  dwarf_vmatoa ("x", svalue + cu_offset));
1349 	  break;
1350 	case DW_OP_call4:
1351 	  /* FIXME: Strictly speaking for 64-bit DWARF3 files
1352 	     this ought to be an 8-byte wide computation.  */
1353 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1354 	  printf ("DW_OP_call4: <0x%s>",
1355 		  dwarf_vmatoa ("x", svalue + cu_offset));
1356 	  break;
1357 	case DW_OP_call_ref:
1358 	  /* FIXME: Strictly speaking for 64-bit DWARF3 files
1359 	     this ought to be an 8-byte wide computation.  */
1360 	  if (dwarf_version == -1)
1361 	    {
1362 	      printf (_("(DW_OP_call_ref in frame info)"));
1363 	      /* No way to tell where the next op is, so just bail.  */
1364 	      return need_frame_base;
1365 	    }
1366 	  if (dwarf_version == 2)
1367 	    {
1368 	      SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1369 	    }
1370 	  else
1371 	    {
1372 	      SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1373 	    }
1374 	  printf ("DW_OP_call_ref: <0x%s>", dwarf_vmatoa ("x", uvalue));
1375 	  break;
1376 	case DW_OP_form_tls_address:
1377 	  printf ("DW_OP_form_tls_address");
1378 	  break;
1379 	case DW_OP_call_frame_cfa:
1380 	  printf ("DW_OP_call_frame_cfa");
1381 	  break;
1382 	case DW_OP_bit_piece:
1383 	  printf ("DW_OP_bit_piece: ");
1384 	  READ_ULEB (uvalue, data, end);
1385 	  printf (_("size: %s "), dwarf_vmatoa ("u", uvalue));
1386 	  READ_ULEB (uvalue, data, end);
1387 	  printf (_("offset: %s "), dwarf_vmatoa ("u", uvalue));
1388 	  break;
1389 
1390 	  /* DWARF 4 extensions.  */
1391 	case DW_OP_stack_value:
1392 	  printf ("DW_OP_stack_value");
1393 	  break;
1394 
1395 	case DW_OP_implicit_value:
1396 	  printf ("DW_OP_implicit_value");
1397 	  READ_ULEB (uvalue, data, end);
1398 	  data = display_block (data, uvalue, end, ' ');
1399 	  break;
1400 
1401 	  /* GNU extensions.  */
1402 	case DW_OP_GNU_push_tls_address:
1403 	  printf (_("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown"));
1404 	  break;
1405 	case DW_OP_GNU_uninit:
1406 	  printf ("DW_OP_GNU_uninit");
1407 	  /* FIXME: Is there data associated with this OP ?  */
1408 	  break;
1409 	case DW_OP_GNU_encoded_addr:
1410 	  {
1411 	    int encoding = 0;
1412 	    dwarf_vma addr;
1413 
1414 	    if (data < end)
1415 	      encoding = *data++;
1416 	    addr = get_encoded_value (&data, encoding, section, end);
1417 
1418 	    printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding);
1419 	    print_dwarf_vma (addr, pointer_size);
1420 	  }
1421 	  break;
1422 	case DW_OP_implicit_pointer:
1423 	case DW_OP_GNU_implicit_pointer:
1424 	  /* FIXME: Strictly speaking for 64-bit DWARF3 files
1425 	     this ought to be an 8-byte wide computation.  */
1426 	  if (dwarf_version == -1)
1427 	    {
1428 	      printf (_("(%s in frame info)"),
1429 		      (op == DW_OP_implicit_pointer
1430 		       ? "DW_OP_implicit_pointer"
1431 		       : "DW_OP_GNU_implicit_pointer"));
1432 	      /* No way to tell where the next op is, so just bail.  */
1433 	      return need_frame_base;
1434 	    }
1435 	  if (dwarf_version == 2)
1436 	    {
1437 	      SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1438 	    }
1439 	  else
1440 	    {
1441 	      SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1442 	    }
1443 	  READ_SLEB (svalue, data, end);
1444 	  printf ("%s: <0x%s> %s",
1445 		  (op == DW_OP_implicit_pointer
1446 		   ? "DW_OP_implicit_pointer" : "DW_OP_GNU_implicit_pointer"),
1447 		  dwarf_vmatoa ("x", uvalue),
1448 		  dwarf_vmatoa ("d", svalue));
1449 	  break;
1450 	case DW_OP_entry_value:
1451 	case DW_OP_GNU_entry_value:
1452 	  READ_ULEB (uvalue, data, end);
1453 	  /* PR 17531: file: 0cc9cd00.  */
1454 	  if (uvalue > (dwarf_vma) (end - data))
1455 	    uvalue = end - data;
1456 	  printf ("%s: (", (op == DW_OP_entry_value ? "DW_OP_entry_value"
1457 						    : "DW_OP_GNU_entry_value"));
1458 	  if (decode_location_expression (data, pointer_size, offset_size,
1459 					  dwarf_version, uvalue,
1460 					  cu_offset, section))
1461 	    need_frame_base = 1;
1462 	  putchar (')');
1463 	  data += uvalue;
1464 	  if (data > end)
1465 	    data = end;
1466 	  break;
1467 	case DW_OP_const_type:
1468 	case DW_OP_GNU_const_type:
1469 	  READ_ULEB (uvalue, data, end);
1470 	  printf ("%s: <0x%s> ",
1471 		  (op == DW_OP_const_type ? "DW_OP_const_type"
1472 					  : "DW_OP_GNU_const_type"),
1473 		  dwarf_vmatoa ("x", cu_offset + uvalue));
1474 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1475 	  data = display_block (data, uvalue, end, ' ');
1476 	  break;
1477 	case DW_OP_regval_type:
1478 	case DW_OP_GNU_regval_type:
1479 	  READ_ULEB (uvalue, data, end);
1480 	  printf ("%s: %s (%s)",
1481 		  (op == DW_OP_regval_type ? "DW_OP_regval_type"
1482 					   : "DW_OP_GNU_regval_type"),
1483 		  dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1484 	  READ_ULEB (uvalue, data, end);
1485 	  printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1486 	  break;
1487 	case DW_OP_deref_type:
1488 	case DW_OP_GNU_deref_type:
1489 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1490 	  printf ("%s: %ld",
1491 		  (op == DW_OP_deref_type ? "DW_OP_deref_type"
1492 					  : "DW_OP_GNU_deref_type"),
1493 		  (long) uvalue);
1494 	  READ_ULEB (uvalue, data, end);
1495 	  printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1496 	  break;
1497 	case DW_OP_convert:
1498 	case DW_OP_GNU_convert:
1499 	  READ_ULEB (uvalue, data, end);
1500 	  printf ("%s <0x%s>",
1501 		  (op == DW_OP_convert ? "DW_OP_convert" : "DW_OP_GNU_convert"),
1502 		  dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1503 	  break;
1504 	case DW_OP_reinterpret:
1505 	case DW_OP_GNU_reinterpret:
1506 	  READ_ULEB (uvalue, data, end);
1507 	  printf ("%s <0x%s>",
1508 		  (op == DW_OP_reinterpret ? "DW_OP_reinterpret"
1509 					   : "DW_OP_GNU_reinterpret"),
1510 		  dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1511 	  break;
1512 	case DW_OP_GNU_parameter_ref:
1513 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1514 	  printf ("DW_OP_GNU_parameter_ref: <0x%s>",
1515 		  dwarf_vmatoa ("x", cu_offset + uvalue));
1516 	  break;
1517 	case DW_OP_GNU_addr_index:
1518 	  READ_ULEB (uvalue, data, end);
1519 	  printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1520 	  break;
1521 	case DW_OP_GNU_const_index:
1522 	  READ_ULEB (uvalue, data, end);
1523 	  printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1524 	  break;
1525 	case DW_OP_GNU_variable_value:
1526 	  /* FIXME: Strictly speaking for 64-bit DWARF3 files
1527 	     this ought to be an 8-byte wide computation.  */
1528 	  if (dwarf_version == -1)
1529 	    {
1530 	      printf (_("(DW_OP_GNU_variable_value in frame info)"));
1531 	      /* No way to tell where the next op is, so just bail.  */
1532 	      return need_frame_base;
1533 	    }
1534 	  if (dwarf_version == 2)
1535 	    {
1536 	      SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1537 	    }
1538 	  else
1539 	    {
1540 	      SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1541 	    }
1542 	  printf ("DW_OP_GNU_variable_value: <0x%s>", dwarf_vmatoa ("x", uvalue));
1543 	  break;
1544 
1545 	  /* HP extensions.  */
1546 	case DW_OP_HP_is_value:
1547 	  printf ("DW_OP_HP_is_value");
1548 	  /* FIXME: Is there data associated with this OP ?  */
1549 	  break;
1550 	case DW_OP_HP_fltconst4:
1551 	  printf ("DW_OP_HP_fltconst4");
1552 	  /* FIXME: Is there data associated with this OP ?  */
1553 	  break;
1554 	case DW_OP_HP_fltconst8:
1555 	  printf ("DW_OP_HP_fltconst8");
1556 	  /* FIXME: Is there data associated with this OP ?  */
1557 	  break;
1558 	case DW_OP_HP_mod_range:
1559 	  printf ("DW_OP_HP_mod_range");
1560 	  /* FIXME: Is there data associated with this OP ?  */
1561 	  break;
1562 	case DW_OP_HP_unmod_range:
1563 	  printf ("DW_OP_HP_unmod_range");
1564 	  /* FIXME: Is there data associated with this OP ?  */
1565 	  break;
1566 	case DW_OP_HP_tls:
1567 	  printf ("DW_OP_HP_tls");
1568 	  /* FIXME: Is there data associated with this OP ?  */
1569 	  break;
1570 
1571 	  /* PGI (STMicroelectronics) extensions.  */
1572 	case DW_OP_PGI_omp_thread_num:
1573 	  /* Pushes the thread number for the current thread as it would be
1574 	     returned by the standard OpenMP library function:
1575 	     omp_get_thread_num().  The "current thread" is the thread for
1576 	     which the expression is being evaluated.  */
1577 	  printf ("DW_OP_PGI_omp_thread_num");
1578 	  break;
1579 
1580 	default:
1581 	  if (op >= DW_OP_lo_user
1582 	      && op <= DW_OP_hi_user)
1583 	    printf (_("(User defined location op 0x%x)"), op);
1584 	  else
1585 	    printf (_("(Unknown location op 0x%x)"), op);
1586 	  /* No way to tell where the next op is, so just bail.  */
1587 	  return need_frame_base;
1588 	}
1589 
1590       /* Separate the ops.  */
1591       if (data < end)
1592 	printf ("; ");
1593     }
1594 
1595   return need_frame_base;
1596 }
1597 
1598 /* Find the CU or TU set corresponding to the given CU_OFFSET.
1599    This is used for DWARF package files.  */
1600 
1601 static struct cu_tu_set *
1602 find_cu_tu_set_v2 (dwarf_vma cu_offset, int do_types)
1603 {
1604   struct cu_tu_set *p;
1605   unsigned int nsets;
1606   unsigned int dw_sect;
1607 
1608   if (do_types)
1609     {
1610       p = tu_sets;
1611       nsets = tu_count;
1612       dw_sect = DW_SECT_TYPES;
1613     }
1614   else
1615     {
1616       p = cu_sets;
1617       nsets = cu_count;
1618       dw_sect = DW_SECT_INFO;
1619     }
1620   while (nsets > 0)
1621     {
1622       if (p->section_offsets [dw_sect] == cu_offset)
1623 	return p;
1624       p++;
1625       nsets--;
1626     }
1627   return NULL;
1628 }
1629 
1630 /* Add INC to HIGH_BITS:LOW_BITS.  */
1631 static void
1632 add64 (dwarf_vma * high_bits, dwarf_vma * low_bits, dwarf_vma inc)
1633 {
1634   dwarf_vma tmp = * low_bits;
1635 
1636   tmp += inc;
1637 
1638   /* FIXME: There is probably a better way of handling this:
1639 
1640      We need to cope with dwarf_vma being a 32-bit or 64-bit
1641      type.  Plus regardless of its size LOW_BITS is meant to
1642      only hold 32-bits, so if there is overflow or wrap around
1643      we must propagate into HIGH_BITS.  */
1644   if (tmp < * low_bits)
1645     {
1646       ++ * high_bits;
1647     }
1648   else if (sizeof (tmp) > 8
1649 	   && (tmp >> 31) > 1)
1650     {
1651       ++ * high_bits;
1652       tmp &= 0xFFFFFFFF;
1653     }
1654 
1655   * low_bits = tmp;
1656 }
1657 
1658 static const char *
1659 fetch_alt_indirect_string (dwarf_vma offset)
1660 {
1661   separate_info * i;
1662 
1663   if (! do_follow_links)
1664     return "";
1665 
1666   if (first_separate_info == NULL)
1667     return _("<no links available>");
1668 
1669   for (i = first_separate_info; i != NULL; i = i->next)
1670     {
1671       struct dwarf_section * section;
1672       const char *           ret;
1673 
1674       if (! load_debug_section (separate_debug_str, i->handle))
1675 	continue;
1676 
1677       section = &debug_displays [separate_debug_str].section;
1678 
1679       if (section->start == NULL)
1680 	continue;
1681 
1682       if (offset >= section->size)
1683 	continue;
1684 
1685       ret = (const char *) (section->start + offset);
1686       /* Unfortunately we cannot rely upon the .debug_str section ending with a
1687 	 NUL byte.  Since our caller is expecting to receive a well formed C
1688 	 string we test for the lack of a terminating byte here.  */
1689       if (strnlen ((const char *) ret, section->size - offset)
1690 	  == section->size - offset)
1691 	return _("<no NUL byte at end of alt .debug_str section>");
1692 
1693       return ret;
1694     }
1695 
1696   warn (_("DW_FORM_GNU_strp_alt offset (%s) too big or no string sections available\n"),
1697 	dwarf_vmatoa ("x", offset));
1698   return _("<offset is too big>");
1699 }
1700 
1701 static const char *
1702 get_AT_name (unsigned long attribute)
1703 {
1704   const char *name;
1705 
1706   if (attribute == 0)
1707     return "DW_AT value: 0";
1708 
1709   /* One value is shared by the MIPS and HP extensions:  */
1710   if (attribute == DW_AT_MIPS_fde)
1711     return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
1712 
1713   name = get_DW_AT_name (attribute);
1714 
1715   if (name == NULL)
1716     {
1717       static char buffer[100];
1718 
1719       snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
1720 		attribute);
1721       return buffer;
1722     }
1723 
1724   return name;
1725 }
1726 
1727 static void
1728 add_dwo_info (const char * field, dwo_type type)
1729 {
1730   dwo_info * dwinfo = xmalloc (sizeof * dwinfo);
1731 
1732   dwinfo->type = type;
1733   dwinfo->value = field;
1734   dwinfo->next = first_dwo_info;
1735   first_dwo_info = dwinfo;
1736 }
1737 
1738 static void
1739 add_dwo_name (const char * name)
1740 {
1741   add_dwo_info (name, DWO_NAME);
1742 }
1743 
1744 static void
1745 add_dwo_dir (const char * dir)
1746 {
1747   add_dwo_info (dir, DWO_DIR);
1748 }
1749 
1750 static void
1751 add_dwo_id (const char * id)
1752 {
1753   add_dwo_info (id, DWO_ID);
1754 }
1755 
1756 static void
1757 free_dwo_info (void)
1758 {
1759   dwo_info * dwinfo;
1760   dwo_info * next;
1761 
1762   for (dwinfo = first_dwo_info; dwinfo != NULL; dwinfo = next)
1763     {
1764       next = dwinfo->next;
1765       free (dwinfo);
1766     }
1767   first_dwo_info = NULL;
1768 }
1769 
1770 /* Ensure that START + UVALUE is less than END.
1771    Return an adjusted UVALUE if necessary to ensure this relationship.  */
1772 
1773 static inline dwarf_vma
1774 check_uvalue (const unsigned char * start,
1775 	      dwarf_vma             uvalue,
1776 	      const unsigned char * end)
1777 {
1778   dwarf_vma max_uvalue = end - start;
1779 
1780   /* See PR 17512: file: 008-103549-0.001:0.1.
1781      and PR 24829 for examples of where these tests are triggered.  */
1782   if (uvalue > max_uvalue)
1783     {
1784       warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1785       uvalue = max_uvalue;
1786     }
1787 
1788   return uvalue;
1789 }
1790 
1791 static unsigned char *
1792 skip_attr_bytes (unsigned long          form,
1793 		 unsigned char *        data,
1794 		 unsigned const char *  end,
1795 		 dwarf_vma              pointer_size,
1796 		 dwarf_vma              offset_size,
1797 		 int                    dwarf_version,
1798 		 dwarf_vma *            value_return)
1799 {
1800   dwarf_signed_vma svalue;
1801   dwarf_vma uvalue = 0;
1802 
1803   * value_return = 0;
1804 
1805   switch (form)
1806     {
1807     case DW_FORM_ref_addr:
1808       if (dwarf_version == 2)
1809 	SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1810       else if (dwarf_version == 3 || dwarf_version == 4)
1811 	SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1812       else
1813 	return NULL;
1814       break;
1815 
1816     case DW_FORM_addr:
1817       SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1818       break;
1819 
1820     case DW_FORM_strp:
1821     case DW_FORM_line_strp:
1822     case DW_FORM_sec_offset:
1823     case DW_FORM_GNU_ref_alt:
1824     case DW_FORM_GNU_strp_alt:
1825       SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1826       break;
1827 
1828     case DW_FORM_flag_present:
1829       uvalue = 1;
1830       break;
1831 
1832     case DW_FORM_ref1:
1833     case DW_FORM_flag:
1834     case DW_FORM_data1:
1835       SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1836       break;
1837 
1838     case DW_FORM_ref2:
1839     case DW_FORM_data2:
1840       SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1841       break;
1842 
1843     case DW_FORM_ref4:
1844     case DW_FORM_data4:
1845       SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1846       break;
1847 
1848     case DW_FORM_sdata:
1849       READ_SLEB (svalue, data, end);
1850       uvalue = svalue;
1851       break;
1852 
1853     case DW_FORM_ref_udata:
1854     case DW_FORM_udata:
1855     case DW_FORM_GNU_str_index:
1856     case DW_FORM_GNU_addr_index:
1857       READ_ULEB (uvalue, data, end);
1858       break;
1859 
1860     case DW_FORM_ref8:
1861     case DW_FORM_data8:
1862       data += 8;
1863       break;
1864 
1865     case DW_FORM_data16:
1866       data += 16;
1867       break;
1868 
1869     case DW_FORM_string:
1870       data += strnlen ((char *) data, end - data) + 1;
1871       break;
1872 
1873     case DW_FORM_block:
1874     case DW_FORM_exprloc:
1875       READ_ULEB (uvalue, data, end);
1876       break;
1877 
1878     case DW_FORM_block1:
1879       SAFE_BYTE_GET (uvalue, data, 1, end);
1880       data += 1 + uvalue;
1881       break;
1882 
1883     case DW_FORM_block2:
1884       SAFE_BYTE_GET (uvalue, data, 2, end);
1885       data += 2 + uvalue;
1886       break;
1887 
1888     case DW_FORM_block4:
1889       SAFE_BYTE_GET (uvalue, data, 4, end);
1890       data += 4 + uvalue;
1891       break;
1892 
1893     case DW_FORM_ref_sig8:
1894       data += 8;
1895       break;
1896 
1897     case DW_FORM_indirect:
1898       /* FIXME: Handle this form.  */
1899     default:
1900       return NULL;
1901     }
1902 
1903   * value_return = uvalue;
1904   if (data > end)
1905     data = (unsigned char *) end;
1906   return data;
1907 }
1908 
1909 /* Return IS_SIGNED set to TRUE if the type at
1910    DATA can be determined to be a signed type.  */
1911 
1912 static void
1913 get_type_signedness (unsigned char *        start,
1914 		     unsigned char *        data,
1915 		     unsigned const char *  end,
1916 		     dwarf_vma              pointer_size,
1917 		     dwarf_vma              offset_size,
1918 		     int                    dwarf_version,
1919 		     bfd_boolean *          is_signed,
1920 		     bfd_boolean	    is_nested)
1921 {
1922   unsigned long   abbrev_number;
1923   abbrev_entry *  entry;
1924   abbrev_attr *   attr;
1925 
1926   * is_signed = FALSE;
1927 
1928   READ_ULEB (abbrev_number, data, end);
1929 
1930   for (entry = first_abbrev;
1931        entry != NULL && entry->entry != abbrev_number;
1932        entry = entry->next)
1933     continue;
1934 
1935   if (entry == NULL)
1936     /* FIXME: Issue a warning ?  */
1937     return;
1938 
1939   for (attr = entry->first_attr;
1940        attr != NULL && attr->attribute;
1941        attr = attr->next)
1942     {
1943       dwarf_vma uvalue = 0;
1944 
1945       data = skip_attr_bytes (attr->form, data, end, pointer_size,
1946 			      offset_size, dwarf_version, & uvalue);
1947       if (data == NULL)
1948 	return;
1949 
1950       switch (attr->attribute)
1951 	{
1952 #if 0 /* FIXME: It would be nice to print the name of the type,
1953 	 but this would mean updating a lot of binutils tests.  */
1954 	case DW_AT_name:
1955 	  if (attr->form == DW_FORM_strp)
1956 	    printf ("%s", fetch_indirect_string (uvalue));
1957 	  break;
1958 #endif
1959 	case DW_AT_type:
1960 	  /* Recurse.  */
1961 	  if (is_nested)
1962 	    {
1963 	      /* FIXME: Warn - or is this expected ?
1964 		 NB/ We need to avoid infinite recursion.  */
1965 	      return;
1966 	    }
1967 	  if (uvalue >= (size_t) (end - start))
1968 	    return;
1969 	  get_type_signedness (start, start + uvalue, end, pointer_size,
1970 			       offset_size, dwarf_version, is_signed, TRUE);
1971 	  break;
1972 
1973 	case DW_AT_encoding:
1974 	  /* Determine signness.  */
1975 	  switch (uvalue)
1976 	    {
1977 	    case DW_ATE_address:
1978 	      /* FIXME - some architectures have signed addresses.  */
1979 	    case DW_ATE_boolean:
1980 	    case DW_ATE_unsigned:
1981 	    case DW_ATE_unsigned_char:
1982 	    case DW_ATE_unsigned_fixed:
1983 	      * is_signed = FALSE;
1984 	      break;
1985 
1986 	    default:
1987 	    case DW_ATE_complex_float:
1988 	    case DW_ATE_float:
1989 	    case DW_ATE_signed:
1990 	    case DW_ATE_signed_char:
1991 	    case DW_ATE_imaginary_float:
1992 	    case DW_ATE_decimal_float:
1993 	    case DW_ATE_signed_fixed:
1994 	      * is_signed = TRUE;
1995 	      break;
1996 	    }
1997 	  break;
1998 	}
1999     }
2000 }
2001 
2002 static void
2003 read_and_print_leb128 (unsigned char *        data,
2004 		       unsigned int *         bytes_read,
2005 		       unsigned const char *  end,
2006 		       bfd_boolean            is_signed)
2007 {
2008   int status;
2009   dwarf_vma val = read_leb128 (data, end, is_signed, bytes_read, &status);
2010   if (status != 0)
2011     report_leb_status (status);
2012   else
2013     printf ("%s", dwarf_vmatoa (is_signed ? "d" : "u", val));
2014 }
2015 
2016 static void
2017 display_discr_list (unsigned long          form,
2018 		    dwarf_vma              uvalue,
2019 		    unsigned char *        data,
2020 		    unsigned const char *  end,
2021 		    int                    level)
2022 {
2023   if (uvalue == 0)
2024     {
2025       printf ("[default]");
2026       return;
2027     }
2028 
2029   switch (form)
2030     {
2031     case DW_FORM_block:
2032     case DW_FORM_block1:
2033     case DW_FORM_block2:
2034     case DW_FORM_block4:
2035       /* Move data pointer back to the start of the byte array.  */
2036       data -= uvalue;
2037       break;
2038     default:
2039       printf ("<corrupt>\n");
2040       warn (_("corrupt discr_list - not using a block form\n"));
2041       return;
2042     }
2043 
2044   if (uvalue < 2)
2045     {
2046       printf ("<corrupt>\n");
2047       warn (_("corrupt discr_list - block not long enough\n"));
2048       return;
2049     }
2050 
2051   bfd_boolean is_signed =
2052     (level > 0 && level <= MAX_CU_NESTING)
2053     ? level_type_signed [level - 1] : FALSE;
2054 
2055   printf ("(");
2056   while (uvalue)
2057     {
2058       unsigned char     discriminant;
2059       unsigned int      bytes_read;
2060 
2061       SAFE_BYTE_GET (discriminant, data, 1, end);
2062       -- uvalue;
2063       data ++;
2064 
2065       assert (uvalue > 0);
2066       switch (discriminant)
2067 	{
2068 	case DW_DSC_label:
2069 	  printf ("label ");
2070 	  read_and_print_leb128 (data, & bytes_read, end, is_signed);
2071 	  assert (bytes_read <= uvalue && bytes_read > 0);
2072 	  uvalue -= bytes_read;
2073 	  data += bytes_read;
2074 	  break;
2075 
2076 	case DW_DSC_range:
2077 	  printf ("range ");
2078 	  read_and_print_leb128 (data, & bytes_read, end, is_signed);
2079 	  assert (bytes_read <= uvalue && bytes_read > 0);
2080 	  uvalue -= bytes_read;
2081 	  data += bytes_read;
2082 
2083 	  printf ("..");
2084 	  read_and_print_leb128 (data, & bytes_read, end, is_signed);
2085 	  assert (bytes_read <= uvalue && bytes_read > 0);
2086 	  uvalue -= bytes_read;
2087 	  data += bytes_read;
2088 	  break;
2089 
2090 	default:
2091 	  printf ("<corrupt>\n");
2092 	  warn (_("corrupt discr_list - unrecognised discriminant byte %#x\n"),
2093 		discriminant);
2094 	  return;
2095 	}
2096 
2097       if (uvalue)
2098 	printf (", ");
2099     }
2100 
2101   if (is_signed)
2102     printf (")(signed)");
2103   else
2104     printf (")(unsigned)");
2105 }
2106 
2107 static unsigned char *
2108 read_and_display_attr_value (unsigned long           attribute,
2109 			     unsigned long           form,
2110 			     dwarf_signed_vma        implicit_const,
2111 			     unsigned char *         start,
2112 			     unsigned char *         data,
2113 			     unsigned char *         end,
2114 			     dwarf_vma               cu_offset,
2115 			     dwarf_vma               pointer_size,
2116 			     dwarf_vma               offset_size,
2117 			     int                     dwarf_version,
2118 			     debug_info *            debug_info_p,
2119 			     int                     do_loc,
2120 			     struct dwarf_section *  section,
2121 			     struct cu_tu_set *      this_set,
2122 			     char                    delimiter,
2123 			     int                     level)
2124 {
2125   dwarf_signed_vma svalue;
2126   dwarf_vma        uvalue = 0;
2127   unsigned char *  block_start = NULL;
2128   unsigned char *  orig_data = data;
2129 
2130   if (data > end || (data == end && form != DW_FORM_flag_present))
2131     {
2132       warn (_("Corrupt attribute\n"));
2133       return data;
2134     }
2135 
2136   switch (form)
2137     {
2138     default:
2139       break;
2140 
2141     case DW_FORM_ref_addr:
2142       if (dwarf_version == 2)
2143 	SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
2144       else if (dwarf_version == 3 || dwarf_version == 4)
2145 	SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
2146       else
2147 	error (_("Internal error: DWARF version is not 2, 3 or 4.\n"));
2148 
2149       break;
2150 
2151     case DW_FORM_addr:
2152       SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
2153       break;
2154 
2155     case DW_FORM_strp:
2156     case DW_FORM_line_strp:
2157     case DW_FORM_sec_offset:
2158     case DW_FORM_GNU_ref_alt:
2159     case DW_FORM_GNU_strp_alt:
2160       SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
2161       break;
2162 
2163     case DW_FORM_flag_present:
2164       uvalue = 1;
2165       break;
2166 
2167     case DW_FORM_ref1:
2168     case DW_FORM_flag:
2169     case DW_FORM_data1:
2170       SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
2171       break;
2172 
2173     case DW_FORM_ref2:
2174     case DW_FORM_data2:
2175       SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
2176       break;
2177 
2178     case DW_FORM_ref4:
2179     case DW_FORM_data4:
2180       SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
2181       break;
2182 
2183     case DW_FORM_sdata:
2184       READ_SLEB (svalue, data, end);
2185       uvalue = svalue;
2186       break;
2187 
2188     case DW_FORM_GNU_str_index:
2189     case DW_FORM_ref_udata:
2190     case DW_FORM_udata:
2191     case DW_FORM_GNU_addr_index:
2192       READ_ULEB (uvalue, data, end);
2193       break;
2194 
2195     case DW_FORM_indirect:
2196       READ_ULEB (form, data, end);
2197       if (!do_loc)
2198 	printf ("%c%s", delimiter, get_FORM_name (form));
2199       if (form == DW_FORM_implicit_const)
2200 	READ_SLEB (implicit_const, data, end);
2201       return read_and_display_attr_value (attribute, form, implicit_const,
2202 					  start, data, end,
2203 					  cu_offset, pointer_size,
2204 					  offset_size, dwarf_version,
2205 					  debug_info_p, do_loc,
2206 					  section, this_set, delimiter, level);
2207     }
2208 
2209   switch (form)
2210     {
2211     case DW_FORM_ref_addr:
2212       if (!do_loc)
2213 	printf ("%c<0x%s>", delimiter, dwarf_vmatoa ("x",uvalue));
2214       break;
2215 
2216     case DW_FORM_GNU_ref_alt:
2217       if (!do_loc)
2218 	printf ("%c<alt 0x%s>", delimiter, dwarf_vmatoa ("x",uvalue));
2219       /* FIXME: Follow the reference...  */
2220       break;
2221 
2222     case DW_FORM_ref1:
2223     case DW_FORM_ref2:
2224     case DW_FORM_ref4:
2225     case DW_FORM_ref_udata:
2226       if (!do_loc)
2227 	printf ("%c<0x%s>", delimiter, dwarf_vmatoa ("x", uvalue + cu_offset));
2228       break;
2229 
2230     case DW_FORM_data4:
2231     case DW_FORM_addr:
2232     case DW_FORM_sec_offset:
2233       if (!do_loc)
2234 	printf ("%c0x%s", delimiter, dwarf_vmatoa ("x", uvalue));
2235       break;
2236 
2237     case DW_FORM_flag_present:
2238     case DW_FORM_flag:
2239     case DW_FORM_data1:
2240     case DW_FORM_data2:
2241     case DW_FORM_sdata:
2242     case DW_FORM_udata:
2243       if (!do_loc)
2244 	printf ("%c%s", delimiter, dwarf_vmatoa ("d", uvalue));
2245       break;
2246 
2247     case DW_FORM_implicit_const:
2248       if (!do_loc)
2249 	printf ("%c%s", delimiter, dwarf_vmatoa ("d", implicit_const));
2250       break;
2251 
2252     case DW_FORM_ref8:
2253     case DW_FORM_data8:
2254       if (!do_loc)
2255 	{
2256 	  dwarf_vma high_bits;
2257 	  dwarf_vma utmp;
2258 	  char buf[64];
2259 
2260 	  SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
2261 	  utmp = uvalue;
2262 	  if (form == DW_FORM_ref8)
2263 	    add64 (& high_bits, & utmp, cu_offset);
2264 	  printf ("%c0x%s", delimiter,
2265 		  dwarf_vmatoa64 (high_bits, utmp, buf, sizeof (buf)));
2266 	}
2267 
2268       if ((do_loc || do_debug_loc || do_debug_ranges)
2269 	  && num_debug_info_entries == 0)
2270 	{
2271 	  if (sizeof (uvalue) == 8)
2272 	    SAFE_BYTE_GET (uvalue, data, 8, end);
2273 	  else
2274 	    error (_("DW_FORM_data8 is unsupported when sizeof (dwarf_vma) != 8\n"));
2275 	}
2276 
2277       data += 8;
2278       break;
2279 
2280     case DW_FORM_data16:
2281       if (!do_loc)
2282 	{
2283 	  dwarf_vma left_high_bits, left_low_bits;
2284 	  dwarf_vma right_high_bits, right_low_bits;
2285 
2286 	  SAFE_BYTE_GET64 (data, &left_high_bits, &left_low_bits, end);
2287 	  SAFE_BYTE_GET64 (data + 8, &right_high_bits, &right_low_bits, end);
2288 	  if (byte_get == byte_get_little_endian)
2289 	    {
2290 	      /* Swap them.  */
2291 	      left_high_bits ^= right_high_bits;
2292 	      right_high_bits ^= left_high_bits;
2293 	      left_high_bits ^= right_high_bits;
2294 	      left_low_bits ^= right_low_bits;
2295 	      right_low_bits ^= left_low_bits;
2296 	      left_low_bits ^= right_low_bits;
2297 	    }
2298 	  printf (" 0x%08" DWARF_VMA_FMT "x%08" DWARF_VMA_FMT "x"
2299 		  "%08" DWARF_VMA_FMT "x%08" DWARF_VMA_FMT "x",
2300 		  left_high_bits, left_low_bits, right_high_bits,
2301 		  right_low_bits);
2302 	}
2303       data += 16;
2304       break;
2305 
2306     case DW_FORM_string:
2307       if (!do_loc)
2308 	printf ("%c%.*s", delimiter, (int) (end - data), data);
2309       data += strnlen ((char *) data, end - data) + 1;
2310       break;
2311 
2312     case DW_FORM_block:
2313     case DW_FORM_exprloc:
2314       READ_ULEB (uvalue, data, end);
2315     do_block:
2316       block_start = data;
2317       if (block_start >= end)
2318 	{
2319 	  warn (_("Block ends prematurely\n"));
2320 	  uvalue = 0;
2321 	  block_start = end;
2322 	}
2323 
2324       uvalue = check_uvalue (block_start, uvalue, end);
2325 
2326       if (do_loc)
2327 	data = block_start + uvalue;
2328       else
2329 	data = display_block (block_start, uvalue, end, delimiter);
2330       break;
2331 
2332     case DW_FORM_block1:
2333       SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
2334       goto do_block;
2335 
2336     case DW_FORM_block2:
2337       SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
2338       goto do_block;
2339 
2340     case DW_FORM_block4:
2341       SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
2342       goto do_block;
2343 
2344     case DW_FORM_strp:
2345       if (!do_loc)
2346 	printf (_("%c(indirect string, offset: 0x%s): %s"), delimiter,
2347 		dwarf_vmatoa ("x", uvalue),
2348 		fetch_indirect_string (uvalue));
2349       break;
2350 
2351     case DW_FORM_line_strp:
2352       if (!do_loc)
2353 	printf (_("%c(indirect line string, offset: 0x%s): %s"), delimiter,
2354 		dwarf_vmatoa ("x", uvalue),
2355 		fetch_indirect_line_string (uvalue));
2356       break;
2357 
2358     case DW_FORM_GNU_str_index:
2359       if (!do_loc)
2360 	{
2361 	  const char * suffix = strrchr (section->name, '.');
2362 	  bfd_boolean  dwo = (suffix && strcmp (suffix, ".dwo") == 0) ? TRUE : FALSE;
2363 
2364 	  printf (_("%c(indexed string: 0x%s): %s"), delimiter,
2365 		  dwarf_vmatoa ("x", uvalue),
2366 		  fetch_indexed_string (uvalue, this_set, offset_size, dwo));
2367 	}
2368       break;
2369 
2370     case DW_FORM_GNU_strp_alt:
2371       if (!do_loc)
2372 	{
2373 	  printf (_("%c(alt indirect string, offset: 0x%s) %s"), delimiter,
2374 		  dwarf_vmatoa ("x", uvalue),
2375 		  fetch_alt_indirect_string (uvalue));
2376 	}
2377       break;
2378 
2379     case DW_FORM_indirect:
2380       /* Handled above.  */
2381       break;
2382 
2383     case DW_FORM_ref_sig8:
2384       if (!do_loc)
2385 	{
2386 	  dwarf_vma high_bits;
2387 	  char buf[64];
2388 
2389 	  SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
2390 	  printf ("%csignature: 0x%s", delimiter,
2391 		  dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf)));
2392 	}
2393       data += 8;
2394       break;
2395 
2396     case DW_FORM_GNU_addr_index:
2397       if (!do_loc)
2398 	printf (_("%c(addr_index: 0x%s): %s"), delimiter,
2399 		dwarf_vmatoa ("x", uvalue),
2400 		fetch_indexed_value (uvalue * pointer_size, pointer_size));
2401       break;
2402 
2403     default:
2404       warn (_("Unrecognized form: %lu\n"), form);
2405       break;
2406     }
2407 
2408   if ((do_loc || do_debug_loc || do_debug_ranges)
2409       && num_debug_info_entries == 0
2410       && debug_info_p != NULL)
2411     {
2412       switch (attribute)
2413 	{
2414 	case DW_AT_frame_base:
2415 	  have_frame_base = 1;
2416 	  /* Fall through.  */
2417 	case DW_AT_location:
2418 	case DW_AT_GNU_locviews:
2419 	case DW_AT_string_length:
2420 	case DW_AT_return_addr:
2421 	case DW_AT_data_member_location:
2422 	case DW_AT_vtable_elem_location:
2423 	case DW_AT_segment:
2424 	case DW_AT_static_link:
2425 	case DW_AT_use_location:
2426 	case DW_AT_call_value:
2427 	case DW_AT_GNU_call_site_value:
2428 	case DW_AT_call_data_value:
2429 	case DW_AT_GNU_call_site_data_value:
2430 	case DW_AT_call_target:
2431 	case DW_AT_GNU_call_site_target:
2432 	case DW_AT_call_target_clobbered:
2433 	case DW_AT_GNU_call_site_target_clobbered:
2434 	  if ((dwarf_version < 4
2435 	       && (form == DW_FORM_data4 || form == DW_FORM_data8))
2436 	      || form == DW_FORM_sec_offset)
2437 	    {
2438 	      /* Process location list.  */
2439 	      unsigned int lmax = debug_info_p->max_loc_offsets;
2440 	      unsigned int num = debug_info_p->num_loc_offsets;
2441 
2442 	      if (lmax == 0 || num >= lmax)
2443 		{
2444 		  lmax += 1024;
2445 		  debug_info_p->loc_offsets = (dwarf_vma *)
2446 		    xcrealloc (debug_info_p->loc_offsets,
2447 			       lmax, sizeof (*debug_info_p->loc_offsets));
2448 		  debug_info_p->loc_views = (dwarf_vma *)
2449 		    xcrealloc (debug_info_p->loc_views,
2450 			       lmax, sizeof (*debug_info_p->loc_views));
2451 		  debug_info_p->have_frame_base = (int *)
2452 		    xcrealloc (debug_info_p->have_frame_base,
2453 			       lmax, sizeof (*debug_info_p->have_frame_base));
2454 		  debug_info_p->max_loc_offsets = lmax;
2455 		}
2456 	      if (this_set != NULL)
2457 		uvalue += this_set->section_offsets [DW_SECT_LOC];
2458 	      debug_info_p->have_frame_base [num] = have_frame_base;
2459 	      if (attribute != DW_AT_GNU_locviews)
2460 		{
2461 		  /* Corrupt DWARF info can produce more offsets than views.
2462 		     See PR 23062 for an example.  */
2463 		  if (debug_info_p->num_loc_offsets
2464 		      > debug_info_p->num_loc_views)
2465 		    warn (_("More location offset attributes than DW_AT_GNU_locview attributes\n"));
2466 		  else
2467 		    {
2468 		      debug_info_p->loc_offsets [num] = uvalue;
2469 		      debug_info_p->num_loc_offsets++;
2470 		    }
2471 		}
2472 	      else
2473 		{
2474 		  assert (debug_info_p->num_loc_views <= num);
2475 		  num = debug_info_p->num_loc_views;
2476 		  if (num > debug_info_p->num_loc_offsets)
2477 		    warn (_("More DW_AT_GNU_locview attributes than location offset attributes\n"));
2478 		  else
2479 		    {
2480 		      debug_info_p->loc_views [num] = uvalue;
2481 		      debug_info_p->num_loc_views++;
2482 		    }
2483 		}
2484 	    }
2485 	  break;
2486 
2487 	case DW_AT_low_pc:
2488 	  if (need_base_address)
2489 	    debug_info_p->base_address = uvalue;
2490 	  break;
2491 
2492 	case DW_AT_GNU_addr_base:
2493 	  debug_info_p->addr_base = uvalue;
2494 	  break;
2495 
2496 	case DW_AT_GNU_ranges_base:
2497 	  debug_info_p->ranges_base = uvalue;
2498 	  break;
2499 
2500 	case DW_AT_ranges:
2501 	  if ((dwarf_version < 4
2502 	       && (form == DW_FORM_data4 || form == DW_FORM_data8))
2503 	      || form == DW_FORM_sec_offset)
2504 	    {
2505 	      /* Process range list.  */
2506 	      unsigned int lmax = debug_info_p->max_range_lists;
2507 	      unsigned int num = debug_info_p->num_range_lists;
2508 
2509 	      if (lmax == 0 || num >= lmax)
2510 		{
2511 		  lmax += 1024;
2512 		  debug_info_p->range_lists = (dwarf_vma *)
2513 		    xcrealloc (debug_info_p->range_lists,
2514 			       lmax, sizeof (*debug_info_p->range_lists));
2515 		  debug_info_p->max_range_lists = lmax;
2516 		}
2517 	      debug_info_p->range_lists [num] = uvalue;
2518 	      debug_info_p->num_range_lists++;
2519 	    }
2520 	  break;
2521 
2522 	case DW_AT_GNU_dwo_name:
2523 	case DW_AT_dwo_name:
2524 	  if (need_dwo_info)
2525 	    switch (form)
2526 	      {
2527 	      case DW_FORM_strp:
2528 		add_dwo_name ((const char *) fetch_indirect_string (uvalue));
2529 		break;
2530 	      case DW_FORM_GNU_str_index:
2531 		add_dwo_name (fetch_indexed_string (uvalue, this_set, offset_size, FALSE));
2532 		break;
2533 	      case DW_FORM_string:
2534 		add_dwo_name ((const char *) orig_data);
2535 		break;
2536 	      default:
2537 		warn (_("Unsupported form (%s) for attribute %s\n"),
2538 		      get_FORM_name (form), get_AT_name (attribute));
2539 		break;
2540 	      }
2541 	  break;
2542 
2543 	case DW_AT_comp_dir:
2544 	  /* FIXME: Also extract a build-id in a CU/TU.  */
2545 	  if (need_dwo_info)
2546 	    switch (form)
2547 	      {
2548 	      case DW_FORM_strp:
2549 		add_dwo_dir ((const char *) fetch_indirect_string (uvalue));
2550 		break;
2551 	      case DW_FORM_line_strp:
2552 		add_dwo_dir ((const char *) fetch_indirect_line_string (uvalue));
2553 		break;
2554 	      case DW_FORM_GNU_str_index:
2555 		add_dwo_dir (fetch_indexed_string (uvalue, this_set, offset_size, FALSE));
2556 		break;
2557 	      case DW_FORM_string:
2558 		add_dwo_dir ((const char *) orig_data);
2559 		break;
2560 	      default:
2561 		warn (_("Unsupported form (%s) for attribute %s\n"),
2562 		      get_FORM_name (form), get_AT_name (attribute));
2563 		break;
2564 	      }
2565 	  break;
2566 
2567 	case DW_AT_GNU_dwo_id:
2568 	  if (need_dwo_info)
2569 	    switch (form)
2570 	      {
2571 	      case DW_FORM_data8:
2572 		/* FIXME: Record the length of the ID as well ?  */
2573 		add_dwo_id ((const char *) (data - 8));
2574 		break;
2575 	      default:
2576 		warn (_("Unsupported form (%s) for attribute %s\n"),
2577 		      get_FORM_name (form), get_AT_name (attribute));
2578 		break;
2579 	      }
2580 	  break;
2581 
2582 	default:
2583 	  break;
2584 	}
2585     }
2586 
2587   if (do_loc || attribute == 0)
2588     return data;
2589 
2590   /* For some attributes we can display further information.  */
2591   switch (attribute)
2592     {
2593     case DW_AT_type:
2594       if (level >= 0 && level < MAX_CU_NESTING
2595 	  && uvalue < (size_t) (end - start))
2596 	{
2597 	  bfd_boolean is_signed = FALSE;
2598 
2599 	  get_type_signedness (start, start + uvalue, end, pointer_size,
2600 			       offset_size, dwarf_version, & is_signed, FALSE);
2601 	  level_type_signed[level] = is_signed;
2602 	}
2603       break;
2604 
2605     case DW_AT_inline:
2606       printf ("\t");
2607       switch (uvalue)
2608 	{
2609 	case DW_INL_not_inlined:
2610 	  printf (_("(not inlined)"));
2611 	  break;
2612 	case DW_INL_inlined:
2613 	  printf (_("(inlined)"));
2614 	  break;
2615 	case DW_INL_declared_not_inlined:
2616 	  printf (_("(declared as inline but ignored)"));
2617 	  break;
2618 	case DW_INL_declared_inlined:
2619 	  printf (_("(declared as inline and inlined)"));
2620 	  break;
2621 	default:
2622 	  printf (_("  (Unknown inline attribute value: %s)"),
2623 		  dwarf_vmatoa ("x", uvalue));
2624 	  break;
2625 	}
2626       break;
2627 
2628     case DW_AT_language:
2629       printf ("\t");
2630       switch (uvalue)
2631 	{
2632 	  /* Ordered by the numeric value of these constants.  */
2633 	case DW_LANG_C89:		printf ("(ANSI C)"); break;
2634 	case DW_LANG_C:			printf ("(non-ANSI C)"); break;
2635 	case DW_LANG_Ada83:		printf ("(Ada)"); break;
2636 	case DW_LANG_C_plus_plus:	printf ("(C++)"); break;
2637 	case DW_LANG_Cobol74:		printf ("(Cobol 74)"); break;
2638 	case DW_LANG_Cobol85:		printf ("(Cobol 85)"); break;
2639 	case DW_LANG_Fortran77:		printf ("(FORTRAN 77)"); break;
2640 	case DW_LANG_Fortran90:		printf ("(Fortran 90)"); break;
2641 	case DW_LANG_Pascal83:		printf ("(ANSI Pascal)"); break;
2642 	case DW_LANG_Modula2:		printf ("(Modula 2)"); break;
2643 	  /* DWARF 2.1 values.	*/
2644 	case DW_LANG_Java:		printf ("(Java)"); break;
2645 	case DW_LANG_C99:		printf ("(ANSI C99)"); break;
2646 	case DW_LANG_Ada95:		printf ("(ADA 95)"); break;
2647 	case DW_LANG_Fortran95:		printf ("(Fortran 95)"); break;
2648 	  /* DWARF 3 values.  */
2649 	case DW_LANG_PLI:		printf ("(PLI)"); break;
2650 	case DW_LANG_ObjC:		printf ("(Objective C)"); break;
2651 	case DW_LANG_ObjC_plus_plus:	printf ("(Objective C++)"); break;
2652 	case DW_LANG_UPC:		printf ("(Unified Parallel C)"); break;
2653 	case DW_LANG_D:			printf ("(D)"); break;
2654 	  /* DWARF 4 values.  */
2655 	case DW_LANG_Python:		printf ("(Python)"); break;
2656 	  /* DWARF 5 values.  */
2657 	case DW_LANG_OpenCL:		printf ("(OpenCL)"); break;
2658 	case DW_LANG_Go:		printf ("(Go)"); break;
2659 	case DW_LANG_Modula3:		printf ("(Modula 3)"); break;
2660 	case DW_LANG_Haskell:		printf ("(Haskell)"); break;
2661 	case DW_LANG_C_plus_plus_03:	printf ("(C++03)"); break;
2662 	case DW_LANG_C_plus_plus_11:	printf ("(C++11)"); break;
2663 	case DW_LANG_OCaml:		printf ("(OCaml)"); break;
2664 	case DW_LANG_Rust:		printf ("(Rust)"); break;
2665 	case DW_LANG_C11:		printf ("(C11)"); break;
2666 	case DW_LANG_Swift:		printf ("(Swift)"); break;
2667 	case DW_LANG_Julia:		printf ("(Julia)"); break;
2668 	case DW_LANG_Dylan:		printf ("(Dylan)"); break;
2669 	case DW_LANG_C_plus_plus_14:	printf ("(C++14)"); break;
2670 	case DW_LANG_Fortran03:		printf ("(Fortran 03)"); break;
2671 	case DW_LANG_Fortran08:		printf ("(Fortran 08)"); break;
2672 	case DW_LANG_RenderScript:	printf ("(RenderScript)"); break;
2673 	  /* MIPS extension.  */
2674 	case DW_LANG_Mips_Assembler:	printf ("(MIPS assembler)"); break;
2675 	  /* UPC extension.  */
2676 	case DW_LANG_Upc:		printf ("(Unified Parallel C)"); break;
2677 	default:
2678 	  if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
2679 	    printf (_("(implementation defined: %s)"),
2680 		    dwarf_vmatoa ("x", uvalue));
2681 	  else
2682 	    printf (_("(Unknown: %s)"), dwarf_vmatoa ("x", uvalue));
2683 	  break;
2684 	}
2685       break;
2686 
2687     case DW_AT_encoding:
2688       printf ("\t");
2689       switch (uvalue)
2690 	{
2691 	case DW_ATE_void:		printf ("(void)"); break;
2692 	case DW_ATE_address:		printf ("(machine address)"); break;
2693 	case DW_ATE_boolean:		printf ("(boolean)"); break;
2694 	case DW_ATE_complex_float:	printf ("(complex float)"); break;
2695 	case DW_ATE_float:		printf ("(float)"); break;
2696 	case DW_ATE_signed:		printf ("(signed)"); break;
2697 	case DW_ATE_signed_char:	printf ("(signed char)"); break;
2698 	case DW_ATE_unsigned:		printf ("(unsigned)"); break;
2699 	case DW_ATE_unsigned_char:	printf ("(unsigned char)"); break;
2700 	  /* DWARF 2.1 values:  */
2701 	case DW_ATE_imaginary_float:	printf ("(imaginary float)"); break;
2702 	case DW_ATE_decimal_float:	printf ("(decimal float)"); break;
2703 	  /* DWARF 3 values:  */
2704 	case DW_ATE_packed_decimal:	printf ("(packed_decimal)"); break;
2705 	case DW_ATE_numeric_string:	printf ("(numeric_string)"); break;
2706 	case DW_ATE_edited:		printf ("(edited)"); break;
2707 	case DW_ATE_signed_fixed:	printf ("(signed_fixed)"); break;
2708 	case DW_ATE_unsigned_fixed:	printf ("(unsigned_fixed)"); break;
2709 	  /* DWARF 4 values:  */
2710 	case DW_ATE_UTF:		printf ("(unicode string)"); break;
2711 	  /* DWARF 5 values:  */
2712 	case DW_ATE_UCS:		printf ("(UCS)"); break;
2713 	case DW_ATE_ASCII:		printf ("(ASCII)"); break;
2714 
2715 	  /* HP extensions:  */
2716 	case DW_ATE_HP_float80:		printf ("(HP_float80)"); break;
2717 	case DW_ATE_HP_complex_float80:	printf ("(HP_complex_float80)"); break;
2718 	case DW_ATE_HP_float128:	printf ("(HP_float128)"); break;
2719 	case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
2720 	case DW_ATE_HP_floathpintel:	printf ("(HP_floathpintel)"); break;
2721 	case DW_ATE_HP_imaginary_float80:	printf ("(HP_imaginary_float80)"); break;
2722 	case DW_ATE_HP_imaginary_float128:	printf ("(HP_imaginary_float128)"); break;
2723 
2724 	default:
2725 	  if (uvalue >= DW_ATE_lo_user
2726 	      && uvalue <= DW_ATE_hi_user)
2727 	    printf (_("(user defined type)"));
2728 	  else
2729 	    printf (_("(unknown type)"));
2730 	  break;
2731 	}
2732       break;
2733 
2734     case DW_AT_accessibility:
2735       printf ("\t");
2736       switch (uvalue)
2737 	{
2738 	case DW_ACCESS_public:		printf ("(public)"); break;
2739 	case DW_ACCESS_protected:	printf ("(protected)"); break;
2740 	case DW_ACCESS_private:		printf ("(private)"); break;
2741 	default:
2742 	  printf (_("(unknown accessibility)"));
2743 	  break;
2744 	}
2745       break;
2746 
2747     case DW_AT_visibility:
2748       printf ("\t");
2749       switch (uvalue)
2750 	{
2751 	case DW_VIS_local:		printf ("(local)"); break;
2752 	case DW_VIS_exported:		printf ("(exported)"); break;
2753 	case DW_VIS_qualified:		printf ("(qualified)"); break;
2754 	default:			printf (_("(unknown visibility)")); break;
2755 	}
2756       break;
2757 
2758     case DW_AT_endianity:
2759       printf ("\t");
2760       switch (uvalue)
2761 	{
2762 	case DW_END_default:		printf ("(default)"); break;
2763 	case DW_END_big:		printf ("(big)"); break;
2764 	case DW_END_little:		printf ("(little)"); break;
2765 	default:
2766 	  if (uvalue >= DW_END_lo_user && uvalue <= DW_END_hi_user)
2767 	    printf (_("(user specified)"));
2768 	  else
2769 	    printf (_("(unknown endianity)"));
2770 	  break;
2771 	}
2772       break;
2773 
2774     case DW_AT_virtuality:
2775       printf ("\t");
2776       switch (uvalue)
2777 	{
2778 	case DW_VIRTUALITY_none:	printf ("(none)"); break;
2779 	case DW_VIRTUALITY_virtual:	printf ("(virtual)"); break;
2780 	case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
2781 	default:			printf (_("(unknown virtuality)")); break;
2782 	}
2783       break;
2784 
2785     case DW_AT_identifier_case:
2786       printf ("\t");
2787       switch (uvalue)
2788 	{
2789 	case DW_ID_case_sensitive:	printf ("(case_sensitive)"); break;
2790 	case DW_ID_up_case:		printf ("(up_case)"); break;
2791 	case DW_ID_down_case:		printf ("(down_case)"); break;
2792 	case DW_ID_case_insensitive:	printf ("(case_insensitive)"); break;
2793 	default:			printf (_("(unknown case)")); break;
2794 	}
2795       break;
2796 
2797     case DW_AT_calling_convention:
2798       printf ("\t");
2799       switch (uvalue)
2800 	{
2801 	case DW_CC_normal:	printf ("(normal)"); break;
2802 	case DW_CC_program:	printf ("(program)"); break;
2803 	case DW_CC_nocall:	printf ("(nocall)"); break;
2804 	case DW_CC_pass_by_reference: printf ("(pass by ref)"); break;
2805 	case DW_CC_pass_by_value: printf ("(pass by value)"); break;
2806 	case DW_CC_GNU_renesas_sh: printf ("(Rensas SH)"); break;
2807 	case DW_CC_GNU_borland_fastcall_i386: printf ("(Borland fastcall i386)"); break;
2808 	default:
2809 	  if (uvalue >= DW_CC_lo_user
2810 	      && uvalue <= DW_CC_hi_user)
2811 	    printf (_("(user defined)"));
2812 	  else
2813 	    printf (_("(unknown convention)"));
2814 	}
2815       break;
2816 
2817     case DW_AT_ordering:
2818       printf ("\t");
2819       switch (uvalue)
2820 	{
2821 	case 255:
2822 	case -1: printf (_("(undefined)")); break;
2823 	case 0:  printf ("(row major)"); break;
2824 	case 1:  printf ("(column major)"); break;
2825 	}
2826       break;
2827 
2828     case DW_AT_decimal_sign:
2829       printf ("\t");
2830       switch (uvalue)
2831 	{
2832 	case DW_DS_unsigned:            printf (_("(unsigned)")); break;
2833 	case DW_DS_leading_overpunch:   printf (_("(leading overpunch)")); break;
2834 	case DW_DS_trailing_overpunch:  printf (_("(trailing overpunch)")); break;
2835 	case DW_DS_leading_separate:    printf (_("(leading separate)")); break;
2836 	case DW_DS_trailing_separate:   printf (_("(trailing separate)")); break;
2837 	default:                        printf (_("(unrecognised)")); break;
2838 	}
2839       break;
2840 
2841     case DW_AT_defaulted:
2842       printf ("\t");
2843       switch (uvalue)
2844 	{
2845 	case DW_DEFAULTED_no:           printf (_("(no)")); break;
2846 	case DW_DEFAULTED_in_class:     printf (_("(in class)")); break;
2847 	case DW_DEFAULTED_out_of_class: printf (_("(out of class)")); break;
2848 	default:                        printf (_("(unrecognised)")); break;
2849 	}
2850       break;
2851 
2852     case DW_AT_discr_list:
2853       printf ("\t");
2854       display_discr_list (form, uvalue, data, end, level);
2855       break;
2856 
2857     case DW_AT_frame_base:
2858       have_frame_base = 1;
2859       /* Fall through.  */
2860     case DW_AT_location:
2861     case DW_AT_string_length:
2862     case DW_AT_return_addr:
2863     case DW_AT_data_member_location:
2864     case DW_AT_vtable_elem_location:
2865     case DW_AT_segment:
2866     case DW_AT_static_link:
2867     case DW_AT_use_location:
2868     case DW_AT_call_value:
2869     case DW_AT_GNU_call_site_value:
2870     case DW_AT_call_data_value:
2871     case DW_AT_GNU_call_site_data_value:
2872     case DW_AT_call_target:
2873     case DW_AT_GNU_call_site_target:
2874     case DW_AT_call_target_clobbered:
2875     case DW_AT_GNU_call_site_target_clobbered:
2876       if ((dwarf_version < 4
2877 	   && (form == DW_FORM_data4 || form == DW_FORM_data8))
2878 	  || form == DW_FORM_sec_offset)
2879 	printf (_(" (location list)"));
2880       /* Fall through.  */
2881     case DW_AT_allocated:
2882     case DW_AT_associated:
2883     case DW_AT_data_location:
2884     case DW_AT_stride:
2885     case DW_AT_upper_bound:
2886     case DW_AT_lower_bound:
2887       if (block_start)
2888 	{
2889 	  int need_frame_base;
2890 
2891 	  printf ("\t(");
2892 	  need_frame_base = decode_location_expression (block_start,
2893 							pointer_size,
2894 							offset_size,
2895 							dwarf_version,
2896 							uvalue,
2897 							cu_offset, section);
2898 	  printf (")");
2899 	  if (need_frame_base && !have_frame_base)
2900 	    printf (_(" [without DW_AT_frame_base]"));
2901 	}
2902       break;
2903 
2904     case DW_AT_data_bit_offset:
2905     case DW_AT_byte_size:
2906     case DW_AT_bit_size:
2907     case DW_AT_string_length_byte_size:
2908     case DW_AT_string_length_bit_size:
2909     case DW_AT_bit_stride:
2910       if (form == DW_FORM_exprloc)
2911 	{
2912 	  printf ("\t(");
2913 	  (void) decode_location_expression (block_start, pointer_size,
2914 					     offset_size, dwarf_version,
2915 					     uvalue, cu_offset, section);
2916 	  printf (")");
2917 	}
2918       break;
2919 
2920     case DW_AT_import:
2921       {
2922 	if (form == DW_FORM_ref_sig8
2923 	    || form == DW_FORM_GNU_ref_alt)
2924 	  break;
2925 
2926 	if (form == DW_FORM_ref1
2927 	    || form == DW_FORM_ref2
2928 	    || form == DW_FORM_ref4
2929 	    || form == DW_FORM_ref_udata)
2930 	  uvalue += cu_offset;
2931 
2932 	if (uvalue >= section->size)
2933 	  warn (_("Offset %s used as value for DW_AT_import attribute of DIE at offset 0x%lx is too big.\n"),
2934 		dwarf_vmatoa ("x", uvalue),
2935 		(unsigned long) (orig_data - section->start));
2936 	else
2937 	  {
2938 	    unsigned long abbrev_number;
2939 	    abbrev_entry *entry;
2940 	    unsigned char *p = section->start + uvalue;
2941 
2942 	    READ_ULEB (abbrev_number, p, end);
2943 
2944 	    printf (_("\t[Abbrev Number: %ld"), abbrev_number);
2945 	    /* Don't look up abbrev for DW_FORM_ref_addr, as it very often will
2946 	       use different abbrev table, and we don't track .debug_info chunks
2947 	       yet.  */
2948 	    if (form != DW_FORM_ref_addr)
2949 	      {
2950 		for (entry = first_abbrev; entry != NULL; entry = entry->next)
2951 		  if (entry->entry == abbrev_number)
2952 		    break;
2953 		if (entry != NULL)
2954 		  printf (" (%s)", get_TAG_name (entry->tag));
2955 	      }
2956 	    printf ("]");
2957 	  }
2958       }
2959       break;
2960 
2961     default:
2962       break;
2963     }
2964 
2965   return data;
2966 }
2967 
2968 static unsigned char *
2969 read_and_display_attr (unsigned long           attribute,
2970 		       unsigned long           form,
2971 		       dwarf_signed_vma        implicit_const,
2972 		       unsigned char *         start,
2973 		       unsigned char *         data,
2974 		       unsigned char *         end,
2975 		       dwarf_vma               cu_offset,
2976 		       dwarf_vma               pointer_size,
2977 		       dwarf_vma               offset_size,
2978 		       int                     dwarf_version,
2979 		       debug_info *            debug_info_p,
2980 		       int                     do_loc,
2981 		       struct dwarf_section *  section,
2982 		       struct cu_tu_set *      this_set,
2983 		       int                     level)
2984 {
2985   if (!do_loc)
2986     printf ("   %-18s:", get_AT_name (attribute));
2987   data = read_and_display_attr_value (attribute, form, implicit_const,
2988 				      start, data, end,
2989 				      cu_offset, pointer_size, offset_size,
2990 				      dwarf_version, debug_info_p,
2991 				      do_loc, section, this_set, ' ', level);
2992   if (!do_loc)
2993     printf ("\n");
2994   return data;
2995 }
2996 
2997 /* Like load_debug_section, but if the ordinary call fails, and we are
2998    following debug links, then attempt to load the requested section
2999    from one of the separate debug info files.  */
3000 
3001 static bfd_boolean
3002 load_debug_section_with_follow (enum dwarf_section_display_enum sec_enum,
3003 				void * handle)
3004 {
3005   if (load_debug_section (sec_enum, handle))
3006     {
3007       if (debug_displays[sec_enum].section.filename == NULL)
3008 	{
3009 	  /* See if we can associate a filename with this section.  */
3010 	  separate_info * i;
3011 
3012 	  for (i = first_separate_info; i != NULL; i = i->next)
3013 	    if (i->handle == handle)
3014 	      {
3015 		debug_displays[sec_enum].section.filename = i->filename;
3016 		break;
3017 	      }
3018 	}
3019 
3020       return TRUE;
3021     }
3022 
3023   if (do_follow_links)
3024     {
3025       separate_info * i;
3026 
3027       for (i = first_separate_info; i != NULL; i = i->next)
3028 	{
3029 	  if (load_debug_section (sec_enum, i->handle))
3030 	    {
3031 	      debug_displays[sec_enum].section.filename = i->filename;
3032 
3033 	      /* FIXME: We should check to see if any of the remaining debug info
3034 		 files also contain this section, and, umm, do something about it.  */
3035 	      return TRUE;
3036 	    }
3037 	}
3038     }
3039 
3040   return FALSE;
3041 }
3042 
3043 static void
3044 introduce (struct dwarf_section * section, bfd_boolean raw)
3045 {
3046   if (raw)
3047     {
3048       if (do_follow_links && section->filename)
3049 	printf (_("Raw dump of debug contents of section %s (loaded from %s):\n\n"),
3050 		section->name, section->filename);
3051       else
3052 	printf (_("Raw dump of debug contents of section %s:\n\n"), section->name);
3053     }
3054   else
3055     {
3056       if (do_follow_links && section->filename)
3057 	printf (_("Contents of the %s section (loaded from %s):\n\n"),
3058 		section->name, section->filename);
3059       else
3060 	printf (_("Contents of the %s section:\n\n"), section->name);
3061     }
3062 }
3063 
3064 /* Process the contents of a .debug_info section.
3065    If do_loc is TRUE then we are scanning for location lists and dwo tags
3066    and we do not want to display anything to the user.
3067    If do_types is TRUE, we are processing a .debug_types section instead of
3068    a .debug_info section.
3069    The information displayed is restricted by the values in DWARF_START_DIE
3070    and DWARF_CUTOFF_LEVEL.
3071    Returns TRUE upon success.  Otherwise an error or warning message is
3072    printed and FALSE is returned.  */
3073 
3074 static bfd_boolean
3075 process_debug_info (struct dwarf_section *           section,
3076 		    void *                           file,
3077 		    enum dwarf_section_display_enum  abbrev_sec,
3078 		    bfd_boolean                      do_loc,
3079 		    bfd_boolean                      do_types)
3080 {
3081   unsigned char *start = section->start;
3082   unsigned char *end = start + section->size;
3083   unsigned char *section_begin;
3084   unsigned int unit;
3085   unsigned int num_units = 0;
3086 
3087   if ((do_loc || do_debug_loc || do_debug_ranges)
3088       && num_debug_info_entries == 0
3089       && ! do_types)
3090     {
3091       dwarf_vma length;
3092 
3093       /* First scan the section to get the number of comp units.  */
3094       for (section_begin = start, num_units = 0; section_begin < end;
3095 	   num_units ++)
3096 	{
3097 	  /* Read the first 4 bytes.  For a 32-bit DWARF section, this
3098 	     will be the length.  For a 64-bit DWARF section, it'll be
3099 	     the escape code 0xffffffff followed by an 8 byte length.  */
3100 	  SAFE_BYTE_GET (length, section_begin, 4, end);
3101 
3102 	  if (length == 0xffffffff)
3103 	    {
3104 	      SAFE_BYTE_GET (length, section_begin + 4, 8, end);
3105 	      section_begin += length + 12;
3106 	    }
3107 	  else if (length >= 0xfffffff0 && length < 0xffffffff)
3108 	    {
3109 	      warn (_("Reserved length value (0x%s) found in section %s\n"),
3110 		    dwarf_vmatoa ("x", length), section->name);
3111 	      return FALSE;
3112 	    }
3113 	  else
3114 	    section_begin += length + 4;
3115 
3116 	  /* Negative values are illegal, they may even cause infinite
3117 	     looping.  This can happen if we can't accurately apply
3118 	     relocations to an object file, or if the file is corrupt.  */
3119 	  if ((signed long) length <= 0 || section_begin < start)
3120 	    {
3121 	      warn (_("Corrupt unit length (0x%s) found in section %s\n"),
3122 		    dwarf_vmatoa ("x", length), section->name);
3123 	      return FALSE;
3124 	    }
3125 	}
3126 
3127       if (num_units == 0)
3128 	{
3129 	  error (_("No comp units in %s section ?\n"), section->name);
3130 	  return FALSE;
3131 	}
3132 
3133       /* Then allocate an array to hold the information.  */
3134       debug_information = (debug_info *) cmalloc (num_units,
3135 						  sizeof (* debug_information));
3136       if (debug_information == NULL)
3137 	{
3138 	  error (_("Not enough memory for a debug info array of %u entries\n"),
3139 		 num_units);
3140 	  alloc_num_debug_info_entries = num_debug_info_entries = 0;
3141 	  return FALSE;
3142 	}
3143 
3144       /* PR 17531: file: 92ca3797.
3145 	 We cannot rely upon the debug_information array being initialised
3146 	 before it is used.  A corrupt file could easily contain references
3147 	 to a unit for which information has not been made available.  So
3148 	 we ensure that the array is zeroed here.  */
3149       memset (debug_information, 0, num_units * sizeof (*debug_information));
3150 
3151       alloc_num_debug_info_entries = num_units;
3152     }
3153 
3154   if (!do_loc)
3155     {
3156       load_debug_section_with_follow (str, file);
3157       load_debug_section_with_follow (line_str, file);
3158       load_debug_section_with_follow (str_dwo, file);
3159       load_debug_section_with_follow (str_index, file);
3160       load_debug_section_with_follow (str_index_dwo, file);
3161       load_debug_section_with_follow (debug_addr, file);
3162     }
3163 
3164   load_debug_section_with_follow (abbrev_sec, file);
3165   if (debug_displays [abbrev_sec].section.start == NULL)
3166     {
3167       warn (_("Unable to locate %s section!\n"),
3168 	    debug_displays [abbrev_sec].section.uncompressed_name);
3169       return FALSE;
3170     }
3171 
3172   if (!do_loc && dwarf_start_die == 0)
3173     introduce (section, FALSE);
3174 
3175   for (section_begin = start, unit = 0; start < end; unit++)
3176     {
3177       DWARF2_Internal_CompUnit compunit;
3178       unsigned char *hdrptr;
3179       unsigned char *tags;
3180       int level, last_level, saved_level;
3181       dwarf_vma cu_offset;
3182       unsigned long sec_off;
3183       unsigned int offset_size;
3184       unsigned int initial_length_size;
3185       dwarf_vma signature_high = 0;
3186       dwarf_vma signature_low = 0;
3187       dwarf_vma type_offset = 0;
3188       struct cu_tu_set *this_set;
3189       dwarf_vma abbrev_base;
3190       size_t abbrev_size;
3191 
3192       hdrptr = start;
3193 
3194       SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 4, end);
3195 
3196       if (compunit.cu_length == 0xffffffff)
3197 	{
3198 	  SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 8, end);
3199 	  offset_size = 8;
3200 	  initial_length_size = 12;
3201 	}
3202       else
3203 	{
3204 	  offset_size = 4;
3205 	  initial_length_size = 4;
3206 	}
3207 
3208       SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end);
3209 
3210       cu_offset = start - section_begin;
3211 
3212       this_set = find_cu_tu_set_v2 (cu_offset, do_types);
3213 
3214       if (compunit.cu_version < 5)
3215 	{
3216 	  compunit.cu_unit_type = DW_UT_compile;
3217 	  /* Initialize it due to a false compiler warning.  */
3218 	  compunit.cu_pointer_size = -1;
3219 	}
3220       else
3221 	{
3222 	  SAFE_BYTE_GET_AND_INC (compunit.cu_unit_type, hdrptr, 1, end);
3223 	  do_types = (compunit.cu_unit_type == DW_UT_type);
3224 
3225 	  SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
3226 	}
3227 
3228       SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
3229 
3230       if (this_set == NULL)
3231 	{
3232 	  abbrev_base = 0;
3233 	  abbrev_size = debug_displays [abbrev_sec].section.size;
3234 	}
3235       else
3236 	{
3237 	  abbrev_base = this_set->section_offsets [DW_SECT_ABBREV];
3238 	  abbrev_size = this_set->section_sizes [DW_SECT_ABBREV];
3239 	}
3240 
3241       if (compunit.cu_version < 5)
3242 	SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
3243 
3244       /* PR 17512: file: 001-108546-0.001:0.1.  */
3245       if (compunit.cu_pointer_size < 2 || compunit.cu_pointer_size > 8)
3246 	{
3247 	  warn (_("Invalid pointer size (%d) in compunit header, using %d instead\n"),
3248 		compunit.cu_pointer_size, offset_size);
3249 	  compunit.cu_pointer_size = offset_size;
3250 	}
3251 
3252       if (do_types)
3253 	{
3254 	  SAFE_BYTE_GET64 (hdrptr, &signature_high, &signature_low, end);
3255 	  hdrptr += 8;
3256 	  SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end);
3257 	}
3258 
3259       if (dwarf_start_die > (cu_offset + compunit.cu_length
3260 			     + initial_length_size))
3261 	{
3262 	  start = section_begin + cu_offset + compunit.cu_length
3263 	    + initial_length_size;
3264 	  continue;
3265 	}
3266 
3267       if ((do_loc || do_debug_loc || do_debug_ranges)
3268 	  && num_debug_info_entries == 0
3269 	  && ! do_types)
3270 	{
3271 	  debug_information [unit].cu_offset = cu_offset;
3272 	  debug_information [unit].pointer_size
3273 	    = compunit.cu_pointer_size;
3274 	  debug_information [unit].offset_size = offset_size;
3275 	  debug_information [unit].dwarf_version = compunit.cu_version;
3276 	  debug_information [unit].base_address = 0;
3277 	  debug_information [unit].addr_base = DEBUG_INFO_UNAVAILABLE;
3278 	  debug_information [unit].ranges_base = DEBUG_INFO_UNAVAILABLE;
3279 	  debug_information [unit].loc_offsets = NULL;
3280 	  debug_information [unit].have_frame_base = NULL;
3281 	  debug_information [unit].max_loc_offsets = 0;
3282 	  debug_information [unit].num_loc_offsets = 0;
3283 	  debug_information [unit].range_lists = NULL;
3284 	  debug_information [unit].max_range_lists= 0;
3285 	  debug_information [unit].num_range_lists = 0;
3286 	}
3287 
3288       if (!do_loc && dwarf_start_die == 0)
3289 	{
3290 	  printf (_("  Compilation Unit @ offset 0x%s:\n"),
3291 		  dwarf_vmatoa ("x", cu_offset));
3292 	  printf (_("   Length:        0x%s (%s)\n"),
3293 		  dwarf_vmatoa ("x", compunit.cu_length),
3294 		  offset_size == 8 ? "64-bit" : "32-bit");
3295 	  printf (_("   Version:       %d\n"), compunit.cu_version);
3296 	  printf (_("   Abbrev Offset: 0x%s\n"),
3297 		  dwarf_vmatoa ("x", compunit.cu_abbrev_offset));
3298 	  printf (_("   Pointer Size:  %d\n"), compunit.cu_pointer_size);
3299 	  if (do_types)
3300 	    {
3301 	      char buf[64];
3302 
3303 	      printf (_("   Signature:     0x%s\n"),
3304 		      dwarf_vmatoa64 (signature_high, signature_low,
3305 				      buf, sizeof (buf)));
3306 	      printf (_("   Type Offset:   0x%s\n"),
3307 		      dwarf_vmatoa ("x", type_offset));
3308 	    }
3309 	  if (this_set != NULL)
3310 	    {
3311 	      dwarf_vma *offsets = this_set->section_offsets;
3312 	      size_t *sizes = this_set->section_sizes;
3313 
3314 	      printf (_("   Section contributions:\n"));
3315 	      printf (_("    .debug_abbrev.dwo:       0x%s  0x%s\n"),
3316 		      dwarf_vmatoa ("x", offsets [DW_SECT_ABBREV]),
3317 		      dwarf_vmatoa ("x", sizes [DW_SECT_ABBREV]));
3318 	      printf (_("    .debug_line.dwo:         0x%s  0x%s\n"),
3319 		      dwarf_vmatoa ("x", offsets [DW_SECT_LINE]),
3320 		      dwarf_vmatoa ("x", sizes [DW_SECT_LINE]));
3321 	      printf (_("    .debug_loc.dwo:          0x%s  0x%s\n"),
3322 		      dwarf_vmatoa ("x", offsets [DW_SECT_LOC]),
3323 		      dwarf_vmatoa ("x", sizes [DW_SECT_LOC]));
3324 	      printf (_("    .debug_str_offsets.dwo:  0x%s  0x%s\n"),
3325 		      dwarf_vmatoa ("x", offsets [DW_SECT_STR_OFFSETS]),
3326 		      dwarf_vmatoa ("x", sizes [DW_SECT_STR_OFFSETS]));
3327 	    }
3328 	}
3329 
3330       sec_off = cu_offset + initial_length_size;
3331       if (sec_off + compunit.cu_length < sec_off
3332 	  || sec_off + compunit.cu_length > section->size)
3333 	{
3334 	  warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
3335 		section->name,
3336 		(unsigned long) cu_offset,
3337 		dwarf_vmatoa ("x", compunit.cu_length));
3338 	  num_units = unit;
3339 	  break;
3340 	}
3341 
3342       tags = hdrptr;
3343       start += compunit.cu_length + initial_length_size;
3344 
3345       if (compunit.cu_version < 2 || compunit.cu_version > 5)
3346 	{
3347 	  warn (_("CU at offset %s contains corrupt or "
3348 		  "unsupported version number: %d.\n"),
3349 		dwarf_vmatoa ("x", cu_offset), compunit.cu_version);
3350 	  continue;
3351 	}
3352 
3353       if (compunit.cu_unit_type != DW_UT_compile
3354 	  && compunit.cu_unit_type != DW_UT_type)
3355 	{
3356 	  warn (_("CU at offset %s contains corrupt or "
3357 		  "unsupported unit type: %d.\n"),
3358 		dwarf_vmatoa ("x", cu_offset), compunit.cu_unit_type);
3359 	  continue;
3360 	}
3361 
3362       free_abbrevs ();
3363 
3364       /* Process the abbrevs used by this compilation unit.  */
3365       if (compunit.cu_abbrev_offset >= abbrev_size)
3366 	warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"),
3367 	      (unsigned long) compunit.cu_abbrev_offset,
3368 	      (unsigned long) abbrev_size);
3369       /* PR 17531: file:4bcd9ce9.  */
3370       else if ((abbrev_base + abbrev_size)
3371 	       > debug_displays [abbrev_sec].section.size)
3372 	warn (_("Debug info is corrupted, abbrev size (%lx) is larger than abbrev section size (%lx)\n"),
3373 	      (unsigned long) abbrev_base + abbrev_size,
3374 	      (unsigned long) debug_displays [abbrev_sec].section.size);
3375       else
3376 	process_abbrev_section
3377 	  (((unsigned char *) debug_displays [abbrev_sec].section.start
3378 	    + abbrev_base + compunit.cu_abbrev_offset),
3379 	   ((unsigned char *) debug_displays [abbrev_sec].section.start
3380 	    + abbrev_base + abbrev_size));
3381 
3382       level = 0;
3383       last_level = level;
3384       saved_level = -1;
3385       while (tags < start)
3386 	{
3387 	  unsigned long abbrev_number;
3388 	  unsigned long die_offset;
3389 	  abbrev_entry *entry;
3390 	  abbrev_attr *attr;
3391 	  int do_printing = 1;
3392 
3393 	  die_offset = tags - section_begin;
3394 
3395 	  READ_ULEB (abbrev_number, tags, start);
3396 
3397 	  /* A null DIE marks the end of a list of siblings or it may also be
3398 	     a section padding.  */
3399 	  if (abbrev_number == 0)
3400 	    {
3401 	      /* Check if it can be a section padding for the last CU.  */
3402 	      if (level == 0 && start == end)
3403 		{
3404 		  unsigned char *chk;
3405 
3406 		  for (chk = tags; chk < start; chk++)
3407 		    if (*chk != 0)
3408 		      break;
3409 		  if (chk == start)
3410 		    break;
3411 		}
3412 
3413 	      if (!do_loc && die_offset >= dwarf_start_die
3414 		  && (dwarf_cutoff_level == -1
3415 		      || level < dwarf_cutoff_level))
3416 		printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
3417 			level, die_offset);
3418 
3419 	      --level;
3420 	      if (level < 0)
3421 		{
3422 		  static unsigned num_bogus_warns = 0;
3423 
3424 		  if (num_bogus_warns < 3)
3425 		    {
3426 		      warn (_("Bogus end-of-siblings marker detected at offset %lx in %s section\n"),
3427 			    die_offset, section->name);
3428 		      num_bogus_warns ++;
3429 		      if (num_bogus_warns == 3)
3430 			warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
3431 		    }
3432 		}
3433 	      if (dwarf_start_die != 0 && level < saved_level)
3434 		return TRUE;
3435 	      continue;
3436 	    }
3437 
3438 	  if (!do_loc)
3439 	    {
3440 	      if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
3441 		do_printing = 0;
3442 	      else
3443 		{
3444 		  if (dwarf_start_die != 0 && die_offset == dwarf_start_die)
3445 		    saved_level = level;
3446 		  do_printing = (dwarf_cutoff_level == -1
3447 				 || level < dwarf_cutoff_level);
3448 		  if (do_printing)
3449 		    printf (_(" <%d><%lx>: Abbrev Number: %lu"),
3450 			    level, die_offset, abbrev_number);
3451 		  else if (dwarf_cutoff_level == -1
3452 			   || last_level < dwarf_cutoff_level)
3453 		    printf (_(" <%d><%lx>: ...\n"), level, die_offset);
3454 		  last_level = level;
3455 		}
3456 	    }
3457 
3458 	  /* Scan through the abbreviation list until we reach the
3459 	     correct entry.  */
3460 	  for (entry = first_abbrev;
3461 	       entry && entry->entry != abbrev_number;
3462 	       entry = entry->next)
3463 	    continue;
3464 
3465 	  if (entry == NULL)
3466 	    {
3467 	      if (!do_loc && do_printing)
3468 		{
3469 		  printf ("\n");
3470 		  fflush (stdout);
3471 		}
3472 	      warn (_("DIE at offset 0x%lx refers to abbreviation number %lu which does not exist\n"),
3473 		    die_offset, abbrev_number);
3474 	      return FALSE;
3475 	    }
3476 
3477 	  if (!do_loc && do_printing)
3478 	    printf (" (%s)\n", get_TAG_name (entry->tag));
3479 
3480 	  switch (entry->tag)
3481 	    {
3482 	    default:
3483 	      need_base_address = 0;
3484 	      break;
3485 	    case DW_TAG_compile_unit:
3486 	      need_base_address = 1;
3487 	      need_dwo_info = do_loc;
3488 	      break;
3489 	    case DW_TAG_entry_point:
3490 	    case DW_TAG_subprogram:
3491 	      need_base_address = 0;
3492 	      /* Assuming that there is no DW_AT_frame_base.  */
3493 	      have_frame_base = 0;
3494 	      break;
3495 	    }
3496 
3497 	  debug_info *debug_info_p =
3498 	    (debug_information && unit < alloc_num_debug_info_entries)
3499 	    ? debug_information + unit : NULL;
3500 
3501 	  assert (!debug_info_p
3502 		  || (debug_info_p->num_loc_offsets
3503 		      == debug_info_p->num_loc_views));
3504 
3505 	  for (attr = entry->first_attr;
3506 	       attr && attr->attribute;
3507 	       attr = attr->next)
3508 	    {
3509 	      if (! do_loc && do_printing)
3510 		/* Show the offset from where the tag was extracted.  */
3511 		printf ("    <%lx>", (unsigned long)(tags - section_begin));
3512 	      tags = read_and_display_attr (attr->attribute,
3513 					    attr->form,
3514 					    attr->implicit_const,
3515 					    section_begin,
3516 					    tags,
3517 					    end,
3518 					    cu_offset,
3519 					    compunit.cu_pointer_size,
3520 					    offset_size,
3521 					    compunit.cu_version,
3522 					    debug_info_p,
3523 					    do_loc || ! do_printing,
3524 					    section,
3525 					    this_set,
3526 					    level);
3527 	    }
3528 
3529 	  /* If a locview attribute appears before a location one,
3530 	     make sure we don't associate it with an earlier
3531 	     loclist. */
3532 	  if (debug_info_p)
3533 	    switch (debug_info_p->num_loc_offsets - debug_info_p->num_loc_views)
3534 	      {
3535 	      case 1:
3536 		debug_info_p->loc_views [debug_info_p->num_loc_views] = vm1;
3537 		debug_info_p->num_loc_views++;
3538 		assert (debug_info_p->num_loc_views
3539 			== debug_info_p->num_loc_offsets);
3540 		break;
3541 
3542 	      case 0:
3543 		break;
3544 
3545 	      case -1:
3546 		warn(_("DIE has locviews without loclist\n"));
3547 		debug_info_p->num_loc_views--;
3548 		break;
3549 
3550 	      default:
3551 		assert (0);
3552 	    }
3553 
3554 	  if (entry->children)
3555 	    ++level;
3556 	}
3557     }
3558 
3559   /* Set num_debug_info_entries here so that it can be used to check if
3560      we need to process .debug_loc and .debug_ranges sections.  */
3561   if ((do_loc || do_debug_loc || do_debug_ranges)
3562       && num_debug_info_entries == 0
3563       && ! do_types)
3564     {
3565       if (num_units > alloc_num_debug_info_entries)
3566 	num_debug_info_entries = alloc_num_debug_info_entries;
3567       else
3568 	num_debug_info_entries = num_units;
3569     }
3570 
3571   if (!do_loc)
3572     printf ("\n");
3573 
3574   return TRUE;
3575 }
3576 
3577 /* Locate and scan the .debug_info section in the file and record the pointer
3578    sizes and offsets for the compilation units in it.  Usually an executable
3579    will have just one pointer size, but this is not guaranteed, and so we try
3580    not to make any assumptions.  Returns zero upon failure, or the number of
3581    compilation units upon success.  */
3582 
3583 static unsigned int
3584 load_debug_info (void * file)
3585 {
3586   /* If we have already tried and failed to load the .debug_info
3587      section then do not bother to repeat the task.  */
3588   if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
3589     return 0;
3590 
3591   /* If we already have the information there is nothing else to do.  */
3592   if (num_debug_info_entries > 0)
3593     return num_debug_info_entries;
3594 
3595   /* If this is a DWARF package file, load the CU and TU indexes.  */
3596   (void) load_cu_tu_indexes (file);
3597 
3598   if (load_debug_section_with_follow (info, file)
3599       && process_debug_info (&debug_displays [info].section, file, abbrev, TRUE, FALSE))
3600     return num_debug_info_entries;
3601 
3602   if (load_debug_section_with_follow (info_dwo, file)
3603       && process_debug_info (&debug_displays [info_dwo].section, file,
3604 			     abbrev_dwo, TRUE, FALSE))
3605     return num_debug_info_entries;
3606 
3607   num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
3608   return 0;
3609 }
3610 
3611 /* Read a DWARF .debug_line section header starting at DATA.
3612    Upon success returns an updated DATA pointer and the LINFO
3613    structure and the END_OF_SEQUENCE pointer will be filled in.
3614    Otherwise returns NULL.  */
3615 
3616 static unsigned char *
3617 read_debug_line_header (struct dwarf_section * section,
3618 			unsigned char * data,
3619 			unsigned char * end,
3620 			DWARF2_Internal_LineInfo * linfo,
3621 			unsigned char ** end_of_sequence)
3622 {
3623   unsigned char *hdrptr;
3624   unsigned int initial_length_size;
3625   unsigned char address_size, segment_selector_size;
3626 
3627   /* Extract information from the Line Number Program Header.
3628      (section 6.2.4 in the Dwarf3 doc).  */
3629   hdrptr = data;
3630 
3631   /* Get and check the length of the block.  */
3632   SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 4, end);
3633 
3634   if (linfo->li_length == 0xffffffff)
3635     {
3636       /* This section is 64-bit DWARF 3.  */
3637       SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 8, end);
3638       linfo->li_offset_size = 8;
3639       initial_length_size = 12;
3640     }
3641   else
3642     {
3643       linfo->li_offset_size = 4;
3644       initial_length_size = 4;
3645     }
3646 
3647   if (linfo->li_length + initial_length_size > section->size)
3648     {
3649       /* If the length field has a relocation against it, then we should
3650 	 not complain if it is inaccurate (and probably negative).  This
3651 	 happens in object files when the .debug_line section is actually
3652 	 comprised of several different .debug_line.* sections, (some of
3653 	 which may be removed by linker garbage collection), and a relocation
3654 	 is used to compute the correct length once that is done.  */
3655       if (reloc_at (section, (hdrptr - section->start) - linfo->li_offset_size))
3656 	{
3657 	  linfo->li_length = (end - data) - initial_length_size;
3658 	}
3659       else
3660 	{
3661 	  warn (_("The length field (0x%lx) in the debug_line header is wrong - the section is too small\n"),
3662 		(long) linfo->li_length);
3663 	  return NULL;
3664 	}
3665     }
3666 
3667   /* Get and check the version number.  */
3668   SAFE_BYTE_GET_AND_INC (linfo->li_version, hdrptr, 2, end);
3669 
3670   if (linfo->li_version != 2
3671       && linfo->li_version != 3
3672       && linfo->li_version != 4
3673       && linfo->li_version != 5)
3674     {
3675       warn (_("Only DWARF version 2, 3, 4 and 5 line info "
3676 	      "is currently supported.\n"));
3677       return NULL;
3678     }
3679 
3680   if (linfo->li_version >= 5)
3681     {
3682       SAFE_BYTE_GET_AND_INC (address_size, hdrptr, 1, end);
3683 
3684       SAFE_BYTE_GET_AND_INC (segment_selector_size, hdrptr, 1, end);
3685       if (segment_selector_size != 0)
3686 	{
3687 	  warn (_("The %s section contains "
3688 		  "unsupported segment selector size: %d.\n"),
3689 		section->name, segment_selector_size);
3690 	  return 0;
3691 	}
3692     }
3693 
3694   SAFE_BYTE_GET_AND_INC (linfo->li_prologue_length, hdrptr,
3695 			 linfo->li_offset_size, end);
3696   SAFE_BYTE_GET_AND_INC (linfo->li_min_insn_length, hdrptr, 1, end);
3697 
3698   if (linfo->li_version >= 4)
3699     {
3700       SAFE_BYTE_GET_AND_INC (linfo->li_max_ops_per_insn, hdrptr, 1, end);
3701 
3702       if (linfo->li_max_ops_per_insn == 0)
3703 	{
3704 	  warn (_("Invalid maximum operations per insn.\n"));
3705 	  return NULL;
3706 	}
3707     }
3708   else
3709     linfo->li_max_ops_per_insn = 1;
3710 
3711   SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end);
3712   SAFE_SIGNED_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
3713   SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end);
3714   SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end);
3715 
3716   * end_of_sequence = data + linfo->li_length + initial_length_size;
3717   /* PR 17512: file:002-117414-0.004.  */
3718   if (* end_of_sequence > end)
3719     {
3720       warn (_("Line length %s extends beyond end of section\n"),
3721 	    dwarf_vmatoa ("u", linfo->li_length));
3722       * end_of_sequence = end;
3723       return NULL;
3724     }
3725 
3726   return hdrptr;
3727 }
3728 
3729 static unsigned char *
3730 display_formatted_table (unsigned char *                   data,
3731 			 unsigned char *                   start,
3732 			 unsigned char *                   end,
3733 			 const DWARF2_Internal_LineInfo *  linfo,
3734 			 struct dwarf_section *            section,
3735 			 bfd_boolean                       is_dir)
3736 {
3737   unsigned char *format_start, format_count, *format, formati;
3738   dwarf_vma data_count, datai;
3739   unsigned int namepass, last_entry = 0;
3740 
3741   SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
3742   format_start = data;
3743   for (formati = 0; formati < format_count; formati++)
3744     {
3745       SKIP_ULEB (data, end);
3746       SKIP_ULEB (data, end);
3747       if (data == end)
3748 	{
3749 	  if (is_dir)
3750 	    warn (_("Corrupt directory format table entry\n"));
3751 	  else
3752 	    warn (_("Corrupt file name format table entry\n"));
3753 	  return data;
3754 	}
3755     }
3756 
3757   READ_ULEB (data_count, data, end);
3758   if (data == end)
3759     {
3760       if (is_dir)
3761 	warn (_("Corrupt directory list\n"));
3762       else
3763 	warn (_("Corrupt file name list\n"));
3764       return data;
3765     }
3766 
3767   if (data_count == 0)
3768     {
3769       if (is_dir)
3770 	printf (_("\n The Directory Table is empty.\n"));
3771       else
3772 	printf (_("\n The File Name Table is empty.\n"));
3773       return data;
3774     }
3775 
3776   if (is_dir)
3777     printf (_("\n The Directory Table (offset 0x%lx):\n"),
3778 	    (long) (data - start));
3779   else
3780     printf (_("\n The File Name Table (offset 0x%lx):\n"),
3781 	    (long) (data - start));
3782 
3783   printf (_("  Entry"));
3784   /* Delay displaying name as the last entry for better screen layout.  */
3785   for (namepass = 0; namepass < 2; namepass++)
3786     {
3787       format = format_start;
3788       for (formati = 0; formati < format_count; formati++)
3789 	{
3790 	  dwarf_vma content_type;
3791 
3792 	  READ_ULEB (content_type, format, end);
3793 	  if ((content_type == DW_LNCT_path) == (namepass == 1))
3794 	    switch (content_type)
3795 	      {
3796 	      case DW_LNCT_path:
3797 		printf (_("\tName"));
3798 		break;
3799 	      case DW_LNCT_directory_index:
3800 		printf (_("\tDir"));
3801 		break;
3802 	      case DW_LNCT_timestamp:
3803 		printf (_("\tTime"));
3804 		break;
3805 	      case DW_LNCT_size:
3806 		printf (_("\tSize"));
3807 		break;
3808 	      case DW_LNCT_MD5:
3809 		printf (_("\tMD5"));
3810 		break;
3811 	      default:
3812 		printf (_("\t(Unknown format content type %s)"),
3813 			dwarf_vmatoa ("u", content_type));
3814 	      }
3815 	  SKIP_ULEB (format, end);
3816 	}
3817     }
3818   putchar ('\n');
3819 
3820   for (datai = 0; datai < data_count; datai++)
3821     {
3822       unsigned char *datapass = data;
3823 
3824       printf ("  %d", last_entry++);
3825       /* Delay displaying name as the last entry for better screen layout.  */
3826       for (namepass = 0; namepass < 2; namepass++)
3827 	{
3828 	  format = format_start;
3829 	  data = datapass;
3830 	  for (formati = 0; formati < format_count; formati++)
3831 	    {
3832 	      dwarf_vma content_type, form;
3833 
3834 	      READ_ULEB (content_type, format, end);
3835 	      READ_ULEB (form, format, end);
3836 	      data = read_and_display_attr_value (0, form, 0, start, data, end,
3837 						  0, 0, linfo->li_offset_size,
3838 						  linfo->li_version, NULL,
3839 			    ((content_type == DW_LNCT_path) != (namepass == 1)),
3840 						  section, NULL, '\t', -1);
3841 	    }
3842 	}
3843       if (data == end)
3844 	{
3845 	  if (is_dir)
3846 	    warn (_("Corrupt directory entries list\n"));
3847 	  else
3848 	    warn (_("Corrupt file name entries list\n"));
3849 	  return data;
3850 	}
3851       putchar ('\n');
3852     }
3853   return data;
3854 }
3855 
3856 static int
3857 display_debug_lines_raw (struct dwarf_section *  section,
3858 			 unsigned char *         data,
3859 			 unsigned char *         end,
3860 			 void *                  file)
3861 {
3862   unsigned char *start = section->start;
3863   int verbose_view = 0;
3864 
3865   introduce (section, TRUE);
3866 
3867   while (data < end)
3868     {
3869       static DWARF2_Internal_LineInfo saved_linfo;
3870       DWARF2_Internal_LineInfo linfo;
3871       unsigned char *standard_opcodes;
3872       unsigned char *end_of_sequence;
3873       int i;
3874 
3875       if (const_strneq (section->name, ".debug_line.")
3876 	  /* Note: the following does not apply to .debug_line.dwo sections.
3877 	     These are full debug_line sections.  */
3878 	  && strcmp (section->name, ".debug_line.dwo") != 0)
3879 	{
3880 	  /* Sections named .debug_line.<foo> are fragments of a .debug_line
3881 	     section containing just the Line Number Statements.  They are
3882 	     created by the assembler and intended to be used alongside gcc's
3883 	     -ffunction-sections command line option.  When the linker's
3884 	     garbage collection decides to discard a .text.<foo> section it
3885 	     can then also discard the line number information in .debug_line.<foo>.
3886 
3887 	     Since the section is a fragment it does not have the details
3888 	     needed to fill out a LineInfo structure, so instead we use the
3889 	     details from the last full debug_line section that we processed.  */
3890 	  end_of_sequence = end;
3891 	  standard_opcodes = NULL;
3892 	  linfo = saved_linfo;
3893 	  /* PR 17531: file: 0522b371.  */
3894 	  if (linfo.li_line_range == 0)
3895 	    {
3896 	      warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
3897 	      return 0;
3898 	    }
3899 	  reset_state_machine (linfo.li_default_is_stmt);
3900 	}
3901       else
3902 	{
3903 	  unsigned char * hdrptr;
3904 
3905 	  if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
3906 						& end_of_sequence)) == NULL)
3907 	    return 0;
3908 
3909 	  printf (_("  Offset:                      0x%lx\n"), (long)(data - start));
3910 	  printf (_("  Length:                      %ld\n"), (long) linfo.li_length);
3911 	  printf (_("  DWARF Version:               %d\n"), linfo.li_version);
3912 	  printf (_("  Prologue Length:             %d\n"), (int) linfo.li_prologue_length);
3913 	  printf (_("  Minimum Instruction Length:  %d\n"), linfo.li_min_insn_length);
3914 	  if (linfo.li_version >= 4)
3915 	    printf (_("  Maximum Ops per Instruction: %d\n"), linfo.li_max_ops_per_insn);
3916 	  printf (_("  Initial value of 'is_stmt':  %d\n"), linfo.li_default_is_stmt);
3917 	  printf (_("  Line Base:                   %d\n"), linfo.li_line_base);
3918 	  printf (_("  Line Range:                  %d\n"), linfo.li_line_range);
3919 	  printf (_("  Opcode Base:                 %d\n"), linfo.li_opcode_base);
3920 
3921 	  /* PR 17512: file: 1665-6428-0.004.  */
3922 	  if (linfo.li_line_range == 0)
3923 	    {
3924 	      warn (_("Line range of 0 is invalid, using 1 instead\n"));
3925 	      linfo.li_line_range = 1;
3926 	    }
3927 
3928 	  reset_state_machine (linfo.li_default_is_stmt);
3929 
3930 	  /* Display the contents of the Opcodes table.  */
3931 	  standard_opcodes = hdrptr;
3932 
3933 	  /* PR 17512: file: 002-417945-0.004.  */
3934 	  if (standard_opcodes + linfo.li_opcode_base >= end)
3935 	    {
3936 	      warn (_("Line Base extends beyond end of section\n"));
3937 	      return 0;
3938 	    }
3939 
3940 	  printf (_("\n Opcodes:\n"));
3941 
3942 	  for (i = 1; i < linfo.li_opcode_base; i++)
3943 	    printf (ngettext ("  Opcode %d has %d arg\n",
3944 			      "  Opcode %d has %d args\n",
3945 			      standard_opcodes[i - 1]),
3946 		    i, standard_opcodes[i - 1]);
3947 
3948 	  /* Display the contents of the Directory table.  */
3949 	  data = standard_opcodes + linfo.li_opcode_base - 1;
3950 
3951 	  if (linfo.li_version >= 5)
3952 	    {
3953 	      load_debug_section_with_follow (line_str, file);
3954 
3955 	      data = display_formatted_table (data, start, end, &linfo, section,
3956 					      TRUE);
3957 	      data = display_formatted_table (data, start, end, &linfo, section,
3958 					      FALSE);
3959 	    }
3960 	  else
3961 	    {
3962 	      if (*data == 0)
3963 		printf (_("\n The Directory Table is empty.\n"));
3964 	      else
3965 		{
3966 		  unsigned int last_dir_entry = 0;
3967 
3968 		  printf (_("\n The Directory Table (offset 0x%lx):\n"),
3969 			  (long)(data - start));
3970 
3971 		  while (data < end && *data != 0)
3972 		    {
3973 		      printf ("  %d\t%.*s\n", ++last_dir_entry, (int) (end - data), data);
3974 
3975 		      data += strnlen ((char *) data, end - data) + 1;
3976 		    }
3977 
3978 		  /* PR 17512: file: 002-132094-0.004.  */
3979 		  if (data >= end - 1)
3980 		    break;
3981 		}
3982 
3983 	      /* Skip the NUL at the end of the table.  */
3984 	      data++;
3985 
3986 	      /* Display the contents of the File Name table.  */
3987 	      if (*data == 0)
3988 		printf (_("\n The File Name Table is empty.\n"));
3989 	      else
3990 		{
3991 		  printf (_("\n The File Name Table (offset 0x%lx):\n"),
3992 			  (long)(data - start));
3993 		  printf (_("  Entry\tDir\tTime\tSize\tName\n"));
3994 
3995 		  while (data < end && *data != 0)
3996 		    {
3997 		      unsigned char *name;
3998 		      dwarf_vma val;
3999 
4000 		      printf ("  %d\t", ++state_machine_regs.last_file_entry);
4001 		      name = data;
4002 		      data += strnlen ((char *) data, end - data) + 1;
4003 
4004 		      READ_ULEB (val, data, end);
4005 		      printf ("%s\t", dwarf_vmatoa ("u", val));
4006 		      READ_ULEB (val, data, end);
4007 		      printf ("%s\t", dwarf_vmatoa ("u", val));
4008 		      READ_ULEB (val, data, end);
4009 		      printf ("%s\t", dwarf_vmatoa ("u", val));
4010 		      printf ("%.*s\n", (int)(end - name), name);
4011 
4012 		      if (data == end)
4013 			{
4014 			  warn (_("Corrupt file name table entry\n"));
4015 			  break;
4016 			}
4017 		    }
4018 		}
4019 
4020 	      /* Skip the NUL at the end of the table.  */
4021 	      data++;
4022 	    }
4023 
4024 	  putchar ('\n');
4025 	  saved_linfo = linfo;
4026 	}
4027 
4028       /* Now display the statements.  */
4029       if (data >= end_of_sequence)
4030 	printf (_(" No Line Number Statements.\n"));
4031       else
4032 	{
4033 	  printf (_(" Line Number Statements:\n"));
4034 
4035 	  while (data < end_of_sequence)
4036 	    {
4037 	      unsigned char op_code;
4038 	      dwarf_signed_vma adv;
4039 	      dwarf_vma uladv;
4040 
4041 	      printf ("  [0x%08lx]", (long)(data - start));
4042 
4043 	      op_code = *data++;
4044 
4045 	      if (op_code >= linfo.li_opcode_base)
4046 		{
4047 		  op_code -= linfo.li_opcode_base;
4048 		  uladv = (op_code / linfo.li_line_range);
4049 		  if (linfo.li_max_ops_per_insn == 1)
4050 		    {
4051 		      uladv *= linfo.li_min_insn_length;
4052 		      state_machine_regs.address += uladv;
4053 		      if (uladv)
4054 			state_machine_regs.view = 0;
4055 		      printf (_("  Special opcode %d: "
4056 				"advance Address by %s to 0x%s%s"),
4057 			      op_code, dwarf_vmatoa ("u", uladv),
4058 			      dwarf_vmatoa ("x", state_machine_regs.address),
4059 			      verbose_view && uladv
4060 			      ? _(" (reset view)") : "");
4061 		    }
4062 		  else
4063 		    {
4064 		      unsigned addrdelta
4065 			= ((state_machine_regs.op_index + uladv)
4066 			    / linfo.li_max_ops_per_insn)
4067 			* linfo.li_min_insn_length;
4068 
4069 		      state_machine_regs.address += addrdelta;
4070 		      state_machine_regs.op_index
4071 			= (state_machine_regs.op_index + uladv)
4072 			% linfo.li_max_ops_per_insn;
4073 		      if (addrdelta)
4074 			state_machine_regs.view = 0;
4075 		      printf (_("  Special opcode %d: "
4076 				"advance Address by %s to 0x%s[%d]%s"),
4077 			      op_code, dwarf_vmatoa ("u", uladv),
4078 			      dwarf_vmatoa ("x", state_machine_regs.address),
4079 			      state_machine_regs.op_index,
4080 			      verbose_view && addrdelta
4081 			      ? _(" (reset view)") : "");
4082 		    }
4083 		  adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
4084 		  state_machine_regs.line += adv;
4085 		  printf (_(" and Line by %s to %d"),
4086 			  dwarf_vmatoa ("d", adv), state_machine_regs.line);
4087 		  if (verbose_view || state_machine_regs.view)
4088 		    printf (_(" (view %u)\n"), state_machine_regs.view);
4089 		  else
4090 		    putchar ('\n');
4091 		  state_machine_regs.view++;
4092 		}
4093 	      else
4094 		switch (op_code)
4095 		  {
4096 		  case DW_LNS_extended_op:
4097 		    data += process_extended_line_op (data,
4098 						      linfo.li_default_is_stmt,
4099 						      end);
4100 		    break;
4101 
4102 		  case DW_LNS_copy:
4103 		    printf (_("  Copy"));
4104 		    if (verbose_view || state_machine_regs.view)
4105 		      printf (_(" (view %u)\n"), state_machine_regs.view);
4106 		    else
4107 		      putchar ('\n');
4108 		    state_machine_regs.view++;
4109 		    break;
4110 
4111 		  case DW_LNS_advance_pc:
4112 		    READ_ULEB (uladv, data, end);
4113 		    if (linfo.li_max_ops_per_insn == 1)
4114 		      {
4115 			uladv *= linfo.li_min_insn_length;
4116 			state_machine_regs.address += uladv;
4117 			if (uladv)
4118 			  state_machine_regs.view = 0;
4119 			printf (_("  Advance PC by %s to 0x%s%s\n"),
4120 				dwarf_vmatoa ("u", uladv),
4121 				dwarf_vmatoa ("x", state_machine_regs.address),
4122 				verbose_view && uladv
4123 				? _(" (reset view)") : "");
4124 		      }
4125 		    else
4126 		      {
4127 			unsigned addrdelta
4128 			  = ((state_machine_regs.op_index + uladv)
4129 			     / linfo.li_max_ops_per_insn)
4130 			  * linfo.li_min_insn_length;
4131 			state_machine_regs.address
4132 			  += addrdelta;
4133 			state_machine_regs.op_index
4134 			  = (state_machine_regs.op_index + uladv)
4135 			  % linfo.li_max_ops_per_insn;
4136 			if (addrdelta)
4137 			  state_machine_regs.view = 0;
4138 			printf (_("  Advance PC by %s to 0x%s[%d]%s\n"),
4139 				dwarf_vmatoa ("u", uladv),
4140 				dwarf_vmatoa ("x", state_machine_regs.address),
4141 				state_machine_regs.op_index,
4142 				verbose_view && addrdelta
4143 				? _(" (reset view)") : "");
4144 		      }
4145 		    break;
4146 
4147 		  case DW_LNS_advance_line:
4148 		    READ_SLEB (adv, data, end);
4149 		    state_machine_regs.line += adv;
4150 		    printf (_("  Advance Line by %s to %d\n"),
4151 			    dwarf_vmatoa ("d", adv),
4152 			    state_machine_regs.line);
4153 		    break;
4154 
4155 		  case DW_LNS_set_file:
4156 		    READ_ULEB (uladv, data, end);
4157 		    printf (_("  Set File Name to entry %s in the File Name Table\n"),
4158 			    dwarf_vmatoa ("u", uladv));
4159 		    state_machine_regs.file = uladv;
4160 		    break;
4161 
4162 		  case DW_LNS_set_column:
4163 		    READ_ULEB (uladv, data, end);
4164 		    printf (_("  Set column to %s\n"),
4165 			    dwarf_vmatoa ("u", uladv));
4166 		    state_machine_regs.column = uladv;
4167 		    break;
4168 
4169 		  case DW_LNS_negate_stmt:
4170 		    adv = state_machine_regs.is_stmt;
4171 		    adv = ! adv;
4172 		    printf (_("  Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv));
4173 		    state_machine_regs.is_stmt = adv;
4174 		    break;
4175 
4176 		  case DW_LNS_set_basic_block:
4177 		    printf (_("  Set basic block\n"));
4178 		    state_machine_regs.basic_block = 1;
4179 		    break;
4180 
4181 		  case DW_LNS_const_add_pc:
4182 		    uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
4183 		    if (linfo.li_max_ops_per_insn)
4184 		      {
4185 			uladv *= linfo.li_min_insn_length;
4186 			state_machine_regs.address += uladv;
4187 			if (uladv)
4188 			  state_machine_regs.view = 0;
4189 			printf (_("  Advance PC by constant %s to 0x%s%s\n"),
4190 				dwarf_vmatoa ("u", uladv),
4191 				dwarf_vmatoa ("x", state_machine_regs.address),
4192 				verbose_view && uladv
4193 				? _(" (reset view)") : "");
4194 		      }
4195 		    else
4196 		      {
4197 			unsigned addrdelta
4198 			  = ((state_machine_regs.op_index + uladv)
4199 			     / linfo.li_max_ops_per_insn)
4200 			  * linfo.li_min_insn_length;
4201 			state_machine_regs.address
4202 			  += addrdelta;
4203 			state_machine_regs.op_index
4204 			  = (state_machine_regs.op_index + uladv)
4205 			  % linfo.li_max_ops_per_insn;
4206 			if (addrdelta)
4207 			  state_machine_regs.view = 0;
4208 			printf (_("  Advance PC by constant %s to 0x%s[%d]%s\n"),
4209 				dwarf_vmatoa ("u", uladv),
4210 				dwarf_vmatoa ("x", state_machine_regs.address),
4211 				state_machine_regs.op_index,
4212 				verbose_view && addrdelta
4213 				? _(" (reset view)") : "");
4214 		      }
4215 		    break;
4216 
4217 		  case DW_LNS_fixed_advance_pc:
4218 		    SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
4219 		    state_machine_regs.address += uladv;
4220 		    state_machine_regs.op_index = 0;
4221 		    printf (_("  Advance PC by fixed size amount %s to 0x%s\n"),
4222 			    dwarf_vmatoa ("u", uladv),
4223 			    dwarf_vmatoa ("x", state_machine_regs.address));
4224 		    /* Do NOT reset view.  */
4225 		    break;
4226 
4227 		  case DW_LNS_set_prologue_end:
4228 		    printf (_("  Set prologue_end to true\n"));
4229 		    break;
4230 
4231 		  case DW_LNS_set_epilogue_begin:
4232 		    printf (_("  Set epilogue_begin to true\n"));
4233 		    break;
4234 
4235 		  case DW_LNS_set_isa:
4236 		    READ_ULEB (uladv, data, end);
4237 		    printf (_("  Set ISA to %s\n"), dwarf_vmatoa ("u", uladv));
4238 		    break;
4239 
4240 		  default:
4241 		    printf (_("  Unknown opcode %d with operands: "), op_code);
4242 
4243 		    if (standard_opcodes != NULL)
4244 		      for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
4245 			{
4246 			  READ_ULEB (uladv, data, end);
4247 			  printf ("0x%s%s", dwarf_vmatoa ("x", uladv),
4248 				  i == 1 ? "" : ", ");
4249 			}
4250 		    putchar ('\n');
4251 		    break;
4252 		  }
4253 	    }
4254 	  putchar ('\n');
4255 	}
4256     }
4257 
4258   return 1;
4259 }
4260 
4261 typedef struct
4262 {
4263   unsigned char *name;
4264   unsigned int directory_index;
4265   unsigned int modification_date;
4266   unsigned int length;
4267 } File_Entry;
4268 
4269 /* Output a decoded representation of the .debug_line section.  */
4270 
4271 static int
4272 display_debug_lines_decoded (struct dwarf_section *  section,
4273 			     unsigned char *         start,
4274 			     unsigned char *         data,
4275 			     unsigned char *         end,
4276 			     void *                  fileptr)
4277 {
4278   static DWARF2_Internal_LineInfo saved_linfo;
4279 
4280   introduce (section, FALSE);
4281 
4282   while (data < end)
4283     {
4284       /* This loop amounts to one iteration per compilation unit.  */
4285       DWARF2_Internal_LineInfo linfo;
4286       unsigned char *standard_opcodes;
4287       unsigned char *end_of_sequence;
4288       int i;
4289       File_Entry *file_table = NULL;
4290       unsigned int n_files = 0;
4291       unsigned char **directory_table = NULL;
4292       dwarf_vma n_directories = 0;
4293 
4294       if (const_strneq (section->name, ".debug_line.")
4295 	  /* Note: the following does not apply to .debug_line.dwo sections.
4296 	     These are full debug_line sections.  */
4297 	  && strcmp (section->name, ".debug_line.dwo") != 0)
4298 	{
4299 	  /* See comment in display_debug_lines_raw().  */
4300 	  end_of_sequence = end;
4301 	  standard_opcodes = NULL;
4302 	  linfo = saved_linfo;
4303 	  /* PR 17531: file: 0522b371.  */
4304 	  if (linfo.li_line_range == 0)
4305 	    {
4306 	      warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
4307 	      return 0;
4308 	    }
4309 	  reset_state_machine (linfo.li_default_is_stmt);
4310 	}
4311       else
4312 	{
4313 	  unsigned char *hdrptr;
4314 
4315 	  if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
4316 						& end_of_sequence)) == NULL)
4317 	      return 0;
4318 
4319 	  /* PR 17531: file: 0522b371.  */
4320 	  if (linfo.li_line_range == 0)
4321 	    {
4322 	      warn (_("Line range of 0 is invalid, using 1 instead\n"));
4323 	      linfo.li_line_range = 1;
4324 	    }
4325 	  reset_state_machine (linfo.li_default_is_stmt);
4326 
4327 	  /* Save a pointer to the contents of the Opcodes table.  */
4328 	  standard_opcodes = hdrptr;
4329 
4330 	  /* Traverse the Directory table just to count entries.  */
4331 	  data = standard_opcodes + linfo.li_opcode_base - 1;
4332 	  /* PR 20440 */
4333 	  if (data >= end)
4334 	    {
4335 	      warn (_("opcode base of %d extends beyond end of section\n"),
4336 		    linfo.li_opcode_base);
4337 	      return 0;
4338 	    }
4339 
4340 	  if (linfo.li_version >= 5)
4341 	    {
4342 	      unsigned char *format_start, format_count, *format;
4343 	      dwarf_vma formati, entryi;
4344 
4345 	      load_debug_section_with_follow (line_str, fileptr);
4346 
4347 	      /* Skip directories format.  */
4348 	      SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
4349 	      format_start = data;
4350 	      for (formati = 0; formati < format_count; formati++)
4351 		{
4352 		  SKIP_ULEB (data, end);
4353 		  SKIP_ULEB (data, end);
4354 		}
4355 
4356 	      READ_ULEB (n_directories, data, end);
4357 	      if (data == end)
4358 		{
4359 		  warn (_("Corrupt directories list\n"));
4360 		  break;
4361 		}
4362 
4363 	      directory_table = (unsigned char **)
4364 		xmalloc (n_directories * sizeof (unsigned char *));
4365 
4366 	      for (entryi = 0; entryi < n_directories; entryi++)
4367 		{
4368 		  unsigned char **pathp = &directory_table[entryi];
4369 
4370 		  format = format_start;
4371 		  for (formati = 0; formati < format_count; formati++)
4372 		    {
4373 		      dwarf_vma content_type, form;
4374 		      dwarf_vma uvalue;
4375 
4376 		      READ_ULEB (content_type, format, end);
4377 		      READ_ULEB (form, format, end);
4378 		      if (data == end)
4379 			{
4380 			  warn (_("Corrupt directories list\n"));
4381 			  break;
4382 			}
4383 		      switch (content_type)
4384 			{
4385 			case DW_LNCT_path:
4386 			  switch (form)
4387 			    {
4388 			    case DW_FORM_string:
4389 			      *pathp = data;
4390 			      break;
4391 			    case DW_FORM_line_strp:
4392 			      SAFE_BYTE_GET (uvalue, data, linfo.li_offset_size,
4393 					     end);
4394 			      /* Remove const by the cast.  */
4395 			      *pathp = (unsigned char *)
4396 				       fetch_indirect_line_string (uvalue);
4397 			      break;
4398 			    }
4399 			  break;
4400 			}
4401 		      data = read_and_display_attr_value (0, form, 0, start,
4402 							  data, end, 0, 0,
4403 							  linfo.li_offset_size,
4404 							  linfo.li_version,
4405 							  NULL, 1, section,
4406 							  NULL, '\t', -1);
4407 		    }
4408 		  if (data == end)
4409 		    {
4410 		      warn (_("Corrupt directories list\n"));
4411 		      break;
4412 		    }
4413 		}
4414 
4415 	      /* Skip files format.  */
4416 	      SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
4417 	      format_start = data;
4418 	      for (formati = 0; formati < format_count; formati++)
4419 		{
4420 		  SKIP_ULEB (data, end);
4421 		  SKIP_ULEB (data, end);
4422 		}
4423 
4424 	      READ_ULEB (n_files, data, end);
4425 	      if (data == end)
4426 		{
4427 		  warn (_("Corrupt file name list\n"));
4428 		  break;
4429 		}
4430 
4431 	      file_table = (File_Entry *) xcalloc (1, n_files
4432 						      * sizeof (File_Entry));
4433 
4434 	      for (entryi = 0; entryi < n_files; entryi++)
4435 		{
4436 		  File_Entry *file = &file_table[entryi];
4437 
4438 		  format = format_start;
4439 		  for (formati = 0; formati < format_count; formati++)
4440 		    {
4441 		      dwarf_vma content_type, form;
4442 		      dwarf_vma uvalue;
4443 		      unsigned char *tmp;
4444 
4445 		      READ_ULEB (content_type, format, end);
4446 		      READ_ULEB (form, format, end);
4447 		      if (data == end)
4448 			{
4449 			  warn (_("Corrupt file name list\n"));
4450 			  break;
4451 			}
4452 		      switch (content_type)
4453 			{
4454 			case DW_LNCT_path:
4455 			  switch (form)
4456 			    {
4457 			    case DW_FORM_string:
4458 			      file->name = data;
4459 			      break;
4460 			    case DW_FORM_line_strp:
4461 			      SAFE_BYTE_GET (uvalue, data, linfo.li_offset_size,
4462 					     end);
4463 			      /* Remove const by the cast.  */
4464 			      file->name = (unsigned char *)
4465 					   fetch_indirect_line_string (uvalue);
4466 			      break;
4467 			    }
4468 			  break;
4469 			case DW_LNCT_directory_index:
4470 			  switch (form)
4471 			    {
4472 			    case DW_FORM_data1:
4473 			      SAFE_BYTE_GET (file->directory_index, data, 1,
4474 					     end);
4475 			      break;
4476 			    case DW_FORM_data2:
4477 			      SAFE_BYTE_GET (file->directory_index, data, 2,
4478 					     end);
4479 			      break;
4480 			    case DW_FORM_udata:
4481 			      tmp = data;
4482 			      READ_ULEB (file->directory_index, tmp, end);
4483 			      break;
4484 			    }
4485 			  break;
4486 			}
4487 		      data = read_and_display_attr_value (0, form, 0, start,
4488 							  data, end, 0, 0,
4489 							  linfo.li_offset_size,
4490 							  linfo.li_version,
4491 							  NULL, 1, section,
4492 							  NULL, '\t', -1);
4493 		    }
4494 		  if (data == end)
4495 		    {
4496 		      warn (_("Corrupt file name list\n"));
4497 		      break;
4498 		    }
4499 		}
4500 	    }
4501 	  else
4502 	    {
4503 	      if (*data != 0)
4504 		{
4505 		  unsigned char *ptr_directory_table = data;
4506 
4507 		  while (data < end && *data != 0)
4508 		    {
4509 		      data += strnlen ((char *) data, end - data) + 1;
4510 		      n_directories++;
4511 		    }
4512 
4513 		  /* PR 20440 */
4514 		  if (data >= end)
4515 		    {
4516 		      warn (_("directory table ends unexpectedly\n"));
4517 		      n_directories = 0;
4518 		      break;
4519 		    }
4520 
4521 		  /* Go through the directory table again to save the directories.  */
4522 		  directory_table = (unsigned char **)
4523 		    xmalloc (n_directories * sizeof (unsigned char *));
4524 
4525 		  i = 0;
4526 		  while (*ptr_directory_table != 0)
4527 		    {
4528 		      directory_table[i] = ptr_directory_table;
4529 		      ptr_directory_table += strnlen ((char *) ptr_directory_table,
4530 						      ptr_directory_table - end) + 1;
4531 		      i++;
4532 		    }
4533 		}
4534 	      /* Skip the NUL at the end of the table.  */
4535 	      data++;
4536 
4537 	      /* Traverse the File Name table just to count the entries.  */
4538 	      if (data < end && *data != 0)
4539 		{
4540 		  unsigned char *ptr_file_name_table = data;
4541 
4542 		  while (data < end && *data != 0)
4543 		    {
4544 		      /* Skip Name, directory index, last modification
4545 			 time and length of file.  */
4546 		      data += strnlen ((char *) data, end - data) + 1;
4547 		      SKIP_ULEB (data, end);
4548 		      SKIP_ULEB (data, end);
4549 		      SKIP_ULEB (data, end);
4550 		      n_files++;
4551 		    }
4552 
4553 		  if (data >= end)
4554 		    {
4555 		      warn (_("file table ends unexpectedly\n"));
4556 		      n_files = 0;
4557 		      break;
4558 		    }
4559 
4560 		  /* Go through the file table again to save the strings.  */
4561 		  file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
4562 
4563 		  i = 0;
4564 		  while (*ptr_file_name_table != 0)
4565 		    {
4566 		      file_table[i].name = ptr_file_name_table;
4567 		      ptr_file_name_table += strnlen ((char *) ptr_file_name_table,
4568 						      end - ptr_file_name_table) + 1;
4569 
4570 		      /* We are not interested in directory, time or size.  */
4571 		      READ_ULEB (file_table[i].directory_index,
4572 				 ptr_file_name_table, end);
4573 		      READ_ULEB (file_table[i].modification_date,
4574 				 ptr_file_name_table, end);
4575 		      READ_ULEB (file_table[i].length,
4576 				 ptr_file_name_table, end);
4577 		      i++;
4578 		    }
4579 		  i = 0;
4580 		}
4581 
4582 	      /* Skip the NUL at the end of the table.  */
4583 	      data++;
4584 	    }
4585 
4586 	  /* Print the Compilation Unit's name and a header.  */
4587 	  if (file_table == NULL)
4588 	    ;
4589 	  else if (directory_table == NULL)
4590 	    printf (_("CU: %s:\n"), file_table[0].name);
4591 	  else
4592 	    {
4593 	      unsigned int ix = file_table[0].directory_index;
4594 	      const char *directory;
4595 
4596 	      if (ix == 0)
4597 		directory = ".";
4598 	      /* PR 20439 */
4599 	      else if (n_directories == 0)
4600 		directory = _("<unknown>");
4601 	      else if (ix > n_directories)
4602 		{
4603 		  warn (_("directory index %u > number of directories %s\n"),
4604 			ix, dwarf_vmatoa ("u", n_directories));
4605 		  directory = _("<corrupt>");
4606 		}
4607 	      else
4608 		directory = (char *) directory_table[ix - 1];
4609 
4610 	      if (do_wide || strlen (directory) < 76)
4611 		printf (_("CU: %s/%s:\n"), directory, file_table[0].name);
4612 	      else
4613 		printf ("%s:\n", file_table[0].name);
4614 	    }
4615 
4616 	  printf (_("File name                            Line number    Starting address    View    Stmt\n"));
4617 	  saved_linfo = linfo;
4618 	}
4619 
4620       /* This loop iterates through the Dwarf Line Number Program.  */
4621       while (data < end_of_sequence)
4622 	{
4623 	  unsigned char op_code;
4624 	  int xop;
4625 	  int adv;
4626 	  unsigned long int uladv;
4627 	  int is_special_opcode = 0;
4628 
4629 	  op_code = *data++;
4630 	  xop = op_code;
4631 
4632 	  if (op_code >= linfo.li_opcode_base)
4633 	    {
4634 	      op_code -= linfo.li_opcode_base;
4635 	      uladv = (op_code / linfo.li_line_range);
4636 	      if (linfo.li_max_ops_per_insn == 1)
4637 		{
4638 		  uladv *= linfo.li_min_insn_length;
4639 		  state_machine_regs.address += uladv;
4640 		  if (uladv)
4641 		    state_machine_regs.view = 0;
4642 		}
4643 	      else
4644 		{
4645 		  unsigned addrdelta
4646 		    = ((state_machine_regs.op_index + uladv)
4647 		       / linfo.li_max_ops_per_insn)
4648 		    * linfo.li_min_insn_length;
4649 		  state_machine_regs.address
4650 		    += addrdelta;
4651 		  state_machine_regs.op_index
4652 		    = (state_machine_regs.op_index + uladv)
4653 		    % linfo.li_max_ops_per_insn;
4654 		  if (addrdelta)
4655 		    state_machine_regs.view = 0;
4656 		}
4657 
4658 	      adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
4659 	      state_machine_regs.line += adv;
4660 	      is_special_opcode = 1;
4661 	      /* Increment view after printing this row.  */
4662 	    }
4663 	  else
4664 	    switch (op_code)
4665 	      {
4666 	      case DW_LNS_extended_op:
4667 		{
4668 		  unsigned int ext_op_code_len;
4669 		  unsigned char ext_op_code;
4670 		  unsigned char *op_code_end;
4671 		  unsigned char *op_code_data = data;
4672 
4673 		  READ_ULEB (ext_op_code_len, op_code_data, end_of_sequence);
4674 		  op_code_end = op_code_data + ext_op_code_len;
4675 		  if (ext_op_code_len == 0 || op_code_end > end_of_sequence)
4676 		    {
4677 		      warn (_("Badly formed extended line op encountered!\n"));
4678 		      break;
4679 		    }
4680 		  ext_op_code = *op_code_data++;
4681 		  xop = ext_op_code;
4682 		  xop = -xop;
4683 
4684 		  switch (ext_op_code)
4685 		    {
4686 		    case DW_LNE_end_sequence:
4687 		      /* Reset stuff after printing this row.  */
4688 		      break;
4689 		    case DW_LNE_set_address:
4690 		      SAFE_BYTE_GET_AND_INC (state_machine_regs.address,
4691 					     op_code_data,
4692 					     op_code_end - op_code_data,
4693 					     op_code_end);
4694 		      state_machine_regs.op_index = 0;
4695 		      state_machine_regs.view = 0;
4696 		      break;
4697 		    case DW_LNE_define_file:
4698 		      file_table = (File_Entry *) xrealloc
4699 			(file_table, (n_files + 1) * sizeof (File_Entry));
4700 
4701 		      ++state_machine_regs.last_file_entry;
4702 		      /* Source file name.  */
4703 		      file_table[n_files].name = op_code_data;
4704 		      op_code_data += strlen ((char *) op_code_data) + 1;
4705 		      /* Directory index.  */
4706 		      READ_ULEB (file_table[n_files].directory_index,
4707 				 op_code_data, op_code_end);
4708 		      /* Last modification time.  */
4709 		      READ_ULEB (file_table[n_files].modification_date,
4710 				 op_code_data, op_code_end);
4711 		      /* File length.  */
4712 		      READ_ULEB (file_table[n_files].length,
4713 				 op_code_data, op_code_end);
4714 		      n_files++;
4715 		      break;
4716 
4717 		    case DW_LNE_set_discriminator:
4718 		    case DW_LNE_HP_set_sequence:
4719 		      /* Simply ignored.  */
4720 		      break;
4721 
4722 		    default:
4723 		      printf (_("UNKNOWN (%u): length %ld\n"),
4724 			      ext_op_code, (long int) (op_code_data - data));
4725 		      break;
4726 		    }
4727 		  data = op_code_end;
4728 		  break;
4729 		}
4730 	      case DW_LNS_copy:
4731 		/* Increment view after printing this row.  */
4732 		break;
4733 
4734 	      case DW_LNS_advance_pc:
4735 		READ_ULEB (uladv, data, end);
4736 		if (linfo.li_max_ops_per_insn == 1)
4737 		  {
4738 		    uladv *= linfo.li_min_insn_length;
4739 		    state_machine_regs.address += uladv;
4740 		    if (uladv)
4741 		      state_machine_regs.view = 0;
4742 		  }
4743 		else
4744 		  {
4745 		    unsigned addrdelta
4746 		      = ((state_machine_regs.op_index + uladv)
4747 			 / linfo.li_max_ops_per_insn)
4748 		      * linfo.li_min_insn_length;
4749 		    state_machine_regs.address
4750 		      += addrdelta;
4751 		    state_machine_regs.op_index
4752 		      = (state_machine_regs.op_index + uladv)
4753 		      % linfo.li_max_ops_per_insn;
4754 		    if (addrdelta)
4755 		      state_machine_regs.view = 0;
4756 		  }
4757 		break;
4758 
4759 	      case DW_LNS_advance_line:
4760 		READ_SLEB (adv, data, end);
4761 		state_machine_regs.line += adv;
4762 		break;
4763 
4764 	      case DW_LNS_set_file:
4765 		READ_ULEB (uladv, data, end);
4766 		state_machine_regs.file = uladv;
4767 
4768 		{
4769 		  unsigned file = state_machine_regs.file - 1;
4770 		  unsigned dir;
4771 
4772 		  if (file_table == NULL || n_files == 0)
4773 		    printf (_("\n [Use file table entry %d]\n"), file);
4774 		  /* PR 20439 */
4775 		  else if (file >= n_files)
4776 		    {
4777 		      warn (_("file index %u > number of files %u\n"), file + 1, n_files);
4778 		      printf (_("\n <over large file table index %u>"), file);
4779 		    }
4780 		  else if ((dir = file_table[file].directory_index) == 0)
4781 		    /* If directory index is 0, that means current directory.  */
4782 		    printf ("\n./%s:[++]\n", file_table[file].name);
4783 		  else if (directory_table == NULL || n_directories == 0)
4784 		    printf (_("\n [Use file %s in directory table entry %d]\n"),
4785 			    file_table[file].name, dir);
4786 		  /* PR 20439 */
4787 		  else if (dir > n_directories)
4788 		    {
4789 		      warn (_("directory index %u > number of directories %s\n"),
4790 			    dir, dwarf_vmatoa ("u", n_directories));
4791 		      printf (_("\n <over large directory table entry %u>\n"), dir);
4792 		    }
4793 		  else
4794 		    printf ("\n%s/%s:\n",
4795 			    /* The directory index starts counting at 1.  */
4796 			    directory_table[dir - 1], file_table[file].name);
4797 		}
4798 		break;
4799 
4800 	      case DW_LNS_set_column:
4801 		READ_ULEB (uladv, data, end);
4802 		state_machine_regs.column = uladv;
4803 		break;
4804 
4805 	      case DW_LNS_negate_stmt:
4806 		adv = state_machine_regs.is_stmt;
4807 		adv = ! adv;
4808 		state_machine_regs.is_stmt = adv;
4809 		break;
4810 
4811 	      case DW_LNS_set_basic_block:
4812 		state_machine_regs.basic_block = 1;
4813 		break;
4814 
4815 	      case DW_LNS_const_add_pc:
4816 		uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
4817 		if (linfo.li_max_ops_per_insn == 1)
4818 		  {
4819 		    uladv *= linfo.li_min_insn_length;
4820 		    state_machine_regs.address += uladv;
4821 		    if (uladv)
4822 		      state_machine_regs.view = 0;
4823 		  }
4824 		else
4825 		  {
4826 		    unsigned addrdelta
4827 		      = ((state_machine_regs.op_index + uladv)
4828 			 / linfo.li_max_ops_per_insn)
4829 		      * linfo.li_min_insn_length;
4830 		    state_machine_regs.address
4831 		      += addrdelta;
4832 		    state_machine_regs.op_index
4833 		      = (state_machine_regs.op_index + uladv)
4834 		      % linfo.li_max_ops_per_insn;
4835 		    if (addrdelta)
4836 		      state_machine_regs.view = 0;
4837 		  }
4838 		break;
4839 
4840 	      case DW_LNS_fixed_advance_pc:
4841 		SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
4842 		state_machine_regs.address += uladv;
4843 		state_machine_regs.op_index = 0;
4844 		/* Do NOT reset view.  */
4845 		break;
4846 
4847 	      case DW_LNS_set_prologue_end:
4848 		break;
4849 
4850 	      case DW_LNS_set_epilogue_begin:
4851 		break;
4852 
4853 	      case DW_LNS_set_isa:
4854 		READ_ULEB (uladv, data, end);
4855 		printf (_("  Set ISA to %lu\n"), uladv);
4856 		break;
4857 
4858 	      default:
4859 		printf (_("  Unknown opcode %d with operands: "), op_code);
4860 
4861 		if (standard_opcodes != NULL)
4862 		  for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
4863 		    {
4864 		      dwarf_vma val;
4865 
4866 		      READ_ULEB (val, data, end);
4867 		      printf ("0x%s%s", dwarf_vmatoa ("x", val),
4868 			      i == 1 ? "" : ", ");
4869 		    }
4870 		putchar ('\n');
4871 		break;
4872 	      }
4873 
4874 	  /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
4875 	     to the DWARF address/line matrix.  */
4876 	  if ((is_special_opcode) || (xop == -DW_LNE_end_sequence)
4877 	      || (xop == DW_LNS_copy))
4878 	    {
4879 	      const unsigned int MAX_FILENAME_LENGTH = 35;
4880 	      char *fileName;
4881 	      char *newFileName = NULL;
4882 	      size_t fileNameLength;
4883 
4884 	      if (file_table)
4885 		{
4886 		  unsigned indx = state_machine_regs.file - 1;
4887 		  /* PR 20439  */
4888 		  if (indx >= n_files)
4889 		    {
4890 		      warn (_("corrupt file index %u encountered\n"), indx);
4891 		      fileName = _("<corrupt>");
4892 		    }
4893 		  else
4894 		    fileName = (char *) file_table[indx].name;
4895 		}
4896 	      else
4897 		fileName = _("<unknown>");
4898 
4899 	      fileNameLength = strlen (fileName);
4900 
4901 	      if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
4902 		{
4903 		  newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
4904 		  /* Truncate file name */
4905 		  strncpy (newFileName,
4906 			   fileName + fileNameLength - MAX_FILENAME_LENGTH,
4907 			   MAX_FILENAME_LENGTH + 1);
4908 		}
4909 	      else
4910 		{
4911 		  newFileName = (char *) xmalloc (fileNameLength + 1);
4912 		  strncpy (newFileName, fileName, fileNameLength + 1);
4913 		}
4914 
4915 	      if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
4916 		{
4917 		  if (linfo.li_max_ops_per_insn == 1)
4918 		    printf ("%-35s  %11d  %#18" DWARF_VMA_FMT "x",
4919 			    newFileName, state_machine_regs.line,
4920 			    state_machine_regs.address);
4921 		  else
4922 		    printf ("%-35s  %11d  %#18" DWARF_VMA_FMT "x[%d]",
4923 			    newFileName, state_machine_regs.line,
4924 			    state_machine_regs.address,
4925 			    state_machine_regs.op_index);
4926 		}
4927 	      else
4928 		{
4929 		  if (linfo.li_max_ops_per_insn == 1)
4930 		    printf ("%s  %11d  %#18" DWARF_VMA_FMT "x",
4931 			    newFileName, state_machine_regs.line,
4932 			    state_machine_regs.address);
4933 		  else
4934 		    printf ("%s  %11d  %#18" DWARF_VMA_FMT "x[%d]",
4935 			    newFileName, state_machine_regs.line,
4936 			    state_machine_regs.address,
4937 			    state_machine_regs.op_index);
4938 		}
4939 
4940 	      if (state_machine_regs.view)
4941 		printf ("  %6u", state_machine_regs.view);
4942 	      else
4943 		printf ("        ");
4944 
4945 	      if (state_machine_regs.is_stmt)
4946 		printf ("       x");
4947 
4948 	      putchar ('\n');
4949 	      state_machine_regs.view++;
4950 
4951 	      if (xop == -DW_LNE_end_sequence)
4952 		{
4953 		  reset_state_machine (linfo.li_default_is_stmt);
4954 		  putchar ('\n');
4955 		}
4956 
4957 	      free (newFileName);
4958 	    }
4959 	}
4960 
4961       if (file_table)
4962 	{
4963 	  free (file_table);
4964 	  file_table = NULL;
4965 	  n_files = 0;
4966 	}
4967 
4968       if (directory_table)
4969 	{
4970 	  free (directory_table);
4971 	  directory_table = NULL;
4972 	  n_directories = 0;
4973 	}
4974 
4975       putchar ('\n');
4976     }
4977 
4978   return 1;
4979 }
4980 
4981 static int
4982 display_debug_lines (struct dwarf_section *section, void *file)
4983 {
4984   unsigned char *data = section->start;
4985   unsigned char *end = data + section->size;
4986   int retValRaw = 1;
4987   int retValDecoded = 1;
4988 
4989   if (do_debug_lines == 0)
4990     do_debug_lines |= FLAG_DEBUG_LINES_RAW;
4991 
4992   if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
4993     retValRaw = display_debug_lines_raw (section, data, end, file);
4994 
4995   if (do_debug_lines & FLAG_DEBUG_LINES_DECODED)
4996     retValDecoded = display_debug_lines_decoded (section, data, data, end, file);
4997 
4998   if (!retValRaw || !retValDecoded)
4999     return 0;
5000 
5001   return 1;
5002 }
5003 
5004 static debug_info *
5005 find_debug_info_for_offset (unsigned long offset)
5006 {
5007   unsigned int i;
5008 
5009   if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
5010     return NULL;
5011 
5012   for (i = 0; i < num_debug_info_entries; i++)
5013     if (debug_information[i].cu_offset == offset)
5014       return debug_information + i;
5015 
5016   return NULL;
5017 }
5018 
5019 static const char *
5020 get_gdb_index_symbol_kind_name (gdb_index_symbol_kind kind)
5021 {
5022   /* See gdb/gdb-index.h.  */
5023   static const char * const kinds[] =
5024   {
5025     N_ ("no info"),
5026     N_ ("type"),
5027     N_ ("variable"),
5028     N_ ("function"),
5029     N_ ("other"),
5030     N_ ("unused5"),
5031     N_ ("unused6"),
5032     N_ ("unused7")
5033   };
5034 
5035   return _ (kinds[kind]);
5036 }
5037 
5038 static int
5039 display_debug_pubnames_worker (struct dwarf_section *section,
5040 			       void *file ATTRIBUTE_UNUSED,
5041 			       int is_gnu)
5042 {
5043   DWARF2_Internal_PubNames names;
5044   unsigned char *start = section->start;
5045   unsigned char *end = start + section->size;
5046 
5047   /* It does not matter if this load fails,
5048      we test for that later on.  */
5049   load_debug_info (file);
5050 
5051   introduce (section, FALSE);
5052 
5053   while (start < end)
5054     {
5055       unsigned char *data;
5056       unsigned long sec_off;
5057       unsigned int offset_size, initial_length_size;
5058 
5059       SAFE_BYTE_GET_AND_INC (names.pn_length, start, 4, end);
5060       if (names.pn_length == 0xffffffff)
5061 	{
5062 	  SAFE_BYTE_GET_AND_INC (names.pn_length, start, 8, end);
5063 	  offset_size = 8;
5064 	  initial_length_size = 12;
5065 	}
5066       else
5067 	{
5068 	  offset_size = 4;
5069 	  initial_length_size = 4;
5070 	}
5071 
5072       sec_off = start - section->start;
5073       if (sec_off + names.pn_length < sec_off
5074 	  || sec_off + names.pn_length > section->size)
5075 	{
5076 	  warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
5077 		section->name,
5078 		sec_off - initial_length_size,
5079 		dwarf_vmatoa ("x", names.pn_length));
5080 	  break;
5081 	}
5082 
5083       data = start;
5084       start += names.pn_length;
5085 
5086       SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end);
5087       SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end);
5088 
5089       if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
5090 	  && num_debug_info_entries > 0
5091 	  && find_debug_info_for_offset (names.pn_offset) == NULL)
5092 	warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
5093 	      (unsigned long) names.pn_offset, section->name);
5094 
5095       SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, end);
5096 
5097       printf (_("  Length:                              %ld\n"),
5098 	      (long) names.pn_length);
5099       printf (_("  Version:                             %d\n"),
5100 	      names.pn_version);
5101       printf (_("  Offset into .debug_info section:     0x%lx\n"),
5102 	      (unsigned long) names.pn_offset);
5103       printf (_("  Size of area in .debug_info section: %ld\n"),
5104 	      (long) names.pn_size);
5105 
5106       if (names.pn_version != 2 && names.pn_version != 3)
5107 	{
5108 	  static int warned = 0;
5109 
5110 	  if (! warned)
5111 	    {
5112 	      warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
5113 	      warned = 1;
5114 	    }
5115 
5116 	  continue;
5117 	}
5118 
5119       if (is_gnu)
5120 	printf (_("\n    Offset  Kind          Name\n"));
5121       else
5122 	printf (_("\n    Offset\tName\n"));
5123 
5124       while (1)
5125 	{
5126 	  bfd_size_type maxprint;
5127 	  dwarf_vma offset;
5128 
5129 	  SAFE_BYTE_GET (offset, data, offset_size, end);
5130 
5131 	  if (offset == 0)
5132 	    break;
5133 
5134 	  data += offset_size;
5135 	  if (data >= end)
5136 	    break;
5137 	  maxprint = (end - data) - 1;
5138 
5139 	  if (is_gnu)
5140 	    {
5141 	      unsigned int kind_data;
5142 	      gdb_index_symbol_kind kind;
5143 	      const char *kind_name;
5144 	      int is_static;
5145 
5146 	      SAFE_BYTE_GET (kind_data, data, 1, end);
5147 	      data++;
5148 	      maxprint --;
5149 	      /* GCC computes the kind as the upper byte in the CU index
5150 		 word, and then right shifts it by the CU index size.
5151 		 Left shift KIND to where the gdb-index.h accessor macros
5152 		 can use it.  */
5153 	      kind_data <<= GDB_INDEX_CU_BITSIZE;
5154 	      kind = GDB_INDEX_SYMBOL_KIND_VALUE (kind_data);
5155 	      kind_name = get_gdb_index_symbol_kind_name (kind);
5156 	      is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (kind_data);
5157 	      printf ("    %-6lx  %s,%-10s  %.*s\n",
5158 		      (unsigned long) offset, is_static ? _("s") : _("g"),
5159 		      kind_name, (int) maxprint, data);
5160 	    }
5161 	  else
5162 	    printf ("    %-6lx\t%.*s\n",
5163 		    (unsigned long) offset, (int) maxprint, data);
5164 
5165 	  data += strnlen ((char *) data, maxprint) + 1;
5166 	  if (data >= end)
5167 	    break;
5168 	}
5169     }
5170 
5171   printf ("\n");
5172   return 1;
5173 }
5174 
5175 static int
5176 display_debug_pubnames (struct dwarf_section *section, void *file)
5177 {
5178   return display_debug_pubnames_worker (section, file, 0);
5179 }
5180 
5181 static int
5182 display_debug_gnu_pubnames (struct dwarf_section *section, void *file)
5183 {
5184   return display_debug_pubnames_worker (section, file, 1);
5185 }
5186 
5187 static int
5188 display_debug_macinfo (struct dwarf_section *section,
5189 		       void *file ATTRIBUTE_UNUSED)
5190 {
5191   unsigned char *start = section->start;
5192   unsigned char *end = start + section->size;
5193   unsigned char *curr = start;
5194   enum dwarf_macinfo_record_type op;
5195 
5196   introduce (section, FALSE);
5197 
5198   while (curr < end)
5199     {
5200       unsigned int lineno;
5201       const unsigned char *string;
5202 
5203       op = (enum dwarf_macinfo_record_type) *curr;
5204       curr++;
5205 
5206       switch (op)
5207 	{
5208 	case DW_MACINFO_start_file:
5209 	  {
5210 	    unsigned int filenum;
5211 
5212 	    READ_ULEB (lineno, curr, end);
5213 	    READ_ULEB (filenum, curr, end);
5214 	    printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
5215 		    lineno, filenum);
5216 	  }
5217 	  break;
5218 
5219 	case DW_MACINFO_end_file:
5220 	  printf (_(" DW_MACINFO_end_file\n"));
5221 	  break;
5222 
5223 	case DW_MACINFO_define:
5224 	  READ_ULEB (lineno, curr, end);
5225 	  string = curr;
5226 	  curr += strnlen ((char *) string, end - string) + 1;
5227 	  printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
5228 		  lineno, string);
5229 	  break;
5230 
5231 	case DW_MACINFO_undef:
5232 	  READ_ULEB (lineno, curr, end);
5233 	  string = curr;
5234 	  curr += strnlen ((char *) string, end - string) + 1;
5235 	  printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
5236 		  lineno, string);
5237 	  break;
5238 
5239 	case DW_MACINFO_vendor_ext:
5240 	  {
5241 	    unsigned int constant;
5242 
5243 	    READ_ULEB (constant, curr, end);
5244 	    string = curr;
5245 	    curr += strnlen ((char *) string, end - string) + 1;
5246 	    printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
5247 		    constant, string);
5248 	  }
5249 	  break;
5250 	}
5251     }
5252 
5253   return 1;
5254 }
5255 
5256 /* Given LINE_OFFSET into the .debug_line section, attempt to return
5257    filename and dirname corresponding to file name table entry with index
5258    FILEIDX.  Return NULL on failure.  */
5259 
5260 static unsigned char *
5261 get_line_filename_and_dirname (dwarf_vma line_offset,
5262 			       dwarf_vma fileidx,
5263 			       unsigned char **dir_name)
5264 {
5265   struct dwarf_section *section = &debug_displays [line].section;
5266   unsigned char *hdrptr, *dirtable, *file_name;
5267   unsigned int offset_size, initial_length_size;
5268   unsigned int version, opcode_base;
5269   dwarf_vma length, diridx;
5270   const unsigned char * end;
5271 
5272   *dir_name = NULL;
5273   if (section->start == NULL
5274       || line_offset >= section->size
5275       || fileidx == 0)
5276     return NULL;
5277 
5278   hdrptr = section->start + line_offset;
5279   end = section->start + section->size;
5280 
5281   SAFE_BYTE_GET_AND_INC (length, hdrptr, 4, end);
5282   if (length == 0xffffffff)
5283     {
5284       /* This section is 64-bit DWARF 3.  */
5285       SAFE_BYTE_GET_AND_INC (length, hdrptr, 8, end);
5286       offset_size = 8;
5287       initial_length_size = 12;
5288     }
5289   else
5290     {
5291       offset_size = 4;
5292       initial_length_size = 4;
5293     }
5294   if (length + initial_length_size < length
5295       || length + initial_length_size > section->size)
5296     return NULL;
5297 
5298   SAFE_BYTE_GET_AND_INC (version, hdrptr, 2, end);
5299   if (version != 2 && version != 3 && version != 4)
5300     return NULL;
5301   hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length.  */
5302   if (version >= 4)
5303     hdrptr++;		    /* Skip max_ops_per_insn.  */
5304   hdrptr += 3;		    /* Skip default_is_stmt, line_base, line_range.  */
5305 
5306   SAFE_BYTE_GET_AND_INC (opcode_base, hdrptr, 1, end);
5307   if (opcode_base == 0)
5308     return NULL;
5309 
5310   hdrptr += opcode_base - 1;
5311   if (hdrptr >= end)
5312     return NULL;
5313 
5314   dirtable = hdrptr;
5315   /* Skip over dirname table.  */
5316   while (*hdrptr != '\0')
5317     {
5318       hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
5319       if (hdrptr >= end)
5320 	return NULL;
5321     }
5322   hdrptr++;		    /* Skip the NUL at the end of the table.  */
5323 
5324   /* Now skip over preceding filename table entries.  */
5325   for (; hdrptr < end && *hdrptr != '\0' && fileidx > 1; fileidx--)
5326     {
5327       hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
5328       SKIP_ULEB (hdrptr, end);
5329       SKIP_ULEB (hdrptr, end);
5330       SKIP_ULEB (hdrptr, end);
5331     }
5332   if (hdrptr >= end || *hdrptr == '\0')
5333     return NULL;
5334 
5335   file_name = hdrptr;
5336   hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
5337   if (hdrptr >= end)
5338     return NULL;
5339   READ_ULEB (diridx, hdrptr, end);
5340   if (diridx == 0)
5341     return file_name;
5342   for (; dirtable < end && *dirtable != '\0' && diridx > 1; diridx--)
5343     dirtable += strnlen ((char *) dirtable, end - dirtable) + 1;
5344   if (dirtable >= end || *dirtable == '\0')
5345     return NULL;
5346   *dir_name = dirtable;
5347   return file_name;
5348 }
5349 
5350 static int
5351 display_debug_macro (struct dwarf_section *section,
5352 		     void *file)
5353 {
5354   unsigned char *start = section->start;
5355   unsigned char *end = start + section->size;
5356   unsigned char *curr = start;
5357   unsigned char *extended_op_buf[256];
5358 
5359   load_debug_section_with_follow (str, file);
5360   load_debug_section_with_follow (line, file);
5361 
5362   introduce (section, FALSE);
5363 
5364   while (curr < end)
5365     {
5366       unsigned int lineno, version, flags;
5367       unsigned int offset_size = 4;
5368       const unsigned char *string;
5369       dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
5370       unsigned char **extended_ops = NULL;
5371 
5372       SAFE_BYTE_GET_AND_INC (version, curr, 2, end);
5373       if (version != 4 && version != 5)
5374 	{
5375 	  error (_("Only GNU extension to DWARF 4 or 5 of %s is currently supported.\n"),
5376 		 section->name);
5377 	  return 0;
5378 	}
5379 
5380       SAFE_BYTE_GET_AND_INC (flags, curr, 1, end);
5381       if (flags & 1)
5382 	offset_size = 8;
5383       printf (_("  Offset:                      0x%lx\n"),
5384 	      (unsigned long) sec_offset);
5385       printf (_("  Version:                     %d\n"), version);
5386       printf (_("  Offset size:                 %d\n"), offset_size);
5387       if (flags & 2)
5388 	{
5389 	  SAFE_BYTE_GET_AND_INC (line_offset, curr, offset_size, end);
5390 	  printf (_("  Offset into .debug_line:     0x%lx\n"),
5391 		  (unsigned long) line_offset);
5392 	}
5393       if (flags & 4)
5394 	{
5395 	  unsigned int i, count, op;
5396 	  dwarf_vma nargs, n;
5397 
5398 	  SAFE_BYTE_GET_AND_INC (count, curr, 1, end);
5399 
5400 	  memset (extended_op_buf, 0, sizeof (extended_op_buf));
5401 	  extended_ops = extended_op_buf;
5402 	  if (count)
5403 	    {
5404 	      printf (_("  Extension opcode arguments:\n"));
5405 	      for (i = 0; i < count; i++)
5406 		{
5407 		  SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
5408 		  extended_ops[op] = curr;
5409 		  READ_ULEB (nargs, curr, end);
5410 		  if (nargs == 0)
5411 		    printf (_("    DW_MACRO_%02x has no arguments\n"), op);
5412 		  else
5413 		    {
5414 		      printf (_("    DW_MACRO_%02x arguments: "), op);
5415 		      for (n = 0; n < nargs; n++)
5416 			{
5417 			  unsigned int form;
5418 
5419 			  SAFE_BYTE_GET_AND_INC (form, curr, 1, end);
5420 			  printf ("%s%s", get_FORM_name (form),
5421 				  n == nargs - 1 ? "\n" : ", ");
5422 			  switch (form)
5423 			    {
5424 			    case DW_FORM_data1:
5425 			    case DW_FORM_data2:
5426 			    case DW_FORM_data4:
5427 			    case DW_FORM_data8:
5428 			    case DW_FORM_sdata:
5429 			    case DW_FORM_udata:
5430 			    case DW_FORM_block:
5431 			    case DW_FORM_block1:
5432 			    case DW_FORM_block2:
5433 			    case DW_FORM_block4:
5434 			    case DW_FORM_flag:
5435 			    case DW_FORM_string:
5436 			    case DW_FORM_strp:
5437 			    case DW_FORM_sec_offset:
5438 			      break;
5439 			    default:
5440 			      error (_("Invalid extension opcode form %s\n"),
5441 				     get_FORM_name (form));
5442 			      return 0;
5443 			    }
5444 			}
5445 		    }
5446 		}
5447 	    }
5448 	}
5449       printf ("\n");
5450 
5451       while (1)
5452 	{
5453 	  unsigned int op;
5454 
5455 	  if (curr >= end)
5456 	    {
5457 	      error (_(".debug_macro section not zero terminated\n"));
5458 	      return 0;
5459 	    }
5460 
5461 	  SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
5462 	  if (op == 0)
5463 	    break;
5464 
5465 	  switch (op)
5466 	    {
5467 	    case DW_MACRO_start_file:
5468 	      {
5469 		unsigned int filenum;
5470 		unsigned char *file_name = NULL, *dir_name = NULL;
5471 
5472 		READ_ULEB (lineno, curr, end);
5473 		READ_ULEB (filenum, curr, end);
5474 
5475 		if ((flags & 2) == 0)
5476 		  error (_("DW_MACRO_start_file used, but no .debug_line offset provided.\n"));
5477 		else
5478 		  file_name
5479 		    = get_line_filename_and_dirname (line_offset, filenum,
5480 						     &dir_name);
5481 		if (file_name == NULL)
5482 		  printf (_(" DW_MACRO_start_file - lineno: %d filenum: %d\n"),
5483 			  lineno, filenum);
5484 		else
5485 		  printf (_(" DW_MACRO_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
5486 			  lineno, filenum,
5487 			  dir_name != NULL ? (const char *) dir_name : "",
5488 			  dir_name != NULL ? "/" : "", file_name);
5489 	      }
5490 	      break;
5491 
5492 	    case DW_MACRO_end_file:
5493 	      printf (_(" DW_MACRO_end_file\n"));
5494 	      break;
5495 
5496 	    case DW_MACRO_define:
5497 	      READ_ULEB (lineno, curr, end);
5498 	      string = curr;
5499 	      curr += strnlen ((char *) string, end - string) + 1;
5500 	      printf (_(" DW_MACRO_define - lineno : %d macro : %s\n"),
5501 		      lineno, string);
5502 	      break;
5503 
5504 	    case DW_MACRO_undef:
5505 	      READ_ULEB (lineno, curr, end);
5506 	      string = curr;
5507 	      curr += strnlen ((char *) string, end - string) + 1;
5508 	      printf (_(" DW_MACRO_undef - lineno : %d macro : %s\n"),
5509 		      lineno, string);
5510 	      break;
5511 
5512 	    case DW_MACRO_define_strp:
5513 	      READ_ULEB (lineno, curr, end);
5514 	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
5515 	      string = fetch_indirect_string (offset);
5516 	      printf (_(" DW_MACRO_define_strp - lineno : %d macro : %s\n"),
5517 		      lineno, string);
5518 	      break;
5519 
5520 	    case DW_MACRO_undef_strp:
5521 	      READ_ULEB (lineno, curr, end);
5522 	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
5523 	      string = fetch_indirect_string (offset);
5524 	      printf (_(" DW_MACRO_undef_strp - lineno : %d macro : %s\n"),
5525 		      lineno, string);
5526 	      break;
5527 
5528 	    case DW_MACRO_import:
5529 	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
5530 	      printf (_(" DW_MACRO_import - offset : 0x%lx\n"),
5531 		      (unsigned long) offset);
5532 	      break;
5533 
5534 	    case DW_MACRO_define_sup:
5535 	      READ_ULEB (lineno, curr, end);
5536 	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
5537 	      printf (_(" DW_MACRO_define_sup - lineno : %d macro offset : 0x%lx\n"),
5538 		      lineno, (unsigned long) offset);
5539 	      break;
5540 
5541 	    case DW_MACRO_undef_sup:
5542 	      READ_ULEB (lineno, curr, end);
5543 	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
5544 	      printf (_(" DW_MACRO_undef_sup - lineno : %d macro offset : 0x%lx\n"),
5545 		      lineno, (unsigned long) offset);
5546 	      break;
5547 
5548 	    case DW_MACRO_import_sup:
5549 	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
5550 	      printf (_(" DW_MACRO_import_sup - offset : 0x%lx\n"),
5551 		      (unsigned long) offset);
5552 	      break;
5553 
5554 	    default:
5555 	      if (extended_ops == NULL || extended_ops[op] == NULL)
5556 		{
5557 		  error (_(" Unknown macro opcode %02x seen\n"), op);
5558 		  return 0;
5559 		}
5560 	      else
5561 		{
5562 		  /* Skip over unhandled opcodes.  */
5563 		  dwarf_vma nargs, n;
5564 		  unsigned char *desc = extended_ops[op];
5565 		  READ_ULEB (nargs, desc, end);
5566 		  if (nargs == 0)
5567 		    {
5568 		      printf (_(" DW_MACRO_%02x\n"), op);
5569 		      break;
5570 		    }
5571 		  printf (_(" DW_MACRO_%02x -"), op);
5572 		  for (n = 0; n < nargs; n++)
5573 		    {
5574 		      int val;
5575 
5576 		      /* DW_FORM_implicit_const is not expected here.  */
5577 		      SAFE_BYTE_GET_AND_INC (val, desc, 1, end);
5578 		      curr
5579 			= read_and_display_attr_value (0, val, 0,
5580 						       start, curr, end, 0, 0, offset_size,
5581 						       version, NULL, 0, NULL,
5582 						       NULL, ' ', -1);
5583 		      if (n != nargs - 1)
5584 			printf (",");
5585 		    }
5586 		  printf ("\n");
5587 		}
5588 	      break;
5589 	    }
5590 	}
5591 
5592       printf ("\n");
5593     }
5594 
5595   return 1;
5596 }
5597 
5598 static int
5599 display_debug_abbrev (struct dwarf_section *section,
5600 		      void *file ATTRIBUTE_UNUSED)
5601 {
5602   abbrev_entry *entry;
5603   unsigned char *start = section->start;
5604   unsigned char *end = start + section->size;
5605 
5606   introduce (section, FALSE);
5607 
5608   do
5609     {
5610       unsigned char *last;
5611 
5612       free_abbrevs ();
5613 
5614       last = start;
5615       start = process_abbrev_section (start, end);
5616 
5617       if (first_abbrev == NULL)
5618 	continue;
5619 
5620       printf (_("  Number TAG (0x%lx)\n"), (long) (last - section->start));
5621 
5622       for (entry = first_abbrev; entry; entry = entry->next)
5623 	{
5624 	  abbrev_attr *attr;
5625 
5626 	  printf ("   %ld      %s    [%s]\n",
5627 		  entry->entry,
5628 		  get_TAG_name (entry->tag),
5629 		  entry->children ? _("has children") : _("no children"));
5630 
5631 	  for (attr = entry->first_attr; attr; attr = attr->next)
5632 	    {
5633 	      printf ("    %-18s %s",
5634 		      get_AT_name (attr->attribute),
5635 		      get_FORM_name (attr->form));
5636 	      if (attr->form == DW_FORM_implicit_const)
5637 		printf (": %" BFD_VMA_FMT "d", attr->implicit_const);
5638 	      putchar ('\n');
5639 	    }
5640 	}
5641     }
5642   while (start);
5643 
5644   printf ("\n");
5645 
5646   return 1;
5647 }
5648 
5649 /* Return true when ADDR is the maximum address, when addresses are
5650    POINTER_SIZE bytes long.  */
5651 
5652 static bfd_boolean
5653 is_max_address (dwarf_vma addr, unsigned int pointer_size)
5654 {
5655   dwarf_vma mask = ~(~(dwarf_vma) 1 << (pointer_size * 8 - 1));
5656   return ((addr & mask) == mask);
5657 }
5658 
5659 /* Display a view pair list starting at *VSTART_PTR and ending at
5660    VLISTEND within SECTION.  */
5661 
5662 static void
5663 display_view_pair_list (struct dwarf_section *section,
5664 			unsigned char **vstart_ptr,
5665 			unsigned int debug_info_entry,
5666 			unsigned char *vlistend)
5667 {
5668   unsigned char *vstart = *vstart_ptr;
5669   unsigned char *section_end = section->start + section->size;
5670   unsigned int pointer_size = debug_information [debug_info_entry].pointer_size;
5671 
5672   if (vlistend < section_end)
5673     section_end = vlistend;
5674 
5675   putchar ('\n');
5676 
5677   while (vstart < section_end)
5678     {
5679       dwarf_vma off = vstart - section->start;
5680       dwarf_vma vbegin, vend;
5681 
5682       READ_ULEB (vbegin, vstart, section_end);
5683       if (vstart == section_end)
5684 	break;
5685 
5686       READ_ULEB (vend, vstart, section_end);
5687       printf ("    %8.8lx ", (unsigned long) off);
5688 
5689       print_dwarf_view (vbegin, pointer_size, 1);
5690       print_dwarf_view (vend, pointer_size, 1);
5691       printf (_("location view pair\n"));
5692     }
5693 
5694   putchar ('\n');
5695   *vstart_ptr = vstart;
5696 }
5697 
5698 /* Display a location list from a normal (ie, non-dwo) .debug_loc section.  */
5699 
5700 static void
5701 display_loc_list (struct dwarf_section *section,
5702 		  unsigned char **start_ptr,
5703 		  unsigned int debug_info_entry,
5704 		  dwarf_vma offset,
5705 		  dwarf_vma base_address,
5706 		  unsigned char **vstart_ptr,
5707 		  int has_frame_base)
5708 {
5709   unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
5710   unsigned char *section_end = section->start + section->size;
5711   unsigned long cu_offset;
5712   unsigned int pointer_size;
5713   unsigned int offset_size;
5714   int dwarf_version;
5715 
5716   dwarf_vma begin;
5717   dwarf_vma end;
5718   unsigned short length;
5719   int need_frame_base;
5720 
5721   if (debug_info_entry >= num_debug_info_entries)
5722     {
5723       warn (_("No debug information available for loc lists of entry: %u\n"),
5724 	    debug_info_entry);
5725       return;
5726     }
5727 
5728   cu_offset = debug_information [debug_info_entry].cu_offset;
5729   pointer_size = debug_information [debug_info_entry].pointer_size;
5730   offset_size = debug_information [debug_info_entry].offset_size;
5731   dwarf_version = debug_information [debug_info_entry].dwarf_version;
5732 
5733   if (pointer_size < 2 || pointer_size > 8)
5734     {
5735       warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
5736 	    pointer_size, debug_info_entry);
5737       return;
5738     }
5739 
5740   while (1)
5741     {
5742       dwarf_vma off = offset + (start - *start_ptr);
5743       dwarf_vma vbegin = vm1, vend = vm1;
5744 
5745       if (start + 2 * pointer_size > section_end)
5746 	{
5747 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5748 		(unsigned long) offset);
5749 	  break;
5750 	}
5751 
5752       printf ("    %8.8lx ", (unsigned long) off);
5753 
5754       SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
5755       SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
5756 
5757       if (begin == 0 && end == 0)
5758 	{
5759 	  /* PR 18374: In a object file we can have a location list that
5760 	     starts with a begin and end of 0 because there are relocations
5761 	     that need to be applied to the addresses.  Actually applying
5762 	     the relocations now does not help as they will probably resolve
5763 	     to 0, since the object file has not been fully linked.  Real
5764 	     end of list markers will not have any relocations against them.  */
5765 	  if (! reloc_at (section, off)
5766 	      && ! reloc_at (section, off + pointer_size))
5767 	    {
5768 	      printf (_("<End of list>\n"));
5769 	      break;
5770 	    }
5771 	}
5772 
5773       /* Check base address specifiers.  */
5774       if (is_max_address (begin, pointer_size)
5775           && !is_max_address (end, pointer_size))
5776 	{
5777 	  base_address = end;
5778 	  print_dwarf_vma (begin, pointer_size);
5779 	  print_dwarf_vma (end, pointer_size);
5780 	  printf (_("(base address)\n"));
5781 	  continue;
5782 	}
5783 
5784       if (vstart)
5785 	{
5786 	  off = offset + (vstart - *start_ptr);
5787 
5788 	  READ_ULEB (vbegin, vstart, section_end);
5789 	  print_dwarf_view (vbegin, pointer_size, 1);
5790 
5791 	  READ_ULEB (vend, vstart, section_end);
5792 	  print_dwarf_view (vend, pointer_size, 1);
5793 
5794 	  printf (_("views at %8.8lx for:\n    %*s "),
5795 		  (unsigned long) off, 8, "");
5796 	}
5797 
5798       if (start + 2 > section_end)
5799 	{
5800 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5801 		(unsigned long) offset);
5802 	  break;
5803 	}
5804 
5805       SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
5806 
5807       if (start + length > section_end)
5808 	{
5809 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5810 		(unsigned long) offset);
5811 	  break;
5812 	}
5813 
5814       print_dwarf_vma (begin + base_address, pointer_size);
5815       print_dwarf_vma (end + base_address, pointer_size);
5816 
5817       putchar ('(');
5818       need_frame_base = decode_location_expression (start,
5819 						    pointer_size,
5820 						    offset_size,
5821 						    dwarf_version,
5822 						    length,
5823 						    cu_offset, section);
5824       putchar (')');
5825 
5826       if (need_frame_base && !has_frame_base)
5827 	printf (_(" [without DW_AT_frame_base]"));
5828 
5829       if (begin == end && vbegin == vend)
5830 	fputs (_(" (start == end)"), stdout);
5831       else if (begin > end || (begin == end && vbegin > vend))
5832 	fputs (_(" (start > end)"), stdout);
5833 
5834       putchar ('\n');
5835 
5836       start += length;
5837     }
5838 
5839   *start_ptr = start;
5840   *vstart_ptr = vstart;
5841 }
5842 
5843 /* Display a location list from a normal (ie, non-dwo) .debug_loclists section.  */
5844 
5845 static void
5846 display_loclists_list (struct dwarf_section *section,
5847 		       unsigned char **start_ptr,
5848 		       unsigned int debug_info_entry,
5849 		       dwarf_vma offset,
5850 		       dwarf_vma base_address,
5851 		       unsigned char **vstart_ptr,
5852 		       int has_frame_base)
5853 {
5854   unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
5855   unsigned char *section_end = section->start + section->size;
5856   unsigned long cu_offset;
5857   unsigned int pointer_size;
5858   unsigned int offset_size;
5859   int dwarf_version;
5860 
5861   /* Initialize it due to a false compiler warning.  */
5862   dwarf_vma begin = -1, vbegin = -1;
5863   dwarf_vma end = -1, vend = -1;
5864   dwarf_vma length;
5865   int need_frame_base;
5866 
5867   if (debug_info_entry >= num_debug_info_entries)
5868     {
5869       warn (_("No debug information available for "
5870 	      "loclists lists of entry: %u\n"),
5871 	    debug_info_entry);
5872       return;
5873     }
5874 
5875   cu_offset = debug_information [debug_info_entry].cu_offset;
5876   pointer_size = debug_information [debug_info_entry].pointer_size;
5877   offset_size = debug_information [debug_info_entry].offset_size;
5878   dwarf_version = debug_information [debug_info_entry].dwarf_version;
5879 
5880   if (pointer_size < 2 || pointer_size > 8)
5881     {
5882       warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
5883 	    pointer_size, debug_info_entry);
5884       return;
5885     }
5886 
5887   while (1)
5888     {
5889       dwarf_vma off = offset + (start - *start_ptr);
5890       enum dwarf_location_list_entry_type llet;
5891 
5892       if (start + 1 > section_end)
5893 	{
5894 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5895 		(unsigned long) offset);
5896 	  break;
5897 	}
5898 
5899       printf ("    %8.8lx ", (unsigned long) off);
5900 
5901       SAFE_BYTE_GET_AND_INC (llet, start, 1, section_end);
5902 
5903       if (vstart && llet == DW_LLE_offset_pair)
5904 	{
5905 	  off = offset + (vstart - *start_ptr);
5906 
5907 	  READ_ULEB (vbegin, vstart, section_end);
5908 	  print_dwarf_view (vbegin, pointer_size, 1);
5909 
5910 	  READ_ULEB (vend, vstart, section_end);
5911 	  print_dwarf_view (vend, pointer_size, 1);
5912 
5913 	  printf (_("views at %8.8lx for:\n    %*s "),
5914 		  (unsigned long) off, 8, "");
5915 	}
5916 
5917       switch (llet)
5918 	{
5919 	case DW_LLE_end_of_list:
5920 	  printf (_("<End of list>\n"));
5921 	  break;
5922 	case DW_LLE_offset_pair:
5923 	  READ_ULEB (begin, start, section_end);
5924 	  READ_ULEB (end, start, section_end);
5925 	  break;
5926 	case DW_LLE_base_address:
5927 	  SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size,
5928 				 section_end);
5929 	  print_dwarf_vma (base_address, pointer_size);
5930 	  printf (_("(base address)\n"));
5931 	  break;
5932 #ifdef DW_LLE_view_pair
5933 	case DW_LLE_view_pair:
5934 	  if (vstart)
5935 	    printf (_("View pair entry in loclist with locviews attribute\n"));
5936 	  READ_ULEB (vbegin, start, section_end);
5937 	  print_dwarf_view (vbegin, pointer_size, 1);
5938 
5939 	  READ_ULEB (vend, start, section_end);
5940 	  print_dwarf_view (vend, pointer_size, 1);
5941 
5942 	  printf (_("views for:\n"));
5943 	  continue;
5944 #endif
5945 	default:
5946 	  error (_("Invalid location list entry type %d\n"), llet);
5947 	  return;
5948 	}
5949       if (llet == DW_LLE_end_of_list)
5950 	break;
5951       if (llet != DW_LLE_offset_pair)
5952 	continue;
5953 
5954       if (start + 2 > section_end)
5955 	{
5956 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5957 		(unsigned long) offset);
5958 	  break;
5959 	}
5960 
5961       READ_ULEB (length, start, section_end);
5962 
5963       print_dwarf_vma (begin + base_address, pointer_size);
5964       print_dwarf_vma (end + base_address, pointer_size);
5965 
5966       putchar ('(');
5967       need_frame_base = decode_location_expression (start,
5968 						    pointer_size,
5969 						    offset_size,
5970 						    dwarf_version,
5971 						    length,
5972 						    cu_offset, section);
5973       putchar (')');
5974 
5975       if (need_frame_base && !has_frame_base)
5976 	printf (_(" [without DW_AT_frame_base]"));
5977 
5978       if (begin == end && vbegin == vend)
5979 	fputs (_(" (start == end)"), stdout);
5980       else if (begin > end || (begin == end && vbegin > vend))
5981 	fputs (_(" (start > end)"), stdout);
5982 
5983       putchar ('\n');
5984 
5985       start += length;
5986       vbegin = vend = -1;
5987     }
5988 
5989   if (vbegin != vm1 || vend != vm1)
5990     printf (_("Trailing view pair not used in a range"));
5991 
5992   *start_ptr = start;
5993   *vstart_ptr = vstart;
5994 }
5995 
5996 /* Print a .debug_addr table index in decimal, surrounded by square brackets,
5997    right-adjusted in a field of length LEN, and followed by a space.  */
5998 
5999 static void
6000 print_addr_index (unsigned int idx, unsigned int len)
6001 {
6002   static char buf[15];
6003   snprintf (buf, sizeof (buf), "[%d]", idx);
6004   printf ("%*s ", len, buf);
6005 }
6006 
6007 /* Display a location list from a .dwo section. It uses address indexes rather
6008    than embedded addresses.  This code closely follows display_loc_list, but the
6009    two are sufficiently different that combining things is very ugly.  */
6010 
6011 static void
6012 display_loc_list_dwo (struct dwarf_section *section,
6013 		      unsigned char **start_ptr,
6014 		      unsigned int debug_info_entry,
6015 		      dwarf_vma offset,
6016 		      unsigned char **vstart_ptr,
6017 		      int has_frame_base)
6018 {
6019   unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
6020   unsigned char *section_end = section->start + section->size;
6021   unsigned long cu_offset;
6022   unsigned int pointer_size;
6023   unsigned int offset_size;
6024   int dwarf_version;
6025   int entry_type;
6026   unsigned short length;
6027   int need_frame_base;
6028   unsigned int idx;
6029 
6030   if (debug_info_entry >= num_debug_info_entries)
6031     {
6032       warn (_("No debug information for loc lists of entry: %u\n"),
6033 	    debug_info_entry);
6034       return;
6035     }
6036 
6037   cu_offset = debug_information [debug_info_entry].cu_offset;
6038   pointer_size = debug_information [debug_info_entry].pointer_size;
6039   offset_size = debug_information [debug_info_entry].offset_size;
6040   dwarf_version = debug_information [debug_info_entry].dwarf_version;
6041 
6042   if (pointer_size < 2 || pointer_size > 8)
6043     {
6044       warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
6045 	    pointer_size, debug_info_entry);
6046       return;
6047     }
6048 
6049   while (1)
6050     {
6051       printf ("    %8.8lx ", (unsigned long) (offset + (start - *start_ptr)));
6052 
6053       if (start >= section_end)
6054 	{
6055 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6056 		(unsigned long) offset);
6057 	  break;
6058 	}
6059 
6060       SAFE_BYTE_GET_AND_INC (entry_type, start, 1, section_end);
6061 
6062       if (vstart)
6063 	switch (entry_type)
6064 	  {
6065 	  default:
6066 	    break;
6067 
6068 	  case 2:
6069 	  case 3:
6070 	  case 4:
6071 	    {
6072 	      dwarf_vma view;
6073 	      dwarf_vma off = offset + (vstart - *start_ptr);
6074 
6075 	      READ_ULEB (view, vstart, section_end);
6076 	      print_dwarf_view (view, 8, 1);
6077 
6078 	      READ_ULEB (view, vstart, section_end);
6079 	      print_dwarf_view (view, 8, 1);
6080 
6081 	      printf (_("views at %8.8lx for:\n    %*s "),
6082 		      (unsigned long) off, 8, "");
6083 
6084 	    }
6085 	    break;
6086 	  }
6087 
6088       switch (entry_type)
6089 	{
6090 	case 0: /* A terminating entry.  */
6091 	  *start_ptr = start;
6092 	  *vstart_ptr = vstart;
6093 	  printf (_("<End of list>\n"));
6094 	  return;
6095 	case 1: /* A base-address entry.  */
6096 	  READ_ULEB (idx, start, section_end);
6097 	  print_addr_index (idx, 8);
6098 	  printf ("%*s", 9 + (vstart ? 2 * 6 : 0), "");
6099 	  printf (_("(base address selection entry)\n"));
6100 	  continue;
6101 	case 2: /* A start/end entry.  */
6102 	  READ_ULEB (idx, start, section_end);
6103 	  print_addr_index (idx, 8);
6104 	  READ_ULEB (idx, start, section_end);
6105 	  print_addr_index (idx, 8);
6106 	  break;
6107 	case 3: /* A start/length entry.  */
6108 	  READ_ULEB (idx, start, section_end);
6109 	  print_addr_index (idx, 8);
6110 	  SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
6111 	  printf ("%08x ", idx);
6112 	  break;
6113 	case 4: /* An offset pair entry.  */
6114 	  SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
6115 	  printf ("%08x ", idx);
6116 	  SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
6117 	  printf ("%08x ", idx);
6118 	  break;
6119 	default:
6120 	  warn (_("Unknown location list entry type 0x%x.\n"), entry_type);
6121 	  *start_ptr = start;
6122 	  *vstart_ptr = vstart;
6123 	  return;
6124 	}
6125 
6126       if (start + 2 > section_end)
6127 	{
6128 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6129 		(unsigned long) offset);
6130 	  break;
6131 	}
6132 
6133       SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
6134       if (start + length > section_end)
6135 	{
6136 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6137 		(unsigned long) offset);
6138 	  break;
6139 	}
6140 
6141       putchar ('(');
6142       need_frame_base = decode_location_expression (start,
6143 						    pointer_size,
6144 						    offset_size,
6145 						    dwarf_version,
6146 						    length,
6147 						    cu_offset, section);
6148       putchar (')');
6149 
6150       if (need_frame_base && !has_frame_base)
6151 	printf (_(" [without DW_AT_frame_base]"));
6152 
6153       putchar ('\n');
6154 
6155       start += length;
6156     }
6157 
6158   *start_ptr = start;
6159   *vstart_ptr = vstart;
6160 }
6161 
6162 /* Sort array of indexes in ascending order of loc_offsets[idx] and
6163    loc_views.  */
6164 
6165 static dwarf_vma *loc_offsets, *loc_views;
6166 
6167 static int
6168 loc_offsets_compar (const void *ap, const void *bp)
6169 {
6170   dwarf_vma a = loc_offsets[*(const unsigned int *) ap];
6171   dwarf_vma b = loc_offsets[*(const unsigned int *) bp];
6172 
6173   int ret = (a > b) - (b > a);
6174   if (ret)
6175     return ret;
6176 
6177   a = loc_views[*(const unsigned int *) ap];
6178   b = loc_views[*(const unsigned int *) bp];
6179 
6180   ret = (a > b) - (b > a);
6181 
6182   return ret;
6183 }
6184 
6185 static int
6186 display_debug_loc (struct dwarf_section *section, void *file)
6187 {
6188   unsigned char *start = section->start, *vstart = NULL;
6189   unsigned long bytes;
6190   unsigned char *section_begin = start;
6191   unsigned int num_loc_list = 0;
6192   unsigned long last_offset = 0;
6193   unsigned long last_view = 0;
6194   unsigned int first = 0;
6195   unsigned int i;
6196   unsigned int j;
6197   int seen_first_offset = 0;
6198   int locs_sorted = 1;
6199   unsigned char *next = start, *vnext = vstart;
6200   unsigned int *array = NULL;
6201   const char *suffix = strrchr (section->name, '.');
6202   bfd_boolean is_dwo = FALSE;
6203   int is_loclists = strstr (section->name, "debug_loclists") != NULL;
6204   dwarf_vma expected_start = 0;
6205 
6206   if (suffix && strcmp (suffix, ".dwo") == 0)
6207     is_dwo = TRUE;
6208 
6209   bytes = section->size;
6210 
6211   if (bytes == 0)
6212     {
6213       printf (_("\nThe %s section is empty.\n"), section->name);
6214       return 0;
6215     }
6216 
6217   if (is_loclists)
6218     {
6219       unsigned char *hdrptr = section_begin;
6220       dwarf_vma ll_length;
6221       unsigned short ll_version;
6222       unsigned char *end = section_begin + section->size;
6223       unsigned char address_size, segment_selector_size;
6224       uint32_t offset_entry_count;
6225 
6226       SAFE_BYTE_GET_AND_INC (ll_length, hdrptr, 4, end);
6227       if (ll_length == 0xffffffff)
6228 	SAFE_BYTE_GET_AND_INC (ll_length, hdrptr, 8, end);
6229 
6230       SAFE_BYTE_GET_AND_INC (ll_version, hdrptr, 2, end);
6231       if (ll_version != 5)
6232 	{
6233 	  warn (_("The %s section contains corrupt or "
6234 		  "unsupported version number: %d.\n"),
6235 		section->name, ll_version);
6236 	  return 0;
6237 	}
6238 
6239       SAFE_BYTE_GET_AND_INC (address_size, hdrptr, 1, end);
6240 
6241       SAFE_BYTE_GET_AND_INC (segment_selector_size, hdrptr, 1, end);
6242       if (segment_selector_size != 0)
6243 	{
6244 	  warn (_("The %s section contains "
6245 		  "unsupported segment selector size: %d.\n"),
6246 		section->name, segment_selector_size);
6247 	  return 0;
6248 	}
6249 
6250       SAFE_BYTE_GET_AND_INC (offset_entry_count, hdrptr, 4, end);
6251       if (offset_entry_count != 0)
6252 	{
6253 	  warn (_("The %s section contains "
6254 		  "unsupported offset entry count: %d.\n"),
6255 		section->name, offset_entry_count);
6256 	  return 0;
6257 	}
6258 
6259       expected_start = hdrptr - section_begin;
6260     }
6261 
6262   if (load_debug_info (file) == 0)
6263     {
6264       warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
6265 	    section->name);
6266       return 0;
6267     }
6268 
6269   /* Check the order of location list in .debug_info section. If
6270      offsets of location lists are in the ascending order, we can
6271      use `debug_information' directly.  */
6272   for (i = 0; i < num_debug_info_entries; i++)
6273     {
6274       unsigned int num;
6275 
6276       num = debug_information [i].num_loc_offsets;
6277       if (num > num_loc_list)
6278 	num_loc_list = num;
6279 
6280       /* Check if we can use `debug_information' directly.  */
6281       if (locs_sorted && num != 0)
6282 	{
6283 	  if (!seen_first_offset)
6284 	    {
6285 	      /* This is the first location list.  */
6286 	      last_offset = debug_information [i].loc_offsets [0];
6287 	      last_view = debug_information [i].loc_views [0];
6288 	      first = i;
6289 	      seen_first_offset = 1;
6290 	      j = 1;
6291 	    }
6292 	  else
6293 	    j = 0;
6294 
6295 	  for (; j < num; j++)
6296 	    {
6297 	      if (last_offset >
6298 		  debug_information [i].loc_offsets [j]
6299 		  || (last_offset == debug_information [i].loc_offsets [j]
6300 		      && last_view > debug_information [i].loc_views [j]))
6301 		{
6302 		  locs_sorted = 0;
6303 		  break;
6304 		}
6305 	      last_offset = debug_information [i].loc_offsets [j];
6306 	      last_view = debug_information [i].loc_views [j];
6307 	    }
6308 	}
6309     }
6310 
6311   if (!seen_first_offset)
6312     error (_("No location lists in .debug_info section!\n"));
6313 
6314   if (debug_information [first].num_loc_offsets > 0
6315       && debug_information [first].loc_offsets [0] != expected_start
6316       && debug_information [first].loc_views [0] != expected_start)
6317     warn (_("Location lists in %s section start at 0x%s\n"),
6318 	  section->name,
6319 	  dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]));
6320 
6321   if (!locs_sorted)
6322     array = (unsigned int *) xcmalloc (num_loc_list, sizeof (unsigned int));
6323 
6324   introduce (section, FALSE);
6325 
6326   if (reloc_at (section, 0))
6327     printf (_(" Warning: This section has relocations - addresses seen here may not be accurate.\n\n"));
6328 
6329   printf (_("    Offset   Begin            End              Expression\n"));
6330 
6331   seen_first_offset = 0;
6332   for (i = first; i < num_debug_info_entries; i++)
6333     {
6334       dwarf_vma offset, voffset;
6335       dwarf_vma base_address;
6336       unsigned int k;
6337       int has_frame_base;
6338 
6339       if (!locs_sorted)
6340 	{
6341 	  for (k = 0; k < debug_information [i].num_loc_offsets; k++)
6342 	    array[k] = k;
6343 	  loc_offsets = debug_information [i].loc_offsets;
6344 	  loc_views = debug_information [i].loc_views;
6345 	  qsort (array, debug_information [i].num_loc_offsets,
6346 		 sizeof (*array), loc_offsets_compar);
6347 	}
6348 
6349       int adjacent_view_loclists = 1;
6350       for (k = 0; k < debug_information [i].num_loc_offsets; k++)
6351 	{
6352 	  j = locs_sorted ? k : array[k];
6353 	  if (k
6354 	      && (debug_information [i].loc_offsets [locs_sorted
6355 						    ? k - 1 : array [k - 1]]
6356 		  == debug_information [i].loc_offsets [j])
6357 	      && (debug_information [i].loc_views [locs_sorted
6358 						   ? k - 1 : array [k - 1]]
6359 		  == debug_information [i].loc_views [j]))
6360 	    continue;
6361 	  has_frame_base = debug_information [i].have_frame_base [j];
6362 	  offset = debug_information [i].loc_offsets [j];
6363 	  next = section_begin + offset;
6364 	  voffset = debug_information [i].loc_views [j];
6365 	  if (voffset != vm1)
6366 	    vnext = section_begin + voffset;
6367 	  else
6368 	    vnext = NULL;
6369 	  base_address = debug_information [i].base_address;
6370 
6371 	  if (vnext && vnext < next)
6372 	    {
6373 	      vstart = vnext;
6374 	      display_view_pair_list (section, &vstart, i, next);
6375 	      if (start == vnext)
6376 		start = vstart;
6377 	    }
6378 
6379 	  if (!seen_first_offset || !adjacent_view_loclists)
6380 	    seen_first_offset = 1;
6381 	  else
6382 	    {
6383 	      if (start < next)
6384 		warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
6385 		      (unsigned long) (start - section_begin),
6386 		      (unsigned long) offset);
6387 	      else if (start > next)
6388 		warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
6389 		      (unsigned long) (start - section_begin),
6390 		      (unsigned long) offset);
6391 	    }
6392 	  start = next;
6393 	  vstart = vnext;
6394 
6395 	  if (offset >= bytes)
6396 	    {
6397 	      warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
6398 		    (unsigned long) offset);
6399 	      continue;
6400 	    }
6401 
6402 	  if (vnext && voffset >= bytes)
6403 	    {
6404 	      warn (_("View Offset 0x%lx is bigger than .debug_loc section size.\n"),
6405 		    (unsigned long) voffset);
6406 	      continue;
6407 	    }
6408 
6409 	  if (!is_loclists)
6410 	    {
6411 	      if (is_dwo)
6412 		display_loc_list_dwo (section, &start, i, offset,
6413 				      &vstart, has_frame_base);
6414 	      else
6415 		display_loc_list (section, &start, i, offset, base_address,
6416 				  &vstart, has_frame_base);
6417 	    }
6418 	  else
6419 	    {
6420 	      if (is_dwo)
6421 		warn (_("DWO is not yet supported.\n"));
6422 	      else
6423 		display_loclists_list (section, &start, i, offset, base_address,
6424 				       &vstart, has_frame_base);
6425 	    }
6426 
6427 	  /* FIXME: this arrangement is quite simplistic.  Nothing
6428 	     requires locview lists to be adjacent to corresponding
6429 	     loclists, and a single loclist could be augmented by
6430 	     different locview lists, and vice-versa, unlikely as it
6431 	     is that it would make sense to do so.  Hopefully we'll
6432 	     have view pair support built into loclists before we ever
6433 	     need to address all these possibilities.  */
6434 	  if (adjacent_view_loclists && vnext
6435 	      && vnext != start && vstart != next)
6436 	    {
6437 	      adjacent_view_loclists = 0;
6438 	      warn (_("Hole and overlap detection requires adjacent view lists and loclists.\n"));
6439 	    }
6440 
6441 	  if (vnext && vnext == start)
6442 	    display_view_pair_list (section, &start, i, vstart);
6443 	}
6444     }
6445 
6446   if (start < section->start + section->size)
6447     warn (ngettext ("There is %ld unused byte at the end of section %s\n",
6448 		    "There are %ld unused bytes at the end of section %s\n",
6449 		    (long) (section->start + section->size - start)),
6450 	  (long) (section->start + section->size - start), section->name);
6451   putchar ('\n');
6452   free (array);
6453   return 1;
6454 }
6455 
6456 static int
6457 display_debug_str (struct dwarf_section *section,
6458 		   void *file ATTRIBUTE_UNUSED)
6459 {
6460   unsigned char *start = section->start;
6461   unsigned long bytes = section->size;
6462   dwarf_vma addr = section->address;
6463 
6464   if (bytes == 0)
6465     {
6466       printf (_("\nThe %s section is empty.\n"), section->name);
6467       return 0;
6468     }
6469 
6470   introduce (section, FALSE);
6471 
6472   while (bytes)
6473     {
6474       int j;
6475       int k;
6476       int lbytes;
6477 
6478       lbytes = (bytes > 16 ? 16 : bytes);
6479 
6480       printf ("  0x%8.8lx ", (unsigned long) addr);
6481 
6482       for (j = 0; j < 16; j++)
6483 	{
6484 	  if (j < lbytes)
6485 	    printf ("%2.2x", start[j]);
6486 	  else
6487 	    printf ("  ");
6488 
6489 	  if ((j & 3) == 3)
6490 	    printf (" ");
6491 	}
6492 
6493       for (j = 0; j < lbytes; j++)
6494 	{
6495 	  k = start[j];
6496 	  if (k >= ' ' && k < 0x80)
6497 	    printf ("%c", k);
6498 	  else
6499 	    printf (".");
6500 	}
6501 
6502       putchar ('\n');
6503 
6504       start += lbytes;
6505       addr  += lbytes;
6506       bytes -= lbytes;
6507     }
6508 
6509   putchar ('\n');
6510 
6511   return 1;
6512 }
6513 
6514 static int
6515 display_debug_info (struct dwarf_section *section, void *file)
6516 {
6517   return process_debug_info (section, file, section->abbrev_sec, FALSE, FALSE);
6518 }
6519 
6520 static int
6521 display_debug_types (struct dwarf_section *section, void *file)
6522 {
6523   return process_debug_info (section, file, section->abbrev_sec, FALSE, TRUE);
6524 }
6525 
6526 static int
6527 display_trace_info (struct dwarf_section *section, void *file)
6528 {
6529   return process_debug_info (section, file, section->abbrev_sec, FALSE, TRUE);
6530 }
6531 
6532 static int
6533 display_debug_aranges (struct dwarf_section *section,
6534 		       void *file ATTRIBUTE_UNUSED)
6535 {
6536   unsigned char *start = section->start;
6537   unsigned char *end = start + section->size;
6538 
6539   introduce (section, FALSE);
6540 
6541   /* It does not matter if this load fails,
6542      we test for that later on.  */
6543   load_debug_info (file);
6544 
6545   while (start < end)
6546     {
6547       unsigned char *hdrptr;
6548       DWARF2_Internal_ARange arange;
6549       unsigned char *addr_ranges;
6550       dwarf_vma length;
6551       dwarf_vma address;
6552       unsigned long sec_off;
6553       unsigned char address_size;
6554       int excess;
6555       unsigned int offset_size;
6556       unsigned int initial_length_size;
6557 
6558       hdrptr = start;
6559 
6560       SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 4, end);
6561       if (arange.ar_length == 0xffffffff)
6562 	{
6563 	  SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 8, end);
6564 	  offset_size = 8;
6565 	  initial_length_size = 12;
6566 	}
6567       else
6568 	{
6569 	  offset_size = 4;
6570 	  initial_length_size = 4;
6571 	}
6572 
6573       sec_off = hdrptr - section->start;
6574       if (sec_off + arange.ar_length < sec_off
6575 	  || sec_off + arange.ar_length > section->size)
6576 	{
6577 	  warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
6578 		section->name,
6579 		sec_off - initial_length_size,
6580 		dwarf_vmatoa ("x", arange.ar_length));
6581 	  break;
6582 	}
6583 
6584       SAFE_BYTE_GET_AND_INC (arange.ar_version, hdrptr, 2, end);
6585       SAFE_BYTE_GET_AND_INC (arange.ar_info_offset, hdrptr, offset_size, end);
6586 
6587       if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
6588 	  && num_debug_info_entries > 0
6589 	  && find_debug_info_for_offset (arange.ar_info_offset) == NULL)
6590 	warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
6591 	      (unsigned long) arange.ar_info_offset, section->name);
6592 
6593       SAFE_BYTE_GET_AND_INC (arange.ar_pointer_size, hdrptr, 1, end);
6594       SAFE_BYTE_GET_AND_INC (arange.ar_segment_size, hdrptr, 1, end);
6595 
6596       if (arange.ar_version != 2 && arange.ar_version != 3)
6597 	{
6598 	  /* PR 19872: A version number of 0 probably means that there is
6599 	     padding at the end of the .debug_aranges section.  Gold puts
6600 	     it there when performing an incremental link, for example.
6601 	     So do not generate a warning in this case.  */
6602 	  if (arange.ar_version)
6603 	    warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
6604 	  break;
6605 	}
6606 
6607       printf (_("  Length:                   %ld\n"),
6608 	      (long) arange.ar_length);
6609       printf (_("  Version:                  %d\n"), arange.ar_version);
6610       printf (_("  Offset into .debug_info:  0x%lx\n"),
6611 	      (unsigned long) arange.ar_info_offset);
6612       printf (_("  Pointer Size:             %d\n"), arange.ar_pointer_size);
6613       printf (_("  Segment Size:             %d\n"), arange.ar_segment_size);
6614 
6615       address_size = arange.ar_pointer_size + arange.ar_segment_size;
6616 
6617       /* PR 17512: file: 001-108546-0.001:0.1.  */
6618       if (address_size == 0 || address_size > 8)
6619 	{
6620 	  error (_("Invalid address size in %s section!\n"),
6621 		 section->name);
6622 	  break;
6623 	}
6624 
6625       /* The DWARF spec does not require that the address size be a power
6626 	 of two, but we do.  This will have to change if we ever encounter
6627 	 an uneven architecture.  */
6628       if ((address_size & (address_size - 1)) != 0)
6629 	{
6630 	  warn (_("Pointer size + Segment size is not a power of two.\n"));
6631 	  break;
6632 	}
6633 
6634       if (address_size > 4)
6635 	printf (_("\n    Address            Length\n"));
6636       else
6637 	printf (_("\n    Address    Length\n"));
6638 
6639       addr_ranges = hdrptr;
6640 
6641       /* Must pad to an alignment boundary that is twice the address size.  */
6642       excess = (hdrptr - start) % (2 * address_size);
6643       if (excess)
6644 	addr_ranges += (2 * address_size) - excess;
6645 
6646       start += arange.ar_length + initial_length_size;
6647 
6648       while (addr_ranges + 2 * address_size <= start)
6649 	{
6650 	  SAFE_BYTE_GET_AND_INC (address, addr_ranges, address_size, end);
6651 	  SAFE_BYTE_GET_AND_INC (length, addr_ranges, address_size, end);
6652 
6653 	  printf ("    ");
6654 	  print_dwarf_vma (address, address_size);
6655 	  print_dwarf_vma (length, address_size);
6656 	  putchar ('\n');
6657 	}
6658     }
6659 
6660   printf ("\n");
6661 
6662   return 1;
6663 }
6664 
6665 /* Comparison function for qsort.  */
6666 static int
6667 comp_addr_base (const void * v0, const void * v1)
6668 {
6669   debug_info *info0 = *(debug_info **) v0;
6670   debug_info *info1 = *(debug_info **) v1;
6671   return info0->addr_base - info1->addr_base;
6672 }
6673 
6674 /* Display the debug_addr section.  */
6675 static int
6676 display_debug_addr (struct dwarf_section *section,
6677 		    void *file)
6678 {
6679   debug_info **debug_addr_info;
6680   unsigned char *entry;
6681   unsigned char *end;
6682   unsigned int i;
6683   unsigned int count;
6684 
6685   if (section->size == 0)
6686     {
6687       printf (_("\nThe %s section is empty.\n"), section->name);
6688       return 0;
6689     }
6690 
6691   if (load_debug_info (file) == 0)
6692     {
6693       warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
6694 	    section->name);
6695       return 0;
6696     }
6697 
6698   introduce (section, FALSE);
6699 
6700   /* PR  17531: file: cf38d01b.
6701      We use xcalloc because a corrupt file may not have initialised all of the
6702      fields in the debug_info structure, which means that the sort below might
6703      try to move uninitialised data.  */
6704   debug_addr_info = (debug_info **) xcalloc ((num_debug_info_entries + 1),
6705 					     sizeof (debug_info *));
6706 
6707   count = 0;
6708   for (i = 0; i < num_debug_info_entries; i++)
6709     if (debug_information [i].addr_base != DEBUG_INFO_UNAVAILABLE)
6710       {
6711 	/* PR 17531: file: cf38d01b.  */
6712 	if (debug_information[i].addr_base >= section->size)
6713 	  warn (_("Corrupt address base (%lx) found in debug section %u\n"),
6714 		(unsigned long) debug_information[i].addr_base, i);
6715 	else
6716 	  debug_addr_info [count++] = debug_information + i;
6717       }
6718 
6719   /* Add a sentinel to make iteration convenient.  */
6720   debug_addr_info [count] = (debug_info *) xmalloc (sizeof (debug_info));
6721   debug_addr_info [count]->addr_base = section->size;
6722   qsort (debug_addr_info, count, sizeof (debug_info *), comp_addr_base);
6723 
6724   for (i = 0; i < count; i++)
6725     {
6726       unsigned int idx;
6727       unsigned int address_size = debug_addr_info [i]->pointer_size;
6728 
6729       printf (_("  For compilation unit at offset 0x%s:\n"),
6730 	      dwarf_vmatoa ("x", debug_addr_info [i]->cu_offset));
6731 
6732       printf (_("\tIndex\tAddress\n"));
6733       entry = section->start + debug_addr_info [i]->addr_base;
6734       end = section->start + debug_addr_info [i + 1]->addr_base;
6735       idx = 0;
6736       while (entry < end)
6737 	{
6738 	  dwarf_vma base = byte_get (entry, address_size);
6739 	  printf (_("\t%d:\t"), idx);
6740 	  print_dwarf_vma (base, address_size);
6741 	  printf ("\n");
6742 	  entry += address_size;
6743 	  idx++;
6744 	}
6745     }
6746   printf ("\n");
6747 
6748   free (debug_addr_info);
6749   return 1;
6750 }
6751 
6752 /* Display the .debug_str_offsets and .debug_str_offsets.dwo sections.  */
6753 
6754 static int
6755 display_debug_str_offsets (struct dwarf_section *section,
6756 			   void *file ATTRIBUTE_UNUSED)
6757 {
6758   if (section->size == 0)
6759     {
6760       printf (_("\nThe %s section is empty.\n"), section->name);
6761       return 0;
6762     }
6763   /* TODO: Dump the contents.  This is made somewhat difficult by not knowing
6764      what the offset size is for this section.  */
6765   return 1;
6766 }
6767 
6768 /* Each debug_information[x].range_lists[y] gets this representation for
6769    sorting purposes.  */
6770 
6771 struct range_entry
6772 {
6773   /* The debug_information[x].range_lists[y] value.  */
6774   dwarf_vma ranges_offset;
6775 
6776   /* Original debug_information to find parameters of the data.  */
6777   debug_info *debug_info_p;
6778 };
6779 
6780 /* Sort struct range_entry in ascending order of its RANGES_OFFSET.  */
6781 
6782 static int
6783 range_entry_compar (const void *ap, const void *bp)
6784 {
6785   const struct range_entry *a_re = (const struct range_entry *) ap;
6786   const struct range_entry *b_re = (const struct range_entry *) bp;
6787   const dwarf_vma a = a_re->ranges_offset;
6788   const dwarf_vma b = b_re->ranges_offset;
6789 
6790   return (a > b) - (b > a);
6791 }
6792 
6793 static void
6794 display_debug_ranges_list (unsigned char *start, unsigned char *finish,
6795 			   unsigned int pointer_size, unsigned long offset,
6796 			   unsigned long base_address)
6797 {
6798   while (start < finish)
6799     {
6800       dwarf_vma begin;
6801       dwarf_vma end;
6802 
6803       SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
6804       if (start >= finish)
6805 	break;
6806       SAFE_SIGNED_BYTE_GET_AND_INC (end, start, pointer_size, finish);
6807 
6808 
6809       printf ("    %8.8lx ", offset);
6810 
6811       if (begin == 0 && end == 0)
6812 	{
6813 	  printf (_("<End of list>\n"));
6814 	  break;
6815 	}
6816 
6817       /* Check base address specifiers.  */
6818       if (is_max_address (begin, pointer_size)
6819 	  && !is_max_address (end, pointer_size))
6820 	{
6821 	  base_address = end;
6822 	  print_dwarf_vma (begin, pointer_size);
6823 	  print_dwarf_vma (end, pointer_size);
6824 	  printf ("(base address)\n");
6825 	  continue;
6826 	}
6827 
6828       print_dwarf_vma (begin + base_address, pointer_size);
6829       print_dwarf_vma (end + base_address, pointer_size);
6830 
6831       if (begin == end)
6832 	fputs (_("(start == end)"), stdout);
6833       else if (begin > end)
6834 	fputs (_("(start > end)"), stdout);
6835 
6836       putchar ('\n');
6837     }
6838 }
6839 
6840 static void
6841 display_debug_rnglists_list (unsigned char *start, unsigned char *finish,
6842 			     unsigned int pointer_size, unsigned long offset,
6843 			     unsigned long base_address)
6844 {
6845   unsigned char *next = start;
6846 
6847   while (1)
6848     {
6849       unsigned long off = offset + (start - next);
6850       enum dwarf_range_list_entry rlet;
6851       /* Initialize it due to a false compiler warning.  */
6852       dwarf_vma begin = -1, length, end = -1;
6853 
6854       if (start + 1 > finish)
6855 	{
6856 	  warn (_("Range list starting at offset 0x%lx is not terminated.\n"),
6857 		offset);
6858 	  break;
6859 	}
6860 
6861       printf ("    %8.8lx ", off);
6862 
6863       SAFE_BYTE_GET_AND_INC (rlet, start, 1, finish);
6864 
6865       switch (rlet)
6866 	{
6867 	case DW_RLE_end_of_list:
6868 	  printf (_("<End of list>\n"));
6869 	  break;
6870 	case DW_RLE_base_address:
6871 	  SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size, finish);
6872 	  print_dwarf_vma (base_address, pointer_size);
6873 	  printf (_("(base address)\n"));
6874 	  break;
6875 	case DW_RLE_start_length:
6876 	  SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
6877 	  READ_ULEB (length, start, finish);
6878 	  end = begin + length;
6879 	  break;
6880 	case DW_RLE_offset_pair:
6881 	  READ_ULEB (begin, start, finish);
6882 	  READ_ULEB (end, start, finish);
6883 	  break;
6884 	case DW_RLE_start_end:
6885 	  SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
6886 	  SAFE_BYTE_GET_AND_INC (end, start, pointer_size, finish);
6887 	  break;
6888 	default:
6889 	  error (_("Invalid range list entry type %d\n"), rlet);
6890 	  rlet = DW_RLE_end_of_list;
6891 	  break;
6892 	}
6893       if (rlet == DW_RLE_end_of_list)
6894 	break;
6895       if (rlet == DW_RLE_base_address)
6896 	continue;
6897 
6898       print_dwarf_vma (begin + base_address, pointer_size);
6899       print_dwarf_vma (end + base_address, pointer_size);
6900 
6901       if (begin == end)
6902 	fputs (_("(start == end)"), stdout);
6903       else if (begin > end)
6904 	fputs (_("(start > end)"), stdout);
6905 
6906       putchar ('\n');
6907     }
6908 }
6909 
6910 static int
6911 display_debug_ranges (struct dwarf_section *section,
6912 		      void *file ATTRIBUTE_UNUSED)
6913 {
6914   unsigned char *start = section->start;
6915   unsigned char *last_start = start;
6916   unsigned long bytes = section->size;
6917   unsigned char *section_begin = start;
6918   unsigned char *finish = start + bytes;
6919   unsigned int num_range_list, i;
6920   struct range_entry *range_entries, *range_entry_fill;
6921   int is_rnglists = strstr (section->name, "debug_rnglists") != NULL;
6922   /* Initialize it due to a false compiler warning.  */
6923   unsigned char address_size = 0;
6924 
6925   if (bytes == 0)
6926     {
6927       printf (_("\nThe %s section is empty.\n"), section->name);
6928       return 0;
6929     }
6930 
6931   if (is_rnglists)
6932     {
6933       dwarf_vma initial_length;
6934       unsigned int initial_length_size;
6935       unsigned char segment_selector_size;
6936       unsigned int offset_size, offset_entry_count;
6937       unsigned short version;
6938 
6939       /* Get and check the length of the block.  */
6940       SAFE_BYTE_GET_AND_INC (initial_length, start, 4, finish);
6941 
6942       if (initial_length == 0xffffffff)
6943 	{
6944 	  /* This section is 64-bit DWARF 3.  */
6945 	  SAFE_BYTE_GET_AND_INC (initial_length, start, 8, finish);
6946 	  offset_size = 8;
6947 	  initial_length_size = 12;
6948 	}
6949       else
6950 	{
6951 	  offset_size = 4;
6952 	  initial_length_size = 4;
6953 	}
6954 
6955       if (initial_length + initial_length_size > section->size)
6956 	{
6957 	  /* If the length field has a relocation against it, then we should
6958 	     not complain if it is inaccurate (and probably negative).
6959 	     It is copied from .debug_line handling code.  */
6960 	  if (reloc_at (section, (start - section->start) - offset_size))
6961 	    {
6962 	      initial_length = (finish - start) - initial_length_size;
6963 	    }
6964 	  else
6965 	    {
6966 	      warn (_("The length field (0x%lx) in the debug_rnglists header is wrong - the section is too small\n"),
6967 		    (long) initial_length);
6968 	      return 0;
6969 	    }
6970 	}
6971 
6972       /* Get and check the version number.  */
6973       SAFE_BYTE_GET_AND_INC (version, start, 2, finish);
6974 
6975       if (version != 5)
6976 	{
6977 	  warn (_("Only DWARF version 5 debug_rnglists info "
6978 		  "is currently supported.\n"));
6979 	  return 0;
6980 	}
6981 
6982       SAFE_BYTE_GET_AND_INC (address_size, start, 1, finish);
6983 
6984       SAFE_BYTE_GET_AND_INC (segment_selector_size, start, 1, finish);
6985       if (segment_selector_size != 0)
6986 	{
6987 	  warn (_("The %s section contains "
6988 		  "unsupported segment selector size: %d.\n"),
6989 		section->name, segment_selector_size);
6990 	  return 0;
6991 	}
6992 
6993       SAFE_BYTE_GET_AND_INC (offset_entry_count, start, 4, finish);
6994       if (offset_entry_count != 0)
6995 	{
6996 	  warn (_("The %s section contains "
6997 		  "unsupported offset entry count: %u.\n"),
6998 		section->name, offset_entry_count);
6999 	  return 0;
7000 	}
7001     }
7002 
7003   if (load_debug_info (file) == 0)
7004     {
7005       warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
7006 	    section->name);
7007       return 0;
7008     }
7009 
7010   num_range_list = 0;
7011   for (i = 0; i < num_debug_info_entries; i++)
7012     num_range_list += debug_information [i].num_range_lists;
7013 
7014   if (num_range_list == 0)
7015     {
7016       /* This can happen when the file was compiled with -gsplit-debug
7017 	 which removes references to range lists from the primary .o file.  */
7018       printf (_("No range lists in .debug_info section.\n"));
7019       return 1;
7020     }
7021 
7022   range_entries = (struct range_entry *)
7023       xmalloc (sizeof (*range_entries) * num_range_list);
7024   range_entry_fill = range_entries;
7025 
7026   for (i = 0; i < num_debug_info_entries; i++)
7027     {
7028       debug_info *debug_info_p = &debug_information[i];
7029       unsigned int j;
7030 
7031       for (j = 0; j < debug_info_p->num_range_lists; j++)
7032 	{
7033 	  range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
7034 	  range_entry_fill->debug_info_p = debug_info_p;
7035 	  range_entry_fill++;
7036 	}
7037     }
7038 
7039   qsort (range_entries, num_range_list, sizeof (*range_entries),
7040 	 range_entry_compar);
7041 
7042   if (dwarf_check != 0 && range_entries[0].ranges_offset != 0)
7043     warn (_("Range lists in %s section start at 0x%lx\n"),
7044 	  section->name, (unsigned long) range_entries[0].ranges_offset);
7045 
7046   introduce (section, FALSE);
7047 
7048   printf (_("    Offset   Begin    End\n"));
7049 
7050   for (i = 0; i < num_range_list; i++)
7051     {
7052       struct range_entry *range_entry = &range_entries[i];
7053       debug_info *debug_info_p = range_entry->debug_info_p;
7054       unsigned int pointer_size;
7055       dwarf_vma offset;
7056       unsigned char *next;
7057       dwarf_vma base_address;
7058 
7059       pointer_size = (is_rnglists ? address_size : debug_info_p->pointer_size);
7060       offset = range_entry->ranges_offset;
7061       next = section_begin + offset;
7062       base_address = debug_info_p->base_address;
7063 
7064       /* PR 17512: file: 001-101485-0.001:0.1.  */
7065       if (pointer_size < 2 || pointer_size > 8)
7066 	{
7067 	  warn (_("Corrupt pointer size (%d) in debug entry at offset %8.8lx\n"),
7068 		pointer_size, (unsigned long) offset);
7069 	  continue;
7070 	}
7071 
7072       if (next < section_begin || next >= finish)
7073 	{
7074 	  warn (_("Corrupt offset (%#8.8lx) in range entry %u\n"),
7075 		(unsigned long) offset, i);
7076 	  continue;
7077 	}
7078 
7079       if (dwarf_check != 0 && i > 0)
7080 	{
7081 	  if (start < next)
7082 	    warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
7083 		  (unsigned long) (start - section_begin),
7084 		  (unsigned long) (next - section_begin), section->name);
7085 	  else if (start > next)
7086 	    {
7087 	      if (next == last_start)
7088 		continue;
7089 	      warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
7090 		    (unsigned long) (start - section_begin),
7091 		    (unsigned long) (next - section_begin), section->name);
7092 	    }
7093 	}
7094 
7095       start = next;
7096       last_start = next;
7097 
7098       (is_rnglists ? display_debug_rnglists_list : display_debug_ranges_list)
7099 	(start, finish, pointer_size, offset, base_address);
7100     }
7101   putchar ('\n');
7102 
7103   free (range_entries);
7104 
7105   return 1;
7106 }
7107 
7108 typedef struct Frame_Chunk
7109 {
7110   struct Frame_Chunk *next;
7111   unsigned char *chunk_start;
7112   unsigned int ncols;
7113   /* DW_CFA_{undefined,same_value,offset,register,unreferenced}  */
7114   short int *col_type;
7115   int *col_offset;
7116   char *augmentation;
7117   unsigned int code_factor;
7118   int data_factor;
7119   dwarf_vma pc_begin;
7120   dwarf_vma pc_range;
7121   unsigned int cfa_reg;
7122   dwarf_vma cfa_offset;
7123   unsigned int ra;
7124   unsigned char fde_encoding;
7125   unsigned char cfa_exp;
7126   unsigned char ptr_size;
7127   unsigned char segment_size;
7128 }
7129 Frame_Chunk;
7130 
7131 typedef const char *(*dwarf_regname_lookup_ftype) (unsigned int);
7132 static dwarf_regname_lookup_ftype dwarf_regnames_lookup_func;
7133 static const char *const *dwarf_regnames;
7134 static unsigned int dwarf_regnames_count;
7135 
7136 
7137 /* A marker for a col_type that means this column was never referenced
7138    in the frame info.  */
7139 #define DW_CFA_unreferenced (-1)
7140 
7141 /* Return 0 if no more space is needed, 1 if more space is needed,
7142    -1 for invalid reg.  */
7143 
7144 static int
7145 frame_need_space (Frame_Chunk *fc, unsigned int reg)
7146 {
7147   unsigned int prev = fc->ncols;
7148 
7149   if (reg < (unsigned int) fc->ncols)
7150     return 0;
7151 
7152   if (dwarf_regnames_count > 0
7153       && reg > dwarf_regnames_count)
7154     return -1;
7155 
7156   fc->ncols = reg + 1;
7157   /* PR 17512: file: 10450-2643-0.004.
7158      If reg == -1 then this can happen...  */
7159   if (fc->ncols == 0)
7160     return -1;
7161 
7162   /* PR 17512: file: 2844a11d.  */
7163   if (fc->ncols > 1024 && dwarf_regnames_count == 0)
7164     {
7165       error (_("Unfeasibly large register number: %u\n"), reg);
7166       fc->ncols = 0;
7167       /* FIXME: 1024 is an arbitrary limit.  Increase it if
7168 	 we ever encounter a valid binary that exceeds it.  */
7169       return -1;
7170     }
7171 
7172   fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
7173 					  sizeof (short int));
7174   fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
7175   /* PR 17512: file:002-10025-0.005.  */
7176   if (fc->col_type == NULL || fc->col_offset == NULL)
7177     {
7178       error (_("Out of memory allocating %u columns in dwarf frame arrays\n"),
7179 	     fc->ncols);
7180       fc->ncols = 0;
7181       return -1;
7182     }
7183 
7184   while (prev < fc->ncols)
7185     {
7186       fc->col_type[prev] = DW_CFA_unreferenced;
7187       fc->col_offset[prev] = 0;
7188       prev++;
7189     }
7190   return 1;
7191 }
7192 
7193 static const char *const dwarf_regnames_i386[] =
7194 {
7195   "eax", "ecx", "edx", "ebx",			  /* 0 - 3  */
7196   "esp", "ebp", "esi", "edi",			  /* 4 - 7  */
7197   "eip", "eflags", NULL,			  /* 8 - 10  */
7198   "st0", "st1", "st2", "st3",			  /* 11 - 14  */
7199   "st4", "st5", "st6", "st7",			  /* 15 - 18  */
7200   NULL, NULL,					  /* 19 - 20  */
7201   "xmm0", "xmm1", "xmm2", "xmm3",		  /* 21 - 24  */
7202   "xmm4", "xmm5", "xmm6", "xmm7",		  /* 25 - 28  */
7203   "mm0", "mm1", "mm2", "mm3",			  /* 29 - 32  */
7204   "mm4", "mm5", "mm6", "mm7",			  /* 33 - 36  */
7205   "fcw", "fsw", "mxcsr",			  /* 37 - 39  */
7206   "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47  */
7207   "tr", "ldtr",					  /* 48 - 49  */
7208   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57  */
7209   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65  */
7210   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73  */
7211   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81  */
7212   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89  */
7213   NULL, NULL, NULL,				  /* 90 - 92  */
7214   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"  /* 93 - 100  */
7215 };
7216 
7217 static const char *const dwarf_regnames_iamcu[] =
7218 {
7219   "eax", "ecx", "edx", "ebx",			  /* 0 - 3  */
7220   "esp", "ebp", "esi", "edi",			  /* 4 - 7  */
7221   "eip", "eflags", NULL,			  /* 8 - 10  */
7222   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 11 - 18  */
7223   NULL, NULL,					  /* 19 - 20  */
7224   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 21 - 28  */
7225   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 29 - 36  */
7226   NULL, NULL, NULL,				  /* 37 - 39  */
7227   "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47  */
7228   "tr", "ldtr",					  /* 48 - 49  */
7229   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57  */
7230   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65  */
7231   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73  */
7232   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81  */
7233   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89  */
7234   NULL, NULL, NULL,				  /* 90 - 92  */
7235   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL  /* 93 - 100  */
7236 };
7237 
7238 static void
7239 init_dwarf_regnames_i386 (void)
7240 {
7241   dwarf_regnames = dwarf_regnames_i386;
7242   dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
7243   dwarf_regnames_lookup_func = regname_internal_by_table_only;
7244 }
7245 
7246 static void
7247 init_dwarf_regnames_iamcu (void)
7248 {
7249   dwarf_regnames = dwarf_regnames_iamcu;
7250   dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_iamcu);
7251   dwarf_regnames_lookup_func = regname_internal_by_table_only;
7252 }
7253 
7254 static const char *const dwarf_regnames_x86_64[] =
7255 {
7256   "rax", "rdx", "rcx", "rbx",
7257   "rsi", "rdi", "rbp", "rsp",
7258   "r8",  "r9",  "r10", "r11",
7259   "r12", "r13", "r14", "r15",
7260   "rip",
7261   "xmm0",  "xmm1",  "xmm2",  "xmm3",
7262   "xmm4",  "xmm5",  "xmm6",  "xmm7",
7263   "xmm8",  "xmm9",  "xmm10", "xmm11",
7264   "xmm12", "xmm13", "xmm14", "xmm15",
7265   "st0", "st1", "st2", "st3",
7266   "st4", "st5", "st6", "st7",
7267   "mm0", "mm1", "mm2", "mm3",
7268   "mm4", "mm5", "mm6", "mm7",
7269   "rflags",
7270   "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
7271   "fs.base", "gs.base", NULL, NULL,
7272   "tr", "ldtr",
7273   "mxcsr", "fcw", "fsw",
7274   "xmm16",  "xmm17",  "xmm18",  "xmm19",
7275   "xmm20",  "xmm21",  "xmm22",  "xmm23",
7276   "xmm24",  "xmm25",  "xmm26",  "xmm27",
7277   "xmm28",  "xmm29",  "xmm30",  "xmm31",
7278   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 83 - 90  */
7279   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 91 - 98  */
7280   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 99 - 106  */
7281   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 107 - 114  */
7282   NULL, NULL, NULL,				  /* 115 - 117  */
7283   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
7284 };
7285 
7286 static void
7287 init_dwarf_regnames_x86_64 (void)
7288 {
7289   dwarf_regnames = dwarf_regnames_x86_64;
7290   dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
7291   dwarf_regnames_lookup_func = regname_internal_by_table_only;
7292 }
7293 
7294 static const char *const dwarf_regnames_aarch64[] =
7295 {
7296    "x0",  "x1",  "x2",  "x3",  "x4",  "x5",  "x6",  "x7",
7297    "x8",  "x9", "x10", "x11", "x12", "x13", "x14", "x15",
7298   "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
7299   "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp",
7300    NULL, "elr",  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
7301    NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  "vg", "ffr",
7302    "p0",  "p1",  "p2",  "p3",  "p4",  "p5",  "p6",  "p7",
7303    "p8",  "p9", "p10", "p11", "p12", "p13", "p14", "p15",
7304    "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",
7305    "v8",  "v9", "v10", "v11", "v12", "v13", "v14", "v15",
7306   "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
7307   "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
7308    "z0",  "z1",  "z2",  "z3",  "z4",  "z5",  "z6",  "z7",
7309    "z8",  "z9", "z10", "z11", "z12", "z13", "z14", "z15",
7310   "z16", "z17", "z18", "z19", "z20", "z21", "z22", "z23",
7311   "z24", "z25", "z26", "z27", "z28", "z29", "z30", "z31",
7312 };
7313 
7314 static void
7315 init_dwarf_regnames_aarch64 (void)
7316 {
7317   dwarf_regnames = dwarf_regnames_aarch64;
7318   dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_aarch64);
7319   dwarf_regnames_lookup_func = regname_internal_by_table_only;
7320 }
7321 
7322 static const char *const dwarf_regnames_s390[] =
7323 {
7324   /* Avoid saying "r5 (r5)", so omit the names of r0-r15.  */
7325   NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
7326   NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
7327   "f0",  "f2",  "f4",  "f6",  "f1",  "f3",  "f5",  "f7",
7328   "f8",  "f10", "f12", "f14", "f9",  "f11", "f13", "f15",
7329   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
7330   "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", "cr15",
7331   "a0",  "a1",  "a2",  "a3",  "a4",  "a5",  "a6",  "a7",
7332   "a8",  "a9",  "a10", "a11", "a12", "a13", "a14", "a15",
7333   "pswm", "pswa",
7334   NULL, NULL,
7335   "v16", "v18", "v20", "v22", "v17", "v19", "v21", "v23",
7336   "v24", "v26", "v28", "v30", "v25", "v27", "v29", "v31",
7337 };
7338 
7339 static void
7340 init_dwarf_regnames_s390 (void)
7341 {
7342   dwarf_regnames = dwarf_regnames_s390;
7343   dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_s390);
7344   dwarf_regnames_lookup_func = regname_internal_by_table_only;
7345 }
7346 
7347 static const char *const dwarf_regnames_riscv[] =
7348 {
7349  "zero", "ra",   "sp",   "gp",  "tp",  "t0",  "t1",  "t2",  /* 0  - 7 */
7350  "s0",   "s1",   "a0",   "a1",  "a2",  "a3",  "a4",  "a5",  /* 8  - 15 */
7351  "a6",   "a7",   "s2",   "s3",  "s4",  "s5",  "s6",  "s7",  /* 16 - 23 */
7352  "s8",   "s9",   "s10",  "s11", "t3",  "t4",  "t5",  "t6",  /* 24 - 31 */
7353  "ft0",  "ft1",  "ft2",  "ft3", "ft4", "ft5", "ft6", "ft7", /* 32 - 39 */
7354  "fs0",  "fs1",                                             /* 40 - 41 */
7355  "fa0",  "fa1",  "fa2",  "fa3", "fa4", "fa5", "fa6", "fa7", /* 42 - 49 */
7356  "fs2",  "fs3",  "fs4",  "fs5", "fs6", "fs7", "fs8", "fs9", /* 50 - 57 */
7357  "fs10", "fs11",                                            /* 58 - 59 */
7358  "ft8",  "ft9",  "ft10", "ft11"                             /* 60 - 63 */
7359 };
7360 
7361 /* A RISC-V replacement for REGNAME_INTERNAL_BY_TABLE_ONLY which handles
7362    the large number of CSRs.  */
7363 
7364 static const char *
7365 regname_internal_riscv (unsigned int regno)
7366 {
7367   const char *name = NULL;
7368 
7369   /* Lookup in the table first, this covers GPR and FPR.  */
7370   if (regno < ARRAY_SIZE (dwarf_regnames_riscv))
7371     name = dwarf_regnames_riscv [regno];
7372   else if (regno >= 4096 && regno <= 8191)
7373     {
7374       /* This might be a CSR, these live in a sparse number space from 4096
7375 	 to 8191  These numbers are defined in the RISC-V ELF ABI
7376 	 document.  */
7377       switch (regno)
7378 	{
7379 #define DECLARE_CSR(NAME,VALUE) case VALUE + 4096: name = #NAME; break;
7380 #include "opcode/riscv-opc.h"
7381 #undef DECLARE_CSR
7382 
7383 	default:
7384 	  {
7385 	    static char csr_name[10];
7386 	    snprintf (csr_name, sizeof (csr_name), "csr%d", (regno - 4096));
7387 	    name = csr_name;
7388 	  }
7389 	  break;
7390 	}
7391     }
7392 
7393   return name;
7394 }
7395 
7396 static void
7397 init_dwarf_regnames_riscv (void)
7398 {
7399   dwarf_regnames = NULL;
7400   dwarf_regnames_count = 8192;
7401   dwarf_regnames_lookup_func = regname_internal_riscv;
7402 }
7403 
7404 void
7405 init_dwarf_regnames_by_elf_machine_code (unsigned int e_machine)
7406 {
7407   dwarf_regnames_lookup_func = NULL;
7408 
7409   switch (e_machine)
7410     {
7411     case EM_386:
7412       init_dwarf_regnames_i386 ();
7413       break;
7414 
7415     case EM_IAMCU:
7416       init_dwarf_regnames_iamcu ();
7417       break;
7418 
7419     case EM_X86_64:
7420     case EM_L1OM:
7421     case EM_K1OM:
7422       init_dwarf_regnames_x86_64 ();
7423       break;
7424 
7425     case EM_AARCH64:
7426       init_dwarf_regnames_aarch64 ();
7427       break;
7428 
7429     case EM_S390:
7430       init_dwarf_regnames_s390 ();
7431       break;
7432 
7433     case EM_RISCV:
7434       init_dwarf_regnames_riscv ();
7435       break;
7436 
7437     default:
7438       break;
7439     }
7440 }
7441 
7442 /* Initialize the DWARF register name lookup state based on the
7443    architecture and specific machine type of a BFD.  */
7444 
7445 void
7446 init_dwarf_regnames_by_bfd_arch_and_mach (enum bfd_architecture arch,
7447 					  unsigned long mach)
7448 {
7449   dwarf_regnames_lookup_func = NULL;
7450 
7451   switch (arch)
7452     {
7453     case bfd_arch_i386:
7454       switch (mach)
7455 	{
7456 	case bfd_mach_x86_64:
7457 	case bfd_mach_x86_64_intel_syntax:
7458 	case bfd_mach_x86_64_nacl:
7459 	case bfd_mach_x64_32:
7460 	case bfd_mach_x64_32_intel_syntax:
7461 	case bfd_mach_x64_32_nacl:
7462 	  init_dwarf_regnames_x86_64 ();
7463 	  break;
7464 
7465 	default:
7466 	  init_dwarf_regnames_i386 ();
7467 	  break;
7468 	}
7469       break;
7470 
7471     case bfd_arch_iamcu:
7472       init_dwarf_regnames_iamcu ();
7473       break;
7474 
7475     case bfd_arch_aarch64:
7476       init_dwarf_regnames_aarch64();
7477       break;
7478 
7479     case bfd_arch_s390:
7480       init_dwarf_regnames_s390 ();
7481       break;
7482 
7483     case bfd_arch_riscv:
7484       init_dwarf_regnames_riscv ();
7485       break;
7486 
7487     default:
7488       break;
7489     }
7490 }
7491 
7492 static const char *
7493 regname_internal_by_table_only (unsigned int regno)
7494 {
7495   if (dwarf_regnames != NULL
7496       && regno < dwarf_regnames_count
7497       && dwarf_regnames [regno] != NULL)
7498     return dwarf_regnames [regno];
7499 
7500   return NULL;
7501 }
7502 
7503 static const char *
7504 regname (unsigned int regno, int name_only_p)
7505 {
7506   static char reg[64];
7507 
7508   const char *name = NULL;
7509 
7510   if (dwarf_regnames_lookup_func != NULL)
7511     name = dwarf_regnames_lookup_func (regno);
7512 
7513   if (name != NULL)
7514     {
7515       if (name_only_p)
7516 	return name;
7517       snprintf (reg, sizeof (reg), "r%d (%s)", regno, name);
7518     }
7519   else
7520     snprintf (reg, sizeof (reg), "r%d", regno);
7521   return reg;
7522 }
7523 
7524 static void
7525 frame_display_row (Frame_Chunk *fc, int *need_col_headers, unsigned int *max_regs)
7526 {
7527   unsigned int r;
7528   char tmp[100];
7529 
7530   if (*max_regs != fc->ncols)
7531     *max_regs = fc->ncols;
7532 
7533   if (*need_col_headers)
7534     {
7535       static const char *sloc = "   LOC";
7536 
7537       *need_col_headers = 0;
7538 
7539       printf ("%-*s CFA      ", eh_addr_size * 2, sloc);
7540 
7541       for (r = 0; r < *max_regs; r++)
7542 	if (fc->col_type[r] != DW_CFA_unreferenced)
7543 	  {
7544 	    if (r == fc->ra)
7545 	      printf ("ra    ");
7546 	    else
7547 	      printf ("%-5s ", regname (r, 1));
7548 	  }
7549 
7550       printf ("\n");
7551     }
7552 
7553   print_dwarf_vma (fc->pc_begin, eh_addr_size);
7554   if (fc->cfa_exp)
7555     strcpy (tmp, "exp");
7556   else
7557     sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), (int) fc->cfa_offset);
7558   printf ("%-8s ", tmp);
7559 
7560   for (r = 0; r < fc->ncols; r++)
7561     {
7562       if (fc->col_type[r] != DW_CFA_unreferenced)
7563 	{
7564 	  switch (fc->col_type[r])
7565 	    {
7566 	    case DW_CFA_undefined:
7567 	      strcpy (tmp, "u");
7568 	      break;
7569 	    case DW_CFA_same_value:
7570 	      strcpy (tmp, "s");
7571 	      break;
7572 	    case DW_CFA_offset:
7573 	      sprintf (tmp, "c%+d", fc->col_offset[r]);
7574 	      break;
7575 	    case DW_CFA_val_offset:
7576 	      sprintf (tmp, "v%+d", fc->col_offset[r]);
7577 	      break;
7578 	    case DW_CFA_register:
7579 	      sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
7580 	      break;
7581 	    case DW_CFA_expression:
7582 	      strcpy (tmp, "exp");
7583 	      break;
7584 	    case DW_CFA_val_expression:
7585 	      strcpy (tmp, "vexp");
7586 	      break;
7587 	    default:
7588 	      strcpy (tmp, "n/a");
7589 	      break;
7590 	    }
7591 	  printf ("%-5s ", tmp);
7592 	}
7593     }
7594   printf ("\n");
7595 }
7596 
7597 #define GET(VAR, N)	SAFE_BYTE_GET_AND_INC (VAR, start, N, end)
7598 
7599 static unsigned char *
7600 read_cie (unsigned char *start, unsigned char *end,
7601 	  Frame_Chunk **p_cie, int *p_version,
7602 	  bfd_size_type *p_aug_len, unsigned char **p_aug)
7603 {
7604   int version;
7605   Frame_Chunk *fc;
7606   unsigned char *augmentation_data = NULL;
7607   bfd_size_type augmentation_data_len = 0;
7608 
7609   * p_cie = NULL;
7610   /* PR 17512: file: 001-228113-0.004.  */
7611   if (start >= end)
7612     return end;
7613 
7614   fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7615   memset (fc, 0, sizeof (Frame_Chunk));
7616 
7617   fc->col_type = (short int *) xmalloc (sizeof (short int));
7618   fc->col_offset = (int *) xmalloc (sizeof (int));
7619 
7620   version = *start++;
7621 
7622   fc->augmentation = (char *) start;
7623   /* PR 17512: file: 001-228113-0.004.
7624      Skip past augmentation name, but avoid running off the end of the data.  */
7625   while (start < end)
7626     if (* start ++ == '\0')
7627       break;
7628   if (start == end)
7629     {
7630       warn (_("No terminator for augmentation name\n"));
7631       goto fail;
7632     }
7633 
7634   if (strcmp (fc->augmentation, "eh") == 0)
7635     start += eh_addr_size;
7636 
7637   if (version >= 4)
7638     {
7639       GET (fc->ptr_size, 1);
7640       if (fc->ptr_size < 1 || fc->ptr_size > 8)
7641 	{
7642 	  warn (_("Invalid pointer size (%d) in CIE data\n"), fc->ptr_size);
7643 	  goto fail;
7644 	}
7645 
7646       GET (fc->segment_size, 1);
7647       /* PR 17512: file: e99d2804.  */
7648       if (fc->segment_size > 8 || fc->segment_size + fc->ptr_size > 8)
7649 	{
7650 	  warn (_("Invalid segment size (%d) in CIE data\n"), fc->segment_size);
7651 	  goto fail;
7652 	}
7653 
7654       eh_addr_size = fc->ptr_size;
7655     }
7656   else
7657     {
7658       fc->ptr_size = eh_addr_size;
7659       fc->segment_size = 0;
7660     }
7661 
7662   READ_ULEB (fc->code_factor, start, end);
7663   READ_SLEB (fc->data_factor, start, end);
7664 
7665   if (version == 1)
7666     {
7667       GET (fc->ra, 1);
7668     }
7669   else
7670     {
7671       READ_ULEB (fc->ra, start, end);
7672     }
7673 
7674   if (fc->augmentation[0] == 'z')
7675     {
7676       READ_ULEB (augmentation_data_len, start, end);
7677       augmentation_data = start;
7678       /* PR 17512: file: 11042-2589-0.004.  */
7679       if (augmentation_data_len > (bfd_size_type) (end - start))
7680 	{
7681 	  warn (_("Augmentation data too long: 0x%s, expected at most %#lx\n"),
7682 		dwarf_vmatoa ("x", augmentation_data_len),
7683 		(unsigned long) (end - start));
7684 	  goto fail;
7685 	}
7686       start += augmentation_data_len;
7687     }
7688 
7689   if (augmentation_data_len)
7690     {
7691       unsigned char *p;
7692       unsigned char *q;
7693       unsigned char *qend;
7694 
7695       p = (unsigned char *) fc->augmentation + 1;
7696       q = augmentation_data;
7697       qend = q + augmentation_data_len;
7698 
7699       while (p < end && q < qend)
7700 	{
7701 	  if (*p == 'L')
7702 	    q++;
7703 	  else if (*p == 'P')
7704 	    q += 1 + size_of_encoded_value (*q);
7705 	  else if (*p == 'R')
7706 	    fc->fde_encoding = *q++;
7707 	  else if (*p == 'S')
7708 	    ;
7709 	  else if (*p == 'B')
7710 	    ;
7711 	  else
7712 	    break;
7713 	  p++;
7714 	}
7715       /* Note - it is OK if this loop terminates with q < qend.
7716 	 Padding may have been inserted to align the end of the CIE.  */
7717     }
7718 
7719   *p_cie = fc;
7720   if (p_version)
7721     *p_version = version;
7722   if (p_aug_len)
7723     {
7724       *p_aug_len = augmentation_data_len;
7725       *p_aug = augmentation_data;
7726     }
7727   return start;
7728 
7729  fail:
7730   free (fc->col_offset);
7731   free (fc->col_type);
7732   free (fc);
7733   return end;
7734 }
7735 
7736 /* Prints out the contents on the DATA array formatted as unsigned bytes.
7737    If do_wide is not enabled, then formats the output to fit into 80 columns.
7738    PRINTED contains the number of characters already written to the current
7739    output line.  */
7740 
7741 static void
7742 display_data (bfd_size_type          printed,
7743 	      const unsigned char *  data,
7744 	      const bfd_size_type    len)
7745 {
7746   if (do_wide || len < ((80 - printed) / 3))
7747     for (printed = 0; printed < len; ++printed)
7748       printf (" %02x", data[printed]);
7749   else
7750     {
7751       for (printed = 0; printed < len; ++printed)
7752 	{
7753 	  if (printed % (80 / 3) == 0)
7754 	    putchar ('\n');
7755 	  printf (" %02x", data[printed]);
7756 	}
7757     }
7758 }
7759 
7760 /* Prints out the contents on the augmentation data array.
7761    If do_wide is not enabled, then formats the output to fit into 80 columns.  */
7762 
7763 static void
7764 display_augmentation_data (const unsigned char * data, const bfd_size_type len)
7765 {
7766   bfd_size_type i;
7767 
7768   i = printf (_("  Augmentation data:    "));
7769   display_data (i, data, len);
7770 }
7771 
7772 static int
7773 display_debug_frames (struct dwarf_section *section,
7774 		      void *file ATTRIBUTE_UNUSED)
7775 {
7776   unsigned char *start = section->start;
7777   unsigned char *end = start + section->size;
7778   unsigned char *section_start = start;
7779   Frame_Chunk *chunks = NULL, *forward_refs = NULL;
7780   Frame_Chunk *remembered_state = NULL;
7781   Frame_Chunk *rs;
7782   bfd_boolean is_eh = strcmp (section->name, ".eh_frame") == 0;
7783   unsigned int max_regs = 0;
7784   const char *bad_reg = _("bad register: ");
7785   unsigned int saved_eh_addr_size = eh_addr_size;
7786 
7787   introduce (section, FALSE);
7788 
7789   while (start < end)
7790     {
7791       unsigned char *saved_start;
7792       unsigned char *block_end;
7793       dwarf_vma length;
7794       dwarf_vma cie_id;
7795       Frame_Chunk *fc;
7796       Frame_Chunk *cie;
7797       int need_col_headers = 1;
7798       unsigned char *augmentation_data = NULL;
7799       bfd_size_type augmentation_data_len = 0;
7800       unsigned int encoded_ptr_size = saved_eh_addr_size;
7801       unsigned int offset_size;
7802       unsigned int initial_length_size;
7803       bfd_boolean all_nops;
7804       static Frame_Chunk fde_fc;
7805 
7806       saved_start = start;
7807 
7808       SAFE_BYTE_GET_AND_INC (length, start, 4, end);
7809 
7810       if (length == 0)
7811 	{
7812 	  printf ("\n%08lx ZERO terminator\n\n",
7813 		    (unsigned long)(saved_start - section_start));
7814 	  /* Skip any zero terminators that directly follow.
7815 	     A corrupt section size could have loaded a whole
7816 	     slew of zero filled memory bytes.  eg
7817 	     PR 17512: file: 070-19381-0.004.  */
7818 	  while (start < end && * start == 0)
7819 	    ++ start;
7820 	  continue;
7821 	}
7822 
7823       if (length == 0xffffffff)
7824 	{
7825 	  SAFE_BYTE_GET_AND_INC (length, start, 8, end);
7826 	  offset_size = 8;
7827 	  initial_length_size = 12;
7828 	}
7829       else
7830 	{
7831 	  offset_size = 4;
7832 	  initial_length_size = 4;
7833 	}
7834 
7835       block_end = saved_start + length + initial_length_size;
7836       if (block_end > end || block_end < start)
7837 	{
7838 	  warn ("Invalid length 0x%s in FDE at %#08lx\n",
7839 		dwarf_vmatoa_1 (NULL, length, offset_size),
7840 		(unsigned long) (saved_start - section_start));
7841 	  block_end = end;
7842 	}
7843 
7844       SAFE_BYTE_GET_AND_INC (cie_id, start, offset_size, end);
7845 
7846       if (is_eh ? (cie_id == 0) : ((offset_size == 4 && cie_id == DW_CIE_ID)
7847 				   || (offset_size == 8 && cie_id == DW64_CIE_ID)))
7848 	{
7849 	  int version;
7850 	  unsigned int mreg;
7851 
7852 	  start = read_cie (start, end, &cie, &version,
7853 			    &augmentation_data_len, &augmentation_data);
7854 	  /* PR 17512: file: 027-135133-0.005.  */
7855 	  if (cie == NULL)
7856 	    break;
7857 
7858 	  fc = cie;
7859 	  fc->next = chunks;
7860 	  chunks = fc;
7861 	  fc->chunk_start = saved_start;
7862 	  mreg = max_regs > 0 ? max_regs - 1 : 0;
7863 	  if (mreg < fc->ra)
7864 	    mreg = fc->ra;
7865 	  if (frame_need_space (fc, mreg) < 0)
7866 	    break;
7867 	  if (fc->fde_encoding)
7868 	    encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7869 
7870 	  printf ("\n%08lx ", (unsigned long) (saved_start - section_start));
7871 	  print_dwarf_vma (length, fc->ptr_size);
7872 	  print_dwarf_vma (cie_id, offset_size);
7873 
7874 	  if (do_debug_frames_interp)
7875 	    {
7876 	      printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc->augmentation,
7877 		      fc->code_factor, fc->data_factor, fc->ra);
7878 	    }
7879 	  else
7880 	    {
7881 	      printf ("CIE\n");
7882 	      printf ("  Version:               %d\n", version);
7883 	      printf ("  Augmentation:          \"%s\"\n", fc->augmentation);
7884 	      if (version >= 4)
7885 		{
7886 		  printf ("  Pointer Size:          %u\n", fc->ptr_size);
7887 		  printf ("  Segment Size:          %u\n", fc->segment_size);
7888 		}
7889 	      printf ("  Code alignment factor: %u\n", fc->code_factor);
7890 	      printf ("  Data alignment factor: %d\n", fc->data_factor);
7891 	      printf ("  Return address column: %d\n", fc->ra);
7892 
7893 	      if (augmentation_data_len)
7894 		display_augmentation_data (augmentation_data, augmentation_data_len);
7895 
7896 	      putchar ('\n');
7897 	    }
7898 	}
7899       else
7900 	{
7901 	  unsigned char *look_for;
7902 	  unsigned long segment_selector;
7903 
7904 	  if (is_eh)
7905 	    {
7906 	      dwarf_vma sign = (dwarf_vma) 1 << (offset_size * 8 - 1);
7907 	      look_for = start - 4 - ((cie_id ^ sign) - sign);
7908 	    }
7909 	  else
7910 	    look_for = section_start + cie_id;
7911 
7912 	  if (look_for <= saved_start)
7913 	    {
7914 	      for (cie = chunks; cie ; cie = cie->next)
7915 		if (cie->chunk_start == look_for)
7916 		  break;
7917 	    }
7918 	  else
7919 	    {
7920 	      for (cie = forward_refs; cie ; cie = cie->next)
7921 		if (cie->chunk_start == look_for)
7922 		  break;
7923 	      if (!cie)
7924 		{
7925 		  unsigned int off_size;
7926 		  unsigned char *cie_scan;
7927 
7928 		  cie_scan = look_for;
7929 		  off_size = 4;
7930 		  SAFE_BYTE_GET_AND_INC (length, cie_scan, 4, end);
7931 		  if (length == 0xffffffff)
7932 		    {
7933 		      SAFE_BYTE_GET_AND_INC (length, cie_scan, 8, end);
7934 		      off_size = 8;
7935 		    }
7936 		  if (length != 0)
7937 		    {
7938 		      dwarf_vma c_id;
7939 
7940 		      SAFE_BYTE_GET_AND_INC (c_id, cie_scan, off_size, end);
7941 		      if (is_eh
7942 			  ? c_id == 0
7943 			  : ((off_size == 4 && c_id == DW_CIE_ID)
7944 			     || (off_size == 8 && c_id == DW64_CIE_ID)))
7945 			{
7946 			  int version;
7947 			  unsigned int mreg;
7948 
7949 			  read_cie (cie_scan, end, &cie, &version,
7950 				    &augmentation_data_len, &augmentation_data);
7951 			  /* PR 17512: file: 3450-2098-0.004.  */
7952 			  if (cie == NULL)
7953 			    {
7954 			      warn (_("Failed to read CIE information\n"));
7955 			      break;
7956 			    }
7957 			  cie->next = forward_refs;
7958 			  forward_refs = cie;
7959 			  cie->chunk_start = look_for;
7960 			  mreg = max_regs > 0 ? max_regs - 1 : 0;
7961 			  if (mreg < cie->ra)
7962 			    mreg = cie->ra;
7963 			  if (frame_need_space (cie, mreg) < 0)
7964 			    {
7965 			      warn (_("Invalid max register\n"));
7966 			      break;
7967 			    }
7968 			  if (cie->fde_encoding)
7969 			    encoded_ptr_size
7970 			      = size_of_encoded_value (cie->fde_encoding);
7971 			}
7972 		    }
7973 		}
7974 	    }
7975 
7976 	  fc = &fde_fc;
7977 	  memset (fc, 0, sizeof (Frame_Chunk));
7978 
7979 	  if (!cie)
7980 	    {
7981 	      warn ("Invalid CIE pointer 0x%s in FDE at %#08lx\n",
7982 		    dwarf_vmatoa_1 (NULL, cie_id, offset_size),
7983 		    (unsigned long) (saved_start - section_start));
7984 	      fc->ncols = 0;
7985 	      fc->col_type = (short int *) xmalloc (sizeof (short int));
7986 	      fc->col_offset = (int *) xmalloc (sizeof (int));
7987 	      if (frame_need_space (fc, max_regs > 0 ? max_regs - 1 : 0) < 0)
7988 		{
7989 		  warn (_("Invalid max register\n"));
7990 		  break;
7991 		}
7992 	      cie = fc;
7993 	      fc->augmentation = "";
7994 	      fc->fde_encoding = 0;
7995 	      fc->ptr_size = eh_addr_size;
7996 	      fc->segment_size = 0;
7997 	    }
7998 	  else
7999 	    {
8000 	      fc->ncols = cie->ncols;
8001 	      fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
8002 	      fc->col_offset =  (int *) xcmalloc (fc->ncols, sizeof (int));
8003 	      memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8004 	      memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8005 	      fc->augmentation = cie->augmentation;
8006 	      fc->ptr_size = cie->ptr_size;
8007 	      eh_addr_size = cie->ptr_size;
8008 	      fc->segment_size = cie->segment_size;
8009 	      fc->code_factor = cie->code_factor;
8010 	      fc->data_factor = cie->data_factor;
8011 	      fc->cfa_reg = cie->cfa_reg;
8012 	      fc->cfa_offset = cie->cfa_offset;
8013 	      fc->ra = cie->ra;
8014 	      if (frame_need_space (fc, max_regs > 0 ? max_regs - 1: 0) < 0)
8015 		{
8016 		  warn (_("Invalid max register\n"));
8017 		  break;
8018 		}
8019 	      fc->fde_encoding = cie->fde_encoding;
8020 	    }
8021 
8022 	  if (fc->fde_encoding)
8023 	    encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8024 
8025 	  segment_selector = 0;
8026 	  if (fc->segment_size)
8027 	    {
8028 	      if (fc->segment_size > sizeof (segment_selector))
8029 		{
8030 		  /* PR 17512: file: 9e196b3e.  */
8031 		  warn (_("Probably corrupt segment size: %d - using 4 instead\n"), fc->segment_size);
8032 		  fc->segment_size = 4;
8033 		}
8034 	      SAFE_BYTE_GET_AND_INC (segment_selector, start, fc->segment_size, end);
8035 	    }
8036 
8037 	  fc->pc_begin = get_encoded_value (&start, fc->fde_encoding, section, end);
8038 
8039 	  /* FIXME: It appears that sometimes the final pc_range value is
8040 	     encoded in less than encoded_ptr_size bytes.  See the x86_64
8041 	     run of the "objcopy on compressed debug sections" test for an
8042 	     example of this.  */
8043 	  SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end);
8044 
8045 	  if (cie->augmentation[0] == 'z')
8046 	    {
8047 	      READ_ULEB (augmentation_data_len, start, end);
8048 	      augmentation_data = start;
8049 	      /* PR 17512 file: 722-8446-0.004 and PR 22386.  */
8050 	      if (augmentation_data_len > (bfd_size_type) (end - start))
8051 		{
8052 		  warn (_("Augmentation data too long: 0x%s, "
8053 			  "expected at most %#lx\n"),
8054 			dwarf_vmatoa ("x", augmentation_data_len),
8055 			(unsigned long) (end - start));
8056 		  start = end;
8057 		  augmentation_data = NULL;
8058 		  augmentation_data_len = 0;
8059 		}
8060 	      start += augmentation_data_len;
8061 	    }
8062 
8063 	  printf ("\n%08lx %s %s FDE cie=%08lx pc=",
8064 		  (unsigned long)(saved_start - section_start),
8065 		  dwarf_vmatoa_1 (NULL, length, fc->ptr_size),
8066 		  dwarf_vmatoa_1 (NULL, cie_id, offset_size),
8067 		  (unsigned long)(cie->chunk_start - section_start));
8068 
8069 	  if (fc->segment_size)
8070 	    printf ("%04lx:", segment_selector);
8071 
8072 	  printf ("%s..%s\n",
8073 		  dwarf_vmatoa_1 (NULL, fc->pc_begin, fc->ptr_size),
8074 		  dwarf_vmatoa_1 (NULL, fc->pc_begin + fc->pc_range, fc->ptr_size));
8075 
8076 	  if (! do_debug_frames_interp && augmentation_data_len)
8077 	    {
8078 	      display_augmentation_data (augmentation_data, augmentation_data_len);
8079 	      putchar ('\n');
8080 	    }
8081 	}
8082 
8083       /* At this point, fc is the current chunk, cie (if any) is set, and
8084 	 we're about to interpret instructions for the chunk.  */
8085       /* ??? At present we need to do this always, since this sizes the
8086 	 fc->col_type and fc->col_offset arrays, which we write into always.
8087 	 We should probably split the interpreted and non-interpreted bits
8088 	 into two different routines, since there's so much that doesn't
8089 	 really overlap between them.  */
8090       if (1 || do_debug_frames_interp)
8091 	{
8092 	  /* Start by making a pass over the chunk, allocating storage
8093 	     and taking note of what registers are used.  */
8094 	  unsigned char *tmp = start;
8095 
8096 	  while (start < block_end)
8097 	    {
8098 	      unsigned int reg, op, opa;
8099 	      unsigned long temp;
8100 	      unsigned char * new_start;
8101 
8102 	      op = *start++;
8103 	      opa = op & 0x3f;
8104 	      if (op & 0xc0)
8105 		op &= 0xc0;
8106 
8107 	      /* Warning: if you add any more cases to this switch, be
8108 		 sure to add them to the corresponding switch below.  */
8109 	      switch (op)
8110 		{
8111 		case DW_CFA_advance_loc:
8112 		  break;
8113 		case DW_CFA_offset:
8114 		  SKIP_ULEB (start, end);
8115 		  if (frame_need_space (fc, opa) >= 0)
8116 		    fc->col_type[opa] = DW_CFA_undefined;
8117 		  break;
8118 		case DW_CFA_restore:
8119 		  if (frame_need_space (fc, opa) >= 0)
8120 		    fc->col_type[opa] = DW_CFA_undefined;
8121 		  break;
8122 		case DW_CFA_set_loc:
8123 		  start += encoded_ptr_size;
8124 		  break;
8125 		case DW_CFA_advance_loc1:
8126 		  start += 1;
8127 		  break;
8128 		case DW_CFA_advance_loc2:
8129 		  start += 2;
8130 		  break;
8131 		case DW_CFA_advance_loc4:
8132 		  start += 4;
8133 		  break;
8134 		case DW_CFA_offset_extended:
8135 		case DW_CFA_val_offset:
8136 		  READ_ULEB (reg, start, end);
8137 		  SKIP_ULEB (start, end);
8138 		  if (frame_need_space (fc, reg) >= 0)
8139 		    fc->col_type[reg] = DW_CFA_undefined;
8140 		  break;
8141 		case DW_CFA_restore_extended:
8142 		  READ_ULEB (reg, start, end);
8143 		  if (frame_need_space (fc, reg) >= 0)
8144 		    fc->col_type[reg] = DW_CFA_undefined;
8145 		  break;
8146 		case DW_CFA_undefined:
8147 		  READ_ULEB (reg, start, end);
8148 		  if (frame_need_space (fc, reg) >= 0)
8149 		    fc->col_type[reg] = DW_CFA_undefined;
8150 		  break;
8151 		case DW_CFA_same_value:
8152 		  READ_ULEB (reg, start, end);
8153 		  if (frame_need_space (fc, reg) >= 0)
8154 		    fc->col_type[reg] = DW_CFA_undefined;
8155 		  break;
8156 		case DW_CFA_register:
8157 		  READ_ULEB (reg, start, end);
8158 		  SKIP_ULEB (start, end);
8159 		  if (frame_need_space (fc, reg) >= 0)
8160 		    fc->col_type[reg] = DW_CFA_undefined;
8161 		  break;
8162 		case DW_CFA_def_cfa:
8163 		  SKIP_ULEB (start, end);
8164 		  SKIP_ULEB (start, end);
8165 		  break;
8166 		case DW_CFA_def_cfa_register:
8167 		  SKIP_ULEB (start, end);
8168 		  break;
8169 		case DW_CFA_def_cfa_offset:
8170 		  SKIP_ULEB (start, end);
8171 		  break;
8172 		case DW_CFA_def_cfa_expression:
8173 		  READ_ULEB (temp, start, end);
8174 		  new_start = start + temp;
8175 		  if (new_start < start)
8176 		    {
8177 		      warn (_("Corrupt CFA_def expression value: %lu\n"), temp);
8178 		      start = block_end;
8179 		    }
8180 		  else
8181 		    start = new_start;
8182 		  break;
8183 		case DW_CFA_expression:
8184 		case DW_CFA_val_expression:
8185 		  READ_ULEB (reg, start, end);
8186 		  READ_ULEB (temp, start, end);
8187 		  new_start = start + temp;
8188 		  if (new_start < start)
8189 		    {
8190 		      /* PR 17512: file:306-192417-0.005.  */
8191 		      warn (_("Corrupt CFA expression value: %lu\n"), temp);
8192 		      start = block_end;
8193 		    }
8194 		  else
8195 		    start = new_start;
8196 		  if (frame_need_space (fc, reg) >= 0)
8197 		    fc->col_type[reg] = DW_CFA_undefined;
8198 		  break;
8199 		case DW_CFA_offset_extended_sf:
8200 		case DW_CFA_val_offset_sf:
8201 		  READ_ULEB (reg, start, end);
8202 		  SKIP_SLEB (start, end);
8203 		  if (frame_need_space (fc, reg) >= 0)
8204 		    fc->col_type[reg] = DW_CFA_undefined;
8205 		  break;
8206 		case DW_CFA_def_cfa_sf:
8207 		  SKIP_ULEB (start, end);
8208 		  SKIP_SLEB (start, end);
8209 		  break;
8210 		case DW_CFA_def_cfa_offset_sf:
8211 		  SKIP_SLEB (start, end);
8212 		  break;
8213 		case DW_CFA_MIPS_advance_loc8:
8214 		  start += 8;
8215 		  break;
8216 		case DW_CFA_GNU_args_size:
8217 		  SKIP_ULEB (start, end);
8218 		  break;
8219 		case DW_CFA_GNU_negative_offset_extended:
8220 		  READ_ULEB (reg, start, end);
8221 		  SKIP_ULEB (start, end);
8222 		  if (frame_need_space (fc, reg) >= 0)
8223 		    fc->col_type[reg] = DW_CFA_undefined;
8224 		  break;
8225 		default:
8226 		  break;
8227 		}
8228 	    }
8229 	  start = tmp;
8230 	}
8231 
8232       all_nops = TRUE;
8233 
8234       /* Now we know what registers are used, make a second pass over
8235 	 the chunk, this time actually printing out the info.  */
8236 
8237       while (start < block_end)
8238 	{
8239 	  unsigned char * tmp;
8240 	  unsigned op, opa;
8241 	  unsigned long ul, roffs;
8242 	  /* Note: It is tempting to use an unsigned long for 'reg' but there
8243 	     are various functions, notably frame_space_needed() that assume that
8244 	     reg is an unsigned int.  */
8245 	  unsigned int reg;
8246 	  dwarf_signed_vma l;
8247 	  dwarf_vma ofs;
8248 	  dwarf_vma vma;
8249 	  const char *reg_prefix = "";
8250 
8251 	  op = *start++;
8252 	  opa = op & 0x3f;
8253 	  if (op & 0xc0)
8254 	    op &= 0xc0;
8255 
8256 	  /* Make a note if something other than DW_CFA_nop happens.  */
8257 	  if (op != DW_CFA_nop)
8258 	    all_nops = FALSE;
8259 
8260 	  /* Warning: if you add any more cases to this switch, be
8261 	     sure to add them to the corresponding switch above.  */
8262 	  switch (op)
8263 	    {
8264 	    case DW_CFA_advance_loc:
8265 	      if (do_debug_frames_interp)
8266 		frame_display_row (fc, &need_col_headers, &max_regs);
8267 	      else
8268 		printf ("  DW_CFA_advance_loc: %d to %s\n",
8269 			opa * fc->code_factor,
8270 			dwarf_vmatoa_1 (NULL,
8271 					fc->pc_begin + opa * fc->code_factor,
8272 					fc->ptr_size));
8273 	      fc->pc_begin += opa * fc->code_factor;
8274 	      break;
8275 
8276 	    case DW_CFA_offset:
8277 	      READ_ULEB (roffs, start, end);
8278 	      if (opa >= (unsigned int) fc->ncols)
8279 		reg_prefix = bad_reg;
8280 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8281 		printf ("  DW_CFA_offset: %s%s at cfa%+ld\n",
8282 			reg_prefix, regname (opa, 0),
8283 			roffs * fc->data_factor);
8284 	      if (*reg_prefix == '\0')
8285 		{
8286 		  fc->col_type[opa] = DW_CFA_offset;
8287 		  fc->col_offset[opa] = roffs * fc->data_factor;
8288 		}
8289 	      break;
8290 
8291 	    case DW_CFA_restore:
8292 	      if (opa >= (unsigned int) fc->ncols)
8293 		reg_prefix = bad_reg;
8294 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8295 		printf ("  DW_CFA_restore: %s%s\n",
8296 			reg_prefix, regname (opa, 0));
8297 	      if (*reg_prefix != '\0')
8298 		break;
8299 
8300 	      if (opa >= (unsigned int) cie->ncols
8301 		  || (do_debug_frames_interp
8302 		      && cie->col_type[opa] == DW_CFA_unreferenced))
8303 		{
8304 		  fc->col_type[opa] = DW_CFA_undefined;
8305 		  fc->col_offset[opa] = 0;
8306 		}
8307 	      else
8308 		{
8309 		  fc->col_type[opa] = cie->col_type[opa];
8310 		  fc->col_offset[opa] = cie->col_offset[opa];
8311 		}
8312 	      break;
8313 
8314 	    case DW_CFA_set_loc:
8315 	      vma = get_encoded_value (&start, fc->fde_encoding, section, block_end);
8316 	      if (do_debug_frames_interp)
8317 		frame_display_row (fc, &need_col_headers, &max_regs);
8318 	      else
8319 		printf ("  DW_CFA_set_loc: %s\n",
8320 			dwarf_vmatoa_1 (NULL, vma, fc->ptr_size));
8321 	      fc->pc_begin = vma;
8322 	      break;
8323 
8324 	    case DW_CFA_advance_loc1:
8325 	      SAFE_BYTE_GET_AND_INC (ofs, start, 1, end);
8326 	      if (do_debug_frames_interp)
8327 		frame_display_row (fc, &need_col_headers, &max_regs);
8328 	      else
8329 		printf ("  DW_CFA_advance_loc1: %ld to %s\n",
8330 			(unsigned long) (ofs * fc->code_factor),
8331 			dwarf_vmatoa_1 (NULL,
8332 					fc->pc_begin + ofs * fc->code_factor,
8333 					fc->ptr_size));
8334 	      fc->pc_begin += ofs * fc->code_factor;
8335 	      break;
8336 
8337 	    case DW_CFA_advance_loc2:
8338 	      SAFE_BYTE_GET_AND_INC (ofs, start, 2, block_end);
8339 	      if (do_debug_frames_interp)
8340 		frame_display_row (fc, &need_col_headers, &max_regs);
8341 	      else
8342 		printf ("  DW_CFA_advance_loc2: %ld to %s\n",
8343 			(unsigned long) (ofs * fc->code_factor),
8344 			dwarf_vmatoa_1 (NULL,
8345 					fc->pc_begin + ofs * fc->code_factor,
8346 					fc->ptr_size));
8347 	      fc->pc_begin += ofs * fc->code_factor;
8348 	      break;
8349 
8350 	    case DW_CFA_advance_loc4:
8351 	      SAFE_BYTE_GET_AND_INC (ofs, start, 4, block_end);
8352 	      if (do_debug_frames_interp)
8353 		frame_display_row (fc, &need_col_headers, &max_regs);
8354 	      else
8355 		printf ("  DW_CFA_advance_loc4: %ld to %s\n",
8356 			(unsigned long) (ofs * fc->code_factor),
8357 			dwarf_vmatoa_1 (NULL,
8358 					fc->pc_begin + ofs * fc->code_factor,
8359 					fc->ptr_size));
8360 	      fc->pc_begin += ofs * fc->code_factor;
8361 	      break;
8362 
8363 	    case DW_CFA_offset_extended:
8364 	      READ_ULEB (reg, start, end);
8365 	      READ_ULEB (roffs, start, end);
8366 	      if (reg >= (unsigned int) fc->ncols)
8367 		reg_prefix = bad_reg;
8368 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8369 		printf ("  DW_CFA_offset_extended: %s%s at cfa%+ld\n",
8370 			reg_prefix, regname (reg, 0),
8371 			roffs * fc->data_factor);
8372 	      if (*reg_prefix == '\0')
8373 		{
8374 		  fc->col_type[reg] = DW_CFA_offset;
8375 		  fc->col_offset[reg] = roffs * fc->data_factor;
8376 		}
8377 	      break;
8378 
8379 	    case DW_CFA_val_offset:
8380 	      READ_ULEB (reg, start, end);
8381 	      READ_ULEB (roffs, start, end);
8382 	      if (reg >= (unsigned int) fc->ncols)
8383 		reg_prefix = bad_reg;
8384 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8385 		printf ("  DW_CFA_val_offset: %s%s is cfa%+ld\n",
8386 			reg_prefix, regname (reg, 0),
8387 			roffs * fc->data_factor);
8388 	      if (*reg_prefix == '\0')
8389 		{
8390 		  fc->col_type[reg] = DW_CFA_val_offset;
8391 		  fc->col_offset[reg] = roffs * fc->data_factor;
8392 		}
8393 	      break;
8394 
8395 	    case DW_CFA_restore_extended:
8396 	      READ_ULEB (reg, start, end);
8397 	      if (reg >= (unsigned int) fc->ncols)
8398 		reg_prefix = bad_reg;
8399 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8400 		printf ("  DW_CFA_restore_extended: %s%s\n",
8401 			reg_prefix, regname (reg, 0));
8402 	      if (*reg_prefix != '\0')
8403 		break;
8404 
8405 	      if (reg >= (unsigned int) cie->ncols)
8406 		{
8407 		  fc->col_type[reg] = DW_CFA_undefined;
8408 		  fc->col_offset[reg] = 0;
8409 		}
8410 	      else
8411 		{
8412 		  fc->col_type[reg] = cie->col_type[reg];
8413 		  fc->col_offset[reg] = cie->col_offset[reg];
8414 		}
8415 	      break;
8416 
8417 	    case DW_CFA_undefined:
8418 	      READ_ULEB (reg, start, end);
8419 	      if (reg >= (unsigned int) fc->ncols)
8420 		reg_prefix = bad_reg;
8421 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8422 		printf ("  DW_CFA_undefined: %s%s\n",
8423 			reg_prefix, regname (reg, 0));
8424 	      if (*reg_prefix == '\0')
8425 		{
8426 		  fc->col_type[reg] = DW_CFA_undefined;
8427 		  fc->col_offset[reg] = 0;
8428 		}
8429 	      break;
8430 
8431 	    case DW_CFA_same_value:
8432 	      READ_ULEB (reg, start, end);
8433 	      if (reg >= (unsigned int) fc->ncols)
8434 		reg_prefix = bad_reg;
8435 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8436 		printf ("  DW_CFA_same_value: %s%s\n",
8437 			reg_prefix, regname (reg, 0));
8438 	      if (*reg_prefix == '\0')
8439 		{
8440 		  fc->col_type[reg] = DW_CFA_same_value;
8441 		  fc->col_offset[reg] = 0;
8442 		}
8443 	      break;
8444 
8445 	    case DW_CFA_register:
8446 	      READ_ULEB (reg, start, end);
8447 	      READ_ULEB (roffs, start, end);
8448 	      if (reg >= (unsigned int) fc->ncols)
8449 		reg_prefix = bad_reg;
8450 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8451 		{
8452 		  printf ("  DW_CFA_register: %s%s in ",
8453 			  reg_prefix, regname (reg, 0));
8454 		  puts (regname (roffs, 0));
8455 		}
8456 	      if (*reg_prefix == '\0')
8457 		{
8458 		  fc->col_type[reg] = DW_CFA_register;
8459 		  fc->col_offset[reg] = roffs;
8460 		}
8461 	      break;
8462 
8463 	    case DW_CFA_remember_state:
8464 	      if (! do_debug_frames_interp)
8465 		printf ("  DW_CFA_remember_state\n");
8466 	      rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8467 	      rs->cfa_offset = fc->cfa_offset;
8468 	      rs->cfa_reg = fc->cfa_reg;
8469 	      rs->ra = fc->ra;
8470 	      rs->cfa_exp = fc->cfa_exp;
8471 	      rs->ncols = fc->ncols;
8472 	      rs->col_type = (short int *) xcmalloc (rs->ncols,
8473 						     sizeof (* rs->col_type));
8474 	      rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (* rs->col_offset));
8475 	      memcpy (rs->col_type, fc->col_type, rs->ncols * sizeof (* fc->col_type));
8476 	      memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (* fc->col_offset));
8477 	      rs->next = remembered_state;
8478 	      remembered_state = rs;
8479 	      break;
8480 
8481 	    case DW_CFA_restore_state:
8482 	      if (! do_debug_frames_interp)
8483 		printf ("  DW_CFA_restore_state\n");
8484 	      rs = remembered_state;
8485 	      if (rs)
8486 		{
8487 		  remembered_state = rs->next;
8488 		  fc->cfa_offset = rs->cfa_offset;
8489 		  fc->cfa_reg = rs->cfa_reg;
8490 		  fc->ra = rs->ra;
8491 		  fc->cfa_exp = rs->cfa_exp;
8492 		  if (frame_need_space (fc, rs->ncols - 1) < 0)
8493 		    {
8494 		      warn (_("Invalid column number in saved frame state\n"));
8495 		      fc->ncols = 0;
8496 		      break;
8497 		    }
8498 		  memcpy (fc->col_type, rs->col_type, rs->ncols * sizeof (* rs->col_type));
8499 		  memcpy (fc->col_offset, rs->col_offset,
8500 			  rs->ncols * sizeof (* rs->col_offset));
8501 		  free (rs->col_type);
8502 		  free (rs->col_offset);
8503 		  free (rs);
8504 		}
8505 	      else if (do_debug_frames_interp)
8506 		printf ("Mismatched DW_CFA_restore_state\n");
8507 	      break;
8508 
8509 	    case DW_CFA_def_cfa:
8510 	      READ_ULEB (fc->cfa_reg, start, end);
8511 	      READ_ULEB (fc->cfa_offset, start, end);
8512 	      fc->cfa_exp = 0;
8513 	      if (! do_debug_frames_interp)
8514 		printf ("  DW_CFA_def_cfa: %s ofs %d\n",
8515 			regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
8516 	      break;
8517 
8518 	    case DW_CFA_def_cfa_register:
8519 	      READ_ULEB (fc->cfa_reg, start, end);
8520 	      fc->cfa_exp = 0;
8521 	      if (! do_debug_frames_interp)
8522 		printf ("  DW_CFA_def_cfa_register: %s\n",
8523 			regname (fc->cfa_reg, 0));
8524 	      break;
8525 
8526 	    case DW_CFA_def_cfa_offset:
8527 	      READ_ULEB (fc->cfa_offset, start, end);
8528 	      if (! do_debug_frames_interp)
8529 		printf ("  DW_CFA_def_cfa_offset: %d\n", (int) fc->cfa_offset);
8530 	      break;
8531 
8532 	    case DW_CFA_nop:
8533 	      if (! do_debug_frames_interp)
8534 		printf ("  DW_CFA_nop\n");
8535 	      break;
8536 
8537 	    case DW_CFA_def_cfa_expression:
8538 	      READ_ULEB (ul, start, end);
8539 	      if (start >= block_end || ul > (unsigned long) (block_end - start))
8540 		{
8541 		  printf (_("  DW_CFA_def_cfa_expression: <corrupt len %lu>\n"), ul);
8542 		  break;
8543 		}
8544 	      if (! do_debug_frames_interp)
8545 		{
8546 		  printf ("  DW_CFA_def_cfa_expression (");
8547 		  decode_location_expression (start, eh_addr_size, 0, -1,
8548 					      ul, 0, section);
8549 		  printf (")\n");
8550 		}
8551 	      fc->cfa_exp = 1;
8552 	      start += ul;
8553 	      break;
8554 
8555 	    case DW_CFA_expression:
8556 	      READ_ULEB (reg, start, end);
8557 	      READ_ULEB (ul, start, end);
8558 	      if (reg >= (unsigned int) fc->ncols)
8559 		reg_prefix = bad_reg;
8560 	      /* PR 17512: file: 069-133014-0.006.  */
8561 	      /* PR 17512: file: 98c02eb4.  */
8562 	      tmp = start + ul;
8563 	      if (start >= block_end || tmp > block_end || tmp < start)
8564 		{
8565 		  printf (_("  DW_CFA_expression: <corrupt len %lu>\n"), ul);
8566 		  break;
8567 		}
8568 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8569 		{
8570 		  printf ("  DW_CFA_expression: %s%s (",
8571 			  reg_prefix, regname (reg, 0));
8572 		  decode_location_expression (start, eh_addr_size, 0, -1,
8573 					      ul, 0, section);
8574 		  printf (")\n");
8575 		}
8576 	      if (*reg_prefix == '\0')
8577 		fc->col_type[reg] = DW_CFA_expression;
8578 	      start = tmp;
8579 	      break;
8580 
8581 	    case DW_CFA_val_expression:
8582 	      READ_ULEB (reg, start, end);
8583 	      READ_ULEB (ul, start, end);
8584 	      if (reg >= (unsigned int) fc->ncols)
8585 		reg_prefix = bad_reg;
8586 	      tmp = start + ul;
8587 	      if (start >= block_end || tmp > block_end || tmp < start)
8588 		{
8589 		  printf ("  DW_CFA_val_expression: <corrupt len %lu>\n", ul);
8590 		  break;
8591 		}
8592 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8593 		{
8594 		  printf ("  DW_CFA_val_expression: %s%s (",
8595 			  reg_prefix, regname (reg, 0));
8596 		  decode_location_expression (start, eh_addr_size, 0, -1,
8597 					      ul, 0, section);
8598 		  printf (")\n");
8599 		}
8600 	      if (*reg_prefix == '\0')
8601 		fc->col_type[reg] = DW_CFA_val_expression;
8602 	      start = tmp;
8603 	      break;
8604 
8605 	    case DW_CFA_offset_extended_sf:
8606 	      READ_ULEB (reg, start, end);
8607 	      READ_SLEB (l, start, end);
8608 	      if (frame_need_space (fc, reg) < 0)
8609 		reg_prefix = bad_reg;
8610 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8611 		printf ("  DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
8612 			reg_prefix, regname (reg, 0),
8613 			(long)(l * fc->data_factor));
8614 	      if (*reg_prefix == '\0')
8615 		{
8616 		  fc->col_type[reg] = DW_CFA_offset;
8617 		  fc->col_offset[reg] = l * fc->data_factor;
8618 		}
8619 	      break;
8620 
8621 	    case DW_CFA_val_offset_sf:
8622 	      READ_ULEB (reg, start, end);
8623 	      READ_SLEB (l, start, end);
8624 	      if (frame_need_space (fc, reg) < 0)
8625 		reg_prefix = bad_reg;
8626 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8627 		printf ("  DW_CFA_val_offset_sf: %s%s is cfa%+ld\n",
8628 			reg_prefix, regname (reg, 0),
8629 			(long)(l * fc->data_factor));
8630 	      if (*reg_prefix == '\0')
8631 		{
8632 		  fc->col_type[reg] = DW_CFA_val_offset;
8633 		  fc->col_offset[reg] = l * fc->data_factor;
8634 		}
8635 	      break;
8636 
8637 	    case DW_CFA_def_cfa_sf:
8638 	      READ_ULEB (fc->cfa_reg, start, end);
8639 	      READ_ULEB (fc->cfa_offset, start, end);
8640 	      fc->cfa_offset = fc->cfa_offset * fc->data_factor;
8641 	      fc->cfa_exp = 0;
8642 	      if (! do_debug_frames_interp)
8643 		printf ("  DW_CFA_def_cfa_sf: %s ofs %d\n",
8644 			regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
8645 	      break;
8646 
8647 	    case DW_CFA_def_cfa_offset_sf:
8648 	      READ_ULEB (fc->cfa_offset, start, end);
8649 	      fc->cfa_offset *= fc->data_factor;
8650 	      if (! do_debug_frames_interp)
8651 		printf ("  DW_CFA_def_cfa_offset_sf: %d\n", (int) fc->cfa_offset);
8652 	      break;
8653 
8654 	    case DW_CFA_MIPS_advance_loc8:
8655 	      SAFE_BYTE_GET_AND_INC (ofs, start, 8, block_end);
8656 	      if (do_debug_frames_interp)
8657 		frame_display_row (fc, &need_col_headers, &max_regs);
8658 	      else
8659 		printf ("  DW_CFA_MIPS_advance_loc8: %ld to %s\n",
8660 			(unsigned long) (ofs * fc->code_factor),
8661 			dwarf_vmatoa_1 (NULL,
8662 					fc->pc_begin + ofs * fc->code_factor,
8663 					fc->ptr_size));
8664 	      fc->pc_begin += ofs * fc->code_factor;
8665 	      break;
8666 
8667 	    case DW_CFA_GNU_window_save:
8668 	      if (! do_debug_frames_interp)
8669 		printf ("  DW_CFA_GNU_window_save\n");
8670 	      break;
8671 
8672 	    case DW_CFA_GNU_args_size:
8673 	      READ_ULEB (ul, start, end);
8674 	      if (! do_debug_frames_interp)
8675 		printf ("  DW_CFA_GNU_args_size: %ld\n", ul);
8676 	      break;
8677 
8678 	    case DW_CFA_GNU_negative_offset_extended:
8679 	      READ_ULEB (reg, start, end);
8680 	      READ_SLEB (l, start, end);
8681 	      l = - l;
8682 	      if (frame_need_space (fc, reg) < 0)
8683 		reg_prefix = bad_reg;
8684 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8685 		printf ("  DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
8686 			reg_prefix, regname (reg, 0),
8687 			(long)(l * fc->data_factor));
8688 	      if (*reg_prefix == '\0')
8689 		{
8690 		  fc->col_type[reg] = DW_CFA_offset;
8691 		  fc->col_offset[reg] = l * fc->data_factor;
8692 		}
8693 	      break;
8694 
8695 	    default:
8696 	      if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
8697 		printf (_("  DW_CFA_??? (User defined call frame op: %#x)\n"), op);
8698 	      else
8699 		warn (_("Unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
8700 	      start = block_end;
8701 	    }
8702 	}
8703 
8704       /* Interpret the CFA - as long as it is not completely full of NOPs.  */
8705       if (do_debug_frames_interp && ! all_nops)
8706 	frame_display_row (fc, &need_col_headers, &max_regs);
8707 
8708       if (fde_fc.col_type != NULL)
8709 	{
8710 	  free (fde_fc.col_type);
8711 	  fde_fc.col_type = NULL;
8712 	}
8713       if (fde_fc.col_offset != NULL)
8714 	{
8715 	  free (fde_fc.col_offset);
8716 	  fde_fc.col_offset = NULL;
8717 	}
8718 
8719       start = block_end;
8720       eh_addr_size = saved_eh_addr_size;
8721     }
8722 
8723   printf ("\n");
8724 
8725   while (remembered_state != NULL)
8726     {
8727       rs = remembered_state;
8728       remembered_state = rs->next;
8729       free (rs->col_type);
8730       free (rs->col_offset);
8731       rs->next = NULL; /* Paranoia.  */
8732       free (rs);
8733     }
8734 
8735   while (chunks != NULL)
8736     {
8737       rs = chunks;
8738       chunks = rs->next;
8739       free (rs->col_type);
8740       free (rs->col_offset);
8741       rs->next = NULL; /* Paranoia.  */
8742       free (rs);
8743     }
8744 
8745   while (forward_refs != NULL)
8746     {
8747       rs = forward_refs;
8748       forward_refs = rs->next;
8749       free (rs->col_type);
8750       free (rs->col_offset);
8751       rs->next = NULL; /* Paranoia.  */
8752       free (rs);
8753     }
8754 
8755   return 1;
8756 }
8757 
8758 #undef GET
8759 
8760 static int
8761 display_debug_names (struct dwarf_section *section, void *file)
8762 {
8763   unsigned char *hdrptr = section->start;
8764   dwarf_vma unit_length;
8765   unsigned char *unit_start;
8766   const unsigned char *const section_end = section->start + section->size;
8767   unsigned char *unit_end;
8768 
8769   introduce (section, FALSE);
8770 
8771   load_debug_section_with_follow (str, file);
8772 
8773   for (; hdrptr < section_end; hdrptr = unit_end)
8774     {
8775       unsigned int offset_size;
8776       uint16_t dwarf_version, padding;
8777       uint32_t comp_unit_count, local_type_unit_count, foreign_type_unit_count;
8778       uint32_t bucket_count, name_count, abbrev_table_size;
8779       uint32_t augmentation_string_size;
8780       unsigned int i;
8781       unsigned long sec_off;
8782       bfd_boolean augmentation_printable;
8783       const char *augmentation_string;
8784 
8785       unit_start = hdrptr;
8786 
8787       /* Get and check the length of the block.  */
8788       SAFE_BYTE_GET_AND_INC (unit_length, hdrptr, 4, section_end);
8789 
8790       if (unit_length == 0xffffffff)
8791 	{
8792 	  /* This section is 64-bit DWARF.  */
8793 	  SAFE_BYTE_GET_AND_INC (unit_length, hdrptr, 8, section_end);
8794 	  offset_size = 8;
8795 	}
8796       else
8797 	offset_size = 4;
8798       unit_end = hdrptr + unit_length;
8799 
8800       sec_off = hdrptr - section->start;
8801       if (sec_off + unit_length < sec_off
8802 	  || sec_off + unit_length > section->size)
8803 	{
8804 	  warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
8805 		section->name,
8806 		(unsigned long) (unit_start - section->start),
8807 		dwarf_vmatoa ("x", unit_length));
8808 	  return 0;
8809 	}
8810 
8811       /* Get and check the version number.  */
8812       SAFE_BYTE_GET_AND_INC (dwarf_version, hdrptr, 2, unit_end);
8813       printf (_("Version %ld\n"), (long) dwarf_version);
8814 
8815       /* Prior versions did not exist, and future versions may not be
8816 	 backwards compatible.  */
8817       if (dwarf_version != 5)
8818 	{
8819 	  warn (_("Only DWARF version 5 .debug_names "
8820 		  "is currently supported.\n"));
8821 	  return 0;
8822 	}
8823 
8824       SAFE_BYTE_GET_AND_INC (padding, hdrptr, 2, unit_end);
8825       if (padding != 0)
8826 	warn (_("Padding field of .debug_names must be 0 (found 0x%x)\n"),
8827 	      padding);
8828 
8829       SAFE_BYTE_GET_AND_INC (comp_unit_count, hdrptr, 4, unit_end);
8830       if (comp_unit_count == 0)
8831 	warn (_("Compilation unit count must be >= 1 in .debug_names\n"));
8832 
8833       SAFE_BYTE_GET_AND_INC (local_type_unit_count, hdrptr, 4, unit_end);
8834       SAFE_BYTE_GET_AND_INC (foreign_type_unit_count, hdrptr, 4, unit_end);
8835       SAFE_BYTE_GET_AND_INC (bucket_count, hdrptr, 4, unit_end);
8836       SAFE_BYTE_GET_AND_INC (name_count, hdrptr, 4, unit_end);
8837       SAFE_BYTE_GET_AND_INC (abbrev_table_size, hdrptr, 4, unit_end);
8838 
8839       SAFE_BYTE_GET_AND_INC (augmentation_string_size, hdrptr, 4, unit_end);
8840       if (augmentation_string_size % 4 != 0)
8841 	{
8842 	  warn (_("Augmentation string length %u must be rounded up "
8843 		  "to a multiple of 4 in .debug_names.\n"),
8844 		augmentation_string_size);
8845 	  augmentation_string_size += (-augmentation_string_size) & 3;
8846 	}
8847 
8848       printf (_("Augmentation string:"));
8849 
8850       augmentation_printable = TRUE;
8851       augmentation_string = (const char *) hdrptr;
8852 
8853       for (i = 0; i < augmentation_string_size; i++)
8854 	{
8855 	  unsigned char uc;
8856 
8857 	  SAFE_BYTE_GET_AND_INC (uc, hdrptr, 1, unit_end);
8858 	  printf (" %02x", uc);
8859 
8860 	  if (uc != 0 && !ISPRINT (uc))
8861 	    augmentation_printable = FALSE;
8862 	}
8863 
8864       if (augmentation_printable)
8865 	{
8866 	  printf ("  (\"");
8867 	  for (i = 0;
8868 	       i < augmentation_string_size && augmentation_string[i];
8869 	       ++i)
8870 	    putchar (augmentation_string[i]);
8871 	  printf ("\")");
8872 	}
8873       putchar ('\n');
8874 
8875       printf (_("CU table:\n"));
8876       for (i = 0; i < comp_unit_count; i++)
8877 	{
8878 	  uint64_t cu_offset;
8879 
8880 	  SAFE_BYTE_GET_AND_INC (cu_offset, hdrptr, offset_size, unit_end);
8881 	  printf (_("[%3u] 0x%lx\n"), i, (unsigned long) cu_offset);
8882 	}
8883       putchar ('\n');
8884 
8885       printf (_("TU table:\n"));
8886       for (i = 0; i < local_type_unit_count; i++)
8887 	{
8888 	  uint64_t tu_offset;
8889 
8890 	  SAFE_BYTE_GET_AND_INC (tu_offset, hdrptr, offset_size, unit_end);
8891 	  printf (_("[%3u] 0x%lx\n"), i, (unsigned long) tu_offset);
8892 	}
8893       putchar ('\n');
8894 
8895       printf (_("Foreign TU table:\n"));
8896       for (i = 0; i < foreign_type_unit_count; i++)
8897 	{
8898 	  uint64_t signature;
8899 
8900 	  SAFE_BYTE_GET_AND_INC (signature, hdrptr, 8, unit_end);
8901 	  printf (_("[%3u] "), i);
8902 	  print_dwarf_vma (signature, 8);
8903 	  putchar ('\n');
8904 	}
8905       putchar ('\n');
8906 
8907       const uint32_t *const hash_table_buckets = (uint32_t *) hdrptr;
8908       hdrptr += bucket_count * sizeof (uint32_t);
8909       const uint32_t *const hash_table_hashes = (uint32_t *) hdrptr;
8910       hdrptr += name_count * sizeof (uint32_t);
8911       unsigned char *const name_table_string_offsets = hdrptr;
8912       hdrptr += name_count * offset_size;
8913       unsigned char *const name_table_entry_offsets = hdrptr;
8914       hdrptr += name_count * offset_size;
8915       unsigned char *const abbrev_table = hdrptr;
8916       hdrptr += abbrev_table_size;
8917       const unsigned char *const abbrev_table_end = hdrptr;
8918       unsigned char *const entry_pool = hdrptr;
8919       if (hdrptr > unit_end)
8920 	{
8921 	  warn (_("Entry pool offset (0x%lx) exceeds unit size 0x%lx "
8922 		  "for unit 0x%lx in the debug_names\n"),
8923 		(long) (hdrptr - section->start),
8924 		(long) (unit_end - section->start),
8925 		(long) (unit_start - section->start));
8926 	  return 0;
8927 	}
8928 
8929       size_t buckets_filled = 0;
8930       size_t bucketi;
8931       for (bucketi = 0; bucketi < bucket_count; bucketi++)
8932 	{
8933 	  const uint32_t bucket = hash_table_buckets[bucketi];
8934 
8935 	  if (bucket != 0)
8936 	    ++buckets_filled;
8937 	}
8938       printf (ngettext ("Used %zu of %lu bucket.\n",
8939 			"Used %zu of %lu buckets.\n",
8940 			bucket_count),
8941 	      buckets_filled, (unsigned long) bucket_count);
8942 
8943       uint32_t hash_prev = 0;
8944       size_t hash_clash_count = 0;
8945       size_t longest_clash = 0;
8946       size_t this_length = 0;
8947       size_t hashi;
8948       for (hashi = 0; hashi < name_count; hashi++)
8949 	{
8950 	  const uint32_t hash_this = hash_table_hashes[hashi];
8951 
8952 	  if (hashi > 0)
8953 	    {
8954 	      if (hash_prev % bucket_count == hash_this % bucket_count)
8955 		{
8956 		  ++hash_clash_count;
8957 		  ++this_length;
8958 		  longest_clash = MAX (longest_clash, this_length);
8959 		}
8960 	      else
8961 		this_length = 0;
8962 	    }
8963 	  hash_prev = hash_this;
8964 	}
8965       printf (_("Out of %lu items there are %zu bucket clashes"
8966 		" (longest of %zu entries).\n"),
8967 	      (unsigned long) name_count, hash_clash_count, longest_clash);
8968       assert (name_count == buckets_filled + hash_clash_count);
8969 
8970       struct abbrev_lookup_entry
8971       {
8972 	dwarf_vma abbrev_tag;
8973 	unsigned char *abbrev_lookup_ptr;
8974       };
8975       struct abbrev_lookup_entry *abbrev_lookup = NULL;
8976       size_t abbrev_lookup_used = 0;
8977       size_t abbrev_lookup_allocated = 0;
8978 
8979       unsigned char *abbrevptr = abbrev_table;
8980       for (;;)
8981 	{
8982 	  dwarf_vma abbrev_tag;
8983 
8984 	  READ_ULEB (abbrev_tag, abbrevptr, abbrev_table_end);
8985 	  if (abbrev_tag == 0)
8986 	    break;
8987 	  if (abbrev_lookup_used == abbrev_lookup_allocated)
8988 	    {
8989 	      abbrev_lookup_allocated = MAX (0x100,
8990 					     abbrev_lookup_allocated * 2);
8991 	      abbrev_lookup = xrealloc (abbrev_lookup,
8992 					(abbrev_lookup_allocated
8993 					 * sizeof (*abbrev_lookup)));
8994 	    }
8995 	  assert (abbrev_lookup_used < abbrev_lookup_allocated);
8996 	  struct abbrev_lookup_entry *entry;
8997 	  for (entry = abbrev_lookup;
8998 	       entry < abbrev_lookup + abbrev_lookup_used;
8999 	       entry++)
9000 	    if (entry->abbrev_tag == abbrev_tag)
9001 	      {
9002 		warn (_("Duplicate abbreviation tag %lu "
9003 			"in unit 0x%lx in the debug_names\n"),
9004 		      (long) abbrev_tag, (long) (unit_start - section->start));
9005 		break;
9006 	      }
9007 	  entry = &abbrev_lookup[abbrev_lookup_used++];
9008 	  entry->abbrev_tag = abbrev_tag;
9009 	  entry->abbrev_lookup_ptr = abbrevptr;
9010 
9011 	  /* Skip DWARF tag.  */
9012 	  SKIP_ULEB (abbrevptr, abbrev_table_end);
9013 	  for (;;)
9014 	    {
9015 	      dwarf_vma xindex, form;
9016 
9017 	      READ_ULEB (xindex, abbrevptr, abbrev_table_end);
9018 	      READ_ULEB (form, abbrevptr, abbrev_table_end);
9019 	      if (xindex == 0 && form == 0)
9020 		break;
9021 	    }
9022 	}
9023 
9024       printf (_("\nSymbol table:\n"));
9025       uint32_t namei;
9026       for (namei = 0; namei < name_count; ++namei)
9027 	{
9028 	  uint64_t string_offset, entry_offset;
9029 
9030 	  SAFE_BYTE_GET (string_offset,
9031 			 name_table_string_offsets + namei * offset_size,
9032 			 offset_size, unit_end);
9033 	  SAFE_BYTE_GET (entry_offset,
9034 			 name_table_entry_offsets + namei * offset_size,
9035 			 offset_size, unit_end);
9036 
9037 	  printf ("[%3u] #%08x %s:", namei, hash_table_hashes[namei],
9038 		  fetch_indirect_string (string_offset));
9039 
9040 	  unsigned char *entryptr = entry_pool + entry_offset;
9041 
9042 	  // We need to scan first whether there is a single or multiple
9043 	  // entries.  TAGNO is -2 for the first entry, it is -1 for the
9044 	  // initial tag read of the second entry, then it becomes 0 for the
9045 	  // first entry for real printing etc.
9046 	  int tagno = -2;
9047 	  /* Initialize it due to a false compiler warning.  */
9048 	  dwarf_vma second_abbrev_tag = -1;
9049 	  for (;;)
9050 	    {
9051 	      dwarf_vma abbrev_tag;
9052 	      dwarf_vma dwarf_tag;
9053 	      const struct abbrev_lookup_entry *entry;
9054 
9055 	      READ_ULEB (abbrev_tag, entryptr, unit_end);
9056 	      if (tagno == -1)
9057 		{
9058 		  second_abbrev_tag = abbrev_tag;
9059 		  tagno = 0;
9060 		  entryptr = entry_pool + entry_offset;
9061 		  continue;
9062 		}
9063 	      if (abbrev_tag == 0)
9064 		break;
9065 	      if (tagno >= 0)
9066 		printf ("%s<%lu>",
9067 		        (tagno == 0 && second_abbrev_tag == 0 ? " " : "\n\t"),
9068 			(unsigned long) abbrev_tag);
9069 
9070 	      for (entry = abbrev_lookup;
9071 		   entry < abbrev_lookup + abbrev_lookup_used;
9072 		   entry++)
9073 		if (entry->abbrev_tag == abbrev_tag)
9074 		  break;
9075 	      if (entry >= abbrev_lookup + abbrev_lookup_used)
9076 		{
9077 		  warn (_("Undefined abbreviation tag %lu "
9078 			  "in unit 0x%lx in the debug_names\n"),
9079 			(long) abbrev_tag,
9080 			(long) (unit_start - section->start));
9081 		  break;
9082 		}
9083 	      abbrevptr = entry->abbrev_lookup_ptr;
9084 	      READ_ULEB (dwarf_tag, abbrevptr, abbrev_table_end);
9085 	      if (tagno >= 0)
9086 		printf (" %s", get_TAG_name (dwarf_tag));
9087 	      for (;;)
9088 		{
9089 		  dwarf_vma xindex, form;
9090 
9091 		  READ_ULEB (xindex, abbrevptr, abbrev_table_end);
9092 		  READ_ULEB (form, abbrevptr, abbrev_table_end);
9093 		  if (xindex == 0 && form == 0)
9094 		    break;
9095 
9096 		  if (tagno >= 0)
9097 		    printf (" %s", get_IDX_name (xindex));
9098 		  entryptr = read_and_display_attr_value (0, form, 0,
9099 							  unit_start, entryptr, unit_end,
9100 							  0, 0, offset_size,
9101 							  dwarf_version, NULL,
9102 							  (tagno < 0), NULL,
9103 							  NULL, '=', -1);
9104 		}
9105 	      ++tagno;
9106 	    }
9107 	  if (tagno <= 0)
9108 	    printf (_(" <no entries>"));
9109 	  putchar ('\n');
9110 	}
9111 
9112       free (abbrev_lookup);
9113     }
9114 
9115   return 1;
9116 }
9117 
9118 static int
9119 display_debug_links (struct dwarf_section *  section,
9120 		     void *                  file ATTRIBUTE_UNUSED)
9121 {
9122   const unsigned char * filename;
9123   unsigned int          filelen;
9124 
9125   introduce (section, FALSE);
9126 
9127   /* The .gnu_debuglink section is formatted as:
9128       (c-string)  Filename.
9129       (padding)   If needed to reach a 4 byte boundary.
9130       (uint32_t)  CRC32 value.
9131 
9132     The .gun_debugaltlink section is formatted as:
9133       (c-string)  Filename.
9134       (binary)    Build-ID.  */
9135 
9136   filename =  section->start;
9137   filelen = strnlen ((const char *) filename, section->size);
9138   if (filelen == section->size)
9139     {
9140       warn (_("The debuglink filename is corrupt/missing\n"));
9141       return 0;
9142     }
9143 
9144   printf (_("  Separate debug info file: %s\n"), filename);
9145 
9146   if (const_strneq (section->name, ".gnu_debuglink"))
9147     {
9148       unsigned int          crc32;
9149       unsigned int          crc_offset;
9150 
9151       crc_offset = filelen + 1;
9152       crc_offset = (crc_offset + 3) & ~3;
9153       if (crc_offset + 4 > section->size)
9154 	{
9155 	  warn (_("CRC offset missing/truncated\n"));
9156 	  return 0;
9157 	}
9158 
9159       crc32 = byte_get (filename + crc_offset, 4);
9160 
9161       printf (_("  CRC value: %#x\n"), crc32);
9162 
9163       if (crc_offset + 4 < section->size)
9164 	{
9165 	  warn (_("There are %#lx extraneous bytes at the end of the section\n"),
9166 		(long)(section->size - (crc_offset + 4)));
9167 	  return 0;
9168 	}
9169     }
9170   else /* const_strneq (section->name, ".gnu_debugaltlink") */
9171     {
9172       const unsigned char * build_id = section->start + filelen + 1;
9173       bfd_size_type         build_id_len = section->size - (filelen + 1);
9174       bfd_size_type         printed;
9175 
9176       /* FIXME: Should we support smaller build-id notes ?  */
9177       if (build_id_len < 0x14)
9178 	{
9179 	  warn (_("Build-ID is too short (%#lx bytes)\n"), (long) build_id_len);
9180 	  return 0;
9181 	}
9182 
9183       printed = printf (_("  Build-ID (%#lx bytes):"), (long) build_id_len);
9184       display_data (printed, build_id, build_id_len);
9185       putchar ('\n');
9186     }
9187 
9188   putchar ('\n');
9189   return 1;
9190 }
9191 
9192 static int
9193 display_gdb_index (struct dwarf_section *section,
9194 		   void *file ATTRIBUTE_UNUSED)
9195 {
9196   unsigned char *start = section->start;
9197   uint32_t version;
9198   uint32_t cu_list_offset, tu_list_offset;
9199   uint32_t address_table_offset, symbol_table_offset, constant_pool_offset;
9200   unsigned int cu_list_elements, tu_list_elements;
9201   unsigned int address_table_size, symbol_table_slots;
9202   unsigned char *cu_list, *tu_list;
9203   unsigned char *address_table, *symbol_table, *constant_pool;
9204   unsigned int i;
9205 
9206   /* The documentation for the format of this file is in gdb/dwarf2read.c.  */
9207 
9208   introduce (section, FALSE);
9209 
9210   if (section->size < 6 * sizeof (uint32_t))
9211     {
9212       warn (_("Truncated header in the %s section.\n"), section->name);
9213       return 0;
9214     }
9215 
9216   version = byte_get_little_endian (start, 4);
9217   printf (_("Version %ld\n"), (long) version);
9218 
9219   /* Prior versions are obsolete, and future versions may not be
9220      backwards compatible.  */
9221   if (version < 3 || version > 8)
9222     {
9223       warn (_("Unsupported version %lu.\n"), (unsigned long) version);
9224       return 0;
9225     }
9226   if (version < 4)
9227     warn (_("The address table data in version 3 may be wrong.\n"));
9228   if (version < 5)
9229     warn (_("Version 4 does not support case insensitive lookups.\n"));
9230   if (version < 6)
9231     warn (_("Version 5 does not include inlined functions.\n"));
9232   if (version < 7)
9233       warn (_("Version 6 does not include symbol attributes.\n"));
9234   /* Version 7 indices generated by Gold have bad type unit references,
9235      PR binutils/15021.  But we don't know if the index was generated by
9236      Gold or not, so to avoid worrying users with gdb-generated indices
9237      we say nothing for version 7 here.  */
9238 
9239   cu_list_offset = byte_get_little_endian (start + 4, 4);
9240   tu_list_offset = byte_get_little_endian (start + 8, 4);
9241   address_table_offset = byte_get_little_endian (start + 12, 4);
9242   symbol_table_offset = byte_get_little_endian (start + 16, 4);
9243   constant_pool_offset = byte_get_little_endian (start + 20, 4);
9244 
9245   if (cu_list_offset > section->size
9246       || tu_list_offset > section->size
9247       || address_table_offset > section->size
9248       || symbol_table_offset > section->size
9249       || constant_pool_offset > section->size)
9250     {
9251       warn (_("Corrupt header in the %s section.\n"), section->name);
9252       return 0;
9253     }
9254 
9255   /* PR 17531: file: 418d0a8a.  */
9256   if (tu_list_offset < cu_list_offset)
9257     {
9258       warn (_("TU offset (%x) is less than CU offset (%x)\n"),
9259 	    tu_list_offset, cu_list_offset);
9260       return 0;
9261     }
9262 
9263   cu_list_elements = (tu_list_offset - cu_list_offset) / 8;
9264 
9265   if (address_table_offset < tu_list_offset)
9266     {
9267       warn (_("Address table offset (%x) is less than TU offset (%x)\n"),
9268 	    address_table_offset, tu_list_offset);
9269       return 0;
9270     }
9271 
9272   tu_list_elements = (address_table_offset - tu_list_offset) / 8;
9273 
9274   /* PR 17531: file: 18a47d3d.  */
9275   if (symbol_table_offset < address_table_offset)
9276     {
9277       warn (_("Symbol table offset (%x) is less then Address table offset (%x)\n"),
9278 	    symbol_table_offset, address_table_offset);
9279       return 0;
9280     }
9281 
9282   address_table_size = symbol_table_offset - address_table_offset;
9283 
9284   if (constant_pool_offset < symbol_table_offset)
9285     {
9286       warn (_("Constant pool offset (%x) is less than symbol table offset (%x)\n"),
9287 	    constant_pool_offset, symbol_table_offset);
9288       return 0;
9289     }
9290 
9291   symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8;
9292 
9293   cu_list = start + cu_list_offset;
9294   tu_list = start + tu_list_offset;
9295   address_table = start + address_table_offset;
9296   symbol_table = start + symbol_table_offset;
9297   constant_pool = start + constant_pool_offset;
9298 
9299   if (address_table + address_table_size > section->start + section->size)
9300     {
9301       warn (_("Address table extends beyond end of section.\n"));
9302       return 0;
9303     }
9304 
9305   printf (_("\nCU table:\n"));
9306   for (i = 0; i < cu_list_elements; i += 2)
9307     {
9308       uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8);
9309       uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8);
9310 
9311       printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2,
9312 	      (unsigned long) cu_offset,
9313 	      (unsigned long) (cu_offset + cu_length - 1));
9314     }
9315 
9316   printf (_("\nTU table:\n"));
9317   for (i = 0; i < tu_list_elements; i += 3)
9318     {
9319       uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8);
9320       uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8);
9321       uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8);
9322 
9323       printf (_("[%3u] 0x%lx 0x%lx "), i / 3,
9324 	      (unsigned long) tu_offset,
9325 	      (unsigned long) type_offset);
9326       print_dwarf_vma (signature, 8);
9327       printf ("\n");
9328     }
9329 
9330   printf (_("\nAddress table:\n"));
9331   for (i = 0; i < address_table_size && i <= address_table_size - (2 * 8 + 4);
9332        i += 2 * 8 + 4)
9333     {
9334       uint64_t low = byte_get_little_endian (address_table + i, 8);
9335       uint64_t high = byte_get_little_endian (address_table + i + 8, 8);
9336       uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4);
9337 
9338       print_dwarf_vma (low, 8);
9339       print_dwarf_vma (high, 8);
9340       printf (_("%lu\n"), (unsigned long) cu_index);
9341     }
9342 
9343   printf (_("\nSymbol table:\n"));
9344   for (i = 0; i < symbol_table_slots; ++i)
9345     {
9346       uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4);
9347       uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4);
9348       uint32_t num_cus, cu;
9349 
9350       if (name_offset != 0
9351 	  || cu_vector_offset != 0)
9352 	{
9353 	  unsigned int j;
9354 	  unsigned char * adr;
9355 
9356 	  adr = constant_pool + name_offset;
9357 	  /* PR 17531: file: 5b7b07ad.  */
9358 	  if (adr < constant_pool || adr >= section->start + section->size)
9359 	    {
9360 	      printf (_("[%3u] <corrupt offset: %x>"), i, name_offset);
9361 	      warn (_("Corrupt name offset of 0x%x found for symbol table slot %d\n"),
9362 		    name_offset, i);
9363 	    }
9364 	  else
9365 	    printf ("[%3u] %.*s:", i,
9366 		    (int) (section->size - (constant_pool_offset + name_offset)),
9367 		    constant_pool + name_offset);
9368 
9369 	  adr = constant_pool + cu_vector_offset;
9370 	  if (adr < constant_pool || adr >= section->start + section->size - 3)
9371 	    {
9372 	      printf (_("<invalid CU vector offset: %x>\n"), cu_vector_offset);
9373 	      warn (_("Corrupt CU vector offset of 0x%x found for symbol table slot %d\n"),
9374 		    cu_vector_offset, i);
9375 	      continue;
9376 	    }
9377 
9378 	  num_cus = byte_get_little_endian (adr, 4);
9379 
9380 	  adr = constant_pool + cu_vector_offset + 4 + num_cus * 4;
9381 	  if (num_cus * 4 < num_cus
9382 	      || adr >= section->start + section->size
9383 	      || adr < constant_pool)
9384 	    {
9385 	      printf ("<invalid number of CUs: %d>\n", num_cus);
9386 	      warn (_("Invalid number of CUs (0x%x) for symbol table slot %d\n"),
9387 		    num_cus, i);
9388 	      continue;
9389 	    }
9390 
9391 	  if (num_cus > 1)
9392 	    printf ("\n");
9393 
9394 	  for (j = 0; j < num_cus; ++j)
9395 	    {
9396 	      int is_static;
9397 	      gdb_index_symbol_kind kind;
9398 
9399 	      cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4);
9400 	      is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu);
9401 	      kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu);
9402 	      cu = GDB_INDEX_CU_VALUE (cu);
9403 	      /* Convert to TU number if it's for a type unit.  */
9404 	      if (cu >= cu_list_elements / 2)
9405 		printf ("%cT%lu", num_cus > 1 ? '\t' : ' ',
9406 			(unsigned long) (cu - cu_list_elements / 2));
9407 	      else
9408 		printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu);
9409 
9410 	      printf (" [%s, %s]",
9411 		      is_static ? _("static") : _("global"),
9412 		      get_gdb_index_symbol_kind_name (kind));
9413 	      if (num_cus > 1)
9414 		printf ("\n");
9415 	    }
9416 	  if (num_cus <= 1)
9417 	    printf ("\n");
9418 	}
9419     }
9420 
9421   return 1;
9422 }
9423 
9424 /* Pre-allocate enough space for the CU/TU sets needed.  */
9425 
9426 static void
9427 prealloc_cu_tu_list (unsigned int nshndx)
9428 {
9429   if (shndx_pool == NULL)
9430     {
9431       shndx_pool_size = nshndx;
9432       shndx_pool_used = 0;
9433       shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size,
9434 					      sizeof (unsigned int));
9435     }
9436   else
9437     {
9438       shndx_pool_size = shndx_pool_used + nshndx;
9439       shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size,
9440 					       sizeof (unsigned int));
9441     }
9442 }
9443 
9444 static void
9445 add_shndx_to_cu_tu_entry (unsigned int shndx)
9446 {
9447   if (shndx_pool_used >= shndx_pool_size)
9448     {
9449       error (_("Internal error: out of space in the shndx pool.\n"));
9450       return;
9451     }
9452   shndx_pool [shndx_pool_used++] = shndx;
9453 }
9454 
9455 static void
9456 end_cu_tu_entry (void)
9457 {
9458   if (shndx_pool_used >= shndx_pool_size)
9459     {
9460       error (_("Internal error: out of space in the shndx pool.\n"));
9461       return;
9462     }
9463   shndx_pool [shndx_pool_used++] = 0;
9464 }
9465 
9466 /* Return the short name of a DWARF section given by a DW_SECT enumerator.  */
9467 
9468 static const char *
9469 get_DW_SECT_short_name (unsigned int dw_sect)
9470 {
9471   static char buf[16];
9472 
9473   switch (dw_sect)
9474     {
9475       case DW_SECT_INFO:
9476 	return "info";
9477       case DW_SECT_TYPES:
9478 	return "types";
9479       case DW_SECT_ABBREV:
9480 	return "abbrev";
9481       case DW_SECT_LINE:
9482 	return "line";
9483       case DW_SECT_LOC:
9484 	return "loc";
9485       case DW_SECT_STR_OFFSETS:
9486 	return "str_off";
9487       case DW_SECT_MACINFO:
9488 	return "macinfo";
9489       case DW_SECT_MACRO:
9490 	return "macro";
9491       default:
9492 	break;
9493     }
9494 
9495   snprintf (buf, sizeof (buf), "%d", dw_sect);
9496   return buf;
9497 }
9498 
9499 /* Process a CU or TU index.  If DO_DISPLAY is true, print the contents.
9500    These sections are extensions for Fission.
9501    See http://gcc.gnu.org/wiki/DebugFissionDWP.  */
9502 
9503 static int
9504 process_cu_tu_index (struct dwarf_section *section, int do_display)
9505 {
9506   unsigned char *phdr = section->start;
9507   unsigned char *limit = phdr + section->size;
9508   unsigned char *phash;
9509   unsigned char *pindex;
9510   unsigned char *ppool;
9511   unsigned int version;
9512   unsigned int ncols = 0;
9513   unsigned int nused;
9514   unsigned int nslots;
9515   unsigned int i;
9516   unsigned int j;
9517   dwarf_vma signature_high;
9518   dwarf_vma signature_low;
9519   char buf[64];
9520 
9521   /* PR 17512: file: 002-168123-0.004.  */
9522   if (phdr == NULL)
9523     {
9524       warn (_("Section %s is empty\n"), section->name);
9525       return 0;
9526     }
9527   /* PR 17512: file: 002-376-0.004.  */
9528   if (section->size < 24)
9529     {
9530       warn (_("Section %s is too small to contain a CU/TU header\n"),
9531 	    section->name);
9532       return 0;
9533     }
9534 
9535   SAFE_BYTE_GET (version, phdr, 4, limit);
9536   if (version >= 2)
9537     SAFE_BYTE_GET (ncols, phdr + 4, 4, limit);
9538   SAFE_BYTE_GET (nused, phdr + 8, 4, limit);
9539   SAFE_BYTE_GET (nslots, phdr + 12, 4, limit);
9540 
9541   phash = phdr + 16;
9542   pindex = phash + (size_t) nslots * 8;
9543   ppool = pindex + (size_t) nslots * 4;
9544 
9545   if (do_display)
9546     {
9547       introduce (section, FALSE);
9548 
9549       printf (_("  Version:                 %u\n"), version);
9550       if (version >= 2)
9551 	printf (_("  Number of columns:       %u\n"), ncols);
9552       printf (_("  Number of used entries:  %u\n"), nused);
9553       printf (_("  Number of slots:         %u\n\n"), nslots);
9554     }
9555 
9556   /* PR 17531: file: 45d69832.  */
9557   if ((size_t) nslots * 8 / 8 != nslots
9558       || phash < phdr || phash > limit
9559       || pindex < phash || pindex > limit
9560       || ppool < pindex || ppool > limit)
9561     {
9562       warn (ngettext ("Section %s is too small for %u slot\n",
9563 		      "Section %s is too small for %u slots\n",
9564 		      nslots),
9565 	    section->name, nslots);
9566       return 0;
9567     }
9568 
9569   if (version == 1)
9570     {
9571       if (!do_display)
9572 	prealloc_cu_tu_list ((limit - ppool) / 4);
9573       for (i = 0; i < nslots; i++)
9574 	{
9575 	  unsigned char *shndx_list;
9576 	  unsigned int shndx;
9577 
9578 	  SAFE_BYTE_GET64 (phash, &signature_high, &signature_low, limit);
9579 	  if (signature_high != 0 || signature_low != 0)
9580 	    {
9581 	      SAFE_BYTE_GET (j, pindex, 4, limit);
9582 	      shndx_list = ppool + j * 4;
9583 	      /* PR 17531: file: 705e010d.  */
9584 	      if (shndx_list < ppool)
9585 		{
9586 		  warn (_("Section index pool located before start of section\n"));
9587 		  return 0;
9588 		}
9589 
9590 	      if (do_display)
9591 		printf (_("  [%3d] Signature:  0x%s  Sections: "),
9592 			i, dwarf_vmatoa64 (signature_high, signature_low,
9593 					   buf, sizeof (buf)));
9594 	      for (;;)
9595 		{
9596 		  if (shndx_list >= limit)
9597 		    {
9598 		      warn (_("Section %s too small for shndx pool\n"),
9599 			    section->name);
9600 		      return 0;
9601 		    }
9602 		  SAFE_BYTE_GET (shndx, shndx_list, 4, limit);
9603 		  if (shndx == 0)
9604 		    break;
9605 		  if (do_display)
9606 		    printf (" %d", shndx);
9607 		  else
9608 		    add_shndx_to_cu_tu_entry (shndx);
9609 		  shndx_list += 4;
9610 		}
9611 	      if (do_display)
9612 		printf ("\n");
9613 	      else
9614 		end_cu_tu_entry ();
9615 	    }
9616 	  phash += 8;
9617 	  pindex += 4;
9618 	}
9619     }
9620   else if (version == 2)
9621     {
9622       unsigned int val;
9623       unsigned int dw_sect;
9624       unsigned char *ph = phash;
9625       unsigned char *pi = pindex;
9626       unsigned char *poffsets = ppool + (size_t) ncols * 4;
9627       unsigned char *psizes = poffsets + (size_t) nused * ncols * 4;
9628       unsigned char *pend = psizes + (size_t) nused * ncols * 4;
9629       bfd_boolean is_tu_index;
9630       struct cu_tu_set *this_set = NULL;
9631       unsigned int row;
9632       unsigned char *prow;
9633 
9634       is_tu_index = strcmp (section->name, ".debug_tu_index") == 0;
9635 
9636       /* PR 17531: file: 0dd159bf.
9637 	 Check for integer overflow (can occur when size_t is 32-bit)
9638 	 with overlarge ncols or nused values.  */
9639       if (ncols > 0
9640 	  && ((size_t) ncols * 4 / 4 != ncols
9641 	      || (size_t) nused * ncols * 4 / ((size_t) ncols * 4) != nused
9642 	      || poffsets < ppool || poffsets > limit
9643 	      || psizes < poffsets || psizes > limit
9644 	      || pend < psizes || pend > limit))
9645 	{
9646 	  warn (_("Section %s too small for offset and size tables\n"),
9647 		section->name);
9648 	  return 0;
9649 	}
9650 
9651       if (do_display)
9652 	{
9653 	  printf (_("  Offset table\n"));
9654 	  printf ("  slot  %-16s  ",
9655 		 is_tu_index ? _("signature") : _("dwo_id"));
9656 	}
9657       else
9658 	{
9659 	  if (is_tu_index)
9660 	    {
9661 	      tu_count = nused;
9662 	      tu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
9663 	      this_set = tu_sets;
9664 	    }
9665 	  else
9666 	    {
9667 	      cu_count = nused;
9668 	      cu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
9669 	      this_set = cu_sets;
9670 	    }
9671 	}
9672 
9673       if (do_display)
9674 	{
9675 	  for (j = 0; j < ncols; j++)
9676 	    {
9677 	      SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
9678 	      printf (" %8s", get_DW_SECT_short_name (dw_sect));
9679 	    }
9680 	  printf ("\n");
9681 	}
9682 
9683       for (i = 0; i < nslots; i++)
9684 	{
9685 	  SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
9686 
9687 	  SAFE_BYTE_GET (row, pi, 4, limit);
9688 	  if (row != 0)
9689 	    {
9690 	      /* PR 17531: file: a05f6ab3.  */
9691 	      if (row > nused)
9692 		{
9693 		  warn (_("Row index (%u) is larger than number of used entries (%u)\n"),
9694 			row, nused);
9695 		  return 0;
9696 		}
9697 
9698 	      if (!do_display)
9699 		{
9700 		  size_t num_copy = sizeof (uint64_t);
9701 
9702 		  /* PR 23064: Beware of buffer overflow.  */
9703 		  if (ph + num_copy < limit)
9704 		    memcpy (&this_set[row - 1].signature, ph, num_copy);
9705 		  else
9706 		    {
9707 		      warn (_("Signature (%p) extends beyond end of space in section\n"), ph);
9708 		      return 0;
9709 		    }
9710 		}
9711 
9712 	      prow = poffsets + (row - 1) * ncols * 4;
9713 	      /* PR 17531: file: b8ce60a8.  */
9714 	      if (prow < poffsets || prow > limit)
9715 		{
9716 		  warn (_("Row index (%u) * num columns (%u) > space remaining in section\n"),
9717 			row, ncols);
9718 		  return 0;
9719 		}
9720 
9721 	      if (do_display)
9722 		printf (_("  [%3d] 0x%s"),
9723 			i, dwarf_vmatoa64 (signature_high, signature_low,
9724 					   buf, sizeof (buf)));
9725 	      for (j = 0; j < ncols; j++)
9726 		{
9727 		  SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
9728 		  if (do_display)
9729 		    printf (" %8d", val);
9730 		  else
9731 		    {
9732 		      SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
9733 
9734 		      /* PR 17531: file: 10796eb3.  */
9735 		      if (dw_sect >= DW_SECT_MAX)
9736 			warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
9737 		      else
9738 			this_set [row - 1].section_offsets [dw_sect] = val;
9739 		    }
9740 		}
9741 
9742 	      if (do_display)
9743 		printf ("\n");
9744 	    }
9745 	  ph += 8;
9746 	  pi += 4;
9747 	}
9748 
9749       ph = phash;
9750       pi = pindex;
9751       if (do_display)
9752 	{
9753 	  printf ("\n");
9754 	  printf (_("  Size table\n"));
9755 	  printf ("  slot  %-16s  ",
9756 		 is_tu_index ? _("signature") : _("dwo_id"));
9757 	}
9758 
9759       for (j = 0; j < ncols; j++)
9760 	{
9761 	  SAFE_BYTE_GET (val, ppool + j * 4, 4, limit);
9762 	  if (do_display)
9763 	    printf (" %8s", get_DW_SECT_short_name (val));
9764 	}
9765 
9766       if (do_display)
9767 	printf ("\n");
9768 
9769       for (i = 0; i < nslots; i++)
9770 	{
9771 	  SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
9772 
9773 	  SAFE_BYTE_GET (row, pi, 4, limit);
9774 	  if (row != 0)
9775 	    {
9776 	      prow = psizes + (row - 1) * ncols * 4;
9777 
9778 	      if (do_display)
9779 		printf (_("  [%3d] 0x%s"),
9780 			i, dwarf_vmatoa64 (signature_high, signature_low,
9781 					   buf, sizeof (buf)));
9782 
9783 	      for (j = 0; j < ncols; j++)
9784 		{
9785 		  SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
9786 		  if (do_display)
9787 		    printf (" %8d", val);
9788 		  else
9789 		    {
9790 		      SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
9791 		      if (dw_sect >= DW_SECT_MAX)
9792 			warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
9793 		      else
9794 		      this_set [row - 1].section_sizes [dw_sect] = val;
9795 		    }
9796 		}
9797 
9798 	      if (do_display)
9799 		printf ("\n");
9800 	    }
9801 
9802 	  ph += 8;
9803 	  pi += 4;
9804 	}
9805     }
9806   else if (do_display)
9807     printf (_("  Unsupported version (%d)\n"), version);
9808 
9809   if (do_display)
9810       printf ("\n");
9811 
9812   return 1;
9813 }
9814 
9815 /* Load the CU and TU indexes if present.  This will build a list of
9816    section sets that we can use to associate a .debug_info.dwo section
9817    with its associated .debug_abbrev.dwo section in a .dwp file.  */
9818 
9819 static bfd_boolean
9820 load_cu_tu_indexes (void *file)
9821 {
9822   static int cu_tu_indexes_read = -1; /* Tri-state variable.  */
9823 
9824   /* If we have already loaded (or tried to load) the CU and TU indexes
9825      then do not bother to repeat the task.  */
9826   if (cu_tu_indexes_read == -1)
9827     {
9828       cu_tu_indexes_read = TRUE;
9829 
9830       if (load_debug_section_with_follow (dwp_cu_index, file))
9831 	if (! process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0))
9832 	  cu_tu_indexes_read = FALSE;
9833 
9834       if (load_debug_section_with_follow (dwp_tu_index, file))
9835 	if (! process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0))
9836 	  cu_tu_indexes_read = FALSE;
9837     }
9838 
9839   return (bfd_boolean) cu_tu_indexes_read;
9840 }
9841 
9842 /* Find the set of sections that includes section SHNDX.  */
9843 
9844 unsigned int *
9845 find_cu_tu_set (void *file, unsigned int shndx)
9846 {
9847   unsigned int i;
9848 
9849   if (! load_cu_tu_indexes (file))
9850     return NULL;
9851 
9852   /* Find SHNDX in the shndx pool.  */
9853   for (i = 0; i < shndx_pool_used; i++)
9854     if (shndx_pool [i] == shndx)
9855       break;
9856 
9857   if (i >= shndx_pool_used)
9858     return NULL;
9859 
9860   /* Now backup to find the first entry in the set.  */
9861   while (i > 0 && shndx_pool [i - 1] != 0)
9862     i--;
9863 
9864   return shndx_pool + i;
9865 }
9866 
9867 /* Display a .debug_cu_index or .debug_tu_index section.  */
9868 
9869 static int
9870 display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
9871 {
9872   return process_cu_tu_index (section, 1);
9873 }
9874 
9875 static int
9876 display_debug_not_supported (struct dwarf_section *section,
9877 			     void *file ATTRIBUTE_UNUSED)
9878 {
9879   printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9880 	    section->name);
9881 
9882   return 1;
9883 }
9884 
9885 /* Like malloc, but takes two parameters like calloc.
9886    Verifies that the first parameter is not too large.
9887    Note: does *not* initialise the allocated memory to zero.  */
9888 
9889 void *
9890 cmalloc (size_t nmemb, size_t size)
9891 {
9892   /* Check for overflow.  */
9893   if (nmemb >= ~(size_t) 0 / size)
9894     return NULL;
9895 
9896   return xmalloc (nmemb * size);
9897 }
9898 
9899 /* Like xmalloc, but takes two parameters like calloc.
9900    Verifies that the first parameter is not too large.
9901    Note: does *not* initialise the allocated memory to zero.  */
9902 
9903 void *
9904 xcmalloc (size_t nmemb, size_t size)
9905 {
9906   /* Check for overflow.  */
9907   if (nmemb >= ~(size_t) 0 / size)
9908     {
9909       fprintf (stderr,
9910 	       _("Attempt to allocate an array with an excessive number of elements: 0x%lx\n"),
9911 	       (long) nmemb);
9912       xexit (1);
9913     }
9914 
9915   return xmalloc (nmemb * size);
9916 }
9917 
9918 /* Like xrealloc, but takes three parameters.
9919    Verifies that the second parameter is not too large.
9920    Note: does *not* initialise any new memory to zero.  */
9921 
9922 void *
9923 xcrealloc (void *ptr, size_t nmemb, size_t size)
9924 {
9925   /* Check for overflow.  */
9926   if (nmemb >= ~(size_t) 0 / size)
9927     {
9928       error (_("Attempt to re-allocate an array with an excessive number of elements: 0x%lx\n"),
9929 	     (long) nmemb);
9930       xexit (1);
9931     }
9932 
9933   return xrealloc (ptr, nmemb * size);
9934 }
9935 
9936 /* Like xcalloc, but verifies that the first parameter is not too large.  */
9937 
9938 void *
9939 xcalloc2 (size_t nmemb, size_t size)
9940 {
9941   /* Check for overflow.  */
9942   if (nmemb >= ~(size_t) 0 / size)
9943     {
9944       error (_("Attempt to allocate a zero'ed array with an excessive number of elements: 0x%lx\n"),
9945 	     (long) nmemb);
9946       xexit (1);
9947     }
9948 
9949   return xcalloc (nmemb, size);
9950 }
9951 
9952 static unsigned long
9953 calc_gnu_debuglink_crc32 (unsigned long          crc,
9954 			  const unsigned char *  buf,
9955 			  bfd_size_type          len)
9956 {
9957   static const unsigned long crc32_table[256] =
9958     {
9959       0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
9960       0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
9961       0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
9962       0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
9963       0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
9964       0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
9965       0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
9966       0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
9967       0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
9968       0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
9969       0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
9970       0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
9971       0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
9972       0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
9973       0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
9974       0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
9975       0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
9976       0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
9977       0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
9978       0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
9979       0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
9980       0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
9981       0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
9982       0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
9983       0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
9984       0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
9985       0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
9986       0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
9987       0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
9988       0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
9989       0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
9990       0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
9991       0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
9992       0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
9993       0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
9994       0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
9995       0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
9996       0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
9997       0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
9998       0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
9999       0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
10000       0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
10001       0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
10002       0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
10003       0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
10004       0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
10005       0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
10006       0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
10007       0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
10008       0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
10009       0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
10010       0x2d02ef8d
10011     };
10012   const unsigned char *end;
10013 
10014   crc = ~crc & 0xffffffff;
10015   for (end = buf + len; buf < end; ++ buf)
10016     crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
10017   return ~crc & 0xffffffff;
10018 }
10019 
10020 typedef bfd_boolean (*   check_func_type) (const char *, void *);
10021 typedef const char * (*  parse_func_type) (struct dwarf_section *, void *);
10022 
10023 static bfd_boolean
10024 check_gnu_debuglink (const char * pathname, void * crc_pointer)
10025 {
10026   static unsigned char buffer [8 * 1024];
10027   FILE *         f;
10028   bfd_size_type  count;
10029   unsigned long  crc = 0;
10030   void *         sep_data;
10031 
10032   sep_data = open_debug_file (pathname);
10033   if (sep_data == NULL)
10034     return FALSE;
10035 
10036   /* Yes - we are opening the file twice...  */
10037   f = fopen (pathname, "rb");
10038   if (f == NULL)
10039     {
10040       /* Paranoia: This should never happen.  */
10041       close_debug_file (sep_data);
10042       warn (_("Unable to reopen separate debug info file: %s\n"), pathname);
10043       return FALSE;
10044     }
10045 
10046   while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0)
10047     crc = calc_gnu_debuglink_crc32 (crc, buffer, count);
10048 
10049   fclose (f);
10050 
10051   if (crc != * (unsigned long *) crc_pointer)
10052     {
10053       close_debug_file (sep_data);
10054       warn (_("Separate debug info file %s found, but CRC does not match - ignoring\n"),
10055 	    pathname);
10056       return FALSE;
10057     }
10058 
10059   return TRUE;
10060 }
10061 
10062 static const char *
10063 parse_gnu_debuglink (struct dwarf_section * section, void * data)
10064 {
10065   const char *     name;
10066   unsigned int     crc_offset;
10067   unsigned long *  crc32 = (unsigned long *) data;
10068 
10069   /* The name is first.
10070      The CRC value is stored after the filename, aligned up to 4 bytes.  */
10071   name = (const char *) section->start;
10072 
10073 
10074   crc_offset = strnlen (name, section->size) + 1;
10075   crc_offset = (crc_offset + 3) & ~3;
10076   if (crc_offset + 4 > section->size)
10077     return NULL;
10078 
10079   * crc32 = byte_get (section->start + crc_offset, 4);
10080   return name;
10081 }
10082 
10083 static bfd_boolean
10084 check_gnu_debugaltlink (const char * filename, void * data ATTRIBUTE_UNUSED)
10085 {
10086   void * sep_data = open_debug_file (filename);
10087 
10088   if (sep_data == NULL)
10089     return FALSE;
10090 
10091   /* FIXME: We should now extract the build-id in the separate file
10092      and check it...  */
10093 
10094   return TRUE;
10095 }
10096 
10097 typedef struct build_id_data
10098 {
10099   bfd_size_type          len;
10100   const unsigned char *  data;
10101 } Build_id_data;
10102 
10103 static const char *
10104 parse_gnu_debugaltlink (struct dwarf_section * section, void * data)
10105 {
10106   const char *     name;
10107   bfd_size_type    namelen;
10108   bfd_size_type    id_len;
10109   Build_id_data *  build_id_data;
10110 
10111   /* The name is first.
10112      The build-id follows immediately, with no padding, up to the section's end.  */
10113 
10114   name = (const char *) section->start;
10115   namelen = strnlen (name, section->size) + 1;
10116   if (namelen >= section->size)
10117     return NULL;
10118 
10119   id_len = section->size - namelen;
10120   if (id_len < 0x14)
10121     return NULL;
10122 
10123   build_id_data = calloc (1, sizeof * build_id_data);
10124   if (build_id_data == NULL)
10125     return NULL;
10126 
10127   build_id_data->len = id_len;
10128   build_id_data->data = section->start + namelen;
10129 
10130   * (Build_id_data **) data = build_id_data;
10131 
10132   return name;
10133 }
10134 
10135 static void
10136 add_separate_debug_file (const char * filename, void * handle)
10137 {
10138   separate_info * i = xmalloc (sizeof * i);
10139 
10140   i->filename = filename;
10141   i->handle   = handle;
10142   i->next     = first_separate_info;
10143   first_separate_info = i;
10144 }
10145 
10146 #if HAVE_LIBDEBUGINFOD
10147 /* Query debuginfod servers for the target debuglink or debugaltlink
10148    file. If successful, store the path of the file in filename and
10149    return TRUE, otherwise return FALSE.  */
10150 
10151 static bfd_boolean
10152 debuginfod_fetch_separate_debug_info (struct dwarf_section * section,
10153                                       char ** filename,
10154                                       void * file)
10155 {
10156   size_t build_id_len;
10157   unsigned char * build_id;
10158 
10159   if (strcmp (section->uncompressed_name, ".gnu_debuglink") == 0)
10160     {
10161       /* Get the build-id of file.  */
10162       build_id = get_build_id (file);
10163       build_id_len = 0;
10164     }
10165   else if (strcmp (section->uncompressed_name, ".gnu_debugaltlink") == 0)
10166     {
10167       /* Get the build-id of the debugaltlink file.  */
10168       unsigned int filelen;
10169 
10170       filelen = strnlen ((const char *)section->start, section->size);
10171       if (filelen == section->size)
10172         /* Corrupt debugaltlink.  */
10173         return FALSE;
10174 
10175       build_id = section->start + filelen + 1;
10176       build_id_len = section->size - (filelen + 1);
10177 
10178       if (build_id_len == 0)
10179         return FALSE;
10180     }
10181   else
10182     return FALSE;
10183 
10184   if (build_id)
10185     {
10186       int fd;
10187       debuginfod_client * client;
10188 
10189       client = debuginfod_begin ();
10190       if (client == NULL)
10191         return FALSE;
10192 
10193       /* Query debuginfod servers for the target file. If found its path
10194          will be stored in filename.  */
10195       fd = debuginfod_find_debuginfo (client, build_id, build_id_len, filename);
10196       debuginfod_end (client);
10197 
10198       /* Only free build_id if we allocated space for a hex string
10199          in get_build_id ().  */
10200       if (build_id_len == 0)
10201         free (build_id);
10202 
10203       if (fd >= 0)
10204         {
10205           /* File successfully retrieved. Close fd since we want to
10206              use open_debug_file () on filename instead.  */
10207           close (fd);
10208           return TRUE;
10209         }
10210     }
10211 
10212   return FALSE;
10213 }
10214 #endif
10215 
10216 static void *
10217 load_separate_debug_info (const char *            main_filename,
10218 			  struct dwarf_section *  xlink,
10219 			  parse_func_type         parse_func,
10220 			  check_func_type         check_func,
10221 			  void *                  func_data,
10222                           void *                  file ATTRIBUTE_UNUSED)
10223 {
10224   const char *   separate_filename;
10225   char *         debug_filename;
10226   char *         canon_dir;
10227   size_t         canon_dirlen;
10228   size_t         dirlen;
10229 
10230   if ((separate_filename = parse_func (xlink, func_data)) == NULL)
10231     {
10232       warn (_("Corrupt debuglink section: %s\n"),
10233 	    xlink->name ? xlink->name : xlink->uncompressed_name);
10234       return FALSE;
10235     }
10236 
10237   /* Attempt to locate the separate file.
10238      This should duplicate the logic in bfd/opncls.c:find_separate_debug_file().  */
10239 
10240   canon_dir = lrealpath (main_filename);
10241 
10242   for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
10243     if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
10244       break;
10245   canon_dir[canon_dirlen] = '\0';
10246 
10247 #ifndef DEBUGDIR
10248 #define DEBUGDIR "/lib/debug"
10249 #endif
10250 #ifndef EXTRA_DEBUG_ROOT1
10251 #define EXTRA_DEBUG_ROOT1 "/usr/lib/debug"
10252 #endif
10253 #ifndef EXTRA_DEBUG_ROOT2
10254 #define EXTRA_DEBUG_ROOT2 "/usr/lib/debug/usr"
10255 #endif
10256 
10257   debug_filename = (char *) malloc (strlen (DEBUGDIR) + 1
10258 				    + canon_dirlen
10259 				    + strlen (".debug/")
10260 #ifdef EXTRA_DEBUG_ROOT1
10261 				    + strlen (EXTRA_DEBUG_ROOT1)
10262 #endif
10263 #ifdef EXTRA_DEBUG_ROOT2
10264 				    + strlen (EXTRA_DEBUG_ROOT2)
10265 #endif
10266 				    + strlen (separate_filename)
10267 				    + 1);
10268   if (debug_filename == NULL)
10269     {
10270       warn (_("Out of memory"));
10271       free (canon_dir);
10272       return NULL;
10273     }
10274 
10275   /* First try in the current directory.  */
10276   sprintf (debug_filename, "%s", separate_filename);
10277   if (check_func (debug_filename, func_data))
10278     goto found;
10279 
10280   /* Then try in a subdirectory called .debug.  */
10281   sprintf (debug_filename, ".debug/%s", separate_filename);
10282   if (check_func (debug_filename, func_data))
10283     goto found;
10284 
10285   /* Then try in the same directory as the original file.  */
10286   sprintf (debug_filename, "%s%s", canon_dir, separate_filename);
10287   if (check_func (debug_filename, func_data))
10288     goto found;
10289 
10290   /* And the .debug subdirectory of that directory.  */
10291   sprintf (debug_filename, "%s.debug/%s", canon_dir, separate_filename);
10292   if (check_func (debug_filename, func_data))
10293     goto found;
10294 
10295 #ifdef EXTRA_DEBUG_ROOT1
10296   /* Try the first extra debug file root.  */
10297   sprintf (debug_filename, "%s/%s", EXTRA_DEBUG_ROOT1, separate_filename);
10298   if (check_func (debug_filename, func_data))
10299     goto found;
10300 
10301   /* Try the first extra debug file root.  */
10302   sprintf (debug_filename, "%s/%s/%s", EXTRA_DEBUG_ROOT1, canon_dir, separate_filename);
10303   if (check_func (debug_filename, func_data))
10304     goto found;
10305 #endif
10306 
10307 #ifdef EXTRA_DEBUG_ROOT2
10308   /* Try the second extra debug file root.  */
10309   sprintf (debug_filename, "%s/%s", EXTRA_DEBUG_ROOT2, separate_filename);
10310   if (check_func (debug_filename, func_data))
10311     goto found;
10312 #endif
10313 
10314   /* Then try in the global debug_filename directory.  */
10315   strcpy (debug_filename, DEBUGDIR);
10316   dirlen = strlen (DEBUGDIR) - 1;
10317   if (dirlen > 0 && DEBUGDIR[dirlen] != '/')
10318     strcat (debug_filename, "/");
10319   strcat (debug_filename, (const char *) separate_filename);
10320 
10321   if (check_func (debug_filename, func_data))
10322     goto found;
10323 
10324 #if HAVE_LIBDEBUGINFOD
10325   {
10326     char * tmp_filename;
10327 
10328     if (debuginfod_fetch_separate_debug_info (xlink,
10329                                               & tmp_filename,
10330                                               file))
10331       {
10332         /* File successfully downloaded from server, replace
10333            debug_filename with the file's path.  */
10334         free (debug_filename);
10335         debug_filename = tmp_filename;
10336         goto found;
10337       }
10338   }
10339 #endif
10340 
10341   /* Failed to find the file.  */
10342   warn (_("could not find separate debug file '%s'\n"), separate_filename);
10343   warn (_("tried: %s\n"), debug_filename);
10344 
10345 #ifdef EXTRA_DEBUG_ROOT2
10346   sprintf (debug_filename, "%s/%s", EXTRA_DEBUG_ROOT2, separate_filename);
10347   warn (_("tried: %s\n"), debug_filename);
10348 #endif
10349 
10350 #ifdef EXTRA_DEBUG_ROOT1
10351   sprintf (debug_filename, "%s/%s/%s", EXTRA_DEBUG_ROOT1, canon_dir, separate_filename);
10352   warn (_("tried: %s\n"), debug_filename);
10353 
10354   sprintf (debug_filename, "%s/%s", EXTRA_DEBUG_ROOT1, separate_filename);
10355   warn (_("tried: %s\n"), debug_filename);
10356 #endif
10357 
10358   sprintf (debug_filename, "%s.debug/%s", canon_dir, separate_filename);
10359   warn (_("tried: %s\n"), debug_filename);
10360 
10361   sprintf (debug_filename, "%s%s", canon_dir, separate_filename);
10362   warn (_("tried: %s\n"), debug_filename);
10363 
10364   sprintf (debug_filename, ".debug/%s", separate_filename);
10365   warn (_("tried: %s\n"), debug_filename);
10366 
10367   sprintf (debug_filename, "%s", separate_filename);
10368   warn (_("tried: %s\n"), debug_filename);
10369 
10370 #if HAVE_LIBDEBUGINFOD
10371   {
10372     char *urls = getenv (DEBUGINFOD_URLS_ENV_VAR);
10373     if (urls == NULL)
10374       urls = "";
10375 
10376     warn (_("tried: DEBUGINFOD_URLS=%s\n"), urls);
10377   }
10378 #endif
10379 
10380   free (canon_dir);
10381   free (debug_filename);
10382   return NULL;
10383 
10384  found:
10385   free (canon_dir);
10386 
10387   void * debug_handle;
10388 
10389   /* Now open the file.... */
10390   if ((debug_handle = open_debug_file (debug_filename)) == NULL)
10391     {
10392       warn (_("failed to open separate debug file: %s\n"), debug_filename);
10393       free (debug_filename);
10394       return FALSE;
10395     }
10396 
10397   /* FIXME: We do not check to see if there are any other separate debug info
10398      files that would also match.  */
10399 
10400   printf (_("%s: Found separate debug info file: %s\n\n"), main_filename, debug_filename);
10401   add_separate_debug_file (debug_filename, debug_handle);
10402 
10403   /* Do not free debug_filename - it might be referenced inside
10404      the structure returned by open_debug_file().  */
10405   return debug_handle;
10406 }
10407 
10408 /* Attempt to load a separate dwarf object file.  */
10409 
10410 static void *
10411 load_dwo_file (const char * main_filename, const char * name, const char * dir, const char * id ATTRIBUTE_UNUSED)
10412 {
10413   char * separate_filename;
10414   void * separate_handle;
10415 
10416   /* FIXME: Skip adding / if dwo_dir ends in /.  */
10417   separate_filename = concat (dir, "/", name, NULL);
10418   if (separate_filename == NULL)
10419     {
10420       warn (_("Out of memory allocating dwo filename\n"));
10421       return NULL;
10422     }
10423 
10424   if ((separate_handle = open_debug_file (separate_filename)) == NULL)
10425     {
10426       warn (_("Unable to load dwo file: %s\n"), separate_filename);
10427       free (separate_filename);
10428       return NULL;
10429     }
10430 
10431   /* FIXME: We should check the dwo_id.  */
10432 
10433   printf (_("%s: Found separate debug object file: %s\n\n"), main_filename, separate_filename);
10434   add_separate_debug_file (separate_filename, separate_handle);
10435   /* Note - separate_filename will be freed in free_debug_memory().  */
10436   return separate_handle;
10437 }
10438 
10439 /* Load the separate debug info file(s) attached to FILE, if any exist.
10440    Returns TRUE if any were found, FALSE otherwise.
10441    If TRUE is returned then the linked list starting at first_separate_info
10442    will be populated with open file handles.  */
10443 
10444 bfd_boolean
10445 load_separate_debug_files (void * file, const char * filename)
10446 {
10447   /* Skip this operation if we are not interested in debug links.  */
10448   if (! do_follow_links && ! do_debug_links)
10449     return FALSE;
10450 
10451   /* See if there are any dwo links.  */
10452   if (load_debug_section (str, file)
10453       && load_debug_section (abbrev, file)
10454       && load_debug_section (info, file))
10455     {
10456       free_dwo_info ();
10457 
10458       if (process_debug_info (& debug_displays[info].section, file, abbrev, TRUE, FALSE))
10459 	{
10460 	  bfd_boolean introduced = FALSE;
10461 	  dwo_info *   dwinfo;
10462 	  const char * dir = NULL;
10463 	  const char * id = NULL;
10464 
10465 	  for (dwinfo = first_dwo_info; dwinfo != NULL; dwinfo = dwinfo->next)
10466 	    {
10467 	      switch (dwinfo->type)
10468 		{
10469 		case DWO_NAME:
10470 		  if (do_debug_links)
10471 		    {
10472 		      if (! introduced)
10473 			{
10474 			  printf (_("The %s section contains link(s) to dwo file(s):\n\n"),
10475 				  debug_displays [info].section.uncompressed_name);
10476 			  introduced = TRUE;
10477 			}
10478 
10479 		      printf (_("  Name:      %s\n"), dwinfo->value);
10480 		      printf (_("  Directory: %s\n"), dir ? dir : _("<not-found>"));
10481 		      if (id != NULL)
10482 			display_data (printf (_("  ID:       ")), (unsigned char *) id, 8);
10483 		      else
10484 			printf (_("  ID: <unknown>\n"));
10485 		      printf ("\n\n");
10486 		    }
10487 
10488 		  if (do_follow_links)
10489 		    load_dwo_file (filename, dwinfo->value, dir, id);
10490 		  break;
10491 
10492 		case DWO_DIR:
10493 		  dir = dwinfo->value;
10494 		  break;
10495 
10496 		case DWO_ID:
10497 		  id = dwinfo->value;
10498 		  break;
10499 
10500 		default:
10501 		  error (_("Unexpected DWO INFO type"));
10502 		  break;
10503 		}
10504 	    }
10505 	}
10506     }
10507 
10508   if (! do_follow_links)
10509     /* The other debug links will be displayed by display_debug_links()
10510        so we do not need to do any further processing here.  */
10511     return FALSE;
10512 
10513   /* FIXME: We do not check for the presence of both link sections in the same file.  */
10514   /* FIXME: We do not check the separate debug info file to see if it too contains debuglinks.  */
10515   /* FIXME: We do not check for the presence of multiple, same-name debuglink sections.  */
10516   /* FIXME: We do not check for the presence of a dwo link as well as a debuglink.  */
10517 
10518   if (load_debug_section (gnu_debugaltlink, file))
10519     {
10520       Build_id_data * build_id_data;
10521 
10522       load_separate_debug_info (filename,
10523 				& debug_displays[gnu_debugaltlink].section,
10524 				parse_gnu_debugaltlink,
10525 				check_gnu_debugaltlink,
10526 				& build_id_data,
10527 				file);
10528     }
10529 
10530   if (load_debug_section (gnu_debuglink, file))
10531     {
10532       unsigned long crc32;
10533 
10534       load_separate_debug_info (filename,
10535 				& debug_displays[gnu_debuglink].section,
10536 				parse_gnu_debuglink,
10537 				check_gnu_debuglink,
10538 				& crc32,
10539 				file);
10540     }
10541 
10542   if (first_separate_info != NULL)
10543     return TRUE;
10544 
10545   do_follow_links = 0;
10546   return FALSE;
10547 }
10548 
10549 void
10550 free_debug_memory (void)
10551 {
10552   unsigned int i;
10553 
10554   free_abbrevs ();
10555 
10556   for (i = 0; i < max; i++)
10557     free_debug_section ((enum dwarf_section_display_enum) i);
10558 
10559   if (debug_information != NULL)
10560     {
10561       if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
10562 	{
10563 	  for (i = 0; i < num_debug_info_entries; i++)
10564 	    {
10565 	      if (!debug_information [i].max_loc_offsets)
10566 		{
10567 		  free (debug_information [i].loc_offsets);
10568 		  free (debug_information [i].have_frame_base);
10569 		}
10570 	      if (!debug_information [i].max_range_lists)
10571 		free (debug_information [i].range_lists);
10572 	    }
10573 	}
10574       free (debug_information);
10575       debug_information = NULL;
10576       alloc_num_debug_info_entries = num_debug_info_entries = 0;
10577     }
10578 
10579   separate_info * d;
10580   separate_info * next;
10581 
10582   for (d = first_separate_info; d != NULL; d = next)
10583     {
10584       close_debug_file (d->handle);
10585       free ((void *) d->filename);
10586       next = d->next;
10587       free ((void *) d);
10588     }
10589   first_separate_info = NULL;
10590 
10591   free_dwo_info ();
10592 }
10593 
10594 void
10595 dwarf_select_sections_by_names (const char *names)
10596 {
10597   typedef struct
10598   {
10599     const char * option;
10600     int *        variable;
10601     int          val;
10602   }
10603   debug_dump_long_opts;
10604 
10605   static const debug_dump_long_opts opts_table [] =
10606     {
10607       /* Please keep this table alpha- sorted.  */
10608       { "Ranges", & do_debug_ranges, 1 },
10609       { "abbrev", & do_debug_abbrevs, 1 },
10610       { "addr", & do_debug_addr, 1 },
10611       { "aranges", & do_debug_aranges, 1 },
10612       { "cu_index", & do_debug_cu_index, 1 },
10613       { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
10614       { "follow-links", & do_follow_links, 1 },
10615       { "frames", & do_debug_frames, 1 },
10616       { "frames-interp", & do_debug_frames_interp, 1 },
10617       /* The special .gdb_index section.  */
10618       { "gdb_index", & do_gdb_index, 1 },
10619       { "info", & do_debug_info, 1 },
10620       { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility.  */
10621       { "links", & do_debug_links, 1 },
10622       { "loc",  & do_debug_loc, 1 },
10623       { "macro", & do_debug_macinfo, 1 },
10624       { "pubnames", & do_debug_pubnames, 1 },
10625       { "pubtypes", & do_debug_pubtypes, 1 },
10626       /* This entry is for compatibility
10627 	 with earlier versions of readelf.  */
10628       { "ranges", & do_debug_aranges, 1 },
10629       { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
10630       { "str", & do_debug_str, 1 },
10631       /* These trace_* sections are used by Itanium VMS.  */
10632       { "trace_abbrev", & do_trace_abbrevs, 1 },
10633       { "trace_aranges", & do_trace_aranges, 1 },
10634       { "trace_info", & do_trace_info, 1 },
10635       { NULL, NULL, 0 }
10636     };
10637 
10638   const char *p;
10639 
10640   p = names;
10641   while (*p)
10642     {
10643       const debug_dump_long_opts * entry;
10644 
10645       for (entry = opts_table; entry->option; entry++)
10646 	{
10647 	  size_t len = strlen (entry->option);
10648 
10649 	  if (strncmp (p, entry->option, len) == 0
10650 	      && (p[len] == ',' || p[len] == '\0'))
10651 	    {
10652 	      * entry->variable |= entry->val;
10653 
10654 	      /* The --debug-dump=frames-interp option also
10655 		 enables the --debug-dump=frames option.  */
10656 	      if (do_debug_frames_interp)
10657 		do_debug_frames = 1;
10658 
10659 	      p += len;
10660 	      break;
10661 	    }
10662 	}
10663 
10664       if (entry->option == NULL)
10665 	{
10666 	  warn (_("Unrecognized debug option '%s'\n"), p);
10667 	  p = strchr (p, ',');
10668 	  if (p == NULL)
10669 	    break;
10670 	}
10671 
10672       if (*p == ',')
10673 	p++;
10674     }
10675 }
10676 
10677 void
10678 dwarf_select_sections_by_letters (const char *letters)
10679 {
10680   unsigned int lindex = 0;
10681 
10682   while (letters[lindex])
10683     switch (letters[lindex++])
10684       {
10685       case 'A':	do_debug_addr = 1; break;
10686       case 'a':	do_debug_abbrevs = 1; break;
10687       case 'c':	do_debug_cu_index = 1; break;
10688       case 'F':	do_debug_frames_interp = 1; /* Fall through.  */
10689       case 'f':	do_debug_frames = 1; break;
10690       case 'g':	do_gdb_index = 1; break;
10691       case 'i':	do_debug_info = 1; break;
10692       case 'K': do_follow_links = 1; break;
10693       case 'k':	do_debug_links = 1; break;
10694       case 'l':	do_debug_lines |= FLAG_DEBUG_LINES_RAW;	break;
10695       case 'L':	do_debug_lines |= FLAG_DEBUG_LINES_DECODED; break;
10696       case 'm': do_debug_macinfo = 1; break;
10697       case 'o':	do_debug_loc = 1; break;
10698       case 'p':	do_debug_pubnames = 1; break;
10699       case 'R':	do_debug_ranges = 1; break;
10700       case 'r':	do_debug_aranges = 1; break;
10701       case 's':	do_debug_str = 1; break;
10702       case 'T': do_trace_aranges = 1; break;
10703       case 't': do_debug_pubtypes = 1; break;
10704       case 'U': do_trace_info = 1; break;
10705       case 'u': do_trace_abbrevs = 1; break;
10706 
10707       default:
10708 	warn (_("Unrecognized debug option '%s'\n"), letters);
10709 	break;
10710       }
10711 }
10712 
10713 void
10714 dwarf_select_sections_all (void)
10715 {
10716   do_debug_info = 1;
10717   do_debug_abbrevs = 1;
10718   do_debug_lines = FLAG_DEBUG_LINES_RAW;
10719   do_debug_pubnames = 1;
10720   do_debug_pubtypes = 1;
10721   do_debug_aranges = 1;
10722   do_debug_ranges = 1;
10723   do_debug_frames = 1;
10724   do_debug_macinfo = 1;
10725   do_debug_str = 1;
10726   do_debug_loc = 1;
10727   do_gdb_index = 1;
10728   do_trace_info = 1;
10729   do_trace_abbrevs = 1;
10730   do_trace_aranges = 1;
10731   do_debug_addr = 1;
10732   do_debug_cu_index = 1;
10733   do_follow_links = 1;
10734   do_debug_links = 1;
10735 }
10736 
10737 #define NO_ABBREVS   NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL
10738 #define ABBREV(N)    NULL, NULL, NULL, 0, 0, N, NULL, 0, NULL
10739 
10740 /* N.B. The order here must match the order in section_display_enum.  */
10741 
10742 struct dwarf_section_display debug_displays[] =
10743 {
10744   { { ".debug_abbrev",	    ".zdebug_abbrev",	NO_ABBREVS },      display_debug_abbrev,   &do_debug_abbrevs,	FALSE },
10745   { { ".debug_aranges",	    ".zdebug_aranges",	NO_ABBREVS },      display_debug_aranges,  &do_debug_aranges,	TRUE },
10746   { { ".debug_frame",       ".zdebug_frame",	NO_ABBREVS },      display_debug_frames,   &do_debug_frames,	TRUE },
10747   { { ".debug_info",	    ".zdebug_info",	ABBREV (abbrev)},  display_debug_info,	   &do_debug_info,	TRUE },
10748   { { ".debug_line",	    ".zdebug_line",	NO_ABBREVS },      display_debug_lines,    &do_debug_lines,	TRUE },
10749   { { ".debug_pubnames",    ".zdebug_pubnames",	NO_ABBREVS },      display_debug_pubnames, &do_debug_pubnames,	FALSE },
10750   { { ".debug_gnu_pubnames", ".zdebug_gnu_pubnames", NO_ABBREVS }, display_debug_gnu_pubnames, &do_debug_pubnames, FALSE },
10751   { { ".eh_frame",	    "",			NO_ABBREVS },      display_debug_frames,   &do_debug_frames,	TRUE },
10752   { { ".debug_macinfo",	    ".zdebug_macinfo",	NO_ABBREVS },      display_debug_macinfo,  &do_debug_macinfo,	FALSE },
10753   { { ".debug_macro",	    ".zdebug_macro",	NO_ABBREVS },      display_debug_macro,    &do_debug_macinfo,	TRUE },
10754   { { ".debug_str",	    ".zdebug_str",	NO_ABBREVS },      display_debug_str,	   &do_debug_str,	FALSE },
10755   { { ".debug_line_str",    ".zdebug_line_str",	NO_ABBREVS },      display_debug_str,	   &do_debug_str,	FALSE },
10756   { { ".debug_loc",	    ".zdebug_loc",	NO_ABBREVS },      display_debug_loc,	   &do_debug_loc,	TRUE },
10757   { { ".debug_loclists",    ".zdebug_loclists",	NO_ABBREVS },      display_debug_loc,	   &do_debug_loc,	TRUE },
10758   { { ".debug_pubtypes",    ".zdebug_pubtypes",	NO_ABBREVS },      display_debug_pubnames, &do_debug_pubtypes,	FALSE },
10759   { { ".debug_gnu_pubtypes", ".zdebug_gnu_pubtypes", NO_ABBREVS }, display_debug_gnu_pubnames, &do_debug_pubtypes, FALSE },
10760   { { ".debug_ranges",	    ".zdebug_ranges",	NO_ABBREVS },      display_debug_ranges,   &do_debug_ranges,	TRUE },
10761   { { ".debug_rnglists",    ".zdebug_rnglists",	NO_ABBREVS },      display_debug_ranges,   &do_debug_ranges,	TRUE },
10762   { { ".debug_static_func", ".zdebug_static_func", NO_ABBREVS },   display_debug_not_supported, NULL,		FALSE },
10763   { { ".debug_static_vars", ".zdebug_static_vars", NO_ABBREVS },   display_debug_not_supported, NULL,		FALSE },
10764   { { ".debug_types",	    ".zdebug_types",	ABBREV (abbrev) }, display_debug_types,    &do_debug_info,	TRUE },
10765   { { ".debug_weaknames",   ".zdebug_weaknames", NO_ABBREVS },     display_debug_not_supported, NULL,		FALSE },
10766   { { ".gdb_index",	    "",			NO_ABBREVS },      display_gdb_index,      &do_gdb_index,	FALSE },
10767   { { ".debug_names",	    "",			NO_ABBREVS },      display_debug_names,    &do_gdb_index,	FALSE },
10768   { { ".trace_info",	    "",			ABBREV (trace_abbrev) }, display_trace_info, &do_trace_info,	TRUE },
10769   { { ".trace_abbrev",	    "",			NO_ABBREVS },      display_debug_abbrev,   &do_trace_abbrevs,	FALSE },
10770   { { ".trace_aranges",	    "",			NO_ABBREVS },      display_debug_aranges,  &do_trace_aranges,	FALSE },
10771   { { ".debug_info.dwo",    ".zdebug_info.dwo",	ABBREV (abbrev_dwo) }, display_debug_info, &do_debug_info,	TRUE },
10772   { { ".debug_abbrev.dwo",  ".zdebug_abbrev.dwo", NO_ABBREVS },    display_debug_abbrev,   &do_debug_abbrevs,	FALSE },
10773   { { ".debug_types.dwo",   ".zdebug_types.dwo", ABBREV (abbrev_dwo) }, display_debug_types, &do_debug_info,	TRUE },
10774   { { ".debug_line.dwo",    ".zdebug_line.dwo", NO_ABBREVS },      display_debug_lines,    &do_debug_lines,	TRUE },
10775   { { ".debug_loc.dwo",	    ".zdebug_loc.dwo",	NO_ABBREVS },      display_debug_loc,	   &do_debug_loc,	TRUE },
10776   { { ".debug_macro.dwo",   ".zdebug_macro.dwo", NO_ABBREVS },     display_debug_macro,    &do_debug_macinfo,	TRUE },
10777   { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NO_ABBREVS },   display_debug_macinfo,  &do_debug_macinfo,	FALSE },
10778   { { ".debug_str.dwo",     ".zdebug_str.dwo",  NO_ABBREVS },      display_debug_str,      &do_debug_str,	TRUE },
10779   { { ".debug_str_offsets", ".zdebug_str_offsets", NO_ABBREVS },   display_debug_str_offsets, NULL,		FALSE },
10780   { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NO_ABBREVS }, display_debug_str_offsets, NULL,	FALSE },
10781   { { ".debug_addr",	    ".zdebug_addr",     NO_ABBREVS },      display_debug_addr,     &do_debug_addr,	TRUE },
10782   { { ".debug_cu_index",    "",			NO_ABBREVS },      display_cu_index,       &do_debug_cu_index,	FALSE },
10783   { { ".debug_tu_index",    "",			NO_ABBREVS },      display_cu_index,       &do_debug_cu_index,	FALSE },
10784   { { ".gnu_debuglink",     "",                 NO_ABBREVS },      display_debug_links,    &do_debug_links,     FALSE },
10785   { { ".gnu_debugaltlink",  "",                 NO_ABBREVS },      display_debug_links,    &do_debug_links,     FALSE },
10786   /* Separate debug info files can containt their own .debug_str section,
10787      and this might be in *addition* to a .debug_str section already present
10788      in the main file.  Hence we need to have two entries for .debug_str.  */
10789   { { ".debug_str",	    ".zdebug_str",	NO_ABBREVS },      display_debug_str,	   &do_debug_str,	FALSE },
10790 };
10791 
10792 /* A static assertion.  */
10793 extern int debug_displays_assert[ARRAY_SIZE (debug_displays) == max ? 1 : -1];
10794