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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [bfd/] [dwarf2.c] - Blame information for rev 258

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

Line No. Rev Author Line
1 24 jeremybenn
/* DWARF 2 support.
2
   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3 225 jeremybenn
   2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
4 24 jeremybenn
 
5
   Adapted from gdb/dwarf2read.c by Gavin Koch of Cygnus Solutions
6
   (gavin@cygnus.com).
7
 
8
   From the dwarf2read.c header:
9
   Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology,
10
   Inc.  with support from Florida State University (under contract
11
   with the Ada Joint Program Office), and Silicon Graphics, Inc.
12
   Initial contribution by Brent Benson, Harris Computer Systems, Inc.,
13
   based on Fred Fish's (Cygnus Support) implementation of DWARF 1
14
   support in dwarfread.c
15
 
16
   This file is part of BFD.
17
 
18
   This program is free software; you can redistribute it and/or modify
19
   it under the terms of the GNU General Public License as published by
20
   the Free Software Foundation; either version 3 of the License, or (at
21
   your option) any later version.
22
 
23
   This program is distributed in the hope that it will be useful, but
24
   WITHOUT ANY WARRANTY; without even the implied warranty of
25
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
26
   General Public License for more details.
27
 
28
   You should have received a copy of the GNU General Public License
29
   along with this program; if not, write to the Free Software
30
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
31
   MA 02110-1301, USA.  */
32
 
33
#include "sysdep.h"
34
#include "bfd.h"
35
#include "libiberty.h"
36
#include "libbfd.h"
37
#include "elf-bfd.h"
38 225 jeremybenn
#include "dwarf2.h"
39 24 jeremybenn
 
40
/* The data in the .debug_line statement prologue looks like this.  */
41
 
42
struct line_head
43
{
44
  bfd_vma total_length;
45
  unsigned short version;
46
  bfd_vma prologue_length;
47
  unsigned char minimum_instruction_length;
48
  unsigned char default_is_stmt;
49
  int line_base;
50
  unsigned char line_range;
51
  unsigned char opcode_base;
52
  unsigned char *standard_opcode_lengths;
53
};
54
 
55
/* Attributes have a name and a value.  */
56
 
57
struct attribute
58
{
59
  enum dwarf_attribute name;
60
  enum dwarf_form form;
61
  union
62
  {
63
    char *str;
64
    struct dwarf_block *blk;
65
    bfd_uint64_t val;
66
    bfd_int64_t sval;
67
  }
68
  u;
69
};
70
 
71
/* Blocks are a bunch of untyped bytes.  */
72
struct dwarf_block
73
{
74
  unsigned int size;
75
  bfd_byte *data;
76
};
77
 
78 225 jeremybenn
struct adjusted_section
79 24 jeremybenn
{
80
  asection *section;
81
  bfd_vma adj_vma;
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
  /* Last comp unit in list above.  */
90
  struct comp_unit *last_comp_unit;
91
 
92
  /* The next unread compilation unit within the .debug_info section.
93
     Zero indicates that the .debug_info section has not been loaded
94
     into a buffer yet.  */
95
  bfd_byte *info_ptr;
96
 
97
  /* Pointer to the end of the .debug_info section memory buffer.  */
98
  bfd_byte *info_ptr_end;
99
 
100
  /* Pointer to the bfd, section and address of the beginning of the
101
     section.  The bfd might be different than expected because of
102
     gnu_debuglink sections.  */
103 225 jeremybenn
  bfd *bfd_ptr;
104 24 jeremybenn
  asection *sec;
105
  bfd_byte *sec_info_ptr;
106
 
107 225 jeremybenn
  /* A pointer to the memory block allocated for info_ptr.  Neither
108
     info_ptr nor sec_info_ptr are guaranteed to stay pointing to the
109
     beginning of the malloc block.  This is used only to free the
110
     memory later.  */
111
  bfd_byte *info_ptr_memory;
112
 
113 24 jeremybenn
  /* Pointer to the symbol table.  */
114
  asymbol **syms;
115
 
116
  /* Pointer to the .debug_abbrev section loaded into memory.  */
117
  bfd_byte *dwarf_abbrev_buffer;
118
 
119
  /* Length of the loaded .debug_abbrev section.  */
120 225 jeremybenn
  bfd_size_type dwarf_abbrev_size;
121 24 jeremybenn
 
122
  /* Buffer for decode_line_info.  */
123
  bfd_byte *dwarf_line_buffer;
124
 
125
  /* Length of the loaded .debug_line section.  */
126 225 jeremybenn
  bfd_size_type dwarf_line_size;
127 24 jeremybenn
 
128
  /* Pointer to the .debug_str section loaded into memory.  */
129
  bfd_byte *dwarf_str_buffer;
130
 
131
  /* Length of the loaded .debug_str section.  */
132 225 jeremybenn
  bfd_size_type dwarf_str_size;
133 24 jeremybenn
 
134
  /* Pointer to the .debug_ranges section loaded into memory. */
135
  bfd_byte *dwarf_ranges_buffer;
136
 
137
  /* Length of the loaded .debug_ranges section. */
138 225 jeremybenn
  bfd_size_type dwarf_ranges_size;
139 24 jeremybenn
 
140
  /* If the most recent call to bfd_find_nearest_line was given an
141
     address in an inlined function, preserve a pointer into the
142
     calling chain for subsequent calls to bfd_find_inliner_info to
143
     use. */
144
  struct funcinfo *inliner_chain;
145
 
146 225 jeremybenn
  /* Number of sections whose VMA we must adjust.  */
147
  unsigned int adjusted_section_count;
148 24 jeremybenn
 
149 225 jeremybenn
  /* Array of sections with adjusted VMA.  */
150
  struct adjusted_section *adjusted_sections;
151 24 jeremybenn
 
152
  /* Number of times find_line is called.  This is used in
153
     the heuristic for enabling the info hash tables.  */
154
  int info_hash_count;
155
 
156
#define STASH_INFO_HASH_TRIGGER    100
157
 
158
  /* Hash table mapping symbol names to function infos.  */
159
  struct info_hash_table *funcinfo_hash_table;
160
 
161
  /* Hash table mapping symbol names to variable infos.  */
162
  struct info_hash_table *varinfo_hash_table;
163
 
164
  /* Head of comp_unit list in the last hash table update.  */
165
  struct comp_unit *hash_units_head;
166
 
167
  /* Status of info hash.  */
168
  int info_hash_status;
169
#define STASH_INFO_HASH_OFF        0
170
#define STASH_INFO_HASH_ON         1
171
#define STASH_INFO_HASH_DISABLED   2
172
};
173
 
174
struct arange
175
{
176
  struct arange *next;
177
  bfd_vma low;
178
  bfd_vma high;
179
};
180
 
181
/* A minimal decoding of DWARF2 compilation units.  We only decode
182
   what's needed to get to the line number information.  */
183
 
184
struct comp_unit
185
{
186
  /* Chain the previously read compilation units.  */
187
  struct comp_unit *next_unit;
188
 
189
  /* Likewise, chain the compilation unit read after this one.
190
     The comp units are stored in reversed reading order.  */
191
  struct comp_unit *prev_unit;
192
 
193
  /* Keep the bfd convenient (for memory allocation).  */
194
  bfd *abfd;
195
 
196
  /* The lowest and highest addresses contained in this compilation
197
     unit as specified in the compilation unit header.  */
198
  struct arange arange;
199
 
200
  /* The DW_AT_name attribute (for error messages).  */
201
  char *name;
202
 
203
  /* The abbrev hash table.  */
204
  struct abbrev_info **abbrevs;
205
 
206
  /* Note that an error was found by comp_unit_find_nearest_line.  */
207
  int error;
208
 
209
  /* The DW_AT_comp_dir attribute.  */
210
  char *comp_dir;
211
 
212
  /* TRUE if there is a line number table associated with this comp. unit.  */
213
  int stmtlist;
214
 
215
  /* Pointer to the current comp_unit so that we can find a given entry
216
     by its reference.  */
217
  bfd_byte *info_ptr_unit;
218
 
219 225 jeremybenn
  /* Pointer to the start of the debug section, for DW_FORM_ref_addr.  */
220
  bfd_byte *sec_info_ptr;
221
 
222 24 jeremybenn
  /* The offset into .debug_line of the line number table.  */
223
  unsigned long line_offset;
224
 
225
  /* Pointer to the first child die for the comp unit.  */
226
  bfd_byte *first_child_die_ptr;
227
 
228
  /* The end of the comp unit.  */
229
  bfd_byte *end_ptr;
230
 
231
  /* The decoded line number, NULL if not yet decoded.  */
232
  struct line_info_table *line_table;
233
 
234
  /* A list of the functions found in this comp. unit.  */
235
  struct funcinfo *function_table;
236
 
237
  /* A list of the variables found in this comp. unit.  */
238
  struct varinfo *variable_table;
239
 
240
  /* Pointer to dwarf2_debug structure.  */
241
  struct dwarf2_debug *stash;
242
 
243 225 jeremybenn
  /* DWARF format version for this unit - from unit header.  */
244
  int version;
245
 
246 24 jeremybenn
  /* Address size for this unit - from unit header.  */
247
  unsigned char addr_size;
248
 
249
  /* Offset size for this unit - from unit header.  */
250
  unsigned char offset_size;
251
 
252
  /* Base address for this unit - from DW_AT_low_pc attribute of
253
     DW_TAG_compile_unit DIE */
254
  bfd_vma base_address;
255
 
256
  /* TRUE if symbols are cached in hash table for faster lookup by name.  */
257
  bfd_boolean cached;
258
};
259
 
260
/* This data structure holds the information of an abbrev.  */
261
struct abbrev_info
262
{
263
  unsigned int number;          /* Number identifying abbrev.  */
264
  enum dwarf_tag tag;           /* DWARF tag.  */
265
  int has_children;             /* Boolean.  */
266
  unsigned int num_attrs;       /* Number of attributes.  */
267
  struct attr_abbrev *attrs;    /* An array of attribute descriptions.  */
268
  struct abbrev_info *next;     /* Next in chain.  */
269
};
270
 
271
struct attr_abbrev
272
{
273
  enum dwarf_attribute name;
274
  enum dwarf_form form;
275
};
276
 
277
#ifndef ABBREV_HASH_SIZE
278
#define ABBREV_HASH_SIZE 121
279
#endif
280
#ifndef ATTR_ALLOC_CHUNK
281
#define ATTR_ALLOC_CHUNK 4
282
#endif
283
 
284
/* Variable and function hash tables.  This is used to speed up look-up
285
   in lookup_symbol_in_var_table() and lookup_symbol_in_function_table().
286
   In order to share code between variable and function infos, we use
287
   a list of untyped pointer for all variable/function info associated with
288
   a symbol.  We waste a bit of memory for list with one node but that
289
   simplifies the code.  */
290
 
291
struct info_list_node
292
{
293
  struct info_list_node *next;
294
  void *info;
295
};
296
 
297
/* Info hash entry.  */
298
struct info_hash_entry
299
{
300
  struct bfd_hash_entry root;
301
  struct info_list_node *head;
302
};
303
 
304
struct info_hash_table
305
{
306
  struct bfd_hash_table base;
307
};
308
 
309
/* Function to create a new entry in info hash table. */
310
 
311
static struct bfd_hash_entry *
312
info_hash_table_newfunc (struct bfd_hash_entry *entry,
313
                         struct bfd_hash_table *table,
314
                         const char *string)
315
{
316
  struct info_hash_entry *ret = (struct info_hash_entry *) entry;
317
 
318
  /* Allocate the structure if it has not already been allocated by a
319
     derived class.  */
320
  if (ret == NULL)
321
    {
322 225 jeremybenn
      ret = (struct info_hash_entry *) bfd_hash_allocate (table,
323
                                                          sizeof (* ret));
324 24 jeremybenn
      if (ret == NULL)
325
        return NULL;
326
    }
327
 
328
  /* Call the allocation method of the base class.  */
329
  ret = ((struct info_hash_entry *)
330 225 jeremybenn
         bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
331 24 jeremybenn
 
332
  /* Initialize the local fields here.  */
333
  if (ret)
334
    ret->head = NULL;
335
 
336
  return (struct bfd_hash_entry *) ret;
337
}
338
 
339
/* Function to create a new info hash table.  It returns a pointer to the
340
   newly created table or NULL if there is any error.  We need abfd
341
   solely for memory allocation.  */
342
 
343
static struct info_hash_table *
344
create_info_hash_table (bfd *abfd)
345
{
346
  struct info_hash_table *hash_table;
347
 
348 225 jeremybenn
  hash_table = (struct info_hash_table *)
349
      bfd_alloc (abfd, sizeof (struct info_hash_table));
350 24 jeremybenn
  if (!hash_table)
351
    return hash_table;
352
 
353
  if (!bfd_hash_table_init (&hash_table->base, info_hash_table_newfunc,
354
                            sizeof (struct info_hash_entry)))
355
    {
356
      bfd_release (abfd, hash_table);
357
      return NULL;
358
    }
359
 
360
  return hash_table;
361
}
362
 
363
/* Insert an info entry into an info hash table.  We do not check of
364
   duplicate entries.  Also, the caller need to guarantee that the
365
   right type of info in inserted as info is passed as a void* pointer.
366
   This function returns true if there is no error.  */
367
 
368
static bfd_boolean
369
insert_info_hash_table (struct info_hash_table *hash_table,
370
                        const char *key,
371
                        void *info,
372
                        bfd_boolean copy_p)
373
{
374
  struct info_hash_entry *entry;
375
  struct info_list_node *node;
376
 
377
  entry = (struct info_hash_entry*) bfd_hash_lookup (&hash_table->base,
378
                                                     key, TRUE, copy_p);
379
  if (!entry)
380
    return FALSE;
381
 
382 225 jeremybenn
  node = (struct info_list_node *) bfd_hash_allocate (&hash_table->base,
383
                                                      sizeof (*node));
384 24 jeremybenn
  if (!node)
385
    return FALSE;
386
 
387
  node->info = info;
388
  node->next = entry->head;
389
  entry->head = node;
390
 
391
  return TRUE;
392
}
393
 
394
/* Look up an info entry list from an info hash table.  Return NULL
395
   if there is none. */
396
 
397
static struct info_list_node *
398
lookup_info_hash_table (struct info_hash_table *hash_table, const char *key)
399
{
400
  struct info_hash_entry *entry;
401
 
402
  entry = (struct info_hash_entry*) bfd_hash_lookup (&hash_table->base, key,
403
                                                     FALSE, FALSE);
404
  return entry ? entry->head : NULL;
405
}
406
 
407 225 jeremybenn
/* Read a section into its appropriate place in the dwarf2_debug
408
   struct (indicated by SECTION_BUFFER and SECTION_SIZE).  If SYMS is
409
   not NULL, use bfd_simple_get_relocated_section_contents to read the
410
   section contents, otherwise use bfd_get_section_contents.  Fail if
411
   the located section does not contain at least OFFSET bytes.  */
412
 
413
static bfd_boolean
414
read_section (bfd *           abfd,
415
              const char *    section_name,
416
              const char *    compressed_section_name,
417
              asymbol **      syms,
418
              bfd_uint64_t    offset,
419
              bfd_byte **     section_buffer,
420
              bfd_size_type * section_size)
421
{
422
  asection *msec;
423
  bfd_boolean section_is_compressed = FALSE;
424
 
425
  /* read_section is a noop if the section has already been read.  */
426
  if (!*section_buffer)
427
    {
428
      msec = bfd_get_section_by_name (abfd, section_name);
429
      if (! msec && compressed_section_name)
430
        {
431
          msec = bfd_get_section_by_name (abfd, compressed_section_name);
432
          section_is_compressed = TRUE;
433
        }
434
      if (! msec)
435
        {
436
          (*_bfd_error_handler) (_("Dwarf Error: Can't find %s section."), section_name);
437
          bfd_set_error (bfd_error_bad_value);
438
          return FALSE;
439
        }
440
 
441
      *section_size = msec->rawsize ? msec->rawsize : msec->size;
442
      if (syms)
443
        {
444
          *section_buffer
445
              = bfd_simple_get_relocated_section_contents (abfd, msec, NULL, syms);
446
          if (! *section_buffer)
447
            return FALSE;
448
        }
449
      else
450
        {
451
          *section_buffer = (bfd_byte *) bfd_malloc (*section_size);
452
          if (! *section_buffer)
453
            return FALSE;
454
          if (! bfd_get_section_contents (abfd, msec, *section_buffer,
455
                                          0, *section_size))
456
            return FALSE;
457
        }
458
 
459
      if (section_is_compressed)
460
        {
461
          if (! bfd_uncompress_section_contents (section_buffer, section_size))
462
            {
463
              (*_bfd_error_handler) (_("Dwarf Error: unable to decompress %s section."), compressed_section_name);
464
              bfd_set_error (bfd_error_bad_value);
465
              return FALSE;
466
            }
467
        }
468
    }
469
 
470
  /* It is possible to get a bad value for the offset into the section
471
     that the client wants.  Validate it here to avoid trouble later.  */
472
  if (offset != 0 && offset >= *section_size)
473
    {
474
      (*_bfd_error_handler) (_("Dwarf Error: Offset (%lu) greater than or equal to %s size (%lu)."),
475
                             (long) offset, section_name, *section_size);
476
      bfd_set_error (bfd_error_bad_value);
477
      return FALSE;
478
    }
479
 
480
  return TRUE;
481
}
482
 
483 24 jeremybenn
/* VERBATIM
484
   The following function up to the END VERBATIM mark are
485
   copied directly from dwarf2read.c.  */
486
 
487
/* Read dwarf information from a buffer.  */
488
 
489
static unsigned int
490
read_1_byte (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *buf)
491
{
492
  return bfd_get_8 (abfd, buf);
493
}
494
 
495
static int
496
read_1_signed_byte (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *buf)
497
{
498
  return bfd_get_signed_8 (abfd, buf);
499
}
500
 
501
static unsigned int
502
read_2_bytes (bfd *abfd, bfd_byte *buf)
503
{
504
  return bfd_get_16 (abfd, buf);
505
}
506
 
507
static unsigned int
508
read_4_bytes (bfd *abfd, bfd_byte *buf)
509
{
510
  return bfd_get_32 (abfd, buf);
511
}
512
 
513
static bfd_uint64_t
514
read_8_bytes (bfd *abfd, bfd_byte *buf)
515
{
516
  return bfd_get_64 (abfd, buf);
517
}
518
 
519
static bfd_byte *
520
read_n_bytes (bfd *abfd ATTRIBUTE_UNUSED,
521
              bfd_byte *buf,
522
              unsigned int size ATTRIBUTE_UNUSED)
523
{
524
  return buf;
525
}
526
 
527
static char *
528
read_string (bfd *abfd ATTRIBUTE_UNUSED,
529
             bfd_byte *buf,
530
             unsigned int *bytes_read_ptr)
531
{
532
  /* Return a pointer to the embedded string.  */
533
  char *str = (char *) buf;
534 225 jeremybenn
 
535 24 jeremybenn
  if (*str == '\0')
536
    {
537
      *bytes_read_ptr = 1;
538
      return NULL;
539
    }
540
 
541
  *bytes_read_ptr = strlen (str) + 1;
542
  return str;
543
}
544
 
545 225 jeremybenn
/* END VERBATIM */
546
 
547 24 jeremybenn
static char *
548 225 jeremybenn
read_indirect_string (struct comp_unit * unit,
549
                      bfd_byte *         buf,
550
                      unsigned int *     bytes_read_ptr)
551 24 jeremybenn
{
552
  bfd_uint64_t offset;
553
  struct dwarf2_debug *stash = unit->stash;
554
  char *str;
555
 
556
  if (unit->offset_size == 4)
557
    offset = read_4_bytes (unit->abfd, buf);
558
  else
559
    offset = read_8_bytes (unit->abfd, buf);
560 225 jeremybenn
 
561 24 jeremybenn
  *bytes_read_ptr = unit->offset_size;
562
 
563 225 jeremybenn
  if (! read_section (unit->abfd, ".debug_str", ".zdebug_str",
564
                      stash->syms, offset,
565
                      &stash->dwarf_str_buffer, &stash->dwarf_str_size))
566
    return NULL;
567 24 jeremybenn
 
568
  str = (char *) stash->dwarf_str_buffer + offset;
569
  if (*str == '\0')
570
    return NULL;
571
  return str;
572
}
573
 
574
static bfd_uint64_t
575
read_address (struct comp_unit *unit, bfd_byte *buf)
576
{
577
  int signed_vma = get_elf_backend_data (unit->abfd)->sign_extend_vma;
578
 
579
  if (signed_vma)
580
    {
581
      switch (unit->addr_size)
582
        {
583
        case 8:
584
          return bfd_get_signed_64 (unit->abfd, buf);
585
        case 4:
586
          return bfd_get_signed_32 (unit->abfd, buf);
587
        case 2:
588
          return bfd_get_signed_16 (unit->abfd, buf);
589
        default:
590
          abort ();
591
        }
592
    }
593
  else
594
    {
595
      switch (unit->addr_size)
596
        {
597
        case 8:
598
          return bfd_get_64 (unit->abfd, buf);
599
        case 4:
600
          return bfd_get_32 (unit->abfd, buf);
601
        case 2:
602
          return bfd_get_16 (unit->abfd, buf);
603
        default:
604
          abort ();
605
        }
606
    }
607
}
608
 
609
/* Lookup an abbrev_info structure in the abbrev hash table.  */
610
 
611
static struct abbrev_info *
612
lookup_abbrev (unsigned int number, struct abbrev_info **abbrevs)
613
{
614
  unsigned int hash_number;
615
  struct abbrev_info *abbrev;
616
 
617
  hash_number = number % ABBREV_HASH_SIZE;
618
  abbrev = abbrevs[hash_number];
619
 
620
  while (abbrev)
621
    {
622
      if (abbrev->number == number)
623
        return abbrev;
624
      else
625
        abbrev = abbrev->next;
626
    }
627
 
628
  return NULL;
629
}
630
 
631
/* In DWARF version 2, the description of the debugging information is
632
   stored in a separate .debug_abbrev section.  Before we read any
633
   dies from a section we read in all abbreviations and install them
634
   in a hash table.  */
635
 
636
static struct abbrev_info**
637
read_abbrevs (bfd *abfd, bfd_uint64_t offset, struct dwarf2_debug *stash)
638
{
639
  struct abbrev_info **abbrevs;
640
  bfd_byte *abbrev_ptr;
641
  struct abbrev_info *cur_abbrev;
642
  unsigned int abbrev_number, bytes_read, abbrev_name;
643
  unsigned int abbrev_form, hash_number;
644
  bfd_size_type amt;
645
 
646 225 jeremybenn
  if (! read_section (abfd, ".debug_abbrev", ".zdebug_abbrev",
647
                      stash->syms, offset,
648
                      &stash->dwarf_abbrev_buffer, &stash->dwarf_abbrev_size))
649
    return 0;
650 24 jeremybenn
 
651
  amt = sizeof (struct abbrev_info*) * ABBREV_HASH_SIZE;
652 225 jeremybenn
  abbrevs = (struct abbrev_info **) bfd_zalloc (abfd, amt);
653 24 jeremybenn
 
654
  abbrev_ptr = stash->dwarf_abbrev_buffer + offset;
655
  abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
656
  abbrev_ptr += bytes_read;
657
 
658
  /* Loop until we reach an abbrev number of 0.  */
659
  while (abbrev_number)
660
    {
661
      amt = sizeof (struct abbrev_info);
662 225 jeremybenn
      cur_abbrev = (struct abbrev_info *) bfd_zalloc (abfd, amt);
663 24 jeremybenn
 
664
      /* Read in abbrev header.  */
665
      cur_abbrev->number = abbrev_number;
666
      cur_abbrev->tag = (enum dwarf_tag)
667
        read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
668
      abbrev_ptr += bytes_read;
669
      cur_abbrev->has_children = read_1_byte (abfd, abbrev_ptr);
670
      abbrev_ptr += 1;
671
 
672
      /* Now read in declarations.  */
673
      abbrev_name = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
674
      abbrev_ptr += bytes_read;
675
      abbrev_form = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
676
      abbrev_ptr += bytes_read;
677
 
678
      while (abbrev_name)
679
        {
680
          if ((cur_abbrev->num_attrs % ATTR_ALLOC_CHUNK) == 0)
681
            {
682
              struct attr_abbrev *tmp;
683
 
684
              amt = cur_abbrev->num_attrs + ATTR_ALLOC_CHUNK;
685
              amt *= sizeof (struct attr_abbrev);
686 225 jeremybenn
              tmp = (struct attr_abbrev *) bfd_realloc (cur_abbrev->attrs, amt);
687 24 jeremybenn
              if (tmp == NULL)
688
                {
689
                  size_t i;
690
 
691
                  for (i = 0; i < ABBREV_HASH_SIZE; i++)
692
                    {
693
                      struct abbrev_info *abbrev = abbrevs[i];
694
 
695
                      while (abbrev)
696
                        {
697
                          free (abbrev->attrs);
698
                          abbrev = abbrev->next;
699
                        }
700
                    }
701
                  return NULL;
702
                }
703
              cur_abbrev->attrs = tmp;
704
            }
705
 
706
          cur_abbrev->attrs[cur_abbrev->num_attrs].name
707
            = (enum dwarf_attribute) abbrev_name;
708
          cur_abbrev->attrs[cur_abbrev->num_attrs++].form
709
            = (enum dwarf_form) abbrev_form;
710
          abbrev_name = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
711
          abbrev_ptr += bytes_read;
712
          abbrev_form = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
713
          abbrev_ptr += bytes_read;
714
        }
715
 
716
      hash_number = abbrev_number % ABBREV_HASH_SIZE;
717
      cur_abbrev->next = abbrevs[hash_number];
718
      abbrevs[hash_number] = cur_abbrev;
719
 
720
      /* Get next abbreviation.
721
         Under Irix6 the abbreviations for a compilation unit are not
722
         always properly terminated with an abbrev number of 0.
723
         Exit loop if we encounter an abbreviation which we have
724
         already read (which means we are about to read the abbreviations
725
         for the next compile unit) or if the end of the abbreviation
726
         table is reached.  */
727
      if ((unsigned int) (abbrev_ptr - stash->dwarf_abbrev_buffer)
728
          >= stash->dwarf_abbrev_size)
729
        break;
730
      abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
731
      abbrev_ptr += bytes_read;
732
      if (lookup_abbrev (abbrev_number,abbrevs) != NULL)
733
        break;
734
    }
735
 
736
  return abbrevs;
737
}
738
 
739
/* Read an attribute value described by an attribute form.  */
740
 
741
static bfd_byte *
742
read_attribute_value (struct attribute *attr,
743
                      unsigned form,
744
                      struct comp_unit *unit,
745
                      bfd_byte *info_ptr)
746
{
747
  bfd *abfd = unit->abfd;
748
  unsigned int bytes_read;
749
  struct dwarf_block *blk;
750
  bfd_size_type amt;
751
 
752
  attr->form = (enum dwarf_form) form;
753
 
754
  switch (form)
755
    {
756 225 jeremybenn
    case DW_FORM_ref_addr:
757
      /* DW_FORM_ref_addr is an address in DWARF2, and an offset in
758
         DWARF3.  */
759
      if (unit->version == 3)
760
        {
761
          if (unit->offset_size == 4)
762
            attr->u.val = read_4_bytes (unit->abfd, info_ptr);
763
          else
764
            attr->u.val = read_8_bytes (unit->abfd, info_ptr);
765
          info_ptr += unit->offset_size;
766
          break;
767
        }
768
      /* FALLTHROUGH */
769 24 jeremybenn
    case DW_FORM_addr:
770
      attr->u.val = read_address (unit, info_ptr);
771
      info_ptr += unit->addr_size;
772
      break;
773
    case DW_FORM_block2:
774
      amt = sizeof (struct dwarf_block);
775 225 jeremybenn
      blk = (struct dwarf_block *) bfd_alloc (abfd, amt);
776 24 jeremybenn
      blk->size = read_2_bytes (abfd, info_ptr);
777
      info_ptr += 2;
778
      blk->data = read_n_bytes (abfd, info_ptr, blk->size);
779
      info_ptr += blk->size;
780
      attr->u.blk = blk;
781
      break;
782
    case DW_FORM_block4:
783
      amt = sizeof (struct dwarf_block);
784 225 jeremybenn
      blk = (struct dwarf_block *) bfd_alloc (abfd, amt);
785 24 jeremybenn
      blk->size = read_4_bytes (abfd, info_ptr);
786
      info_ptr += 4;
787
      blk->data = read_n_bytes (abfd, info_ptr, blk->size);
788
      info_ptr += blk->size;
789
      attr->u.blk = blk;
790
      break;
791
    case DW_FORM_data2:
792
      attr->u.val = read_2_bytes (abfd, info_ptr);
793
      info_ptr += 2;
794
      break;
795
    case DW_FORM_data4:
796
      attr->u.val = read_4_bytes (abfd, info_ptr);
797
      info_ptr += 4;
798
      break;
799
    case DW_FORM_data8:
800
      attr->u.val = read_8_bytes (abfd, info_ptr);
801
      info_ptr += 8;
802
      break;
803
    case DW_FORM_string:
804
      attr->u.str = read_string (abfd, info_ptr, &bytes_read);
805
      info_ptr += bytes_read;
806
      break;
807
    case DW_FORM_strp:
808
      attr->u.str = read_indirect_string (unit, info_ptr, &bytes_read);
809
      info_ptr += bytes_read;
810
      break;
811
    case DW_FORM_block:
812
      amt = sizeof (struct dwarf_block);
813 225 jeremybenn
      blk = (struct dwarf_block *) bfd_alloc (abfd, amt);
814 24 jeremybenn
      blk->size = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
815
      info_ptr += bytes_read;
816
      blk->data = read_n_bytes (abfd, info_ptr, blk->size);
817
      info_ptr += blk->size;
818
      attr->u.blk = blk;
819
      break;
820
    case DW_FORM_block1:
821
      amt = sizeof (struct dwarf_block);
822 225 jeremybenn
      blk = (struct dwarf_block *) bfd_alloc (abfd, amt);
823 24 jeremybenn
      blk->size = read_1_byte (abfd, info_ptr);
824
      info_ptr += 1;
825
      blk->data = read_n_bytes (abfd, info_ptr, blk->size);
826
      info_ptr += blk->size;
827
      attr->u.blk = blk;
828
      break;
829
    case DW_FORM_data1:
830
      attr->u.val = read_1_byte (abfd, info_ptr);
831
      info_ptr += 1;
832
      break;
833
    case DW_FORM_flag:
834
      attr->u.val = read_1_byte (abfd, info_ptr);
835
      info_ptr += 1;
836
      break;
837
    case DW_FORM_sdata:
838
      attr->u.sval = read_signed_leb128 (abfd, info_ptr, &bytes_read);
839
      info_ptr += bytes_read;
840
      break;
841
    case DW_FORM_udata:
842
      attr->u.val = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
843
      info_ptr += bytes_read;
844
      break;
845
    case DW_FORM_ref1:
846
      attr->u.val = read_1_byte (abfd, info_ptr);
847
      info_ptr += 1;
848
      break;
849
    case DW_FORM_ref2:
850
      attr->u.val = read_2_bytes (abfd, info_ptr);
851
      info_ptr += 2;
852
      break;
853
    case DW_FORM_ref4:
854
      attr->u.val = read_4_bytes (abfd, info_ptr);
855
      info_ptr += 4;
856
      break;
857
    case DW_FORM_ref8:
858
      attr->u.val = read_8_bytes (abfd, info_ptr);
859
      info_ptr += 8;
860
      break;
861
    case DW_FORM_ref_udata:
862
      attr->u.val = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
863
      info_ptr += bytes_read;
864
      break;
865
    case DW_FORM_indirect:
866
      form = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
867
      info_ptr += bytes_read;
868
      info_ptr = read_attribute_value (attr, form, unit, info_ptr);
869
      break;
870
    default:
871
      (*_bfd_error_handler) (_("Dwarf Error: Invalid or unhandled FORM value: %u."),
872
                             form);
873
      bfd_set_error (bfd_error_bad_value);
874
    }
875
  return info_ptr;
876
}
877
 
878
/* Read an attribute described by an abbreviated attribute.  */
879
 
880
static bfd_byte *
881
read_attribute (struct attribute *attr,
882
                struct attr_abbrev *abbrev,
883
                struct comp_unit *unit,
884
                bfd_byte *info_ptr)
885
{
886
  attr->name = abbrev->name;
887
  info_ptr = read_attribute_value (attr, abbrev->form, unit, info_ptr);
888
  return info_ptr;
889
}
890
 
891
/* Source line information table routines.  */
892
 
893
#define FILE_ALLOC_CHUNK 5
894
#define DIR_ALLOC_CHUNK 5
895
 
896
struct line_info
897
{
898
  struct line_info* prev_line;
899
  bfd_vma address;
900
  char *filename;
901
  unsigned int line;
902
  unsigned int column;
903
  int end_sequence;             /* End of (sequential) code sequence.  */
904
};
905
 
906
struct fileinfo
907
{
908
  char *name;
909
  unsigned int dir;
910
  unsigned int time;
911
  unsigned int size;
912
};
913
 
914
struct line_info_table
915
{
916
  bfd* abfd;
917
  unsigned int num_files;
918
  unsigned int num_dirs;
919
  char *comp_dir;
920
  char **dirs;
921
  struct fileinfo* files;
922
  struct line_info* last_line;  /* largest VMA */
923
  struct line_info* lcl_head;   /* local head; used in 'add_line_info' */
924
};
925
 
926
/* Remember some information about each function.  If the function is
927
   inlined (DW_TAG_inlined_subroutine) it may have two additional
928
   attributes, DW_AT_call_file and DW_AT_call_line, which specify the
929
   source code location where this function was inlined. */
930
 
931
struct funcinfo
932
{
933
  struct funcinfo *prev_func;           /* Pointer to previous function in list of all functions */
934
  struct funcinfo *caller_func;         /* Pointer to function one scope higher */
935
  char *caller_file;                    /* Source location file name where caller_func inlines this func */
936
  int caller_line;                      /* Source location line number where caller_func inlines this func */
937
  char *file;                           /* Source location file name */
938
  int line;                             /* Source location line number */
939
  int tag;
940
  char *name;
941
  struct arange arange;
942
  asection *sec;                        /* Where the symbol is defined */
943
};
944
 
945
struct varinfo
946
{
947
  /* Pointer to previous variable in list of all variables */
948
  struct varinfo *prev_var;
949
  /* Source location file name */
950
  char *file;
951
  /* Source location line number */
952
  int line;
953
  int tag;
954
  char *name;
955
  bfd_vma addr;
956
  /* Where the symbol is defined */
957
  asection *sec;
958
  /* Is this a stack variable? */
959
  unsigned int stack: 1;
960
};
961
 
962
/* Return TRUE if NEW_LINE should sort after LINE.  */
963
 
964
static inline bfd_boolean
965
new_line_sorts_after (struct line_info *new_line, struct line_info *line)
966
{
967
  return (new_line->address > line->address
968
          || (new_line->address == line->address
969
              && new_line->end_sequence < line->end_sequence));
970
}
971
 
972
 
973
/* Adds a new entry to the line_info list in the line_info_table, ensuring
974
   that the list is sorted.  Note that the line_info list is sorted from
975
   highest to lowest VMA (with possible duplicates); that is,
976
   line_info->prev_line always accesses an equal or smaller VMA.  */
977
 
978
static void
979
add_line_info (struct line_info_table *table,
980
               bfd_vma address,
981
               char *filename,
982
               unsigned int line,
983
               unsigned int column,
984
               int end_sequence)
985
{
986
  bfd_size_type amt = sizeof (struct line_info);
987 225 jeremybenn
  struct line_info* info = (struct line_info *) bfd_alloc (table->abfd, amt);
988 24 jeremybenn
 
989
  /* Set member data of 'info'.  */
990
  info->address = address;
991
  info->line = line;
992
  info->column = column;
993
  info->end_sequence = end_sequence;
994
 
995
  if (filename && filename[0])
996
    {
997 225 jeremybenn
      info->filename = (char *) bfd_alloc (table->abfd, strlen (filename) + 1);
998 24 jeremybenn
      if (info->filename)
999
        strcpy (info->filename, filename);
1000
    }
1001
  else
1002
    info->filename = NULL;
1003
 
1004
  /* Find the correct location for 'info'.  Normally we will receive
1005
     new line_info data 1) in order and 2) with increasing VMAs.
1006
     However some compilers break the rules (cf. decode_line_info) and
1007
     so we include some heuristics for quickly finding the correct
1008
     location for 'info'. In particular, these heuristics optimize for
1009
     the common case in which the VMA sequence that we receive is a
1010
     list of locally sorted VMAs such as
1011
       p...z a...j  (where a < j < p < z)
1012
 
1013
     Note: table->lcl_head is used to head an *actual* or *possible*
1014
     sequence within the list (such as a...j) that is not directly
1015
     headed by table->last_line
1016
 
1017
     Note: we may receive duplicate entries from 'decode_line_info'.  */
1018
 
1019
  if (table->last_line
1020
      && table->last_line->address == address
1021
      && table->last_line->end_sequence == end_sequence)
1022
    {
1023
      /* We only keep the last entry with the same address and end
1024
         sequence.  See PR ld/4986.  */
1025
      if (table->lcl_head == table->last_line)
1026
        table->lcl_head = info;
1027
      info->prev_line = table->last_line->prev_line;
1028
      table->last_line = info;
1029
    }
1030
  else if (!table->last_line
1031
      || new_line_sorts_after (info, table->last_line))
1032
    {
1033
      /* Normal case: add 'info' to the beginning of the list */
1034
      info->prev_line = table->last_line;
1035
      table->last_line = info;
1036
 
1037
      /* lcl_head: initialize to head a *possible* sequence at the end.  */
1038
      if (!table->lcl_head)
1039
        table->lcl_head = info;
1040
    }
1041
  else if (!new_line_sorts_after (info, table->lcl_head)
1042
           && (!table->lcl_head->prev_line
1043
               || new_line_sorts_after (info, table->lcl_head->prev_line)))
1044
    {
1045
      /* Abnormal but easy: lcl_head is the head of 'info'.  */
1046
      info->prev_line = table->lcl_head->prev_line;
1047
      table->lcl_head->prev_line = info;
1048
    }
1049
  else
1050
    {
1051
      /* Abnormal and hard: Neither 'last_line' nor 'lcl_head' are valid
1052
         heads for 'info'.  Reset 'lcl_head'.  */
1053
      struct line_info* li2 = table->last_line; /* always non-NULL */
1054
      struct line_info* li1 = li2->prev_line;
1055
 
1056
      while (li1)
1057
        {
1058
          if (!new_line_sorts_after (info, li2)
1059
              && new_line_sorts_after (info, li1))
1060
            break;
1061
 
1062
          li2 = li1; /* always non-NULL */
1063
          li1 = li1->prev_line;
1064
        }
1065
      table->lcl_head = li2;
1066
      info->prev_line = table->lcl_head->prev_line;
1067
      table->lcl_head->prev_line = info;
1068
    }
1069
}
1070
 
1071
/* Extract a fully qualified filename from a line info table.
1072
   The returned string has been malloc'ed and it is the caller's
1073
   responsibility to free it.  */
1074
 
1075
static char *
1076
concat_filename (struct line_info_table *table, unsigned int file)
1077
{
1078
  char *filename;
1079
 
1080
  if (file - 1 >= table->num_files)
1081
    {
1082
      /* FILE == 0 means unknown.  */
1083
      if (file)
1084
        (*_bfd_error_handler)
1085
          (_("Dwarf Error: mangled line number section (bad file number)."));
1086
      return strdup ("<unknown>");
1087
    }
1088
 
1089
  filename = table->files[file - 1].name;
1090
 
1091
  if (!IS_ABSOLUTE_PATH (filename))
1092
    {
1093
      char *dirname = NULL;
1094
      char *subdirname = NULL;
1095
      char *name;
1096
      size_t len;
1097
 
1098
      if (table->files[file - 1].dir)
1099
        subdirname = table->dirs[table->files[file - 1].dir - 1];
1100
 
1101
      if (!subdirname || !IS_ABSOLUTE_PATH (subdirname))
1102
        dirname = table->comp_dir;
1103
 
1104
      if (!dirname)
1105
        {
1106
          dirname = subdirname;
1107
          subdirname = NULL;
1108
        }
1109
 
1110
      if (!dirname)
1111
        return strdup (filename);
1112
 
1113
      len = strlen (dirname) + strlen (filename) + 2;
1114
 
1115
      if (subdirname)
1116
        {
1117
          len += strlen (subdirname) + 1;
1118 225 jeremybenn
          name = (char *) bfd_malloc (len);
1119 24 jeremybenn
          if (name)
1120
            sprintf (name, "%s/%s/%s", dirname, subdirname, filename);
1121
        }
1122
      else
1123
        {
1124 225 jeremybenn
          name = (char *) bfd_malloc (len);
1125 24 jeremybenn
          if (name)
1126
            sprintf (name, "%s/%s", dirname, filename);
1127
        }
1128
 
1129
      return name;
1130
    }
1131
 
1132
  return strdup (filename);
1133
}
1134
 
1135
static void
1136
arange_add (bfd *abfd, struct arange *first_arange, bfd_vma low_pc, bfd_vma high_pc)
1137
{
1138
  struct arange *arange;
1139
 
1140
  /* If the first arange is empty, use it. */
1141
  if (first_arange->high == 0)
1142
    {
1143
      first_arange->low = low_pc;
1144
      first_arange->high = high_pc;
1145
      return;
1146
    }
1147
 
1148
  /* Next see if we can cheaply extend an existing range.  */
1149
  arange = first_arange;
1150
  do
1151
    {
1152
      if (low_pc == arange->high)
1153
        {
1154
          arange->high = high_pc;
1155
          return;
1156
        }
1157
      if (high_pc == arange->low)
1158
        {
1159
          arange->low = low_pc;
1160
          return;
1161
        }
1162
      arange = arange->next;
1163
    }
1164
  while (arange);
1165
 
1166
  /* Need to allocate a new arange and insert it into the arange list.
1167
     Order isn't significant, so just insert after the first arange. */
1168 225 jeremybenn
  arange = (struct arange *) bfd_zalloc (abfd, sizeof (*arange));
1169 24 jeremybenn
  arange->low = low_pc;
1170
  arange->high = high_pc;
1171
  arange->next = first_arange->next;
1172
  first_arange->next = arange;
1173
}
1174
 
1175
/* Decode the line number information for UNIT.  */
1176
 
1177
static struct line_info_table*
1178
decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
1179
{
1180
  bfd *abfd = unit->abfd;
1181
  struct line_info_table* table;
1182
  bfd_byte *line_ptr;
1183
  bfd_byte *line_end;
1184
  struct line_head lh;
1185
  unsigned int i, bytes_read, offset_size;
1186
  char *cur_file, *cur_dir;
1187
  unsigned char op_code, extended_op, adj_opcode;
1188
  bfd_size_type amt;
1189
 
1190 225 jeremybenn
  if (! read_section (abfd, ".debug_line", ".zdebug_line",
1191
                      stash->syms, unit->line_offset,
1192
                      &stash->dwarf_line_buffer, &stash->dwarf_line_size))
1193
    return 0;
1194 24 jeremybenn
 
1195
  amt = sizeof (struct line_info_table);
1196 225 jeremybenn
  table = (struct line_info_table *) bfd_alloc (abfd, amt);
1197 24 jeremybenn
  table->abfd = abfd;
1198
  table->comp_dir = unit->comp_dir;
1199
 
1200
  table->num_files = 0;
1201
  table->files = NULL;
1202
 
1203
  table->num_dirs = 0;
1204
  table->dirs = NULL;
1205
 
1206
  table->files = NULL;
1207
  table->last_line = NULL;
1208
  table->lcl_head = NULL;
1209
 
1210
  line_ptr = stash->dwarf_line_buffer + unit->line_offset;
1211
 
1212
  /* Read in the prologue.  */
1213
  lh.total_length = read_4_bytes (abfd, line_ptr);
1214
  line_ptr += 4;
1215
  offset_size = 4;
1216
  if (lh.total_length == 0xffffffff)
1217
    {
1218
      lh.total_length = read_8_bytes (abfd, line_ptr);
1219
      line_ptr += 8;
1220
      offset_size = 8;
1221
    }
1222
  else if (lh.total_length == 0 && unit->addr_size == 8)
1223
    {
1224
      /* Handle (non-standard) 64-bit DWARF2 formats.  */
1225
      lh.total_length = read_4_bytes (abfd, line_ptr);
1226
      line_ptr += 4;
1227
      offset_size = 8;
1228
    }
1229
  line_end = line_ptr + lh.total_length;
1230
  lh.version = read_2_bytes (abfd, line_ptr);
1231
  line_ptr += 2;
1232
  if (offset_size == 4)
1233
    lh.prologue_length = read_4_bytes (abfd, line_ptr);
1234
  else
1235
    lh.prologue_length = read_8_bytes (abfd, line_ptr);
1236
  line_ptr += offset_size;
1237
  lh.minimum_instruction_length = read_1_byte (abfd, line_ptr);
1238
  line_ptr += 1;
1239
  lh.default_is_stmt = read_1_byte (abfd, line_ptr);
1240
  line_ptr += 1;
1241
  lh.line_base = read_1_signed_byte (abfd, line_ptr);
1242
  line_ptr += 1;
1243
  lh.line_range = read_1_byte (abfd, line_ptr);
1244
  line_ptr += 1;
1245
  lh.opcode_base = read_1_byte (abfd, line_ptr);
1246
  line_ptr += 1;
1247
  amt = lh.opcode_base * sizeof (unsigned char);
1248 225 jeremybenn
  lh.standard_opcode_lengths = (unsigned char *) bfd_alloc (abfd, amt);
1249 24 jeremybenn
 
1250
  lh.standard_opcode_lengths[0] = 1;
1251
 
1252
  for (i = 1; i < lh.opcode_base; ++i)
1253
    {
1254
      lh.standard_opcode_lengths[i] = read_1_byte (abfd, line_ptr);
1255
      line_ptr += 1;
1256
    }
1257
 
1258
  /* Read directory table.  */
1259
  while ((cur_dir = read_string (abfd, line_ptr, &bytes_read)) != NULL)
1260
    {
1261
      line_ptr += bytes_read;
1262
 
1263
      if ((table->num_dirs % DIR_ALLOC_CHUNK) == 0)
1264
        {
1265
          char **tmp;
1266
 
1267
          amt = table->num_dirs + DIR_ALLOC_CHUNK;
1268
          amt *= sizeof (char *);
1269
 
1270 225 jeremybenn
          tmp = (char **) bfd_realloc (table->dirs, amt);
1271 24 jeremybenn
          if (tmp == NULL)
1272
            {
1273
              free (table->dirs);
1274
              return NULL;
1275
            }
1276
          table->dirs = tmp;
1277
        }
1278
 
1279
      table->dirs[table->num_dirs++] = cur_dir;
1280
    }
1281
 
1282
  line_ptr += bytes_read;
1283
 
1284
  /* Read file name table.  */
1285
  while ((cur_file = read_string (abfd, line_ptr, &bytes_read)) != NULL)
1286
    {
1287
      line_ptr += bytes_read;
1288
 
1289
      if ((table->num_files % FILE_ALLOC_CHUNK) == 0)
1290
        {
1291
          struct fileinfo *tmp;
1292
 
1293
          amt = table->num_files + FILE_ALLOC_CHUNK;
1294
          amt *= sizeof (struct fileinfo);
1295
 
1296 225 jeremybenn
          tmp = (struct fileinfo *) bfd_realloc (table->files, amt);
1297 24 jeremybenn
          if (tmp == NULL)
1298
            {
1299
              free (table->files);
1300
              free (table->dirs);
1301
              return NULL;
1302
            }
1303
          table->files = tmp;
1304
        }
1305
 
1306
      table->files[table->num_files].name = cur_file;
1307
      table->files[table->num_files].dir =
1308
        read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1309
      line_ptr += bytes_read;
1310
      table->files[table->num_files].time =
1311
        read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1312
      line_ptr += bytes_read;
1313
      table->files[table->num_files].size =
1314
        read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1315
      line_ptr += bytes_read;
1316
      table->num_files++;
1317
    }
1318
 
1319
  line_ptr += bytes_read;
1320
 
1321
  /* Read the statement sequences until there's nothing left.  */
1322
  while (line_ptr < line_end)
1323
    {
1324
      /* State machine registers.  */
1325
      bfd_vma address = 0;
1326
      char * filename = table->num_files ? concat_filename (table, 1) : NULL;
1327
      unsigned int line = 1;
1328
      unsigned int column = 0;
1329
      int is_stmt = lh.default_is_stmt;
1330
      int end_sequence = 0;
1331
      /* eraxxon@alumni.rice.edu: Against the DWARF2 specs, some
1332
         compilers generate address sequences that are wildly out of
1333
         order using DW_LNE_set_address (e.g. Intel C++ 6.0 compiler
1334
         for ia64-Linux).  Thus, to determine the low and high
1335
         address, we must compare on every DW_LNS_copy, etc.  */
1336
      bfd_vma low_pc  = (bfd_vma) -1;
1337
      bfd_vma high_pc = 0;
1338
 
1339
      /* Decode the table.  */
1340
      while (! end_sequence)
1341
        {
1342
          op_code = read_1_byte (abfd, line_ptr);
1343
          line_ptr += 1;
1344
 
1345
          if (op_code >= lh.opcode_base)
1346
            {
1347
              /* Special operand.  */
1348
              adj_opcode = op_code - lh.opcode_base;
1349
              address += (adj_opcode / lh.line_range)
1350
                * lh.minimum_instruction_length;
1351
              line += lh.line_base + (adj_opcode % lh.line_range);
1352
              /* Append row to matrix using current values.  */
1353
              add_line_info (table, address, filename, line, column, 0);
1354
              if (address < low_pc)
1355
                low_pc = address;
1356
              if (address > high_pc)
1357
                high_pc = address;
1358
            }
1359
          else switch (op_code)
1360
            {
1361
            case DW_LNS_extended_op:
1362
              /* Ignore length.  */
1363
              line_ptr += 1;
1364
              extended_op = read_1_byte (abfd, line_ptr);
1365
              line_ptr += 1;
1366
 
1367
              switch (extended_op)
1368
                {
1369
                case DW_LNE_end_sequence:
1370
                  end_sequence = 1;
1371
                  add_line_info (table, address, filename, line, column,
1372
                                 end_sequence);
1373
                  if (address < low_pc)
1374
                    low_pc = address;
1375
                  if (address > high_pc)
1376
                    high_pc = address;
1377
                  arange_add (unit->abfd, &unit->arange, low_pc, high_pc);
1378
                  break;
1379
                case DW_LNE_set_address:
1380
                  address = read_address (unit, line_ptr);
1381
                  line_ptr += unit->addr_size;
1382
                  break;
1383
                case DW_LNE_define_file:
1384
                  cur_file = read_string (abfd, line_ptr, &bytes_read);
1385
                  line_ptr += bytes_read;
1386
                  if ((table->num_files % FILE_ALLOC_CHUNK) == 0)
1387
                    {
1388
                      struct fileinfo *tmp;
1389
 
1390
                      amt = table->num_files + FILE_ALLOC_CHUNK;
1391
                      amt *= sizeof (struct fileinfo);
1392 225 jeremybenn
                      tmp = (struct fileinfo *) bfd_realloc (table->files, amt);
1393 24 jeremybenn
                      if (tmp == NULL)
1394
                        {
1395
                          free (table->files);
1396
                          free (table->dirs);
1397
                          free (filename);
1398
                          return NULL;
1399
                        }
1400
                      table->files = tmp;
1401
                    }
1402
                  table->files[table->num_files].name = cur_file;
1403
                  table->files[table->num_files].dir =
1404
                    read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1405
                  line_ptr += bytes_read;
1406
                  table->files[table->num_files].time =
1407
                    read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1408
                  line_ptr += bytes_read;
1409
                  table->files[table->num_files].size =
1410
                    read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1411
                  line_ptr += bytes_read;
1412
                  table->num_files++;
1413
                  break;
1414 225 jeremybenn
                case DW_LNE_set_discriminator:
1415
                  (void) read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1416
                  line_ptr += bytes_read;
1417
                  break;
1418 24 jeremybenn
                default:
1419
                  (*_bfd_error_handler) (_("Dwarf Error: mangled line number section."));
1420
                  bfd_set_error (bfd_error_bad_value);
1421
                  free (filename);
1422
                  free (table->files);
1423
                  free (table->dirs);
1424
                  return NULL;
1425
                }
1426
              break;
1427
            case DW_LNS_copy:
1428
              add_line_info (table, address, filename, line, column, 0);
1429
              if (address < low_pc)
1430
                low_pc = address;
1431
              if (address > high_pc)
1432
                high_pc = address;
1433
              break;
1434
            case DW_LNS_advance_pc:
1435
              address += lh.minimum_instruction_length
1436
                * read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1437
              line_ptr += bytes_read;
1438
              break;
1439
            case DW_LNS_advance_line:
1440
              line += read_signed_leb128 (abfd, line_ptr, &bytes_read);
1441
              line_ptr += bytes_read;
1442
              break;
1443
            case DW_LNS_set_file:
1444
              {
1445
                unsigned int file;
1446
 
1447
                /* The file and directory tables are 0
1448
                   based, the references are 1 based.  */
1449
                file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1450
                line_ptr += bytes_read;
1451
                if (filename)
1452
                  free (filename);
1453
                filename = concat_filename (table, file);
1454
                break;
1455
              }
1456
            case DW_LNS_set_column:
1457
              column = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1458
              line_ptr += bytes_read;
1459
              break;
1460
            case DW_LNS_negate_stmt:
1461
              is_stmt = (!is_stmt);
1462
              break;
1463
            case DW_LNS_set_basic_block:
1464
              break;
1465
            case DW_LNS_const_add_pc:
1466
              address += lh.minimum_instruction_length
1467
                      * ((255 - lh.opcode_base) / lh.line_range);
1468
              break;
1469
            case DW_LNS_fixed_advance_pc:
1470
              address += read_2_bytes (abfd, line_ptr);
1471
              line_ptr += 2;
1472
              break;
1473
            default:
1474
              {
1475
                int i;
1476
 
1477
                /* Unknown standard opcode, ignore it.  */
1478
                for (i = 0; i < lh.standard_opcode_lengths[op_code]; i++)
1479
                  {
1480
                    (void) read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
1481
                    line_ptr += bytes_read;
1482
                  }
1483
              }
1484
            }
1485
        }
1486
 
1487
      if (filename)
1488
        free (filename);
1489
    }
1490
 
1491
  return table;
1492
}
1493
 
1494
/* If ADDR is within TABLE set the output parameters and return TRUE,
1495
   otherwise return FALSE.  The output parameters, FILENAME_PTR and
1496
   LINENUMBER_PTR, are pointers to the objects to be filled in.  */
1497
 
1498
static bfd_boolean
1499
lookup_address_in_line_info_table (struct line_info_table *table,
1500
                                   bfd_vma addr,
1501
                                   const char **filename_ptr,
1502
                                   unsigned int *linenumber_ptr)
1503
{
1504
  /* Note: table->last_line should be a descendingly sorted list. */
1505 225 jeremybenn
  struct line_info *each_line;
1506 24 jeremybenn
 
1507 225 jeremybenn
  for (each_line = table->last_line;
1508
       each_line;
1509
       each_line = each_line->prev_line)
1510
    if (addr >= each_line->address)
1511
      break;
1512 24 jeremybenn
 
1513 225 jeremybenn
  if (each_line
1514
      && !(each_line->end_sequence || each_line == table->last_line))
1515 24 jeremybenn
    {
1516 225 jeremybenn
      *filename_ptr = each_line->filename;
1517
      *linenumber_ptr = each_line->line;
1518 24 jeremybenn
      return TRUE;
1519
    }
1520
 
1521 225 jeremybenn
  *filename_ptr = NULL;
1522 24 jeremybenn
  return FALSE;
1523
}
1524
 
1525
/* Read in the .debug_ranges section for future reference */
1526
 
1527
static bfd_boolean
1528
read_debug_ranges (struct comp_unit *unit)
1529
{
1530
  struct dwarf2_debug *stash = unit->stash;
1531 225 jeremybenn
  return read_section (unit->abfd, ".debug_ranges", ".zdebug_ranges",
1532
                       stash->syms, 0,
1533
                       &stash->dwarf_ranges_buffer, &stash->dwarf_ranges_size);
1534 24 jeremybenn
}
1535
 
1536
/* Function table functions.  */
1537
 
1538
/* If ADDR is within TABLE, set FUNCTIONNAME_PTR, and return TRUE.
1539
   Note that we need to find the function that has the smallest
1540
   range that contains ADDR, to handle inlined functions without
1541
   depending upon them being ordered in TABLE by increasing range. */
1542
 
1543
static bfd_boolean
1544
lookup_address_in_function_table (struct comp_unit *unit,
1545
                                  bfd_vma addr,
1546
                                  struct funcinfo **function_ptr,
1547
                                  const char **functionname_ptr)
1548
{
1549
  struct funcinfo* each_func;
1550
  struct funcinfo* best_fit = NULL;
1551
  struct arange *arange;
1552
 
1553
  for (each_func = unit->function_table;
1554
       each_func;
1555
       each_func = each_func->prev_func)
1556
    {
1557
      for (arange = &each_func->arange;
1558
           arange;
1559
           arange = arange->next)
1560
        {
1561
          if (addr >= arange->low && addr < arange->high)
1562
            {
1563
              if (!best_fit ||
1564
                  ((arange->high - arange->low) < (best_fit->arange.high - best_fit->arange.low)))
1565
                best_fit = each_func;
1566
            }
1567
        }
1568
    }
1569
 
1570
  if (best_fit)
1571
    {
1572
      *functionname_ptr = best_fit->name;
1573
      *function_ptr = best_fit;
1574
      return TRUE;
1575
    }
1576
  else
1577
    {
1578
      return FALSE;
1579
    }
1580
}
1581
 
1582
/* If SYM at ADDR is within function table of UNIT, set FILENAME_PTR
1583
   and LINENUMBER_PTR, and return TRUE.  */
1584
 
1585
static bfd_boolean
1586
lookup_symbol_in_function_table (struct comp_unit *unit,
1587
                                 asymbol *sym,
1588
                                 bfd_vma addr,
1589
                                 const char **filename_ptr,
1590
                                 unsigned int *linenumber_ptr)
1591
{
1592
  struct funcinfo* each_func;
1593
  struct funcinfo* best_fit = NULL;
1594
  struct arange *arange;
1595
  const char *name = bfd_asymbol_name (sym);
1596
  asection *sec = bfd_get_section (sym);
1597
 
1598
  for (each_func = unit->function_table;
1599
       each_func;
1600
       each_func = each_func->prev_func)
1601
    {
1602
      for (arange = &each_func->arange;
1603
           arange;
1604
           arange = arange->next)
1605
        {
1606
          if ((!each_func->sec || each_func->sec == sec)
1607
              && addr >= arange->low
1608
              && addr < arange->high
1609
              && each_func->name
1610
              && strcmp (name, each_func->name) == 0
1611
              && (!best_fit
1612
                  || ((arange->high - arange->low)
1613
                      < (best_fit->arange.high - best_fit->arange.low))))
1614
            best_fit = each_func;
1615
        }
1616
    }
1617
 
1618
  if (best_fit)
1619
    {
1620
      best_fit->sec = sec;
1621
      *filename_ptr = best_fit->file;
1622
      *linenumber_ptr = best_fit->line;
1623
      return TRUE;
1624
    }
1625
  else
1626
    return FALSE;
1627
}
1628
 
1629
/* Variable table functions.  */
1630
 
1631
/* If SYM is within variable table of UNIT, set FILENAME_PTR and
1632
   LINENUMBER_PTR, and return TRUE.  */
1633
 
1634
static bfd_boolean
1635
lookup_symbol_in_variable_table (struct comp_unit *unit,
1636
                                 asymbol *sym,
1637
                                 bfd_vma addr,
1638
                                 const char **filename_ptr,
1639
                                 unsigned int *linenumber_ptr)
1640
{
1641
  const char *name = bfd_asymbol_name (sym);
1642
  asection *sec = bfd_get_section (sym);
1643
  struct varinfo* each;
1644
 
1645
  for (each = unit->variable_table; each; each = each->prev_var)
1646
    if (each->stack == 0
1647
        && each->file != NULL
1648
        && each->name != NULL
1649
        && each->addr == addr
1650
        && (!each->sec || each->sec == sec)
1651
        && strcmp (name, each->name) == 0)
1652
      break;
1653
 
1654
  if (each)
1655
    {
1656
      each->sec = sec;
1657
      *filename_ptr = each->file;
1658
      *linenumber_ptr = each->line;
1659
      return TRUE;
1660
    }
1661
  else
1662
    return FALSE;
1663
}
1664
 
1665
static char *
1666 225 jeremybenn
find_abstract_instance_name (struct comp_unit *unit,
1667
                             struct attribute *attr_ptr)
1668 24 jeremybenn
{
1669
  bfd *abfd = unit->abfd;
1670
  bfd_byte *info_ptr;
1671
  unsigned int abbrev_number, bytes_read, i;
1672
  struct abbrev_info *abbrev;
1673 225 jeremybenn
  bfd_uint64_t die_ref = attr_ptr->u.val;
1674 24 jeremybenn
  struct attribute attr;
1675
  char *name = 0;
1676
 
1677 225 jeremybenn
  /* DW_FORM_ref_addr can reference an entry in a different CU. It
1678
     is an offset from the .debug_info section, not the current CU.  */
1679
  if (attr_ptr->form == DW_FORM_ref_addr)
1680
    {
1681
      /* We only support DW_FORM_ref_addr within the same file, so
1682
         any relocations should be resolved already.  */
1683
      if (!die_ref)
1684
        abort ();
1685
 
1686
      info_ptr = unit->sec_info_ptr + die_ref;
1687
    }
1688
  else
1689
    info_ptr = unit->info_ptr_unit + die_ref;
1690 24 jeremybenn
  abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
1691
  info_ptr += bytes_read;
1692
 
1693
  if (abbrev_number)
1694
    {
1695
      abbrev = lookup_abbrev (abbrev_number, unit->abbrevs);
1696
      if (! abbrev)
1697
        {
1698
          (*_bfd_error_handler) (_("Dwarf Error: Could not find abbrev number %u."),
1699
                                 abbrev_number);
1700
          bfd_set_error (bfd_error_bad_value);
1701
        }
1702
      else
1703
        {
1704
          for (i = 0; i < abbrev->num_attrs; ++i)
1705
            {
1706
              info_ptr = read_attribute (&attr, &abbrev->attrs[i], unit, info_ptr);
1707
              switch (attr.name)
1708
                {
1709
                case DW_AT_name:
1710
                  /* Prefer DW_AT_MIPS_linkage_name over DW_AT_name.  */
1711
                  if (name == NULL)
1712
                    name = attr.u.str;
1713
                  break;
1714
                case DW_AT_specification:
1715 225 jeremybenn
                  name = find_abstract_instance_name (unit, &attr);
1716 24 jeremybenn
                  break;
1717
                case DW_AT_MIPS_linkage_name:
1718
                  name = attr.u.str;
1719
                  break;
1720
                default:
1721
                  break;
1722
                }
1723
            }
1724
        }
1725
    }
1726
  return (name);
1727
}
1728
 
1729
static void
1730
read_rangelist (struct comp_unit *unit, struct arange *arange, bfd_uint64_t offset)
1731
{
1732
  bfd_byte *ranges_ptr;
1733
  bfd_vma base_address = unit->base_address;
1734
 
1735
  if (! unit->stash->dwarf_ranges_buffer)
1736
    {
1737
      if (! read_debug_ranges (unit))
1738
        return;
1739
    }
1740
  ranges_ptr = unit->stash->dwarf_ranges_buffer + offset;
1741
 
1742
  for (;;)
1743
    {
1744
      bfd_vma low_pc;
1745
      bfd_vma high_pc;
1746
 
1747 225 jeremybenn
      low_pc = read_address (unit, ranges_ptr);
1748
      ranges_ptr += unit->addr_size;
1749
      high_pc = read_address (unit, ranges_ptr);
1750
      ranges_ptr += unit->addr_size;
1751
 
1752 24 jeremybenn
      if (low_pc == 0 && high_pc == 0)
1753
        break;
1754
      if (low_pc == -1UL && high_pc != -1UL)
1755
        base_address = high_pc;
1756
      else
1757
        arange_add (unit->abfd, arange, base_address + low_pc, base_address + high_pc);
1758
    }
1759
}
1760
 
1761
/* DWARF2 Compilation unit functions.  */
1762
 
1763
/* Scan over each die in a comp. unit looking for functions to add
1764
   to the function table and variables to the variable table.  */
1765
 
1766
static bfd_boolean
1767
scan_unit_for_symbols (struct comp_unit *unit)
1768
{
1769
  bfd *abfd = unit->abfd;
1770
  bfd_byte *info_ptr = unit->first_child_die_ptr;
1771
  int nesting_level = 1;
1772
  struct funcinfo **nested_funcs;
1773
  int nested_funcs_size;
1774
 
1775
  /* Maintain a stack of in-scope functions and inlined functions, which we
1776
     can use to set the caller_func field.  */
1777
  nested_funcs_size = 32;
1778 225 jeremybenn
  nested_funcs = (struct funcinfo **)
1779
      bfd_malloc (nested_funcs_size * sizeof (struct funcinfo *));
1780 24 jeremybenn
  if (nested_funcs == NULL)
1781
    return FALSE;
1782
  nested_funcs[nesting_level] = 0;
1783
 
1784
  while (nesting_level)
1785
    {
1786
      unsigned int abbrev_number, bytes_read, i;
1787
      struct abbrev_info *abbrev;
1788
      struct attribute attr;
1789
      struct funcinfo *func;
1790
      struct varinfo *var;
1791
      bfd_vma low_pc = 0;
1792
      bfd_vma high_pc = 0;
1793
 
1794
      abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
1795
      info_ptr += bytes_read;
1796
 
1797
      if (! abbrev_number)
1798
        {
1799
          nesting_level--;
1800
          continue;
1801
        }
1802
 
1803
      abbrev = lookup_abbrev (abbrev_number,unit->abbrevs);
1804
      if (! abbrev)
1805
        {
1806
          (*_bfd_error_handler) (_("Dwarf Error: Could not find abbrev number %u."),
1807
                             abbrev_number);
1808
          bfd_set_error (bfd_error_bad_value);
1809
          free (nested_funcs);
1810
          return FALSE;
1811
        }
1812
 
1813
      var = NULL;
1814
      if (abbrev->tag == DW_TAG_subprogram
1815
          || abbrev->tag == DW_TAG_entry_point
1816
          || abbrev->tag == DW_TAG_inlined_subroutine)
1817
        {
1818
          bfd_size_type amt = sizeof (struct funcinfo);
1819 225 jeremybenn
          func = (struct funcinfo *) bfd_zalloc (abfd, amt);
1820 24 jeremybenn
          func->tag = abbrev->tag;
1821
          func->prev_func = unit->function_table;
1822
          unit->function_table = func;
1823
          BFD_ASSERT (!unit->cached);
1824
 
1825
          if (func->tag == DW_TAG_inlined_subroutine)
1826
            for (i = nesting_level - 1; i >= 1; i--)
1827
              if (nested_funcs[i])
1828
                {
1829
                  func->caller_func = nested_funcs[i];
1830
                  break;
1831
                }
1832
          nested_funcs[nesting_level] = func;
1833
        }
1834
      else
1835
        {
1836
          func = NULL;
1837
          if (abbrev->tag == DW_TAG_variable)
1838
            {
1839
              bfd_size_type amt = sizeof (struct varinfo);
1840 225 jeremybenn
              var = (struct varinfo *) bfd_zalloc (abfd, amt);
1841 24 jeremybenn
              var->tag = abbrev->tag;
1842
              var->stack = 1;
1843
              var->prev_var = unit->variable_table;
1844
              unit->variable_table = var;
1845
              BFD_ASSERT (!unit->cached);
1846
            }
1847
 
1848
          /* No inline function in scope at this nesting level.  */
1849
          nested_funcs[nesting_level] = 0;
1850
        }
1851
 
1852
      for (i = 0; i < abbrev->num_attrs; ++i)
1853
        {
1854
          info_ptr = read_attribute (&attr, &abbrev->attrs[i], unit, info_ptr);
1855
 
1856
          if (func)
1857
            {
1858
              switch (attr.name)
1859
                {
1860
                case DW_AT_call_file:
1861
                  func->caller_file = concat_filename (unit->line_table, attr.u.val);
1862
                  break;
1863
 
1864
                case DW_AT_call_line:
1865
                  func->caller_line = attr.u.val;
1866
                  break;
1867
 
1868
                case DW_AT_abstract_origin:
1869 225 jeremybenn
                  func->name = find_abstract_instance_name (unit, &attr);
1870 24 jeremybenn
                  break;
1871
 
1872
                case DW_AT_name:
1873
                  /* Prefer DW_AT_MIPS_linkage_name over DW_AT_name.  */
1874
                  if (func->name == NULL)
1875
                    func->name = attr.u.str;
1876
                  break;
1877
 
1878
                case DW_AT_MIPS_linkage_name:
1879
                  func->name = attr.u.str;
1880
                  break;
1881
 
1882
                case DW_AT_low_pc:
1883
                  low_pc = attr.u.val;
1884
                  break;
1885
 
1886
                case DW_AT_high_pc:
1887
                  high_pc = attr.u.val;
1888
                  break;
1889
 
1890
                case DW_AT_ranges:
1891
                  read_rangelist (unit, &func->arange, attr.u.val);
1892
                  break;
1893
 
1894
                case DW_AT_decl_file:
1895
                  func->file = concat_filename (unit->line_table,
1896
                                                attr.u.val);
1897
                  break;
1898
 
1899
                case DW_AT_decl_line:
1900
                  func->line = attr.u.val;
1901
                  break;
1902
 
1903
                default:
1904
                  break;
1905
                }
1906
            }
1907
          else if (var)
1908
            {
1909
              switch (attr.name)
1910
                {
1911
                case DW_AT_name:
1912
                  var->name = attr.u.str;
1913
                  break;
1914
 
1915
                case DW_AT_decl_file:
1916
                  var->file = concat_filename (unit->line_table,
1917
                                               attr.u.val);
1918
                  break;
1919
 
1920
                case DW_AT_decl_line:
1921
                  var->line = attr.u.val;
1922
                  break;
1923
 
1924
                case DW_AT_external:
1925
                  if (attr.u.val != 0)
1926
                    var->stack = 0;
1927
                  break;
1928
 
1929
                case DW_AT_location:
1930
                  switch (attr.form)
1931
                    {
1932
                    case DW_FORM_block:
1933
                    case DW_FORM_block1:
1934
                    case DW_FORM_block2:
1935
                    case DW_FORM_block4:
1936
                      if (*attr.u.blk->data == DW_OP_addr)
1937
                        {
1938
                          var->stack = 0;
1939
 
1940
                          /* Verify that DW_OP_addr is the only opcode in the
1941
                             location, in which case the block size will be 1
1942
                             plus the address size.  */
1943
                          /* ??? For TLS variables, gcc can emit
1944
                             DW_OP_addr <addr> DW_OP_GNU_push_tls_address
1945
                             which we don't handle here yet.  */
1946
                          if (attr.u.blk->size == unit->addr_size + 1U)
1947
                            var->addr = bfd_get (unit->addr_size * 8,
1948
                                                 unit->abfd,
1949
                                                 attr.u.blk->data + 1);
1950
                        }
1951
                      break;
1952
 
1953
                    default:
1954
                      break;
1955
                    }
1956
                  break;
1957
 
1958
                default:
1959
                  break;
1960
                }
1961
            }
1962
        }
1963
 
1964
      if (func && high_pc != 0)
1965
        {
1966
          arange_add (unit->abfd, &func->arange, low_pc, high_pc);
1967
        }
1968
 
1969
      if (abbrev->has_children)
1970
        {
1971
          nesting_level++;
1972
 
1973
          if (nesting_level >= nested_funcs_size)
1974
            {
1975
              struct funcinfo **tmp;
1976
 
1977
              nested_funcs_size *= 2;
1978 225 jeremybenn
              tmp = (struct funcinfo **)
1979
                 bfd_realloc (nested_funcs,
1980
                              (nested_funcs_size * sizeof (struct funcinfo *)));
1981 24 jeremybenn
              if (tmp == NULL)
1982
                {
1983
                  free (nested_funcs);
1984
                  return FALSE;
1985
                }
1986
              nested_funcs = tmp;
1987
            }
1988
          nested_funcs[nesting_level] = 0;
1989
        }
1990
    }
1991
 
1992
  free (nested_funcs);
1993
  return TRUE;
1994
}
1995
 
1996
/* Parse a DWARF2 compilation unit starting at INFO_PTR.  This
1997
   includes the compilation unit header that proceeds the DIE's, but
1998
   does not include the length field that precedes each compilation
1999
   unit header.  END_PTR points one past the end of this comp unit.
2000
   OFFSET_SIZE is the size of DWARF2 offsets (either 4 or 8 bytes).
2001
 
2002
   This routine does not read the whole compilation unit; only enough
2003
   to get to the line number information for the compilation unit.  */
2004
 
2005
static struct comp_unit *
2006
parse_comp_unit (struct dwarf2_debug *stash,
2007
                 bfd_vma unit_length,
2008
                 bfd_byte *info_ptr_unit,
2009
                 unsigned int offset_size)
2010
{
2011
  struct comp_unit* unit;
2012
  unsigned int version;
2013
  bfd_uint64_t abbrev_offset = 0;
2014
  unsigned int addr_size;
2015
  struct abbrev_info** abbrevs;
2016
  unsigned int abbrev_number, bytes_read, i;
2017
  struct abbrev_info *abbrev;
2018
  struct attribute attr;
2019
  bfd_byte *info_ptr = stash->info_ptr;
2020
  bfd_byte *end_ptr = info_ptr + unit_length;
2021
  bfd_size_type amt;
2022
  bfd_vma low_pc = 0;
2023
  bfd_vma high_pc = 0;
2024 225 jeremybenn
  bfd *abfd = stash->bfd_ptr;
2025 24 jeremybenn
 
2026
  version = read_2_bytes (abfd, info_ptr);
2027
  info_ptr += 2;
2028
  BFD_ASSERT (offset_size == 4 || offset_size == 8);
2029
  if (offset_size == 4)
2030
    abbrev_offset = read_4_bytes (abfd, info_ptr);
2031
  else
2032
    abbrev_offset = read_8_bytes (abfd, info_ptr);
2033
  info_ptr += offset_size;
2034
  addr_size = read_1_byte (abfd, info_ptr);
2035
  info_ptr += 1;
2036
 
2037 225 jeremybenn
  if (version != 2 && version != 3)
2038 24 jeremybenn
    {
2039 225 jeremybenn
      (*_bfd_error_handler) (_("Dwarf Error: found dwarf version '%u', this reader only handles version 2 and 3 information."), version);
2040 24 jeremybenn
      bfd_set_error (bfd_error_bad_value);
2041
      return 0;
2042
    }
2043
 
2044
  if (addr_size > sizeof (bfd_vma))
2045
    {
2046
      (*_bfd_error_handler) (_("Dwarf Error: found address size '%u', this reader can not handle sizes greater than '%u'."),
2047
                         addr_size,
2048
                         (unsigned int) sizeof (bfd_vma));
2049
      bfd_set_error (bfd_error_bad_value);
2050
      return 0;
2051
    }
2052
 
2053
  if (addr_size != 2 && addr_size != 4 && addr_size != 8)
2054
    {
2055
      (*_bfd_error_handler) ("Dwarf Error: found address size '%u', this reader can only handle address sizes '2', '4' and '8'.", addr_size);
2056
      bfd_set_error (bfd_error_bad_value);
2057
      return 0;
2058
    }
2059
 
2060
  /* Read the abbrevs for this compilation unit into a table.  */
2061
  abbrevs = read_abbrevs (abfd, abbrev_offset, stash);
2062
  if (! abbrevs)
2063
      return 0;
2064
 
2065
  abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
2066
  info_ptr += bytes_read;
2067
  if (! abbrev_number)
2068
    {
2069
      (*_bfd_error_handler) (_("Dwarf Error: Bad abbrev number: %u."),
2070
                         abbrev_number);
2071
      bfd_set_error (bfd_error_bad_value);
2072
      return 0;
2073
    }
2074
 
2075
  abbrev = lookup_abbrev (abbrev_number, abbrevs);
2076
  if (! abbrev)
2077
    {
2078
      (*_bfd_error_handler) (_("Dwarf Error: Could not find abbrev number %u."),
2079
                         abbrev_number);
2080
      bfd_set_error (bfd_error_bad_value);
2081
      return 0;
2082
    }
2083
 
2084
  amt = sizeof (struct comp_unit);
2085 225 jeremybenn
  unit = (struct comp_unit *) bfd_zalloc (abfd, amt);
2086 24 jeremybenn
  unit->abfd = abfd;
2087 225 jeremybenn
  unit->version = version;
2088 24 jeremybenn
  unit->addr_size = addr_size;
2089
  unit->offset_size = offset_size;
2090
  unit->abbrevs = abbrevs;
2091
  unit->end_ptr = end_ptr;
2092
  unit->stash = stash;
2093
  unit->info_ptr_unit = info_ptr_unit;
2094 225 jeremybenn
  unit->sec_info_ptr = stash->sec_info_ptr;
2095 24 jeremybenn
 
2096
  for (i = 0; i < abbrev->num_attrs; ++i)
2097
    {
2098
      info_ptr = read_attribute (&attr, &abbrev->attrs[i], unit, info_ptr);
2099
 
2100
      /* Store the data if it is of an attribute we want to keep in a
2101
         partial symbol table.  */
2102
      switch (attr.name)
2103
        {
2104
        case DW_AT_stmt_list:
2105
          unit->stmtlist = 1;
2106
          unit->line_offset = attr.u.val;
2107
          break;
2108
 
2109
        case DW_AT_name:
2110
          unit->name = attr.u.str;
2111
          break;
2112
 
2113
        case DW_AT_low_pc:
2114
          low_pc = attr.u.val;
2115
          /* If the compilation unit DIE has a DW_AT_low_pc attribute,
2116
             this is the base address to use when reading location
2117
             lists or range lists. */
2118
          unit->base_address = low_pc;
2119
          break;
2120
 
2121
        case DW_AT_high_pc:
2122
          high_pc = attr.u.val;
2123
          break;
2124
 
2125
        case DW_AT_ranges:
2126
          read_rangelist (unit, &unit->arange, attr.u.val);
2127
          break;
2128
 
2129
        case DW_AT_comp_dir:
2130
          {
2131
            char *comp_dir = attr.u.str;
2132
            if (comp_dir)
2133
              {
2134
                /* Irix 6.2 native cc prepends <machine>.: to the compilation
2135
                   directory, get rid of it.  */
2136
                char *cp = strchr (comp_dir, ':');
2137
 
2138
                if (cp && cp != comp_dir && cp[-1] == '.' && cp[1] == '/')
2139
                  comp_dir = cp + 1;
2140
              }
2141
            unit->comp_dir = comp_dir;
2142
            break;
2143
          }
2144
 
2145
        default:
2146
          break;
2147
        }
2148
    }
2149
  if (high_pc != 0)
2150
    {
2151
      arange_add (unit->abfd, &unit->arange, low_pc, high_pc);
2152
    }
2153
 
2154
  unit->first_child_die_ptr = info_ptr;
2155
  return unit;
2156
}
2157
 
2158
/* Return TRUE if UNIT may contain the address given by ADDR.  When
2159
   there are functions written entirely with inline asm statements, the
2160
   range info in the compilation unit header may not be correct.  We
2161
   need to consult the line info table to see if a compilation unit
2162
   really contains the given address.  */
2163
 
2164
static bfd_boolean
2165
comp_unit_contains_address (struct comp_unit *unit, bfd_vma addr)
2166
{
2167
  struct arange *arange;
2168
 
2169
  if (unit->error)
2170
    return FALSE;
2171
 
2172
  arange = &unit->arange;
2173
  do
2174
    {
2175
      if (addr >= arange->low && addr < arange->high)
2176
        return TRUE;
2177
      arange = arange->next;
2178
    }
2179
  while (arange);
2180
 
2181
  return FALSE;
2182
}
2183
 
2184
/* If UNIT contains ADDR, set the output parameters to the values for
2185
   the line containing ADDR.  The output parameters, FILENAME_PTR,
2186
   FUNCTIONNAME_PTR, and LINENUMBER_PTR, are pointers to the objects
2187
   to be filled in.
2188
 
2189
   Return TRUE if UNIT contains ADDR, and no errors were encountered;
2190
   FALSE otherwise.  */
2191
 
2192
static bfd_boolean
2193
comp_unit_find_nearest_line (struct comp_unit *unit,
2194
                             bfd_vma addr,
2195
                             const char **filename_ptr,
2196
                             const char **functionname_ptr,
2197
                             unsigned int *linenumber_ptr,
2198
                             struct dwarf2_debug *stash)
2199
{
2200
  bfd_boolean line_p;
2201
  bfd_boolean func_p;
2202
  struct funcinfo *function;
2203
 
2204
  if (unit->error)
2205
    return FALSE;
2206
 
2207
  if (! unit->line_table)
2208
    {
2209
      if (! unit->stmtlist)
2210
        {
2211
          unit->error = 1;
2212
          return FALSE;
2213
        }
2214
 
2215
      unit->line_table = decode_line_info (unit, stash);
2216
 
2217
      if (! unit->line_table)
2218
        {
2219
          unit->error = 1;
2220
          return FALSE;
2221
        }
2222
 
2223
      if (unit->first_child_die_ptr < unit->end_ptr
2224
          && ! scan_unit_for_symbols (unit))
2225
        {
2226
          unit->error = 1;
2227
          return FALSE;
2228
        }
2229
    }
2230
 
2231
  function = NULL;
2232
  func_p = lookup_address_in_function_table (unit, addr,
2233
                                             &function, functionname_ptr);
2234
  if (func_p && (function->tag == DW_TAG_inlined_subroutine))
2235
    stash->inliner_chain = function;
2236
  line_p = lookup_address_in_line_info_table (unit->line_table, addr,
2237 225 jeremybenn
                                              filename_ptr,
2238 24 jeremybenn
                                              linenumber_ptr);
2239
  return line_p || func_p;
2240
}
2241
 
2242
/* Check to see if line info is already decoded in a comp_unit.
2243
   If not, decode it.  Returns TRUE if no errors were encountered;
2244
   FALSE otherwise.  */
2245
 
2246
static bfd_boolean
2247
comp_unit_maybe_decode_line_info (struct comp_unit *unit,
2248
                                  struct dwarf2_debug *stash)
2249
{
2250
  if (unit->error)
2251
    return FALSE;
2252
 
2253
  if (! unit->line_table)
2254
    {
2255
      if (! unit->stmtlist)
2256
        {
2257
          unit->error = 1;
2258
          return FALSE;
2259
        }
2260
 
2261
      unit->line_table = decode_line_info (unit, stash);
2262
 
2263
      if (! unit->line_table)
2264
        {
2265
          unit->error = 1;
2266
          return FALSE;
2267
        }
2268
 
2269
      if (unit->first_child_die_ptr < unit->end_ptr
2270
          && ! scan_unit_for_symbols (unit))
2271
        {
2272
          unit->error = 1;
2273
          return FALSE;
2274
        }
2275
    }
2276
 
2277
  return TRUE;
2278
}
2279
 
2280
/* If UNIT contains SYM at ADDR, set the output parameters to the
2281
   values for the line containing SYM.  The output parameters,
2282
   FILENAME_PTR, and LINENUMBER_PTR, are pointers to the objects to be
2283
   filled in.
2284
 
2285
   Return TRUE if UNIT contains SYM, and no errors were encountered;
2286
   FALSE otherwise.  */
2287
 
2288
static bfd_boolean
2289
comp_unit_find_line (struct comp_unit *unit,
2290
                     asymbol *sym,
2291
                     bfd_vma addr,
2292
                     const char **filename_ptr,
2293
                     unsigned int *linenumber_ptr,
2294
                     struct dwarf2_debug *stash)
2295
{
2296
  if (!comp_unit_maybe_decode_line_info (unit, stash))
2297
    return FALSE;
2298
 
2299
  if (sym->flags & BSF_FUNCTION)
2300
    return lookup_symbol_in_function_table (unit, sym, addr,
2301
                                            filename_ptr,
2302
                                            linenumber_ptr);
2303
 
2304
  return lookup_symbol_in_variable_table (unit, sym, addr,
2305
                                          filename_ptr,
2306
                                          linenumber_ptr);
2307
}
2308
 
2309
static struct funcinfo *
2310
reverse_funcinfo_list (struct funcinfo *head)
2311
{
2312
  struct funcinfo *rhead;
2313
  struct funcinfo *temp;
2314
 
2315
  for (rhead = NULL; head; head = temp)
2316
    {
2317
      temp = head->prev_func;
2318
      head->prev_func = rhead;
2319
      rhead = head;
2320
    }
2321
  return rhead;
2322
}
2323
 
2324
static struct varinfo *
2325
reverse_varinfo_list (struct varinfo *head)
2326
{
2327
  struct varinfo *rhead;
2328
  struct varinfo *temp;
2329
 
2330
  for (rhead = NULL; head; head = temp)
2331
    {
2332
      temp = head->prev_var;
2333
      head->prev_var = rhead;
2334
      rhead = head;
2335
    }
2336
  return rhead;
2337
}
2338
 
2339
/* Extract all interesting funcinfos and varinfos of a compilation
2340
   unit into hash tables for faster lookup.  Returns TRUE if no
2341
   errors were enountered; FALSE otherwise.  */
2342
 
2343
static bfd_boolean
2344
comp_unit_hash_info (struct dwarf2_debug *stash,
2345
                     struct comp_unit *unit,
2346
                     struct info_hash_table *funcinfo_hash_table,
2347
                     struct info_hash_table *varinfo_hash_table)
2348
{
2349
  struct funcinfo* each_func;
2350
  struct varinfo* each_var;
2351
  bfd_boolean okay = TRUE;
2352
 
2353
  BFD_ASSERT (stash->info_hash_status != STASH_INFO_HASH_DISABLED);
2354
 
2355
  if (!comp_unit_maybe_decode_line_info (unit, stash))
2356
    return FALSE;
2357
 
2358
  BFD_ASSERT (!unit->cached);
2359
 
2360
  /* To preserve the original search order, we went to visit the function
2361
     infos in the reversed order of the list.  However, making the list
2362
     bi-directional use quite a bit of extra memory.  So we reverse
2363
     the list first, traverse the list in the now reversed order and
2364
     finally reverse the list again to get back the original order.  */
2365
  unit->function_table = reverse_funcinfo_list (unit->function_table);
2366
  for (each_func = unit->function_table;
2367
       each_func && okay;
2368
       each_func = each_func->prev_func)
2369
    {
2370
      /* Skip nameless functions. */
2371
      if (each_func->name)
2372
        /* There is no need to copy name string into hash table as
2373
           name string is either in the dwarf string buffer or
2374
           info in the stash.  */
2375
        okay = insert_info_hash_table (funcinfo_hash_table, each_func->name,
2376
                                       (void*) each_func, FALSE);
2377
    }
2378
  unit->function_table = reverse_funcinfo_list (unit->function_table);
2379
  if (!okay)
2380
    return FALSE;
2381
 
2382
  /* We do the same for variable infos.  */
2383
  unit->variable_table = reverse_varinfo_list (unit->variable_table);
2384
  for (each_var = unit->variable_table;
2385
       each_var && okay;
2386
       each_var = each_var->prev_var)
2387
    {
2388
      /* Skip stack vars and vars with no files or names.  */
2389
      if (each_var->stack == 0
2390
          && each_var->file != NULL
2391
          && each_var->name != NULL)
2392
        /* There is no need to copy name string into hash table as
2393
           name string is either in the dwarf string buffer or
2394
           info in the stash.  */
2395
        okay = insert_info_hash_table (varinfo_hash_table, each_var->name,
2396
                                       (void*) each_var, FALSE);
2397
    }
2398
 
2399
  unit->variable_table = reverse_varinfo_list (unit->variable_table);
2400
  unit->cached = TRUE;
2401
  return okay;
2402
}
2403
 
2404
/* Locate a section in a BFD containing debugging info.  The search starts
2405
   from the section after AFTER_SEC, or from the first section in the BFD if
2406
   AFTER_SEC is NULL.  The search works by examining the names of the
2407
   sections.  There are two permissiable names.  The first is .debug_info.
2408
   This is the standard DWARF2 name.  The second is a prefix .gnu.linkonce.wi.
2409
   This is a variation on the .debug_info section which has a checksum
2410
   describing the contents appended onto the name.  This allows the linker to
2411
   identify and discard duplicate debugging sections for different
2412
   compilation units.  */
2413
#define DWARF2_DEBUG_INFO ".debug_info"
2414 225 jeremybenn
#define DWARF2_COMPRESSED_DEBUG_INFO ".zdebug_info"
2415 24 jeremybenn
#define GNU_LINKONCE_INFO ".gnu.linkonce.wi."
2416
 
2417
static asection *
2418
find_debug_info (bfd *abfd, asection *after_sec)
2419
{
2420
  asection * msec;
2421
 
2422
  msec = after_sec != NULL ? after_sec->next : abfd->sections;
2423
 
2424
  while (msec)
2425
    {
2426
      if (strcmp (msec->name, DWARF2_DEBUG_INFO) == 0)
2427
        return msec;
2428
 
2429 225 jeremybenn
      if (strcmp (msec->name, DWARF2_COMPRESSED_DEBUG_INFO) == 0)
2430
        return msec;
2431
 
2432 24 jeremybenn
      if (CONST_STRNEQ (msec->name, GNU_LINKONCE_INFO))
2433
        return msec;
2434
 
2435
      msec = msec->next;
2436
    }
2437
 
2438
  return NULL;
2439
}
2440
 
2441 225 jeremybenn
/* Unset vmas for adjusted sections in STASH.  */
2442 24 jeremybenn
 
2443
static void
2444
unset_sections (struct dwarf2_debug *stash)
2445
{
2446
  unsigned int i;
2447 225 jeremybenn
  struct adjusted_section *p;
2448 24 jeremybenn
 
2449 225 jeremybenn
  i = stash->adjusted_section_count;
2450
  p = stash->adjusted_sections;
2451 24 jeremybenn
  for (; i > 0; i--, p++)
2452
    p->section->vma = 0;
2453
}
2454
 
2455 225 jeremybenn
/* Set unique VMAs for loadable and DWARF sections in ABFD and save
2456
   VMAs in STASH for unset_sections.  */
2457 24 jeremybenn
 
2458
static bfd_boolean
2459
place_sections (bfd *abfd, struct dwarf2_debug *stash)
2460
{
2461 225 jeremybenn
  struct adjusted_section *p;
2462 24 jeremybenn
  unsigned int i;
2463
 
2464 225 jeremybenn
  if (stash->adjusted_section_count != 0)
2465 24 jeremybenn
    {
2466 225 jeremybenn
      i = stash->adjusted_section_count;
2467
      p = stash->adjusted_sections;
2468 24 jeremybenn
      for (; i > 0; i--, p++)
2469
        p->section->vma = p->adj_vma;
2470
    }
2471
  else
2472
    {
2473
      asection *sect;
2474 225 jeremybenn
      bfd_vma last_vma = 0, last_dwarf = 0;
2475 24 jeremybenn
      bfd_size_type amt;
2476 225 jeremybenn
      struct adjusted_section *p;
2477 24 jeremybenn
 
2478
      i = 0;
2479
      for (sect = abfd->sections; sect != NULL; sect = sect->next)
2480
        {
2481
          bfd_size_type sz;
2482 225 jeremybenn
          int is_debug_info;
2483 24 jeremybenn
 
2484 225 jeremybenn
          if (sect->vma != 0)
2485 24 jeremybenn
            continue;
2486
 
2487 225 jeremybenn
          /* We need to adjust the VMAs of any .debug_info sections.
2488
             Skip compressed ones, since no relocations could target
2489
             them - they should not appear in object files anyway.  */
2490
          if (strcmp (sect->name, DWARF2_DEBUG_INFO) == 0)
2491
            is_debug_info = 1;
2492
          else if (CONST_STRNEQ (sect->name, GNU_LINKONCE_INFO))
2493
            is_debug_info = 1;
2494
          else
2495
            is_debug_info = 0;
2496
 
2497
          if (!is_debug_info && (sect->flags & SEC_LOAD) == 0)
2498
            continue;
2499
 
2500 24 jeremybenn
          sz = sect->rawsize ? sect->rawsize : sect->size;
2501
          if (sz == 0)
2502
            continue;
2503
 
2504
          i++;
2505
        }
2506
 
2507 225 jeremybenn
      amt = i * sizeof (struct adjusted_section);
2508
      p = (struct adjusted_section *) bfd_zalloc (abfd, amt);
2509 24 jeremybenn
      if (! p)
2510
        return FALSE;
2511
 
2512 225 jeremybenn
      stash->adjusted_sections = p;
2513
      stash->adjusted_section_count = i;
2514 24 jeremybenn
 
2515
      for (sect = abfd->sections; sect != NULL; sect = sect->next)
2516
        {
2517
          bfd_size_type sz;
2518 225 jeremybenn
          int is_debug_info;
2519 24 jeremybenn
 
2520 225 jeremybenn
          if (sect->vma != 0)
2521 24 jeremybenn
            continue;
2522
 
2523 225 jeremybenn
          /* We need to adjust the VMAs of any .debug_info sections.
2524
             Skip compressed ones, since no relocations could target
2525
             them - they should not appear in object files anyway.  */
2526
          if (strcmp (sect->name, DWARF2_DEBUG_INFO) == 0)
2527
            is_debug_info = 1;
2528
          else if (CONST_STRNEQ (sect->name, GNU_LINKONCE_INFO))
2529
            is_debug_info = 1;
2530
          else
2531
            is_debug_info = 0;
2532
 
2533
          if (!is_debug_info && (sect->flags & SEC_LOAD) == 0)
2534
            continue;
2535
 
2536 24 jeremybenn
          sz = sect->rawsize ? sect->rawsize : sect->size;
2537
          if (sz == 0)
2538
            continue;
2539
 
2540
          p->section = sect;
2541 225 jeremybenn
          if (is_debug_info)
2542 24 jeremybenn
            {
2543 225 jeremybenn
              BFD_ASSERT (sect->alignment_power == 0);
2544
              sect->vma = last_dwarf;
2545
              last_dwarf += sz;
2546
            }
2547
          else if (last_vma != 0)
2548
            {
2549 24 jeremybenn
              /* Align the new address to the current section
2550
                 alignment.  */
2551
              last_vma = ((last_vma
2552
                           + ~((bfd_vma) -1 << sect->alignment_power))
2553
                          & ((bfd_vma) -1 << sect->alignment_power));
2554
              sect->vma = last_vma;
2555 225 jeremybenn
              last_vma += sect->vma + sz;
2556 24 jeremybenn
            }
2557 225 jeremybenn
          else
2558
            last_vma += sect->vma + sz;
2559
 
2560 24 jeremybenn
          p->adj_vma = sect->vma;
2561
 
2562
          p++;
2563
        }
2564
    }
2565
 
2566
  return TRUE;
2567
}
2568
 
2569
/* Look up a funcinfo by name using the given info hash table.  If found,
2570
   also update the locations pointed to by filename_ptr and linenumber_ptr.
2571
 
2572
   This function returns TRUE if a funcinfo that matches the given symbol
2573
   and address is found with any error; otherwise it returns FALSE.  */
2574
 
2575
static bfd_boolean
2576
info_hash_lookup_funcinfo (struct info_hash_table *hash_table,
2577
                           asymbol *sym,
2578
                           bfd_vma addr,
2579
                           const char **filename_ptr,
2580
                           unsigned int *linenumber_ptr)
2581
{
2582
  struct funcinfo* each_func;
2583
  struct funcinfo* best_fit = NULL;
2584
  struct info_list_node *node;
2585
  struct arange *arange;
2586
  const char *name = bfd_asymbol_name (sym);
2587
  asection *sec = bfd_get_section (sym);
2588
 
2589
  for (node = lookup_info_hash_table (hash_table, name);
2590
       node;
2591
       node = node->next)
2592
    {
2593 225 jeremybenn
      each_func = (struct funcinfo *) node->info;
2594 24 jeremybenn
      for (arange = &each_func->arange;
2595
           arange;
2596
           arange = arange->next)
2597
        {
2598
          if ((!each_func->sec || each_func->sec == sec)
2599
              && addr >= arange->low
2600
              && addr < arange->high
2601
              && (!best_fit
2602
                  || ((arange->high - arange->low)
2603
                      < (best_fit->arange.high - best_fit->arange.low))))
2604
            best_fit = each_func;
2605
        }
2606
    }
2607
 
2608
  if (best_fit)
2609
    {
2610
      best_fit->sec = sec;
2611
      *filename_ptr = best_fit->file;
2612
      *linenumber_ptr = best_fit->line;
2613
      return TRUE;
2614
    }
2615
 
2616
  return FALSE;
2617
}
2618
 
2619
/* Look up a varinfo by name using the given info hash table.  If found,
2620
   also update the locations pointed to by filename_ptr and linenumber_ptr.
2621
 
2622
   This function returns TRUE if a varinfo that matches the given symbol
2623
   and address is found with any error; otherwise it returns FALSE.  */
2624
 
2625
static bfd_boolean
2626
info_hash_lookup_varinfo (struct info_hash_table *hash_table,
2627
                          asymbol *sym,
2628
                          bfd_vma addr,
2629
                          const char **filename_ptr,
2630
                          unsigned int *linenumber_ptr)
2631
{
2632
  const char *name = bfd_asymbol_name (sym);
2633
  asection *sec = bfd_get_section (sym);
2634
  struct varinfo* each;
2635
  struct info_list_node *node;
2636
 
2637
  for (node = lookup_info_hash_table (hash_table, name);
2638
       node;
2639
       node = node->next)
2640
    {
2641 225 jeremybenn
      each = (struct varinfo *) node->info;
2642 24 jeremybenn
      if (each->addr == addr
2643
          && (!each->sec || each->sec == sec))
2644
        {
2645
          each->sec = sec;
2646
          *filename_ptr = each->file;
2647
          *linenumber_ptr = each->line;
2648
          return TRUE;
2649
        }
2650
    }
2651
 
2652
  return FALSE;
2653
}
2654
 
2655
/* Update the funcinfo and varinfo info hash tables if they are
2656
   not up to date.  Returns TRUE if there is no error; otherwise
2657
   returns FALSE and disable the info hash tables.  */
2658
 
2659
static bfd_boolean
2660
stash_maybe_update_info_hash_tables (struct dwarf2_debug *stash)
2661
{
2662
  struct comp_unit *each;
2663
 
2664
  /* Exit if hash tables are up-to-date.  */
2665
  if (stash->all_comp_units == stash->hash_units_head)
2666
    return TRUE;
2667
 
2668
  if (stash->hash_units_head)
2669
    each = stash->hash_units_head->prev_unit;
2670
  else
2671
    each = stash->last_comp_unit;
2672
 
2673
  while (each)
2674
    {
2675
      if (!comp_unit_hash_info (stash, each, stash->funcinfo_hash_table,
2676
                                stash->varinfo_hash_table))
2677
        {
2678
          stash->info_hash_status = STASH_INFO_HASH_DISABLED;
2679
          return FALSE;
2680
        }
2681
      each = each->prev_unit;
2682
    }
2683
 
2684
  stash->hash_units_head = stash->all_comp_units;
2685
  return TRUE;
2686
}
2687
 
2688
/* Check consistency of info hash tables.  This is for debugging only. */
2689
 
2690
static void ATTRIBUTE_UNUSED
2691
stash_verify_info_hash_table (struct dwarf2_debug *stash)
2692
{
2693
  struct comp_unit *each_unit;
2694
  struct funcinfo *each_func;
2695
  struct varinfo *each_var;
2696
  struct info_list_node *node;
2697
  bfd_boolean found;
2698
 
2699
  for (each_unit = stash->all_comp_units;
2700
       each_unit;
2701
       each_unit = each_unit->next_unit)
2702
    {
2703
      for (each_func = each_unit->function_table;
2704
           each_func;
2705
           each_func = each_func->prev_func)
2706
        {
2707
          if (!each_func->name)
2708
            continue;
2709
          node = lookup_info_hash_table (stash->funcinfo_hash_table,
2710
                                         each_func->name);
2711
          BFD_ASSERT (node);
2712
          found = FALSE;
2713
          while (node && !found)
2714
            {
2715
              found = node->info == each_func;
2716
              node = node->next;
2717
            }
2718
          BFD_ASSERT (found);
2719
        }
2720
 
2721
      for (each_var = each_unit->variable_table;
2722
           each_var;
2723
           each_var = each_var->prev_var)
2724
        {
2725
          if (!each_var->name || !each_var->file || each_var->stack)
2726
            continue;
2727
          node = lookup_info_hash_table (stash->varinfo_hash_table,
2728
                                         each_var->name);
2729
          BFD_ASSERT (node);
2730
          found = FALSE;
2731
          while (node && !found)
2732
            {
2733
              found = node->info == each_var;
2734
              node = node->next;
2735
            }
2736
          BFD_ASSERT (found);
2737
        }
2738
    }
2739
}
2740
 
2741
/* Check to see if we want to enable the info hash tables, which consume
2742
   quite a bit of memory.  Currently we only check the number times
2743
   bfd_dwarf2_find_line is called.  In the future, we may also want to
2744
   take the number of symbols into account.  */
2745
 
2746
static void
2747
stash_maybe_enable_info_hash_tables (bfd *abfd, struct dwarf2_debug *stash)
2748
{
2749
  BFD_ASSERT (stash->info_hash_status == STASH_INFO_HASH_OFF);
2750
 
2751
  if (stash->info_hash_count++ < STASH_INFO_HASH_TRIGGER)
2752
    return;
2753
 
2754
  /* FIXME: Maybe we should check the reduce_memory_overheads
2755
     and optimize fields in the bfd_link_info structure ?  */
2756
 
2757
  /* Create hash tables.  */
2758
  stash->funcinfo_hash_table = create_info_hash_table (abfd);
2759
  stash->varinfo_hash_table = create_info_hash_table (abfd);
2760
  if (!stash->funcinfo_hash_table || !stash->varinfo_hash_table)
2761
    {
2762
      /* Turn off info hashes if any allocation above fails.  */
2763
      stash->info_hash_status = STASH_INFO_HASH_DISABLED;
2764
      return;
2765
    }
2766
  /* We need a forced update so that the info hash tables will
2767
     be created even though there is no compilation unit.  That
2768
     happens if STASH_INFO_HASH_TRIGGER is 0.  */
2769
  stash_maybe_update_info_hash_tables (stash);
2770
  stash->info_hash_status = STASH_INFO_HASH_ON;
2771
}
2772
 
2773
/* Find the file and line associated with a symbol and address using the
2774
   info hash tables of a stash. If there is a match, the function returns
2775
   TRUE and update the locations pointed to by filename_ptr and linenumber_ptr;
2776
   otherwise it returns FALSE.  */
2777
 
2778
static bfd_boolean
2779
stash_find_line_fast (struct dwarf2_debug *stash,
2780
                      asymbol *sym,
2781
                      bfd_vma addr,
2782
                      const char **filename_ptr,
2783
                      unsigned int *linenumber_ptr)
2784
{
2785
  BFD_ASSERT (stash->info_hash_status == STASH_INFO_HASH_ON);
2786
 
2787
  if (sym->flags & BSF_FUNCTION)
2788
    return info_hash_lookup_funcinfo (stash->funcinfo_hash_table, sym, addr,
2789
                                      filename_ptr, linenumber_ptr);
2790
  return info_hash_lookup_varinfo (stash->varinfo_hash_table, sym, addr,
2791
                                   filename_ptr, linenumber_ptr);
2792
}
2793
 
2794
/* Find the source code location of SYMBOL.  If SYMBOL is NULL
2795
   then find the nearest source code location corresponding to
2796
   the address SECTION + OFFSET.
2797
   Returns TRUE if the line is found without error and fills in
2798
   FILENAME_PTR and LINENUMBER_PTR.  In the case where SYMBOL was
2799
   NULL the FUNCTIONNAME_PTR is also filled in.
2800
   SYMBOLS contains the symbol table for ABFD.
2801
   ADDR_SIZE is the number of bytes in the initial .debug_info length
2802
   field and in the abbreviation offset, or zero to indicate that the
2803
   default value should be used.  */
2804
 
2805
static bfd_boolean
2806
find_line (bfd *abfd,
2807
           asection *section,
2808
           bfd_vma offset,
2809
           asymbol *symbol,
2810
           asymbol **symbols,
2811
           const char **filename_ptr,
2812
           const char **functionname_ptr,
2813
           unsigned int *linenumber_ptr,
2814
           unsigned int addr_size,
2815
           void **pinfo)
2816
{
2817
  /* Read each compilation unit from the section .debug_info, and check
2818
     to see if it contains the address we are searching for.  If yes,
2819
     lookup the address, and return the line number info.  If no, go
2820
     on to the next compilation unit.
2821
 
2822
     We keep a list of all the previously read compilation units, and
2823
     a pointer to the next un-read compilation unit.  Check the
2824
     previously read units before reading more.  */
2825
  struct dwarf2_debug *stash;
2826
  /* What address are we looking for?  */
2827
  bfd_vma addr;
2828
  struct comp_unit* each;
2829
  bfd_vma found = FALSE;
2830
  bfd_boolean do_line;
2831
 
2832 225 jeremybenn
  stash = (struct dwarf2_debug *) *pinfo;
2833 24 jeremybenn
 
2834
  if (! stash)
2835
    {
2836
      bfd_size_type amt = sizeof (struct dwarf2_debug);
2837
 
2838 225 jeremybenn
      stash = (struct dwarf2_debug *) bfd_zalloc (abfd, amt);
2839 24 jeremybenn
      if (! stash)
2840
        return FALSE;
2841
    }
2842
 
2843
  /* In a relocatable file, 2 functions may have the same address.
2844
     We change the section vma so that they won't overlap.  */
2845
  if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
2846
    {
2847
      if (! place_sections (abfd, stash))
2848
        return FALSE;
2849
    }
2850
 
2851
  do_line = (section == NULL
2852
             && offset == 0
2853
             && functionname_ptr == NULL
2854
             && symbol != NULL);
2855
  if (do_line)
2856
    {
2857
      addr = symbol->value;
2858
      section = bfd_get_section (symbol);
2859
    }
2860
  else if (section != NULL
2861
           && functionname_ptr != NULL
2862
           && symbol == NULL)
2863
    addr = offset;
2864
  else
2865
    abort ();
2866
 
2867
  if (section->output_section)
2868
    addr += section->output_section->vma + section->output_offset;
2869
  else
2870
    addr += section->vma;
2871
  *filename_ptr = NULL;
2872
  if (! do_line)
2873
    *functionname_ptr = NULL;
2874
  *linenumber_ptr = 0;
2875
 
2876
  if (! *pinfo)
2877
    {
2878
      bfd *debug_bfd;
2879
      bfd_size_type total_size;
2880
      asection *msec;
2881
 
2882
      *pinfo = stash;
2883
 
2884
      msec = find_debug_info (abfd, NULL);
2885
      if (msec == NULL)
2886
        {
2887
          char * debug_filename = bfd_follow_gnu_debuglink (abfd, DEBUGDIR);
2888
 
2889
          if (debug_filename == NULL)
2890
            /* No dwarf2 info, and no gnu_debuglink to follow.
2891
               Note that at this point the stash has been allocated, but
2892
               contains zeros.  This lets future calls to this function
2893
               fail more quickly.  */
2894
            goto done;
2895
 
2896
          if ((debug_bfd = bfd_openr (debug_filename, NULL)) == NULL
2897
              || ! bfd_check_format (debug_bfd, bfd_object)
2898
              || (msec = find_debug_info (debug_bfd, NULL)) == NULL)
2899
            {
2900
              if (debug_bfd)
2901
                bfd_close (debug_bfd);
2902
              /* FIXME: Should we report our failure to follow the debuglink ?  */
2903
              free (debug_filename);
2904
              goto done;
2905
            }
2906
        }
2907
      else
2908
        debug_bfd = abfd;
2909
 
2910 225 jeremybenn
      /* There can be more than one DWARF2 info section in a BFD these
2911
         days.  First handle the easy case when there's only one.  If
2912
         there's more than one, try case two: none of the sections is
2913
         compressed.  In that case, read them all in and produce one
2914
         large stash.  We do this in two passes - in the first pass we
2915
         just accumulate the section sizes, and in the second pass we
2916
         read in the section's contents.  (The allows us to avoid
2917
         reallocing the data as we add sections to the stash.)  If
2918
         some or all sections are compressed, then do things the slow
2919
         way, with a bunch of reallocs.  */
2920 24 jeremybenn
 
2921 225 jeremybenn
      if (! find_debug_info (debug_bfd, msec))
2922
        {
2923
          /* Case 1: only one info section.  */
2924
          total_size = msec->size;
2925
          if (! read_section (debug_bfd, ".debug_info", ".zdebug_info",
2926
                              symbols, 0,
2927
                              &stash->info_ptr_memory, &total_size))
2928
            goto done;
2929
        }
2930
      else
2931
        {
2932
          int all_uncompressed = 1;
2933
          for (total_size = 0; msec; msec = find_debug_info (debug_bfd, msec))
2934
            {
2935
              total_size += msec->size;
2936
              if (strcmp (msec->name, DWARF2_COMPRESSED_DEBUG_INFO) == 0)
2937
                all_uncompressed = 0;
2938
            }
2939
          if (all_uncompressed)
2940
            {
2941
              /* Case 2: multiple sections, but none is compressed.  */
2942
              stash->info_ptr_memory = (bfd_byte *) bfd_malloc (total_size);
2943
              if (stash->info_ptr_memory == NULL)
2944
                goto done;
2945 24 jeremybenn
 
2946 225 jeremybenn
              total_size = 0;
2947
              for (msec = find_debug_info (debug_bfd, NULL);
2948
                   msec;
2949
                   msec = find_debug_info (debug_bfd, msec))
2950
                {
2951
                  bfd_size_type size;
2952 24 jeremybenn
 
2953 225 jeremybenn
                  size = msec->size;
2954
                  if (size == 0)
2955
                    continue;
2956 24 jeremybenn
 
2957 225 jeremybenn
                  if (!(bfd_simple_get_relocated_section_contents
2958
                        (debug_bfd, msec, stash->info_ptr_memory + total_size,
2959
                         symbols)))
2960
                    goto done;
2961 24 jeremybenn
 
2962 225 jeremybenn
                  total_size += size;
2963
                }
2964
            }
2965
          else
2966
            {
2967
              /* Case 3: multiple sections, some or all compressed.  */
2968
              stash->info_ptr_memory = NULL;
2969
              total_size = 0;
2970
              for (msec = find_debug_info (debug_bfd, NULL);
2971
                   msec;
2972
                   msec = find_debug_info (debug_bfd, msec))
2973
                {
2974
                  bfd_size_type size = msec->size;
2975
                  bfd_byte* buffer;
2976 24 jeremybenn
 
2977 225 jeremybenn
                  if (size == 0)
2978
                    continue;
2979 24 jeremybenn
 
2980 225 jeremybenn
                  buffer = (bfd_simple_get_relocated_section_contents
2981
                            (debug_bfd, msec, NULL, symbols));
2982
                  if (! buffer)
2983
                    goto done;
2984
 
2985
                  if (strcmp (msec->name, DWARF2_COMPRESSED_DEBUG_INFO) == 0)
2986
                    {
2987
                      if (! bfd_uncompress_section_contents (&buffer, &size))
2988
                        {
2989
                          free (buffer);
2990
                          goto done;
2991
                        }
2992
                    }
2993
                  stash->info_ptr_memory =  (bfd_byte *)
2994
                      bfd_realloc (stash->info_ptr_memory, total_size + size);
2995
                  memcpy (stash->info_ptr_memory + total_size, buffer, size);
2996
                  free (buffer);
2997
                  total_size += size;
2998
                }
2999
            }
3000 24 jeremybenn
        }
3001
 
3002 225 jeremybenn
      stash->info_ptr = stash->info_ptr_memory;
3003
      stash->info_ptr_end = stash->info_ptr + total_size;
3004 24 jeremybenn
      stash->sec = find_debug_info (debug_bfd, NULL);
3005
      stash->sec_info_ptr = stash->info_ptr;
3006
      stash->syms = symbols;
3007 225 jeremybenn
      stash->bfd_ptr = debug_bfd;
3008 24 jeremybenn
    }
3009
 
3010
  /* A null info_ptr indicates that there is no dwarf2 info
3011
     (or that an error occured while setting up the stash).  */
3012
  if (! stash->info_ptr)
3013
    goto done;
3014
 
3015
  stash->inliner_chain = NULL;
3016
 
3017
  /* Check the previously read comp. units first.  */
3018
  if (do_line)
3019
    {
3020
      /* The info hash tables use quite a bit of memory.  We may not want to
3021
         always use them.  We use some heuristics to decide if and when to
3022
         turn it on.  */
3023
      if (stash->info_hash_status == STASH_INFO_HASH_OFF)
3024
        stash_maybe_enable_info_hash_tables (abfd, stash);
3025
 
3026
      /* Keep info hash table up to date if they are available.  Note that we
3027
         may disable the hash tables if there is any error duing update. */
3028
      if (stash->info_hash_status == STASH_INFO_HASH_ON)
3029
        stash_maybe_update_info_hash_tables (stash);
3030
 
3031
      if (stash->info_hash_status == STASH_INFO_HASH_ON)
3032
        {
3033
          found = stash_find_line_fast (stash, symbol, addr, filename_ptr,
3034
                                        linenumber_ptr);
3035
          if (found)
3036
            goto done;
3037
        }
3038
      else
3039
        {
3040
          /* Check the previously read comp. units first.  */
3041
          for (each = stash->all_comp_units; each; each = each->next_unit)
3042
            if ((symbol->flags & BSF_FUNCTION) == 0
3043
                || comp_unit_contains_address (each, addr))
3044
              {
3045
                found = comp_unit_find_line (each, symbol, addr, filename_ptr,
3046
                                             linenumber_ptr, stash);
3047
                if (found)
3048
                  goto done;
3049
              }
3050
        }
3051
    }
3052
  else
3053
    {
3054
      for (each = stash->all_comp_units; each; each = each->next_unit)
3055
        {
3056
          found = (comp_unit_contains_address (each, addr)
3057
                   && comp_unit_find_nearest_line (each, addr,
3058
                                                   filename_ptr,
3059
                                                   functionname_ptr,
3060
                                                   linenumber_ptr,
3061
                                                   stash));
3062
          if (found)
3063
            goto done;
3064
        }
3065
    }
3066
 
3067
  /* The DWARF2 spec says that the initial length field, and the
3068
     offset of the abbreviation table, should both be 4-byte values.
3069
     However, some compilers do things differently.  */
3070
  if (addr_size == 0)
3071
    addr_size = 4;
3072
  BFD_ASSERT (addr_size == 4 || addr_size == 8);
3073
 
3074
  /* Read each remaining comp. units checking each as they are read.  */
3075
  while (stash->info_ptr < stash->info_ptr_end)
3076
    {
3077
      bfd_vma length;
3078
      unsigned int offset_size = addr_size;
3079
      bfd_byte *info_ptr_unit = stash->info_ptr;
3080
 
3081 225 jeremybenn
      length = read_4_bytes (stash->bfd_ptr, stash->info_ptr);
3082 24 jeremybenn
      /* A 0xffffff length is the DWARF3 way of indicating
3083
         we use 64-bit offsets, instead of 32-bit offsets.  */
3084
      if (length == 0xffffffff)
3085
        {
3086
          offset_size = 8;
3087 225 jeremybenn
          length = read_8_bytes (stash->bfd_ptr, stash->info_ptr + 4);
3088 24 jeremybenn
          stash->info_ptr += 12;
3089
        }
3090
      /* A zero length is the IRIX way of indicating 64-bit offsets,
3091
         mostly because the 64-bit length will generally fit in 32
3092
         bits, and the endianness helps.  */
3093
      else if (length == 0)
3094
        {
3095
          offset_size = 8;
3096 225 jeremybenn
          length = read_4_bytes (stash->bfd_ptr, stash->info_ptr + 4);
3097 24 jeremybenn
          stash->info_ptr += 8;
3098
        }
3099
      /* In the absence of the hints above, we assume 32-bit DWARF2
3100
         offsets even for targets with 64-bit addresses, because:
3101
           a) most of the time these targets will not have generated
3102
              more than 2Gb of debug info and so will not need 64-bit
3103
              offsets,
3104
         and
3105
           b) if they do use 64-bit offsets but they are not using
3106
              the size hints that are tested for above then they are
3107
              not conforming to the DWARF3 standard anyway.  */
3108
      else if (addr_size == 8)
3109
        {
3110
          offset_size = 4;
3111 225 jeremybenn
          stash->info_ptr += 4;
3112 24 jeremybenn
        }
3113
      else
3114
        stash->info_ptr += 4;
3115
 
3116
      if (length > 0)
3117
        {
3118
          each = parse_comp_unit (stash, length, info_ptr_unit,
3119
                                  offset_size);
3120
          if (!each)
3121
            /* The dwarf information is damaged, don't trust it any
3122
               more.  */
3123
            break;
3124
          stash->info_ptr += length;
3125
 
3126
          if (stash->all_comp_units)
3127
            stash->all_comp_units->prev_unit = each;
3128
          else
3129
            stash->last_comp_unit = each;
3130
 
3131
          each->next_unit = stash->all_comp_units;
3132
          stash->all_comp_units = each;
3133
 
3134
          /* DW_AT_low_pc and DW_AT_high_pc are optional for
3135
             compilation units.  If we don't have them (i.e.,
3136
             unit->high == 0), we need to consult the line info table
3137
             to see if a compilation unit contains the given
3138
             address.  */
3139
          if (do_line)
3140
            found = (((symbol->flags & BSF_FUNCTION) == 0
3141
                      || each->arange.high == 0
3142
                      || comp_unit_contains_address (each, addr))
3143
                     && comp_unit_find_line (each, symbol, addr,
3144
                                             filename_ptr,
3145
                                             linenumber_ptr,
3146
                                             stash));
3147
          else
3148
            found = ((each->arange.high == 0
3149
                      || comp_unit_contains_address (each, addr))
3150
                     && comp_unit_find_nearest_line (each, addr,
3151
                                                     filename_ptr,
3152
                                                     functionname_ptr,
3153
                                                     linenumber_ptr,
3154
                                                     stash));
3155 225 jeremybenn
 
3156
          if ((bfd_vma) (stash->info_ptr - stash->sec_info_ptr)
3157
              == stash->sec->size)
3158
            {
3159
              stash->sec = find_debug_info (stash->bfd_ptr, stash->sec);
3160
              stash->sec_info_ptr = stash->info_ptr;
3161
            }
3162
 
3163 24 jeremybenn
          if (found)
3164
            goto done;
3165
        }
3166
    }
3167
 
3168
done:
3169
  if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
3170
    unset_sections (stash);
3171
 
3172
  return found;
3173
}
3174
 
3175
/* The DWARF2 version of find_nearest_line.
3176
   Return TRUE if the line is found without error.  */
3177
 
3178
bfd_boolean
3179
_bfd_dwarf2_find_nearest_line (bfd *abfd,
3180
                               asection *section,
3181
                               asymbol **symbols,
3182
                               bfd_vma offset,
3183
                               const char **filename_ptr,
3184
                               const char **functionname_ptr,
3185
                               unsigned int *linenumber_ptr,
3186
                               unsigned int addr_size,
3187
                               void **pinfo)
3188
{
3189
  return find_line (abfd, section, offset, NULL, symbols, filename_ptr,
3190
                    functionname_ptr, linenumber_ptr, addr_size,
3191
                    pinfo);
3192
}
3193
 
3194
/* The DWARF2 version of find_line.
3195
   Return TRUE if the line is found without error.  */
3196
 
3197
bfd_boolean
3198
_bfd_dwarf2_find_line (bfd *abfd,
3199
                       asymbol **symbols,
3200
                       asymbol *symbol,
3201
                       const char **filename_ptr,
3202
                       unsigned int *linenumber_ptr,
3203
                       unsigned int addr_size,
3204
                       void **pinfo)
3205
{
3206
  return find_line (abfd, NULL, 0, symbol, symbols, filename_ptr,
3207
                    NULL, linenumber_ptr, addr_size,
3208
                    pinfo);
3209
}
3210
 
3211
bfd_boolean
3212
_bfd_dwarf2_find_inliner_info (bfd *abfd ATTRIBUTE_UNUSED,
3213
                               const char **filename_ptr,
3214
                               const char **functionname_ptr,
3215
                               unsigned int *linenumber_ptr,
3216
                               void **pinfo)
3217
{
3218
  struct dwarf2_debug *stash;
3219
 
3220 225 jeremybenn
  stash = (struct dwarf2_debug *) *pinfo;
3221 24 jeremybenn
  if (stash)
3222
    {
3223
      struct funcinfo *func = stash->inliner_chain;
3224
 
3225
      if (func && func->caller_func)
3226
        {
3227
          *filename_ptr = func->caller_file;
3228
          *functionname_ptr = func->caller_func->name;
3229
          *linenumber_ptr = func->caller_line;
3230
          stash->inliner_chain = func->caller_func;
3231
          return TRUE;
3232
        }
3233
    }
3234
 
3235
  return FALSE;
3236
}
3237
 
3238
void
3239
_bfd_dwarf2_cleanup_debug_info (bfd *abfd)
3240
{
3241
  struct comp_unit *each;
3242
  struct dwarf2_debug *stash;
3243
 
3244
  if (abfd == NULL || elf_tdata (abfd) == NULL)
3245
    return;
3246
 
3247 225 jeremybenn
  stash = (struct dwarf2_debug *) elf_tdata (abfd)->dwarf2_find_line_info;
3248 24 jeremybenn
 
3249
  if (stash == NULL)
3250
    return;
3251
 
3252
  for (each = stash->all_comp_units; each; each = each->next_unit)
3253
    {
3254
      struct abbrev_info **abbrevs = each->abbrevs;
3255 225 jeremybenn
      struct funcinfo *function_table = each->function_table;
3256
      struct varinfo *variable_table = each->variable_table;
3257 24 jeremybenn
      size_t i;
3258
 
3259
      for (i = 0; i < ABBREV_HASH_SIZE; i++)
3260
        {
3261
          struct abbrev_info *abbrev = abbrevs[i];
3262
 
3263
          while (abbrev)
3264
            {
3265
              free (abbrev->attrs);
3266
              abbrev = abbrev->next;
3267
            }
3268
        }
3269
 
3270
      if (each->line_table)
3271
        {
3272
          free (each->line_table->dirs);
3273
          free (each->line_table->files);
3274
        }
3275 225 jeremybenn
 
3276
      while (function_table)
3277
        {
3278
          if (function_table->file)
3279
            {
3280
              free (function_table->file);
3281
              function_table->file = NULL;
3282
            }
3283
 
3284
          if (function_table->caller_file)
3285
            {
3286
              free (function_table->caller_file);
3287
              function_table->caller_file = NULL;
3288
            }
3289
          function_table = function_table->prev_func;
3290
        }
3291
 
3292
      while (variable_table)
3293
        {
3294
          if (variable_table->file)
3295
            {
3296
              free (variable_table->file);
3297
              variable_table->file = NULL;
3298
            }
3299
 
3300
          variable_table = variable_table->prev_var;
3301
        }
3302 24 jeremybenn
    }
3303
 
3304 225 jeremybenn
  if (stash->dwarf_abbrev_buffer)
3305
    free (stash->dwarf_abbrev_buffer);
3306
  if (stash->dwarf_line_buffer)
3307
    free (stash->dwarf_line_buffer);
3308
  if (stash->dwarf_str_buffer)
3309
    free (stash->dwarf_str_buffer);
3310
  if (stash->dwarf_ranges_buffer)
3311
    free (stash->dwarf_ranges_buffer);
3312
  if (stash->info_ptr_memory)
3313
    free (stash->info_ptr_memory);
3314 24 jeremybenn
}

powered by: WebSVN 2.1.0

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