1*fae548d3Szrj /* dwarf.c -- display DWARF contents of a BFD binary file
2*fae548d3Szrj    Copyright (C) 2005-2020 Free Software Foundation, Inc.
3*fae548d3Szrj 
4*fae548d3Szrj    This file is part of GNU Binutils.
5*fae548d3Szrj 
6*fae548d3Szrj    This program is free software; you can redistribute it and/or modify
7*fae548d3Szrj    it under the terms of the GNU General Public License as published by
8*fae548d3Szrj    the Free Software Foundation; either version 3 of the License, or
9*fae548d3Szrj    (at your option) any later version.
10*fae548d3Szrj 
11*fae548d3Szrj    This program is distributed in the hope that it will be useful,
12*fae548d3Szrj    but WITHOUT ANY WARRANTY; without even the implied warranty of
13*fae548d3Szrj    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*fae548d3Szrj    GNU General Public License for more details.
15*fae548d3Szrj 
16*fae548d3Szrj    You should have received a copy of the GNU General Public License
17*fae548d3Szrj    along with this program; if not, write to the Free Software
18*fae548d3Szrj    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
19*fae548d3Szrj    02110-1301, USA.  */
20*fae548d3Szrj 
21*fae548d3Szrj #include "sysdep.h"
22*fae548d3Szrj #include "libiberty.h"
23*fae548d3Szrj #include "bfd.h"
24*fae548d3Szrj #include "bfd_stdint.h"
25*fae548d3Szrj #include "bucomm.h"
26*fae548d3Szrj #include "elfcomm.h"
27*fae548d3Szrj #include "elf/common.h"
28*fae548d3Szrj #include "dwarf2.h"
29*fae548d3Szrj #include "dwarf.h"
30*fae548d3Szrj #include "gdb/gdb-index.h"
31*fae548d3Szrj #include "filenames.h"
32*fae548d3Szrj #include "safe-ctype.h"
33*fae548d3Szrj #include <assert.h>
34*fae548d3Szrj 
35*fae548d3Szrj #ifdef HAVE_LIBDEBUGINFOD
36*fae548d3Szrj #include <elfutils/debuginfod.h>
37*fae548d3Szrj #endif
38*fae548d3Szrj 
39*fae548d3Szrj #undef MAX
40*fae548d3Szrj #undef MIN
41*fae548d3Szrj #define MAX(a, b) ((a) > (b) ? (a) : (b))
42*fae548d3Szrj #define MIN(a, b) ((a) < (b) ? (a) : (b))
43*fae548d3Szrj 
44*fae548d3Szrj static const char *regname (unsigned int regno, int row);
45*fae548d3Szrj static const char *regname_internal_by_table_only (unsigned int regno);
46*fae548d3Szrj 
47*fae548d3Szrj static int have_frame_base;
48*fae548d3Szrj static int need_base_address;
49*fae548d3Szrj 
50*fae548d3Szrj static unsigned int num_debug_info_entries = 0;
51*fae548d3Szrj static unsigned int alloc_num_debug_info_entries = 0;
52*fae548d3Szrj static debug_info *debug_information = NULL;
53*fae548d3Szrj /* Special value for num_debug_info_entries to indicate
54*fae548d3Szrj    that the .debug_info section could not be loaded/parsed.  */
55*fae548d3Szrj #define DEBUG_INFO_UNAVAILABLE  (unsigned int) -1
56*fae548d3Szrj 
57*fae548d3Szrj /* A .debug_info section can contain multiple links to separate
58*fae548d3Szrj    DWO object files.  We use these structures to record these links.  */
59*fae548d3Szrj typedef enum dwo_type
60*fae548d3Szrj {
61*fae548d3Szrj  DWO_NAME,
62*fae548d3Szrj  DWO_DIR,
63*fae548d3Szrj  DWO_ID
64*fae548d3Szrj } dwo_type;
65*fae548d3Szrj 
66*fae548d3Szrj typedef struct dwo_info
67*fae548d3Szrj {
68*fae548d3Szrj   dwo_type          type;
69*fae548d3Szrj   const char *      value;
70*fae548d3Szrj   struct dwo_info * next;
71*fae548d3Szrj } dwo_info;
72*fae548d3Szrj 
73*fae548d3Szrj static dwo_info *   first_dwo_info = NULL;
74*fae548d3Szrj static bfd_boolean  need_dwo_info;
75*fae548d3Szrj 
76*fae548d3Szrj separate_info * first_separate_info = NULL;
77*fae548d3Szrj 
78*fae548d3Szrj unsigned int eh_addr_size;
79*fae548d3Szrj 
80*fae548d3Szrj int do_debug_info;
81*fae548d3Szrj int do_debug_abbrevs;
82*fae548d3Szrj int do_debug_lines;
83*fae548d3Szrj int do_debug_pubnames;
84*fae548d3Szrj int do_debug_pubtypes;
85*fae548d3Szrj int do_debug_aranges;
86*fae548d3Szrj int do_debug_ranges;
87*fae548d3Szrj int do_debug_frames;
88*fae548d3Szrj int do_debug_frames_interp;
89*fae548d3Szrj int do_debug_macinfo;
90*fae548d3Szrj int do_debug_str;
91*fae548d3Szrj int do_debug_loc;
92*fae548d3Szrj int do_gdb_index;
93*fae548d3Szrj int do_trace_info;
94*fae548d3Szrj int do_trace_abbrevs;
95*fae548d3Szrj int do_trace_aranges;
96*fae548d3Szrj int do_debug_addr;
97*fae548d3Szrj int do_debug_cu_index;
98*fae548d3Szrj int do_wide;
99*fae548d3Szrj int do_debug_links;
100*fae548d3Szrj int do_follow_links;
101*fae548d3Szrj 
102*fae548d3Szrj int dwarf_cutoff_level = -1;
103*fae548d3Szrj unsigned long dwarf_start_die;
104*fae548d3Szrj 
105*fae548d3Szrj int dwarf_check = 0;
106*fae548d3Szrj 
107*fae548d3Szrj /* Convenient constant, to avoid having to cast -1 to dwarf_vma when
108*fae548d3Szrj    testing whether e.g. a locview list is present.  */
109*fae548d3Szrj static const dwarf_vma vm1 = -1;
110*fae548d3Szrj 
111*fae548d3Szrj /* Collection of CU/TU section sets from .debug_cu_index and .debug_tu_index
112*fae548d3Szrj    sections.  For version 1 package files, each set is stored in SHNDX_POOL
113*fae548d3Szrj    as a zero-terminated list of section indexes comprising one set of debug
114*fae548d3Szrj    sections from a .dwo file.  */
115*fae548d3Szrj 
116*fae548d3Szrj static unsigned int *shndx_pool = NULL;
117*fae548d3Szrj static unsigned int shndx_pool_size = 0;
118*fae548d3Szrj static unsigned int shndx_pool_used = 0;
119*fae548d3Szrj 
120*fae548d3Szrj /* For version 2 package files, each set contains an array of section offsets
121*fae548d3Szrj    and an array of section sizes, giving the offset and size of the
122*fae548d3Szrj    contribution from a CU or TU within one of the debug sections.
123*fae548d3Szrj    When displaying debug info from a package file, we need to use these
124*fae548d3Szrj    tables to locate the corresponding contributions to each section.  */
125*fae548d3Szrj 
126*fae548d3Szrj struct cu_tu_set
127*fae548d3Szrj {
128*fae548d3Szrj   uint64_t   signature;
129*fae548d3Szrj   dwarf_vma  section_offsets[DW_SECT_MAX];
130*fae548d3Szrj   size_t     section_sizes[DW_SECT_MAX];
131*fae548d3Szrj };
132*fae548d3Szrj 
133*fae548d3Szrj static int cu_count = 0;
134*fae548d3Szrj static int tu_count = 0;
135*fae548d3Szrj static struct cu_tu_set *cu_sets = NULL;
136*fae548d3Szrj static struct cu_tu_set *tu_sets = NULL;
137*fae548d3Szrj 
138*fae548d3Szrj static bfd_boolean load_cu_tu_indexes (void *);
139*fae548d3Szrj 
140*fae548d3Szrj /* An array that indicates for a given level of CU nesting whether
141*fae548d3Szrj    the latest DW_AT_type seen for that level was a signed type or
142*fae548d3Szrj    an unsigned type.  */
143*fae548d3Szrj #define MAX_CU_NESTING (1 << 8)
144*fae548d3Szrj static bfd_boolean level_type_signed[MAX_CU_NESTING];
145*fae548d3Szrj 
146*fae548d3Szrj /* Values for do_debug_lines.  */
147*fae548d3Szrj #define FLAG_DEBUG_LINES_RAW	 1
148*fae548d3Szrj #define FLAG_DEBUG_LINES_DECODED 2
149*fae548d3Szrj 
150*fae548d3Szrj static unsigned int
size_of_encoded_value(int encoding)151*fae548d3Szrj size_of_encoded_value (int encoding)
152*fae548d3Szrj {
153*fae548d3Szrj   switch (encoding & 0x7)
154*fae548d3Szrj     {
155*fae548d3Szrj     default:	/* ??? */
156*fae548d3Szrj     case 0:	return eh_addr_size;
157*fae548d3Szrj     case 2:	return 2;
158*fae548d3Szrj     case 3:	return 4;
159*fae548d3Szrj     case 4:	return 8;
160*fae548d3Szrj     }
161*fae548d3Szrj }
162*fae548d3Szrj 
163*fae548d3Szrj static dwarf_vma
get_encoded_value(unsigned char ** pdata,int encoding,struct dwarf_section * section,unsigned char * end)164*fae548d3Szrj get_encoded_value (unsigned char **pdata,
165*fae548d3Szrj 		   int encoding,
166*fae548d3Szrj 		   struct dwarf_section *section,
167*fae548d3Szrj 		   unsigned char * end)
168*fae548d3Szrj {
169*fae548d3Szrj   unsigned char * data = * pdata;
170*fae548d3Szrj   unsigned int size = size_of_encoded_value (encoding);
171*fae548d3Szrj   dwarf_vma val;
172*fae548d3Szrj 
173*fae548d3Szrj   if (data + size >= end)
174*fae548d3Szrj     {
175*fae548d3Szrj       warn (_("Encoded value extends past end of section\n"));
176*fae548d3Szrj       * pdata = end;
177*fae548d3Szrj       return 0;
178*fae548d3Szrj     }
179*fae548d3Szrj 
180*fae548d3Szrj   /* PR 17512: file: 002-829853-0.004.  */
181*fae548d3Szrj   if (size > 8)
182*fae548d3Szrj     {
183*fae548d3Szrj       warn (_("Encoded size of %d is too large to read\n"), size);
184*fae548d3Szrj       * pdata = end;
185*fae548d3Szrj       return 0;
186*fae548d3Szrj     }
187*fae548d3Szrj 
188*fae548d3Szrj   /* PR 17512: file: 1085-5603-0.004.  */
189*fae548d3Szrj   if (size == 0)
190*fae548d3Szrj     {
191*fae548d3Szrj       warn (_("Encoded size of 0 is too small to read\n"));
192*fae548d3Szrj       * pdata = end;
193*fae548d3Szrj       return 0;
194*fae548d3Szrj     }
195*fae548d3Szrj 
196*fae548d3Szrj   if (encoding & DW_EH_PE_signed)
197*fae548d3Szrj     val = byte_get_signed (data, size);
198*fae548d3Szrj   else
199*fae548d3Szrj     val = byte_get (data, size);
200*fae548d3Szrj 
201*fae548d3Szrj   if ((encoding & 0x70) == DW_EH_PE_pcrel)
202*fae548d3Szrj     val += section->address + (data - section->start);
203*fae548d3Szrj 
204*fae548d3Szrj   * pdata = data + size;
205*fae548d3Szrj   return val;
206*fae548d3Szrj }
207*fae548d3Szrj 
208*fae548d3Szrj #if defined HAVE_LONG_LONG && SIZEOF_LONG_LONG > SIZEOF_LONG
209*fae548d3Szrj # ifndef __MINGW32__
210*fae548d3Szrj #  define DWARF_VMA_FMT		"ll"
211*fae548d3Szrj #  define DWARF_VMA_FMT_LONG	"%16.16llx"
212*fae548d3Szrj # else
213*fae548d3Szrj #  define DWARF_VMA_FMT		"I64"
214*fae548d3Szrj #  define DWARF_VMA_FMT_LONG	"%016I64x"
215*fae548d3Szrj # endif
216*fae548d3Szrj #else
217*fae548d3Szrj # define DWARF_VMA_FMT		"l"
218*fae548d3Szrj # define DWARF_VMA_FMT_LONG	"%16.16lx"
219*fae548d3Szrj #endif
220*fae548d3Szrj 
221*fae548d3Szrj /* Convert a dwarf vma value into a string.  Returns a pointer to a static
222*fae548d3Szrj    buffer containing the converted VALUE.  The value is converted according
223*fae548d3Szrj    to the printf formating character FMTCH.  If NUM_BYTES is non-zero then
224*fae548d3Szrj    it specifies the maximum number of bytes to be displayed in the converted
225*fae548d3Szrj    value and FMTCH is ignored - hex is always used.  */
226*fae548d3Szrj 
227*fae548d3Szrj static const char *
dwarf_vmatoa_1(const char * fmtch,dwarf_vma value,unsigned num_bytes)228*fae548d3Szrj dwarf_vmatoa_1 (const char *fmtch, dwarf_vma value, unsigned num_bytes)
229*fae548d3Szrj {
230*fae548d3Szrj   /* As dwarf_vmatoa is used more then once in a printf call
231*fae548d3Szrj      for output, we are cycling through an fixed array of pointers
232*fae548d3Szrj      for return address.  */
233*fae548d3Szrj   static int buf_pos = 0;
234*fae548d3Szrj   static struct dwarf_vmatoa_buf
235*fae548d3Szrj   {
236*fae548d3Szrj     char place[64];
237*fae548d3Szrj   } buf[16];
238*fae548d3Szrj   char *ret;
239*fae548d3Szrj 
240*fae548d3Szrj   ret = buf[buf_pos++].place;
241*fae548d3Szrj   buf_pos %= ARRAY_SIZE (buf);
242*fae548d3Szrj 
243*fae548d3Szrj   if (num_bytes)
244*fae548d3Szrj     {
245*fae548d3Szrj       /* Printf does not have a way of specifying a maximum field width for an
246*fae548d3Szrj 	 integer value, so we print the full value into a buffer and then select
247*fae548d3Szrj 	 the precision we need.  */
248*fae548d3Szrj       snprintf (ret, sizeof (buf[0].place), DWARF_VMA_FMT_LONG, value);
249*fae548d3Szrj       if (num_bytes > 8)
250*fae548d3Szrj 	num_bytes = 8;
251*fae548d3Szrj       return ret + (16 - 2 * num_bytes);
252*fae548d3Szrj     }
253*fae548d3Szrj   else
254*fae548d3Szrj     {
255*fae548d3Szrj       char fmt[32];
256*fae548d3Szrj 
257*fae548d3Szrj       if (fmtch)
258*fae548d3Szrj 	sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch);
259*fae548d3Szrj       else
260*fae548d3Szrj 	sprintf (fmt, "%%%s", DWARF_VMA_FMT);
261*fae548d3Szrj       snprintf (ret, sizeof (buf[0].place), fmt, value);
262*fae548d3Szrj       return ret;
263*fae548d3Szrj     }
264*fae548d3Szrj }
265*fae548d3Szrj 
266*fae548d3Szrj static inline const char *
dwarf_vmatoa(const char * fmtch,dwarf_vma value)267*fae548d3Szrj dwarf_vmatoa (const char * fmtch, dwarf_vma value)
268*fae548d3Szrj {
269*fae548d3Szrj   return dwarf_vmatoa_1 (fmtch, value, 0);
270*fae548d3Szrj }
271*fae548d3Szrj 
272*fae548d3Szrj /* Print a dwarf_vma value (typically an address, offset or length) in
273*fae548d3Szrj    hexadecimal format, followed by a space.  The length of the VALUE (and
274*fae548d3Szrj    hence the precision displayed) is determined by the NUM_BYTES parameter.  */
275*fae548d3Szrj 
276*fae548d3Szrj static void
print_dwarf_vma(dwarf_vma value,unsigned num_bytes)277*fae548d3Szrj print_dwarf_vma (dwarf_vma value, unsigned num_bytes)
278*fae548d3Szrj {
279*fae548d3Szrj   printf ("%s ", dwarf_vmatoa_1 (NULL, value, num_bytes));
280*fae548d3Szrj }
281*fae548d3Szrj 
282*fae548d3Szrj /* Print a view number in hexadecimal value, with the same width
283*fae548d3Szrj    print_dwarf_vma would have printed it with the same num_bytes.
284*fae548d3Szrj    Print blanks for zero view, unless force is nonzero.  */
285*fae548d3Szrj 
286*fae548d3Szrj static void
print_dwarf_view(dwarf_vma value,unsigned num_bytes,int force)287*fae548d3Szrj print_dwarf_view (dwarf_vma value, unsigned num_bytes, int force)
288*fae548d3Szrj {
289*fae548d3Szrj   int len;
290*fae548d3Szrj   if (!num_bytes)
291*fae548d3Szrj     len = 4;
292*fae548d3Szrj   else
293*fae548d3Szrj     len = num_bytes * 2;
294*fae548d3Szrj 
295*fae548d3Szrj   assert (value == (unsigned long) value);
296*fae548d3Szrj   if (value || force)
297*fae548d3Szrj     printf ("v%0*lx ", len - 1, (unsigned long) value);
298*fae548d3Szrj   else
299*fae548d3Szrj     printf ("%*s", len + 1, "");
300*fae548d3Szrj }
301*fae548d3Szrj 
302*fae548d3Szrj /* Format a 64-bit value, given as two 32-bit values, in hex.
303*fae548d3Szrj    For reentrancy, this uses a buffer provided by the caller.  */
304*fae548d3Szrj 
305*fae548d3Szrj static const char *
dwarf_vmatoa64(dwarf_vma hvalue,dwarf_vma lvalue,char * buf,unsigned int buf_len)306*fae548d3Szrj dwarf_vmatoa64 (dwarf_vma hvalue, dwarf_vma lvalue, char *buf,
307*fae548d3Szrj 		unsigned int buf_len)
308*fae548d3Szrj {
309*fae548d3Szrj   int len = 0;
310*fae548d3Szrj 
311*fae548d3Szrj   if (hvalue == 0)
312*fae548d3Szrj     snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", lvalue);
313*fae548d3Szrj   else
314*fae548d3Szrj     {
315*fae548d3Szrj       len = snprintf (buf, buf_len, "%" DWARF_VMA_FMT "x", hvalue);
316*fae548d3Szrj       snprintf (buf + len, buf_len - len,
317*fae548d3Szrj 		"%08" DWARF_VMA_FMT "x", lvalue);
318*fae548d3Szrj     }
319*fae548d3Szrj 
320*fae548d3Szrj   return buf;
321*fae548d3Szrj }
322*fae548d3Szrj 
323*fae548d3Szrj /* Read in a LEB128 encoded value starting at address DATA.
324*fae548d3Szrj    If SIGN is true, return a signed LEB128 value.
325*fae548d3Szrj    If LENGTH_RETURN is not NULL, return in it the number of bytes read.
326*fae548d3Szrj    If STATUS_RETURN in not NULL, return with bit 0 (LSB) set if the
327*fae548d3Szrj    terminating byte was not found and with bit 1 set if the value
328*fae548d3Szrj    overflows a dwarf_vma.
329*fae548d3Szrj    No bytes will be read at address END or beyond.  */
330*fae548d3Szrj 
331*fae548d3Szrj dwarf_vma
read_leb128(unsigned char * data,const unsigned char * const end,bfd_boolean sign,unsigned int * length_return,int * status_return)332*fae548d3Szrj read_leb128 (unsigned char *data,
333*fae548d3Szrj 	     const unsigned char *const end,
334*fae548d3Szrj 	     bfd_boolean sign,
335*fae548d3Szrj 	     unsigned int *length_return,
336*fae548d3Szrj 	     int *status_return)
337*fae548d3Szrj {
338*fae548d3Szrj   dwarf_vma result = 0;
339*fae548d3Szrj   unsigned int num_read = 0;
340*fae548d3Szrj   unsigned int shift = 0;
341*fae548d3Szrj   int status = 1;
342*fae548d3Szrj 
343*fae548d3Szrj   while (data < end)
344*fae548d3Szrj     {
345*fae548d3Szrj       unsigned char byte = *data++;
346*fae548d3Szrj       num_read++;
347*fae548d3Szrj 
348*fae548d3Szrj       if (shift < sizeof (result) * 8)
349*fae548d3Szrj 	{
350*fae548d3Szrj 	  result |= ((dwarf_vma) (byte & 0x7f)) << shift;
351*fae548d3Szrj 	  if ((result >> shift) != (byte & 0x7f))
352*fae548d3Szrj 	    /* Overflow.  */
353*fae548d3Szrj 	    status |= 2;
354*fae548d3Szrj 	  shift += 7;
355*fae548d3Szrj 	}
356*fae548d3Szrj       else if ((byte & 0x7f) != 0)
357*fae548d3Szrj 	status |= 2;
358*fae548d3Szrj 
359*fae548d3Szrj       if ((byte & 0x80) == 0)
360*fae548d3Szrj 	{
361*fae548d3Szrj 	  status &= ~1;
362*fae548d3Szrj 	  if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
363*fae548d3Szrj 	    result |= -((dwarf_vma) 1 << shift);
364*fae548d3Szrj 	  break;
365*fae548d3Szrj 	}
366*fae548d3Szrj     }
367*fae548d3Szrj 
368*fae548d3Szrj   if (length_return != NULL)
369*fae548d3Szrj     *length_return = num_read;
370*fae548d3Szrj   if (status_return != NULL)
371*fae548d3Szrj     *status_return = status;
372*fae548d3Szrj 
373*fae548d3Szrj   return result;
374*fae548d3Szrj }
375*fae548d3Szrj 
376*fae548d3Szrj /* Read AMOUNT bytes from PTR and store them in VAL as an unsigned value.
377*fae548d3Szrj    Checks to make sure that the read will not reach or pass END
378*fae548d3Szrj    and that VAL is big enough to hold AMOUNT bytes.  */
379*fae548d3Szrj #define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END)	\
380*fae548d3Szrj   do						\
381*fae548d3Szrj     {						\
382*fae548d3Szrj       unsigned int amount = (AMOUNT);		\
383*fae548d3Szrj       if (sizeof (VAL) < amount)		\
384*fae548d3Szrj 	{					\
385*fae548d3Szrj 	  error (ngettext ("internal error: attempt to read %d byte "	\
386*fae548d3Szrj 			   "of data in to %d sized variable",		\
387*fae548d3Szrj 			   "internal error: attempt to read %d bytes "	\
388*fae548d3Szrj 			   "of data in to %d sized variable",		\
389*fae548d3Szrj 			   amount),					\
390*fae548d3Szrj 		 amount, (int) sizeof (VAL));	\
391*fae548d3Szrj 	  amount = sizeof (VAL);		\
392*fae548d3Szrj 	}					\
393*fae548d3Szrj       if (((PTR) + amount) >= (END))		\
394*fae548d3Szrj 	{					\
395*fae548d3Szrj 	  if ((PTR) < (END))			\
396*fae548d3Szrj 	    amount = (END) - (PTR);		\
397*fae548d3Szrj 	  else					\
398*fae548d3Szrj 	    amount = 0;				\
399*fae548d3Szrj 	}					\
400*fae548d3Szrj       if (amount == 0 || amount > 8)		\
401*fae548d3Szrj 	VAL = 0;				\
402*fae548d3Szrj       else					\
403*fae548d3Szrj 	VAL = byte_get ((PTR), amount);		\
404*fae548d3Szrj     }						\
405*fae548d3Szrj   while (0)
406*fae548d3Szrj 
407*fae548d3Szrj /* Like SAFE_BYTE_GET, but also increments PTR by AMOUNT.  */
408*fae548d3Szrj #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END)	\
409*fae548d3Szrj   do							\
410*fae548d3Szrj     {							\
411*fae548d3Szrj       SAFE_BYTE_GET (VAL, PTR, AMOUNT, END);		\
412*fae548d3Szrj       PTR += AMOUNT;					\
413*fae548d3Szrj     }							\
414*fae548d3Szrj   while (0)
415*fae548d3Szrj 
416*fae548d3Szrj /* Like SAFE_BYTE_GET, but reads a signed value.  */
417*fae548d3Szrj #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END)	\
418*fae548d3Szrj   do							\
419*fae548d3Szrj     {							\
420*fae548d3Szrj       unsigned int amount = (AMOUNT);			\
421*fae548d3Szrj       if (((PTR) + amount) >= (END))			\
422*fae548d3Szrj 	{						\
423*fae548d3Szrj 	  if ((PTR) < (END))				\
424*fae548d3Szrj 	    amount = (END) - (PTR);			\
425*fae548d3Szrj 	  else						\
426*fae548d3Szrj 	    amount = 0;					\
427*fae548d3Szrj 	}						\
428*fae548d3Szrj       if (amount)					\
429*fae548d3Szrj 	VAL = byte_get_signed ((PTR), amount);		\
430*fae548d3Szrj       else						\
431*fae548d3Szrj 	VAL = 0;					\
432*fae548d3Szrj     }							\
433*fae548d3Szrj   while (0)
434*fae548d3Szrj 
435*fae548d3Szrj /* Like SAFE_SIGNED_BYTE_GET, but also increments PTR by AMOUNT.  */
436*fae548d3Szrj #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END)	\
437*fae548d3Szrj   do								\
438*fae548d3Szrj     {								\
439*fae548d3Szrj       SAFE_SIGNED_BYTE_GET (VAL, PTR, AMOUNT, END);		\
440*fae548d3Szrj       PTR += AMOUNT;						\
441*fae548d3Szrj     }								\
442*fae548d3Szrj   while (0)
443*fae548d3Szrj 
444*fae548d3Szrj #define SAFE_BYTE_GET64(PTR, HIGH, LOW, END)		\
445*fae548d3Szrj   do							\
446*fae548d3Szrj     {							\
447*fae548d3Szrj       if (((PTR) + 8) <= (END))				\
448*fae548d3Szrj 	{						\
449*fae548d3Szrj 	  byte_get_64 ((PTR), (HIGH), (LOW));		\
450*fae548d3Szrj 	}						\
451*fae548d3Szrj       else						\
452*fae548d3Szrj 	{						\
453*fae548d3Szrj 	  * (LOW) = * (HIGH) = 0;			\
454*fae548d3Szrj 	}						\
455*fae548d3Szrj     }							\
456*fae548d3Szrj   while (0)
457*fae548d3Szrj 
458*fae548d3Szrj typedef struct State_Machine_Registers
459*fae548d3Szrj {
460*fae548d3Szrj   dwarf_vma address;
461*fae548d3Szrj   unsigned int view;
462*fae548d3Szrj   unsigned int file;
463*fae548d3Szrj   unsigned int line;
464*fae548d3Szrj   unsigned int column;
465*fae548d3Szrj   int is_stmt;
466*fae548d3Szrj   int basic_block;
467*fae548d3Szrj   unsigned char op_index;
468*fae548d3Szrj   unsigned char end_sequence;
469*fae548d3Szrj   /* This variable hold the number of the last entry seen
470*fae548d3Szrj      in the File Table.  */
471*fae548d3Szrj   unsigned int last_file_entry;
472*fae548d3Szrj } SMR;
473*fae548d3Szrj 
474*fae548d3Szrj static SMR state_machine_regs;
475*fae548d3Szrj 
476*fae548d3Szrj static void
reset_state_machine(int is_stmt)477*fae548d3Szrj reset_state_machine (int is_stmt)
478*fae548d3Szrj {
479*fae548d3Szrj   state_machine_regs.address = 0;
480*fae548d3Szrj   state_machine_regs.view = 0;
481*fae548d3Szrj   state_machine_regs.op_index = 0;
482*fae548d3Szrj   state_machine_regs.file = 1;
483*fae548d3Szrj   state_machine_regs.line = 1;
484*fae548d3Szrj   state_machine_regs.column = 0;
485*fae548d3Szrj   state_machine_regs.is_stmt = is_stmt;
486*fae548d3Szrj   state_machine_regs.basic_block = 0;
487*fae548d3Szrj   state_machine_regs.end_sequence = 0;
488*fae548d3Szrj   state_machine_regs.last_file_entry = 0;
489*fae548d3Szrj }
490*fae548d3Szrj 
491*fae548d3Szrj /* Handled an extend line op.
492*fae548d3Szrj    Returns the number of bytes read.  */
493*fae548d3Szrj 
494*fae548d3Szrj static size_t
process_extended_line_op(unsigned char * data,int is_stmt,unsigned char * end)495*fae548d3Szrj process_extended_line_op (unsigned char * data,
496*fae548d3Szrj 			  int is_stmt,
497*fae548d3Szrj 			  unsigned char * end)
498*fae548d3Szrj {
499*fae548d3Szrj   unsigned char op_code;
500*fae548d3Szrj   size_t len, header_len;
501*fae548d3Szrj   unsigned char *name;
502*fae548d3Szrj   unsigned char *orig_data = data;
503*fae548d3Szrj   dwarf_vma adr, val;
504*fae548d3Szrj 
505*fae548d3Szrj   READ_ULEB (len, data, end);
506*fae548d3Szrj   header_len = data - orig_data;
507*fae548d3Szrj 
508*fae548d3Szrj   if (len == 0 || data == end || len > (size_t) (end - data))
509*fae548d3Szrj     {
510*fae548d3Szrj       warn (_("Badly formed extended line op encountered!\n"));
511*fae548d3Szrj       return header_len;
512*fae548d3Szrj     }
513*fae548d3Szrj 
514*fae548d3Szrj   op_code = *data++;
515*fae548d3Szrj 
516*fae548d3Szrj   printf (_("  Extended opcode %d: "), op_code);
517*fae548d3Szrj 
518*fae548d3Szrj   switch (op_code)
519*fae548d3Szrj     {
520*fae548d3Szrj     case DW_LNE_end_sequence:
521*fae548d3Szrj       printf (_("End of Sequence\n\n"));
522*fae548d3Szrj       reset_state_machine (is_stmt);
523*fae548d3Szrj       break;
524*fae548d3Szrj 
525*fae548d3Szrj     case DW_LNE_set_address:
526*fae548d3Szrj       /* PR 17512: file: 002-100480-0.004.  */
527*fae548d3Szrj       if (len - 1 > 8)
528*fae548d3Szrj 	{
529*fae548d3Szrj 	  warn (_("Length (%lu) of DW_LNE_set_address op is too long\n"),
530*fae548d3Szrj 		(unsigned long) len - 1);
531*fae548d3Szrj 	  adr = 0;
532*fae548d3Szrj 	}
533*fae548d3Szrj       else
534*fae548d3Szrj 	SAFE_BYTE_GET (adr, data, len - 1, end);
535*fae548d3Szrj       printf (_("set Address to 0x%s\n"), dwarf_vmatoa ("x", adr));
536*fae548d3Szrj       state_machine_regs.address = adr;
537*fae548d3Szrj       state_machine_regs.view = 0;
538*fae548d3Szrj       state_machine_regs.op_index = 0;
539*fae548d3Szrj       break;
540*fae548d3Szrj 
541*fae548d3Szrj     case DW_LNE_define_file:
542*fae548d3Szrj       printf (_("define new File Table entry\n"));
543*fae548d3Szrj       printf (_("  Entry\tDir\tTime\tSize\tName\n"));
544*fae548d3Szrj       printf ("   %d\t", ++state_machine_regs.last_file_entry);
545*fae548d3Szrj 
546*fae548d3Szrj       {
547*fae548d3Szrj 	size_t l;
548*fae548d3Szrj 
549*fae548d3Szrj 	name = data;
550*fae548d3Szrj 	l = strnlen ((char *) data, end - data);
551*fae548d3Szrj 	data += l + 1;
552*fae548d3Szrj 	READ_ULEB (val, data, end);
553*fae548d3Szrj 	printf ("%s\t", dwarf_vmatoa ("u", val));
554*fae548d3Szrj 	READ_ULEB (val, data, end);
555*fae548d3Szrj 	printf ("%s\t", dwarf_vmatoa ("u", val));
556*fae548d3Szrj 	READ_ULEB (val, data, end);
557*fae548d3Szrj 	printf ("%s\t", dwarf_vmatoa ("u", val));
558*fae548d3Szrj 	printf ("%.*s\n\n", (int) l, name);
559*fae548d3Szrj       }
560*fae548d3Szrj 
561*fae548d3Szrj       if (((size_t) (data - orig_data) != len + header_len) || data == end)
562*fae548d3Szrj 	warn (_("DW_LNE_define_file: Bad opcode length\n"));
563*fae548d3Szrj       break;
564*fae548d3Szrj 
565*fae548d3Szrj     case DW_LNE_set_discriminator:
566*fae548d3Szrj       READ_ULEB (val, data, end);
567*fae548d3Szrj       printf (_("set Discriminator to %s\n"), dwarf_vmatoa ("u", val));
568*fae548d3Szrj       break;
569*fae548d3Szrj 
570*fae548d3Szrj     /* HP extensions.  */
571*fae548d3Szrj     case DW_LNE_HP_negate_is_UV_update:
572*fae548d3Szrj       printf ("DW_LNE_HP_negate_is_UV_update\n");
573*fae548d3Szrj       break;
574*fae548d3Szrj     case DW_LNE_HP_push_context:
575*fae548d3Szrj       printf ("DW_LNE_HP_push_context\n");
576*fae548d3Szrj       break;
577*fae548d3Szrj     case DW_LNE_HP_pop_context:
578*fae548d3Szrj       printf ("DW_LNE_HP_pop_context\n");
579*fae548d3Szrj       break;
580*fae548d3Szrj     case DW_LNE_HP_set_file_line_column:
581*fae548d3Szrj       printf ("DW_LNE_HP_set_file_line_column\n");
582*fae548d3Szrj       break;
583*fae548d3Szrj     case DW_LNE_HP_set_routine_name:
584*fae548d3Szrj       printf ("DW_LNE_HP_set_routine_name\n");
585*fae548d3Szrj       break;
586*fae548d3Szrj     case DW_LNE_HP_set_sequence:
587*fae548d3Szrj       printf ("DW_LNE_HP_set_sequence\n");
588*fae548d3Szrj       break;
589*fae548d3Szrj     case DW_LNE_HP_negate_post_semantics:
590*fae548d3Szrj       printf ("DW_LNE_HP_negate_post_semantics\n");
591*fae548d3Szrj       break;
592*fae548d3Szrj     case DW_LNE_HP_negate_function_exit:
593*fae548d3Szrj       printf ("DW_LNE_HP_negate_function_exit\n");
594*fae548d3Szrj       break;
595*fae548d3Szrj     case DW_LNE_HP_negate_front_end_logical:
596*fae548d3Szrj       printf ("DW_LNE_HP_negate_front_end_logical\n");
597*fae548d3Szrj       break;
598*fae548d3Szrj     case DW_LNE_HP_define_proc:
599*fae548d3Szrj       printf ("DW_LNE_HP_define_proc\n");
600*fae548d3Szrj       break;
601*fae548d3Szrj     case DW_LNE_HP_source_file_correlation:
602*fae548d3Szrj       {
603*fae548d3Szrj 	unsigned char *edata = data + len - 1;
604*fae548d3Szrj 
605*fae548d3Szrj 	printf ("DW_LNE_HP_source_file_correlation\n");
606*fae548d3Szrj 
607*fae548d3Szrj 	while (data < edata)
608*fae548d3Szrj 	  {
609*fae548d3Szrj 	    unsigned int opc;
610*fae548d3Szrj 
611*fae548d3Szrj 	    READ_ULEB (opc, data, edata);
612*fae548d3Szrj 
613*fae548d3Szrj 	    switch (opc)
614*fae548d3Szrj 	      {
615*fae548d3Szrj 	      case DW_LNE_HP_SFC_formfeed:
616*fae548d3Szrj 		printf ("    DW_LNE_HP_SFC_formfeed\n");
617*fae548d3Szrj 		break;
618*fae548d3Szrj 	      case DW_LNE_HP_SFC_set_listing_line:
619*fae548d3Szrj 		READ_ULEB (val, data, edata);
620*fae548d3Szrj 		printf ("    DW_LNE_HP_SFC_set_listing_line (%s)\n",
621*fae548d3Szrj 			dwarf_vmatoa ("u", val));
622*fae548d3Szrj 		break;
623*fae548d3Szrj 	      case DW_LNE_HP_SFC_associate:
624*fae548d3Szrj 		printf ("    DW_LNE_HP_SFC_associate ");
625*fae548d3Szrj 		READ_ULEB (val, data, edata);
626*fae548d3Szrj 		printf ("(%s", dwarf_vmatoa ("u", val));
627*fae548d3Szrj 		READ_ULEB (val, data, edata);
628*fae548d3Szrj 		printf (",%s", dwarf_vmatoa ("u", val));
629*fae548d3Szrj 		READ_ULEB (val, data, edata);
630*fae548d3Szrj 		printf (",%s)\n", dwarf_vmatoa ("u", val));
631*fae548d3Szrj 		break;
632*fae548d3Szrj 	      default:
633*fae548d3Szrj 		printf (_("    UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc);
634*fae548d3Szrj 		data = edata;
635*fae548d3Szrj 		break;
636*fae548d3Szrj 	      }
637*fae548d3Szrj 	  }
638*fae548d3Szrj       }
639*fae548d3Szrj       break;
640*fae548d3Szrj 
641*fae548d3Szrj     default:
642*fae548d3Szrj       {
643*fae548d3Szrj 	unsigned int rlen = len - 1;
644*fae548d3Szrj 
645*fae548d3Szrj 	if (op_code >= DW_LNE_lo_user
646*fae548d3Szrj 	    /* The test against DW_LNW_hi_user is redundant due to
647*fae548d3Szrj 	       the limited range of the unsigned char data type used
648*fae548d3Szrj 	       for op_code.  */
649*fae548d3Szrj 	    /*&& op_code <= DW_LNE_hi_user*/)
650*fae548d3Szrj 	  printf (_("user defined: "));
651*fae548d3Szrj 	else
652*fae548d3Szrj 	  printf (_("UNKNOWN: "));
653*fae548d3Szrj 	printf (_("length %d ["), rlen);
654*fae548d3Szrj 	for (; rlen; rlen--)
655*fae548d3Szrj 	  printf (" %02x", *data++);
656*fae548d3Szrj 	printf ("]\n");
657*fae548d3Szrj       }
658*fae548d3Szrj       break;
659*fae548d3Szrj     }
660*fae548d3Szrj 
661*fae548d3Szrj   return len + header_len;
662*fae548d3Szrj }
663*fae548d3Szrj 
664*fae548d3Szrj static const unsigned char *
fetch_indirect_string(dwarf_vma offset)665*fae548d3Szrj fetch_indirect_string (dwarf_vma offset)
666*fae548d3Szrj {
667*fae548d3Szrj   struct dwarf_section *section = &debug_displays [str].section;
668*fae548d3Szrj   const unsigned char * ret;
669*fae548d3Szrj 
670*fae548d3Szrj   if (section->start == NULL)
671*fae548d3Szrj     return (const unsigned char *) _("<no .debug_str section>");
672*fae548d3Szrj 
673*fae548d3Szrj   if (offset >= section->size)
674*fae548d3Szrj     {
675*fae548d3Szrj       warn (_("DW_FORM_strp offset too big: %s\n"),
676*fae548d3Szrj 	    dwarf_vmatoa ("x", offset));
677*fae548d3Szrj       return (const unsigned char *) _("<offset is too big>");
678*fae548d3Szrj     }
679*fae548d3Szrj 
680*fae548d3Szrj   ret = section->start + offset;
681*fae548d3Szrj   /* Unfortunately we cannot rely upon the .debug_str section ending with a
682*fae548d3Szrj      NUL byte.  Since our caller is expecting to receive a well formed C
683*fae548d3Szrj      string we test for the lack of a terminating byte here.  */
684*fae548d3Szrj   if (strnlen ((const char *) ret, section->size - offset)
685*fae548d3Szrj       == section->size - offset)
686*fae548d3Szrj     ret = (const unsigned char *)
687*fae548d3Szrj       _("<no NUL byte at end of .debug_str section>");
688*fae548d3Szrj 
689*fae548d3Szrj   return ret;
690*fae548d3Szrj }
691*fae548d3Szrj 
692*fae548d3Szrj static const unsigned char *
fetch_indirect_line_string(dwarf_vma offset)693*fae548d3Szrj fetch_indirect_line_string (dwarf_vma offset)
694*fae548d3Szrj {
695*fae548d3Szrj   struct dwarf_section *section = &debug_displays [line_str].section;
696*fae548d3Szrj   const unsigned char * ret;
697*fae548d3Szrj 
698*fae548d3Szrj   if (section->start == NULL)
699*fae548d3Szrj     return (const unsigned char *) _("<no .debug_line_str section>");
700*fae548d3Szrj 
701*fae548d3Szrj   if (offset >= section->size)
702*fae548d3Szrj     {
703*fae548d3Szrj       warn (_("DW_FORM_line_strp offset too big: %s\n"),
704*fae548d3Szrj 	    dwarf_vmatoa ("x", offset));
705*fae548d3Szrj       return (const unsigned char *) _("<offset is too big>");
706*fae548d3Szrj     }
707*fae548d3Szrj 
708*fae548d3Szrj   ret = section->start + offset;
709*fae548d3Szrj   /* Unfortunately we cannot rely upon the .debug_line_str section ending
710*fae548d3Szrj      with a NUL byte.  Since our caller is expecting to receive a well formed
711*fae548d3Szrj      C string we test for the lack of a terminating byte here.  */
712*fae548d3Szrj   if (strnlen ((const char *) ret, section->size - offset)
713*fae548d3Szrj       == section->size - offset)
714*fae548d3Szrj     ret = (const unsigned char *)
715*fae548d3Szrj       _("<no NUL byte at end of .debug_line_str section>");
716*fae548d3Szrj 
717*fae548d3Szrj   return ret;
718*fae548d3Szrj }
719*fae548d3Szrj 
720*fae548d3Szrj static const char *
fetch_indexed_string(dwarf_vma idx,struct cu_tu_set * this_set,dwarf_vma offset_size,bfd_boolean dwo)721*fae548d3Szrj fetch_indexed_string (dwarf_vma idx, struct cu_tu_set *this_set,
722*fae548d3Szrj 		      dwarf_vma offset_size, bfd_boolean dwo)
723*fae548d3Szrj {
724*fae548d3Szrj   enum dwarf_section_display_enum str_sec_idx = dwo ? str_dwo : str;
725*fae548d3Szrj   enum dwarf_section_display_enum idx_sec_idx = dwo ? str_index_dwo : str_index;
726*fae548d3Szrj   struct dwarf_section *index_section = &debug_displays [idx_sec_idx].section;
727*fae548d3Szrj   struct dwarf_section *str_section = &debug_displays [str_sec_idx].section;
728*fae548d3Szrj   dwarf_vma index_offset = idx * offset_size;
729*fae548d3Szrj   dwarf_vma str_offset;
730*fae548d3Szrj   const char * ret;
731*fae548d3Szrj 
732*fae548d3Szrj   if (index_section->start == NULL)
733*fae548d3Szrj     return (dwo ? _("<no .debug_str_offsets.dwo section>")
734*fae548d3Szrj 		: _("<no .debug_str_offsets section>"));
735*fae548d3Szrj 
736*fae548d3Szrj   if (this_set != NULL)
737*fae548d3Szrj     index_offset += this_set->section_offsets [DW_SECT_STR_OFFSETS];
738*fae548d3Szrj   if (index_offset >= index_section->size)
739*fae548d3Szrj     {
740*fae548d3Szrj       warn (_("DW_FORM_GNU_str_index offset too big: %s\n"),
741*fae548d3Szrj 	    dwarf_vmatoa ("x", index_offset));
742*fae548d3Szrj       return _("<index offset is too big>");
743*fae548d3Szrj     }
744*fae548d3Szrj 
745*fae548d3Szrj   if (str_section->start == NULL)
746*fae548d3Szrj     return (dwo ? _("<no .debug_str.dwo section>")
747*fae548d3Szrj 		: _("<no .debug_str section>"));
748*fae548d3Szrj 
749*fae548d3Szrj   str_offset = byte_get (index_section->start + index_offset, offset_size);
750*fae548d3Szrj   str_offset -= str_section->address;
751*fae548d3Szrj   if (str_offset >= str_section->size)
752*fae548d3Szrj     {
753*fae548d3Szrj       warn (_("DW_FORM_GNU_str_index indirect offset too big: %s\n"),
754*fae548d3Szrj 	    dwarf_vmatoa ("x", str_offset));
755*fae548d3Szrj       return _("<indirect index offset is too big>");
756*fae548d3Szrj     }
757*fae548d3Szrj 
758*fae548d3Szrj   ret = (const char *) str_section->start + str_offset;
759*fae548d3Szrj   /* Unfortunately we cannot rely upon str_section ending with a NUL byte.
760*fae548d3Szrj      Since our caller is expecting to receive a well formed C string we test
761*fae548d3Szrj      for the lack of a terminating byte here.  */
762*fae548d3Szrj   if (strnlen (ret, str_section->size - str_offset)
763*fae548d3Szrj       == str_section->size - str_offset)
764*fae548d3Szrj     ret = (const char *) _("<no NUL byte at end of section>");
765*fae548d3Szrj 
766*fae548d3Szrj   return ret;
767*fae548d3Szrj }
768*fae548d3Szrj 
769*fae548d3Szrj static const char *
fetch_indexed_value(dwarf_vma offset,dwarf_vma bytes)770*fae548d3Szrj fetch_indexed_value (dwarf_vma offset, dwarf_vma bytes)
771*fae548d3Szrj {
772*fae548d3Szrj   struct dwarf_section *section = &debug_displays [debug_addr].section;
773*fae548d3Szrj 
774*fae548d3Szrj   if (section->start == NULL)
775*fae548d3Szrj     return (_("<no .debug_addr section>"));
776*fae548d3Szrj 
777*fae548d3Szrj   if (offset + bytes > section->size)
778*fae548d3Szrj     {
779*fae548d3Szrj       warn (_("Offset into section %s too big: %s\n"),
780*fae548d3Szrj 	    section->name, dwarf_vmatoa ("x", offset));
781*fae548d3Szrj       return "<offset too big>";
782*fae548d3Szrj     }
783*fae548d3Szrj 
784*fae548d3Szrj   return dwarf_vmatoa ("x", byte_get (section->start + offset, bytes));
785*fae548d3Szrj }
786*fae548d3Szrj 
787*fae548d3Szrj 
788*fae548d3Szrj /* FIXME:  There are better and more efficient ways to handle
789*fae548d3Szrj    these structures.  For now though, I just want something that
790*fae548d3Szrj    is simple to implement.  */
791*fae548d3Szrj typedef struct abbrev_attr
792*fae548d3Szrj {
793*fae548d3Szrj   unsigned long attribute;
794*fae548d3Szrj   unsigned long form;
795*fae548d3Szrj   bfd_signed_vma implicit_const;
796*fae548d3Szrj   struct abbrev_attr *next;
797*fae548d3Szrj }
798*fae548d3Szrj abbrev_attr;
799*fae548d3Szrj 
800*fae548d3Szrj typedef struct abbrev_entry
801*fae548d3Szrj {
802*fae548d3Szrj   unsigned long entry;
803*fae548d3Szrj   unsigned long tag;
804*fae548d3Szrj   int children;
805*fae548d3Szrj   struct abbrev_attr *first_attr;
806*fae548d3Szrj   struct abbrev_attr *last_attr;
807*fae548d3Szrj   struct abbrev_entry *next;
808*fae548d3Szrj }
809*fae548d3Szrj abbrev_entry;
810*fae548d3Szrj 
811*fae548d3Szrj static abbrev_entry *first_abbrev = NULL;
812*fae548d3Szrj static abbrev_entry *last_abbrev = NULL;
813*fae548d3Szrj 
814*fae548d3Szrj static void
free_abbrevs(void)815*fae548d3Szrj free_abbrevs (void)
816*fae548d3Szrj {
817*fae548d3Szrj   abbrev_entry *abbrv;
818*fae548d3Szrj 
819*fae548d3Szrj   for (abbrv = first_abbrev; abbrv;)
820*fae548d3Szrj     {
821*fae548d3Szrj       abbrev_entry *next_abbrev = abbrv->next;
822*fae548d3Szrj       abbrev_attr *attr;
823*fae548d3Szrj 
824*fae548d3Szrj       for (attr = abbrv->first_attr; attr;)
825*fae548d3Szrj 	{
826*fae548d3Szrj 	  abbrev_attr *next_attr = attr->next;
827*fae548d3Szrj 
828*fae548d3Szrj 	  free (attr);
829*fae548d3Szrj 	  attr = next_attr;
830*fae548d3Szrj 	}
831*fae548d3Szrj 
832*fae548d3Szrj       free (abbrv);
833*fae548d3Szrj       abbrv = next_abbrev;
834*fae548d3Szrj     }
835*fae548d3Szrj 
836*fae548d3Szrj   last_abbrev = first_abbrev = NULL;
837*fae548d3Szrj }
838*fae548d3Szrj 
839*fae548d3Szrj static void
add_abbrev(unsigned long number,unsigned long tag,int children)840*fae548d3Szrj add_abbrev (unsigned long number, unsigned long tag, int children)
841*fae548d3Szrj {
842*fae548d3Szrj   abbrev_entry *entry;
843*fae548d3Szrj 
844*fae548d3Szrj   entry = (abbrev_entry *) malloc (sizeof (*entry));
845*fae548d3Szrj   if (entry == NULL)
846*fae548d3Szrj     /* ugg */
847*fae548d3Szrj     return;
848*fae548d3Szrj 
849*fae548d3Szrj   entry->entry      = number;
850*fae548d3Szrj   entry->tag        = tag;
851*fae548d3Szrj   entry->children   = children;
852*fae548d3Szrj   entry->first_attr = NULL;
853*fae548d3Szrj   entry->last_attr  = NULL;
854*fae548d3Szrj   entry->next       = NULL;
855*fae548d3Szrj 
856*fae548d3Szrj   if (first_abbrev == NULL)
857*fae548d3Szrj     first_abbrev = entry;
858*fae548d3Szrj   else
859*fae548d3Szrj     last_abbrev->next = entry;
860*fae548d3Szrj 
861*fae548d3Szrj   last_abbrev = entry;
862*fae548d3Szrj }
863*fae548d3Szrj 
864*fae548d3Szrj static void
add_abbrev_attr(unsigned long attribute,unsigned long form,bfd_signed_vma implicit_const)865*fae548d3Szrj add_abbrev_attr (unsigned long attribute, unsigned long form,
866*fae548d3Szrj 		 bfd_signed_vma implicit_const)
867*fae548d3Szrj {
868*fae548d3Szrj   abbrev_attr *attr;
869*fae548d3Szrj 
870*fae548d3Szrj   attr = (abbrev_attr *) malloc (sizeof (*attr));
871*fae548d3Szrj   if (attr == NULL)
872*fae548d3Szrj     /* ugg */
873*fae548d3Szrj     return;
874*fae548d3Szrj 
875*fae548d3Szrj   attr->attribute = attribute;
876*fae548d3Szrj   attr->form      = form;
877*fae548d3Szrj   attr->implicit_const = implicit_const;
878*fae548d3Szrj   attr->next      = NULL;
879*fae548d3Szrj 
880*fae548d3Szrj   if (last_abbrev->first_attr == NULL)
881*fae548d3Szrj     last_abbrev->first_attr = attr;
882*fae548d3Szrj   else
883*fae548d3Szrj     last_abbrev->last_attr->next = attr;
884*fae548d3Szrj 
885*fae548d3Szrj   last_abbrev->last_attr = attr;
886*fae548d3Szrj }
887*fae548d3Szrj 
888*fae548d3Szrj /* Processes the (partial) contents of a .debug_abbrev section.
889*fae548d3Szrj    Returns NULL if the end of the section was encountered.
890*fae548d3Szrj    Returns the address after the last byte read if the end of
891*fae548d3Szrj    an abbreviation set was found.  */
892*fae548d3Szrj 
893*fae548d3Szrj static unsigned char *
process_abbrev_section(unsigned char * start,unsigned char * end)894*fae548d3Szrj process_abbrev_section (unsigned char *start, unsigned char *end)
895*fae548d3Szrj {
896*fae548d3Szrj   if (first_abbrev != NULL)
897*fae548d3Szrj     return NULL;
898*fae548d3Szrj 
899*fae548d3Szrj   while (start < end)
900*fae548d3Szrj     {
901*fae548d3Szrj       unsigned long entry;
902*fae548d3Szrj       unsigned long tag;
903*fae548d3Szrj       unsigned long attribute;
904*fae548d3Szrj       int children;
905*fae548d3Szrj 
906*fae548d3Szrj       READ_ULEB (entry, start, end);
907*fae548d3Szrj 
908*fae548d3Szrj       /* A single zero is supposed to end the section according
909*fae548d3Szrj 	 to the standard.  If there's more, then signal that to
910*fae548d3Szrj 	 the caller.  */
911*fae548d3Szrj       if (start == end)
912*fae548d3Szrj 	return NULL;
913*fae548d3Szrj       if (entry == 0)
914*fae548d3Szrj 	return start;
915*fae548d3Szrj 
916*fae548d3Szrj       READ_ULEB (tag, start, end);
917*fae548d3Szrj       if (start == end)
918*fae548d3Szrj 	return NULL;
919*fae548d3Szrj 
920*fae548d3Szrj       children = *start++;
921*fae548d3Szrj 
922*fae548d3Szrj       add_abbrev (entry, tag, children);
923*fae548d3Szrj 
924*fae548d3Szrj       do
925*fae548d3Szrj 	{
926*fae548d3Szrj 	  unsigned long form;
927*fae548d3Szrj 	  /* Initialize it due to a false compiler warning.  */
928*fae548d3Szrj 	  bfd_signed_vma implicit_const = -1;
929*fae548d3Szrj 
930*fae548d3Szrj 	  READ_ULEB (attribute, start, end);
931*fae548d3Szrj 	  if (start == end)
932*fae548d3Szrj 	    break;
933*fae548d3Szrj 
934*fae548d3Szrj 	  READ_ULEB (form, start, end);
935*fae548d3Szrj 	  if (start == end)
936*fae548d3Szrj 	    break;
937*fae548d3Szrj 
938*fae548d3Szrj 	  if (form == DW_FORM_implicit_const)
939*fae548d3Szrj 	    {
940*fae548d3Szrj 	      READ_SLEB (implicit_const, start, end);
941*fae548d3Szrj 	      if (start == end)
942*fae548d3Szrj 		break;
943*fae548d3Szrj 	    }
944*fae548d3Szrj 
945*fae548d3Szrj 	  add_abbrev_attr (attribute, form, implicit_const);
946*fae548d3Szrj 	}
947*fae548d3Szrj       while (attribute != 0);
948*fae548d3Szrj     }
949*fae548d3Szrj 
950*fae548d3Szrj   /* Report the missing single zero which ends the section.  */
951*fae548d3Szrj   error (_(".debug_abbrev section not zero terminated\n"));
952*fae548d3Szrj 
953*fae548d3Szrj   return NULL;
954*fae548d3Szrj }
955*fae548d3Szrj 
956*fae548d3Szrj static const char *
get_TAG_name(unsigned long tag)957*fae548d3Szrj get_TAG_name (unsigned long tag)
958*fae548d3Szrj {
959*fae548d3Szrj   const char *name = get_DW_TAG_name ((unsigned int) tag);
960*fae548d3Szrj 
961*fae548d3Szrj   if (name == NULL)
962*fae548d3Szrj     {
963*fae548d3Szrj       static char buffer[100];
964*fae548d3Szrj 
965*fae548d3Szrj       if (tag >= DW_TAG_lo_user && tag <= DW_TAG_hi_user)
966*fae548d3Szrj 	snprintf (buffer, sizeof (buffer), _("User TAG value: %#lx"), tag);
967*fae548d3Szrj       else
968*fae548d3Szrj 	snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %#lx"), tag);
969*fae548d3Szrj       return buffer;
970*fae548d3Szrj     }
971*fae548d3Szrj 
972*fae548d3Szrj   return name;
973*fae548d3Szrj }
974*fae548d3Szrj 
975*fae548d3Szrj static const char *
get_FORM_name(unsigned long form)976*fae548d3Szrj get_FORM_name (unsigned long form)
977*fae548d3Szrj {
978*fae548d3Szrj   const char *name;
979*fae548d3Szrj 
980*fae548d3Szrj   if (form == 0)
981*fae548d3Szrj     return "DW_FORM value: 0";
982*fae548d3Szrj 
983*fae548d3Szrj   name = get_DW_FORM_name (form);
984*fae548d3Szrj   if (name == NULL)
985*fae548d3Szrj     {
986*fae548d3Szrj       static char buffer[100];
987*fae548d3Szrj 
988*fae548d3Szrj       snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
989*fae548d3Szrj       return buffer;
990*fae548d3Szrj     }
991*fae548d3Szrj 
992*fae548d3Szrj   return name;
993*fae548d3Szrj }
994*fae548d3Szrj 
995*fae548d3Szrj static const char *
get_IDX_name(unsigned long idx)996*fae548d3Szrj get_IDX_name (unsigned long idx)
997*fae548d3Szrj {
998*fae548d3Szrj   const char *name = get_DW_IDX_name ((unsigned int) idx);
999*fae548d3Szrj 
1000*fae548d3Szrj   if (name == NULL)
1001*fae548d3Szrj     {
1002*fae548d3Szrj       static char buffer[100];
1003*fae548d3Szrj 
1004*fae548d3Szrj       snprintf (buffer, sizeof (buffer), _("Unknown IDX value: %lx"), idx);
1005*fae548d3Szrj       return buffer;
1006*fae548d3Szrj     }
1007*fae548d3Szrj 
1008*fae548d3Szrj   return name;
1009*fae548d3Szrj }
1010*fae548d3Szrj 
1011*fae548d3Szrj static unsigned char *
display_block(unsigned char * data,dwarf_vma length,const unsigned char * const end,char delimiter)1012*fae548d3Szrj display_block (unsigned char *data,
1013*fae548d3Szrj 	       dwarf_vma length,
1014*fae548d3Szrj 	       const unsigned char * const end, char delimiter)
1015*fae548d3Szrj {
1016*fae548d3Szrj   dwarf_vma maxlen;
1017*fae548d3Szrj 
1018*fae548d3Szrj   printf (_("%c%s byte block: "), delimiter, dwarf_vmatoa ("u", length));
1019*fae548d3Szrj   if (data > end)
1020*fae548d3Szrj     return (unsigned char *) end;
1021*fae548d3Szrj 
1022*fae548d3Szrj   maxlen = (dwarf_vma) (end - data);
1023*fae548d3Szrj   length = length > maxlen ? maxlen : length;
1024*fae548d3Szrj 
1025*fae548d3Szrj   while (length --)
1026*fae548d3Szrj     printf ("%lx ", (unsigned long) byte_get (data++, 1));
1027*fae548d3Szrj 
1028*fae548d3Szrj   return data;
1029*fae548d3Szrj }
1030*fae548d3Szrj 
1031*fae548d3Szrj 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)1032*fae548d3Szrj decode_location_expression (unsigned char * data,
1033*fae548d3Szrj 			    unsigned int pointer_size,
1034*fae548d3Szrj 			    unsigned int offset_size,
1035*fae548d3Szrj 			    int dwarf_version,
1036*fae548d3Szrj 			    dwarf_vma length,
1037*fae548d3Szrj 			    dwarf_vma cu_offset,
1038*fae548d3Szrj 			    struct dwarf_section * section)
1039*fae548d3Szrj {
1040*fae548d3Szrj   unsigned op;
1041*fae548d3Szrj   dwarf_vma uvalue;
1042*fae548d3Szrj   dwarf_signed_vma svalue;
1043*fae548d3Szrj   unsigned char *end = data + length;
1044*fae548d3Szrj   int need_frame_base = 0;
1045*fae548d3Szrj 
1046*fae548d3Szrj   while (data < end)
1047*fae548d3Szrj     {
1048*fae548d3Szrj       op = *data++;
1049*fae548d3Szrj 
1050*fae548d3Szrj       switch (op)
1051*fae548d3Szrj 	{
1052*fae548d3Szrj 	case DW_OP_addr:
1053*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1054*fae548d3Szrj 	  printf ("DW_OP_addr: %s", dwarf_vmatoa ("x", uvalue));
1055*fae548d3Szrj 	  break;
1056*fae548d3Szrj 	case DW_OP_deref:
1057*fae548d3Szrj 	  printf ("DW_OP_deref");
1058*fae548d3Szrj 	  break;
1059*fae548d3Szrj 	case DW_OP_const1u:
1060*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1061*fae548d3Szrj 	  printf ("DW_OP_const1u: %lu", (unsigned long) uvalue);
1062*fae548d3Szrj 	  break;
1063*fae548d3Szrj 	case DW_OP_const1s:
1064*fae548d3Szrj 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 1, end);
1065*fae548d3Szrj 	  printf ("DW_OP_const1s: %ld", (long) svalue);
1066*fae548d3Szrj 	  break;
1067*fae548d3Szrj 	case DW_OP_const2u:
1068*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1069*fae548d3Szrj 	  printf ("DW_OP_const2u: %lu", (unsigned long) uvalue);
1070*fae548d3Szrj 	  break;
1071*fae548d3Szrj 	case DW_OP_const2s:
1072*fae548d3Szrj 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1073*fae548d3Szrj 	  printf ("DW_OP_const2s: %ld", (long) svalue);
1074*fae548d3Szrj 	  break;
1075*fae548d3Szrj 	case DW_OP_const4u:
1076*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1077*fae548d3Szrj 	  printf ("DW_OP_const4u: %lu", (unsigned long) uvalue);
1078*fae548d3Szrj 	  break;
1079*fae548d3Szrj 	case DW_OP_const4s:
1080*fae548d3Szrj 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1081*fae548d3Szrj 	  printf ("DW_OP_const4s: %ld", (long) svalue);
1082*fae548d3Szrj 	  break;
1083*fae548d3Szrj 	case DW_OP_const8u:
1084*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1085*fae548d3Szrj 	  printf ("DW_OP_const8u: %lu ", (unsigned long) uvalue);
1086*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1087*fae548d3Szrj 	  printf ("%lu", (unsigned long) uvalue);
1088*fae548d3Szrj 	  break;
1089*fae548d3Szrj 	case DW_OP_const8s:
1090*fae548d3Szrj 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1091*fae548d3Szrj 	  printf ("DW_OP_const8s: %ld ", (long) svalue);
1092*fae548d3Szrj 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1093*fae548d3Szrj 	  printf ("%ld", (long) svalue);
1094*fae548d3Szrj 	  break;
1095*fae548d3Szrj 	case DW_OP_constu:
1096*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1097*fae548d3Szrj 	  printf ("DW_OP_constu: %s", dwarf_vmatoa ("u", uvalue));
1098*fae548d3Szrj 	  break;
1099*fae548d3Szrj 	case DW_OP_consts:
1100*fae548d3Szrj 	  READ_SLEB (svalue, data, end);
1101*fae548d3Szrj 	  printf ("DW_OP_consts: %s", dwarf_vmatoa ("d", svalue));
1102*fae548d3Szrj 	  break;
1103*fae548d3Szrj 	case DW_OP_dup:
1104*fae548d3Szrj 	  printf ("DW_OP_dup");
1105*fae548d3Szrj 	  break;
1106*fae548d3Szrj 	case DW_OP_drop:
1107*fae548d3Szrj 	  printf ("DW_OP_drop");
1108*fae548d3Szrj 	  break;
1109*fae548d3Szrj 	case DW_OP_over:
1110*fae548d3Szrj 	  printf ("DW_OP_over");
1111*fae548d3Szrj 	  break;
1112*fae548d3Szrj 	case DW_OP_pick:
1113*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1114*fae548d3Szrj 	  printf ("DW_OP_pick: %ld", (unsigned long) uvalue);
1115*fae548d3Szrj 	  break;
1116*fae548d3Szrj 	case DW_OP_swap:
1117*fae548d3Szrj 	  printf ("DW_OP_swap");
1118*fae548d3Szrj 	  break;
1119*fae548d3Szrj 	case DW_OP_rot:
1120*fae548d3Szrj 	  printf ("DW_OP_rot");
1121*fae548d3Szrj 	  break;
1122*fae548d3Szrj 	case DW_OP_xderef:
1123*fae548d3Szrj 	  printf ("DW_OP_xderef");
1124*fae548d3Szrj 	  break;
1125*fae548d3Szrj 	case DW_OP_abs:
1126*fae548d3Szrj 	  printf ("DW_OP_abs");
1127*fae548d3Szrj 	  break;
1128*fae548d3Szrj 	case DW_OP_and:
1129*fae548d3Szrj 	  printf ("DW_OP_and");
1130*fae548d3Szrj 	  break;
1131*fae548d3Szrj 	case DW_OP_div:
1132*fae548d3Szrj 	  printf ("DW_OP_div");
1133*fae548d3Szrj 	  break;
1134*fae548d3Szrj 	case DW_OP_minus:
1135*fae548d3Szrj 	  printf ("DW_OP_minus");
1136*fae548d3Szrj 	  break;
1137*fae548d3Szrj 	case DW_OP_mod:
1138*fae548d3Szrj 	  printf ("DW_OP_mod");
1139*fae548d3Szrj 	  break;
1140*fae548d3Szrj 	case DW_OP_mul:
1141*fae548d3Szrj 	  printf ("DW_OP_mul");
1142*fae548d3Szrj 	  break;
1143*fae548d3Szrj 	case DW_OP_neg:
1144*fae548d3Szrj 	  printf ("DW_OP_neg");
1145*fae548d3Szrj 	  break;
1146*fae548d3Szrj 	case DW_OP_not:
1147*fae548d3Szrj 	  printf ("DW_OP_not");
1148*fae548d3Szrj 	  break;
1149*fae548d3Szrj 	case DW_OP_or:
1150*fae548d3Szrj 	  printf ("DW_OP_or");
1151*fae548d3Szrj 	  break;
1152*fae548d3Szrj 	case DW_OP_plus:
1153*fae548d3Szrj 	  printf ("DW_OP_plus");
1154*fae548d3Szrj 	  break;
1155*fae548d3Szrj 	case DW_OP_plus_uconst:
1156*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1157*fae548d3Szrj 	  printf ("DW_OP_plus_uconst: %s", dwarf_vmatoa ("u", uvalue));
1158*fae548d3Szrj 	  break;
1159*fae548d3Szrj 	case DW_OP_shl:
1160*fae548d3Szrj 	  printf ("DW_OP_shl");
1161*fae548d3Szrj 	  break;
1162*fae548d3Szrj 	case DW_OP_shr:
1163*fae548d3Szrj 	  printf ("DW_OP_shr");
1164*fae548d3Szrj 	  break;
1165*fae548d3Szrj 	case DW_OP_shra:
1166*fae548d3Szrj 	  printf ("DW_OP_shra");
1167*fae548d3Szrj 	  break;
1168*fae548d3Szrj 	case DW_OP_xor:
1169*fae548d3Szrj 	  printf ("DW_OP_xor");
1170*fae548d3Szrj 	  break;
1171*fae548d3Szrj 	case DW_OP_bra:
1172*fae548d3Szrj 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1173*fae548d3Szrj 	  printf ("DW_OP_bra: %ld", (long) svalue);
1174*fae548d3Szrj 	  break;
1175*fae548d3Szrj 	case DW_OP_eq:
1176*fae548d3Szrj 	  printf ("DW_OP_eq");
1177*fae548d3Szrj 	  break;
1178*fae548d3Szrj 	case DW_OP_ge:
1179*fae548d3Szrj 	  printf ("DW_OP_ge");
1180*fae548d3Szrj 	  break;
1181*fae548d3Szrj 	case DW_OP_gt:
1182*fae548d3Szrj 	  printf ("DW_OP_gt");
1183*fae548d3Szrj 	  break;
1184*fae548d3Szrj 	case DW_OP_le:
1185*fae548d3Szrj 	  printf ("DW_OP_le");
1186*fae548d3Szrj 	  break;
1187*fae548d3Szrj 	case DW_OP_lt:
1188*fae548d3Szrj 	  printf ("DW_OP_lt");
1189*fae548d3Szrj 	  break;
1190*fae548d3Szrj 	case DW_OP_ne:
1191*fae548d3Szrj 	  printf ("DW_OP_ne");
1192*fae548d3Szrj 	  break;
1193*fae548d3Szrj 	case DW_OP_skip:
1194*fae548d3Szrj 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1195*fae548d3Szrj 	  printf ("DW_OP_skip: %ld", (long) svalue);
1196*fae548d3Szrj 	  break;
1197*fae548d3Szrj 
1198*fae548d3Szrj 	case DW_OP_lit0:
1199*fae548d3Szrj 	case DW_OP_lit1:
1200*fae548d3Szrj 	case DW_OP_lit2:
1201*fae548d3Szrj 	case DW_OP_lit3:
1202*fae548d3Szrj 	case DW_OP_lit4:
1203*fae548d3Szrj 	case DW_OP_lit5:
1204*fae548d3Szrj 	case DW_OP_lit6:
1205*fae548d3Szrj 	case DW_OP_lit7:
1206*fae548d3Szrj 	case DW_OP_lit8:
1207*fae548d3Szrj 	case DW_OP_lit9:
1208*fae548d3Szrj 	case DW_OP_lit10:
1209*fae548d3Szrj 	case DW_OP_lit11:
1210*fae548d3Szrj 	case DW_OP_lit12:
1211*fae548d3Szrj 	case DW_OP_lit13:
1212*fae548d3Szrj 	case DW_OP_lit14:
1213*fae548d3Szrj 	case DW_OP_lit15:
1214*fae548d3Szrj 	case DW_OP_lit16:
1215*fae548d3Szrj 	case DW_OP_lit17:
1216*fae548d3Szrj 	case DW_OP_lit18:
1217*fae548d3Szrj 	case DW_OP_lit19:
1218*fae548d3Szrj 	case DW_OP_lit20:
1219*fae548d3Szrj 	case DW_OP_lit21:
1220*fae548d3Szrj 	case DW_OP_lit22:
1221*fae548d3Szrj 	case DW_OP_lit23:
1222*fae548d3Szrj 	case DW_OP_lit24:
1223*fae548d3Szrj 	case DW_OP_lit25:
1224*fae548d3Szrj 	case DW_OP_lit26:
1225*fae548d3Szrj 	case DW_OP_lit27:
1226*fae548d3Szrj 	case DW_OP_lit28:
1227*fae548d3Szrj 	case DW_OP_lit29:
1228*fae548d3Szrj 	case DW_OP_lit30:
1229*fae548d3Szrj 	case DW_OP_lit31:
1230*fae548d3Szrj 	  printf ("DW_OP_lit%d", op - DW_OP_lit0);
1231*fae548d3Szrj 	  break;
1232*fae548d3Szrj 
1233*fae548d3Szrj 	case DW_OP_reg0:
1234*fae548d3Szrj 	case DW_OP_reg1:
1235*fae548d3Szrj 	case DW_OP_reg2:
1236*fae548d3Szrj 	case DW_OP_reg3:
1237*fae548d3Szrj 	case DW_OP_reg4:
1238*fae548d3Szrj 	case DW_OP_reg5:
1239*fae548d3Szrj 	case DW_OP_reg6:
1240*fae548d3Szrj 	case DW_OP_reg7:
1241*fae548d3Szrj 	case DW_OP_reg8:
1242*fae548d3Szrj 	case DW_OP_reg9:
1243*fae548d3Szrj 	case DW_OP_reg10:
1244*fae548d3Szrj 	case DW_OP_reg11:
1245*fae548d3Szrj 	case DW_OP_reg12:
1246*fae548d3Szrj 	case DW_OP_reg13:
1247*fae548d3Szrj 	case DW_OP_reg14:
1248*fae548d3Szrj 	case DW_OP_reg15:
1249*fae548d3Szrj 	case DW_OP_reg16:
1250*fae548d3Szrj 	case DW_OP_reg17:
1251*fae548d3Szrj 	case DW_OP_reg18:
1252*fae548d3Szrj 	case DW_OP_reg19:
1253*fae548d3Szrj 	case DW_OP_reg20:
1254*fae548d3Szrj 	case DW_OP_reg21:
1255*fae548d3Szrj 	case DW_OP_reg22:
1256*fae548d3Szrj 	case DW_OP_reg23:
1257*fae548d3Szrj 	case DW_OP_reg24:
1258*fae548d3Szrj 	case DW_OP_reg25:
1259*fae548d3Szrj 	case DW_OP_reg26:
1260*fae548d3Szrj 	case DW_OP_reg27:
1261*fae548d3Szrj 	case DW_OP_reg28:
1262*fae548d3Szrj 	case DW_OP_reg29:
1263*fae548d3Szrj 	case DW_OP_reg30:
1264*fae548d3Szrj 	case DW_OP_reg31:
1265*fae548d3Szrj 	  printf ("DW_OP_reg%d (%s)", op - DW_OP_reg0,
1266*fae548d3Szrj 		  regname (op - DW_OP_reg0, 1));
1267*fae548d3Szrj 	  break;
1268*fae548d3Szrj 
1269*fae548d3Szrj 	case DW_OP_breg0:
1270*fae548d3Szrj 	case DW_OP_breg1:
1271*fae548d3Szrj 	case DW_OP_breg2:
1272*fae548d3Szrj 	case DW_OP_breg3:
1273*fae548d3Szrj 	case DW_OP_breg4:
1274*fae548d3Szrj 	case DW_OP_breg5:
1275*fae548d3Szrj 	case DW_OP_breg6:
1276*fae548d3Szrj 	case DW_OP_breg7:
1277*fae548d3Szrj 	case DW_OP_breg8:
1278*fae548d3Szrj 	case DW_OP_breg9:
1279*fae548d3Szrj 	case DW_OP_breg10:
1280*fae548d3Szrj 	case DW_OP_breg11:
1281*fae548d3Szrj 	case DW_OP_breg12:
1282*fae548d3Szrj 	case DW_OP_breg13:
1283*fae548d3Szrj 	case DW_OP_breg14:
1284*fae548d3Szrj 	case DW_OP_breg15:
1285*fae548d3Szrj 	case DW_OP_breg16:
1286*fae548d3Szrj 	case DW_OP_breg17:
1287*fae548d3Szrj 	case DW_OP_breg18:
1288*fae548d3Szrj 	case DW_OP_breg19:
1289*fae548d3Szrj 	case DW_OP_breg20:
1290*fae548d3Szrj 	case DW_OP_breg21:
1291*fae548d3Szrj 	case DW_OP_breg22:
1292*fae548d3Szrj 	case DW_OP_breg23:
1293*fae548d3Szrj 	case DW_OP_breg24:
1294*fae548d3Szrj 	case DW_OP_breg25:
1295*fae548d3Szrj 	case DW_OP_breg26:
1296*fae548d3Szrj 	case DW_OP_breg27:
1297*fae548d3Szrj 	case DW_OP_breg28:
1298*fae548d3Szrj 	case DW_OP_breg29:
1299*fae548d3Szrj 	case DW_OP_breg30:
1300*fae548d3Szrj 	case DW_OP_breg31:
1301*fae548d3Szrj 	  READ_SLEB (svalue, data, end);
1302*fae548d3Szrj 	  printf ("DW_OP_breg%d (%s): %s", op - DW_OP_breg0,
1303*fae548d3Szrj 		  regname (op - DW_OP_breg0, 1), dwarf_vmatoa ("d", svalue));
1304*fae548d3Szrj 	  break;
1305*fae548d3Szrj 
1306*fae548d3Szrj 	case DW_OP_regx:
1307*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1308*fae548d3Szrj 	  printf ("DW_OP_regx: %s (%s)",
1309*fae548d3Szrj 		  dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1310*fae548d3Szrj 	  break;
1311*fae548d3Szrj 	case DW_OP_fbreg:
1312*fae548d3Szrj 	  need_frame_base = 1;
1313*fae548d3Szrj 	  READ_SLEB (svalue, data, end);
1314*fae548d3Szrj 	  printf ("DW_OP_fbreg: %s", dwarf_vmatoa ("d", svalue));
1315*fae548d3Szrj 	  break;
1316*fae548d3Szrj 	case DW_OP_bregx:
1317*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1318*fae548d3Szrj 	  READ_SLEB (svalue, data, end);
1319*fae548d3Szrj 	  printf ("DW_OP_bregx: %s (%s) %s",
1320*fae548d3Szrj 		  dwarf_vmatoa ("u", uvalue), regname (uvalue, 1),
1321*fae548d3Szrj 		  dwarf_vmatoa ("d", svalue));
1322*fae548d3Szrj 	  break;
1323*fae548d3Szrj 	case DW_OP_piece:
1324*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1325*fae548d3Szrj 	  printf ("DW_OP_piece: %s", dwarf_vmatoa ("u", uvalue));
1326*fae548d3Szrj 	  break;
1327*fae548d3Szrj 	case DW_OP_deref_size:
1328*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1329*fae548d3Szrj 	  printf ("DW_OP_deref_size: %ld", (long) uvalue);
1330*fae548d3Szrj 	  break;
1331*fae548d3Szrj 	case DW_OP_xderef_size:
1332*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1333*fae548d3Szrj 	  printf ("DW_OP_xderef_size: %ld", (long) uvalue);
1334*fae548d3Szrj 	  break;
1335*fae548d3Szrj 	case DW_OP_nop:
1336*fae548d3Szrj 	  printf ("DW_OP_nop");
1337*fae548d3Szrj 	  break;
1338*fae548d3Szrj 
1339*fae548d3Szrj 	  /* DWARF 3 extensions.  */
1340*fae548d3Szrj 	case DW_OP_push_object_address:
1341*fae548d3Szrj 	  printf ("DW_OP_push_object_address");
1342*fae548d3Szrj 	  break;
1343*fae548d3Szrj 	case DW_OP_call2:
1344*fae548d3Szrj 	  /* FIXME: Strictly speaking for 64-bit DWARF3 files
1345*fae548d3Szrj 	     this ought to be an 8-byte wide computation.  */
1346*fae548d3Szrj 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 2, end);
1347*fae548d3Szrj 	  printf ("DW_OP_call2: <0x%s>",
1348*fae548d3Szrj 		  dwarf_vmatoa ("x", svalue + cu_offset));
1349*fae548d3Szrj 	  break;
1350*fae548d3Szrj 	case DW_OP_call4:
1351*fae548d3Szrj 	  /* FIXME: Strictly speaking for 64-bit DWARF3 files
1352*fae548d3Szrj 	     this ought to be an 8-byte wide computation.  */
1353*fae548d3Szrj 	  SAFE_SIGNED_BYTE_GET_AND_INC (svalue, data, 4, end);
1354*fae548d3Szrj 	  printf ("DW_OP_call4: <0x%s>",
1355*fae548d3Szrj 		  dwarf_vmatoa ("x", svalue + cu_offset));
1356*fae548d3Szrj 	  break;
1357*fae548d3Szrj 	case DW_OP_call_ref:
1358*fae548d3Szrj 	  /* FIXME: Strictly speaking for 64-bit DWARF3 files
1359*fae548d3Szrj 	     this ought to be an 8-byte wide computation.  */
1360*fae548d3Szrj 	  if (dwarf_version == -1)
1361*fae548d3Szrj 	    {
1362*fae548d3Szrj 	      printf (_("(DW_OP_call_ref in frame info)"));
1363*fae548d3Szrj 	      /* No way to tell where the next op is, so just bail.  */
1364*fae548d3Szrj 	      return need_frame_base;
1365*fae548d3Szrj 	    }
1366*fae548d3Szrj 	  if (dwarf_version == 2)
1367*fae548d3Szrj 	    {
1368*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1369*fae548d3Szrj 	    }
1370*fae548d3Szrj 	  else
1371*fae548d3Szrj 	    {
1372*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1373*fae548d3Szrj 	    }
1374*fae548d3Szrj 	  printf ("DW_OP_call_ref: <0x%s>", dwarf_vmatoa ("x", uvalue));
1375*fae548d3Szrj 	  break;
1376*fae548d3Szrj 	case DW_OP_form_tls_address:
1377*fae548d3Szrj 	  printf ("DW_OP_form_tls_address");
1378*fae548d3Szrj 	  break;
1379*fae548d3Szrj 	case DW_OP_call_frame_cfa:
1380*fae548d3Szrj 	  printf ("DW_OP_call_frame_cfa");
1381*fae548d3Szrj 	  break;
1382*fae548d3Szrj 	case DW_OP_bit_piece:
1383*fae548d3Szrj 	  printf ("DW_OP_bit_piece: ");
1384*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1385*fae548d3Szrj 	  printf (_("size: %s "), dwarf_vmatoa ("u", uvalue));
1386*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1387*fae548d3Szrj 	  printf (_("offset: %s "), dwarf_vmatoa ("u", uvalue));
1388*fae548d3Szrj 	  break;
1389*fae548d3Szrj 
1390*fae548d3Szrj 	  /* DWARF 4 extensions.  */
1391*fae548d3Szrj 	case DW_OP_stack_value:
1392*fae548d3Szrj 	  printf ("DW_OP_stack_value");
1393*fae548d3Szrj 	  break;
1394*fae548d3Szrj 
1395*fae548d3Szrj 	case DW_OP_implicit_value:
1396*fae548d3Szrj 	  printf ("DW_OP_implicit_value");
1397*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1398*fae548d3Szrj 	  data = display_block (data, uvalue, end, ' ');
1399*fae548d3Szrj 	  break;
1400*fae548d3Szrj 
1401*fae548d3Szrj 	  /* GNU extensions.  */
1402*fae548d3Szrj 	case DW_OP_GNU_push_tls_address:
1403*fae548d3Szrj 	  printf (_("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown"));
1404*fae548d3Szrj 	  break;
1405*fae548d3Szrj 	case DW_OP_GNU_uninit:
1406*fae548d3Szrj 	  printf ("DW_OP_GNU_uninit");
1407*fae548d3Szrj 	  /* FIXME: Is there data associated with this OP ?  */
1408*fae548d3Szrj 	  break;
1409*fae548d3Szrj 	case DW_OP_GNU_encoded_addr:
1410*fae548d3Szrj 	  {
1411*fae548d3Szrj 	    int encoding = 0;
1412*fae548d3Szrj 	    dwarf_vma addr;
1413*fae548d3Szrj 
1414*fae548d3Szrj 	    if (data < end)
1415*fae548d3Szrj 	      encoding = *data++;
1416*fae548d3Szrj 	    addr = get_encoded_value (&data, encoding, section, end);
1417*fae548d3Szrj 
1418*fae548d3Szrj 	    printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding);
1419*fae548d3Szrj 	    print_dwarf_vma (addr, pointer_size);
1420*fae548d3Szrj 	  }
1421*fae548d3Szrj 	  break;
1422*fae548d3Szrj 	case DW_OP_implicit_pointer:
1423*fae548d3Szrj 	case DW_OP_GNU_implicit_pointer:
1424*fae548d3Szrj 	  /* FIXME: Strictly speaking for 64-bit DWARF3 files
1425*fae548d3Szrj 	     this ought to be an 8-byte wide computation.  */
1426*fae548d3Szrj 	  if (dwarf_version == -1)
1427*fae548d3Szrj 	    {
1428*fae548d3Szrj 	      printf (_("(%s in frame info)"),
1429*fae548d3Szrj 		      (op == DW_OP_implicit_pointer
1430*fae548d3Szrj 		       ? "DW_OP_implicit_pointer"
1431*fae548d3Szrj 		       : "DW_OP_GNU_implicit_pointer"));
1432*fae548d3Szrj 	      /* No way to tell where the next op is, so just bail.  */
1433*fae548d3Szrj 	      return need_frame_base;
1434*fae548d3Szrj 	    }
1435*fae548d3Szrj 	  if (dwarf_version == 2)
1436*fae548d3Szrj 	    {
1437*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1438*fae548d3Szrj 	    }
1439*fae548d3Szrj 	  else
1440*fae548d3Szrj 	    {
1441*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1442*fae548d3Szrj 	    }
1443*fae548d3Szrj 	  READ_SLEB (svalue, data, end);
1444*fae548d3Szrj 	  printf ("%s: <0x%s> %s",
1445*fae548d3Szrj 		  (op == DW_OP_implicit_pointer
1446*fae548d3Szrj 		   ? "DW_OP_implicit_pointer" : "DW_OP_GNU_implicit_pointer"),
1447*fae548d3Szrj 		  dwarf_vmatoa ("x", uvalue),
1448*fae548d3Szrj 		  dwarf_vmatoa ("d", svalue));
1449*fae548d3Szrj 	  break;
1450*fae548d3Szrj 	case DW_OP_entry_value:
1451*fae548d3Szrj 	case DW_OP_GNU_entry_value:
1452*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1453*fae548d3Szrj 	  /* PR 17531: file: 0cc9cd00.  */
1454*fae548d3Szrj 	  if (uvalue > (dwarf_vma) (end - data))
1455*fae548d3Szrj 	    uvalue = end - data;
1456*fae548d3Szrj 	  printf ("%s: (", (op == DW_OP_entry_value ? "DW_OP_entry_value"
1457*fae548d3Szrj 						    : "DW_OP_GNU_entry_value"));
1458*fae548d3Szrj 	  if (decode_location_expression (data, pointer_size, offset_size,
1459*fae548d3Szrj 					  dwarf_version, uvalue,
1460*fae548d3Szrj 					  cu_offset, section))
1461*fae548d3Szrj 	    need_frame_base = 1;
1462*fae548d3Szrj 	  putchar (')');
1463*fae548d3Szrj 	  data += uvalue;
1464*fae548d3Szrj 	  if (data > end)
1465*fae548d3Szrj 	    data = end;
1466*fae548d3Szrj 	  break;
1467*fae548d3Szrj 	case DW_OP_const_type:
1468*fae548d3Szrj 	case DW_OP_GNU_const_type:
1469*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1470*fae548d3Szrj 	  printf ("%s: <0x%s> ",
1471*fae548d3Szrj 		  (op == DW_OP_const_type ? "DW_OP_const_type"
1472*fae548d3Szrj 					  : "DW_OP_GNU_const_type"),
1473*fae548d3Szrj 		  dwarf_vmatoa ("x", cu_offset + uvalue));
1474*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1475*fae548d3Szrj 	  data = display_block (data, uvalue, end, ' ');
1476*fae548d3Szrj 	  break;
1477*fae548d3Szrj 	case DW_OP_regval_type:
1478*fae548d3Szrj 	case DW_OP_GNU_regval_type:
1479*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1480*fae548d3Szrj 	  printf ("%s: %s (%s)",
1481*fae548d3Szrj 		  (op == DW_OP_regval_type ? "DW_OP_regval_type"
1482*fae548d3Szrj 					   : "DW_OP_GNU_regval_type"),
1483*fae548d3Szrj 		  dwarf_vmatoa ("u", uvalue), regname (uvalue, 1));
1484*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1485*fae548d3Szrj 	  printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1486*fae548d3Szrj 	  break;
1487*fae548d3Szrj 	case DW_OP_deref_type:
1488*fae548d3Szrj 	case DW_OP_GNU_deref_type:
1489*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1490*fae548d3Szrj 	  printf ("%s: %ld",
1491*fae548d3Szrj 		  (op == DW_OP_deref_type ? "DW_OP_deref_type"
1492*fae548d3Szrj 					  : "DW_OP_GNU_deref_type"),
1493*fae548d3Szrj 		  (long) uvalue);
1494*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1495*fae548d3Szrj 	  printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue));
1496*fae548d3Szrj 	  break;
1497*fae548d3Szrj 	case DW_OP_convert:
1498*fae548d3Szrj 	case DW_OP_GNU_convert:
1499*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1500*fae548d3Szrj 	  printf ("%s <0x%s>",
1501*fae548d3Szrj 		  (op == DW_OP_convert ? "DW_OP_convert" : "DW_OP_GNU_convert"),
1502*fae548d3Szrj 		  dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1503*fae548d3Szrj 	  break;
1504*fae548d3Szrj 	case DW_OP_reinterpret:
1505*fae548d3Szrj 	case DW_OP_GNU_reinterpret:
1506*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1507*fae548d3Szrj 	  printf ("%s <0x%s>",
1508*fae548d3Szrj 		  (op == DW_OP_reinterpret ? "DW_OP_reinterpret"
1509*fae548d3Szrj 					   : "DW_OP_GNU_reinterpret"),
1510*fae548d3Szrj 		  dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0));
1511*fae548d3Szrj 	  break;
1512*fae548d3Szrj 	case DW_OP_GNU_parameter_ref:
1513*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1514*fae548d3Szrj 	  printf ("DW_OP_GNU_parameter_ref: <0x%s>",
1515*fae548d3Szrj 		  dwarf_vmatoa ("x", cu_offset + uvalue));
1516*fae548d3Szrj 	  break;
1517*fae548d3Szrj 	case DW_OP_GNU_addr_index:
1518*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1519*fae548d3Szrj 	  printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1520*fae548d3Szrj 	  break;
1521*fae548d3Szrj 	case DW_OP_GNU_const_index:
1522*fae548d3Szrj 	  READ_ULEB (uvalue, data, end);
1523*fae548d3Szrj 	  printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue));
1524*fae548d3Szrj 	  break;
1525*fae548d3Szrj 	case DW_OP_GNU_variable_value:
1526*fae548d3Szrj 	  /* FIXME: Strictly speaking for 64-bit DWARF3 files
1527*fae548d3Szrj 	     this ought to be an 8-byte wide computation.  */
1528*fae548d3Szrj 	  if (dwarf_version == -1)
1529*fae548d3Szrj 	    {
1530*fae548d3Szrj 	      printf (_("(DW_OP_GNU_variable_value in frame info)"));
1531*fae548d3Szrj 	      /* No way to tell where the next op is, so just bail.  */
1532*fae548d3Szrj 	      return need_frame_base;
1533*fae548d3Szrj 	    }
1534*fae548d3Szrj 	  if (dwarf_version == 2)
1535*fae548d3Szrj 	    {
1536*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1537*fae548d3Szrj 	    }
1538*fae548d3Szrj 	  else
1539*fae548d3Szrj 	    {
1540*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1541*fae548d3Szrj 	    }
1542*fae548d3Szrj 	  printf ("DW_OP_GNU_variable_value: <0x%s>", dwarf_vmatoa ("x", uvalue));
1543*fae548d3Szrj 	  break;
1544*fae548d3Szrj 
1545*fae548d3Szrj 	  /* HP extensions.  */
1546*fae548d3Szrj 	case DW_OP_HP_is_value:
1547*fae548d3Szrj 	  printf ("DW_OP_HP_is_value");
1548*fae548d3Szrj 	  /* FIXME: Is there data associated with this OP ?  */
1549*fae548d3Szrj 	  break;
1550*fae548d3Szrj 	case DW_OP_HP_fltconst4:
1551*fae548d3Szrj 	  printf ("DW_OP_HP_fltconst4");
1552*fae548d3Szrj 	  /* FIXME: Is there data associated with this OP ?  */
1553*fae548d3Szrj 	  break;
1554*fae548d3Szrj 	case DW_OP_HP_fltconst8:
1555*fae548d3Szrj 	  printf ("DW_OP_HP_fltconst8");
1556*fae548d3Szrj 	  /* FIXME: Is there data associated with this OP ?  */
1557*fae548d3Szrj 	  break;
1558*fae548d3Szrj 	case DW_OP_HP_mod_range:
1559*fae548d3Szrj 	  printf ("DW_OP_HP_mod_range");
1560*fae548d3Szrj 	  /* FIXME: Is there data associated with this OP ?  */
1561*fae548d3Szrj 	  break;
1562*fae548d3Szrj 	case DW_OP_HP_unmod_range:
1563*fae548d3Szrj 	  printf ("DW_OP_HP_unmod_range");
1564*fae548d3Szrj 	  /* FIXME: Is there data associated with this OP ?  */
1565*fae548d3Szrj 	  break;
1566*fae548d3Szrj 	case DW_OP_HP_tls:
1567*fae548d3Szrj 	  printf ("DW_OP_HP_tls");
1568*fae548d3Szrj 	  /* FIXME: Is there data associated with this OP ?  */
1569*fae548d3Szrj 	  break;
1570*fae548d3Szrj 
1571*fae548d3Szrj 	  /* PGI (STMicroelectronics) extensions.  */
1572*fae548d3Szrj 	case DW_OP_PGI_omp_thread_num:
1573*fae548d3Szrj 	  /* Pushes the thread number for the current thread as it would be
1574*fae548d3Szrj 	     returned by the standard OpenMP library function:
1575*fae548d3Szrj 	     omp_get_thread_num().  The "current thread" is the thread for
1576*fae548d3Szrj 	     which the expression is being evaluated.  */
1577*fae548d3Szrj 	  printf ("DW_OP_PGI_omp_thread_num");
1578*fae548d3Szrj 	  break;
1579*fae548d3Szrj 
1580*fae548d3Szrj 	default:
1581*fae548d3Szrj 	  if (op >= DW_OP_lo_user
1582*fae548d3Szrj 	      && op <= DW_OP_hi_user)
1583*fae548d3Szrj 	    printf (_("(User defined location op 0x%x)"), op);
1584*fae548d3Szrj 	  else
1585*fae548d3Szrj 	    printf (_("(Unknown location op 0x%x)"), op);
1586*fae548d3Szrj 	  /* No way to tell where the next op is, so just bail.  */
1587*fae548d3Szrj 	  return need_frame_base;
1588*fae548d3Szrj 	}
1589*fae548d3Szrj 
1590*fae548d3Szrj       /* Separate the ops.  */
1591*fae548d3Szrj       if (data < end)
1592*fae548d3Szrj 	printf ("; ");
1593*fae548d3Szrj     }
1594*fae548d3Szrj 
1595*fae548d3Szrj   return need_frame_base;
1596*fae548d3Szrj }
1597*fae548d3Szrj 
1598*fae548d3Szrj /* Find the CU or TU set corresponding to the given CU_OFFSET.
1599*fae548d3Szrj    This is used for DWARF package files.  */
1600*fae548d3Szrj 
1601*fae548d3Szrj static struct cu_tu_set *
find_cu_tu_set_v2(dwarf_vma cu_offset,int do_types)1602*fae548d3Szrj find_cu_tu_set_v2 (dwarf_vma cu_offset, int do_types)
1603*fae548d3Szrj {
1604*fae548d3Szrj   struct cu_tu_set *p;
1605*fae548d3Szrj   unsigned int nsets;
1606*fae548d3Szrj   unsigned int dw_sect;
1607*fae548d3Szrj 
1608*fae548d3Szrj   if (do_types)
1609*fae548d3Szrj     {
1610*fae548d3Szrj       p = tu_sets;
1611*fae548d3Szrj       nsets = tu_count;
1612*fae548d3Szrj       dw_sect = DW_SECT_TYPES;
1613*fae548d3Szrj     }
1614*fae548d3Szrj   else
1615*fae548d3Szrj     {
1616*fae548d3Szrj       p = cu_sets;
1617*fae548d3Szrj       nsets = cu_count;
1618*fae548d3Szrj       dw_sect = DW_SECT_INFO;
1619*fae548d3Szrj     }
1620*fae548d3Szrj   while (nsets > 0)
1621*fae548d3Szrj     {
1622*fae548d3Szrj       if (p->section_offsets [dw_sect] == cu_offset)
1623*fae548d3Szrj 	return p;
1624*fae548d3Szrj       p++;
1625*fae548d3Szrj       nsets--;
1626*fae548d3Szrj     }
1627*fae548d3Szrj   return NULL;
1628*fae548d3Szrj }
1629*fae548d3Szrj 
1630*fae548d3Szrj /* Add INC to HIGH_BITS:LOW_BITS.  */
1631*fae548d3Szrj static void
add64(dwarf_vma * high_bits,dwarf_vma * low_bits,dwarf_vma inc)1632*fae548d3Szrj add64 (dwarf_vma * high_bits, dwarf_vma * low_bits, dwarf_vma inc)
1633*fae548d3Szrj {
1634*fae548d3Szrj   dwarf_vma tmp = * low_bits;
1635*fae548d3Szrj 
1636*fae548d3Szrj   tmp += inc;
1637*fae548d3Szrj 
1638*fae548d3Szrj   /* FIXME: There is probably a better way of handling this:
1639*fae548d3Szrj 
1640*fae548d3Szrj      We need to cope with dwarf_vma being a 32-bit or 64-bit
1641*fae548d3Szrj      type.  Plus regardless of its size LOW_BITS is meant to
1642*fae548d3Szrj      only hold 32-bits, so if there is overflow or wrap around
1643*fae548d3Szrj      we must propagate into HIGH_BITS.  */
1644*fae548d3Szrj   if (tmp < * low_bits)
1645*fae548d3Szrj     {
1646*fae548d3Szrj       ++ * high_bits;
1647*fae548d3Szrj     }
1648*fae548d3Szrj   else if (sizeof (tmp) > 8
1649*fae548d3Szrj 	   && (tmp >> 31) > 1)
1650*fae548d3Szrj     {
1651*fae548d3Szrj       ++ * high_bits;
1652*fae548d3Szrj       tmp &= 0xFFFFFFFF;
1653*fae548d3Szrj     }
1654*fae548d3Szrj 
1655*fae548d3Szrj   * low_bits = tmp;
1656*fae548d3Szrj }
1657*fae548d3Szrj 
1658*fae548d3Szrj static const char *
fetch_alt_indirect_string(dwarf_vma offset)1659*fae548d3Szrj fetch_alt_indirect_string (dwarf_vma offset)
1660*fae548d3Szrj {
1661*fae548d3Szrj   separate_info * i;
1662*fae548d3Szrj 
1663*fae548d3Szrj   if (! do_follow_links)
1664*fae548d3Szrj     return "";
1665*fae548d3Szrj 
1666*fae548d3Szrj   if (first_separate_info == NULL)
1667*fae548d3Szrj     return _("<no links available>");
1668*fae548d3Szrj 
1669*fae548d3Szrj   for (i = first_separate_info; i != NULL; i = i->next)
1670*fae548d3Szrj     {
1671*fae548d3Szrj       struct dwarf_section * section;
1672*fae548d3Szrj       const char *           ret;
1673*fae548d3Szrj 
1674*fae548d3Szrj       if (! load_debug_section (separate_debug_str, i->handle))
1675*fae548d3Szrj 	continue;
1676*fae548d3Szrj 
1677*fae548d3Szrj       section = &debug_displays [separate_debug_str].section;
1678*fae548d3Szrj 
1679*fae548d3Szrj       if (section->start == NULL)
1680*fae548d3Szrj 	continue;
1681*fae548d3Szrj 
1682*fae548d3Szrj       if (offset >= section->size)
1683*fae548d3Szrj 	continue;
1684*fae548d3Szrj 
1685*fae548d3Szrj       ret = (const char *) (section->start + offset);
1686*fae548d3Szrj       /* Unfortunately we cannot rely upon the .debug_str section ending with a
1687*fae548d3Szrj 	 NUL byte.  Since our caller is expecting to receive a well formed C
1688*fae548d3Szrj 	 string we test for the lack of a terminating byte here.  */
1689*fae548d3Szrj       if (strnlen ((const char *) ret, section->size - offset)
1690*fae548d3Szrj 	  == section->size - offset)
1691*fae548d3Szrj 	return _("<no NUL byte at end of alt .debug_str section>");
1692*fae548d3Szrj 
1693*fae548d3Szrj       return ret;
1694*fae548d3Szrj     }
1695*fae548d3Szrj 
1696*fae548d3Szrj   warn (_("DW_FORM_GNU_strp_alt offset (%s) too big or no string sections available\n"),
1697*fae548d3Szrj 	dwarf_vmatoa ("x", offset));
1698*fae548d3Szrj   return _("<offset is too big>");
1699*fae548d3Szrj }
1700*fae548d3Szrj 
1701*fae548d3Szrj static const char *
get_AT_name(unsigned long attribute)1702*fae548d3Szrj get_AT_name (unsigned long attribute)
1703*fae548d3Szrj {
1704*fae548d3Szrj   const char *name;
1705*fae548d3Szrj 
1706*fae548d3Szrj   if (attribute == 0)
1707*fae548d3Szrj     return "DW_AT value: 0";
1708*fae548d3Szrj 
1709*fae548d3Szrj   /* One value is shared by the MIPS and HP extensions:  */
1710*fae548d3Szrj   if (attribute == DW_AT_MIPS_fde)
1711*fae548d3Szrj     return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
1712*fae548d3Szrj 
1713*fae548d3Szrj   name = get_DW_AT_name (attribute);
1714*fae548d3Szrj 
1715*fae548d3Szrj   if (name == NULL)
1716*fae548d3Szrj     {
1717*fae548d3Szrj       static char buffer[100];
1718*fae548d3Szrj 
1719*fae548d3Szrj       snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
1720*fae548d3Szrj 		attribute);
1721*fae548d3Szrj       return buffer;
1722*fae548d3Szrj     }
1723*fae548d3Szrj 
1724*fae548d3Szrj   return name;
1725*fae548d3Szrj }
1726*fae548d3Szrj 
1727*fae548d3Szrj static void
add_dwo_info(const char * field,dwo_type type)1728*fae548d3Szrj add_dwo_info (const char * field, dwo_type type)
1729*fae548d3Szrj {
1730*fae548d3Szrj   dwo_info * dwinfo = xmalloc (sizeof * dwinfo);
1731*fae548d3Szrj 
1732*fae548d3Szrj   dwinfo->type = type;
1733*fae548d3Szrj   dwinfo->value = field;
1734*fae548d3Szrj   dwinfo->next = first_dwo_info;
1735*fae548d3Szrj   first_dwo_info = dwinfo;
1736*fae548d3Szrj }
1737*fae548d3Szrj 
1738*fae548d3Szrj static void
add_dwo_name(const char * name)1739*fae548d3Szrj add_dwo_name (const char * name)
1740*fae548d3Szrj {
1741*fae548d3Szrj   add_dwo_info (name, DWO_NAME);
1742*fae548d3Szrj }
1743*fae548d3Szrj 
1744*fae548d3Szrj static void
add_dwo_dir(const char * dir)1745*fae548d3Szrj add_dwo_dir (const char * dir)
1746*fae548d3Szrj {
1747*fae548d3Szrj   add_dwo_info (dir, DWO_DIR);
1748*fae548d3Szrj }
1749*fae548d3Szrj 
1750*fae548d3Szrj static void
add_dwo_id(const char * id)1751*fae548d3Szrj add_dwo_id (const char * id)
1752*fae548d3Szrj {
1753*fae548d3Szrj   add_dwo_info (id, DWO_ID);
1754*fae548d3Szrj }
1755*fae548d3Szrj 
1756*fae548d3Szrj static void
free_dwo_info(void)1757*fae548d3Szrj free_dwo_info (void)
1758*fae548d3Szrj {
1759*fae548d3Szrj   dwo_info * dwinfo;
1760*fae548d3Szrj   dwo_info * next;
1761*fae548d3Szrj 
1762*fae548d3Szrj   for (dwinfo = first_dwo_info; dwinfo != NULL; dwinfo = next)
1763*fae548d3Szrj     {
1764*fae548d3Szrj       next = dwinfo->next;
1765*fae548d3Szrj       free (dwinfo);
1766*fae548d3Szrj     }
1767*fae548d3Szrj   first_dwo_info = NULL;
1768*fae548d3Szrj }
1769*fae548d3Szrj 
1770*fae548d3Szrj /* Ensure that START + UVALUE is less than END.
1771*fae548d3Szrj    Return an adjusted UVALUE if necessary to ensure this relationship.  */
1772*fae548d3Szrj 
1773*fae548d3Szrj static inline dwarf_vma
check_uvalue(const unsigned char * start,dwarf_vma uvalue,const unsigned char * end)1774*fae548d3Szrj check_uvalue (const unsigned char * start,
1775*fae548d3Szrj 	      dwarf_vma             uvalue,
1776*fae548d3Szrj 	      const unsigned char * end)
1777*fae548d3Szrj {
1778*fae548d3Szrj   dwarf_vma max_uvalue = end - start;
1779*fae548d3Szrj 
1780*fae548d3Szrj   /* See PR 17512: file: 008-103549-0.001:0.1.
1781*fae548d3Szrj      and PR 24829 for examples of where these tests are triggered.  */
1782*fae548d3Szrj   if (uvalue > max_uvalue)
1783*fae548d3Szrj     {
1784*fae548d3Szrj       warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
1785*fae548d3Szrj       uvalue = max_uvalue;
1786*fae548d3Szrj     }
1787*fae548d3Szrj 
1788*fae548d3Szrj   return uvalue;
1789*fae548d3Szrj }
1790*fae548d3Szrj 
1791*fae548d3Szrj static unsigned char *
skip_attr_bytes(unsigned long form,unsigned char * data,unsigned const char * end,dwarf_vma pointer_size,dwarf_vma offset_size,int dwarf_version,dwarf_vma * value_return)1792*fae548d3Szrj skip_attr_bytes (unsigned long          form,
1793*fae548d3Szrj 		 unsigned char *        data,
1794*fae548d3Szrj 		 unsigned const char *  end,
1795*fae548d3Szrj 		 dwarf_vma              pointer_size,
1796*fae548d3Szrj 		 dwarf_vma              offset_size,
1797*fae548d3Szrj 		 int                    dwarf_version,
1798*fae548d3Szrj 		 dwarf_vma *            value_return)
1799*fae548d3Szrj {
1800*fae548d3Szrj   dwarf_signed_vma svalue;
1801*fae548d3Szrj   dwarf_vma uvalue = 0;
1802*fae548d3Szrj 
1803*fae548d3Szrj   * value_return = 0;
1804*fae548d3Szrj 
1805*fae548d3Szrj   switch (form)
1806*fae548d3Szrj     {
1807*fae548d3Szrj     case DW_FORM_ref_addr:
1808*fae548d3Szrj       if (dwarf_version == 2)
1809*fae548d3Szrj 	SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1810*fae548d3Szrj       else if (dwarf_version == 3 || dwarf_version == 4)
1811*fae548d3Szrj 	SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1812*fae548d3Szrj       else
1813*fae548d3Szrj 	return NULL;
1814*fae548d3Szrj       break;
1815*fae548d3Szrj 
1816*fae548d3Szrj     case DW_FORM_addr:
1817*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
1818*fae548d3Szrj       break;
1819*fae548d3Szrj 
1820*fae548d3Szrj     case DW_FORM_strp:
1821*fae548d3Szrj     case DW_FORM_line_strp:
1822*fae548d3Szrj     case DW_FORM_sec_offset:
1823*fae548d3Szrj     case DW_FORM_GNU_ref_alt:
1824*fae548d3Szrj     case DW_FORM_GNU_strp_alt:
1825*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
1826*fae548d3Szrj       break;
1827*fae548d3Szrj 
1828*fae548d3Szrj     case DW_FORM_flag_present:
1829*fae548d3Szrj       uvalue = 1;
1830*fae548d3Szrj       break;
1831*fae548d3Szrj 
1832*fae548d3Szrj     case DW_FORM_ref1:
1833*fae548d3Szrj     case DW_FORM_flag:
1834*fae548d3Szrj     case DW_FORM_data1:
1835*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
1836*fae548d3Szrj       break;
1837*fae548d3Szrj 
1838*fae548d3Szrj     case DW_FORM_ref2:
1839*fae548d3Szrj     case DW_FORM_data2:
1840*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
1841*fae548d3Szrj       break;
1842*fae548d3Szrj 
1843*fae548d3Szrj     case DW_FORM_ref4:
1844*fae548d3Szrj     case DW_FORM_data4:
1845*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
1846*fae548d3Szrj       break;
1847*fae548d3Szrj 
1848*fae548d3Szrj     case DW_FORM_sdata:
1849*fae548d3Szrj       READ_SLEB (svalue, data, end);
1850*fae548d3Szrj       uvalue = svalue;
1851*fae548d3Szrj       break;
1852*fae548d3Szrj 
1853*fae548d3Szrj     case DW_FORM_ref_udata:
1854*fae548d3Szrj     case DW_FORM_udata:
1855*fae548d3Szrj     case DW_FORM_GNU_str_index:
1856*fae548d3Szrj     case DW_FORM_GNU_addr_index:
1857*fae548d3Szrj       READ_ULEB (uvalue, data, end);
1858*fae548d3Szrj       break;
1859*fae548d3Szrj 
1860*fae548d3Szrj     case DW_FORM_ref8:
1861*fae548d3Szrj     case DW_FORM_data8:
1862*fae548d3Szrj       data += 8;
1863*fae548d3Szrj       break;
1864*fae548d3Szrj 
1865*fae548d3Szrj     case DW_FORM_data16:
1866*fae548d3Szrj       data += 16;
1867*fae548d3Szrj       break;
1868*fae548d3Szrj 
1869*fae548d3Szrj     case DW_FORM_string:
1870*fae548d3Szrj       data += strnlen ((char *) data, end - data) + 1;
1871*fae548d3Szrj       break;
1872*fae548d3Szrj 
1873*fae548d3Szrj     case DW_FORM_block:
1874*fae548d3Szrj     case DW_FORM_exprloc:
1875*fae548d3Szrj       READ_ULEB (uvalue, data, end);
1876*fae548d3Szrj       break;
1877*fae548d3Szrj 
1878*fae548d3Szrj     case DW_FORM_block1:
1879*fae548d3Szrj       SAFE_BYTE_GET (uvalue, data, 1, end);
1880*fae548d3Szrj       data += 1 + uvalue;
1881*fae548d3Szrj       break;
1882*fae548d3Szrj 
1883*fae548d3Szrj     case DW_FORM_block2:
1884*fae548d3Szrj       SAFE_BYTE_GET (uvalue, data, 2, end);
1885*fae548d3Szrj       data += 2 + uvalue;
1886*fae548d3Szrj       break;
1887*fae548d3Szrj 
1888*fae548d3Szrj     case DW_FORM_block4:
1889*fae548d3Szrj       SAFE_BYTE_GET (uvalue, data, 4, end);
1890*fae548d3Szrj       data += 4 + uvalue;
1891*fae548d3Szrj       break;
1892*fae548d3Szrj 
1893*fae548d3Szrj     case DW_FORM_ref_sig8:
1894*fae548d3Szrj       data += 8;
1895*fae548d3Szrj       break;
1896*fae548d3Szrj 
1897*fae548d3Szrj     case DW_FORM_indirect:
1898*fae548d3Szrj       /* FIXME: Handle this form.  */
1899*fae548d3Szrj     default:
1900*fae548d3Szrj       return NULL;
1901*fae548d3Szrj     }
1902*fae548d3Szrj 
1903*fae548d3Szrj   * value_return = uvalue;
1904*fae548d3Szrj   if (data > end)
1905*fae548d3Szrj     data = (unsigned char *) end;
1906*fae548d3Szrj   return data;
1907*fae548d3Szrj }
1908*fae548d3Szrj 
1909*fae548d3Szrj /* Return IS_SIGNED set to TRUE if the type at
1910*fae548d3Szrj    DATA can be determined to be a signed type.  */
1911*fae548d3Szrj 
1912*fae548d3Szrj static void
get_type_signedness(unsigned char * start,unsigned char * data,unsigned const char * end,dwarf_vma pointer_size,dwarf_vma offset_size,int dwarf_version,bfd_boolean * is_signed,bfd_boolean is_nested)1913*fae548d3Szrj get_type_signedness (unsigned char *        start,
1914*fae548d3Szrj 		     unsigned char *        data,
1915*fae548d3Szrj 		     unsigned const char *  end,
1916*fae548d3Szrj 		     dwarf_vma              pointer_size,
1917*fae548d3Szrj 		     dwarf_vma              offset_size,
1918*fae548d3Szrj 		     int                    dwarf_version,
1919*fae548d3Szrj 		     bfd_boolean *          is_signed,
1920*fae548d3Szrj 		     bfd_boolean	    is_nested)
1921*fae548d3Szrj {
1922*fae548d3Szrj   unsigned long   abbrev_number;
1923*fae548d3Szrj   abbrev_entry *  entry;
1924*fae548d3Szrj   abbrev_attr *   attr;
1925*fae548d3Szrj 
1926*fae548d3Szrj   * is_signed = FALSE;
1927*fae548d3Szrj 
1928*fae548d3Szrj   READ_ULEB (abbrev_number, data, end);
1929*fae548d3Szrj 
1930*fae548d3Szrj   for (entry = first_abbrev;
1931*fae548d3Szrj        entry != NULL && entry->entry != abbrev_number;
1932*fae548d3Szrj        entry = entry->next)
1933*fae548d3Szrj     continue;
1934*fae548d3Szrj 
1935*fae548d3Szrj   if (entry == NULL)
1936*fae548d3Szrj     /* FIXME: Issue a warning ?  */
1937*fae548d3Szrj     return;
1938*fae548d3Szrj 
1939*fae548d3Szrj   for (attr = entry->first_attr;
1940*fae548d3Szrj        attr != NULL && attr->attribute;
1941*fae548d3Szrj        attr = attr->next)
1942*fae548d3Szrj     {
1943*fae548d3Szrj       dwarf_vma uvalue = 0;
1944*fae548d3Szrj 
1945*fae548d3Szrj       data = skip_attr_bytes (attr->form, data, end, pointer_size,
1946*fae548d3Szrj 			      offset_size, dwarf_version, & uvalue);
1947*fae548d3Szrj       if (data == NULL)
1948*fae548d3Szrj 	return;
1949*fae548d3Szrj 
1950*fae548d3Szrj       switch (attr->attribute)
1951*fae548d3Szrj 	{
1952*fae548d3Szrj #if 0 /* FIXME: It would be nice to print the name of the type,
1953*fae548d3Szrj 	 but this would mean updating a lot of binutils tests.  */
1954*fae548d3Szrj 	case DW_AT_name:
1955*fae548d3Szrj 	  if (attr->form == DW_FORM_strp)
1956*fae548d3Szrj 	    printf ("%s", fetch_indirect_string (uvalue));
1957*fae548d3Szrj 	  break;
1958*fae548d3Szrj #endif
1959*fae548d3Szrj 	case DW_AT_type:
1960*fae548d3Szrj 	  /* Recurse.  */
1961*fae548d3Szrj 	  if (is_nested)
1962*fae548d3Szrj 	    {
1963*fae548d3Szrj 	      /* FIXME: Warn - or is this expected ?
1964*fae548d3Szrj 		 NB/ We need to avoid infinite recursion.  */
1965*fae548d3Szrj 	      return;
1966*fae548d3Szrj 	    }
1967*fae548d3Szrj 	  if (uvalue >= (size_t) (end - start))
1968*fae548d3Szrj 	    return;
1969*fae548d3Szrj 	  get_type_signedness (start, start + uvalue, end, pointer_size,
1970*fae548d3Szrj 			       offset_size, dwarf_version, is_signed, TRUE);
1971*fae548d3Szrj 	  break;
1972*fae548d3Szrj 
1973*fae548d3Szrj 	case DW_AT_encoding:
1974*fae548d3Szrj 	  /* Determine signness.  */
1975*fae548d3Szrj 	  switch (uvalue)
1976*fae548d3Szrj 	    {
1977*fae548d3Szrj 	    case DW_ATE_address:
1978*fae548d3Szrj 	      /* FIXME - some architectures have signed addresses.  */
1979*fae548d3Szrj 	    case DW_ATE_boolean:
1980*fae548d3Szrj 	    case DW_ATE_unsigned:
1981*fae548d3Szrj 	    case DW_ATE_unsigned_char:
1982*fae548d3Szrj 	    case DW_ATE_unsigned_fixed:
1983*fae548d3Szrj 	      * is_signed = FALSE;
1984*fae548d3Szrj 	      break;
1985*fae548d3Szrj 
1986*fae548d3Szrj 	    default:
1987*fae548d3Szrj 	    case DW_ATE_complex_float:
1988*fae548d3Szrj 	    case DW_ATE_float:
1989*fae548d3Szrj 	    case DW_ATE_signed:
1990*fae548d3Szrj 	    case DW_ATE_signed_char:
1991*fae548d3Szrj 	    case DW_ATE_imaginary_float:
1992*fae548d3Szrj 	    case DW_ATE_decimal_float:
1993*fae548d3Szrj 	    case DW_ATE_signed_fixed:
1994*fae548d3Szrj 	      * is_signed = TRUE;
1995*fae548d3Szrj 	      break;
1996*fae548d3Szrj 	    }
1997*fae548d3Szrj 	  break;
1998*fae548d3Szrj 	}
1999*fae548d3Szrj     }
2000*fae548d3Szrj }
2001*fae548d3Szrj 
2002*fae548d3Szrj static void
read_and_print_leb128(unsigned char * data,unsigned int * bytes_read,unsigned const char * end,bfd_boolean is_signed)2003*fae548d3Szrj read_and_print_leb128 (unsigned char *        data,
2004*fae548d3Szrj 		       unsigned int *         bytes_read,
2005*fae548d3Szrj 		       unsigned const char *  end,
2006*fae548d3Szrj 		       bfd_boolean            is_signed)
2007*fae548d3Szrj {
2008*fae548d3Szrj   int status;
2009*fae548d3Szrj   dwarf_vma val = read_leb128 (data, end, is_signed, bytes_read, &status);
2010*fae548d3Szrj   if (status != 0)
2011*fae548d3Szrj     report_leb_status (status);
2012*fae548d3Szrj   else
2013*fae548d3Szrj     printf ("%s", dwarf_vmatoa (is_signed ? "d" : "u", val));
2014*fae548d3Szrj }
2015*fae548d3Szrj 
2016*fae548d3Szrj static void
display_discr_list(unsigned long form,dwarf_vma uvalue,unsigned char * data,unsigned const char * end,int level)2017*fae548d3Szrj display_discr_list (unsigned long          form,
2018*fae548d3Szrj 		    dwarf_vma              uvalue,
2019*fae548d3Szrj 		    unsigned char *        data,
2020*fae548d3Szrj 		    unsigned const char *  end,
2021*fae548d3Szrj 		    int                    level)
2022*fae548d3Szrj {
2023*fae548d3Szrj   if (uvalue == 0)
2024*fae548d3Szrj     {
2025*fae548d3Szrj       printf ("[default]");
2026*fae548d3Szrj       return;
2027*fae548d3Szrj     }
2028*fae548d3Szrj 
2029*fae548d3Szrj   switch (form)
2030*fae548d3Szrj     {
2031*fae548d3Szrj     case DW_FORM_block:
2032*fae548d3Szrj     case DW_FORM_block1:
2033*fae548d3Szrj     case DW_FORM_block2:
2034*fae548d3Szrj     case DW_FORM_block4:
2035*fae548d3Szrj       /* Move data pointer back to the start of the byte array.  */
2036*fae548d3Szrj       data -= uvalue;
2037*fae548d3Szrj       break;
2038*fae548d3Szrj     default:
2039*fae548d3Szrj       printf ("<corrupt>\n");
2040*fae548d3Szrj       warn (_("corrupt discr_list - not using a block form\n"));
2041*fae548d3Szrj       return;
2042*fae548d3Szrj     }
2043*fae548d3Szrj 
2044*fae548d3Szrj   if (uvalue < 2)
2045*fae548d3Szrj     {
2046*fae548d3Szrj       printf ("<corrupt>\n");
2047*fae548d3Szrj       warn (_("corrupt discr_list - block not long enough\n"));
2048*fae548d3Szrj       return;
2049*fae548d3Szrj     }
2050*fae548d3Szrj 
2051*fae548d3Szrj   bfd_boolean is_signed =
2052*fae548d3Szrj     (level > 0 && level <= MAX_CU_NESTING)
2053*fae548d3Szrj     ? level_type_signed [level - 1] : FALSE;
2054*fae548d3Szrj 
2055*fae548d3Szrj   printf ("(");
2056*fae548d3Szrj   while (uvalue)
2057*fae548d3Szrj     {
2058*fae548d3Szrj       unsigned char     discriminant;
2059*fae548d3Szrj       unsigned int      bytes_read;
2060*fae548d3Szrj 
2061*fae548d3Szrj       SAFE_BYTE_GET (discriminant, data, 1, end);
2062*fae548d3Szrj       -- uvalue;
2063*fae548d3Szrj       data ++;
2064*fae548d3Szrj 
2065*fae548d3Szrj       assert (uvalue > 0);
2066*fae548d3Szrj       switch (discriminant)
2067*fae548d3Szrj 	{
2068*fae548d3Szrj 	case DW_DSC_label:
2069*fae548d3Szrj 	  printf ("label ");
2070*fae548d3Szrj 	  read_and_print_leb128 (data, & bytes_read, end, is_signed);
2071*fae548d3Szrj 	  assert (bytes_read <= uvalue && bytes_read > 0);
2072*fae548d3Szrj 	  uvalue -= bytes_read;
2073*fae548d3Szrj 	  data += bytes_read;
2074*fae548d3Szrj 	  break;
2075*fae548d3Szrj 
2076*fae548d3Szrj 	case DW_DSC_range:
2077*fae548d3Szrj 	  printf ("range ");
2078*fae548d3Szrj 	  read_and_print_leb128 (data, & bytes_read, end, is_signed);
2079*fae548d3Szrj 	  assert (bytes_read <= uvalue && bytes_read > 0);
2080*fae548d3Szrj 	  uvalue -= bytes_read;
2081*fae548d3Szrj 	  data += bytes_read;
2082*fae548d3Szrj 
2083*fae548d3Szrj 	  printf ("..");
2084*fae548d3Szrj 	  read_and_print_leb128 (data, & bytes_read, end, is_signed);
2085*fae548d3Szrj 	  assert (bytes_read <= uvalue && bytes_read > 0);
2086*fae548d3Szrj 	  uvalue -= bytes_read;
2087*fae548d3Szrj 	  data += bytes_read;
2088*fae548d3Szrj 	  break;
2089*fae548d3Szrj 
2090*fae548d3Szrj 	default:
2091*fae548d3Szrj 	  printf ("<corrupt>\n");
2092*fae548d3Szrj 	  warn (_("corrupt discr_list - unrecognised discriminant byte %#x\n"),
2093*fae548d3Szrj 		discriminant);
2094*fae548d3Szrj 	  return;
2095*fae548d3Szrj 	}
2096*fae548d3Szrj 
2097*fae548d3Szrj       if (uvalue)
2098*fae548d3Szrj 	printf (", ");
2099*fae548d3Szrj     }
2100*fae548d3Szrj 
2101*fae548d3Szrj   if (is_signed)
2102*fae548d3Szrj     printf (")(signed)");
2103*fae548d3Szrj   else
2104*fae548d3Szrj     printf (")(unsigned)");
2105*fae548d3Szrj }
2106*fae548d3Szrj 
2107*fae548d3Szrj 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)2108*fae548d3Szrj read_and_display_attr_value (unsigned long           attribute,
2109*fae548d3Szrj 			     unsigned long           form,
2110*fae548d3Szrj 			     dwarf_signed_vma        implicit_const,
2111*fae548d3Szrj 			     unsigned char *         start,
2112*fae548d3Szrj 			     unsigned char *         data,
2113*fae548d3Szrj 			     unsigned char *         end,
2114*fae548d3Szrj 			     dwarf_vma               cu_offset,
2115*fae548d3Szrj 			     dwarf_vma               pointer_size,
2116*fae548d3Szrj 			     dwarf_vma               offset_size,
2117*fae548d3Szrj 			     int                     dwarf_version,
2118*fae548d3Szrj 			     debug_info *            debug_info_p,
2119*fae548d3Szrj 			     int                     do_loc,
2120*fae548d3Szrj 			     struct dwarf_section *  section,
2121*fae548d3Szrj 			     struct cu_tu_set *      this_set,
2122*fae548d3Szrj 			     char                    delimiter,
2123*fae548d3Szrj 			     int                     level)
2124*fae548d3Szrj {
2125*fae548d3Szrj   dwarf_signed_vma svalue;
2126*fae548d3Szrj   dwarf_vma        uvalue = 0;
2127*fae548d3Szrj   unsigned char *  block_start = NULL;
2128*fae548d3Szrj   unsigned char *  orig_data = data;
2129*fae548d3Szrj 
2130*fae548d3Szrj   if (data > end || (data == end && form != DW_FORM_flag_present))
2131*fae548d3Szrj     {
2132*fae548d3Szrj       warn (_("Corrupt attribute\n"));
2133*fae548d3Szrj       return data;
2134*fae548d3Szrj     }
2135*fae548d3Szrj 
2136*fae548d3Szrj   switch (form)
2137*fae548d3Szrj     {
2138*fae548d3Szrj     default:
2139*fae548d3Szrj       break;
2140*fae548d3Szrj 
2141*fae548d3Szrj     case DW_FORM_ref_addr:
2142*fae548d3Szrj       if (dwarf_version == 2)
2143*fae548d3Szrj 	SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
2144*fae548d3Szrj       else if (dwarf_version == 3 || dwarf_version == 4)
2145*fae548d3Szrj 	SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
2146*fae548d3Szrj       else
2147*fae548d3Szrj 	error (_("Internal error: DWARF version is not 2, 3 or 4.\n"));
2148*fae548d3Szrj 
2149*fae548d3Szrj       break;
2150*fae548d3Szrj 
2151*fae548d3Szrj     case DW_FORM_addr:
2152*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
2153*fae548d3Szrj       break;
2154*fae548d3Szrj 
2155*fae548d3Szrj     case DW_FORM_strp:
2156*fae548d3Szrj     case DW_FORM_line_strp:
2157*fae548d3Szrj     case DW_FORM_sec_offset:
2158*fae548d3Szrj     case DW_FORM_GNU_ref_alt:
2159*fae548d3Szrj     case DW_FORM_GNU_strp_alt:
2160*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end);
2161*fae548d3Szrj       break;
2162*fae548d3Szrj 
2163*fae548d3Szrj     case DW_FORM_flag_present:
2164*fae548d3Szrj       uvalue = 1;
2165*fae548d3Szrj       break;
2166*fae548d3Szrj 
2167*fae548d3Szrj     case DW_FORM_ref1:
2168*fae548d3Szrj     case DW_FORM_flag:
2169*fae548d3Szrj     case DW_FORM_data1:
2170*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
2171*fae548d3Szrj       break;
2172*fae548d3Szrj 
2173*fae548d3Szrj     case DW_FORM_ref2:
2174*fae548d3Szrj     case DW_FORM_data2:
2175*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
2176*fae548d3Szrj       break;
2177*fae548d3Szrj 
2178*fae548d3Szrj     case DW_FORM_ref4:
2179*fae548d3Szrj     case DW_FORM_data4:
2180*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
2181*fae548d3Szrj       break;
2182*fae548d3Szrj 
2183*fae548d3Szrj     case DW_FORM_sdata:
2184*fae548d3Szrj       READ_SLEB (svalue, data, end);
2185*fae548d3Szrj       uvalue = svalue;
2186*fae548d3Szrj       break;
2187*fae548d3Szrj 
2188*fae548d3Szrj     case DW_FORM_GNU_str_index:
2189*fae548d3Szrj     case DW_FORM_ref_udata:
2190*fae548d3Szrj     case DW_FORM_udata:
2191*fae548d3Szrj     case DW_FORM_GNU_addr_index:
2192*fae548d3Szrj       READ_ULEB (uvalue, data, end);
2193*fae548d3Szrj       break;
2194*fae548d3Szrj 
2195*fae548d3Szrj     case DW_FORM_indirect:
2196*fae548d3Szrj       READ_ULEB (form, data, end);
2197*fae548d3Szrj       if (!do_loc)
2198*fae548d3Szrj 	printf ("%c%s", delimiter, get_FORM_name (form));
2199*fae548d3Szrj       if (form == DW_FORM_implicit_const)
2200*fae548d3Szrj 	READ_SLEB (implicit_const, data, end);
2201*fae548d3Szrj       return read_and_display_attr_value (attribute, form, implicit_const,
2202*fae548d3Szrj 					  start, data, end,
2203*fae548d3Szrj 					  cu_offset, pointer_size,
2204*fae548d3Szrj 					  offset_size, dwarf_version,
2205*fae548d3Szrj 					  debug_info_p, do_loc,
2206*fae548d3Szrj 					  section, this_set, delimiter, level);
2207*fae548d3Szrj     }
2208*fae548d3Szrj 
2209*fae548d3Szrj   switch (form)
2210*fae548d3Szrj     {
2211*fae548d3Szrj     case DW_FORM_ref_addr:
2212*fae548d3Szrj       if (!do_loc)
2213*fae548d3Szrj 	printf ("%c<0x%s>", delimiter, dwarf_vmatoa ("x",uvalue));
2214*fae548d3Szrj       break;
2215*fae548d3Szrj 
2216*fae548d3Szrj     case DW_FORM_GNU_ref_alt:
2217*fae548d3Szrj       if (!do_loc)
2218*fae548d3Szrj 	printf ("%c<alt 0x%s>", delimiter, dwarf_vmatoa ("x",uvalue));
2219*fae548d3Szrj       /* FIXME: Follow the reference...  */
2220*fae548d3Szrj       break;
2221*fae548d3Szrj 
2222*fae548d3Szrj     case DW_FORM_ref1:
2223*fae548d3Szrj     case DW_FORM_ref2:
2224*fae548d3Szrj     case DW_FORM_ref4:
2225*fae548d3Szrj     case DW_FORM_ref_udata:
2226*fae548d3Szrj       if (!do_loc)
2227*fae548d3Szrj 	printf ("%c<0x%s>", delimiter, dwarf_vmatoa ("x", uvalue + cu_offset));
2228*fae548d3Szrj       break;
2229*fae548d3Szrj 
2230*fae548d3Szrj     case DW_FORM_data4:
2231*fae548d3Szrj     case DW_FORM_addr:
2232*fae548d3Szrj     case DW_FORM_sec_offset:
2233*fae548d3Szrj       if (!do_loc)
2234*fae548d3Szrj 	printf ("%c0x%s", delimiter, dwarf_vmatoa ("x", uvalue));
2235*fae548d3Szrj       break;
2236*fae548d3Szrj 
2237*fae548d3Szrj     case DW_FORM_flag_present:
2238*fae548d3Szrj     case DW_FORM_flag:
2239*fae548d3Szrj     case DW_FORM_data1:
2240*fae548d3Szrj     case DW_FORM_data2:
2241*fae548d3Szrj     case DW_FORM_sdata:
2242*fae548d3Szrj     case DW_FORM_udata:
2243*fae548d3Szrj       if (!do_loc)
2244*fae548d3Szrj 	printf ("%c%s", delimiter, dwarf_vmatoa ("d", uvalue));
2245*fae548d3Szrj       break;
2246*fae548d3Szrj 
2247*fae548d3Szrj     case DW_FORM_implicit_const:
2248*fae548d3Szrj       if (!do_loc)
2249*fae548d3Szrj 	printf ("%c%s", delimiter, dwarf_vmatoa ("d", implicit_const));
2250*fae548d3Szrj       break;
2251*fae548d3Szrj 
2252*fae548d3Szrj     case DW_FORM_ref8:
2253*fae548d3Szrj     case DW_FORM_data8:
2254*fae548d3Szrj       if (!do_loc)
2255*fae548d3Szrj 	{
2256*fae548d3Szrj 	  dwarf_vma high_bits;
2257*fae548d3Szrj 	  dwarf_vma utmp;
2258*fae548d3Szrj 	  char buf[64];
2259*fae548d3Szrj 
2260*fae548d3Szrj 	  SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
2261*fae548d3Szrj 	  utmp = uvalue;
2262*fae548d3Szrj 	  if (form == DW_FORM_ref8)
2263*fae548d3Szrj 	    add64 (& high_bits, & utmp, cu_offset);
2264*fae548d3Szrj 	  printf ("%c0x%s", delimiter,
2265*fae548d3Szrj 		  dwarf_vmatoa64 (high_bits, utmp, buf, sizeof (buf)));
2266*fae548d3Szrj 	}
2267*fae548d3Szrj 
2268*fae548d3Szrj       if ((do_loc || do_debug_loc || do_debug_ranges)
2269*fae548d3Szrj 	  && num_debug_info_entries == 0)
2270*fae548d3Szrj 	{
2271*fae548d3Szrj 	  if (sizeof (uvalue) == 8)
2272*fae548d3Szrj 	    SAFE_BYTE_GET (uvalue, data, 8, end);
2273*fae548d3Szrj 	  else
2274*fae548d3Szrj 	    error (_("DW_FORM_data8 is unsupported when sizeof (dwarf_vma) != 8\n"));
2275*fae548d3Szrj 	}
2276*fae548d3Szrj 
2277*fae548d3Szrj       data += 8;
2278*fae548d3Szrj       break;
2279*fae548d3Szrj 
2280*fae548d3Szrj     case DW_FORM_data16:
2281*fae548d3Szrj       if (!do_loc)
2282*fae548d3Szrj 	{
2283*fae548d3Szrj 	  dwarf_vma left_high_bits, left_low_bits;
2284*fae548d3Szrj 	  dwarf_vma right_high_bits, right_low_bits;
2285*fae548d3Szrj 
2286*fae548d3Szrj 	  SAFE_BYTE_GET64 (data, &left_high_bits, &left_low_bits, end);
2287*fae548d3Szrj 	  SAFE_BYTE_GET64 (data + 8, &right_high_bits, &right_low_bits, end);
2288*fae548d3Szrj 	  if (byte_get == byte_get_little_endian)
2289*fae548d3Szrj 	    {
2290*fae548d3Szrj 	      /* Swap them.  */
2291*fae548d3Szrj 	      left_high_bits ^= right_high_bits;
2292*fae548d3Szrj 	      right_high_bits ^= left_high_bits;
2293*fae548d3Szrj 	      left_high_bits ^= right_high_bits;
2294*fae548d3Szrj 	      left_low_bits ^= right_low_bits;
2295*fae548d3Szrj 	      right_low_bits ^= left_low_bits;
2296*fae548d3Szrj 	      left_low_bits ^= right_low_bits;
2297*fae548d3Szrj 	    }
2298*fae548d3Szrj 	  printf (" 0x%08" DWARF_VMA_FMT "x%08" DWARF_VMA_FMT "x"
2299*fae548d3Szrj 		  "%08" DWARF_VMA_FMT "x%08" DWARF_VMA_FMT "x",
2300*fae548d3Szrj 		  left_high_bits, left_low_bits, right_high_bits,
2301*fae548d3Szrj 		  right_low_bits);
2302*fae548d3Szrj 	}
2303*fae548d3Szrj       data += 16;
2304*fae548d3Szrj       break;
2305*fae548d3Szrj 
2306*fae548d3Szrj     case DW_FORM_string:
2307*fae548d3Szrj       if (!do_loc)
2308*fae548d3Szrj 	printf ("%c%.*s", delimiter, (int) (end - data), data);
2309*fae548d3Szrj       data += strnlen ((char *) data, end - data) + 1;
2310*fae548d3Szrj       break;
2311*fae548d3Szrj 
2312*fae548d3Szrj     case DW_FORM_block:
2313*fae548d3Szrj     case DW_FORM_exprloc:
2314*fae548d3Szrj       READ_ULEB (uvalue, data, end);
2315*fae548d3Szrj     do_block:
2316*fae548d3Szrj       block_start = data;
2317*fae548d3Szrj       if (block_start >= end)
2318*fae548d3Szrj 	{
2319*fae548d3Szrj 	  warn (_("Block ends prematurely\n"));
2320*fae548d3Szrj 	  uvalue = 0;
2321*fae548d3Szrj 	  block_start = end;
2322*fae548d3Szrj 	}
2323*fae548d3Szrj 
2324*fae548d3Szrj       uvalue = check_uvalue (block_start, uvalue, end);
2325*fae548d3Szrj 
2326*fae548d3Szrj       if (do_loc)
2327*fae548d3Szrj 	data = block_start + uvalue;
2328*fae548d3Szrj       else
2329*fae548d3Szrj 	data = display_block (block_start, uvalue, end, delimiter);
2330*fae548d3Szrj       break;
2331*fae548d3Szrj 
2332*fae548d3Szrj     case DW_FORM_block1:
2333*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end);
2334*fae548d3Szrj       goto do_block;
2335*fae548d3Szrj 
2336*fae548d3Szrj     case DW_FORM_block2:
2337*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end);
2338*fae548d3Szrj       goto do_block;
2339*fae548d3Szrj 
2340*fae548d3Szrj     case DW_FORM_block4:
2341*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end);
2342*fae548d3Szrj       goto do_block;
2343*fae548d3Szrj 
2344*fae548d3Szrj     case DW_FORM_strp:
2345*fae548d3Szrj       if (!do_loc)
2346*fae548d3Szrj 	printf (_("%c(indirect string, offset: 0x%s): %s"), delimiter,
2347*fae548d3Szrj 		dwarf_vmatoa ("x", uvalue),
2348*fae548d3Szrj 		fetch_indirect_string (uvalue));
2349*fae548d3Szrj       break;
2350*fae548d3Szrj 
2351*fae548d3Szrj     case DW_FORM_line_strp:
2352*fae548d3Szrj       if (!do_loc)
2353*fae548d3Szrj 	printf (_("%c(indirect line string, offset: 0x%s): %s"), delimiter,
2354*fae548d3Szrj 		dwarf_vmatoa ("x", uvalue),
2355*fae548d3Szrj 		fetch_indirect_line_string (uvalue));
2356*fae548d3Szrj       break;
2357*fae548d3Szrj 
2358*fae548d3Szrj     case DW_FORM_GNU_str_index:
2359*fae548d3Szrj       if (!do_loc)
2360*fae548d3Szrj 	{
2361*fae548d3Szrj 	  const char * suffix = strrchr (section->name, '.');
2362*fae548d3Szrj 	  bfd_boolean  dwo = (suffix && strcmp (suffix, ".dwo") == 0) ? TRUE : FALSE;
2363*fae548d3Szrj 
2364*fae548d3Szrj 	  printf (_("%c(indexed string: 0x%s): %s"), delimiter,
2365*fae548d3Szrj 		  dwarf_vmatoa ("x", uvalue),
2366*fae548d3Szrj 		  fetch_indexed_string (uvalue, this_set, offset_size, dwo));
2367*fae548d3Szrj 	}
2368*fae548d3Szrj       break;
2369*fae548d3Szrj 
2370*fae548d3Szrj     case DW_FORM_GNU_strp_alt:
2371*fae548d3Szrj       if (!do_loc)
2372*fae548d3Szrj 	{
2373*fae548d3Szrj 	  printf (_("%c(alt indirect string, offset: 0x%s) %s"), delimiter,
2374*fae548d3Szrj 		  dwarf_vmatoa ("x", uvalue),
2375*fae548d3Szrj 		  fetch_alt_indirect_string (uvalue));
2376*fae548d3Szrj 	}
2377*fae548d3Szrj       break;
2378*fae548d3Szrj 
2379*fae548d3Szrj     case DW_FORM_indirect:
2380*fae548d3Szrj       /* Handled above.  */
2381*fae548d3Szrj       break;
2382*fae548d3Szrj 
2383*fae548d3Szrj     case DW_FORM_ref_sig8:
2384*fae548d3Szrj       if (!do_loc)
2385*fae548d3Szrj 	{
2386*fae548d3Szrj 	  dwarf_vma high_bits;
2387*fae548d3Szrj 	  char buf[64];
2388*fae548d3Szrj 
2389*fae548d3Szrj 	  SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end);
2390*fae548d3Szrj 	  printf ("%csignature: 0x%s", delimiter,
2391*fae548d3Szrj 		  dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf)));
2392*fae548d3Szrj 	}
2393*fae548d3Szrj       data += 8;
2394*fae548d3Szrj       break;
2395*fae548d3Szrj 
2396*fae548d3Szrj     case DW_FORM_GNU_addr_index:
2397*fae548d3Szrj       if (!do_loc)
2398*fae548d3Szrj 	printf (_("%c(addr_index: 0x%s): %s"), delimiter,
2399*fae548d3Szrj 		dwarf_vmatoa ("x", uvalue),
2400*fae548d3Szrj 		fetch_indexed_value (uvalue * pointer_size, pointer_size));
2401*fae548d3Szrj       break;
2402*fae548d3Szrj 
2403*fae548d3Szrj     default:
2404*fae548d3Szrj       warn (_("Unrecognized form: %lu\n"), form);
2405*fae548d3Szrj       break;
2406*fae548d3Szrj     }
2407*fae548d3Szrj 
2408*fae548d3Szrj   if ((do_loc || do_debug_loc || do_debug_ranges)
2409*fae548d3Szrj       && num_debug_info_entries == 0
2410*fae548d3Szrj       && debug_info_p != NULL)
2411*fae548d3Szrj     {
2412*fae548d3Szrj       switch (attribute)
2413*fae548d3Szrj 	{
2414*fae548d3Szrj 	case DW_AT_frame_base:
2415*fae548d3Szrj 	  have_frame_base = 1;
2416*fae548d3Szrj 	  /* Fall through.  */
2417*fae548d3Szrj 	case DW_AT_location:
2418*fae548d3Szrj 	case DW_AT_GNU_locviews:
2419*fae548d3Szrj 	case DW_AT_string_length:
2420*fae548d3Szrj 	case DW_AT_return_addr:
2421*fae548d3Szrj 	case DW_AT_data_member_location:
2422*fae548d3Szrj 	case DW_AT_vtable_elem_location:
2423*fae548d3Szrj 	case DW_AT_segment:
2424*fae548d3Szrj 	case DW_AT_static_link:
2425*fae548d3Szrj 	case DW_AT_use_location:
2426*fae548d3Szrj 	case DW_AT_call_value:
2427*fae548d3Szrj 	case DW_AT_GNU_call_site_value:
2428*fae548d3Szrj 	case DW_AT_call_data_value:
2429*fae548d3Szrj 	case DW_AT_GNU_call_site_data_value:
2430*fae548d3Szrj 	case DW_AT_call_target:
2431*fae548d3Szrj 	case DW_AT_GNU_call_site_target:
2432*fae548d3Szrj 	case DW_AT_call_target_clobbered:
2433*fae548d3Szrj 	case DW_AT_GNU_call_site_target_clobbered:
2434*fae548d3Szrj 	  if ((dwarf_version < 4
2435*fae548d3Szrj 	       && (form == DW_FORM_data4 || form == DW_FORM_data8))
2436*fae548d3Szrj 	      || form == DW_FORM_sec_offset)
2437*fae548d3Szrj 	    {
2438*fae548d3Szrj 	      /* Process location list.  */
2439*fae548d3Szrj 	      unsigned int lmax = debug_info_p->max_loc_offsets;
2440*fae548d3Szrj 	      unsigned int num = debug_info_p->num_loc_offsets;
2441*fae548d3Szrj 
2442*fae548d3Szrj 	      if (lmax == 0 || num >= lmax)
2443*fae548d3Szrj 		{
2444*fae548d3Szrj 		  lmax += 1024;
2445*fae548d3Szrj 		  debug_info_p->loc_offsets = (dwarf_vma *)
2446*fae548d3Szrj 		    xcrealloc (debug_info_p->loc_offsets,
2447*fae548d3Szrj 			       lmax, sizeof (*debug_info_p->loc_offsets));
2448*fae548d3Szrj 		  debug_info_p->loc_views = (dwarf_vma *)
2449*fae548d3Szrj 		    xcrealloc (debug_info_p->loc_views,
2450*fae548d3Szrj 			       lmax, sizeof (*debug_info_p->loc_views));
2451*fae548d3Szrj 		  debug_info_p->have_frame_base = (int *)
2452*fae548d3Szrj 		    xcrealloc (debug_info_p->have_frame_base,
2453*fae548d3Szrj 			       lmax, sizeof (*debug_info_p->have_frame_base));
2454*fae548d3Szrj 		  debug_info_p->max_loc_offsets = lmax;
2455*fae548d3Szrj 		}
2456*fae548d3Szrj 	      if (this_set != NULL)
2457*fae548d3Szrj 		uvalue += this_set->section_offsets [DW_SECT_LOC];
2458*fae548d3Szrj 	      debug_info_p->have_frame_base [num] = have_frame_base;
2459*fae548d3Szrj 	      if (attribute != DW_AT_GNU_locviews)
2460*fae548d3Szrj 		{
2461*fae548d3Szrj 		  /* Corrupt DWARF info can produce more offsets than views.
2462*fae548d3Szrj 		     See PR 23062 for an example.  */
2463*fae548d3Szrj 		  if (debug_info_p->num_loc_offsets
2464*fae548d3Szrj 		      > debug_info_p->num_loc_views)
2465*fae548d3Szrj 		    warn (_("More location offset attributes than DW_AT_GNU_locview attributes\n"));
2466*fae548d3Szrj 		  else
2467*fae548d3Szrj 		    {
2468*fae548d3Szrj 		      debug_info_p->loc_offsets [num] = uvalue;
2469*fae548d3Szrj 		      debug_info_p->num_loc_offsets++;
2470*fae548d3Szrj 		    }
2471*fae548d3Szrj 		}
2472*fae548d3Szrj 	      else
2473*fae548d3Szrj 		{
2474*fae548d3Szrj 		  assert (debug_info_p->num_loc_views <= num);
2475*fae548d3Szrj 		  num = debug_info_p->num_loc_views;
2476*fae548d3Szrj 		  if (num > debug_info_p->num_loc_offsets)
2477*fae548d3Szrj 		    warn (_("More DW_AT_GNU_locview attributes than location offset attributes\n"));
2478*fae548d3Szrj 		  else
2479*fae548d3Szrj 		    {
2480*fae548d3Szrj 		      debug_info_p->loc_views [num] = uvalue;
2481*fae548d3Szrj 		      debug_info_p->num_loc_views++;
2482*fae548d3Szrj 		    }
2483*fae548d3Szrj 		}
2484*fae548d3Szrj 	    }
2485*fae548d3Szrj 	  break;
2486*fae548d3Szrj 
2487*fae548d3Szrj 	case DW_AT_low_pc:
2488*fae548d3Szrj 	  if (need_base_address)
2489*fae548d3Szrj 	    debug_info_p->base_address = uvalue;
2490*fae548d3Szrj 	  break;
2491*fae548d3Szrj 
2492*fae548d3Szrj 	case DW_AT_GNU_addr_base:
2493*fae548d3Szrj 	  debug_info_p->addr_base = uvalue;
2494*fae548d3Szrj 	  break;
2495*fae548d3Szrj 
2496*fae548d3Szrj 	case DW_AT_GNU_ranges_base:
2497*fae548d3Szrj 	  debug_info_p->ranges_base = uvalue;
2498*fae548d3Szrj 	  break;
2499*fae548d3Szrj 
2500*fae548d3Szrj 	case DW_AT_ranges:
2501*fae548d3Szrj 	  if ((dwarf_version < 4
2502*fae548d3Szrj 	       && (form == DW_FORM_data4 || form == DW_FORM_data8))
2503*fae548d3Szrj 	      || form == DW_FORM_sec_offset)
2504*fae548d3Szrj 	    {
2505*fae548d3Szrj 	      /* Process range list.  */
2506*fae548d3Szrj 	      unsigned int lmax = debug_info_p->max_range_lists;
2507*fae548d3Szrj 	      unsigned int num = debug_info_p->num_range_lists;
2508*fae548d3Szrj 
2509*fae548d3Szrj 	      if (lmax == 0 || num >= lmax)
2510*fae548d3Szrj 		{
2511*fae548d3Szrj 		  lmax += 1024;
2512*fae548d3Szrj 		  debug_info_p->range_lists = (dwarf_vma *)
2513*fae548d3Szrj 		    xcrealloc (debug_info_p->range_lists,
2514*fae548d3Szrj 			       lmax, sizeof (*debug_info_p->range_lists));
2515*fae548d3Szrj 		  debug_info_p->max_range_lists = lmax;
2516*fae548d3Szrj 		}
2517*fae548d3Szrj 	      debug_info_p->range_lists [num] = uvalue;
2518*fae548d3Szrj 	      debug_info_p->num_range_lists++;
2519*fae548d3Szrj 	    }
2520*fae548d3Szrj 	  break;
2521*fae548d3Szrj 
2522*fae548d3Szrj 	case DW_AT_GNU_dwo_name:
2523*fae548d3Szrj 	case DW_AT_dwo_name:
2524*fae548d3Szrj 	  if (need_dwo_info)
2525*fae548d3Szrj 	    switch (form)
2526*fae548d3Szrj 	      {
2527*fae548d3Szrj 	      case DW_FORM_strp:
2528*fae548d3Szrj 		add_dwo_name ((const char *) fetch_indirect_string (uvalue));
2529*fae548d3Szrj 		break;
2530*fae548d3Szrj 	      case DW_FORM_GNU_str_index:
2531*fae548d3Szrj 		add_dwo_name (fetch_indexed_string (uvalue, this_set, offset_size, FALSE));
2532*fae548d3Szrj 		break;
2533*fae548d3Szrj 	      case DW_FORM_string:
2534*fae548d3Szrj 		add_dwo_name ((const char *) orig_data);
2535*fae548d3Szrj 		break;
2536*fae548d3Szrj 	      default:
2537*fae548d3Szrj 		warn (_("Unsupported form (%s) for attribute %s\n"),
2538*fae548d3Szrj 		      get_FORM_name (form), get_AT_name (attribute));
2539*fae548d3Szrj 		break;
2540*fae548d3Szrj 	      }
2541*fae548d3Szrj 	  break;
2542*fae548d3Szrj 
2543*fae548d3Szrj 	case DW_AT_comp_dir:
2544*fae548d3Szrj 	  /* FIXME: Also extract a build-id in a CU/TU.  */
2545*fae548d3Szrj 	  if (need_dwo_info)
2546*fae548d3Szrj 	    switch (form)
2547*fae548d3Szrj 	      {
2548*fae548d3Szrj 	      case DW_FORM_strp:
2549*fae548d3Szrj 		add_dwo_dir ((const char *) fetch_indirect_string (uvalue));
2550*fae548d3Szrj 		break;
2551*fae548d3Szrj 	      case DW_FORM_line_strp:
2552*fae548d3Szrj 		add_dwo_dir ((const char *) fetch_indirect_line_string (uvalue));
2553*fae548d3Szrj 		break;
2554*fae548d3Szrj 	      case DW_FORM_GNU_str_index:
2555*fae548d3Szrj 		add_dwo_dir (fetch_indexed_string (uvalue, this_set, offset_size, FALSE));
2556*fae548d3Szrj 		break;
2557*fae548d3Szrj 	      case DW_FORM_string:
2558*fae548d3Szrj 		add_dwo_dir ((const char *) orig_data);
2559*fae548d3Szrj 		break;
2560*fae548d3Szrj 	      default:
2561*fae548d3Szrj 		warn (_("Unsupported form (%s) for attribute %s\n"),
2562*fae548d3Szrj 		      get_FORM_name (form), get_AT_name (attribute));
2563*fae548d3Szrj 		break;
2564*fae548d3Szrj 	      }
2565*fae548d3Szrj 	  break;
2566*fae548d3Szrj 
2567*fae548d3Szrj 	case DW_AT_GNU_dwo_id:
2568*fae548d3Szrj 	  if (need_dwo_info)
2569*fae548d3Szrj 	    switch (form)
2570*fae548d3Szrj 	      {
2571*fae548d3Szrj 	      case DW_FORM_data8:
2572*fae548d3Szrj 		/* FIXME: Record the length of the ID as well ?  */
2573*fae548d3Szrj 		add_dwo_id ((const char *) (data - 8));
2574*fae548d3Szrj 		break;
2575*fae548d3Szrj 	      default:
2576*fae548d3Szrj 		warn (_("Unsupported form (%s) for attribute %s\n"),
2577*fae548d3Szrj 		      get_FORM_name (form), get_AT_name (attribute));
2578*fae548d3Szrj 		break;
2579*fae548d3Szrj 	      }
2580*fae548d3Szrj 	  break;
2581*fae548d3Szrj 
2582*fae548d3Szrj 	default:
2583*fae548d3Szrj 	  break;
2584*fae548d3Szrj 	}
2585*fae548d3Szrj     }
2586*fae548d3Szrj 
2587*fae548d3Szrj   if (do_loc || attribute == 0)
2588*fae548d3Szrj     return data;
2589*fae548d3Szrj 
2590*fae548d3Szrj   /* For some attributes we can display further information.  */
2591*fae548d3Szrj   switch (attribute)
2592*fae548d3Szrj     {
2593*fae548d3Szrj     case DW_AT_type:
2594*fae548d3Szrj       if (level >= 0 && level < MAX_CU_NESTING
2595*fae548d3Szrj 	  && uvalue < (size_t) (end - start))
2596*fae548d3Szrj 	{
2597*fae548d3Szrj 	  bfd_boolean is_signed = FALSE;
2598*fae548d3Szrj 
2599*fae548d3Szrj 	  get_type_signedness (start, start + uvalue, end, pointer_size,
2600*fae548d3Szrj 			       offset_size, dwarf_version, & is_signed, FALSE);
2601*fae548d3Szrj 	  level_type_signed[level] = is_signed;
2602*fae548d3Szrj 	}
2603*fae548d3Szrj       break;
2604*fae548d3Szrj 
2605*fae548d3Szrj     case DW_AT_inline:
2606*fae548d3Szrj       printf ("\t");
2607*fae548d3Szrj       switch (uvalue)
2608*fae548d3Szrj 	{
2609*fae548d3Szrj 	case DW_INL_not_inlined:
2610*fae548d3Szrj 	  printf (_("(not inlined)"));
2611*fae548d3Szrj 	  break;
2612*fae548d3Szrj 	case DW_INL_inlined:
2613*fae548d3Szrj 	  printf (_("(inlined)"));
2614*fae548d3Szrj 	  break;
2615*fae548d3Szrj 	case DW_INL_declared_not_inlined:
2616*fae548d3Szrj 	  printf (_("(declared as inline but ignored)"));
2617*fae548d3Szrj 	  break;
2618*fae548d3Szrj 	case DW_INL_declared_inlined:
2619*fae548d3Szrj 	  printf (_("(declared as inline and inlined)"));
2620*fae548d3Szrj 	  break;
2621*fae548d3Szrj 	default:
2622*fae548d3Szrj 	  printf (_("  (Unknown inline attribute value: %s)"),
2623*fae548d3Szrj 		  dwarf_vmatoa ("x", uvalue));
2624*fae548d3Szrj 	  break;
2625*fae548d3Szrj 	}
2626*fae548d3Szrj       break;
2627*fae548d3Szrj 
2628*fae548d3Szrj     case DW_AT_language:
2629*fae548d3Szrj       printf ("\t");
2630*fae548d3Szrj       switch (uvalue)
2631*fae548d3Szrj 	{
2632*fae548d3Szrj 	  /* Ordered by the numeric value of these constants.  */
2633*fae548d3Szrj 	case DW_LANG_C89:		printf ("(ANSI C)"); break;
2634*fae548d3Szrj 	case DW_LANG_C:			printf ("(non-ANSI C)"); break;
2635*fae548d3Szrj 	case DW_LANG_Ada83:		printf ("(Ada)"); break;
2636*fae548d3Szrj 	case DW_LANG_C_plus_plus:	printf ("(C++)"); break;
2637*fae548d3Szrj 	case DW_LANG_Cobol74:		printf ("(Cobol 74)"); break;
2638*fae548d3Szrj 	case DW_LANG_Cobol85:		printf ("(Cobol 85)"); break;
2639*fae548d3Szrj 	case DW_LANG_Fortran77:		printf ("(FORTRAN 77)"); break;
2640*fae548d3Szrj 	case DW_LANG_Fortran90:		printf ("(Fortran 90)"); break;
2641*fae548d3Szrj 	case DW_LANG_Pascal83:		printf ("(ANSI Pascal)"); break;
2642*fae548d3Szrj 	case DW_LANG_Modula2:		printf ("(Modula 2)"); break;
2643*fae548d3Szrj 	  /* DWARF 2.1 values.	*/
2644*fae548d3Szrj 	case DW_LANG_Java:		printf ("(Java)"); break;
2645*fae548d3Szrj 	case DW_LANG_C99:		printf ("(ANSI C99)"); break;
2646*fae548d3Szrj 	case DW_LANG_Ada95:		printf ("(ADA 95)"); break;
2647*fae548d3Szrj 	case DW_LANG_Fortran95:		printf ("(Fortran 95)"); break;
2648*fae548d3Szrj 	  /* DWARF 3 values.  */
2649*fae548d3Szrj 	case DW_LANG_PLI:		printf ("(PLI)"); break;
2650*fae548d3Szrj 	case DW_LANG_ObjC:		printf ("(Objective C)"); break;
2651*fae548d3Szrj 	case DW_LANG_ObjC_plus_plus:	printf ("(Objective C++)"); break;
2652*fae548d3Szrj 	case DW_LANG_UPC:		printf ("(Unified Parallel C)"); break;
2653*fae548d3Szrj 	case DW_LANG_D:			printf ("(D)"); break;
2654*fae548d3Szrj 	  /* DWARF 4 values.  */
2655*fae548d3Szrj 	case DW_LANG_Python:		printf ("(Python)"); break;
2656*fae548d3Szrj 	  /* DWARF 5 values.  */
2657*fae548d3Szrj 	case DW_LANG_OpenCL:		printf ("(OpenCL)"); break;
2658*fae548d3Szrj 	case DW_LANG_Go:		printf ("(Go)"); break;
2659*fae548d3Szrj 	case DW_LANG_Modula3:		printf ("(Modula 3)"); break;
2660*fae548d3Szrj 	case DW_LANG_Haskell:		printf ("(Haskell)"); break;
2661*fae548d3Szrj 	case DW_LANG_C_plus_plus_03:	printf ("(C++03)"); break;
2662*fae548d3Szrj 	case DW_LANG_C_plus_plus_11:	printf ("(C++11)"); break;
2663*fae548d3Szrj 	case DW_LANG_OCaml:		printf ("(OCaml)"); break;
2664*fae548d3Szrj 	case DW_LANG_Rust:		printf ("(Rust)"); break;
2665*fae548d3Szrj 	case DW_LANG_C11:		printf ("(C11)"); break;
2666*fae548d3Szrj 	case DW_LANG_Swift:		printf ("(Swift)"); break;
2667*fae548d3Szrj 	case DW_LANG_Julia:		printf ("(Julia)"); break;
2668*fae548d3Szrj 	case DW_LANG_Dylan:		printf ("(Dylan)"); break;
2669*fae548d3Szrj 	case DW_LANG_C_plus_plus_14:	printf ("(C++14)"); break;
2670*fae548d3Szrj 	case DW_LANG_Fortran03:		printf ("(Fortran 03)"); break;
2671*fae548d3Szrj 	case DW_LANG_Fortran08:		printf ("(Fortran 08)"); break;
2672*fae548d3Szrj 	case DW_LANG_RenderScript:	printf ("(RenderScript)"); break;
2673*fae548d3Szrj 	  /* MIPS extension.  */
2674*fae548d3Szrj 	case DW_LANG_Mips_Assembler:	printf ("(MIPS assembler)"); break;
2675*fae548d3Szrj 	  /* UPC extension.  */
2676*fae548d3Szrj 	case DW_LANG_Upc:		printf ("(Unified Parallel C)"); break;
2677*fae548d3Szrj 	default:
2678*fae548d3Szrj 	  if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
2679*fae548d3Szrj 	    printf (_("(implementation defined: %s)"),
2680*fae548d3Szrj 		    dwarf_vmatoa ("x", uvalue));
2681*fae548d3Szrj 	  else
2682*fae548d3Szrj 	    printf (_("(Unknown: %s)"), dwarf_vmatoa ("x", uvalue));
2683*fae548d3Szrj 	  break;
2684*fae548d3Szrj 	}
2685*fae548d3Szrj       break;
2686*fae548d3Szrj 
2687*fae548d3Szrj     case DW_AT_encoding:
2688*fae548d3Szrj       printf ("\t");
2689*fae548d3Szrj       switch (uvalue)
2690*fae548d3Szrj 	{
2691*fae548d3Szrj 	case DW_ATE_void:		printf ("(void)"); break;
2692*fae548d3Szrj 	case DW_ATE_address:		printf ("(machine address)"); break;
2693*fae548d3Szrj 	case DW_ATE_boolean:		printf ("(boolean)"); break;
2694*fae548d3Szrj 	case DW_ATE_complex_float:	printf ("(complex float)"); break;
2695*fae548d3Szrj 	case DW_ATE_float:		printf ("(float)"); break;
2696*fae548d3Szrj 	case DW_ATE_signed:		printf ("(signed)"); break;
2697*fae548d3Szrj 	case DW_ATE_signed_char:	printf ("(signed char)"); break;
2698*fae548d3Szrj 	case DW_ATE_unsigned:		printf ("(unsigned)"); break;
2699*fae548d3Szrj 	case DW_ATE_unsigned_char:	printf ("(unsigned char)"); break;
2700*fae548d3Szrj 	  /* DWARF 2.1 values:  */
2701*fae548d3Szrj 	case DW_ATE_imaginary_float:	printf ("(imaginary float)"); break;
2702*fae548d3Szrj 	case DW_ATE_decimal_float:	printf ("(decimal float)"); break;
2703*fae548d3Szrj 	  /* DWARF 3 values:  */
2704*fae548d3Szrj 	case DW_ATE_packed_decimal:	printf ("(packed_decimal)"); break;
2705*fae548d3Szrj 	case DW_ATE_numeric_string:	printf ("(numeric_string)"); break;
2706*fae548d3Szrj 	case DW_ATE_edited:		printf ("(edited)"); break;
2707*fae548d3Szrj 	case DW_ATE_signed_fixed:	printf ("(signed_fixed)"); break;
2708*fae548d3Szrj 	case DW_ATE_unsigned_fixed:	printf ("(unsigned_fixed)"); break;
2709*fae548d3Szrj 	  /* DWARF 4 values:  */
2710*fae548d3Szrj 	case DW_ATE_UTF:		printf ("(unicode string)"); break;
2711*fae548d3Szrj 	  /* DWARF 5 values:  */
2712*fae548d3Szrj 	case DW_ATE_UCS:		printf ("(UCS)"); break;
2713*fae548d3Szrj 	case DW_ATE_ASCII:		printf ("(ASCII)"); break;
2714*fae548d3Szrj 
2715*fae548d3Szrj 	  /* HP extensions:  */
2716*fae548d3Szrj 	case DW_ATE_HP_float80:		printf ("(HP_float80)"); break;
2717*fae548d3Szrj 	case DW_ATE_HP_complex_float80:	printf ("(HP_complex_float80)"); break;
2718*fae548d3Szrj 	case DW_ATE_HP_float128:	printf ("(HP_float128)"); break;
2719*fae548d3Szrj 	case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
2720*fae548d3Szrj 	case DW_ATE_HP_floathpintel:	printf ("(HP_floathpintel)"); break;
2721*fae548d3Szrj 	case DW_ATE_HP_imaginary_float80:	printf ("(HP_imaginary_float80)"); break;
2722*fae548d3Szrj 	case DW_ATE_HP_imaginary_float128:	printf ("(HP_imaginary_float128)"); break;
2723*fae548d3Szrj 
2724*fae548d3Szrj 	default:
2725*fae548d3Szrj 	  if (uvalue >= DW_ATE_lo_user
2726*fae548d3Szrj 	      && uvalue <= DW_ATE_hi_user)
2727*fae548d3Szrj 	    printf (_("(user defined type)"));
2728*fae548d3Szrj 	  else
2729*fae548d3Szrj 	    printf (_("(unknown type)"));
2730*fae548d3Szrj 	  break;
2731*fae548d3Szrj 	}
2732*fae548d3Szrj       break;
2733*fae548d3Szrj 
2734*fae548d3Szrj     case DW_AT_accessibility:
2735*fae548d3Szrj       printf ("\t");
2736*fae548d3Szrj       switch (uvalue)
2737*fae548d3Szrj 	{
2738*fae548d3Szrj 	case DW_ACCESS_public:		printf ("(public)"); break;
2739*fae548d3Szrj 	case DW_ACCESS_protected:	printf ("(protected)"); break;
2740*fae548d3Szrj 	case DW_ACCESS_private:		printf ("(private)"); break;
2741*fae548d3Szrj 	default:
2742*fae548d3Szrj 	  printf (_("(unknown accessibility)"));
2743*fae548d3Szrj 	  break;
2744*fae548d3Szrj 	}
2745*fae548d3Szrj       break;
2746*fae548d3Szrj 
2747*fae548d3Szrj     case DW_AT_visibility:
2748*fae548d3Szrj       printf ("\t");
2749*fae548d3Szrj       switch (uvalue)
2750*fae548d3Szrj 	{
2751*fae548d3Szrj 	case DW_VIS_local:		printf ("(local)"); break;
2752*fae548d3Szrj 	case DW_VIS_exported:		printf ("(exported)"); break;
2753*fae548d3Szrj 	case DW_VIS_qualified:		printf ("(qualified)"); break;
2754*fae548d3Szrj 	default:			printf (_("(unknown visibility)")); break;
2755*fae548d3Szrj 	}
2756*fae548d3Szrj       break;
2757*fae548d3Szrj 
2758*fae548d3Szrj     case DW_AT_endianity:
2759*fae548d3Szrj       printf ("\t");
2760*fae548d3Szrj       switch (uvalue)
2761*fae548d3Szrj 	{
2762*fae548d3Szrj 	case DW_END_default:		printf ("(default)"); break;
2763*fae548d3Szrj 	case DW_END_big:		printf ("(big)"); break;
2764*fae548d3Szrj 	case DW_END_little:		printf ("(little)"); break;
2765*fae548d3Szrj 	default:
2766*fae548d3Szrj 	  if (uvalue >= DW_END_lo_user && uvalue <= DW_END_hi_user)
2767*fae548d3Szrj 	    printf (_("(user specified)"));
2768*fae548d3Szrj 	  else
2769*fae548d3Szrj 	    printf (_("(unknown endianity)"));
2770*fae548d3Szrj 	  break;
2771*fae548d3Szrj 	}
2772*fae548d3Szrj       break;
2773*fae548d3Szrj 
2774*fae548d3Szrj     case DW_AT_virtuality:
2775*fae548d3Szrj       printf ("\t");
2776*fae548d3Szrj       switch (uvalue)
2777*fae548d3Szrj 	{
2778*fae548d3Szrj 	case DW_VIRTUALITY_none:	printf ("(none)"); break;
2779*fae548d3Szrj 	case DW_VIRTUALITY_virtual:	printf ("(virtual)"); break;
2780*fae548d3Szrj 	case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
2781*fae548d3Szrj 	default:			printf (_("(unknown virtuality)")); break;
2782*fae548d3Szrj 	}
2783*fae548d3Szrj       break;
2784*fae548d3Szrj 
2785*fae548d3Szrj     case DW_AT_identifier_case:
2786*fae548d3Szrj       printf ("\t");
2787*fae548d3Szrj       switch (uvalue)
2788*fae548d3Szrj 	{
2789*fae548d3Szrj 	case DW_ID_case_sensitive:	printf ("(case_sensitive)"); break;
2790*fae548d3Szrj 	case DW_ID_up_case:		printf ("(up_case)"); break;
2791*fae548d3Szrj 	case DW_ID_down_case:		printf ("(down_case)"); break;
2792*fae548d3Szrj 	case DW_ID_case_insensitive:	printf ("(case_insensitive)"); break;
2793*fae548d3Szrj 	default:			printf (_("(unknown case)")); break;
2794*fae548d3Szrj 	}
2795*fae548d3Szrj       break;
2796*fae548d3Szrj 
2797*fae548d3Szrj     case DW_AT_calling_convention:
2798*fae548d3Szrj       printf ("\t");
2799*fae548d3Szrj       switch (uvalue)
2800*fae548d3Szrj 	{
2801*fae548d3Szrj 	case DW_CC_normal:	printf ("(normal)"); break;
2802*fae548d3Szrj 	case DW_CC_program:	printf ("(program)"); break;
2803*fae548d3Szrj 	case DW_CC_nocall:	printf ("(nocall)"); break;
2804*fae548d3Szrj 	case DW_CC_pass_by_reference: printf ("(pass by ref)"); break;
2805*fae548d3Szrj 	case DW_CC_pass_by_value: printf ("(pass by value)"); break;
2806*fae548d3Szrj 	case DW_CC_GNU_renesas_sh: printf ("(Rensas SH)"); break;
2807*fae548d3Szrj 	case DW_CC_GNU_borland_fastcall_i386: printf ("(Borland fastcall i386)"); break;
2808*fae548d3Szrj 	default:
2809*fae548d3Szrj 	  if (uvalue >= DW_CC_lo_user
2810*fae548d3Szrj 	      && uvalue <= DW_CC_hi_user)
2811*fae548d3Szrj 	    printf (_("(user defined)"));
2812*fae548d3Szrj 	  else
2813*fae548d3Szrj 	    printf (_("(unknown convention)"));
2814*fae548d3Szrj 	}
2815*fae548d3Szrj       break;
2816*fae548d3Szrj 
2817*fae548d3Szrj     case DW_AT_ordering:
2818*fae548d3Szrj       printf ("\t");
2819*fae548d3Szrj       switch (uvalue)
2820*fae548d3Szrj 	{
2821*fae548d3Szrj 	case 255:
2822*fae548d3Szrj 	case -1: printf (_("(undefined)")); break;
2823*fae548d3Szrj 	case 0:  printf ("(row major)"); break;
2824*fae548d3Szrj 	case 1:  printf ("(column major)"); break;
2825*fae548d3Szrj 	}
2826*fae548d3Szrj       break;
2827*fae548d3Szrj 
2828*fae548d3Szrj     case DW_AT_decimal_sign:
2829*fae548d3Szrj       printf ("\t");
2830*fae548d3Szrj       switch (uvalue)
2831*fae548d3Szrj 	{
2832*fae548d3Szrj 	case DW_DS_unsigned:            printf (_("(unsigned)")); break;
2833*fae548d3Szrj 	case DW_DS_leading_overpunch:   printf (_("(leading overpunch)")); break;
2834*fae548d3Szrj 	case DW_DS_trailing_overpunch:  printf (_("(trailing overpunch)")); break;
2835*fae548d3Szrj 	case DW_DS_leading_separate:    printf (_("(leading separate)")); break;
2836*fae548d3Szrj 	case DW_DS_trailing_separate:   printf (_("(trailing separate)")); break;
2837*fae548d3Szrj 	default:                        printf (_("(unrecognised)")); break;
2838*fae548d3Szrj 	}
2839*fae548d3Szrj       break;
2840*fae548d3Szrj 
2841*fae548d3Szrj     case DW_AT_defaulted:
2842*fae548d3Szrj       printf ("\t");
2843*fae548d3Szrj       switch (uvalue)
2844*fae548d3Szrj 	{
2845*fae548d3Szrj 	case DW_DEFAULTED_no:           printf (_("(no)")); break;
2846*fae548d3Szrj 	case DW_DEFAULTED_in_class:     printf (_("(in class)")); break;
2847*fae548d3Szrj 	case DW_DEFAULTED_out_of_class: printf (_("(out of class)")); break;
2848*fae548d3Szrj 	default:                        printf (_("(unrecognised)")); break;
2849*fae548d3Szrj 	}
2850*fae548d3Szrj       break;
2851*fae548d3Szrj 
2852*fae548d3Szrj     case DW_AT_discr_list:
2853*fae548d3Szrj       printf ("\t");
2854*fae548d3Szrj       display_discr_list (form, uvalue, data, end, level);
2855*fae548d3Szrj       break;
2856*fae548d3Szrj 
2857*fae548d3Szrj     case DW_AT_frame_base:
2858*fae548d3Szrj       have_frame_base = 1;
2859*fae548d3Szrj       /* Fall through.  */
2860*fae548d3Szrj     case DW_AT_location:
2861*fae548d3Szrj     case DW_AT_string_length:
2862*fae548d3Szrj     case DW_AT_return_addr:
2863*fae548d3Szrj     case DW_AT_data_member_location:
2864*fae548d3Szrj     case DW_AT_vtable_elem_location:
2865*fae548d3Szrj     case DW_AT_segment:
2866*fae548d3Szrj     case DW_AT_static_link:
2867*fae548d3Szrj     case DW_AT_use_location:
2868*fae548d3Szrj     case DW_AT_call_value:
2869*fae548d3Szrj     case DW_AT_GNU_call_site_value:
2870*fae548d3Szrj     case DW_AT_call_data_value:
2871*fae548d3Szrj     case DW_AT_GNU_call_site_data_value:
2872*fae548d3Szrj     case DW_AT_call_target:
2873*fae548d3Szrj     case DW_AT_GNU_call_site_target:
2874*fae548d3Szrj     case DW_AT_call_target_clobbered:
2875*fae548d3Szrj     case DW_AT_GNU_call_site_target_clobbered:
2876*fae548d3Szrj       if ((dwarf_version < 4
2877*fae548d3Szrj 	   && (form == DW_FORM_data4 || form == DW_FORM_data8))
2878*fae548d3Szrj 	  || form == DW_FORM_sec_offset)
2879*fae548d3Szrj 	printf (_(" (location list)"));
2880*fae548d3Szrj       /* Fall through.  */
2881*fae548d3Szrj     case DW_AT_allocated:
2882*fae548d3Szrj     case DW_AT_associated:
2883*fae548d3Szrj     case DW_AT_data_location:
2884*fae548d3Szrj     case DW_AT_stride:
2885*fae548d3Szrj     case DW_AT_upper_bound:
2886*fae548d3Szrj     case DW_AT_lower_bound:
2887*fae548d3Szrj       if (block_start)
2888*fae548d3Szrj 	{
2889*fae548d3Szrj 	  int need_frame_base;
2890*fae548d3Szrj 
2891*fae548d3Szrj 	  printf ("\t(");
2892*fae548d3Szrj 	  need_frame_base = decode_location_expression (block_start,
2893*fae548d3Szrj 							pointer_size,
2894*fae548d3Szrj 							offset_size,
2895*fae548d3Szrj 							dwarf_version,
2896*fae548d3Szrj 							uvalue,
2897*fae548d3Szrj 							cu_offset, section);
2898*fae548d3Szrj 	  printf (")");
2899*fae548d3Szrj 	  if (need_frame_base && !have_frame_base)
2900*fae548d3Szrj 	    printf (_(" [without DW_AT_frame_base]"));
2901*fae548d3Szrj 	}
2902*fae548d3Szrj       break;
2903*fae548d3Szrj 
2904*fae548d3Szrj     case DW_AT_data_bit_offset:
2905*fae548d3Szrj     case DW_AT_byte_size:
2906*fae548d3Szrj     case DW_AT_bit_size:
2907*fae548d3Szrj     case DW_AT_string_length_byte_size:
2908*fae548d3Szrj     case DW_AT_string_length_bit_size:
2909*fae548d3Szrj     case DW_AT_bit_stride:
2910*fae548d3Szrj       if (form == DW_FORM_exprloc)
2911*fae548d3Szrj 	{
2912*fae548d3Szrj 	  printf ("\t(");
2913*fae548d3Szrj 	  (void) decode_location_expression (block_start, pointer_size,
2914*fae548d3Szrj 					     offset_size, dwarf_version,
2915*fae548d3Szrj 					     uvalue, cu_offset, section);
2916*fae548d3Szrj 	  printf (")");
2917*fae548d3Szrj 	}
2918*fae548d3Szrj       break;
2919*fae548d3Szrj 
2920*fae548d3Szrj     case DW_AT_import:
2921*fae548d3Szrj       {
2922*fae548d3Szrj 	if (form == DW_FORM_ref_sig8
2923*fae548d3Szrj 	    || form == DW_FORM_GNU_ref_alt)
2924*fae548d3Szrj 	  break;
2925*fae548d3Szrj 
2926*fae548d3Szrj 	if (form == DW_FORM_ref1
2927*fae548d3Szrj 	    || form == DW_FORM_ref2
2928*fae548d3Szrj 	    || form == DW_FORM_ref4
2929*fae548d3Szrj 	    || form == DW_FORM_ref_udata)
2930*fae548d3Szrj 	  uvalue += cu_offset;
2931*fae548d3Szrj 
2932*fae548d3Szrj 	if (uvalue >= section->size)
2933*fae548d3Szrj 	  warn (_("Offset %s used as value for DW_AT_import attribute of DIE at offset 0x%lx is too big.\n"),
2934*fae548d3Szrj 		dwarf_vmatoa ("x", uvalue),
2935*fae548d3Szrj 		(unsigned long) (orig_data - section->start));
2936*fae548d3Szrj 	else
2937*fae548d3Szrj 	  {
2938*fae548d3Szrj 	    unsigned long abbrev_number;
2939*fae548d3Szrj 	    abbrev_entry *entry;
2940*fae548d3Szrj 	    unsigned char *p = section->start + uvalue;
2941*fae548d3Szrj 
2942*fae548d3Szrj 	    READ_ULEB (abbrev_number, p, end);
2943*fae548d3Szrj 
2944*fae548d3Szrj 	    printf (_("\t[Abbrev Number: %ld"), abbrev_number);
2945*fae548d3Szrj 	    /* Don't look up abbrev for DW_FORM_ref_addr, as it very often will
2946*fae548d3Szrj 	       use different abbrev table, and we don't track .debug_info chunks
2947*fae548d3Szrj 	       yet.  */
2948*fae548d3Szrj 	    if (form != DW_FORM_ref_addr)
2949*fae548d3Szrj 	      {
2950*fae548d3Szrj 		for (entry = first_abbrev; entry != NULL; entry = entry->next)
2951*fae548d3Szrj 		  if (entry->entry == abbrev_number)
2952*fae548d3Szrj 		    break;
2953*fae548d3Szrj 		if (entry != NULL)
2954*fae548d3Szrj 		  printf (" (%s)", get_TAG_name (entry->tag));
2955*fae548d3Szrj 	      }
2956*fae548d3Szrj 	    printf ("]");
2957*fae548d3Szrj 	  }
2958*fae548d3Szrj       }
2959*fae548d3Szrj       break;
2960*fae548d3Szrj 
2961*fae548d3Szrj     default:
2962*fae548d3Szrj       break;
2963*fae548d3Szrj     }
2964*fae548d3Szrj 
2965*fae548d3Szrj   return data;
2966*fae548d3Szrj }
2967*fae548d3Szrj 
2968*fae548d3Szrj 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)2969*fae548d3Szrj read_and_display_attr (unsigned long           attribute,
2970*fae548d3Szrj 		       unsigned long           form,
2971*fae548d3Szrj 		       dwarf_signed_vma        implicit_const,
2972*fae548d3Szrj 		       unsigned char *         start,
2973*fae548d3Szrj 		       unsigned char *         data,
2974*fae548d3Szrj 		       unsigned char *         end,
2975*fae548d3Szrj 		       dwarf_vma               cu_offset,
2976*fae548d3Szrj 		       dwarf_vma               pointer_size,
2977*fae548d3Szrj 		       dwarf_vma               offset_size,
2978*fae548d3Szrj 		       int                     dwarf_version,
2979*fae548d3Szrj 		       debug_info *            debug_info_p,
2980*fae548d3Szrj 		       int                     do_loc,
2981*fae548d3Szrj 		       struct dwarf_section *  section,
2982*fae548d3Szrj 		       struct cu_tu_set *      this_set,
2983*fae548d3Szrj 		       int                     level)
2984*fae548d3Szrj {
2985*fae548d3Szrj   if (!do_loc)
2986*fae548d3Szrj     printf ("   %-18s:", get_AT_name (attribute));
2987*fae548d3Szrj   data = read_and_display_attr_value (attribute, form, implicit_const,
2988*fae548d3Szrj 				      start, data, end,
2989*fae548d3Szrj 				      cu_offset, pointer_size, offset_size,
2990*fae548d3Szrj 				      dwarf_version, debug_info_p,
2991*fae548d3Szrj 				      do_loc, section, this_set, ' ', level);
2992*fae548d3Szrj   if (!do_loc)
2993*fae548d3Szrj     printf ("\n");
2994*fae548d3Szrj   return data;
2995*fae548d3Szrj }
2996*fae548d3Szrj 
2997*fae548d3Szrj /* Like load_debug_section, but if the ordinary call fails, and we are
2998*fae548d3Szrj    following debug links, then attempt to load the requested section
2999*fae548d3Szrj    from one of the separate debug info files.  */
3000*fae548d3Szrj 
3001*fae548d3Szrj static bfd_boolean
load_debug_section_with_follow(enum dwarf_section_display_enum sec_enum,void * handle)3002*fae548d3Szrj load_debug_section_with_follow (enum dwarf_section_display_enum sec_enum,
3003*fae548d3Szrj 				void * handle)
3004*fae548d3Szrj {
3005*fae548d3Szrj   if (load_debug_section (sec_enum, handle))
3006*fae548d3Szrj     {
3007*fae548d3Szrj       if (debug_displays[sec_enum].section.filename == NULL)
3008*fae548d3Szrj 	{
3009*fae548d3Szrj 	  /* See if we can associate a filename with this section.  */
3010*fae548d3Szrj 	  separate_info * i;
3011*fae548d3Szrj 
3012*fae548d3Szrj 	  for (i = first_separate_info; i != NULL; i = i->next)
3013*fae548d3Szrj 	    if (i->handle == handle)
3014*fae548d3Szrj 	      {
3015*fae548d3Szrj 		debug_displays[sec_enum].section.filename = i->filename;
3016*fae548d3Szrj 		break;
3017*fae548d3Szrj 	      }
3018*fae548d3Szrj 	}
3019*fae548d3Szrj 
3020*fae548d3Szrj       return TRUE;
3021*fae548d3Szrj     }
3022*fae548d3Szrj 
3023*fae548d3Szrj   if (do_follow_links)
3024*fae548d3Szrj     {
3025*fae548d3Szrj       separate_info * i;
3026*fae548d3Szrj 
3027*fae548d3Szrj       for (i = first_separate_info; i != NULL; i = i->next)
3028*fae548d3Szrj 	{
3029*fae548d3Szrj 	  if (load_debug_section (sec_enum, i->handle))
3030*fae548d3Szrj 	    {
3031*fae548d3Szrj 	      debug_displays[sec_enum].section.filename = i->filename;
3032*fae548d3Szrj 
3033*fae548d3Szrj 	      /* FIXME: We should check to see if any of the remaining debug info
3034*fae548d3Szrj 		 files also contain this section, and, umm, do something about it.  */
3035*fae548d3Szrj 	      return TRUE;
3036*fae548d3Szrj 	    }
3037*fae548d3Szrj 	}
3038*fae548d3Szrj     }
3039*fae548d3Szrj 
3040*fae548d3Szrj   return FALSE;
3041*fae548d3Szrj }
3042*fae548d3Szrj 
3043*fae548d3Szrj static void
introduce(struct dwarf_section * section,bfd_boolean raw)3044*fae548d3Szrj introduce (struct dwarf_section * section, bfd_boolean raw)
3045*fae548d3Szrj {
3046*fae548d3Szrj   if (raw)
3047*fae548d3Szrj     {
3048*fae548d3Szrj       if (do_follow_links && section->filename)
3049*fae548d3Szrj 	printf (_("Raw dump of debug contents of section %s (loaded from %s):\n\n"),
3050*fae548d3Szrj 		section->name, section->filename);
3051*fae548d3Szrj       else
3052*fae548d3Szrj 	printf (_("Raw dump of debug contents of section %s:\n\n"), section->name);
3053*fae548d3Szrj     }
3054*fae548d3Szrj   else
3055*fae548d3Szrj     {
3056*fae548d3Szrj       if (do_follow_links && section->filename)
3057*fae548d3Szrj 	printf (_("Contents of the %s section (loaded from %s):\n\n"),
3058*fae548d3Szrj 		section->name, section->filename);
3059*fae548d3Szrj       else
3060*fae548d3Szrj 	printf (_("Contents of the %s section:\n\n"), section->name);
3061*fae548d3Szrj     }
3062*fae548d3Szrj }
3063*fae548d3Szrj 
3064*fae548d3Szrj /* Process the contents of a .debug_info section.
3065*fae548d3Szrj    If do_loc is TRUE then we are scanning for location lists and dwo tags
3066*fae548d3Szrj    and we do not want to display anything to the user.
3067*fae548d3Szrj    If do_types is TRUE, we are processing a .debug_types section instead of
3068*fae548d3Szrj    a .debug_info section.
3069*fae548d3Szrj    The information displayed is restricted by the values in DWARF_START_DIE
3070*fae548d3Szrj    and DWARF_CUTOFF_LEVEL.
3071*fae548d3Szrj    Returns TRUE upon success.  Otherwise an error or warning message is
3072*fae548d3Szrj    printed and FALSE is returned.  */
3073*fae548d3Szrj 
3074*fae548d3Szrj static bfd_boolean
process_debug_info(struct dwarf_section * section,void * file,enum dwarf_section_display_enum abbrev_sec,bfd_boolean do_loc,bfd_boolean do_types)3075*fae548d3Szrj process_debug_info (struct dwarf_section *           section,
3076*fae548d3Szrj 		    void *                           file,
3077*fae548d3Szrj 		    enum dwarf_section_display_enum  abbrev_sec,
3078*fae548d3Szrj 		    bfd_boolean                      do_loc,
3079*fae548d3Szrj 		    bfd_boolean                      do_types)
3080*fae548d3Szrj {
3081*fae548d3Szrj   unsigned char *start = section->start;
3082*fae548d3Szrj   unsigned char *end = start + section->size;
3083*fae548d3Szrj   unsigned char *section_begin;
3084*fae548d3Szrj   unsigned int unit;
3085*fae548d3Szrj   unsigned int num_units = 0;
3086*fae548d3Szrj 
3087*fae548d3Szrj   if ((do_loc || do_debug_loc || do_debug_ranges)
3088*fae548d3Szrj       && num_debug_info_entries == 0
3089*fae548d3Szrj       && ! do_types)
3090*fae548d3Szrj     {
3091*fae548d3Szrj       dwarf_vma length;
3092*fae548d3Szrj 
3093*fae548d3Szrj       /* First scan the section to get the number of comp units.  */
3094*fae548d3Szrj       for (section_begin = start, num_units = 0; section_begin < end;
3095*fae548d3Szrj 	   num_units ++)
3096*fae548d3Szrj 	{
3097*fae548d3Szrj 	  /* Read the first 4 bytes.  For a 32-bit DWARF section, this
3098*fae548d3Szrj 	     will be the length.  For a 64-bit DWARF section, it'll be
3099*fae548d3Szrj 	     the escape code 0xffffffff followed by an 8 byte length.  */
3100*fae548d3Szrj 	  SAFE_BYTE_GET (length, section_begin, 4, end);
3101*fae548d3Szrj 
3102*fae548d3Szrj 	  if (length == 0xffffffff)
3103*fae548d3Szrj 	    {
3104*fae548d3Szrj 	      SAFE_BYTE_GET (length, section_begin + 4, 8, end);
3105*fae548d3Szrj 	      section_begin += length + 12;
3106*fae548d3Szrj 	    }
3107*fae548d3Szrj 	  else if (length >= 0xfffffff0 && length < 0xffffffff)
3108*fae548d3Szrj 	    {
3109*fae548d3Szrj 	      warn (_("Reserved length value (0x%s) found in section %s\n"),
3110*fae548d3Szrj 		    dwarf_vmatoa ("x", length), section->name);
3111*fae548d3Szrj 	      return FALSE;
3112*fae548d3Szrj 	    }
3113*fae548d3Szrj 	  else
3114*fae548d3Szrj 	    section_begin += length + 4;
3115*fae548d3Szrj 
3116*fae548d3Szrj 	  /* Negative values are illegal, they may even cause infinite
3117*fae548d3Szrj 	     looping.  This can happen if we can't accurately apply
3118*fae548d3Szrj 	     relocations to an object file, or if the file is corrupt.  */
3119*fae548d3Szrj 	  if ((signed long) length <= 0 || section_begin < start)
3120*fae548d3Szrj 	    {
3121*fae548d3Szrj 	      warn (_("Corrupt unit length (0x%s) found in section %s\n"),
3122*fae548d3Szrj 		    dwarf_vmatoa ("x", length), section->name);
3123*fae548d3Szrj 	      return FALSE;
3124*fae548d3Szrj 	    }
3125*fae548d3Szrj 	}
3126*fae548d3Szrj 
3127*fae548d3Szrj       if (num_units == 0)
3128*fae548d3Szrj 	{
3129*fae548d3Szrj 	  error (_("No comp units in %s section ?\n"), section->name);
3130*fae548d3Szrj 	  return FALSE;
3131*fae548d3Szrj 	}
3132*fae548d3Szrj 
3133*fae548d3Szrj       /* Then allocate an array to hold the information.  */
3134*fae548d3Szrj       debug_information = (debug_info *) cmalloc (num_units,
3135*fae548d3Szrj 						  sizeof (* debug_information));
3136*fae548d3Szrj       if (debug_information == NULL)
3137*fae548d3Szrj 	{
3138*fae548d3Szrj 	  error (_("Not enough memory for a debug info array of %u entries\n"),
3139*fae548d3Szrj 		 num_units);
3140*fae548d3Szrj 	  alloc_num_debug_info_entries = num_debug_info_entries = 0;
3141*fae548d3Szrj 	  return FALSE;
3142*fae548d3Szrj 	}
3143*fae548d3Szrj 
3144*fae548d3Szrj       /* PR 17531: file: 92ca3797.
3145*fae548d3Szrj 	 We cannot rely upon the debug_information array being initialised
3146*fae548d3Szrj 	 before it is used.  A corrupt file could easily contain references
3147*fae548d3Szrj 	 to a unit for which information has not been made available.  So
3148*fae548d3Szrj 	 we ensure that the array is zeroed here.  */
3149*fae548d3Szrj       memset (debug_information, 0, num_units * sizeof (*debug_information));
3150*fae548d3Szrj 
3151*fae548d3Szrj       alloc_num_debug_info_entries = num_units;
3152*fae548d3Szrj     }
3153*fae548d3Szrj 
3154*fae548d3Szrj   if (!do_loc)
3155*fae548d3Szrj     {
3156*fae548d3Szrj       load_debug_section_with_follow (str, file);
3157*fae548d3Szrj       load_debug_section_with_follow (line_str, file);
3158*fae548d3Szrj       load_debug_section_with_follow (str_dwo, file);
3159*fae548d3Szrj       load_debug_section_with_follow (str_index, file);
3160*fae548d3Szrj       load_debug_section_with_follow (str_index_dwo, file);
3161*fae548d3Szrj       load_debug_section_with_follow (debug_addr, file);
3162*fae548d3Szrj     }
3163*fae548d3Szrj 
3164*fae548d3Szrj   load_debug_section_with_follow (abbrev_sec, file);
3165*fae548d3Szrj   if (debug_displays [abbrev_sec].section.start == NULL)
3166*fae548d3Szrj     {
3167*fae548d3Szrj       warn (_("Unable to locate %s section!\n"),
3168*fae548d3Szrj 	    debug_displays [abbrev_sec].section.uncompressed_name);
3169*fae548d3Szrj       return FALSE;
3170*fae548d3Szrj     }
3171*fae548d3Szrj 
3172*fae548d3Szrj   if (!do_loc && dwarf_start_die == 0)
3173*fae548d3Szrj     introduce (section, FALSE);
3174*fae548d3Szrj 
3175*fae548d3Szrj   for (section_begin = start, unit = 0; start < end; unit++)
3176*fae548d3Szrj     {
3177*fae548d3Szrj       DWARF2_Internal_CompUnit compunit;
3178*fae548d3Szrj       unsigned char *hdrptr;
3179*fae548d3Szrj       unsigned char *tags;
3180*fae548d3Szrj       int level, last_level, saved_level;
3181*fae548d3Szrj       dwarf_vma cu_offset;
3182*fae548d3Szrj       unsigned long sec_off;
3183*fae548d3Szrj       unsigned int offset_size;
3184*fae548d3Szrj       unsigned int initial_length_size;
3185*fae548d3Szrj       dwarf_vma signature_high = 0;
3186*fae548d3Szrj       dwarf_vma signature_low = 0;
3187*fae548d3Szrj       dwarf_vma type_offset = 0;
3188*fae548d3Szrj       struct cu_tu_set *this_set;
3189*fae548d3Szrj       dwarf_vma abbrev_base;
3190*fae548d3Szrj       size_t abbrev_size;
3191*fae548d3Szrj 
3192*fae548d3Szrj       hdrptr = start;
3193*fae548d3Szrj 
3194*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 4, end);
3195*fae548d3Szrj 
3196*fae548d3Szrj       if (compunit.cu_length == 0xffffffff)
3197*fae548d3Szrj 	{
3198*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (compunit.cu_length, hdrptr, 8, end);
3199*fae548d3Szrj 	  offset_size = 8;
3200*fae548d3Szrj 	  initial_length_size = 12;
3201*fae548d3Szrj 	}
3202*fae548d3Szrj       else
3203*fae548d3Szrj 	{
3204*fae548d3Szrj 	  offset_size = 4;
3205*fae548d3Szrj 	  initial_length_size = 4;
3206*fae548d3Szrj 	}
3207*fae548d3Szrj 
3208*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (compunit.cu_version, hdrptr, 2, end);
3209*fae548d3Szrj 
3210*fae548d3Szrj       cu_offset = start - section_begin;
3211*fae548d3Szrj 
3212*fae548d3Szrj       this_set = find_cu_tu_set_v2 (cu_offset, do_types);
3213*fae548d3Szrj 
3214*fae548d3Szrj       if (compunit.cu_version < 5)
3215*fae548d3Szrj 	{
3216*fae548d3Szrj 	  compunit.cu_unit_type = DW_UT_compile;
3217*fae548d3Szrj 	  /* Initialize it due to a false compiler warning.  */
3218*fae548d3Szrj 	  compunit.cu_pointer_size = -1;
3219*fae548d3Szrj 	}
3220*fae548d3Szrj       else
3221*fae548d3Szrj 	{
3222*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (compunit.cu_unit_type, hdrptr, 1, end);
3223*fae548d3Szrj 	  do_types = (compunit.cu_unit_type == DW_UT_type);
3224*fae548d3Szrj 
3225*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
3226*fae548d3Szrj 	}
3227*fae548d3Szrj 
3228*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
3229*fae548d3Szrj 
3230*fae548d3Szrj       if (this_set == NULL)
3231*fae548d3Szrj 	{
3232*fae548d3Szrj 	  abbrev_base = 0;
3233*fae548d3Szrj 	  abbrev_size = debug_displays [abbrev_sec].section.size;
3234*fae548d3Szrj 	}
3235*fae548d3Szrj       else
3236*fae548d3Szrj 	{
3237*fae548d3Szrj 	  abbrev_base = this_set->section_offsets [DW_SECT_ABBREV];
3238*fae548d3Szrj 	  abbrev_size = this_set->section_sizes [DW_SECT_ABBREV];
3239*fae548d3Szrj 	}
3240*fae548d3Szrj 
3241*fae548d3Szrj       if (compunit.cu_version < 5)
3242*fae548d3Szrj 	SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
3243*fae548d3Szrj 
3244*fae548d3Szrj       /* PR 17512: file: 001-108546-0.001:0.1.  */
3245*fae548d3Szrj       if (compunit.cu_pointer_size < 2 || compunit.cu_pointer_size > 8)
3246*fae548d3Szrj 	{
3247*fae548d3Szrj 	  warn (_("Invalid pointer size (%d) in compunit header, using %d instead\n"),
3248*fae548d3Szrj 		compunit.cu_pointer_size, offset_size);
3249*fae548d3Szrj 	  compunit.cu_pointer_size = offset_size;
3250*fae548d3Szrj 	}
3251*fae548d3Szrj 
3252*fae548d3Szrj       if (do_types)
3253*fae548d3Szrj 	{
3254*fae548d3Szrj 	  SAFE_BYTE_GET64 (hdrptr, &signature_high, &signature_low, end);
3255*fae548d3Szrj 	  hdrptr += 8;
3256*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (type_offset, hdrptr, offset_size, end);
3257*fae548d3Szrj 	}
3258*fae548d3Szrj 
3259*fae548d3Szrj       if (dwarf_start_die > (cu_offset + compunit.cu_length
3260*fae548d3Szrj 			     + initial_length_size))
3261*fae548d3Szrj 	{
3262*fae548d3Szrj 	  start = section_begin + cu_offset + compunit.cu_length
3263*fae548d3Szrj 	    + initial_length_size;
3264*fae548d3Szrj 	  continue;
3265*fae548d3Szrj 	}
3266*fae548d3Szrj 
3267*fae548d3Szrj       if ((do_loc || do_debug_loc || do_debug_ranges)
3268*fae548d3Szrj 	  && num_debug_info_entries == 0
3269*fae548d3Szrj 	  && ! do_types)
3270*fae548d3Szrj 	{
3271*fae548d3Szrj 	  debug_information [unit].cu_offset = cu_offset;
3272*fae548d3Szrj 	  debug_information [unit].pointer_size
3273*fae548d3Szrj 	    = compunit.cu_pointer_size;
3274*fae548d3Szrj 	  debug_information [unit].offset_size = offset_size;
3275*fae548d3Szrj 	  debug_information [unit].dwarf_version = compunit.cu_version;
3276*fae548d3Szrj 	  debug_information [unit].base_address = 0;
3277*fae548d3Szrj 	  debug_information [unit].addr_base = DEBUG_INFO_UNAVAILABLE;
3278*fae548d3Szrj 	  debug_information [unit].ranges_base = DEBUG_INFO_UNAVAILABLE;
3279*fae548d3Szrj 	  debug_information [unit].loc_offsets = NULL;
3280*fae548d3Szrj 	  debug_information [unit].have_frame_base = NULL;
3281*fae548d3Szrj 	  debug_information [unit].max_loc_offsets = 0;
3282*fae548d3Szrj 	  debug_information [unit].num_loc_offsets = 0;
3283*fae548d3Szrj 	  debug_information [unit].range_lists = NULL;
3284*fae548d3Szrj 	  debug_information [unit].max_range_lists= 0;
3285*fae548d3Szrj 	  debug_information [unit].num_range_lists = 0;
3286*fae548d3Szrj 	}
3287*fae548d3Szrj 
3288*fae548d3Szrj       if (!do_loc && dwarf_start_die == 0)
3289*fae548d3Szrj 	{
3290*fae548d3Szrj 	  printf (_("  Compilation Unit @ offset 0x%s:\n"),
3291*fae548d3Szrj 		  dwarf_vmatoa ("x", cu_offset));
3292*fae548d3Szrj 	  printf (_("   Length:        0x%s (%s)\n"),
3293*fae548d3Szrj 		  dwarf_vmatoa ("x", compunit.cu_length),
3294*fae548d3Szrj 		  offset_size == 8 ? "64-bit" : "32-bit");
3295*fae548d3Szrj 	  printf (_("   Version:       %d\n"), compunit.cu_version);
3296*fae548d3Szrj 	  printf (_("   Abbrev Offset: 0x%s\n"),
3297*fae548d3Szrj 		  dwarf_vmatoa ("x", compunit.cu_abbrev_offset));
3298*fae548d3Szrj 	  printf (_("   Pointer Size:  %d\n"), compunit.cu_pointer_size);
3299*fae548d3Szrj 	  if (do_types)
3300*fae548d3Szrj 	    {
3301*fae548d3Szrj 	      char buf[64];
3302*fae548d3Szrj 
3303*fae548d3Szrj 	      printf (_("   Signature:     0x%s\n"),
3304*fae548d3Szrj 		      dwarf_vmatoa64 (signature_high, signature_low,
3305*fae548d3Szrj 				      buf, sizeof (buf)));
3306*fae548d3Szrj 	      printf (_("   Type Offset:   0x%s\n"),
3307*fae548d3Szrj 		      dwarf_vmatoa ("x", type_offset));
3308*fae548d3Szrj 	    }
3309*fae548d3Szrj 	  if (this_set != NULL)
3310*fae548d3Szrj 	    {
3311*fae548d3Szrj 	      dwarf_vma *offsets = this_set->section_offsets;
3312*fae548d3Szrj 	      size_t *sizes = this_set->section_sizes;
3313*fae548d3Szrj 
3314*fae548d3Szrj 	      printf (_("   Section contributions:\n"));
3315*fae548d3Szrj 	      printf (_("    .debug_abbrev.dwo:       0x%s  0x%s\n"),
3316*fae548d3Szrj 		      dwarf_vmatoa ("x", offsets [DW_SECT_ABBREV]),
3317*fae548d3Szrj 		      dwarf_vmatoa ("x", sizes [DW_SECT_ABBREV]));
3318*fae548d3Szrj 	      printf (_("    .debug_line.dwo:         0x%s  0x%s\n"),
3319*fae548d3Szrj 		      dwarf_vmatoa ("x", offsets [DW_SECT_LINE]),
3320*fae548d3Szrj 		      dwarf_vmatoa ("x", sizes [DW_SECT_LINE]));
3321*fae548d3Szrj 	      printf (_("    .debug_loc.dwo:          0x%s  0x%s\n"),
3322*fae548d3Szrj 		      dwarf_vmatoa ("x", offsets [DW_SECT_LOC]),
3323*fae548d3Szrj 		      dwarf_vmatoa ("x", sizes [DW_SECT_LOC]));
3324*fae548d3Szrj 	      printf (_("    .debug_str_offsets.dwo:  0x%s  0x%s\n"),
3325*fae548d3Szrj 		      dwarf_vmatoa ("x", offsets [DW_SECT_STR_OFFSETS]),
3326*fae548d3Szrj 		      dwarf_vmatoa ("x", sizes [DW_SECT_STR_OFFSETS]));
3327*fae548d3Szrj 	    }
3328*fae548d3Szrj 	}
3329*fae548d3Szrj 
3330*fae548d3Szrj       sec_off = cu_offset + initial_length_size;
3331*fae548d3Szrj       if (sec_off + compunit.cu_length < sec_off
3332*fae548d3Szrj 	  || sec_off + compunit.cu_length > section->size)
3333*fae548d3Szrj 	{
3334*fae548d3Szrj 	  warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
3335*fae548d3Szrj 		section->name,
3336*fae548d3Szrj 		(unsigned long) cu_offset,
3337*fae548d3Szrj 		dwarf_vmatoa ("x", compunit.cu_length));
3338*fae548d3Szrj 	  num_units = unit;
3339*fae548d3Szrj 	  break;
3340*fae548d3Szrj 	}
3341*fae548d3Szrj 
3342*fae548d3Szrj       tags = hdrptr;
3343*fae548d3Szrj       start += compunit.cu_length + initial_length_size;
3344*fae548d3Szrj 
3345*fae548d3Szrj       if (compunit.cu_version < 2 || compunit.cu_version > 5)
3346*fae548d3Szrj 	{
3347*fae548d3Szrj 	  warn (_("CU at offset %s contains corrupt or "
3348*fae548d3Szrj 		  "unsupported version number: %d.\n"),
3349*fae548d3Szrj 		dwarf_vmatoa ("x", cu_offset), compunit.cu_version);
3350*fae548d3Szrj 	  continue;
3351*fae548d3Szrj 	}
3352*fae548d3Szrj 
3353*fae548d3Szrj       if (compunit.cu_unit_type != DW_UT_compile
3354*fae548d3Szrj 	  && compunit.cu_unit_type != DW_UT_type)
3355*fae548d3Szrj 	{
3356*fae548d3Szrj 	  warn (_("CU at offset %s contains corrupt or "
3357*fae548d3Szrj 		  "unsupported unit type: %d.\n"),
3358*fae548d3Szrj 		dwarf_vmatoa ("x", cu_offset), compunit.cu_unit_type);
3359*fae548d3Szrj 	  continue;
3360*fae548d3Szrj 	}
3361*fae548d3Szrj 
3362*fae548d3Szrj       free_abbrevs ();
3363*fae548d3Szrj 
3364*fae548d3Szrj       /* Process the abbrevs used by this compilation unit.  */
3365*fae548d3Szrj       if (compunit.cu_abbrev_offset >= abbrev_size)
3366*fae548d3Szrj 	warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"),
3367*fae548d3Szrj 	      (unsigned long) compunit.cu_abbrev_offset,
3368*fae548d3Szrj 	      (unsigned long) abbrev_size);
3369*fae548d3Szrj       /* PR 17531: file:4bcd9ce9.  */
3370*fae548d3Szrj       else if ((abbrev_base + abbrev_size)
3371*fae548d3Szrj 	       > debug_displays [abbrev_sec].section.size)
3372*fae548d3Szrj 	warn (_("Debug info is corrupted, abbrev size (%lx) is larger than abbrev section size (%lx)\n"),
3373*fae548d3Szrj 	      (unsigned long) abbrev_base + abbrev_size,
3374*fae548d3Szrj 	      (unsigned long) debug_displays [abbrev_sec].section.size);
3375*fae548d3Szrj       else
3376*fae548d3Szrj 	process_abbrev_section
3377*fae548d3Szrj 	  (((unsigned char *) debug_displays [abbrev_sec].section.start
3378*fae548d3Szrj 	    + abbrev_base + compunit.cu_abbrev_offset),
3379*fae548d3Szrj 	   ((unsigned char *) debug_displays [abbrev_sec].section.start
3380*fae548d3Szrj 	    + abbrev_base + abbrev_size));
3381*fae548d3Szrj 
3382*fae548d3Szrj       level = 0;
3383*fae548d3Szrj       last_level = level;
3384*fae548d3Szrj       saved_level = -1;
3385*fae548d3Szrj       while (tags < start)
3386*fae548d3Szrj 	{
3387*fae548d3Szrj 	  unsigned long abbrev_number;
3388*fae548d3Szrj 	  unsigned long die_offset;
3389*fae548d3Szrj 	  abbrev_entry *entry;
3390*fae548d3Szrj 	  abbrev_attr *attr;
3391*fae548d3Szrj 	  int do_printing = 1;
3392*fae548d3Szrj 
3393*fae548d3Szrj 	  die_offset = tags - section_begin;
3394*fae548d3Szrj 
3395*fae548d3Szrj 	  READ_ULEB (abbrev_number, tags, start);
3396*fae548d3Szrj 
3397*fae548d3Szrj 	  /* A null DIE marks the end of a list of siblings or it may also be
3398*fae548d3Szrj 	     a section padding.  */
3399*fae548d3Szrj 	  if (abbrev_number == 0)
3400*fae548d3Szrj 	    {
3401*fae548d3Szrj 	      /* Check if it can be a section padding for the last CU.  */
3402*fae548d3Szrj 	      if (level == 0 && start == end)
3403*fae548d3Szrj 		{
3404*fae548d3Szrj 		  unsigned char *chk;
3405*fae548d3Szrj 
3406*fae548d3Szrj 		  for (chk = tags; chk < start; chk++)
3407*fae548d3Szrj 		    if (*chk != 0)
3408*fae548d3Szrj 		      break;
3409*fae548d3Szrj 		  if (chk == start)
3410*fae548d3Szrj 		    break;
3411*fae548d3Szrj 		}
3412*fae548d3Szrj 
3413*fae548d3Szrj 	      if (!do_loc && die_offset >= dwarf_start_die
3414*fae548d3Szrj 		  && (dwarf_cutoff_level == -1
3415*fae548d3Szrj 		      || level < dwarf_cutoff_level))
3416*fae548d3Szrj 		printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
3417*fae548d3Szrj 			level, die_offset);
3418*fae548d3Szrj 
3419*fae548d3Szrj 	      --level;
3420*fae548d3Szrj 	      if (level < 0)
3421*fae548d3Szrj 		{
3422*fae548d3Szrj 		  static unsigned num_bogus_warns = 0;
3423*fae548d3Szrj 
3424*fae548d3Szrj 		  if (num_bogus_warns < 3)
3425*fae548d3Szrj 		    {
3426*fae548d3Szrj 		      warn (_("Bogus end-of-siblings marker detected at offset %lx in %s section\n"),
3427*fae548d3Szrj 			    die_offset, section->name);
3428*fae548d3Szrj 		      num_bogus_warns ++;
3429*fae548d3Szrj 		      if (num_bogus_warns == 3)
3430*fae548d3Szrj 			warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
3431*fae548d3Szrj 		    }
3432*fae548d3Szrj 		}
3433*fae548d3Szrj 	      if (dwarf_start_die != 0 && level < saved_level)
3434*fae548d3Szrj 		return TRUE;
3435*fae548d3Szrj 	      continue;
3436*fae548d3Szrj 	    }
3437*fae548d3Szrj 
3438*fae548d3Szrj 	  if (!do_loc)
3439*fae548d3Szrj 	    {
3440*fae548d3Szrj 	      if (dwarf_start_die != 0 && die_offset < dwarf_start_die)
3441*fae548d3Szrj 		do_printing = 0;
3442*fae548d3Szrj 	      else
3443*fae548d3Szrj 		{
3444*fae548d3Szrj 		  if (dwarf_start_die != 0 && die_offset == dwarf_start_die)
3445*fae548d3Szrj 		    saved_level = level;
3446*fae548d3Szrj 		  do_printing = (dwarf_cutoff_level == -1
3447*fae548d3Szrj 				 || level < dwarf_cutoff_level);
3448*fae548d3Szrj 		  if (do_printing)
3449*fae548d3Szrj 		    printf (_(" <%d><%lx>: Abbrev Number: %lu"),
3450*fae548d3Szrj 			    level, die_offset, abbrev_number);
3451*fae548d3Szrj 		  else if (dwarf_cutoff_level == -1
3452*fae548d3Szrj 			   || last_level < dwarf_cutoff_level)
3453*fae548d3Szrj 		    printf (_(" <%d><%lx>: ...\n"), level, die_offset);
3454*fae548d3Szrj 		  last_level = level;
3455*fae548d3Szrj 		}
3456*fae548d3Szrj 	    }
3457*fae548d3Szrj 
3458*fae548d3Szrj 	  /* Scan through the abbreviation list until we reach the
3459*fae548d3Szrj 	     correct entry.  */
3460*fae548d3Szrj 	  for (entry = first_abbrev;
3461*fae548d3Szrj 	       entry && entry->entry != abbrev_number;
3462*fae548d3Szrj 	       entry = entry->next)
3463*fae548d3Szrj 	    continue;
3464*fae548d3Szrj 
3465*fae548d3Szrj 	  if (entry == NULL)
3466*fae548d3Szrj 	    {
3467*fae548d3Szrj 	      if (!do_loc && do_printing)
3468*fae548d3Szrj 		{
3469*fae548d3Szrj 		  printf ("\n");
3470*fae548d3Szrj 		  fflush (stdout);
3471*fae548d3Szrj 		}
3472*fae548d3Szrj 	      warn (_("DIE at offset 0x%lx refers to abbreviation number %lu which does not exist\n"),
3473*fae548d3Szrj 		    die_offset, abbrev_number);
3474*fae548d3Szrj 	      return FALSE;
3475*fae548d3Szrj 	    }
3476*fae548d3Szrj 
3477*fae548d3Szrj 	  if (!do_loc && do_printing)
3478*fae548d3Szrj 	    printf (" (%s)\n", get_TAG_name (entry->tag));
3479*fae548d3Szrj 
3480*fae548d3Szrj 	  switch (entry->tag)
3481*fae548d3Szrj 	    {
3482*fae548d3Szrj 	    default:
3483*fae548d3Szrj 	      need_base_address = 0;
3484*fae548d3Szrj 	      break;
3485*fae548d3Szrj 	    case DW_TAG_compile_unit:
3486*fae548d3Szrj 	      need_base_address = 1;
3487*fae548d3Szrj 	      need_dwo_info = do_loc;
3488*fae548d3Szrj 	      break;
3489*fae548d3Szrj 	    case DW_TAG_entry_point:
3490*fae548d3Szrj 	    case DW_TAG_subprogram:
3491*fae548d3Szrj 	      need_base_address = 0;
3492*fae548d3Szrj 	      /* Assuming that there is no DW_AT_frame_base.  */
3493*fae548d3Szrj 	      have_frame_base = 0;
3494*fae548d3Szrj 	      break;
3495*fae548d3Szrj 	    }
3496*fae548d3Szrj 
3497*fae548d3Szrj 	  debug_info *debug_info_p =
3498*fae548d3Szrj 	    (debug_information && unit < alloc_num_debug_info_entries)
3499*fae548d3Szrj 	    ? debug_information + unit : NULL;
3500*fae548d3Szrj 
3501*fae548d3Szrj 	  assert (!debug_info_p
3502*fae548d3Szrj 		  || (debug_info_p->num_loc_offsets
3503*fae548d3Szrj 		      == debug_info_p->num_loc_views));
3504*fae548d3Szrj 
3505*fae548d3Szrj 	  for (attr = entry->first_attr;
3506*fae548d3Szrj 	       attr && attr->attribute;
3507*fae548d3Szrj 	       attr = attr->next)
3508*fae548d3Szrj 	    {
3509*fae548d3Szrj 	      if (! do_loc && do_printing)
3510*fae548d3Szrj 		/* Show the offset from where the tag was extracted.  */
3511*fae548d3Szrj 		printf ("    <%lx>", (unsigned long)(tags - section_begin));
3512*fae548d3Szrj 	      tags = read_and_display_attr (attr->attribute,
3513*fae548d3Szrj 					    attr->form,
3514*fae548d3Szrj 					    attr->implicit_const,
3515*fae548d3Szrj 					    section_begin,
3516*fae548d3Szrj 					    tags,
3517*fae548d3Szrj 					    end,
3518*fae548d3Szrj 					    cu_offset,
3519*fae548d3Szrj 					    compunit.cu_pointer_size,
3520*fae548d3Szrj 					    offset_size,
3521*fae548d3Szrj 					    compunit.cu_version,
3522*fae548d3Szrj 					    debug_info_p,
3523*fae548d3Szrj 					    do_loc || ! do_printing,
3524*fae548d3Szrj 					    section,
3525*fae548d3Szrj 					    this_set,
3526*fae548d3Szrj 					    level);
3527*fae548d3Szrj 	    }
3528*fae548d3Szrj 
3529*fae548d3Szrj 	  /* If a locview attribute appears before a location one,
3530*fae548d3Szrj 	     make sure we don't associate it with an earlier
3531*fae548d3Szrj 	     loclist. */
3532*fae548d3Szrj 	  if (debug_info_p)
3533*fae548d3Szrj 	    switch (debug_info_p->num_loc_offsets - debug_info_p->num_loc_views)
3534*fae548d3Szrj 	      {
3535*fae548d3Szrj 	      case 1:
3536*fae548d3Szrj 		debug_info_p->loc_views [debug_info_p->num_loc_views] = vm1;
3537*fae548d3Szrj 		debug_info_p->num_loc_views++;
3538*fae548d3Szrj 		assert (debug_info_p->num_loc_views
3539*fae548d3Szrj 			== debug_info_p->num_loc_offsets);
3540*fae548d3Szrj 		break;
3541*fae548d3Szrj 
3542*fae548d3Szrj 	      case 0:
3543*fae548d3Szrj 		break;
3544*fae548d3Szrj 
3545*fae548d3Szrj 	      case -1:
3546*fae548d3Szrj 		warn(_("DIE has locviews without loclist\n"));
3547*fae548d3Szrj 		debug_info_p->num_loc_views--;
3548*fae548d3Szrj 		break;
3549*fae548d3Szrj 
3550*fae548d3Szrj 	      default:
3551*fae548d3Szrj 		assert (0);
3552*fae548d3Szrj 	    }
3553*fae548d3Szrj 
3554*fae548d3Szrj 	  if (entry->children)
3555*fae548d3Szrj 	    ++level;
3556*fae548d3Szrj 	}
3557*fae548d3Szrj     }
3558*fae548d3Szrj 
3559*fae548d3Szrj   /* Set num_debug_info_entries here so that it can be used to check if
3560*fae548d3Szrj      we need to process .debug_loc and .debug_ranges sections.  */
3561*fae548d3Szrj   if ((do_loc || do_debug_loc || do_debug_ranges)
3562*fae548d3Szrj       && num_debug_info_entries == 0
3563*fae548d3Szrj       && ! do_types)
3564*fae548d3Szrj     {
3565*fae548d3Szrj       if (num_units > alloc_num_debug_info_entries)
3566*fae548d3Szrj 	num_debug_info_entries = alloc_num_debug_info_entries;
3567*fae548d3Szrj       else
3568*fae548d3Szrj 	num_debug_info_entries = num_units;
3569*fae548d3Szrj     }
3570*fae548d3Szrj 
3571*fae548d3Szrj   if (!do_loc)
3572*fae548d3Szrj     printf ("\n");
3573*fae548d3Szrj 
3574*fae548d3Szrj   return TRUE;
3575*fae548d3Szrj }
3576*fae548d3Szrj 
3577*fae548d3Szrj /* Locate and scan the .debug_info section in the file and record the pointer
3578*fae548d3Szrj    sizes and offsets for the compilation units in it.  Usually an executable
3579*fae548d3Szrj    will have just one pointer size, but this is not guaranteed, and so we try
3580*fae548d3Szrj    not to make any assumptions.  Returns zero upon failure, or the number of
3581*fae548d3Szrj    compilation units upon success.  */
3582*fae548d3Szrj 
3583*fae548d3Szrj static unsigned int
load_debug_info(void * file)3584*fae548d3Szrj load_debug_info (void * file)
3585*fae548d3Szrj {
3586*fae548d3Szrj   /* If we have already tried and failed to load the .debug_info
3587*fae548d3Szrj      section then do not bother to repeat the task.  */
3588*fae548d3Szrj   if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
3589*fae548d3Szrj     return 0;
3590*fae548d3Szrj 
3591*fae548d3Szrj   /* If we already have the information there is nothing else to do.  */
3592*fae548d3Szrj   if (num_debug_info_entries > 0)
3593*fae548d3Szrj     return num_debug_info_entries;
3594*fae548d3Szrj 
3595*fae548d3Szrj   /* If this is a DWARF package file, load the CU and TU indexes.  */
3596*fae548d3Szrj   (void) load_cu_tu_indexes (file);
3597*fae548d3Szrj 
3598*fae548d3Szrj   if (load_debug_section_with_follow (info, file)
3599*fae548d3Szrj       && process_debug_info (&debug_displays [info].section, file, abbrev, TRUE, FALSE))
3600*fae548d3Szrj     return num_debug_info_entries;
3601*fae548d3Szrj 
3602*fae548d3Szrj   if (load_debug_section_with_follow (info_dwo, file)
3603*fae548d3Szrj       && process_debug_info (&debug_displays [info_dwo].section, file,
3604*fae548d3Szrj 			     abbrev_dwo, TRUE, FALSE))
3605*fae548d3Szrj     return num_debug_info_entries;
3606*fae548d3Szrj 
3607*fae548d3Szrj   num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
3608*fae548d3Szrj   return 0;
3609*fae548d3Szrj }
3610*fae548d3Szrj 
3611*fae548d3Szrj /* Read a DWARF .debug_line section header starting at DATA.
3612*fae548d3Szrj    Upon success returns an updated DATA pointer and the LINFO
3613*fae548d3Szrj    structure and the END_OF_SEQUENCE pointer will be filled in.
3614*fae548d3Szrj    Otherwise returns NULL.  */
3615*fae548d3Szrj 
3616*fae548d3Szrj 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)3617*fae548d3Szrj read_debug_line_header (struct dwarf_section * section,
3618*fae548d3Szrj 			unsigned char * data,
3619*fae548d3Szrj 			unsigned char * end,
3620*fae548d3Szrj 			DWARF2_Internal_LineInfo * linfo,
3621*fae548d3Szrj 			unsigned char ** end_of_sequence)
3622*fae548d3Szrj {
3623*fae548d3Szrj   unsigned char *hdrptr;
3624*fae548d3Szrj   unsigned int initial_length_size;
3625*fae548d3Szrj   unsigned char address_size, segment_selector_size;
3626*fae548d3Szrj 
3627*fae548d3Szrj   /* Extract information from the Line Number Program Header.
3628*fae548d3Szrj      (section 6.2.4 in the Dwarf3 doc).  */
3629*fae548d3Szrj   hdrptr = data;
3630*fae548d3Szrj 
3631*fae548d3Szrj   /* Get and check the length of the block.  */
3632*fae548d3Szrj   SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 4, end);
3633*fae548d3Szrj 
3634*fae548d3Szrj   if (linfo->li_length == 0xffffffff)
3635*fae548d3Szrj     {
3636*fae548d3Szrj       /* This section is 64-bit DWARF 3.  */
3637*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (linfo->li_length, hdrptr, 8, end);
3638*fae548d3Szrj       linfo->li_offset_size = 8;
3639*fae548d3Szrj       initial_length_size = 12;
3640*fae548d3Szrj     }
3641*fae548d3Szrj   else
3642*fae548d3Szrj     {
3643*fae548d3Szrj       linfo->li_offset_size = 4;
3644*fae548d3Szrj       initial_length_size = 4;
3645*fae548d3Szrj     }
3646*fae548d3Szrj 
3647*fae548d3Szrj   if (linfo->li_length + initial_length_size > section->size)
3648*fae548d3Szrj     {
3649*fae548d3Szrj       /* If the length field has a relocation against it, then we should
3650*fae548d3Szrj 	 not complain if it is inaccurate (and probably negative).  This
3651*fae548d3Szrj 	 happens in object files when the .debug_line section is actually
3652*fae548d3Szrj 	 comprised of several different .debug_line.* sections, (some of
3653*fae548d3Szrj 	 which may be removed by linker garbage collection), and a relocation
3654*fae548d3Szrj 	 is used to compute the correct length once that is done.  */
3655*fae548d3Szrj       if (reloc_at (section, (hdrptr - section->start) - linfo->li_offset_size))
3656*fae548d3Szrj 	{
3657*fae548d3Szrj 	  linfo->li_length = (end - data) - initial_length_size;
3658*fae548d3Szrj 	}
3659*fae548d3Szrj       else
3660*fae548d3Szrj 	{
3661*fae548d3Szrj 	  warn (_("The length field (0x%lx) in the debug_line header is wrong - the section is too small\n"),
3662*fae548d3Szrj 		(long) linfo->li_length);
3663*fae548d3Szrj 	  return NULL;
3664*fae548d3Szrj 	}
3665*fae548d3Szrj     }
3666*fae548d3Szrj 
3667*fae548d3Szrj   /* Get and check the version number.  */
3668*fae548d3Szrj   SAFE_BYTE_GET_AND_INC (linfo->li_version, hdrptr, 2, end);
3669*fae548d3Szrj 
3670*fae548d3Szrj   if (linfo->li_version != 2
3671*fae548d3Szrj       && linfo->li_version != 3
3672*fae548d3Szrj       && linfo->li_version != 4
3673*fae548d3Szrj       && linfo->li_version != 5)
3674*fae548d3Szrj     {
3675*fae548d3Szrj       warn (_("Only DWARF version 2, 3, 4 and 5 line info "
3676*fae548d3Szrj 	      "is currently supported.\n"));
3677*fae548d3Szrj       return NULL;
3678*fae548d3Szrj     }
3679*fae548d3Szrj 
3680*fae548d3Szrj   if (linfo->li_version >= 5)
3681*fae548d3Szrj     {
3682*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (address_size, hdrptr, 1, end);
3683*fae548d3Szrj 
3684*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (segment_selector_size, hdrptr, 1, end);
3685*fae548d3Szrj       if (segment_selector_size != 0)
3686*fae548d3Szrj 	{
3687*fae548d3Szrj 	  warn (_("The %s section contains "
3688*fae548d3Szrj 		  "unsupported segment selector size: %d.\n"),
3689*fae548d3Szrj 		section->name, segment_selector_size);
3690*fae548d3Szrj 	  return 0;
3691*fae548d3Szrj 	}
3692*fae548d3Szrj     }
3693*fae548d3Szrj 
3694*fae548d3Szrj   SAFE_BYTE_GET_AND_INC (linfo->li_prologue_length, hdrptr,
3695*fae548d3Szrj 			 linfo->li_offset_size, end);
3696*fae548d3Szrj   SAFE_BYTE_GET_AND_INC (linfo->li_min_insn_length, hdrptr, 1, end);
3697*fae548d3Szrj 
3698*fae548d3Szrj   if (linfo->li_version >= 4)
3699*fae548d3Szrj     {
3700*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (linfo->li_max_ops_per_insn, hdrptr, 1, end);
3701*fae548d3Szrj 
3702*fae548d3Szrj       if (linfo->li_max_ops_per_insn == 0)
3703*fae548d3Szrj 	{
3704*fae548d3Szrj 	  warn (_("Invalid maximum operations per insn.\n"));
3705*fae548d3Szrj 	  return NULL;
3706*fae548d3Szrj 	}
3707*fae548d3Szrj     }
3708*fae548d3Szrj   else
3709*fae548d3Szrj     linfo->li_max_ops_per_insn = 1;
3710*fae548d3Szrj 
3711*fae548d3Szrj   SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end);
3712*fae548d3Szrj   SAFE_SIGNED_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
3713*fae548d3Szrj   SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end);
3714*fae548d3Szrj   SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end);
3715*fae548d3Szrj 
3716*fae548d3Szrj   * end_of_sequence = data + linfo->li_length + initial_length_size;
3717*fae548d3Szrj   /* PR 17512: file:002-117414-0.004.  */
3718*fae548d3Szrj   if (* end_of_sequence > end)
3719*fae548d3Szrj     {
3720*fae548d3Szrj       warn (_("Line length %s extends beyond end of section\n"),
3721*fae548d3Szrj 	    dwarf_vmatoa ("u", linfo->li_length));
3722*fae548d3Szrj       * end_of_sequence = end;
3723*fae548d3Szrj       return NULL;
3724*fae548d3Szrj     }
3725*fae548d3Szrj 
3726*fae548d3Szrj   return hdrptr;
3727*fae548d3Szrj }
3728*fae548d3Szrj 
3729*fae548d3Szrj static unsigned char *
display_formatted_table(unsigned char * data,unsigned char * start,unsigned char * end,const DWARF2_Internal_LineInfo * linfo,struct dwarf_section * section,bfd_boolean is_dir)3730*fae548d3Szrj display_formatted_table (unsigned char *                   data,
3731*fae548d3Szrj 			 unsigned char *                   start,
3732*fae548d3Szrj 			 unsigned char *                   end,
3733*fae548d3Szrj 			 const DWARF2_Internal_LineInfo *  linfo,
3734*fae548d3Szrj 			 struct dwarf_section *            section,
3735*fae548d3Szrj 			 bfd_boolean                       is_dir)
3736*fae548d3Szrj {
3737*fae548d3Szrj   unsigned char *format_start, format_count, *format, formati;
3738*fae548d3Szrj   dwarf_vma data_count, datai;
3739*fae548d3Szrj   unsigned int namepass, last_entry = 0;
3740*fae548d3Szrj 
3741*fae548d3Szrj   SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
3742*fae548d3Szrj   format_start = data;
3743*fae548d3Szrj   for (formati = 0; formati < format_count; formati++)
3744*fae548d3Szrj     {
3745*fae548d3Szrj       SKIP_ULEB (data, end);
3746*fae548d3Szrj       SKIP_ULEB (data, end);
3747*fae548d3Szrj       if (data == end)
3748*fae548d3Szrj 	{
3749*fae548d3Szrj 	  if (is_dir)
3750*fae548d3Szrj 	    warn (_("Corrupt directory format table entry\n"));
3751*fae548d3Szrj 	  else
3752*fae548d3Szrj 	    warn (_("Corrupt file name format table entry\n"));
3753*fae548d3Szrj 	  return data;
3754*fae548d3Szrj 	}
3755*fae548d3Szrj     }
3756*fae548d3Szrj 
3757*fae548d3Szrj   READ_ULEB (data_count, data, end);
3758*fae548d3Szrj   if (data == end)
3759*fae548d3Szrj     {
3760*fae548d3Szrj       if (is_dir)
3761*fae548d3Szrj 	warn (_("Corrupt directory list\n"));
3762*fae548d3Szrj       else
3763*fae548d3Szrj 	warn (_("Corrupt file name list\n"));
3764*fae548d3Szrj       return data;
3765*fae548d3Szrj     }
3766*fae548d3Szrj 
3767*fae548d3Szrj   if (data_count == 0)
3768*fae548d3Szrj     {
3769*fae548d3Szrj       if (is_dir)
3770*fae548d3Szrj 	printf (_("\n The Directory Table is empty.\n"));
3771*fae548d3Szrj       else
3772*fae548d3Szrj 	printf (_("\n The File Name Table is empty.\n"));
3773*fae548d3Szrj       return data;
3774*fae548d3Szrj     }
3775*fae548d3Szrj 
3776*fae548d3Szrj   if (is_dir)
3777*fae548d3Szrj     printf (_("\n The Directory Table (offset 0x%lx):\n"),
3778*fae548d3Szrj 	    (long) (data - start));
3779*fae548d3Szrj   else
3780*fae548d3Szrj     printf (_("\n The File Name Table (offset 0x%lx):\n"),
3781*fae548d3Szrj 	    (long) (data - start));
3782*fae548d3Szrj 
3783*fae548d3Szrj   printf (_("  Entry"));
3784*fae548d3Szrj   /* Delay displaying name as the last entry for better screen layout.  */
3785*fae548d3Szrj   for (namepass = 0; namepass < 2; namepass++)
3786*fae548d3Szrj     {
3787*fae548d3Szrj       format = format_start;
3788*fae548d3Szrj       for (formati = 0; formati < format_count; formati++)
3789*fae548d3Szrj 	{
3790*fae548d3Szrj 	  dwarf_vma content_type;
3791*fae548d3Szrj 
3792*fae548d3Szrj 	  READ_ULEB (content_type, format, end);
3793*fae548d3Szrj 	  if ((content_type == DW_LNCT_path) == (namepass == 1))
3794*fae548d3Szrj 	    switch (content_type)
3795*fae548d3Szrj 	      {
3796*fae548d3Szrj 	      case DW_LNCT_path:
3797*fae548d3Szrj 		printf (_("\tName"));
3798*fae548d3Szrj 		break;
3799*fae548d3Szrj 	      case DW_LNCT_directory_index:
3800*fae548d3Szrj 		printf (_("\tDir"));
3801*fae548d3Szrj 		break;
3802*fae548d3Szrj 	      case DW_LNCT_timestamp:
3803*fae548d3Szrj 		printf (_("\tTime"));
3804*fae548d3Szrj 		break;
3805*fae548d3Szrj 	      case DW_LNCT_size:
3806*fae548d3Szrj 		printf (_("\tSize"));
3807*fae548d3Szrj 		break;
3808*fae548d3Szrj 	      case DW_LNCT_MD5:
3809*fae548d3Szrj 		printf (_("\tMD5"));
3810*fae548d3Szrj 		break;
3811*fae548d3Szrj 	      default:
3812*fae548d3Szrj 		printf (_("\t(Unknown format content type %s)"),
3813*fae548d3Szrj 			dwarf_vmatoa ("u", content_type));
3814*fae548d3Szrj 	      }
3815*fae548d3Szrj 	  SKIP_ULEB (format, end);
3816*fae548d3Szrj 	}
3817*fae548d3Szrj     }
3818*fae548d3Szrj   putchar ('\n');
3819*fae548d3Szrj 
3820*fae548d3Szrj   for (datai = 0; datai < data_count; datai++)
3821*fae548d3Szrj     {
3822*fae548d3Szrj       unsigned char *datapass = data;
3823*fae548d3Szrj 
3824*fae548d3Szrj       printf ("  %d", last_entry++);
3825*fae548d3Szrj       /* Delay displaying name as the last entry for better screen layout.  */
3826*fae548d3Szrj       for (namepass = 0; namepass < 2; namepass++)
3827*fae548d3Szrj 	{
3828*fae548d3Szrj 	  format = format_start;
3829*fae548d3Szrj 	  data = datapass;
3830*fae548d3Szrj 	  for (formati = 0; formati < format_count; formati++)
3831*fae548d3Szrj 	    {
3832*fae548d3Szrj 	      dwarf_vma content_type, form;
3833*fae548d3Szrj 
3834*fae548d3Szrj 	      READ_ULEB (content_type, format, end);
3835*fae548d3Szrj 	      READ_ULEB (form, format, end);
3836*fae548d3Szrj 	      data = read_and_display_attr_value (0, form, 0, start, data, end,
3837*fae548d3Szrj 						  0, 0, linfo->li_offset_size,
3838*fae548d3Szrj 						  linfo->li_version, NULL,
3839*fae548d3Szrj 			    ((content_type == DW_LNCT_path) != (namepass == 1)),
3840*fae548d3Szrj 						  section, NULL, '\t', -1);
3841*fae548d3Szrj 	    }
3842*fae548d3Szrj 	}
3843*fae548d3Szrj       if (data == end)
3844*fae548d3Szrj 	{
3845*fae548d3Szrj 	  if (is_dir)
3846*fae548d3Szrj 	    warn (_("Corrupt directory entries list\n"));
3847*fae548d3Szrj 	  else
3848*fae548d3Szrj 	    warn (_("Corrupt file name entries list\n"));
3849*fae548d3Szrj 	  return data;
3850*fae548d3Szrj 	}
3851*fae548d3Szrj       putchar ('\n');
3852*fae548d3Szrj     }
3853*fae548d3Szrj   return data;
3854*fae548d3Szrj }
3855*fae548d3Szrj 
3856*fae548d3Szrj static int
display_debug_lines_raw(struct dwarf_section * section,unsigned char * data,unsigned char * end,void * file)3857*fae548d3Szrj display_debug_lines_raw (struct dwarf_section *  section,
3858*fae548d3Szrj 			 unsigned char *         data,
3859*fae548d3Szrj 			 unsigned char *         end,
3860*fae548d3Szrj 			 void *                  file)
3861*fae548d3Szrj {
3862*fae548d3Szrj   unsigned char *start = section->start;
3863*fae548d3Szrj   int verbose_view = 0;
3864*fae548d3Szrj 
3865*fae548d3Szrj   introduce (section, TRUE);
3866*fae548d3Szrj 
3867*fae548d3Szrj   while (data < end)
3868*fae548d3Szrj     {
3869*fae548d3Szrj       static DWARF2_Internal_LineInfo saved_linfo;
3870*fae548d3Szrj       DWARF2_Internal_LineInfo linfo;
3871*fae548d3Szrj       unsigned char *standard_opcodes;
3872*fae548d3Szrj       unsigned char *end_of_sequence;
3873*fae548d3Szrj       int i;
3874*fae548d3Szrj 
3875*fae548d3Szrj       if (const_strneq (section->name, ".debug_line.")
3876*fae548d3Szrj 	  /* Note: the following does not apply to .debug_line.dwo sections.
3877*fae548d3Szrj 	     These are full debug_line sections.  */
3878*fae548d3Szrj 	  && strcmp (section->name, ".debug_line.dwo") != 0)
3879*fae548d3Szrj 	{
3880*fae548d3Szrj 	  /* Sections named .debug_line.<foo> are fragments of a .debug_line
3881*fae548d3Szrj 	     section containing just the Line Number Statements.  They are
3882*fae548d3Szrj 	     created by the assembler and intended to be used alongside gcc's
3883*fae548d3Szrj 	     -ffunction-sections command line option.  When the linker's
3884*fae548d3Szrj 	     garbage collection decides to discard a .text.<foo> section it
3885*fae548d3Szrj 	     can then also discard the line number information in .debug_line.<foo>.
3886*fae548d3Szrj 
3887*fae548d3Szrj 	     Since the section is a fragment it does not have the details
3888*fae548d3Szrj 	     needed to fill out a LineInfo structure, so instead we use the
3889*fae548d3Szrj 	     details from the last full debug_line section that we processed.  */
3890*fae548d3Szrj 	  end_of_sequence = end;
3891*fae548d3Szrj 	  standard_opcodes = NULL;
3892*fae548d3Szrj 	  linfo = saved_linfo;
3893*fae548d3Szrj 	  /* PR 17531: file: 0522b371.  */
3894*fae548d3Szrj 	  if (linfo.li_line_range == 0)
3895*fae548d3Szrj 	    {
3896*fae548d3Szrj 	      warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
3897*fae548d3Szrj 	      return 0;
3898*fae548d3Szrj 	    }
3899*fae548d3Szrj 	  reset_state_machine (linfo.li_default_is_stmt);
3900*fae548d3Szrj 	}
3901*fae548d3Szrj       else
3902*fae548d3Szrj 	{
3903*fae548d3Szrj 	  unsigned char * hdrptr;
3904*fae548d3Szrj 
3905*fae548d3Szrj 	  if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
3906*fae548d3Szrj 						& end_of_sequence)) == NULL)
3907*fae548d3Szrj 	    return 0;
3908*fae548d3Szrj 
3909*fae548d3Szrj 	  printf (_("  Offset:                      0x%lx\n"), (long)(data - start));
3910*fae548d3Szrj 	  printf (_("  Length:                      %ld\n"), (long) linfo.li_length);
3911*fae548d3Szrj 	  printf (_("  DWARF Version:               %d\n"), linfo.li_version);
3912*fae548d3Szrj 	  printf (_("  Prologue Length:             %d\n"), (int) linfo.li_prologue_length);
3913*fae548d3Szrj 	  printf (_("  Minimum Instruction Length:  %d\n"), linfo.li_min_insn_length);
3914*fae548d3Szrj 	  if (linfo.li_version >= 4)
3915*fae548d3Szrj 	    printf (_("  Maximum Ops per Instruction: %d\n"), linfo.li_max_ops_per_insn);
3916*fae548d3Szrj 	  printf (_("  Initial value of 'is_stmt':  %d\n"), linfo.li_default_is_stmt);
3917*fae548d3Szrj 	  printf (_("  Line Base:                   %d\n"), linfo.li_line_base);
3918*fae548d3Szrj 	  printf (_("  Line Range:                  %d\n"), linfo.li_line_range);
3919*fae548d3Szrj 	  printf (_("  Opcode Base:                 %d\n"), linfo.li_opcode_base);
3920*fae548d3Szrj 
3921*fae548d3Szrj 	  /* PR 17512: file: 1665-6428-0.004.  */
3922*fae548d3Szrj 	  if (linfo.li_line_range == 0)
3923*fae548d3Szrj 	    {
3924*fae548d3Szrj 	      warn (_("Line range of 0 is invalid, using 1 instead\n"));
3925*fae548d3Szrj 	      linfo.li_line_range = 1;
3926*fae548d3Szrj 	    }
3927*fae548d3Szrj 
3928*fae548d3Szrj 	  reset_state_machine (linfo.li_default_is_stmt);
3929*fae548d3Szrj 
3930*fae548d3Szrj 	  /* Display the contents of the Opcodes table.  */
3931*fae548d3Szrj 	  standard_opcodes = hdrptr;
3932*fae548d3Szrj 
3933*fae548d3Szrj 	  /* PR 17512: file: 002-417945-0.004.  */
3934*fae548d3Szrj 	  if (standard_opcodes + linfo.li_opcode_base >= end)
3935*fae548d3Szrj 	    {
3936*fae548d3Szrj 	      warn (_("Line Base extends beyond end of section\n"));
3937*fae548d3Szrj 	      return 0;
3938*fae548d3Szrj 	    }
3939*fae548d3Szrj 
3940*fae548d3Szrj 	  printf (_("\n Opcodes:\n"));
3941*fae548d3Szrj 
3942*fae548d3Szrj 	  for (i = 1; i < linfo.li_opcode_base; i++)
3943*fae548d3Szrj 	    printf (ngettext ("  Opcode %d has %d arg\n",
3944*fae548d3Szrj 			      "  Opcode %d has %d args\n",
3945*fae548d3Szrj 			      standard_opcodes[i - 1]),
3946*fae548d3Szrj 		    i, standard_opcodes[i - 1]);
3947*fae548d3Szrj 
3948*fae548d3Szrj 	  /* Display the contents of the Directory table.  */
3949*fae548d3Szrj 	  data = standard_opcodes + linfo.li_opcode_base - 1;
3950*fae548d3Szrj 
3951*fae548d3Szrj 	  if (linfo.li_version >= 5)
3952*fae548d3Szrj 	    {
3953*fae548d3Szrj 	      load_debug_section_with_follow (line_str, file);
3954*fae548d3Szrj 
3955*fae548d3Szrj 	      data = display_formatted_table (data, start, end, &linfo, section,
3956*fae548d3Szrj 					      TRUE);
3957*fae548d3Szrj 	      data = display_formatted_table (data, start, end, &linfo, section,
3958*fae548d3Szrj 					      FALSE);
3959*fae548d3Szrj 	    }
3960*fae548d3Szrj 	  else
3961*fae548d3Szrj 	    {
3962*fae548d3Szrj 	      if (*data == 0)
3963*fae548d3Szrj 		printf (_("\n The Directory Table is empty.\n"));
3964*fae548d3Szrj 	      else
3965*fae548d3Szrj 		{
3966*fae548d3Szrj 		  unsigned int last_dir_entry = 0;
3967*fae548d3Szrj 
3968*fae548d3Szrj 		  printf (_("\n The Directory Table (offset 0x%lx):\n"),
3969*fae548d3Szrj 			  (long)(data - start));
3970*fae548d3Szrj 
3971*fae548d3Szrj 		  while (data < end && *data != 0)
3972*fae548d3Szrj 		    {
3973*fae548d3Szrj 		      printf ("  %d\t%.*s\n", ++last_dir_entry, (int) (end - data), data);
3974*fae548d3Szrj 
3975*fae548d3Szrj 		      data += strnlen ((char *) data, end - data) + 1;
3976*fae548d3Szrj 		    }
3977*fae548d3Szrj 
3978*fae548d3Szrj 		  /* PR 17512: file: 002-132094-0.004.  */
3979*fae548d3Szrj 		  if (data >= end - 1)
3980*fae548d3Szrj 		    break;
3981*fae548d3Szrj 		}
3982*fae548d3Szrj 
3983*fae548d3Szrj 	      /* Skip the NUL at the end of the table.  */
3984*fae548d3Szrj 	      data++;
3985*fae548d3Szrj 
3986*fae548d3Szrj 	      /* Display the contents of the File Name table.  */
3987*fae548d3Szrj 	      if (*data == 0)
3988*fae548d3Szrj 		printf (_("\n The File Name Table is empty.\n"));
3989*fae548d3Szrj 	      else
3990*fae548d3Szrj 		{
3991*fae548d3Szrj 		  printf (_("\n The File Name Table (offset 0x%lx):\n"),
3992*fae548d3Szrj 			  (long)(data - start));
3993*fae548d3Szrj 		  printf (_("  Entry\tDir\tTime\tSize\tName\n"));
3994*fae548d3Szrj 
3995*fae548d3Szrj 		  while (data < end && *data != 0)
3996*fae548d3Szrj 		    {
3997*fae548d3Szrj 		      unsigned char *name;
3998*fae548d3Szrj 		      dwarf_vma val;
3999*fae548d3Szrj 
4000*fae548d3Szrj 		      printf ("  %d\t", ++state_machine_regs.last_file_entry);
4001*fae548d3Szrj 		      name = data;
4002*fae548d3Szrj 		      data += strnlen ((char *) data, end - data) + 1;
4003*fae548d3Szrj 
4004*fae548d3Szrj 		      READ_ULEB (val, data, end);
4005*fae548d3Szrj 		      printf ("%s\t", dwarf_vmatoa ("u", val));
4006*fae548d3Szrj 		      READ_ULEB (val, data, end);
4007*fae548d3Szrj 		      printf ("%s\t", dwarf_vmatoa ("u", val));
4008*fae548d3Szrj 		      READ_ULEB (val, data, end);
4009*fae548d3Szrj 		      printf ("%s\t", dwarf_vmatoa ("u", val));
4010*fae548d3Szrj 		      printf ("%.*s\n", (int)(end - name), name);
4011*fae548d3Szrj 
4012*fae548d3Szrj 		      if (data == end)
4013*fae548d3Szrj 			{
4014*fae548d3Szrj 			  warn (_("Corrupt file name table entry\n"));
4015*fae548d3Szrj 			  break;
4016*fae548d3Szrj 			}
4017*fae548d3Szrj 		    }
4018*fae548d3Szrj 		}
4019*fae548d3Szrj 
4020*fae548d3Szrj 	      /* Skip the NUL at the end of the table.  */
4021*fae548d3Szrj 	      data++;
4022*fae548d3Szrj 	    }
4023*fae548d3Szrj 
4024*fae548d3Szrj 	  putchar ('\n');
4025*fae548d3Szrj 	  saved_linfo = linfo;
4026*fae548d3Szrj 	}
4027*fae548d3Szrj 
4028*fae548d3Szrj       /* Now display the statements.  */
4029*fae548d3Szrj       if (data >= end_of_sequence)
4030*fae548d3Szrj 	printf (_(" No Line Number Statements.\n"));
4031*fae548d3Szrj       else
4032*fae548d3Szrj 	{
4033*fae548d3Szrj 	  printf (_(" Line Number Statements:\n"));
4034*fae548d3Szrj 
4035*fae548d3Szrj 	  while (data < end_of_sequence)
4036*fae548d3Szrj 	    {
4037*fae548d3Szrj 	      unsigned char op_code;
4038*fae548d3Szrj 	      dwarf_signed_vma adv;
4039*fae548d3Szrj 	      dwarf_vma uladv;
4040*fae548d3Szrj 
4041*fae548d3Szrj 	      printf ("  [0x%08lx]", (long)(data - start));
4042*fae548d3Szrj 
4043*fae548d3Szrj 	      op_code = *data++;
4044*fae548d3Szrj 
4045*fae548d3Szrj 	      if (op_code >= linfo.li_opcode_base)
4046*fae548d3Szrj 		{
4047*fae548d3Szrj 		  op_code -= linfo.li_opcode_base;
4048*fae548d3Szrj 		  uladv = (op_code / linfo.li_line_range);
4049*fae548d3Szrj 		  if (linfo.li_max_ops_per_insn == 1)
4050*fae548d3Szrj 		    {
4051*fae548d3Szrj 		      uladv *= linfo.li_min_insn_length;
4052*fae548d3Szrj 		      state_machine_regs.address += uladv;
4053*fae548d3Szrj 		      if (uladv)
4054*fae548d3Szrj 			state_machine_regs.view = 0;
4055*fae548d3Szrj 		      printf (_("  Special opcode %d: "
4056*fae548d3Szrj 				"advance Address by %s to 0x%s%s"),
4057*fae548d3Szrj 			      op_code, dwarf_vmatoa ("u", uladv),
4058*fae548d3Szrj 			      dwarf_vmatoa ("x", state_machine_regs.address),
4059*fae548d3Szrj 			      verbose_view && uladv
4060*fae548d3Szrj 			      ? _(" (reset view)") : "");
4061*fae548d3Szrj 		    }
4062*fae548d3Szrj 		  else
4063*fae548d3Szrj 		    {
4064*fae548d3Szrj 		      unsigned addrdelta
4065*fae548d3Szrj 			= ((state_machine_regs.op_index + uladv)
4066*fae548d3Szrj 			    / linfo.li_max_ops_per_insn)
4067*fae548d3Szrj 			* linfo.li_min_insn_length;
4068*fae548d3Szrj 
4069*fae548d3Szrj 		      state_machine_regs.address += addrdelta;
4070*fae548d3Szrj 		      state_machine_regs.op_index
4071*fae548d3Szrj 			= (state_machine_regs.op_index + uladv)
4072*fae548d3Szrj 			% linfo.li_max_ops_per_insn;
4073*fae548d3Szrj 		      if (addrdelta)
4074*fae548d3Szrj 			state_machine_regs.view = 0;
4075*fae548d3Szrj 		      printf (_("  Special opcode %d: "
4076*fae548d3Szrj 				"advance Address by %s to 0x%s[%d]%s"),
4077*fae548d3Szrj 			      op_code, dwarf_vmatoa ("u", uladv),
4078*fae548d3Szrj 			      dwarf_vmatoa ("x", state_machine_regs.address),
4079*fae548d3Szrj 			      state_machine_regs.op_index,
4080*fae548d3Szrj 			      verbose_view && addrdelta
4081*fae548d3Szrj 			      ? _(" (reset view)") : "");
4082*fae548d3Szrj 		    }
4083*fae548d3Szrj 		  adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
4084*fae548d3Szrj 		  state_machine_regs.line += adv;
4085*fae548d3Szrj 		  printf (_(" and Line by %s to %d"),
4086*fae548d3Szrj 			  dwarf_vmatoa ("d", adv), state_machine_regs.line);
4087*fae548d3Szrj 		  if (verbose_view || state_machine_regs.view)
4088*fae548d3Szrj 		    printf (_(" (view %u)\n"), state_machine_regs.view);
4089*fae548d3Szrj 		  else
4090*fae548d3Szrj 		    putchar ('\n');
4091*fae548d3Szrj 		  state_machine_regs.view++;
4092*fae548d3Szrj 		}
4093*fae548d3Szrj 	      else
4094*fae548d3Szrj 		switch (op_code)
4095*fae548d3Szrj 		  {
4096*fae548d3Szrj 		  case DW_LNS_extended_op:
4097*fae548d3Szrj 		    data += process_extended_line_op (data,
4098*fae548d3Szrj 						      linfo.li_default_is_stmt,
4099*fae548d3Szrj 						      end);
4100*fae548d3Szrj 		    break;
4101*fae548d3Szrj 
4102*fae548d3Szrj 		  case DW_LNS_copy:
4103*fae548d3Szrj 		    printf (_("  Copy"));
4104*fae548d3Szrj 		    if (verbose_view || state_machine_regs.view)
4105*fae548d3Szrj 		      printf (_(" (view %u)\n"), state_machine_regs.view);
4106*fae548d3Szrj 		    else
4107*fae548d3Szrj 		      putchar ('\n');
4108*fae548d3Szrj 		    state_machine_regs.view++;
4109*fae548d3Szrj 		    break;
4110*fae548d3Szrj 
4111*fae548d3Szrj 		  case DW_LNS_advance_pc:
4112*fae548d3Szrj 		    READ_ULEB (uladv, data, end);
4113*fae548d3Szrj 		    if (linfo.li_max_ops_per_insn == 1)
4114*fae548d3Szrj 		      {
4115*fae548d3Szrj 			uladv *= linfo.li_min_insn_length;
4116*fae548d3Szrj 			state_machine_regs.address += uladv;
4117*fae548d3Szrj 			if (uladv)
4118*fae548d3Szrj 			  state_machine_regs.view = 0;
4119*fae548d3Szrj 			printf (_("  Advance PC by %s to 0x%s%s\n"),
4120*fae548d3Szrj 				dwarf_vmatoa ("u", uladv),
4121*fae548d3Szrj 				dwarf_vmatoa ("x", state_machine_regs.address),
4122*fae548d3Szrj 				verbose_view && uladv
4123*fae548d3Szrj 				? _(" (reset view)") : "");
4124*fae548d3Szrj 		      }
4125*fae548d3Szrj 		    else
4126*fae548d3Szrj 		      {
4127*fae548d3Szrj 			unsigned addrdelta
4128*fae548d3Szrj 			  = ((state_machine_regs.op_index + uladv)
4129*fae548d3Szrj 			     / linfo.li_max_ops_per_insn)
4130*fae548d3Szrj 			  * linfo.li_min_insn_length;
4131*fae548d3Szrj 			state_machine_regs.address
4132*fae548d3Szrj 			  += addrdelta;
4133*fae548d3Szrj 			state_machine_regs.op_index
4134*fae548d3Szrj 			  = (state_machine_regs.op_index + uladv)
4135*fae548d3Szrj 			  % linfo.li_max_ops_per_insn;
4136*fae548d3Szrj 			if (addrdelta)
4137*fae548d3Szrj 			  state_machine_regs.view = 0;
4138*fae548d3Szrj 			printf (_("  Advance PC by %s to 0x%s[%d]%s\n"),
4139*fae548d3Szrj 				dwarf_vmatoa ("u", uladv),
4140*fae548d3Szrj 				dwarf_vmatoa ("x", state_machine_regs.address),
4141*fae548d3Szrj 				state_machine_regs.op_index,
4142*fae548d3Szrj 				verbose_view && addrdelta
4143*fae548d3Szrj 				? _(" (reset view)") : "");
4144*fae548d3Szrj 		      }
4145*fae548d3Szrj 		    break;
4146*fae548d3Szrj 
4147*fae548d3Szrj 		  case DW_LNS_advance_line:
4148*fae548d3Szrj 		    READ_SLEB (adv, data, end);
4149*fae548d3Szrj 		    state_machine_regs.line += adv;
4150*fae548d3Szrj 		    printf (_("  Advance Line by %s to %d\n"),
4151*fae548d3Szrj 			    dwarf_vmatoa ("d", adv),
4152*fae548d3Szrj 			    state_machine_regs.line);
4153*fae548d3Szrj 		    break;
4154*fae548d3Szrj 
4155*fae548d3Szrj 		  case DW_LNS_set_file:
4156*fae548d3Szrj 		    READ_ULEB (uladv, data, end);
4157*fae548d3Szrj 		    printf (_("  Set File Name to entry %s in the File Name Table\n"),
4158*fae548d3Szrj 			    dwarf_vmatoa ("u", uladv));
4159*fae548d3Szrj 		    state_machine_regs.file = uladv;
4160*fae548d3Szrj 		    break;
4161*fae548d3Szrj 
4162*fae548d3Szrj 		  case DW_LNS_set_column:
4163*fae548d3Szrj 		    READ_ULEB (uladv, data, end);
4164*fae548d3Szrj 		    printf (_("  Set column to %s\n"),
4165*fae548d3Szrj 			    dwarf_vmatoa ("u", uladv));
4166*fae548d3Szrj 		    state_machine_regs.column = uladv;
4167*fae548d3Szrj 		    break;
4168*fae548d3Szrj 
4169*fae548d3Szrj 		  case DW_LNS_negate_stmt:
4170*fae548d3Szrj 		    adv = state_machine_regs.is_stmt;
4171*fae548d3Szrj 		    adv = ! adv;
4172*fae548d3Szrj 		    printf (_("  Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv));
4173*fae548d3Szrj 		    state_machine_regs.is_stmt = adv;
4174*fae548d3Szrj 		    break;
4175*fae548d3Szrj 
4176*fae548d3Szrj 		  case DW_LNS_set_basic_block:
4177*fae548d3Szrj 		    printf (_("  Set basic block\n"));
4178*fae548d3Szrj 		    state_machine_regs.basic_block = 1;
4179*fae548d3Szrj 		    break;
4180*fae548d3Szrj 
4181*fae548d3Szrj 		  case DW_LNS_const_add_pc:
4182*fae548d3Szrj 		    uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
4183*fae548d3Szrj 		    if (linfo.li_max_ops_per_insn)
4184*fae548d3Szrj 		      {
4185*fae548d3Szrj 			uladv *= linfo.li_min_insn_length;
4186*fae548d3Szrj 			state_machine_regs.address += uladv;
4187*fae548d3Szrj 			if (uladv)
4188*fae548d3Szrj 			  state_machine_regs.view = 0;
4189*fae548d3Szrj 			printf (_("  Advance PC by constant %s to 0x%s%s\n"),
4190*fae548d3Szrj 				dwarf_vmatoa ("u", uladv),
4191*fae548d3Szrj 				dwarf_vmatoa ("x", state_machine_regs.address),
4192*fae548d3Szrj 				verbose_view && uladv
4193*fae548d3Szrj 				? _(" (reset view)") : "");
4194*fae548d3Szrj 		      }
4195*fae548d3Szrj 		    else
4196*fae548d3Szrj 		      {
4197*fae548d3Szrj 			unsigned addrdelta
4198*fae548d3Szrj 			  = ((state_machine_regs.op_index + uladv)
4199*fae548d3Szrj 			     / linfo.li_max_ops_per_insn)
4200*fae548d3Szrj 			  * linfo.li_min_insn_length;
4201*fae548d3Szrj 			state_machine_regs.address
4202*fae548d3Szrj 			  += addrdelta;
4203*fae548d3Szrj 			state_machine_regs.op_index
4204*fae548d3Szrj 			  = (state_machine_regs.op_index + uladv)
4205*fae548d3Szrj 			  % linfo.li_max_ops_per_insn;
4206*fae548d3Szrj 			if (addrdelta)
4207*fae548d3Szrj 			  state_machine_regs.view = 0;
4208*fae548d3Szrj 			printf (_("  Advance PC by constant %s to 0x%s[%d]%s\n"),
4209*fae548d3Szrj 				dwarf_vmatoa ("u", uladv),
4210*fae548d3Szrj 				dwarf_vmatoa ("x", state_machine_regs.address),
4211*fae548d3Szrj 				state_machine_regs.op_index,
4212*fae548d3Szrj 				verbose_view && addrdelta
4213*fae548d3Szrj 				? _(" (reset view)") : "");
4214*fae548d3Szrj 		      }
4215*fae548d3Szrj 		    break;
4216*fae548d3Szrj 
4217*fae548d3Szrj 		  case DW_LNS_fixed_advance_pc:
4218*fae548d3Szrj 		    SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
4219*fae548d3Szrj 		    state_machine_regs.address += uladv;
4220*fae548d3Szrj 		    state_machine_regs.op_index = 0;
4221*fae548d3Szrj 		    printf (_("  Advance PC by fixed size amount %s to 0x%s\n"),
4222*fae548d3Szrj 			    dwarf_vmatoa ("u", uladv),
4223*fae548d3Szrj 			    dwarf_vmatoa ("x", state_machine_regs.address));
4224*fae548d3Szrj 		    /* Do NOT reset view.  */
4225*fae548d3Szrj 		    break;
4226*fae548d3Szrj 
4227*fae548d3Szrj 		  case DW_LNS_set_prologue_end:
4228*fae548d3Szrj 		    printf (_("  Set prologue_end to true\n"));
4229*fae548d3Szrj 		    break;
4230*fae548d3Szrj 
4231*fae548d3Szrj 		  case DW_LNS_set_epilogue_begin:
4232*fae548d3Szrj 		    printf (_("  Set epilogue_begin to true\n"));
4233*fae548d3Szrj 		    break;
4234*fae548d3Szrj 
4235*fae548d3Szrj 		  case DW_LNS_set_isa:
4236*fae548d3Szrj 		    READ_ULEB (uladv, data, end);
4237*fae548d3Szrj 		    printf (_("  Set ISA to %s\n"), dwarf_vmatoa ("u", uladv));
4238*fae548d3Szrj 		    break;
4239*fae548d3Szrj 
4240*fae548d3Szrj 		  default:
4241*fae548d3Szrj 		    printf (_("  Unknown opcode %d with operands: "), op_code);
4242*fae548d3Szrj 
4243*fae548d3Szrj 		    if (standard_opcodes != NULL)
4244*fae548d3Szrj 		      for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
4245*fae548d3Szrj 			{
4246*fae548d3Szrj 			  READ_ULEB (uladv, data, end);
4247*fae548d3Szrj 			  printf ("0x%s%s", dwarf_vmatoa ("x", uladv),
4248*fae548d3Szrj 				  i == 1 ? "" : ", ");
4249*fae548d3Szrj 			}
4250*fae548d3Szrj 		    putchar ('\n');
4251*fae548d3Szrj 		    break;
4252*fae548d3Szrj 		  }
4253*fae548d3Szrj 	    }
4254*fae548d3Szrj 	  putchar ('\n');
4255*fae548d3Szrj 	}
4256*fae548d3Szrj     }
4257*fae548d3Szrj 
4258*fae548d3Szrj   return 1;
4259*fae548d3Szrj }
4260*fae548d3Szrj 
4261*fae548d3Szrj typedef struct
4262*fae548d3Szrj {
4263*fae548d3Szrj   unsigned char *name;
4264*fae548d3Szrj   unsigned int directory_index;
4265*fae548d3Szrj   unsigned int modification_date;
4266*fae548d3Szrj   unsigned int length;
4267*fae548d3Szrj } File_Entry;
4268*fae548d3Szrj 
4269*fae548d3Szrj /* Output a decoded representation of the .debug_line section.  */
4270*fae548d3Szrj 
4271*fae548d3Szrj static int
display_debug_lines_decoded(struct dwarf_section * section,unsigned char * start,unsigned char * data,unsigned char * end,void * fileptr)4272*fae548d3Szrj display_debug_lines_decoded (struct dwarf_section *  section,
4273*fae548d3Szrj 			     unsigned char *         start,
4274*fae548d3Szrj 			     unsigned char *         data,
4275*fae548d3Szrj 			     unsigned char *         end,
4276*fae548d3Szrj 			     void *                  fileptr)
4277*fae548d3Szrj {
4278*fae548d3Szrj   static DWARF2_Internal_LineInfo saved_linfo;
4279*fae548d3Szrj 
4280*fae548d3Szrj   introduce (section, FALSE);
4281*fae548d3Szrj 
4282*fae548d3Szrj   while (data < end)
4283*fae548d3Szrj     {
4284*fae548d3Szrj       /* This loop amounts to one iteration per compilation unit.  */
4285*fae548d3Szrj       DWARF2_Internal_LineInfo linfo;
4286*fae548d3Szrj       unsigned char *standard_opcodes;
4287*fae548d3Szrj       unsigned char *end_of_sequence;
4288*fae548d3Szrj       int i;
4289*fae548d3Szrj       File_Entry *file_table = NULL;
4290*fae548d3Szrj       unsigned int n_files = 0;
4291*fae548d3Szrj       unsigned char **directory_table = NULL;
4292*fae548d3Szrj       dwarf_vma n_directories = 0;
4293*fae548d3Szrj 
4294*fae548d3Szrj       if (const_strneq (section->name, ".debug_line.")
4295*fae548d3Szrj 	  /* Note: the following does not apply to .debug_line.dwo sections.
4296*fae548d3Szrj 	     These are full debug_line sections.  */
4297*fae548d3Szrj 	  && strcmp (section->name, ".debug_line.dwo") != 0)
4298*fae548d3Szrj 	{
4299*fae548d3Szrj 	  /* See comment in display_debug_lines_raw().  */
4300*fae548d3Szrj 	  end_of_sequence = end;
4301*fae548d3Szrj 	  standard_opcodes = NULL;
4302*fae548d3Szrj 	  linfo = saved_linfo;
4303*fae548d3Szrj 	  /* PR 17531: file: 0522b371.  */
4304*fae548d3Szrj 	  if (linfo.li_line_range == 0)
4305*fae548d3Szrj 	    {
4306*fae548d3Szrj 	      warn (_("Partial .debug_line. section encountered without a prior full .debug_line section\n"));
4307*fae548d3Szrj 	      return 0;
4308*fae548d3Szrj 	    }
4309*fae548d3Szrj 	  reset_state_machine (linfo.li_default_is_stmt);
4310*fae548d3Szrj 	}
4311*fae548d3Szrj       else
4312*fae548d3Szrj 	{
4313*fae548d3Szrj 	  unsigned char *hdrptr;
4314*fae548d3Szrj 
4315*fae548d3Szrj 	  if ((hdrptr = read_debug_line_header (section, data, end, & linfo,
4316*fae548d3Szrj 						& end_of_sequence)) == NULL)
4317*fae548d3Szrj 	      return 0;
4318*fae548d3Szrj 
4319*fae548d3Szrj 	  /* PR 17531: file: 0522b371.  */
4320*fae548d3Szrj 	  if (linfo.li_line_range == 0)
4321*fae548d3Szrj 	    {
4322*fae548d3Szrj 	      warn (_("Line range of 0 is invalid, using 1 instead\n"));
4323*fae548d3Szrj 	      linfo.li_line_range = 1;
4324*fae548d3Szrj 	    }
4325*fae548d3Szrj 	  reset_state_machine (linfo.li_default_is_stmt);
4326*fae548d3Szrj 
4327*fae548d3Szrj 	  /* Save a pointer to the contents of the Opcodes table.  */
4328*fae548d3Szrj 	  standard_opcodes = hdrptr;
4329*fae548d3Szrj 
4330*fae548d3Szrj 	  /* Traverse the Directory table just to count entries.  */
4331*fae548d3Szrj 	  data = standard_opcodes + linfo.li_opcode_base - 1;
4332*fae548d3Szrj 	  /* PR 20440 */
4333*fae548d3Szrj 	  if (data >= end)
4334*fae548d3Szrj 	    {
4335*fae548d3Szrj 	      warn (_("opcode base of %d extends beyond end of section\n"),
4336*fae548d3Szrj 		    linfo.li_opcode_base);
4337*fae548d3Szrj 	      return 0;
4338*fae548d3Szrj 	    }
4339*fae548d3Szrj 
4340*fae548d3Szrj 	  if (linfo.li_version >= 5)
4341*fae548d3Szrj 	    {
4342*fae548d3Szrj 	      unsigned char *format_start, format_count, *format;
4343*fae548d3Szrj 	      dwarf_vma formati, entryi;
4344*fae548d3Szrj 
4345*fae548d3Szrj 	      load_debug_section_with_follow (line_str, fileptr);
4346*fae548d3Szrj 
4347*fae548d3Szrj 	      /* Skip directories format.  */
4348*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
4349*fae548d3Szrj 	      format_start = data;
4350*fae548d3Szrj 	      for (formati = 0; formati < format_count; formati++)
4351*fae548d3Szrj 		{
4352*fae548d3Szrj 		  SKIP_ULEB (data, end);
4353*fae548d3Szrj 		  SKIP_ULEB (data, end);
4354*fae548d3Szrj 		}
4355*fae548d3Szrj 
4356*fae548d3Szrj 	      READ_ULEB (n_directories, data, end);
4357*fae548d3Szrj 	      if (data == end)
4358*fae548d3Szrj 		{
4359*fae548d3Szrj 		  warn (_("Corrupt directories list\n"));
4360*fae548d3Szrj 		  break;
4361*fae548d3Szrj 		}
4362*fae548d3Szrj 
4363*fae548d3Szrj 	      directory_table = (unsigned char **)
4364*fae548d3Szrj 		xmalloc (n_directories * sizeof (unsigned char *));
4365*fae548d3Szrj 
4366*fae548d3Szrj 	      for (entryi = 0; entryi < n_directories; entryi++)
4367*fae548d3Szrj 		{
4368*fae548d3Szrj 		  unsigned char **pathp = &directory_table[entryi];
4369*fae548d3Szrj 
4370*fae548d3Szrj 		  format = format_start;
4371*fae548d3Szrj 		  for (formati = 0; formati < format_count; formati++)
4372*fae548d3Szrj 		    {
4373*fae548d3Szrj 		      dwarf_vma content_type, form;
4374*fae548d3Szrj 		      dwarf_vma uvalue;
4375*fae548d3Szrj 
4376*fae548d3Szrj 		      READ_ULEB (content_type, format, end);
4377*fae548d3Szrj 		      READ_ULEB (form, format, end);
4378*fae548d3Szrj 		      if (data == end)
4379*fae548d3Szrj 			{
4380*fae548d3Szrj 			  warn (_("Corrupt directories list\n"));
4381*fae548d3Szrj 			  break;
4382*fae548d3Szrj 			}
4383*fae548d3Szrj 		      switch (content_type)
4384*fae548d3Szrj 			{
4385*fae548d3Szrj 			case DW_LNCT_path:
4386*fae548d3Szrj 			  switch (form)
4387*fae548d3Szrj 			    {
4388*fae548d3Szrj 			    case DW_FORM_string:
4389*fae548d3Szrj 			      *pathp = data;
4390*fae548d3Szrj 			      break;
4391*fae548d3Szrj 			    case DW_FORM_line_strp:
4392*fae548d3Szrj 			      SAFE_BYTE_GET (uvalue, data, linfo.li_offset_size,
4393*fae548d3Szrj 					     end);
4394*fae548d3Szrj 			      /* Remove const by the cast.  */
4395*fae548d3Szrj 			      *pathp = (unsigned char *)
4396*fae548d3Szrj 				       fetch_indirect_line_string (uvalue);
4397*fae548d3Szrj 			      break;
4398*fae548d3Szrj 			    }
4399*fae548d3Szrj 			  break;
4400*fae548d3Szrj 			}
4401*fae548d3Szrj 		      data = read_and_display_attr_value (0, form, 0, start,
4402*fae548d3Szrj 							  data, end, 0, 0,
4403*fae548d3Szrj 							  linfo.li_offset_size,
4404*fae548d3Szrj 							  linfo.li_version,
4405*fae548d3Szrj 							  NULL, 1, section,
4406*fae548d3Szrj 							  NULL, '\t', -1);
4407*fae548d3Szrj 		    }
4408*fae548d3Szrj 		  if (data == end)
4409*fae548d3Szrj 		    {
4410*fae548d3Szrj 		      warn (_("Corrupt directories list\n"));
4411*fae548d3Szrj 		      break;
4412*fae548d3Szrj 		    }
4413*fae548d3Szrj 		}
4414*fae548d3Szrj 
4415*fae548d3Szrj 	      /* Skip files format.  */
4416*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
4417*fae548d3Szrj 	      format_start = data;
4418*fae548d3Szrj 	      for (formati = 0; formati < format_count; formati++)
4419*fae548d3Szrj 		{
4420*fae548d3Szrj 		  SKIP_ULEB (data, end);
4421*fae548d3Szrj 		  SKIP_ULEB (data, end);
4422*fae548d3Szrj 		}
4423*fae548d3Szrj 
4424*fae548d3Szrj 	      READ_ULEB (n_files, data, end);
4425*fae548d3Szrj 	      if (data == end)
4426*fae548d3Szrj 		{
4427*fae548d3Szrj 		  warn (_("Corrupt file name list\n"));
4428*fae548d3Szrj 		  break;
4429*fae548d3Szrj 		}
4430*fae548d3Szrj 
4431*fae548d3Szrj 	      file_table = (File_Entry *) xcalloc (1, n_files
4432*fae548d3Szrj 						      * sizeof (File_Entry));
4433*fae548d3Szrj 
4434*fae548d3Szrj 	      for (entryi = 0; entryi < n_files; entryi++)
4435*fae548d3Szrj 		{
4436*fae548d3Szrj 		  File_Entry *file = &file_table[entryi];
4437*fae548d3Szrj 
4438*fae548d3Szrj 		  format = format_start;
4439*fae548d3Szrj 		  for (formati = 0; formati < format_count; formati++)
4440*fae548d3Szrj 		    {
4441*fae548d3Szrj 		      dwarf_vma content_type, form;
4442*fae548d3Szrj 		      dwarf_vma uvalue;
4443*fae548d3Szrj 		      unsigned char *tmp;
4444*fae548d3Szrj 
4445*fae548d3Szrj 		      READ_ULEB (content_type, format, end);
4446*fae548d3Szrj 		      READ_ULEB (form, format, end);
4447*fae548d3Szrj 		      if (data == end)
4448*fae548d3Szrj 			{
4449*fae548d3Szrj 			  warn (_("Corrupt file name list\n"));
4450*fae548d3Szrj 			  break;
4451*fae548d3Szrj 			}
4452*fae548d3Szrj 		      switch (content_type)
4453*fae548d3Szrj 			{
4454*fae548d3Szrj 			case DW_LNCT_path:
4455*fae548d3Szrj 			  switch (form)
4456*fae548d3Szrj 			    {
4457*fae548d3Szrj 			    case DW_FORM_string:
4458*fae548d3Szrj 			      file->name = data;
4459*fae548d3Szrj 			      break;
4460*fae548d3Szrj 			    case DW_FORM_line_strp:
4461*fae548d3Szrj 			      SAFE_BYTE_GET (uvalue, data, linfo.li_offset_size,
4462*fae548d3Szrj 					     end);
4463*fae548d3Szrj 			      /* Remove const by the cast.  */
4464*fae548d3Szrj 			      file->name = (unsigned char *)
4465*fae548d3Szrj 					   fetch_indirect_line_string (uvalue);
4466*fae548d3Szrj 			      break;
4467*fae548d3Szrj 			    }
4468*fae548d3Szrj 			  break;
4469*fae548d3Szrj 			case DW_LNCT_directory_index:
4470*fae548d3Szrj 			  switch (form)
4471*fae548d3Szrj 			    {
4472*fae548d3Szrj 			    case DW_FORM_data1:
4473*fae548d3Szrj 			      SAFE_BYTE_GET (file->directory_index, data, 1,
4474*fae548d3Szrj 					     end);
4475*fae548d3Szrj 			      break;
4476*fae548d3Szrj 			    case DW_FORM_data2:
4477*fae548d3Szrj 			      SAFE_BYTE_GET (file->directory_index, data, 2,
4478*fae548d3Szrj 					     end);
4479*fae548d3Szrj 			      break;
4480*fae548d3Szrj 			    case DW_FORM_udata:
4481*fae548d3Szrj 			      tmp = data;
4482*fae548d3Szrj 			      READ_ULEB (file->directory_index, tmp, end);
4483*fae548d3Szrj 			      break;
4484*fae548d3Szrj 			    }
4485*fae548d3Szrj 			  break;
4486*fae548d3Szrj 			}
4487*fae548d3Szrj 		      data = read_and_display_attr_value (0, form, 0, start,
4488*fae548d3Szrj 							  data, end, 0, 0,
4489*fae548d3Szrj 							  linfo.li_offset_size,
4490*fae548d3Szrj 							  linfo.li_version,
4491*fae548d3Szrj 							  NULL, 1, section,
4492*fae548d3Szrj 							  NULL, '\t', -1);
4493*fae548d3Szrj 		    }
4494*fae548d3Szrj 		  if (data == end)
4495*fae548d3Szrj 		    {
4496*fae548d3Szrj 		      warn (_("Corrupt file name list\n"));
4497*fae548d3Szrj 		      break;
4498*fae548d3Szrj 		    }
4499*fae548d3Szrj 		}
4500*fae548d3Szrj 	    }
4501*fae548d3Szrj 	  else
4502*fae548d3Szrj 	    {
4503*fae548d3Szrj 	      if (*data != 0)
4504*fae548d3Szrj 		{
4505*fae548d3Szrj 		  unsigned char *ptr_directory_table = data;
4506*fae548d3Szrj 
4507*fae548d3Szrj 		  while (data < end && *data != 0)
4508*fae548d3Szrj 		    {
4509*fae548d3Szrj 		      data += strnlen ((char *) data, end - data) + 1;
4510*fae548d3Szrj 		      n_directories++;
4511*fae548d3Szrj 		    }
4512*fae548d3Szrj 
4513*fae548d3Szrj 		  /* PR 20440 */
4514*fae548d3Szrj 		  if (data >= end)
4515*fae548d3Szrj 		    {
4516*fae548d3Szrj 		      warn (_("directory table ends unexpectedly\n"));
4517*fae548d3Szrj 		      n_directories = 0;
4518*fae548d3Szrj 		      break;
4519*fae548d3Szrj 		    }
4520*fae548d3Szrj 
4521*fae548d3Szrj 		  /* Go through the directory table again to save the directories.  */
4522*fae548d3Szrj 		  directory_table = (unsigned char **)
4523*fae548d3Szrj 		    xmalloc (n_directories * sizeof (unsigned char *));
4524*fae548d3Szrj 
4525*fae548d3Szrj 		  i = 0;
4526*fae548d3Szrj 		  while (*ptr_directory_table != 0)
4527*fae548d3Szrj 		    {
4528*fae548d3Szrj 		      directory_table[i] = ptr_directory_table;
4529*fae548d3Szrj 		      ptr_directory_table += strnlen ((char *) ptr_directory_table,
4530*fae548d3Szrj 						      ptr_directory_table - end) + 1;
4531*fae548d3Szrj 		      i++;
4532*fae548d3Szrj 		    }
4533*fae548d3Szrj 		}
4534*fae548d3Szrj 	      /* Skip the NUL at the end of the table.  */
4535*fae548d3Szrj 	      data++;
4536*fae548d3Szrj 
4537*fae548d3Szrj 	      /* Traverse the File Name table just to count the entries.  */
4538*fae548d3Szrj 	      if (data < end && *data != 0)
4539*fae548d3Szrj 		{
4540*fae548d3Szrj 		  unsigned char *ptr_file_name_table = data;
4541*fae548d3Szrj 
4542*fae548d3Szrj 		  while (data < end && *data != 0)
4543*fae548d3Szrj 		    {
4544*fae548d3Szrj 		      /* Skip Name, directory index, last modification
4545*fae548d3Szrj 			 time and length of file.  */
4546*fae548d3Szrj 		      data += strnlen ((char *) data, end - data) + 1;
4547*fae548d3Szrj 		      SKIP_ULEB (data, end);
4548*fae548d3Szrj 		      SKIP_ULEB (data, end);
4549*fae548d3Szrj 		      SKIP_ULEB (data, end);
4550*fae548d3Szrj 		      n_files++;
4551*fae548d3Szrj 		    }
4552*fae548d3Szrj 
4553*fae548d3Szrj 		  if (data >= end)
4554*fae548d3Szrj 		    {
4555*fae548d3Szrj 		      warn (_("file table ends unexpectedly\n"));
4556*fae548d3Szrj 		      n_files = 0;
4557*fae548d3Szrj 		      break;
4558*fae548d3Szrj 		    }
4559*fae548d3Szrj 
4560*fae548d3Szrj 		  /* Go through the file table again to save the strings.  */
4561*fae548d3Szrj 		  file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
4562*fae548d3Szrj 
4563*fae548d3Szrj 		  i = 0;
4564*fae548d3Szrj 		  while (*ptr_file_name_table != 0)
4565*fae548d3Szrj 		    {
4566*fae548d3Szrj 		      file_table[i].name = ptr_file_name_table;
4567*fae548d3Szrj 		      ptr_file_name_table += strnlen ((char *) ptr_file_name_table,
4568*fae548d3Szrj 						      end - ptr_file_name_table) + 1;
4569*fae548d3Szrj 
4570*fae548d3Szrj 		      /* We are not interested in directory, time or size.  */
4571*fae548d3Szrj 		      READ_ULEB (file_table[i].directory_index,
4572*fae548d3Szrj 				 ptr_file_name_table, end);
4573*fae548d3Szrj 		      READ_ULEB (file_table[i].modification_date,
4574*fae548d3Szrj 				 ptr_file_name_table, end);
4575*fae548d3Szrj 		      READ_ULEB (file_table[i].length,
4576*fae548d3Szrj 				 ptr_file_name_table, end);
4577*fae548d3Szrj 		      i++;
4578*fae548d3Szrj 		    }
4579*fae548d3Szrj 		  i = 0;
4580*fae548d3Szrj 		}
4581*fae548d3Szrj 
4582*fae548d3Szrj 	      /* Skip the NUL at the end of the table.  */
4583*fae548d3Szrj 	      data++;
4584*fae548d3Szrj 	    }
4585*fae548d3Szrj 
4586*fae548d3Szrj 	  /* Print the Compilation Unit's name and a header.  */
4587*fae548d3Szrj 	  if (file_table == NULL)
4588*fae548d3Szrj 	    ;
4589*fae548d3Szrj 	  else if (directory_table == NULL)
4590*fae548d3Szrj 	    printf (_("CU: %s:\n"), file_table[0].name);
4591*fae548d3Szrj 	  else
4592*fae548d3Szrj 	    {
4593*fae548d3Szrj 	      unsigned int ix = file_table[0].directory_index;
4594*fae548d3Szrj 	      const char *directory;
4595*fae548d3Szrj 
4596*fae548d3Szrj 	      if (ix == 0)
4597*fae548d3Szrj 		directory = ".";
4598*fae548d3Szrj 	      /* PR 20439 */
4599*fae548d3Szrj 	      else if (n_directories == 0)
4600*fae548d3Szrj 		directory = _("<unknown>");
4601*fae548d3Szrj 	      else if (ix > n_directories)
4602*fae548d3Szrj 		{
4603*fae548d3Szrj 		  warn (_("directory index %u > number of directories %s\n"),
4604*fae548d3Szrj 			ix, dwarf_vmatoa ("u", n_directories));
4605*fae548d3Szrj 		  directory = _("<corrupt>");
4606*fae548d3Szrj 		}
4607*fae548d3Szrj 	      else
4608*fae548d3Szrj 		directory = (char *) directory_table[ix - 1];
4609*fae548d3Szrj 
4610*fae548d3Szrj 	      if (do_wide || strlen (directory) < 76)
4611*fae548d3Szrj 		printf (_("CU: %s/%s:\n"), directory, file_table[0].name);
4612*fae548d3Szrj 	      else
4613*fae548d3Szrj 		printf ("%s:\n", file_table[0].name);
4614*fae548d3Szrj 	    }
4615*fae548d3Szrj 
4616*fae548d3Szrj 	  printf (_("File name                            Line number    Starting address    View    Stmt\n"));
4617*fae548d3Szrj 	  saved_linfo = linfo;
4618*fae548d3Szrj 	}
4619*fae548d3Szrj 
4620*fae548d3Szrj       /* This loop iterates through the Dwarf Line Number Program.  */
4621*fae548d3Szrj       while (data < end_of_sequence)
4622*fae548d3Szrj 	{
4623*fae548d3Szrj 	  unsigned char op_code;
4624*fae548d3Szrj 	  int xop;
4625*fae548d3Szrj 	  int adv;
4626*fae548d3Szrj 	  unsigned long int uladv;
4627*fae548d3Szrj 	  int is_special_opcode = 0;
4628*fae548d3Szrj 
4629*fae548d3Szrj 	  op_code = *data++;
4630*fae548d3Szrj 	  xop = op_code;
4631*fae548d3Szrj 
4632*fae548d3Szrj 	  if (op_code >= linfo.li_opcode_base)
4633*fae548d3Szrj 	    {
4634*fae548d3Szrj 	      op_code -= linfo.li_opcode_base;
4635*fae548d3Szrj 	      uladv = (op_code / linfo.li_line_range);
4636*fae548d3Szrj 	      if (linfo.li_max_ops_per_insn == 1)
4637*fae548d3Szrj 		{
4638*fae548d3Szrj 		  uladv *= linfo.li_min_insn_length;
4639*fae548d3Szrj 		  state_machine_regs.address += uladv;
4640*fae548d3Szrj 		  if (uladv)
4641*fae548d3Szrj 		    state_machine_regs.view = 0;
4642*fae548d3Szrj 		}
4643*fae548d3Szrj 	      else
4644*fae548d3Szrj 		{
4645*fae548d3Szrj 		  unsigned addrdelta
4646*fae548d3Szrj 		    = ((state_machine_regs.op_index + uladv)
4647*fae548d3Szrj 		       / linfo.li_max_ops_per_insn)
4648*fae548d3Szrj 		    * linfo.li_min_insn_length;
4649*fae548d3Szrj 		  state_machine_regs.address
4650*fae548d3Szrj 		    += addrdelta;
4651*fae548d3Szrj 		  state_machine_regs.op_index
4652*fae548d3Szrj 		    = (state_machine_regs.op_index + uladv)
4653*fae548d3Szrj 		    % linfo.li_max_ops_per_insn;
4654*fae548d3Szrj 		  if (addrdelta)
4655*fae548d3Szrj 		    state_machine_regs.view = 0;
4656*fae548d3Szrj 		}
4657*fae548d3Szrj 
4658*fae548d3Szrj 	      adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
4659*fae548d3Szrj 	      state_machine_regs.line += adv;
4660*fae548d3Szrj 	      is_special_opcode = 1;
4661*fae548d3Szrj 	      /* Increment view after printing this row.  */
4662*fae548d3Szrj 	    }
4663*fae548d3Szrj 	  else
4664*fae548d3Szrj 	    switch (op_code)
4665*fae548d3Szrj 	      {
4666*fae548d3Szrj 	      case DW_LNS_extended_op:
4667*fae548d3Szrj 		{
4668*fae548d3Szrj 		  unsigned int ext_op_code_len;
4669*fae548d3Szrj 		  unsigned char ext_op_code;
4670*fae548d3Szrj 		  unsigned char *op_code_end;
4671*fae548d3Szrj 		  unsigned char *op_code_data = data;
4672*fae548d3Szrj 
4673*fae548d3Szrj 		  READ_ULEB (ext_op_code_len, op_code_data, end_of_sequence);
4674*fae548d3Szrj 		  op_code_end = op_code_data + ext_op_code_len;
4675*fae548d3Szrj 		  if (ext_op_code_len == 0 || op_code_end > end_of_sequence)
4676*fae548d3Szrj 		    {
4677*fae548d3Szrj 		      warn (_("Badly formed extended line op encountered!\n"));
4678*fae548d3Szrj 		      break;
4679*fae548d3Szrj 		    }
4680*fae548d3Szrj 		  ext_op_code = *op_code_data++;
4681*fae548d3Szrj 		  xop = ext_op_code;
4682*fae548d3Szrj 		  xop = -xop;
4683*fae548d3Szrj 
4684*fae548d3Szrj 		  switch (ext_op_code)
4685*fae548d3Szrj 		    {
4686*fae548d3Szrj 		    case DW_LNE_end_sequence:
4687*fae548d3Szrj 		      /* Reset stuff after printing this row.  */
4688*fae548d3Szrj 		      break;
4689*fae548d3Szrj 		    case DW_LNE_set_address:
4690*fae548d3Szrj 		      SAFE_BYTE_GET_AND_INC (state_machine_regs.address,
4691*fae548d3Szrj 					     op_code_data,
4692*fae548d3Szrj 					     op_code_end - op_code_data,
4693*fae548d3Szrj 					     op_code_end);
4694*fae548d3Szrj 		      state_machine_regs.op_index = 0;
4695*fae548d3Szrj 		      state_machine_regs.view = 0;
4696*fae548d3Szrj 		      break;
4697*fae548d3Szrj 		    case DW_LNE_define_file:
4698*fae548d3Szrj 		      file_table = (File_Entry *) xrealloc
4699*fae548d3Szrj 			(file_table, (n_files + 1) * sizeof (File_Entry));
4700*fae548d3Szrj 
4701*fae548d3Szrj 		      ++state_machine_regs.last_file_entry;
4702*fae548d3Szrj 		      /* Source file name.  */
4703*fae548d3Szrj 		      file_table[n_files].name = op_code_data;
4704*fae548d3Szrj 		      op_code_data += strlen ((char *) op_code_data) + 1;
4705*fae548d3Szrj 		      /* Directory index.  */
4706*fae548d3Szrj 		      READ_ULEB (file_table[n_files].directory_index,
4707*fae548d3Szrj 				 op_code_data, op_code_end);
4708*fae548d3Szrj 		      /* Last modification time.  */
4709*fae548d3Szrj 		      READ_ULEB (file_table[n_files].modification_date,
4710*fae548d3Szrj 				 op_code_data, op_code_end);
4711*fae548d3Szrj 		      /* File length.  */
4712*fae548d3Szrj 		      READ_ULEB (file_table[n_files].length,
4713*fae548d3Szrj 				 op_code_data, op_code_end);
4714*fae548d3Szrj 		      n_files++;
4715*fae548d3Szrj 		      break;
4716*fae548d3Szrj 
4717*fae548d3Szrj 		    case DW_LNE_set_discriminator:
4718*fae548d3Szrj 		    case DW_LNE_HP_set_sequence:
4719*fae548d3Szrj 		      /* Simply ignored.  */
4720*fae548d3Szrj 		      break;
4721*fae548d3Szrj 
4722*fae548d3Szrj 		    default:
4723*fae548d3Szrj 		      printf (_("UNKNOWN (%u): length %ld\n"),
4724*fae548d3Szrj 			      ext_op_code, (long int) (op_code_data - data));
4725*fae548d3Szrj 		      break;
4726*fae548d3Szrj 		    }
4727*fae548d3Szrj 		  data = op_code_end;
4728*fae548d3Szrj 		  break;
4729*fae548d3Szrj 		}
4730*fae548d3Szrj 	      case DW_LNS_copy:
4731*fae548d3Szrj 		/* Increment view after printing this row.  */
4732*fae548d3Szrj 		break;
4733*fae548d3Szrj 
4734*fae548d3Szrj 	      case DW_LNS_advance_pc:
4735*fae548d3Szrj 		READ_ULEB (uladv, data, end);
4736*fae548d3Szrj 		if (linfo.li_max_ops_per_insn == 1)
4737*fae548d3Szrj 		  {
4738*fae548d3Szrj 		    uladv *= linfo.li_min_insn_length;
4739*fae548d3Szrj 		    state_machine_regs.address += uladv;
4740*fae548d3Szrj 		    if (uladv)
4741*fae548d3Szrj 		      state_machine_regs.view = 0;
4742*fae548d3Szrj 		  }
4743*fae548d3Szrj 		else
4744*fae548d3Szrj 		  {
4745*fae548d3Szrj 		    unsigned addrdelta
4746*fae548d3Szrj 		      = ((state_machine_regs.op_index + uladv)
4747*fae548d3Szrj 			 / linfo.li_max_ops_per_insn)
4748*fae548d3Szrj 		      * linfo.li_min_insn_length;
4749*fae548d3Szrj 		    state_machine_regs.address
4750*fae548d3Szrj 		      += addrdelta;
4751*fae548d3Szrj 		    state_machine_regs.op_index
4752*fae548d3Szrj 		      = (state_machine_regs.op_index + uladv)
4753*fae548d3Szrj 		      % linfo.li_max_ops_per_insn;
4754*fae548d3Szrj 		    if (addrdelta)
4755*fae548d3Szrj 		      state_machine_regs.view = 0;
4756*fae548d3Szrj 		  }
4757*fae548d3Szrj 		break;
4758*fae548d3Szrj 
4759*fae548d3Szrj 	      case DW_LNS_advance_line:
4760*fae548d3Szrj 		READ_SLEB (adv, data, end);
4761*fae548d3Szrj 		state_machine_regs.line += adv;
4762*fae548d3Szrj 		break;
4763*fae548d3Szrj 
4764*fae548d3Szrj 	      case DW_LNS_set_file:
4765*fae548d3Szrj 		READ_ULEB (uladv, data, end);
4766*fae548d3Szrj 		state_machine_regs.file = uladv;
4767*fae548d3Szrj 
4768*fae548d3Szrj 		{
4769*fae548d3Szrj 		  unsigned file = state_machine_regs.file - 1;
4770*fae548d3Szrj 		  unsigned dir;
4771*fae548d3Szrj 
4772*fae548d3Szrj 		  if (file_table == NULL || n_files == 0)
4773*fae548d3Szrj 		    printf (_("\n [Use file table entry %d]\n"), file);
4774*fae548d3Szrj 		  /* PR 20439 */
4775*fae548d3Szrj 		  else if (file >= n_files)
4776*fae548d3Szrj 		    {
4777*fae548d3Szrj 		      warn (_("file index %u > number of files %u\n"), file + 1, n_files);
4778*fae548d3Szrj 		      printf (_("\n <over large file table index %u>"), file);
4779*fae548d3Szrj 		    }
4780*fae548d3Szrj 		  else if ((dir = file_table[file].directory_index) == 0)
4781*fae548d3Szrj 		    /* If directory index is 0, that means current directory.  */
4782*fae548d3Szrj 		    printf ("\n./%s:[++]\n", file_table[file].name);
4783*fae548d3Szrj 		  else if (directory_table == NULL || n_directories == 0)
4784*fae548d3Szrj 		    printf (_("\n [Use file %s in directory table entry %d]\n"),
4785*fae548d3Szrj 			    file_table[file].name, dir);
4786*fae548d3Szrj 		  /* PR 20439 */
4787*fae548d3Szrj 		  else if (dir > n_directories)
4788*fae548d3Szrj 		    {
4789*fae548d3Szrj 		      warn (_("directory index %u > number of directories %s\n"),
4790*fae548d3Szrj 			    dir, dwarf_vmatoa ("u", n_directories));
4791*fae548d3Szrj 		      printf (_("\n <over large directory table entry %u>\n"), dir);
4792*fae548d3Szrj 		    }
4793*fae548d3Szrj 		  else
4794*fae548d3Szrj 		    printf ("\n%s/%s:\n",
4795*fae548d3Szrj 			    /* The directory index starts counting at 1.  */
4796*fae548d3Szrj 			    directory_table[dir - 1], file_table[file].name);
4797*fae548d3Szrj 		}
4798*fae548d3Szrj 		break;
4799*fae548d3Szrj 
4800*fae548d3Szrj 	      case DW_LNS_set_column:
4801*fae548d3Szrj 		READ_ULEB (uladv, data, end);
4802*fae548d3Szrj 		state_machine_regs.column = uladv;
4803*fae548d3Szrj 		break;
4804*fae548d3Szrj 
4805*fae548d3Szrj 	      case DW_LNS_negate_stmt:
4806*fae548d3Szrj 		adv = state_machine_regs.is_stmt;
4807*fae548d3Szrj 		adv = ! adv;
4808*fae548d3Szrj 		state_machine_regs.is_stmt = adv;
4809*fae548d3Szrj 		break;
4810*fae548d3Szrj 
4811*fae548d3Szrj 	      case DW_LNS_set_basic_block:
4812*fae548d3Szrj 		state_machine_regs.basic_block = 1;
4813*fae548d3Szrj 		break;
4814*fae548d3Szrj 
4815*fae548d3Szrj 	      case DW_LNS_const_add_pc:
4816*fae548d3Szrj 		uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range);
4817*fae548d3Szrj 		if (linfo.li_max_ops_per_insn == 1)
4818*fae548d3Szrj 		  {
4819*fae548d3Szrj 		    uladv *= linfo.li_min_insn_length;
4820*fae548d3Szrj 		    state_machine_regs.address += uladv;
4821*fae548d3Szrj 		    if (uladv)
4822*fae548d3Szrj 		      state_machine_regs.view = 0;
4823*fae548d3Szrj 		  }
4824*fae548d3Szrj 		else
4825*fae548d3Szrj 		  {
4826*fae548d3Szrj 		    unsigned addrdelta
4827*fae548d3Szrj 		      = ((state_machine_regs.op_index + uladv)
4828*fae548d3Szrj 			 / linfo.li_max_ops_per_insn)
4829*fae548d3Szrj 		      * linfo.li_min_insn_length;
4830*fae548d3Szrj 		    state_machine_regs.address
4831*fae548d3Szrj 		      += addrdelta;
4832*fae548d3Szrj 		    state_machine_regs.op_index
4833*fae548d3Szrj 		      = (state_machine_regs.op_index + uladv)
4834*fae548d3Szrj 		      % linfo.li_max_ops_per_insn;
4835*fae548d3Szrj 		    if (addrdelta)
4836*fae548d3Szrj 		      state_machine_regs.view = 0;
4837*fae548d3Szrj 		  }
4838*fae548d3Szrj 		break;
4839*fae548d3Szrj 
4840*fae548d3Szrj 	      case DW_LNS_fixed_advance_pc:
4841*fae548d3Szrj 		SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
4842*fae548d3Szrj 		state_machine_regs.address += uladv;
4843*fae548d3Szrj 		state_machine_regs.op_index = 0;
4844*fae548d3Szrj 		/* Do NOT reset view.  */
4845*fae548d3Szrj 		break;
4846*fae548d3Szrj 
4847*fae548d3Szrj 	      case DW_LNS_set_prologue_end:
4848*fae548d3Szrj 		break;
4849*fae548d3Szrj 
4850*fae548d3Szrj 	      case DW_LNS_set_epilogue_begin:
4851*fae548d3Szrj 		break;
4852*fae548d3Szrj 
4853*fae548d3Szrj 	      case DW_LNS_set_isa:
4854*fae548d3Szrj 		READ_ULEB (uladv, data, end);
4855*fae548d3Szrj 		printf (_("  Set ISA to %lu\n"), uladv);
4856*fae548d3Szrj 		break;
4857*fae548d3Szrj 
4858*fae548d3Szrj 	      default:
4859*fae548d3Szrj 		printf (_("  Unknown opcode %d with operands: "), op_code);
4860*fae548d3Szrj 
4861*fae548d3Szrj 		if (standard_opcodes != NULL)
4862*fae548d3Szrj 		  for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
4863*fae548d3Szrj 		    {
4864*fae548d3Szrj 		      dwarf_vma val;
4865*fae548d3Szrj 
4866*fae548d3Szrj 		      READ_ULEB (val, data, end);
4867*fae548d3Szrj 		      printf ("0x%s%s", dwarf_vmatoa ("x", val),
4868*fae548d3Szrj 			      i == 1 ? "" : ", ");
4869*fae548d3Szrj 		    }
4870*fae548d3Szrj 		putchar ('\n');
4871*fae548d3Szrj 		break;
4872*fae548d3Szrj 	      }
4873*fae548d3Szrj 
4874*fae548d3Szrj 	  /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
4875*fae548d3Szrj 	     to the DWARF address/line matrix.  */
4876*fae548d3Szrj 	  if ((is_special_opcode) || (xop == -DW_LNE_end_sequence)
4877*fae548d3Szrj 	      || (xop == DW_LNS_copy))
4878*fae548d3Szrj 	    {
4879*fae548d3Szrj 	      const unsigned int MAX_FILENAME_LENGTH = 35;
4880*fae548d3Szrj 	      char *fileName;
4881*fae548d3Szrj 	      char *newFileName = NULL;
4882*fae548d3Szrj 	      size_t fileNameLength;
4883*fae548d3Szrj 
4884*fae548d3Szrj 	      if (file_table)
4885*fae548d3Szrj 		{
4886*fae548d3Szrj 		  unsigned indx = state_machine_regs.file - 1;
4887*fae548d3Szrj 		  /* PR 20439  */
4888*fae548d3Szrj 		  if (indx >= n_files)
4889*fae548d3Szrj 		    {
4890*fae548d3Szrj 		      warn (_("corrupt file index %u encountered\n"), indx);
4891*fae548d3Szrj 		      fileName = _("<corrupt>");
4892*fae548d3Szrj 		    }
4893*fae548d3Szrj 		  else
4894*fae548d3Szrj 		    fileName = (char *) file_table[indx].name;
4895*fae548d3Szrj 		}
4896*fae548d3Szrj 	      else
4897*fae548d3Szrj 		fileName = _("<unknown>");
4898*fae548d3Szrj 
4899*fae548d3Szrj 	      fileNameLength = strlen (fileName);
4900*fae548d3Szrj 
4901*fae548d3Szrj 	      if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
4902*fae548d3Szrj 		{
4903*fae548d3Szrj 		  newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
4904*fae548d3Szrj 		  /* Truncate file name */
4905*fae548d3Szrj 		  strncpy (newFileName,
4906*fae548d3Szrj 			   fileName + fileNameLength - MAX_FILENAME_LENGTH,
4907*fae548d3Szrj 			   MAX_FILENAME_LENGTH + 1);
4908*fae548d3Szrj 		}
4909*fae548d3Szrj 	      else
4910*fae548d3Szrj 		{
4911*fae548d3Szrj 		  newFileName = (char *) xmalloc (fileNameLength + 1);
4912*fae548d3Szrj 		  strncpy (newFileName, fileName, fileNameLength + 1);
4913*fae548d3Szrj 		}
4914*fae548d3Szrj 
4915*fae548d3Szrj 	      if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
4916*fae548d3Szrj 		{
4917*fae548d3Szrj 		  if (linfo.li_max_ops_per_insn == 1)
4918*fae548d3Szrj 		    printf ("%-35s  %11d  %#18" DWARF_VMA_FMT "x",
4919*fae548d3Szrj 			    newFileName, state_machine_regs.line,
4920*fae548d3Szrj 			    state_machine_regs.address);
4921*fae548d3Szrj 		  else
4922*fae548d3Szrj 		    printf ("%-35s  %11d  %#18" DWARF_VMA_FMT "x[%d]",
4923*fae548d3Szrj 			    newFileName, state_machine_regs.line,
4924*fae548d3Szrj 			    state_machine_regs.address,
4925*fae548d3Szrj 			    state_machine_regs.op_index);
4926*fae548d3Szrj 		}
4927*fae548d3Szrj 	      else
4928*fae548d3Szrj 		{
4929*fae548d3Szrj 		  if (linfo.li_max_ops_per_insn == 1)
4930*fae548d3Szrj 		    printf ("%s  %11d  %#18" DWARF_VMA_FMT "x",
4931*fae548d3Szrj 			    newFileName, state_machine_regs.line,
4932*fae548d3Szrj 			    state_machine_regs.address);
4933*fae548d3Szrj 		  else
4934*fae548d3Szrj 		    printf ("%s  %11d  %#18" DWARF_VMA_FMT "x[%d]",
4935*fae548d3Szrj 			    newFileName, state_machine_regs.line,
4936*fae548d3Szrj 			    state_machine_regs.address,
4937*fae548d3Szrj 			    state_machine_regs.op_index);
4938*fae548d3Szrj 		}
4939*fae548d3Szrj 
4940*fae548d3Szrj 	      if (state_machine_regs.view)
4941*fae548d3Szrj 		printf ("  %6u", state_machine_regs.view);
4942*fae548d3Szrj 	      else
4943*fae548d3Szrj 		printf ("        ");
4944*fae548d3Szrj 
4945*fae548d3Szrj 	      if (state_machine_regs.is_stmt)
4946*fae548d3Szrj 		printf ("       x");
4947*fae548d3Szrj 
4948*fae548d3Szrj 	      putchar ('\n');
4949*fae548d3Szrj 	      state_machine_regs.view++;
4950*fae548d3Szrj 
4951*fae548d3Szrj 	      if (xop == -DW_LNE_end_sequence)
4952*fae548d3Szrj 		{
4953*fae548d3Szrj 		  reset_state_machine (linfo.li_default_is_stmt);
4954*fae548d3Szrj 		  putchar ('\n');
4955*fae548d3Szrj 		}
4956*fae548d3Szrj 
4957*fae548d3Szrj 	      free (newFileName);
4958*fae548d3Szrj 	    }
4959*fae548d3Szrj 	}
4960*fae548d3Szrj 
4961*fae548d3Szrj       if (file_table)
4962*fae548d3Szrj 	{
4963*fae548d3Szrj 	  free (file_table);
4964*fae548d3Szrj 	  file_table = NULL;
4965*fae548d3Szrj 	  n_files = 0;
4966*fae548d3Szrj 	}
4967*fae548d3Szrj 
4968*fae548d3Szrj       if (directory_table)
4969*fae548d3Szrj 	{
4970*fae548d3Szrj 	  free (directory_table);
4971*fae548d3Szrj 	  directory_table = NULL;
4972*fae548d3Szrj 	  n_directories = 0;
4973*fae548d3Szrj 	}
4974*fae548d3Szrj 
4975*fae548d3Szrj       putchar ('\n');
4976*fae548d3Szrj     }
4977*fae548d3Szrj 
4978*fae548d3Szrj   return 1;
4979*fae548d3Szrj }
4980*fae548d3Szrj 
4981*fae548d3Szrj static int
display_debug_lines(struct dwarf_section * section,void * file)4982*fae548d3Szrj display_debug_lines (struct dwarf_section *section, void *file)
4983*fae548d3Szrj {
4984*fae548d3Szrj   unsigned char *data = section->start;
4985*fae548d3Szrj   unsigned char *end = data + section->size;
4986*fae548d3Szrj   int retValRaw = 1;
4987*fae548d3Szrj   int retValDecoded = 1;
4988*fae548d3Szrj 
4989*fae548d3Szrj   if (do_debug_lines == 0)
4990*fae548d3Szrj     do_debug_lines |= FLAG_DEBUG_LINES_RAW;
4991*fae548d3Szrj 
4992*fae548d3Szrj   if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
4993*fae548d3Szrj     retValRaw = display_debug_lines_raw (section, data, end, file);
4994*fae548d3Szrj 
4995*fae548d3Szrj   if (do_debug_lines & FLAG_DEBUG_LINES_DECODED)
4996*fae548d3Szrj     retValDecoded = display_debug_lines_decoded (section, data, data, end, file);
4997*fae548d3Szrj 
4998*fae548d3Szrj   if (!retValRaw || !retValDecoded)
4999*fae548d3Szrj     return 0;
5000*fae548d3Szrj 
5001*fae548d3Szrj   return 1;
5002*fae548d3Szrj }
5003*fae548d3Szrj 
5004*fae548d3Szrj static debug_info *
find_debug_info_for_offset(unsigned long offset)5005*fae548d3Szrj find_debug_info_for_offset (unsigned long offset)
5006*fae548d3Szrj {
5007*fae548d3Szrj   unsigned int i;
5008*fae548d3Szrj 
5009*fae548d3Szrj   if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
5010*fae548d3Szrj     return NULL;
5011*fae548d3Szrj 
5012*fae548d3Szrj   for (i = 0; i < num_debug_info_entries; i++)
5013*fae548d3Szrj     if (debug_information[i].cu_offset == offset)
5014*fae548d3Szrj       return debug_information + i;
5015*fae548d3Szrj 
5016*fae548d3Szrj   return NULL;
5017*fae548d3Szrj }
5018*fae548d3Szrj 
5019*fae548d3Szrj static const char *
get_gdb_index_symbol_kind_name(gdb_index_symbol_kind kind)5020*fae548d3Szrj get_gdb_index_symbol_kind_name (gdb_index_symbol_kind kind)
5021*fae548d3Szrj {
5022*fae548d3Szrj   /* See gdb/gdb-index.h.  */
5023*fae548d3Szrj   static const char * const kinds[] =
5024*fae548d3Szrj   {
5025*fae548d3Szrj     N_ ("no info"),
5026*fae548d3Szrj     N_ ("type"),
5027*fae548d3Szrj     N_ ("variable"),
5028*fae548d3Szrj     N_ ("function"),
5029*fae548d3Szrj     N_ ("other"),
5030*fae548d3Szrj     N_ ("unused5"),
5031*fae548d3Szrj     N_ ("unused6"),
5032*fae548d3Szrj     N_ ("unused7")
5033*fae548d3Szrj   };
5034*fae548d3Szrj 
5035*fae548d3Szrj   return _ (kinds[kind]);
5036*fae548d3Szrj }
5037*fae548d3Szrj 
5038*fae548d3Szrj static int
display_debug_pubnames_worker(struct dwarf_section * section,void * file ATTRIBUTE_UNUSED,int is_gnu)5039*fae548d3Szrj display_debug_pubnames_worker (struct dwarf_section *section,
5040*fae548d3Szrj 			       void *file ATTRIBUTE_UNUSED,
5041*fae548d3Szrj 			       int is_gnu)
5042*fae548d3Szrj {
5043*fae548d3Szrj   DWARF2_Internal_PubNames names;
5044*fae548d3Szrj   unsigned char *start = section->start;
5045*fae548d3Szrj   unsigned char *end = start + section->size;
5046*fae548d3Szrj 
5047*fae548d3Szrj   /* It does not matter if this load fails,
5048*fae548d3Szrj      we test for that later on.  */
5049*fae548d3Szrj   load_debug_info (file);
5050*fae548d3Szrj 
5051*fae548d3Szrj   introduce (section, FALSE);
5052*fae548d3Szrj 
5053*fae548d3Szrj   while (start < end)
5054*fae548d3Szrj     {
5055*fae548d3Szrj       unsigned char *data;
5056*fae548d3Szrj       unsigned long sec_off;
5057*fae548d3Szrj       unsigned int offset_size, initial_length_size;
5058*fae548d3Szrj 
5059*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (names.pn_length, start, 4, end);
5060*fae548d3Szrj       if (names.pn_length == 0xffffffff)
5061*fae548d3Szrj 	{
5062*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (names.pn_length, start, 8, end);
5063*fae548d3Szrj 	  offset_size = 8;
5064*fae548d3Szrj 	  initial_length_size = 12;
5065*fae548d3Szrj 	}
5066*fae548d3Szrj       else
5067*fae548d3Szrj 	{
5068*fae548d3Szrj 	  offset_size = 4;
5069*fae548d3Szrj 	  initial_length_size = 4;
5070*fae548d3Szrj 	}
5071*fae548d3Szrj 
5072*fae548d3Szrj       sec_off = start - section->start;
5073*fae548d3Szrj       if (sec_off + names.pn_length < sec_off
5074*fae548d3Szrj 	  || sec_off + names.pn_length > section->size)
5075*fae548d3Szrj 	{
5076*fae548d3Szrj 	  warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
5077*fae548d3Szrj 		section->name,
5078*fae548d3Szrj 		sec_off - initial_length_size,
5079*fae548d3Szrj 		dwarf_vmatoa ("x", names.pn_length));
5080*fae548d3Szrj 	  break;
5081*fae548d3Szrj 	}
5082*fae548d3Szrj 
5083*fae548d3Szrj       data = start;
5084*fae548d3Szrj       start += names.pn_length;
5085*fae548d3Szrj 
5086*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end);
5087*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end);
5088*fae548d3Szrj 
5089*fae548d3Szrj       if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
5090*fae548d3Szrj 	  && num_debug_info_entries > 0
5091*fae548d3Szrj 	  && find_debug_info_for_offset (names.pn_offset) == NULL)
5092*fae548d3Szrj 	warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
5093*fae548d3Szrj 	      (unsigned long) names.pn_offset, section->name);
5094*fae548d3Szrj 
5095*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, end);
5096*fae548d3Szrj 
5097*fae548d3Szrj       printf (_("  Length:                              %ld\n"),
5098*fae548d3Szrj 	      (long) names.pn_length);
5099*fae548d3Szrj       printf (_("  Version:                             %d\n"),
5100*fae548d3Szrj 	      names.pn_version);
5101*fae548d3Szrj       printf (_("  Offset into .debug_info section:     0x%lx\n"),
5102*fae548d3Szrj 	      (unsigned long) names.pn_offset);
5103*fae548d3Szrj       printf (_("  Size of area in .debug_info section: %ld\n"),
5104*fae548d3Szrj 	      (long) names.pn_size);
5105*fae548d3Szrj 
5106*fae548d3Szrj       if (names.pn_version != 2 && names.pn_version != 3)
5107*fae548d3Szrj 	{
5108*fae548d3Szrj 	  static int warned = 0;
5109*fae548d3Szrj 
5110*fae548d3Szrj 	  if (! warned)
5111*fae548d3Szrj 	    {
5112*fae548d3Szrj 	      warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
5113*fae548d3Szrj 	      warned = 1;
5114*fae548d3Szrj 	    }
5115*fae548d3Szrj 
5116*fae548d3Szrj 	  continue;
5117*fae548d3Szrj 	}
5118*fae548d3Szrj 
5119*fae548d3Szrj       if (is_gnu)
5120*fae548d3Szrj 	printf (_("\n    Offset  Kind          Name\n"));
5121*fae548d3Szrj       else
5122*fae548d3Szrj 	printf (_("\n    Offset\tName\n"));
5123*fae548d3Szrj 
5124*fae548d3Szrj       while (1)
5125*fae548d3Szrj 	{
5126*fae548d3Szrj 	  bfd_size_type maxprint;
5127*fae548d3Szrj 	  dwarf_vma offset;
5128*fae548d3Szrj 
5129*fae548d3Szrj 	  SAFE_BYTE_GET (offset, data, offset_size, end);
5130*fae548d3Szrj 
5131*fae548d3Szrj 	  if (offset == 0)
5132*fae548d3Szrj 	    break;
5133*fae548d3Szrj 
5134*fae548d3Szrj 	  data += offset_size;
5135*fae548d3Szrj 	  if (data >= end)
5136*fae548d3Szrj 	    break;
5137*fae548d3Szrj 	  maxprint = (end - data) - 1;
5138*fae548d3Szrj 
5139*fae548d3Szrj 	  if (is_gnu)
5140*fae548d3Szrj 	    {
5141*fae548d3Szrj 	      unsigned int kind_data;
5142*fae548d3Szrj 	      gdb_index_symbol_kind kind;
5143*fae548d3Szrj 	      const char *kind_name;
5144*fae548d3Szrj 	      int is_static;
5145*fae548d3Szrj 
5146*fae548d3Szrj 	      SAFE_BYTE_GET (kind_data, data, 1, end);
5147*fae548d3Szrj 	      data++;
5148*fae548d3Szrj 	      maxprint --;
5149*fae548d3Szrj 	      /* GCC computes the kind as the upper byte in the CU index
5150*fae548d3Szrj 		 word, and then right shifts it by the CU index size.
5151*fae548d3Szrj 		 Left shift KIND to where the gdb-index.h accessor macros
5152*fae548d3Szrj 		 can use it.  */
5153*fae548d3Szrj 	      kind_data <<= GDB_INDEX_CU_BITSIZE;
5154*fae548d3Szrj 	      kind = GDB_INDEX_SYMBOL_KIND_VALUE (kind_data);
5155*fae548d3Szrj 	      kind_name = get_gdb_index_symbol_kind_name (kind);
5156*fae548d3Szrj 	      is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (kind_data);
5157*fae548d3Szrj 	      printf ("    %-6lx  %s,%-10s  %.*s\n",
5158*fae548d3Szrj 		      (unsigned long) offset, is_static ? _("s") : _("g"),
5159*fae548d3Szrj 		      kind_name, (int) maxprint, data);
5160*fae548d3Szrj 	    }
5161*fae548d3Szrj 	  else
5162*fae548d3Szrj 	    printf ("    %-6lx\t%.*s\n",
5163*fae548d3Szrj 		    (unsigned long) offset, (int) maxprint, data);
5164*fae548d3Szrj 
5165*fae548d3Szrj 	  data += strnlen ((char *) data, maxprint) + 1;
5166*fae548d3Szrj 	  if (data >= end)
5167*fae548d3Szrj 	    break;
5168*fae548d3Szrj 	}
5169*fae548d3Szrj     }
5170*fae548d3Szrj 
5171*fae548d3Szrj   printf ("\n");
5172*fae548d3Szrj   return 1;
5173*fae548d3Szrj }
5174*fae548d3Szrj 
5175*fae548d3Szrj static int
display_debug_pubnames(struct dwarf_section * section,void * file)5176*fae548d3Szrj display_debug_pubnames (struct dwarf_section *section, void *file)
5177*fae548d3Szrj {
5178*fae548d3Szrj   return display_debug_pubnames_worker (section, file, 0);
5179*fae548d3Szrj }
5180*fae548d3Szrj 
5181*fae548d3Szrj static int
display_debug_gnu_pubnames(struct dwarf_section * section,void * file)5182*fae548d3Szrj display_debug_gnu_pubnames (struct dwarf_section *section, void *file)
5183*fae548d3Szrj {
5184*fae548d3Szrj   return display_debug_pubnames_worker (section, file, 1);
5185*fae548d3Szrj }
5186*fae548d3Szrj 
5187*fae548d3Szrj static int
display_debug_macinfo(struct dwarf_section * section,void * file ATTRIBUTE_UNUSED)5188*fae548d3Szrj display_debug_macinfo (struct dwarf_section *section,
5189*fae548d3Szrj 		       void *file ATTRIBUTE_UNUSED)
5190*fae548d3Szrj {
5191*fae548d3Szrj   unsigned char *start = section->start;
5192*fae548d3Szrj   unsigned char *end = start + section->size;
5193*fae548d3Szrj   unsigned char *curr = start;
5194*fae548d3Szrj   enum dwarf_macinfo_record_type op;
5195*fae548d3Szrj 
5196*fae548d3Szrj   introduce (section, FALSE);
5197*fae548d3Szrj 
5198*fae548d3Szrj   while (curr < end)
5199*fae548d3Szrj     {
5200*fae548d3Szrj       unsigned int lineno;
5201*fae548d3Szrj       const unsigned char *string;
5202*fae548d3Szrj 
5203*fae548d3Szrj       op = (enum dwarf_macinfo_record_type) *curr;
5204*fae548d3Szrj       curr++;
5205*fae548d3Szrj 
5206*fae548d3Szrj       switch (op)
5207*fae548d3Szrj 	{
5208*fae548d3Szrj 	case DW_MACINFO_start_file:
5209*fae548d3Szrj 	  {
5210*fae548d3Szrj 	    unsigned int filenum;
5211*fae548d3Szrj 
5212*fae548d3Szrj 	    READ_ULEB (lineno, curr, end);
5213*fae548d3Szrj 	    READ_ULEB (filenum, curr, end);
5214*fae548d3Szrj 	    printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
5215*fae548d3Szrj 		    lineno, filenum);
5216*fae548d3Szrj 	  }
5217*fae548d3Szrj 	  break;
5218*fae548d3Szrj 
5219*fae548d3Szrj 	case DW_MACINFO_end_file:
5220*fae548d3Szrj 	  printf (_(" DW_MACINFO_end_file\n"));
5221*fae548d3Szrj 	  break;
5222*fae548d3Szrj 
5223*fae548d3Szrj 	case DW_MACINFO_define:
5224*fae548d3Szrj 	  READ_ULEB (lineno, curr, end);
5225*fae548d3Szrj 	  string = curr;
5226*fae548d3Szrj 	  curr += strnlen ((char *) string, end - string) + 1;
5227*fae548d3Szrj 	  printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
5228*fae548d3Szrj 		  lineno, string);
5229*fae548d3Szrj 	  break;
5230*fae548d3Szrj 
5231*fae548d3Szrj 	case DW_MACINFO_undef:
5232*fae548d3Szrj 	  READ_ULEB (lineno, curr, end);
5233*fae548d3Szrj 	  string = curr;
5234*fae548d3Szrj 	  curr += strnlen ((char *) string, end - string) + 1;
5235*fae548d3Szrj 	  printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
5236*fae548d3Szrj 		  lineno, string);
5237*fae548d3Szrj 	  break;
5238*fae548d3Szrj 
5239*fae548d3Szrj 	case DW_MACINFO_vendor_ext:
5240*fae548d3Szrj 	  {
5241*fae548d3Szrj 	    unsigned int constant;
5242*fae548d3Szrj 
5243*fae548d3Szrj 	    READ_ULEB (constant, curr, end);
5244*fae548d3Szrj 	    string = curr;
5245*fae548d3Szrj 	    curr += strnlen ((char *) string, end - string) + 1;
5246*fae548d3Szrj 	    printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
5247*fae548d3Szrj 		    constant, string);
5248*fae548d3Szrj 	  }
5249*fae548d3Szrj 	  break;
5250*fae548d3Szrj 	}
5251*fae548d3Szrj     }
5252*fae548d3Szrj 
5253*fae548d3Szrj   return 1;
5254*fae548d3Szrj }
5255*fae548d3Szrj 
5256*fae548d3Szrj /* Given LINE_OFFSET into the .debug_line section, attempt to return
5257*fae548d3Szrj    filename and dirname corresponding to file name table entry with index
5258*fae548d3Szrj    FILEIDX.  Return NULL on failure.  */
5259*fae548d3Szrj 
5260*fae548d3Szrj static unsigned char *
get_line_filename_and_dirname(dwarf_vma line_offset,dwarf_vma fileidx,unsigned char ** dir_name)5261*fae548d3Szrj get_line_filename_and_dirname (dwarf_vma line_offset,
5262*fae548d3Szrj 			       dwarf_vma fileidx,
5263*fae548d3Szrj 			       unsigned char **dir_name)
5264*fae548d3Szrj {
5265*fae548d3Szrj   struct dwarf_section *section = &debug_displays [line].section;
5266*fae548d3Szrj   unsigned char *hdrptr, *dirtable, *file_name;
5267*fae548d3Szrj   unsigned int offset_size, initial_length_size;
5268*fae548d3Szrj   unsigned int version, opcode_base;
5269*fae548d3Szrj   dwarf_vma length, diridx;
5270*fae548d3Szrj   const unsigned char * end;
5271*fae548d3Szrj 
5272*fae548d3Szrj   *dir_name = NULL;
5273*fae548d3Szrj   if (section->start == NULL
5274*fae548d3Szrj       || line_offset >= section->size
5275*fae548d3Szrj       || fileidx == 0)
5276*fae548d3Szrj     return NULL;
5277*fae548d3Szrj 
5278*fae548d3Szrj   hdrptr = section->start + line_offset;
5279*fae548d3Szrj   end = section->start + section->size;
5280*fae548d3Szrj 
5281*fae548d3Szrj   SAFE_BYTE_GET_AND_INC (length, hdrptr, 4, end);
5282*fae548d3Szrj   if (length == 0xffffffff)
5283*fae548d3Szrj     {
5284*fae548d3Szrj       /* This section is 64-bit DWARF 3.  */
5285*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (length, hdrptr, 8, end);
5286*fae548d3Szrj       offset_size = 8;
5287*fae548d3Szrj       initial_length_size = 12;
5288*fae548d3Szrj     }
5289*fae548d3Szrj   else
5290*fae548d3Szrj     {
5291*fae548d3Szrj       offset_size = 4;
5292*fae548d3Szrj       initial_length_size = 4;
5293*fae548d3Szrj     }
5294*fae548d3Szrj   if (length + initial_length_size < length
5295*fae548d3Szrj       || length + initial_length_size > section->size)
5296*fae548d3Szrj     return NULL;
5297*fae548d3Szrj 
5298*fae548d3Szrj   SAFE_BYTE_GET_AND_INC (version, hdrptr, 2, end);
5299*fae548d3Szrj   if (version != 2 && version != 3 && version != 4)
5300*fae548d3Szrj     return NULL;
5301*fae548d3Szrj   hdrptr += offset_size + 1;/* Skip prologue_length and min_insn_length.  */
5302*fae548d3Szrj   if (version >= 4)
5303*fae548d3Szrj     hdrptr++;		    /* Skip max_ops_per_insn.  */
5304*fae548d3Szrj   hdrptr += 3;		    /* Skip default_is_stmt, line_base, line_range.  */
5305*fae548d3Szrj 
5306*fae548d3Szrj   SAFE_BYTE_GET_AND_INC (opcode_base, hdrptr, 1, end);
5307*fae548d3Szrj   if (opcode_base == 0)
5308*fae548d3Szrj     return NULL;
5309*fae548d3Szrj 
5310*fae548d3Szrj   hdrptr += opcode_base - 1;
5311*fae548d3Szrj   if (hdrptr >= end)
5312*fae548d3Szrj     return NULL;
5313*fae548d3Szrj 
5314*fae548d3Szrj   dirtable = hdrptr;
5315*fae548d3Szrj   /* Skip over dirname table.  */
5316*fae548d3Szrj   while (*hdrptr != '\0')
5317*fae548d3Szrj     {
5318*fae548d3Szrj       hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
5319*fae548d3Szrj       if (hdrptr >= end)
5320*fae548d3Szrj 	return NULL;
5321*fae548d3Szrj     }
5322*fae548d3Szrj   hdrptr++;		    /* Skip the NUL at the end of the table.  */
5323*fae548d3Szrj 
5324*fae548d3Szrj   /* Now skip over preceding filename table entries.  */
5325*fae548d3Szrj   for (; hdrptr < end && *hdrptr != '\0' && fileidx > 1; fileidx--)
5326*fae548d3Szrj     {
5327*fae548d3Szrj       hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
5328*fae548d3Szrj       SKIP_ULEB (hdrptr, end);
5329*fae548d3Szrj       SKIP_ULEB (hdrptr, end);
5330*fae548d3Szrj       SKIP_ULEB (hdrptr, end);
5331*fae548d3Szrj     }
5332*fae548d3Szrj   if (hdrptr >= end || *hdrptr == '\0')
5333*fae548d3Szrj     return NULL;
5334*fae548d3Szrj 
5335*fae548d3Szrj   file_name = hdrptr;
5336*fae548d3Szrj   hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1;
5337*fae548d3Szrj   if (hdrptr >= end)
5338*fae548d3Szrj     return NULL;
5339*fae548d3Szrj   READ_ULEB (diridx, hdrptr, end);
5340*fae548d3Szrj   if (diridx == 0)
5341*fae548d3Szrj     return file_name;
5342*fae548d3Szrj   for (; dirtable < end && *dirtable != '\0' && diridx > 1; diridx--)
5343*fae548d3Szrj     dirtable += strnlen ((char *) dirtable, end - dirtable) + 1;
5344*fae548d3Szrj   if (dirtable >= end || *dirtable == '\0')
5345*fae548d3Szrj     return NULL;
5346*fae548d3Szrj   *dir_name = dirtable;
5347*fae548d3Szrj   return file_name;
5348*fae548d3Szrj }
5349*fae548d3Szrj 
5350*fae548d3Szrj static int
display_debug_macro(struct dwarf_section * section,void * file)5351*fae548d3Szrj display_debug_macro (struct dwarf_section *section,
5352*fae548d3Szrj 		     void *file)
5353*fae548d3Szrj {
5354*fae548d3Szrj   unsigned char *start = section->start;
5355*fae548d3Szrj   unsigned char *end = start + section->size;
5356*fae548d3Szrj   unsigned char *curr = start;
5357*fae548d3Szrj   unsigned char *extended_op_buf[256];
5358*fae548d3Szrj 
5359*fae548d3Szrj   load_debug_section_with_follow (str, file);
5360*fae548d3Szrj   load_debug_section_with_follow (line, file);
5361*fae548d3Szrj 
5362*fae548d3Szrj   introduce (section, FALSE);
5363*fae548d3Szrj 
5364*fae548d3Szrj   while (curr < end)
5365*fae548d3Szrj     {
5366*fae548d3Szrj       unsigned int lineno, version, flags;
5367*fae548d3Szrj       unsigned int offset_size = 4;
5368*fae548d3Szrj       const unsigned char *string;
5369*fae548d3Szrj       dwarf_vma line_offset = 0, sec_offset = curr - start, offset;
5370*fae548d3Szrj       unsigned char **extended_ops = NULL;
5371*fae548d3Szrj 
5372*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (version, curr, 2, end);
5373*fae548d3Szrj       if (version != 4 && version != 5)
5374*fae548d3Szrj 	{
5375*fae548d3Szrj 	  error (_("Only GNU extension to DWARF 4 or 5 of %s is currently supported.\n"),
5376*fae548d3Szrj 		 section->name);
5377*fae548d3Szrj 	  return 0;
5378*fae548d3Szrj 	}
5379*fae548d3Szrj 
5380*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (flags, curr, 1, end);
5381*fae548d3Szrj       if (flags & 1)
5382*fae548d3Szrj 	offset_size = 8;
5383*fae548d3Szrj       printf (_("  Offset:                      0x%lx\n"),
5384*fae548d3Szrj 	      (unsigned long) sec_offset);
5385*fae548d3Szrj       printf (_("  Version:                     %d\n"), version);
5386*fae548d3Szrj       printf (_("  Offset size:                 %d\n"), offset_size);
5387*fae548d3Szrj       if (flags & 2)
5388*fae548d3Szrj 	{
5389*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (line_offset, curr, offset_size, end);
5390*fae548d3Szrj 	  printf (_("  Offset into .debug_line:     0x%lx\n"),
5391*fae548d3Szrj 		  (unsigned long) line_offset);
5392*fae548d3Szrj 	}
5393*fae548d3Szrj       if (flags & 4)
5394*fae548d3Szrj 	{
5395*fae548d3Szrj 	  unsigned int i, count, op;
5396*fae548d3Szrj 	  dwarf_vma nargs, n;
5397*fae548d3Szrj 
5398*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (count, curr, 1, end);
5399*fae548d3Szrj 
5400*fae548d3Szrj 	  memset (extended_op_buf, 0, sizeof (extended_op_buf));
5401*fae548d3Szrj 	  extended_ops = extended_op_buf;
5402*fae548d3Szrj 	  if (count)
5403*fae548d3Szrj 	    {
5404*fae548d3Szrj 	      printf (_("  Extension opcode arguments:\n"));
5405*fae548d3Szrj 	      for (i = 0; i < count; i++)
5406*fae548d3Szrj 		{
5407*fae548d3Szrj 		  SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
5408*fae548d3Szrj 		  extended_ops[op] = curr;
5409*fae548d3Szrj 		  READ_ULEB (nargs, curr, end);
5410*fae548d3Szrj 		  if (nargs == 0)
5411*fae548d3Szrj 		    printf (_("    DW_MACRO_%02x has no arguments\n"), op);
5412*fae548d3Szrj 		  else
5413*fae548d3Szrj 		    {
5414*fae548d3Szrj 		      printf (_("    DW_MACRO_%02x arguments: "), op);
5415*fae548d3Szrj 		      for (n = 0; n < nargs; n++)
5416*fae548d3Szrj 			{
5417*fae548d3Szrj 			  unsigned int form;
5418*fae548d3Szrj 
5419*fae548d3Szrj 			  SAFE_BYTE_GET_AND_INC (form, curr, 1, end);
5420*fae548d3Szrj 			  printf ("%s%s", get_FORM_name (form),
5421*fae548d3Szrj 				  n == nargs - 1 ? "\n" : ", ");
5422*fae548d3Szrj 			  switch (form)
5423*fae548d3Szrj 			    {
5424*fae548d3Szrj 			    case DW_FORM_data1:
5425*fae548d3Szrj 			    case DW_FORM_data2:
5426*fae548d3Szrj 			    case DW_FORM_data4:
5427*fae548d3Szrj 			    case DW_FORM_data8:
5428*fae548d3Szrj 			    case DW_FORM_sdata:
5429*fae548d3Szrj 			    case DW_FORM_udata:
5430*fae548d3Szrj 			    case DW_FORM_block:
5431*fae548d3Szrj 			    case DW_FORM_block1:
5432*fae548d3Szrj 			    case DW_FORM_block2:
5433*fae548d3Szrj 			    case DW_FORM_block4:
5434*fae548d3Szrj 			    case DW_FORM_flag:
5435*fae548d3Szrj 			    case DW_FORM_string:
5436*fae548d3Szrj 			    case DW_FORM_strp:
5437*fae548d3Szrj 			    case DW_FORM_sec_offset:
5438*fae548d3Szrj 			      break;
5439*fae548d3Szrj 			    default:
5440*fae548d3Szrj 			      error (_("Invalid extension opcode form %s\n"),
5441*fae548d3Szrj 				     get_FORM_name (form));
5442*fae548d3Szrj 			      return 0;
5443*fae548d3Szrj 			    }
5444*fae548d3Szrj 			}
5445*fae548d3Szrj 		    }
5446*fae548d3Szrj 		}
5447*fae548d3Szrj 	    }
5448*fae548d3Szrj 	}
5449*fae548d3Szrj       printf ("\n");
5450*fae548d3Szrj 
5451*fae548d3Szrj       while (1)
5452*fae548d3Szrj 	{
5453*fae548d3Szrj 	  unsigned int op;
5454*fae548d3Szrj 
5455*fae548d3Szrj 	  if (curr >= end)
5456*fae548d3Szrj 	    {
5457*fae548d3Szrj 	      error (_(".debug_macro section not zero terminated\n"));
5458*fae548d3Szrj 	      return 0;
5459*fae548d3Szrj 	    }
5460*fae548d3Szrj 
5461*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (op, curr, 1, end);
5462*fae548d3Szrj 	  if (op == 0)
5463*fae548d3Szrj 	    break;
5464*fae548d3Szrj 
5465*fae548d3Szrj 	  switch (op)
5466*fae548d3Szrj 	    {
5467*fae548d3Szrj 	    case DW_MACRO_start_file:
5468*fae548d3Szrj 	      {
5469*fae548d3Szrj 		unsigned int filenum;
5470*fae548d3Szrj 		unsigned char *file_name = NULL, *dir_name = NULL;
5471*fae548d3Szrj 
5472*fae548d3Szrj 		READ_ULEB (lineno, curr, end);
5473*fae548d3Szrj 		READ_ULEB (filenum, curr, end);
5474*fae548d3Szrj 
5475*fae548d3Szrj 		if ((flags & 2) == 0)
5476*fae548d3Szrj 		  error (_("DW_MACRO_start_file used, but no .debug_line offset provided.\n"));
5477*fae548d3Szrj 		else
5478*fae548d3Szrj 		  file_name
5479*fae548d3Szrj 		    = get_line_filename_and_dirname (line_offset, filenum,
5480*fae548d3Szrj 						     &dir_name);
5481*fae548d3Szrj 		if (file_name == NULL)
5482*fae548d3Szrj 		  printf (_(" DW_MACRO_start_file - lineno: %d filenum: %d\n"),
5483*fae548d3Szrj 			  lineno, filenum);
5484*fae548d3Szrj 		else
5485*fae548d3Szrj 		  printf (_(" DW_MACRO_start_file - lineno: %d filenum: %d filename: %s%s%s\n"),
5486*fae548d3Szrj 			  lineno, filenum,
5487*fae548d3Szrj 			  dir_name != NULL ? (const char *) dir_name : "",
5488*fae548d3Szrj 			  dir_name != NULL ? "/" : "", file_name);
5489*fae548d3Szrj 	      }
5490*fae548d3Szrj 	      break;
5491*fae548d3Szrj 
5492*fae548d3Szrj 	    case DW_MACRO_end_file:
5493*fae548d3Szrj 	      printf (_(" DW_MACRO_end_file\n"));
5494*fae548d3Szrj 	      break;
5495*fae548d3Szrj 
5496*fae548d3Szrj 	    case DW_MACRO_define:
5497*fae548d3Szrj 	      READ_ULEB (lineno, curr, end);
5498*fae548d3Szrj 	      string = curr;
5499*fae548d3Szrj 	      curr += strnlen ((char *) string, end - string) + 1;
5500*fae548d3Szrj 	      printf (_(" DW_MACRO_define - lineno : %d macro : %s\n"),
5501*fae548d3Szrj 		      lineno, string);
5502*fae548d3Szrj 	      break;
5503*fae548d3Szrj 
5504*fae548d3Szrj 	    case DW_MACRO_undef:
5505*fae548d3Szrj 	      READ_ULEB (lineno, curr, end);
5506*fae548d3Szrj 	      string = curr;
5507*fae548d3Szrj 	      curr += strnlen ((char *) string, end - string) + 1;
5508*fae548d3Szrj 	      printf (_(" DW_MACRO_undef - lineno : %d macro : %s\n"),
5509*fae548d3Szrj 		      lineno, string);
5510*fae548d3Szrj 	      break;
5511*fae548d3Szrj 
5512*fae548d3Szrj 	    case DW_MACRO_define_strp:
5513*fae548d3Szrj 	      READ_ULEB (lineno, curr, end);
5514*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
5515*fae548d3Szrj 	      string = fetch_indirect_string (offset);
5516*fae548d3Szrj 	      printf (_(" DW_MACRO_define_strp - lineno : %d macro : %s\n"),
5517*fae548d3Szrj 		      lineno, string);
5518*fae548d3Szrj 	      break;
5519*fae548d3Szrj 
5520*fae548d3Szrj 	    case DW_MACRO_undef_strp:
5521*fae548d3Szrj 	      READ_ULEB (lineno, curr, end);
5522*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
5523*fae548d3Szrj 	      string = fetch_indirect_string (offset);
5524*fae548d3Szrj 	      printf (_(" DW_MACRO_undef_strp - lineno : %d macro : %s\n"),
5525*fae548d3Szrj 		      lineno, string);
5526*fae548d3Szrj 	      break;
5527*fae548d3Szrj 
5528*fae548d3Szrj 	    case DW_MACRO_import:
5529*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
5530*fae548d3Szrj 	      printf (_(" DW_MACRO_import - offset : 0x%lx\n"),
5531*fae548d3Szrj 		      (unsigned long) offset);
5532*fae548d3Szrj 	      break;
5533*fae548d3Szrj 
5534*fae548d3Szrj 	    case DW_MACRO_define_sup:
5535*fae548d3Szrj 	      READ_ULEB (lineno, curr, end);
5536*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
5537*fae548d3Szrj 	      printf (_(" DW_MACRO_define_sup - lineno : %d macro offset : 0x%lx\n"),
5538*fae548d3Szrj 		      lineno, (unsigned long) offset);
5539*fae548d3Szrj 	      break;
5540*fae548d3Szrj 
5541*fae548d3Szrj 	    case DW_MACRO_undef_sup:
5542*fae548d3Szrj 	      READ_ULEB (lineno, curr, end);
5543*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
5544*fae548d3Szrj 	      printf (_(" DW_MACRO_undef_sup - lineno : %d macro offset : 0x%lx\n"),
5545*fae548d3Szrj 		      lineno, (unsigned long) offset);
5546*fae548d3Szrj 	      break;
5547*fae548d3Szrj 
5548*fae548d3Szrj 	    case DW_MACRO_import_sup:
5549*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end);
5550*fae548d3Szrj 	      printf (_(" DW_MACRO_import_sup - offset : 0x%lx\n"),
5551*fae548d3Szrj 		      (unsigned long) offset);
5552*fae548d3Szrj 	      break;
5553*fae548d3Szrj 
5554*fae548d3Szrj 	    default:
5555*fae548d3Szrj 	      if (extended_ops == NULL || extended_ops[op] == NULL)
5556*fae548d3Szrj 		{
5557*fae548d3Szrj 		  error (_(" Unknown macro opcode %02x seen\n"), op);
5558*fae548d3Szrj 		  return 0;
5559*fae548d3Szrj 		}
5560*fae548d3Szrj 	      else
5561*fae548d3Szrj 		{
5562*fae548d3Szrj 		  /* Skip over unhandled opcodes.  */
5563*fae548d3Szrj 		  dwarf_vma nargs, n;
5564*fae548d3Szrj 		  unsigned char *desc = extended_ops[op];
5565*fae548d3Szrj 		  READ_ULEB (nargs, desc, end);
5566*fae548d3Szrj 		  if (nargs == 0)
5567*fae548d3Szrj 		    {
5568*fae548d3Szrj 		      printf (_(" DW_MACRO_%02x\n"), op);
5569*fae548d3Szrj 		      break;
5570*fae548d3Szrj 		    }
5571*fae548d3Szrj 		  printf (_(" DW_MACRO_%02x -"), op);
5572*fae548d3Szrj 		  for (n = 0; n < nargs; n++)
5573*fae548d3Szrj 		    {
5574*fae548d3Szrj 		      int val;
5575*fae548d3Szrj 
5576*fae548d3Szrj 		      /* DW_FORM_implicit_const is not expected here.  */
5577*fae548d3Szrj 		      SAFE_BYTE_GET_AND_INC (val, desc, 1, end);
5578*fae548d3Szrj 		      curr
5579*fae548d3Szrj 			= read_and_display_attr_value (0, val, 0,
5580*fae548d3Szrj 						       start, curr, end, 0, 0, offset_size,
5581*fae548d3Szrj 						       version, NULL, 0, NULL,
5582*fae548d3Szrj 						       NULL, ' ', -1);
5583*fae548d3Szrj 		      if (n != nargs - 1)
5584*fae548d3Szrj 			printf (",");
5585*fae548d3Szrj 		    }
5586*fae548d3Szrj 		  printf ("\n");
5587*fae548d3Szrj 		}
5588*fae548d3Szrj 	      break;
5589*fae548d3Szrj 	    }
5590*fae548d3Szrj 	}
5591*fae548d3Szrj 
5592*fae548d3Szrj       printf ("\n");
5593*fae548d3Szrj     }
5594*fae548d3Szrj 
5595*fae548d3Szrj   return 1;
5596*fae548d3Szrj }
5597*fae548d3Szrj 
5598*fae548d3Szrj static int
display_debug_abbrev(struct dwarf_section * section,void * file ATTRIBUTE_UNUSED)5599*fae548d3Szrj display_debug_abbrev (struct dwarf_section *section,
5600*fae548d3Szrj 		      void *file ATTRIBUTE_UNUSED)
5601*fae548d3Szrj {
5602*fae548d3Szrj   abbrev_entry *entry;
5603*fae548d3Szrj   unsigned char *start = section->start;
5604*fae548d3Szrj   unsigned char *end = start + section->size;
5605*fae548d3Szrj 
5606*fae548d3Szrj   introduce (section, FALSE);
5607*fae548d3Szrj 
5608*fae548d3Szrj   do
5609*fae548d3Szrj     {
5610*fae548d3Szrj       unsigned char *last;
5611*fae548d3Szrj 
5612*fae548d3Szrj       free_abbrevs ();
5613*fae548d3Szrj 
5614*fae548d3Szrj       last = start;
5615*fae548d3Szrj       start = process_abbrev_section (start, end);
5616*fae548d3Szrj 
5617*fae548d3Szrj       if (first_abbrev == NULL)
5618*fae548d3Szrj 	continue;
5619*fae548d3Szrj 
5620*fae548d3Szrj       printf (_("  Number TAG (0x%lx)\n"), (long) (last - section->start));
5621*fae548d3Szrj 
5622*fae548d3Szrj       for (entry = first_abbrev; entry; entry = entry->next)
5623*fae548d3Szrj 	{
5624*fae548d3Szrj 	  abbrev_attr *attr;
5625*fae548d3Szrj 
5626*fae548d3Szrj 	  printf ("   %ld      %s    [%s]\n",
5627*fae548d3Szrj 		  entry->entry,
5628*fae548d3Szrj 		  get_TAG_name (entry->tag),
5629*fae548d3Szrj 		  entry->children ? _("has children") : _("no children"));
5630*fae548d3Szrj 
5631*fae548d3Szrj 	  for (attr = entry->first_attr; attr; attr = attr->next)
5632*fae548d3Szrj 	    {
5633*fae548d3Szrj 	      printf ("    %-18s %s",
5634*fae548d3Szrj 		      get_AT_name (attr->attribute),
5635*fae548d3Szrj 		      get_FORM_name (attr->form));
5636*fae548d3Szrj 	      if (attr->form == DW_FORM_implicit_const)
5637*fae548d3Szrj 		printf (": %" BFD_VMA_FMT "d", attr->implicit_const);
5638*fae548d3Szrj 	      putchar ('\n');
5639*fae548d3Szrj 	    }
5640*fae548d3Szrj 	}
5641*fae548d3Szrj     }
5642*fae548d3Szrj   while (start);
5643*fae548d3Szrj 
5644*fae548d3Szrj   printf ("\n");
5645*fae548d3Szrj 
5646*fae548d3Szrj   return 1;
5647*fae548d3Szrj }
5648*fae548d3Szrj 
5649*fae548d3Szrj /* Return true when ADDR is the maximum address, when addresses are
5650*fae548d3Szrj    POINTER_SIZE bytes long.  */
5651*fae548d3Szrj 
5652*fae548d3Szrj static bfd_boolean
is_max_address(dwarf_vma addr,unsigned int pointer_size)5653*fae548d3Szrj is_max_address (dwarf_vma addr, unsigned int pointer_size)
5654*fae548d3Szrj {
5655*fae548d3Szrj   dwarf_vma mask = ~(~(dwarf_vma) 1 << (pointer_size * 8 - 1));
5656*fae548d3Szrj   return ((addr & mask) == mask);
5657*fae548d3Szrj }
5658*fae548d3Szrj 
5659*fae548d3Szrj /* Display a view pair list starting at *VSTART_PTR and ending at
5660*fae548d3Szrj    VLISTEND within SECTION.  */
5661*fae548d3Szrj 
5662*fae548d3Szrj static void
display_view_pair_list(struct dwarf_section * section,unsigned char ** vstart_ptr,unsigned int debug_info_entry,unsigned char * vlistend)5663*fae548d3Szrj display_view_pair_list (struct dwarf_section *section,
5664*fae548d3Szrj 			unsigned char **vstart_ptr,
5665*fae548d3Szrj 			unsigned int debug_info_entry,
5666*fae548d3Szrj 			unsigned char *vlistend)
5667*fae548d3Szrj {
5668*fae548d3Szrj   unsigned char *vstart = *vstart_ptr;
5669*fae548d3Szrj   unsigned char *section_end = section->start + section->size;
5670*fae548d3Szrj   unsigned int pointer_size = debug_information [debug_info_entry].pointer_size;
5671*fae548d3Szrj 
5672*fae548d3Szrj   if (vlistend < section_end)
5673*fae548d3Szrj     section_end = vlistend;
5674*fae548d3Szrj 
5675*fae548d3Szrj   putchar ('\n');
5676*fae548d3Szrj 
5677*fae548d3Szrj   while (vstart < section_end)
5678*fae548d3Szrj     {
5679*fae548d3Szrj       dwarf_vma off = vstart - section->start;
5680*fae548d3Szrj       dwarf_vma vbegin, vend;
5681*fae548d3Szrj 
5682*fae548d3Szrj       READ_ULEB (vbegin, vstart, section_end);
5683*fae548d3Szrj       if (vstart == section_end)
5684*fae548d3Szrj 	break;
5685*fae548d3Szrj 
5686*fae548d3Szrj       READ_ULEB (vend, vstart, section_end);
5687*fae548d3Szrj       printf ("    %8.8lx ", (unsigned long) off);
5688*fae548d3Szrj 
5689*fae548d3Szrj       print_dwarf_view (vbegin, pointer_size, 1);
5690*fae548d3Szrj       print_dwarf_view (vend, pointer_size, 1);
5691*fae548d3Szrj       printf (_("location view pair\n"));
5692*fae548d3Szrj     }
5693*fae548d3Szrj 
5694*fae548d3Szrj   putchar ('\n');
5695*fae548d3Szrj   *vstart_ptr = vstart;
5696*fae548d3Szrj }
5697*fae548d3Szrj 
5698*fae548d3Szrj /* Display a location list from a normal (ie, non-dwo) .debug_loc section.  */
5699*fae548d3Szrj 
5700*fae548d3Szrj 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)5701*fae548d3Szrj display_loc_list (struct dwarf_section *section,
5702*fae548d3Szrj 		  unsigned char **start_ptr,
5703*fae548d3Szrj 		  unsigned int debug_info_entry,
5704*fae548d3Szrj 		  dwarf_vma offset,
5705*fae548d3Szrj 		  dwarf_vma base_address,
5706*fae548d3Szrj 		  unsigned char **vstart_ptr,
5707*fae548d3Szrj 		  int has_frame_base)
5708*fae548d3Szrj {
5709*fae548d3Szrj   unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
5710*fae548d3Szrj   unsigned char *section_end = section->start + section->size;
5711*fae548d3Szrj   unsigned long cu_offset;
5712*fae548d3Szrj   unsigned int pointer_size;
5713*fae548d3Szrj   unsigned int offset_size;
5714*fae548d3Szrj   int dwarf_version;
5715*fae548d3Szrj 
5716*fae548d3Szrj   dwarf_vma begin;
5717*fae548d3Szrj   dwarf_vma end;
5718*fae548d3Szrj   unsigned short length;
5719*fae548d3Szrj   int need_frame_base;
5720*fae548d3Szrj 
5721*fae548d3Szrj   if (debug_info_entry >= num_debug_info_entries)
5722*fae548d3Szrj     {
5723*fae548d3Szrj       warn (_("No debug information available for loc lists of entry: %u\n"),
5724*fae548d3Szrj 	    debug_info_entry);
5725*fae548d3Szrj       return;
5726*fae548d3Szrj     }
5727*fae548d3Szrj 
5728*fae548d3Szrj   cu_offset = debug_information [debug_info_entry].cu_offset;
5729*fae548d3Szrj   pointer_size = debug_information [debug_info_entry].pointer_size;
5730*fae548d3Szrj   offset_size = debug_information [debug_info_entry].offset_size;
5731*fae548d3Szrj   dwarf_version = debug_information [debug_info_entry].dwarf_version;
5732*fae548d3Szrj 
5733*fae548d3Szrj   if (pointer_size < 2 || pointer_size > 8)
5734*fae548d3Szrj     {
5735*fae548d3Szrj       warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
5736*fae548d3Szrj 	    pointer_size, debug_info_entry);
5737*fae548d3Szrj       return;
5738*fae548d3Szrj     }
5739*fae548d3Szrj 
5740*fae548d3Szrj   while (1)
5741*fae548d3Szrj     {
5742*fae548d3Szrj       dwarf_vma off = offset + (start - *start_ptr);
5743*fae548d3Szrj       dwarf_vma vbegin = vm1, vend = vm1;
5744*fae548d3Szrj 
5745*fae548d3Szrj       if (start + 2 * pointer_size > section_end)
5746*fae548d3Szrj 	{
5747*fae548d3Szrj 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5748*fae548d3Szrj 		(unsigned long) offset);
5749*fae548d3Szrj 	  break;
5750*fae548d3Szrj 	}
5751*fae548d3Szrj 
5752*fae548d3Szrj       printf ("    %8.8lx ", (unsigned long) off);
5753*fae548d3Szrj 
5754*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
5755*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
5756*fae548d3Szrj 
5757*fae548d3Szrj       if (begin == 0 && end == 0)
5758*fae548d3Szrj 	{
5759*fae548d3Szrj 	  /* PR 18374: In a object file we can have a location list that
5760*fae548d3Szrj 	     starts with a begin and end of 0 because there are relocations
5761*fae548d3Szrj 	     that need to be applied to the addresses.  Actually applying
5762*fae548d3Szrj 	     the relocations now does not help as they will probably resolve
5763*fae548d3Szrj 	     to 0, since the object file has not been fully linked.  Real
5764*fae548d3Szrj 	     end of list markers will not have any relocations against them.  */
5765*fae548d3Szrj 	  if (! reloc_at (section, off)
5766*fae548d3Szrj 	      && ! reloc_at (section, off + pointer_size))
5767*fae548d3Szrj 	    {
5768*fae548d3Szrj 	      printf (_("<End of list>\n"));
5769*fae548d3Szrj 	      break;
5770*fae548d3Szrj 	    }
5771*fae548d3Szrj 	}
5772*fae548d3Szrj 
5773*fae548d3Szrj       /* Check base address specifiers.  */
5774*fae548d3Szrj       if (is_max_address (begin, pointer_size)
5775*fae548d3Szrj           && !is_max_address (end, pointer_size))
5776*fae548d3Szrj 	{
5777*fae548d3Szrj 	  base_address = end;
5778*fae548d3Szrj 	  print_dwarf_vma (begin, pointer_size);
5779*fae548d3Szrj 	  print_dwarf_vma (end, pointer_size);
5780*fae548d3Szrj 	  printf (_("(base address)\n"));
5781*fae548d3Szrj 	  continue;
5782*fae548d3Szrj 	}
5783*fae548d3Szrj 
5784*fae548d3Szrj       if (vstart)
5785*fae548d3Szrj 	{
5786*fae548d3Szrj 	  off = offset + (vstart - *start_ptr);
5787*fae548d3Szrj 
5788*fae548d3Szrj 	  READ_ULEB (vbegin, vstart, section_end);
5789*fae548d3Szrj 	  print_dwarf_view (vbegin, pointer_size, 1);
5790*fae548d3Szrj 
5791*fae548d3Szrj 	  READ_ULEB (vend, vstart, section_end);
5792*fae548d3Szrj 	  print_dwarf_view (vend, pointer_size, 1);
5793*fae548d3Szrj 
5794*fae548d3Szrj 	  printf (_("views at %8.8lx for:\n    %*s "),
5795*fae548d3Szrj 		  (unsigned long) off, 8, "");
5796*fae548d3Szrj 	}
5797*fae548d3Szrj 
5798*fae548d3Szrj       if (start + 2 > section_end)
5799*fae548d3Szrj 	{
5800*fae548d3Szrj 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5801*fae548d3Szrj 		(unsigned long) offset);
5802*fae548d3Szrj 	  break;
5803*fae548d3Szrj 	}
5804*fae548d3Szrj 
5805*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
5806*fae548d3Szrj 
5807*fae548d3Szrj       if (start + length > section_end)
5808*fae548d3Szrj 	{
5809*fae548d3Szrj 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5810*fae548d3Szrj 		(unsigned long) offset);
5811*fae548d3Szrj 	  break;
5812*fae548d3Szrj 	}
5813*fae548d3Szrj 
5814*fae548d3Szrj       print_dwarf_vma (begin + base_address, pointer_size);
5815*fae548d3Szrj       print_dwarf_vma (end + base_address, pointer_size);
5816*fae548d3Szrj 
5817*fae548d3Szrj       putchar ('(');
5818*fae548d3Szrj       need_frame_base = decode_location_expression (start,
5819*fae548d3Szrj 						    pointer_size,
5820*fae548d3Szrj 						    offset_size,
5821*fae548d3Szrj 						    dwarf_version,
5822*fae548d3Szrj 						    length,
5823*fae548d3Szrj 						    cu_offset, section);
5824*fae548d3Szrj       putchar (')');
5825*fae548d3Szrj 
5826*fae548d3Szrj       if (need_frame_base && !has_frame_base)
5827*fae548d3Szrj 	printf (_(" [without DW_AT_frame_base]"));
5828*fae548d3Szrj 
5829*fae548d3Szrj       if (begin == end && vbegin == vend)
5830*fae548d3Szrj 	fputs (_(" (start == end)"), stdout);
5831*fae548d3Szrj       else if (begin > end || (begin == end && vbegin > vend))
5832*fae548d3Szrj 	fputs (_(" (start > end)"), stdout);
5833*fae548d3Szrj 
5834*fae548d3Szrj       putchar ('\n');
5835*fae548d3Szrj 
5836*fae548d3Szrj       start += length;
5837*fae548d3Szrj     }
5838*fae548d3Szrj 
5839*fae548d3Szrj   *start_ptr = start;
5840*fae548d3Szrj   *vstart_ptr = vstart;
5841*fae548d3Szrj }
5842*fae548d3Szrj 
5843*fae548d3Szrj /* Display a location list from a normal (ie, non-dwo) .debug_loclists section.  */
5844*fae548d3Szrj 
5845*fae548d3Szrj 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)5846*fae548d3Szrj display_loclists_list (struct dwarf_section *section,
5847*fae548d3Szrj 		       unsigned char **start_ptr,
5848*fae548d3Szrj 		       unsigned int debug_info_entry,
5849*fae548d3Szrj 		       dwarf_vma offset,
5850*fae548d3Szrj 		       dwarf_vma base_address,
5851*fae548d3Szrj 		       unsigned char **vstart_ptr,
5852*fae548d3Szrj 		       int has_frame_base)
5853*fae548d3Szrj {
5854*fae548d3Szrj   unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
5855*fae548d3Szrj   unsigned char *section_end = section->start + section->size;
5856*fae548d3Szrj   unsigned long cu_offset;
5857*fae548d3Szrj   unsigned int pointer_size;
5858*fae548d3Szrj   unsigned int offset_size;
5859*fae548d3Szrj   int dwarf_version;
5860*fae548d3Szrj 
5861*fae548d3Szrj   /* Initialize it due to a false compiler warning.  */
5862*fae548d3Szrj   dwarf_vma begin = -1, vbegin = -1;
5863*fae548d3Szrj   dwarf_vma end = -1, vend = -1;
5864*fae548d3Szrj   dwarf_vma length;
5865*fae548d3Szrj   int need_frame_base;
5866*fae548d3Szrj 
5867*fae548d3Szrj   if (debug_info_entry >= num_debug_info_entries)
5868*fae548d3Szrj     {
5869*fae548d3Szrj       warn (_("No debug information available for "
5870*fae548d3Szrj 	      "loclists lists of entry: %u\n"),
5871*fae548d3Szrj 	    debug_info_entry);
5872*fae548d3Szrj       return;
5873*fae548d3Szrj     }
5874*fae548d3Szrj 
5875*fae548d3Szrj   cu_offset = debug_information [debug_info_entry].cu_offset;
5876*fae548d3Szrj   pointer_size = debug_information [debug_info_entry].pointer_size;
5877*fae548d3Szrj   offset_size = debug_information [debug_info_entry].offset_size;
5878*fae548d3Szrj   dwarf_version = debug_information [debug_info_entry].dwarf_version;
5879*fae548d3Szrj 
5880*fae548d3Szrj   if (pointer_size < 2 || pointer_size > 8)
5881*fae548d3Szrj     {
5882*fae548d3Szrj       warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
5883*fae548d3Szrj 	    pointer_size, debug_info_entry);
5884*fae548d3Szrj       return;
5885*fae548d3Szrj     }
5886*fae548d3Szrj 
5887*fae548d3Szrj   while (1)
5888*fae548d3Szrj     {
5889*fae548d3Szrj       dwarf_vma off = offset + (start - *start_ptr);
5890*fae548d3Szrj       enum dwarf_location_list_entry_type llet;
5891*fae548d3Szrj 
5892*fae548d3Szrj       if (start + 1 > section_end)
5893*fae548d3Szrj 	{
5894*fae548d3Szrj 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5895*fae548d3Szrj 		(unsigned long) offset);
5896*fae548d3Szrj 	  break;
5897*fae548d3Szrj 	}
5898*fae548d3Szrj 
5899*fae548d3Szrj       printf ("    %8.8lx ", (unsigned long) off);
5900*fae548d3Szrj 
5901*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (llet, start, 1, section_end);
5902*fae548d3Szrj 
5903*fae548d3Szrj       if (vstart && llet == DW_LLE_offset_pair)
5904*fae548d3Szrj 	{
5905*fae548d3Szrj 	  off = offset + (vstart - *start_ptr);
5906*fae548d3Szrj 
5907*fae548d3Szrj 	  READ_ULEB (vbegin, vstart, section_end);
5908*fae548d3Szrj 	  print_dwarf_view (vbegin, pointer_size, 1);
5909*fae548d3Szrj 
5910*fae548d3Szrj 	  READ_ULEB (vend, vstart, section_end);
5911*fae548d3Szrj 	  print_dwarf_view (vend, pointer_size, 1);
5912*fae548d3Szrj 
5913*fae548d3Szrj 	  printf (_("views at %8.8lx for:\n    %*s "),
5914*fae548d3Szrj 		  (unsigned long) off, 8, "");
5915*fae548d3Szrj 	}
5916*fae548d3Szrj 
5917*fae548d3Szrj       switch (llet)
5918*fae548d3Szrj 	{
5919*fae548d3Szrj 	case DW_LLE_end_of_list:
5920*fae548d3Szrj 	  printf (_("<End of list>\n"));
5921*fae548d3Szrj 	  break;
5922*fae548d3Szrj 	case DW_LLE_offset_pair:
5923*fae548d3Szrj 	  READ_ULEB (begin, start, section_end);
5924*fae548d3Szrj 	  READ_ULEB (end, start, section_end);
5925*fae548d3Szrj 	  break;
5926*fae548d3Szrj 	case DW_LLE_base_address:
5927*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size,
5928*fae548d3Szrj 				 section_end);
5929*fae548d3Szrj 	  print_dwarf_vma (base_address, pointer_size);
5930*fae548d3Szrj 	  printf (_("(base address)\n"));
5931*fae548d3Szrj 	  break;
5932*fae548d3Szrj #ifdef DW_LLE_view_pair
5933*fae548d3Szrj 	case DW_LLE_view_pair:
5934*fae548d3Szrj 	  if (vstart)
5935*fae548d3Szrj 	    printf (_("View pair entry in loclist with locviews attribute\n"));
5936*fae548d3Szrj 	  READ_ULEB (vbegin, start, section_end);
5937*fae548d3Szrj 	  print_dwarf_view (vbegin, pointer_size, 1);
5938*fae548d3Szrj 
5939*fae548d3Szrj 	  READ_ULEB (vend, start, section_end);
5940*fae548d3Szrj 	  print_dwarf_view (vend, pointer_size, 1);
5941*fae548d3Szrj 
5942*fae548d3Szrj 	  printf (_("views for:\n"));
5943*fae548d3Szrj 	  continue;
5944*fae548d3Szrj #endif
5945*fae548d3Szrj 	default:
5946*fae548d3Szrj 	  error (_("Invalid location list entry type %d\n"), llet);
5947*fae548d3Szrj 	  return;
5948*fae548d3Szrj 	}
5949*fae548d3Szrj       if (llet == DW_LLE_end_of_list)
5950*fae548d3Szrj 	break;
5951*fae548d3Szrj       if (llet != DW_LLE_offset_pair)
5952*fae548d3Szrj 	continue;
5953*fae548d3Szrj 
5954*fae548d3Szrj       if (start + 2 > section_end)
5955*fae548d3Szrj 	{
5956*fae548d3Szrj 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
5957*fae548d3Szrj 		(unsigned long) offset);
5958*fae548d3Szrj 	  break;
5959*fae548d3Szrj 	}
5960*fae548d3Szrj 
5961*fae548d3Szrj       READ_ULEB (length, start, section_end);
5962*fae548d3Szrj 
5963*fae548d3Szrj       print_dwarf_vma (begin + base_address, pointer_size);
5964*fae548d3Szrj       print_dwarf_vma (end + base_address, pointer_size);
5965*fae548d3Szrj 
5966*fae548d3Szrj       putchar ('(');
5967*fae548d3Szrj       need_frame_base = decode_location_expression (start,
5968*fae548d3Szrj 						    pointer_size,
5969*fae548d3Szrj 						    offset_size,
5970*fae548d3Szrj 						    dwarf_version,
5971*fae548d3Szrj 						    length,
5972*fae548d3Szrj 						    cu_offset, section);
5973*fae548d3Szrj       putchar (')');
5974*fae548d3Szrj 
5975*fae548d3Szrj       if (need_frame_base && !has_frame_base)
5976*fae548d3Szrj 	printf (_(" [without DW_AT_frame_base]"));
5977*fae548d3Szrj 
5978*fae548d3Szrj       if (begin == end && vbegin == vend)
5979*fae548d3Szrj 	fputs (_(" (start == end)"), stdout);
5980*fae548d3Szrj       else if (begin > end || (begin == end && vbegin > vend))
5981*fae548d3Szrj 	fputs (_(" (start > end)"), stdout);
5982*fae548d3Szrj 
5983*fae548d3Szrj       putchar ('\n');
5984*fae548d3Szrj 
5985*fae548d3Szrj       start += length;
5986*fae548d3Szrj       vbegin = vend = -1;
5987*fae548d3Szrj     }
5988*fae548d3Szrj 
5989*fae548d3Szrj   if (vbegin != vm1 || vend != vm1)
5990*fae548d3Szrj     printf (_("Trailing view pair not used in a range"));
5991*fae548d3Szrj 
5992*fae548d3Szrj   *start_ptr = start;
5993*fae548d3Szrj   *vstart_ptr = vstart;
5994*fae548d3Szrj }
5995*fae548d3Szrj 
5996*fae548d3Szrj /* Print a .debug_addr table index in decimal, surrounded by square brackets,
5997*fae548d3Szrj    right-adjusted in a field of length LEN, and followed by a space.  */
5998*fae548d3Szrj 
5999*fae548d3Szrj static void
print_addr_index(unsigned int idx,unsigned int len)6000*fae548d3Szrj print_addr_index (unsigned int idx, unsigned int len)
6001*fae548d3Szrj {
6002*fae548d3Szrj   static char buf[15];
6003*fae548d3Szrj   snprintf (buf, sizeof (buf), "[%d]", idx);
6004*fae548d3Szrj   printf ("%*s ", len, buf);
6005*fae548d3Szrj }
6006*fae548d3Szrj 
6007*fae548d3Szrj /* Display a location list from a .dwo section. It uses address indexes rather
6008*fae548d3Szrj    than embedded addresses.  This code closely follows display_loc_list, but the
6009*fae548d3Szrj    two are sufficiently different that combining things is very ugly.  */
6010*fae548d3Szrj 
6011*fae548d3Szrj 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)6012*fae548d3Szrj display_loc_list_dwo (struct dwarf_section *section,
6013*fae548d3Szrj 		      unsigned char **start_ptr,
6014*fae548d3Szrj 		      unsigned int debug_info_entry,
6015*fae548d3Szrj 		      dwarf_vma offset,
6016*fae548d3Szrj 		      unsigned char **vstart_ptr,
6017*fae548d3Szrj 		      int has_frame_base)
6018*fae548d3Szrj {
6019*fae548d3Szrj   unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
6020*fae548d3Szrj   unsigned char *section_end = section->start + section->size;
6021*fae548d3Szrj   unsigned long cu_offset;
6022*fae548d3Szrj   unsigned int pointer_size;
6023*fae548d3Szrj   unsigned int offset_size;
6024*fae548d3Szrj   int dwarf_version;
6025*fae548d3Szrj   int entry_type;
6026*fae548d3Szrj   unsigned short length;
6027*fae548d3Szrj   int need_frame_base;
6028*fae548d3Szrj   unsigned int idx;
6029*fae548d3Szrj 
6030*fae548d3Szrj   if (debug_info_entry >= num_debug_info_entries)
6031*fae548d3Szrj     {
6032*fae548d3Szrj       warn (_("No debug information for loc lists of entry: %u\n"),
6033*fae548d3Szrj 	    debug_info_entry);
6034*fae548d3Szrj       return;
6035*fae548d3Szrj     }
6036*fae548d3Szrj 
6037*fae548d3Szrj   cu_offset = debug_information [debug_info_entry].cu_offset;
6038*fae548d3Szrj   pointer_size = debug_information [debug_info_entry].pointer_size;
6039*fae548d3Szrj   offset_size = debug_information [debug_info_entry].offset_size;
6040*fae548d3Szrj   dwarf_version = debug_information [debug_info_entry].dwarf_version;
6041*fae548d3Szrj 
6042*fae548d3Szrj   if (pointer_size < 2 || pointer_size > 8)
6043*fae548d3Szrj     {
6044*fae548d3Szrj       warn (_("Invalid pointer size (%d) in debug info for entry %d\n"),
6045*fae548d3Szrj 	    pointer_size, debug_info_entry);
6046*fae548d3Szrj       return;
6047*fae548d3Szrj     }
6048*fae548d3Szrj 
6049*fae548d3Szrj   while (1)
6050*fae548d3Szrj     {
6051*fae548d3Szrj       printf ("    %8.8lx ", (unsigned long) (offset + (start - *start_ptr)));
6052*fae548d3Szrj 
6053*fae548d3Szrj       if (start >= section_end)
6054*fae548d3Szrj 	{
6055*fae548d3Szrj 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6056*fae548d3Szrj 		(unsigned long) offset);
6057*fae548d3Szrj 	  break;
6058*fae548d3Szrj 	}
6059*fae548d3Szrj 
6060*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (entry_type, start, 1, section_end);
6061*fae548d3Szrj 
6062*fae548d3Szrj       if (vstart)
6063*fae548d3Szrj 	switch (entry_type)
6064*fae548d3Szrj 	  {
6065*fae548d3Szrj 	  default:
6066*fae548d3Szrj 	    break;
6067*fae548d3Szrj 
6068*fae548d3Szrj 	  case 2:
6069*fae548d3Szrj 	  case 3:
6070*fae548d3Szrj 	  case 4:
6071*fae548d3Szrj 	    {
6072*fae548d3Szrj 	      dwarf_vma view;
6073*fae548d3Szrj 	      dwarf_vma off = offset + (vstart - *start_ptr);
6074*fae548d3Szrj 
6075*fae548d3Szrj 	      READ_ULEB (view, vstart, section_end);
6076*fae548d3Szrj 	      print_dwarf_view (view, 8, 1);
6077*fae548d3Szrj 
6078*fae548d3Szrj 	      READ_ULEB (view, vstart, section_end);
6079*fae548d3Szrj 	      print_dwarf_view (view, 8, 1);
6080*fae548d3Szrj 
6081*fae548d3Szrj 	      printf (_("views at %8.8lx for:\n    %*s "),
6082*fae548d3Szrj 		      (unsigned long) off, 8, "");
6083*fae548d3Szrj 
6084*fae548d3Szrj 	    }
6085*fae548d3Szrj 	    break;
6086*fae548d3Szrj 	  }
6087*fae548d3Szrj 
6088*fae548d3Szrj       switch (entry_type)
6089*fae548d3Szrj 	{
6090*fae548d3Szrj 	case 0: /* A terminating entry.  */
6091*fae548d3Szrj 	  *start_ptr = start;
6092*fae548d3Szrj 	  *vstart_ptr = vstart;
6093*fae548d3Szrj 	  printf (_("<End of list>\n"));
6094*fae548d3Szrj 	  return;
6095*fae548d3Szrj 	case 1: /* A base-address entry.  */
6096*fae548d3Szrj 	  READ_ULEB (idx, start, section_end);
6097*fae548d3Szrj 	  print_addr_index (idx, 8);
6098*fae548d3Szrj 	  printf ("%*s", 9 + (vstart ? 2 * 6 : 0), "");
6099*fae548d3Szrj 	  printf (_("(base address selection entry)\n"));
6100*fae548d3Szrj 	  continue;
6101*fae548d3Szrj 	case 2: /* A start/end entry.  */
6102*fae548d3Szrj 	  READ_ULEB (idx, start, section_end);
6103*fae548d3Szrj 	  print_addr_index (idx, 8);
6104*fae548d3Szrj 	  READ_ULEB (idx, start, section_end);
6105*fae548d3Szrj 	  print_addr_index (idx, 8);
6106*fae548d3Szrj 	  break;
6107*fae548d3Szrj 	case 3: /* A start/length entry.  */
6108*fae548d3Szrj 	  READ_ULEB (idx, start, section_end);
6109*fae548d3Szrj 	  print_addr_index (idx, 8);
6110*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
6111*fae548d3Szrj 	  printf ("%08x ", idx);
6112*fae548d3Szrj 	  break;
6113*fae548d3Szrj 	case 4: /* An offset pair entry.  */
6114*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
6115*fae548d3Szrj 	  printf ("%08x ", idx);
6116*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end);
6117*fae548d3Szrj 	  printf ("%08x ", idx);
6118*fae548d3Szrj 	  break;
6119*fae548d3Szrj 	default:
6120*fae548d3Szrj 	  warn (_("Unknown location list entry type 0x%x.\n"), entry_type);
6121*fae548d3Szrj 	  *start_ptr = start;
6122*fae548d3Szrj 	  *vstart_ptr = vstart;
6123*fae548d3Szrj 	  return;
6124*fae548d3Szrj 	}
6125*fae548d3Szrj 
6126*fae548d3Szrj       if (start + 2 > section_end)
6127*fae548d3Szrj 	{
6128*fae548d3Szrj 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6129*fae548d3Szrj 		(unsigned long) offset);
6130*fae548d3Szrj 	  break;
6131*fae548d3Szrj 	}
6132*fae548d3Szrj 
6133*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (length, start, 2, section_end);
6134*fae548d3Szrj       if (start + length > section_end)
6135*fae548d3Szrj 	{
6136*fae548d3Szrj 	  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
6137*fae548d3Szrj 		(unsigned long) offset);
6138*fae548d3Szrj 	  break;
6139*fae548d3Szrj 	}
6140*fae548d3Szrj 
6141*fae548d3Szrj       putchar ('(');
6142*fae548d3Szrj       need_frame_base = decode_location_expression (start,
6143*fae548d3Szrj 						    pointer_size,
6144*fae548d3Szrj 						    offset_size,
6145*fae548d3Szrj 						    dwarf_version,
6146*fae548d3Szrj 						    length,
6147*fae548d3Szrj 						    cu_offset, section);
6148*fae548d3Szrj       putchar (')');
6149*fae548d3Szrj 
6150*fae548d3Szrj       if (need_frame_base && !has_frame_base)
6151*fae548d3Szrj 	printf (_(" [without DW_AT_frame_base]"));
6152*fae548d3Szrj 
6153*fae548d3Szrj       putchar ('\n');
6154*fae548d3Szrj 
6155*fae548d3Szrj       start += length;
6156*fae548d3Szrj     }
6157*fae548d3Szrj 
6158*fae548d3Szrj   *start_ptr = start;
6159*fae548d3Szrj   *vstart_ptr = vstart;
6160*fae548d3Szrj }
6161*fae548d3Szrj 
6162*fae548d3Szrj /* Sort array of indexes in ascending order of loc_offsets[idx] and
6163*fae548d3Szrj    loc_views.  */
6164*fae548d3Szrj 
6165*fae548d3Szrj static dwarf_vma *loc_offsets, *loc_views;
6166*fae548d3Szrj 
6167*fae548d3Szrj static int
loc_offsets_compar(const void * ap,const void * bp)6168*fae548d3Szrj loc_offsets_compar (const void *ap, const void *bp)
6169*fae548d3Szrj {
6170*fae548d3Szrj   dwarf_vma a = loc_offsets[*(const unsigned int *) ap];
6171*fae548d3Szrj   dwarf_vma b = loc_offsets[*(const unsigned int *) bp];
6172*fae548d3Szrj 
6173*fae548d3Szrj   int ret = (a > b) - (b > a);
6174*fae548d3Szrj   if (ret)
6175*fae548d3Szrj     return ret;
6176*fae548d3Szrj 
6177*fae548d3Szrj   a = loc_views[*(const unsigned int *) ap];
6178*fae548d3Szrj   b = loc_views[*(const unsigned int *) bp];
6179*fae548d3Szrj 
6180*fae548d3Szrj   ret = (a > b) - (b > a);
6181*fae548d3Szrj 
6182*fae548d3Szrj   return ret;
6183*fae548d3Szrj }
6184*fae548d3Szrj 
6185*fae548d3Szrj static int
display_debug_loc(struct dwarf_section * section,void * file)6186*fae548d3Szrj display_debug_loc (struct dwarf_section *section, void *file)
6187*fae548d3Szrj {
6188*fae548d3Szrj   unsigned char *start = section->start, *vstart = NULL;
6189*fae548d3Szrj   unsigned long bytes;
6190*fae548d3Szrj   unsigned char *section_begin = start;
6191*fae548d3Szrj   unsigned int num_loc_list = 0;
6192*fae548d3Szrj   unsigned long last_offset = 0;
6193*fae548d3Szrj   unsigned long last_view = 0;
6194*fae548d3Szrj   unsigned int first = 0;
6195*fae548d3Szrj   unsigned int i;
6196*fae548d3Szrj   unsigned int j;
6197*fae548d3Szrj   int seen_first_offset = 0;
6198*fae548d3Szrj   int locs_sorted = 1;
6199*fae548d3Szrj   unsigned char *next = start, *vnext = vstart;
6200*fae548d3Szrj   unsigned int *array = NULL;
6201*fae548d3Szrj   const char *suffix = strrchr (section->name, '.');
6202*fae548d3Szrj   bfd_boolean is_dwo = FALSE;
6203*fae548d3Szrj   int is_loclists = strstr (section->name, "debug_loclists") != NULL;
6204*fae548d3Szrj   dwarf_vma expected_start = 0;
6205*fae548d3Szrj 
6206*fae548d3Szrj   if (suffix && strcmp (suffix, ".dwo") == 0)
6207*fae548d3Szrj     is_dwo = TRUE;
6208*fae548d3Szrj 
6209*fae548d3Szrj   bytes = section->size;
6210*fae548d3Szrj 
6211*fae548d3Szrj   if (bytes == 0)
6212*fae548d3Szrj     {
6213*fae548d3Szrj       printf (_("\nThe %s section is empty.\n"), section->name);
6214*fae548d3Szrj       return 0;
6215*fae548d3Szrj     }
6216*fae548d3Szrj 
6217*fae548d3Szrj   if (is_loclists)
6218*fae548d3Szrj     {
6219*fae548d3Szrj       unsigned char *hdrptr = section_begin;
6220*fae548d3Szrj       dwarf_vma ll_length;
6221*fae548d3Szrj       unsigned short ll_version;
6222*fae548d3Szrj       unsigned char *end = section_begin + section->size;
6223*fae548d3Szrj       unsigned char address_size, segment_selector_size;
6224*fae548d3Szrj       uint32_t offset_entry_count;
6225*fae548d3Szrj 
6226*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (ll_length, hdrptr, 4, end);
6227*fae548d3Szrj       if (ll_length == 0xffffffff)
6228*fae548d3Szrj 	SAFE_BYTE_GET_AND_INC (ll_length, hdrptr, 8, end);
6229*fae548d3Szrj 
6230*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (ll_version, hdrptr, 2, end);
6231*fae548d3Szrj       if (ll_version != 5)
6232*fae548d3Szrj 	{
6233*fae548d3Szrj 	  warn (_("The %s section contains corrupt or "
6234*fae548d3Szrj 		  "unsupported version number: %d.\n"),
6235*fae548d3Szrj 		section->name, ll_version);
6236*fae548d3Szrj 	  return 0;
6237*fae548d3Szrj 	}
6238*fae548d3Szrj 
6239*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (address_size, hdrptr, 1, end);
6240*fae548d3Szrj 
6241*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (segment_selector_size, hdrptr, 1, end);
6242*fae548d3Szrj       if (segment_selector_size != 0)
6243*fae548d3Szrj 	{
6244*fae548d3Szrj 	  warn (_("The %s section contains "
6245*fae548d3Szrj 		  "unsupported segment selector size: %d.\n"),
6246*fae548d3Szrj 		section->name, segment_selector_size);
6247*fae548d3Szrj 	  return 0;
6248*fae548d3Szrj 	}
6249*fae548d3Szrj 
6250*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (offset_entry_count, hdrptr, 4, end);
6251*fae548d3Szrj       if (offset_entry_count != 0)
6252*fae548d3Szrj 	{
6253*fae548d3Szrj 	  warn (_("The %s section contains "
6254*fae548d3Szrj 		  "unsupported offset entry count: %d.\n"),
6255*fae548d3Szrj 		section->name, offset_entry_count);
6256*fae548d3Szrj 	  return 0;
6257*fae548d3Szrj 	}
6258*fae548d3Szrj 
6259*fae548d3Szrj       expected_start = hdrptr - section_begin;
6260*fae548d3Szrj     }
6261*fae548d3Szrj 
6262*fae548d3Szrj   if (load_debug_info (file) == 0)
6263*fae548d3Szrj     {
6264*fae548d3Szrj       warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
6265*fae548d3Szrj 	    section->name);
6266*fae548d3Szrj       return 0;
6267*fae548d3Szrj     }
6268*fae548d3Szrj 
6269*fae548d3Szrj   /* Check the order of location list in .debug_info section. If
6270*fae548d3Szrj      offsets of location lists are in the ascending order, we can
6271*fae548d3Szrj      use `debug_information' directly.  */
6272*fae548d3Szrj   for (i = 0; i < num_debug_info_entries; i++)
6273*fae548d3Szrj     {
6274*fae548d3Szrj       unsigned int num;
6275*fae548d3Szrj 
6276*fae548d3Szrj       num = debug_information [i].num_loc_offsets;
6277*fae548d3Szrj       if (num > num_loc_list)
6278*fae548d3Szrj 	num_loc_list = num;
6279*fae548d3Szrj 
6280*fae548d3Szrj       /* Check if we can use `debug_information' directly.  */
6281*fae548d3Szrj       if (locs_sorted && num != 0)
6282*fae548d3Szrj 	{
6283*fae548d3Szrj 	  if (!seen_first_offset)
6284*fae548d3Szrj 	    {
6285*fae548d3Szrj 	      /* This is the first location list.  */
6286*fae548d3Szrj 	      last_offset = debug_information [i].loc_offsets [0];
6287*fae548d3Szrj 	      last_view = debug_information [i].loc_views [0];
6288*fae548d3Szrj 	      first = i;
6289*fae548d3Szrj 	      seen_first_offset = 1;
6290*fae548d3Szrj 	      j = 1;
6291*fae548d3Szrj 	    }
6292*fae548d3Szrj 	  else
6293*fae548d3Szrj 	    j = 0;
6294*fae548d3Szrj 
6295*fae548d3Szrj 	  for (; j < num; j++)
6296*fae548d3Szrj 	    {
6297*fae548d3Szrj 	      if (last_offset >
6298*fae548d3Szrj 		  debug_information [i].loc_offsets [j]
6299*fae548d3Szrj 		  || (last_offset == debug_information [i].loc_offsets [j]
6300*fae548d3Szrj 		      && last_view > debug_information [i].loc_views [j]))
6301*fae548d3Szrj 		{
6302*fae548d3Szrj 		  locs_sorted = 0;
6303*fae548d3Szrj 		  break;
6304*fae548d3Szrj 		}
6305*fae548d3Szrj 	      last_offset = debug_information [i].loc_offsets [j];
6306*fae548d3Szrj 	      last_view = debug_information [i].loc_views [j];
6307*fae548d3Szrj 	    }
6308*fae548d3Szrj 	}
6309*fae548d3Szrj     }
6310*fae548d3Szrj 
6311*fae548d3Szrj   if (!seen_first_offset)
6312*fae548d3Szrj     error (_("No location lists in .debug_info section!\n"));
6313*fae548d3Szrj 
6314*fae548d3Szrj   if (debug_information [first].num_loc_offsets > 0
6315*fae548d3Szrj       && debug_information [first].loc_offsets [0] != expected_start
6316*fae548d3Szrj       && debug_information [first].loc_views [0] != expected_start)
6317*fae548d3Szrj     warn (_("Location lists in %s section start at 0x%s\n"),
6318*fae548d3Szrj 	  section->name,
6319*fae548d3Szrj 	  dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]));
6320*fae548d3Szrj 
6321*fae548d3Szrj   if (!locs_sorted)
6322*fae548d3Szrj     array = (unsigned int *) xcmalloc (num_loc_list, sizeof (unsigned int));
6323*fae548d3Szrj 
6324*fae548d3Szrj   introduce (section, FALSE);
6325*fae548d3Szrj 
6326*fae548d3Szrj   if (reloc_at (section, 0))
6327*fae548d3Szrj     printf (_(" Warning: This section has relocations - addresses seen here may not be accurate.\n\n"));
6328*fae548d3Szrj 
6329*fae548d3Szrj   printf (_("    Offset   Begin            End              Expression\n"));
6330*fae548d3Szrj 
6331*fae548d3Szrj   seen_first_offset = 0;
6332*fae548d3Szrj   for (i = first; i < num_debug_info_entries; i++)
6333*fae548d3Szrj     {
6334*fae548d3Szrj       dwarf_vma offset, voffset;
6335*fae548d3Szrj       dwarf_vma base_address;
6336*fae548d3Szrj       unsigned int k;
6337*fae548d3Szrj       int has_frame_base;
6338*fae548d3Szrj 
6339*fae548d3Szrj       if (!locs_sorted)
6340*fae548d3Szrj 	{
6341*fae548d3Szrj 	  for (k = 0; k < debug_information [i].num_loc_offsets; k++)
6342*fae548d3Szrj 	    array[k] = k;
6343*fae548d3Szrj 	  loc_offsets = debug_information [i].loc_offsets;
6344*fae548d3Szrj 	  loc_views = debug_information [i].loc_views;
6345*fae548d3Szrj 	  qsort (array, debug_information [i].num_loc_offsets,
6346*fae548d3Szrj 		 sizeof (*array), loc_offsets_compar);
6347*fae548d3Szrj 	}
6348*fae548d3Szrj 
6349*fae548d3Szrj       int adjacent_view_loclists = 1;
6350*fae548d3Szrj       for (k = 0; k < debug_information [i].num_loc_offsets; k++)
6351*fae548d3Szrj 	{
6352*fae548d3Szrj 	  j = locs_sorted ? k : array[k];
6353*fae548d3Szrj 	  if (k
6354*fae548d3Szrj 	      && (debug_information [i].loc_offsets [locs_sorted
6355*fae548d3Szrj 						    ? k - 1 : array [k - 1]]
6356*fae548d3Szrj 		  == debug_information [i].loc_offsets [j])
6357*fae548d3Szrj 	      && (debug_information [i].loc_views [locs_sorted
6358*fae548d3Szrj 						   ? k - 1 : array [k - 1]]
6359*fae548d3Szrj 		  == debug_information [i].loc_views [j]))
6360*fae548d3Szrj 	    continue;
6361*fae548d3Szrj 	  has_frame_base = debug_information [i].have_frame_base [j];
6362*fae548d3Szrj 	  offset = debug_information [i].loc_offsets [j];
6363*fae548d3Szrj 	  next = section_begin + offset;
6364*fae548d3Szrj 	  voffset = debug_information [i].loc_views [j];
6365*fae548d3Szrj 	  if (voffset != vm1)
6366*fae548d3Szrj 	    vnext = section_begin + voffset;
6367*fae548d3Szrj 	  else
6368*fae548d3Szrj 	    vnext = NULL;
6369*fae548d3Szrj 	  base_address = debug_information [i].base_address;
6370*fae548d3Szrj 
6371*fae548d3Szrj 	  if (vnext && vnext < next)
6372*fae548d3Szrj 	    {
6373*fae548d3Szrj 	      vstart = vnext;
6374*fae548d3Szrj 	      display_view_pair_list (section, &vstart, i, next);
6375*fae548d3Szrj 	      if (start == vnext)
6376*fae548d3Szrj 		start = vstart;
6377*fae548d3Szrj 	    }
6378*fae548d3Szrj 
6379*fae548d3Szrj 	  if (!seen_first_offset || !adjacent_view_loclists)
6380*fae548d3Szrj 	    seen_first_offset = 1;
6381*fae548d3Szrj 	  else
6382*fae548d3Szrj 	    {
6383*fae548d3Szrj 	      if (start < next)
6384*fae548d3Szrj 		warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
6385*fae548d3Szrj 		      (unsigned long) (start - section_begin),
6386*fae548d3Szrj 		      (unsigned long) offset);
6387*fae548d3Szrj 	      else if (start > next)
6388*fae548d3Szrj 		warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
6389*fae548d3Szrj 		      (unsigned long) (start - section_begin),
6390*fae548d3Szrj 		      (unsigned long) offset);
6391*fae548d3Szrj 	    }
6392*fae548d3Szrj 	  start = next;
6393*fae548d3Szrj 	  vstart = vnext;
6394*fae548d3Szrj 
6395*fae548d3Szrj 	  if (offset >= bytes)
6396*fae548d3Szrj 	    {
6397*fae548d3Szrj 	      warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
6398*fae548d3Szrj 		    (unsigned long) offset);
6399*fae548d3Szrj 	      continue;
6400*fae548d3Szrj 	    }
6401*fae548d3Szrj 
6402*fae548d3Szrj 	  if (vnext && voffset >= bytes)
6403*fae548d3Szrj 	    {
6404*fae548d3Szrj 	      warn (_("View Offset 0x%lx is bigger than .debug_loc section size.\n"),
6405*fae548d3Szrj 		    (unsigned long) voffset);
6406*fae548d3Szrj 	      continue;
6407*fae548d3Szrj 	    }
6408*fae548d3Szrj 
6409*fae548d3Szrj 	  if (!is_loclists)
6410*fae548d3Szrj 	    {
6411*fae548d3Szrj 	      if (is_dwo)
6412*fae548d3Szrj 		display_loc_list_dwo (section, &start, i, offset,
6413*fae548d3Szrj 				      &vstart, has_frame_base);
6414*fae548d3Szrj 	      else
6415*fae548d3Szrj 		display_loc_list (section, &start, i, offset, base_address,
6416*fae548d3Szrj 				  &vstart, has_frame_base);
6417*fae548d3Szrj 	    }
6418*fae548d3Szrj 	  else
6419*fae548d3Szrj 	    {
6420*fae548d3Szrj 	      if (is_dwo)
6421*fae548d3Szrj 		warn (_("DWO is not yet supported.\n"));
6422*fae548d3Szrj 	      else
6423*fae548d3Szrj 		display_loclists_list (section, &start, i, offset, base_address,
6424*fae548d3Szrj 				       &vstart, has_frame_base);
6425*fae548d3Szrj 	    }
6426*fae548d3Szrj 
6427*fae548d3Szrj 	  /* FIXME: this arrangement is quite simplistic.  Nothing
6428*fae548d3Szrj 	     requires locview lists to be adjacent to corresponding
6429*fae548d3Szrj 	     loclists, and a single loclist could be augmented by
6430*fae548d3Szrj 	     different locview lists, and vice-versa, unlikely as it
6431*fae548d3Szrj 	     is that it would make sense to do so.  Hopefully we'll
6432*fae548d3Szrj 	     have view pair support built into loclists before we ever
6433*fae548d3Szrj 	     need to address all these possibilities.  */
6434*fae548d3Szrj 	  if (adjacent_view_loclists && vnext
6435*fae548d3Szrj 	      && vnext != start && vstart != next)
6436*fae548d3Szrj 	    {
6437*fae548d3Szrj 	      adjacent_view_loclists = 0;
6438*fae548d3Szrj 	      warn (_("Hole and overlap detection requires adjacent view lists and loclists.\n"));
6439*fae548d3Szrj 	    }
6440*fae548d3Szrj 
6441*fae548d3Szrj 	  if (vnext && vnext == start)
6442*fae548d3Szrj 	    display_view_pair_list (section, &start, i, vstart);
6443*fae548d3Szrj 	}
6444*fae548d3Szrj     }
6445*fae548d3Szrj 
6446*fae548d3Szrj   if (start < section->start + section->size)
6447*fae548d3Szrj     warn (ngettext ("There is %ld unused byte at the end of section %s\n",
6448*fae548d3Szrj 		    "There are %ld unused bytes at the end of section %s\n",
6449*fae548d3Szrj 		    (long) (section->start + section->size - start)),
6450*fae548d3Szrj 	  (long) (section->start + section->size - start), section->name);
6451*fae548d3Szrj   putchar ('\n');
6452*fae548d3Szrj   free (array);
6453*fae548d3Szrj   return 1;
6454*fae548d3Szrj }
6455*fae548d3Szrj 
6456*fae548d3Szrj static int
display_debug_str(struct dwarf_section * section,void * file ATTRIBUTE_UNUSED)6457*fae548d3Szrj display_debug_str (struct dwarf_section *section,
6458*fae548d3Szrj 		   void *file ATTRIBUTE_UNUSED)
6459*fae548d3Szrj {
6460*fae548d3Szrj   unsigned char *start = section->start;
6461*fae548d3Szrj   unsigned long bytes = section->size;
6462*fae548d3Szrj   dwarf_vma addr = section->address;
6463*fae548d3Szrj 
6464*fae548d3Szrj   if (bytes == 0)
6465*fae548d3Szrj     {
6466*fae548d3Szrj       printf (_("\nThe %s section is empty.\n"), section->name);
6467*fae548d3Szrj       return 0;
6468*fae548d3Szrj     }
6469*fae548d3Szrj 
6470*fae548d3Szrj   introduce (section, FALSE);
6471*fae548d3Szrj 
6472*fae548d3Szrj   while (bytes)
6473*fae548d3Szrj     {
6474*fae548d3Szrj       int j;
6475*fae548d3Szrj       int k;
6476*fae548d3Szrj       int lbytes;
6477*fae548d3Szrj 
6478*fae548d3Szrj       lbytes = (bytes > 16 ? 16 : bytes);
6479*fae548d3Szrj 
6480*fae548d3Szrj       printf ("  0x%8.8lx ", (unsigned long) addr);
6481*fae548d3Szrj 
6482*fae548d3Szrj       for (j = 0; j < 16; j++)
6483*fae548d3Szrj 	{
6484*fae548d3Szrj 	  if (j < lbytes)
6485*fae548d3Szrj 	    printf ("%2.2x", start[j]);
6486*fae548d3Szrj 	  else
6487*fae548d3Szrj 	    printf ("  ");
6488*fae548d3Szrj 
6489*fae548d3Szrj 	  if ((j & 3) == 3)
6490*fae548d3Szrj 	    printf (" ");
6491*fae548d3Szrj 	}
6492*fae548d3Szrj 
6493*fae548d3Szrj       for (j = 0; j < lbytes; j++)
6494*fae548d3Szrj 	{
6495*fae548d3Szrj 	  k = start[j];
6496*fae548d3Szrj 	  if (k >= ' ' && k < 0x80)
6497*fae548d3Szrj 	    printf ("%c", k);
6498*fae548d3Szrj 	  else
6499*fae548d3Szrj 	    printf (".");
6500*fae548d3Szrj 	}
6501*fae548d3Szrj 
6502*fae548d3Szrj       putchar ('\n');
6503*fae548d3Szrj 
6504*fae548d3Szrj       start += lbytes;
6505*fae548d3Szrj       addr  += lbytes;
6506*fae548d3Szrj       bytes -= lbytes;
6507*fae548d3Szrj     }
6508*fae548d3Szrj 
6509*fae548d3Szrj   putchar ('\n');
6510*fae548d3Szrj 
6511*fae548d3Szrj   return 1;
6512*fae548d3Szrj }
6513*fae548d3Szrj 
6514*fae548d3Szrj static int
display_debug_info(struct dwarf_section * section,void * file)6515*fae548d3Szrj display_debug_info (struct dwarf_section *section, void *file)
6516*fae548d3Szrj {
6517*fae548d3Szrj   return process_debug_info (section, file, section->abbrev_sec, FALSE, FALSE);
6518*fae548d3Szrj }
6519*fae548d3Szrj 
6520*fae548d3Szrj static int
display_debug_types(struct dwarf_section * section,void * file)6521*fae548d3Szrj display_debug_types (struct dwarf_section *section, void *file)
6522*fae548d3Szrj {
6523*fae548d3Szrj   return process_debug_info (section, file, section->abbrev_sec, FALSE, TRUE);
6524*fae548d3Szrj }
6525*fae548d3Szrj 
6526*fae548d3Szrj static int
display_trace_info(struct dwarf_section * section,void * file)6527*fae548d3Szrj display_trace_info (struct dwarf_section *section, void *file)
6528*fae548d3Szrj {
6529*fae548d3Szrj   return process_debug_info (section, file, section->abbrev_sec, FALSE, TRUE);
6530*fae548d3Szrj }
6531*fae548d3Szrj 
6532*fae548d3Szrj static int
display_debug_aranges(struct dwarf_section * section,void * file ATTRIBUTE_UNUSED)6533*fae548d3Szrj display_debug_aranges (struct dwarf_section *section,
6534*fae548d3Szrj 		       void *file ATTRIBUTE_UNUSED)
6535*fae548d3Szrj {
6536*fae548d3Szrj   unsigned char *start = section->start;
6537*fae548d3Szrj   unsigned char *end = start + section->size;
6538*fae548d3Szrj 
6539*fae548d3Szrj   introduce (section, FALSE);
6540*fae548d3Szrj 
6541*fae548d3Szrj   /* It does not matter if this load fails,
6542*fae548d3Szrj      we test for that later on.  */
6543*fae548d3Szrj   load_debug_info (file);
6544*fae548d3Szrj 
6545*fae548d3Szrj   while (start < end)
6546*fae548d3Szrj     {
6547*fae548d3Szrj       unsigned char *hdrptr;
6548*fae548d3Szrj       DWARF2_Internal_ARange arange;
6549*fae548d3Szrj       unsigned char *addr_ranges;
6550*fae548d3Szrj       dwarf_vma length;
6551*fae548d3Szrj       dwarf_vma address;
6552*fae548d3Szrj       unsigned long sec_off;
6553*fae548d3Szrj       unsigned char address_size;
6554*fae548d3Szrj       int excess;
6555*fae548d3Szrj       unsigned int offset_size;
6556*fae548d3Szrj       unsigned int initial_length_size;
6557*fae548d3Szrj 
6558*fae548d3Szrj       hdrptr = start;
6559*fae548d3Szrj 
6560*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 4, end);
6561*fae548d3Szrj       if (arange.ar_length == 0xffffffff)
6562*fae548d3Szrj 	{
6563*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (arange.ar_length, hdrptr, 8, end);
6564*fae548d3Szrj 	  offset_size = 8;
6565*fae548d3Szrj 	  initial_length_size = 12;
6566*fae548d3Szrj 	}
6567*fae548d3Szrj       else
6568*fae548d3Szrj 	{
6569*fae548d3Szrj 	  offset_size = 4;
6570*fae548d3Szrj 	  initial_length_size = 4;
6571*fae548d3Szrj 	}
6572*fae548d3Szrj 
6573*fae548d3Szrj       sec_off = hdrptr - section->start;
6574*fae548d3Szrj       if (sec_off + arange.ar_length < sec_off
6575*fae548d3Szrj 	  || sec_off + arange.ar_length > section->size)
6576*fae548d3Szrj 	{
6577*fae548d3Szrj 	  warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
6578*fae548d3Szrj 		section->name,
6579*fae548d3Szrj 		sec_off - initial_length_size,
6580*fae548d3Szrj 		dwarf_vmatoa ("x", arange.ar_length));
6581*fae548d3Szrj 	  break;
6582*fae548d3Szrj 	}
6583*fae548d3Szrj 
6584*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (arange.ar_version, hdrptr, 2, end);
6585*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (arange.ar_info_offset, hdrptr, offset_size, end);
6586*fae548d3Szrj 
6587*fae548d3Szrj       if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
6588*fae548d3Szrj 	  && num_debug_info_entries > 0
6589*fae548d3Szrj 	  && find_debug_info_for_offset (arange.ar_info_offset) == NULL)
6590*fae548d3Szrj 	warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
6591*fae548d3Szrj 	      (unsigned long) arange.ar_info_offset, section->name);
6592*fae548d3Szrj 
6593*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (arange.ar_pointer_size, hdrptr, 1, end);
6594*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (arange.ar_segment_size, hdrptr, 1, end);
6595*fae548d3Szrj 
6596*fae548d3Szrj       if (arange.ar_version != 2 && arange.ar_version != 3)
6597*fae548d3Szrj 	{
6598*fae548d3Szrj 	  /* PR 19872: A version number of 0 probably means that there is
6599*fae548d3Szrj 	     padding at the end of the .debug_aranges section.  Gold puts
6600*fae548d3Szrj 	     it there when performing an incremental link, for example.
6601*fae548d3Szrj 	     So do not generate a warning in this case.  */
6602*fae548d3Szrj 	  if (arange.ar_version)
6603*fae548d3Szrj 	    warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
6604*fae548d3Szrj 	  break;
6605*fae548d3Szrj 	}
6606*fae548d3Szrj 
6607*fae548d3Szrj       printf (_("  Length:                   %ld\n"),
6608*fae548d3Szrj 	      (long) arange.ar_length);
6609*fae548d3Szrj       printf (_("  Version:                  %d\n"), arange.ar_version);
6610*fae548d3Szrj       printf (_("  Offset into .debug_info:  0x%lx\n"),
6611*fae548d3Szrj 	      (unsigned long) arange.ar_info_offset);
6612*fae548d3Szrj       printf (_("  Pointer Size:             %d\n"), arange.ar_pointer_size);
6613*fae548d3Szrj       printf (_("  Segment Size:             %d\n"), arange.ar_segment_size);
6614*fae548d3Szrj 
6615*fae548d3Szrj       address_size = arange.ar_pointer_size + arange.ar_segment_size;
6616*fae548d3Szrj 
6617*fae548d3Szrj       /* PR 17512: file: 001-108546-0.001:0.1.  */
6618*fae548d3Szrj       if (address_size == 0 || address_size > 8)
6619*fae548d3Szrj 	{
6620*fae548d3Szrj 	  error (_("Invalid address size in %s section!\n"),
6621*fae548d3Szrj 		 section->name);
6622*fae548d3Szrj 	  break;
6623*fae548d3Szrj 	}
6624*fae548d3Szrj 
6625*fae548d3Szrj       /* The DWARF spec does not require that the address size be a power
6626*fae548d3Szrj 	 of two, but we do.  This will have to change if we ever encounter
6627*fae548d3Szrj 	 an uneven architecture.  */
6628*fae548d3Szrj       if ((address_size & (address_size - 1)) != 0)
6629*fae548d3Szrj 	{
6630*fae548d3Szrj 	  warn (_("Pointer size + Segment size is not a power of two.\n"));
6631*fae548d3Szrj 	  break;
6632*fae548d3Szrj 	}
6633*fae548d3Szrj 
6634*fae548d3Szrj       if (address_size > 4)
6635*fae548d3Szrj 	printf (_("\n    Address            Length\n"));
6636*fae548d3Szrj       else
6637*fae548d3Szrj 	printf (_("\n    Address    Length\n"));
6638*fae548d3Szrj 
6639*fae548d3Szrj       addr_ranges = hdrptr;
6640*fae548d3Szrj 
6641*fae548d3Szrj       /* Must pad to an alignment boundary that is twice the address size.  */
6642*fae548d3Szrj       excess = (hdrptr - start) % (2 * address_size);
6643*fae548d3Szrj       if (excess)
6644*fae548d3Szrj 	addr_ranges += (2 * address_size) - excess;
6645*fae548d3Szrj 
6646*fae548d3Szrj       start += arange.ar_length + initial_length_size;
6647*fae548d3Szrj 
6648*fae548d3Szrj       while (addr_ranges + 2 * address_size <= start)
6649*fae548d3Szrj 	{
6650*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (address, addr_ranges, address_size, end);
6651*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (length, addr_ranges, address_size, end);
6652*fae548d3Szrj 
6653*fae548d3Szrj 	  printf ("    ");
6654*fae548d3Szrj 	  print_dwarf_vma (address, address_size);
6655*fae548d3Szrj 	  print_dwarf_vma (length, address_size);
6656*fae548d3Szrj 	  putchar ('\n');
6657*fae548d3Szrj 	}
6658*fae548d3Szrj     }
6659*fae548d3Szrj 
6660*fae548d3Szrj   printf ("\n");
6661*fae548d3Szrj 
6662*fae548d3Szrj   return 1;
6663*fae548d3Szrj }
6664*fae548d3Szrj 
6665*fae548d3Szrj /* Comparison function for qsort.  */
6666*fae548d3Szrj static int
comp_addr_base(const void * v0,const void * v1)6667*fae548d3Szrj comp_addr_base (const void * v0, const void * v1)
6668*fae548d3Szrj {
6669*fae548d3Szrj   debug_info *info0 = *(debug_info **) v0;
6670*fae548d3Szrj   debug_info *info1 = *(debug_info **) v1;
6671*fae548d3Szrj   return info0->addr_base - info1->addr_base;
6672*fae548d3Szrj }
6673*fae548d3Szrj 
6674*fae548d3Szrj /* Display the debug_addr section.  */
6675*fae548d3Szrj static int
display_debug_addr(struct dwarf_section * section,void * file)6676*fae548d3Szrj display_debug_addr (struct dwarf_section *section,
6677*fae548d3Szrj 		    void *file)
6678*fae548d3Szrj {
6679*fae548d3Szrj   debug_info **debug_addr_info;
6680*fae548d3Szrj   unsigned char *entry;
6681*fae548d3Szrj   unsigned char *end;
6682*fae548d3Szrj   unsigned int i;
6683*fae548d3Szrj   unsigned int count;
6684*fae548d3Szrj 
6685*fae548d3Szrj   if (section->size == 0)
6686*fae548d3Szrj     {
6687*fae548d3Szrj       printf (_("\nThe %s section is empty.\n"), section->name);
6688*fae548d3Szrj       return 0;
6689*fae548d3Szrj     }
6690*fae548d3Szrj 
6691*fae548d3Szrj   if (load_debug_info (file) == 0)
6692*fae548d3Szrj     {
6693*fae548d3Szrj       warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
6694*fae548d3Szrj 	    section->name);
6695*fae548d3Szrj       return 0;
6696*fae548d3Szrj     }
6697*fae548d3Szrj 
6698*fae548d3Szrj   introduce (section, FALSE);
6699*fae548d3Szrj 
6700*fae548d3Szrj   /* PR  17531: file: cf38d01b.
6701*fae548d3Szrj      We use xcalloc because a corrupt file may not have initialised all of the
6702*fae548d3Szrj      fields in the debug_info structure, which means that the sort below might
6703*fae548d3Szrj      try to move uninitialised data.  */
6704*fae548d3Szrj   debug_addr_info = (debug_info **) xcalloc ((num_debug_info_entries + 1),
6705*fae548d3Szrj 					     sizeof (debug_info *));
6706*fae548d3Szrj 
6707*fae548d3Szrj   count = 0;
6708*fae548d3Szrj   for (i = 0; i < num_debug_info_entries; i++)
6709*fae548d3Szrj     if (debug_information [i].addr_base != DEBUG_INFO_UNAVAILABLE)
6710*fae548d3Szrj       {
6711*fae548d3Szrj 	/* PR 17531: file: cf38d01b.  */
6712*fae548d3Szrj 	if (debug_information[i].addr_base >= section->size)
6713*fae548d3Szrj 	  warn (_("Corrupt address base (%lx) found in debug section %u\n"),
6714*fae548d3Szrj 		(unsigned long) debug_information[i].addr_base, i);
6715*fae548d3Szrj 	else
6716*fae548d3Szrj 	  debug_addr_info [count++] = debug_information + i;
6717*fae548d3Szrj       }
6718*fae548d3Szrj 
6719*fae548d3Szrj   /* Add a sentinel to make iteration convenient.  */
6720*fae548d3Szrj   debug_addr_info [count] = (debug_info *) xmalloc (sizeof (debug_info));
6721*fae548d3Szrj   debug_addr_info [count]->addr_base = section->size;
6722*fae548d3Szrj   qsort (debug_addr_info, count, sizeof (debug_info *), comp_addr_base);
6723*fae548d3Szrj 
6724*fae548d3Szrj   for (i = 0; i < count; i++)
6725*fae548d3Szrj     {
6726*fae548d3Szrj       unsigned int idx;
6727*fae548d3Szrj       unsigned int address_size = debug_addr_info [i]->pointer_size;
6728*fae548d3Szrj 
6729*fae548d3Szrj       printf (_("  For compilation unit at offset 0x%s:\n"),
6730*fae548d3Szrj 	      dwarf_vmatoa ("x", debug_addr_info [i]->cu_offset));
6731*fae548d3Szrj 
6732*fae548d3Szrj       printf (_("\tIndex\tAddress\n"));
6733*fae548d3Szrj       entry = section->start + debug_addr_info [i]->addr_base;
6734*fae548d3Szrj       end = section->start + debug_addr_info [i + 1]->addr_base;
6735*fae548d3Szrj       idx = 0;
6736*fae548d3Szrj       while (entry < end)
6737*fae548d3Szrj 	{
6738*fae548d3Szrj 	  dwarf_vma base = byte_get (entry, address_size);
6739*fae548d3Szrj 	  printf (_("\t%d:\t"), idx);
6740*fae548d3Szrj 	  print_dwarf_vma (base, address_size);
6741*fae548d3Szrj 	  printf ("\n");
6742*fae548d3Szrj 	  entry += address_size;
6743*fae548d3Szrj 	  idx++;
6744*fae548d3Szrj 	}
6745*fae548d3Szrj     }
6746*fae548d3Szrj   printf ("\n");
6747*fae548d3Szrj 
6748*fae548d3Szrj   free (debug_addr_info);
6749*fae548d3Szrj   return 1;
6750*fae548d3Szrj }
6751*fae548d3Szrj 
6752*fae548d3Szrj /* Display the .debug_str_offsets and .debug_str_offsets.dwo sections.  */
6753*fae548d3Szrj 
6754*fae548d3Szrj static int
display_debug_str_offsets(struct dwarf_section * section,void * file ATTRIBUTE_UNUSED)6755*fae548d3Szrj display_debug_str_offsets (struct dwarf_section *section,
6756*fae548d3Szrj 			   void *file ATTRIBUTE_UNUSED)
6757*fae548d3Szrj {
6758*fae548d3Szrj   if (section->size == 0)
6759*fae548d3Szrj     {
6760*fae548d3Szrj       printf (_("\nThe %s section is empty.\n"), section->name);
6761*fae548d3Szrj       return 0;
6762*fae548d3Szrj     }
6763*fae548d3Szrj   /* TODO: Dump the contents.  This is made somewhat difficult by not knowing
6764*fae548d3Szrj      what the offset size is for this section.  */
6765*fae548d3Szrj   return 1;
6766*fae548d3Szrj }
6767*fae548d3Szrj 
6768*fae548d3Szrj /* Each debug_information[x].range_lists[y] gets this representation for
6769*fae548d3Szrj    sorting purposes.  */
6770*fae548d3Szrj 
6771*fae548d3Szrj struct range_entry
6772*fae548d3Szrj {
6773*fae548d3Szrj   /* The debug_information[x].range_lists[y] value.  */
6774*fae548d3Szrj   dwarf_vma ranges_offset;
6775*fae548d3Szrj 
6776*fae548d3Szrj   /* Original debug_information to find parameters of the data.  */
6777*fae548d3Szrj   debug_info *debug_info_p;
6778*fae548d3Szrj };
6779*fae548d3Szrj 
6780*fae548d3Szrj /* Sort struct range_entry in ascending order of its RANGES_OFFSET.  */
6781*fae548d3Szrj 
6782*fae548d3Szrj static int
range_entry_compar(const void * ap,const void * bp)6783*fae548d3Szrj range_entry_compar (const void *ap, const void *bp)
6784*fae548d3Szrj {
6785*fae548d3Szrj   const struct range_entry *a_re = (const struct range_entry *) ap;
6786*fae548d3Szrj   const struct range_entry *b_re = (const struct range_entry *) bp;
6787*fae548d3Szrj   const dwarf_vma a = a_re->ranges_offset;
6788*fae548d3Szrj   const dwarf_vma b = b_re->ranges_offset;
6789*fae548d3Szrj 
6790*fae548d3Szrj   return (a > b) - (b > a);
6791*fae548d3Szrj }
6792*fae548d3Szrj 
6793*fae548d3Szrj static void
display_debug_ranges_list(unsigned char * start,unsigned char * finish,unsigned int pointer_size,unsigned long offset,unsigned long base_address)6794*fae548d3Szrj display_debug_ranges_list (unsigned char *start, unsigned char *finish,
6795*fae548d3Szrj 			   unsigned int pointer_size, unsigned long offset,
6796*fae548d3Szrj 			   unsigned long base_address)
6797*fae548d3Szrj {
6798*fae548d3Szrj   while (start < finish)
6799*fae548d3Szrj     {
6800*fae548d3Szrj       dwarf_vma begin;
6801*fae548d3Szrj       dwarf_vma end;
6802*fae548d3Szrj 
6803*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
6804*fae548d3Szrj       if (start >= finish)
6805*fae548d3Szrj 	break;
6806*fae548d3Szrj       SAFE_SIGNED_BYTE_GET_AND_INC (end, start, pointer_size, finish);
6807*fae548d3Szrj 
6808*fae548d3Szrj 
6809*fae548d3Szrj       printf ("    %8.8lx ", offset);
6810*fae548d3Szrj 
6811*fae548d3Szrj       if (begin == 0 && end == 0)
6812*fae548d3Szrj 	{
6813*fae548d3Szrj 	  printf (_("<End of list>\n"));
6814*fae548d3Szrj 	  break;
6815*fae548d3Szrj 	}
6816*fae548d3Szrj 
6817*fae548d3Szrj       /* Check base address specifiers.  */
6818*fae548d3Szrj       if (is_max_address (begin, pointer_size)
6819*fae548d3Szrj 	  && !is_max_address (end, pointer_size))
6820*fae548d3Szrj 	{
6821*fae548d3Szrj 	  base_address = end;
6822*fae548d3Szrj 	  print_dwarf_vma (begin, pointer_size);
6823*fae548d3Szrj 	  print_dwarf_vma (end, pointer_size);
6824*fae548d3Szrj 	  printf ("(base address)\n");
6825*fae548d3Szrj 	  continue;
6826*fae548d3Szrj 	}
6827*fae548d3Szrj 
6828*fae548d3Szrj       print_dwarf_vma (begin + base_address, pointer_size);
6829*fae548d3Szrj       print_dwarf_vma (end + base_address, pointer_size);
6830*fae548d3Szrj 
6831*fae548d3Szrj       if (begin == end)
6832*fae548d3Szrj 	fputs (_("(start == end)"), stdout);
6833*fae548d3Szrj       else if (begin > end)
6834*fae548d3Szrj 	fputs (_("(start > end)"), stdout);
6835*fae548d3Szrj 
6836*fae548d3Szrj       putchar ('\n');
6837*fae548d3Szrj     }
6838*fae548d3Szrj }
6839*fae548d3Szrj 
6840*fae548d3Szrj static void
display_debug_rnglists_list(unsigned char * start,unsigned char * finish,unsigned int pointer_size,unsigned long offset,unsigned long base_address)6841*fae548d3Szrj display_debug_rnglists_list (unsigned char *start, unsigned char *finish,
6842*fae548d3Szrj 			     unsigned int pointer_size, unsigned long offset,
6843*fae548d3Szrj 			     unsigned long base_address)
6844*fae548d3Szrj {
6845*fae548d3Szrj   unsigned char *next = start;
6846*fae548d3Szrj 
6847*fae548d3Szrj   while (1)
6848*fae548d3Szrj     {
6849*fae548d3Szrj       unsigned long off = offset + (start - next);
6850*fae548d3Szrj       enum dwarf_range_list_entry rlet;
6851*fae548d3Szrj       /* Initialize it due to a false compiler warning.  */
6852*fae548d3Szrj       dwarf_vma begin = -1, length, end = -1;
6853*fae548d3Szrj 
6854*fae548d3Szrj       if (start + 1 > finish)
6855*fae548d3Szrj 	{
6856*fae548d3Szrj 	  warn (_("Range list starting at offset 0x%lx is not terminated.\n"),
6857*fae548d3Szrj 		offset);
6858*fae548d3Szrj 	  break;
6859*fae548d3Szrj 	}
6860*fae548d3Szrj 
6861*fae548d3Szrj       printf ("    %8.8lx ", off);
6862*fae548d3Szrj 
6863*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (rlet, start, 1, finish);
6864*fae548d3Szrj 
6865*fae548d3Szrj       switch (rlet)
6866*fae548d3Szrj 	{
6867*fae548d3Szrj 	case DW_RLE_end_of_list:
6868*fae548d3Szrj 	  printf (_("<End of list>\n"));
6869*fae548d3Szrj 	  break;
6870*fae548d3Szrj 	case DW_RLE_base_address:
6871*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size, finish);
6872*fae548d3Szrj 	  print_dwarf_vma (base_address, pointer_size);
6873*fae548d3Szrj 	  printf (_("(base address)\n"));
6874*fae548d3Szrj 	  break;
6875*fae548d3Szrj 	case DW_RLE_start_length:
6876*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
6877*fae548d3Szrj 	  READ_ULEB (length, start, finish);
6878*fae548d3Szrj 	  end = begin + length;
6879*fae548d3Szrj 	  break;
6880*fae548d3Szrj 	case DW_RLE_offset_pair:
6881*fae548d3Szrj 	  READ_ULEB (begin, start, finish);
6882*fae548d3Szrj 	  READ_ULEB (end, start, finish);
6883*fae548d3Szrj 	  break;
6884*fae548d3Szrj 	case DW_RLE_start_end:
6885*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
6886*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (end, start, pointer_size, finish);
6887*fae548d3Szrj 	  break;
6888*fae548d3Szrj 	default:
6889*fae548d3Szrj 	  error (_("Invalid range list entry type %d\n"), rlet);
6890*fae548d3Szrj 	  rlet = DW_RLE_end_of_list;
6891*fae548d3Szrj 	  break;
6892*fae548d3Szrj 	}
6893*fae548d3Szrj       if (rlet == DW_RLE_end_of_list)
6894*fae548d3Szrj 	break;
6895*fae548d3Szrj       if (rlet == DW_RLE_base_address)
6896*fae548d3Szrj 	continue;
6897*fae548d3Szrj 
6898*fae548d3Szrj       print_dwarf_vma (begin + base_address, pointer_size);
6899*fae548d3Szrj       print_dwarf_vma (end + base_address, pointer_size);
6900*fae548d3Szrj 
6901*fae548d3Szrj       if (begin == end)
6902*fae548d3Szrj 	fputs (_("(start == end)"), stdout);
6903*fae548d3Szrj       else if (begin > end)
6904*fae548d3Szrj 	fputs (_("(start > end)"), stdout);
6905*fae548d3Szrj 
6906*fae548d3Szrj       putchar ('\n');
6907*fae548d3Szrj     }
6908*fae548d3Szrj }
6909*fae548d3Szrj 
6910*fae548d3Szrj static int
display_debug_ranges(struct dwarf_section * section,void * file ATTRIBUTE_UNUSED)6911*fae548d3Szrj display_debug_ranges (struct dwarf_section *section,
6912*fae548d3Szrj 		      void *file ATTRIBUTE_UNUSED)
6913*fae548d3Szrj {
6914*fae548d3Szrj   unsigned char *start = section->start;
6915*fae548d3Szrj   unsigned char *last_start = start;
6916*fae548d3Szrj   unsigned long bytes = section->size;
6917*fae548d3Szrj   unsigned char *section_begin = start;
6918*fae548d3Szrj   unsigned char *finish = start + bytes;
6919*fae548d3Szrj   unsigned int num_range_list, i;
6920*fae548d3Szrj   struct range_entry *range_entries, *range_entry_fill;
6921*fae548d3Szrj   int is_rnglists = strstr (section->name, "debug_rnglists") != NULL;
6922*fae548d3Szrj   /* Initialize it due to a false compiler warning.  */
6923*fae548d3Szrj   unsigned char address_size = 0;
6924*fae548d3Szrj 
6925*fae548d3Szrj   if (bytes == 0)
6926*fae548d3Szrj     {
6927*fae548d3Szrj       printf (_("\nThe %s section is empty.\n"), section->name);
6928*fae548d3Szrj       return 0;
6929*fae548d3Szrj     }
6930*fae548d3Szrj 
6931*fae548d3Szrj   if (is_rnglists)
6932*fae548d3Szrj     {
6933*fae548d3Szrj       dwarf_vma initial_length;
6934*fae548d3Szrj       unsigned int initial_length_size;
6935*fae548d3Szrj       unsigned char segment_selector_size;
6936*fae548d3Szrj       unsigned int offset_size, offset_entry_count;
6937*fae548d3Szrj       unsigned short version;
6938*fae548d3Szrj 
6939*fae548d3Szrj       /* Get and check the length of the block.  */
6940*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (initial_length, start, 4, finish);
6941*fae548d3Szrj 
6942*fae548d3Szrj       if (initial_length == 0xffffffff)
6943*fae548d3Szrj 	{
6944*fae548d3Szrj 	  /* This section is 64-bit DWARF 3.  */
6945*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (initial_length, start, 8, finish);
6946*fae548d3Szrj 	  offset_size = 8;
6947*fae548d3Szrj 	  initial_length_size = 12;
6948*fae548d3Szrj 	}
6949*fae548d3Szrj       else
6950*fae548d3Szrj 	{
6951*fae548d3Szrj 	  offset_size = 4;
6952*fae548d3Szrj 	  initial_length_size = 4;
6953*fae548d3Szrj 	}
6954*fae548d3Szrj 
6955*fae548d3Szrj       if (initial_length + initial_length_size > section->size)
6956*fae548d3Szrj 	{
6957*fae548d3Szrj 	  /* If the length field has a relocation against it, then we should
6958*fae548d3Szrj 	     not complain if it is inaccurate (and probably negative).
6959*fae548d3Szrj 	     It is copied from .debug_line handling code.  */
6960*fae548d3Szrj 	  if (reloc_at (section, (start - section->start) - offset_size))
6961*fae548d3Szrj 	    {
6962*fae548d3Szrj 	      initial_length = (finish - start) - initial_length_size;
6963*fae548d3Szrj 	    }
6964*fae548d3Szrj 	  else
6965*fae548d3Szrj 	    {
6966*fae548d3Szrj 	      warn (_("The length field (0x%lx) in the debug_rnglists header is wrong - the section is too small\n"),
6967*fae548d3Szrj 		    (long) initial_length);
6968*fae548d3Szrj 	      return 0;
6969*fae548d3Szrj 	    }
6970*fae548d3Szrj 	}
6971*fae548d3Szrj 
6972*fae548d3Szrj       /* Get and check the version number.  */
6973*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (version, start, 2, finish);
6974*fae548d3Szrj 
6975*fae548d3Szrj       if (version != 5)
6976*fae548d3Szrj 	{
6977*fae548d3Szrj 	  warn (_("Only DWARF version 5 debug_rnglists info "
6978*fae548d3Szrj 		  "is currently supported.\n"));
6979*fae548d3Szrj 	  return 0;
6980*fae548d3Szrj 	}
6981*fae548d3Szrj 
6982*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (address_size, start, 1, finish);
6983*fae548d3Szrj 
6984*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (segment_selector_size, start, 1, finish);
6985*fae548d3Szrj       if (segment_selector_size != 0)
6986*fae548d3Szrj 	{
6987*fae548d3Szrj 	  warn (_("The %s section contains "
6988*fae548d3Szrj 		  "unsupported segment selector size: %d.\n"),
6989*fae548d3Szrj 		section->name, segment_selector_size);
6990*fae548d3Szrj 	  return 0;
6991*fae548d3Szrj 	}
6992*fae548d3Szrj 
6993*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (offset_entry_count, start, 4, finish);
6994*fae548d3Szrj       if (offset_entry_count != 0)
6995*fae548d3Szrj 	{
6996*fae548d3Szrj 	  warn (_("The %s section contains "
6997*fae548d3Szrj 		  "unsupported offset entry count: %u.\n"),
6998*fae548d3Szrj 		section->name, offset_entry_count);
6999*fae548d3Szrj 	  return 0;
7000*fae548d3Szrj 	}
7001*fae548d3Szrj     }
7002*fae548d3Szrj 
7003*fae548d3Szrj   if (load_debug_info (file) == 0)
7004*fae548d3Szrj     {
7005*fae548d3Szrj       warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
7006*fae548d3Szrj 	    section->name);
7007*fae548d3Szrj       return 0;
7008*fae548d3Szrj     }
7009*fae548d3Szrj 
7010*fae548d3Szrj   num_range_list = 0;
7011*fae548d3Szrj   for (i = 0; i < num_debug_info_entries; i++)
7012*fae548d3Szrj     num_range_list += debug_information [i].num_range_lists;
7013*fae548d3Szrj 
7014*fae548d3Szrj   if (num_range_list == 0)
7015*fae548d3Szrj     {
7016*fae548d3Szrj       /* This can happen when the file was compiled with -gsplit-debug
7017*fae548d3Szrj 	 which removes references to range lists from the primary .o file.  */
7018*fae548d3Szrj       printf (_("No range lists in .debug_info section.\n"));
7019*fae548d3Szrj       return 1;
7020*fae548d3Szrj     }
7021*fae548d3Szrj 
7022*fae548d3Szrj   range_entries = (struct range_entry *)
7023*fae548d3Szrj       xmalloc (sizeof (*range_entries) * num_range_list);
7024*fae548d3Szrj   range_entry_fill = range_entries;
7025*fae548d3Szrj 
7026*fae548d3Szrj   for (i = 0; i < num_debug_info_entries; i++)
7027*fae548d3Szrj     {
7028*fae548d3Szrj       debug_info *debug_info_p = &debug_information[i];
7029*fae548d3Szrj       unsigned int j;
7030*fae548d3Szrj 
7031*fae548d3Szrj       for (j = 0; j < debug_info_p->num_range_lists; j++)
7032*fae548d3Szrj 	{
7033*fae548d3Szrj 	  range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
7034*fae548d3Szrj 	  range_entry_fill->debug_info_p = debug_info_p;
7035*fae548d3Szrj 	  range_entry_fill++;
7036*fae548d3Szrj 	}
7037*fae548d3Szrj     }
7038*fae548d3Szrj 
7039*fae548d3Szrj   qsort (range_entries, num_range_list, sizeof (*range_entries),
7040*fae548d3Szrj 	 range_entry_compar);
7041*fae548d3Szrj 
7042*fae548d3Szrj   if (dwarf_check != 0 && range_entries[0].ranges_offset != 0)
7043*fae548d3Szrj     warn (_("Range lists in %s section start at 0x%lx\n"),
7044*fae548d3Szrj 	  section->name, (unsigned long) range_entries[0].ranges_offset);
7045*fae548d3Szrj 
7046*fae548d3Szrj   introduce (section, FALSE);
7047*fae548d3Szrj 
7048*fae548d3Szrj   printf (_("    Offset   Begin    End\n"));
7049*fae548d3Szrj 
7050*fae548d3Szrj   for (i = 0; i < num_range_list; i++)
7051*fae548d3Szrj     {
7052*fae548d3Szrj       struct range_entry *range_entry = &range_entries[i];
7053*fae548d3Szrj       debug_info *debug_info_p = range_entry->debug_info_p;
7054*fae548d3Szrj       unsigned int pointer_size;
7055*fae548d3Szrj       dwarf_vma offset;
7056*fae548d3Szrj       unsigned char *next;
7057*fae548d3Szrj       dwarf_vma base_address;
7058*fae548d3Szrj 
7059*fae548d3Szrj       pointer_size = (is_rnglists ? address_size : debug_info_p->pointer_size);
7060*fae548d3Szrj       offset = range_entry->ranges_offset;
7061*fae548d3Szrj       next = section_begin + offset;
7062*fae548d3Szrj       base_address = debug_info_p->base_address;
7063*fae548d3Szrj 
7064*fae548d3Szrj       /* PR 17512: file: 001-101485-0.001:0.1.  */
7065*fae548d3Szrj       if (pointer_size < 2 || pointer_size > 8)
7066*fae548d3Szrj 	{
7067*fae548d3Szrj 	  warn (_("Corrupt pointer size (%d) in debug entry at offset %8.8lx\n"),
7068*fae548d3Szrj 		pointer_size, (unsigned long) offset);
7069*fae548d3Szrj 	  continue;
7070*fae548d3Szrj 	}
7071*fae548d3Szrj 
7072*fae548d3Szrj       if (next < section_begin || next >= finish)
7073*fae548d3Szrj 	{
7074*fae548d3Szrj 	  warn (_("Corrupt offset (%#8.8lx) in range entry %u\n"),
7075*fae548d3Szrj 		(unsigned long) offset, i);
7076*fae548d3Szrj 	  continue;
7077*fae548d3Szrj 	}
7078*fae548d3Szrj 
7079*fae548d3Szrj       if (dwarf_check != 0 && i > 0)
7080*fae548d3Szrj 	{
7081*fae548d3Szrj 	  if (start < next)
7082*fae548d3Szrj 	    warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
7083*fae548d3Szrj 		  (unsigned long) (start - section_begin),
7084*fae548d3Szrj 		  (unsigned long) (next - section_begin), section->name);
7085*fae548d3Szrj 	  else if (start > next)
7086*fae548d3Szrj 	    {
7087*fae548d3Szrj 	      if (next == last_start)
7088*fae548d3Szrj 		continue;
7089*fae548d3Szrj 	      warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
7090*fae548d3Szrj 		    (unsigned long) (start - section_begin),
7091*fae548d3Szrj 		    (unsigned long) (next - section_begin), section->name);
7092*fae548d3Szrj 	    }
7093*fae548d3Szrj 	}
7094*fae548d3Szrj 
7095*fae548d3Szrj       start = next;
7096*fae548d3Szrj       last_start = next;
7097*fae548d3Szrj 
7098*fae548d3Szrj       (is_rnglists ? display_debug_rnglists_list : display_debug_ranges_list)
7099*fae548d3Szrj 	(start, finish, pointer_size, offset, base_address);
7100*fae548d3Szrj     }
7101*fae548d3Szrj   putchar ('\n');
7102*fae548d3Szrj 
7103*fae548d3Szrj   free (range_entries);
7104*fae548d3Szrj 
7105*fae548d3Szrj   return 1;
7106*fae548d3Szrj }
7107*fae548d3Szrj 
7108*fae548d3Szrj typedef struct Frame_Chunk
7109*fae548d3Szrj {
7110*fae548d3Szrj   struct Frame_Chunk *next;
7111*fae548d3Szrj   unsigned char *chunk_start;
7112*fae548d3Szrj   unsigned int ncols;
7113*fae548d3Szrj   /* DW_CFA_{undefined,same_value,offset,register,unreferenced}  */
7114*fae548d3Szrj   short int *col_type;
7115*fae548d3Szrj   int *col_offset;
7116*fae548d3Szrj   char *augmentation;
7117*fae548d3Szrj   unsigned int code_factor;
7118*fae548d3Szrj   int data_factor;
7119*fae548d3Szrj   dwarf_vma pc_begin;
7120*fae548d3Szrj   dwarf_vma pc_range;
7121*fae548d3Szrj   unsigned int cfa_reg;
7122*fae548d3Szrj   dwarf_vma cfa_offset;
7123*fae548d3Szrj   unsigned int ra;
7124*fae548d3Szrj   unsigned char fde_encoding;
7125*fae548d3Szrj   unsigned char cfa_exp;
7126*fae548d3Szrj   unsigned char ptr_size;
7127*fae548d3Szrj   unsigned char segment_size;
7128*fae548d3Szrj }
7129*fae548d3Szrj Frame_Chunk;
7130*fae548d3Szrj 
7131*fae548d3Szrj typedef const char *(*dwarf_regname_lookup_ftype) (unsigned int);
7132*fae548d3Szrj static dwarf_regname_lookup_ftype dwarf_regnames_lookup_func;
7133*fae548d3Szrj static const char *const *dwarf_regnames;
7134*fae548d3Szrj static unsigned int dwarf_regnames_count;
7135*fae548d3Szrj 
7136*fae548d3Szrj 
7137*fae548d3Szrj /* A marker for a col_type that means this column was never referenced
7138*fae548d3Szrj    in the frame info.  */
7139*fae548d3Szrj #define DW_CFA_unreferenced (-1)
7140*fae548d3Szrj 
7141*fae548d3Szrj /* Return 0 if no more space is needed, 1 if more space is needed,
7142*fae548d3Szrj    -1 for invalid reg.  */
7143*fae548d3Szrj 
7144*fae548d3Szrj static int
frame_need_space(Frame_Chunk * fc,unsigned int reg)7145*fae548d3Szrj frame_need_space (Frame_Chunk *fc, unsigned int reg)
7146*fae548d3Szrj {
7147*fae548d3Szrj   unsigned int prev = fc->ncols;
7148*fae548d3Szrj 
7149*fae548d3Szrj   if (reg < (unsigned int) fc->ncols)
7150*fae548d3Szrj     return 0;
7151*fae548d3Szrj 
7152*fae548d3Szrj   if (dwarf_regnames_count > 0
7153*fae548d3Szrj       && reg > dwarf_regnames_count)
7154*fae548d3Szrj     return -1;
7155*fae548d3Szrj 
7156*fae548d3Szrj   fc->ncols = reg + 1;
7157*fae548d3Szrj   /* PR 17512: file: 10450-2643-0.004.
7158*fae548d3Szrj      If reg == -1 then this can happen...  */
7159*fae548d3Szrj   if (fc->ncols == 0)
7160*fae548d3Szrj     return -1;
7161*fae548d3Szrj 
7162*fae548d3Szrj   /* PR 17512: file: 2844a11d.  */
7163*fae548d3Szrj   if (fc->ncols > 1024 && dwarf_regnames_count == 0)
7164*fae548d3Szrj     {
7165*fae548d3Szrj       error (_("Unfeasibly large register number: %u\n"), reg);
7166*fae548d3Szrj       fc->ncols = 0;
7167*fae548d3Szrj       /* FIXME: 1024 is an arbitrary limit.  Increase it if
7168*fae548d3Szrj 	 we ever encounter a valid binary that exceeds it.  */
7169*fae548d3Szrj       return -1;
7170*fae548d3Szrj     }
7171*fae548d3Szrj 
7172*fae548d3Szrj   fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
7173*fae548d3Szrj 					  sizeof (short int));
7174*fae548d3Szrj   fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
7175*fae548d3Szrj   /* PR 17512: file:002-10025-0.005.  */
7176*fae548d3Szrj   if (fc->col_type == NULL || fc->col_offset == NULL)
7177*fae548d3Szrj     {
7178*fae548d3Szrj       error (_("Out of memory allocating %u columns in dwarf frame arrays\n"),
7179*fae548d3Szrj 	     fc->ncols);
7180*fae548d3Szrj       fc->ncols = 0;
7181*fae548d3Szrj       return -1;
7182*fae548d3Szrj     }
7183*fae548d3Szrj 
7184*fae548d3Szrj   while (prev < fc->ncols)
7185*fae548d3Szrj     {
7186*fae548d3Szrj       fc->col_type[prev] = DW_CFA_unreferenced;
7187*fae548d3Szrj       fc->col_offset[prev] = 0;
7188*fae548d3Szrj       prev++;
7189*fae548d3Szrj     }
7190*fae548d3Szrj   return 1;
7191*fae548d3Szrj }
7192*fae548d3Szrj 
7193*fae548d3Szrj static const char *const dwarf_regnames_i386[] =
7194*fae548d3Szrj {
7195*fae548d3Szrj   "eax", "ecx", "edx", "ebx",			  /* 0 - 3  */
7196*fae548d3Szrj   "esp", "ebp", "esi", "edi",			  /* 4 - 7  */
7197*fae548d3Szrj   "eip", "eflags", NULL,			  /* 8 - 10  */
7198*fae548d3Szrj   "st0", "st1", "st2", "st3",			  /* 11 - 14  */
7199*fae548d3Szrj   "st4", "st5", "st6", "st7",			  /* 15 - 18  */
7200*fae548d3Szrj   NULL, NULL,					  /* 19 - 20  */
7201*fae548d3Szrj   "xmm0", "xmm1", "xmm2", "xmm3",		  /* 21 - 24  */
7202*fae548d3Szrj   "xmm4", "xmm5", "xmm6", "xmm7",		  /* 25 - 28  */
7203*fae548d3Szrj   "mm0", "mm1", "mm2", "mm3",			  /* 29 - 32  */
7204*fae548d3Szrj   "mm4", "mm5", "mm6", "mm7",			  /* 33 - 36  */
7205*fae548d3Szrj   "fcw", "fsw", "mxcsr",			  /* 37 - 39  */
7206*fae548d3Szrj   "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47  */
7207*fae548d3Szrj   "tr", "ldtr",					  /* 48 - 49  */
7208*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57  */
7209*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65  */
7210*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73  */
7211*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81  */
7212*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89  */
7213*fae548d3Szrj   NULL, NULL, NULL,				  /* 90 - 92  */
7214*fae548d3Szrj   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"  /* 93 - 100  */
7215*fae548d3Szrj };
7216*fae548d3Szrj 
7217*fae548d3Szrj static const char *const dwarf_regnames_iamcu[] =
7218*fae548d3Szrj {
7219*fae548d3Szrj   "eax", "ecx", "edx", "ebx",			  /* 0 - 3  */
7220*fae548d3Szrj   "esp", "ebp", "esi", "edi",			  /* 4 - 7  */
7221*fae548d3Szrj   "eip", "eflags", NULL,			  /* 8 - 10  */
7222*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 11 - 18  */
7223*fae548d3Szrj   NULL, NULL,					  /* 19 - 20  */
7224*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 21 - 28  */
7225*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 29 - 36  */
7226*fae548d3Szrj   NULL, NULL, NULL,				  /* 37 - 39  */
7227*fae548d3Szrj   "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL, /* 40 - 47  */
7228*fae548d3Szrj   "tr", "ldtr",					  /* 48 - 49  */
7229*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 50 - 57  */
7230*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 58 - 65  */
7231*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 66 - 73  */
7232*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 74 - 81  */
7233*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 82 - 89  */
7234*fae548d3Szrj   NULL, NULL, NULL,				  /* 90 - 92  */
7235*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL  /* 93 - 100  */
7236*fae548d3Szrj };
7237*fae548d3Szrj 
7238*fae548d3Szrj static void
init_dwarf_regnames_i386(void)7239*fae548d3Szrj init_dwarf_regnames_i386 (void)
7240*fae548d3Szrj {
7241*fae548d3Szrj   dwarf_regnames = dwarf_regnames_i386;
7242*fae548d3Szrj   dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
7243*fae548d3Szrj   dwarf_regnames_lookup_func = regname_internal_by_table_only;
7244*fae548d3Szrj }
7245*fae548d3Szrj 
7246*fae548d3Szrj static void
init_dwarf_regnames_iamcu(void)7247*fae548d3Szrj init_dwarf_regnames_iamcu (void)
7248*fae548d3Szrj {
7249*fae548d3Szrj   dwarf_regnames = dwarf_regnames_iamcu;
7250*fae548d3Szrj   dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_iamcu);
7251*fae548d3Szrj   dwarf_regnames_lookup_func = regname_internal_by_table_only;
7252*fae548d3Szrj }
7253*fae548d3Szrj 
7254*fae548d3Szrj static const char *const dwarf_regnames_x86_64[] =
7255*fae548d3Szrj {
7256*fae548d3Szrj   "rax", "rdx", "rcx", "rbx",
7257*fae548d3Szrj   "rsi", "rdi", "rbp", "rsp",
7258*fae548d3Szrj   "r8",  "r9",  "r10", "r11",
7259*fae548d3Szrj   "r12", "r13", "r14", "r15",
7260*fae548d3Szrj   "rip",
7261*fae548d3Szrj   "xmm0",  "xmm1",  "xmm2",  "xmm3",
7262*fae548d3Szrj   "xmm4",  "xmm5",  "xmm6",  "xmm7",
7263*fae548d3Szrj   "xmm8",  "xmm9",  "xmm10", "xmm11",
7264*fae548d3Szrj   "xmm12", "xmm13", "xmm14", "xmm15",
7265*fae548d3Szrj   "st0", "st1", "st2", "st3",
7266*fae548d3Szrj   "st4", "st5", "st6", "st7",
7267*fae548d3Szrj   "mm0", "mm1", "mm2", "mm3",
7268*fae548d3Szrj   "mm4", "mm5", "mm6", "mm7",
7269*fae548d3Szrj   "rflags",
7270*fae548d3Szrj   "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
7271*fae548d3Szrj   "fs.base", "gs.base", NULL, NULL,
7272*fae548d3Szrj   "tr", "ldtr",
7273*fae548d3Szrj   "mxcsr", "fcw", "fsw",
7274*fae548d3Szrj   "xmm16",  "xmm17",  "xmm18",  "xmm19",
7275*fae548d3Szrj   "xmm20",  "xmm21",  "xmm22",  "xmm23",
7276*fae548d3Szrj   "xmm24",  "xmm25",  "xmm26",  "xmm27",
7277*fae548d3Szrj   "xmm28",  "xmm29",  "xmm30",  "xmm31",
7278*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 83 - 90  */
7279*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 91 - 98  */
7280*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 99 - 106  */
7281*fae548d3Szrj   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 107 - 114  */
7282*fae548d3Szrj   NULL, NULL, NULL,				  /* 115 - 117  */
7283*fae548d3Szrj   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
7284*fae548d3Szrj };
7285*fae548d3Szrj 
7286*fae548d3Szrj static void
init_dwarf_regnames_x86_64(void)7287*fae548d3Szrj init_dwarf_regnames_x86_64 (void)
7288*fae548d3Szrj {
7289*fae548d3Szrj   dwarf_regnames = dwarf_regnames_x86_64;
7290*fae548d3Szrj   dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
7291*fae548d3Szrj   dwarf_regnames_lookup_func = regname_internal_by_table_only;
7292*fae548d3Szrj }
7293*fae548d3Szrj 
7294*fae548d3Szrj static const char *const dwarf_regnames_aarch64[] =
7295*fae548d3Szrj {
7296*fae548d3Szrj    "x0",  "x1",  "x2",  "x3",  "x4",  "x5",  "x6",  "x7",
7297*fae548d3Szrj    "x8",  "x9", "x10", "x11", "x12", "x13", "x14", "x15",
7298*fae548d3Szrj   "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
7299*fae548d3Szrj   "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp",
7300*fae548d3Szrj    NULL, "elr",  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
7301*fae548d3Szrj    NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  "vg", "ffr",
7302*fae548d3Szrj    "p0",  "p1",  "p2",  "p3",  "p4",  "p5",  "p6",  "p7",
7303*fae548d3Szrj    "p8",  "p9", "p10", "p11", "p12", "p13", "p14", "p15",
7304*fae548d3Szrj    "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",
7305*fae548d3Szrj    "v8",  "v9", "v10", "v11", "v12", "v13", "v14", "v15",
7306*fae548d3Szrj   "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
7307*fae548d3Szrj   "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
7308*fae548d3Szrj    "z0",  "z1",  "z2",  "z3",  "z4",  "z5",  "z6",  "z7",
7309*fae548d3Szrj    "z8",  "z9", "z10", "z11", "z12", "z13", "z14", "z15",
7310*fae548d3Szrj   "z16", "z17", "z18", "z19", "z20", "z21", "z22", "z23",
7311*fae548d3Szrj   "z24", "z25", "z26", "z27", "z28", "z29", "z30", "z31",
7312*fae548d3Szrj };
7313*fae548d3Szrj 
7314*fae548d3Szrj static void
init_dwarf_regnames_aarch64(void)7315*fae548d3Szrj init_dwarf_regnames_aarch64 (void)
7316*fae548d3Szrj {
7317*fae548d3Szrj   dwarf_regnames = dwarf_regnames_aarch64;
7318*fae548d3Szrj   dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_aarch64);
7319*fae548d3Szrj   dwarf_regnames_lookup_func = regname_internal_by_table_only;
7320*fae548d3Szrj }
7321*fae548d3Szrj 
7322*fae548d3Szrj static const char *const dwarf_regnames_s390[] =
7323*fae548d3Szrj {
7324*fae548d3Szrj   /* Avoid saying "r5 (r5)", so omit the names of r0-r15.  */
7325*fae548d3Szrj   NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
7326*fae548d3Szrj   NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
7327*fae548d3Szrj   "f0",  "f2",  "f4",  "f6",  "f1",  "f3",  "f5",  "f7",
7328*fae548d3Szrj   "f8",  "f10", "f12", "f14", "f9",  "f11", "f13", "f15",
7329*fae548d3Szrj   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
7330*fae548d3Szrj   "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", "cr15",
7331*fae548d3Szrj   "a0",  "a1",  "a2",  "a3",  "a4",  "a5",  "a6",  "a7",
7332*fae548d3Szrj   "a8",  "a9",  "a10", "a11", "a12", "a13", "a14", "a15",
7333*fae548d3Szrj   "pswm", "pswa",
7334*fae548d3Szrj   NULL, NULL,
7335*fae548d3Szrj   "v16", "v18", "v20", "v22", "v17", "v19", "v21", "v23",
7336*fae548d3Szrj   "v24", "v26", "v28", "v30", "v25", "v27", "v29", "v31",
7337*fae548d3Szrj };
7338*fae548d3Szrj 
7339*fae548d3Szrj static void
init_dwarf_regnames_s390(void)7340*fae548d3Szrj init_dwarf_regnames_s390 (void)
7341*fae548d3Szrj {
7342*fae548d3Szrj   dwarf_regnames = dwarf_regnames_s390;
7343*fae548d3Szrj   dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_s390);
7344*fae548d3Szrj   dwarf_regnames_lookup_func = regname_internal_by_table_only;
7345*fae548d3Szrj }
7346*fae548d3Szrj 
7347*fae548d3Szrj static const char *const dwarf_regnames_riscv[] =
7348*fae548d3Szrj {
7349*fae548d3Szrj  "zero", "ra",   "sp",   "gp",  "tp",  "t0",  "t1",  "t2",  /* 0  - 7 */
7350*fae548d3Szrj  "s0",   "s1",   "a0",   "a1",  "a2",  "a3",  "a4",  "a5",  /* 8  - 15 */
7351*fae548d3Szrj  "a6",   "a7",   "s2",   "s3",  "s4",  "s5",  "s6",  "s7",  /* 16 - 23 */
7352*fae548d3Szrj  "s8",   "s9",   "s10",  "s11", "t3",  "t4",  "t5",  "t6",  /* 24 - 31 */
7353*fae548d3Szrj  "ft0",  "ft1",  "ft2",  "ft3", "ft4", "ft5", "ft6", "ft7", /* 32 - 39 */
7354*fae548d3Szrj  "fs0",  "fs1",                                             /* 40 - 41 */
7355*fae548d3Szrj  "fa0",  "fa1",  "fa2",  "fa3", "fa4", "fa5", "fa6", "fa7", /* 42 - 49 */
7356*fae548d3Szrj  "fs2",  "fs3",  "fs4",  "fs5", "fs6", "fs7", "fs8", "fs9", /* 50 - 57 */
7357*fae548d3Szrj  "fs10", "fs11",                                            /* 58 - 59 */
7358*fae548d3Szrj  "ft8",  "ft9",  "ft10", "ft11"                             /* 60 - 63 */
7359*fae548d3Szrj };
7360*fae548d3Szrj 
7361*fae548d3Szrj /* A RISC-V replacement for REGNAME_INTERNAL_BY_TABLE_ONLY which handles
7362*fae548d3Szrj    the large number of CSRs.  */
7363*fae548d3Szrj 
7364*fae548d3Szrj static const char *
regname_internal_riscv(unsigned int regno)7365*fae548d3Szrj regname_internal_riscv (unsigned int regno)
7366*fae548d3Szrj {
7367*fae548d3Szrj   const char *name = NULL;
7368*fae548d3Szrj 
7369*fae548d3Szrj   /* Lookup in the table first, this covers GPR and FPR.  */
7370*fae548d3Szrj   if (regno < ARRAY_SIZE (dwarf_regnames_riscv))
7371*fae548d3Szrj     name = dwarf_regnames_riscv [regno];
7372*fae548d3Szrj   else if (regno >= 4096 && regno <= 8191)
7373*fae548d3Szrj     {
7374*fae548d3Szrj       /* This might be a CSR, these live in a sparse number space from 4096
7375*fae548d3Szrj 	 to 8191  These numbers are defined in the RISC-V ELF ABI
7376*fae548d3Szrj 	 document.  */
7377*fae548d3Szrj       switch (regno)
7378*fae548d3Szrj 	{
7379*fae548d3Szrj #define DECLARE_CSR(NAME,VALUE) case VALUE + 4096: name = #NAME; break;
7380*fae548d3Szrj #include "opcode/riscv-opc.h"
7381*fae548d3Szrj #undef DECLARE_CSR
7382*fae548d3Szrj 
7383*fae548d3Szrj 	default:
7384*fae548d3Szrj 	  {
7385*fae548d3Szrj 	    static char csr_name[10];
7386*fae548d3Szrj 	    snprintf (csr_name, sizeof (csr_name), "csr%d", (regno - 4096));
7387*fae548d3Szrj 	    name = csr_name;
7388*fae548d3Szrj 	  }
7389*fae548d3Szrj 	  break;
7390*fae548d3Szrj 	}
7391*fae548d3Szrj     }
7392*fae548d3Szrj 
7393*fae548d3Szrj   return name;
7394*fae548d3Szrj }
7395*fae548d3Szrj 
7396*fae548d3Szrj static void
init_dwarf_regnames_riscv(void)7397*fae548d3Szrj init_dwarf_regnames_riscv (void)
7398*fae548d3Szrj {
7399*fae548d3Szrj   dwarf_regnames = NULL;
7400*fae548d3Szrj   dwarf_regnames_count = 8192;
7401*fae548d3Szrj   dwarf_regnames_lookup_func = regname_internal_riscv;
7402*fae548d3Szrj }
7403*fae548d3Szrj 
7404*fae548d3Szrj void
init_dwarf_regnames_by_elf_machine_code(unsigned int e_machine)7405*fae548d3Szrj init_dwarf_regnames_by_elf_machine_code (unsigned int e_machine)
7406*fae548d3Szrj {
7407*fae548d3Szrj   dwarf_regnames_lookup_func = NULL;
7408*fae548d3Szrj 
7409*fae548d3Szrj   switch (e_machine)
7410*fae548d3Szrj     {
7411*fae548d3Szrj     case EM_386:
7412*fae548d3Szrj       init_dwarf_regnames_i386 ();
7413*fae548d3Szrj       break;
7414*fae548d3Szrj 
7415*fae548d3Szrj     case EM_IAMCU:
7416*fae548d3Szrj       init_dwarf_regnames_iamcu ();
7417*fae548d3Szrj       break;
7418*fae548d3Szrj 
7419*fae548d3Szrj     case EM_X86_64:
7420*fae548d3Szrj     case EM_L1OM:
7421*fae548d3Szrj     case EM_K1OM:
7422*fae548d3Szrj       init_dwarf_regnames_x86_64 ();
7423*fae548d3Szrj       break;
7424*fae548d3Szrj 
7425*fae548d3Szrj     case EM_AARCH64:
7426*fae548d3Szrj       init_dwarf_regnames_aarch64 ();
7427*fae548d3Szrj       break;
7428*fae548d3Szrj 
7429*fae548d3Szrj     case EM_S390:
7430*fae548d3Szrj       init_dwarf_regnames_s390 ();
7431*fae548d3Szrj       break;
7432*fae548d3Szrj 
7433*fae548d3Szrj     case EM_RISCV:
7434*fae548d3Szrj       init_dwarf_regnames_riscv ();
7435*fae548d3Szrj       break;
7436*fae548d3Szrj 
7437*fae548d3Szrj     default:
7438*fae548d3Szrj       break;
7439*fae548d3Szrj     }
7440*fae548d3Szrj }
7441*fae548d3Szrj 
7442*fae548d3Szrj /* Initialize the DWARF register name lookup state based on the
7443*fae548d3Szrj    architecture and specific machine type of a BFD.  */
7444*fae548d3Szrj 
7445*fae548d3Szrj void
init_dwarf_regnames_by_bfd_arch_and_mach(enum bfd_architecture arch,unsigned long mach)7446*fae548d3Szrj init_dwarf_regnames_by_bfd_arch_and_mach (enum bfd_architecture arch,
7447*fae548d3Szrj 					  unsigned long mach)
7448*fae548d3Szrj {
7449*fae548d3Szrj   dwarf_regnames_lookup_func = NULL;
7450*fae548d3Szrj 
7451*fae548d3Szrj   switch (arch)
7452*fae548d3Szrj     {
7453*fae548d3Szrj     case bfd_arch_i386:
7454*fae548d3Szrj       switch (mach)
7455*fae548d3Szrj 	{
7456*fae548d3Szrj 	case bfd_mach_x86_64:
7457*fae548d3Szrj 	case bfd_mach_x86_64_intel_syntax:
7458*fae548d3Szrj 	case bfd_mach_x86_64_nacl:
7459*fae548d3Szrj 	case bfd_mach_x64_32:
7460*fae548d3Szrj 	case bfd_mach_x64_32_intel_syntax:
7461*fae548d3Szrj 	case bfd_mach_x64_32_nacl:
7462*fae548d3Szrj 	  init_dwarf_regnames_x86_64 ();
7463*fae548d3Szrj 	  break;
7464*fae548d3Szrj 
7465*fae548d3Szrj 	default:
7466*fae548d3Szrj 	  init_dwarf_regnames_i386 ();
7467*fae548d3Szrj 	  break;
7468*fae548d3Szrj 	}
7469*fae548d3Szrj       break;
7470*fae548d3Szrj 
7471*fae548d3Szrj     case bfd_arch_iamcu:
7472*fae548d3Szrj       init_dwarf_regnames_iamcu ();
7473*fae548d3Szrj       break;
7474*fae548d3Szrj 
7475*fae548d3Szrj     case bfd_arch_aarch64:
7476*fae548d3Szrj       init_dwarf_regnames_aarch64();
7477*fae548d3Szrj       break;
7478*fae548d3Szrj 
7479*fae548d3Szrj     case bfd_arch_s390:
7480*fae548d3Szrj       init_dwarf_regnames_s390 ();
7481*fae548d3Szrj       break;
7482*fae548d3Szrj 
7483*fae548d3Szrj     case bfd_arch_riscv:
7484*fae548d3Szrj       init_dwarf_regnames_riscv ();
7485*fae548d3Szrj       break;
7486*fae548d3Szrj 
7487*fae548d3Szrj     default:
7488*fae548d3Szrj       break;
7489*fae548d3Szrj     }
7490*fae548d3Szrj }
7491*fae548d3Szrj 
7492*fae548d3Szrj static const char *
regname_internal_by_table_only(unsigned int regno)7493*fae548d3Szrj regname_internal_by_table_only (unsigned int regno)
7494*fae548d3Szrj {
7495*fae548d3Szrj   if (dwarf_regnames != NULL
7496*fae548d3Szrj       && regno < dwarf_regnames_count
7497*fae548d3Szrj       && dwarf_regnames [regno] != NULL)
7498*fae548d3Szrj     return dwarf_regnames [regno];
7499*fae548d3Szrj 
7500*fae548d3Szrj   return NULL;
7501*fae548d3Szrj }
7502*fae548d3Szrj 
7503*fae548d3Szrj static const char *
regname(unsigned int regno,int name_only_p)7504*fae548d3Szrj regname (unsigned int regno, int name_only_p)
7505*fae548d3Szrj {
7506*fae548d3Szrj   static char reg[64];
7507*fae548d3Szrj 
7508*fae548d3Szrj   const char *name = NULL;
7509*fae548d3Szrj 
7510*fae548d3Szrj   if (dwarf_regnames_lookup_func != NULL)
7511*fae548d3Szrj     name = dwarf_regnames_lookup_func (regno);
7512*fae548d3Szrj 
7513*fae548d3Szrj   if (name != NULL)
7514*fae548d3Szrj     {
7515*fae548d3Szrj       if (name_only_p)
7516*fae548d3Szrj 	return name;
7517*fae548d3Szrj       snprintf (reg, sizeof (reg), "r%d (%s)", regno, name);
7518*fae548d3Szrj     }
7519*fae548d3Szrj   else
7520*fae548d3Szrj     snprintf (reg, sizeof (reg), "r%d", regno);
7521*fae548d3Szrj   return reg;
7522*fae548d3Szrj }
7523*fae548d3Szrj 
7524*fae548d3Szrj static void
frame_display_row(Frame_Chunk * fc,int * need_col_headers,unsigned int * max_regs)7525*fae548d3Szrj frame_display_row (Frame_Chunk *fc, int *need_col_headers, unsigned int *max_regs)
7526*fae548d3Szrj {
7527*fae548d3Szrj   unsigned int r;
7528*fae548d3Szrj   char tmp[100];
7529*fae548d3Szrj 
7530*fae548d3Szrj   if (*max_regs != fc->ncols)
7531*fae548d3Szrj     *max_regs = fc->ncols;
7532*fae548d3Szrj 
7533*fae548d3Szrj   if (*need_col_headers)
7534*fae548d3Szrj     {
7535*fae548d3Szrj       static const char *sloc = "   LOC";
7536*fae548d3Szrj 
7537*fae548d3Szrj       *need_col_headers = 0;
7538*fae548d3Szrj 
7539*fae548d3Szrj       printf ("%-*s CFA      ", eh_addr_size * 2, sloc);
7540*fae548d3Szrj 
7541*fae548d3Szrj       for (r = 0; r < *max_regs; r++)
7542*fae548d3Szrj 	if (fc->col_type[r] != DW_CFA_unreferenced)
7543*fae548d3Szrj 	  {
7544*fae548d3Szrj 	    if (r == fc->ra)
7545*fae548d3Szrj 	      printf ("ra    ");
7546*fae548d3Szrj 	    else
7547*fae548d3Szrj 	      printf ("%-5s ", regname (r, 1));
7548*fae548d3Szrj 	  }
7549*fae548d3Szrj 
7550*fae548d3Szrj       printf ("\n");
7551*fae548d3Szrj     }
7552*fae548d3Szrj 
7553*fae548d3Szrj   print_dwarf_vma (fc->pc_begin, eh_addr_size);
7554*fae548d3Szrj   if (fc->cfa_exp)
7555*fae548d3Szrj     strcpy (tmp, "exp");
7556*fae548d3Szrj   else
7557*fae548d3Szrj     sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), (int) fc->cfa_offset);
7558*fae548d3Szrj   printf ("%-8s ", tmp);
7559*fae548d3Szrj 
7560*fae548d3Szrj   for (r = 0; r < fc->ncols; r++)
7561*fae548d3Szrj     {
7562*fae548d3Szrj       if (fc->col_type[r] != DW_CFA_unreferenced)
7563*fae548d3Szrj 	{
7564*fae548d3Szrj 	  switch (fc->col_type[r])
7565*fae548d3Szrj 	    {
7566*fae548d3Szrj 	    case DW_CFA_undefined:
7567*fae548d3Szrj 	      strcpy (tmp, "u");
7568*fae548d3Szrj 	      break;
7569*fae548d3Szrj 	    case DW_CFA_same_value:
7570*fae548d3Szrj 	      strcpy (tmp, "s");
7571*fae548d3Szrj 	      break;
7572*fae548d3Szrj 	    case DW_CFA_offset:
7573*fae548d3Szrj 	      sprintf (tmp, "c%+d", fc->col_offset[r]);
7574*fae548d3Szrj 	      break;
7575*fae548d3Szrj 	    case DW_CFA_val_offset:
7576*fae548d3Szrj 	      sprintf (tmp, "v%+d", fc->col_offset[r]);
7577*fae548d3Szrj 	      break;
7578*fae548d3Szrj 	    case DW_CFA_register:
7579*fae548d3Szrj 	      sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
7580*fae548d3Szrj 	      break;
7581*fae548d3Szrj 	    case DW_CFA_expression:
7582*fae548d3Szrj 	      strcpy (tmp, "exp");
7583*fae548d3Szrj 	      break;
7584*fae548d3Szrj 	    case DW_CFA_val_expression:
7585*fae548d3Szrj 	      strcpy (tmp, "vexp");
7586*fae548d3Szrj 	      break;
7587*fae548d3Szrj 	    default:
7588*fae548d3Szrj 	      strcpy (tmp, "n/a");
7589*fae548d3Szrj 	      break;
7590*fae548d3Szrj 	    }
7591*fae548d3Szrj 	  printf ("%-5s ", tmp);
7592*fae548d3Szrj 	}
7593*fae548d3Szrj     }
7594*fae548d3Szrj   printf ("\n");
7595*fae548d3Szrj }
7596*fae548d3Szrj 
7597*fae548d3Szrj #define GET(VAR, N)	SAFE_BYTE_GET_AND_INC (VAR, start, N, end)
7598*fae548d3Szrj 
7599*fae548d3Szrj 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)7600*fae548d3Szrj read_cie (unsigned char *start, unsigned char *end,
7601*fae548d3Szrj 	  Frame_Chunk **p_cie, int *p_version,
7602*fae548d3Szrj 	  bfd_size_type *p_aug_len, unsigned char **p_aug)
7603*fae548d3Szrj {
7604*fae548d3Szrj   int version;
7605*fae548d3Szrj   Frame_Chunk *fc;
7606*fae548d3Szrj   unsigned char *augmentation_data = NULL;
7607*fae548d3Szrj   bfd_size_type augmentation_data_len = 0;
7608*fae548d3Szrj 
7609*fae548d3Szrj   * p_cie = NULL;
7610*fae548d3Szrj   /* PR 17512: file: 001-228113-0.004.  */
7611*fae548d3Szrj   if (start >= end)
7612*fae548d3Szrj     return end;
7613*fae548d3Szrj 
7614*fae548d3Szrj   fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7615*fae548d3Szrj   memset (fc, 0, sizeof (Frame_Chunk));
7616*fae548d3Szrj 
7617*fae548d3Szrj   fc->col_type = (short int *) xmalloc (sizeof (short int));
7618*fae548d3Szrj   fc->col_offset = (int *) xmalloc (sizeof (int));
7619*fae548d3Szrj 
7620*fae548d3Szrj   version = *start++;
7621*fae548d3Szrj 
7622*fae548d3Szrj   fc->augmentation = (char *) start;
7623*fae548d3Szrj   /* PR 17512: file: 001-228113-0.004.
7624*fae548d3Szrj      Skip past augmentation name, but avoid running off the end of the data.  */
7625*fae548d3Szrj   while (start < end)
7626*fae548d3Szrj     if (* start ++ == '\0')
7627*fae548d3Szrj       break;
7628*fae548d3Szrj   if (start == end)
7629*fae548d3Szrj     {
7630*fae548d3Szrj       warn (_("No terminator for augmentation name\n"));
7631*fae548d3Szrj       goto fail;
7632*fae548d3Szrj     }
7633*fae548d3Szrj 
7634*fae548d3Szrj   if (strcmp (fc->augmentation, "eh") == 0)
7635*fae548d3Szrj     start += eh_addr_size;
7636*fae548d3Szrj 
7637*fae548d3Szrj   if (version >= 4)
7638*fae548d3Szrj     {
7639*fae548d3Szrj       GET (fc->ptr_size, 1);
7640*fae548d3Szrj       if (fc->ptr_size < 1 || fc->ptr_size > 8)
7641*fae548d3Szrj 	{
7642*fae548d3Szrj 	  warn (_("Invalid pointer size (%d) in CIE data\n"), fc->ptr_size);
7643*fae548d3Szrj 	  goto fail;
7644*fae548d3Szrj 	}
7645*fae548d3Szrj 
7646*fae548d3Szrj       GET (fc->segment_size, 1);
7647*fae548d3Szrj       /* PR 17512: file: e99d2804.  */
7648*fae548d3Szrj       if (fc->segment_size > 8 || fc->segment_size + fc->ptr_size > 8)
7649*fae548d3Szrj 	{
7650*fae548d3Szrj 	  warn (_("Invalid segment size (%d) in CIE data\n"), fc->segment_size);
7651*fae548d3Szrj 	  goto fail;
7652*fae548d3Szrj 	}
7653*fae548d3Szrj 
7654*fae548d3Szrj       eh_addr_size = fc->ptr_size;
7655*fae548d3Szrj     }
7656*fae548d3Szrj   else
7657*fae548d3Szrj     {
7658*fae548d3Szrj       fc->ptr_size = eh_addr_size;
7659*fae548d3Szrj       fc->segment_size = 0;
7660*fae548d3Szrj     }
7661*fae548d3Szrj 
7662*fae548d3Szrj   READ_ULEB (fc->code_factor, start, end);
7663*fae548d3Szrj   READ_SLEB (fc->data_factor, start, end);
7664*fae548d3Szrj 
7665*fae548d3Szrj   if (version == 1)
7666*fae548d3Szrj     {
7667*fae548d3Szrj       GET (fc->ra, 1);
7668*fae548d3Szrj     }
7669*fae548d3Szrj   else
7670*fae548d3Szrj     {
7671*fae548d3Szrj       READ_ULEB (fc->ra, start, end);
7672*fae548d3Szrj     }
7673*fae548d3Szrj 
7674*fae548d3Szrj   if (fc->augmentation[0] == 'z')
7675*fae548d3Szrj     {
7676*fae548d3Szrj       READ_ULEB (augmentation_data_len, start, end);
7677*fae548d3Szrj       augmentation_data = start;
7678*fae548d3Szrj       /* PR 17512: file: 11042-2589-0.004.  */
7679*fae548d3Szrj       if (augmentation_data_len > (bfd_size_type) (end - start))
7680*fae548d3Szrj 	{
7681*fae548d3Szrj 	  warn (_("Augmentation data too long: 0x%s, expected at most %#lx\n"),
7682*fae548d3Szrj 		dwarf_vmatoa ("x", augmentation_data_len),
7683*fae548d3Szrj 		(unsigned long) (end - start));
7684*fae548d3Szrj 	  goto fail;
7685*fae548d3Szrj 	}
7686*fae548d3Szrj       start += augmentation_data_len;
7687*fae548d3Szrj     }
7688*fae548d3Szrj 
7689*fae548d3Szrj   if (augmentation_data_len)
7690*fae548d3Szrj     {
7691*fae548d3Szrj       unsigned char *p;
7692*fae548d3Szrj       unsigned char *q;
7693*fae548d3Szrj       unsigned char *qend;
7694*fae548d3Szrj 
7695*fae548d3Szrj       p = (unsigned char *) fc->augmentation + 1;
7696*fae548d3Szrj       q = augmentation_data;
7697*fae548d3Szrj       qend = q + augmentation_data_len;
7698*fae548d3Szrj 
7699*fae548d3Szrj       while (p < end && q < qend)
7700*fae548d3Szrj 	{
7701*fae548d3Szrj 	  if (*p == 'L')
7702*fae548d3Szrj 	    q++;
7703*fae548d3Szrj 	  else if (*p == 'P')
7704*fae548d3Szrj 	    q += 1 + size_of_encoded_value (*q);
7705*fae548d3Szrj 	  else if (*p == 'R')
7706*fae548d3Szrj 	    fc->fde_encoding = *q++;
7707*fae548d3Szrj 	  else if (*p == 'S')
7708*fae548d3Szrj 	    ;
7709*fae548d3Szrj 	  else if (*p == 'B')
7710*fae548d3Szrj 	    ;
7711*fae548d3Szrj 	  else
7712*fae548d3Szrj 	    break;
7713*fae548d3Szrj 	  p++;
7714*fae548d3Szrj 	}
7715*fae548d3Szrj       /* Note - it is OK if this loop terminates with q < qend.
7716*fae548d3Szrj 	 Padding may have been inserted to align the end of the CIE.  */
7717*fae548d3Szrj     }
7718*fae548d3Szrj 
7719*fae548d3Szrj   *p_cie = fc;
7720*fae548d3Szrj   if (p_version)
7721*fae548d3Szrj     *p_version = version;
7722*fae548d3Szrj   if (p_aug_len)
7723*fae548d3Szrj     {
7724*fae548d3Szrj       *p_aug_len = augmentation_data_len;
7725*fae548d3Szrj       *p_aug = augmentation_data;
7726*fae548d3Szrj     }
7727*fae548d3Szrj   return start;
7728*fae548d3Szrj 
7729*fae548d3Szrj  fail:
7730*fae548d3Szrj   free (fc->col_offset);
7731*fae548d3Szrj   free (fc->col_type);
7732*fae548d3Szrj   free (fc);
7733*fae548d3Szrj   return end;
7734*fae548d3Szrj }
7735*fae548d3Szrj 
7736*fae548d3Szrj /* Prints out the contents on the DATA array formatted as unsigned bytes.
7737*fae548d3Szrj    If do_wide is not enabled, then formats the output to fit into 80 columns.
7738*fae548d3Szrj    PRINTED contains the number of characters already written to the current
7739*fae548d3Szrj    output line.  */
7740*fae548d3Szrj 
7741*fae548d3Szrj static void
display_data(bfd_size_type printed,const unsigned char * data,const bfd_size_type len)7742*fae548d3Szrj display_data (bfd_size_type          printed,
7743*fae548d3Szrj 	      const unsigned char *  data,
7744*fae548d3Szrj 	      const bfd_size_type    len)
7745*fae548d3Szrj {
7746*fae548d3Szrj   if (do_wide || len < ((80 - printed) / 3))
7747*fae548d3Szrj     for (printed = 0; printed < len; ++printed)
7748*fae548d3Szrj       printf (" %02x", data[printed]);
7749*fae548d3Szrj   else
7750*fae548d3Szrj     {
7751*fae548d3Szrj       for (printed = 0; printed < len; ++printed)
7752*fae548d3Szrj 	{
7753*fae548d3Szrj 	  if (printed % (80 / 3) == 0)
7754*fae548d3Szrj 	    putchar ('\n');
7755*fae548d3Szrj 	  printf (" %02x", data[printed]);
7756*fae548d3Szrj 	}
7757*fae548d3Szrj     }
7758*fae548d3Szrj }
7759*fae548d3Szrj 
7760*fae548d3Szrj /* Prints out the contents on the augmentation data array.
7761*fae548d3Szrj    If do_wide is not enabled, then formats the output to fit into 80 columns.  */
7762*fae548d3Szrj 
7763*fae548d3Szrj static void
display_augmentation_data(const unsigned char * data,const bfd_size_type len)7764*fae548d3Szrj display_augmentation_data (const unsigned char * data, const bfd_size_type len)
7765*fae548d3Szrj {
7766*fae548d3Szrj   bfd_size_type i;
7767*fae548d3Szrj 
7768*fae548d3Szrj   i = printf (_("  Augmentation data:    "));
7769*fae548d3Szrj   display_data (i, data, len);
7770*fae548d3Szrj }
7771*fae548d3Szrj 
7772*fae548d3Szrj static int
display_debug_frames(struct dwarf_section * section,void * file ATTRIBUTE_UNUSED)7773*fae548d3Szrj display_debug_frames (struct dwarf_section *section,
7774*fae548d3Szrj 		      void *file ATTRIBUTE_UNUSED)
7775*fae548d3Szrj {
7776*fae548d3Szrj   unsigned char *start = section->start;
7777*fae548d3Szrj   unsigned char *end = start + section->size;
7778*fae548d3Szrj   unsigned char *section_start = start;
7779*fae548d3Szrj   Frame_Chunk *chunks = NULL, *forward_refs = NULL;
7780*fae548d3Szrj   Frame_Chunk *remembered_state = NULL;
7781*fae548d3Szrj   Frame_Chunk *rs;
7782*fae548d3Szrj   bfd_boolean is_eh = strcmp (section->name, ".eh_frame") == 0;
7783*fae548d3Szrj   unsigned int max_regs = 0;
7784*fae548d3Szrj   const char *bad_reg = _("bad register: ");
7785*fae548d3Szrj   unsigned int saved_eh_addr_size = eh_addr_size;
7786*fae548d3Szrj 
7787*fae548d3Szrj   introduce (section, FALSE);
7788*fae548d3Szrj 
7789*fae548d3Szrj   while (start < end)
7790*fae548d3Szrj     {
7791*fae548d3Szrj       unsigned char *saved_start;
7792*fae548d3Szrj       unsigned char *block_end;
7793*fae548d3Szrj       dwarf_vma length;
7794*fae548d3Szrj       dwarf_vma cie_id;
7795*fae548d3Szrj       Frame_Chunk *fc;
7796*fae548d3Szrj       Frame_Chunk *cie;
7797*fae548d3Szrj       int need_col_headers = 1;
7798*fae548d3Szrj       unsigned char *augmentation_data = NULL;
7799*fae548d3Szrj       bfd_size_type augmentation_data_len = 0;
7800*fae548d3Szrj       unsigned int encoded_ptr_size = saved_eh_addr_size;
7801*fae548d3Szrj       unsigned int offset_size;
7802*fae548d3Szrj       unsigned int initial_length_size;
7803*fae548d3Szrj       bfd_boolean all_nops;
7804*fae548d3Szrj       static Frame_Chunk fde_fc;
7805*fae548d3Szrj 
7806*fae548d3Szrj       saved_start = start;
7807*fae548d3Szrj 
7808*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (length, start, 4, end);
7809*fae548d3Szrj 
7810*fae548d3Szrj       if (length == 0)
7811*fae548d3Szrj 	{
7812*fae548d3Szrj 	  printf ("\n%08lx ZERO terminator\n\n",
7813*fae548d3Szrj 		    (unsigned long)(saved_start - section_start));
7814*fae548d3Szrj 	  /* Skip any zero terminators that directly follow.
7815*fae548d3Szrj 	     A corrupt section size could have loaded a whole
7816*fae548d3Szrj 	     slew of zero filled memory bytes.  eg
7817*fae548d3Szrj 	     PR 17512: file: 070-19381-0.004.  */
7818*fae548d3Szrj 	  while (start < end && * start == 0)
7819*fae548d3Szrj 	    ++ start;
7820*fae548d3Szrj 	  continue;
7821*fae548d3Szrj 	}
7822*fae548d3Szrj 
7823*fae548d3Szrj       if (length == 0xffffffff)
7824*fae548d3Szrj 	{
7825*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (length, start, 8, end);
7826*fae548d3Szrj 	  offset_size = 8;
7827*fae548d3Szrj 	  initial_length_size = 12;
7828*fae548d3Szrj 	}
7829*fae548d3Szrj       else
7830*fae548d3Szrj 	{
7831*fae548d3Szrj 	  offset_size = 4;
7832*fae548d3Szrj 	  initial_length_size = 4;
7833*fae548d3Szrj 	}
7834*fae548d3Szrj 
7835*fae548d3Szrj       block_end = saved_start + length + initial_length_size;
7836*fae548d3Szrj       if (block_end > end || block_end < start)
7837*fae548d3Szrj 	{
7838*fae548d3Szrj 	  warn ("Invalid length 0x%s in FDE at %#08lx\n",
7839*fae548d3Szrj 		dwarf_vmatoa_1 (NULL, length, offset_size),
7840*fae548d3Szrj 		(unsigned long) (saved_start - section_start));
7841*fae548d3Szrj 	  block_end = end;
7842*fae548d3Szrj 	}
7843*fae548d3Szrj 
7844*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (cie_id, start, offset_size, end);
7845*fae548d3Szrj 
7846*fae548d3Szrj       if (is_eh ? (cie_id == 0) : ((offset_size == 4 && cie_id == DW_CIE_ID)
7847*fae548d3Szrj 				   || (offset_size == 8 && cie_id == DW64_CIE_ID)))
7848*fae548d3Szrj 	{
7849*fae548d3Szrj 	  int version;
7850*fae548d3Szrj 	  unsigned int mreg;
7851*fae548d3Szrj 
7852*fae548d3Szrj 	  start = read_cie (start, end, &cie, &version,
7853*fae548d3Szrj 			    &augmentation_data_len, &augmentation_data);
7854*fae548d3Szrj 	  /* PR 17512: file: 027-135133-0.005.  */
7855*fae548d3Szrj 	  if (cie == NULL)
7856*fae548d3Szrj 	    break;
7857*fae548d3Szrj 
7858*fae548d3Szrj 	  fc = cie;
7859*fae548d3Szrj 	  fc->next = chunks;
7860*fae548d3Szrj 	  chunks = fc;
7861*fae548d3Szrj 	  fc->chunk_start = saved_start;
7862*fae548d3Szrj 	  mreg = max_regs > 0 ? max_regs - 1 : 0;
7863*fae548d3Szrj 	  if (mreg < fc->ra)
7864*fae548d3Szrj 	    mreg = fc->ra;
7865*fae548d3Szrj 	  if (frame_need_space (fc, mreg) < 0)
7866*fae548d3Szrj 	    break;
7867*fae548d3Szrj 	  if (fc->fde_encoding)
7868*fae548d3Szrj 	    encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7869*fae548d3Szrj 
7870*fae548d3Szrj 	  printf ("\n%08lx ", (unsigned long) (saved_start - section_start));
7871*fae548d3Szrj 	  print_dwarf_vma (length, fc->ptr_size);
7872*fae548d3Szrj 	  print_dwarf_vma (cie_id, offset_size);
7873*fae548d3Szrj 
7874*fae548d3Szrj 	  if (do_debug_frames_interp)
7875*fae548d3Szrj 	    {
7876*fae548d3Szrj 	      printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc->augmentation,
7877*fae548d3Szrj 		      fc->code_factor, fc->data_factor, fc->ra);
7878*fae548d3Szrj 	    }
7879*fae548d3Szrj 	  else
7880*fae548d3Szrj 	    {
7881*fae548d3Szrj 	      printf ("CIE\n");
7882*fae548d3Szrj 	      printf ("  Version:               %d\n", version);
7883*fae548d3Szrj 	      printf ("  Augmentation:          \"%s\"\n", fc->augmentation);
7884*fae548d3Szrj 	      if (version >= 4)
7885*fae548d3Szrj 		{
7886*fae548d3Szrj 		  printf ("  Pointer Size:          %u\n", fc->ptr_size);
7887*fae548d3Szrj 		  printf ("  Segment Size:          %u\n", fc->segment_size);
7888*fae548d3Szrj 		}
7889*fae548d3Szrj 	      printf ("  Code alignment factor: %u\n", fc->code_factor);
7890*fae548d3Szrj 	      printf ("  Data alignment factor: %d\n", fc->data_factor);
7891*fae548d3Szrj 	      printf ("  Return address column: %d\n", fc->ra);
7892*fae548d3Szrj 
7893*fae548d3Szrj 	      if (augmentation_data_len)
7894*fae548d3Szrj 		display_augmentation_data (augmentation_data, augmentation_data_len);
7895*fae548d3Szrj 
7896*fae548d3Szrj 	      putchar ('\n');
7897*fae548d3Szrj 	    }
7898*fae548d3Szrj 	}
7899*fae548d3Szrj       else
7900*fae548d3Szrj 	{
7901*fae548d3Szrj 	  unsigned char *look_for;
7902*fae548d3Szrj 	  unsigned long segment_selector;
7903*fae548d3Szrj 
7904*fae548d3Szrj 	  if (is_eh)
7905*fae548d3Szrj 	    {
7906*fae548d3Szrj 	      dwarf_vma sign = (dwarf_vma) 1 << (offset_size * 8 - 1);
7907*fae548d3Szrj 	      look_for = start - 4 - ((cie_id ^ sign) - sign);
7908*fae548d3Szrj 	    }
7909*fae548d3Szrj 	  else
7910*fae548d3Szrj 	    look_for = section_start + cie_id;
7911*fae548d3Szrj 
7912*fae548d3Szrj 	  if (look_for <= saved_start)
7913*fae548d3Szrj 	    {
7914*fae548d3Szrj 	      for (cie = chunks; cie ; cie = cie->next)
7915*fae548d3Szrj 		if (cie->chunk_start == look_for)
7916*fae548d3Szrj 		  break;
7917*fae548d3Szrj 	    }
7918*fae548d3Szrj 	  else
7919*fae548d3Szrj 	    {
7920*fae548d3Szrj 	      for (cie = forward_refs; cie ; cie = cie->next)
7921*fae548d3Szrj 		if (cie->chunk_start == look_for)
7922*fae548d3Szrj 		  break;
7923*fae548d3Szrj 	      if (!cie)
7924*fae548d3Szrj 		{
7925*fae548d3Szrj 		  unsigned int off_size;
7926*fae548d3Szrj 		  unsigned char *cie_scan;
7927*fae548d3Szrj 
7928*fae548d3Szrj 		  cie_scan = look_for;
7929*fae548d3Szrj 		  off_size = 4;
7930*fae548d3Szrj 		  SAFE_BYTE_GET_AND_INC (length, cie_scan, 4, end);
7931*fae548d3Szrj 		  if (length == 0xffffffff)
7932*fae548d3Szrj 		    {
7933*fae548d3Szrj 		      SAFE_BYTE_GET_AND_INC (length, cie_scan, 8, end);
7934*fae548d3Szrj 		      off_size = 8;
7935*fae548d3Szrj 		    }
7936*fae548d3Szrj 		  if (length != 0)
7937*fae548d3Szrj 		    {
7938*fae548d3Szrj 		      dwarf_vma c_id;
7939*fae548d3Szrj 
7940*fae548d3Szrj 		      SAFE_BYTE_GET_AND_INC (c_id, cie_scan, off_size, end);
7941*fae548d3Szrj 		      if (is_eh
7942*fae548d3Szrj 			  ? c_id == 0
7943*fae548d3Szrj 			  : ((off_size == 4 && c_id == DW_CIE_ID)
7944*fae548d3Szrj 			     || (off_size == 8 && c_id == DW64_CIE_ID)))
7945*fae548d3Szrj 			{
7946*fae548d3Szrj 			  int version;
7947*fae548d3Szrj 			  unsigned int mreg;
7948*fae548d3Szrj 
7949*fae548d3Szrj 			  read_cie (cie_scan, end, &cie, &version,
7950*fae548d3Szrj 				    &augmentation_data_len, &augmentation_data);
7951*fae548d3Szrj 			  /* PR 17512: file: 3450-2098-0.004.  */
7952*fae548d3Szrj 			  if (cie == NULL)
7953*fae548d3Szrj 			    {
7954*fae548d3Szrj 			      warn (_("Failed to read CIE information\n"));
7955*fae548d3Szrj 			      break;
7956*fae548d3Szrj 			    }
7957*fae548d3Szrj 			  cie->next = forward_refs;
7958*fae548d3Szrj 			  forward_refs = cie;
7959*fae548d3Szrj 			  cie->chunk_start = look_for;
7960*fae548d3Szrj 			  mreg = max_regs > 0 ? max_regs - 1 : 0;
7961*fae548d3Szrj 			  if (mreg < cie->ra)
7962*fae548d3Szrj 			    mreg = cie->ra;
7963*fae548d3Szrj 			  if (frame_need_space (cie, mreg) < 0)
7964*fae548d3Szrj 			    {
7965*fae548d3Szrj 			      warn (_("Invalid max register\n"));
7966*fae548d3Szrj 			      break;
7967*fae548d3Szrj 			    }
7968*fae548d3Szrj 			  if (cie->fde_encoding)
7969*fae548d3Szrj 			    encoded_ptr_size
7970*fae548d3Szrj 			      = size_of_encoded_value (cie->fde_encoding);
7971*fae548d3Szrj 			}
7972*fae548d3Szrj 		    }
7973*fae548d3Szrj 		}
7974*fae548d3Szrj 	    }
7975*fae548d3Szrj 
7976*fae548d3Szrj 	  fc = &fde_fc;
7977*fae548d3Szrj 	  memset (fc, 0, sizeof (Frame_Chunk));
7978*fae548d3Szrj 
7979*fae548d3Szrj 	  if (!cie)
7980*fae548d3Szrj 	    {
7981*fae548d3Szrj 	      warn ("Invalid CIE pointer 0x%s in FDE at %#08lx\n",
7982*fae548d3Szrj 		    dwarf_vmatoa_1 (NULL, cie_id, offset_size),
7983*fae548d3Szrj 		    (unsigned long) (saved_start - section_start));
7984*fae548d3Szrj 	      fc->ncols = 0;
7985*fae548d3Szrj 	      fc->col_type = (short int *) xmalloc (sizeof (short int));
7986*fae548d3Szrj 	      fc->col_offset = (int *) xmalloc (sizeof (int));
7987*fae548d3Szrj 	      if (frame_need_space (fc, max_regs > 0 ? max_regs - 1 : 0) < 0)
7988*fae548d3Szrj 		{
7989*fae548d3Szrj 		  warn (_("Invalid max register\n"));
7990*fae548d3Szrj 		  break;
7991*fae548d3Szrj 		}
7992*fae548d3Szrj 	      cie = fc;
7993*fae548d3Szrj 	      fc->augmentation = "";
7994*fae548d3Szrj 	      fc->fde_encoding = 0;
7995*fae548d3Szrj 	      fc->ptr_size = eh_addr_size;
7996*fae548d3Szrj 	      fc->segment_size = 0;
7997*fae548d3Szrj 	    }
7998*fae548d3Szrj 	  else
7999*fae548d3Szrj 	    {
8000*fae548d3Szrj 	      fc->ncols = cie->ncols;
8001*fae548d3Szrj 	      fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
8002*fae548d3Szrj 	      fc->col_offset =  (int *) xcmalloc (fc->ncols, sizeof (int));
8003*fae548d3Szrj 	      memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8004*fae548d3Szrj 	      memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8005*fae548d3Szrj 	      fc->augmentation = cie->augmentation;
8006*fae548d3Szrj 	      fc->ptr_size = cie->ptr_size;
8007*fae548d3Szrj 	      eh_addr_size = cie->ptr_size;
8008*fae548d3Szrj 	      fc->segment_size = cie->segment_size;
8009*fae548d3Szrj 	      fc->code_factor = cie->code_factor;
8010*fae548d3Szrj 	      fc->data_factor = cie->data_factor;
8011*fae548d3Szrj 	      fc->cfa_reg = cie->cfa_reg;
8012*fae548d3Szrj 	      fc->cfa_offset = cie->cfa_offset;
8013*fae548d3Szrj 	      fc->ra = cie->ra;
8014*fae548d3Szrj 	      if (frame_need_space (fc, max_regs > 0 ? max_regs - 1: 0) < 0)
8015*fae548d3Szrj 		{
8016*fae548d3Szrj 		  warn (_("Invalid max register\n"));
8017*fae548d3Szrj 		  break;
8018*fae548d3Szrj 		}
8019*fae548d3Szrj 	      fc->fde_encoding = cie->fde_encoding;
8020*fae548d3Szrj 	    }
8021*fae548d3Szrj 
8022*fae548d3Szrj 	  if (fc->fde_encoding)
8023*fae548d3Szrj 	    encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8024*fae548d3Szrj 
8025*fae548d3Szrj 	  segment_selector = 0;
8026*fae548d3Szrj 	  if (fc->segment_size)
8027*fae548d3Szrj 	    {
8028*fae548d3Szrj 	      if (fc->segment_size > sizeof (segment_selector))
8029*fae548d3Szrj 		{
8030*fae548d3Szrj 		  /* PR 17512: file: 9e196b3e.  */
8031*fae548d3Szrj 		  warn (_("Probably corrupt segment size: %d - using 4 instead\n"), fc->segment_size);
8032*fae548d3Szrj 		  fc->segment_size = 4;
8033*fae548d3Szrj 		}
8034*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (segment_selector, start, fc->segment_size, end);
8035*fae548d3Szrj 	    }
8036*fae548d3Szrj 
8037*fae548d3Szrj 	  fc->pc_begin = get_encoded_value (&start, fc->fde_encoding, section, end);
8038*fae548d3Szrj 
8039*fae548d3Szrj 	  /* FIXME: It appears that sometimes the final pc_range value is
8040*fae548d3Szrj 	     encoded in less than encoded_ptr_size bytes.  See the x86_64
8041*fae548d3Szrj 	     run of the "objcopy on compressed debug sections" test for an
8042*fae548d3Szrj 	     example of this.  */
8043*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end);
8044*fae548d3Szrj 
8045*fae548d3Szrj 	  if (cie->augmentation[0] == 'z')
8046*fae548d3Szrj 	    {
8047*fae548d3Szrj 	      READ_ULEB (augmentation_data_len, start, end);
8048*fae548d3Szrj 	      augmentation_data = start;
8049*fae548d3Szrj 	      /* PR 17512 file: 722-8446-0.004 and PR 22386.  */
8050*fae548d3Szrj 	      if (augmentation_data_len > (bfd_size_type) (end - start))
8051*fae548d3Szrj 		{
8052*fae548d3Szrj 		  warn (_("Augmentation data too long: 0x%s, "
8053*fae548d3Szrj 			  "expected at most %#lx\n"),
8054*fae548d3Szrj 			dwarf_vmatoa ("x", augmentation_data_len),
8055*fae548d3Szrj 			(unsigned long) (end - start));
8056*fae548d3Szrj 		  start = end;
8057*fae548d3Szrj 		  augmentation_data = NULL;
8058*fae548d3Szrj 		  augmentation_data_len = 0;
8059*fae548d3Szrj 		}
8060*fae548d3Szrj 	      start += augmentation_data_len;
8061*fae548d3Szrj 	    }
8062*fae548d3Szrj 
8063*fae548d3Szrj 	  printf ("\n%08lx %s %s FDE cie=%08lx pc=",
8064*fae548d3Szrj 		  (unsigned long)(saved_start - section_start),
8065*fae548d3Szrj 		  dwarf_vmatoa_1 (NULL, length, fc->ptr_size),
8066*fae548d3Szrj 		  dwarf_vmatoa_1 (NULL, cie_id, offset_size),
8067*fae548d3Szrj 		  (unsigned long)(cie->chunk_start - section_start));
8068*fae548d3Szrj 
8069*fae548d3Szrj 	  if (fc->segment_size)
8070*fae548d3Szrj 	    printf ("%04lx:", segment_selector);
8071*fae548d3Szrj 
8072*fae548d3Szrj 	  printf ("%s..%s\n",
8073*fae548d3Szrj 		  dwarf_vmatoa_1 (NULL, fc->pc_begin, fc->ptr_size),
8074*fae548d3Szrj 		  dwarf_vmatoa_1 (NULL, fc->pc_begin + fc->pc_range, fc->ptr_size));
8075*fae548d3Szrj 
8076*fae548d3Szrj 	  if (! do_debug_frames_interp && augmentation_data_len)
8077*fae548d3Szrj 	    {
8078*fae548d3Szrj 	      display_augmentation_data (augmentation_data, augmentation_data_len);
8079*fae548d3Szrj 	      putchar ('\n');
8080*fae548d3Szrj 	    }
8081*fae548d3Szrj 	}
8082*fae548d3Szrj 
8083*fae548d3Szrj       /* At this point, fc is the current chunk, cie (if any) is set, and
8084*fae548d3Szrj 	 we're about to interpret instructions for the chunk.  */
8085*fae548d3Szrj       /* ??? At present we need to do this always, since this sizes the
8086*fae548d3Szrj 	 fc->col_type and fc->col_offset arrays, which we write into always.
8087*fae548d3Szrj 	 We should probably split the interpreted and non-interpreted bits
8088*fae548d3Szrj 	 into two different routines, since there's so much that doesn't
8089*fae548d3Szrj 	 really overlap between them.  */
8090*fae548d3Szrj       if (1 || do_debug_frames_interp)
8091*fae548d3Szrj 	{
8092*fae548d3Szrj 	  /* Start by making a pass over the chunk, allocating storage
8093*fae548d3Szrj 	     and taking note of what registers are used.  */
8094*fae548d3Szrj 	  unsigned char *tmp = start;
8095*fae548d3Szrj 
8096*fae548d3Szrj 	  while (start < block_end)
8097*fae548d3Szrj 	    {
8098*fae548d3Szrj 	      unsigned int reg, op, opa;
8099*fae548d3Szrj 	      unsigned long temp;
8100*fae548d3Szrj 	      unsigned char * new_start;
8101*fae548d3Szrj 
8102*fae548d3Szrj 	      op = *start++;
8103*fae548d3Szrj 	      opa = op & 0x3f;
8104*fae548d3Szrj 	      if (op & 0xc0)
8105*fae548d3Szrj 		op &= 0xc0;
8106*fae548d3Szrj 
8107*fae548d3Szrj 	      /* Warning: if you add any more cases to this switch, be
8108*fae548d3Szrj 		 sure to add them to the corresponding switch below.  */
8109*fae548d3Szrj 	      switch (op)
8110*fae548d3Szrj 		{
8111*fae548d3Szrj 		case DW_CFA_advance_loc:
8112*fae548d3Szrj 		  break;
8113*fae548d3Szrj 		case DW_CFA_offset:
8114*fae548d3Szrj 		  SKIP_ULEB (start, end);
8115*fae548d3Szrj 		  if (frame_need_space (fc, opa) >= 0)
8116*fae548d3Szrj 		    fc->col_type[opa] = DW_CFA_undefined;
8117*fae548d3Szrj 		  break;
8118*fae548d3Szrj 		case DW_CFA_restore:
8119*fae548d3Szrj 		  if (frame_need_space (fc, opa) >= 0)
8120*fae548d3Szrj 		    fc->col_type[opa] = DW_CFA_undefined;
8121*fae548d3Szrj 		  break;
8122*fae548d3Szrj 		case DW_CFA_set_loc:
8123*fae548d3Szrj 		  start += encoded_ptr_size;
8124*fae548d3Szrj 		  break;
8125*fae548d3Szrj 		case DW_CFA_advance_loc1:
8126*fae548d3Szrj 		  start += 1;
8127*fae548d3Szrj 		  break;
8128*fae548d3Szrj 		case DW_CFA_advance_loc2:
8129*fae548d3Szrj 		  start += 2;
8130*fae548d3Szrj 		  break;
8131*fae548d3Szrj 		case DW_CFA_advance_loc4:
8132*fae548d3Szrj 		  start += 4;
8133*fae548d3Szrj 		  break;
8134*fae548d3Szrj 		case DW_CFA_offset_extended:
8135*fae548d3Szrj 		case DW_CFA_val_offset:
8136*fae548d3Szrj 		  READ_ULEB (reg, start, end);
8137*fae548d3Szrj 		  SKIP_ULEB (start, end);
8138*fae548d3Szrj 		  if (frame_need_space (fc, reg) >= 0)
8139*fae548d3Szrj 		    fc->col_type[reg] = DW_CFA_undefined;
8140*fae548d3Szrj 		  break;
8141*fae548d3Szrj 		case DW_CFA_restore_extended:
8142*fae548d3Szrj 		  READ_ULEB (reg, start, end);
8143*fae548d3Szrj 		  if (frame_need_space (fc, reg) >= 0)
8144*fae548d3Szrj 		    fc->col_type[reg] = DW_CFA_undefined;
8145*fae548d3Szrj 		  break;
8146*fae548d3Szrj 		case DW_CFA_undefined:
8147*fae548d3Szrj 		  READ_ULEB (reg, start, end);
8148*fae548d3Szrj 		  if (frame_need_space (fc, reg) >= 0)
8149*fae548d3Szrj 		    fc->col_type[reg] = DW_CFA_undefined;
8150*fae548d3Szrj 		  break;
8151*fae548d3Szrj 		case DW_CFA_same_value:
8152*fae548d3Szrj 		  READ_ULEB (reg, start, end);
8153*fae548d3Szrj 		  if (frame_need_space (fc, reg) >= 0)
8154*fae548d3Szrj 		    fc->col_type[reg] = DW_CFA_undefined;
8155*fae548d3Szrj 		  break;
8156*fae548d3Szrj 		case DW_CFA_register:
8157*fae548d3Szrj 		  READ_ULEB (reg, start, end);
8158*fae548d3Szrj 		  SKIP_ULEB (start, end);
8159*fae548d3Szrj 		  if (frame_need_space (fc, reg) >= 0)
8160*fae548d3Szrj 		    fc->col_type[reg] = DW_CFA_undefined;
8161*fae548d3Szrj 		  break;
8162*fae548d3Szrj 		case DW_CFA_def_cfa:
8163*fae548d3Szrj 		  SKIP_ULEB (start, end);
8164*fae548d3Szrj 		  SKIP_ULEB (start, end);
8165*fae548d3Szrj 		  break;
8166*fae548d3Szrj 		case DW_CFA_def_cfa_register:
8167*fae548d3Szrj 		  SKIP_ULEB (start, end);
8168*fae548d3Szrj 		  break;
8169*fae548d3Szrj 		case DW_CFA_def_cfa_offset:
8170*fae548d3Szrj 		  SKIP_ULEB (start, end);
8171*fae548d3Szrj 		  break;
8172*fae548d3Szrj 		case DW_CFA_def_cfa_expression:
8173*fae548d3Szrj 		  READ_ULEB (temp, start, end);
8174*fae548d3Szrj 		  new_start = start + temp;
8175*fae548d3Szrj 		  if (new_start < start)
8176*fae548d3Szrj 		    {
8177*fae548d3Szrj 		      warn (_("Corrupt CFA_def expression value: %lu\n"), temp);
8178*fae548d3Szrj 		      start = block_end;
8179*fae548d3Szrj 		    }
8180*fae548d3Szrj 		  else
8181*fae548d3Szrj 		    start = new_start;
8182*fae548d3Szrj 		  break;
8183*fae548d3Szrj 		case DW_CFA_expression:
8184*fae548d3Szrj 		case DW_CFA_val_expression:
8185*fae548d3Szrj 		  READ_ULEB (reg, start, end);
8186*fae548d3Szrj 		  READ_ULEB (temp, start, end);
8187*fae548d3Szrj 		  new_start = start + temp;
8188*fae548d3Szrj 		  if (new_start < start)
8189*fae548d3Szrj 		    {
8190*fae548d3Szrj 		      /* PR 17512: file:306-192417-0.005.  */
8191*fae548d3Szrj 		      warn (_("Corrupt CFA expression value: %lu\n"), temp);
8192*fae548d3Szrj 		      start = block_end;
8193*fae548d3Szrj 		    }
8194*fae548d3Szrj 		  else
8195*fae548d3Szrj 		    start = new_start;
8196*fae548d3Szrj 		  if (frame_need_space (fc, reg) >= 0)
8197*fae548d3Szrj 		    fc->col_type[reg] = DW_CFA_undefined;
8198*fae548d3Szrj 		  break;
8199*fae548d3Szrj 		case DW_CFA_offset_extended_sf:
8200*fae548d3Szrj 		case DW_CFA_val_offset_sf:
8201*fae548d3Szrj 		  READ_ULEB (reg, start, end);
8202*fae548d3Szrj 		  SKIP_SLEB (start, end);
8203*fae548d3Szrj 		  if (frame_need_space (fc, reg) >= 0)
8204*fae548d3Szrj 		    fc->col_type[reg] = DW_CFA_undefined;
8205*fae548d3Szrj 		  break;
8206*fae548d3Szrj 		case DW_CFA_def_cfa_sf:
8207*fae548d3Szrj 		  SKIP_ULEB (start, end);
8208*fae548d3Szrj 		  SKIP_SLEB (start, end);
8209*fae548d3Szrj 		  break;
8210*fae548d3Szrj 		case DW_CFA_def_cfa_offset_sf:
8211*fae548d3Szrj 		  SKIP_SLEB (start, end);
8212*fae548d3Szrj 		  break;
8213*fae548d3Szrj 		case DW_CFA_MIPS_advance_loc8:
8214*fae548d3Szrj 		  start += 8;
8215*fae548d3Szrj 		  break;
8216*fae548d3Szrj 		case DW_CFA_GNU_args_size:
8217*fae548d3Szrj 		  SKIP_ULEB (start, end);
8218*fae548d3Szrj 		  break;
8219*fae548d3Szrj 		case DW_CFA_GNU_negative_offset_extended:
8220*fae548d3Szrj 		  READ_ULEB (reg, start, end);
8221*fae548d3Szrj 		  SKIP_ULEB (start, end);
8222*fae548d3Szrj 		  if (frame_need_space (fc, reg) >= 0)
8223*fae548d3Szrj 		    fc->col_type[reg] = DW_CFA_undefined;
8224*fae548d3Szrj 		  break;
8225*fae548d3Szrj 		default:
8226*fae548d3Szrj 		  break;
8227*fae548d3Szrj 		}
8228*fae548d3Szrj 	    }
8229*fae548d3Szrj 	  start = tmp;
8230*fae548d3Szrj 	}
8231*fae548d3Szrj 
8232*fae548d3Szrj       all_nops = TRUE;
8233*fae548d3Szrj 
8234*fae548d3Szrj       /* Now we know what registers are used, make a second pass over
8235*fae548d3Szrj 	 the chunk, this time actually printing out the info.  */
8236*fae548d3Szrj 
8237*fae548d3Szrj       while (start < block_end)
8238*fae548d3Szrj 	{
8239*fae548d3Szrj 	  unsigned char * tmp;
8240*fae548d3Szrj 	  unsigned op, opa;
8241*fae548d3Szrj 	  unsigned long ul, roffs;
8242*fae548d3Szrj 	  /* Note: It is tempting to use an unsigned long for 'reg' but there
8243*fae548d3Szrj 	     are various functions, notably frame_space_needed() that assume that
8244*fae548d3Szrj 	     reg is an unsigned int.  */
8245*fae548d3Szrj 	  unsigned int reg;
8246*fae548d3Szrj 	  dwarf_signed_vma l;
8247*fae548d3Szrj 	  dwarf_vma ofs;
8248*fae548d3Szrj 	  dwarf_vma vma;
8249*fae548d3Szrj 	  const char *reg_prefix = "";
8250*fae548d3Szrj 
8251*fae548d3Szrj 	  op = *start++;
8252*fae548d3Szrj 	  opa = op & 0x3f;
8253*fae548d3Szrj 	  if (op & 0xc0)
8254*fae548d3Szrj 	    op &= 0xc0;
8255*fae548d3Szrj 
8256*fae548d3Szrj 	  /* Make a note if something other than DW_CFA_nop happens.  */
8257*fae548d3Szrj 	  if (op != DW_CFA_nop)
8258*fae548d3Szrj 	    all_nops = FALSE;
8259*fae548d3Szrj 
8260*fae548d3Szrj 	  /* Warning: if you add any more cases to this switch, be
8261*fae548d3Szrj 	     sure to add them to the corresponding switch above.  */
8262*fae548d3Szrj 	  switch (op)
8263*fae548d3Szrj 	    {
8264*fae548d3Szrj 	    case DW_CFA_advance_loc:
8265*fae548d3Szrj 	      if (do_debug_frames_interp)
8266*fae548d3Szrj 		frame_display_row (fc, &need_col_headers, &max_regs);
8267*fae548d3Szrj 	      else
8268*fae548d3Szrj 		printf ("  DW_CFA_advance_loc: %d to %s\n",
8269*fae548d3Szrj 			opa * fc->code_factor,
8270*fae548d3Szrj 			dwarf_vmatoa_1 (NULL,
8271*fae548d3Szrj 					fc->pc_begin + opa * fc->code_factor,
8272*fae548d3Szrj 					fc->ptr_size));
8273*fae548d3Szrj 	      fc->pc_begin += opa * fc->code_factor;
8274*fae548d3Szrj 	      break;
8275*fae548d3Szrj 
8276*fae548d3Szrj 	    case DW_CFA_offset:
8277*fae548d3Szrj 	      READ_ULEB (roffs, start, end);
8278*fae548d3Szrj 	      if (opa >= (unsigned int) fc->ncols)
8279*fae548d3Szrj 		reg_prefix = bad_reg;
8280*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8281*fae548d3Szrj 		printf ("  DW_CFA_offset: %s%s at cfa%+ld\n",
8282*fae548d3Szrj 			reg_prefix, regname (opa, 0),
8283*fae548d3Szrj 			roffs * fc->data_factor);
8284*fae548d3Szrj 	      if (*reg_prefix == '\0')
8285*fae548d3Szrj 		{
8286*fae548d3Szrj 		  fc->col_type[opa] = DW_CFA_offset;
8287*fae548d3Szrj 		  fc->col_offset[opa] = roffs * fc->data_factor;
8288*fae548d3Szrj 		}
8289*fae548d3Szrj 	      break;
8290*fae548d3Szrj 
8291*fae548d3Szrj 	    case DW_CFA_restore:
8292*fae548d3Szrj 	      if (opa >= (unsigned int) fc->ncols)
8293*fae548d3Szrj 		reg_prefix = bad_reg;
8294*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8295*fae548d3Szrj 		printf ("  DW_CFA_restore: %s%s\n",
8296*fae548d3Szrj 			reg_prefix, regname (opa, 0));
8297*fae548d3Szrj 	      if (*reg_prefix != '\0')
8298*fae548d3Szrj 		break;
8299*fae548d3Szrj 
8300*fae548d3Szrj 	      if (opa >= (unsigned int) cie->ncols
8301*fae548d3Szrj 		  || (do_debug_frames_interp
8302*fae548d3Szrj 		      && cie->col_type[opa] == DW_CFA_unreferenced))
8303*fae548d3Szrj 		{
8304*fae548d3Szrj 		  fc->col_type[opa] = DW_CFA_undefined;
8305*fae548d3Szrj 		  fc->col_offset[opa] = 0;
8306*fae548d3Szrj 		}
8307*fae548d3Szrj 	      else
8308*fae548d3Szrj 		{
8309*fae548d3Szrj 		  fc->col_type[opa] = cie->col_type[opa];
8310*fae548d3Szrj 		  fc->col_offset[opa] = cie->col_offset[opa];
8311*fae548d3Szrj 		}
8312*fae548d3Szrj 	      break;
8313*fae548d3Szrj 
8314*fae548d3Szrj 	    case DW_CFA_set_loc:
8315*fae548d3Szrj 	      vma = get_encoded_value (&start, fc->fde_encoding, section, block_end);
8316*fae548d3Szrj 	      if (do_debug_frames_interp)
8317*fae548d3Szrj 		frame_display_row (fc, &need_col_headers, &max_regs);
8318*fae548d3Szrj 	      else
8319*fae548d3Szrj 		printf ("  DW_CFA_set_loc: %s\n",
8320*fae548d3Szrj 			dwarf_vmatoa_1 (NULL, vma, fc->ptr_size));
8321*fae548d3Szrj 	      fc->pc_begin = vma;
8322*fae548d3Szrj 	      break;
8323*fae548d3Szrj 
8324*fae548d3Szrj 	    case DW_CFA_advance_loc1:
8325*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (ofs, start, 1, end);
8326*fae548d3Szrj 	      if (do_debug_frames_interp)
8327*fae548d3Szrj 		frame_display_row (fc, &need_col_headers, &max_regs);
8328*fae548d3Szrj 	      else
8329*fae548d3Szrj 		printf ("  DW_CFA_advance_loc1: %ld to %s\n",
8330*fae548d3Szrj 			(unsigned long) (ofs * fc->code_factor),
8331*fae548d3Szrj 			dwarf_vmatoa_1 (NULL,
8332*fae548d3Szrj 					fc->pc_begin + ofs * fc->code_factor,
8333*fae548d3Szrj 					fc->ptr_size));
8334*fae548d3Szrj 	      fc->pc_begin += ofs * fc->code_factor;
8335*fae548d3Szrj 	      break;
8336*fae548d3Szrj 
8337*fae548d3Szrj 	    case DW_CFA_advance_loc2:
8338*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (ofs, start, 2, block_end);
8339*fae548d3Szrj 	      if (do_debug_frames_interp)
8340*fae548d3Szrj 		frame_display_row (fc, &need_col_headers, &max_regs);
8341*fae548d3Szrj 	      else
8342*fae548d3Szrj 		printf ("  DW_CFA_advance_loc2: %ld to %s\n",
8343*fae548d3Szrj 			(unsigned long) (ofs * fc->code_factor),
8344*fae548d3Szrj 			dwarf_vmatoa_1 (NULL,
8345*fae548d3Szrj 					fc->pc_begin + ofs * fc->code_factor,
8346*fae548d3Szrj 					fc->ptr_size));
8347*fae548d3Szrj 	      fc->pc_begin += ofs * fc->code_factor;
8348*fae548d3Szrj 	      break;
8349*fae548d3Szrj 
8350*fae548d3Szrj 	    case DW_CFA_advance_loc4:
8351*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (ofs, start, 4, block_end);
8352*fae548d3Szrj 	      if (do_debug_frames_interp)
8353*fae548d3Szrj 		frame_display_row (fc, &need_col_headers, &max_regs);
8354*fae548d3Szrj 	      else
8355*fae548d3Szrj 		printf ("  DW_CFA_advance_loc4: %ld to %s\n",
8356*fae548d3Szrj 			(unsigned long) (ofs * fc->code_factor),
8357*fae548d3Szrj 			dwarf_vmatoa_1 (NULL,
8358*fae548d3Szrj 					fc->pc_begin + ofs * fc->code_factor,
8359*fae548d3Szrj 					fc->ptr_size));
8360*fae548d3Szrj 	      fc->pc_begin += ofs * fc->code_factor;
8361*fae548d3Szrj 	      break;
8362*fae548d3Szrj 
8363*fae548d3Szrj 	    case DW_CFA_offset_extended:
8364*fae548d3Szrj 	      READ_ULEB (reg, start, end);
8365*fae548d3Szrj 	      READ_ULEB (roffs, start, end);
8366*fae548d3Szrj 	      if (reg >= (unsigned int) fc->ncols)
8367*fae548d3Szrj 		reg_prefix = bad_reg;
8368*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8369*fae548d3Szrj 		printf ("  DW_CFA_offset_extended: %s%s at cfa%+ld\n",
8370*fae548d3Szrj 			reg_prefix, regname (reg, 0),
8371*fae548d3Szrj 			roffs * fc->data_factor);
8372*fae548d3Szrj 	      if (*reg_prefix == '\0')
8373*fae548d3Szrj 		{
8374*fae548d3Szrj 		  fc->col_type[reg] = DW_CFA_offset;
8375*fae548d3Szrj 		  fc->col_offset[reg] = roffs * fc->data_factor;
8376*fae548d3Szrj 		}
8377*fae548d3Szrj 	      break;
8378*fae548d3Szrj 
8379*fae548d3Szrj 	    case DW_CFA_val_offset:
8380*fae548d3Szrj 	      READ_ULEB (reg, start, end);
8381*fae548d3Szrj 	      READ_ULEB (roffs, start, end);
8382*fae548d3Szrj 	      if (reg >= (unsigned int) fc->ncols)
8383*fae548d3Szrj 		reg_prefix = bad_reg;
8384*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8385*fae548d3Szrj 		printf ("  DW_CFA_val_offset: %s%s is cfa%+ld\n",
8386*fae548d3Szrj 			reg_prefix, regname (reg, 0),
8387*fae548d3Szrj 			roffs * fc->data_factor);
8388*fae548d3Szrj 	      if (*reg_prefix == '\0')
8389*fae548d3Szrj 		{
8390*fae548d3Szrj 		  fc->col_type[reg] = DW_CFA_val_offset;
8391*fae548d3Szrj 		  fc->col_offset[reg] = roffs * fc->data_factor;
8392*fae548d3Szrj 		}
8393*fae548d3Szrj 	      break;
8394*fae548d3Szrj 
8395*fae548d3Szrj 	    case DW_CFA_restore_extended:
8396*fae548d3Szrj 	      READ_ULEB (reg, start, end);
8397*fae548d3Szrj 	      if (reg >= (unsigned int) fc->ncols)
8398*fae548d3Szrj 		reg_prefix = bad_reg;
8399*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8400*fae548d3Szrj 		printf ("  DW_CFA_restore_extended: %s%s\n",
8401*fae548d3Szrj 			reg_prefix, regname (reg, 0));
8402*fae548d3Szrj 	      if (*reg_prefix != '\0')
8403*fae548d3Szrj 		break;
8404*fae548d3Szrj 
8405*fae548d3Szrj 	      if (reg >= (unsigned int) cie->ncols)
8406*fae548d3Szrj 		{
8407*fae548d3Szrj 		  fc->col_type[reg] = DW_CFA_undefined;
8408*fae548d3Szrj 		  fc->col_offset[reg] = 0;
8409*fae548d3Szrj 		}
8410*fae548d3Szrj 	      else
8411*fae548d3Szrj 		{
8412*fae548d3Szrj 		  fc->col_type[reg] = cie->col_type[reg];
8413*fae548d3Szrj 		  fc->col_offset[reg] = cie->col_offset[reg];
8414*fae548d3Szrj 		}
8415*fae548d3Szrj 	      break;
8416*fae548d3Szrj 
8417*fae548d3Szrj 	    case DW_CFA_undefined:
8418*fae548d3Szrj 	      READ_ULEB (reg, start, end);
8419*fae548d3Szrj 	      if (reg >= (unsigned int) fc->ncols)
8420*fae548d3Szrj 		reg_prefix = bad_reg;
8421*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8422*fae548d3Szrj 		printf ("  DW_CFA_undefined: %s%s\n",
8423*fae548d3Szrj 			reg_prefix, regname (reg, 0));
8424*fae548d3Szrj 	      if (*reg_prefix == '\0')
8425*fae548d3Szrj 		{
8426*fae548d3Szrj 		  fc->col_type[reg] = DW_CFA_undefined;
8427*fae548d3Szrj 		  fc->col_offset[reg] = 0;
8428*fae548d3Szrj 		}
8429*fae548d3Szrj 	      break;
8430*fae548d3Szrj 
8431*fae548d3Szrj 	    case DW_CFA_same_value:
8432*fae548d3Szrj 	      READ_ULEB (reg, start, end);
8433*fae548d3Szrj 	      if (reg >= (unsigned int) fc->ncols)
8434*fae548d3Szrj 		reg_prefix = bad_reg;
8435*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8436*fae548d3Szrj 		printf ("  DW_CFA_same_value: %s%s\n",
8437*fae548d3Szrj 			reg_prefix, regname (reg, 0));
8438*fae548d3Szrj 	      if (*reg_prefix == '\0')
8439*fae548d3Szrj 		{
8440*fae548d3Szrj 		  fc->col_type[reg] = DW_CFA_same_value;
8441*fae548d3Szrj 		  fc->col_offset[reg] = 0;
8442*fae548d3Szrj 		}
8443*fae548d3Szrj 	      break;
8444*fae548d3Szrj 
8445*fae548d3Szrj 	    case DW_CFA_register:
8446*fae548d3Szrj 	      READ_ULEB (reg, start, end);
8447*fae548d3Szrj 	      READ_ULEB (roffs, start, end);
8448*fae548d3Szrj 	      if (reg >= (unsigned int) fc->ncols)
8449*fae548d3Szrj 		reg_prefix = bad_reg;
8450*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8451*fae548d3Szrj 		{
8452*fae548d3Szrj 		  printf ("  DW_CFA_register: %s%s in ",
8453*fae548d3Szrj 			  reg_prefix, regname (reg, 0));
8454*fae548d3Szrj 		  puts (regname (roffs, 0));
8455*fae548d3Szrj 		}
8456*fae548d3Szrj 	      if (*reg_prefix == '\0')
8457*fae548d3Szrj 		{
8458*fae548d3Szrj 		  fc->col_type[reg] = DW_CFA_register;
8459*fae548d3Szrj 		  fc->col_offset[reg] = roffs;
8460*fae548d3Szrj 		}
8461*fae548d3Szrj 	      break;
8462*fae548d3Szrj 
8463*fae548d3Szrj 	    case DW_CFA_remember_state:
8464*fae548d3Szrj 	      if (! do_debug_frames_interp)
8465*fae548d3Szrj 		printf ("  DW_CFA_remember_state\n");
8466*fae548d3Szrj 	      rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8467*fae548d3Szrj 	      rs->cfa_offset = fc->cfa_offset;
8468*fae548d3Szrj 	      rs->cfa_reg = fc->cfa_reg;
8469*fae548d3Szrj 	      rs->ra = fc->ra;
8470*fae548d3Szrj 	      rs->cfa_exp = fc->cfa_exp;
8471*fae548d3Szrj 	      rs->ncols = fc->ncols;
8472*fae548d3Szrj 	      rs->col_type = (short int *) xcmalloc (rs->ncols,
8473*fae548d3Szrj 						     sizeof (* rs->col_type));
8474*fae548d3Szrj 	      rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (* rs->col_offset));
8475*fae548d3Szrj 	      memcpy (rs->col_type, fc->col_type, rs->ncols * sizeof (* fc->col_type));
8476*fae548d3Szrj 	      memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (* fc->col_offset));
8477*fae548d3Szrj 	      rs->next = remembered_state;
8478*fae548d3Szrj 	      remembered_state = rs;
8479*fae548d3Szrj 	      break;
8480*fae548d3Szrj 
8481*fae548d3Szrj 	    case DW_CFA_restore_state:
8482*fae548d3Szrj 	      if (! do_debug_frames_interp)
8483*fae548d3Szrj 		printf ("  DW_CFA_restore_state\n");
8484*fae548d3Szrj 	      rs = remembered_state;
8485*fae548d3Szrj 	      if (rs)
8486*fae548d3Szrj 		{
8487*fae548d3Szrj 		  remembered_state = rs->next;
8488*fae548d3Szrj 		  fc->cfa_offset = rs->cfa_offset;
8489*fae548d3Szrj 		  fc->cfa_reg = rs->cfa_reg;
8490*fae548d3Szrj 		  fc->ra = rs->ra;
8491*fae548d3Szrj 		  fc->cfa_exp = rs->cfa_exp;
8492*fae548d3Szrj 		  if (frame_need_space (fc, rs->ncols - 1) < 0)
8493*fae548d3Szrj 		    {
8494*fae548d3Szrj 		      warn (_("Invalid column number in saved frame state\n"));
8495*fae548d3Szrj 		      fc->ncols = 0;
8496*fae548d3Szrj 		      break;
8497*fae548d3Szrj 		    }
8498*fae548d3Szrj 		  memcpy (fc->col_type, rs->col_type, rs->ncols * sizeof (* rs->col_type));
8499*fae548d3Szrj 		  memcpy (fc->col_offset, rs->col_offset,
8500*fae548d3Szrj 			  rs->ncols * sizeof (* rs->col_offset));
8501*fae548d3Szrj 		  free (rs->col_type);
8502*fae548d3Szrj 		  free (rs->col_offset);
8503*fae548d3Szrj 		  free (rs);
8504*fae548d3Szrj 		}
8505*fae548d3Szrj 	      else if (do_debug_frames_interp)
8506*fae548d3Szrj 		printf ("Mismatched DW_CFA_restore_state\n");
8507*fae548d3Szrj 	      break;
8508*fae548d3Szrj 
8509*fae548d3Szrj 	    case DW_CFA_def_cfa:
8510*fae548d3Szrj 	      READ_ULEB (fc->cfa_reg, start, end);
8511*fae548d3Szrj 	      READ_ULEB (fc->cfa_offset, start, end);
8512*fae548d3Szrj 	      fc->cfa_exp = 0;
8513*fae548d3Szrj 	      if (! do_debug_frames_interp)
8514*fae548d3Szrj 		printf ("  DW_CFA_def_cfa: %s ofs %d\n",
8515*fae548d3Szrj 			regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
8516*fae548d3Szrj 	      break;
8517*fae548d3Szrj 
8518*fae548d3Szrj 	    case DW_CFA_def_cfa_register:
8519*fae548d3Szrj 	      READ_ULEB (fc->cfa_reg, start, end);
8520*fae548d3Szrj 	      fc->cfa_exp = 0;
8521*fae548d3Szrj 	      if (! do_debug_frames_interp)
8522*fae548d3Szrj 		printf ("  DW_CFA_def_cfa_register: %s\n",
8523*fae548d3Szrj 			regname (fc->cfa_reg, 0));
8524*fae548d3Szrj 	      break;
8525*fae548d3Szrj 
8526*fae548d3Szrj 	    case DW_CFA_def_cfa_offset:
8527*fae548d3Szrj 	      READ_ULEB (fc->cfa_offset, start, end);
8528*fae548d3Szrj 	      if (! do_debug_frames_interp)
8529*fae548d3Szrj 		printf ("  DW_CFA_def_cfa_offset: %d\n", (int) fc->cfa_offset);
8530*fae548d3Szrj 	      break;
8531*fae548d3Szrj 
8532*fae548d3Szrj 	    case DW_CFA_nop:
8533*fae548d3Szrj 	      if (! do_debug_frames_interp)
8534*fae548d3Szrj 		printf ("  DW_CFA_nop\n");
8535*fae548d3Szrj 	      break;
8536*fae548d3Szrj 
8537*fae548d3Szrj 	    case DW_CFA_def_cfa_expression:
8538*fae548d3Szrj 	      READ_ULEB (ul, start, end);
8539*fae548d3Szrj 	      if (start >= block_end || ul > (unsigned long) (block_end - start))
8540*fae548d3Szrj 		{
8541*fae548d3Szrj 		  printf (_("  DW_CFA_def_cfa_expression: <corrupt len %lu>\n"), ul);
8542*fae548d3Szrj 		  break;
8543*fae548d3Szrj 		}
8544*fae548d3Szrj 	      if (! do_debug_frames_interp)
8545*fae548d3Szrj 		{
8546*fae548d3Szrj 		  printf ("  DW_CFA_def_cfa_expression (");
8547*fae548d3Szrj 		  decode_location_expression (start, eh_addr_size, 0, -1,
8548*fae548d3Szrj 					      ul, 0, section);
8549*fae548d3Szrj 		  printf (")\n");
8550*fae548d3Szrj 		}
8551*fae548d3Szrj 	      fc->cfa_exp = 1;
8552*fae548d3Szrj 	      start += ul;
8553*fae548d3Szrj 	      break;
8554*fae548d3Szrj 
8555*fae548d3Szrj 	    case DW_CFA_expression:
8556*fae548d3Szrj 	      READ_ULEB (reg, start, end);
8557*fae548d3Szrj 	      READ_ULEB (ul, start, end);
8558*fae548d3Szrj 	      if (reg >= (unsigned int) fc->ncols)
8559*fae548d3Szrj 		reg_prefix = bad_reg;
8560*fae548d3Szrj 	      /* PR 17512: file: 069-133014-0.006.  */
8561*fae548d3Szrj 	      /* PR 17512: file: 98c02eb4.  */
8562*fae548d3Szrj 	      tmp = start + ul;
8563*fae548d3Szrj 	      if (start >= block_end || tmp > block_end || tmp < start)
8564*fae548d3Szrj 		{
8565*fae548d3Szrj 		  printf (_("  DW_CFA_expression: <corrupt len %lu>\n"), ul);
8566*fae548d3Szrj 		  break;
8567*fae548d3Szrj 		}
8568*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8569*fae548d3Szrj 		{
8570*fae548d3Szrj 		  printf ("  DW_CFA_expression: %s%s (",
8571*fae548d3Szrj 			  reg_prefix, regname (reg, 0));
8572*fae548d3Szrj 		  decode_location_expression (start, eh_addr_size, 0, -1,
8573*fae548d3Szrj 					      ul, 0, section);
8574*fae548d3Szrj 		  printf (")\n");
8575*fae548d3Szrj 		}
8576*fae548d3Szrj 	      if (*reg_prefix == '\0')
8577*fae548d3Szrj 		fc->col_type[reg] = DW_CFA_expression;
8578*fae548d3Szrj 	      start = tmp;
8579*fae548d3Szrj 	      break;
8580*fae548d3Szrj 
8581*fae548d3Szrj 	    case DW_CFA_val_expression:
8582*fae548d3Szrj 	      READ_ULEB (reg, start, end);
8583*fae548d3Szrj 	      READ_ULEB (ul, start, end);
8584*fae548d3Szrj 	      if (reg >= (unsigned int) fc->ncols)
8585*fae548d3Szrj 		reg_prefix = bad_reg;
8586*fae548d3Szrj 	      tmp = start + ul;
8587*fae548d3Szrj 	      if (start >= block_end || tmp > block_end || tmp < start)
8588*fae548d3Szrj 		{
8589*fae548d3Szrj 		  printf ("  DW_CFA_val_expression: <corrupt len %lu>\n", ul);
8590*fae548d3Szrj 		  break;
8591*fae548d3Szrj 		}
8592*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8593*fae548d3Szrj 		{
8594*fae548d3Szrj 		  printf ("  DW_CFA_val_expression: %s%s (",
8595*fae548d3Szrj 			  reg_prefix, regname (reg, 0));
8596*fae548d3Szrj 		  decode_location_expression (start, eh_addr_size, 0, -1,
8597*fae548d3Szrj 					      ul, 0, section);
8598*fae548d3Szrj 		  printf (")\n");
8599*fae548d3Szrj 		}
8600*fae548d3Szrj 	      if (*reg_prefix == '\0')
8601*fae548d3Szrj 		fc->col_type[reg] = DW_CFA_val_expression;
8602*fae548d3Szrj 	      start = tmp;
8603*fae548d3Szrj 	      break;
8604*fae548d3Szrj 
8605*fae548d3Szrj 	    case DW_CFA_offset_extended_sf:
8606*fae548d3Szrj 	      READ_ULEB (reg, start, end);
8607*fae548d3Szrj 	      READ_SLEB (l, start, end);
8608*fae548d3Szrj 	      if (frame_need_space (fc, reg) < 0)
8609*fae548d3Szrj 		reg_prefix = bad_reg;
8610*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8611*fae548d3Szrj 		printf ("  DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
8612*fae548d3Szrj 			reg_prefix, regname (reg, 0),
8613*fae548d3Szrj 			(long)(l * fc->data_factor));
8614*fae548d3Szrj 	      if (*reg_prefix == '\0')
8615*fae548d3Szrj 		{
8616*fae548d3Szrj 		  fc->col_type[reg] = DW_CFA_offset;
8617*fae548d3Szrj 		  fc->col_offset[reg] = l * fc->data_factor;
8618*fae548d3Szrj 		}
8619*fae548d3Szrj 	      break;
8620*fae548d3Szrj 
8621*fae548d3Szrj 	    case DW_CFA_val_offset_sf:
8622*fae548d3Szrj 	      READ_ULEB (reg, start, end);
8623*fae548d3Szrj 	      READ_SLEB (l, start, end);
8624*fae548d3Szrj 	      if (frame_need_space (fc, reg) < 0)
8625*fae548d3Szrj 		reg_prefix = bad_reg;
8626*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8627*fae548d3Szrj 		printf ("  DW_CFA_val_offset_sf: %s%s is cfa%+ld\n",
8628*fae548d3Szrj 			reg_prefix, regname (reg, 0),
8629*fae548d3Szrj 			(long)(l * fc->data_factor));
8630*fae548d3Szrj 	      if (*reg_prefix == '\0')
8631*fae548d3Szrj 		{
8632*fae548d3Szrj 		  fc->col_type[reg] = DW_CFA_val_offset;
8633*fae548d3Szrj 		  fc->col_offset[reg] = l * fc->data_factor;
8634*fae548d3Szrj 		}
8635*fae548d3Szrj 	      break;
8636*fae548d3Szrj 
8637*fae548d3Szrj 	    case DW_CFA_def_cfa_sf:
8638*fae548d3Szrj 	      READ_ULEB (fc->cfa_reg, start, end);
8639*fae548d3Szrj 	      READ_ULEB (fc->cfa_offset, start, end);
8640*fae548d3Szrj 	      fc->cfa_offset = fc->cfa_offset * fc->data_factor;
8641*fae548d3Szrj 	      fc->cfa_exp = 0;
8642*fae548d3Szrj 	      if (! do_debug_frames_interp)
8643*fae548d3Szrj 		printf ("  DW_CFA_def_cfa_sf: %s ofs %d\n",
8644*fae548d3Szrj 			regname (fc->cfa_reg, 0), (int) fc->cfa_offset);
8645*fae548d3Szrj 	      break;
8646*fae548d3Szrj 
8647*fae548d3Szrj 	    case DW_CFA_def_cfa_offset_sf:
8648*fae548d3Szrj 	      READ_ULEB (fc->cfa_offset, start, end);
8649*fae548d3Szrj 	      fc->cfa_offset *= fc->data_factor;
8650*fae548d3Szrj 	      if (! do_debug_frames_interp)
8651*fae548d3Szrj 		printf ("  DW_CFA_def_cfa_offset_sf: %d\n", (int) fc->cfa_offset);
8652*fae548d3Szrj 	      break;
8653*fae548d3Szrj 
8654*fae548d3Szrj 	    case DW_CFA_MIPS_advance_loc8:
8655*fae548d3Szrj 	      SAFE_BYTE_GET_AND_INC (ofs, start, 8, block_end);
8656*fae548d3Szrj 	      if (do_debug_frames_interp)
8657*fae548d3Szrj 		frame_display_row (fc, &need_col_headers, &max_regs);
8658*fae548d3Szrj 	      else
8659*fae548d3Szrj 		printf ("  DW_CFA_MIPS_advance_loc8: %ld to %s\n",
8660*fae548d3Szrj 			(unsigned long) (ofs * fc->code_factor),
8661*fae548d3Szrj 			dwarf_vmatoa_1 (NULL,
8662*fae548d3Szrj 					fc->pc_begin + ofs * fc->code_factor,
8663*fae548d3Szrj 					fc->ptr_size));
8664*fae548d3Szrj 	      fc->pc_begin += ofs * fc->code_factor;
8665*fae548d3Szrj 	      break;
8666*fae548d3Szrj 
8667*fae548d3Szrj 	    case DW_CFA_GNU_window_save:
8668*fae548d3Szrj 	      if (! do_debug_frames_interp)
8669*fae548d3Szrj 		printf ("  DW_CFA_GNU_window_save\n");
8670*fae548d3Szrj 	      break;
8671*fae548d3Szrj 
8672*fae548d3Szrj 	    case DW_CFA_GNU_args_size:
8673*fae548d3Szrj 	      READ_ULEB (ul, start, end);
8674*fae548d3Szrj 	      if (! do_debug_frames_interp)
8675*fae548d3Szrj 		printf ("  DW_CFA_GNU_args_size: %ld\n", ul);
8676*fae548d3Szrj 	      break;
8677*fae548d3Szrj 
8678*fae548d3Szrj 	    case DW_CFA_GNU_negative_offset_extended:
8679*fae548d3Szrj 	      READ_ULEB (reg, start, end);
8680*fae548d3Szrj 	      READ_SLEB (l, start, end);
8681*fae548d3Szrj 	      l = - l;
8682*fae548d3Szrj 	      if (frame_need_space (fc, reg) < 0)
8683*fae548d3Szrj 		reg_prefix = bad_reg;
8684*fae548d3Szrj 	      if (! do_debug_frames_interp || *reg_prefix != '\0')
8685*fae548d3Szrj 		printf ("  DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
8686*fae548d3Szrj 			reg_prefix, regname (reg, 0),
8687*fae548d3Szrj 			(long)(l * fc->data_factor));
8688*fae548d3Szrj 	      if (*reg_prefix == '\0')
8689*fae548d3Szrj 		{
8690*fae548d3Szrj 		  fc->col_type[reg] = DW_CFA_offset;
8691*fae548d3Szrj 		  fc->col_offset[reg] = l * fc->data_factor;
8692*fae548d3Szrj 		}
8693*fae548d3Szrj 	      break;
8694*fae548d3Szrj 
8695*fae548d3Szrj 	    default:
8696*fae548d3Szrj 	      if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
8697*fae548d3Szrj 		printf (_("  DW_CFA_??? (User defined call frame op: %#x)\n"), op);
8698*fae548d3Szrj 	      else
8699*fae548d3Szrj 		warn (_("Unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
8700*fae548d3Szrj 	      start = block_end;
8701*fae548d3Szrj 	    }
8702*fae548d3Szrj 	}
8703*fae548d3Szrj 
8704*fae548d3Szrj       /* Interpret the CFA - as long as it is not completely full of NOPs.  */
8705*fae548d3Szrj       if (do_debug_frames_interp && ! all_nops)
8706*fae548d3Szrj 	frame_display_row (fc, &need_col_headers, &max_regs);
8707*fae548d3Szrj 
8708*fae548d3Szrj       if (fde_fc.col_type != NULL)
8709*fae548d3Szrj 	{
8710*fae548d3Szrj 	  free (fde_fc.col_type);
8711*fae548d3Szrj 	  fde_fc.col_type = NULL;
8712*fae548d3Szrj 	}
8713*fae548d3Szrj       if (fde_fc.col_offset != NULL)
8714*fae548d3Szrj 	{
8715*fae548d3Szrj 	  free (fde_fc.col_offset);
8716*fae548d3Szrj 	  fde_fc.col_offset = NULL;
8717*fae548d3Szrj 	}
8718*fae548d3Szrj 
8719*fae548d3Szrj       start = block_end;
8720*fae548d3Szrj       eh_addr_size = saved_eh_addr_size;
8721*fae548d3Szrj     }
8722*fae548d3Szrj 
8723*fae548d3Szrj   printf ("\n");
8724*fae548d3Szrj 
8725*fae548d3Szrj   while (remembered_state != NULL)
8726*fae548d3Szrj     {
8727*fae548d3Szrj       rs = remembered_state;
8728*fae548d3Szrj       remembered_state = rs->next;
8729*fae548d3Szrj       free (rs->col_type);
8730*fae548d3Szrj       free (rs->col_offset);
8731*fae548d3Szrj       rs->next = NULL; /* Paranoia.  */
8732*fae548d3Szrj       free (rs);
8733*fae548d3Szrj     }
8734*fae548d3Szrj 
8735*fae548d3Szrj   while (chunks != NULL)
8736*fae548d3Szrj     {
8737*fae548d3Szrj       rs = chunks;
8738*fae548d3Szrj       chunks = rs->next;
8739*fae548d3Szrj       free (rs->col_type);
8740*fae548d3Szrj       free (rs->col_offset);
8741*fae548d3Szrj       rs->next = NULL; /* Paranoia.  */
8742*fae548d3Szrj       free (rs);
8743*fae548d3Szrj     }
8744*fae548d3Szrj 
8745*fae548d3Szrj   while (forward_refs != NULL)
8746*fae548d3Szrj     {
8747*fae548d3Szrj       rs = forward_refs;
8748*fae548d3Szrj       forward_refs = rs->next;
8749*fae548d3Szrj       free (rs->col_type);
8750*fae548d3Szrj       free (rs->col_offset);
8751*fae548d3Szrj       rs->next = NULL; /* Paranoia.  */
8752*fae548d3Szrj       free (rs);
8753*fae548d3Szrj     }
8754*fae548d3Szrj 
8755*fae548d3Szrj   return 1;
8756*fae548d3Szrj }
8757*fae548d3Szrj 
8758*fae548d3Szrj #undef GET
8759*fae548d3Szrj 
8760*fae548d3Szrj static int
display_debug_names(struct dwarf_section * section,void * file)8761*fae548d3Szrj display_debug_names (struct dwarf_section *section, void *file)
8762*fae548d3Szrj {
8763*fae548d3Szrj   unsigned char *hdrptr = section->start;
8764*fae548d3Szrj   dwarf_vma unit_length;
8765*fae548d3Szrj   unsigned char *unit_start;
8766*fae548d3Szrj   const unsigned char *const section_end = section->start + section->size;
8767*fae548d3Szrj   unsigned char *unit_end;
8768*fae548d3Szrj 
8769*fae548d3Szrj   introduce (section, FALSE);
8770*fae548d3Szrj 
8771*fae548d3Szrj   load_debug_section_with_follow (str, file);
8772*fae548d3Szrj 
8773*fae548d3Szrj   for (; hdrptr < section_end; hdrptr = unit_end)
8774*fae548d3Szrj     {
8775*fae548d3Szrj       unsigned int offset_size;
8776*fae548d3Szrj       uint16_t dwarf_version, padding;
8777*fae548d3Szrj       uint32_t comp_unit_count, local_type_unit_count, foreign_type_unit_count;
8778*fae548d3Szrj       uint32_t bucket_count, name_count, abbrev_table_size;
8779*fae548d3Szrj       uint32_t augmentation_string_size;
8780*fae548d3Szrj       unsigned int i;
8781*fae548d3Szrj       unsigned long sec_off;
8782*fae548d3Szrj       bfd_boolean augmentation_printable;
8783*fae548d3Szrj       const char *augmentation_string;
8784*fae548d3Szrj 
8785*fae548d3Szrj       unit_start = hdrptr;
8786*fae548d3Szrj 
8787*fae548d3Szrj       /* Get and check the length of the block.  */
8788*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (unit_length, hdrptr, 4, section_end);
8789*fae548d3Szrj 
8790*fae548d3Szrj       if (unit_length == 0xffffffff)
8791*fae548d3Szrj 	{
8792*fae548d3Szrj 	  /* This section is 64-bit DWARF.  */
8793*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (unit_length, hdrptr, 8, section_end);
8794*fae548d3Szrj 	  offset_size = 8;
8795*fae548d3Szrj 	}
8796*fae548d3Szrj       else
8797*fae548d3Szrj 	offset_size = 4;
8798*fae548d3Szrj       unit_end = hdrptr + unit_length;
8799*fae548d3Szrj 
8800*fae548d3Szrj       sec_off = hdrptr - section->start;
8801*fae548d3Szrj       if (sec_off + unit_length < sec_off
8802*fae548d3Szrj 	  || sec_off + unit_length > section->size)
8803*fae548d3Szrj 	{
8804*fae548d3Szrj 	  warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
8805*fae548d3Szrj 		section->name,
8806*fae548d3Szrj 		(unsigned long) (unit_start - section->start),
8807*fae548d3Szrj 		dwarf_vmatoa ("x", unit_length));
8808*fae548d3Szrj 	  return 0;
8809*fae548d3Szrj 	}
8810*fae548d3Szrj 
8811*fae548d3Szrj       /* Get and check the version number.  */
8812*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (dwarf_version, hdrptr, 2, unit_end);
8813*fae548d3Szrj       printf (_("Version %ld\n"), (long) dwarf_version);
8814*fae548d3Szrj 
8815*fae548d3Szrj       /* Prior versions did not exist, and future versions may not be
8816*fae548d3Szrj 	 backwards compatible.  */
8817*fae548d3Szrj       if (dwarf_version != 5)
8818*fae548d3Szrj 	{
8819*fae548d3Szrj 	  warn (_("Only DWARF version 5 .debug_names "
8820*fae548d3Szrj 		  "is currently supported.\n"));
8821*fae548d3Szrj 	  return 0;
8822*fae548d3Szrj 	}
8823*fae548d3Szrj 
8824*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (padding, hdrptr, 2, unit_end);
8825*fae548d3Szrj       if (padding != 0)
8826*fae548d3Szrj 	warn (_("Padding field of .debug_names must be 0 (found 0x%x)\n"),
8827*fae548d3Szrj 	      padding);
8828*fae548d3Szrj 
8829*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (comp_unit_count, hdrptr, 4, unit_end);
8830*fae548d3Szrj       if (comp_unit_count == 0)
8831*fae548d3Szrj 	warn (_("Compilation unit count must be >= 1 in .debug_names\n"));
8832*fae548d3Szrj 
8833*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (local_type_unit_count, hdrptr, 4, unit_end);
8834*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (foreign_type_unit_count, hdrptr, 4, unit_end);
8835*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (bucket_count, hdrptr, 4, unit_end);
8836*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (name_count, hdrptr, 4, unit_end);
8837*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (abbrev_table_size, hdrptr, 4, unit_end);
8838*fae548d3Szrj 
8839*fae548d3Szrj       SAFE_BYTE_GET_AND_INC (augmentation_string_size, hdrptr, 4, unit_end);
8840*fae548d3Szrj       if (augmentation_string_size % 4 != 0)
8841*fae548d3Szrj 	{
8842*fae548d3Szrj 	  warn (_("Augmentation string length %u must be rounded up "
8843*fae548d3Szrj 		  "to a multiple of 4 in .debug_names.\n"),
8844*fae548d3Szrj 		augmentation_string_size);
8845*fae548d3Szrj 	  augmentation_string_size += (-augmentation_string_size) & 3;
8846*fae548d3Szrj 	}
8847*fae548d3Szrj 
8848*fae548d3Szrj       printf (_("Augmentation string:"));
8849*fae548d3Szrj 
8850*fae548d3Szrj       augmentation_printable = TRUE;
8851*fae548d3Szrj       augmentation_string = (const char *) hdrptr;
8852*fae548d3Szrj 
8853*fae548d3Szrj       for (i = 0; i < augmentation_string_size; i++)
8854*fae548d3Szrj 	{
8855*fae548d3Szrj 	  unsigned char uc;
8856*fae548d3Szrj 
8857*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (uc, hdrptr, 1, unit_end);
8858*fae548d3Szrj 	  printf (" %02x", uc);
8859*fae548d3Szrj 
8860*fae548d3Szrj 	  if (uc != 0 && !ISPRINT (uc))
8861*fae548d3Szrj 	    augmentation_printable = FALSE;
8862*fae548d3Szrj 	}
8863*fae548d3Szrj 
8864*fae548d3Szrj       if (augmentation_printable)
8865*fae548d3Szrj 	{
8866*fae548d3Szrj 	  printf ("  (\"");
8867*fae548d3Szrj 	  for (i = 0;
8868*fae548d3Szrj 	       i < augmentation_string_size && augmentation_string[i];
8869*fae548d3Szrj 	       ++i)
8870*fae548d3Szrj 	    putchar (augmentation_string[i]);
8871*fae548d3Szrj 	  printf ("\")");
8872*fae548d3Szrj 	}
8873*fae548d3Szrj       putchar ('\n');
8874*fae548d3Szrj 
8875*fae548d3Szrj       printf (_("CU table:\n"));
8876*fae548d3Szrj       for (i = 0; i < comp_unit_count; i++)
8877*fae548d3Szrj 	{
8878*fae548d3Szrj 	  uint64_t cu_offset;
8879*fae548d3Szrj 
8880*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (cu_offset, hdrptr, offset_size, unit_end);
8881*fae548d3Szrj 	  printf (_("[%3u] 0x%lx\n"), i, (unsigned long) cu_offset);
8882*fae548d3Szrj 	}
8883*fae548d3Szrj       putchar ('\n');
8884*fae548d3Szrj 
8885*fae548d3Szrj       printf (_("TU table:\n"));
8886*fae548d3Szrj       for (i = 0; i < local_type_unit_count; i++)
8887*fae548d3Szrj 	{
8888*fae548d3Szrj 	  uint64_t tu_offset;
8889*fae548d3Szrj 
8890*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (tu_offset, hdrptr, offset_size, unit_end);
8891*fae548d3Szrj 	  printf (_("[%3u] 0x%lx\n"), i, (unsigned long) tu_offset);
8892*fae548d3Szrj 	}
8893*fae548d3Szrj       putchar ('\n');
8894*fae548d3Szrj 
8895*fae548d3Szrj       printf (_("Foreign TU table:\n"));
8896*fae548d3Szrj       for (i = 0; i < foreign_type_unit_count; i++)
8897*fae548d3Szrj 	{
8898*fae548d3Szrj 	  uint64_t signature;
8899*fae548d3Szrj 
8900*fae548d3Szrj 	  SAFE_BYTE_GET_AND_INC (signature, hdrptr, 8, unit_end);
8901*fae548d3Szrj 	  printf (_("[%3u] "), i);
8902*fae548d3Szrj 	  print_dwarf_vma (signature, 8);
8903*fae548d3Szrj 	  putchar ('\n');
8904*fae548d3Szrj 	}
8905*fae548d3Szrj       putchar ('\n');
8906*fae548d3Szrj 
8907*fae548d3Szrj       const uint32_t *const hash_table_buckets = (uint32_t *) hdrptr;
8908*fae548d3Szrj       hdrptr += bucket_count * sizeof (uint32_t);
8909*fae548d3Szrj       const uint32_t *const hash_table_hashes = (uint32_t *) hdrptr;
8910*fae548d3Szrj       hdrptr += name_count * sizeof (uint32_t);
8911*fae548d3Szrj       unsigned char *const name_table_string_offsets = hdrptr;
8912*fae548d3Szrj       hdrptr += name_count * offset_size;
8913*fae548d3Szrj       unsigned char *const name_table_entry_offsets = hdrptr;
8914*fae548d3Szrj       hdrptr += name_count * offset_size;
8915*fae548d3Szrj       unsigned char *const abbrev_table = hdrptr;
8916*fae548d3Szrj       hdrptr += abbrev_table_size;
8917*fae548d3Szrj       const unsigned char *const abbrev_table_end = hdrptr;
8918*fae548d3Szrj       unsigned char *const entry_pool = hdrptr;
8919*fae548d3Szrj       if (hdrptr > unit_end)
8920*fae548d3Szrj 	{
8921*fae548d3Szrj 	  warn (_("Entry pool offset (0x%lx) exceeds unit size 0x%lx "
8922*fae548d3Szrj 		  "for unit 0x%lx in the debug_names\n"),
8923*fae548d3Szrj 		(long) (hdrptr - section->start),
8924*fae548d3Szrj 		(long) (unit_end - section->start),
8925*fae548d3Szrj 		(long) (unit_start - section->start));
8926*fae548d3Szrj 	  return 0;
8927*fae548d3Szrj 	}
8928*fae548d3Szrj 
8929*fae548d3Szrj       size_t buckets_filled = 0;
8930*fae548d3Szrj       size_t bucketi;
8931*fae548d3Szrj       for (bucketi = 0; bucketi < bucket_count; bucketi++)
8932*fae548d3Szrj 	{
8933*fae548d3Szrj 	  const uint32_t bucket = hash_table_buckets[bucketi];
8934*fae548d3Szrj 
8935*fae548d3Szrj 	  if (bucket != 0)
8936*fae548d3Szrj 	    ++buckets_filled;
8937*fae548d3Szrj 	}
8938*fae548d3Szrj       printf (ngettext ("Used %zu of %lu bucket.\n",
8939*fae548d3Szrj 			"Used %zu of %lu buckets.\n",
8940*fae548d3Szrj 			bucket_count),
8941*fae548d3Szrj 	      buckets_filled, (unsigned long) bucket_count);
8942*fae548d3Szrj 
8943*fae548d3Szrj       uint32_t hash_prev = 0;
8944*fae548d3Szrj       size_t hash_clash_count = 0;
8945*fae548d3Szrj       size_t longest_clash = 0;
8946*fae548d3Szrj       size_t this_length = 0;
8947*fae548d3Szrj       size_t hashi;
8948*fae548d3Szrj       for (hashi = 0; hashi < name_count; hashi++)
8949*fae548d3Szrj 	{
8950*fae548d3Szrj 	  const uint32_t hash_this = hash_table_hashes[hashi];
8951*fae548d3Szrj 
8952*fae548d3Szrj 	  if (hashi > 0)
8953*fae548d3Szrj 	    {
8954*fae548d3Szrj 	      if (hash_prev % bucket_count == hash_this % bucket_count)
8955*fae548d3Szrj 		{
8956*fae548d3Szrj 		  ++hash_clash_count;
8957*fae548d3Szrj 		  ++this_length;
8958*fae548d3Szrj 		  longest_clash = MAX (longest_clash, this_length);
8959*fae548d3Szrj 		}
8960*fae548d3Szrj 	      else
8961*fae548d3Szrj 		this_length = 0;
8962*fae548d3Szrj 	    }
8963*fae548d3Szrj 	  hash_prev = hash_this;
8964*fae548d3Szrj 	}
8965*fae548d3Szrj       printf (_("Out of %lu items there are %zu bucket clashes"
8966*fae548d3Szrj 		" (longest of %zu entries).\n"),
8967*fae548d3Szrj 	      (unsigned long) name_count, hash_clash_count, longest_clash);
8968*fae548d3Szrj       assert (name_count == buckets_filled + hash_clash_count);
8969*fae548d3Szrj 
8970*fae548d3Szrj       struct abbrev_lookup_entry
8971*fae548d3Szrj       {
8972*fae548d3Szrj 	dwarf_vma abbrev_tag;
8973*fae548d3Szrj 	unsigned char *abbrev_lookup_ptr;
8974*fae548d3Szrj       };
8975*fae548d3Szrj       struct abbrev_lookup_entry *abbrev_lookup = NULL;
8976*fae548d3Szrj       size_t abbrev_lookup_used = 0;
8977*fae548d3Szrj       size_t abbrev_lookup_allocated = 0;
8978*fae548d3Szrj 
8979*fae548d3Szrj       unsigned char *abbrevptr = abbrev_table;
8980*fae548d3Szrj       for (;;)
8981*fae548d3Szrj 	{
8982*fae548d3Szrj 	  dwarf_vma abbrev_tag;
8983*fae548d3Szrj 
8984*fae548d3Szrj 	  READ_ULEB (abbrev_tag, abbrevptr, abbrev_table_end);
8985*fae548d3Szrj 	  if (abbrev_tag == 0)
8986*fae548d3Szrj 	    break;
8987*fae548d3Szrj 	  if (abbrev_lookup_used == abbrev_lookup_allocated)
8988*fae548d3Szrj 	    {
8989*fae548d3Szrj 	      abbrev_lookup_allocated = MAX (0x100,
8990*fae548d3Szrj 					     abbrev_lookup_allocated * 2);
8991*fae548d3Szrj 	      abbrev_lookup = xrealloc (abbrev_lookup,
8992*fae548d3Szrj 					(abbrev_lookup_allocated
8993*fae548d3Szrj 					 * sizeof (*abbrev_lookup)));
8994*fae548d3Szrj 	    }
8995*fae548d3Szrj 	  assert (abbrev_lookup_used < abbrev_lookup_allocated);
8996*fae548d3Szrj 	  struct abbrev_lookup_entry *entry;
8997*fae548d3Szrj 	  for (entry = abbrev_lookup;
8998*fae548d3Szrj 	       entry < abbrev_lookup + abbrev_lookup_used;
8999*fae548d3Szrj 	       entry++)
9000*fae548d3Szrj 	    if (entry->abbrev_tag == abbrev_tag)
9001*fae548d3Szrj 	      {
9002*fae548d3Szrj 		warn (_("Duplicate abbreviation tag %lu "
9003*fae548d3Szrj 			"in unit 0x%lx in the debug_names\n"),
9004*fae548d3Szrj 		      (long) abbrev_tag, (long) (unit_start - section->start));
9005*fae548d3Szrj 		break;
9006*fae548d3Szrj 	      }
9007*fae548d3Szrj 	  entry = &abbrev_lookup[abbrev_lookup_used++];
9008*fae548d3Szrj 	  entry->abbrev_tag = abbrev_tag;
9009*fae548d3Szrj 	  entry->abbrev_lookup_ptr = abbrevptr;
9010*fae548d3Szrj 
9011*fae548d3Szrj 	  /* Skip DWARF tag.  */
9012*fae548d3Szrj 	  SKIP_ULEB (abbrevptr, abbrev_table_end);
9013*fae548d3Szrj 	  for (;;)
9014*fae548d3Szrj 	    {
9015*fae548d3Szrj 	      dwarf_vma xindex, form;
9016*fae548d3Szrj 
9017*fae548d3Szrj 	      READ_ULEB (xindex, abbrevptr, abbrev_table_end);
9018*fae548d3Szrj 	      READ_ULEB (form, abbrevptr, abbrev_table_end);
9019*fae548d3Szrj 	      if (xindex == 0 && form == 0)
9020*fae548d3Szrj 		break;
9021*fae548d3Szrj 	    }
9022*fae548d3Szrj 	}
9023*fae548d3Szrj 
9024*fae548d3Szrj       printf (_("\nSymbol table:\n"));
9025*fae548d3Szrj       uint32_t namei;
9026*fae548d3Szrj       for (namei = 0; namei < name_count; ++namei)
9027*fae548d3Szrj 	{
9028*fae548d3Szrj 	  uint64_t string_offset, entry_offset;
9029*fae548d3Szrj 
9030*fae548d3Szrj 	  SAFE_BYTE_GET (string_offset,
9031*fae548d3Szrj 			 name_table_string_offsets + namei * offset_size,
9032*fae548d3Szrj 			 offset_size, unit_end);
9033*fae548d3Szrj 	  SAFE_BYTE_GET (entry_offset,
9034*fae548d3Szrj 			 name_table_entry_offsets + namei * offset_size,
9035*fae548d3Szrj 			 offset_size, unit_end);
9036*fae548d3Szrj 
9037*fae548d3Szrj 	  printf ("[%3u] #%08x %s:", namei, hash_table_hashes[namei],
9038*fae548d3Szrj 		  fetch_indirect_string (string_offset));
9039*fae548d3Szrj 
9040*fae548d3Szrj 	  unsigned char *entryptr = entry_pool + entry_offset;
9041*fae548d3Szrj 
9042*fae548d3Szrj 	  // We need to scan first whether there is a single or multiple
9043*fae548d3Szrj 	  // entries.  TAGNO is -2 for the first entry, it is -1 for the
9044*fae548d3Szrj 	  // initial tag read of the second entry, then it becomes 0 for the
9045*fae548d3Szrj 	  // first entry for real printing etc.
9046*fae548d3Szrj 	  int tagno = -2;
9047*fae548d3Szrj 	  /* Initialize it due to a false compiler warning.  */
9048*fae548d3Szrj 	  dwarf_vma second_abbrev_tag = -1;
9049*fae548d3Szrj 	  for (;;)
9050*fae548d3Szrj 	    {
9051*fae548d3Szrj 	      dwarf_vma abbrev_tag;
9052*fae548d3Szrj 	      dwarf_vma dwarf_tag;
9053*fae548d3Szrj 	      const struct abbrev_lookup_entry *entry;
9054*fae548d3Szrj 
9055*fae548d3Szrj 	      READ_ULEB (abbrev_tag, entryptr, unit_end);
9056*fae548d3Szrj 	      if (tagno == -1)
9057*fae548d3Szrj 		{
9058*fae548d3Szrj 		  second_abbrev_tag = abbrev_tag;
9059*fae548d3Szrj 		  tagno = 0;
9060*fae548d3Szrj 		  entryptr = entry_pool + entry_offset;
9061*fae548d3Szrj 		  continue;
9062*fae548d3Szrj 		}
9063*fae548d3Szrj 	      if (abbrev_tag == 0)
9064*fae548d3Szrj 		break;
9065*fae548d3Szrj 	      if (tagno >= 0)
9066*fae548d3Szrj 		printf ("%s<%lu>",
9067*fae548d3Szrj 		        (tagno == 0 && second_abbrev_tag == 0 ? " " : "\n\t"),
9068*fae548d3Szrj 			(unsigned long) abbrev_tag);
9069*fae548d3Szrj 
9070*fae548d3Szrj 	      for (entry = abbrev_lookup;
9071*fae548d3Szrj 		   entry < abbrev_lookup + abbrev_lookup_used;
9072*fae548d3Szrj 		   entry++)
9073*fae548d3Szrj 		if (entry->abbrev_tag == abbrev_tag)
9074*fae548d3Szrj 		  break;
9075*fae548d3Szrj 	      if (entry >= abbrev_lookup + abbrev_lookup_used)
9076*fae548d3Szrj 		{
9077*fae548d3Szrj 		  warn (_("Undefined abbreviation tag %lu "
9078*fae548d3Szrj 			  "in unit 0x%lx in the debug_names\n"),
9079*fae548d3Szrj 			(long) abbrev_tag,
9080*fae548d3Szrj 			(long) (unit_start - section->start));
9081*fae548d3Szrj 		  break;
9082*fae548d3Szrj 		}
9083*fae548d3Szrj 	      abbrevptr = entry->abbrev_lookup_ptr;
9084*fae548d3Szrj 	      READ_ULEB (dwarf_tag, abbrevptr, abbrev_table_end);
9085*fae548d3Szrj 	      if (tagno >= 0)
9086*fae548d3Szrj 		printf (" %s", get_TAG_name (dwarf_tag));
9087*fae548d3Szrj 	      for (;;)
9088*fae548d3Szrj 		{
9089*fae548d3Szrj 		  dwarf_vma xindex, form;
9090*fae548d3Szrj 
9091*fae548d3Szrj 		  READ_ULEB (xindex, abbrevptr, abbrev_table_end);
9092*fae548d3Szrj 		  READ_ULEB (form, abbrevptr, abbrev_table_end);
9093*fae548d3Szrj 		  if (xindex == 0 && form == 0)
9094*fae548d3Szrj 		    break;
9095*fae548d3Szrj 
9096*fae548d3Szrj 		  if (tagno >= 0)
9097*fae548d3Szrj 		    printf (" %s", get_IDX_name (xindex));
9098*fae548d3Szrj 		  entryptr = read_and_display_attr_value (0, form, 0,
9099*fae548d3Szrj 							  unit_start, entryptr, unit_end,
9100*fae548d3Szrj 							  0, 0, offset_size,
9101*fae548d3Szrj 							  dwarf_version, NULL,
9102*fae548d3Szrj 							  (tagno < 0), NULL,
9103*fae548d3Szrj 							  NULL, '=', -1);
9104*fae548d3Szrj 		}
9105*fae548d3Szrj 	      ++tagno;
9106*fae548d3Szrj 	    }
9107*fae548d3Szrj 	  if (tagno <= 0)
9108*fae548d3Szrj 	    printf (_(" <no entries>"));
9109*fae548d3Szrj 	  putchar ('\n');
9110*fae548d3Szrj 	}
9111*fae548d3Szrj 
9112*fae548d3Szrj       free (abbrev_lookup);
9113*fae548d3Szrj     }
9114*fae548d3Szrj 
9115*fae548d3Szrj   return 1;
9116*fae548d3Szrj }
9117*fae548d3Szrj 
9118*fae548d3Szrj static int
display_debug_links(struct dwarf_section * section,void * file ATTRIBUTE_UNUSED)9119*fae548d3Szrj display_debug_links (struct dwarf_section *  section,
9120*fae548d3Szrj 		     void *                  file ATTRIBUTE_UNUSED)
9121*fae548d3Szrj {
9122*fae548d3Szrj   const unsigned char * filename;
9123*fae548d3Szrj   unsigned int          filelen;
9124*fae548d3Szrj 
9125*fae548d3Szrj   introduce (section, FALSE);
9126*fae548d3Szrj 
9127*fae548d3Szrj   /* The .gnu_debuglink section is formatted as:
9128*fae548d3Szrj       (c-string)  Filename.
9129*fae548d3Szrj       (padding)   If needed to reach a 4 byte boundary.
9130*fae548d3Szrj       (uint32_t)  CRC32 value.
9131*fae548d3Szrj 
9132*fae548d3Szrj     The .gun_debugaltlink section is formatted as:
9133*fae548d3Szrj       (c-string)  Filename.
9134*fae548d3Szrj       (binary)    Build-ID.  */
9135*fae548d3Szrj 
9136*fae548d3Szrj   filename =  section->start;
9137*fae548d3Szrj   filelen = strnlen ((const char *) filename, section->size);
9138*fae548d3Szrj   if (filelen == section->size)
9139*fae548d3Szrj     {
9140*fae548d3Szrj       warn (_("The debuglink filename is corrupt/missing\n"));
9141*fae548d3Szrj       return 0;
9142*fae548d3Szrj     }
9143*fae548d3Szrj 
9144*fae548d3Szrj   printf (_("  Separate debug info file: %s\n"), filename);
9145*fae548d3Szrj 
9146*fae548d3Szrj   if (const_strneq (section->name, ".gnu_debuglink"))
9147*fae548d3Szrj     {
9148*fae548d3Szrj       unsigned int          crc32;
9149*fae548d3Szrj       unsigned int          crc_offset;
9150*fae548d3Szrj 
9151*fae548d3Szrj       crc_offset = filelen + 1;
9152*fae548d3Szrj       crc_offset = (crc_offset + 3) & ~3;
9153*fae548d3Szrj       if (crc_offset + 4 > section->size)
9154*fae548d3Szrj 	{
9155*fae548d3Szrj 	  warn (_("CRC offset missing/truncated\n"));
9156*fae548d3Szrj 	  return 0;
9157*fae548d3Szrj 	}
9158*fae548d3Szrj 
9159*fae548d3Szrj       crc32 = byte_get (filename + crc_offset, 4);
9160*fae548d3Szrj 
9161*fae548d3Szrj       printf (_("  CRC value: %#x\n"), crc32);
9162*fae548d3Szrj 
9163*fae548d3Szrj       if (crc_offset + 4 < section->size)
9164*fae548d3Szrj 	{
9165*fae548d3Szrj 	  warn (_("There are %#lx extraneous bytes at the end of the section\n"),
9166*fae548d3Szrj 		(long)(section->size - (crc_offset + 4)));
9167*fae548d3Szrj 	  return 0;
9168*fae548d3Szrj 	}
9169*fae548d3Szrj     }
9170*fae548d3Szrj   else /* const_strneq (section->name, ".gnu_debugaltlink") */
9171*fae548d3Szrj     {
9172*fae548d3Szrj       const unsigned char * build_id = section->start + filelen + 1;
9173*fae548d3Szrj       bfd_size_type         build_id_len = section->size - (filelen + 1);
9174*fae548d3Szrj       bfd_size_type         printed;
9175*fae548d3Szrj 
9176*fae548d3Szrj       /* FIXME: Should we support smaller build-id notes ?  */
9177*fae548d3Szrj       if (build_id_len < 0x14)
9178*fae548d3Szrj 	{
9179*fae548d3Szrj 	  warn (_("Build-ID is too short (%#lx bytes)\n"), (long) build_id_len);
9180*fae548d3Szrj 	  return 0;
9181*fae548d3Szrj 	}
9182*fae548d3Szrj 
9183*fae548d3Szrj       printed = printf (_("  Build-ID (%#lx bytes):"), (long) build_id_len);
9184*fae548d3Szrj       display_data (printed, build_id, build_id_len);
9185*fae548d3Szrj       putchar ('\n');
9186*fae548d3Szrj     }
9187*fae548d3Szrj 
9188*fae548d3Szrj   putchar ('\n');
9189*fae548d3Szrj   return 1;
9190*fae548d3Szrj }
9191*fae548d3Szrj 
9192*fae548d3Szrj static int
display_gdb_index(struct dwarf_section * section,void * file ATTRIBUTE_UNUSED)9193*fae548d3Szrj display_gdb_index (struct dwarf_section *section,
9194*fae548d3Szrj 		   void *file ATTRIBUTE_UNUSED)
9195*fae548d3Szrj {
9196*fae548d3Szrj   unsigned char *start = section->start;
9197*fae548d3Szrj   uint32_t version;
9198*fae548d3Szrj   uint32_t cu_list_offset, tu_list_offset;
9199*fae548d3Szrj   uint32_t address_table_offset, symbol_table_offset, constant_pool_offset;
9200*fae548d3Szrj   unsigned int cu_list_elements, tu_list_elements;
9201*fae548d3Szrj   unsigned int address_table_size, symbol_table_slots;
9202*fae548d3Szrj   unsigned char *cu_list, *tu_list;
9203*fae548d3Szrj   unsigned char *address_table, *symbol_table, *constant_pool;
9204*fae548d3Szrj   unsigned int i;
9205*fae548d3Szrj 
9206*fae548d3Szrj   /* The documentation for the format of this file is in gdb/dwarf2read.c.  */
9207*fae548d3Szrj 
9208*fae548d3Szrj   introduce (section, FALSE);
9209*fae548d3Szrj 
9210*fae548d3Szrj   if (section->size < 6 * sizeof (uint32_t))
9211*fae548d3Szrj     {
9212*fae548d3Szrj       warn (_("Truncated header in the %s section.\n"), section->name);
9213*fae548d3Szrj       return 0;
9214*fae548d3Szrj     }
9215*fae548d3Szrj 
9216*fae548d3Szrj   version = byte_get_little_endian (start, 4);
9217*fae548d3Szrj   printf (_("Version %ld\n"), (long) version);
9218*fae548d3Szrj 
9219*fae548d3Szrj   /* Prior versions are obsolete, and future versions may not be
9220*fae548d3Szrj      backwards compatible.  */
9221*fae548d3Szrj   if (version < 3 || version > 8)
9222*fae548d3Szrj     {
9223*fae548d3Szrj       warn (_("Unsupported version %lu.\n"), (unsigned long) version);
9224*fae548d3Szrj       return 0;
9225*fae548d3Szrj     }
9226*fae548d3Szrj   if (version < 4)
9227*fae548d3Szrj     warn (_("The address table data in version 3 may be wrong.\n"));
9228*fae548d3Szrj   if (version < 5)
9229*fae548d3Szrj     warn (_("Version 4 does not support case insensitive lookups.\n"));
9230*fae548d3Szrj   if (version < 6)
9231*fae548d3Szrj     warn (_("Version 5 does not include inlined functions.\n"));
9232*fae548d3Szrj   if (version < 7)
9233*fae548d3Szrj       warn (_("Version 6 does not include symbol attributes.\n"));
9234*fae548d3Szrj   /* Version 7 indices generated by Gold have bad type unit references,
9235*fae548d3Szrj      PR binutils/15021.  But we don't know if the index was generated by
9236*fae548d3Szrj      Gold or not, so to avoid worrying users with gdb-generated indices
9237*fae548d3Szrj      we say nothing for version 7 here.  */
9238*fae548d3Szrj 
9239*fae548d3Szrj   cu_list_offset = byte_get_little_endian (start + 4, 4);
9240*fae548d3Szrj   tu_list_offset = byte_get_little_endian (start + 8, 4);
9241*fae548d3Szrj   address_table_offset = byte_get_little_endian (start + 12, 4);
9242*fae548d3Szrj   symbol_table_offset = byte_get_little_endian (start + 16, 4);
9243*fae548d3Szrj   constant_pool_offset = byte_get_little_endian (start + 20, 4);
9244*fae548d3Szrj 
9245*fae548d3Szrj   if (cu_list_offset > section->size
9246*fae548d3Szrj       || tu_list_offset > section->size
9247*fae548d3Szrj       || address_table_offset > section->size
9248*fae548d3Szrj       || symbol_table_offset > section->size
9249*fae548d3Szrj       || constant_pool_offset > section->size)
9250*fae548d3Szrj     {
9251*fae548d3Szrj       warn (_("Corrupt header in the %s section.\n"), section->name);
9252*fae548d3Szrj       return 0;
9253*fae548d3Szrj     }
9254*fae548d3Szrj 
9255*fae548d3Szrj   /* PR 17531: file: 418d0a8a.  */
9256*fae548d3Szrj   if (tu_list_offset < cu_list_offset)
9257*fae548d3Szrj     {
9258*fae548d3Szrj       warn (_("TU offset (%x) is less than CU offset (%x)\n"),
9259*fae548d3Szrj 	    tu_list_offset, cu_list_offset);
9260*fae548d3Szrj       return 0;
9261*fae548d3Szrj     }
9262*fae548d3Szrj 
9263*fae548d3Szrj   cu_list_elements = (tu_list_offset - cu_list_offset) / 8;
9264*fae548d3Szrj 
9265*fae548d3Szrj   if (address_table_offset < tu_list_offset)
9266*fae548d3Szrj     {
9267*fae548d3Szrj       warn (_("Address table offset (%x) is less than TU offset (%x)\n"),
9268*fae548d3Szrj 	    address_table_offset, tu_list_offset);
9269*fae548d3Szrj       return 0;
9270*fae548d3Szrj     }
9271*fae548d3Szrj 
9272*fae548d3Szrj   tu_list_elements = (address_table_offset - tu_list_offset) / 8;
9273*fae548d3Szrj 
9274*fae548d3Szrj   /* PR 17531: file: 18a47d3d.  */
9275*fae548d3Szrj   if (symbol_table_offset < address_table_offset)
9276*fae548d3Szrj     {
9277*fae548d3Szrj       warn (_("Symbol table offset (%x) is less then Address table offset (%x)\n"),
9278*fae548d3Szrj 	    symbol_table_offset, address_table_offset);
9279*fae548d3Szrj       return 0;
9280*fae548d3Szrj     }
9281*fae548d3Szrj 
9282*fae548d3Szrj   address_table_size = symbol_table_offset - address_table_offset;
9283*fae548d3Szrj 
9284*fae548d3Szrj   if (constant_pool_offset < symbol_table_offset)
9285*fae548d3Szrj     {
9286*fae548d3Szrj       warn (_("Constant pool offset (%x) is less than symbol table offset (%x)\n"),
9287*fae548d3Szrj 	    constant_pool_offset, symbol_table_offset);
9288*fae548d3Szrj       return 0;
9289*fae548d3Szrj     }
9290*fae548d3Szrj 
9291*fae548d3Szrj   symbol_table_slots = (constant_pool_offset - symbol_table_offset) / 8;
9292*fae548d3Szrj 
9293*fae548d3Szrj   cu_list = start + cu_list_offset;
9294*fae548d3Szrj   tu_list = start + tu_list_offset;
9295*fae548d3Szrj   address_table = start + address_table_offset;
9296*fae548d3Szrj   symbol_table = start + symbol_table_offset;
9297*fae548d3Szrj   constant_pool = start + constant_pool_offset;
9298*fae548d3Szrj 
9299*fae548d3Szrj   if (address_table + address_table_size > section->start + section->size)
9300*fae548d3Szrj     {
9301*fae548d3Szrj       warn (_("Address table extends beyond end of section.\n"));
9302*fae548d3Szrj       return 0;
9303*fae548d3Szrj     }
9304*fae548d3Szrj 
9305*fae548d3Szrj   printf (_("\nCU table:\n"));
9306*fae548d3Szrj   for (i = 0; i < cu_list_elements; i += 2)
9307*fae548d3Szrj     {
9308*fae548d3Szrj       uint64_t cu_offset = byte_get_little_endian (cu_list + i * 8, 8);
9309*fae548d3Szrj       uint64_t cu_length = byte_get_little_endian (cu_list + i * 8 + 8, 8);
9310*fae548d3Szrj 
9311*fae548d3Szrj       printf (_("[%3u] 0x%lx - 0x%lx\n"), i / 2,
9312*fae548d3Szrj 	      (unsigned long) cu_offset,
9313*fae548d3Szrj 	      (unsigned long) (cu_offset + cu_length - 1));
9314*fae548d3Szrj     }
9315*fae548d3Szrj 
9316*fae548d3Szrj   printf (_("\nTU table:\n"));
9317*fae548d3Szrj   for (i = 0; i < tu_list_elements; i += 3)
9318*fae548d3Szrj     {
9319*fae548d3Szrj       uint64_t tu_offset = byte_get_little_endian (tu_list + i * 8, 8);
9320*fae548d3Szrj       uint64_t type_offset = byte_get_little_endian (tu_list + i * 8 + 8, 8);
9321*fae548d3Szrj       uint64_t signature = byte_get_little_endian (tu_list + i * 8 + 16, 8);
9322*fae548d3Szrj 
9323*fae548d3Szrj       printf (_("[%3u] 0x%lx 0x%lx "), i / 3,
9324*fae548d3Szrj 	      (unsigned long) tu_offset,
9325*fae548d3Szrj 	      (unsigned long) type_offset);
9326*fae548d3Szrj       print_dwarf_vma (signature, 8);
9327*fae548d3Szrj       printf ("\n");
9328*fae548d3Szrj     }
9329*fae548d3Szrj 
9330*fae548d3Szrj   printf (_("\nAddress table:\n"));
9331*fae548d3Szrj   for (i = 0; i < address_table_size && i <= address_table_size - (2 * 8 + 4);
9332*fae548d3Szrj        i += 2 * 8 + 4)
9333*fae548d3Szrj     {
9334*fae548d3Szrj       uint64_t low = byte_get_little_endian (address_table + i, 8);
9335*fae548d3Szrj       uint64_t high = byte_get_little_endian (address_table + i + 8, 8);
9336*fae548d3Szrj       uint32_t cu_index = byte_get_little_endian (address_table + i + 16, 4);
9337*fae548d3Szrj 
9338*fae548d3Szrj       print_dwarf_vma (low, 8);
9339*fae548d3Szrj       print_dwarf_vma (high, 8);
9340*fae548d3Szrj       printf (_("%lu\n"), (unsigned long) cu_index);
9341*fae548d3Szrj     }
9342*fae548d3Szrj 
9343*fae548d3Szrj   printf (_("\nSymbol table:\n"));
9344*fae548d3Szrj   for (i = 0; i < symbol_table_slots; ++i)
9345*fae548d3Szrj     {
9346*fae548d3Szrj       uint32_t name_offset = byte_get_little_endian (symbol_table + i * 8, 4);
9347*fae548d3Szrj       uint32_t cu_vector_offset = byte_get_little_endian (symbol_table + i * 8 + 4, 4);
9348*fae548d3Szrj       uint32_t num_cus, cu;
9349*fae548d3Szrj 
9350*fae548d3Szrj       if (name_offset != 0
9351*fae548d3Szrj 	  || cu_vector_offset != 0)
9352*fae548d3Szrj 	{
9353*fae548d3Szrj 	  unsigned int j;
9354*fae548d3Szrj 	  unsigned char * adr;
9355*fae548d3Szrj 
9356*fae548d3Szrj 	  adr = constant_pool + name_offset;
9357*fae548d3Szrj 	  /* PR 17531: file: 5b7b07ad.  */
9358*fae548d3Szrj 	  if (adr < constant_pool || adr >= section->start + section->size)
9359*fae548d3Szrj 	    {
9360*fae548d3Szrj 	      printf (_("[%3u] <corrupt offset: %x>"), i, name_offset);
9361*fae548d3Szrj 	      warn (_("Corrupt name offset of 0x%x found for symbol table slot %d\n"),
9362*fae548d3Szrj 		    name_offset, i);
9363*fae548d3Szrj 	    }
9364*fae548d3Szrj 	  else
9365*fae548d3Szrj 	    printf ("[%3u] %.*s:", i,
9366*fae548d3Szrj 		    (int) (section->size - (constant_pool_offset + name_offset)),
9367*fae548d3Szrj 		    constant_pool + name_offset);
9368*fae548d3Szrj 
9369*fae548d3Szrj 	  adr = constant_pool + cu_vector_offset;
9370*fae548d3Szrj 	  if (adr < constant_pool || adr >= section->start + section->size - 3)
9371*fae548d3Szrj 	    {
9372*fae548d3Szrj 	      printf (_("<invalid CU vector offset: %x>\n"), cu_vector_offset);
9373*fae548d3Szrj 	      warn (_("Corrupt CU vector offset of 0x%x found for symbol table slot %d\n"),
9374*fae548d3Szrj 		    cu_vector_offset, i);
9375*fae548d3Szrj 	      continue;
9376*fae548d3Szrj 	    }
9377*fae548d3Szrj 
9378*fae548d3Szrj 	  num_cus = byte_get_little_endian (adr, 4);
9379*fae548d3Szrj 
9380*fae548d3Szrj 	  adr = constant_pool + cu_vector_offset + 4 + num_cus * 4;
9381*fae548d3Szrj 	  if (num_cus * 4 < num_cus
9382*fae548d3Szrj 	      || adr >= section->start + section->size
9383*fae548d3Szrj 	      || adr < constant_pool)
9384*fae548d3Szrj 	    {
9385*fae548d3Szrj 	      printf ("<invalid number of CUs: %d>\n", num_cus);
9386*fae548d3Szrj 	      warn (_("Invalid number of CUs (0x%x) for symbol table slot %d\n"),
9387*fae548d3Szrj 		    num_cus, i);
9388*fae548d3Szrj 	      continue;
9389*fae548d3Szrj 	    }
9390*fae548d3Szrj 
9391*fae548d3Szrj 	  if (num_cus > 1)
9392*fae548d3Szrj 	    printf ("\n");
9393*fae548d3Szrj 
9394*fae548d3Szrj 	  for (j = 0; j < num_cus; ++j)
9395*fae548d3Szrj 	    {
9396*fae548d3Szrj 	      int is_static;
9397*fae548d3Szrj 	      gdb_index_symbol_kind kind;
9398*fae548d3Szrj 
9399*fae548d3Szrj 	      cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4);
9400*fae548d3Szrj 	      is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu);
9401*fae548d3Szrj 	      kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu);
9402*fae548d3Szrj 	      cu = GDB_INDEX_CU_VALUE (cu);
9403*fae548d3Szrj 	      /* Convert to TU number if it's for a type unit.  */
9404*fae548d3Szrj 	      if (cu >= cu_list_elements / 2)
9405*fae548d3Szrj 		printf ("%cT%lu", num_cus > 1 ? '\t' : ' ',
9406*fae548d3Szrj 			(unsigned long) (cu - cu_list_elements / 2));
9407*fae548d3Szrj 	      else
9408*fae548d3Szrj 		printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu);
9409*fae548d3Szrj 
9410*fae548d3Szrj 	      printf (" [%s, %s]",
9411*fae548d3Szrj 		      is_static ? _("static") : _("global"),
9412*fae548d3Szrj 		      get_gdb_index_symbol_kind_name (kind));
9413*fae548d3Szrj 	      if (num_cus > 1)
9414*fae548d3Szrj 		printf ("\n");
9415*fae548d3Szrj 	    }
9416*fae548d3Szrj 	  if (num_cus <= 1)
9417*fae548d3Szrj 	    printf ("\n");
9418*fae548d3Szrj 	}
9419*fae548d3Szrj     }
9420*fae548d3Szrj 
9421*fae548d3Szrj   return 1;
9422*fae548d3Szrj }
9423*fae548d3Szrj 
9424*fae548d3Szrj /* Pre-allocate enough space for the CU/TU sets needed.  */
9425*fae548d3Szrj 
9426*fae548d3Szrj static void
prealloc_cu_tu_list(unsigned int nshndx)9427*fae548d3Szrj prealloc_cu_tu_list (unsigned int nshndx)
9428*fae548d3Szrj {
9429*fae548d3Szrj   if (shndx_pool == NULL)
9430*fae548d3Szrj     {
9431*fae548d3Szrj       shndx_pool_size = nshndx;
9432*fae548d3Szrj       shndx_pool_used = 0;
9433*fae548d3Szrj       shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size,
9434*fae548d3Szrj 					      sizeof (unsigned int));
9435*fae548d3Szrj     }
9436*fae548d3Szrj   else
9437*fae548d3Szrj     {
9438*fae548d3Szrj       shndx_pool_size = shndx_pool_used + nshndx;
9439*fae548d3Szrj       shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size,
9440*fae548d3Szrj 					       sizeof (unsigned int));
9441*fae548d3Szrj     }
9442*fae548d3Szrj }
9443*fae548d3Szrj 
9444*fae548d3Szrj static void
add_shndx_to_cu_tu_entry(unsigned int shndx)9445*fae548d3Szrj add_shndx_to_cu_tu_entry (unsigned int shndx)
9446*fae548d3Szrj {
9447*fae548d3Szrj   if (shndx_pool_used >= shndx_pool_size)
9448*fae548d3Szrj     {
9449*fae548d3Szrj       error (_("Internal error: out of space in the shndx pool.\n"));
9450*fae548d3Szrj       return;
9451*fae548d3Szrj     }
9452*fae548d3Szrj   shndx_pool [shndx_pool_used++] = shndx;
9453*fae548d3Szrj }
9454*fae548d3Szrj 
9455*fae548d3Szrj static void
end_cu_tu_entry(void)9456*fae548d3Szrj end_cu_tu_entry (void)
9457*fae548d3Szrj {
9458*fae548d3Szrj   if (shndx_pool_used >= shndx_pool_size)
9459*fae548d3Szrj     {
9460*fae548d3Szrj       error (_("Internal error: out of space in the shndx pool.\n"));
9461*fae548d3Szrj       return;
9462*fae548d3Szrj     }
9463*fae548d3Szrj   shndx_pool [shndx_pool_used++] = 0;
9464*fae548d3Szrj }
9465*fae548d3Szrj 
9466*fae548d3Szrj /* Return the short name of a DWARF section given by a DW_SECT enumerator.  */
9467*fae548d3Szrj 
9468*fae548d3Szrj static const char *
get_DW_SECT_short_name(unsigned int dw_sect)9469*fae548d3Szrj get_DW_SECT_short_name (unsigned int dw_sect)
9470*fae548d3Szrj {
9471*fae548d3Szrj   static char buf[16];
9472*fae548d3Szrj 
9473*fae548d3Szrj   switch (dw_sect)
9474*fae548d3Szrj     {
9475*fae548d3Szrj       case DW_SECT_INFO:
9476*fae548d3Szrj 	return "info";
9477*fae548d3Szrj       case DW_SECT_TYPES:
9478*fae548d3Szrj 	return "types";
9479*fae548d3Szrj       case DW_SECT_ABBREV:
9480*fae548d3Szrj 	return "abbrev";
9481*fae548d3Szrj       case DW_SECT_LINE:
9482*fae548d3Szrj 	return "line";
9483*fae548d3Szrj       case DW_SECT_LOC:
9484*fae548d3Szrj 	return "loc";
9485*fae548d3Szrj       case DW_SECT_STR_OFFSETS:
9486*fae548d3Szrj 	return "str_off";
9487*fae548d3Szrj       case DW_SECT_MACINFO:
9488*fae548d3Szrj 	return "macinfo";
9489*fae548d3Szrj       case DW_SECT_MACRO:
9490*fae548d3Szrj 	return "macro";
9491*fae548d3Szrj       default:
9492*fae548d3Szrj 	break;
9493*fae548d3Szrj     }
9494*fae548d3Szrj 
9495*fae548d3Szrj   snprintf (buf, sizeof (buf), "%d", dw_sect);
9496*fae548d3Szrj   return buf;
9497*fae548d3Szrj }
9498*fae548d3Szrj 
9499*fae548d3Szrj /* Process a CU or TU index.  If DO_DISPLAY is true, print the contents.
9500*fae548d3Szrj    These sections are extensions for Fission.
9501*fae548d3Szrj    See http://gcc.gnu.org/wiki/DebugFissionDWP.  */
9502*fae548d3Szrj 
9503*fae548d3Szrj static int
process_cu_tu_index(struct dwarf_section * section,int do_display)9504*fae548d3Szrj process_cu_tu_index (struct dwarf_section *section, int do_display)
9505*fae548d3Szrj {
9506*fae548d3Szrj   unsigned char *phdr = section->start;
9507*fae548d3Szrj   unsigned char *limit = phdr + section->size;
9508*fae548d3Szrj   unsigned char *phash;
9509*fae548d3Szrj   unsigned char *pindex;
9510*fae548d3Szrj   unsigned char *ppool;
9511*fae548d3Szrj   unsigned int version;
9512*fae548d3Szrj   unsigned int ncols = 0;
9513*fae548d3Szrj   unsigned int nused;
9514*fae548d3Szrj   unsigned int nslots;
9515*fae548d3Szrj   unsigned int i;
9516*fae548d3Szrj   unsigned int j;
9517*fae548d3Szrj   dwarf_vma signature_high;
9518*fae548d3Szrj   dwarf_vma signature_low;
9519*fae548d3Szrj   char buf[64];
9520*fae548d3Szrj 
9521*fae548d3Szrj   /* PR 17512: file: 002-168123-0.004.  */
9522*fae548d3Szrj   if (phdr == NULL)
9523*fae548d3Szrj     {
9524*fae548d3Szrj       warn (_("Section %s is empty\n"), section->name);
9525*fae548d3Szrj       return 0;
9526*fae548d3Szrj     }
9527*fae548d3Szrj   /* PR 17512: file: 002-376-0.004.  */
9528*fae548d3Szrj   if (section->size < 24)
9529*fae548d3Szrj     {
9530*fae548d3Szrj       warn (_("Section %s is too small to contain a CU/TU header\n"),
9531*fae548d3Szrj 	    section->name);
9532*fae548d3Szrj       return 0;
9533*fae548d3Szrj     }
9534*fae548d3Szrj 
9535*fae548d3Szrj   SAFE_BYTE_GET (version, phdr, 4, limit);
9536*fae548d3Szrj   if (version >= 2)
9537*fae548d3Szrj     SAFE_BYTE_GET (ncols, phdr + 4, 4, limit);
9538*fae548d3Szrj   SAFE_BYTE_GET (nused, phdr + 8, 4, limit);
9539*fae548d3Szrj   SAFE_BYTE_GET (nslots, phdr + 12, 4, limit);
9540*fae548d3Szrj 
9541*fae548d3Szrj   phash = phdr + 16;
9542*fae548d3Szrj   pindex = phash + (size_t) nslots * 8;
9543*fae548d3Szrj   ppool = pindex + (size_t) nslots * 4;
9544*fae548d3Szrj 
9545*fae548d3Szrj   if (do_display)
9546*fae548d3Szrj     {
9547*fae548d3Szrj       introduce (section, FALSE);
9548*fae548d3Szrj 
9549*fae548d3Szrj       printf (_("  Version:                 %u\n"), version);
9550*fae548d3Szrj       if (version >= 2)
9551*fae548d3Szrj 	printf (_("  Number of columns:       %u\n"), ncols);
9552*fae548d3Szrj       printf (_("  Number of used entries:  %u\n"), nused);
9553*fae548d3Szrj       printf (_("  Number of slots:         %u\n\n"), nslots);
9554*fae548d3Szrj     }
9555*fae548d3Szrj 
9556*fae548d3Szrj   /* PR 17531: file: 45d69832.  */
9557*fae548d3Szrj   if ((size_t) nslots * 8 / 8 != nslots
9558*fae548d3Szrj       || phash < phdr || phash > limit
9559*fae548d3Szrj       || pindex < phash || pindex > limit
9560*fae548d3Szrj       || ppool < pindex || ppool > limit)
9561*fae548d3Szrj     {
9562*fae548d3Szrj       warn (ngettext ("Section %s is too small for %u slot\n",
9563*fae548d3Szrj 		      "Section %s is too small for %u slots\n",
9564*fae548d3Szrj 		      nslots),
9565*fae548d3Szrj 	    section->name, nslots);
9566*fae548d3Szrj       return 0;
9567*fae548d3Szrj     }
9568*fae548d3Szrj 
9569*fae548d3Szrj   if (version == 1)
9570*fae548d3Szrj     {
9571*fae548d3Szrj       if (!do_display)
9572*fae548d3Szrj 	prealloc_cu_tu_list ((limit - ppool) / 4);
9573*fae548d3Szrj       for (i = 0; i < nslots; i++)
9574*fae548d3Szrj 	{
9575*fae548d3Szrj 	  unsigned char *shndx_list;
9576*fae548d3Szrj 	  unsigned int shndx;
9577*fae548d3Szrj 
9578*fae548d3Szrj 	  SAFE_BYTE_GET64 (phash, &signature_high, &signature_low, limit);
9579*fae548d3Szrj 	  if (signature_high != 0 || signature_low != 0)
9580*fae548d3Szrj 	    {
9581*fae548d3Szrj 	      SAFE_BYTE_GET (j, pindex, 4, limit);
9582*fae548d3Szrj 	      shndx_list = ppool + j * 4;
9583*fae548d3Szrj 	      /* PR 17531: file: 705e010d.  */
9584*fae548d3Szrj 	      if (shndx_list < ppool)
9585*fae548d3Szrj 		{
9586*fae548d3Szrj 		  warn (_("Section index pool located before start of section\n"));
9587*fae548d3Szrj 		  return 0;
9588*fae548d3Szrj 		}
9589*fae548d3Szrj 
9590*fae548d3Szrj 	      if (do_display)
9591*fae548d3Szrj 		printf (_("  [%3d] Signature:  0x%s  Sections: "),
9592*fae548d3Szrj 			i, dwarf_vmatoa64 (signature_high, signature_low,
9593*fae548d3Szrj 					   buf, sizeof (buf)));
9594*fae548d3Szrj 	      for (;;)
9595*fae548d3Szrj 		{
9596*fae548d3Szrj 		  if (shndx_list >= limit)
9597*fae548d3Szrj 		    {
9598*fae548d3Szrj 		      warn (_("Section %s too small for shndx pool\n"),
9599*fae548d3Szrj 			    section->name);
9600*fae548d3Szrj 		      return 0;
9601*fae548d3Szrj 		    }
9602*fae548d3Szrj 		  SAFE_BYTE_GET (shndx, shndx_list, 4, limit);
9603*fae548d3Szrj 		  if (shndx == 0)
9604*fae548d3Szrj 		    break;
9605*fae548d3Szrj 		  if (do_display)
9606*fae548d3Szrj 		    printf (" %d", shndx);
9607*fae548d3Szrj 		  else
9608*fae548d3Szrj 		    add_shndx_to_cu_tu_entry (shndx);
9609*fae548d3Szrj 		  shndx_list += 4;
9610*fae548d3Szrj 		}
9611*fae548d3Szrj 	      if (do_display)
9612*fae548d3Szrj 		printf ("\n");
9613*fae548d3Szrj 	      else
9614*fae548d3Szrj 		end_cu_tu_entry ();
9615*fae548d3Szrj 	    }
9616*fae548d3Szrj 	  phash += 8;
9617*fae548d3Szrj 	  pindex += 4;
9618*fae548d3Szrj 	}
9619*fae548d3Szrj     }
9620*fae548d3Szrj   else if (version == 2)
9621*fae548d3Szrj     {
9622*fae548d3Szrj       unsigned int val;
9623*fae548d3Szrj       unsigned int dw_sect;
9624*fae548d3Szrj       unsigned char *ph = phash;
9625*fae548d3Szrj       unsigned char *pi = pindex;
9626*fae548d3Szrj       unsigned char *poffsets = ppool + (size_t) ncols * 4;
9627*fae548d3Szrj       unsigned char *psizes = poffsets + (size_t) nused * ncols * 4;
9628*fae548d3Szrj       unsigned char *pend = psizes + (size_t) nused * ncols * 4;
9629*fae548d3Szrj       bfd_boolean is_tu_index;
9630*fae548d3Szrj       struct cu_tu_set *this_set = NULL;
9631*fae548d3Szrj       unsigned int row;
9632*fae548d3Szrj       unsigned char *prow;
9633*fae548d3Szrj 
9634*fae548d3Szrj       is_tu_index = strcmp (section->name, ".debug_tu_index") == 0;
9635*fae548d3Szrj 
9636*fae548d3Szrj       /* PR 17531: file: 0dd159bf.
9637*fae548d3Szrj 	 Check for integer overflow (can occur when size_t is 32-bit)
9638*fae548d3Szrj 	 with overlarge ncols or nused values.  */
9639*fae548d3Szrj       if (ncols > 0
9640*fae548d3Szrj 	  && ((size_t) ncols * 4 / 4 != ncols
9641*fae548d3Szrj 	      || (size_t) nused * ncols * 4 / ((size_t) ncols * 4) != nused
9642*fae548d3Szrj 	      || poffsets < ppool || poffsets > limit
9643*fae548d3Szrj 	      || psizes < poffsets || psizes > limit
9644*fae548d3Szrj 	      || pend < psizes || pend > limit))
9645*fae548d3Szrj 	{
9646*fae548d3Szrj 	  warn (_("Section %s too small for offset and size tables\n"),
9647*fae548d3Szrj 		section->name);
9648*fae548d3Szrj 	  return 0;
9649*fae548d3Szrj 	}
9650*fae548d3Szrj 
9651*fae548d3Szrj       if (do_display)
9652*fae548d3Szrj 	{
9653*fae548d3Szrj 	  printf (_("  Offset table\n"));
9654*fae548d3Szrj 	  printf ("  slot  %-16s  ",
9655*fae548d3Szrj 		 is_tu_index ? _("signature") : _("dwo_id"));
9656*fae548d3Szrj 	}
9657*fae548d3Szrj       else
9658*fae548d3Szrj 	{
9659*fae548d3Szrj 	  if (is_tu_index)
9660*fae548d3Szrj 	    {
9661*fae548d3Szrj 	      tu_count = nused;
9662*fae548d3Szrj 	      tu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
9663*fae548d3Szrj 	      this_set = tu_sets;
9664*fae548d3Szrj 	    }
9665*fae548d3Szrj 	  else
9666*fae548d3Szrj 	    {
9667*fae548d3Szrj 	      cu_count = nused;
9668*fae548d3Szrj 	      cu_sets = xcalloc2 (nused, sizeof (struct cu_tu_set));
9669*fae548d3Szrj 	      this_set = cu_sets;
9670*fae548d3Szrj 	    }
9671*fae548d3Szrj 	}
9672*fae548d3Szrj 
9673*fae548d3Szrj       if (do_display)
9674*fae548d3Szrj 	{
9675*fae548d3Szrj 	  for (j = 0; j < ncols; j++)
9676*fae548d3Szrj 	    {
9677*fae548d3Szrj 	      SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
9678*fae548d3Szrj 	      printf (" %8s", get_DW_SECT_short_name (dw_sect));
9679*fae548d3Szrj 	    }
9680*fae548d3Szrj 	  printf ("\n");
9681*fae548d3Szrj 	}
9682*fae548d3Szrj 
9683*fae548d3Szrj       for (i = 0; i < nslots; i++)
9684*fae548d3Szrj 	{
9685*fae548d3Szrj 	  SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
9686*fae548d3Szrj 
9687*fae548d3Szrj 	  SAFE_BYTE_GET (row, pi, 4, limit);
9688*fae548d3Szrj 	  if (row != 0)
9689*fae548d3Szrj 	    {
9690*fae548d3Szrj 	      /* PR 17531: file: a05f6ab3.  */
9691*fae548d3Szrj 	      if (row > nused)
9692*fae548d3Szrj 		{
9693*fae548d3Szrj 		  warn (_("Row index (%u) is larger than number of used entries (%u)\n"),
9694*fae548d3Szrj 			row, nused);
9695*fae548d3Szrj 		  return 0;
9696*fae548d3Szrj 		}
9697*fae548d3Szrj 
9698*fae548d3Szrj 	      if (!do_display)
9699*fae548d3Szrj 		{
9700*fae548d3Szrj 		  size_t num_copy = sizeof (uint64_t);
9701*fae548d3Szrj 
9702*fae548d3Szrj 		  /* PR 23064: Beware of buffer overflow.  */
9703*fae548d3Szrj 		  if (ph + num_copy < limit)
9704*fae548d3Szrj 		    memcpy (&this_set[row - 1].signature, ph, num_copy);
9705*fae548d3Szrj 		  else
9706*fae548d3Szrj 		    {
9707*fae548d3Szrj 		      warn (_("Signature (%p) extends beyond end of space in section\n"), ph);
9708*fae548d3Szrj 		      return 0;
9709*fae548d3Szrj 		    }
9710*fae548d3Szrj 		}
9711*fae548d3Szrj 
9712*fae548d3Szrj 	      prow = poffsets + (row - 1) * ncols * 4;
9713*fae548d3Szrj 	      /* PR 17531: file: b8ce60a8.  */
9714*fae548d3Szrj 	      if (prow < poffsets || prow > limit)
9715*fae548d3Szrj 		{
9716*fae548d3Szrj 		  warn (_("Row index (%u) * num columns (%u) > space remaining in section\n"),
9717*fae548d3Szrj 			row, ncols);
9718*fae548d3Szrj 		  return 0;
9719*fae548d3Szrj 		}
9720*fae548d3Szrj 
9721*fae548d3Szrj 	      if (do_display)
9722*fae548d3Szrj 		printf (_("  [%3d] 0x%s"),
9723*fae548d3Szrj 			i, dwarf_vmatoa64 (signature_high, signature_low,
9724*fae548d3Szrj 					   buf, sizeof (buf)));
9725*fae548d3Szrj 	      for (j = 0; j < ncols; j++)
9726*fae548d3Szrj 		{
9727*fae548d3Szrj 		  SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
9728*fae548d3Szrj 		  if (do_display)
9729*fae548d3Szrj 		    printf (" %8d", val);
9730*fae548d3Szrj 		  else
9731*fae548d3Szrj 		    {
9732*fae548d3Szrj 		      SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
9733*fae548d3Szrj 
9734*fae548d3Szrj 		      /* PR 17531: file: 10796eb3.  */
9735*fae548d3Szrj 		      if (dw_sect >= DW_SECT_MAX)
9736*fae548d3Szrj 			warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
9737*fae548d3Szrj 		      else
9738*fae548d3Szrj 			this_set [row - 1].section_offsets [dw_sect] = val;
9739*fae548d3Szrj 		    }
9740*fae548d3Szrj 		}
9741*fae548d3Szrj 
9742*fae548d3Szrj 	      if (do_display)
9743*fae548d3Szrj 		printf ("\n");
9744*fae548d3Szrj 	    }
9745*fae548d3Szrj 	  ph += 8;
9746*fae548d3Szrj 	  pi += 4;
9747*fae548d3Szrj 	}
9748*fae548d3Szrj 
9749*fae548d3Szrj       ph = phash;
9750*fae548d3Szrj       pi = pindex;
9751*fae548d3Szrj       if (do_display)
9752*fae548d3Szrj 	{
9753*fae548d3Szrj 	  printf ("\n");
9754*fae548d3Szrj 	  printf (_("  Size table\n"));
9755*fae548d3Szrj 	  printf ("  slot  %-16s  ",
9756*fae548d3Szrj 		 is_tu_index ? _("signature") : _("dwo_id"));
9757*fae548d3Szrj 	}
9758*fae548d3Szrj 
9759*fae548d3Szrj       for (j = 0; j < ncols; j++)
9760*fae548d3Szrj 	{
9761*fae548d3Szrj 	  SAFE_BYTE_GET (val, ppool + j * 4, 4, limit);
9762*fae548d3Szrj 	  if (do_display)
9763*fae548d3Szrj 	    printf (" %8s", get_DW_SECT_short_name (val));
9764*fae548d3Szrj 	}
9765*fae548d3Szrj 
9766*fae548d3Szrj       if (do_display)
9767*fae548d3Szrj 	printf ("\n");
9768*fae548d3Szrj 
9769*fae548d3Szrj       for (i = 0; i < nslots; i++)
9770*fae548d3Szrj 	{
9771*fae548d3Szrj 	  SAFE_BYTE_GET64 (ph, &signature_high, &signature_low, limit);
9772*fae548d3Szrj 
9773*fae548d3Szrj 	  SAFE_BYTE_GET (row, pi, 4, limit);
9774*fae548d3Szrj 	  if (row != 0)
9775*fae548d3Szrj 	    {
9776*fae548d3Szrj 	      prow = psizes + (row - 1) * ncols * 4;
9777*fae548d3Szrj 
9778*fae548d3Szrj 	      if (do_display)
9779*fae548d3Szrj 		printf (_("  [%3d] 0x%s"),
9780*fae548d3Szrj 			i, dwarf_vmatoa64 (signature_high, signature_low,
9781*fae548d3Szrj 					   buf, sizeof (buf)));
9782*fae548d3Szrj 
9783*fae548d3Szrj 	      for (j = 0; j < ncols; j++)
9784*fae548d3Szrj 		{
9785*fae548d3Szrj 		  SAFE_BYTE_GET (val, prow + j * 4, 4, limit);
9786*fae548d3Szrj 		  if (do_display)
9787*fae548d3Szrj 		    printf (" %8d", val);
9788*fae548d3Szrj 		  else
9789*fae548d3Szrj 		    {
9790*fae548d3Szrj 		      SAFE_BYTE_GET (dw_sect, ppool + j * 4, 4, limit);
9791*fae548d3Szrj 		      if (dw_sect >= DW_SECT_MAX)
9792*fae548d3Szrj 			warn (_("Overlarge Dwarf section index detected: %u\n"), dw_sect);
9793*fae548d3Szrj 		      else
9794*fae548d3Szrj 		      this_set [row - 1].section_sizes [dw_sect] = val;
9795*fae548d3Szrj 		    }
9796*fae548d3Szrj 		}
9797*fae548d3Szrj 
9798*fae548d3Szrj 	      if (do_display)
9799*fae548d3Szrj 		printf ("\n");
9800*fae548d3Szrj 	    }
9801*fae548d3Szrj 
9802*fae548d3Szrj 	  ph += 8;
9803*fae548d3Szrj 	  pi += 4;
9804*fae548d3Szrj 	}
9805*fae548d3Szrj     }
9806*fae548d3Szrj   else if (do_display)
9807*fae548d3Szrj     printf (_("  Unsupported version (%d)\n"), version);
9808*fae548d3Szrj 
9809*fae548d3Szrj   if (do_display)
9810*fae548d3Szrj       printf ("\n");
9811*fae548d3Szrj 
9812*fae548d3Szrj   return 1;
9813*fae548d3Szrj }
9814*fae548d3Szrj 
9815*fae548d3Szrj /* Load the CU and TU indexes if present.  This will build a list of
9816*fae548d3Szrj    section sets that we can use to associate a .debug_info.dwo section
9817*fae548d3Szrj    with its associated .debug_abbrev.dwo section in a .dwp file.  */
9818*fae548d3Szrj 
9819*fae548d3Szrj static bfd_boolean
load_cu_tu_indexes(void * file)9820*fae548d3Szrj load_cu_tu_indexes (void *file)
9821*fae548d3Szrj {
9822*fae548d3Szrj   static int cu_tu_indexes_read = -1; /* Tri-state variable.  */
9823*fae548d3Szrj 
9824*fae548d3Szrj   /* If we have already loaded (or tried to load) the CU and TU indexes
9825*fae548d3Szrj      then do not bother to repeat the task.  */
9826*fae548d3Szrj   if (cu_tu_indexes_read == -1)
9827*fae548d3Szrj     {
9828*fae548d3Szrj       cu_tu_indexes_read = TRUE;
9829*fae548d3Szrj 
9830*fae548d3Szrj       if (load_debug_section_with_follow (dwp_cu_index, file))
9831*fae548d3Szrj 	if (! process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0))
9832*fae548d3Szrj 	  cu_tu_indexes_read = FALSE;
9833*fae548d3Szrj 
9834*fae548d3Szrj       if (load_debug_section_with_follow (dwp_tu_index, file))
9835*fae548d3Szrj 	if (! process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0))
9836*fae548d3Szrj 	  cu_tu_indexes_read = FALSE;
9837*fae548d3Szrj     }
9838*fae548d3Szrj 
9839*fae548d3Szrj   return (bfd_boolean) cu_tu_indexes_read;
9840*fae548d3Szrj }
9841*fae548d3Szrj 
9842*fae548d3Szrj /* Find the set of sections that includes section SHNDX.  */
9843*fae548d3Szrj 
9844*fae548d3Szrj unsigned int *
find_cu_tu_set(void * file,unsigned int shndx)9845*fae548d3Szrj find_cu_tu_set (void *file, unsigned int shndx)
9846*fae548d3Szrj {
9847*fae548d3Szrj   unsigned int i;
9848*fae548d3Szrj 
9849*fae548d3Szrj   if (! load_cu_tu_indexes (file))
9850*fae548d3Szrj     return NULL;
9851*fae548d3Szrj 
9852*fae548d3Szrj   /* Find SHNDX in the shndx pool.  */
9853*fae548d3Szrj   for (i = 0; i < shndx_pool_used; i++)
9854*fae548d3Szrj     if (shndx_pool [i] == shndx)
9855*fae548d3Szrj       break;
9856*fae548d3Szrj 
9857*fae548d3Szrj   if (i >= shndx_pool_used)
9858*fae548d3Szrj     return NULL;
9859*fae548d3Szrj 
9860*fae548d3Szrj   /* Now backup to find the first entry in the set.  */
9861*fae548d3Szrj   while (i > 0 && shndx_pool [i - 1] != 0)
9862*fae548d3Szrj     i--;
9863*fae548d3Szrj 
9864*fae548d3Szrj   return shndx_pool + i;
9865*fae548d3Szrj }
9866*fae548d3Szrj 
9867*fae548d3Szrj /* Display a .debug_cu_index or .debug_tu_index section.  */
9868*fae548d3Szrj 
9869*fae548d3Szrj static int
display_cu_index(struct dwarf_section * section,void * file ATTRIBUTE_UNUSED)9870*fae548d3Szrj display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED)
9871*fae548d3Szrj {
9872*fae548d3Szrj   return process_cu_tu_index (section, 1);
9873*fae548d3Szrj }
9874*fae548d3Szrj 
9875*fae548d3Szrj static int
display_debug_not_supported(struct dwarf_section * section,void * file ATTRIBUTE_UNUSED)9876*fae548d3Szrj display_debug_not_supported (struct dwarf_section *section,
9877*fae548d3Szrj 			     void *file ATTRIBUTE_UNUSED)
9878*fae548d3Szrj {
9879*fae548d3Szrj   printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9880*fae548d3Szrj 	    section->name);
9881*fae548d3Szrj 
9882*fae548d3Szrj   return 1;
9883*fae548d3Szrj }
9884*fae548d3Szrj 
9885*fae548d3Szrj /* Like malloc, but takes two parameters like calloc.
9886*fae548d3Szrj    Verifies that the first parameter is not too large.
9887*fae548d3Szrj    Note: does *not* initialise the allocated memory to zero.  */
9888*fae548d3Szrj 
9889*fae548d3Szrj void *
cmalloc(size_t nmemb,size_t size)9890*fae548d3Szrj cmalloc (size_t nmemb, size_t size)
9891*fae548d3Szrj {
9892*fae548d3Szrj   /* Check for overflow.  */
9893*fae548d3Szrj   if (nmemb >= ~(size_t) 0 / size)
9894*fae548d3Szrj     return NULL;
9895*fae548d3Szrj 
9896*fae548d3Szrj   return xmalloc (nmemb * size);
9897*fae548d3Szrj }
9898*fae548d3Szrj 
9899*fae548d3Szrj /* Like xmalloc, but takes two parameters like calloc.
9900*fae548d3Szrj    Verifies that the first parameter is not too large.
9901*fae548d3Szrj    Note: does *not* initialise the allocated memory to zero.  */
9902*fae548d3Szrj 
9903*fae548d3Szrj void *
xcmalloc(size_t nmemb,size_t size)9904*fae548d3Szrj xcmalloc (size_t nmemb, size_t size)
9905*fae548d3Szrj {
9906*fae548d3Szrj   /* Check for overflow.  */
9907*fae548d3Szrj   if (nmemb >= ~(size_t) 0 / size)
9908*fae548d3Szrj     {
9909*fae548d3Szrj       fprintf (stderr,
9910*fae548d3Szrj 	       _("Attempt to allocate an array with an excessive number of elements: 0x%lx\n"),
9911*fae548d3Szrj 	       (long) nmemb);
9912*fae548d3Szrj       xexit (1);
9913*fae548d3Szrj     }
9914*fae548d3Szrj 
9915*fae548d3Szrj   return xmalloc (nmemb * size);
9916*fae548d3Szrj }
9917*fae548d3Szrj 
9918*fae548d3Szrj /* Like xrealloc, but takes three parameters.
9919*fae548d3Szrj    Verifies that the second parameter is not too large.
9920*fae548d3Szrj    Note: does *not* initialise any new memory to zero.  */
9921*fae548d3Szrj 
9922*fae548d3Szrj void *
xcrealloc(void * ptr,size_t nmemb,size_t size)9923*fae548d3Szrj xcrealloc (void *ptr, size_t nmemb, size_t size)
9924*fae548d3Szrj {
9925*fae548d3Szrj   /* Check for overflow.  */
9926*fae548d3Szrj   if (nmemb >= ~(size_t) 0 / size)
9927*fae548d3Szrj     {
9928*fae548d3Szrj       error (_("Attempt to re-allocate an array with an excessive number of elements: 0x%lx\n"),
9929*fae548d3Szrj 	     (long) nmemb);
9930*fae548d3Szrj       xexit (1);
9931*fae548d3Szrj     }
9932*fae548d3Szrj 
9933*fae548d3Szrj   return xrealloc (ptr, nmemb * size);
9934*fae548d3Szrj }
9935*fae548d3Szrj 
9936*fae548d3Szrj /* Like xcalloc, but verifies that the first parameter is not too large.  */
9937*fae548d3Szrj 
9938*fae548d3Szrj void *
xcalloc2(size_t nmemb,size_t size)9939*fae548d3Szrj xcalloc2 (size_t nmemb, size_t size)
9940*fae548d3Szrj {
9941*fae548d3Szrj   /* Check for overflow.  */
9942*fae548d3Szrj   if (nmemb >= ~(size_t) 0 / size)
9943*fae548d3Szrj     {
9944*fae548d3Szrj       error (_("Attempt to allocate a zero'ed array with an excessive number of elements: 0x%lx\n"),
9945*fae548d3Szrj 	     (long) nmemb);
9946*fae548d3Szrj       xexit (1);
9947*fae548d3Szrj     }
9948*fae548d3Szrj 
9949*fae548d3Szrj   return xcalloc (nmemb, size);
9950*fae548d3Szrj }
9951*fae548d3Szrj 
9952*fae548d3Szrj static unsigned long
calc_gnu_debuglink_crc32(unsigned long crc,const unsigned char * buf,bfd_size_type len)9953*fae548d3Szrj calc_gnu_debuglink_crc32 (unsigned long          crc,
9954*fae548d3Szrj 			  const unsigned char *  buf,
9955*fae548d3Szrj 			  bfd_size_type          len)
9956*fae548d3Szrj {
9957*fae548d3Szrj   static const unsigned long crc32_table[256] =
9958*fae548d3Szrj     {
9959*fae548d3Szrj       0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
9960*fae548d3Szrj       0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
9961*fae548d3Szrj       0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
9962*fae548d3Szrj       0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
9963*fae548d3Szrj       0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
9964*fae548d3Szrj       0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
9965*fae548d3Szrj       0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
9966*fae548d3Szrj       0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
9967*fae548d3Szrj       0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
9968*fae548d3Szrj       0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
9969*fae548d3Szrj       0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
9970*fae548d3Szrj       0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
9971*fae548d3Szrj       0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
9972*fae548d3Szrj       0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
9973*fae548d3Szrj       0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
9974*fae548d3Szrj       0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
9975*fae548d3Szrj       0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
9976*fae548d3Szrj       0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
9977*fae548d3Szrj       0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
9978*fae548d3Szrj       0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
9979*fae548d3Szrj       0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
9980*fae548d3Szrj       0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
9981*fae548d3Szrj       0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
9982*fae548d3Szrj       0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
9983*fae548d3Szrj       0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
9984*fae548d3Szrj       0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
9985*fae548d3Szrj       0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
9986*fae548d3Szrj       0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
9987*fae548d3Szrj       0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
9988*fae548d3Szrj       0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
9989*fae548d3Szrj       0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
9990*fae548d3Szrj       0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
9991*fae548d3Szrj       0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
9992*fae548d3Szrj       0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
9993*fae548d3Szrj       0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
9994*fae548d3Szrj       0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
9995*fae548d3Szrj       0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
9996*fae548d3Szrj       0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
9997*fae548d3Szrj       0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
9998*fae548d3Szrj       0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
9999*fae548d3Szrj       0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
10000*fae548d3Szrj       0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
10001*fae548d3Szrj       0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
10002*fae548d3Szrj       0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
10003*fae548d3Szrj       0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
10004*fae548d3Szrj       0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
10005*fae548d3Szrj       0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
10006*fae548d3Szrj       0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
10007*fae548d3Szrj       0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
10008*fae548d3Szrj       0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
10009*fae548d3Szrj       0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
10010*fae548d3Szrj       0x2d02ef8d
10011*fae548d3Szrj     };
10012*fae548d3Szrj   const unsigned char *end;
10013*fae548d3Szrj 
10014*fae548d3Szrj   crc = ~crc & 0xffffffff;
10015*fae548d3Szrj   for (end = buf + len; buf < end; ++ buf)
10016*fae548d3Szrj     crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
10017*fae548d3Szrj   return ~crc & 0xffffffff;
10018*fae548d3Szrj }
10019*fae548d3Szrj 
10020*fae548d3Szrj typedef bfd_boolean (*   check_func_type) (const char *, void *);
10021*fae548d3Szrj typedef const char * (*  parse_func_type) (struct dwarf_section *, void *);
10022*fae548d3Szrj 
10023*fae548d3Szrj static bfd_boolean
check_gnu_debuglink(const char * pathname,void * crc_pointer)10024*fae548d3Szrj check_gnu_debuglink (const char * pathname, void * crc_pointer)
10025*fae548d3Szrj {
10026*fae548d3Szrj   static unsigned char buffer [8 * 1024];
10027*fae548d3Szrj   FILE *         f;
10028*fae548d3Szrj   bfd_size_type  count;
10029*fae548d3Szrj   unsigned long  crc = 0;
10030*fae548d3Szrj   void *         sep_data;
10031*fae548d3Szrj 
10032*fae548d3Szrj   sep_data = open_debug_file (pathname);
10033*fae548d3Szrj   if (sep_data == NULL)
10034*fae548d3Szrj     return FALSE;
10035*fae548d3Szrj 
10036*fae548d3Szrj   /* Yes - we are opening the file twice...  */
10037*fae548d3Szrj   f = fopen (pathname, "rb");
10038*fae548d3Szrj   if (f == NULL)
10039*fae548d3Szrj     {
10040*fae548d3Szrj       /* Paranoia: This should never happen.  */
10041*fae548d3Szrj       close_debug_file (sep_data);
10042*fae548d3Szrj       warn (_("Unable to reopen separate debug info file: %s\n"), pathname);
10043*fae548d3Szrj       return FALSE;
10044*fae548d3Szrj     }
10045*fae548d3Szrj 
10046*fae548d3Szrj   while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0)
10047*fae548d3Szrj     crc = calc_gnu_debuglink_crc32 (crc, buffer, count);
10048*fae548d3Szrj 
10049*fae548d3Szrj   fclose (f);
10050*fae548d3Szrj 
10051*fae548d3Szrj   if (crc != * (unsigned long *) crc_pointer)
10052*fae548d3Szrj     {
10053*fae548d3Szrj       close_debug_file (sep_data);
10054*fae548d3Szrj       warn (_("Separate debug info file %s found, but CRC does not match - ignoring\n"),
10055*fae548d3Szrj 	    pathname);
10056*fae548d3Szrj       return FALSE;
10057*fae548d3Szrj     }
10058*fae548d3Szrj 
10059*fae548d3Szrj   return TRUE;
10060*fae548d3Szrj }
10061*fae548d3Szrj 
10062*fae548d3Szrj static const char *
parse_gnu_debuglink(struct dwarf_section * section,void * data)10063*fae548d3Szrj parse_gnu_debuglink (struct dwarf_section * section, void * data)
10064*fae548d3Szrj {
10065*fae548d3Szrj   const char *     name;
10066*fae548d3Szrj   unsigned int     crc_offset;
10067*fae548d3Szrj   unsigned long *  crc32 = (unsigned long *) data;
10068*fae548d3Szrj 
10069*fae548d3Szrj   /* The name is first.
10070*fae548d3Szrj      The CRC value is stored after the filename, aligned up to 4 bytes.  */
10071*fae548d3Szrj   name = (const char *) section->start;
10072*fae548d3Szrj 
10073*fae548d3Szrj 
10074*fae548d3Szrj   crc_offset = strnlen (name, section->size) + 1;
10075*fae548d3Szrj   crc_offset = (crc_offset + 3) & ~3;
10076*fae548d3Szrj   if (crc_offset + 4 > section->size)
10077*fae548d3Szrj     return NULL;
10078*fae548d3Szrj 
10079*fae548d3Szrj   * crc32 = byte_get (section->start + crc_offset, 4);
10080*fae548d3Szrj   return name;
10081*fae548d3Szrj }
10082*fae548d3Szrj 
10083*fae548d3Szrj static bfd_boolean
check_gnu_debugaltlink(const char * filename,void * data ATTRIBUTE_UNUSED)10084*fae548d3Szrj check_gnu_debugaltlink (const char * filename, void * data ATTRIBUTE_UNUSED)
10085*fae548d3Szrj {
10086*fae548d3Szrj   void * sep_data = open_debug_file (filename);
10087*fae548d3Szrj 
10088*fae548d3Szrj   if (sep_data == NULL)
10089*fae548d3Szrj     return FALSE;
10090*fae548d3Szrj 
10091*fae548d3Szrj   /* FIXME: We should now extract the build-id in the separate file
10092*fae548d3Szrj      and check it...  */
10093*fae548d3Szrj 
10094*fae548d3Szrj   return TRUE;
10095*fae548d3Szrj }
10096*fae548d3Szrj 
10097*fae548d3Szrj typedef struct build_id_data
10098*fae548d3Szrj {
10099*fae548d3Szrj   bfd_size_type          len;
10100*fae548d3Szrj   const unsigned char *  data;
10101*fae548d3Szrj } Build_id_data;
10102*fae548d3Szrj 
10103*fae548d3Szrj static const char *
parse_gnu_debugaltlink(struct dwarf_section * section,void * data)10104*fae548d3Szrj parse_gnu_debugaltlink (struct dwarf_section * section, void * data)
10105*fae548d3Szrj {
10106*fae548d3Szrj   const char *     name;
10107*fae548d3Szrj   bfd_size_type    namelen;
10108*fae548d3Szrj   bfd_size_type    id_len;
10109*fae548d3Szrj   Build_id_data *  build_id_data;
10110*fae548d3Szrj 
10111*fae548d3Szrj   /* The name is first.
10112*fae548d3Szrj      The build-id follows immediately, with no padding, up to the section's end.  */
10113*fae548d3Szrj 
10114*fae548d3Szrj   name = (const char *) section->start;
10115*fae548d3Szrj   namelen = strnlen (name, section->size) + 1;
10116*fae548d3Szrj   if (namelen >= section->size)
10117*fae548d3Szrj     return NULL;
10118*fae548d3Szrj 
10119*fae548d3Szrj   id_len = section->size - namelen;
10120*fae548d3Szrj   if (id_len < 0x14)
10121*fae548d3Szrj     return NULL;
10122*fae548d3Szrj 
10123*fae548d3Szrj   build_id_data = calloc (1, sizeof * build_id_data);
10124*fae548d3Szrj   if (build_id_data == NULL)
10125*fae548d3Szrj     return NULL;
10126*fae548d3Szrj 
10127*fae548d3Szrj   build_id_data->len = id_len;
10128*fae548d3Szrj   build_id_data->data = section->start + namelen;
10129*fae548d3Szrj 
10130*fae548d3Szrj   * (Build_id_data **) data = build_id_data;
10131*fae548d3Szrj 
10132*fae548d3Szrj   return name;
10133*fae548d3Szrj }
10134*fae548d3Szrj 
10135*fae548d3Szrj static void
add_separate_debug_file(const char * filename,void * handle)10136*fae548d3Szrj add_separate_debug_file (const char * filename, void * handle)
10137*fae548d3Szrj {
10138*fae548d3Szrj   separate_info * i = xmalloc (sizeof * i);
10139*fae548d3Szrj 
10140*fae548d3Szrj   i->filename = filename;
10141*fae548d3Szrj   i->handle   = handle;
10142*fae548d3Szrj   i->next     = first_separate_info;
10143*fae548d3Szrj   first_separate_info = i;
10144*fae548d3Szrj }
10145*fae548d3Szrj 
10146*fae548d3Szrj #if HAVE_LIBDEBUGINFOD
10147*fae548d3Szrj /* Query debuginfod servers for the target debuglink or debugaltlink
10148*fae548d3Szrj    file. If successful, store the path of the file in filename and
10149*fae548d3Szrj    return TRUE, otherwise return FALSE.  */
10150*fae548d3Szrj 
10151*fae548d3Szrj static bfd_boolean
debuginfod_fetch_separate_debug_info(struct dwarf_section * section,char ** filename,void * file)10152*fae548d3Szrj debuginfod_fetch_separate_debug_info (struct dwarf_section * section,
10153*fae548d3Szrj                                       char ** filename,
10154*fae548d3Szrj                                       void * file)
10155*fae548d3Szrj {
10156*fae548d3Szrj   size_t build_id_len;
10157*fae548d3Szrj   unsigned char * build_id;
10158*fae548d3Szrj 
10159*fae548d3Szrj   if (strcmp (section->uncompressed_name, ".gnu_debuglink") == 0)
10160*fae548d3Szrj     {
10161*fae548d3Szrj       /* Get the build-id of file.  */
10162*fae548d3Szrj       build_id = get_build_id (file);
10163*fae548d3Szrj       build_id_len = 0;
10164*fae548d3Szrj     }
10165*fae548d3Szrj   else if (strcmp (section->uncompressed_name, ".gnu_debugaltlink") == 0)
10166*fae548d3Szrj     {
10167*fae548d3Szrj       /* Get the build-id of the debugaltlink file.  */
10168*fae548d3Szrj       unsigned int filelen;
10169*fae548d3Szrj 
10170*fae548d3Szrj       filelen = strnlen ((const char *)section->start, section->size);
10171*fae548d3Szrj       if (filelen == section->size)
10172*fae548d3Szrj         /* Corrupt debugaltlink.  */
10173*fae548d3Szrj         return FALSE;
10174*fae548d3Szrj 
10175*fae548d3Szrj       build_id = section->start + filelen + 1;
10176*fae548d3Szrj       build_id_len = section->size - (filelen + 1);
10177*fae548d3Szrj 
10178*fae548d3Szrj       if (build_id_len == 0)
10179*fae548d3Szrj         return FALSE;
10180*fae548d3Szrj     }
10181*fae548d3Szrj   else
10182*fae548d3Szrj     return FALSE;
10183*fae548d3Szrj 
10184*fae548d3Szrj   if (build_id)
10185*fae548d3Szrj     {
10186*fae548d3Szrj       int fd;
10187*fae548d3Szrj       debuginfod_client * client;
10188*fae548d3Szrj 
10189*fae548d3Szrj       client = debuginfod_begin ();
10190*fae548d3Szrj       if (client == NULL)
10191*fae548d3Szrj         return FALSE;
10192*fae548d3Szrj 
10193*fae548d3Szrj       /* Query debuginfod servers for the target file. If found its path
10194*fae548d3Szrj          will be stored in filename.  */
10195*fae548d3Szrj       fd = debuginfod_find_debuginfo (client, build_id, build_id_len, filename);
10196*fae548d3Szrj       debuginfod_end (client);
10197*fae548d3Szrj 
10198*fae548d3Szrj       /* Only free build_id if we allocated space for a hex string
10199*fae548d3Szrj          in get_build_id ().  */
10200*fae548d3Szrj       if (build_id_len == 0)
10201*fae548d3Szrj         free (build_id);
10202*fae548d3Szrj 
10203*fae548d3Szrj       if (fd >= 0)
10204*fae548d3Szrj         {
10205*fae548d3Szrj           /* File successfully retrieved. Close fd since we want to
10206*fae548d3Szrj              use open_debug_file () on filename instead.  */
10207*fae548d3Szrj           close (fd);
10208*fae548d3Szrj           return TRUE;
10209*fae548d3Szrj         }
10210*fae548d3Szrj     }
10211*fae548d3Szrj 
10212*fae548d3Szrj   return FALSE;
10213*fae548d3Szrj }
10214*fae548d3Szrj #endif
10215*fae548d3Szrj 
10216*fae548d3Szrj 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)10217*fae548d3Szrj load_separate_debug_info (const char *            main_filename,
10218*fae548d3Szrj 			  struct dwarf_section *  xlink,
10219*fae548d3Szrj 			  parse_func_type         parse_func,
10220*fae548d3Szrj 			  check_func_type         check_func,
10221*fae548d3Szrj 			  void *                  func_data,
10222*fae548d3Szrj                           void *                  file ATTRIBUTE_UNUSED)
10223*fae548d3Szrj {
10224*fae548d3Szrj   const char *   separate_filename;
10225*fae548d3Szrj   char *         debug_filename;
10226*fae548d3Szrj   char *         canon_dir;
10227*fae548d3Szrj   size_t         canon_dirlen;
10228*fae548d3Szrj   size_t         dirlen;
10229*fae548d3Szrj 
10230*fae548d3Szrj   if ((separate_filename = parse_func (xlink, func_data)) == NULL)
10231*fae548d3Szrj     {
10232*fae548d3Szrj       warn (_("Corrupt debuglink section: %s\n"),
10233*fae548d3Szrj 	    xlink->name ? xlink->name : xlink->uncompressed_name);
10234*fae548d3Szrj       return FALSE;
10235*fae548d3Szrj     }
10236*fae548d3Szrj 
10237*fae548d3Szrj   /* Attempt to locate the separate file.
10238*fae548d3Szrj      This should duplicate the logic in bfd/opncls.c:find_separate_debug_file().  */
10239*fae548d3Szrj 
10240*fae548d3Szrj   canon_dir = lrealpath (main_filename);
10241*fae548d3Szrj 
10242*fae548d3Szrj   for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
10243*fae548d3Szrj     if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
10244*fae548d3Szrj       break;
10245*fae548d3Szrj   canon_dir[canon_dirlen] = '\0';
10246*fae548d3Szrj 
10247*fae548d3Szrj #ifndef DEBUGDIR
10248*fae548d3Szrj #define DEBUGDIR "/lib/debug"
10249*fae548d3Szrj #endif
10250*fae548d3Szrj #ifndef EXTRA_DEBUG_ROOT1
10251*fae548d3Szrj #define EXTRA_DEBUG_ROOT1 "/usr/lib/debug"
10252*fae548d3Szrj #endif
10253*fae548d3Szrj #ifndef EXTRA_DEBUG_ROOT2
10254*fae548d3Szrj #define EXTRA_DEBUG_ROOT2 "/usr/lib/debug/usr"
10255*fae548d3Szrj #endif
10256*fae548d3Szrj 
10257*fae548d3Szrj   debug_filename = (char *) malloc (strlen (DEBUGDIR) + 1
10258*fae548d3Szrj 				    + canon_dirlen
10259*fae548d3Szrj 				    + strlen (".debug/")
10260*fae548d3Szrj #ifdef EXTRA_DEBUG_ROOT1
10261*fae548d3Szrj 				    + strlen (EXTRA_DEBUG_ROOT1)
10262*fae548d3Szrj #endif
10263*fae548d3Szrj #ifdef EXTRA_DEBUG_ROOT2
10264*fae548d3Szrj 				    + strlen (EXTRA_DEBUG_ROOT2)
10265*fae548d3Szrj #endif
10266*fae548d3Szrj 				    + strlen (separate_filename)
10267*fae548d3Szrj 				    + 1);
10268*fae548d3Szrj   if (debug_filename == NULL)
10269*fae548d3Szrj     {
10270*fae548d3Szrj       warn (_("Out of memory"));
10271*fae548d3Szrj       free (canon_dir);
10272*fae548d3Szrj       return NULL;
10273*fae548d3Szrj     }
10274*fae548d3Szrj 
10275*fae548d3Szrj   /* First try in the current directory.  */
10276*fae548d3Szrj   sprintf (debug_filename, "%s", separate_filename);
10277*fae548d3Szrj   if (check_func (debug_filename, func_data))
10278*fae548d3Szrj     goto found;
10279*fae548d3Szrj 
10280*fae548d3Szrj   /* Then try in a subdirectory called .debug.  */
10281*fae548d3Szrj   sprintf (debug_filename, ".debug/%s", separate_filename);
10282*fae548d3Szrj   if (check_func (debug_filename, func_data))
10283*fae548d3Szrj     goto found;
10284*fae548d3Szrj 
10285*fae548d3Szrj   /* Then try in the same directory as the original file.  */
10286*fae548d3Szrj   sprintf (debug_filename, "%s%s", canon_dir, separate_filename);
10287*fae548d3Szrj   if (check_func (debug_filename, func_data))
10288*fae548d3Szrj     goto found;
10289*fae548d3Szrj 
10290*fae548d3Szrj   /* And the .debug subdirectory of that directory.  */
10291*fae548d3Szrj   sprintf (debug_filename, "%s.debug/%s", canon_dir, separate_filename);
10292*fae548d3Szrj   if (check_func (debug_filename, func_data))
10293*fae548d3Szrj     goto found;
10294*fae548d3Szrj 
10295*fae548d3Szrj #ifdef EXTRA_DEBUG_ROOT1
10296*fae548d3Szrj   /* Try the first extra debug file root.  */
10297*fae548d3Szrj   sprintf (debug_filename, "%s/%s", EXTRA_DEBUG_ROOT1, separate_filename);
10298*fae548d3Szrj   if (check_func (debug_filename, func_data))
10299*fae548d3Szrj     goto found;
10300*fae548d3Szrj 
10301*fae548d3Szrj   /* Try the first extra debug file root.  */
10302*fae548d3Szrj   sprintf (debug_filename, "%s/%s/%s", EXTRA_DEBUG_ROOT1, canon_dir, separate_filename);
10303*fae548d3Szrj   if (check_func (debug_filename, func_data))
10304*fae548d3Szrj     goto found;
10305*fae548d3Szrj #endif
10306*fae548d3Szrj 
10307*fae548d3Szrj #ifdef EXTRA_DEBUG_ROOT2
10308*fae548d3Szrj   /* Try the second extra debug file root.  */
10309*fae548d3Szrj   sprintf (debug_filename, "%s/%s", EXTRA_DEBUG_ROOT2, separate_filename);
10310*fae548d3Szrj   if (check_func (debug_filename, func_data))
10311*fae548d3Szrj     goto found;
10312*fae548d3Szrj #endif
10313*fae548d3Szrj 
10314*fae548d3Szrj   /* Then try in the global debug_filename directory.  */
10315*fae548d3Szrj   strcpy (debug_filename, DEBUGDIR);
10316*fae548d3Szrj   dirlen = strlen (DEBUGDIR) - 1;
10317*fae548d3Szrj   if (dirlen > 0 && DEBUGDIR[dirlen] != '/')
10318*fae548d3Szrj     strcat (debug_filename, "/");
10319*fae548d3Szrj   strcat (debug_filename, (const char *) separate_filename);
10320*fae548d3Szrj 
10321*fae548d3Szrj   if (check_func (debug_filename, func_data))
10322*fae548d3Szrj     goto found;
10323*fae548d3Szrj 
10324*fae548d3Szrj #if HAVE_LIBDEBUGINFOD
10325*fae548d3Szrj   {
10326*fae548d3Szrj     char * tmp_filename;
10327*fae548d3Szrj 
10328*fae548d3Szrj     if (debuginfod_fetch_separate_debug_info (xlink,
10329*fae548d3Szrj                                               & tmp_filename,
10330*fae548d3Szrj                                               file))
10331*fae548d3Szrj       {
10332*fae548d3Szrj         /* File successfully downloaded from server, replace
10333*fae548d3Szrj            debug_filename with the file's path.  */
10334*fae548d3Szrj         free (debug_filename);
10335*fae548d3Szrj         debug_filename = tmp_filename;
10336*fae548d3Szrj         goto found;
10337*fae548d3Szrj       }
10338*fae548d3Szrj   }
10339*fae548d3Szrj #endif
10340*fae548d3Szrj 
10341*fae548d3Szrj   /* Failed to find the file.  */
10342*fae548d3Szrj   warn (_("could not find separate debug file '%s'\n"), separate_filename);
10343*fae548d3Szrj   warn (_("tried: %s\n"), debug_filename);
10344*fae548d3Szrj 
10345*fae548d3Szrj #ifdef EXTRA_DEBUG_ROOT2
10346*fae548d3Szrj   sprintf (debug_filename, "%s/%s", EXTRA_DEBUG_ROOT2, separate_filename);
10347*fae548d3Szrj   warn (_("tried: %s\n"), debug_filename);
10348*fae548d3Szrj #endif
10349*fae548d3Szrj 
10350*fae548d3Szrj #ifdef EXTRA_DEBUG_ROOT1
10351*fae548d3Szrj   sprintf (debug_filename, "%s/%s/%s", EXTRA_DEBUG_ROOT1, canon_dir, separate_filename);
10352*fae548d3Szrj   warn (_("tried: %s\n"), debug_filename);
10353*fae548d3Szrj 
10354*fae548d3Szrj   sprintf (debug_filename, "%s/%s", EXTRA_DEBUG_ROOT1, separate_filename);
10355*fae548d3Szrj   warn (_("tried: %s\n"), debug_filename);
10356*fae548d3Szrj #endif
10357*fae548d3Szrj 
10358*fae548d3Szrj   sprintf (debug_filename, "%s.debug/%s", canon_dir, separate_filename);
10359*fae548d3Szrj   warn (_("tried: %s\n"), debug_filename);
10360*fae548d3Szrj 
10361*fae548d3Szrj   sprintf (debug_filename, "%s%s", canon_dir, separate_filename);
10362*fae548d3Szrj   warn (_("tried: %s\n"), debug_filename);
10363*fae548d3Szrj 
10364*fae548d3Szrj   sprintf (debug_filename, ".debug/%s", separate_filename);
10365*fae548d3Szrj   warn (_("tried: %s\n"), debug_filename);
10366*fae548d3Szrj 
10367*fae548d3Szrj   sprintf (debug_filename, "%s", separate_filename);
10368*fae548d3Szrj   warn (_("tried: %s\n"), debug_filename);
10369*fae548d3Szrj 
10370*fae548d3Szrj #if HAVE_LIBDEBUGINFOD
10371*fae548d3Szrj   {
10372*fae548d3Szrj     char *urls = getenv (DEBUGINFOD_URLS_ENV_VAR);
10373*fae548d3Szrj     if (urls == NULL)
10374*fae548d3Szrj       urls = "";
10375*fae548d3Szrj 
10376*fae548d3Szrj     warn (_("tried: DEBUGINFOD_URLS=%s\n"), urls);
10377*fae548d3Szrj   }
10378*fae548d3Szrj #endif
10379*fae548d3Szrj 
10380*fae548d3Szrj   free (canon_dir);
10381*fae548d3Szrj   free (debug_filename);
10382*fae548d3Szrj   return NULL;
10383*fae548d3Szrj 
10384*fae548d3Szrj  found:
10385*fae548d3Szrj   free (canon_dir);
10386*fae548d3Szrj 
10387*fae548d3Szrj   void * debug_handle;
10388*fae548d3Szrj 
10389*fae548d3Szrj   /* Now open the file.... */
10390*fae548d3Szrj   if ((debug_handle = open_debug_file (debug_filename)) == NULL)
10391*fae548d3Szrj     {
10392*fae548d3Szrj       warn (_("failed to open separate debug file: %s\n"), debug_filename);
10393*fae548d3Szrj       free (debug_filename);
10394*fae548d3Szrj       return FALSE;
10395*fae548d3Szrj     }
10396*fae548d3Szrj 
10397*fae548d3Szrj   /* FIXME: We do not check to see if there are any other separate debug info
10398*fae548d3Szrj      files that would also match.  */
10399*fae548d3Szrj 
10400*fae548d3Szrj   printf (_("%s: Found separate debug info file: %s\n\n"), main_filename, debug_filename);
10401*fae548d3Szrj   add_separate_debug_file (debug_filename, debug_handle);
10402*fae548d3Szrj 
10403*fae548d3Szrj   /* Do not free debug_filename - it might be referenced inside
10404*fae548d3Szrj      the structure returned by open_debug_file().  */
10405*fae548d3Szrj   return debug_handle;
10406*fae548d3Szrj }
10407*fae548d3Szrj 
10408*fae548d3Szrj /* Attempt to load a separate dwarf object file.  */
10409*fae548d3Szrj 
10410*fae548d3Szrj static void *
load_dwo_file(const char * main_filename,const char * name,const char * dir,const char * id ATTRIBUTE_UNUSED)10411*fae548d3Szrj load_dwo_file (const char * main_filename, const char * name, const char * dir, const char * id ATTRIBUTE_UNUSED)
10412*fae548d3Szrj {
10413*fae548d3Szrj   char * separate_filename;
10414*fae548d3Szrj   void * separate_handle;
10415*fae548d3Szrj 
10416*fae548d3Szrj   /* FIXME: Skip adding / if dwo_dir ends in /.  */
10417*fae548d3Szrj   separate_filename = concat (dir, "/", name, NULL);
10418*fae548d3Szrj   if (separate_filename == NULL)
10419*fae548d3Szrj     {
10420*fae548d3Szrj       warn (_("Out of memory allocating dwo filename\n"));
10421*fae548d3Szrj       return NULL;
10422*fae548d3Szrj     }
10423*fae548d3Szrj 
10424*fae548d3Szrj   if ((separate_handle = open_debug_file (separate_filename)) == NULL)
10425*fae548d3Szrj     {
10426*fae548d3Szrj       warn (_("Unable to load dwo file: %s\n"), separate_filename);
10427*fae548d3Szrj       free (separate_filename);
10428*fae548d3Szrj       return NULL;
10429*fae548d3Szrj     }
10430*fae548d3Szrj 
10431*fae548d3Szrj   /* FIXME: We should check the dwo_id.  */
10432*fae548d3Szrj 
10433*fae548d3Szrj   printf (_("%s: Found separate debug object file: %s\n\n"), main_filename, separate_filename);
10434*fae548d3Szrj   add_separate_debug_file (separate_filename, separate_handle);
10435*fae548d3Szrj   /* Note - separate_filename will be freed in free_debug_memory().  */
10436*fae548d3Szrj   return separate_handle;
10437*fae548d3Szrj }
10438*fae548d3Szrj 
10439*fae548d3Szrj /* Load the separate debug info file(s) attached to FILE, if any exist.
10440*fae548d3Szrj    Returns TRUE if any were found, FALSE otherwise.
10441*fae548d3Szrj    If TRUE is returned then the linked list starting at first_separate_info
10442*fae548d3Szrj    will be populated with open file handles.  */
10443*fae548d3Szrj 
10444*fae548d3Szrj bfd_boolean
load_separate_debug_files(void * file,const char * filename)10445*fae548d3Szrj load_separate_debug_files (void * file, const char * filename)
10446*fae548d3Szrj {
10447*fae548d3Szrj   /* Skip this operation if we are not interested in debug links.  */
10448*fae548d3Szrj   if (! do_follow_links && ! do_debug_links)
10449*fae548d3Szrj     return FALSE;
10450*fae548d3Szrj 
10451*fae548d3Szrj   /* See if there are any dwo links.  */
10452*fae548d3Szrj   if (load_debug_section (str, file)
10453*fae548d3Szrj       && load_debug_section (abbrev, file)
10454*fae548d3Szrj       && load_debug_section (info, file))
10455*fae548d3Szrj     {
10456*fae548d3Szrj       free_dwo_info ();
10457*fae548d3Szrj 
10458*fae548d3Szrj       if (process_debug_info (& debug_displays[info].section, file, abbrev, TRUE, FALSE))
10459*fae548d3Szrj 	{
10460*fae548d3Szrj 	  bfd_boolean introduced = FALSE;
10461*fae548d3Szrj 	  dwo_info *   dwinfo;
10462*fae548d3Szrj 	  const char * dir = NULL;
10463*fae548d3Szrj 	  const char * id = NULL;
10464*fae548d3Szrj 
10465*fae548d3Szrj 	  for (dwinfo = first_dwo_info; dwinfo != NULL; dwinfo = dwinfo->next)
10466*fae548d3Szrj 	    {
10467*fae548d3Szrj 	      switch (dwinfo->type)
10468*fae548d3Szrj 		{
10469*fae548d3Szrj 		case DWO_NAME:
10470*fae548d3Szrj 		  if (do_debug_links)
10471*fae548d3Szrj 		    {
10472*fae548d3Szrj 		      if (! introduced)
10473*fae548d3Szrj 			{
10474*fae548d3Szrj 			  printf (_("The %s section contains link(s) to dwo file(s):\n\n"),
10475*fae548d3Szrj 				  debug_displays [info].section.uncompressed_name);
10476*fae548d3Szrj 			  introduced = TRUE;
10477*fae548d3Szrj 			}
10478*fae548d3Szrj 
10479*fae548d3Szrj 		      printf (_("  Name:      %s\n"), dwinfo->value);
10480*fae548d3Szrj 		      printf (_("  Directory: %s\n"), dir ? dir : _("<not-found>"));
10481*fae548d3Szrj 		      if (id != NULL)
10482*fae548d3Szrj 			display_data (printf (_("  ID:       ")), (unsigned char *) id, 8);
10483*fae548d3Szrj 		      else
10484*fae548d3Szrj 			printf (_("  ID: <unknown>\n"));
10485*fae548d3Szrj 		      printf ("\n\n");
10486*fae548d3Szrj 		    }
10487*fae548d3Szrj 
10488*fae548d3Szrj 		  if (do_follow_links)
10489*fae548d3Szrj 		    load_dwo_file (filename, dwinfo->value, dir, id);
10490*fae548d3Szrj 		  break;
10491*fae548d3Szrj 
10492*fae548d3Szrj 		case DWO_DIR:
10493*fae548d3Szrj 		  dir = dwinfo->value;
10494*fae548d3Szrj 		  break;
10495*fae548d3Szrj 
10496*fae548d3Szrj 		case DWO_ID:
10497*fae548d3Szrj 		  id = dwinfo->value;
10498*fae548d3Szrj 		  break;
10499*fae548d3Szrj 
10500*fae548d3Szrj 		default:
10501*fae548d3Szrj 		  error (_("Unexpected DWO INFO type"));
10502*fae548d3Szrj 		  break;
10503*fae548d3Szrj 		}
10504*fae548d3Szrj 	    }
10505*fae548d3Szrj 	}
10506*fae548d3Szrj     }
10507*fae548d3Szrj 
10508*fae548d3Szrj   if (! do_follow_links)
10509*fae548d3Szrj     /* The other debug links will be displayed by display_debug_links()
10510*fae548d3Szrj        so we do not need to do any further processing here.  */
10511*fae548d3Szrj     return FALSE;
10512*fae548d3Szrj 
10513*fae548d3Szrj   /* FIXME: We do not check for the presence of both link sections in the same file.  */
10514*fae548d3Szrj   /* FIXME: We do not check the separate debug info file to see if it too contains debuglinks.  */
10515*fae548d3Szrj   /* FIXME: We do not check for the presence of multiple, same-name debuglink sections.  */
10516*fae548d3Szrj   /* FIXME: We do not check for the presence of a dwo link as well as a debuglink.  */
10517*fae548d3Szrj 
10518*fae548d3Szrj   if (load_debug_section (gnu_debugaltlink, file))
10519*fae548d3Szrj     {
10520*fae548d3Szrj       Build_id_data * build_id_data;
10521*fae548d3Szrj 
10522*fae548d3Szrj       load_separate_debug_info (filename,
10523*fae548d3Szrj 				& debug_displays[gnu_debugaltlink].section,
10524*fae548d3Szrj 				parse_gnu_debugaltlink,
10525*fae548d3Szrj 				check_gnu_debugaltlink,
10526*fae548d3Szrj 				& build_id_data,
10527*fae548d3Szrj 				file);
10528*fae548d3Szrj     }
10529*fae548d3Szrj 
10530*fae548d3Szrj   if (load_debug_section (gnu_debuglink, file))
10531*fae548d3Szrj     {
10532*fae548d3Szrj       unsigned long crc32;
10533*fae548d3Szrj 
10534*fae548d3Szrj       load_separate_debug_info (filename,
10535*fae548d3Szrj 				& debug_displays[gnu_debuglink].section,
10536*fae548d3Szrj 				parse_gnu_debuglink,
10537*fae548d3Szrj 				check_gnu_debuglink,
10538*fae548d3Szrj 				& crc32,
10539*fae548d3Szrj 				file);
10540*fae548d3Szrj     }
10541*fae548d3Szrj 
10542*fae548d3Szrj   if (first_separate_info != NULL)
10543*fae548d3Szrj     return TRUE;
10544*fae548d3Szrj 
10545*fae548d3Szrj   do_follow_links = 0;
10546*fae548d3Szrj   return FALSE;
10547*fae548d3Szrj }
10548*fae548d3Szrj 
10549*fae548d3Szrj void
free_debug_memory(void)10550*fae548d3Szrj free_debug_memory (void)
10551*fae548d3Szrj {
10552*fae548d3Szrj   unsigned int i;
10553*fae548d3Szrj 
10554*fae548d3Szrj   free_abbrevs ();
10555*fae548d3Szrj 
10556*fae548d3Szrj   for (i = 0; i < max; i++)
10557*fae548d3Szrj     free_debug_section ((enum dwarf_section_display_enum) i);
10558*fae548d3Szrj 
10559*fae548d3Szrj   if (debug_information != NULL)
10560*fae548d3Szrj     {
10561*fae548d3Szrj       if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
10562*fae548d3Szrj 	{
10563*fae548d3Szrj 	  for (i = 0; i < num_debug_info_entries; i++)
10564*fae548d3Szrj 	    {
10565*fae548d3Szrj 	      if (!debug_information [i].max_loc_offsets)
10566*fae548d3Szrj 		{
10567*fae548d3Szrj 		  free (debug_information [i].loc_offsets);
10568*fae548d3Szrj 		  free (debug_information [i].have_frame_base);
10569*fae548d3Szrj 		}
10570*fae548d3Szrj 	      if (!debug_information [i].max_range_lists)
10571*fae548d3Szrj 		free (debug_information [i].range_lists);
10572*fae548d3Szrj 	    }
10573*fae548d3Szrj 	}
10574*fae548d3Szrj       free (debug_information);
10575*fae548d3Szrj       debug_information = NULL;
10576*fae548d3Szrj       alloc_num_debug_info_entries = num_debug_info_entries = 0;
10577*fae548d3Szrj     }
10578*fae548d3Szrj 
10579*fae548d3Szrj   separate_info * d;
10580*fae548d3Szrj   separate_info * next;
10581*fae548d3Szrj 
10582*fae548d3Szrj   for (d = first_separate_info; d != NULL; d = next)
10583*fae548d3Szrj     {
10584*fae548d3Szrj       close_debug_file (d->handle);
10585*fae548d3Szrj       free ((void *) d->filename);
10586*fae548d3Szrj       next = d->next;
10587*fae548d3Szrj       free ((void *) d);
10588*fae548d3Szrj     }
10589*fae548d3Szrj   first_separate_info = NULL;
10590*fae548d3Szrj 
10591*fae548d3Szrj   free_dwo_info ();
10592*fae548d3Szrj }
10593*fae548d3Szrj 
10594*fae548d3Szrj void
dwarf_select_sections_by_names(const char * names)10595*fae548d3Szrj dwarf_select_sections_by_names (const char *names)
10596*fae548d3Szrj {
10597*fae548d3Szrj   typedef struct
10598*fae548d3Szrj   {
10599*fae548d3Szrj     const char * option;
10600*fae548d3Szrj     int *        variable;
10601*fae548d3Szrj     int          val;
10602*fae548d3Szrj   }
10603*fae548d3Szrj   debug_dump_long_opts;
10604*fae548d3Szrj 
10605*fae548d3Szrj   static const debug_dump_long_opts opts_table [] =
10606*fae548d3Szrj     {
10607*fae548d3Szrj       /* Please keep this table alpha- sorted.  */
10608*fae548d3Szrj       { "Ranges", & do_debug_ranges, 1 },
10609*fae548d3Szrj       { "abbrev", & do_debug_abbrevs, 1 },
10610*fae548d3Szrj       { "addr", & do_debug_addr, 1 },
10611*fae548d3Szrj       { "aranges", & do_debug_aranges, 1 },
10612*fae548d3Szrj       { "cu_index", & do_debug_cu_index, 1 },
10613*fae548d3Szrj       { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
10614*fae548d3Szrj       { "follow-links", & do_follow_links, 1 },
10615*fae548d3Szrj       { "frames", & do_debug_frames, 1 },
10616*fae548d3Szrj       { "frames-interp", & do_debug_frames_interp, 1 },
10617*fae548d3Szrj       /* The special .gdb_index section.  */
10618*fae548d3Szrj       { "gdb_index", & do_gdb_index, 1 },
10619*fae548d3Szrj       { "info", & do_debug_info, 1 },
10620*fae548d3Szrj       { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility.  */
10621*fae548d3Szrj       { "links", & do_debug_links, 1 },
10622*fae548d3Szrj       { "loc",  & do_debug_loc, 1 },
10623*fae548d3Szrj       { "macro", & do_debug_macinfo, 1 },
10624*fae548d3Szrj       { "pubnames", & do_debug_pubnames, 1 },
10625*fae548d3Szrj       { "pubtypes", & do_debug_pubtypes, 1 },
10626*fae548d3Szrj       /* This entry is for compatibility
10627*fae548d3Szrj 	 with earlier versions of readelf.  */
10628*fae548d3Szrj       { "ranges", & do_debug_aranges, 1 },
10629*fae548d3Szrj       { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
10630*fae548d3Szrj       { "str", & do_debug_str, 1 },
10631*fae548d3Szrj       /* These trace_* sections are used by Itanium VMS.  */
10632*fae548d3Szrj       { "trace_abbrev", & do_trace_abbrevs, 1 },
10633*fae548d3Szrj       { "trace_aranges", & do_trace_aranges, 1 },
10634*fae548d3Szrj       { "trace_info", & do_trace_info, 1 },
10635*fae548d3Szrj       { NULL, NULL, 0 }
10636*fae548d3Szrj     };
10637*fae548d3Szrj 
10638*fae548d3Szrj   const char *p;
10639*fae548d3Szrj 
10640*fae548d3Szrj   p = names;
10641*fae548d3Szrj   while (*p)
10642*fae548d3Szrj     {
10643*fae548d3Szrj       const debug_dump_long_opts * entry;
10644*fae548d3Szrj 
10645*fae548d3Szrj       for (entry = opts_table; entry->option; entry++)
10646*fae548d3Szrj 	{
10647*fae548d3Szrj 	  size_t len = strlen (entry->option);
10648*fae548d3Szrj 
10649*fae548d3Szrj 	  if (strncmp (p, entry->option, len) == 0
10650*fae548d3Szrj 	      && (p[len] == ',' || p[len] == '\0'))
10651*fae548d3Szrj 	    {
10652*fae548d3Szrj 	      * entry->variable |= entry->val;
10653*fae548d3Szrj 
10654*fae548d3Szrj 	      /* The --debug-dump=frames-interp option also
10655*fae548d3Szrj 		 enables the --debug-dump=frames option.  */
10656*fae548d3Szrj 	      if (do_debug_frames_interp)
10657*fae548d3Szrj 		do_debug_frames = 1;
10658*fae548d3Szrj 
10659*fae548d3Szrj 	      p += len;
10660*fae548d3Szrj 	      break;
10661*fae548d3Szrj 	    }
10662*fae548d3Szrj 	}
10663*fae548d3Szrj 
10664*fae548d3Szrj       if (entry->option == NULL)
10665*fae548d3Szrj 	{
10666*fae548d3Szrj 	  warn (_("Unrecognized debug option '%s'\n"), p);
10667*fae548d3Szrj 	  p = strchr (p, ',');
10668*fae548d3Szrj 	  if (p == NULL)
10669*fae548d3Szrj 	    break;
10670*fae548d3Szrj 	}
10671*fae548d3Szrj 
10672*fae548d3Szrj       if (*p == ',')
10673*fae548d3Szrj 	p++;
10674*fae548d3Szrj     }
10675*fae548d3Szrj }
10676*fae548d3Szrj 
10677*fae548d3Szrj void
dwarf_select_sections_by_letters(const char * letters)10678*fae548d3Szrj dwarf_select_sections_by_letters (const char *letters)
10679*fae548d3Szrj {
10680*fae548d3Szrj   unsigned int lindex = 0;
10681*fae548d3Szrj 
10682*fae548d3Szrj   while (letters[lindex])
10683*fae548d3Szrj     switch (letters[lindex++])
10684*fae548d3Szrj       {
10685*fae548d3Szrj       case 'A':	do_debug_addr = 1; break;
10686*fae548d3Szrj       case 'a':	do_debug_abbrevs = 1; break;
10687*fae548d3Szrj       case 'c':	do_debug_cu_index = 1; break;
10688*fae548d3Szrj       case 'F':	do_debug_frames_interp = 1; /* Fall through.  */
10689*fae548d3Szrj       case 'f':	do_debug_frames = 1; break;
10690*fae548d3Szrj       case 'g':	do_gdb_index = 1; break;
10691*fae548d3Szrj       case 'i':	do_debug_info = 1; break;
10692*fae548d3Szrj       case 'K': do_follow_links = 1; break;
10693*fae548d3Szrj       case 'k':	do_debug_links = 1; break;
10694*fae548d3Szrj       case 'l':	do_debug_lines |= FLAG_DEBUG_LINES_RAW;	break;
10695*fae548d3Szrj       case 'L':	do_debug_lines |= FLAG_DEBUG_LINES_DECODED; break;
10696*fae548d3Szrj       case 'm': do_debug_macinfo = 1; break;
10697*fae548d3Szrj       case 'o':	do_debug_loc = 1; break;
10698*fae548d3Szrj       case 'p':	do_debug_pubnames = 1; break;
10699*fae548d3Szrj       case 'R':	do_debug_ranges = 1; break;
10700*fae548d3Szrj       case 'r':	do_debug_aranges = 1; break;
10701*fae548d3Szrj       case 's':	do_debug_str = 1; break;
10702*fae548d3Szrj       case 'T': do_trace_aranges = 1; break;
10703*fae548d3Szrj       case 't': do_debug_pubtypes = 1; break;
10704*fae548d3Szrj       case 'U': do_trace_info = 1; break;
10705*fae548d3Szrj       case 'u': do_trace_abbrevs = 1; break;
10706*fae548d3Szrj 
10707*fae548d3Szrj       default:
10708*fae548d3Szrj 	warn (_("Unrecognized debug option '%s'\n"), letters);
10709*fae548d3Szrj 	break;
10710*fae548d3Szrj       }
10711*fae548d3Szrj }
10712*fae548d3Szrj 
10713*fae548d3Szrj void
dwarf_select_sections_all(void)10714*fae548d3Szrj dwarf_select_sections_all (void)
10715*fae548d3Szrj {
10716*fae548d3Szrj   do_debug_info = 1;
10717*fae548d3Szrj   do_debug_abbrevs = 1;
10718*fae548d3Szrj   do_debug_lines = FLAG_DEBUG_LINES_RAW;
10719*fae548d3Szrj   do_debug_pubnames = 1;
10720*fae548d3Szrj   do_debug_pubtypes = 1;
10721*fae548d3Szrj   do_debug_aranges = 1;
10722*fae548d3Szrj   do_debug_ranges = 1;
10723*fae548d3Szrj   do_debug_frames = 1;
10724*fae548d3Szrj   do_debug_macinfo = 1;
10725*fae548d3Szrj   do_debug_str = 1;
10726*fae548d3Szrj   do_debug_loc = 1;
10727*fae548d3Szrj   do_gdb_index = 1;
10728*fae548d3Szrj   do_trace_info = 1;
10729*fae548d3Szrj   do_trace_abbrevs = 1;
10730*fae548d3Szrj   do_trace_aranges = 1;
10731*fae548d3Szrj   do_debug_addr = 1;
10732*fae548d3Szrj   do_debug_cu_index = 1;
10733*fae548d3Szrj   do_follow_links = 1;
10734*fae548d3Szrj   do_debug_links = 1;
10735*fae548d3Szrj }
10736*fae548d3Szrj 
10737*fae548d3Szrj #define NO_ABBREVS   NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL
10738*fae548d3Szrj #define ABBREV(N)    NULL, NULL, NULL, 0, 0, N, NULL, 0, NULL
10739*fae548d3Szrj 
10740*fae548d3Szrj /* N.B. The order here must match the order in section_display_enum.  */
10741*fae548d3Szrj 
10742*fae548d3Szrj struct dwarf_section_display debug_displays[] =
10743*fae548d3Szrj {
10744*fae548d3Szrj   { { ".debug_abbrev",	    ".zdebug_abbrev",	NO_ABBREVS },      display_debug_abbrev,   &do_debug_abbrevs,	FALSE },
10745*fae548d3Szrj   { { ".debug_aranges",	    ".zdebug_aranges",	NO_ABBREVS },      display_debug_aranges,  &do_debug_aranges,	TRUE },
10746*fae548d3Szrj   { { ".debug_frame",       ".zdebug_frame",	NO_ABBREVS },      display_debug_frames,   &do_debug_frames,	TRUE },
10747*fae548d3Szrj   { { ".debug_info",	    ".zdebug_info",	ABBREV (abbrev)},  display_debug_info,	   &do_debug_info,	TRUE },
10748*fae548d3Szrj   { { ".debug_line",	    ".zdebug_line",	NO_ABBREVS },      display_debug_lines,    &do_debug_lines,	TRUE },
10749*fae548d3Szrj   { { ".debug_pubnames",    ".zdebug_pubnames",	NO_ABBREVS },      display_debug_pubnames, &do_debug_pubnames,	FALSE },
10750*fae548d3Szrj   { { ".debug_gnu_pubnames", ".zdebug_gnu_pubnames", NO_ABBREVS }, display_debug_gnu_pubnames, &do_debug_pubnames, FALSE },
10751*fae548d3Szrj   { { ".eh_frame",	    "",			NO_ABBREVS },      display_debug_frames,   &do_debug_frames,	TRUE },
10752*fae548d3Szrj   { { ".debug_macinfo",	    ".zdebug_macinfo",	NO_ABBREVS },      display_debug_macinfo,  &do_debug_macinfo,	FALSE },
10753*fae548d3Szrj   { { ".debug_macro",	    ".zdebug_macro",	NO_ABBREVS },      display_debug_macro,    &do_debug_macinfo,	TRUE },
10754*fae548d3Szrj   { { ".debug_str",	    ".zdebug_str",	NO_ABBREVS },      display_debug_str,	   &do_debug_str,	FALSE },
10755*fae548d3Szrj   { { ".debug_line_str",    ".zdebug_line_str",	NO_ABBREVS },      display_debug_str,	   &do_debug_str,	FALSE },
10756*fae548d3Szrj   { { ".debug_loc",	    ".zdebug_loc",	NO_ABBREVS },      display_debug_loc,	   &do_debug_loc,	TRUE },
10757*fae548d3Szrj   { { ".debug_loclists",    ".zdebug_loclists",	NO_ABBREVS },      display_debug_loc,	   &do_debug_loc,	TRUE },
10758*fae548d3Szrj   { { ".debug_pubtypes",    ".zdebug_pubtypes",	NO_ABBREVS },      display_debug_pubnames, &do_debug_pubtypes,	FALSE },
10759*fae548d3Szrj   { { ".debug_gnu_pubtypes", ".zdebug_gnu_pubtypes", NO_ABBREVS }, display_debug_gnu_pubnames, &do_debug_pubtypes, FALSE },
10760*fae548d3Szrj   { { ".debug_ranges",	    ".zdebug_ranges",	NO_ABBREVS },      display_debug_ranges,   &do_debug_ranges,	TRUE },
10761*fae548d3Szrj   { { ".debug_rnglists",    ".zdebug_rnglists",	NO_ABBREVS },      display_debug_ranges,   &do_debug_ranges,	TRUE },
10762*fae548d3Szrj   { { ".debug_static_func", ".zdebug_static_func", NO_ABBREVS },   display_debug_not_supported, NULL,		FALSE },
10763*fae548d3Szrj   { { ".debug_static_vars", ".zdebug_static_vars", NO_ABBREVS },   display_debug_not_supported, NULL,		FALSE },
10764*fae548d3Szrj   { { ".debug_types",	    ".zdebug_types",	ABBREV (abbrev) }, display_debug_types,    &do_debug_info,	TRUE },
10765*fae548d3Szrj   { { ".debug_weaknames",   ".zdebug_weaknames", NO_ABBREVS },     display_debug_not_supported, NULL,		FALSE },
10766*fae548d3Szrj   { { ".gdb_index",	    "",			NO_ABBREVS },      display_gdb_index,      &do_gdb_index,	FALSE },
10767*fae548d3Szrj   { { ".debug_names",	    "",			NO_ABBREVS },      display_debug_names,    &do_gdb_index,	FALSE },
10768*fae548d3Szrj   { { ".trace_info",	    "",			ABBREV (trace_abbrev) }, display_trace_info, &do_trace_info,	TRUE },
10769*fae548d3Szrj   { { ".trace_abbrev",	    "",			NO_ABBREVS },      display_debug_abbrev,   &do_trace_abbrevs,	FALSE },
10770*fae548d3Szrj   { { ".trace_aranges",	    "",			NO_ABBREVS },      display_debug_aranges,  &do_trace_aranges,	FALSE },
10771*fae548d3Szrj   { { ".debug_info.dwo",    ".zdebug_info.dwo",	ABBREV (abbrev_dwo) }, display_debug_info, &do_debug_info,	TRUE },
10772*fae548d3Szrj   { { ".debug_abbrev.dwo",  ".zdebug_abbrev.dwo", NO_ABBREVS },    display_debug_abbrev,   &do_debug_abbrevs,	FALSE },
10773*fae548d3Szrj   { { ".debug_types.dwo",   ".zdebug_types.dwo", ABBREV (abbrev_dwo) }, display_debug_types, &do_debug_info,	TRUE },
10774*fae548d3Szrj   { { ".debug_line.dwo",    ".zdebug_line.dwo", NO_ABBREVS },      display_debug_lines,    &do_debug_lines,	TRUE },
10775*fae548d3Szrj   { { ".debug_loc.dwo",	    ".zdebug_loc.dwo",	NO_ABBREVS },      display_debug_loc,	   &do_debug_loc,	TRUE },
10776*fae548d3Szrj   { { ".debug_macro.dwo",   ".zdebug_macro.dwo", NO_ABBREVS },     display_debug_macro,    &do_debug_macinfo,	TRUE },
10777*fae548d3Szrj   { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NO_ABBREVS },   display_debug_macinfo,  &do_debug_macinfo,	FALSE },
10778*fae548d3Szrj   { { ".debug_str.dwo",     ".zdebug_str.dwo",  NO_ABBREVS },      display_debug_str,      &do_debug_str,	TRUE },
10779*fae548d3Szrj   { { ".debug_str_offsets", ".zdebug_str_offsets", NO_ABBREVS },   display_debug_str_offsets, NULL,		FALSE },
10780*fae548d3Szrj   { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NO_ABBREVS }, display_debug_str_offsets, NULL,	FALSE },
10781*fae548d3Szrj   { { ".debug_addr",	    ".zdebug_addr",     NO_ABBREVS },      display_debug_addr,     &do_debug_addr,	TRUE },
10782*fae548d3Szrj   { { ".debug_cu_index",    "",			NO_ABBREVS },      display_cu_index,       &do_debug_cu_index,	FALSE },
10783*fae548d3Szrj   { { ".debug_tu_index",    "",			NO_ABBREVS },      display_cu_index,       &do_debug_cu_index,	FALSE },
10784*fae548d3Szrj   { { ".gnu_debuglink",     "",                 NO_ABBREVS },      display_debug_links,    &do_debug_links,     FALSE },
10785*fae548d3Szrj   { { ".gnu_debugaltlink",  "",                 NO_ABBREVS },      display_debug_links,    &do_debug_links,     FALSE },
10786*fae548d3Szrj   /* Separate debug info files can containt their own .debug_str section,
10787*fae548d3Szrj      and this might be in *addition* to a .debug_str section already present
10788*fae548d3Szrj      in the main file.  Hence we need to have two entries for .debug_str.  */
10789*fae548d3Szrj   { { ".debug_str",	    ".zdebug_str",	NO_ABBREVS },      display_debug_str,	   &do_debug_str,	FALSE },
10790*fae548d3Szrj };
10791*fae548d3Szrj 
10792*fae548d3Szrj /* A static assertion.  */
10793*fae548d3Szrj extern int debug_displays_assert[ARRAY_SIZE (debug_displays) == max ? 1 : -1];
10794