OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [binutils-2.20.1/] [binutils-2.20.1-or32-1.0rc1/] [binutils/] [dwarf.c] - Blame information for rev 593

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 205 julius
/* dwarf.c -- display DWARF contents of a BFD binary file
2
   Copyright 2005, 2006, 2007, 2008, 2009
3
   Free Software Foundation, Inc.
4
 
5
   This file is part of GNU Binutils.
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
 
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
20
   02110-1301, USA.  */
21
 
22
#include "sysdep.h"
23
#include "libiberty.h"
24
#include "bfd.h"
25
#include "bucomm.h"
26
#include "elf/common.h"
27
#include "dwarf2.h"
28
#include "dwarf.h"
29
 
30
static int have_frame_base;
31
static int need_base_address;
32
 
33
static unsigned int last_pointer_size = 0;
34
static int warned_about_missing_comp_units = FALSE;
35
 
36
static unsigned int num_debug_info_entries = 0;
37
static debug_info *debug_information = NULL;
38
/* Special value for num_debug_info_entries to indicate
39
   that the .debug_info section could not be loaded/parsed.  */
40
#define DEBUG_INFO_UNAVAILABLE  (unsigned int) -1
41
 
42
int eh_addr_size;
43
 
44
int do_debug_info;
45
int do_debug_abbrevs;
46
int do_debug_lines;
47
int do_debug_pubnames;
48
int do_debug_aranges;
49
int do_debug_ranges;
50
int do_debug_frames;
51
int do_debug_frames_interp;
52
int do_debug_macinfo;
53
int do_debug_str;
54
int do_debug_loc;
55
int do_wide;
56
 
57
/* Values for do_debug_lines.  */
58
#define FLAG_DEBUG_LINES_RAW     1
59
#define FLAG_DEBUG_LINES_DECODED 2
60
 
61
dwarf_vma (*byte_get) (unsigned char *, int);
62
 
63
dwarf_vma
64
byte_get_little_endian (unsigned char *field, int size)
65
{
66
  switch (size)
67
    {
68
    case 1:
69
      return *field;
70
 
71
    case 2:
72
      return  ((unsigned int) (field[0]))
73
        |    (((unsigned int) (field[1])) << 8);
74
 
75
    case 3:
76
      return  ((unsigned long) (field[0]))
77
        |    (((unsigned long) (field[1])) << 8)
78
        |    (((unsigned long) (field[2])) << 16);
79
 
80
    case 4:
81
      return  ((unsigned long) (field[0]))
82
        |    (((unsigned long) (field[1])) << 8)
83
        |    (((unsigned long) (field[2])) << 16)
84
        |    (((unsigned long) (field[3])) << 24);
85
 
86
    case 8:
87
      if (sizeof (dwarf_vma) == 8)
88
        return  ((dwarf_vma) (field[0]))
89
          |    (((dwarf_vma) (field[1])) << 8)
90
          |    (((dwarf_vma) (field[2])) << 16)
91
          |    (((dwarf_vma) (field[3])) << 24)
92
          |    (((dwarf_vma) (field[4])) << 32)
93
          |    (((dwarf_vma) (field[5])) << 40)
94
          |    (((dwarf_vma) (field[6])) << 48)
95
          |    (((dwarf_vma) (field[7])) << 56);
96
      else if (sizeof (dwarf_vma) == 4)
97
        /* We want to extract data from an 8 byte wide field and
98
           place it into a 4 byte wide field.  Since this is a little
99
           endian source we can just use the 4 byte extraction code.  */
100
        return  ((unsigned long) (field[0]))
101
          |    (((unsigned long) (field[1])) << 8)
102
          |    (((unsigned long) (field[2])) << 16)
103
          |    (((unsigned long) (field[3])) << 24);
104
 
105
    default:
106
      error (_("Unhandled data length: %d\n"), size);
107
      abort ();
108
    }
109
}
110
 
111
dwarf_vma
112
byte_get_big_endian (unsigned char *field, int size)
113
{
114
  switch (size)
115
    {
116
    case 1:
117
      return *field;
118
 
119
    case 2:
120
      return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
121
 
122
    case 3:
123
      return ((unsigned long) (field[2]))
124
        |   (((unsigned long) (field[1])) << 8)
125
        |   (((unsigned long) (field[0])) << 16);
126
 
127
    case 4:
128
      return ((unsigned long) (field[3]))
129
        |   (((unsigned long) (field[2])) << 8)
130
        |   (((unsigned long) (field[1])) << 16)
131
        |   (((unsigned long) (field[0])) << 24);
132
 
133
    case 8:
134
      if (sizeof (dwarf_vma) == 8)
135
        return ((dwarf_vma) (field[7]))
136
          |   (((dwarf_vma) (field[6])) << 8)
137
          |   (((dwarf_vma) (field[5])) << 16)
138
          |   (((dwarf_vma) (field[4])) << 24)
139
          |   (((dwarf_vma) (field[3])) << 32)
140
          |   (((dwarf_vma) (field[2])) << 40)
141
          |   (((dwarf_vma) (field[1])) << 48)
142
          |   (((dwarf_vma) (field[0])) << 56);
143
      else if (sizeof (dwarf_vma) == 4)
144
        {
145
          /* Although we are extracing data from an 8 byte wide field,
146
             we are returning only 4 bytes of data.  */
147
          field += 4;
148
          return ((unsigned long) (field[3]))
149
            |   (((unsigned long) (field[2])) << 8)
150
            |   (((unsigned long) (field[1])) << 16)
151
            |   (((unsigned long) (field[0])) << 24);
152
        }
153
 
154
    default:
155
      error (_("Unhandled data length: %d\n"), size);
156
      abort ();
157
    }
158
}
159
 
160
static dwarf_vma
161
byte_get_signed (unsigned char *field, int size)
162
{
163
  dwarf_vma x = byte_get (field, size);
164
 
165
  switch (size)
166
    {
167
    case 1:
168
      return (x ^ 0x80) - 0x80;
169
    case 2:
170
      return (x ^ 0x8000) - 0x8000;
171
    case 4:
172
      return (x ^ 0x80000000) - 0x80000000;
173
    case 8:
174
      return x;
175
    default:
176
      abort ();
177
    }
178
}
179
 
180
static int
181
size_of_encoded_value (int encoding)
182
{
183
  switch (encoding & 0x7)
184
    {
185
    default:    /* ??? */
186
    case 0:      return eh_addr_size;
187
    case 2:     return 2;
188
    case 3:     return 4;
189
    case 4:     return 8;
190
    }
191
}
192
 
193
static dwarf_vma
194
get_encoded_value (unsigned char *data, int encoding)
195
{
196
  int size = size_of_encoded_value (encoding);
197
 
198
  if (encoding & DW_EH_PE_signed)
199
    return byte_get_signed (data, size);
200
  else
201
    return byte_get (data, size);
202
}
203
 
204
/* Print a dwarf_vma value (typically an address, offset or length) in
205
   hexadecimal format, followed by a space.  The length of the value (and
206
   hence the precision displayed) is determined by the byte_size parameter.  */
207
 
208
static void
209
print_dwarf_vma (dwarf_vma val, unsigned byte_size)
210
{
211
  static char buff[18];
212
 
213
  /* Printf does not have a way of specifiying a maximum field width for an
214
     integer value, so we print the full value into a buffer and then select
215
     the precision we need.  */
216
#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
217
#ifndef __MSVCRT__
218
  snprintf (buff, sizeof (buff), "%16.16llx ", val);
219
#else
220
  snprintf (buff, sizeof (buff), "%016I64x ", val);
221
#endif
222
#else
223
  snprintf (buff, sizeof (buff), "%16.16lx ", val);
224
#endif
225
 
226
  fputs (buff + (byte_size == 4 ? 8 : 0), stdout);
227
}
228
 
229
static unsigned long int
230
read_leb128 (unsigned char *data, unsigned int *length_return, int sign)
231
{
232
  unsigned long int result = 0;
233
  unsigned int num_read = 0;
234
  unsigned int shift = 0;
235
  unsigned char byte;
236
 
237
  do
238
    {
239
      byte = *data++;
240
      num_read++;
241
 
242
      result |= ((unsigned long int) (byte & 0x7f)) << shift;
243
 
244
      shift += 7;
245
 
246
    }
247
  while (byte & 0x80);
248
 
249
  if (length_return != NULL)
250
    *length_return = num_read;
251
 
252
  if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
253
    result |= -1L << shift;
254
 
255
  return result;
256
}
257
 
258
typedef struct State_Machine_Registers
259
{
260
  unsigned long address;
261
  unsigned int file;
262
  unsigned int line;
263
  unsigned int column;
264
  int is_stmt;
265
  int basic_block;
266
  int end_sequence;
267
/* This variable hold the number of the last entry seen
268
   in the File Table.  */
269
  unsigned int last_file_entry;
270
} SMR;
271
 
272
static SMR state_machine_regs;
273
 
274
static void
275
reset_state_machine (int is_stmt)
276
{
277
  state_machine_regs.address = 0;
278
  state_machine_regs.file = 1;
279
  state_machine_regs.line = 1;
280
  state_machine_regs.column = 0;
281
  state_machine_regs.is_stmt = is_stmt;
282
  state_machine_regs.basic_block = 0;
283
  state_machine_regs.end_sequence = 0;
284
  state_machine_regs.last_file_entry = 0;
285
}
286
 
287
/* Handled an extend line op.
288
   Returns the number of bytes read.  */
289
 
290
static int
291
process_extended_line_op (unsigned char *data, int is_stmt)
292
{
293
  unsigned char op_code;
294
  unsigned int bytes_read;
295
  unsigned int len;
296
  unsigned char *name;
297
  unsigned long adr;
298
 
299
  len = read_leb128 (data, & bytes_read, 0);
300
  data += bytes_read;
301
 
302
  if (len == 0)
303
    {
304
      warn (_("badly formed extended line op encountered!\n"));
305
      return bytes_read;
306
    }
307
 
308
  len += bytes_read;
309
  op_code = *data++;
310
 
311
  printf (_("  Extended opcode %d: "), op_code);
312
 
313
  switch (op_code)
314
    {
315
    case DW_LNE_end_sequence:
316
      printf (_("End of Sequence\n\n"));
317
      reset_state_machine (is_stmt);
318
      break;
319
 
320
    case DW_LNE_set_address:
321
      adr = byte_get (data, len - bytes_read - 1);
322
      printf (_("set Address to 0x%lx\n"), adr);
323
      state_machine_regs.address = adr;
324
      break;
325
 
326
    case DW_LNE_define_file:
327
      printf (_("  define new File Table entry\n"));
328
      printf (_("  Entry\tDir\tTime\tSize\tName\n"));
329
 
330
      printf (_("   %d\t"), ++state_machine_regs.last_file_entry);
331
      name = data;
332
      data += strlen ((char *) data) + 1;
333
      printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
334
      data += bytes_read;
335
      printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
336
      data += bytes_read;
337
      printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
338
      printf (_("%s\n\n"), name);
339
      break;
340
 
341
    case DW_LNE_set_discriminator:
342
      printf (_("set Discriminator to %lu\n"),
343
              read_leb128 (data, & bytes_read, 0));
344
      break;
345
 
346
    /* HP extensions.  */
347
    case DW_LNE_HP_negate_is_UV_update:
348
      printf ("DW_LNE_HP_negate_is_UV_update\n");
349
      break;
350
    case DW_LNE_HP_push_context:
351
      printf ("DW_LNE_HP_push_context\n");
352
      break;
353
    case DW_LNE_HP_pop_context:
354
      printf ("DW_LNE_HP_pop_context\n");
355
      break;
356
    case DW_LNE_HP_set_file_line_column:
357
      printf ("DW_LNE_HP_set_file_line_column\n");
358
      break;
359
    case DW_LNE_HP_set_routine_name:
360
      printf ("DW_LNE_HP_set_routine_name\n");
361
      break;
362
    case DW_LNE_HP_set_sequence:
363
      printf ("DW_LNE_HP_set_sequence\n");
364
      break;
365
    case DW_LNE_HP_negate_post_semantics:
366
      printf ("DW_LNE_HP_negate_post_semantics\n");
367
      break;
368
    case DW_LNE_HP_negate_function_exit:
369
      printf ("DW_LNE_HP_negate_function_exit\n");
370
      break;
371
    case DW_LNE_HP_negate_front_end_logical:
372
      printf ("DW_LNE_HP_negate_front_end_logical\n");
373
      break;
374
    case DW_LNE_HP_define_proc:
375
      printf ("DW_LNE_HP_define_proc\n");
376
      break;
377
 
378
    default:
379
      if (op_code >= DW_LNE_lo_user
380
          /* The test against DW_LNW_hi_user is redundant due to
381
             the limited range of the unsigned char data type used
382
             for op_code.  */
383
          /*&& op_code <= DW_LNE_hi_user*/)
384
        printf (_("user defined: length %d\n"), len - bytes_read);
385
      else
386
        printf (_("UNKNOWN: length %d\n"), len - bytes_read);
387
      break;
388
    }
389
 
390
  return len;
391
}
392
 
393
static const char *
394
fetch_indirect_string (unsigned long offset)
395
{
396
  struct dwarf_section *section = &debug_displays [str].section;
397
 
398
  if (section->start == NULL)
399
    return _("<no .debug_str section>");
400
 
401
  /* DWARF sections under Mach-O have non-zero addresses.  */
402
  offset -= section->address;
403
  if (offset > section->size)
404
    {
405
      warn (_("DW_FORM_strp offset too big: %lx\n"), offset);
406
      return _("<offset is too big>");
407
    }
408
 
409
  return (const char *) section->start + offset;
410
}
411
 
412
/* FIXME:  There are better and more efficient ways to handle
413
   these structures.  For now though, I just want something that
414
   is simple to implement.  */
415
typedef struct abbrev_attr
416
{
417
  unsigned long attribute;
418
  unsigned long form;
419
  struct abbrev_attr *next;
420
}
421
abbrev_attr;
422
 
423
typedef struct abbrev_entry
424
{
425
  unsigned long entry;
426
  unsigned long tag;
427
  int children;
428
  struct abbrev_attr *first_attr;
429
  struct abbrev_attr *last_attr;
430
  struct abbrev_entry *next;
431
}
432
abbrev_entry;
433
 
434
static abbrev_entry *first_abbrev = NULL;
435
static abbrev_entry *last_abbrev = NULL;
436
 
437
static void
438
free_abbrevs (void)
439
{
440
  abbrev_entry *abbrev;
441
 
442
  for (abbrev = first_abbrev; abbrev;)
443
    {
444
      abbrev_entry *next = abbrev->next;
445
      abbrev_attr *attr;
446
 
447
      for (attr = abbrev->first_attr; attr;)
448
        {
449
          abbrev_attr *next = attr->next;
450
 
451
          free (attr);
452
          attr = next;
453
        }
454
 
455
      free (abbrev);
456
      abbrev = next;
457
    }
458
 
459
  last_abbrev = first_abbrev = NULL;
460
}
461
 
462
static void
463
add_abbrev (unsigned long number, unsigned long tag, int children)
464
{
465
  abbrev_entry *entry;
466
 
467
  entry = (abbrev_entry *) malloc (sizeof (*entry));
468
 
469
  if (entry == NULL)
470
    /* ugg */
471
    return;
472
 
473
  entry->entry      = number;
474
  entry->tag        = tag;
475
  entry->children   = children;
476
  entry->first_attr = NULL;
477
  entry->last_attr  = NULL;
478
  entry->next       = NULL;
479
 
480
  if (first_abbrev == NULL)
481
    first_abbrev = entry;
482
  else
483
    last_abbrev->next = entry;
484
 
485
  last_abbrev = entry;
486
}
487
 
488
static void
489
add_abbrev_attr (unsigned long attribute, unsigned long form)
490
{
491
  abbrev_attr *attr;
492
 
493
  attr = (abbrev_attr *) malloc (sizeof (*attr));
494
 
495
  if (attr == NULL)
496
    /* ugg */
497
    return;
498
 
499
  attr->attribute = attribute;
500
  attr->form      = form;
501
  attr->next      = NULL;
502
 
503
  if (last_abbrev->first_attr == NULL)
504
    last_abbrev->first_attr = attr;
505
  else
506
    last_abbrev->last_attr->next = attr;
507
 
508
  last_abbrev->last_attr = attr;
509
}
510
 
511
/* Processes the (partial) contents of a .debug_abbrev section.
512
   Returns NULL if the end of the section was encountered.
513
   Returns the address after the last byte read if the end of
514
   an abbreviation set was found.  */
515
 
516
static unsigned char *
517
process_abbrev_section (unsigned char *start, unsigned char *end)
518
{
519
  if (first_abbrev != NULL)
520
    return NULL;
521
 
522
  while (start < end)
523
    {
524
      unsigned int bytes_read;
525
      unsigned long entry;
526
      unsigned long tag;
527
      unsigned long attribute;
528
      int children;
529
 
530
      entry = read_leb128 (start, & bytes_read, 0);
531
      start += bytes_read;
532
 
533
      /* A single zero is supposed to end the section according
534
         to the standard.  If there's more, then signal that to
535
         the caller.  */
536
      if (entry == 0)
537
        return start == end ? NULL : start;
538
 
539
      tag = read_leb128 (start, & bytes_read, 0);
540
      start += bytes_read;
541
 
542
      children = *start++;
543
 
544
      add_abbrev (entry, tag, children);
545
 
546
      do
547
        {
548
          unsigned long form;
549
 
550
          attribute = read_leb128 (start, & bytes_read, 0);
551
          start += bytes_read;
552
 
553
          form = read_leb128 (start, & bytes_read, 0);
554
          start += bytes_read;
555
 
556
          if (attribute != 0)
557
            add_abbrev_attr (attribute, form);
558
        }
559
      while (attribute != 0);
560
    }
561
 
562
  return NULL;
563
}
564
 
565
static char *
566
get_TAG_name (unsigned long tag)
567
{
568
  switch (tag)
569
    {
570
    case DW_TAG_padding:                return "DW_TAG_padding";
571
    case DW_TAG_array_type:             return "DW_TAG_array_type";
572
    case DW_TAG_class_type:             return "DW_TAG_class_type";
573
    case DW_TAG_entry_point:            return "DW_TAG_entry_point";
574
    case DW_TAG_enumeration_type:       return "DW_TAG_enumeration_type";
575
    case DW_TAG_formal_parameter:       return "DW_TAG_formal_parameter";
576
    case DW_TAG_imported_declaration:   return "DW_TAG_imported_declaration";
577
    case DW_TAG_label:                  return "DW_TAG_label";
578
    case DW_TAG_lexical_block:          return "DW_TAG_lexical_block";
579
    case DW_TAG_member:                 return "DW_TAG_member";
580
    case DW_TAG_pointer_type:           return "DW_TAG_pointer_type";
581
    case DW_TAG_reference_type:         return "DW_TAG_reference_type";
582
    case DW_TAG_compile_unit:           return "DW_TAG_compile_unit";
583
    case DW_TAG_string_type:            return "DW_TAG_string_type";
584
    case DW_TAG_structure_type:         return "DW_TAG_structure_type";
585
    case DW_TAG_subroutine_type:        return "DW_TAG_subroutine_type";
586
    case DW_TAG_typedef:                return "DW_TAG_typedef";
587
    case DW_TAG_union_type:             return "DW_TAG_union_type";
588
    case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
589
    case DW_TAG_variant:                return "DW_TAG_variant";
590
    case DW_TAG_common_block:           return "DW_TAG_common_block";
591
    case DW_TAG_common_inclusion:       return "DW_TAG_common_inclusion";
592
    case DW_TAG_inheritance:            return "DW_TAG_inheritance";
593
    case DW_TAG_inlined_subroutine:     return "DW_TAG_inlined_subroutine";
594
    case DW_TAG_module:                 return "DW_TAG_module";
595
    case DW_TAG_ptr_to_member_type:     return "DW_TAG_ptr_to_member_type";
596
    case DW_TAG_set_type:               return "DW_TAG_set_type";
597
    case DW_TAG_subrange_type:          return "DW_TAG_subrange_type";
598
    case DW_TAG_with_stmt:              return "DW_TAG_with_stmt";
599
    case DW_TAG_access_declaration:     return "DW_TAG_access_declaration";
600
    case DW_TAG_base_type:              return "DW_TAG_base_type";
601
    case DW_TAG_catch_block:            return "DW_TAG_catch_block";
602
    case DW_TAG_const_type:             return "DW_TAG_const_type";
603
    case DW_TAG_constant:               return "DW_TAG_constant";
604
    case DW_TAG_enumerator:             return "DW_TAG_enumerator";
605
    case DW_TAG_file_type:              return "DW_TAG_file_type";
606
    case DW_TAG_friend:                 return "DW_TAG_friend";
607
    case DW_TAG_namelist:               return "DW_TAG_namelist";
608
    case DW_TAG_namelist_item:          return "DW_TAG_namelist_item";
609
    case DW_TAG_packed_type:            return "DW_TAG_packed_type";
610
    case DW_TAG_subprogram:             return "DW_TAG_subprogram";
611
    case DW_TAG_template_type_param:    return "DW_TAG_template_type_param";
612
    case DW_TAG_template_value_param:   return "DW_TAG_template_value_param";
613
    case DW_TAG_thrown_type:            return "DW_TAG_thrown_type";
614
    case DW_TAG_try_block:              return "DW_TAG_try_block";
615
    case DW_TAG_variant_part:           return "DW_TAG_variant_part";
616
    case DW_TAG_variable:               return "DW_TAG_variable";
617
    case DW_TAG_volatile_type:          return "DW_TAG_volatile_type";
618
    case DW_TAG_MIPS_loop:              return "DW_TAG_MIPS_loop";
619
    case DW_TAG_format_label:           return "DW_TAG_format_label";
620
    case DW_TAG_function_template:      return "DW_TAG_function_template";
621
    case DW_TAG_class_template:         return "DW_TAG_class_template";
622
      /* DWARF 2.1 values.  */
623
    case DW_TAG_dwarf_procedure:        return "DW_TAG_dwarf_procedure";
624
    case DW_TAG_restrict_type:          return "DW_TAG_restrict_type";
625
    case DW_TAG_interface_type:         return "DW_TAG_interface_type";
626
    case DW_TAG_namespace:              return "DW_TAG_namespace";
627
    case DW_TAG_imported_module:        return "DW_TAG_imported_module";
628
    case DW_TAG_unspecified_type:       return "DW_TAG_unspecified_type";
629
    case DW_TAG_partial_unit:           return "DW_TAG_partial_unit";
630
    case DW_TAG_imported_unit:          return "DW_TAG_imported_unit";
631
      /* UPC values.  */
632
    case DW_TAG_upc_shared_type:        return "DW_TAG_upc_shared_type";
633
    case DW_TAG_upc_strict_type:        return "DW_TAG_upc_strict_type";
634
    case DW_TAG_upc_relaxed_type:       return "DW_TAG_upc_relaxed_type";
635
    default:
636
      {
637
        static char buffer[100];
638
 
639
        snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag);
640
        return buffer;
641
      }
642
    }
643
}
644
 
645
static char *
646
get_FORM_name (unsigned long form)
647
{
648
  switch (form)
649
    {
650
    case DW_FORM_addr:          return "DW_FORM_addr";
651
    case DW_FORM_block2:        return "DW_FORM_block2";
652
    case DW_FORM_block4:        return "DW_FORM_block4";
653
    case DW_FORM_data2:         return "DW_FORM_data2";
654
    case DW_FORM_data4:         return "DW_FORM_data4";
655
    case DW_FORM_data8:         return "DW_FORM_data8";
656
    case DW_FORM_string:        return "DW_FORM_string";
657
    case DW_FORM_block:         return "DW_FORM_block";
658
    case DW_FORM_block1:        return "DW_FORM_block1";
659
    case DW_FORM_data1:         return "DW_FORM_data1";
660
    case DW_FORM_flag:          return "DW_FORM_flag";
661
    case DW_FORM_sdata:         return "DW_FORM_sdata";
662
    case DW_FORM_strp:          return "DW_FORM_strp";
663
    case DW_FORM_udata:         return "DW_FORM_udata";
664
    case DW_FORM_ref_addr:      return "DW_FORM_ref_addr";
665
    case DW_FORM_ref1:          return "DW_FORM_ref1";
666
    case DW_FORM_ref2:          return "DW_FORM_ref2";
667
    case DW_FORM_ref4:          return "DW_FORM_ref4";
668
    case DW_FORM_ref8:          return "DW_FORM_ref8";
669
    case DW_FORM_ref_udata:     return "DW_FORM_ref_udata";
670
    case DW_FORM_indirect:      return "DW_FORM_indirect";
671
    default:
672
      {
673
        static char buffer[100];
674
 
675
        snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
676
        return buffer;
677
      }
678
    }
679
}
680
 
681
static unsigned char *
682
display_block (unsigned char *data, unsigned long length)
683
{
684
  printf (_(" %lu byte block: "), length);
685
 
686
  while (length --)
687
    printf ("%lx ", (unsigned long) byte_get (data++, 1));
688
 
689
  return data;
690
}
691
 
692
static int
693
decode_location_expression (unsigned char * data,
694
                            unsigned int pointer_size,
695
                            unsigned long length,
696
                            unsigned long cu_offset,
697
                            struct dwarf_section * section)
698
{
699
  unsigned op;
700
  unsigned int bytes_read;
701
  unsigned long uvalue;
702
  unsigned char *end = data + length;
703
  int need_frame_base = 0;
704
 
705
  while (data < end)
706
    {
707
      op = *data++;
708
 
709
      switch (op)
710
        {
711
        case DW_OP_addr:
712
          printf ("DW_OP_addr: %lx",
713
                  (unsigned long) byte_get (data, pointer_size));
714
          data += pointer_size;
715
          break;
716
        case DW_OP_deref:
717
          printf ("DW_OP_deref");
718
          break;
719
        case DW_OP_const1u:
720
          printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
721
          break;
722
        case DW_OP_const1s:
723
          printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data++, 1));
724
          break;
725
        case DW_OP_const2u:
726
          printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
727
          data += 2;
728
          break;
729
        case DW_OP_const2s:
730
          printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data, 2));
731
          data += 2;
732
          break;
733
        case DW_OP_const4u:
734
          printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
735
          data += 4;
736
          break;
737
        case DW_OP_const4s:
738
          printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data, 4));
739
          data += 4;
740
          break;
741
        case DW_OP_const8u:
742
          printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
743
                  (unsigned long) byte_get (data + 4, 4));
744
          data += 8;
745
          break;
746
        case DW_OP_const8s:
747
          printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
748
                  (long) byte_get (data + 4, 4));
749
          data += 8;
750
          break;
751
        case DW_OP_constu:
752
          printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
753
          data += bytes_read;
754
          break;
755
        case DW_OP_consts:
756
          printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
757
          data += bytes_read;
758
          break;
759
        case DW_OP_dup:
760
          printf ("DW_OP_dup");
761
          break;
762
        case DW_OP_drop:
763
          printf ("DW_OP_drop");
764
          break;
765
        case DW_OP_over:
766
          printf ("DW_OP_over");
767
          break;
768
        case DW_OP_pick:
769
          printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
770
          break;
771
        case DW_OP_swap:
772
          printf ("DW_OP_swap");
773
          break;
774
        case DW_OP_rot:
775
          printf ("DW_OP_rot");
776
          break;
777
        case DW_OP_xderef:
778
          printf ("DW_OP_xderef");
779
          break;
780
        case DW_OP_abs:
781
          printf ("DW_OP_abs");
782
          break;
783
        case DW_OP_and:
784
          printf ("DW_OP_and");
785
          break;
786
        case DW_OP_div:
787
          printf ("DW_OP_div");
788
          break;
789
        case DW_OP_minus:
790
          printf ("DW_OP_minus");
791
          break;
792
        case DW_OP_mod:
793
          printf ("DW_OP_mod");
794
          break;
795
        case DW_OP_mul:
796
          printf ("DW_OP_mul");
797
          break;
798
        case DW_OP_neg:
799
          printf ("DW_OP_neg");
800
          break;
801
        case DW_OP_not:
802
          printf ("DW_OP_not");
803
          break;
804
        case DW_OP_or:
805
          printf ("DW_OP_or");
806
          break;
807
        case DW_OP_plus:
808
          printf ("DW_OP_plus");
809
          break;
810
        case DW_OP_plus_uconst:
811
          printf ("DW_OP_plus_uconst: %lu",
812
                  read_leb128 (data, &bytes_read, 0));
813
          data += bytes_read;
814
          break;
815
        case DW_OP_shl:
816
          printf ("DW_OP_shl");
817
          break;
818
        case DW_OP_shr:
819
          printf ("DW_OP_shr");
820
          break;
821
        case DW_OP_shra:
822
          printf ("DW_OP_shra");
823
          break;
824
        case DW_OP_xor:
825
          printf ("DW_OP_xor");
826
          break;
827
        case DW_OP_bra:
828
          printf ("DW_OP_bra: %ld", (long) byte_get_signed (data, 2));
829
          data += 2;
830
          break;
831
        case DW_OP_eq:
832
          printf ("DW_OP_eq");
833
          break;
834
        case DW_OP_ge:
835
          printf ("DW_OP_ge");
836
          break;
837
        case DW_OP_gt:
838
          printf ("DW_OP_gt");
839
          break;
840
        case DW_OP_le:
841
          printf ("DW_OP_le");
842
          break;
843
        case DW_OP_lt:
844
          printf ("DW_OP_lt");
845
          break;
846
        case DW_OP_ne:
847
          printf ("DW_OP_ne");
848
          break;
849
        case DW_OP_skip:
850
          printf ("DW_OP_skip: %ld", (long) byte_get_signed (data, 2));
851
          data += 2;
852
          break;
853
 
854
        case DW_OP_lit0:
855
        case DW_OP_lit1:
856
        case DW_OP_lit2:
857
        case DW_OP_lit3:
858
        case DW_OP_lit4:
859
        case DW_OP_lit5:
860
        case DW_OP_lit6:
861
        case DW_OP_lit7:
862
        case DW_OP_lit8:
863
        case DW_OP_lit9:
864
        case DW_OP_lit10:
865
        case DW_OP_lit11:
866
        case DW_OP_lit12:
867
        case DW_OP_lit13:
868
        case DW_OP_lit14:
869
        case DW_OP_lit15:
870
        case DW_OP_lit16:
871
        case DW_OP_lit17:
872
        case DW_OP_lit18:
873
        case DW_OP_lit19:
874
        case DW_OP_lit20:
875
        case DW_OP_lit21:
876
        case DW_OP_lit22:
877
        case DW_OP_lit23:
878
        case DW_OP_lit24:
879
        case DW_OP_lit25:
880
        case DW_OP_lit26:
881
        case DW_OP_lit27:
882
        case DW_OP_lit28:
883
        case DW_OP_lit29:
884
        case DW_OP_lit30:
885
        case DW_OP_lit31:
886
          printf ("DW_OP_lit%d", op - DW_OP_lit0);
887
          break;
888
 
889
        case DW_OP_reg0:
890
        case DW_OP_reg1:
891
        case DW_OP_reg2:
892
        case DW_OP_reg3:
893
        case DW_OP_reg4:
894
        case DW_OP_reg5:
895
        case DW_OP_reg6:
896
        case DW_OP_reg7:
897
        case DW_OP_reg8:
898
        case DW_OP_reg9:
899
        case DW_OP_reg10:
900
        case DW_OP_reg11:
901
        case DW_OP_reg12:
902
        case DW_OP_reg13:
903
        case DW_OP_reg14:
904
        case DW_OP_reg15:
905
        case DW_OP_reg16:
906
        case DW_OP_reg17:
907
        case DW_OP_reg18:
908
        case DW_OP_reg19:
909
        case DW_OP_reg20:
910
        case DW_OP_reg21:
911
        case DW_OP_reg22:
912
        case DW_OP_reg23:
913
        case DW_OP_reg24:
914
        case DW_OP_reg25:
915
        case DW_OP_reg26:
916
        case DW_OP_reg27:
917
        case DW_OP_reg28:
918
        case DW_OP_reg29:
919
        case DW_OP_reg30:
920
        case DW_OP_reg31:
921
          printf ("DW_OP_reg%d", op - DW_OP_reg0);
922
          break;
923
 
924
        case DW_OP_breg0:
925
        case DW_OP_breg1:
926
        case DW_OP_breg2:
927
        case DW_OP_breg3:
928
        case DW_OP_breg4:
929
        case DW_OP_breg5:
930
        case DW_OP_breg6:
931
        case DW_OP_breg7:
932
        case DW_OP_breg8:
933
        case DW_OP_breg9:
934
        case DW_OP_breg10:
935
        case DW_OP_breg11:
936
        case DW_OP_breg12:
937
        case DW_OP_breg13:
938
        case DW_OP_breg14:
939
        case DW_OP_breg15:
940
        case DW_OP_breg16:
941
        case DW_OP_breg17:
942
        case DW_OP_breg18:
943
        case DW_OP_breg19:
944
        case DW_OP_breg20:
945
        case DW_OP_breg21:
946
        case DW_OP_breg22:
947
        case DW_OP_breg23:
948
        case DW_OP_breg24:
949
        case DW_OP_breg25:
950
        case DW_OP_breg26:
951
        case DW_OP_breg27:
952
        case DW_OP_breg28:
953
        case DW_OP_breg29:
954
        case DW_OP_breg30:
955
        case DW_OP_breg31:
956
          printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
957
                  read_leb128 (data, &bytes_read, 1));
958
          data += bytes_read;
959
          break;
960
 
961
        case DW_OP_regx:
962
          printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
963
          data += bytes_read;
964
          break;
965
        case DW_OP_fbreg:
966
          need_frame_base = 1;
967
          printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
968
          data += bytes_read;
969
          break;
970
        case DW_OP_bregx:
971
          uvalue = read_leb128 (data, &bytes_read, 0);
972
          data += bytes_read;
973
          printf ("DW_OP_bregx: %lu %ld", uvalue,
974
                  read_leb128 (data, &bytes_read, 1));
975
          data += bytes_read;
976
          break;
977
        case DW_OP_piece:
978
          printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
979
          data += bytes_read;
980
          break;
981
        case DW_OP_deref_size:
982
          printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
983
          break;
984
        case DW_OP_xderef_size:
985
          printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
986
          break;
987
        case DW_OP_nop:
988
          printf ("DW_OP_nop");
989
          break;
990
 
991
          /* DWARF 3 extensions.  */
992
        case DW_OP_push_object_address:
993
          printf ("DW_OP_push_object_address");
994
          break;
995
        case DW_OP_call2:
996
          /* XXX: Strictly speaking for 64-bit DWARF3 files
997
             this ought to be an 8-byte wide computation.  */
998
          printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2) + cu_offset);
999
          data += 2;
1000
          break;
1001
        case DW_OP_call4:
1002
          /* XXX: Strictly speaking for 64-bit DWARF3 files
1003
             this ought to be an 8-byte wide computation.  */
1004
          printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4) + cu_offset);
1005
          data += 4;
1006
          break;
1007
        case DW_OP_call_ref:
1008
          /* XXX: Strictly speaking for 64-bit DWARF3 files
1009
             this ought to be an 8-byte wide computation.  */
1010
          printf ("DW_OP_call_ref: <%lx>", (long) byte_get (data, 4) + cu_offset);
1011
          data += 4;
1012
          break;
1013
        case DW_OP_form_tls_address:
1014
          printf ("DW_OP_form_tls_address");
1015
          break;
1016
        case DW_OP_call_frame_cfa:
1017
          printf ("DW_OP_call_frame_cfa");
1018
          break;
1019
        case DW_OP_bit_piece:
1020
          printf ("DW_OP_bit_piece: ");
1021
          printf ("size: %lu ", read_leb128 (data, &bytes_read, 0));
1022
          data += bytes_read;
1023
          printf ("offset: %lu ", read_leb128 (data, &bytes_read, 0));
1024
          data += bytes_read;
1025
          break;
1026
 
1027
          /* DWARF 4 extensions.  */
1028
        case DW_OP_stack_value:
1029
          printf ("DW_OP_stack_value");
1030
          break;
1031
 
1032
        case DW_OP_implicit_value:
1033
          printf ("DW_OP_implicit_value");
1034
          uvalue = read_leb128 (data, &bytes_read, 0);
1035
          data += bytes_read;
1036
          display_block (data, uvalue);
1037
          data += uvalue;
1038
          break;
1039
 
1040
          /* GNU extensions.  */
1041
        case DW_OP_GNU_push_tls_address:
1042
          printf ("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown");
1043
          break;
1044
        case DW_OP_GNU_uninit:
1045
          printf ("DW_OP_GNU_uninit");
1046
          /* FIXME: Is there data associated with this OP ?  */
1047
          break;
1048
        case DW_OP_GNU_encoded_addr:
1049
          {
1050
            int encoding;
1051
            dwarf_vma addr;
1052
 
1053
            encoding = *data++;
1054
            addr = get_encoded_value (data, encoding);
1055
            if ((encoding & 0x70) == DW_EH_PE_pcrel)
1056
              addr += section->address + (data - section->start);
1057
            data += size_of_encoded_value (encoding);
1058
 
1059
            printf ("DW_OP_GNU_encoded_addr: fmt:%02x addr:", encoding);
1060
            print_dwarf_vma (addr, pointer_size);
1061
          }
1062
          break;
1063
 
1064
          /* HP extensions.  */
1065
        case DW_OP_HP_is_value:
1066
          printf ("DW_OP_HP_is_value");
1067
          /* FIXME: Is there data associated with this OP ?  */
1068
          break;
1069
        case DW_OP_HP_fltconst4:
1070
          printf ("DW_OP_HP_fltconst4");
1071
          /* FIXME: Is there data associated with this OP ?  */
1072
          break;
1073
        case DW_OP_HP_fltconst8:
1074
          printf ("DW_OP_HP_fltconst8");
1075
          /* FIXME: Is there data associated with this OP ?  */
1076
          break;
1077
        case DW_OP_HP_mod_range:
1078
          printf ("DW_OP_HP_mod_range");
1079
          /* FIXME: Is there data associated with this OP ?  */
1080
          break;
1081
        case DW_OP_HP_unmod_range:
1082
          printf ("DW_OP_HP_unmod_range");
1083
          /* FIXME: Is there data associated with this OP ?  */
1084
          break;
1085
        case DW_OP_HP_tls:
1086
          printf ("DW_OP_HP_tls");
1087
          /* FIXME: Is there data associated with this OP ?  */
1088
          break;
1089
 
1090
          /* PGI (STMicroelectronics) extensions.  */
1091
        case DW_OP_PGI_omp_thread_num:
1092
          /* Pushes the thread number for the current thread as it would be
1093
             returned by the standard OpenMP library function:
1094
             omp_get_thread_num().  The "current thread" is the thread for
1095
             which the expression is being evaluated.  */
1096
          printf ("DW_OP_PGI_omp_thread_num");
1097
          break;
1098
 
1099
        default:
1100
          if (op >= DW_OP_lo_user
1101
              && op <= DW_OP_hi_user)
1102
            printf (_("(User defined location op)"));
1103
          else
1104
            printf (_("(Unknown location op)"));
1105
          /* No way to tell where the next op is, so just bail.  */
1106
          return need_frame_base;
1107
        }
1108
 
1109
      /* Separate the ops.  */
1110
      if (data < end)
1111
        printf ("; ");
1112
    }
1113
 
1114
  return need_frame_base;
1115
}
1116
 
1117
static unsigned char *
1118
read_and_display_attr_value (unsigned long attribute,
1119
                             unsigned long form,
1120
                             unsigned char * data,
1121
                             unsigned long cu_offset,
1122
                             unsigned long pointer_size,
1123
                             unsigned long offset_size,
1124
                             int dwarf_version,
1125
                             debug_info * debug_info_p,
1126
                             int do_loc,
1127
                             struct dwarf_section * section)
1128
{
1129
  unsigned long uvalue = 0;
1130
  unsigned char *block_start = NULL;
1131
  unsigned char * orig_data = data;
1132
  unsigned int bytes_read;
1133
 
1134
  switch (form)
1135
    {
1136
    default:
1137
      break;
1138
 
1139
    case DW_FORM_ref_addr:
1140
      if (dwarf_version == 2)
1141
        {
1142
          uvalue = byte_get (data, pointer_size);
1143
          data += pointer_size;
1144
        }
1145
      else if (dwarf_version == 3)
1146
        {
1147
          uvalue = byte_get (data, offset_size);
1148
          data += offset_size;
1149
        }
1150
      else
1151
        {
1152
          error (_("Internal error: DWARF version is not 2 or 3.\n"));
1153
        }
1154
      break;
1155
 
1156
    case DW_FORM_addr:
1157
      uvalue = byte_get (data, pointer_size);
1158
      data += pointer_size;
1159
      break;
1160
 
1161
    case DW_FORM_strp:
1162
      uvalue = byte_get (data, offset_size);
1163
      data += offset_size;
1164
      break;
1165
 
1166
    case DW_FORM_ref1:
1167
    case DW_FORM_flag:
1168
    case DW_FORM_data1:
1169
      uvalue = byte_get (data++, 1);
1170
      break;
1171
 
1172
    case DW_FORM_ref2:
1173
    case DW_FORM_data2:
1174
      uvalue = byte_get (data, 2);
1175
      data += 2;
1176
      break;
1177
 
1178
    case DW_FORM_ref4:
1179
    case DW_FORM_data4:
1180
      uvalue = byte_get (data, 4);
1181
      data += 4;
1182
      break;
1183
 
1184
    case DW_FORM_sdata:
1185
      uvalue = read_leb128 (data, & bytes_read, 1);
1186
      data += bytes_read;
1187
      break;
1188
 
1189
    case DW_FORM_ref_udata:
1190
    case DW_FORM_udata:
1191
      uvalue = read_leb128 (data, & bytes_read, 0);
1192
      data += bytes_read;
1193
      break;
1194
 
1195
    case DW_FORM_indirect:
1196
      form = read_leb128 (data, & bytes_read, 0);
1197
      data += bytes_read;
1198
      if (!do_loc)
1199
        printf (" %s", get_FORM_name (form));
1200
      return read_and_display_attr_value (attribute, form, data,
1201
                                          cu_offset, pointer_size,
1202
                                          offset_size, dwarf_version,
1203
                                          debug_info_p, do_loc,
1204
                                          section);
1205
    }
1206
 
1207
  switch (form)
1208
    {
1209
    case DW_FORM_ref_addr:
1210
      if (!do_loc)
1211
        printf (" <0x%lx>", uvalue);
1212
      break;
1213
 
1214
    case DW_FORM_ref1:
1215
    case DW_FORM_ref2:
1216
    case DW_FORM_ref4:
1217
    case DW_FORM_ref_udata:
1218
      if (!do_loc)
1219
        printf (" <0x%lx>", uvalue + cu_offset);
1220
      break;
1221
 
1222
    case DW_FORM_data4:
1223
    case DW_FORM_addr:
1224
      if (!do_loc)
1225
        printf (" 0x%lx", uvalue);
1226
      break;
1227
 
1228
    case DW_FORM_flag:
1229
    case DW_FORM_data1:
1230
    case DW_FORM_data2:
1231
    case DW_FORM_sdata:
1232
    case DW_FORM_udata:
1233
      if (!do_loc)
1234
        printf (" %ld", uvalue);
1235
      break;
1236
 
1237
    case DW_FORM_ref8:
1238
    case DW_FORM_data8:
1239
      if (!do_loc)
1240
        {
1241
          uvalue = byte_get (data, 4);
1242
          printf (" 0x%lx", uvalue);
1243
          printf (" 0x%lx", (unsigned long) byte_get (data + 4, 4));
1244
        }
1245
      if ((do_loc || do_debug_loc || do_debug_ranges)
1246
          && num_debug_info_entries == 0)
1247
        {
1248
          if (sizeof (uvalue) == 8)
1249
            uvalue = byte_get (data, 8);
1250
          else
1251
            error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
1252
        }
1253
      data += 8;
1254
      break;
1255
 
1256
    case DW_FORM_string:
1257
      if (!do_loc)
1258
        printf (" %s", data);
1259
      data += strlen ((char *) data) + 1;
1260
      break;
1261
 
1262
    case DW_FORM_block:
1263
      uvalue = read_leb128 (data, & bytes_read, 0);
1264
      block_start = data + bytes_read;
1265
      if (do_loc)
1266
        data = block_start + uvalue;
1267
      else
1268
        data = display_block (block_start, uvalue);
1269
      break;
1270
 
1271
    case DW_FORM_block1:
1272
      uvalue = byte_get (data, 1);
1273
      block_start = data + 1;
1274
      if (do_loc)
1275
        data = block_start + uvalue;
1276
      else
1277
        data = display_block (block_start, uvalue);
1278
      break;
1279
 
1280
    case DW_FORM_block2:
1281
      uvalue = byte_get (data, 2);
1282
      block_start = data + 2;
1283
      if (do_loc)
1284
        data = block_start + uvalue;
1285
      else
1286
        data = display_block (block_start, uvalue);
1287
      break;
1288
 
1289
    case DW_FORM_block4:
1290
      uvalue = byte_get (data, 4);
1291
      block_start = data + 4;
1292
      if (do_loc)
1293
        data = block_start + uvalue;
1294
      else
1295
        data = display_block (block_start, uvalue);
1296
      break;
1297
 
1298
    case DW_FORM_strp:
1299
      if (!do_loc)
1300
        printf (_(" (indirect string, offset: 0x%lx): %s"),
1301
                uvalue, fetch_indirect_string (uvalue));
1302
      break;
1303
 
1304
    case DW_FORM_indirect:
1305
      /* Handled above.  */
1306
      break;
1307
 
1308
    default:
1309
      warn (_("Unrecognized form: %lu\n"), form);
1310
      break;
1311
    }
1312
 
1313
  if ((do_loc || do_debug_loc || do_debug_ranges)
1314
      && num_debug_info_entries == 0)
1315
    {
1316
      switch (attribute)
1317
        {
1318
        case DW_AT_frame_base:
1319
          have_frame_base = 1;
1320
        case DW_AT_location:
1321
        case DW_AT_string_length:
1322
        case DW_AT_return_addr:
1323
        case DW_AT_data_member_location:
1324
        case DW_AT_vtable_elem_location:
1325
        case DW_AT_segment:
1326
        case DW_AT_static_link:
1327
        case DW_AT_use_location:
1328
          if (form == DW_FORM_data4 || form == DW_FORM_data8)
1329
            {
1330
              /* Process location list.  */
1331
              unsigned int max = debug_info_p->max_loc_offsets;
1332
              unsigned int num = debug_info_p->num_loc_offsets;
1333
 
1334
              if (max == 0 || num >= max)
1335
                {
1336
                  max += 1024;
1337
                  debug_info_p->loc_offsets = (long unsigned int *)
1338
                      xcrealloc (debug_info_p->loc_offsets,
1339
                                 max, sizeof (*debug_info_p->loc_offsets));
1340
                  debug_info_p->have_frame_base = (int *)
1341
                      xcrealloc (debug_info_p->have_frame_base,
1342
                                 max, sizeof (*debug_info_p->have_frame_base));
1343
                  debug_info_p->max_loc_offsets = max;
1344
                }
1345
              debug_info_p->loc_offsets [num] = uvalue;
1346
              debug_info_p->have_frame_base [num] = have_frame_base;
1347
              debug_info_p->num_loc_offsets++;
1348
            }
1349
          break;
1350
 
1351
        case DW_AT_low_pc:
1352
          if (need_base_address)
1353
            debug_info_p->base_address = uvalue;
1354
          break;
1355
 
1356
        case DW_AT_ranges:
1357
          if (form == DW_FORM_data4 || form == DW_FORM_data8)
1358
            {
1359
              /* Process range list.  */
1360
              unsigned int max = debug_info_p->max_range_lists;
1361
              unsigned int num = debug_info_p->num_range_lists;
1362
 
1363
              if (max == 0 || num >= max)
1364
                {
1365
                  max += 1024;
1366
                  debug_info_p->range_lists = (long unsigned int *)
1367
                      xcrealloc (debug_info_p->range_lists,
1368
                                 max, sizeof (*debug_info_p->range_lists));
1369
                  debug_info_p->max_range_lists = max;
1370
                }
1371
              debug_info_p->range_lists [num] = uvalue;
1372
              debug_info_p->num_range_lists++;
1373
            }
1374
          break;
1375
 
1376
        default:
1377
          break;
1378
        }
1379
    }
1380
 
1381
  if (do_loc)
1382
    return data;
1383
 
1384
  /* For some attributes we can display further information.  */
1385
  printf ("\t");
1386
 
1387
  switch (attribute)
1388
    {
1389
    case DW_AT_inline:
1390
      switch (uvalue)
1391
        {
1392
        case DW_INL_not_inlined:
1393
          printf (_("(not inlined)"));
1394
          break;
1395
        case DW_INL_inlined:
1396
          printf (_("(inlined)"));
1397
          break;
1398
        case DW_INL_declared_not_inlined:
1399
          printf (_("(declared as inline but ignored)"));
1400
          break;
1401
        case DW_INL_declared_inlined:
1402
          printf (_("(declared as inline and inlined)"));
1403
          break;
1404
        default:
1405
          printf (_("  (Unknown inline attribute value: %lx)"), uvalue);
1406
          break;
1407
        }
1408
      break;
1409
 
1410
    case DW_AT_language:
1411
      switch (uvalue)
1412
        {
1413
          /* Ordered by the numeric value of these constants.  */
1414
        case DW_LANG_C89:               printf ("(ANSI C)"); break;
1415
        case DW_LANG_C:                 printf ("(non-ANSI C)"); break;
1416
        case DW_LANG_Ada83:             printf ("(Ada)"); break;
1417
        case DW_LANG_C_plus_plus:       printf ("(C++)"); break;
1418
        case DW_LANG_Cobol74:           printf ("(Cobol 74)"); break;
1419
        case DW_LANG_Cobol85:           printf ("(Cobol 85)"); break;
1420
        case DW_LANG_Fortran77:         printf ("(FORTRAN 77)"); break;
1421
        case DW_LANG_Fortran90:         printf ("(Fortran 90)"); break;
1422
        case DW_LANG_Pascal83:          printf ("(ANSI Pascal)"); break;
1423
        case DW_LANG_Modula2:           printf ("(Modula 2)"); break;
1424
          /* DWARF 2.1 values.  */
1425
        case DW_LANG_Java:              printf ("(Java)"); break;
1426
        case DW_LANG_C99:               printf ("(ANSI C99)"); break;
1427
        case DW_LANG_Ada95:             printf ("(ADA 95)"); break;
1428
        case DW_LANG_Fortran95:         printf ("(Fortran 95)"); break;
1429
          /* DWARF 3 values.  */
1430
        case DW_LANG_PLI:               printf ("(PLI)"); break;
1431
        case DW_LANG_ObjC:              printf ("(Objective C)"); break;
1432
        case DW_LANG_ObjC_plus_plus:    printf ("(Objective C++)"); break;
1433
        case DW_LANG_UPC:               printf ("(Unified Parallel C)"); break;
1434
        case DW_LANG_D:                 printf ("(D)"); break;
1435
          /* MIPS extension.  */
1436
        case DW_LANG_Mips_Assembler:    printf ("(MIPS assembler)"); break;
1437
          /* UPC extension.  */
1438
        case DW_LANG_Upc:               printf ("(Unified Parallel C)"); break;
1439
        default:
1440
          if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
1441
            printf ("(implementation defined: %lx)", uvalue);
1442
          else
1443
            printf ("(Unknown: %lx)", uvalue);
1444
          break;
1445
        }
1446
      break;
1447
 
1448
    case DW_AT_encoding:
1449
      switch (uvalue)
1450
        {
1451
        case DW_ATE_void:               printf ("(void)"); break;
1452
        case DW_ATE_address:            printf ("(machine address)"); break;
1453
        case DW_ATE_boolean:            printf ("(boolean)"); break;
1454
        case DW_ATE_complex_float:      printf ("(complex float)"); break;
1455
        case DW_ATE_float:              printf ("(float)"); break;
1456
        case DW_ATE_signed:             printf ("(signed)"); break;
1457
        case DW_ATE_signed_char:        printf ("(signed char)"); break;
1458
        case DW_ATE_unsigned:           printf ("(unsigned)"); break;
1459
        case DW_ATE_unsigned_char:      printf ("(unsigned char)"); break;
1460
          /* DWARF 2.1 values:  */
1461
        case DW_ATE_imaginary_float:    printf ("(imaginary float)"); break;
1462
        case DW_ATE_decimal_float:      printf ("(decimal float)"); break;
1463
          /* DWARF 3 values:  */
1464
        case DW_ATE_packed_decimal:     printf ("(packed_decimal)"); break;
1465
        case DW_ATE_numeric_string:     printf ("(numeric_string)"); break;
1466
        case DW_ATE_edited:             printf ("(edited)"); break;
1467
        case DW_ATE_signed_fixed:       printf ("(signed_fixed)"); break;
1468
        case DW_ATE_unsigned_fixed:     printf ("(unsigned_fixed)"); break;
1469
          /* HP extensions:  */
1470
        case DW_ATE_HP_float80:         printf ("(HP_float80)"); break;
1471
        case DW_ATE_HP_complex_float80: printf ("(HP_complex_float80)"); break;
1472
        case DW_ATE_HP_float128:        printf ("(HP_float128)"); break;
1473
        case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
1474
        case DW_ATE_HP_floathpintel:    printf ("(HP_floathpintel)"); break;
1475
        case DW_ATE_HP_imaginary_float80:       printf ("(HP_imaginary_float80)"); break;
1476
        case DW_ATE_HP_imaginary_float128:      printf ("(HP_imaginary_float128)"); break;
1477
 
1478
        default:
1479
          if (uvalue >= DW_ATE_lo_user
1480
              && uvalue <= DW_ATE_hi_user)
1481
            printf ("(user defined type)");
1482
          else
1483
            printf ("(unknown type)");
1484
          break;
1485
        }
1486
      break;
1487
 
1488
    case DW_AT_accessibility:
1489
      switch (uvalue)
1490
        {
1491
        case DW_ACCESS_public:          printf ("(public)"); break;
1492
        case DW_ACCESS_protected:       printf ("(protected)"); break;
1493
        case DW_ACCESS_private:         printf ("(private)"); break;
1494
        default:
1495
          printf ("(unknown accessibility)");
1496
          break;
1497
        }
1498
      break;
1499
 
1500
    case DW_AT_visibility:
1501
      switch (uvalue)
1502
        {
1503
        case DW_VIS_local:              printf ("(local)"); break;
1504
        case DW_VIS_exported:           printf ("(exported)"); break;
1505
        case DW_VIS_qualified:          printf ("(qualified)"); break;
1506
        default:                        printf ("(unknown visibility)"); break;
1507
        }
1508
      break;
1509
 
1510
    case DW_AT_virtuality:
1511
      switch (uvalue)
1512
        {
1513
        case DW_VIRTUALITY_none:        printf ("(none)"); break;
1514
        case DW_VIRTUALITY_virtual:     printf ("(virtual)"); break;
1515
        case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
1516
        default:                        printf ("(unknown virtuality)"); break;
1517
        }
1518
      break;
1519
 
1520
    case DW_AT_identifier_case:
1521
      switch (uvalue)
1522
        {
1523
        case DW_ID_case_sensitive:      printf ("(case_sensitive)"); break;
1524
        case DW_ID_up_case:             printf ("(up_case)"); break;
1525
        case DW_ID_down_case:           printf ("(down_case)"); break;
1526
        case DW_ID_case_insensitive:    printf ("(case_insensitive)"); break;
1527
        default:                        printf ("(unknown case)"); break;
1528
        }
1529
      break;
1530
 
1531
    case DW_AT_calling_convention:
1532
      switch (uvalue)
1533
        {
1534
        case DW_CC_normal:      printf ("(normal)"); break;
1535
        case DW_CC_program:     printf ("(program)"); break;
1536
        case DW_CC_nocall:      printf ("(nocall)"); break;
1537
        default:
1538
          if (uvalue >= DW_CC_lo_user
1539
              && uvalue <= DW_CC_hi_user)
1540
            printf ("(user defined)");
1541
          else
1542
            printf ("(unknown convention)");
1543
        }
1544
      break;
1545
 
1546
    case DW_AT_ordering:
1547
      switch (uvalue)
1548
        {
1549
        case -1: printf ("(undefined)"); break;
1550
        case 0:  printf ("(row major)"); break;
1551
        case 1:  printf ("(column major)"); break;
1552
        }
1553
      break;
1554
 
1555
    case DW_AT_frame_base:
1556
      have_frame_base = 1;
1557
    case DW_AT_location:
1558
    case DW_AT_string_length:
1559
    case DW_AT_return_addr:
1560
    case DW_AT_data_member_location:
1561
    case DW_AT_vtable_elem_location:
1562
    case DW_AT_segment:
1563
    case DW_AT_static_link:
1564
    case DW_AT_use_location:
1565
      if (form == DW_FORM_data4 || form == DW_FORM_data8)
1566
        printf (_("(location list)"));
1567
      /* Fall through.  */
1568
    case DW_AT_allocated:
1569
    case DW_AT_associated:
1570
    case DW_AT_data_location:
1571
    case DW_AT_stride:
1572
    case DW_AT_upper_bound:
1573
    case DW_AT_lower_bound:
1574
      if (block_start)
1575
        {
1576
          int need_frame_base;
1577
 
1578
          printf ("(");
1579
          need_frame_base = decode_location_expression (block_start,
1580
                                                        pointer_size,
1581
                                                        uvalue,
1582
                                                        cu_offset, section);
1583
          printf (")");
1584
          if (need_frame_base && !have_frame_base)
1585
            printf (_(" [without DW_AT_frame_base]"));
1586
        }
1587
      break;
1588
 
1589
    case DW_AT_import:
1590
      {
1591
        if (form == DW_FORM_ref1
1592
            || form == DW_FORM_ref2
1593
            || form == DW_FORM_ref4)
1594
          uvalue += cu_offset;
1595
 
1596
        if (uvalue >= section->size)
1597
          warn (_("Offset %lx used as value for DW_AT_import attribute of DIE at offset %lx is too big.\n"),
1598
                uvalue, (unsigned long) (orig_data - section->start));
1599
        else
1600
          {
1601
            unsigned long abbrev_number;
1602
            abbrev_entry * entry;
1603
 
1604
            abbrev_number = read_leb128 (section->start + uvalue, NULL, 0);
1605
 
1606
            printf ("[Abbrev Number: %ld", abbrev_number);
1607
            for (entry = first_abbrev; entry != NULL; entry = entry->next)
1608
              if (entry->entry == abbrev_number)
1609
                break;
1610
            if (entry != NULL)
1611
              printf (" (%s)", get_TAG_name (entry->tag));
1612
            printf ("]");
1613
          }
1614
      }
1615
      break;
1616
 
1617
    default:
1618
      break;
1619
    }
1620
 
1621
  return data;
1622
}
1623
 
1624
static char *
1625
get_AT_name (unsigned long attribute)
1626
{
1627
  switch (attribute)
1628
    {
1629
    case DW_AT_sibling:                 return "DW_AT_sibling";
1630
    case DW_AT_location:                return "DW_AT_location";
1631
    case DW_AT_name:                    return "DW_AT_name";
1632
    case DW_AT_ordering:                return "DW_AT_ordering";
1633
    case DW_AT_subscr_data:             return "DW_AT_subscr_data";
1634
    case DW_AT_byte_size:               return "DW_AT_byte_size";
1635
    case DW_AT_bit_offset:              return "DW_AT_bit_offset";
1636
    case DW_AT_bit_size:                return "DW_AT_bit_size";
1637
    case DW_AT_element_list:            return "DW_AT_element_list";
1638
    case DW_AT_stmt_list:               return "DW_AT_stmt_list";
1639
    case DW_AT_low_pc:                  return "DW_AT_low_pc";
1640
    case DW_AT_high_pc:                 return "DW_AT_high_pc";
1641
    case DW_AT_language:                return "DW_AT_language";
1642
    case DW_AT_member:                  return "DW_AT_member";
1643
    case DW_AT_discr:                   return "DW_AT_discr";
1644
    case DW_AT_discr_value:             return "DW_AT_discr_value";
1645
    case DW_AT_visibility:              return "DW_AT_visibility";
1646
    case DW_AT_import:                  return "DW_AT_import";
1647
    case DW_AT_string_length:           return "DW_AT_string_length";
1648
    case DW_AT_common_reference:        return "DW_AT_common_reference";
1649
    case DW_AT_comp_dir:                return "DW_AT_comp_dir";
1650
    case DW_AT_const_value:             return "DW_AT_const_value";
1651
    case DW_AT_containing_type:         return "DW_AT_containing_type";
1652
    case DW_AT_default_value:           return "DW_AT_default_value";
1653
    case DW_AT_inline:                  return "DW_AT_inline";
1654
    case DW_AT_is_optional:             return "DW_AT_is_optional";
1655
    case DW_AT_lower_bound:             return "DW_AT_lower_bound";
1656
    case DW_AT_producer:                return "DW_AT_producer";
1657
    case DW_AT_prototyped:              return "DW_AT_prototyped";
1658
    case DW_AT_return_addr:             return "DW_AT_return_addr";
1659
    case DW_AT_start_scope:             return "DW_AT_start_scope";
1660
    case DW_AT_stride_size:             return "DW_AT_stride_size";
1661
    case DW_AT_upper_bound:             return "DW_AT_upper_bound";
1662
    case DW_AT_abstract_origin:         return "DW_AT_abstract_origin";
1663
    case DW_AT_accessibility:           return "DW_AT_accessibility";
1664
    case DW_AT_address_class:           return "DW_AT_address_class";
1665
    case DW_AT_artificial:              return "DW_AT_artificial";
1666
    case DW_AT_base_types:              return "DW_AT_base_types";
1667
    case DW_AT_calling_convention:      return "DW_AT_calling_convention";
1668
    case DW_AT_count:                   return "DW_AT_count";
1669
    case DW_AT_data_member_location:    return "DW_AT_data_member_location";
1670
    case DW_AT_decl_column:             return "DW_AT_decl_column";
1671
    case DW_AT_decl_file:               return "DW_AT_decl_file";
1672
    case DW_AT_decl_line:               return "DW_AT_decl_line";
1673
    case DW_AT_declaration:             return "DW_AT_declaration";
1674
    case DW_AT_discr_list:              return "DW_AT_discr_list";
1675
    case DW_AT_encoding:                return "DW_AT_encoding";
1676
    case DW_AT_external:                return "DW_AT_external";
1677
    case DW_AT_frame_base:              return "DW_AT_frame_base";
1678
    case DW_AT_friend:                  return "DW_AT_friend";
1679
    case DW_AT_identifier_case:         return "DW_AT_identifier_case";
1680
    case DW_AT_macro_info:              return "DW_AT_macro_info";
1681
    case DW_AT_namelist_items:          return "DW_AT_namelist_items";
1682
    case DW_AT_priority:                return "DW_AT_priority";
1683
    case DW_AT_segment:                 return "DW_AT_segment";
1684
    case DW_AT_specification:           return "DW_AT_specification";
1685
    case DW_AT_static_link:             return "DW_AT_static_link";
1686
    case DW_AT_type:                    return "DW_AT_type";
1687
    case DW_AT_use_location:            return "DW_AT_use_location";
1688
    case DW_AT_variable_parameter:      return "DW_AT_variable_parameter";
1689
    case DW_AT_virtuality:              return "DW_AT_virtuality";
1690
    case DW_AT_vtable_elem_location:    return "DW_AT_vtable_elem_location";
1691
      /* DWARF 2.1 values.  */
1692
    case DW_AT_allocated:               return "DW_AT_allocated";
1693
    case DW_AT_associated:              return "DW_AT_associated";
1694
    case DW_AT_data_location:           return "DW_AT_data_location";
1695
    case DW_AT_stride:                  return "DW_AT_stride";
1696
    case DW_AT_entry_pc:                return "DW_AT_entry_pc";
1697
    case DW_AT_use_UTF8:                return "DW_AT_use_UTF8";
1698
    case DW_AT_extension:               return "DW_AT_extension";
1699
    case DW_AT_ranges:                  return "DW_AT_ranges";
1700
    case DW_AT_trampoline:              return "DW_AT_trampoline";
1701
    case DW_AT_call_column:             return "DW_AT_call_column";
1702
    case DW_AT_call_file:               return "DW_AT_call_file";
1703
    case DW_AT_call_line:               return "DW_AT_call_line";
1704
    case DW_AT_description:             return "DW_AT_description";
1705
    case DW_AT_binary_scale:            return "DW_AT_binary_scale";
1706
    case DW_AT_decimal_scale:           return "DW_AT_decimal_scale";
1707
    case DW_AT_small:                   return "DW_AT_small";
1708
    case DW_AT_decimal_sign:            return "DW_AT_decimal_sign";
1709
    case DW_AT_digit_count:             return "DW_AT_digit_count";
1710
    case DW_AT_picture_string:          return "DW_AT_picture_string";
1711
    case DW_AT_mutable:                 return "DW_AT_mutable";
1712
    case DW_AT_threads_scaled:          return "DW_AT_threads_scaled";
1713
    case DW_AT_explicit:                return "DW_AT_explicit";
1714
    case DW_AT_object_pointer:          return "DW_AT_object_pointer";
1715
    case DW_AT_endianity:               return "DW_AT_endianity";
1716
    case DW_AT_elemental:               return "DW_AT_elemental";
1717
    case DW_AT_pure:                    return "DW_AT_pure";
1718
    case DW_AT_recursive:               return "DW_AT_recursive";
1719
 
1720
      /* HP and SGI/MIPS extensions.  */
1721
    case DW_AT_MIPS_loop_begin:                 return "DW_AT_MIPS_loop_begin";
1722
    case DW_AT_MIPS_tail_loop_begin:            return "DW_AT_MIPS_tail_loop_begin";
1723
    case DW_AT_MIPS_epilog_begin:               return "DW_AT_MIPS_epilog_begin";
1724
    case DW_AT_MIPS_loop_unroll_factor:         return "DW_AT_MIPS_loop_unroll_factor";
1725
    case DW_AT_MIPS_software_pipeline_depth:    return "DW_AT_MIPS_software_pipeline_depth";
1726
    case DW_AT_MIPS_linkage_name:               return "DW_AT_MIPS_linkage_name";
1727
    case DW_AT_MIPS_stride:                     return "DW_AT_MIPS_stride";
1728
    case DW_AT_MIPS_abstract_name:              return "DW_AT_MIPS_abstract_name";
1729
    case DW_AT_MIPS_clone_origin:               return "DW_AT_MIPS_clone_origin";
1730
    case DW_AT_MIPS_has_inlines:                return "DW_AT_MIPS_has_inlines";
1731
 
1732
      /* HP Extensions.  */
1733
    case DW_AT_HP_block_index:                  return "DW_AT_HP_block_index";
1734
    case DW_AT_HP_actuals_stmt_list:            return "DW_AT_HP_actuals_stmt_list";
1735
    case DW_AT_HP_proc_per_section:             return "DW_AT_HP_proc_per_section";
1736
    case DW_AT_HP_raw_data_ptr:                 return "DW_AT_HP_raw_data_ptr";
1737
    case DW_AT_HP_pass_by_reference:            return "DW_AT_HP_pass_by_reference";
1738
    case DW_AT_HP_opt_level:                    return "DW_AT_HP_opt_level";
1739
    case DW_AT_HP_prof_version_id:              return "DW_AT_HP_prof_version_id";
1740
    case DW_AT_HP_opt_flags:                    return "DW_AT_HP_opt_flags";
1741
    case DW_AT_HP_cold_region_low_pc:           return "DW_AT_HP_cold_region_low_pc";
1742
    case DW_AT_HP_cold_region_high_pc:          return "DW_AT_HP_cold_region_high_pc";
1743
    case DW_AT_HP_all_variables_modifiable:     return "DW_AT_HP_all_variables_modifiable";
1744
    case DW_AT_HP_linkage_name:                 return "DW_AT_HP_linkage_name";
1745
    case DW_AT_HP_prof_flags:                   return "DW_AT_HP_prof_flags";
1746
 
1747
      /* One value is shared by the MIPS and HP extensions:  */
1748
    case DW_AT_MIPS_fde:                        return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
1749
 
1750
      /* GNU extensions.  */
1751
    case DW_AT_sf_names:                return "DW_AT_sf_names";
1752
    case DW_AT_src_info:                return "DW_AT_src_info";
1753
    case DW_AT_mac_info:                return "DW_AT_mac_info";
1754
    case DW_AT_src_coords:              return "DW_AT_src_coords";
1755
    case DW_AT_body_begin:              return "DW_AT_body_begin";
1756
    case DW_AT_body_end:                return "DW_AT_body_end";
1757
    case DW_AT_GNU_vector:              return "DW_AT_GNU_vector";
1758
 
1759
      /* UPC extension.  */
1760
    case DW_AT_upc_threads_scaled:      return "DW_AT_upc_threads_scaled";
1761
 
1762
    /* PGI (STMicroelectronics) extensions.  */
1763
    case DW_AT_PGI_lbase:               return "DW_AT_PGI_lbase";
1764
    case DW_AT_PGI_soffset:             return "DW_AT_PGI_soffset";
1765
    case DW_AT_PGI_lstride:             return "DW_AT_PGI_lstride";
1766
 
1767
    default:
1768
      {
1769
        static char buffer[100];
1770
 
1771
        snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
1772
                  attribute);
1773
        return buffer;
1774
      }
1775
    }
1776
}
1777
 
1778
static unsigned char *
1779
read_and_display_attr (unsigned long attribute,
1780
                       unsigned long form,
1781
                       unsigned char * data,
1782
                       unsigned long cu_offset,
1783
                       unsigned long pointer_size,
1784
                       unsigned long offset_size,
1785
                       int dwarf_version,
1786
                       debug_info * debug_info_p,
1787
                       int do_loc,
1788
                       struct dwarf_section * section)
1789
{
1790
  if (!do_loc)
1791
    printf ("   %-18s:", get_AT_name (attribute));
1792
  data = read_and_display_attr_value (attribute, form, data, cu_offset,
1793
                                      pointer_size, offset_size,
1794
                                      dwarf_version, debug_info_p,
1795
                                      do_loc, section);
1796
  if (!do_loc)
1797
    printf ("\n");
1798
  return data;
1799
}
1800
 
1801
 
1802
/* Process the contents of a .debug_info section.  If do_loc is non-zero
1803
   then we are scanning for location lists and we do not want to display
1804
   anything to the user.  */
1805
 
1806
static int
1807
process_debug_info (struct dwarf_section *section,
1808
                    void *file,
1809
                    int do_loc)
1810
{
1811
  unsigned char *start = section->start;
1812
  unsigned char *end = start + section->size;
1813
  unsigned char *section_begin;
1814
  unsigned int unit;
1815
  unsigned int num_units = 0;
1816
 
1817
  if ((do_loc || do_debug_loc || do_debug_ranges)
1818
      && num_debug_info_entries == 0)
1819
    {
1820
      unsigned long length;
1821
 
1822
      /* First scan the section to get the number of comp units.  */
1823
      for (section_begin = start, num_units = 0; section_begin < end;
1824
           num_units ++)
1825
        {
1826
          /* Read the first 4 bytes.  For a 32-bit DWARF section, this
1827
             will be the length.  For a 64-bit DWARF section, it'll be
1828
             the escape code 0xffffffff followed by an 8 byte length.  */
1829
          length = byte_get (section_begin, 4);
1830
 
1831
          if (length == 0xffffffff)
1832
            {
1833
              length = byte_get (section_begin + 4, 8);
1834
              section_begin += length + 12;
1835
            }
1836
          else if (length >= 0xfffffff0 && length < 0xffffffff)
1837
            {
1838
              warn (_("Reserved length value (%lx) found in section %s\n"), length, section->name);
1839
              return 0;
1840
            }
1841
          else
1842
            section_begin += length + 4;
1843
 
1844
          /* Negative values are illegal, they may even cause infinite
1845
             looping.  This can happen if we can't accurately apply
1846
             relocations to an object file.  */
1847
          if ((signed long) length <= 0)
1848
            {
1849
              warn (_("Corrupt unit length (%lx) found in section %s\n"), length, section->name);
1850
              return 0;
1851
            }
1852
        }
1853
 
1854
      if (num_units == 0)
1855
        {
1856
          error (_("No comp units in %s section ?"), section->name);
1857
          return 0;
1858
        }
1859
 
1860
      /* Then allocate an array to hold the information.  */
1861
      debug_information = (debug_info *) cmalloc (num_units,
1862
                                                  sizeof (* debug_information));
1863
      if (debug_information == NULL)
1864
        {
1865
          error (_("Not enough memory for a debug info array of %u entries"),
1866
                 num_units);
1867
          return 0;
1868
        }
1869
    }
1870
 
1871
  if (!do_loc)
1872
    {
1873
      printf (_("Contents of the %s section:\n\n"), section->name);
1874
 
1875
      load_debug_section (str, file);
1876
    }
1877
 
1878
  load_debug_section (abbrev, file);
1879
  if (debug_displays [abbrev].section.start == NULL)
1880
    {
1881
      warn (_("Unable to locate %s section!\n"),
1882
            debug_displays [abbrev].section.name);
1883
      return 0;
1884
    }
1885
 
1886
  for (section_begin = start, unit = 0; start < end; unit++)
1887
    {
1888
      DWARF2_Internal_CompUnit compunit;
1889
      unsigned char *hdrptr;
1890
      unsigned char *cu_abbrev_offset_ptr;
1891
      unsigned char *tags;
1892
      int level;
1893
      unsigned long cu_offset;
1894
      int offset_size;
1895
      int initial_length_size;
1896
 
1897
      hdrptr = start;
1898
 
1899
      compunit.cu_length = byte_get (hdrptr, 4);
1900
      hdrptr += 4;
1901
 
1902
      if (compunit.cu_length == 0xffffffff)
1903
        {
1904
          compunit.cu_length = byte_get (hdrptr, 8);
1905
          hdrptr += 8;
1906
          offset_size = 8;
1907
          initial_length_size = 12;
1908
        }
1909
      else
1910
        {
1911
          offset_size = 4;
1912
          initial_length_size = 4;
1913
        }
1914
 
1915
      compunit.cu_version = byte_get (hdrptr, 2);
1916
      hdrptr += 2;
1917
 
1918
      cu_offset = start - section_begin;
1919
 
1920
      cu_abbrev_offset_ptr = hdrptr;
1921
      compunit.cu_abbrev_offset = byte_get (hdrptr, offset_size);
1922
      hdrptr += offset_size;
1923
 
1924
      compunit.cu_pointer_size = byte_get (hdrptr, 1);
1925
      hdrptr += 1;
1926
      if ((do_loc || do_debug_loc || do_debug_ranges)
1927
          && num_debug_info_entries == 0)
1928
        {
1929
          debug_information [unit].cu_offset = cu_offset;
1930
          debug_information [unit].pointer_size
1931
            = compunit.cu_pointer_size;
1932
          debug_information [unit].base_address = 0;
1933
          debug_information [unit].loc_offsets = NULL;
1934
          debug_information [unit].have_frame_base = NULL;
1935
          debug_information [unit].max_loc_offsets = 0;
1936
          debug_information [unit].num_loc_offsets = 0;
1937
          debug_information [unit].range_lists = NULL;
1938
          debug_information [unit].max_range_lists= 0;
1939
          debug_information [unit].num_range_lists = 0;
1940
        }
1941
 
1942
      if (!do_loc)
1943
        {
1944
          printf (_("  Compilation Unit @ offset 0x%lx:\n"), cu_offset);
1945
          printf (_("   Length:        0x%lx (%s)\n"), compunit.cu_length,
1946
                  initial_length_size == 8 ? "64-bit" : "32-bit");
1947
          printf (_("   Version:       %d\n"), compunit.cu_version);
1948
          printf (_("   Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
1949
          printf (_("   Pointer Size:  %d\n"), compunit.cu_pointer_size);
1950
        }
1951
 
1952
      if (cu_offset + compunit.cu_length + initial_length_size
1953
          > section->size)
1954
        {
1955
          warn (_("Debug info is corrupted, length of CU at %lx extends beyond end of section (length = %lx)\n"),
1956
                cu_offset, compunit.cu_length);
1957
          break;
1958
        }
1959
      tags = hdrptr;
1960
      start += compunit.cu_length + initial_length_size;
1961
 
1962
      if (compunit.cu_version != 2 && compunit.cu_version != 3)
1963
        {
1964
          warn (_("CU at offset %lx contains corrupt or unsupported version number: %d.\n"),
1965
                cu_offset, compunit.cu_version);
1966
          continue;
1967
        }
1968
 
1969
      free_abbrevs ();
1970
 
1971
      /* Process the abbrevs used by this compilation unit. DWARF
1972
         sections under Mach-O have non-zero addresses.  */
1973
      if (compunit.cu_abbrev_offset >= debug_displays [abbrev].section.size)
1974
        warn (_("Debug info is corrupted, abbrev offset (%lx) is larger than abbrev section size (%lx)\n"),
1975
              (unsigned long) compunit.cu_abbrev_offset,
1976
              (unsigned long) debug_displays [abbrev].section.size);
1977
      else
1978
        process_abbrev_section
1979
          ((unsigned char *) debug_displays [abbrev].section.start
1980
           + compunit.cu_abbrev_offset - debug_displays [abbrev].section.address,
1981
           (unsigned char *) debug_displays [abbrev].section.start
1982
           + debug_displays [abbrev].section.size);
1983
 
1984
      level = 0;
1985
      while (tags < start)
1986
        {
1987
          unsigned int bytes_read;
1988
          unsigned long abbrev_number;
1989
          unsigned long die_offset;
1990
          abbrev_entry *entry;
1991
          abbrev_attr *attr;
1992
 
1993
          die_offset = tags - section_begin;
1994
 
1995
          abbrev_number = read_leb128 (tags, & bytes_read, 0);
1996
          tags += bytes_read;
1997
 
1998
          /* A null DIE marks the end of a list of siblings or it may also be
1999
             a section padding.  */
2000
          if (abbrev_number == 0)
2001
            {
2002
              /* Check if it can be a section padding for the last CU.  */
2003
              if (level == 0 && start == end)
2004
                {
2005
                  unsigned char *chk;
2006
 
2007
                  for (chk = tags; chk < start; chk++)
2008
                    if (*chk != 0)
2009
                      break;
2010
                  if (chk == start)
2011
                    break;
2012
                }
2013
 
2014
              --level;
2015
              if (level < 0)
2016
                {
2017
                  static unsigned num_bogus_warns = 0;
2018
 
2019
                  if (num_bogus_warns < 3)
2020
                    {
2021
                      warn (_("Bogus end-of-siblings marker detected at offset %lx in .debug_info section\n"),
2022
                            die_offset);
2023
                      num_bogus_warns ++;
2024
                      if (num_bogus_warns == 3)
2025
                        warn (_("Further warnings about bogus end-of-sibling markers suppressed\n"));
2026
                    }
2027
                }
2028
              continue;
2029
            }
2030
 
2031
          if (!do_loc)
2032
            printf (_(" <%d><%lx>: Abbrev Number: %lu"),
2033
                    level, die_offset, abbrev_number);
2034
 
2035
          /* Scan through the abbreviation list until we reach the
2036
             correct entry.  */
2037
          for (entry = first_abbrev;
2038
               entry && entry->entry != abbrev_number;
2039
               entry = entry->next)
2040
            continue;
2041
 
2042
          if (entry == NULL)
2043
            {
2044
              if (!do_loc)
2045
                {
2046
                  printf ("\n");
2047
                  fflush (stdout);
2048
                }
2049
              warn (_("DIE at offset %lx refers to abbreviation number %lu which does not exist\n"),
2050
                    die_offset, abbrev_number);
2051
              return 0;
2052
            }
2053
 
2054
          if (!do_loc)
2055
            printf (_(" (%s)\n"), get_TAG_name (entry->tag));
2056
 
2057
          switch (entry->tag)
2058
            {
2059
            default:
2060
              need_base_address = 0;
2061
              break;
2062
            case DW_TAG_compile_unit:
2063
              need_base_address = 1;
2064
              break;
2065
            case DW_TAG_entry_point:
2066
            case DW_TAG_subprogram:
2067
              need_base_address = 0;
2068
              /* Assuming that there is no DW_AT_frame_base.  */
2069
              have_frame_base = 0;
2070
              break;
2071
            }
2072
 
2073
          for (attr = entry->first_attr; attr; attr = attr->next)
2074
            {
2075
              if (! do_loc)
2076
                /* Show the offset from where the tag was extracted.  */
2077
                printf ("    <%2lx>", (unsigned long)(tags - section_begin));
2078
 
2079
              tags = read_and_display_attr (attr->attribute,
2080
                                            attr->form,
2081
                                            tags, cu_offset,
2082
                                            compunit.cu_pointer_size,
2083
                                            offset_size,
2084
                                            compunit.cu_version,
2085
                                            debug_information + unit,
2086
                                            do_loc, section);
2087
            }
2088
 
2089
          if (entry->children)
2090
            ++level;
2091
        }
2092
    }
2093
 
2094
  /* Set num_debug_info_entries here so that it can be used to check if
2095
     we need to process .debug_loc and .debug_ranges sections.  */
2096
  if ((do_loc || do_debug_loc || do_debug_ranges)
2097
      && num_debug_info_entries == 0)
2098
    num_debug_info_entries = num_units;
2099
 
2100
  if (!do_loc)
2101
    {
2102
      printf ("\n");
2103
    }
2104
 
2105
  return 1;
2106
}
2107
 
2108
/* Locate and scan the .debug_info section in the file and record the pointer
2109
   sizes and offsets for the compilation units in it.  Usually an executable
2110
   will have just one pointer size, but this is not guaranteed, and so we try
2111
   not to make any assumptions.  Returns zero upon failure, or the number of
2112
   compilation units upon success.  */
2113
 
2114
static unsigned int
2115
load_debug_info (void * file)
2116
{
2117
  /* Reset the last pointer size so that we can issue correct error
2118
     messages if we are displaying the contents of more than one section.  */
2119
  last_pointer_size = 0;
2120
  warned_about_missing_comp_units = FALSE;
2121
 
2122
  /* If we have already tried and failed to load the .debug_info
2123
     section then do not bother to repear the task.  */
2124
  if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
2125
    return 0;
2126
 
2127
  /* If we already have the information there is nothing else to do.  */
2128
  if (num_debug_info_entries > 0)
2129
    return num_debug_info_entries;
2130
 
2131
  if (load_debug_section (info, file)
2132
      && process_debug_info (&debug_displays [info].section, file, 1))
2133
    return num_debug_info_entries;
2134
 
2135
  num_debug_info_entries = DEBUG_INFO_UNAVAILABLE;
2136
  return 0;
2137
}
2138
 
2139
static int
2140
display_debug_lines_raw (struct dwarf_section *section,
2141
                         unsigned char *data,
2142
                         unsigned char *end)
2143
{
2144
  unsigned char *start = section->start;
2145
 
2146
  printf (_("Raw dump of debug contents of section %s:\n\n"),
2147
          section->name);
2148
 
2149
  while (data < end)
2150
    {
2151
      DWARF2_Internal_LineInfo info;
2152
      unsigned char *standard_opcodes;
2153
      unsigned char *end_of_sequence;
2154
      unsigned char *hdrptr;
2155
      unsigned long hdroff;
2156
      int initial_length_size;
2157
      int offset_size;
2158
      int i;
2159
 
2160
      hdrptr = data;
2161
      hdroff = hdrptr - start;
2162
 
2163
      /* Check the length of the block.  */
2164
      info.li_length = byte_get (hdrptr, 4);
2165
      hdrptr += 4;
2166
 
2167
      if (info.li_length == 0xffffffff)
2168
        {
2169
          /* This section is 64-bit DWARF 3.  */
2170
          info.li_length = byte_get (hdrptr, 8);
2171
          hdrptr += 8;
2172
          offset_size = 8;
2173
          initial_length_size = 12;
2174
        }
2175
      else
2176
        {
2177
          offset_size = 4;
2178
          initial_length_size = 4;
2179
        }
2180
 
2181
      if (info.li_length + initial_length_size > section->size)
2182
        {
2183
          warn
2184
            (_("The information in section %s appears to be corrupt - the section is too small\n"),
2185
             section->name);
2186
          return 0;
2187
        }
2188
 
2189
      /* Check its version number.  */
2190
      info.li_version = byte_get (hdrptr, 2);
2191
      hdrptr += 2;
2192
      if (info.li_version != 2 && info.li_version != 3)
2193
        {
2194
          warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
2195
          return 0;
2196
        }
2197
 
2198
      info.li_prologue_length = byte_get (hdrptr, offset_size);
2199
      hdrptr += offset_size;
2200
      info.li_min_insn_length = byte_get (hdrptr, 1);
2201
      hdrptr++;
2202
      info.li_default_is_stmt = byte_get (hdrptr, 1);
2203
      hdrptr++;
2204
      info.li_line_base = byte_get (hdrptr, 1);
2205
      hdrptr++;
2206
      info.li_line_range = byte_get (hdrptr, 1);
2207
      hdrptr++;
2208
      info.li_opcode_base = byte_get (hdrptr, 1);
2209
      hdrptr++;
2210
 
2211
      /* Sign extend the line base field.  */
2212
      info.li_line_base <<= 24;
2213
      info.li_line_base >>= 24;
2214
 
2215
      printf (_("  Offset:                      0x%lx\n"), hdroff);
2216
      printf (_("  Length:                      %ld\n"), info.li_length);
2217
      printf (_("  DWARF Version:               %d\n"), info.li_version);
2218
      printf (_("  Prologue Length:             %d\n"), info.li_prologue_length);
2219
      printf (_("  Minimum Instruction Length:  %d\n"), info.li_min_insn_length);
2220
      printf (_("  Initial value of 'is_stmt':  %d\n"), info.li_default_is_stmt);
2221
      printf (_("  Line Base:                   %d\n"), info.li_line_base);
2222
      printf (_("  Line Range:                  %d\n"), info.li_line_range);
2223
      printf (_("  Opcode Base:                 %d\n"), info.li_opcode_base);
2224
 
2225
      end_of_sequence = data + info.li_length + initial_length_size;
2226
 
2227
      reset_state_machine (info.li_default_is_stmt);
2228
 
2229
      /* Display the contents of the Opcodes table.  */
2230
      standard_opcodes = hdrptr;
2231
 
2232
      printf (_("\n Opcodes:\n"));
2233
 
2234
      for (i = 1; i < info.li_opcode_base; i++)
2235
        printf (_("  Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
2236
 
2237
      /* Display the contents of the Directory table.  */
2238
      data = standard_opcodes + info.li_opcode_base - 1;
2239
 
2240
      if (*data == 0)
2241
        printf (_("\n The Directory Table is empty.\n"));
2242
      else
2243
        {
2244
          printf (_("\n The Directory Table:\n"));
2245
 
2246
          while (*data != 0)
2247
            {
2248
              printf (_("  %s\n"), data);
2249
 
2250
              data += strlen ((char *) data) + 1;
2251
            }
2252
        }
2253
 
2254
      /* Skip the NUL at the end of the table.  */
2255
      data++;
2256
 
2257
      /* Display the contents of the File Name table.  */
2258
      if (*data == 0)
2259
        printf (_("\n The File Name Table is empty.\n"));
2260
      else
2261
        {
2262
          printf (_("\n The File Name Table:\n"));
2263
          printf (_("  Entry\tDir\tTime\tSize\tName\n"));
2264
 
2265
          while (*data != 0)
2266
            {
2267
              unsigned char *name;
2268
              unsigned int bytes_read;
2269
 
2270
              printf (_("  %d\t"), ++state_machine_regs.last_file_entry);
2271
              name = data;
2272
 
2273
              data += strlen ((char *) data) + 1;
2274
 
2275
              printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
2276
              data += bytes_read;
2277
              printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
2278
              data += bytes_read;
2279
              printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
2280
              data += bytes_read;
2281
              printf (_("%s\n"), name);
2282
            }
2283
        }
2284
 
2285
      /* Skip the NUL at the end of the table.  */
2286
      data++;
2287
 
2288
      /* Now display the statements.  */
2289
      printf (_("\n Line Number Statements:\n"));
2290
 
2291
      while (data < end_of_sequence)
2292
        {
2293
          unsigned char op_code;
2294
          int adv;
2295
          unsigned long int uladv;
2296
          unsigned int bytes_read;
2297
 
2298
          op_code = *data++;
2299
 
2300
          if (op_code >= info.li_opcode_base)
2301
            {
2302
              op_code -= info.li_opcode_base;
2303
              uladv = (op_code / info.li_line_range) * info.li_min_insn_length;
2304
              state_machine_regs.address += uladv;
2305
              printf (_("  Special opcode %d: advance Address by %lu to 0x%lx"),
2306
                      op_code, uladv, state_machine_regs.address);
2307
              adv = (op_code % info.li_line_range) + info.li_line_base;
2308
              state_machine_regs.line += adv;
2309
              printf (_(" and Line by %d to %d\n"),
2310
                      adv, state_machine_regs.line);
2311
            }
2312
          else switch (op_code)
2313
            {
2314
            case DW_LNS_extended_op:
2315
              data += process_extended_line_op (data, info.li_default_is_stmt);
2316
              break;
2317
 
2318
            case DW_LNS_copy:
2319
              printf (_("  Copy\n"));
2320
              break;
2321
 
2322
            case DW_LNS_advance_pc:
2323
              uladv = read_leb128 (data, & bytes_read, 0);
2324
              uladv *= info.li_min_insn_length;
2325
              data += bytes_read;
2326
              state_machine_regs.address += uladv;
2327
              printf (_("  Advance PC by %lu to 0x%lx\n"), uladv,
2328
                      state_machine_regs.address);
2329
              break;
2330
 
2331
            case DW_LNS_advance_line:
2332
              adv = read_leb128 (data, & bytes_read, 1);
2333
              data += bytes_read;
2334
              state_machine_regs.line += adv;
2335
              printf (_("  Advance Line by %d to %d\n"), adv,
2336
                      state_machine_regs.line);
2337
              break;
2338
 
2339
            case DW_LNS_set_file:
2340
              adv = read_leb128 (data, & bytes_read, 0);
2341
              data += bytes_read;
2342
              printf (_("  Set File Name to entry %d in the File Name Table\n"),
2343
                      adv);
2344
              state_machine_regs.file = adv;
2345
              break;
2346
 
2347
            case DW_LNS_set_column:
2348
              uladv = read_leb128 (data, & bytes_read, 0);
2349
              data += bytes_read;
2350
              printf (_("  Set column to %lu\n"), uladv);
2351
              state_machine_regs.column = uladv;
2352
              break;
2353
 
2354
            case DW_LNS_negate_stmt:
2355
              adv = state_machine_regs.is_stmt;
2356
              adv = ! adv;
2357
              printf (_("  Set is_stmt to %d\n"), adv);
2358
              state_machine_regs.is_stmt = adv;
2359
              break;
2360
 
2361
            case DW_LNS_set_basic_block:
2362
              printf (_("  Set basic block\n"));
2363
              state_machine_regs.basic_block = 1;
2364
              break;
2365
 
2366
            case DW_LNS_const_add_pc:
2367
              uladv = (((255 - info.li_opcode_base) / info.li_line_range)
2368
                      * info.li_min_insn_length);
2369
              state_machine_regs.address += uladv;
2370
              printf (_("  Advance PC by constant %lu to 0x%lx\n"), uladv,
2371
                      state_machine_regs.address);
2372
              break;
2373
 
2374
            case DW_LNS_fixed_advance_pc:
2375
              uladv = byte_get (data, 2);
2376
              data += 2;
2377
              state_machine_regs.address += uladv;
2378
              printf (_("  Advance PC by fixed size amount %lu to 0x%lx\n"),
2379
                      uladv, state_machine_regs.address);
2380
              break;
2381
 
2382
            case DW_LNS_set_prologue_end:
2383
              printf (_("  Set prologue_end to true\n"));
2384
              break;
2385
 
2386
            case DW_LNS_set_epilogue_begin:
2387
              printf (_("  Set epilogue_begin to true\n"));
2388
              break;
2389
 
2390
            case DW_LNS_set_isa:
2391
              uladv = read_leb128 (data, & bytes_read, 0);
2392
              data += bytes_read;
2393
              printf (_("  Set ISA to %lu\n"), uladv);
2394
              break;
2395
 
2396
            default:
2397
              printf (_("  Unknown opcode %d with operands: "), op_code);
2398
 
2399
              for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
2400
                {
2401
                  printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
2402
                          i == 1 ? "" : ", ");
2403
                  data += bytes_read;
2404
                }
2405
              putchar ('\n');
2406
              break;
2407
            }
2408
        }
2409
      putchar ('\n');
2410
    }
2411
 
2412
  return 1;
2413
}
2414
 
2415
typedef struct
2416
{
2417
    unsigned char *name;
2418
    unsigned int directory_index;
2419
    unsigned int modification_date;
2420
    unsigned int length;
2421
} File_Entry;
2422
 
2423
/* Output a decoded representation of the .debug_line section.  */
2424
 
2425
static int
2426
display_debug_lines_decoded (struct dwarf_section *section,
2427
                             unsigned char *data,
2428
                             unsigned char *end)
2429
{
2430
  printf (_("Decoded dump of debug contents of section %s:\n\n"),
2431
          section->name);
2432
 
2433
  while (data < end)
2434
    {
2435
      /* This loop amounts to one iteration per compilation unit.  */
2436
      DWARF2_Internal_LineInfo info;
2437
      unsigned char *standard_opcodes;
2438
      unsigned char *end_of_sequence;
2439
      unsigned char *hdrptr;
2440
      int initial_length_size;
2441
      int offset_size;
2442
      int i;
2443
      File_Entry *file_table = NULL;
2444
      unsigned char **directory_table = NULL;
2445
      unsigned int prev_line = 0;
2446
 
2447
      hdrptr = data;
2448
 
2449
      /* Extract information from the Line Number Program Header.
2450
        (section 6.2.4 in the Dwarf3 doc).  */
2451
 
2452
      /* Get the length of this CU's line number information block.  */
2453
      info.li_length = byte_get (hdrptr, 4);
2454
      hdrptr += 4;
2455
 
2456
      if (info.li_length == 0xffffffff)
2457
        {
2458
          /* This section is 64-bit DWARF 3.  */
2459
          info.li_length = byte_get (hdrptr, 8);
2460
          hdrptr += 8;
2461
          offset_size = 8;
2462
          initial_length_size = 12;
2463
        }
2464
      else
2465
        {
2466
          offset_size = 4;
2467
          initial_length_size = 4;
2468
        }
2469
 
2470
      if (info.li_length + initial_length_size > section->size)
2471
        {
2472
          warn (_("The line info appears to be corrupt - "
2473
                  "the section is too small\n"));
2474
          return 0;
2475
        }
2476
 
2477
      /* Get this CU's Line Number Block version number.  */
2478
      info.li_version = byte_get (hdrptr, 2);
2479
      hdrptr += 2;
2480
      if (info.li_version != 2 && info.li_version != 3)
2481
        {
2482
          warn (_("Only DWARF version 2 and 3 line info is currently "
2483
                "supported.\n"));
2484
          return 0;
2485
        }
2486
 
2487
      info.li_prologue_length = byte_get (hdrptr, offset_size);
2488
      hdrptr += offset_size;
2489
      info.li_min_insn_length = byte_get (hdrptr, 1);
2490
      hdrptr++;
2491
      info.li_default_is_stmt = byte_get (hdrptr, 1);
2492
      hdrptr++;
2493
      info.li_line_base = byte_get (hdrptr, 1);
2494
      hdrptr++;
2495
      info.li_line_range = byte_get (hdrptr, 1);
2496
      hdrptr++;
2497
      info.li_opcode_base = byte_get (hdrptr, 1);
2498
      hdrptr++;
2499
 
2500
      /* Sign extend the line base field.  */
2501
      info.li_line_base <<= 24;
2502
      info.li_line_base >>= 24;
2503
 
2504
      /* Find the end of this CU's Line Number Information Block.  */
2505
      end_of_sequence = data + info.li_length + initial_length_size;
2506
 
2507
      reset_state_machine (info.li_default_is_stmt);
2508
 
2509
      /* Save a pointer to the contents of the Opcodes table.  */
2510
      standard_opcodes = hdrptr;
2511
 
2512
      /* Traverse the Directory table just to count entries.  */
2513
      data = standard_opcodes + info.li_opcode_base - 1;
2514
      if (*data != 0)
2515
        {
2516
          unsigned int n_directories = 0;
2517
          unsigned char *ptr_directory_table = data;
2518
          int i;
2519
 
2520
          while (*data != 0)
2521
            {
2522
              data += strlen ((char *) data) + 1;
2523
              n_directories++;
2524
            }
2525
 
2526
          /* Go through the directory table again to save the directories.  */
2527
          directory_table = (unsigned char **)
2528
              xmalloc (n_directories * sizeof (unsigned char *));
2529
 
2530
          i = 0;
2531
          while (*ptr_directory_table != 0)
2532
            {
2533
              directory_table[i] = ptr_directory_table;
2534
              ptr_directory_table += strlen ((char *) ptr_directory_table) + 1;
2535
              i++;
2536
            }
2537
        }
2538
      /* Skip the NUL at the end of the table.  */
2539
      data++;
2540
 
2541
      /* Traverse the File Name table just to count the entries.  */
2542
      if (*data != 0)
2543
        {
2544
          unsigned int n_files = 0;
2545
          unsigned char *ptr_file_name_table = data;
2546
          int i;
2547
 
2548
          while (*data != 0)
2549
            {
2550
              unsigned int bytes_read;
2551
 
2552
              /* Skip Name, directory index, last modification time and length
2553
                 of file.  */
2554
              data += strlen ((char *) data) + 1;
2555
              read_leb128 (data, & bytes_read, 0);
2556
              data += bytes_read;
2557
              read_leb128 (data, & bytes_read, 0);
2558
              data += bytes_read;
2559
              read_leb128 (data, & bytes_read, 0);
2560
              data += bytes_read;
2561
 
2562
              n_files++;
2563
            }
2564
 
2565
          /* Go through the file table again to save the strings.  */
2566
          file_table = (File_Entry *) xmalloc (n_files * sizeof (File_Entry));
2567
 
2568
          i = 0;
2569
          while (*ptr_file_name_table != 0)
2570
            {
2571
              unsigned int bytes_read;
2572
 
2573
              file_table[i].name = ptr_file_name_table;
2574
              ptr_file_name_table += strlen ((char *) ptr_file_name_table) + 1;
2575
 
2576
              /* We are not interested in directory, time or size.  */
2577
              file_table[i].directory_index = read_leb128 (ptr_file_name_table,
2578
                                                           & bytes_read, 0);
2579
              ptr_file_name_table += bytes_read;
2580
              file_table[i].modification_date = read_leb128 (ptr_file_name_table,
2581
                                                             & bytes_read, 0);
2582
              ptr_file_name_table += bytes_read;
2583
              file_table[i].length = read_leb128 (ptr_file_name_table, & bytes_read, 0);
2584
              ptr_file_name_table += bytes_read;
2585
              i++;
2586
            }
2587
          i = 0;
2588
 
2589
          /* Print the Compilation Unit's name and a header.  */
2590
          if (directory_table == NULL)
2591
            {
2592
              printf (_("CU: %s:\n"), file_table[0].name);
2593
              printf (_("File name                            Line number    Starting address\n"));
2594
            }
2595
          else
2596
            {
2597
              if (do_wide || strlen ((char *) directory_table[0]) < 76)
2598
                {
2599
                  printf (_("CU: %s/%s:\n"), directory_table[0],
2600
                          file_table[0].name);
2601
                }
2602
              else
2603
                {
2604
                  printf (_("%s:\n"), file_table[0].name);
2605
                }
2606
              printf (_("File name                            Line number    Starting address\n"));
2607
            }
2608
        }
2609
 
2610
      /* Skip the NUL at the end of the table.  */
2611
      data++;
2612
 
2613
      /* This loop iterates through the Dwarf Line Number Program.  */
2614
      while (data < end_of_sequence)
2615
        {
2616
          unsigned char op_code;
2617
          int adv;
2618
          unsigned long int uladv;
2619
          unsigned int bytes_read;
2620
          int is_special_opcode = 0;
2621
 
2622
          op_code = *data++;
2623
          prev_line = state_machine_regs.line;
2624
 
2625
          if (op_code >= info.li_opcode_base)
2626
            {
2627
              op_code -= info.li_opcode_base;
2628
              uladv = (op_code / info.li_line_range) * info.li_min_insn_length;
2629
              state_machine_regs.address += uladv;
2630
 
2631
              adv = (op_code % info.li_line_range) + info.li_line_base;
2632
              state_machine_regs.line += adv;
2633
              is_special_opcode = 1;
2634
            }
2635
          else switch (op_code)
2636
            {
2637
            case DW_LNS_extended_op:
2638
              {
2639
                unsigned int ext_op_code_len;
2640
                unsigned int bytes_read;
2641
                unsigned char ext_op_code;
2642
                unsigned char *op_code_data = data;
2643
 
2644
                ext_op_code_len = read_leb128 (op_code_data, &bytes_read, 0);
2645
                op_code_data += bytes_read;
2646
 
2647
                if (ext_op_code_len == 0)
2648
                  {
2649
                    warn (_("badly formed extended line op encountered!\n"));
2650
                    break;
2651
                  }
2652
                ext_op_code_len += bytes_read;
2653
                ext_op_code = *op_code_data++;
2654
 
2655
                switch (ext_op_code)
2656
                  {
2657
                  case DW_LNE_end_sequence:
2658
                    reset_state_machine (info.li_default_is_stmt);
2659
                    break;
2660
                  case DW_LNE_set_address:
2661
                    state_machine_regs.address =
2662
                    byte_get (op_code_data, ext_op_code_len - bytes_read - 1);
2663
                    break;
2664
                  case DW_LNE_define_file:
2665
                    {
2666
                      unsigned int dir_index = 0;
2667
 
2668
                      ++state_machine_regs.last_file_entry;
2669
                      op_code_data += strlen ((char *) op_code_data) + 1;
2670
                      dir_index = read_leb128 (op_code_data, & bytes_read, 0);
2671
                      op_code_data += bytes_read;
2672
                      read_leb128 (op_code_data, & bytes_read, 0);
2673
                      op_code_data += bytes_read;
2674
                      read_leb128 (op_code_data, & bytes_read, 0);
2675
 
2676
                      printf (_("%s:\n"), directory_table[dir_index]);
2677
                      break;
2678
                    }
2679
                  default:
2680
                    printf (_("UNKNOWN: length %d\n"), ext_op_code_len - bytes_read);
2681
                    break;
2682
                  }
2683
                data += ext_op_code_len;
2684
                break;
2685
              }
2686
            case DW_LNS_copy:
2687
              break;
2688
 
2689
            case DW_LNS_advance_pc:
2690
              uladv = read_leb128 (data, & bytes_read, 0);
2691
              uladv *= info.li_min_insn_length;
2692
              data += bytes_read;
2693
              state_machine_regs.address += uladv;
2694
              break;
2695
 
2696
            case DW_LNS_advance_line:
2697
              adv = read_leb128 (data, & bytes_read, 1);
2698
              data += bytes_read;
2699
              state_machine_regs.line += adv;
2700
              break;
2701
 
2702
            case DW_LNS_set_file:
2703
              adv = read_leb128 (data, & bytes_read, 0);
2704
              data += bytes_read;
2705
              state_machine_regs.file = adv;
2706
              if (file_table[state_machine_regs.file - 1].directory_index == 0)
2707
                {
2708
                  /* If directory index is 0, that means current directory.  */
2709
                  printf (_("\n./%s:[++]\n"),
2710
                          file_table[state_machine_regs.file - 1].name);
2711
                }
2712
              else
2713
                {
2714
                  /* The directory index starts counting at 1.  */
2715
                  printf (_("\n%s/%s:\n"),
2716
                          directory_table[file_table[state_machine_regs.file - 1].directory_index - 1],
2717
                          file_table[state_machine_regs.file - 1].name);
2718
                }
2719
              break;
2720
 
2721
            case DW_LNS_set_column:
2722
              uladv = read_leb128 (data, & bytes_read, 0);
2723
              data += bytes_read;
2724
              state_machine_regs.column = uladv;
2725
              break;
2726
 
2727
            case DW_LNS_negate_stmt:
2728
              adv = state_machine_regs.is_stmt;
2729
              adv = ! adv;
2730
              state_machine_regs.is_stmt = adv;
2731
              break;
2732
 
2733
            case DW_LNS_set_basic_block:
2734
              state_machine_regs.basic_block = 1;
2735
              break;
2736
 
2737
            case DW_LNS_const_add_pc:
2738
              uladv = (((255 - info.li_opcode_base) / info.li_line_range)
2739
                       * info.li_min_insn_length);
2740
              state_machine_regs.address += uladv;
2741
              break;
2742
 
2743
            case DW_LNS_fixed_advance_pc:
2744
              uladv = byte_get (data, 2);
2745
              data += 2;
2746
              state_machine_regs.address += uladv;
2747
              break;
2748
 
2749
            case DW_LNS_set_prologue_end:
2750
              break;
2751
 
2752
            case DW_LNS_set_epilogue_begin:
2753
              break;
2754
 
2755
            case DW_LNS_set_isa:
2756
              uladv = read_leb128 (data, & bytes_read, 0);
2757
              data += bytes_read;
2758
              printf (_("  Set ISA to %lu\n"), uladv);
2759
              break;
2760
 
2761
            default:
2762
              printf (_("  Unknown opcode %d with operands: "), op_code);
2763
 
2764
              for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
2765
                {
2766
                  printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
2767
                          i == 1 ? "" : ", ");
2768
                  data += bytes_read;
2769
                }
2770
              putchar ('\n');
2771
              break;
2772
            }
2773
 
2774
          /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
2775
             to the DWARF address/line matrix.  */
2776
          if ((is_special_opcode) || (op_code == DW_LNE_end_sequence)
2777
              || (op_code == DW_LNS_copy))
2778
            {
2779
              const unsigned int MAX_FILENAME_LENGTH = 35;
2780
              char *fileName = (char *)file_table[state_machine_regs.file - 1].name;
2781
              char *newFileName = NULL;
2782
              size_t fileNameLength = strlen (fileName);
2783
 
2784
              if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
2785
                {
2786
                  newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
2787
                  /* Truncate file name */
2788
                  strncpy (newFileName,
2789
                           fileName + fileNameLength - MAX_FILENAME_LENGTH,
2790
                           MAX_FILENAME_LENGTH + 1);
2791
                }
2792
              else
2793
                {
2794
                  newFileName = (char *) xmalloc (fileNameLength + 1);
2795
                  strncpy (newFileName, fileName, fileNameLength + 1);
2796
                }
2797
 
2798
              if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
2799
                {
2800
                  printf (_("%-35s  %11d  %#18lx\n"), newFileName,
2801
                          state_machine_regs.line, state_machine_regs.address);
2802
                }
2803
              else
2804
                {
2805
                  printf (_("%s  %11d  %#18lx\n"), newFileName,
2806
                          state_machine_regs.line, state_machine_regs.address);
2807
                }
2808
 
2809
              if (op_code == DW_LNE_end_sequence)
2810
                printf ("\n");
2811
 
2812
              free (newFileName);
2813
            }
2814
        }
2815
      free (file_table);
2816
      file_table = NULL;
2817
      free (directory_table);
2818
      directory_table = NULL;
2819
      putchar ('\n');
2820
    }
2821
 
2822
  return 1;
2823
}
2824
 
2825
static int
2826
display_debug_lines (struct dwarf_section *section, void *file)
2827
{
2828
  unsigned char *data = section->start;
2829
  unsigned char *end = data + section->size;
2830
  int retValRaw = 1;
2831
  int retValDecoded = 1;
2832
 
2833
  if (load_debug_info (file) == 0)
2834
    {
2835
      warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
2836
            section->name);
2837
      return 0;
2838
    }
2839
 
2840
  if (do_debug_lines == 0)
2841
    do_debug_lines |= FLAG_DEBUG_LINES_RAW;
2842
 
2843
  if (do_debug_lines & FLAG_DEBUG_LINES_RAW)
2844
    retValRaw = display_debug_lines_raw (section, data, end);
2845
 
2846
  if (do_debug_lines & FLAG_DEBUG_LINES_DECODED)
2847
    retValDecoded = display_debug_lines_decoded (section, data, end);
2848
 
2849
  if (!retValRaw || !retValDecoded)
2850
    return 0;
2851
 
2852
  return 1;
2853
}
2854
 
2855
static debug_info *
2856
find_debug_info_for_offset (unsigned long offset)
2857
{
2858
  unsigned int i;
2859
 
2860
  if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE)
2861
    return NULL;
2862
 
2863
  for (i = 0; i < num_debug_info_entries; i++)
2864
    if (debug_information[i].cu_offset == offset)
2865
      return debug_information + i;
2866
 
2867
  return NULL;
2868
}
2869
 
2870
static int
2871
display_debug_pubnames (struct dwarf_section *section,
2872
                        void *file ATTRIBUTE_UNUSED)
2873
{
2874
  DWARF2_Internal_PubNames pubnames;
2875
  unsigned char *start = section->start;
2876
  unsigned char *end = start + section->size;
2877
 
2878
  /* It does not matter if this load fails,
2879
     we test for that later on.  */
2880
  load_debug_info (file);
2881
 
2882
  printf (_("Contents of the %s section:\n\n"), section->name);
2883
 
2884
  while (start < end)
2885
    {
2886
      unsigned char *data;
2887
      unsigned long offset;
2888
      int offset_size, initial_length_size;
2889
 
2890
      data = start;
2891
 
2892
      pubnames.pn_length = byte_get (data, 4);
2893
      data += 4;
2894
      if (pubnames.pn_length == 0xffffffff)
2895
        {
2896
          pubnames.pn_length = byte_get (data, 8);
2897
          data += 8;
2898
          offset_size = 8;
2899
          initial_length_size = 12;
2900
        }
2901
      else
2902
        {
2903
          offset_size = 4;
2904
          initial_length_size = 4;
2905
        }
2906
 
2907
      pubnames.pn_version = byte_get (data, 2);
2908
      data += 2;
2909
 
2910
      pubnames.pn_offset = byte_get (data, offset_size);
2911
      data += offset_size;
2912
 
2913
      if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
2914
          && num_debug_info_entries > 0
2915
          && find_debug_info_for_offset (pubnames.pn_offset) == NULL)
2916
        warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
2917
              pubnames.pn_offset, section->name);
2918
 
2919
      pubnames.pn_size = byte_get (data, offset_size);
2920
      data += offset_size;
2921
 
2922
      start += pubnames.pn_length + initial_length_size;
2923
 
2924
      if (pubnames.pn_version != 2 && pubnames.pn_version != 3)
2925
        {
2926
          static int warned = 0;
2927
 
2928
          if (! warned)
2929
            {
2930
              warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
2931
              warned = 1;
2932
            }
2933
 
2934
          continue;
2935
        }
2936
 
2937
      printf (_("  Length:                              %ld\n"),
2938
              pubnames.pn_length);
2939
      printf (_("  Version:                             %d\n"),
2940
              pubnames.pn_version);
2941
      printf (_("  Offset into .debug_info section:     0x%lx\n"),
2942
              pubnames.pn_offset);
2943
      printf (_("  Size of area in .debug_info section: %ld\n"),
2944
              pubnames.pn_size);
2945
 
2946
      printf (_("\n    Offset\tName\n"));
2947
 
2948
      do
2949
        {
2950
          offset = byte_get (data, offset_size);
2951
 
2952
          if (offset != 0)
2953
            {
2954
              data += offset_size;
2955
              printf ("    %-6lx\t%s\n", offset, data);
2956
              data += strlen ((char *) data) + 1;
2957
            }
2958
        }
2959
      while (offset != 0);
2960
    }
2961
 
2962
  printf ("\n");
2963
  return 1;
2964
}
2965
 
2966
static int
2967
display_debug_macinfo (struct dwarf_section *section,
2968
                       void *file ATTRIBUTE_UNUSED)
2969
{
2970
  unsigned char *start = section->start;
2971
  unsigned char *end = start + section->size;
2972
  unsigned char *curr = start;
2973
  unsigned int bytes_read;
2974
  enum dwarf_macinfo_record_type op;
2975
 
2976
  printf (_("Contents of the %s section:\n\n"), section->name);
2977
 
2978
  while (curr < end)
2979
    {
2980
      unsigned int lineno;
2981
      const char *string;
2982
 
2983
      op = (enum dwarf_macinfo_record_type) *curr;
2984
      curr++;
2985
 
2986
      switch (op)
2987
        {
2988
        case DW_MACINFO_start_file:
2989
          {
2990
            unsigned int filenum;
2991
 
2992
            lineno = read_leb128 (curr, & bytes_read, 0);
2993
            curr += bytes_read;
2994
            filenum = read_leb128 (curr, & bytes_read, 0);
2995
            curr += bytes_read;
2996
 
2997
            printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
2998
                    lineno, filenum);
2999
          }
3000
          break;
3001
 
3002
        case DW_MACINFO_end_file:
3003
          printf (_(" DW_MACINFO_end_file\n"));
3004
          break;
3005
 
3006
        case DW_MACINFO_define:
3007
          lineno = read_leb128 (curr, & bytes_read, 0);
3008
          curr += bytes_read;
3009
          string = (char *) curr;
3010
          curr += strlen (string) + 1;
3011
          printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
3012
                  lineno, string);
3013
          break;
3014
 
3015
        case DW_MACINFO_undef:
3016
          lineno = read_leb128 (curr, & bytes_read, 0);
3017
          curr += bytes_read;
3018
          string = (char *) curr;
3019
          curr += strlen (string) + 1;
3020
          printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
3021
                  lineno, string);
3022
          break;
3023
 
3024
        case DW_MACINFO_vendor_ext:
3025
          {
3026
            unsigned int constant;
3027
 
3028
            constant = read_leb128 (curr, & bytes_read, 0);
3029
            curr += bytes_read;
3030
            string = (char *) curr;
3031
            curr += strlen (string) + 1;
3032
            printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
3033
                    constant, string);
3034
          }
3035
          break;
3036
        }
3037
    }
3038
 
3039
  return 1;
3040
}
3041
 
3042
static int
3043
display_debug_abbrev (struct dwarf_section *section,
3044
                      void *file ATTRIBUTE_UNUSED)
3045
{
3046
  abbrev_entry *entry;
3047
  unsigned char *start = section->start;
3048
  unsigned char *end = start + section->size;
3049
 
3050
  printf (_("Contents of the %s section:\n\n"), section->name);
3051
 
3052
  do
3053
    {
3054
      free_abbrevs ();
3055
 
3056
      start = process_abbrev_section (start, end);
3057
 
3058
      if (first_abbrev == NULL)
3059
        continue;
3060
 
3061
      printf (_("  Number TAG\n"));
3062
 
3063
      for (entry = first_abbrev; entry; entry = entry->next)
3064
        {
3065
          abbrev_attr *attr;
3066
 
3067
          printf (_("   %ld      %s    [%s]\n"),
3068
                  entry->entry,
3069
                  get_TAG_name (entry->tag),
3070
                  entry->children ? _("has children") : _("no children"));
3071
 
3072
          for (attr = entry->first_attr; attr; attr = attr->next)
3073
            printf (_("    %-18s %s\n"),
3074
                    get_AT_name (attr->attribute),
3075
                    get_FORM_name (attr->form));
3076
        }
3077
    }
3078
  while (start);
3079
 
3080
  printf ("\n");
3081
 
3082
  return 1;
3083
}
3084
 
3085
static int
3086
display_debug_loc (struct dwarf_section *section, void *file)
3087
{
3088
  unsigned char *start = section->start;
3089
  unsigned char *section_end;
3090
  unsigned long bytes;
3091
  unsigned char *section_begin = start;
3092
  unsigned int num_loc_list = 0;
3093
  unsigned long last_offset = 0;
3094
  unsigned int first = 0;
3095
  unsigned int i;
3096
  unsigned int j;
3097
  int seen_first_offset = 0;
3098
  int use_debug_info = 1;
3099
  unsigned char *next;
3100
 
3101
  bytes = section->size;
3102
  section_end = start + bytes;
3103
 
3104
  if (bytes == 0)
3105
    {
3106
      printf (_("\nThe %s section is empty.\n"), section->name);
3107
      return 0;
3108
    }
3109
 
3110
  if (load_debug_info (file) == 0)
3111
    {
3112
      warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
3113
            section->name);
3114
      return 0;
3115
    }
3116
 
3117
  /* Check the order of location list in .debug_info section. If
3118
     offsets of location lists are in the ascending order, we can
3119
     use `debug_information' directly.  */
3120
  for (i = 0; i < num_debug_info_entries; i++)
3121
    {
3122
      unsigned int num;
3123
 
3124
      num = debug_information [i].num_loc_offsets;
3125
      num_loc_list += num;
3126
 
3127
      /* Check if we can use `debug_information' directly.  */
3128
      if (use_debug_info && num != 0)
3129
        {
3130
          if (!seen_first_offset)
3131
            {
3132
              /* This is the first location list.  */
3133
              last_offset = debug_information [i].loc_offsets [0];
3134
              first = i;
3135
              seen_first_offset = 1;
3136
              j = 1;
3137
            }
3138
          else
3139
            j = 0;
3140
 
3141
          for (; j < num; j++)
3142
            {
3143
              if (last_offset >
3144
                  debug_information [i].loc_offsets [j])
3145
                {
3146
                  use_debug_info = 0;
3147
                  break;
3148
                }
3149
              last_offset = debug_information [i].loc_offsets [j];
3150
            }
3151
        }
3152
    }
3153
 
3154
  if (!use_debug_info)
3155
    /* FIXME: Should we handle this case?  */
3156
    error (_("Location lists in .debug_info section aren't in ascending order!\n"));
3157
 
3158
  if (!seen_first_offset)
3159
    error (_("No location lists in .debug_info section!\n"));
3160
 
3161
  /* DWARF sections under Mach-O have non-zero addresses.  */
3162
  if (debug_information [first].num_loc_offsets > 0
3163
      && debug_information [first].loc_offsets [0] != section->address)
3164
    warn (_("Location lists in %s section start at 0x%lx\n"),
3165
          section->name, debug_information [first].loc_offsets [0]);
3166
 
3167
  printf (_("Contents of the %s section:\n\n"), section->name);
3168
  printf (_("    Offset   Begin    End      Expression\n"));
3169
 
3170
  seen_first_offset = 0;
3171
  for (i = first; i < num_debug_info_entries; i++)
3172
    {
3173
      dwarf_vma begin;
3174
      dwarf_vma end;
3175
      unsigned short length;
3176
      unsigned long offset;
3177
      unsigned int pointer_size;
3178
      unsigned long cu_offset;
3179
      unsigned long base_address;
3180
      int need_frame_base;
3181
      int has_frame_base;
3182
 
3183
      pointer_size = debug_information [i].pointer_size;
3184
      cu_offset = debug_information [i].cu_offset;
3185
 
3186
      for (j = 0; j < debug_information [i].num_loc_offsets; j++)
3187
        {
3188
          has_frame_base = debug_information [i].have_frame_base [j];
3189
          /* DWARF sections under Mach-O have non-zero addresses.  */
3190
          offset = debug_information [i].loc_offsets [j] - section->address;
3191
          next = section_begin + offset;
3192
          base_address = debug_information [i].base_address;
3193
 
3194
          if (!seen_first_offset)
3195
            seen_first_offset = 1;
3196
          else
3197
            {
3198
              if (start < next)
3199
                warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
3200
                      (unsigned long) (start - section_begin),
3201
                      (unsigned long) (next - section_begin));
3202
              else if (start > next)
3203
                warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
3204
                      (unsigned long) (start - section_begin),
3205
                      (unsigned long) (next - section_begin));
3206
            }
3207
          start = next;
3208
 
3209
          if (offset >= bytes)
3210
            {
3211
              warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
3212
                    offset);
3213
              continue;
3214
            }
3215
 
3216
          while (1)
3217
            {
3218
              if (start + 2 * pointer_size > section_end)
3219
                {
3220
                  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
3221
                        offset);
3222
                  break;
3223
                }
3224
 
3225
              /* Note: we use sign extension here in order to be sure that
3226
                 we can detect the -1 escape value.  Sign extension into the
3227
                 top 32 bits of a 32-bit address will not affect the values
3228
                 that we display since we always show hex values, and always
3229
                 the bottom 32-bits.  */
3230
              begin = byte_get_signed (start, pointer_size);
3231
              start += pointer_size;
3232
              end = byte_get_signed (start, pointer_size);
3233
              start += pointer_size;
3234
 
3235
              printf ("    %8.8lx ", offset);
3236
 
3237
              if (begin == 0 && end == 0)
3238
                {
3239
                  printf (_("<End of list>\n"));
3240
                  break;
3241
                }
3242
 
3243
              /* Check base address specifiers.  */
3244
              if (begin == (dwarf_vma) -1 && end != (dwarf_vma) -1)
3245
                {
3246
                  base_address = end;
3247
                  print_dwarf_vma (begin, pointer_size);
3248
                  print_dwarf_vma (end, pointer_size);
3249
                  printf (_("(base address)\n"));
3250
                  continue;
3251
                }
3252
 
3253
              if (start + 2 > section_end)
3254
                {
3255
                  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
3256
                        offset);
3257
                  break;
3258
                }
3259
 
3260
              length = byte_get (start, 2);
3261
              start += 2;
3262
 
3263
              if (start + length > section_end)
3264
                {
3265
                  warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
3266
                        offset);
3267
                  break;
3268
                }
3269
 
3270
              print_dwarf_vma (begin + base_address, pointer_size);
3271
              print_dwarf_vma (end + base_address, pointer_size);
3272
 
3273
              putchar ('(');
3274
              need_frame_base = decode_location_expression (start,
3275
                                                            pointer_size,
3276
                                                            length,
3277
                                                            cu_offset, section);
3278
              putchar (')');
3279
 
3280
              if (need_frame_base && !has_frame_base)
3281
                printf (_(" [without DW_AT_frame_base]"));
3282
 
3283
              if (begin == end)
3284
                fputs (_(" (start == end)"), stdout);
3285
              else if (begin > end)
3286
                fputs (_(" (start > end)"), stdout);
3287
 
3288
              putchar ('\n');
3289
 
3290
              start += length;
3291
            }
3292
        }
3293
    }
3294
 
3295
  if (start < section_end)
3296
    warn (_("There are %ld unused bytes at the end of section %s\n"),
3297
          (long) (section_end - start), section->name);
3298
  putchar ('\n');
3299
  return 1;
3300
}
3301
 
3302
static int
3303
display_debug_str (struct dwarf_section *section,
3304
                   void *file ATTRIBUTE_UNUSED)
3305
{
3306
  unsigned char *start = section->start;
3307
  unsigned long bytes = section->size;
3308
  dwarf_vma addr = section->address;
3309
 
3310
  if (bytes == 0)
3311
    {
3312
      printf (_("\nThe %s section is empty.\n"), section->name);
3313
      return 0;
3314
    }
3315
 
3316
  printf (_("Contents of the %s section:\n\n"), section->name);
3317
 
3318
  while (bytes)
3319
    {
3320
      int j;
3321
      int k;
3322
      int lbytes;
3323
 
3324
      lbytes = (bytes > 16 ? 16 : bytes);
3325
 
3326
      printf ("  0x%8.8lx ", (unsigned long) addr);
3327
 
3328
      for (j = 0; j < 16; j++)
3329
        {
3330
          if (j < lbytes)
3331
            printf ("%2.2x", start[j]);
3332
          else
3333
            printf ("  ");
3334
 
3335
          if ((j & 3) == 3)
3336
            printf (" ");
3337
        }
3338
 
3339
      for (j = 0; j < lbytes; j++)
3340
        {
3341
          k = start[j];
3342
          if (k >= ' ' && k < 0x80)
3343
            printf ("%c", k);
3344
          else
3345
            printf (".");
3346
        }
3347
 
3348
      putchar ('\n');
3349
 
3350
      start += lbytes;
3351
      addr  += lbytes;
3352
      bytes -= lbytes;
3353
    }
3354
 
3355
  putchar ('\n');
3356
 
3357
  return 1;
3358
}
3359
 
3360
static int
3361
display_debug_info (struct dwarf_section *section, void *file)
3362
{
3363
  return process_debug_info (section, file, 0);
3364
}
3365
 
3366
 
3367
static int
3368
display_debug_aranges (struct dwarf_section *section,
3369
                       void *file ATTRIBUTE_UNUSED)
3370
{
3371
  unsigned char *start = section->start;
3372
  unsigned char *end = start + section->size;
3373
 
3374
  printf (_("Contents of the %s section:\n\n"), section->name);
3375
 
3376
  /* It does not matter if this load fails,
3377
     we test for that later on.  */
3378
  load_debug_info (file);
3379
 
3380
  while (start < end)
3381
    {
3382
      unsigned char *hdrptr;
3383
      DWARF2_Internal_ARange arange;
3384
      unsigned char *ranges;
3385
      dwarf_vma length;
3386
      dwarf_vma address;
3387
      unsigned char address_size;
3388
      int excess;
3389
      int offset_size;
3390
      int initial_length_size;
3391
 
3392
      hdrptr = start;
3393
 
3394
      arange.ar_length = byte_get (hdrptr, 4);
3395
      hdrptr += 4;
3396
 
3397
      if (arange.ar_length == 0xffffffff)
3398
        {
3399
          arange.ar_length = byte_get (hdrptr, 8);
3400
          hdrptr += 8;
3401
          offset_size = 8;
3402
          initial_length_size = 12;
3403
        }
3404
      else
3405
        {
3406
          offset_size = 4;
3407
          initial_length_size = 4;
3408
        }
3409
 
3410
      arange.ar_version = byte_get (hdrptr, 2);
3411
      hdrptr += 2;
3412
 
3413
      arange.ar_info_offset = byte_get (hdrptr, offset_size);
3414
      hdrptr += offset_size;
3415
 
3416
      if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
3417
          && num_debug_info_entries > 0
3418
          && find_debug_info_for_offset (arange.ar_info_offset) == NULL)
3419
        warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
3420
              arange.ar_info_offset, section->name);
3421
 
3422
      arange.ar_pointer_size = byte_get (hdrptr, 1);
3423
      hdrptr += 1;
3424
 
3425
      arange.ar_segment_size = byte_get (hdrptr, 1);
3426
      hdrptr += 1;
3427
 
3428
      if (arange.ar_version != 2 && arange.ar_version != 3)
3429
        {
3430
          warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
3431
          break;
3432
        }
3433
 
3434
      printf (_("  Length:                   %ld\n"), arange.ar_length);
3435
      printf (_("  Version:                  %d\n"), arange.ar_version);
3436
      printf (_("  Offset into .debug_info:  0x%lx\n"), arange.ar_info_offset);
3437
      printf (_("  Pointer Size:             %d\n"), arange.ar_pointer_size);
3438
      printf (_("  Segment Size:             %d\n"), arange.ar_segment_size);
3439
 
3440
      address_size = arange.ar_pointer_size + arange.ar_segment_size;
3441
 
3442
      /* The DWARF spec does not require that the address size be a power
3443
         of two, but we do.  This will have to change if we ever encounter
3444
         an uneven architecture.  */
3445
      if ((address_size & (address_size - 1)) != 0)
3446
        {
3447
          warn (_("Pointer size + Segment size is not a power of two.\n"));
3448
          break;
3449
        }
3450
 
3451
      if (address_size > 4)
3452
        printf (_("\n    Address            Length\n"));
3453
      else
3454
        printf (_("\n    Address    Length\n"));
3455
 
3456
      ranges = hdrptr;
3457
 
3458
      /* Must pad to an alignment boundary that is twice the address size.  */
3459
      excess = (hdrptr - start) % (2 * address_size);
3460
      if (excess)
3461
        ranges += (2 * address_size) - excess;
3462
 
3463
      start += arange.ar_length + initial_length_size;
3464
 
3465
      while (ranges + 2 * address_size <= start)
3466
        {
3467
          address = byte_get (ranges, address_size);
3468
 
3469
          ranges += address_size;
3470
 
3471
          length  = byte_get (ranges, address_size);
3472
 
3473
          ranges += address_size;
3474
 
3475
          printf ("    ");
3476
          print_dwarf_vma (address, address_size);
3477
          print_dwarf_vma (length, address_size);
3478
          putchar ('\n');
3479
        }
3480
    }
3481
 
3482
  printf ("\n");
3483
 
3484
  return 1;
3485
}
3486
 
3487
/* Each debug_information[x].range_lists[y] gets this representation for
3488
   sorting purposes.  */
3489
 
3490
struct range_entry
3491
  {
3492
    /* The debug_information[x].range_lists[y] value.  */
3493
    unsigned long ranges_offset;
3494
 
3495
    /* Original debug_information to find parameters of the data.  */
3496
    debug_info *debug_info_p;
3497
  };
3498
 
3499
/* Sort struct range_entry in ascending order of its RANGES_OFFSET.  */
3500
 
3501
static int
3502
range_entry_compar (const void *ap, const void *bp)
3503
{
3504
  const struct range_entry *a_re = (const struct range_entry *) ap;
3505
  const struct range_entry *b_re = (const struct range_entry *) bp;
3506
  const unsigned long a = a_re->ranges_offset;
3507
  const unsigned long b = b_re->ranges_offset;
3508
 
3509
  return (a > b) - (b > a);
3510
}
3511
 
3512
static int
3513
display_debug_ranges (struct dwarf_section *section,
3514
                      void *file ATTRIBUTE_UNUSED)
3515
{
3516
  unsigned char *start = section->start;
3517
  unsigned char *section_end;
3518
  unsigned long bytes;
3519
  unsigned char *section_begin = start;
3520
  unsigned int num_range_list, i;
3521
  struct range_entry *range_entries, *range_entry_fill;
3522
 
3523
  bytes = section->size;
3524
  section_end = start + bytes;
3525
 
3526
  if (bytes == 0)
3527
    {
3528
      printf (_("\nThe %s section is empty.\n"), section->name);
3529
      return 0;
3530
    }
3531
 
3532
  if (load_debug_info (file) == 0)
3533
    {
3534
      warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
3535
            section->name);
3536
      return 0;
3537
    }
3538
 
3539
  num_range_list = 0;
3540
  for (i = 0; i < num_debug_info_entries; i++)
3541
    num_range_list += debug_information [i].num_range_lists;
3542
 
3543
  if (num_range_list == 0)
3544
    error (_("No range lists in .debug_info section!\n"));
3545
 
3546
  range_entries = (struct range_entry *)
3547
      xmalloc (sizeof (*range_entries) * num_range_list);
3548
  range_entry_fill = range_entries;
3549
 
3550
  for (i = 0; i < num_debug_info_entries; i++)
3551
    {
3552
      debug_info *debug_info_p = &debug_information[i];
3553
      unsigned int j;
3554
 
3555
      for (j = 0; j < debug_info_p->num_range_lists; j++)
3556
        {
3557
          range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
3558
          range_entry_fill->debug_info_p = debug_info_p;
3559
          range_entry_fill++;
3560
        }
3561
    }
3562
 
3563
  qsort (range_entries, num_range_list, sizeof (*range_entries),
3564
         range_entry_compar);
3565
 
3566
  /* DWARF sections under Mach-O have non-zero addresses.  */
3567
  if (range_entries[0].ranges_offset != section->address)
3568
    warn (_("Range lists in %s section start at 0x%lx\n"),
3569
          section->name, range_entries[0].ranges_offset);
3570
 
3571
  printf (_("Contents of the %s section:\n\n"), section->name);
3572
  printf (_("    Offset   Begin    End\n"));
3573
 
3574
  for (i = 0; i < num_range_list; i++)
3575
    {
3576
      struct range_entry *range_entry = &range_entries[i];
3577
      debug_info *debug_info_p = range_entry->debug_info_p;
3578
      unsigned int pointer_size;
3579
      unsigned long offset;
3580
      unsigned char *next;
3581
      unsigned long base_address;
3582
 
3583
      pointer_size = debug_info_p->pointer_size;
3584
 
3585
      /* DWARF sections under Mach-O have non-zero addresses.  */
3586
      offset = range_entry->ranges_offset - section->address;
3587
      next = section_begin + offset;
3588
      base_address = debug_info_p->base_address;
3589
 
3590
      if (i > 0)
3591
        {
3592
          if (start < next)
3593
            warn (_("There is a hole [0x%lx - 0x%lx] in %s section.\n"),
3594
                  (unsigned long) (start - section_begin),
3595
                  (unsigned long) (next - section_begin), section->name);
3596
          else if (start > next)
3597
            warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"),
3598
                  (unsigned long) (start - section_begin),
3599
                  (unsigned long) (next - section_begin), section->name);
3600
        }
3601
      start = next;
3602
 
3603
      while (1)
3604
        {
3605
          dwarf_vma begin;
3606
          dwarf_vma end;
3607
 
3608
          /* Note: we use sign extension here in order to be sure that
3609
             we can detect the -1 escape value.  Sign extension into the
3610
             top 32 bits of a 32-bit address will not affect the values
3611
             that we display since we always show hex values, and always
3612
             the bottom 32-bits.  */
3613
          begin = byte_get_signed (start, pointer_size);
3614
          start += pointer_size;
3615
          end = byte_get_signed (start, pointer_size);
3616
          start += pointer_size;
3617
 
3618
          printf ("    %8.8lx ", offset);
3619
 
3620
          if (begin == 0 && end == 0)
3621
            {
3622
              printf (_("<End of list>\n"));
3623
              break;
3624
            }
3625
 
3626
          /* Check base address specifiers.  */
3627
          if (begin == (dwarf_vma) -1 && end != (dwarf_vma) -1)
3628
            {
3629
              base_address = end;
3630
              print_dwarf_vma (begin, pointer_size);
3631
              print_dwarf_vma (end, pointer_size);
3632
              printf ("(base address)\n");
3633
              continue;
3634
            }
3635
 
3636
          print_dwarf_vma (begin + base_address, pointer_size);
3637
          print_dwarf_vma (end + base_address, pointer_size);
3638
 
3639
          if (begin == end)
3640
            fputs (_("(start == end)"), stdout);
3641
          else if (begin > end)
3642
            fputs (_("(start > end)"), stdout);
3643
 
3644
          putchar ('\n');
3645
        }
3646
    }
3647
  putchar ('\n');
3648
 
3649
  free (range_entries);
3650
 
3651
  return 1;
3652
}
3653
 
3654
typedef struct Frame_Chunk
3655
{
3656
  struct Frame_Chunk *next;
3657
  unsigned char *chunk_start;
3658
  int ncols;
3659
  /* DW_CFA_{undefined,same_value,offset,register,unreferenced}  */
3660
  short int *col_type;
3661
  int *col_offset;
3662
  char *augmentation;
3663
  unsigned int code_factor;
3664
  int data_factor;
3665
  unsigned long pc_begin;
3666
  unsigned long pc_range;
3667
  int cfa_reg;
3668
  int cfa_offset;
3669
  int ra;
3670
  unsigned char fde_encoding;
3671
  unsigned char cfa_exp;
3672
}
3673
Frame_Chunk;
3674
 
3675
static const char *const *dwarf_regnames;
3676
static unsigned int dwarf_regnames_count;
3677
 
3678
/* A marker for a col_type that means this column was never referenced
3679
   in the frame info.  */
3680
#define DW_CFA_unreferenced (-1)
3681
 
3682
/* Return 0 if not more space is needed, 1 if more space is needed,
3683
   -1 for invalid reg.  */
3684
 
3685
static int
3686
frame_need_space (Frame_Chunk *fc, unsigned int reg)
3687
{
3688
  int prev = fc->ncols;
3689
 
3690
  if (reg < (unsigned int) fc->ncols)
3691
    return 0;
3692
 
3693
  if (dwarf_regnames_count
3694
      && reg > dwarf_regnames_count)
3695
    return -1;
3696
 
3697
  fc->ncols = reg + 1;
3698
  fc->col_type = (short int *) xcrealloc (fc->col_type, fc->ncols,
3699
                                          sizeof (short int));
3700
  fc->col_offset = (int *) xcrealloc (fc->col_offset, fc->ncols, sizeof (int));
3701
 
3702
  while (prev < fc->ncols)
3703
    {
3704
      fc->col_type[prev] = DW_CFA_unreferenced;
3705
      fc->col_offset[prev] = 0;
3706
      prev++;
3707
    }
3708
  return 1;
3709
}
3710
 
3711
static const char *const dwarf_regnames_i386[] =
3712
{
3713
  "eax", "ecx", "edx", "ebx",
3714
  "esp", "ebp", "esi", "edi",
3715
  "eip", "eflags", NULL,
3716
  "st0", "st1", "st2", "st3",
3717
  "st4", "st5", "st6", "st7",
3718
  NULL, NULL,
3719
  "xmm0", "xmm1", "xmm2", "xmm3",
3720
  "xmm4", "xmm5", "xmm6", "xmm7",
3721
  "mm0", "mm1", "mm2", "mm3",
3722
  "mm4", "mm5", "mm6", "mm7",
3723
  "fcw", "fsw", "mxcsr",
3724
  "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
3725
  "tr", "ldtr"
3726
};
3727
 
3728
static const char *const dwarf_regnames_x86_64[] =
3729
{
3730
  "rax", "rdx", "rcx", "rbx",
3731
  "rsi", "rdi", "rbp", "rsp",
3732
  "r8",  "r9",  "r10", "r11",
3733
  "r12", "r13", "r14", "r15",
3734
  "rip",
3735
  "xmm0",  "xmm1",  "xmm2",  "xmm3",
3736
  "xmm4",  "xmm5",  "xmm6",  "xmm7",
3737
  "xmm8",  "xmm9",  "xmm10", "xmm11",
3738
  "xmm12", "xmm13", "xmm14", "xmm15",
3739
  "st0", "st1", "st2", "st3",
3740
  "st4", "st5", "st6", "st7",
3741
  "mm0", "mm1", "mm2", "mm3",
3742
  "mm4", "mm5", "mm6", "mm7",
3743
  "rflags",
3744
  "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
3745
  "fs.base", "gs.base", NULL, NULL,
3746
  "tr", "ldtr",
3747
  "mxcsr", "fcw", "fsw"
3748
};
3749
 
3750
void
3751
init_dwarf_regnames (unsigned int e_machine)
3752
{
3753
  switch (e_machine)
3754
    {
3755
    case EM_386:
3756
    case EM_486:
3757
      dwarf_regnames = dwarf_regnames_i386;
3758
      dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
3759
      break;
3760
 
3761
    case EM_X86_64:
3762
      dwarf_regnames = dwarf_regnames_x86_64;
3763
      dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
3764
      break;
3765
 
3766
    default:
3767
      break;
3768
    }
3769
}
3770
 
3771
static const char *
3772
regname (unsigned int regno, int row)
3773
{
3774
  static char reg[64];
3775
  if (dwarf_regnames
3776
      && regno < dwarf_regnames_count
3777
      && dwarf_regnames [regno] != NULL)
3778
    {
3779
      if (row)
3780
        return dwarf_regnames [regno];
3781
      snprintf (reg, sizeof (reg), "r%d (%s)", regno,
3782
                dwarf_regnames [regno]);
3783
    }
3784
  else
3785
    snprintf (reg, sizeof (reg), "r%d", regno);
3786
  return reg;
3787
}
3788
 
3789
static void
3790
frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
3791
{
3792
  int r;
3793
  char tmp[100];
3794
 
3795
  if (*max_regs < fc->ncols)
3796
    *max_regs = fc->ncols;
3797
 
3798
  if (*need_col_headers)
3799
    {
3800
      static const char *loc = "   LOC";
3801
 
3802
      *need_col_headers = 0;
3803
 
3804
      printf ("%-*s CFA      ", eh_addr_size * 2, loc);
3805
 
3806
      for (r = 0; r < *max_regs; r++)
3807
        if (fc->col_type[r] != DW_CFA_unreferenced)
3808
          {
3809
            if (r == fc->ra)
3810
              printf ("ra      ");
3811
            else
3812
              printf ("%-5s ", regname (r, 1));
3813
          }
3814
 
3815
      printf ("\n");
3816
    }
3817
 
3818
  printf ("%0*lx ", eh_addr_size * 2, fc->pc_begin);
3819
  if (fc->cfa_exp)
3820
    strcpy (tmp, "exp");
3821
  else
3822
    sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), fc->cfa_offset);
3823
  printf ("%-8s ", tmp);
3824
 
3825
  for (r = 0; r < fc->ncols; r++)
3826
    {
3827
      if (fc->col_type[r] != DW_CFA_unreferenced)
3828
        {
3829
          switch (fc->col_type[r])
3830
            {
3831
            case DW_CFA_undefined:
3832
              strcpy (tmp, "u");
3833
              break;
3834
            case DW_CFA_same_value:
3835
              strcpy (tmp, "s");
3836
              break;
3837
            case DW_CFA_offset:
3838
              sprintf (tmp, "c%+d", fc->col_offset[r]);
3839
              break;
3840
            case DW_CFA_val_offset:
3841
              sprintf (tmp, "v%+d", fc->col_offset[r]);
3842
              break;
3843
            case DW_CFA_register:
3844
              sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
3845
              break;
3846
            case DW_CFA_expression:
3847
              strcpy (tmp, "exp");
3848
              break;
3849
            case DW_CFA_val_expression:
3850
              strcpy (tmp, "vexp");
3851
              break;
3852
            default:
3853
              strcpy (tmp, "n/a");
3854
              break;
3855
            }
3856
          printf ("%-5s ", tmp);
3857
        }
3858
    }
3859
  printf ("\n");
3860
}
3861
 
3862
#define GET(N)  byte_get (start, N); start += N
3863
#define LEB()   read_leb128 (start, & length_return, 0); start += length_return
3864
#define SLEB()  read_leb128 (start, & length_return, 1); start += length_return
3865
 
3866
static int
3867
display_debug_frames (struct dwarf_section *section,
3868
                      void *file ATTRIBUTE_UNUSED)
3869
{
3870
  unsigned char *start = section->start;
3871
  unsigned char *end = start + section->size;
3872
  unsigned char *section_start = start;
3873
  Frame_Chunk *chunks = 0;
3874
  Frame_Chunk *remembered_state = 0;
3875
  Frame_Chunk *rs;
3876
  int is_eh = strcmp (section->name, ".eh_frame") == 0;
3877
  unsigned int length_return;
3878
  int max_regs = 0;
3879
  const char *bad_reg = _("bad register: ");
3880
 
3881
  printf (_("Contents of the %s section:\n"), section->name);
3882
 
3883
  while (start < end)
3884
    {
3885
      unsigned char *saved_start;
3886
      unsigned char *block_end;
3887
      unsigned long length;
3888
      unsigned long cie_id;
3889
      Frame_Chunk *fc;
3890
      Frame_Chunk *cie;
3891
      int need_col_headers = 1;
3892
      unsigned char *augmentation_data = NULL;
3893
      unsigned long augmentation_data_len = 0;
3894
      int encoded_ptr_size = eh_addr_size;
3895
      int offset_size;
3896
      int initial_length_size;
3897
 
3898
      saved_start = start;
3899
      length = byte_get (start, 4); start += 4;
3900
 
3901
      if (length == 0)
3902
        {
3903
          printf ("\n%08lx ZERO terminator\n\n",
3904
                    (unsigned long)(saved_start - section_start));
3905
          continue;
3906
        }
3907
 
3908
      if (length == 0xffffffff)
3909
        {
3910
          length = byte_get (start, 8);
3911
          start += 8;
3912
          offset_size = 8;
3913
          initial_length_size = 12;
3914
        }
3915
      else
3916
        {
3917
          offset_size = 4;
3918
          initial_length_size = 4;
3919
        }
3920
 
3921
      block_end = saved_start + length + initial_length_size;
3922
      if (block_end > end)
3923
        {
3924
          warn ("Invalid length %#08lx in FDE at %#08lx\n",
3925
                length, (unsigned long)(saved_start - section_start));
3926
          block_end = end;
3927
        }
3928
      cie_id = byte_get (start, offset_size); start += offset_size;
3929
 
3930
      if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
3931
        {
3932
          int version;
3933
 
3934
          fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
3935
          memset (fc, 0, sizeof (Frame_Chunk));
3936
 
3937
          fc->next = chunks;
3938
          chunks = fc;
3939
          fc->chunk_start = saved_start;
3940
          fc->ncols = 0;
3941
          fc->col_type = (short int *) xmalloc (sizeof (short int));
3942
          fc->col_offset = (int *) xmalloc (sizeof (int));
3943
          frame_need_space (fc, max_regs - 1);
3944
 
3945
          version = *start++;
3946
 
3947
          fc->augmentation = (char *) start;
3948
          start = (unsigned char *) strchr ((char *) start, '\0') + 1;
3949
 
3950
          if (fc->augmentation[0] == 'z')
3951
            {
3952
              fc->code_factor = LEB ();
3953
              fc->data_factor = SLEB ();
3954
              if (version == 1)
3955
                {
3956
                  fc->ra = GET (1);
3957
                }
3958
              else
3959
                {
3960
                  fc->ra = LEB ();
3961
                }
3962
              augmentation_data_len = LEB ();
3963
              augmentation_data = start;
3964
              start += augmentation_data_len;
3965
            }
3966
          else if (strcmp (fc->augmentation, "eh") == 0)
3967
            {
3968
              start += eh_addr_size;
3969
              fc->code_factor = LEB ();
3970
              fc->data_factor = SLEB ();
3971
              if (version == 1)
3972
                {
3973
                  fc->ra = GET (1);
3974
                }
3975
              else
3976
                {
3977
                  fc->ra = LEB ();
3978
                }
3979
            }
3980
          else
3981
            {
3982
              fc->code_factor = LEB ();
3983
              fc->data_factor = SLEB ();
3984
              if (version == 1)
3985
                {
3986
                  fc->ra = GET (1);
3987
                }
3988
              else
3989
                {
3990
                  fc->ra = LEB ();
3991
                }
3992
            }
3993
          cie = fc;
3994
 
3995
          if (do_debug_frames_interp)
3996
            printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
3997
                    (unsigned long)(saved_start - section_start), length, cie_id,
3998
                    fc->augmentation, fc->code_factor, fc->data_factor,
3999
                    fc->ra);
4000
          else
4001
            {
4002
              printf ("\n%08lx %08lx %08lx CIE\n",
4003
                      (unsigned long)(saved_start - section_start), length, cie_id);
4004
              printf ("  Version:               %d\n", version);
4005
              printf ("  Augmentation:          \"%s\"\n", fc->augmentation);
4006
              printf ("  Code alignment factor: %u\n", fc->code_factor);
4007
              printf ("  Data alignment factor: %d\n", fc->data_factor);
4008
              printf ("  Return address column: %d\n", fc->ra);
4009
 
4010
              if (augmentation_data_len)
4011
                {
4012
                  unsigned long i;
4013
                  printf ("  Augmentation data:    ");
4014
                  for (i = 0; i < augmentation_data_len; ++i)
4015
                    printf (" %02x", augmentation_data[i]);
4016
                  putchar ('\n');
4017
                }
4018
              putchar ('\n');
4019
            }
4020
 
4021
          if (augmentation_data_len)
4022
            {
4023
              unsigned char *p, *q;
4024
              p = (unsigned char *) fc->augmentation + 1;
4025
              q = augmentation_data;
4026
 
4027
              while (1)
4028
                {
4029
                  if (*p == 'L')
4030
                    q++;
4031
                  else if (*p == 'P')
4032
                    q += 1 + size_of_encoded_value (*q);
4033
                  else if (*p == 'R')
4034
                    fc->fde_encoding = *q++;
4035
                  else
4036
                    break;
4037
                  p++;
4038
                }
4039
 
4040
              if (fc->fde_encoding)
4041
                encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
4042
            }
4043
 
4044
          frame_need_space (fc, fc->ra);
4045
        }
4046
      else
4047
        {
4048
          unsigned char *look_for;
4049
          static Frame_Chunk fde_fc;
4050
 
4051
          fc = & fde_fc;
4052
          memset (fc, 0, sizeof (Frame_Chunk));
4053
 
4054
          look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
4055
 
4056
          for (cie = chunks; cie ; cie = cie->next)
4057
            if (cie->chunk_start == look_for)
4058
              break;
4059
 
4060
          if (!cie)
4061
            {
4062
              warn ("Invalid CIE pointer %#08lx in FDE at %#08lx\n",
4063
                    cie_id, (unsigned long)(saved_start - section_start));
4064
              fc->ncols = 0;
4065
              fc->col_type = (short int *) xmalloc (sizeof (short int));
4066
              fc->col_offset = (int *) xmalloc (sizeof (int));
4067
              frame_need_space (fc, max_regs - 1);
4068
              cie = fc;
4069
              fc->augmentation = "";
4070
              fc->fde_encoding = 0;
4071
            }
4072
          else
4073
            {
4074
              fc->ncols = cie->ncols;
4075
              fc->col_type = (short int *) xcmalloc (fc->ncols, sizeof (short int));
4076
              fc->col_offset =  (int *) xcmalloc (fc->ncols, sizeof (int));
4077
              memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
4078
              memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
4079
              fc->augmentation = cie->augmentation;
4080
              fc->code_factor = cie->code_factor;
4081
              fc->data_factor = cie->data_factor;
4082
              fc->cfa_reg = cie->cfa_reg;
4083
              fc->cfa_offset = cie->cfa_offset;
4084
              fc->ra = cie->ra;
4085
              frame_need_space (fc, max_regs - 1);
4086
              fc->fde_encoding = cie->fde_encoding;
4087
            }
4088
 
4089
          if (fc->fde_encoding)
4090
            encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
4091
 
4092
          fc->pc_begin = get_encoded_value (start, fc->fde_encoding);
4093
          if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
4094
            fc->pc_begin += section->address + (start - section_start);
4095
          start += encoded_ptr_size;
4096
          fc->pc_range = byte_get (start, encoded_ptr_size);
4097
          start += encoded_ptr_size;
4098
 
4099
          if (cie->augmentation[0] == 'z')
4100
            {
4101
              augmentation_data_len = LEB ();
4102
              augmentation_data = start;
4103
              start += augmentation_data_len;
4104
            }
4105
 
4106
          printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
4107
                  (unsigned long)(saved_start - section_start), length, cie_id,
4108
                  (unsigned long)(cie->chunk_start - section_start),
4109
                  fc->pc_begin, fc->pc_begin + fc->pc_range);
4110
          if (! do_debug_frames_interp && augmentation_data_len)
4111
            {
4112
              unsigned long i;
4113
 
4114
              printf ("  Augmentation data:    ");
4115
              for (i = 0; i < augmentation_data_len; ++i)
4116
                printf (" %02x", augmentation_data[i]);
4117
              putchar ('\n');
4118
              putchar ('\n');
4119
            }
4120
        }
4121
 
4122
      /* At this point, fc is the current chunk, cie (if any) is set, and
4123
         we're about to interpret instructions for the chunk.  */
4124
      /* ??? At present we need to do this always, since this sizes the
4125
         fc->col_type and fc->col_offset arrays, which we write into always.
4126
         We should probably split the interpreted and non-interpreted bits
4127
         into two different routines, since there's so much that doesn't
4128
         really overlap between them.  */
4129
      if (1 || do_debug_frames_interp)
4130
        {
4131
          /* Start by making a pass over the chunk, allocating storage
4132
             and taking note of what registers are used.  */
4133
          unsigned char *tmp = start;
4134
 
4135
          while (start < block_end)
4136
            {
4137
              unsigned op, opa;
4138
              unsigned long reg, tmp;
4139
 
4140
              op = *start++;
4141
              opa = op & 0x3f;
4142
              if (op & 0xc0)
4143
                op &= 0xc0;
4144
 
4145
              /* Warning: if you add any more cases to this switch, be
4146
                 sure to add them to the corresponding switch below.  */
4147
              switch (op)
4148
                {
4149
                case DW_CFA_advance_loc:
4150
                  break;
4151
                case DW_CFA_offset:
4152
                  LEB ();
4153
                  if (frame_need_space (fc, opa) >= 0)
4154
                    fc->col_type[opa] = DW_CFA_undefined;
4155
                  break;
4156
                case DW_CFA_restore:
4157
                  if (frame_need_space (fc, opa) >= 0)
4158
                    fc->col_type[opa] = DW_CFA_undefined;
4159
                  break;
4160
                case DW_CFA_set_loc:
4161
                  start += encoded_ptr_size;
4162
                  break;
4163
                case DW_CFA_advance_loc1:
4164
                  start += 1;
4165
                  break;
4166
                case DW_CFA_advance_loc2:
4167
                  start += 2;
4168
                  break;
4169
                case DW_CFA_advance_loc4:
4170
                  start += 4;
4171
                  break;
4172
                case DW_CFA_offset_extended:
4173
                case DW_CFA_val_offset:
4174
                  reg = LEB (); LEB ();
4175
                  if (frame_need_space (fc, reg) >= 0)
4176
                    fc->col_type[reg] = DW_CFA_undefined;
4177
                  break;
4178
                case DW_CFA_restore_extended:
4179
                  reg = LEB ();
4180
                  frame_need_space (fc, reg);
4181
                  if (frame_need_space (fc, reg) >= 0)
4182
                    fc->col_type[reg] = DW_CFA_undefined;
4183
                  break;
4184
                case DW_CFA_undefined:
4185
                  reg = LEB ();
4186
                  if (frame_need_space (fc, reg) >= 0)
4187
                    fc->col_type[reg] = DW_CFA_undefined;
4188
                  break;
4189
                case DW_CFA_same_value:
4190
                  reg = LEB ();
4191
                  if (frame_need_space (fc, reg) >= 0)
4192
                    fc->col_type[reg] = DW_CFA_undefined;
4193
                  break;
4194
                case DW_CFA_register:
4195
                  reg = LEB (); LEB ();
4196
                  if (frame_need_space (fc, reg) >= 0)
4197
                    fc->col_type[reg] = DW_CFA_undefined;
4198
                  break;
4199
                case DW_CFA_def_cfa:
4200
                  LEB (); LEB ();
4201
                  break;
4202
                case DW_CFA_def_cfa_register:
4203
                  LEB ();
4204
                  break;
4205
                case DW_CFA_def_cfa_offset:
4206
                  LEB ();
4207
                  break;
4208
                case DW_CFA_def_cfa_expression:
4209
                  tmp = LEB ();
4210
                  start += tmp;
4211
                  break;
4212
                case DW_CFA_expression:
4213
                case DW_CFA_val_expression:
4214
                  reg = LEB ();
4215
                  tmp = LEB ();
4216
                  start += tmp;
4217
                  if (frame_need_space (fc, reg) >= 0)
4218
                    fc->col_type[reg] = DW_CFA_undefined;
4219
                  break;
4220
                case DW_CFA_offset_extended_sf:
4221
                case DW_CFA_val_offset_sf:
4222
                  reg = LEB (); SLEB ();
4223
                  if (frame_need_space (fc, reg) >= 0)
4224
                    fc->col_type[reg] = DW_CFA_undefined;
4225
                  break;
4226
                case DW_CFA_def_cfa_sf:
4227
                  LEB (); SLEB ();
4228
                  break;
4229
                case DW_CFA_def_cfa_offset_sf:
4230
                  SLEB ();
4231
                  break;
4232
                case DW_CFA_MIPS_advance_loc8:
4233
                  start += 8;
4234
                  break;
4235
                case DW_CFA_GNU_args_size:
4236
                  LEB ();
4237
                  break;
4238
                case DW_CFA_GNU_negative_offset_extended:
4239
                  reg = LEB (); LEB ();
4240
                  if (frame_need_space (fc, reg) >= 0)
4241
                    fc->col_type[reg] = DW_CFA_undefined;
4242
                  break;
4243
                default:
4244
                  break;
4245
                }
4246
            }
4247
          start = tmp;
4248
        }
4249
 
4250
      /* Now we know what registers are used, make a second pass over
4251
         the chunk, this time actually printing out the info.  */
4252
 
4253
      while (start < block_end)
4254
        {
4255
          unsigned op, opa;
4256
          unsigned long ul, reg, roffs;
4257
          long l, ofs;
4258
          dwarf_vma vma;
4259
          const char *reg_prefix = "";
4260
 
4261
          op = *start++;
4262
          opa = op & 0x3f;
4263
          if (op & 0xc0)
4264
            op &= 0xc0;
4265
 
4266
          /* Warning: if you add any more cases to this switch, be
4267
             sure to add them to the corresponding switch above.  */
4268
          switch (op)
4269
            {
4270
            case DW_CFA_advance_loc:
4271
              if (do_debug_frames_interp)
4272
                frame_display_row (fc, &need_col_headers, &max_regs);
4273
              else
4274
                printf ("  DW_CFA_advance_loc: %d to %08lx\n",
4275
                        opa * fc->code_factor,
4276
                        fc->pc_begin + opa * fc->code_factor);
4277
              fc->pc_begin += opa * fc->code_factor;
4278
              break;
4279
 
4280
            case DW_CFA_offset:
4281
              roffs = LEB ();
4282
              if (opa >= (unsigned int) fc->ncols)
4283
                reg_prefix = bad_reg;
4284
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4285
                printf ("  DW_CFA_offset: %s%s at cfa%+ld\n",
4286
                        reg_prefix, regname (opa, 0),
4287
                        roffs * fc->data_factor);
4288
              if (*reg_prefix == '\0')
4289
                {
4290
                  fc->col_type[opa] = DW_CFA_offset;
4291
                  fc->col_offset[opa] = roffs * fc->data_factor;
4292
                }
4293
              break;
4294
 
4295
            case DW_CFA_restore:
4296
              if (opa >= (unsigned int) cie->ncols
4297
                  || opa >= (unsigned int) fc->ncols)
4298
                reg_prefix = bad_reg;
4299
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4300
                printf ("  DW_CFA_restore: %s%s\n",
4301
                        reg_prefix, regname (opa, 0));
4302
              if (*reg_prefix == '\0')
4303
                {
4304
                  fc->col_type[opa] = cie->col_type[opa];
4305
                  fc->col_offset[opa] = cie->col_offset[opa];
4306
                }
4307
              break;
4308
 
4309
            case DW_CFA_set_loc:
4310
              vma = get_encoded_value (start, fc->fde_encoding);
4311
              if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
4312
                vma += section->address + (start - section_start);
4313
              start += encoded_ptr_size;
4314
              if (do_debug_frames_interp)
4315
                frame_display_row (fc, &need_col_headers, &max_regs);
4316
              else
4317
                printf ("  DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
4318
              fc->pc_begin = vma;
4319
              break;
4320
 
4321
            case DW_CFA_advance_loc1:
4322
              ofs = byte_get (start, 1); start += 1;
4323
              if (do_debug_frames_interp)
4324
                frame_display_row (fc, &need_col_headers, &max_regs);
4325
              else
4326
                printf ("  DW_CFA_advance_loc1: %ld to %08lx\n",
4327
                        ofs * fc->code_factor,
4328
                        fc->pc_begin + ofs * fc->code_factor);
4329
              fc->pc_begin += ofs * fc->code_factor;
4330
              break;
4331
 
4332
            case DW_CFA_advance_loc2:
4333
              ofs = byte_get (start, 2); start += 2;
4334
              if (do_debug_frames_interp)
4335
                frame_display_row (fc, &need_col_headers, &max_regs);
4336
              else
4337
                printf ("  DW_CFA_advance_loc2: %ld to %08lx\n",
4338
                        ofs * fc->code_factor,
4339
                        fc->pc_begin + ofs * fc->code_factor);
4340
              fc->pc_begin += ofs * fc->code_factor;
4341
              break;
4342
 
4343
            case DW_CFA_advance_loc4:
4344
              ofs = byte_get (start, 4); start += 4;
4345
              if (do_debug_frames_interp)
4346
                frame_display_row (fc, &need_col_headers, &max_regs);
4347
              else
4348
                printf ("  DW_CFA_advance_loc4: %ld to %08lx\n",
4349
                        ofs * fc->code_factor,
4350
                        fc->pc_begin + ofs * fc->code_factor);
4351
              fc->pc_begin += ofs * fc->code_factor;
4352
              break;
4353
 
4354
            case DW_CFA_offset_extended:
4355
              reg = LEB ();
4356
              roffs = LEB ();
4357
              if (reg >= (unsigned int) fc->ncols)
4358
                reg_prefix = bad_reg;
4359
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4360
                printf ("  DW_CFA_offset_extended: %s%s at cfa%+ld\n",
4361
                        reg_prefix, regname (reg, 0),
4362
                        roffs * fc->data_factor);
4363
              if (*reg_prefix == '\0')
4364
                {
4365
                  fc->col_type[reg] = DW_CFA_offset;
4366
                  fc->col_offset[reg] = roffs * fc->data_factor;
4367
                }
4368
              break;
4369
 
4370
            case DW_CFA_val_offset:
4371
              reg = LEB ();
4372
              roffs = LEB ();
4373
              if (reg >= (unsigned int) fc->ncols)
4374
                reg_prefix = bad_reg;
4375
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4376
                printf ("  DW_CFA_val_offset: %s%s at cfa%+ld\n",
4377
                        reg_prefix, regname (reg, 0),
4378
                        roffs * fc->data_factor);
4379
              if (*reg_prefix == '\0')
4380
                {
4381
                  fc->col_type[reg] = DW_CFA_val_offset;
4382
                  fc->col_offset[reg] = roffs * fc->data_factor;
4383
                }
4384
              break;
4385
 
4386
            case DW_CFA_restore_extended:
4387
              reg = LEB ();
4388
              if (reg >= (unsigned int) cie->ncols
4389
                  || reg >= (unsigned int) fc->ncols)
4390
                reg_prefix = bad_reg;
4391
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4392
                printf ("  DW_CFA_restore_extended: %s%s\n",
4393
                        reg_prefix, regname (reg, 0));
4394
              if (*reg_prefix == '\0')
4395
                {
4396
                  fc->col_type[reg] = cie->col_type[reg];
4397
                  fc->col_offset[reg] = cie->col_offset[reg];
4398
                }
4399
              break;
4400
 
4401
            case DW_CFA_undefined:
4402
              reg = LEB ();
4403
              if (reg >= (unsigned int) fc->ncols)
4404
                reg_prefix = bad_reg;
4405
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4406
                printf ("  DW_CFA_undefined: %s%s\n",
4407
                        reg_prefix, regname (reg, 0));
4408
              if (*reg_prefix == '\0')
4409
                {
4410
                  fc->col_type[reg] = DW_CFA_undefined;
4411
                  fc->col_offset[reg] = 0;
4412
                }
4413
              break;
4414
 
4415
            case DW_CFA_same_value:
4416
              reg = LEB ();
4417
              if (reg >= (unsigned int) fc->ncols)
4418
                reg_prefix = bad_reg;
4419
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4420
                printf ("  DW_CFA_same_value: %s%s\n",
4421
                        reg_prefix, regname (reg, 0));
4422
              if (*reg_prefix == '\0')
4423
                {
4424
                  fc->col_type[reg] = DW_CFA_same_value;
4425
                  fc->col_offset[reg] = 0;
4426
                }
4427
              break;
4428
 
4429
            case DW_CFA_register:
4430
              reg = LEB ();
4431
              roffs = LEB ();
4432
              if (reg >= (unsigned int) fc->ncols)
4433
                reg_prefix = bad_reg;
4434
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4435
                {
4436
                  printf ("  DW_CFA_register: %s%s in ",
4437
                          reg_prefix, regname (reg, 0));
4438
                  puts (regname (roffs, 0));
4439
                }
4440
              if (*reg_prefix == '\0')
4441
                {
4442
                  fc->col_type[reg] = DW_CFA_register;
4443
                  fc->col_offset[reg] = roffs;
4444
                }
4445
              break;
4446
 
4447
            case DW_CFA_remember_state:
4448
              if (! do_debug_frames_interp)
4449
                printf ("  DW_CFA_remember_state\n");
4450
              rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
4451
              rs->ncols = fc->ncols;
4452
              rs->col_type = (short int *) xcmalloc (rs->ncols,
4453
                                                     sizeof (short int));
4454
              rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (int));
4455
              memcpy (rs->col_type, fc->col_type, rs->ncols);
4456
              memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
4457
              rs->next = remembered_state;
4458
              remembered_state = rs;
4459
              break;
4460
 
4461
            case DW_CFA_restore_state:
4462
              if (! do_debug_frames_interp)
4463
                printf ("  DW_CFA_restore_state\n");
4464
              rs = remembered_state;
4465
              if (rs)
4466
                {
4467
                  remembered_state = rs->next;
4468
                  frame_need_space (fc, rs->ncols - 1);
4469
                  memcpy (fc->col_type, rs->col_type, rs->ncols);
4470
                  memcpy (fc->col_offset, rs->col_offset,
4471
                          rs->ncols * sizeof (int));
4472
                  free (rs->col_type);
4473
                  free (rs->col_offset);
4474
                  free (rs);
4475
                }
4476
              else if (do_debug_frames_interp)
4477
                printf ("Mismatched DW_CFA_restore_state\n");
4478
              break;
4479
 
4480
            case DW_CFA_def_cfa:
4481
              fc->cfa_reg = LEB ();
4482
              fc->cfa_offset = LEB ();
4483
              fc->cfa_exp = 0;
4484
              if (! do_debug_frames_interp)
4485
                printf ("  DW_CFA_def_cfa: %s ofs %d\n",
4486
                        regname (fc->cfa_reg, 0), fc->cfa_offset);
4487
              break;
4488
 
4489
            case DW_CFA_def_cfa_register:
4490
              fc->cfa_reg = LEB ();
4491
              fc->cfa_exp = 0;
4492
              if (! do_debug_frames_interp)
4493
                printf ("  DW_CFA_def_cfa_register: %s\n",
4494
                        regname (fc->cfa_reg, 0));
4495
              break;
4496
 
4497
            case DW_CFA_def_cfa_offset:
4498
              fc->cfa_offset = LEB ();
4499
              if (! do_debug_frames_interp)
4500
                printf ("  DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
4501
              break;
4502
 
4503
            case DW_CFA_nop:
4504
              if (! do_debug_frames_interp)
4505
                printf ("  DW_CFA_nop\n");
4506
              break;
4507
 
4508
            case DW_CFA_def_cfa_expression:
4509
              ul = LEB ();
4510
              if (! do_debug_frames_interp)
4511
                {
4512
                  printf ("  DW_CFA_def_cfa_expression (");
4513
                  decode_location_expression (start, eh_addr_size, ul, 0,
4514
                                              section);
4515
                  printf (")\n");
4516
                }
4517
              fc->cfa_exp = 1;
4518
              start += ul;
4519
              break;
4520
 
4521
            case DW_CFA_expression:
4522
              reg = LEB ();
4523
              ul = LEB ();
4524
              if (reg >= (unsigned int) fc->ncols)
4525
                reg_prefix = bad_reg;
4526
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4527
                {
4528
                  printf ("  DW_CFA_expression: %s%s (",
4529
                          reg_prefix, regname (reg, 0));
4530
                  decode_location_expression (start, eh_addr_size,
4531
                                              ul, 0, section);
4532
                  printf (")\n");
4533
                }
4534
              if (*reg_prefix == '\0')
4535
                fc->col_type[reg] = DW_CFA_expression;
4536
              start += ul;
4537
              break;
4538
 
4539
            case DW_CFA_val_expression:
4540
              reg = LEB ();
4541
              ul = LEB ();
4542
              if (reg >= (unsigned int) fc->ncols)
4543
                reg_prefix = bad_reg;
4544
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4545
                {
4546
                  printf ("  DW_CFA_val_expression: %s%s (",
4547
                          reg_prefix, regname (reg, 0));
4548
                  decode_location_expression (start, eh_addr_size, ul, 0,
4549
                                              section);
4550
                  printf (")\n");
4551
                }
4552
              if (*reg_prefix == '\0')
4553
                fc->col_type[reg] = DW_CFA_val_expression;
4554
              start += ul;
4555
              break;
4556
 
4557
            case DW_CFA_offset_extended_sf:
4558
              reg = LEB ();
4559
              l = SLEB ();
4560
              if (frame_need_space (fc, reg) < 0)
4561
                reg_prefix = bad_reg;
4562
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4563
                printf ("  DW_CFA_offset_extended_sf: %s%s at cfa%+ld\n",
4564
                        reg_prefix, regname (reg, 0),
4565
                        l * fc->data_factor);
4566
              if (*reg_prefix == '\0')
4567
                {
4568
                  fc->col_type[reg] = DW_CFA_offset;
4569
                  fc->col_offset[reg] = l * fc->data_factor;
4570
                }
4571
              break;
4572
 
4573
            case DW_CFA_val_offset_sf:
4574
              reg = LEB ();
4575
              l = SLEB ();
4576
              if (frame_need_space (fc, reg) < 0)
4577
                reg_prefix = bad_reg;
4578
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4579
                printf ("  DW_CFA_val_offset_sf: %s%s at cfa%+ld\n",
4580
                        reg_prefix, regname (reg, 0),
4581
                        l * fc->data_factor);
4582
              if (*reg_prefix == '\0')
4583
                {
4584
                  fc->col_type[reg] = DW_CFA_val_offset;
4585
                  fc->col_offset[reg] = l * fc->data_factor;
4586
                }
4587
              break;
4588
 
4589
            case DW_CFA_def_cfa_sf:
4590
              fc->cfa_reg = LEB ();
4591
              fc->cfa_offset = SLEB ();
4592
              fc->cfa_offset = fc->cfa_offset * fc->data_factor;
4593
              fc->cfa_exp = 0;
4594
              if (! do_debug_frames_interp)
4595
                printf ("  DW_CFA_def_cfa_sf: %s ofs %d\n",
4596
                        regname (fc->cfa_reg, 0), fc->cfa_offset);
4597
              break;
4598
 
4599
            case DW_CFA_def_cfa_offset_sf:
4600
              fc->cfa_offset = SLEB ();
4601
              fc->cfa_offset = fc->cfa_offset * fc->data_factor;
4602
              if (! do_debug_frames_interp)
4603
                printf ("  DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
4604
              break;
4605
 
4606
            case DW_CFA_MIPS_advance_loc8:
4607
              ofs = byte_get (start, 8); start += 8;
4608
              if (do_debug_frames_interp)
4609
                frame_display_row (fc, &need_col_headers, &max_regs);
4610
              else
4611
                printf ("  DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
4612
                        ofs * fc->code_factor,
4613
                        fc->pc_begin + ofs * fc->code_factor);
4614
              fc->pc_begin += ofs * fc->code_factor;
4615
              break;
4616
 
4617
            case DW_CFA_GNU_window_save:
4618
              if (! do_debug_frames_interp)
4619
                printf ("  DW_CFA_GNU_window_save\n");
4620
              break;
4621
 
4622
            case DW_CFA_GNU_args_size:
4623
              ul = LEB ();
4624
              if (! do_debug_frames_interp)
4625
                printf ("  DW_CFA_GNU_args_size: %ld\n", ul);
4626
              break;
4627
 
4628
            case DW_CFA_GNU_negative_offset_extended:
4629
              reg = LEB ();
4630
              l = - LEB ();
4631
              if (frame_need_space (fc, reg) < 0)
4632
                reg_prefix = bad_reg;
4633
              if (! do_debug_frames_interp || *reg_prefix != '\0')
4634
                printf ("  DW_CFA_GNU_negative_offset_extended: %s%s at cfa%+ld\n",
4635
                        reg_prefix, regname (reg, 0),
4636
                        l * fc->data_factor);
4637
              if (*reg_prefix == '\0')
4638
                {
4639
                  fc->col_type[reg] = DW_CFA_offset;
4640
                  fc->col_offset[reg] = l * fc->data_factor;
4641
                }
4642
              break;
4643
 
4644
            default:
4645
              if (op >= DW_CFA_lo_user && op <= DW_CFA_hi_user)
4646
                printf (_("  DW_CFA_??? (User defined call frame op: %#x)\n"), op);
4647
              else
4648
                warn (_("unsupported or unknown Dwarf Call Frame Instruction number: %#x\n"), op);
4649
              start = block_end;
4650
            }
4651
        }
4652
 
4653
      if (do_debug_frames_interp)
4654
        frame_display_row (fc, &need_col_headers, &max_regs);
4655
 
4656
      start = block_end;
4657
    }
4658
 
4659
  printf ("\n");
4660
 
4661
  return 1;
4662
}
4663
 
4664
#undef GET
4665
#undef LEB
4666
#undef SLEB
4667
 
4668
static int
4669
display_debug_not_supported (struct dwarf_section *section,
4670
                             void *file ATTRIBUTE_UNUSED)
4671
{
4672
  printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
4673
            section->name);
4674
 
4675
  return 1;
4676
}
4677
 
4678
void *
4679
cmalloc (size_t nmemb, size_t size)
4680
{
4681
  /* Check for overflow.  */
4682
  if (nmemb >= ~(size_t) 0 / size)
4683
    return NULL;
4684
  else
4685
    return malloc (nmemb * size);
4686
}
4687
 
4688
void *
4689
xcmalloc (size_t nmemb, size_t size)
4690
{
4691
  /* Check for overflow.  */
4692
  if (nmemb >= ~(size_t) 0 / size)
4693
    return NULL;
4694
  else
4695
    return xmalloc (nmemb * size);
4696
}
4697
 
4698
void *
4699
xcrealloc (void *ptr, size_t nmemb, size_t size)
4700
{
4701
  /* Check for overflow.  */
4702
  if (nmemb >= ~(size_t) 0 / size)
4703
    return NULL;
4704
  else
4705
    return xrealloc (ptr, nmemb * size);
4706
}
4707
 
4708
void
4709
error (const char *message, ...)
4710
{
4711
  va_list args;
4712
 
4713
  va_start (args, message);
4714
  fprintf (stderr, _("%s: Error: "), program_name);
4715
  vfprintf (stderr, message, args);
4716
  va_end (args);
4717
}
4718
 
4719
void
4720
warn (const char *message, ...)
4721
{
4722
  va_list args;
4723
 
4724
  va_start (args, message);
4725
  fprintf (stderr, _("%s: Warning: "), program_name);
4726
  vfprintf (stderr, message, args);
4727
  va_end (args);
4728
}
4729
 
4730
void
4731
free_debug_memory (void)
4732
{
4733
  unsigned int i;
4734
 
4735
  free_abbrevs ();
4736
 
4737
  for (i = 0; i < max; i++)
4738
    free_debug_section ((enum dwarf_section_display_enum) i);
4739
 
4740
  if (debug_information != NULL)
4741
    {
4742
      if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE)
4743
        {
4744
          for (i = 0; i < num_debug_info_entries; i++)
4745
            {
4746
              if (!debug_information [i].max_loc_offsets)
4747
                {
4748
                  free (debug_information [i].loc_offsets);
4749
                  free (debug_information [i].have_frame_base);
4750
                }
4751
              if (!debug_information [i].max_range_lists)
4752
                free (debug_information [i].range_lists);
4753
            }
4754
        }
4755
 
4756
      free (debug_information);
4757
      debug_information = NULL;
4758
      num_debug_info_entries = 0;
4759
    }
4760
}
4761
 
4762
void
4763
dwarf_select_sections_by_names (const char *names)
4764
{
4765
  typedef struct
4766
  {
4767
    const char * option;
4768
    int *        variable;
4769
    int val;
4770
  }
4771
  debug_dump_long_opts;
4772
 
4773
  static const debug_dump_long_opts opts_table [] =
4774
    {
4775
      /* Please keep this table alpha- sorted.  */
4776
      { "Ranges", & do_debug_ranges, 1 },
4777
      { "abbrev", & do_debug_abbrevs, 1 },
4778
      { "aranges", & do_debug_aranges, 1 },
4779
      { "frames", & do_debug_frames, 1 },
4780
      { "frames-interp", & do_debug_frames_interp, 1 },
4781
      { "info", & do_debug_info, 1 },
4782
      { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility.  */
4783
      { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW },
4784
      { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED },
4785
      { "loc",  & do_debug_loc, 1 },
4786
      { "macro", & do_debug_macinfo, 1 },
4787
      { "pubnames", & do_debug_pubnames, 1 },
4788
      /* This entry is for compatability
4789
         with earlier versions of readelf.  */
4790
      { "ranges", & do_debug_aranges, 1 },
4791
      { "str", & do_debug_str, 1 },
4792
      { NULL, NULL, 0 }
4793
    };
4794
 
4795
  const char *p;
4796
 
4797
  p = names;
4798
  while (*p)
4799
    {
4800
      const debug_dump_long_opts * entry;
4801
 
4802
      for (entry = opts_table; entry->option; entry++)
4803
        {
4804
          size_t len = strlen (entry->option);
4805
 
4806
          if (strncmp (p, entry->option, len) == 0
4807
              && (p[len] == ',' || p[len] == '\0'))
4808
            {
4809
              * entry->variable |= entry->val;
4810
 
4811
              /* The --debug-dump=frames-interp option also
4812
                 enables the --debug-dump=frames option.  */
4813
              if (do_debug_frames_interp)
4814
                do_debug_frames = 1;
4815
 
4816
              p += len;
4817
              break;
4818
            }
4819
        }
4820
 
4821
      if (entry->option == NULL)
4822
        {
4823
          warn (_("Unrecognized debug option '%s'\n"), p);
4824
          p = strchr (p, ',');
4825
          if (p == NULL)
4826
            break;
4827
        }
4828
 
4829
      if (*p == ',')
4830
        p++;
4831
    }
4832
}
4833
 
4834
void
4835
dwarf_select_sections_by_letters (const char *letters)
4836
{
4837
  unsigned int index = 0;
4838
 
4839
  while (letters[index])
4840
    switch (letters[index++])
4841
      {
4842
      case 'i':
4843
        do_debug_info = 1;
4844
        break;
4845
 
4846
      case 'a':
4847
        do_debug_abbrevs = 1;
4848
        break;
4849
 
4850
      case 'l':
4851
        do_debug_lines |= FLAG_DEBUG_LINES_RAW;
4852
        break;
4853
 
4854
      case 'L':
4855
        do_debug_lines |= FLAG_DEBUG_LINES_DECODED;
4856
        break;
4857
 
4858
      case 'p':
4859
        do_debug_pubnames = 1;
4860
        break;
4861
 
4862
      case 'r':
4863
        do_debug_aranges = 1;
4864
        break;
4865
 
4866
      case 'R':
4867
        do_debug_ranges = 1;
4868
        break;
4869
 
4870
      case 'F':
4871
        do_debug_frames_interp = 1;
4872
      case 'f':
4873
        do_debug_frames = 1;
4874
        break;
4875
 
4876
      case 'm':
4877
        do_debug_macinfo = 1;
4878
        break;
4879
 
4880
      case 's':
4881
        do_debug_str = 1;
4882
        break;
4883
 
4884
      case 'o':
4885
        do_debug_loc = 1;
4886
        break;
4887
 
4888
      default:
4889
        warn (_("Unrecognized debug option '%s'\n"), optarg);
4890
        break;
4891
      }
4892
}
4893
 
4894
void
4895
dwarf_select_sections_all (void)
4896
{
4897
  do_debug_info = 1;
4898
  do_debug_abbrevs = 1;
4899
  do_debug_lines = FLAG_DEBUG_LINES_RAW;
4900
  do_debug_pubnames = 1;
4901
  do_debug_aranges = 1;
4902
  do_debug_ranges = 1;
4903
  do_debug_frames = 1;
4904
  do_debug_macinfo = 1;
4905
  do_debug_str = 1;
4906
  do_debug_loc = 1;
4907
}
4908
 
4909
struct dwarf_section_display debug_displays[] =
4910
{
4911
  { { ".debug_abbrev",          ".zdebug_abbrev",       NULL,   NULL,   0,       0 },
4912
    display_debug_abbrev,               &do_debug_abbrevs,      0 },
4913
  { { ".debug_aranges",         ".zdebug_aranges",      NULL,   NULL,   0,       0 },
4914
    display_debug_aranges,              &do_debug_aranges,      1 },
4915
  { { ".debug_frame",           ".zdebug_frame",        NULL,   NULL,   0,       0 },
4916
    display_debug_frames,               &do_debug_frames,       1 },
4917
  { { ".debug_info",            ".zdebug_info",         NULL,   NULL,   0,       0 },
4918
    display_debug_info,                 &do_debug_info,         1 },
4919
  { { ".debug_line",            ".zdebug_line",         NULL,   NULL,   0,       0 },
4920
    display_debug_lines,                &do_debug_lines,        1 },
4921
  { { ".debug_pubnames",        ".zdebug_pubnames",     NULL,   NULL,   0,       0 },
4922
    display_debug_pubnames,             &do_debug_pubnames,     0 },
4923
  { { ".eh_frame",              "",                     NULL,   NULL,   0,       0 },
4924
    display_debug_frames,               &do_debug_frames,       1 },
4925
  { { ".debug_macinfo",         ".zdebug_macinfo",      NULL,   NULL,   0,       0 },
4926
    display_debug_macinfo,              &do_debug_macinfo,      0 },
4927
  { { ".debug_str",             ".zdebug_str",          NULL,   NULL,   0,       0 },
4928
    display_debug_str,                  &do_debug_str,          0 },
4929
  { { ".debug_loc",             ".zdebug_loc",          NULL,   NULL,   0,       0 },
4930
    display_debug_loc,                  &do_debug_loc,          1 },
4931
  { { ".debug_pubtypes",        ".zdebug_pubtypes",     NULL,   NULL,   0,       0 },
4932
    display_debug_pubnames,             &do_debug_pubnames,     0 },
4933
  { { ".debug_ranges",          ".zdebug_ranges",       NULL,   NULL,   0,       0 },
4934
    display_debug_ranges,               &do_debug_ranges,       1 },
4935
  { { ".debug_static_func",     ".zdebug_static_func",  NULL,   NULL,   0,       0 },
4936
    display_debug_not_supported,        NULL,                   0 },
4937
  { { ".debug_static_vars",     ".zdebug_static_vars",  NULL,   NULL,   0,       0 },
4938
    display_debug_not_supported,        NULL,                   0 },
4939
  { { ".debug_types",           ".zdebug_types",        NULL,   NULL,   0,       0 },
4940
    display_debug_not_supported,        NULL,                   0 },
4941
  { { ".debug_weaknames",       ".zdebug_weaknames",    NULL,   NULL,   0,       0 },
4942
    display_debug_not_supported,        NULL,                   0 }
4943
};

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.