This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: analysis of libiberty/cp-demangle.c for libsupc++/__cxa_demangle


Ian Lance Taylor wrote:

Mark Mitchell <mark@codesourcery.com> writes:


Ian Lance Taylor wrote:


So by my reading, when given something like _X11TransParseAddress
which is not a valid mangled name, it is correct for __cxa_demangle()
to return NULL with status set to -2.
What other reading could there be?

The ABI implies that you can feed an 'extern "C"' name to __cxa_demangle.


For example, it says that "i" should be demangled as "i".

It's hard (for me) to see how to get that without considering "i" a
valid mangled name.

The ABI says that an ambiguity
between an extern "C" name and an internal built-in type name should
be resolved in favor of the extern "C" name.  It doesn't say what to
return for an extern "C" name.  That is, it doesn't say that
__cxa_demangle() should return "i" when passed "i".

That's a clever reading. I'm not sure it's what was intended, but then again I'm not sure that this particular interface was thought through very well at all. We stayed away from these kinds of corner cases in our ABI testsuite because it was indeed unclear what should be done.


In fact, I'm just writing the disambiguation code now in my demangler,
and my natural inclination is to write it so that when
__cxa_demangle() is passed "i", it returns NULL with *status set to
-2.

I guess that's OK. Obviously, you or Benjamin will have to update the V3 testsuite. Perhaps you could submit a patch that includes both the fixes for the demangler, Benjmain's tweakage of V3 to use your demangler, and patches to the V3 testsuite so that all the tests still pass?


--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]