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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [bfd/] [dwarf2.c] - Blame information for rev 105

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

Line No. Rev Author Line
1 104 markom
/* DWARF 2 support.
2
   Copyright 1994, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
3
 
4
   Adapted from gdb/dwarf2read.c by Gavin Koch of Cygnus Solutions
5
   (gavin@cygnus.com).
6
 
7
   From the dwarf2read.c header:
8
   Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology,
9
   Inc.  with support from Florida State University (under contract
10
   with the Ada Joint Program Office), and Silicon Graphics, Inc.
11
   Initial contribution by Brent Benson, Harris Computer Systems, Inc.,
12
   based on Fred Fish's (Cygnus Support) implementation of DWARF 1
13
   support in dwarfread.c
14
 
15
This file is part of BFD.
16
 
17
This program is free software; you can redistribute it and/or modify
18
it under the terms of the GNU General Public License as published by
19
the Free Software Foundation; either version 2 of the License, or (at
20
your option) any later version.
21
 
22
This program is distributed in the hope that it will be useful, but
23
WITHOUT ANY WARRANTY; without even the implied warranty of
24
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25
General Public License for more details.
26
 
27
You should have received a copy of the GNU General Public License
28
along with this program; if not, write to the Free Software
29
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
30
 
31
#include "bfd.h"
32
#include "sysdep.h"
33
#include "libiberty.h"
34
#include "libbfd.h"
35
#include "elf-bfd.h"
36
#include "elf/dwarf2.h"
37
 
38
/* The data in the .debug_line statement prologue looks like this.  */
39
struct line_head
40
  {
41
    unsigned int total_length;
42
    unsigned short version;
43
    unsigned int prologue_length;
44
    unsigned char minimum_instruction_length;
45
    unsigned char default_is_stmt;
46
    int line_base;
47
    unsigned char line_range;
48
    unsigned char opcode_base;
49
    unsigned char *standard_opcode_lengths;
50
  };
51
 
52
/* Attributes have a name and a value */
53
struct attribute
54
  {
55
    enum dwarf_attribute name;
56
    enum dwarf_form form;
57
    union
58
      {
59
        char *str;
60
        struct dwarf_block *blk;
61
        unsigned int unsnd;
62
        int snd;
63
        bfd_vma addr;
64
      }
65
    u;
66
  };
67
 
68
/* Get at parts of an attribute structure */
69
 
70
#define DW_STRING(attr)    ((attr)->u.str)
71
#define DW_UNSND(attr)     ((attr)->u.unsnd)
72
#define DW_BLOCK(attr)     ((attr)->u.blk)
73
#define DW_SND(attr)       ((attr)->u.snd)
74
#define DW_ADDR(attr)      ((attr)->u.addr)
75
 
76
/* Blocks are a bunch of untyped bytes. */
77
struct dwarf_block
78
  {
79
    unsigned int size;
80
    char *data;
81
  };
82
 
83
 
84
struct dwarf2_debug {
85
 
86
  /* A list of all previously read comp_units. */
87
  struct comp_unit* all_comp_units;
88
 
89
  /* The next unread compilation unit within the .debug_info section.
90
     Zero indicates that the .debug_info section has not been loaded
91
     into a buffer yet.*/
92
  char* info_ptr;
93
 
94
  /* Pointer to the end of the .debug_info section memory buffer. */
95
  char* info_ptr_end;
96
 
97
  /* Pointer to the .debug_abbrev section loaded into memory. */
98
  char* dwarf_abbrev_buffer;
99
 
100
  /* Length of the loaded .debug_abbrev section. */
101
  unsigned long dwarf_abbrev_size;
102
 
103
  /* Buffer for decode_line_info.  */
104
  char *dwarf_line_buffer;
105
 
106
  /* Length of the loaded .debug_line section.  */
107
  unsigned long dwarf_line_size;
108
};
109
 
110
struct arange {
111
  struct arange *next;
112
  bfd_vma low;
113
  bfd_vma high;
114
};
115
 
116
 
117
/* A minimal decoding of DWARF2 compilation units.  We only decode
118
   what's needed to get to the line number information. */
119
 
120
struct comp_unit {
121
 
122
  /* Chain the previously read compilation units. */
123
  struct comp_unit* next_unit;
124
 
125
  /* Keep the bdf convenient (for memory allocation). */
126
  bfd* abfd;
127
 
128
  /* The lowest and higest addresses contained in this compilation
129
     unit as specified in the compilation unit header. */
130
  struct arange arange;
131
 
132
  /* The DW_AT_name attribute (for error messages). */
133
  char* name;
134
 
135
  /* The abbrev hash table. */
136
  struct abbrev_info** abbrevs;
137
 
138
  /* Note that an error was found by comp_unit_find_nearest_line. */
139
  int error;
140
 
141
  /* The DW_AT_comp_dir attribute */
142
  char* comp_dir;
143
 
144
  /* True if there is a line number table associated with this comp. unit. */
145
  int stmtlist;
146
 
147
  /* The offset into .debug_line of the line number table. */
148
  unsigned long line_offset;
149
 
150
  /* Pointer to the first child die for the comp unit. */
151
  char *first_child_die_ptr;
152
 
153
  /* The end of the comp unit. */
154
  char *end_ptr;
155
 
156
  /* The decoded line number, NULL if not yet decoded. */
157
  struct line_info_table* line_table;
158
 
159
  /* A list of the functions found in this comp. unit. */
160
  struct funcinfo* function_table;
161
 
162
  /* Address size for this unit - from unit header */
163
  unsigned char addr_size;
164
};
165
 
166
 
167
 
168
/* VERBATIM
169
   The following function up to the END VERBATIM mark are
170
   copied directly from dwarf2read.c. */
171
 
172
/* read dwarf information from a buffer */
173
 
174
static unsigned int
175
read_1_byte (abfd, buf)
176
     bfd *abfd ATTRIBUTE_UNUSED;
177
     char *buf;
178
{
179
  return bfd_get_8 (abfd, (bfd_byte *) buf);
180
}
181
 
182
static int
183
read_1_signed_byte (abfd, buf)
184
     bfd *abfd ATTRIBUTE_UNUSED;
185
     char *buf;
186
{
187
  return bfd_get_signed_8 (abfd, (bfd_byte *) buf);
188
}
189
 
190
static unsigned int
191
read_2_bytes (abfd, buf)
192
     bfd *abfd;
193
     char *buf;
194
{
195
  return bfd_get_16 (abfd, (bfd_byte *) buf);
196
}
197
 
198
#if 0
199
 
200
/* This is not used.  */
201
 
202
static int
203
read_2_signed_bytes (abfd, buf)
204
     bfd *abfd;
205
     char *buf;
206
{
207
  return bfd_get_signed_16 (abfd, (bfd_byte *) buf);
208
}
209
 
210
#endif
211
 
212
static unsigned int
213
read_4_bytes (abfd, buf)
214
     bfd *abfd;
215
     char *buf;
216
{
217
  return bfd_get_32 (abfd, (bfd_byte *) buf);
218
}
219
 
220
#if 0
221
 
222
/* This is not used.  */
223
 
224
static int
225
read_4_signed_bytes (abfd, buf)
226
     bfd *abfd;
227
     char *buf;
228
{
229
  return bfd_get_signed_32 (abfd, (bfd_byte *) buf);
230
}
231
 
232
#endif
233
 
234
static unsigned int
235
read_8_bytes (abfd, buf)
236
     bfd *abfd;
237
     char *buf;
238
{
239
  return bfd_get_64 (abfd, (bfd_byte *) buf);
240
}
241
 
242
static char *
243
read_n_bytes (abfd, buf, size)
244
     bfd *abfd ATTRIBUTE_UNUSED;
245
     char *buf;
246
     unsigned int size ATTRIBUTE_UNUSED;
247
{
248
  /* If the size of a host char is 8 bits, we can return a pointer
249
     to the buffer, otherwise we have to copy the data to a buffer
250
     allocated on the temporary obstack.  */
251
  return buf;
252
}
253
 
254
static char *
255
read_string (abfd, buf, bytes_read_ptr)
256
     bfd *abfd ATTRIBUTE_UNUSED;
257
     char *buf;
258
     unsigned int *bytes_read_ptr;
259
{
260
  /* If the size of a host char is 8 bits, we can return a pointer
261
     to the string, otherwise we have to copy the string to a buffer
262
     allocated on the temporary obstack.  */
263
  if (*buf == '\0')
264
    {
265
      *bytes_read_ptr = 1;
266
      return NULL;
267
    }
268
  *bytes_read_ptr = strlen (buf) + 1;
269
  return buf;
270
}
271
 
272
static unsigned int
273
read_unsigned_leb128 (abfd, buf, bytes_read_ptr)
274
     bfd *abfd ATTRIBUTE_UNUSED;
275
     char *buf;
276
     unsigned int *bytes_read_ptr;
277
{
278
  unsigned int  result;
279
  unsigned int  num_read;
280
  int           shift;
281
  unsigned char byte;
282
 
283
  result   = 0;
284
  shift    = 0;
285
  num_read = 0;
286
 
287
  do
288
    {
289
      byte = bfd_get_8 (abfd, (bfd_byte *) buf);
290
      buf ++;
291
      num_read ++;
292
      result |= ((byte & 0x7f) << shift);
293
      shift += 7;
294
    }
295
  while (byte & 0x80);
296
 
297
  * bytes_read_ptr = num_read;
298
 
299
  return result;
300
}
301
 
302
static int
303
read_signed_leb128 (abfd, buf, bytes_read_ptr)
304
     bfd *abfd ATTRIBUTE_UNUSED;
305
     char *buf;
306
     unsigned int * bytes_read_ptr;
307
{
308
  int           result;
309
  int           shift;
310
  int           num_read;
311
  unsigned char byte;
312
 
313
  result = 0;
314
  shift = 0;
315
  num_read = 0;
316
 
317
  do
318
    {
319
      byte = bfd_get_8 (abfd, (bfd_byte *) buf);
320
      buf ++;
321
      num_read ++;
322
      result |= ((byte & 0x7f) << shift);
323
      shift += 7;
324
    }
325
  while (byte & 0x80);
326
 
327
  if ((shift < 32) && (byte & 0x40))
328
    result |= -(1 << shift);
329
 
330
  * bytes_read_ptr = num_read;
331
 
332
  return result;
333
}
334
 
335
/* END VERBATIM */
336
 
337
static bfd_vma
338
read_address (unit, buf)
339
     struct comp_unit* unit;
340
     char *buf;
341
{
342
  switch (unit->addr_size)
343
    {
344
    case 8:
345
      return bfd_get_64 (unit->abfd, (bfd_byte *) buf);
346
    case 4:
347
      return bfd_get_32 (unit->abfd, (bfd_byte *) buf);
348
    case 2:
349
      return bfd_get_16 (unit->abfd, (bfd_byte *) buf);
350
    default:
351
      abort ();
352
    }
353
}
354
 
355
 
356
 
357
 
358
 
359
/* This data structure holds the information of an abbrev. */
360
struct abbrev_info
361
  {
362
    unsigned int number;        /* number identifying abbrev */
363
    enum dwarf_tag tag;         /* dwarf tag */
364
    int has_children;           /* boolean */
365
    unsigned int num_attrs;     /* number of attributes */
366
    struct attr_abbrev *attrs;  /* an array of attribute descriptions */
367
    struct abbrev_info *next;   /* next in chain */
368
  };
369
 
370
struct attr_abbrev
371
  {
372
    enum dwarf_attribute name;
373
    enum dwarf_form form;
374
  };
375
 
376
#ifndef ABBREV_HASH_SIZE
377
#define ABBREV_HASH_SIZE 121
378
#endif
379
#ifndef ATTR_ALLOC_CHUNK
380
#define ATTR_ALLOC_CHUNK 4
381
#endif
382
 
383
/* Lookup an abbrev_info structure in the abbrev hash table.  */
384
 
385
static struct abbrev_info *
386
lookup_abbrev (number,abbrevs)
387
     unsigned int number;
388
     struct abbrev_info **abbrevs;
389
{
390
  unsigned int hash_number;
391
  struct abbrev_info *abbrev;
392
 
393
  hash_number = number % ABBREV_HASH_SIZE;
394
  abbrev = abbrevs[hash_number];
395
 
396
  while (abbrev)
397
    {
398
      if (abbrev->number == number)
399
        return abbrev;
400
      else
401
        abbrev = abbrev->next;
402
    }
403
  return NULL;
404
}
405
 
406
/* In DWARF version 2, the description of the debugging information is
407
   stored in a separate .debug_abbrev section.  Before we read any
408
   dies from a section we read in all abbreviations and install them
409
   in a hash table.  */
410
 
411
static struct abbrev_info**
412
read_abbrevs (abfd, offset)
413
     bfd * abfd;
414
     unsigned int offset;
415
{
416
  struct abbrev_info **abbrevs;
417
  char *abbrev_ptr;
418
  struct abbrev_info *cur_abbrev;
419
  unsigned int abbrev_number, bytes_read, abbrev_name;
420
  unsigned int abbrev_form, hash_number;
421
  struct dwarf2_debug *stash;
422
 
423
  stash = elf_tdata(abfd)->dwarf2_find_line_info;
424
 
425
  if (! stash->dwarf_abbrev_buffer)
426
    {
427
      asection *msec;
428
 
429
      msec = bfd_get_section_by_name (abfd, ".debug_abbrev");
430
      if (! msec)
431
        {
432
          (*_bfd_error_handler) (_("Dwarf Error: Can't find .debug_abbrev section."));
433
          bfd_set_error (bfd_error_bad_value);
434
          return 0;
435
        }
436
 
437
      stash->dwarf_abbrev_size = msec->_raw_size;
438
      stash->dwarf_abbrev_buffer = (char*) bfd_alloc (abfd, stash->dwarf_abbrev_size);
439
      if (! stash->dwarf_abbrev_buffer)
440
          return 0;
441
 
442
      if (! bfd_get_section_contents (abfd, msec,
443
                                      stash->dwarf_abbrev_buffer, 0,
444
                                      stash->dwarf_abbrev_size))
445
        return 0;
446
    }
447
 
448
  if (offset > stash->dwarf_abbrev_size)
449
    {
450
      (*_bfd_error_handler) (_("Dwarf Error: Abbrev offset (%u) bigger than abbrev size (%u)."),
451
                             offset, stash->dwarf_abbrev_size );
452
      bfd_set_error (bfd_error_bad_value);
453
      return 0;
454
    }
455
 
456
  abbrevs = (struct abbrev_info**) bfd_zalloc (abfd, sizeof(struct abbrev_info*) * ABBREV_HASH_SIZE);
457
 
458
  abbrev_ptr = stash->dwarf_abbrev_buffer + offset;
459
  abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
460
  abbrev_ptr += bytes_read;
461
 
462
  /* loop until we reach an abbrev number of 0 */
463
  while (abbrev_number)
464
    {
465
      cur_abbrev = (struct abbrev_info*)bfd_zalloc (abfd, sizeof (struct abbrev_info));
466
 
467
      /* read in abbrev header */
468
      cur_abbrev->number = abbrev_number;
469
      cur_abbrev->tag = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
470
      abbrev_ptr += bytes_read;
471
      cur_abbrev->has_children = read_1_byte (abfd, abbrev_ptr);
472
      abbrev_ptr += 1;
473
 
474
      /* now read in declarations */
475
      abbrev_name = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
476
      abbrev_ptr += bytes_read;
477
      abbrev_form = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
478
      abbrev_ptr += bytes_read;
479
      while (abbrev_name)
480
        {
481
          if ((cur_abbrev->num_attrs % ATTR_ALLOC_CHUNK) == 0)
482
            {
483
              cur_abbrev->attrs = (struct attr_abbrev *)
484
                bfd_realloc (cur_abbrev->attrs,
485
                             (cur_abbrev->num_attrs + ATTR_ALLOC_CHUNK)
486
                             * sizeof (struct attr_abbrev));
487
              if (! cur_abbrev->attrs)
488
                return 0;
489
            }
490
          cur_abbrev->attrs[cur_abbrev->num_attrs].name = abbrev_name;
491
          cur_abbrev->attrs[cur_abbrev->num_attrs++].form = abbrev_form;
492
          abbrev_name = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
493
          abbrev_ptr += bytes_read;
494
          abbrev_form = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
495
          abbrev_ptr += bytes_read;
496
        }
497
 
498
      hash_number = abbrev_number % ABBREV_HASH_SIZE;
499
      cur_abbrev->next = abbrevs[hash_number];
500
      abbrevs[hash_number] = cur_abbrev;
501
 
502
      /* Get next abbreviation.
503
         Under Irix6 the abbreviations for a compilation unit are not
504
         always properly terminated with an abbrev number of 0.
505
         Exit loop if we encounter an abbreviation which we have
506
         already read (which means we are about to read the abbreviations
507
         for the next compile unit) or if the end of the abbreviation
508
         table is reached.  */
509
      if ((unsigned int) (abbrev_ptr - stash->dwarf_abbrev_buffer)
510
            >= stash->dwarf_abbrev_size)
511
        break;
512
      abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
513
      abbrev_ptr += bytes_read;
514
      if (lookup_abbrev (abbrev_number,abbrevs) != NULL)
515
        break;
516
    }
517
 
518
  return abbrevs;
519
}
520
 
521
/* Read an attribute described by an abbreviated attribute.  */
522
 
523
static char *
524
read_attribute (attr, abbrev, unit, info_ptr)
525
     struct attribute   *attr;
526
     struct attr_abbrev *abbrev;
527
     struct comp_unit   *unit;
528
     char               *info_ptr;
529
{
530
  bfd *abfd = unit->abfd;
531
  unsigned int bytes_read;
532
  struct dwarf_block *blk;
533
 
534
  attr->name = abbrev->name;
535
  attr->form = abbrev->form;
536
  switch (abbrev->form)
537
    {
538
    case DW_FORM_addr:
539
    case DW_FORM_ref_addr:
540
      DW_ADDR (attr) = read_address (unit, info_ptr);
541
      info_ptr += unit->addr_size;
542
      break;
543
    case DW_FORM_block2:
544
      blk = (struct dwarf_block *) bfd_alloc (abfd, sizeof (struct dwarf_block));
545
      blk->size = read_2_bytes (abfd, info_ptr);
546
      info_ptr += 2;
547
      blk->data = read_n_bytes (abfd, info_ptr, blk->size);
548
      info_ptr += blk->size;
549
      DW_BLOCK (attr) = blk;
550
      break;
551
    case DW_FORM_block4:
552
      blk = (struct dwarf_block *) bfd_alloc (abfd, sizeof (struct dwarf_block));
553
      blk->size = read_4_bytes (abfd, info_ptr);
554
      info_ptr += 4;
555
      blk->data = read_n_bytes (abfd, info_ptr, blk->size);
556
      info_ptr += blk->size;
557
      DW_BLOCK (attr) = blk;
558
      break;
559
    case DW_FORM_data2:
560
      DW_UNSND (attr) = read_2_bytes (abfd, info_ptr);
561
      info_ptr += 2;
562
      break;
563
    case DW_FORM_data4:
564
      DW_UNSND (attr) = read_4_bytes (abfd, info_ptr);
565
      info_ptr += 4;
566
      break;
567
    case DW_FORM_data8:
568
      DW_UNSND (attr) = read_8_bytes (abfd, info_ptr);
569
      info_ptr += 8;
570
      break;
571
    case DW_FORM_string:
572
      DW_STRING (attr) = read_string (abfd, info_ptr, &bytes_read);
573
      info_ptr += bytes_read;
574
      break;
575
    case DW_FORM_block:
576
      blk = (struct dwarf_block *) bfd_alloc (abfd, sizeof (struct dwarf_block));
577
      blk->size = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
578
      info_ptr += bytes_read;
579
      blk->data = read_n_bytes (abfd, info_ptr, blk->size);
580
      info_ptr += blk->size;
581
      DW_BLOCK (attr) = blk;
582
      break;
583
    case DW_FORM_block1:
584
      blk = (struct dwarf_block *) bfd_alloc (abfd, sizeof (struct dwarf_block));
585
      blk->size = read_1_byte (abfd, info_ptr);
586
      info_ptr += 1;
587
      blk->data = read_n_bytes (abfd, info_ptr, blk->size);
588
      info_ptr += blk->size;
589
      DW_BLOCK (attr) = blk;
590
      break;
591
    case DW_FORM_data1:
592
      DW_UNSND (attr) = read_1_byte (abfd, info_ptr);
593
      info_ptr += 1;
594
      break;
595
    case DW_FORM_flag:
596
      DW_UNSND (attr) = read_1_byte (abfd, info_ptr);
597
      info_ptr += 1;
598
      break;
599
    case DW_FORM_sdata:
600
      DW_SND (attr) = read_signed_leb128 (abfd, info_ptr, &bytes_read);
601
      info_ptr += bytes_read;
602
      break;
603
    case DW_FORM_udata:
604
      DW_UNSND (attr) = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
605
      info_ptr += bytes_read;
606
      break;
607
    case DW_FORM_ref1:
608
      DW_UNSND (attr) = read_1_byte (abfd, info_ptr);
609
      info_ptr += 1;
610
      break;
611
    case DW_FORM_ref2:
612
      DW_UNSND (attr) = read_2_bytes (abfd, info_ptr);
613
      info_ptr += 2;
614
      break;
615
    case DW_FORM_ref4:
616
      DW_UNSND (attr) = read_4_bytes (abfd, info_ptr);
617
      info_ptr += 4;
618
      break;
619
    case DW_FORM_ref8:
620
      DW_UNSND (attr) = read_8_bytes (abfd, info_ptr);
621
      info_ptr += 8;
622
      break;
623
    case DW_FORM_ref_udata:
624
      DW_UNSND (attr) = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
625
      info_ptr += bytes_read;
626
      break;
627
    case DW_FORM_strp:
628
    case DW_FORM_indirect:
629
    default:
630
      (*_bfd_error_handler) (_("Dwarf Error: Invalid or unhandled FORM value: %d."),
631
                             abbrev->form);
632
      bfd_set_error (bfd_error_bad_value);
633
    }
634
  return info_ptr;
635
}
636
 
637
 
638
/* Source line information table routines. */
639
 
640
#define FILE_ALLOC_CHUNK 5
641
#define DIR_ALLOC_CHUNK 5
642
 
643
struct line_info {
644
  struct line_info* prev_line;
645
 
646
  bfd_vma address;
647
  char* filename;
648
  unsigned int line;
649
  unsigned int column;
650
  int end_sequence;             /* end of (sequential) code sequence */
651
};
652
 
653
struct fileinfo {
654
  char *name;
655
  unsigned int dir;
656
  unsigned int time;
657
  unsigned int size;
658
};
659
 
660
struct line_info_table {
661
  bfd* abfd;
662
 
663
  unsigned int num_files;
664
  unsigned int num_dirs;
665
 
666
  char* comp_dir;
667
  char** dirs;
668
  struct fileinfo* files;
669
  struct line_info* last_line;
670
};
671
 
672
static void
673
add_line_info (table, address, filename, line, column, end_sequence)
674
     struct line_info_table* table;
675
     bfd_vma address;
676
     char* filename;
677
     unsigned int line;
678
     unsigned int column;
679
     int end_sequence;
680
{
681
  struct line_info* info = (struct line_info*)
682
    bfd_alloc (table->abfd, sizeof (struct line_info));
683
 
684
  info->prev_line = table->last_line;
685
  table->last_line = info;
686
 
687
  info->address = address;
688
  info->filename = filename;
689
  info->line = line;
690
  info->column = column;
691
  info->end_sequence = end_sequence;
692
}
693
 
694
static char*
695
concat_filename (table, file)
696
     struct line_info_table* table;
697
     unsigned int file;
698
{
699
  char* filename;
700
 
701
  if (file - 1 >= table->num_files)
702
    {
703
      (*_bfd_error_handler) (_("Dwarf Error: mangled line number "
704
                               "section (bad file number)."));
705
      return "<unknown>";
706
    }
707
 
708
  filename = table->files[file - 1].name;
709
  if (*filename == '/')
710
    return filename;
711
 
712
  else
713
    {
714
      char* dirname = (table->files[file - 1].dir
715
                       ? table->dirs[table->files[file - 1].dir - 1]
716
                       : table->comp_dir);
717
      return (char*) concat (dirname, "/", filename, NULL);
718
    }
719
}
720
 
721
static void
722
arange_add (unit, low_pc, high_pc)
723
     struct comp_unit *unit;
724
     bfd_vma low_pc;
725
     bfd_vma high_pc;
726
{
727
  struct arange *arange;
728
 
729
  /* first see if we can cheaply extend an existing range: */
730
  arange = &unit->arange;
731
  do
732
    {
733
      if (low_pc == arange->high)
734
        {
735
          arange->high = high_pc;
736
          return;
737
        }
738
      if (high_pc == arange->low)
739
        {
740
          arange->low = low_pc;
741
          return;
742
        }
743
      arange = arange->next;
744
    }
745
  while (arange);
746
 
747
  if (unit->arange.high == 0)
748
    {
749
      /* this is the first address range: store it in unit->arange: */
750
      unit->arange.next = 0;
751
      unit->arange.low = low_pc;
752
      unit->arange.high = high_pc;
753
      return;
754
    }
755
 
756
  /* need to allocate a new arange and insert it into the arange list: */
757
  arange = bfd_zalloc (unit->abfd, sizeof (*arange));
758
  arange->low = low_pc;
759
  arange->high = high_pc;
760
 
761
  arange->next = unit->arange.next;
762
  unit->arange.next = arange;
763
}
764
 
765
/* Decode the line number information for UNIT. */
766
 
767
static struct line_info_table*
768
decode_line_info (unit)
769
     struct comp_unit *unit;
770
{
771
  bfd *abfd = unit->abfd;
772
 
773
  struct dwarf2_debug *stash;
774
 
775
  struct line_info_table* table;
776
 
777
  char *line_ptr;
778
  char *line_end;
779
  struct line_head lh;
780
  unsigned int i, bytes_read;
781
  char *cur_file, *cur_dir;
782
  unsigned char op_code, extended_op, adj_opcode;
783
 
784
  stash = elf_tdata (abfd)->dwarf2_find_line_info;
785
 
786
  if (! stash->dwarf_line_buffer)
787
    {
788
      asection *msec;
789
 
790
      msec = bfd_get_section_by_name (abfd, ".debug_line");
791
      if (! msec)
792
        {
793
          (*_bfd_error_handler) (_("Dwarf Error: Can't find .debug_line section."));
794
          bfd_set_error (bfd_error_bad_value);
795
          return 0;
796
        }
797
 
798
      stash->dwarf_line_size = msec->_raw_size;
799
      stash->dwarf_line_buffer = (char *) bfd_alloc (abfd, stash->dwarf_line_size);
800
      if (! stash->dwarf_line_buffer)
801
        return 0;
802
 
803
      if (! bfd_get_section_contents (abfd, msec,
804
                                      stash->dwarf_line_buffer, 0,
805
                                      stash->dwarf_line_size))
806
        return 0;
807
 
808
      /* FIXME: We ought to apply the relocs against this section before
809
         we process it.... */
810
    }
811
 
812
  /* Since we are using un-relocated data, it is possible to get a bad value
813
     for the line_offset.  Validate it here so that we won't get a segfault
814
     below.  */
815
  if (unit->line_offset >= stash->dwarf_line_size)
816
    {
817
      (*_bfd_error_handler) (_("Dwarf Error: Line offset (%u) bigger than line size (%u)."),
818
                             unit->line_offset, stash->dwarf_line_size);
819
      bfd_set_error (bfd_error_bad_value);
820
      return 0;
821
    }
822
 
823
  table = (struct line_info_table*) bfd_alloc (abfd,
824
                                               sizeof (struct line_info_table));
825
  table->abfd = abfd;
826
  table->comp_dir = unit->comp_dir;
827
 
828
  table->num_files = 0;
829
  table->files = NULL;
830
 
831
  table->num_dirs = 0;
832
  table->dirs = NULL;
833
 
834
  table->files = NULL;
835
  table->last_line = NULL;
836
 
837
  line_ptr = stash->dwarf_line_buffer + unit->line_offset;
838
 
839
  /* read in the prologue */
840
  lh.total_length = read_4_bytes (abfd, line_ptr);
841
  line_ptr += 4;
842
  line_end = line_ptr + lh.total_length;
843
  lh.version = read_2_bytes (abfd, line_ptr);
844
  line_ptr += 2;
845
  lh.prologue_length = read_4_bytes (abfd, line_ptr);
846
  line_ptr += 4;
847
  lh.minimum_instruction_length = read_1_byte (abfd, line_ptr);
848
  line_ptr += 1;
849
  lh.default_is_stmt = read_1_byte (abfd, line_ptr);
850
  line_ptr += 1;
851
  lh.line_base = read_1_signed_byte (abfd, line_ptr);
852
  line_ptr += 1;
853
  lh.line_range = read_1_byte (abfd, line_ptr);
854
  line_ptr += 1;
855
  lh.opcode_base = read_1_byte (abfd, line_ptr);
856
  line_ptr += 1;
857
  lh.standard_opcode_lengths = (unsigned char *)
858
    bfd_alloc (abfd, lh.opcode_base * sizeof (unsigned char));
859
 
860
  lh.standard_opcode_lengths[0] = 1;
861
  for (i = 1; i < lh.opcode_base; ++i)
862
    {
863
      lh.standard_opcode_lengths[i] = read_1_byte (abfd, line_ptr);
864
      line_ptr += 1;
865
    }
866
 
867
  /* Read directory table  */
868
  while ((cur_dir = read_string (abfd, line_ptr, &bytes_read)) != NULL)
869
    {
870
      line_ptr += bytes_read;
871
      if ((table->num_dirs % DIR_ALLOC_CHUNK) == 0)
872
        {
873
          table->dirs = (char **)
874
            bfd_realloc (table->dirs,
875
                         (table->num_dirs + DIR_ALLOC_CHUNK) * sizeof (char *));
876
          if (! table->dirs)
877
            return 0;
878
        }
879
      table->dirs[table->num_dirs++] = cur_dir;
880
    }
881
  line_ptr += bytes_read;
882
 
883
  /* Read file name table */
884
  while ((cur_file = read_string (abfd, line_ptr, &bytes_read)) != NULL)
885
    {
886
      line_ptr += bytes_read;
887
      if ((table->num_files % FILE_ALLOC_CHUNK) == 0)
888
        {
889
          table->files = (struct fileinfo *)
890
            bfd_realloc (table->files,
891
                         (table->num_files + FILE_ALLOC_CHUNK)
892
                         * sizeof (struct fileinfo));
893
          if (! table->files)
894
            return 0;
895
        }
896
      table->files[table->num_files].name = cur_file;
897
      table->files[table->num_files].dir =
898
        read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
899
      line_ptr += bytes_read;
900
      table->files[table->num_files].time =
901
        read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
902
      line_ptr += bytes_read;
903
      table->files[table->num_files].size =
904
        read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
905
      line_ptr += bytes_read;
906
      table->num_files++;
907
    }
908
  line_ptr += bytes_read;
909
 
910
  /* Read the statement sequences until there's nothing left.  */
911
  while (line_ptr < line_end)
912
    {
913
      /* state machine registers  */
914
      bfd_vma address = 0;
915
      char* filename = concat_filename (table, 1);
916
      unsigned int line = 1;
917
      unsigned int column = 0;
918
      int is_stmt = lh.default_is_stmt;
919
      int basic_block = 0;
920
      int end_sequence = 0, need_low_pc = 1;
921
      bfd_vma low_pc = 0;
922
 
923
      /* Decode the table. */
924
      while (! end_sequence)
925
        {
926
          op_code = read_1_byte (abfd, line_ptr);
927
          line_ptr += 1;
928
          switch (op_code)
929
            {
930
            case DW_LNS_extended_op:
931
              line_ptr += 1;    /* ignore length */
932
              extended_op = read_1_byte (abfd, line_ptr);
933
              line_ptr += 1;
934
              switch (extended_op)
935
                {
936
                case DW_LNE_end_sequence:
937
                  end_sequence = 1;
938
                  add_line_info (table, address, filename, line, column,
939
                                 end_sequence);
940
                  if (need_low_pc)
941
                    {
942
                      need_low_pc = 0;
943
                      low_pc = address;
944
                    }
945
                  arange_add (unit, low_pc, address);
946
                  break;
947
                case DW_LNE_set_address:
948
                  address = read_address (unit, line_ptr);
949
                  line_ptr += unit->addr_size;
950
                  break;
951
                case DW_LNE_define_file:
952
                  cur_file = read_string (abfd, line_ptr, &bytes_read);
953
                  line_ptr += bytes_read;
954
                  if ((table->num_files % FILE_ALLOC_CHUNK) == 0)
955
                    {
956
                      table->files = (struct fileinfo *)
957
                        bfd_realloc (table->files,
958
                                     (table->num_files + FILE_ALLOC_CHUNK)
959
                                     * sizeof (struct fileinfo));
960
                      if (! table->files)
961
                        return 0;
962
                    }
963
                  table->files[table->num_files].name = cur_file;
964
                  table->files[table->num_files].dir =
965
                    read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
966
                  line_ptr += bytes_read;
967
                  table->files[table->num_files].time =
968
                    read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
969
                  line_ptr += bytes_read;
970
                  table->files[table->num_files].size =
971
                    read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
972
                  line_ptr += bytes_read;
973
                  table->num_files++;
974
                  break;
975
                default:
976
                  (*_bfd_error_handler) (_("Dwarf Error: mangled line number section."));
977
                  bfd_set_error (bfd_error_bad_value);
978
                  return 0;
979
                }
980
              break;
981
            case DW_LNS_copy:
982
              add_line_info (table, address, filename, line, column, 0);
983
              basic_block = 0;
984
              if (need_low_pc)
985
                {
986
                  need_low_pc = 0;
987
                  low_pc = address;
988
                }
989
              break;
990
            case DW_LNS_advance_pc:
991
              address += lh.minimum_instruction_length
992
                * read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
993
              line_ptr += bytes_read;
994
              break;
995
            case DW_LNS_advance_line:
996
              line += read_signed_leb128 (abfd, line_ptr, &bytes_read);
997
              line_ptr += bytes_read;
998
              break;
999
            case DW_LNS_set_file:
1000
              {
1001
                unsigned int file;
1002
 
1003
                /* The file and directory tables are 0 based, the references
1004
                   are 1 based.  */
1005
                file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1006
                line_ptr += bytes_read;
1007
                filename = concat_filename (table, file);
1008
                break;
1009
              }
1010
            case DW_LNS_set_column:
1011
              column = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1012
              line_ptr += bytes_read;
1013
              break;
1014
            case DW_LNS_negate_stmt:
1015
              is_stmt = (!is_stmt);
1016
              break;
1017
            case DW_LNS_set_basic_block:
1018
              basic_block = 1;
1019
              break;
1020
            case DW_LNS_const_add_pc:
1021
              address += lh.minimum_instruction_length
1022
                      * ((255 - lh.opcode_base) / lh.line_range);
1023
              break;
1024
            case DW_LNS_fixed_advance_pc:
1025
              address += read_2_bytes (abfd, line_ptr);
1026
              line_ptr += 2;
1027
              break;
1028
            default:            /* special operand */
1029
              adj_opcode = op_code - lh.opcode_base;
1030
              address += (adj_opcode / lh.line_range)
1031
                * lh.minimum_instruction_length;
1032
              line += lh.line_base + (adj_opcode % lh.line_range);
1033
              /* append row to matrix using current values */
1034
              add_line_info (table, address, filename, line, column, 0);
1035
              basic_block = 1;
1036
              if (need_low_pc)
1037
                {
1038
                  need_low_pc = 0;
1039
                  low_pc = address;
1040
                }
1041
            }
1042
        }
1043
    }
1044
 
1045
  return table;
1046
}
1047
 
1048
 
1049
/* If ADDR is within TABLE set the output parameters and return true,
1050
   otherwise return false.  The output parameters, FILENAME_PTR and
1051
   LINENUMBER_PTR, are pointers to the objects to be filled in. */
1052
 
1053
static boolean
1054
lookup_address_in_line_info_table (table,
1055
                                   addr,
1056
                                   filename_ptr,
1057
                                   linenumber_ptr)
1058
     struct line_info_table* table;
1059
     bfd_vma addr;
1060
     const char **filename_ptr;
1061
     unsigned int *linenumber_ptr;
1062
{
1063
  struct line_info* next_line = table->last_line;
1064
  struct line_info* each_line;
1065
 
1066
  if (!next_line)
1067
    return false;
1068
 
1069
  each_line = next_line->prev_line;
1070
 
1071
  while (each_line && next_line)
1072
    {
1073
      if (!each_line->end_sequence
1074
          && addr >= each_line->address && addr < next_line->address)
1075
        {
1076
          *filename_ptr = each_line->filename;
1077
          *linenumber_ptr = each_line->line;
1078
          return true;
1079
        }
1080
      next_line = each_line;
1081
      each_line = each_line->prev_line;
1082
    }
1083
 
1084
  return false;
1085
}
1086
 
1087
 
1088
 
1089
 
1090
/* Function table functions. */
1091
 
1092
struct funcinfo {
1093
  struct funcinfo *prev_func;
1094
 
1095
  char* name;
1096
  bfd_vma low;
1097
  bfd_vma high;
1098
};
1099
 
1100
 
1101
/* If ADDR is within TABLE, set FUNCTIONNAME_PTR, and return true. */
1102
 
1103
static boolean
1104
lookup_address_in_function_table (table,
1105
                                  addr,
1106
                                  functionname_ptr)
1107
     struct funcinfo* table;
1108
     bfd_vma addr;
1109
     const char **functionname_ptr;
1110
{
1111
  struct funcinfo* each_func;
1112
 
1113
  for (each_func = table;
1114
       each_func;
1115
       each_func = each_func->prev_func)
1116
    {
1117
      if (addr >= each_func->low && addr < each_func->high)
1118
        {
1119
          *functionname_ptr = each_func->name;
1120
          return true;
1121
        }
1122
    }
1123
 
1124
  return false;
1125
}
1126
 
1127
 
1128
 
1129
 
1130
/* DWARF2 Compilation unit functions. */
1131
 
1132
 
1133
/* Scan over each die in a comp. unit looking for functions to add
1134
   to the function table. */
1135
 
1136
static boolean
1137
scan_unit_for_functions (unit)
1138
     struct comp_unit *unit;
1139
{
1140
  bfd *abfd = unit->abfd;
1141
  char *info_ptr = unit->first_child_die_ptr;
1142
  int nesting_level = 1;
1143
 
1144
  while (nesting_level)
1145
    {
1146
      unsigned int abbrev_number, bytes_read, i;
1147
      struct abbrev_info *abbrev;
1148
      struct attribute attr;
1149
      struct funcinfo *func;
1150
      char* name = 0;
1151
 
1152
      abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
1153
      info_ptr += bytes_read;
1154
 
1155
      if (! abbrev_number)
1156
        {
1157
          nesting_level--;
1158
          continue;
1159
        }
1160
 
1161
      abbrev = lookup_abbrev (abbrev_number,unit->abbrevs);
1162
      if (! abbrev)
1163
        {
1164
          (*_bfd_error_handler) (_("Dwarf Error: Could not find abbrev number %d."),
1165
                             abbrev_number);
1166
          bfd_set_error (bfd_error_bad_value);
1167
          return false;
1168
        }
1169
 
1170
      if (abbrev->tag == DW_TAG_subprogram)
1171
        {
1172
          func = (struct funcinfo*) bfd_zalloc (abfd, sizeof (struct funcinfo));
1173
          func->prev_func = unit->function_table;
1174
          unit->function_table = func;
1175
        }
1176
      else
1177
        func = NULL;
1178
 
1179
      for (i = 0; i < abbrev->num_attrs; ++i)
1180
        {
1181
          info_ptr = read_attribute (&attr, &abbrev->attrs[i], unit, info_ptr);
1182
 
1183
          if (func)
1184
            {
1185
              switch (attr.name)
1186
                {
1187
                case DW_AT_name:
1188
 
1189
                  name = DW_STRING (&attr);
1190
 
1191
                  /* Prefer DW_AT_MIPS_linkage_name over DW_AT_name.  */
1192
                  if (func->name == NULL)
1193
                    func->name = DW_STRING (&attr);
1194
                  break;
1195
 
1196
                case DW_AT_MIPS_linkage_name:
1197
                  func->name = DW_STRING (&attr);
1198
                  break;
1199
 
1200
                case DW_AT_low_pc:
1201
                  func->low = DW_ADDR (&attr);
1202
                  break;
1203
 
1204
                case DW_AT_high_pc:
1205
                  func->high = DW_ADDR (&attr);
1206
                  break;
1207
 
1208
                default:
1209
                  break;
1210
                }
1211
            }
1212
          else
1213
            {
1214
              switch (attr.name)
1215
                {
1216
                case DW_AT_name:
1217
                  name = DW_STRING (&attr);
1218
                  break;
1219
 
1220
                default:
1221
                  break;
1222
                }
1223
            }
1224
        }
1225
 
1226
      if (abbrev->has_children)
1227
        nesting_level++;
1228
    }
1229
 
1230
  return true;
1231
}
1232
 
1233
 
1234
 
1235
 
1236
 
1237
 
1238
/* Parse a DWARF2 compilation unit starting at INFO_PTR.  This
1239
   includes the compilation unit header that proceeds the DIE's, but
1240
   does not include the length field that preceeds each compilation
1241
   unit header.  END_PTR points one past the end of this comp unit.
1242
   If ABBREV_LENGTH is 0, then the length of the abbreviation offset
1243
   is assumed to be four bytes.  Otherwise, it it is the size given.
1244
 
1245
   This routine does not read the whole compilation unit; only enough
1246
   to get to the line number information for the compilation unit.  */
1247
 
1248
static struct comp_unit *
1249
parse_comp_unit (abfd, info_ptr, end_ptr, abbrev_length)
1250
     bfd* abfd;
1251
     char* info_ptr;
1252
     char* end_ptr;
1253
     unsigned int abbrev_length;
1254
{
1255
  struct comp_unit* unit;
1256
 
1257
  unsigned short version;
1258
  unsigned int abbrev_offset = 0;
1259
  unsigned char addr_size;
1260
  struct abbrev_info** abbrevs;
1261
 
1262
  unsigned int abbrev_number, bytes_read, i;
1263
  struct abbrev_info *abbrev;
1264
  struct attribute attr;
1265
 
1266
  version = read_2_bytes (abfd, info_ptr);
1267
  info_ptr += 2;
1268
  BFD_ASSERT (abbrev_length == 0
1269
              || abbrev_length == 4
1270
              || abbrev_length == 8);
1271
  if (abbrev_length == 0 || abbrev_length == 4)
1272
    abbrev_offset = read_4_bytes (abfd, info_ptr);
1273
  else if (abbrev_length == 8)
1274
    abbrev_offset = read_8_bytes (abfd, info_ptr);
1275
  info_ptr += abbrev_length;
1276
  addr_size = read_1_byte (abfd, info_ptr);
1277
  info_ptr += 1;
1278
 
1279
  if (version != 2)
1280
    {
1281
      (*_bfd_error_handler) (_("Dwarf Error: found dwarf version '%hu', this reader only handles version 2 information."), version );
1282
      bfd_set_error (bfd_error_bad_value);
1283
      return 0;
1284
    }
1285
 
1286
  if (addr_size > sizeof (bfd_vma))
1287
    {
1288
      (*_bfd_error_handler) (_("Dwarf Error: found address size '%u', this reader can not handle sizes greater than '%u'."),
1289
                         addr_size,
1290
                         sizeof (bfd_vma));
1291
      bfd_set_error (bfd_error_bad_value);
1292
      return 0;
1293
    }
1294
 
1295
  if (addr_size != 2 && addr_size != 4 && addr_size != 8)
1296
    {
1297
      (*_bfd_error_handler) ("Dwarf Error: found address size '%u', this reader can only handle address sizes '2', '4' and '8'.", addr_size );
1298
      bfd_set_error (bfd_error_bad_value);
1299
      return 0;
1300
    }
1301
 
1302
  /* Read the abbrevs for this compilation unit into a table */
1303
  abbrevs = read_abbrevs (abfd, abbrev_offset);
1304
  if (! abbrevs)
1305
      return 0;
1306
 
1307
  abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
1308
  info_ptr += bytes_read;
1309
  if (! abbrev_number)
1310
    {
1311
      (*_bfd_error_handler) (_("Dwarf Error: Bad abbrev number: %d."),
1312
                         abbrev_number);
1313
      bfd_set_error (bfd_error_bad_value);
1314
      return 0;
1315
    }
1316
 
1317
  abbrev = lookup_abbrev (abbrev_number, abbrevs);
1318
  if (! abbrev)
1319
    {
1320
      (*_bfd_error_handler) (_("Dwarf Error: Could not find abbrev number %d."),
1321
                         abbrev_number);
1322
      bfd_set_error (bfd_error_bad_value);
1323
      return 0;
1324
    }
1325
 
1326
  unit = (struct comp_unit*) bfd_zalloc (abfd, sizeof (struct comp_unit));
1327
  unit->abfd = abfd;
1328
  unit->addr_size = addr_size;
1329
  unit->abbrevs = abbrevs;
1330
  unit->end_ptr = end_ptr;
1331
 
1332
  for (i = 0; i < abbrev->num_attrs; ++i)
1333
    {
1334
      info_ptr = read_attribute (&attr, &abbrev->attrs[i], unit, info_ptr);
1335
 
1336
      /* Store the data if it is of an attribute we want to keep in a
1337
         partial symbol table.  */
1338
      switch (attr.name)
1339
        {
1340
        case DW_AT_stmt_list:
1341
          unit->stmtlist = 1;
1342
          unit->line_offset = DW_UNSND (&attr);
1343
          break;
1344
 
1345
        case DW_AT_name:
1346
          unit->name = DW_STRING (&attr);
1347
          break;
1348
 
1349
        case DW_AT_low_pc:
1350
          unit->arange.low = DW_ADDR (&attr);
1351
          break;
1352
 
1353
        case DW_AT_high_pc:
1354
          unit->arange.high = DW_ADDR (&attr);
1355
          break;
1356
 
1357
        case DW_AT_comp_dir:
1358
          {
1359
            char* comp_dir = DW_STRING (&attr);
1360
            if (comp_dir)
1361
              {
1362
                /* Irix 6.2 native cc prepends <machine>.: to the compilation
1363
                   directory, get rid of it.  */
1364
                char *cp = (char*) strchr (comp_dir, ':');
1365
 
1366
                if (cp && cp != comp_dir && cp[-1] == '.' && cp[1] == '/')
1367
                  comp_dir = cp + 1;
1368
              }
1369
            unit->comp_dir = comp_dir;
1370
            break;
1371
          }
1372
 
1373
        default:
1374
          break;
1375
        }
1376
    }
1377
 
1378
  unit->first_child_die_ptr = info_ptr;
1379
  return unit;
1380
}
1381
 
1382
 
1383
 
1384
 
1385
 
1386
/* Return true if UNIT contains the address given by ADDR. */
1387
 
1388
static boolean
1389
comp_unit_contains_address (unit, addr)
1390
     struct comp_unit* unit;
1391
     bfd_vma addr;
1392
{
1393
  struct arange *arange;
1394
 
1395
  if (unit->error)
1396
    return 0;
1397
 
1398
  arange = &unit->arange;
1399
  do
1400
    {
1401
      if (addr >= arange->low && addr < arange->high)
1402
        return 1;
1403
      arange = arange->next;
1404
    }
1405
  while (arange);
1406
  return 0;
1407
}
1408
 
1409
 
1410
/* If UNIT contains ADDR, set the output parameters to the values for
1411
   the line containing ADDR.  The output parameters, FILENAME_PTR,
1412
   FUNCTIONNAME_PTR, and LINENUMBER_PTR, are pointers to the objects
1413
   to be filled in.
1414
 
1415
   Return true of UNIT contains ADDR, and no errors were encountered;
1416
   false otherwise.  */
1417
 
1418
static boolean
1419
comp_unit_find_nearest_line (unit, addr,
1420
                             filename_ptr, functionname_ptr, linenumber_ptr)
1421
     struct comp_unit* unit;
1422
     bfd_vma addr;
1423
     const char **filename_ptr;
1424
     const char **functionname_ptr;
1425
     unsigned int *linenumber_ptr;
1426
{
1427
  boolean line_p;
1428
  boolean func_p;
1429
 
1430
  if (unit->error)
1431
    return false;
1432
 
1433
  if (! unit->line_table)
1434
    {
1435
      if (! unit->stmtlist)
1436
        {
1437
          unit->error = 1;
1438
          return false;
1439
        }
1440
 
1441
      unit->line_table = decode_line_info (unit);
1442
 
1443
      if (! unit->line_table)
1444
        {
1445
          unit->error = 1;
1446
          return false;
1447
        }
1448
 
1449
      if (! scan_unit_for_functions (unit))
1450
        {
1451
          unit->error = 1;
1452
          return false;
1453
        }
1454
    }
1455
 
1456
  line_p = lookup_address_in_line_info_table (unit->line_table,
1457
                                              addr,
1458
                                              filename_ptr,
1459
                                              linenumber_ptr);
1460
  func_p = lookup_address_in_function_table (unit->function_table,
1461
                                             addr,
1462
                                             functionname_ptr);
1463
  return line_p || func_p;
1464
}
1465
 
1466
/* The DWARF2 version of find_nearest line.  Return true if the line
1467
   is found without error.  ADDR_SIZE is the number of bytes in the
1468
   initial .debug_info length field and in the abbreviation offset.
1469
   You may use zero to indicate that the default value should be
1470
   used.  */
1471
 
1472
boolean
1473
_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
1474
                               filename_ptr, functionname_ptr,
1475
                               linenumber_ptr,
1476
                               addr_size)
1477
     bfd *abfd;
1478
     asection *section;
1479
     asymbol **symbols ATTRIBUTE_UNUSED;
1480
     bfd_vma offset;
1481
     const char **filename_ptr;
1482
     const char **functionname_ptr;
1483
     unsigned int *linenumber_ptr;
1484
     unsigned int addr_size;
1485
{
1486
  /* Read each compilation unit from the section .debug_info, and check
1487
     to see if it contains the address we are searching for.  If yes,
1488
     lookup the address, and return the line number info.  If no, go
1489
     on to the next compilation unit.
1490
 
1491
     We keep a list of all the previously read compilation units, and
1492
     a pointer to the next un-read compilation unit.  Check the
1493
     previously read units before reading more.
1494
     */
1495
 
1496
  struct dwarf2_debug *stash = elf_tdata (abfd)->dwarf2_find_line_info;
1497
 
1498
  /* What address are we looking for? */
1499
  bfd_vma addr = offset + section->vma;
1500
 
1501
  struct comp_unit* each;
1502
 
1503
  *filename_ptr = NULL;
1504
  *functionname_ptr = NULL;
1505
  *linenumber_ptr = 0;
1506
 
1507
  /* The DWARF2 spec says that the initial length field, and the
1508
     offset of the abbreviation table, should both be 4-byte values.
1509
     However, some compilers do things differently.  */
1510
  if (addr_size == 0)
1511
    addr_size = 4;
1512
  BFD_ASSERT (addr_size == 4 || addr_size == 8);
1513
 
1514
  if (! stash)
1515
    {
1516
      asection *msec;
1517
      unsigned long size;
1518
 
1519
      stash = elf_tdata (abfd)->dwarf2_find_line_info =
1520
        (struct dwarf2_debug*) bfd_zalloc (abfd, sizeof (struct dwarf2_debug));
1521
 
1522
      if (! stash)
1523
        return false;
1524
 
1525
      msec = bfd_get_section_by_name (abfd, ".debug_info");
1526
      if (! msec)
1527
        {
1528
          /* No dwarf2 info.  Note that at this point the stash
1529
             has been allocated, but contains zeros, this lets
1530
             future calls to this function fail quicker. */
1531
          return false;
1532
        }
1533
 
1534
      size = msec->_raw_size;
1535
      if (size == 0)
1536
        return false;
1537
 
1538
      stash->info_ptr = (char *) bfd_alloc (abfd, size);
1539
 
1540
      if (! stash->info_ptr)
1541
        return false;
1542
 
1543
      if (! bfd_get_section_contents (abfd, msec, stash->info_ptr, 0, size))
1544
        {
1545
          stash->info_ptr = 0;
1546
          return false;
1547
        }
1548
 
1549
      stash->info_ptr_end = stash->info_ptr + size;
1550
 
1551
      /* FIXME: There is a problem with the contents of the
1552
         .debug_info section.  The 'low' and 'high' addresses of the
1553
         comp_units are computed by relocs against symbols in the
1554
         .text segment.  We need these addresses in order to determine
1555
         the nearest line number, and so we have to resolve the
1556
         relocs.  There is a similar problem when the .debug_line
1557
         section is processed as well (e.g., there may be relocs
1558
         against the operand of the DW_LNE_set_address operator).
1559
 
1560
         Unfortunately getting hold of the reloc information is hard...
1561
 
1562
         For now, this means that disassembling object files (as
1563
         opposed to fully executables) does not always work as well as
1564
         we would like.  */
1565
    }
1566
 
1567
  /* A null info_ptr indicates that there is no dwarf2 info
1568
     (or that an error occured while setting up the stash). */
1569
 
1570
  if (! stash->info_ptr)
1571
    return false;
1572
 
1573
  /* Check the previously read comp. units first. */
1574
 
1575
  for (each = stash->all_comp_units; each; each = each->next_unit)
1576
    if (comp_unit_contains_address (each, addr))
1577
      return comp_unit_find_nearest_line (each, addr, filename_ptr,
1578
                                          functionname_ptr, linenumber_ptr);
1579
 
1580
  /* Read each remaining comp. units checking each as they are read. */
1581
  while (stash->info_ptr < stash->info_ptr_end)
1582
    {
1583
      struct comp_unit* each;
1584
      bfd_vma length;
1585
      boolean found;
1586
 
1587
      if (addr_size == 4)
1588
        length = read_4_bytes (abfd, stash->info_ptr);
1589
      else
1590
        length = read_8_bytes (abfd, stash->info_ptr);
1591
      stash->info_ptr += addr_size;
1592
 
1593
      if (length > 0)
1594
        {
1595
          each = parse_comp_unit (abfd, stash->info_ptr,
1596
                                  stash->info_ptr + length,
1597
                                  addr_size);
1598
          stash->info_ptr += length;
1599
 
1600
          if (each)
1601
            {
1602
              each->next_unit = stash->all_comp_units;
1603
              stash->all_comp_units = each;
1604
 
1605
              /* DW_AT_low_pc and DW_AT_high_pc are optional for
1606
                 compilation units.  If we don't have them (i.e.,
1607
                 unit->high == 0), we need to consult the line info
1608
                 table to see if a compilation unit contains the given
1609
                 address. */
1610
              if (each->arange.high > 0)
1611
                {
1612
                  if (comp_unit_contains_address (each, addr))
1613
                    return comp_unit_find_nearest_line (each, addr,
1614
                                                       filename_ptr,
1615
                                                       functionname_ptr,
1616
                                                       linenumber_ptr);
1617
                }
1618
              else
1619
                {
1620
                  found = comp_unit_find_nearest_line (each, addr,
1621
                                                       filename_ptr,
1622
                                                       functionname_ptr,
1623
                                                       linenumber_ptr);
1624
                  if (found)
1625
                    return true;
1626
                }
1627
            }
1628
        }
1629
    }
1630
 
1631
  return false;
1632
}
1633
 
1634
/* end of file */

powered by: WebSVN 2.1.0

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