include/
[deliverable/binutils-gdb.git] / bfd / dwarf2.c
index 49422b2d27ea8c1d229feb41db3e6ce256d8703a..be8ba389706fc64d4f4e65dc91e057bcaf4de1ce 100644 (file)
@@ -1,6 +1,6 @@
 /* DWARF 2 support.
-   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-   Free Software Foundation, Inc.
+   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+   2004, 2005 Free Software Foundation, Inc.
 
    Adapted from gdb/dwarf2read.c by Gavin Koch of Cygnus Solutions
    (gavin@cygnus.com).
@@ -61,8 +61,8 @@ struct attribute
   {
     char *str;
     struct dwarf_block *blk;
-    bfd_vma val;
-    bfd_signed_vma sval;
+    bfd_uint64_t val;
+    bfd_int64_t sval;
   }
   u;
 };
@@ -71,44 +71,44 @@ struct attribute
 struct dwarf_block
 {
   unsigned int size;
-  char *data;
+  bfd_byte *data;
 };
 
 struct dwarf2_debug
 {
   /* A list of all previously read comp_units.  */
-  struct comp_unitall_comp_units;
+  struct comp_unit *all_comp_units;
 
   /* The next unread compilation unit within the .debug_info section.
      Zero indicates that the .debug_info section has not been loaded
      into a buffer yet.  */
-  char* info_ptr;
+  bfd_byte *info_ptr;
 
   /* Pointer to the end of the .debug_info section memory buffer.  */
-  char* info_ptr_end;
+  bfd_byte *info_ptr_end;
 
   /* Pointer to the section and address of the beginning of the
      section.  */
-  asectionsec;
-  char* sec_info_ptr;
+  asection *sec;
+  bfd_byte *sec_info_ptr;
 
   /* Pointer to the symbol table.  */
-  asymbol** syms;
+  asymbol **syms;
 
   /* Pointer to the .debug_abbrev section loaded into memory.  */
-  char* dwarf_abbrev_buffer;
+  bfd_byte *dwarf_abbrev_buffer;
 
   /* Length of the loaded .debug_abbrev section.  */
   unsigned long dwarf_abbrev_size;
 
   /* Buffer for decode_line_info.  */
-  char *dwarf_line_buffer;
+  bfd_byte *dwarf_line_buffer;
 
   /* Length of the loaded .debug_line section.  */
   unsigned long dwarf_line_size;
 
   /* Pointer to the .debug_str section loaded into memory.  */
-  char* dwarf_str_buffer;
+  bfd_byte *dwarf_str_buffer;
 
   /* Length of the loaded .debug_str section.  */
   unsigned long dwarf_str_size;
@@ -127,44 +127,48 @@ struct arange
 struct comp_unit
 {
   /* Chain the previously read compilation units.  */
-  struct comp_unitnext_unit;
+  struct comp_unit *next_unit;
 
   /* Keep the bdf convenient (for memory allocation).  */
-  bfdabfd;
+  bfd *abfd;
 
   /* The lowest and higest addresses contained in this compilation
      unit as specified in the compilation unit header.  */
   struct arange arange;
 
   /* The DW_AT_name attribute (for error messages).  */
-  charname;
+  char *name;
 
   /* The abbrev hash table.  */
-  struct abbrev_info** abbrevs;
+  struct abbrev_info **abbrevs;
 
   /* Note that an error was found by comp_unit_find_nearest_line.  */
   int error;
 
   /* The DW_AT_comp_dir attribute.  */
-  charcomp_dir;
+  char *comp_dir;
 
   /* TRUE if there is a line number table associated with this comp. unit.  */
   int stmtlist;
 
+  /* Pointer to the current comp_unit so that we can find a given entry
+     by its reference.  */
+  bfd_byte *info_ptr_unit;
+
   /* The offset into .debug_line of the line number table.  */
   unsigned long line_offset;
 
   /* Pointer to the first child die for the comp unit.  */
-  char *first_child_die_ptr;
+  bfd_byte *first_child_die_ptr;
 
   /* The end of the comp unit.  */
-  char *end_ptr;
+  bfd_byte *end_ptr;
 
   /* The decoded line number, NULL if not yet decoded.  */
-  struct line_info_tableline_table;
+  struct line_info_table *line_table;
 
   /* A list of the functions found in this comp. unit.  */
-  struct funcinfofunction_table;
+  struct funcinfo *function_table;
 
   /* Pointer to dwarf2_debug structure.  */
   struct dwarf2_debug *stash;
@@ -200,51 +204,6 @@ struct attr_abbrev
 #define ATTR_ALLOC_CHUNK 4
 #endif
 
-static unsigned int read_1_byte PARAMS ((bfd *, char *));
-static int read_1_signed_byte PARAMS ((bfd *, char *));
-static unsigned int read_2_bytes PARAMS ((bfd *, char *));
-static unsigned int read_4_bytes PARAMS ((bfd *, char *));
-static bfd_vma read_8_bytes PARAMS ((bfd *, char *));
-static char *read_n_bytes PARAMS ((bfd *, char *, unsigned int));
-static char *read_string PARAMS ((bfd *, char *, unsigned int *));
-static char *read_indirect_string PARAMS ((struct comp_unit *, char *, unsigned int *));
-static unsigned int read_unsigned_leb128
-  PARAMS ((bfd *, char *, unsigned int *));
-static int read_signed_leb128
-  PARAMS ((bfd *, char *, unsigned int *));
-static bfd_vma read_address PARAMS ((struct comp_unit *, char *));
-static struct abbrev_info *lookup_abbrev
-  PARAMS ((unsigned int, struct abbrev_info **));
-static struct abbrev_info **read_abbrevs
-  PARAMS ((bfd *, bfd_vma, struct dwarf2_debug *));
-static char *read_attribute
-  PARAMS ((struct attribute *, struct attr_abbrev *,
-          struct comp_unit *, char *));
-static char *read_attribute_value
-  PARAMS ((struct attribute *, unsigned,
-          struct comp_unit *, char *));
-static void add_line_info
-  PARAMS ((struct line_info_table *, bfd_vma, char *,
-          unsigned int, unsigned int, int));
-static char *concat_filename PARAMS ((struct line_info_table *, unsigned int));
-static void arange_add PARAMS ((struct comp_unit *, bfd_vma, bfd_vma));
-static struct line_info_table *decode_line_info
-  PARAMS ((struct comp_unit *, struct dwarf2_debug *));
-static bfd_boolean lookup_address_in_line_info_table
-  PARAMS ((struct line_info_table *, bfd_vma, struct funcinfo *,
-          const char **, unsigned int *));
-static bfd_boolean lookup_address_in_function_table
-  PARAMS ((struct funcinfo *, bfd_vma, struct funcinfo **, const char **));
-static bfd_boolean scan_unit_for_functions PARAMS ((struct comp_unit *));
-static struct comp_unit *parse_comp_unit
-  PARAMS ((bfd *, struct dwarf2_debug *, bfd_vma, unsigned int));
-static bfd_boolean comp_unit_contains_address
-  PARAMS ((struct comp_unit *, bfd_vma));
-static bfd_boolean comp_unit_find_nearest_line
-  PARAMS ((struct comp_unit *, bfd_vma, const char **, const char **,
-          unsigned int *, struct dwarf2_debug *));
-static asection *find_debug_info PARAMS ((bfd *, asection *));
-
 /* VERBATIM
    The following function up to the END VERBATIM mark are
    copied directly from dwarf2read.c.  */
@@ -252,74 +211,39 @@ static asection *find_debug_info PARAMS ((bfd *, asection *));
 /* Read dwarf information from a buffer.  */
 
 static unsigned int
-read_1_byte (abfd, buf)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     char *buf;
+read_1_byte (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *buf)
 {
-  return bfd_get_8 (abfd, (bfd_byte *) buf);
+  return bfd_get_8 (abfd, buf);
 }
 
 static int
-read_1_signed_byte (abfd, buf)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     char *buf;
+read_1_signed_byte (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *buf)
 {
-  return bfd_get_signed_8 (abfd, (bfd_byte *) buf);
+  return bfd_get_signed_8 (abfd, buf);
 }
 
 static unsigned int
-read_2_bytes (abfd, buf)
-     bfd *abfd;
-     char *buf;
-{
-  return bfd_get_16 (abfd, (bfd_byte *) buf);
-}
-
-#if 0  /* This is not used.  */
-
-static int
-read_2_signed_bytes (abfd, buf)
-     bfd *abfd;
-     char *buf;
+read_2_bytes (bfd *abfd, bfd_byte *buf)
 {
-  return bfd_get_signed_16 (abfd, (bfd_byte *) buf);
+  return bfd_get_16 (abfd, buf);
 }
 
-#endif
-
 static unsigned int
-read_4_bytes (abfd, buf)
-     bfd *abfd;
-     char *buf;
+read_4_bytes (bfd *abfd, bfd_byte *buf)
 {
-  return bfd_get_32 (abfd, (bfd_byte *) buf);
+  return bfd_get_32 (abfd, buf);
 }
 
-#if 0  /* This is not used.  */
-
-static int
-read_4_signed_bytes (abfd, buf)
-     bfd *abfd;
-     char *buf;
+static bfd_uint64_t
+read_8_bytes (bfd *abfd, bfd_byte *buf)
 {
-  return bfd_get_signed_32 (abfd, (bfd_byte *) buf);
+  return bfd_get_64 (abfd, buf);
 }
 
-#endif
-
-static bfd_vma
-read_8_bytes (abfd, buf)
-     bfd *abfd;
-     char *buf;
-{
-  return bfd_get_64 (abfd, (bfd_byte *) buf);
-}
-
-static char *
-read_n_bytes (abfd, buf, size)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     char *buf;
-     unsigned int size ATTRIBUTE_UNUSED;
+static bfd_byte *
+read_n_bytes (bfd *abfd ATTRIBUTE_UNUSED,
+             bfd_byte *buf,
+             unsigned int size ATTRIBUTE_UNUSED)
 {
   /* If the size of a host char is 8 bits, we can return a pointer
      to the buffer, otherwise we have to copy the data to a buffer
@@ -328,30 +252,30 @@ read_n_bytes (abfd, buf, size)
 }
 
 static char *
-read_string (abfd, buf, bytes_read_ptr)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     char *buf;
-     unsigned int *bytes_read_ptr;
+read_string (bfd *abfd ATTRIBUTE_UNUSED,
+            bfd_byte *buf,
+            unsigned int *bytes_read_ptr)
 {
   /* Return a pointer to the embedded string.  */
-  if (*buf == '\0')
+  char *str = (char *) buf;
+  if (*str == '\0')
     {
       *bytes_read_ptr = 1;
       return NULL;
     }
 
-  *bytes_read_ptr = strlen (buf) + 1;
-  return buf;
+  *bytes_read_ptr = strlen (str) + 1;
+  return str;
 }
 
 static char *
-read_indirect_string (unit, buf, bytes_read_ptr)
-     struct comp_unit* unit;
-     char *buf;
-     unsigned int *bytes_read_ptr;
+read_indirect_string (struct comp_unit* unit,
+                     bfd_byte *buf,
+                     unsigned int *bytes_read_ptr)
 {
-  bfd_vma offset;
+  bfd_uint64_t offset;
   struct dwarf2_debug *stash = unit->stash;
+  char *str;
 
   if (unit->offset_size == 4)
     offset = read_4_bytes (unit->abfd, buf);
@@ -363,6 +287,7 @@ read_indirect_string (unit, buf, bytes_read_ptr)
     {
       asection *msec;
       bfd *abfd = unit->abfd;
+      bfd_size_type sz;
 
       msec = bfd_get_section_by_name (abfd, ".debug_str");
       if (! msec)
@@ -373,13 +298,14 @@ read_indirect_string (unit, buf, bytes_read_ptr)
          return NULL;
        }
 
-      stash->dwarf_str_size = msec->_raw_size;
-      stash->dwarf_str_buffer = (char*) bfd_alloc (abfd, msec->_raw_size);
+      sz = msec->rawsize ? msec->rawsize : msec->size;
+      stash->dwarf_str_size = sz;
+      stash->dwarf_str_buffer = bfd_alloc (abfd, sz);
       if (! stash->dwarf_abbrev_buffer)
        return NULL;
 
       if (! bfd_get_section_contents (abfd, msec, stash->dwarf_str_buffer,
-                                     (bfd_vma) 0, msec->_raw_size))
+                                     0, sz))
        return NULL;
     }
 
@@ -391,90 +317,25 @@ read_indirect_string (unit, buf, bytes_read_ptr)
       return NULL;
     }
 
-  buf = stash->dwarf_str_buffer + offset;
-  if (*buf == '\0')
+  str = (char *) stash->dwarf_str_buffer + offset;
+  if (*str == '\0')
     return NULL;
-  return buf;
-}
-
-static unsigned int
-read_unsigned_leb128 (abfd, buf, bytes_read_ptr)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     char *buf;
-     unsigned int *bytes_read_ptr;
-{
-  unsigned int  result;
-  unsigned int  num_read;
-  int           shift;
-  unsigned char byte;
-
-  result   = 0;
-  shift    = 0;
-  num_read = 0;
-
-  do
-    {
-      byte = bfd_get_8 (abfd, (bfd_byte *) buf);
-      buf ++;
-      num_read ++;
-      result |= ((byte & 0x7f) << shift);
-      shift += 7;
-    }
-  while (byte & 0x80);
-
-  * bytes_read_ptr = num_read;
-
-  return result;
-}
-
-static int
-read_signed_leb128 (abfd, buf, bytes_read_ptr)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     char *buf;
-     unsigned int * bytes_read_ptr;
-{
-  int           result;
-  int           shift;
-  int           num_read;
-  unsigned char byte;
-
-  result = 0;
-  shift = 0;
-  num_read = 0;
-
-  do
-    {
-      byte = bfd_get_8 (abfd, (bfd_byte *) buf);
-      buf ++;
-      num_read ++;
-      result |= ((byte & 0x7f) << shift);
-      shift += 7;
-    }
-  while (byte & 0x80);
-
-  if ((shift < 32) && (byte & 0x40))
-    result |= -(1 << shift);
-
-  * bytes_read_ptr = num_read;
-
-  return result;
+  return str;
 }
 
 /* END VERBATIM */
 
-static bfd_vma
-read_address (unit, buf)
-     struct comp_unit* unit;
-     char *buf;
+static bfd_uint64_t
+read_address (struct comp_unit *unit, bfd_byte *buf)
 {
   switch (unit->addr_size)
     {
     case 8:
-      return bfd_get_64 (unit->abfd, (bfd_byte *) buf);
+      return bfd_get_64 (unit->abfd, buf);
     case 4:
-      return bfd_get_32 (unit->abfd, (bfd_byte *) buf);
+      return bfd_get_32 (unit->abfd, buf);
     case 2:
-      return bfd_get_16 (unit->abfd, (bfd_byte *) buf);
+      return bfd_get_16 (unit->abfd, buf);
     default:
       abort ();
     }
@@ -483,9 +344,7 @@ read_address (unit, buf)
 /* Lookup an abbrev_info structure in the abbrev hash table.  */
 
 static struct abbrev_info *
-lookup_abbrev (number,abbrevs)
-     unsigned int number;
-     struct abbrev_info **abbrevs;
+lookup_abbrev (unsigned int number, struct abbrev_info **abbrevs)
 {
   unsigned int hash_number;
   struct abbrev_info *abbrev;
@@ -510,13 +369,10 @@ lookup_abbrev (number,abbrevs)
    in a hash table.  */
 
 static struct abbrev_info**
-read_abbrevs (abfd, offset, stash)
-     bfd * abfd;
-     bfd_vma offset;
-     struct dwarf2_debug *stash;
+read_abbrevs (bfd *abfd, bfd_uint64_t offset, struct dwarf2_debug *stash)
 {
   struct abbrev_info **abbrevs;
-  char *abbrev_ptr;
+  bfd_byte *abbrev_ptr;
   struct abbrev_info *cur_abbrev;
   unsigned int abbrev_number, bytes_read, abbrev_name;
   unsigned int abbrev_form, hash_number;
@@ -534,7 +390,7 @@ read_abbrevs (abfd, offset, stash)
          return 0;
        }
 
-      stash->dwarf_abbrev_size = msec->_raw_size;
+      stash->dwarf_abbrev_size = msec->size;
       stash->dwarf_abbrev_buffer
        = bfd_simple_get_relocated_section_contents (abfd, msec, NULL,
                                                     stash->syms);
@@ -551,7 +407,7 @@ read_abbrevs (abfd, offset, stash)
     }
 
   amt = sizeof (struct abbrev_info*) * ABBREV_HASH_SIZE;
-  abbrevs = (struct abbrev_info**) bfd_zalloc (abfd, amt);
+  abbrevs = bfd_zalloc (abfd, amt);
 
   abbrev_ptr = stash->dwarf_abbrev_buffer + offset;
   abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
@@ -561,7 +417,7 @@ read_abbrevs (abfd, offset, stash)
   while (abbrev_number)
     {
       amt = sizeof (struct abbrev_info);
-      cur_abbrev = (struct abbrev_info *) bfd_zalloc (abfd, amt);
+      cur_abbrev = bfd_zalloc (abfd, amt);
 
       /* Read in abbrev header.  */
       cur_abbrev->number = abbrev_number;
@@ -583,8 +439,7 @@ read_abbrevs (abfd, offset, stash)
            {
              amt = cur_abbrev->num_attrs + ATTR_ALLOC_CHUNK;
              amt *= sizeof (struct attr_abbrev);
-             cur_abbrev->attrs = ((struct attr_abbrev *)
-                                  bfd_realloc (cur_abbrev->attrs, amt));
+             cur_abbrev->attrs = bfd_realloc (cur_abbrev->attrs, amt);
              if (! cur_abbrev->attrs)
                return 0;
            }
@@ -624,12 +479,11 @@ read_abbrevs (abfd, offset, stash)
 
 /* Read an attribute value described by an attribute form.  */
 
-static char *
-read_attribute_value (attr, form, unit, info_ptr)
-     struct attribute   *attr;
-     unsigned form;
-     struct comp_unit   *unit;
-     char               *info_ptr;
+static bfd_byte *
+read_attribute_value (struct attribute *attr,
+                     unsigned form,
+                     struct comp_unit *unit,
+                     bfd_byte *info_ptr)
 {
   bfd *abfd = unit->abfd;
   unsigned int bytes_read;
@@ -648,7 +502,7 @@ read_attribute_value (attr, form, unit, info_ptr)
       break;
     case DW_FORM_block2:
       amt = sizeof (struct dwarf_block);
-      blk = (struct dwarf_block *) bfd_alloc (abfd, amt);
+      blk = bfd_alloc (abfd, amt);
       blk->size = read_2_bytes (abfd, info_ptr);
       info_ptr += 2;
       blk->data = read_n_bytes (abfd, info_ptr, blk->size);
@@ -657,7 +511,7 @@ read_attribute_value (attr, form, unit, info_ptr)
       break;
     case DW_FORM_block4:
       amt = sizeof (struct dwarf_block);
-      blk = (struct dwarf_block *) bfd_alloc (abfd, amt);
+      blk = bfd_alloc (abfd, amt);
       blk->size = read_4_bytes (abfd, info_ptr);
       info_ptr += 4;
       blk->data = read_n_bytes (abfd, info_ptr, blk->size);
@@ -686,7 +540,7 @@ read_attribute_value (attr, form, unit, info_ptr)
       break;
     case DW_FORM_block:
       amt = sizeof (struct dwarf_block);
-      blk = (struct dwarf_block *) bfd_alloc (abfd, amt);
+      blk = bfd_alloc (abfd, amt);
       blk->size = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
       info_ptr += bytes_read;
       blk->data = read_n_bytes (abfd, info_ptr, blk->size);
@@ -695,7 +549,7 @@ read_attribute_value (attr, form, unit, info_ptr)
       break;
     case DW_FORM_block1:
       amt = sizeof (struct dwarf_block);
-      blk = (struct dwarf_block *) bfd_alloc (abfd, amt);
+      blk = bfd_alloc (abfd, amt);
       blk->size = read_1_byte (abfd, info_ptr);
       info_ptr += 1;
       blk->data = read_n_bytes (abfd, info_ptr, blk->size);
@@ -753,12 +607,11 @@ read_attribute_value (attr, form, unit, info_ptr)
 
 /* Read an attribute described by an abbreviated attribute.  */
 
-static char *
-read_attribute (attr, abbrev, unit, info_ptr)
-     struct attribute   *attr;
-     struct attr_abbrev *abbrev;
-     struct comp_unit   *unit;
-     char               *info_ptr;
+static bfd_byte *
+read_attribute (struct attribute *attr,
+               struct attr_abbrev *abbrev,
+               struct comp_unit *unit,
+               bfd_byte *info_ptr)
 {
   attr->name = abbrev->name;
   info_ptr = read_attribute_value (attr, abbrev->form, unit, info_ptr);
@@ -774,7 +627,7 @@ struct line_info
 {
   struct line_info* prev_line;
   bfd_vma address;
-  charfilename;
+  char *filename;
   unsigned int line;
   unsigned int column;
   int end_sequence;            /* End of (sequential) code sequence.  */
@@ -793,8 +646,8 @@ struct line_info_table
   bfd* abfd;
   unsigned int num_files;
   unsigned int num_dirs;
-  charcomp_dir;
-  char** dirs;
+  char *comp_dir;
+  char **dirs;
   struct fileinfo* files;
   struct line_info* last_line;  /* largest VMA */
   struct line_info* lcl_head;   /* local head; used in 'add_line_info' */
@@ -803,7 +656,7 @@ struct line_info_table
 struct funcinfo
 {
   struct funcinfo *prev_func;
-  charname;
+  char *name;
   bfd_vma low;
   bfd_vma high;
 };
@@ -814,16 +667,15 @@ struct funcinfo
    line_info->prev_line always accesses an equal or smaller VMA.  */
 
 static void
-add_line_info (table, address, filename, line, column, end_sequence)
-     struct line_info_table* table;
-     bfd_vma address;
-     char* filename;
-     unsigned int line;
-     unsigned int column;
-     int end_sequence;
+add_line_info (struct line_info_table *table,
+              bfd_vma address,
+              char *filename,
+              unsigned int line,
+              unsigned int column,
+              int end_sequence)
 {
   bfd_size_type amt = sizeof (struct line_info);
-  struct line_info* info = (struct line_info*) bfd_alloc (table->abfd, amt);
+  struct line_info* info = bfd_alloc (table->abfd, amt);
 
   /* Find the correct location for 'info'.  Normally we will receive
      new line_info data 1) in order and 2) with increasing VMAs.
@@ -896,10 +748,9 @@ add_line_info (table, address, filename, line, column, end_sequence)
   info->column = column;
   info->end_sequence = end_sequence;
 
-  amt = strlen (filename);
-  if (amt)
+  if (filename && filename[0])
     {
-      info->filename = bfd_alloc (table->abfd, amt + 1);
+      info->filename = bfd_alloc (table->abfd, strlen (filename) + 1);
       if (info->filename)
        strcpy (info->filename, filename);
     }
@@ -912,11 +763,9 @@ add_line_info (table, address, filename, line, column, end_sequence)
    responsibility to free it.  */
 
 static char *
-concat_filename (table, file)
-     struct line_info_table* table;
-     unsigned int file;
+concat_filename (struct line_info_table *table, unsigned int file)
 {
-  charfilename;
+  char *filename;
 
   if (file - 1 >= table->num_files)
     {
@@ -929,7 +778,7 @@ concat_filename (table, file)
 
   if (! IS_ABSOLUTE_PATH (filename))
     {
-      chardirname = (table->files[file - 1].dir
+      char *dirname = (table->files[file - 1].dir
                       ? table->dirs[table->files[file - 1].dir - 1]
                       : table->comp_dir);
 
@@ -951,10 +800,7 @@ concat_filename (table, file)
 }
 
 static void
-arange_add (unit, low_pc, high_pc)
-     struct comp_unit *unit;
-     bfd_vma low_pc;
-     bfd_vma high_pc;
+arange_add (struct comp_unit *unit, bfd_vma low_pc, bfd_vma high_pc)
 {
   struct arange *arange;
 
@@ -987,8 +833,7 @@ arange_add (unit, low_pc, high_pc)
     }
 
   /* Need to allocate a new arange and insert it into the arange list.  */
-  arange = (struct arange *)
-    bfd_zalloc (unit->abfd, (bfd_size_type) sizeof (*arange));
+  arange = bfd_zalloc (unit->abfd, sizeof (*arange));
   arange->low = low_pc;
   arange->high = high_pc;
 
@@ -999,14 +844,12 @@ arange_add (unit, low_pc, high_pc)
 /* Decode the line number information for UNIT.  */
 
 static struct line_info_table*
-decode_line_info (unit, stash)
-     struct comp_unit *unit;
-     struct dwarf2_debug *stash;
+decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
 {
   bfd *abfd = unit->abfd;
   struct line_info_table* table;
-  char *line_ptr;
-  char *line_end;
+  bfd_byte *line_ptr;
+  bfd_byte *line_end;
   struct line_head lh;
   unsigned int i, bytes_read, offset_size;
   char *cur_file, *cur_dir;
@@ -1025,7 +868,7 @@ decode_line_info (unit, stash)
          return 0;
        }
 
-      stash->dwarf_line_size = msec->_raw_size;
+      stash->dwarf_line_size = msec->size;
       stash->dwarf_line_buffer
        = bfd_simple_get_relocated_section_contents (abfd, msec, NULL,
                                                     stash->syms);
@@ -1044,7 +887,7 @@ decode_line_info (unit, stash)
     }
 
   amt = sizeof (struct line_info_table);
-  table = (struct line_info_table*) bfd_alloc (abfd, amt);
+  table = bfd_alloc (abfd, amt);
   table->abfd = abfd;
   table->comp_dir = unit->comp_dir;
 
@@ -1096,7 +939,7 @@ decode_line_info (unit, stash)
   lh.opcode_base = read_1_byte (abfd, line_ptr);
   line_ptr += 1;
   amt = lh.opcode_base * sizeof (unsigned char);
-  lh.standard_opcode_lengths = (unsigned char *) bfd_alloc (abfd, amt);
+  lh.standard_opcode_lengths = bfd_alloc (abfd, amt);
 
   lh.standard_opcode_lengths[0] = 1;
 
@@ -1115,7 +958,7 @@ decode_line_info (unit, stash)
        {
          amt = table->num_dirs + DIR_ALLOC_CHUNK;
          amt *= sizeof (char *);
-         table->dirs = (char **) bfd_realloc (table->dirs, amt);
+         table->dirs = bfd_realloc (table->dirs, amt);
          if (! table->dirs)
            return 0;
        }
@@ -1134,7 +977,7 @@ decode_line_info (unit, stash)
        {
          amt = table->num_files + FILE_ALLOC_CHUNK;
          amt *= sizeof (struct fileinfo);
-         table->files = (struct fileinfo *) bfd_realloc (table->files, amt);
+         table->files = bfd_realloc (table->files, amt);
          if (! table->files)
            return 0;
        }
@@ -1225,8 +1068,7 @@ decode_line_info (unit, stash)
                    {
                      amt = table->num_files + FILE_ALLOC_CHUNK;
                      amt *= sizeof (struct fileinfo);
-                     table->files =
-                       (struct fileinfo *) bfd_realloc (table->files, amt);
+                     table->files = bfd_realloc (table->files, amt);
                      if (! table->files)
                        return 0;
                    }
@@ -1322,13 +1164,11 @@ decode_line_info (unit, stash)
    LINENUMBER_PTR, are pointers to the objects to be filled in.  */
 
 static bfd_boolean
-lookup_address_in_line_info_table (table, addr, function, filename_ptr,
-                                  linenumber_ptr)
-     struct line_info_table* table;
-     bfd_vma addr;
-     struct funcinfo *function;
-     const char **filename_ptr;
-     unsigned int *linenumber_ptr;
+lookup_address_in_line_info_table (struct line_info_table *table,
+                                  bfd_vma addr,
+                                  struct funcinfo *function,
+                                  const char **filename_ptr,
+                                  unsigned int *linenumber_ptr)
 {
   /* Note: table->last_line should be a descendingly sorted list. */
   struct line_info* next_line = table->last_line;
@@ -1401,12 +1241,10 @@ lookup_address_in_line_info_table (table, addr, function, filename_ptr,
 /* If ADDR is within TABLE, set FUNCTIONNAME_PTR, and return TRUE.  */
 
 static bfd_boolean
-lookup_address_in_function_table (table, addr, function_ptr,
-                                 functionname_ptr)
-     struct funcinfo* table;
-     bfd_vma addr;
-     struct funcinfo** function_ptr;
-     const char **functionname_ptr;
+lookup_address_in_function_table (struct funcinfo *table,
+                                 bfd_vma addr,
+                                 struct funcinfo **function_ptr,
+                                 const char **functionname_ptr)
 {
   struct funcinfo* each_func;
 
@@ -1425,17 +1263,52 @@ lookup_address_in_function_table (table, addr, function_ptr,
   return FALSE;
 }
 
+static char *
+find_abstract_instance_name (struct comp_unit *unit, bfd_uint64_t die_ref)
+{
+  bfd *abfd = unit->abfd;
+  bfd_byte *info_ptr;
+  unsigned int abbrev_number, bytes_read, i;
+  struct abbrev_info *abbrev;
+  struct attribute attr;
+  char *name = 0;
+
+  info_ptr = unit->info_ptr_unit + die_ref;
+  abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
+  info_ptr += bytes_read;
+
+  if (abbrev_number)
+    {
+      abbrev = lookup_abbrev (abbrev_number, unit->abbrevs);
+      if (! abbrev)
+       {
+         (*_bfd_error_handler) (_("Dwarf Error: Could not find abbrev number %u."),
+                                abbrev_number);
+         bfd_set_error (bfd_error_bad_value);
+       }
+      else
+       {
+         for (i = 0; i < abbrev->num_attrs && !name; ++i)
+           {
+             info_ptr = read_attribute (&attr, &abbrev->attrs[i], unit, info_ptr);
+             if (attr.name == DW_AT_name)
+               name = attr.u.str;
+           }
+       }
+    }
+  return (name);
+}
+
 /* DWARF2 Compilation unit functions.  */
 
 /* Scan over each die in a comp. unit looking for functions to add
    to the function table.  */
 
 static bfd_boolean
-scan_unit_for_functions (unit)
-     struct comp_unit *unit;
+scan_unit_for_functions (struct comp_unit *unit)
 {
   bfd *abfd = unit->abfd;
-  char *info_ptr = unit->first_child_die_ptr;
+  bfd_byte *info_ptr = unit->first_child_die_ptr;
   int nesting_level = 1;
 
   while (nesting_level)
@@ -1444,7 +1317,7 @@ scan_unit_for_functions (unit)
       struct abbrev_info *abbrev;
       struct attribute attr;
       struct funcinfo *func;
-      charname = 0;
+      char *name = 0;
 
       abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
       info_ptr += bytes_read;
@@ -1464,10 +1337,11 @@ scan_unit_for_functions (unit)
          return FALSE;
        }
 
-      if (abbrev->tag == DW_TAG_subprogram)
+      if (abbrev->tag == DW_TAG_subprogram
+         || abbrev->tag == DW_TAG_inlined_subroutine)
        {
          bfd_size_type amt = sizeof (struct funcinfo);
-         func = (struct funcinfo *) bfd_zalloc (abfd, amt);
+         func = bfd_zalloc (abfd, amt);
          func->prev_func = unit->function_table;
          unit->function_table = func;
        }
@@ -1482,6 +1356,10 @@ scan_unit_for_functions (unit)
            {
              switch (attr.name)
                {
+               case DW_AT_abstract_origin:
+                 func->name = find_abstract_instance_name (unit, attr.u.val);
+                 break;
+
                case DW_AT_name:
 
                  name = attr.u.str;
@@ -1530,7 +1408,7 @@ scan_unit_for_functions (unit)
 
 /* Parse a DWARF2 compilation unit starting at INFO_PTR.  This
    includes the compilation unit header that proceeds the DIE's, but
-   does not include the length field that preceeds each compilation
+   does not include the length field that precedes each compilation
    unit header.  END_PTR points one past the end of this comp unit.
    OFFSET_SIZE is the size of DWARF2 offsets (either 4 or 8 bytes).
 
@@ -1538,22 +1416,22 @@ scan_unit_for_functions (unit)
    to get to the line number information for the compilation unit.  */
 
 static struct comp_unit *
-parse_comp_unit (abfd, stash, unit_length, offset_size)
-     bfd* abfd;
-     struct dwarf2_debug *stash;
-     bfd_vma unit_length;
-     unsigned int offset_size;
+parse_comp_unit (bfd *abfd,
+                struct dwarf2_debug *stash,
+                bfd_vma unit_length,
+                bfd_byte *info_ptr_unit,
+                unsigned int offset_size)
 {
   struct comp_unit* unit;
   unsigned int version;
-  bfd_vma abbrev_offset = 0;
+  bfd_uint64_t abbrev_offset = 0;
   unsigned int addr_size;
   struct abbrev_info** abbrevs;
   unsigned int abbrev_number, bytes_read, i;
   struct abbrev_info *abbrev;
   struct attribute attr;
-  char *info_ptr = stash->info_ptr;
-  char *end_ptr = info_ptr + unit_length;
+  bfd_byte *info_ptr = stash->info_ptr;
+  bfd_byte *end_ptr = info_ptr + unit_length;
   bfd_size_type amt;
 
   version = read_2_bytes (abfd, info_ptr);
@@ -1615,13 +1493,14 @@ parse_comp_unit (abfd, stash, unit_length, offset_size)
     }
 
   amt = sizeof (struct comp_unit);
-  unit = (struct comp_unit*) bfd_zalloc (abfd, amt);
+  unit = bfd_zalloc (abfd, amt);
   unit->abfd = abfd;
   unit->addr_size = addr_size;
   unit->offset_size = offset_size;
   unit->abbrevs = abbrevs;
   unit->end_ptr = end_ptr;
   unit->stash = stash;
+  unit->info_ptr_unit = info_ptr_unit;
 
   for (i = 0; i < abbrev->num_attrs; ++i)
     {
@@ -1650,12 +1529,12 @@ parse_comp_unit (abfd, stash, unit_length, offset_size)
 
        case DW_AT_comp_dir:
          {
-           charcomp_dir = attr.u.str;
+           char *comp_dir = attr.u.str;
            if (comp_dir)
              {
                /* Irix 6.2 native cc prepends <machine>.: to the compilation
                   directory, get rid of it.  */
-               char *cp = (char*) strchr (comp_dir, ':');
+               char *cp = strchr (comp_dir, ':');
 
                if (cp && cp != comp_dir && cp[-1] == '.' && cp[1] == '/')
                  comp_dir = cp + 1;
@@ -1676,9 +1555,7 @@ parse_comp_unit (abfd, stash, unit_length, offset_size)
 /* Return TRUE if UNIT contains the address given by ADDR.  */
 
 static bfd_boolean
-comp_unit_contains_address (unit, addr)
-     struct comp_unit* unit;
-     bfd_vma addr;
+comp_unit_contains_address (struct comp_unit *unit, bfd_vma addr)
 {
   struct arange *arange;
 
@@ -1706,14 +1583,12 @@ comp_unit_contains_address (unit, addr)
    FALSE otherwise.  */
 
 static bfd_boolean
-comp_unit_find_nearest_line (unit, addr, filename_ptr, functionname_ptr,
-                            linenumber_ptr, stash)
-     struct comp_unit* unit;
-     bfd_vma addr;
-     const char **filename_ptr;
-     const char **functionname_ptr;
-     unsigned int *linenumber_ptr;
-     struct dwarf2_debug *stash;
+comp_unit_find_nearest_line (struct comp_unit *unit,
+                            bfd_vma addr,
+                            const char **filename_ptr,
+                            const char **functionname_ptr,
+                            unsigned int *linenumber_ptr,
+                            struct dwarf2_debug *stash)
 {
   bfd_boolean line_p;
   bfd_boolean func_p;
@@ -1768,9 +1643,7 @@ comp_unit_find_nearest_line (unit, addr, filename_ptr, functionname_ptr,
 #define GNU_LINKONCE_INFO ".gnu.linkonce.wi."
 
 static asection *
-find_debug_info (abfd, after_sec)
-     bfd * abfd;
-     asection * after_sec;
+find_debug_info (bfd *abfd, asection *after_sec)
 {
   asection * msec;
 
@@ -1793,25 +1666,22 @@ find_debug_info (abfd, after_sec)
   return NULL;
 }
 
-/* The DWARF2 version of find_nearest line.  Return TRUE if the line
+/* The DWARF2 version of find_nearest_line.  Return TRUE if the line
    is found without error.  ADDR_SIZE is the number of bytes in the
    initial .debug_info length field and in the abbreviation offset.
    You may use zero to indicate that the default value should be
    used.  */
 
 bfd_boolean
-_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
-                              filename_ptr, functionname_ptr,
-                              linenumber_ptr, addr_size, pinfo)
-     bfd *abfd;
-     asection *section;
-     asymbol **symbols;
-     bfd_vma offset;
-     const char **filename_ptr;
-     const char **functionname_ptr;
-     unsigned int *linenumber_ptr;
-     unsigned int addr_size;
-     PTR *pinfo;
+_bfd_dwarf2_find_nearest_line (bfd *abfd,
+                              asection *section,
+                              asymbol **symbols,
+                              bfd_vma offset,
+                              const char **filename_ptr,
+                              const char **functionname_ptr,
+                              unsigned int *linenumber_ptr,
+                              unsigned int addr_size,
+                              void **pinfo)
 {
   /* Read each compilation unit from the section .debug_info, and check
      to see if it contains the address we are searching for.  If yes,
@@ -1821,13 +1691,19 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
      We keep a list of all the previously read compilation units, and
      a pointer to the next un-read compilation unit.  Check the
      previously read units before reading more.  */
-  struct dwarf2_debug *stash = (struct dwarf2_debug *) *pinfo;
+  struct dwarf2_debug *stash;
 
   /* What address are we looking for?  */
-  bfd_vma addr = offset + section->vma;
+  bfd_vma addr;
 
   struct comp_unit* each;
 
+  stash = *pinfo;
+  addr = offset;
+  if (section->output_section)
+    addr += section->output_section->vma + section->output_offset;
+  else
+    addr += section->vma;
   *filename_ptr = NULL;
   *functionname_ptr = NULL;
   *linenumber_ptr = 0;
@@ -1845,11 +1721,11 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
       asection *msec;
       bfd_size_type amt = sizeof (struct dwarf2_debug);
 
-      stash = (struct dwarf2_debug*) bfd_zalloc (abfd, amt);
+      stash = bfd_zalloc (abfd, amt);
       if (! stash)
        return FALSE;
 
-      *pinfo = (PTR) stash;
+      *pinfo = stash;
 
       msec = find_debug_info (abfd, NULL);
       if (! msec)
@@ -1864,9 +1740,9 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
         In the second pass we read in the section's contents.  The allows
         us to avoid reallocing the data as we add sections to the stash.  */
       for (total_size = 0; msec; msec = find_debug_info (abfd, msec))
-       total_size += msec->_raw_size;
+       total_size += msec->size;
 
-      stash->info_ptr = (char *) bfd_alloc (abfd, total_size);
+      stash->info_ptr = bfd_alloc (abfd, total_size);
       if (stash->info_ptr == NULL)
        return FALSE;
 
@@ -1879,7 +1755,7 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
          bfd_size_type size;
          bfd_size_type start;
 
-         size = msec->_raw_size;
+         size = msec->size;
          if (size == 0)
            continue;
 
@@ -1917,6 +1793,7 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
       bfd_vma length;
       bfd_boolean found;
       unsigned int offset_size = addr_size;
+      bfd_byte *info_ptr_unit = stash->info_ptr;
 
       length = read_4_bytes (abfd, stash->info_ptr);
       /* A 0xffffff length is the DWARF3 way of indicating we use
@@ -1949,11 +1826,12 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
 
       if (length > 0)
        {
-         each = parse_comp_unit (abfd, stash, length, offset_size);
+         each = parse_comp_unit (abfd, stash, length, info_ptr_unit,
+                                 offset_size);
          stash->info_ptr += length;
 
          if ((bfd_vma) (stash->info_ptr - stash->sec_info_ptr)
-             == stash->sec->_raw_size)
+             == stash->sec->size)
            {
              stash->sec = find_debug_info (abfd, stash->sec);
              stash->sec_info_ptr = stash->info_ptr;
This page took 0.038658 seconds and 4 git commands to generate.