This is the mail archive of the
gdb@sourceware.org
mailing list for the GDB project.
Re: Re: cp-name-parser.y
- From: Daniel Jacobowitz <drow at false dot org>
- To: Aleksandar Ristovski <aristovski at qnx dot com>
- Cc: gdb at sourceware dot org
- Date: Mon, 3 Mar 2008 12:22:17 -0500
- Subject: Re: Re: cp-name-parser.y
- References: <20080229202918.GB7757@caradoc.them.org> <47CC2F00.4000703@qnx.com>
On Mon, Mar 03, 2008 at 12:01:52PM -0500, Aleksandar Ristovski wrote:
> Daniel Jacobowitz wrote:
>> Yes, we could take the unique string from the mangled name and call it
>> (anonymous namespace _MESS_OF_GARBAGE)::foobar, and then recognize
>> that syntax when we parse expressions.
> I think _MESS_OF_GARBAGE is already sufficient, without combining it with
> '(anonymous namespace)'. _MESS_OF_GARBAGE is used only if print demangle
> is off. For MI interface, it should (almost always?) be the case.
>
> When '(anonymous namespace)' is used, since it could be any anonymous
> namespace, it is not sufficient to uniquely identify a symbol and
> therefore we can only use this form if there is a valid frame that will
> give it a context.
>
> In either case, I see nothing wrong with the way it is printed out, I see
> the problem with parsing either of the forms: _MESS_OF_GARBAGE and
> '(anonymous namespace)'. The first can not be parsed due to '.' in it and
> the latter due to '(anonymous namespace)'.
Sorry, that's not what I meant. Any symbol is in one particular
anonymous namespace when we print it out. So we could print out
which anonymous namespace it's in.
Given this:
namespace A
{
int x;
namespace
{
int y;
}
}
using namespace A;
int foo()
{
return x + y;
}
We get these:
drow@caradoc:~% c++filt _ZN1A1xE
A::x
drow@caradoc:~% c++filt _ZN1A19_GLOBAL__N__ZN1A1xE1yE
A::(anonymous namespace)::y
That mangling is actually "A::_GLOBAL__N__ZN1A1xE::y" according to the
ABI. We could print out "A::(anonymous namespace A::x)::y".
But I see that this will not work with the latest GCC which just uses
_GLOBAL__N_1 on many platforms.
So the easiest solution may be to ignore "(anonymous namespace)::"
during symbol lookup.
A workaround you could try would be to use quoted symbol names.
Does this work?
-var-create - * "'(anonymous namespace)::foobar'"
--
Daniel Jacobowitz
CodeSourcery