include/
[deliverable/binutils-gdb.git] / bfd / dwarf2.c
index d86c66ee45a0f5195917dc832e0fed3c7db6267b..be8ba389706fc64d4f4e65dc91e057bcaf4de1ce 100644 (file)
@@ -1,6 +1,6 @@
 /* DWARF 2 support.
    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-   2004 Free Software Foundation, Inc.
+   2004, 2005 Free Software Foundation, Inc.
 
    Adapted from gdb/dwarf2read.c by Gavin Koch of Cygnus Solutions
    (gavin@cygnus.com).
@@ -71,48 +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;
-
-  /* Preserve the original value of info_ptr for the current
-     comp_unit so we can find a given entry by its reference. */
-  char* info_ptr_unit;
+  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;
@@ -131,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;
@@ -211,38 +211,38 @@ struct attr_abbrev
 /* Read dwarf information from a buffer.  */
 
 static unsigned int
-read_1_byte (bfd *abfd ATTRIBUTE_UNUSED, char *buf)
+read_1_byte (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *buf)
 {
   return bfd_get_8 (abfd, buf);
 }
 
 static int
-read_1_signed_byte (bfd *abfd ATTRIBUTE_UNUSED, char *buf)
+read_1_signed_byte (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *buf)
 {
   return bfd_get_signed_8 (abfd, buf);
 }
 
 static unsigned int
-read_2_bytes (bfd *abfd, char *buf)
+read_2_bytes (bfd *abfd, bfd_byte *buf)
 {
   return bfd_get_16 (abfd, buf);
 }
 
 static unsigned int
-read_4_bytes (bfd *abfd, char *buf)
+read_4_bytes (bfd *abfd, bfd_byte *buf)
 {
   return bfd_get_32 (abfd, buf);
 }
 
 static bfd_uint64_t
-read_8_bytes (bfd *abfd, char *buf)
+read_8_bytes (bfd *abfd, bfd_byte *buf)
 {
   return bfd_get_64 (abfd, buf);
 }
 
-static char *
+static bfd_byte *
 read_n_bytes (bfd *abfd ATTRIBUTE_UNUSED,
-             char *buf,
+             bfd_byte *buf,
              unsigned int size ATTRIBUTE_UNUSED)
 {
   /* If the size of a host char is 8 bits, we can return a pointer
@@ -253,27 +253,29 @@ read_n_bytes (bfd *abfd ATTRIBUTE_UNUSED,
 
 static char *
 read_string (bfd *abfd ATTRIBUTE_UNUSED,
-            char *buf,
+            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 (struct comp_unit* unit,
-                     char *buf,
+                     bfd_byte *buf,
                      unsigned int *bytes_read_ptr)
 {
   bfd_uint64_t offset;
   struct dwarf2_debug *stash = unit->stash;
+  char *str;
 
   if (unit->offset_size == 4)
     offset = read_4_bytes (unit->abfd, buf);
@@ -315,77 +317,16 @@ read_indirect_string (struct comp_unit* unit,
       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 (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, 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 (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, 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_uint64_t
-read_address (struct comp_unit *unit, char *buf)
+read_address (struct comp_unit *unit, bfd_byte *buf)
 {
   switch (unit->addr_size)
     {
@@ -431,7 +372,7 @@ static struct abbrev_info**
 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;
@@ -538,11 +479,11 @@ read_abbrevs (bfd *abfd, bfd_uint64_t offset, struct dwarf2_debug *stash)
 
 /* Read an attribute value described by an attribute form.  */
 
-static char *
+static bfd_byte *
 read_attribute_value (struct attribute *attr,
                      unsigned form,
                      struct comp_unit *unit,
-                     char *info_ptr)
+                     bfd_byte *info_ptr)
 {
   bfd *abfd = unit->abfd;
   unsigned int bytes_read;
@@ -666,11 +607,11 @@ read_attribute_value (struct attribute *attr,
 
 /* Read an attribute described by an abbreviated attribute.  */
 
-static char *
+static bfd_byte *
 read_attribute (struct attribute *attr,
                struct attr_abbrev *abbrev,
                struct comp_unit *unit,
-               char *info_ptr)
+               bfd_byte *info_ptr)
 {
   attr->name = abbrev->name;
   info_ptr = read_attribute_value (attr, abbrev->form, unit, info_ptr);
@@ -686,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.  */
@@ -705,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' */
@@ -715,7 +656,7 @@ struct line_info_table
 struct funcinfo
 {
   struct funcinfo *prev_func;
-  charname;
+  char *name;
   bfd_vma low;
   bfd_vma high;
 };
@@ -824,7 +765,7 @@ add_line_info (struct line_info_table *table,
 static char *
 concat_filename (struct line_info_table *table, unsigned int file)
 {
-  charfilename;
+  char *filename;
 
   if (file - 1 >= table->num_files)
     {
@@ -837,7 +778,7 @@ concat_filename (struct line_info_table *table, unsigned int 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);
 
@@ -907,8 +848,8 @@ 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;
@@ -1326,13 +1267,13 @@ static char *
 find_abstract_instance_name (struct comp_unit *unit, bfd_uint64_t die_ref)
 {
   bfd *abfd = unit->abfd;
-  char *info_ptr;
+  bfd_byte *info_ptr;
   unsigned int abbrev_number, bytes_read, i;
   struct abbrev_info *abbrev;
   struct attribute attr;
   char *name = 0;
 
-  info_ptr = unit->stash->info_ptr_unit + die_ref;
+  info_ptr = unit->info_ptr_unit + die_ref;
   abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
   info_ptr += bytes_read;
 
@@ -1367,7 +1308,7 @@ static bfd_boolean
 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)
@@ -1376,7 +1317,7 @@ scan_unit_for_functions (struct comp_unit *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;
@@ -1478,6 +1419,7 @@ static struct comp_unit *
 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;
@@ -1488,8 +1430,8 @@ parse_comp_unit (bfd *abfd,
   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);
@@ -1558,6 +1500,7 @@ parse_comp_unit (bfd *abfd,
   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)
     {
@@ -1586,7 +1529,7 @@ parse_comp_unit (bfd *abfd,
 
        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
@@ -1803,7 +1746,6 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
       if (stash->info_ptr == NULL)
        return FALSE;
 
-      stash->info_ptr_unit = stash->info_ptr;
       stash->info_ptr_end = stash->info_ptr;
 
       for (msec = find_debug_info (abfd, NULL);
@@ -1851,6 +1793,7 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
       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
@@ -1883,7 +1826,8 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
 
       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)
This page took 0.031704 seconds and 4 git commands to generate.