bfd/ChangeLog
[deliverable/binutils-gdb.git] / binutils / ieee.c
index 73f87c41c982aa06d394b3b481da0aaa8ea85e08..34b937342e0ee4b8d6ee8dd1c2d0daf9af90ddcb 100644 (file)
@@ -1,12 +1,13 @@
 /* ieee.c -- Read and write IEEE-695 debugging information.
-   Copyright 1996, 1998, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007,
+   2008, 2009, 2010  Free Software Foundation, Inc.
    Written by Ian Lance Taylor <ian@cygnus.com>.
 
    This file is part of GNU Binutils.
 
    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
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
 
    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.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
 
 /* This file reads and writes IEEE-695 debugging information.  */
 
-#include <stdio.h>
+#include "sysdep.h"
 #include <assert.h>
-
 #include "bfd.h"
 #include "ieee.h"
-#include "bucomm.h"
 #include "libiberty.h"
 #include "debug.h"
 #include "budbg.h"
@@ -60,6 +59,16 @@ struct ieee_blockstack
 
 /* This structure holds information for a variable.  */
 
+enum ieee_var_kind
+  {
+    IEEE_UNKNOWN,
+    IEEE_EXTERNAL,
+    IEEE_GLOBAL,
+    IEEE_STATIC,
+    IEEE_LOCAL,
+    IEEE_FUNCTION
+  };
+
 struct ieee_var
 {
   /* Start of name.  */
@@ -71,15 +80,7 @@ struct ieee_var
   /* Slot if we make an indirect type.  */
   debug_type *pslot;
   /* Kind of variable or function.  */
-  enum
-    {
-      IEEE_UNKNOWN,
-      IEEE_EXTERNAL,
-      IEEE_GLOBAL,
-      IEEE_STATIC,
-      IEEE_LOCAL,
-      IEEE_FUNCTION
-    } kind;
+  enum ieee_var_kind kind;
 };
 
 /* This structure holds all the variables.  */
@@ -1070,6 +1071,16 @@ parse_ieee_bb (struct ieee_info *info, const bfd_byte **pp)
              break;
          }
 
+       if (! info->saw_filename)
+         {
+           namcopy = savestring (name, namlen);
+           if (namcopy == NULL)
+             return FALSE;
+           if (! debug_set_filename (info->dhandle, namcopy))
+             return FALSE;
+           info->saw_filename = TRUE;
+         }
+
        namcopy = savestring (name, namlen);
        if (namcopy == NULL)
          return FALSE;
@@ -1234,7 +1245,7 @@ parse_ieee_be (struct ieee_info *info, const bfd_byte **pp)
   switch (info->blockstack.bsp->kind)
     {
     case 2:
-      /* When we end the global typedefs block, we copy out the the
+      /* When we end the global typedefs block, we copy out the
          contents of info->vars.  This is because the variable indices
          may be reused in the local blocks.  However, we need to
          preserve them so that we can locate a function returning a
@@ -1787,6 +1798,7 @@ parse_ieee_ty (struct ieee_info *info, const bfd_byte **pp)
       break;
 
     case 'V':
+    case 'v':
       /* Void.  This is not documented, but the MRI compiler emits it.  */
       type = debug_make_void_type (dhandle);
       break;
@@ -2490,7 +2502,7 @@ ieee_read_cxx_misc (struct ieee_info *info, const bfd_byte **pp,
 
     case 'z':
       {
-       const char *name, *mangled, *class;
+       const char *name, *mangled, *cxx_class;
        unsigned long namlen, mangledlen, classlen;
        bfd_vma control;
 
@@ -2498,7 +2510,7 @@ ieee_read_cxx_misc (struct ieee_info *info, const bfd_byte **pp,
 
        if (! ieee_require_atn65 (info, pp, &name, &namlen)
            || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen)
-           || ! ieee_require_atn65 (info, pp, &class, &classlen)
+           || ! ieee_require_atn65 (info, pp, &cxx_class, &classlen)
            || ! ieee_require_asn (info, pp, &control))
          return FALSE;
 
@@ -2523,7 +2535,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp,
                     unsigned long count)
 {
   const bfd_byte *start;
-  bfd_vma class;
+  bfd_vma cxx_class;
   const char *tag;
   unsigned long taglen;
   struct ieee_tag *it;
@@ -2548,7 +2560,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp,
 
   start = *pp;
 
-  if (! ieee_require_asn (info, pp, &class))
+  if (! ieee_require_asn (info, pp, &cxx_class))
     return FALSE;
   --count;
 
@@ -2604,7 +2616,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp,
        case 'b':
          {
            bfd_vma flags, cinline;
-           const char *basename, *fieldname;
+           const char *base, *fieldname;
            unsigned long baselen, fieldlen;
            char *basecopy;
            debug_type basetype;
@@ -2616,7 +2628,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp,
            /* This represents a base or friend class.  */
 
            if (! ieee_require_asn (info, pp, &flags)
-               || ! ieee_require_atn65 (info, pp, &basename, &baselen)
+               || ! ieee_require_atn65 (info, pp, &base, &baselen)
                || ! ieee_require_asn (info, pp, &cinline)
                || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen))
              return FALSE;
@@ -2638,7 +2650,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp,
                return FALSE;
              }
 
-           basecopy = savestring (basename, baselen);
+           basecopy = savestring (base, baselen);
            basetype = debug_find_tagged_type (dhandle, basecopy,
                                               DEBUG_KIND_ILLEGAL);
            free (basecopy);
@@ -3101,7 +3113,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp,
 
        case 'z':
          {
-           const char *vname, *basename;
+           const char *vname, *base;
            unsigned long vnamelen, baselen;
            bfd_vma vsize, control;
 
@@ -3109,7 +3121,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp,
 
            if (! ieee_require_atn65 (info, pp, &vname, &vnamelen)
                || ! ieee_require_asn (info, pp, &vsize)
-               || ! ieee_require_atn65 (info, pp, &basename, &baselen)
+               || ! ieee_require_atn65 (info, pp, &base, &baselen)
                || ! ieee_require_asn (info, pp, &control))
              return FALSE;
            count -= 4;
@@ -3126,7 +3138,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp,
              {
                char *basecopy;
 
-               basecopy = savestring (basename, baselen);
+               basecopy = savestring (base, baselen);
                vptrbase = debug_find_tagged_type (dhandle, basecopy,
                                                   DEBUG_KIND_ILLEGAL);
                free (basecopy);
@@ -3170,7 +3182,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp,
      it->slot.  We update it->slot to automatically update all
      references to this struct.  */
   it->slot = debug_make_object_type (dhandle,
-                                    class != 'u',
+                                    cxx_class != 'u',
                                     debug_get_type_size (dhandle,
                                                          it->slot),
                                     fields, baseclasses, dmethods,
@@ -3293,7 +3305,7 @@ ieee_read_reference (struct ieee_info *info, const bfd_byte **pp)
 {
   const bfd_byte *start;
   bfd_vma flags;
-  const char *class, *name;
+  const char *cxx_class, *name;
   unsigned long classlen, namlen;
   debug_type *pslot;
   debug_type target;
@@ -3307,7 +3319,7 @@ ieee_read_reference (struct ieee_info *info, const bfd_byte **pp)
      the spec.  */
   if (flags == 3)
     {
-      if (! ieee_require_atn65 (info, pp, &class, &classlen))
+      if (! ieee_require_atn65 (info, pp, &cxx_class, &classlen))
        return FALSE;
     }
 
@@ -3397,8 +3409,8 @@ ieee_read_reference (struct ieee_info *info, const bfd_byte **pp)
 
       for (it = info->tags; it != NULL; it = it->next)
        {
-         if (it->name[0] == class[0]
-             && strncmp (it->name, class, classlen) == 0
+         if (it->name[0] == cxx_class[0]
+             && strncmp (it->name, cxx_class, classlen) == 0
              && strlen (it->name) == classlen)
            {
              if (it->fslots != NULL)
@@ -4593,8 +4605,10 @@ write_ieee_debugging_info (bfd *abfd, void *dhandle)
   info.type_indx = 256;
   info.name_indx = 32;
 
-  if (! bfd_hash_table_init (&info.typedefs.root, ieee_name_type_newfunc)
-      || ! bfd_hash_table_init (&info.tags.root, ieee_name_type_newfunc))
+  if (!bfd_hash_table_init (&info.typedefs.root, ieee_name_type_newfunc,
+                           sizeof (struct ieee_name_type_hash_entry))
+      || !bfd_hash_table_init (&info.tags.root, ieee_name_type_newfunc,
+                              sizeof (struct ieee_name_type_hash_entry)))
     return FALSE;
 
   if (! ieee_init_buffer (&info, &info.global_types)
@@ -4675,14 +4689,10 @@ write_ieee_debugging_info (bfd *abfd, void *dhandle)
       return TRUE;
     }
   err = NULL;
-  s = bfd_make_section (abfd, ".debug");
+  s = bfd_make_section_with_flags (abfd, ".debug",
+                                  SEC_DEBUGGING | SEC_HAS_CONTENTS);
   if (s == NULL)
     err = "bfd_make_section";
-  if (err == NULL)
-    {
-      if (! bfd_set_section_flags (abfd, s, SEC_DEBUGGING | SEC_HAS_CONTENTS))
-       err = "bfd_set_section_flags";
-    }
   if (err == NULL)
     {
       bfd_size_type size;
@@ -4814,7 +4824,6 @@ ieee_start_compilation_unit (void *p, const char *filename)
   const char *backslash;
 #endif
   char *c, *s;
-  unsigned int nindx;
 
   if (info->filename != NULL)
     {
@@ -4862,7 +4871,6 @@ ieee_start_compilation_unit (void *p, const char *filename)
       || ! ieee_write_id (info, info->modname))
     return FALSE;
 
-  nindx = info->name_indx;
   ++info->name_indx;
   if (! ieee_change_buffer (info, &info->vars)
       || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
@@ -5443,7 +5451,7 @@ ieee_pointer_type (void *p)
 
   if (! localp)
     {
-      m = ieee_get_modified_info (p, indx);
+      m = ieee_get_modified_info ((struct ieee_handle *) p, indx);
       if (m == NULL)
        return FALSE;
 
@@ -5501,7 +5509,7 @@ ieee_function_type (void *p, int argcount, bfd_boolean varargs)
   m = NULL;
   if (argcount < 0 && ! localp)
     {
-      m = ieee_get_modified_info (p, retindx);
+      m = ieee_get_modified_info ((struct ieee_handle *) p, retindx);
       if (m == NULL)
        return FALSE;
 
@@ -5678,12 +5686,6 @@ ieee_set_type (void *p, bfd_boolean bitstringp ATTRIBUTE_UNUSED)
 static bfd_boolean
 ieee_offset_type (void *p)
 {
-  struct ieee_handle *info = (struct ieee_handle *) p;
-  unsigned int targetindx, baseindx;
-
-  targetindx = ieee_pop_type (info);
-  baseindx = ieee_pop_type (info);
-
   /* FIXME: The MRI C++ compiler does not appear to generate any
      useful type information about an offset type.  It just records a
      pointer to member as an integer.  The MRI/HP IEEE spec does
@@ -5970,8 +5972,6 @@ ieee_struct_field (void *p, const char *name, bfd_vma bitpos, bfd_vma bitsize,
 
       if (referencep)
        {
-         unsigned int nindx;
-
          /* We need to output a record recording that this field is
              really of reference type.  We put this on the refs field
              of classdef, so that it can be appended to the C++
@@ -6191,7 +6191,7 @@ ieee_class_static_member (void *p, const char *name, const char *physname,
 /* Add a base class to a class.  */
 
 static bfd_boolean
-ieee_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean virtual,
+ieee_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean is_virtual,
                      enum debug_visibility visibility)
 {
   struct ieee_handle *info = (struct ieee_handle *) p;
@@ -6217,7 +6217,7 @@ ieee_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean virtual,
      class.  The stabs debugging reader will create a field named
      _vb$CLASS for a virtual base class, so we just use that.  FIXME:
      we should not depend upon a detail of stabs debugging.  */
-  if (virtual)
+  if (is_virtual)
     {
       fname = (char *) xmalloc (strlen (bname) + sizeof "_vb$");
       sprintf (fname, "_vb$%s", bname);
@@ -6285,7 +6285,7 @@ ieee_class_method_var (struct ieee_handle *info, const char *physname,
 {
   unsigned int flags;
   unsigned int nindx;
-  bfd_boolean virtual;
+  bfd_boolean is_virtual;
 
   /* We don't need the type of the method.  An IEEE consumer which
      wants the type must track down the function by the physical name
@@ -6315,18 +6315,18 @@ ieee_class_method_var (struct ieee_handle *info, const char *physname,
 
   nindx = info->type_stack->type.classdef->indx;
 
-  virtual = context || voffset > 0;
+  is_virtual = context || voffset > 0;
 
   if (! ieee_change_buffer (info,
                            &info->type_stack->type.classdef->pmiscbuf)
-      || ! ieee_write_asn (info, nindx, virtual ? 'v' : 'm')
+      || ! ieee_write_asn (info, nindx, is_virtual ? 'v' : 'm')
       || ! ieee_write_asn (info, nindx, flags)
       || ! ieee_write_atn65 (info, nindx,
                             info->type_stack->type.classdef->method)
       || ! ieee_write_atn65 (info, nindx, physname))
     return FALSE;
 
-  if (virtual)
+  if (is_virtual)
     {
       if (voffset > info->type_stack->type.classdef->voffset)
        info->type_stack->type.classdef->voffset = voffset;
This page took 0.028588 seconds and 4 git commands to generate.