2012-02-24 Luis Machado <lgustavo@codesourcery.com>
[deliverable/binutils-gdb.git] / gdb / stabsread.c
index c7d8a6c4743dd18ce008aa8ae8f6bf3c5c0093c2..afcfe0676f383de91f66e6e8deaa28f023747dec 100644 (file)
@@ -1,8 +1,6 @@
 /* Support routines for decoding "stabs" debugging information format.
 
-   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-   2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 1986-2012 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -41,6 +39,7 @@
 #include "buildsym.h"
 #include "complaints.h"
 #include "demangle.h"
+#include "gdb-demangle.h"
 #include "language.h"
 #include "doublest.h"
 #include "cp-abi.h"
@@ -729,7 +728,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
        SYMBOL_SET_NAMES (sym, string, p - string, 1, objfile);
 
       if (SYMBOL_LANGUAGE (sym) == language_cplus)
-       cp_scan_for_anonymous_namespaces (sym);
+       cp_scan_for_anonymous_namespaces (sym, objfile);
 
     }
   p++;
@@ -1174,7 +1173,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
                                        NULL, objfile);
          if (msym != NULL)
            {
-             char *new_name = gdbarch_static_transform_name
+             const char *new_name = gdbarch_static_transform_name
                (gdbarch, SYMBOL_LINKAGE_NAME (sym));
 
              SYMBOL_SET_LINKAGE_NAME (sym, new_name);
@@ -1368,7 +1367,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
                                        NULL, objfile);
          if (msym != NULL)
            {
-             char *new_name = gdbarch_static_transform_name
+             const char *new_name = gdbarch_static_transform_name
                (gdbarch, SYMBOL_LINKAGE_NAME (sym));
 
              SYMBOL_SET_LINKAGE_NAME (sym, new_name);
@@ -2233,10 +2232,11 @@ rs6000_builtin_type (int typenum, struct objfile *objfile)
 \f
 /* This page contains subroutines of read_type.  */
 
-/* Replace *OLD_NAME with the method name portion of PHYSNAME.  */
+/* Wrapper around method_name_from_physname to flag a complaint
+   if there is an error.  */
 
-static void
-update_method_name_from_physname (char **old_name, char *physname)
+static char *
+stabs_method_name_from_physname (const char *physname)
 {
   char *method_name;
 
@@ -2246,16 +2246,10 @@ update_method_name_from_physname (char **old_name, char *physname)
     {
       complaint (&symfile_complaints,
                 _("Method has bad physname %s\n"), physname);
-      return;
+      return NULL;
     }
 
-  if (strcmp (*old_name, method_name) != 0)
-    {
-      xfree (*old_name);
-      *old_name = method_name;
-    }
-  else
-    xfree (method_name);
+  return method_name;
 }
 
 /* Read member function stabs info for C++ classes.  The form of each member
@@ -2279,10 +2273,6 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
 {
   int nfn_fields = 0;
   int length = 0;
-  /* Total number of member functions defined in this class.  If the class
-     defines two `f' functions, and one `g' function, then this will have
-     the value 3.  */
-  int total_length = 0;
   int i;
   struct next_fnfield
     {
@@ -2682,7 +2672,6 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
              destr_fnlist->next = fip->fnlist;
              fip->fnlist = destr_fnlist;
              nfn_fields++;
-             total_length += has_destructor;
              length -= has_destructor;
            }
          else if (is_v3)
@@ -2693,14 +2682,24 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
                 - in -gstabs instead of -gstabs+
                 - or for static methods, which are output as a function type
                   instead of a method type.  */
+             char *new_method_name =
+               stabs_method_name_from_physname (sublist->fn_field.physname);
 
-             update_method_name_from_physname (&new_fnlist->fn_fieldlist.name,
-                                               sublist->fn_field.physname);
+             if (new_method_name != NULL
+                 && strcmp (new_method_name,
+                            new_fnlist->fn_fieldlist.name) != 0)
+               {
+                 new_fnlist->fn_fieldlist.name = new_method_name;
+                 xfree (main_fn_name);
+               }
+             else
+               xfree (new_method_name);
            }
          else if (has_destructor && new_fnlist->fn_fieldlist.name[0] != '~')
            {
              new_fnlist->fn_fieldlist.name =
-               concat ("~", main_fn_name, (char *)NULL);
+               obconcat (&objfile->objfile_obstack,
+                         "~", main_fn_name, (char *)NULL);
              xfree (main_fn_name);
            }
          else if (!has_stub)
@@ -2717,6 +2716,7 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
                new_fnlist->fn_fieldlist.name
                  = obsavestring (dem_opname, strlen (dem_opname),
                                  &objfile->objfile_obstack);
+             xfree (main_fn_name);
            }
 
          new_fnlist->fn_fieldlist.fn_fields = (struct fn_field *)
@@ -2733,7 +2733,6 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
          new_fnlist->next = fip->fnlist;
          fip->fnlist = new_fnlist;
          nfn_fields++;
-         total_length += length;
        }
     }
 
@@ -2745,7 +2744,6 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
       memset (TYPE_FN_FIELDLISTS (type), 0,
              sizeof (struct fn_fieldlist) * nfn_fields);
       TYPE_NFN_FIELDS (type) = nfn_fields;
-      TYPE_NFN_FIELDS_TOTAL (type) = total_length;
     }
 
   return 1;
@@ -2761,7 +2759,7 @@ read_cpp_abbrev (struct field_info *fip, char **pp, struct type *type,
                 struct objfile *objfile)
 {
   char *p;
-  char *name;
+  const char *name;
   char cpp_abbrev;
   struct type *context;
 
@@ -3274,7 +3272,7 @@ read_tilde_fields (struct field_info *fip, char **pp, struct type *type,
                   i >= TYPE_N_BASECLASSES (t);
                   --i)
                {
-                 char *name = TYPE_FIELD_NAME (t, i);
+                 const char *name = TYPE_FIELD_NAME (t, i);
 
                  if (!strncmp (name, vptr_name, sizeof (vptr_name) - 2)
                      && is_cplus_marker (name[sizeof (vptr_name) - 2]))
@@ -3414,8 +3412,8 @@ attach_fields_to_type (struct field_info *fip, struct type *type,
 static void 
 complain_about_struct_wipeout (struct type *type)
 {
-  char *name = "";
-  char *kind = "";
+  const char *name = "";
+  const char *kind = "";
 
   if (TYPE_TAG_NAME (type))
     {
@@ -4553,7 +4551,7 @@ cleanup_undefined_types_1 (void)
                struct pending *ppt;
                int i;
                /* Name of the type, without "struct" or "union".  */
-               char *typename = TYPE_TAG_NAME (*type);
+               const char *typename = TYPE_TAG_NAME (*type);
 
                if (typename == NULL)
                  {
This page took 0.028086 seconds and 4 git commands to generate.