Use allocated cplus_specific for cplus symbols.
authorSami Wagiaalla <swagiaal@redhat.com>
Fri, 16 Jul 2010 19:23:56 +0000 (19:23 +0000)
committerSami Wagiaalla <swagiaal@redhat.com>
Fri, 16 Jul 2010 19:23:56 +0000 (19:23 +0000)
2010-07-16  Sami Wagiaalla  <swagiaal@redhat.com>

* symtab.h (symbol_set_demangled_name): Now takes an optional objfile*
argument.
(cplus_specific): New struct.
* symtab.c (symbol_set_demangled_name): Updated.
Use cplus_specific for cplus symbols.
(symbol_get_demangled_name): Retrive the name from the cplus_specific
struct for cplus symbols.
(symbol_init_language_specific): Set cplus_specific for cplus symbols.
(symbol_set_names): Pass objfile to symbol_set_demangled_name.
* symtab.c (symbol_init_cplus_specific): New function.

gdb/ChangeLog
gdb/dwarf2read.c
gdb/symtab.c
gdb/symtab.h

index 69d2288..243f654 100644 (file)
@@ -1,5 +1,18 @@
 2010-07-16  Sami Wagiaalla  <swagiaal@redhat.com>
 
+       * symtab.h (symbol_set_demangled_name): Now takes an optional objfile*
+       argument.
+       (cplus_specific): New struct.
+       * symtab.c (symbol_set_demangled_name): Updated.
+       Use cplus_specific for cplus symbols.
+       (symbol_get_demangled_name): Retrive the name from the cplus_specific
+       struct for cplus symbols.
+       (symbol_init_language_specific): Set cplus_specific for cplus symbols.
+       (symbol_set_names): Pass objfile to symbol_set_demangled_name.
+       * symtab.c (symbol_init_cplus_specific): New function.
+
+2010-07-16  Sami Wagiaalla  <swagiaal@redhat.com>
+
        * symtab.h (symbol_set_demangled_name): New function.
        (symbol_get_demangled_name): New function.
        * symtab.c (symbol_set_demangled_name): New function.
index 234c5cc..288d777 100644 (file)
@@ -9744,7 +9744,9 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
         between gfortran, iFort etc.  */
       if (cu->language == language_fortran
           && symbol_get_demangled_name (&(sym->ginfo)) == NULL)
-       symbol_set_demangled_name (&(sym->ginfo), (char *) dwarf2_full_name (name, die, cu));
+       symbol_set_demangled_name (&(sym->ginfo),
+                                  (char *) dwarf2_full_name (name, die, cu),
+                                  NULL);
 
       /* Default assumptions.
          Use the passed type or decode it from the die.  */
index 8701d1f..b0e7061 100644 (file)
@@ -340,20 +340,53 @@ gdb_mangle_name (struct type *type, int method_id, int signature_id)
   return (mangled_name);
 }
 
+/* Initialize the cplus_specific structure.  'cplus_specific' should
+   only be allocated for use with cplus symbols.  */
+
+static void
+symbol_init_cplus_specific (struct general_symbol_info *gsymbol,
+                           struct objfile *objfile)
+{
+  /* A language_specific structure should not have been previously
+     initialized.  */
+  gdb_assert (gsymbol->language_specific.cplus_specific == NULL);
+  gdb_assert (objfile != NULL);
+
+  gsymbol->language_specific.cplus_specific =
+      OBSTACK_ZALLOC (&objfile->objfile_obstack, struct cplus_specific);
+}
+
 /* Set the demangled name of GSYMBOL to NAME.  NAME must be already
-   correctly allocated.  */
+   correctly allocated.  For C++ symbols a cplus_specific struct is
+   allocated so OBJFILE must not be NULL. If this is a non C++ symbol
+   OBJFILE can be NULL.  */
 void
 symbol_set_demangled_name (struct general_symbol_info *gsymbol,
-                           char *name)
+                           char *name,
+                           struct objfile *objfile)
 {
-  gsymbol->language_specific.mangled_lang.demangled_name = name;
+  if (gsymbol->language == language_cplus)
+    {
+      if (gsymbol->language_specific.cplus_specific == NULL)
+       symbol_init_cplus_specific (gsymbol, objfile);
+
+      gsymbol->language_specific.cplus_specific->demangled_name = name;
+    }
+  else
+    gsymbol->language_specific.mangled_lang.demangled_name = name;
 }
 
 /* Return the demangled name of GSYMBOL.  */
 char *
 symbol_get_demangled_name (const struct general_symbol_info *gsymbol)
 {
-  return gsymbol->language_specific.mangled_lang.demangled_name;
+  if (gsymbol->language == language_cplus)
+    {
+      gdb_assert (gsymbol->language_specific.cplus_specific != NULL);
+      return gsymbol->language_specific.cplus_specific->demangled_name;
+    }
+  else
+    return gsymbol->language_specific.mangled_lang.demangled_name;
 }
 
 \f
@@ -363,6 +396,7 @@ void
 symbol_init_language_specific (struct general_symbol_info *gsymbol,
                               enum language language)
 {
+
   gsymbol->language = language;
   if (gsymbol->language == language_cplus
       || gsymbol->language == language_d
@@ -370,8 +404,10 @@ symbol_init_language_specific (struct general_symbol_info *gsymbol,
       || gsymbol->language == language_objc
       || gsymbol->language == language_fortran)
     {
-      symbol_set_demangled_name (gsymbol, NULL);
+      symbol_set_demangled_name (gsymbol, NULL, NULL);
     }
+  else if (gsymbol->language == language_cplus)
+    gsymbol->language_specific.cplus_specific = NULL;
   else
     {
       memset (&gsymbol->language_specific, 0,
@@ -553,7 +589,7 @@ symbol_set_names (struct general_symbol_info *gsymbol,
          memcpy (gsymbol->name, linkage_name, len);
          gsymbol->name[len] = '\0';
        }
-      symbol_set_demangled_name (gsymbol, NULL);
+      symbol_set_demangled_name (gsymbol, NULL, NULL);
 
       return;
     }
@@ -649,9 +685,9 @@ symbol_set_names (struct general_symbol_info *gsymbol,
 
   gsymbol->name = (*slot)->mangled + lookup_len - len;
   if ((*slot)->demangled[0] != '\0')
-    symbol_set_demangled_name (gsymbol, (*slot)->demangled);
+    symbol_set_demangled_name (gsymbol, (*slot)->demangled, objfile);
   else
-    symbol_set_demangled_name (gsymbol, NULL);
+    symbol_set_demangled_name (gsymbol, NULL, objfile);
 }
 
 /* Return the source code name of a symbol.  In languages where
index 7f18fb3..4be0bd5 100644 (file)
@@ -75,7 +75,12 @@ struct program_space;
 
    --chastain 2003-08-21  */
 
+/* Struct for storing C++ specific information.  Allocated when needed.  */
 
+struct cplus_specific
+{
+  char *demangled_name;
+};
 
 /* Define a structure for the information that is common to all symbol types,
    including minimal symbols, partial symbols, and full symbols.  In a
@@ -120,7 +125,7 @@ struct general_symbol_info
   value;
 
   /* Since one and only one language can apply, wrap the language specific
-     information inside a union. */
+     information inside a union.  */
 
   union
   {
@@ -131,6 +136,8 @@ struct general_symbol_info
       char *demangled_name;
     }
     mangled_lang;
+
+    struct cplus_specific *cplus_specific;
   }
   language_specific;
 
@@ -154,7 +161,8 @@ struct general_symbol_info
   struct obj_section *obj_section;
 };
 
-extern void symbol_set_demangled_name (struct general_symbol_info *, char *);
+extern void symbol_set_demangled_name (struct general_symbol_info *, char *,
+                                       struct objfile *);
 
 extern char *symbol_get_demangled_name (const struct general_symbol_info *);