From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17864 invoked by alias); 29 Oct 2009 05:07:07 -0000 Received: (qmail 17844 invoked by uid 22791); 29 Oct 2009 05:07:04 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from mta4.srv.hcvlny.cv.net (HELO mta4.srv.hcvlny.cv.net) (167.206.4.199) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 29 Oct 2009 05:06:58 +0000 Received: from [192.168.1.10] (ool-44c60ac6.dyn.optonline.net [68.198.10.198]) by mta4.srv.hcvlny.cv.net (Sun Java System Messaging Server 6.2-8.04 (built Feb 28 2007)) with ESMTP id <0KS900IO8FJJHQX0@mta4.srv.hcvlny.cv.net>; Thu, 29 Oct 2009 01:06:56 -0400 (EDT) Date: Thu, 29 Oct 2009 05:35:00 -0000 From: Jerry Quinn Subject: Re: enable-build-with-cxx bootstrap compare broken by r149964 In-reply-to: <4AE864AD.30400@redhat.com> To: Jason Merrill Cc: Jakub Jelinek , GCC , "gcc-patches@gcc.gnu.org" Message-id: <1256792815.31256.1472.camel@cerberus.qb5.org> MIME-version: 1.0 Content-type: text/plain; charset=UTF-8 Content-transfer-encoding: 7BIT References: <1250345548.19163.155.camel@cerberus.qb5.org> <4A960A78.8040704@redhat.com> <1251694626.7629.2.camel@cerberus.qb5.org> <4AAE6745.3070706@redhat.com> <4AB7B28E.7030501@redhat.com> <1253617474.4274.2795.camel@cerberus.qb5.org> <4AB8D3D1.8010704@redhat.com> <1253712164.4274.2800.camel@cerberus.qb5.org> <4ABA391C.2050903@redhat.com> <1256357452.31533.131.camel@cerberus.qb5.org> <20091026111448.GZ14664@tyan-ft48-01.lab.bos.redhat.com> <4AE5A9F4.30703@redhat.com> <1256729385.31256.445.camel@cerberus.qb5.org> <4AE864AD.30400@redhat.com> Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2009-10/txt/msg01718.txt.bz2 On Wed, 2009-10-28 at 11:35 -0400, Jason Merrill wrote: > On 10/28/2009 07:29 AM, Jerry Quinn wrote: > > + length = strlen (name); > > + if (mark_private) > > + name_string = build_string (length + 1, buf); > > + else > > + name_string = build_string (length + 1, name); > > These two calls shouldn't be using the same length. I think the +1 in > the old code was unnecessary, so you can just remove it from the second > call. And here is the latest patch. Index: gcc/cp/rtti.c =================================================================== --- gcc/cp/rtti.c (revision 153489) +++ gcc/cp/rtti.c (working copy) @@ -102,7 +102,7 @@ static GTY (()) VEC(tinfo_s,gc) *tinfo_descs; static tree ifnonnull (tree, tree); -static tree tinfo_name (tree); +static tree tinfo_name (tree, bool); static tree build_dynamic_cast_1 (tree, tree, tsubst_flags_t); static tree throw_bad_cast (void); static tree throw_bad_typeid (void); @@ -349,16 +349,30 @@ return exp; } -/* Generate the NTBS name of a type. */ +/* Generate the NTBS name of a type. If MARK_PRIVATE, put a '*' in front so that + comparisons will be done by pointer rather than string comparison. */ static tree -tinfo_name (tree type) +tinfo_name (tree type, bool mark_private) { const char *name; + int length; tree name_string; - name = mangle_type_string_for_rtti (type); - name_string = fix_string_type (build_string (strlen (name) + 1, name)); - return name_string; + name = mangle_type_string (type); + length = strlen (name); + + if (mark_private) + { + /* Inject '*' at beginning of name to force pointer comparison. */ + char* buf = (char*) XALLOCAVEC (char, length + 1); + buf[0] = '*'; + memcpy (buf + 1, name, length); + name_string = build_string (length + 1, buf); + } + else + name_string = build_string (length, name); + + return fix_string_type (name_string); } /* Return a VAR_DECL for the internal ABI defined type_info object for @@ -839,13 +853,12 @@ tree vtable_ptr; { - tree name_name; + tree name_name, name_string; /* Generate the NTBS array variable. */ tree name_type = build_cplus_array_type (build_qualified_type (char_type_node, TYPE_QUAL_CONST), NULL_TREE); - tree name_string = tinfo_name (target); /* Determine the name of the variable -- and remember with which type it is associated. */ @@ -862,6 +875,7 @@ DECL_TINFO_P (name_decl) = 1; set_linkage_according_to_type (target, name_decl); import_export_decl (name_decl); + name_string = tinfo_name (target, !TREE_PUBLIC (name_decl)); DECL_INITIAL (name_decl) = name_string; mark_used (name_decl); pushdecl_top_level_and_finish (name_decl, name_string); Index: gcc/cp/ChangeLog =================================================================== --- gcc/cp/ChangeLog (revision 153489) +++ gcc/cp/ChangeLog (working copy) @@ -1,3 +1,15 @@ +2009-10-28 Jerry Quinn + + * mangle.c (mangle_type_string_for_rtti): Revert r149964. + (needs_fake_anon): Likewise. + (write_name): Likewise. + (write_nested_name): Likewise. + * cp-tree.h (mangle_type_string_for_rtti): Likewise. + (get_anonymous_namespace): Likewise. + * name-lookup.c (get_anonymous_namespace_name): Likewise. + * rtti.c (tinfo_name): Insert '*' in front of private names. + (tinfo_base_init): Use it. + 2009-10-21 Jakub Jelinek * mangle.c (finish_mangling_get_identifier): Use Index: gcc/cp/mangle.c =================================================================== --- gcc/cp/mangle.c (revision 153489) +++ gcc/cp/mangle.c (working copy) @@ -105,10 +105,6 @@ static GTY (()) globals G; -/* Whether or not to pretend that a static function is in an anonymous - namespace. */ -static bool fake_anon_scope; - /* The obstack on which we build mangled names. */ static struct obstack *mangle_obstack; @@ -734,20 +730,6 @@ } } -/* Since we now use strcmp to compare typeinfos on all targets because of - the RTLD_LOCAL problem, we need to munge the typeinfo name used for - local classes of static functions to fix g++.dg/abi/local1.C. We do - that by pretending that the function is in an anonymous namespace. */ - -static bool -needs_fake_anon (const_tree decl) -{ - /* Pretend there's an anonymous namespace right around a static - function if we're mangling for RTTI. */ - return (fake_anon_scope && !TREE_PUBLIC (decl) - && TREE_CODE (decl) == FUNCTION_DECL); -} - /* Lambdas can have a bit more context for mangling, specifically VAR_DECL or PARM_DECL context, which doesn't belong in DECL_CONTEXT. */ @@ -791,18 +773,13 @@ context = decl_mangling_context (decl); - gcc_assert (context != NULL_TREE); - - /* If we need a fake anonymous namespace, force the nested name path. */ - if (needs_fake_anon (decl) && context == global_namespace) - context = error_mark_node; - /* A decl in :: or ::std scope is treated specially. The former is mangled using or , the latter with a special substitution. Also, a name that is directly in a local function scope is also mangled with rather than a full . */ - if (context == global_namespace + if (context == NULL + || context == global_namespace || DECL_NAMESPACE_STD_P (context) || (ignore_local_scope && TREE_CODE (context) == FUNCTION_DECL)) { @@ -820,9 +797,6 @@ } else { - if (context == error_mark_node) - context = global_namespace; - /* Handle local names, unless we asked not to (that is, invoked under , to handle only the part of the name under the local scope). */ @@ -835,10 +809,10 @@ directly in that function's scope, either decl or one of its enclosing scopes. */ tree local_entity = decl; - while (context != global_namespace) + while (context != NULL && context != global_namespace) { /* Make sure we're always dealing with decls. */ - if (TYPE_P (context)) + if (context != NULL && TYPE_P (context)) context = TYPE_NAME (context); /* Is this a function? */ if (TREE_CODE (context) == FUNCTION_DECL @@ -883,6 +857,7 @@ /* If not, it should be either in the global namespace, or directly in a local function scope. */ gcc_assert (context == global_namespace + || context != NULL || TREE_CODE (context) == FUNCTION_DECL); write_unqualified_name (decl); @@ -954,9 +929,6 @@ { /* No, just use */ write_prefix (DECL_CONTEXT (decl)); - if (needs_fake_anon (decl)) - /* Pretend this static function is in an anonymous namespace. */ - write_source_name (get_anonymous_namespace_name ()); write_unqualified_name (decl); } write_char ('E'); @@ -3011,18 +2983,15 @@ SET_DECL_ASSEMBLER_NAME (decl, id); } -/* Generate the mangled representation of TYPE for the typeinfo name. */ +/* Generate the mangled representation of TYPE. */ const char * -mangle_type_string_for_rtti (const tree type) +mangle_type_string (const tree type) { const char *result; start_mangling (type); - /* Mangle in a fake anonymous namespace if necessary. */ - fake_anon_scope = true; write_type (type); - fake_anon_scope = false; result = finish_mangling (/*warn=*/false); if (DEBUG_MANGLE) fprintf (stderr, "mangle_type_string = '%s'\n\n", result); Index: gcc/cp/cp-tree.h =================================================================== --- gcc/cp/cp-tree.h (revision 153489) +++ gcc/cp/cp-tree.h (working copy) @@ -4507,7 +4507,6 @@ extern tree perform_qualification_conversions (tree, tree); /* in name-lookup.c */ -extern tree get_anonymous_namespace_name (void); extern tree pushdecl (tree); extern tree pushdecl_maybe_friend (tree, bool); extern void maybe_push_cleanup_level (tree); @@ -5288,7 +5287,7 @@ /* in mangle.c */ extern void init_mangle (void); extern void mangle_decl (tree); -extern const char *mangle_type_string_for_rtti (tree); +extern const char *mangle_type_string (tree); extern tree mangle_typeinfo_for_type (tree); extern tree mangle_typeinfo_string_for_type (tree); extern tree mangle_vtbl_for_type (tree); Index: gcc/cp/name-lookup.c =================================================================== --- gcc/cp/name-lookup.c (revision 153489) +++ gcc/cp/name-lookup.c (working copy) @@ -62,14 +62,19 @@ /* Initialize anonymous_namespace_name if necessary, and return it. */ -tree +static tree get_anonymous_namespace_name (void) { if (!anonymous_namespace_name) { /* The anonymous namespace has to have a unique name if typeinfo objects are being compared by name. */ - anonymous_namespace_name = get_file_function_name ("N"); + if (! flag_weak || ! SUPPORTS_ONE_ONLY) + anonymous_namespace_name = get_file_function_name ("N"); + else + /* The demangler expects anonymous namespaces to be called + something starting with '_GLOBAL__N_'. */ + anonymous_namespace_name = get_identifier ("_GLOBAL__N_1"); } return anonymous_namespace_name; } Index: libstdc++-v3/libsupc++/tinfo2.cc =================================================================== --- libstdc++-v3/libsupc++/tinfo2.cc (revision 153489) +++ libstdc++-v3/libsupc++/tinfo2.cc (working copy) @@ -37,7 +37,8 @@ #if __GXX_MERGED_TYPEINFO_NAMES return name () < arg.name (); #else - return __builtin_strcmp (name (), arg.name ()) < 0; + return (name ()[0] == '*') ? name () < arg.name () + : __builtin_strcmp (name (), arg.name ()) < 0; #endif } Index: libstdc++-v3/libsupc++/typeinfo =================================================================== --- libstdc++-v3/libsupc++/typeinfo (revision 153489) +++ libstdc++-v3/libsupc++/typeinfo (working copy) @@ -94,7 +94,7 @@ /** Returns an @e implementation-defined byte string; this is not * portable between compilers! */ const char* name() const - { return __name; } + { return __name[0] == '*' ? __name + 1 : __name; } #if !__GXX_TYPEINFO_EQUALITY_INLINE // In old abi, or when weak symbols are not supported, there can @@ -110,12 +110,15 @@ // we can run into cases where type_info names aren't merged, // so we still need to do string comparison. bool before(const type_info& __arg) const - { return __builtin_strcmp (__name, __arg.__name) < 0; } + { return (__name[0] == '*' && __arg.__name[0] == '*') + ? __name < __arg.__name + : __builtin_strcmp (__name, __arg.__name) < 0; } bool operator==(const type_info& __arg) const { return ((__name == __arg.__name) - || __builtin_strcmp (__name, __arg.__name) == 0); + || (__name[0] != '*' && + __builtin_strcmp (__name, __arg.__name) == 0)); } #else // On some targets we can rely on type_info's NTBS being unique, Index: libstdc++-v3/libsupc++/tinfo.cc =================================================================== --- libstdc++-v3/libsupc++/tinfo.cc (revision 153489) +++ libstdc++-v3/libsupc++/tinfo.cc (working copy) @@ -41,7 +41,8 @@ #if __GXX_MERGED_TYPEINFO_NAMES return name () == arg.name (); #else - return (&arg == this) || (__builtin_strcmp (name (), arg.name ()) == 0); + return (&arg == this) + || (name ()[0] != '*' && (__builtin_strcmp (name (), arg.name ()) == 0)); #endif } Index: libstdc++-v3/ChangeLog =================================================================== --- libstdc++-v3/ChangeLog (revision 153489) +++ libstdc++-v3/ChangeLog (working copy) @@ -1,3 +1,10 @@ +2009-10-28 Jerry Quinn + + * libsupc++/tinfo.cc (operator=(const type_info&)): Compare by + pointer if name begins with '*'. + * libsupc++/typeinfo (type_info::name()): Likewise. + * libsupc++/tinfo2.cc (before): Likewise. + 009-10-20 Paolo Carlini PR libstdc++/41773