cp-tree.h (mangle_type): Remove.
authorMark Mitchell <mark@codesourcery.com>
Wed, 25 Aug 2004 16:58:23 +0000 (16:58 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Wed, 25 Aug 2004 16:58:23 +0000 (16:58 +0000)
* cp-tree.h (mangle_type): Remove.
* mangle.c (globals): GTY it.
(mangle_obstack): New variable.
(name_obstack): Likewise.
(name_base): Likewise.
(write_char): Adjust accordingly.
(write_chars): Likewise.
(write_string): Likewise.
(start_mangling): Initialize G.substitutions only one.  Add
ident_p parameter.
(finish_mangling): Use VARRAY_CLEAR to reclaim
storage in G.substitutions.  Use obstack_finish.
(init_mangle): Adjust for changes to variable names above.
Initialize G.substitutions.
(mangle_decl_string): Adjust call to start_mangling.
(get_identifier_nocopy): New function.
(mangle_decl): Use it.
(mangle_type_string): Adjust call to start_mangling.
(mangle_special_for_type): Likewise.
(mangle_vtt_for_type): Likewise.
(mangle_ctor_vtbl_for_type): Likewise.
(mangle_thunk): Likewise.
(mangle_guard_variable): Likewise.
(mangle_ref_init_variable): Likewise.

From-SVN: r86559

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/mangle.c

index 5655232343a64df6391a8795878c63fc1c999e41..4c43dce96f1df523b99de8f9a9e7c609b98620e8 100644 (file)
@@ -1,3 +1,30 @@
+2004-08-25  Mark Mitchell  <mark@codesourcery.com>
+
+       * cp-tree.h (mangle_type): Remove.
+       * mangle.c (globals): GTY it.
+       (mangle_obstack): New variable.
+       (name_obstack): Likewise.
+       (name_base): Likewise.
+       (write_char): Adjust accordingly.
+       (write_chars): Likewise.
+       (write_string): Likewise.
+       (start_mangling): Initialize G.substitutions only one.  Add
+       ident_p parameter.
+       (finish_mangling): Use VARRAY_CLEAR to reclaim
+       storage in G.substitutions.  Use obstack_finish.
+       (init_mangle): Adjust for changes to variable names above.
+       Initialize G.substitutions.
+       (mangle_decl_string): Adjust call to start_mangling.
+       (get_identifier_nocopy): New function.
+       (mangle_decl): Use it.
+       (mangle_type_string): Adjust call to start_mangling.
+       (mangle_special_for_type): Likewise.
+       (mangle_vtt_for_type): Likewise.
+       (mangle_ctor_vtbl_for_type): Likewise.
+       (mangle_thunk): Likewise.
+       (mangle_guard_variable): Likewise.
+       (mangle_ref_init_variable): Likewise.
+
 2004-08-25  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/14428
index 382075d87d44ff549f1b7b2a339f1805c0243261..d7b44485d734d30e3a5ebc9dc15c17f8a25711c5 100644 (file)
@@ -4358,7 +4358,6 @@ extern tree merge_exception_specifiers          (tree, tree);
 extern void init_mangle                         (void);
 extern void mangle_decl                         (tree);
 extern const char *mangle_type_string           (tree);
-extern tree mangle_type                         (tree);
 extern tree mangle_typeinfo_for_type            (tree);
 extern tree mangle_typeinfo_string_for_type     (tree);
 extern tree mangle_vtbl_for_type                (tree);
index bdff9778daed183849fc596ff69f056d0ccbfed4..b491fccf17efcb9ab768e2f0a6f12c0d1c1a05fd 100644 (file)
           && (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))))))
 
 /* Things we only need one of.  This module is not reentrant.  */
-static struct globals
+typedef struct globals GTY(())
 {
-  /* The name in which we're building the mangled name.  */
-  struct obstack name_obstack;
-
   /* An array of the current substitution candidates, in the order
      we've seen them.  */
   varray_type substitutions;
 
   /* The entity that is being mangled.  */
-  tree entity;
+  tree GTY ((skip)) entity;
 
   /* True if the mangling will be different in a future version of the
      ABI.  */
   bool need_abi_warning;
-} G;
+} globals;
+
+static GTY (()) globals G;
+
+/* The obstack on which we build mangled names.  */
+static struct obstack *mangle_obstack;
+
+/* The obstack on which we build mangled names that are not going to
+   be IDENTIFIER_NODEs.  */
+static struct obstack name_obstack;
+
+  /* The first object on the name_obstack; we use this to free memory
+     allocated on the name_obstack.  */
+static void *name_base;
 
 /* Indices into subst_identifiers.  These are identifiers used in
    special substitution rules.  */
@@ -206,7 +216,7 @@ static const char *mangle_decl_string (const tree);
 
 /* Control functions.  */
 
-static inline void start_mangling (const tree);
+static inline void start_mangling (const tree, bool);
 static inline const char *finish_mangling (const bool);
 static tree mangle_special_for_type (const tree, const char *);
 
@@ -217,16 +227,16 @@ static void write_java_integer_type_codes (const tree);
 /* Append a single character to the end of the mangled
    representation.  */
 #define write_char(CHAR)                                              \
-  obstack_1grow (&G.name_obstack, (CHAR))
+  obstack_1grow (mangle_obstack, (CHAR))
 
 /* Append a sized buffer to the end of the mangled representation.  */
 #define write_chars(CHAR, LEN)                                        \
-  obstack_grow (&G.name_obstack, (CHAR), (LEN))
+  obstack_grow (mangle_obstack, (CHAR), (LEN))
 
 /* Append a NUL-terminated string to the end of the mangled
    representation.  */
 #define write_string(STRING)                                          \
-  obstack_grow (&G.name_obstack, (STRING), strlen (STRING))
+  obstack_grow (mangle_obstack, (STRING), strlen (STRING))
 
 /* Nonzero if NODE1 and NODE2 are both TREE_LIST nodes and have the
    same purpose (context, which may be a type) and value (template
@@ -2401,12 +2411,18 @@ write_substitution (const int seq_id)
 /* Start mangling ENTITY.  */
 
 static inline void
-start_mangling (const tree entity)
+start_mangling (const tree entity, const bool ident_p)
 {
   G.entity = entity;
   G.need_abi_warning = false;
-  VARRAY_TREE_INIT (G.substitutions, 1, "mangling substitutions");
-  obstack_free (&G.name_obstack, obstack_base (&G.name_obstack));
+  if (!ident_p) 
+    {
+      obstack_free (&name_obstack, name_base);
+      mangle_obstack = &name_obstack;
+      name_base = obstack_alloc (&name_obstack, 0);
+    }
+  else
+    mangle_obstack = &ident_hash->stack;
 }
 
 /* Done with mangling.  Return the generated mangled name.  If WARN is
@@ -2422,12 +2438,12 @@ finish_mangling (const bool warn)
             G.entity);
 
   /* Clear all the substitutions.  */
-  G.substitutions = 0;
+  VARRAY_CLEAR (G.substitutions);
 
   /* Null-terminate the string.  */
   write_char ('\0');
 
-  return (const char *) obstack_base (&G.name_obstack);
+  return (const char *) obstack_finish (mangle_obstack);
 }
 
 /* Initialize data structures for mangling.  */
@@ -2435,7 +2451,9 @@ finish_mangling (const bool warn)
 void
 init_mangle (void)
 {
-  gcc_obstack_init (&G.name_obstack);
+  gcc_obstack_init (&name_obstack);
+  name_base = obstack_alloc (&name_obstack, 0);
+  VARRAY_TREE_INIT (G.substitutions, 1, "mangling substitutions");
 
   /* Cache these identifiers for quick comparison when checking for
      standard substitutions.  */
@@ -2454,7 +2472,7 @@ mangle_decl_string (const tree decl)
 {
   const char *result;
 
-  start_mangling (decl);
+  start_mangling (decl, /*ident_p=*/true);
 
   if (TREE_CODE (decl) == TYPE_DECL)
     write_type (TREE_TYPE (decl));
@@ -2467,14 +2485,24 @@ mangle_decl_string (const tree decl)
   return result;
 }
 
+/* Like get_identifier, except that NAME is assumed to have been
+   allocated on the obstack used by the identifier hash table.  */
+
+static inline tree
+get_identifier_nocopy (const char *name)
+{
+  hashnode ht_node = ht_lookup (ident_hash, name, 
+                               strlen (name), HT_ALLOCED);
+  return HT_IDENT_TO_GCC_IDENT (ht_node);
+}
+
 /* Create an identifier for the external mangled name of DECL.  */
 
 void
 mangle_decl (const tree decl)
 {
-  tree id = get_identifier (mangle_decl_string (decl));
-
-  SET_DECL_ASSEMBLER_NAME (decl, id);
+  SET_DECL_ASSEMBLER_NAME (decl, 
+                          get_identifier_nocopy (mangle_decl_string (decl)));
 }
 
 /* Generate the mangled representation of TYPE.  */
@@ -2484,7 +2512,7 @@ mangle_type_string (const tree type)
 {
   const char *result;
 
-  start_mangling (type);
+  start_mangling (type, /*ident_p=*/false);
   write_type (type);
   result = finish_mangling (/*warn=*/false);
   if (DEBUG_MANGLE)
@@ -2492,14 +2520,6 @@ mangle_type_string (const tree type)
   return result;
 }
 
-/* Create an identifier for the mangled representation of TYPE.  */
-
-tree
-mangle_type (const tree type)
-{
-  return get_identifier (mangle_type_string (type));
-}
-
 /* Create an identifier for the mangled name of a special component
    for belonging to TYPE.  CODE is the ABI-specified code for this
    component.  */
@@ -2511,7 +2531,7 @@ mangle_special_for_type (const tree type, const char *code)
 
   /* We don't have an actual decl here for the special component, so
      we can't just process the <encoded-name>.  Instead, fake it.  */
-  start_mangling (type);
+  start_mangling (type, /*ident_p=*/true);
 
   /* Start the mangling.  */
   write_string ("_Z");
@@ -2524,7 +2544,7 @@ mangle_special_for_type (const tree type, const char *code)
   if (DEBUG_MANGLE)
     fprintf (stderr, "mangle_special_for_type = %s\n\n", result);
 
-  return get_identifier (result);
+  return get_identifier_nocopy (result);
 }
 
 /* Create an identifier for the mangled representation of the typeinfo
@@ -2580,7 +2600,7 @@ mangle_ctor_vtbl_for_type (const tree type, const tree binfo)
 {
   const char *result;
 
-  start_mangling (type);
+  start_mangling (type, /*ident_p=*/true);
 
   write_string ("_Z");
   write_string ("TC");
@@ -2592,7 +2612,7 @@ mangle_ctor_vtbl_for_type (const tree type, const tree binfo)
   result = finish_mangling (/*warn=*/false);
   if (DEBUG_MANGLE)
     fprintf (stderr, "mangle_ctor_vtbl_for_type = %s\n\n", result);
-  return get_identifier (result);
+  return get_identifier_nocopy (result);
 }
 
 /* Mangle a this pointer or result pointer adjustment.
@@ -2637,7 +2657,7 @@ mangle_thunk (tree fn_decl, const int this_adjusting, tree fixed_offset,
 {
   const char *result;
   
-  start_mangling (fn_decl);
+  start_mangling (fn_decl, /*ident_p=*/true);
 
   write_string ("_Z");
   write_char ('T');
@@ -2671,7 +2691,7 @@ mangle_thunk (tree fn_decl, const int this_adjusting, tree fixed_offset,
   result = finish_mangling (/*warn=*/false);
   if (DEBUG_MANGLE)
     fprintf (stderr, "mangle_thunk = %s\n\n", result);
-  return get_identifier (result);
+  return get_identifier_nocopy (result);
 }
 
 /* This hash table maps TYPEs to the IDENTIFIER for a conversion
@@ -2740,7 +2760,7 @@ mangle_conv_op_name_for_type (const tree type)
 tree
 mangle_guard_variable (const tree variable)
 {
-  start_mangling (variable);
+  start_mangling (variable, /*ident_p=*/true);
   write_string ("_ZGV");
   if (strncmp (IDENTIFIER_POINTER (DECL_NAME (variable)), "_ZGR", 4) == 0)
     /* The name of a guard variable for a reference temporary should refer
@@ -2748,7 +2768,7 @@ mangle_guard_variable (const tree variable)
     write_string (IDENTIFIER_POINTER (DECL_NAME (variable)) + 4);
   else
     write_name (variable, /*ignore_local_scope=*/0);
-  return get_identifier (finish_mangling (/*warn=*/false));
+  return get_identifier_nocopy (finish_mangling (/*warn=*/false));
 }
 
 /* Return an identifier for the name of a temporary variable used to
@@ -2758,10 +2778,10 @@ mangle_guard_variable (const tree variable)
 tree
 mangle_ref_init_variable (const tree variable)
 {
-  start_mangling (variable);
+  start_mangling (variable, /*ident_p=*/true);
   write_string ("_ZGR");
   write_name (variable, /*ignore_local_scope=*/0);
-  return get_identifier (finish_mangling (/*warn=*/false));
+  return get_identifier_nocopy (finish_mangling (/*warn=*/false));
 }
 \f