[PATCH][C++][RFH] Improve PR29433, cut down memory usage and compile-time

Richard Guenther rguenther@suse.de
Wed Nov 22 17:29:00 GMT 2006


On Wed, 22 Nov 2006, Richard Guenther wrote:

> any idea why this goes wrong?  One thing is that we don't seem to get
> complete types at the point of calling classtype_mangled_name, which
> is why even returning a string from TYPE_UID works for the c++ testsuite.
> Still there seem to be some invariants classtype_mangled_name needs to
> guarantee - which are unfortunately not documented and somewhat hard to
> dig out.

Just to clarify what I mean with TYPE_UID.  If you replace the 
classtype_mangled_name hunk with

*************** classtype_mangled_name (tree t)
*** 4354,4365 ****
         implicit from their surrounding context.  */
        if (PRIMARY_TEMPLATE_P (tmpl))
        {
!         tree name = DECL_NAME (tmpl);
!         char *mangled_name = mangle_class_name_for_template
!           (IDENTIFIER_POINTER (name),
!            DECL_INNERMOST_TEMPLATE_PARMS (tmpl),
!            CLASSTYPE_TI_ARGS (t));
!         tree id = get_identifier (mangled_name);
          IDENTIFIER_TEMPLATE (id) = name;
          return id;
        }
--- 4263,4274 ----
         implicit from their surrounding context.  */
        if (PRIMARY_TEMPLATE_P (tmpl))
        {
!         tree id, name = DECL_NAME (tmpl);
!         char tmp[16];
!         const char *mangled_name;
!         sprintf (tmp, "%i",  TYPE_UID (t));
!         mangled_name = xstrdup (tmp);
!         id = get_identifier (mangled_name);
          IDENTIFIER_TEMPLATE (id) = name;
          return id;
        }


then you get a few PCH failures but else bootstrap & testing is fine
(and you get even a little more memory savings).  Of course this hints
at whoever was using DECL_NAME to do something can use TYPE_UID and
we can simply leave DECL_NAME alone in the above case.

Richard.



More information about the Gcc-patches mailing list