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