* sysdep.h (stpcpy): Wrap declaration in parentheses.
[deliverable/binutils-gdb.git] / bfd / dwarf1.c
index 65319861a1c0a06a6702ef042e24b6d160664471..5d6c1e359e512e05fce58af9d02a7897167439c0 100644 (file)
@@ -1,23 +1,24 @@
 /* DWARF 1 find nearest line (_bfd_dwarf1_find_nearest_line).
-   Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+   Copyright 1998, 1999, 2000, 2001, 2002, 2004, 2005
+   Free Software Foundation, Inc.
 
-Written by Gavin Romig-Koch of Cygnus Solutions (gavin@cygnus.com).
+   Written by Gavin Romig-Koch of Cygnus Solutions (gavin@cygnus.com).
 
-This file is part of BFD.
+   This file is part of BFD.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or (at
-your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or (at
+   your option) any later version.
 
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-General Public License for more details.
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 #include "bfd.h"
 #include "sysdep.h"
@@ -28,8 +29,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* dwarf1_debug is the starting point for all dwarf1 info.  */
 
-struct dwarf1_debug {
-
+struct dwarf1_debug
+{
   /* The bfd we are working with.  */
   bfd* abfd;
 
@@ -55,7 +56,8 @@ struct dwarf1_debug {
 
 /* One dwarf1_unit for each parsed compilation unit die.  */
 
-struct dwarf1_unit {
+struct dwarf1_unit
+{
   /* Linked starting from stash->lastUnit.  */
   struct dwarf1_unit* prev;
 
@@ -66,7 +68,7 @@ struct dwarf1_unit {
   unsigned long low_pc;
   unsigned long high_pc;
 
-  /* Does this unit have a statement list? */
+  /* Does this unit have a statement list?  */
   int has_stmt_list;
 
   /* If any, the offset of the line number table in the .line section.  */
@@ -75,7 +77,7 @@ struct dwarf1_unit {
   /* If non-zero, a pointer to the first child of this unit.  */
   char* first_child;
 
-  /* How many line entries? */
+  /* How many line entries?  */
   unsigned long line_count;
 
   /* The decoded line number table (line_count entries).  */
@@ -87,7 +89,8 @@ struct dwarf1_unit {
 
 /* One dwarf1_func for each parsed function die.  */
 
-struct dwarf1_func {
+struct dwarf1_func
+{
   /* Linked starting from aUnit->func_list.  */
   struct dwarf1_func* prev;
 
@@ -100,7 +103,8 @@ struct dwarf1_func {
 };
 
 /* Used to return info about a parsed die.  */
-struct die_info {
+struct die_info
+{
   unsigned long length;
   unsigned long sibling;
   unsigned long low_pc;
@@ -115,7 +119,8 @@ struct die_info {
 };
 
 /* Parsed line number information.  */
-struct linenumber {
+struct linenumber
+{
   /* First address in the line.  */
   unsigned long addr;
 
@@ -124,30 +129,17 @@ struct linenumber {
 };
 
 /* Find the form of an attr, from the attr field.  */
-#define FORM_FROM_ATTR(attr)   ((attr) & 0xF)  /* Implicitly specified */
-
-static struct dwarf1_unit *alloc_dwarf1_unit PARAMS ((struct dwarf1_debug *));
-static struct dwarf1_func *alloc_dwarf1_func
-  PARAMS ((struct dwarf1_debug *, struct dwarf1_unit *));
-static boolean parse_die PARAMS ((bfd *, struct die_info *, char *, char *));
-static boolean parse_line_table
-  PARAMS ((struct dwarf1_debug *, struct dwarf1_unit *));
-static boolean parse_functions_in_unit
-  PARAMS ((struct dwarf1_debug *, struct dwarf1_unit *));
-static boolean dwarf1_unit_find_nearest_line
-  PARAMS ((struct dwarf1_debug *, struct dwarf1_unit *, unsigned long,
-          const char **, const char **, unsigned int *));
+#define FORM_FROM_ATTR(attr)   ((attr) & 0xF)  /* Implicitly specified.  */
 
 /* Return a newly allocated dwarf1_unit.  It should be cleared and
    then attached into the 'stash' at 'stash->lastUnit'.  */
 
 static struct dwarf1_unit*
-alloc_dwarf1_unit (stash)
-  struct dwarf1_debug* stash;
+alloc_dwarf1_unit (struct dwarf1_debug* stash)
 {
   bfd_size_type amt = sizeof (struct dwarf1_unit);
 
-  struct dwarf1_unit* x = (struct dwarf1_unit*) bfd_zalloc (stash->abfd, amt);
+  struct dwarf1_unit* x = bfd_zalloc (stash->abfd, amt);
   x->prev = stash->lastUnit;
   stash->lastUnit = x;
 
@@ -157,14 +149,12 @@ alloc_dwarf1_unit (stash)
 /* Return a newly allocated dwarf1_func.  It must be cleared and
    attached into 'aUnit' at 'aUnit->func_list'.  */
 
-static struct dwarf1_func*
-alloc_dwarf1_func (stash, aUnit)
-     struct dwarf1_debug* stash;
-     struct dwarf1_unit* aUnit;
+static struct dwarf1_func *
+alloc_dwarf1_func (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
 {
   bfd_size_type amt = sizeof (struct dwarf1_func);
 
-  struct dwarf1_func* x = (struct dwarf1_func*) bfd_zalloc (stash->abfd, amt);
+  struct dwarf1_func* x = bfd_zalloc (stash->abfd, amt);
   x->prev = aUnit->func_list;
   aUnit->func_list = x;
 
@@ -176,31 +166,30 @@ alloc_dwarf1_func (stash, aUnit)
    'abfd' must be the bfd from which the section that 'aDiePtr'
    points to was pulled from.
 
-   Return false if the die is invalidly formatted; true otherwise.  */
+   Return FALSE if the die is invalidly formatted; TRUE otherwise.  */
 
-static boolean
-parse_die (abfd, aDieInfo, aDiePtr, aDiePtrEnd)
-     bfd* abfd;
-     struct die_info* aDieInfo;
-     char*            aDiePtr;
-     char*            aDiePtrEnd;
+static bfd_boolean
+parse_die (bfd *             abfd,
+          struct die_info * aDieInfo,
+          char *            aDiePtr,
+          char *            aDiePtrEnd)
 {
   char* this_die = aDiePtr;
   char* xptr = this_die;
 
-  memset (aDieInfo,0,sizeof (*aDieInfo));
+  memset (aDieInfo, 0, sizeof (* aDieInfo));
 
   /* First comes the length.  */
   aDieInfo->length = bfd_get_32 (abfd, (bfd_byte *) xptr);
   xptr += 4;
   if (aDieInfo->length == 0
       || (this_die + aDieInfo->length) >= aDiePtrEnd)
-    return false;
+    return FALSE;
   if (aDieInfo->length < 6)
     {
       /* Just padding bytes.  */
       aDieInfo->tag = TAG_padding;
-      return true;
+      return TRUE;
     }
 
   /* Then the tag.  */
@@ -215,7 +204,6 @@ parse_die (abfd, aDieInfo, aDiePtr, aDiePtrEnd)
       /* Parse the attribute based on its form.  This section
          must handle all dwarf1 forms, but need only handle the
         actual attributes that we care about.  */
-
       attr = bfd_get_16 (abfd, (bfd_byte *) xptr);
       xptr += 2;
 
@@ -259,17 +247,15 @@ parse_die (abfd, aDieInfo, aDiePtr, aDiePtrEnd)
        }
     }
 
-  return true;
+  return TRUE;
 }
 
 /* Parse a dwarf1 line number table for 'aUnit->stmt_list_offset'
-   into 'aUnit->linenumber_table'.  Return false if an error
-   occurs; true otherwise.  */
+   into 'aUnit->linenumber_table'.  Return FALSE if an error
+   occurs; TRUE otherwise.  */
 
-static boolean
-parse_line_table (stash, aUnit)
-  struct dwarf1_debug* stash;
-  struct dwarf1_unit* aUnit;
+static bfd_boolean
+parse_line_table (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
 {
   char* xptr;
 
@@ -281,19 +267,19 @@ parse_line_table (stash, aUnit)
 
       msec = bfd_get_section_by_name (stash->abfd, ".line");
       if (! msec)
-       return false;
+       return FALSE;
 
-      size = bfd_get_section_size_before_reloc (msec);
-      stash->line_section = (char *) bfd_alloc (stash->abfd, size);
+      size = msec->rawsize ? msec->rawsize : msec->size;
+      stash->line_section = bfd_alloc (stash->abfd, size);
 
       if (! stash->line_section)
-       return false;
+       return FALSE;
 
       if (! bfd_get_section_contents (stash->abfd, msec, stash->line_section,
-                                     (bfd_vma) 0, size))
+                                     0, size))
        {
          stash->line_section = 0;
-         return false;
+         return FALSE;
        }
 
       stash->line_section_end = stash->line_section + size;
@@ -316,13 +302,12 @@ parse_line_table (stash, aUnit)
       xptr += 4;
 
       /* How many line entrys?
-        10 = 4 (line number) + 2 (pos in line) + 4 (address in line) */
+        10 = 4 (line number) + 2 (pos in line) + 4 (address in line) */
       aUnit->line_count = (tblend - xptr) / 10;
 
       /* Allocate an array for the entries.  */
       amt = sizeof (struct linenumber) * aUnit->line_count;
-      aUnit->linenumber_table = ((struct linenumber *)
-                                bfd_alloc (stash->abfd, amt));
+      aUnit->linenumber_table = bfd_alloc (stash->abfd, amt);
 
       for (eachLine = 0; eachLine < aUnit->line_count; eachLine++)
        {
@@ -341,31 +326,29 @@ parse_line_table (stash, aUnit)
        }
     }
 
-  return true;
+  return TRUE;
 }
 
 /* Parse each function die in a compilation unit 'aUnit'.
    The first child die of 'aUnit' should be in 'aUnit->first_child',
    the result is placed in 'aUnit->func_list'.
-   Return false if error; true otherwise.  */
+   Return FALSE if error; TRUE otherwise.  */
 
-static boolean
-parse_functions_in_unit (stash, aUnit)
-     struct dwarf1_debug* stash;
-     struct dwarf1_unit* aUnit;
+static bfd_boolean
+parse_functions_in_unit (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
 {
   char* eachDie;
 
   if (aUnit->first_child)
     for (eachDie = aUnit->first_child;
-        eachDie < stash->debug_section_end;
+        eachDie < stash->debug_section_end;
         )
       {
        struct die_info eachDieInfo;
 
        if (! parse_die (stash->abfd, &eachDieInfo, eachDie,
                         stash->debug_section_end))
-         return false;
+         return FALSE;
 
        if (eachDieInfo.tag == TAG_global_subroutine
            || eachDieInfo.tag == TAG_subroutine
@@ -386,25 +369,22 @@ parse_functions_in_unit (stash, aUnit)
          break;
       }
 
-  return true;
+  return TRUE;
 }
 
 /* Find the nearest line to 'addr' in 'aUnit'.
    Return whether we found the line (or a function) without error.  */
 
-static boolean
-dwarf1_unit_find_nearest_line (stash, aUnit, addr,
-                      filename_ptr, functionname_ptr,
-                      linenumber_ptr)
-  struct dwarf1_debug* stash;
-  struct dwarf1_unit* aUnit;
-  unsigned long addr;
-  const char **filename_ptr;
-  const char **functionname_ptr;
-  unsigned int *linenumber_ptr;
+static bfd_boolean
+dwarf1_unit_find_nearest_line (struct dwarf1_debug* stash,
+                              struct dwarf1_unit* aUnit,
+                              unsigned long addr,
+                              const char **filename_ptr,
+                              const char **functionname_ptr,
+                              unsigned int *linenumber_ptr)
 {
-  int line_p = false;
-  int func_p = false;
+  int line_p = FALSE;
+  int func_p = FALSE;
 
   if (aUnit->low_pc <= addr && addr < aUnit->high_pc)
     {
@@ -416,13 +396,13 @@ dwarf1_unit_find_nearest_line (stash, aUnit, addr,
          if (! aUnit->linenumber_table)
            {
              if (! parse_line_table (stash, aUnit))
-               return false;
+               return FALSE;
            }
 
          if (! aUnit->func_list)
            {
              if (! parse_functions_in_unit (stash, aUnit))
-               return false;
+               return FALSE;
            }
 
          for (i = 0; i < aUnit->line_count; i++)
@@ -432,7 +412,7 @@ dwarf1_unit_find_nearest_line (stash, aUnit, addr,
                {
                  *filename_ptr = aUnit->name;
                  *linenumber_ptr = aUnit->linenumber_table[i].linenumber;
-                 line_p = true;
+                 line_p = TRUE;
                  break;
                }
            }
@@ -445,7 +425,7 @@ dwarf1_unit_find_nearest_line (stash, aUnit, addr,
                  && addr < eachFunc->high_pc)
                {
                  *functionname_ptr = eachFunc->name;
-                 func_p = true;
+                 func_p = TRUE;
                  break;
                }
            }
@@ -456,18 +436,16 @@ dwarf1_unit_find_nearest_line (stash, aUnit, addr,
 }
 
 /* The DWARF 1 version of find_nearest line.
-   Return true if the line is found without error.  */
-
-boolean
-_bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
-                              filename_ptr, functionname_ptr, linenumber_ptr)
-     bfd *abfd;
-     asection *section;
-     asymbol **symbols ATTRIBUTE_UNUSED;
-     bfd_vma offset;
-     const char **filename_ptr;
-     const char **functionname_ptr;
-     unsigned int *linenumber_ptr;
+   Return TRUE if the line is found without error.  */
+
+bfd_boolean
+_bfd_dwarf1_find_nearest_line (bfd *abfd,
+                              asection *section,
+                              asymbol **symbols ATTRIBUTE_UNUSED,
+                              bfd_vma offset,
+                              const char **filename_ptr,
+                              const char **functionname_ptr,
+                              unsigned int *linenumber_ptr)
 {
   struct dwarf1_debug *stash = elf_tdata (abfd)->dwarf1_find_line_info;
 
@@ -486,31 +464,29 @@ _bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
       bfd_size_type size = sizeof (struct dwarf1_debug);
 
       stash = elf_tdata (abfd)->dwarf1_find_line_info
-       = (struct dwarf1_debug *) bfd_zalloc (abfd, size);
+       = bfd_zalloc (abfd, size);
 
       if (! stash)
-       return false;
+       return FALSE;
 
       msec = bfd_get_section_by_name (abfd, ".debug");
       if (! msec)
-       {
-         /* No dwarf1 info.  Note that at this point the stash
-            has been allocated, but contains zeros, this lets
-            future calls to this function fail quicker.  */
-         return false;
-       }
+       /* No dwarf1 info.  Note that at this point the stash
+          has been allocated, but contains zeros, this lets
+          future calls to this function fail quicker.  */
+       return FALSE;
 
-      size = bfd_get_section_size_before_reloc (msec);
-      stash->debug_section = (char *) bfd_alloc (abfd, size);
+      size = msec->rawsize ? msec->rawsize : msec->size;
+      stash->debug_section = bfd_alloc (abfd, size);
 
       if (! stash->debug_section)
-       return false;
+       return FALSE;
 
       if (! bfd_get_section_contents (abfd, msec, stash->debug_section,
-                                     (bfd_vma) 0, size))
+                                     0, size))
        {
          stash->debug_section = 0;
-         return false;
+         return FALSE;
        }
 
       stash->debug_section_end = stash->debug_section + size;
@@ -522,18 +498,16 @@ _bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
      or that an error occured while setting up the stash.  */
 
   if (! stash->debug_section)
-    return false;
+    return FALSE;
 
   /* Look at the previously parsed units to see if any contain
      the addr.  */
   for (eachUnit = stash->lastUnit; eachUnit; eachUnit = eachUnit->prev)
-    {
-      if (eachUnit->low_pc <= addr && addr < eachUnit->high_pc)
-       return dwarf1_unit_find_nearest_line (stash, eachUnit, addr,
-                                             filename_ptr,
-                                             functionname_ptr,
-                                             linenumber_ptr);
-    }
+    if (eachUnit->low_pc <= addr && addr < eachUnit->high_pc)
+      return dwarf1_unit_find_nearest_line (stash, eachUnit, addr,
+                                           filename_ptr,
+                                           functionname_ptr,
+                                           linenumber_ptr);
 
   while (stash->currentDie < stash->debug_section_end)
     {
@@ -541,7 +515,7 @@ _bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
 
       if (! parse_die (stash->abfd, &aDieInfo, stash->currentDie,
                       stash->debug_section_end))
-       return false;
+       return FALSE;
 
       if (aDieInfo.tag == TAG_compile_unit)
        {
@@ -578,7 +552,5 @@ _bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
        stash->currentDie += aDieInfo.length;
     }
 
-  return false;
+  return FALSE;
 }
-
-/* EOF */
This page took 0.030307 seconds and 4 git commands to generate.