On 11 Jun 2014, at 13:30, Kai Wang <k...@freebsd.org> wrote:

> On Tue, Jun 10, 2014 at 07:38:19AM +0100, David Chisnall wrote:
>> On 10 Jun 2014, at 03:44, Ed Maste <ema...@freebsd.org> wrote:
>> 
>>> I had the same issue in LLVM, and as hacky as it seems, the solution
>>> is to check that the name starts with "_Z" before passing it to
>>> __cxa_demangle.
>>> 
>>> For reference the LLVM review for the change is here:
>>> http://reviews.llvm.org/D2552
>>> 
>>> I didn't get around to testing it on Linux; since you have a test
>>> application ready it would be interesting to see the result of
>>> __cxa_demangle("f") there.
>> 
>> If you know that the thing that you are demangling is a symbol name, then 
>> you can use the _Z check, which isn't really a hack - it's a marker added to 
>> identify C++ symbols.  Note that, if you're writing portable code, you need 
>> to remember that some systems prepend an underscore to all 
>> compiler-generated symbols, so you may also need to check for __Z and trim 
>> the leading _.
>> 
>> The __cxa_demangle() function has to handle things that are not just symbols 
>> (types and so on) and so can't do this test itself.  Its most common use is 
>> generating a human-friendly error for an uncaught exception, where it is 
>> just parsing a type encoding.
>> 
>> The demangler that we ship is from libelftc.  It also fails on a number of 
>> C++11 types and doesn't handle some complex template cases.  
> 
> Hi David,
> 
> If possible, could you list a few examples that the demangler can not
> handle?  Maybe we can fix this in libelftc and merge it back later.

Your best reference for this is the libc++abi test suite:

http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/test_demangle.cpp?revision=208611&view=markup

New C++11 additions and template arguments that are forward references are not 
very well handled.  It would be great if there were any improvements.

It would also be good for libcxxrt if the demangler could avoid having to 
allocate any memory except on the stack, as one of the places where it's used 
is in reporting out-of-memory conditions.

David


_______________________________________________
freebsd-toolchain@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-toolchain
To unsubscribe, send any mail to "freebsd-toolchain-unsubscr...@freebsd.org"

Reply via email to