diff options
author | Chris Mihelich <cmihelic@google.com> | 2024-05-23 08:54:46 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2024-05-23 08:55:58 -0700 |
commit | 88c1f181e2b60463b127ec554689f1450f6c142d (patch) | |
tree | bbb7b6e292d1d9a075d599b6a37604b7f594e8ac /absl/debugging/internal/demangle.cc | |
parent | 414929371ba51c475d0512e0354d911bf1d00598 (diff) | |
download | abseil-88c1f181e2b60463b127ec554689f1450f6c142d.tar.gz abseil-88c1f181e2b60463b127ec554689f1450f6c142d.tar.bz2 abseil-88c1f181e2b60463b127ec554689f1450f6c142d.zip |
Demangle C++ so ... E encodings (typically array-to-pointer decay).
PiperOrigin-RevId: 636566755
Change-Id: I2c8c1f19a67a7a487dd2bbb46c17f9fb4e2b037c
Diffstat (limited to 'absl/debugging/internal/demangle.cc')
-rw-r--r-- | absl/debugging/internal/demangle.cc | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/absl/debugging/internal/demangle.cc b/absl/debugging/internal/demangle.cc index 71d4eb0a..d53a04e0 100644 --- a/absl/debugging/internal/demangle.cc +++ b/absl/debugging/internal/demangle.cc @@ -578,6 +578,7 @@ static bool ParseTemplateArgs(State *state); static bool ParseTemplateArg(State *state); static bool ParseBaseUnresolvedName(State *state); static bool ParseUnresolvedName(State *state); +static bool ParseUnionSelector(State* state); static bool ParseExpression(State *state); static bool ParseExprPrimary(State *state); static bool ParseExprCastValue(State *state); @@ -1743,11 +1744,19 @@ static bool ParseUnresolvedName(State *state) { return false; } +// <union-selector> ::= _ [<number>] +// +// https://github.com/itanium-cxx-abi/cxx-abi/issues/47 +static bool ParseUnionSelector(State *state) { + return ParseOneCharToken(state, '_') && Optional(ParseNumber(state, nullptr)); +} + // <expression> ::= <1-ary operator-name> <expression> // ::= <2-ary operator-name> <expression> <expression> // ::= <3-ary operator-name> <expression> <expression> <expression> // ::= cl <expression>+ E // ::= cp <simple-id> <expression>* E # Clang-specific. +// ::= so <type> <expression> [<number>] <union-selector>* [p] E // ::= cv <type> <expression> # type (expression) // ::= cv <type> _ <expression>* E # type (expr-list) // ::= st <type> @@ -1787,6 +1796,18 @@ static bool ParseExpression(State *state) { } state->parse_state = copy; + // <expression> ::= so <type> <expression> [<number>] <union-selector>* [p] E + // + // https://github.com/itanium-cxx-abi/cxx-abi/issues/47 + if (ParseTwoCharToken(state, "so") && ParseType(state) && + ParseExpression(state) && Optional(ParseNumber(state, nullptr)) && + ZeroOrMore(ParseUnionSelector, state) && + Optional(ParseOneCharToken(state, 'p')) && + ParseOneCharToken(state, 'E')) { + return true; + } + state->parse_state = copy; + // Function-param expression (level 0). if (ParseTwoCharToken(state, "fp") && Optional(ParseCVQualifiers(state)) && Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { |