* config/bfin-parse.y (gen_multi_instr_1): Check anomaly
[deliverable/binutils-gdb.git] / bfd / dwarf2.c
index b53a5d45d6e53c0e05ef1aa0363bfb5056eff493..3085180e270877f80c8d227f5b73ad10c14a24ef 100644 (file)
@@ -1,6 +1,6 @@
 /* DWARF 2 support.
    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-   2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+   2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
    Adapted from gdb/dwarf2read.c by Gavin Koch of Cygnus Solutions
    (gavin@cygnus.com).
@@ -35,7 +35,7 @@
 #include "libiberty.h"
 #include "libbfd.h"
 #include "elf-bfd.h"
-#include "elf/dwarf2.h"
+#include "dwarf2.h"
 
 /* The data in the .debug_line statement prologue looks like this.  */
 
@@ -399,71 +399,74 @@ lookup_info_hash_table (struct info_hash_table *hash_table, const char *key)
 }
 
 /* Read a section into its appropriate place in the dwarf2_debug
-   struct (indicated by SECTION_BUFFER and SECTION_SIZE).  If syms is
+   struct (indicated by SECTION_BUFFER and SECTION_SIZE).  If SYMS is
    not NULL, use bfd_simple_get_relocated_section_contents to read the
-   section contents, otherwise use bfd_get_section_contents.  */
+   section contents, otherwise use bfd_get_section_contents.  Fail if
+   the located section does not contain at least OFFSET bytes.  */
 
 static bfd_boolean
-read_section (bfd *abfd,
-             const char* section_name, const char* compressed_section_name,
-             asymbol** syms, bfd_uint64_t offset,
-             bfd_byte **section_buffer, bfd_size_type *section_size)
+read_section (bfd *           abfd,
+             const char *    section_name,
+             const char *    compressed_section_name,
+             asymbol **      syms,
+             bfd_uint64_t    offset,
+             bfd_byte **     section_buffer,
+             bfd_size_type * section_size)
 {
   asection *msec;
   bfd_boolean section_is_compressed = FALSE;
 
   /* read_section is a noop if the section has already been read.  */
-  if (*section_buffer)
-    return TRUE;
-
-  msec = bfd_get_section_by_name (abfd, section_name);
-  if (! msec && compressed_section_name)
-    {
-      msec = bfd_get_section_by_name (abfd, compressed_section_name);
-      section_is_compressed = TRUE;
-    }
-  if (! msec)
+  if (!*section_buffer)
     {
-      (*_bfd_error_handler) (_("Dwarf Error: Can't find %s section."), section_name);
-      bfd_set_error (bfd_error_bad_value);
-      return FALSE;
-    }
+      msec = bfd_get_section_by_name (abfd, section_name);
+      if (! msec && compressed_section_name)
+       {
+         msec = bfd_get_section_by_name (abfd, compressed_section_name);
+         section_is_compressed = TRUE;
+       }
+      if (! msec)
+       {
+         (*_bfd_error_handler) (_("Dwarf Error: Can't find %s section."), section_name);
+         bfd_set_error (bfd_error_bad_value);
+         return FALSE;
+       }
 
-  if (syms)
-    {
-      *section_size = msec->size;
-      *section_buffer
-         = bfd_simple_get_relocated_section_contents (abfd, msec, NULL, syms);
-      if (! *section_buffer)
-       return FALSE;
-    }
-  else
-    {
       *section_size = msec->rawsize ? msec->rawsize : msec->size;
-      *section_buffer = bfd_malloc (*section_size);
-      if (! *section_buffer)
-       return FALSE;
-      if (! bfd_get_section_contents (abfd, msec, *section_buffer,
-                                     0, *section_size))
-       return FALSE;
-    }
+      if (syms)
+       {
+         *section_buffer
+             = bfd_simple_get_relocated_section_contents (abfd, msec, NULL, syms);
+         if (! *section_buffer)
+           return FALSE;
+       }
+      else
+       {
+         *section_buffer = bfd_malloc (*section_size);
+         if (! *section_buffer)
+           return FALSE;
+         if (! bfd_get_section_contents (abfd, msec, *section_buffer,
+                                         0, *section_size))
+           return FALSE;
+       }
 
-  if (section_is_compressed)
-    {
-      if (! bfd_uncompress_section_contents (section_buffer, section_size))
+      if (section_is_compressed)
        {
-         (*_bfd_error_handler) (_("Dwarf Error: unable to decompress %s section."), compressed_section_name);
-         bfd_set_error (bfd_error_bad_value);
-         return FALSE;
+         if (! bfd_uncompress_section_contents (section_buffer, section_size))
+           {
+             (*_bfd_error_handler) (_("Dwarf Error: unable to decompress %s section."), compressed_section_name);
+             bfd_set_error (bfd_error_bad_value);
+             return FALSE;
+           }
        }
     }
 
   /* It is possible to get a bad value for the offset into the section
-   * that the client wants.  Validate it here to avoid trouble later.  */
+     that the client wants.  Validate it here to avoid trouble later.  */
   if (offset != 0 && offset >= *section_size)
     {
       (*_bfd_error_handler) (_("Dwarf Error: Offset (%lu) greater than or equal to %s size (%lu)."),
-                            offset, section_name, *section_size);
+                            (long) offset, section_name, *section_size);
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
     }
@@ -512,9 +515,6 @@ 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
-     allocated on the temporary obstack.  */
   return buf;
 }
 
@@ -525,6 +525,7 @@ read_string (bfd *abfd ATTRIBUTE_UNUSED,
 {
   /* Return a pointer to the embedded string.  */
   char *str = (char *) buf;
+
   if (*str == '\0')
     {
       *bytes_read_ptr = 1;
@@ -535,10 +536,12 @@ read_string (bfd *abfd ATTRIBUTE_UNUSED,
   return str;
 }
 
+/* END VERBATIM */
+
 static char *
-read_indirect_string (struct comp_unit* unit,
-                     bfd_byte *buf,
-                     unsigned int *bytes_read_ptr)
+read_indirect_string (struct comp_unit * unit,
+                     bfd_byte *         buf,
+                     unsigned int *     bytes_read_ptr)
 {
   bfd_uint64_t offset;
   struct dwarf2_debug *stash = unit->stash;
@@ -548,12 +551,13 @@ read_indirect_string (struct comp_unit* unit,
     offset = read_4_bytes (unit->abfd, buf);
   else
     offset = read_8_bytes (unit->abfd, buf);
+
   *bytes_read_ptr = unit->offset_size;
 
   if (! read_section (unit->abfd, ".debug_str", ".zdebug_str",
-                     0, offset,
+                     stash->syms, offset,
                      &stash->dwarf_str_buffer, &stash->dwarf_str_size))
-    return 0;
+    return NULL;
 
   str = (char *) stash->dwarf_str_buffer + offset;
   if (*str == '\0')
@@ -561,8 +565,6 @@ read_indirect_string (struct comp_unit* unit,
   return str;
 }
 
-/* END VERBATIM */
-
 static bfd_uint64_t
 read_address (struct comp_unit *unit, bfd_byte *buf)
 {
@@ -1403,6 +1405,10 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
                  line_ptr += bytes_read;
                  table->num_files++;
                  break;
+               case DW_LNE_set_discriminator:
+                 (void) read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
+                 line_ptr += bytes_read;
+                 break;
                default:
                  (*_bfd_error_handler) (_("Dwarf Error: mangled line number section."));
                  bfd_set_error (bfd_error_bad_value);
@@ -1800,20 +1806,11 @@ read_rangelist (struct comp_unit *unit, struct arange *arange, bfd_uint64_t offs
       bfd_vma low_pc;
       bfd_vma high_pc;
 
-      if (unit->addr_size == 4)
-       {
-         low_pc = read_4_bytes (unit->abfd, ranges_ptr);
-         ranges_ptr += 4;
-         high_pc = read_4_bytes (unit->abfd, ranges_ptr);
-         ranges_ptr += 4;
-       }
-      else
-       {
-         low_pc = read_8_bytes (unit->abfd, ranges_ptr);
-         ranges_ptr += 8;
-         high_pc = read_8_bytes (unit->abfd, ranges_ptr);
-         ranges_ptr += 8;
-       }
+      low_pc = read_address (unit, ranges_ptr);
+      ranges_ptr += unit->addr_size;
+      high_pc = read_address (unit, ranges_ptr);
+      ranges_ptr += unit->addr_size;
+
       if (low_pc == 0 && high_pc == 0)
        break;
       if (low_pc == -1UL && high_pc != -1UL)
@@ -3186,13 +3183,6 @@ find_line (bfd *abfd,
            break;
          stash->info_ptr += length;
 
-         if ((bfd_vma) (stash->info_ptr - stash->sec_info_ptr)
-             == stash->sec->size)
-           {
-             stash->sec = find_debug_info (stash->bfd, stash->sec);
-             stash->sec_info_ptr = stash->info_ptr;
-           }
-
          if (stash->all_comp_units)
            stash->all_comp_units->prev_unit = each;
          else
@@ -3222,6 +3212,14 @@ find_line (bfd *abfd,
                                                     functionname_ptr,
                                                     linenumber_ptr,
                                                     stash));
+
+         if ((bfd_vma) (stash->info_ptr - stash->sec_info_ptr)
+             == stash->sec->size)
+           {
+             stash->sec = find_debug_info (stash->bfd, stash->sec);
+             stash->sec_info_ptr = stash->info_ptr;
+           }
+
          if (found)
            goto done;
        }
This page took 0.026919 seconds and 4 git commands to generate.