Add demangle support for ABI tags. (#416)
Support ABI tags after <local-source-name> in demangle.cc. Update the reference URL. Fixes #50
This commit is contained in:
parent
7fcb278d1e
commit
5d46e1bcfc
@ -30,7 +30,7 @@
|
|||||||
// Author: Satoru Takabayashi
|
// Author: Satoru Takabayashi
|
||||||
//
|
//
|
||||||
// For reference check out:
|
// For reference check out:
|
||||||
// http://www.codesourcery.com/public/cxx-abi/abi.html#mangling
|
// http://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling
|
||||||
//
|
//
|
||||||
// Note that we only have partial C++0x support yet.
|
// Note that we only have partial C++0x support yet.
|
||||||
|
|
||||||
@ -423,6 +423,8 @@ static bool ParseNumber(State *state, int *number_out);
|
|||||||
static bool ParseFloatNumber(State *state);
|
static bool ParseFloatNumber(State *state);
|
||||||
static bool ParseSeqId(State *state);
|
static bool ParseSeqId(State *state);
|
||||||
static bool ParseIdentifier(State *state, int length);
|
static bool ParseIdentifier(State *state, int length);
|
||||||
|
static bool ParseAbiTags(State *state);
|
||||||
|
static bool ParseAbiTag(State *state);
|
||||||
static bool ParseOperatorName(State *state);
|
static bool ParseOperatorName(State *state);
|
||||||
static bool ParseSpecialName(State *state);
|
static bool ParseSpecialName(State *state);
|
||||||
static bool ParseCallOffset(State *state);
|
static bool ParseCallOffset(State *state);
|
||||||
@ -594,13 +596,13 @@ static bool ParsePrefix(State *state) {
|
|||||||
|
|
||||||
// <unqualified-name> ::= <operator-name>
|
// <unqualified-name> ::= <operator-name>
|
||||||
// ::= <ctor-dtor-name>
|
// ::= <ctor-dtor-name>
|
||||||
// ::= <source-name>
|
// ::= <source-name> [<abi-tags>]
|
||||||
// ::= <local-source-name>
|
// ::= <local-source-name> [<abi-tags>]
|
||||||
static bool ParseUnqualifiedName(State *state) {
|
static bool ParseUnqualifiedName(State *state) {
|
||||||
return (ParseOperatorName(state) ||
|
return (ParseOperatorName(state) ||
|
||||||
ParseCtorDtorName(state) ||
|
ParseCtorDtorName(state) ||
|
||||||
ParseSourceName(state) ||
|
(ParseSourceName(state) && Optional(ParseAbiTags(state))) ||
|
||||||
ParseLocalSourceName(state));
|
(ParseLocalSourceName(state) && Optional(ParseAbiTags(state))));
|
||||||
}
|
}
|
||||||
|
|
||||||
// <source-name> ::= <positive length number> <identifier>
|
// <source-name> ::= <positive length number> <identifier>
|
||||||
@ -703,6 +705,23 @@ static bool ParseIdentifier(State *state, int length) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// <abi-tags> ::= <abi-tag> [<abi-tags>]
|
||||||
|
static bool ParseAbiTags(State *state) {
|
||||||
|
State copy = *state;
|
||||||
|
DisableAppend(state);
|
||||||
|
if (OneOrMore(ParseAbiTag, state)) {
|
||||||
|
RestoreAppend(state, copy.append);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*state = copy;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <abi-tag> ::= B <source-name>
|
||||||
|
static bool ParseAbiTag(State *state) {
|
||||||
|
return ParseOneCharToken(state, 'B') && ParseSourceName(state);
|
||||||
|
}
|
||||||
|
|
||||||
// <operator-name> ::= nw, and other two letters cases
|
// <operator-name> ::= nw, and other two letters cases
|
||||||
// ::= cv <type> # (cast)
|
// ::= cv <type> # (cast)
|
||||||
// ::= v <digit> <source-name> # vendor extended operator
|
// ::= v <digit> <source-name> # vendor extended operator
|
||||||
|
|||||||
@ -43,6 +43,10 @@ _ZNcvT_IiEEv operator ?<>()
|
|||||||
# "<< <" case.
|
# "<< <" case.
|
||||||
_ZlsI3fooE operator<< <>
|
_ZlsI3fooE operator<< <>
|
||||||
|
|
||||||
|
# ABI tags.
|
||||||
|
_Z1AB3barB3foo A
|
||||||
|
_ZN3fooL3barB5cxx11E foo::bar
|
||||||
|
|
||||||
# Random things we found interesting.
|
# Random things we found interesting.
|
||||||
_ZN3FooISt6vectorISsSaISsEEEclEv Foo<>::operator()()
|
_ZN3FooISt6vectorISsSaISsEEEclEv Foo<>::operator()()
|
||||||
_ZTI9Callback1IiE Callback1<>
|
_ZTI9Callback1IiE Callback1<>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user