This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: C++ demangler fix
- From: Jakub Jelinek <jakub at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org, DJ Delorie <dj at redhat dot com>, Ian Lance Taylor <ian at airs dot com>
- Date: Tue, 10 Sep 2013 17:34:00 +0200
- Subject: Re: C++ demangler fix
- Authentication-results: sourceware.org; auth=none
- References: <20130904142943 dot GA18972 at blade dot nx>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Wed, Sep 04, 2013 at 03:29:43PM +0100, Gary Benson wrote:
> I've added the result to the demangler test suite, but I know of
> no way to check the validity of the demangled symbol other than by
> inspection (and I am no expert here!) If anybody knows a way to
> check this then please let me know! Otherwise, I hope this
> not-really-checked demangled version is acceptable.
Unfortunately this patch broke GCC bootstrap.
cp-demangle.c isn't used just in libiberty, where using hashtab,
xcalloc, XNEW etc. is fine, but also in libsupc++/libstdc++, where
none of that is fine. That is why cp-demangle.c only uses e.g. realloc,
checks for allocation failures and propagates those to the caller
if they happen (see allocation_failure field). hashtab.o isn't linked
into libstdc++ nor libsupc++, and the question is if we really do want to
link all the hashtable code into libstdc++.
How many hash table entries are there typically? Is a hashtable required?
> diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
> index e4ce0b9..a084282 100644
> --- a/libiberty/ChangeLog
> +++ b/libiberty/ChangeLog
> @@ -1,3 +1,22 @@
> +2013-09-04 Gary Benson <gbenson@redhat.com>
> +
> + * cp-demangle.c: Include hashtab.h.
> + (struct d_print_info): New field saved_scopes.
> + (d_print_init): Initialize the above.
> + (d_print_free): New function.
> + (cplus_demangle_print_callback): Call the above.
> + (struct d_saved_scope): New structure.
> + (d_store_scope): New function.
> + (d_free_scope) Likewise.
> + (d_restore_scope) Likewise.
> + (d_hash_saved_scope) Likewise.
> + (d_equal_saved_scope) Likewise.
> + (d_print_comp): New variable saved_scope.
> + [DEMANGLE_COMPONENT_REFERENCE,
> + DEMANGLE_COMPONENT_RVALUE_REFERENCE]: Capture scope the first
> + time the component is traversed, and use the captured scope for
> + subsequent traversals.
Jakub