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