From cba68bb93b102416843d364348bc29ca665da1ce Mon Sep 17 00:00:00 2001 From: Chris Mihelich Date: Wed, 5 Jun 2024 07:21:37 -0700 Subject: Demangle modern _ZGR..._ symbols. PiperOrigin-RevId: 640517212 Change-Id: Ideaaf45d2104a3c82cc9b6807894554335e5b904 --- absl/debugging/internal/demangle.cc | 19 ++++++++++++++++--- absl/debugging/internal/demangle_test.cc | 20 ++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) (limited to 'absl/debugging') diff --git a/absl/debugging/internal/demangle.cc b/absl/debugging/internal/demangle.cc index 7ce14713..ab611f71 100644 --- a/absl/debugging/internal/demangle.cc +++ b/absl/debugging/internal/demangle.cc @@ -1080,12 +1080,13 @@ static bool ParseOperatorName(State *state, int *arity) { // ::= TH # thread-local initialization // ::= Tc <(base) encoding> // ::= GV <(object) name> +// ::= GR <(object) name> [] _ // ::= T <(base) encoding> // G++ extensions: // ::= TC <(offset) number> _ <(base) type> // ::= TF // ::= TJ -// ::= GR +// ::= GR # without final _, perhaps an earlier form? // ::= GA // ::= Th <(base) encoding> // ::= Tv <(base) encoding> @@ -1152,10 +1153,22 @@ static bool ParseSpecialName(State *state) { } state->parse_state = copy; - if (ParseTwoCharToken(state, "GR") && ParseName(state)) { + // ::= GR <(object) name> [] _ # modern standard + // ::= GR <(object) name> # also recognized + if (ParseTwoCharToken(state, "GR")) { + MaybeAppend(state, "reference temporary for "); + if (!ParseName(state)) { + state->parse_state = copy; + return false; + } + const bool has_seq_id = ParseSeqId(state); + const bool has_underscore = ParseOneCharToken(state, '_'); + if (has_seq_id && !has_underscore) { + state->parse_state = copy; + return false; + } return true; } - state->parse_state = copy; if (ParseTwoCharToken(state, "GA") && ParseEncoding(state)) { return true; diff --git a/absl/debugging/internal/demangle_test.cc b/absl/debugging/internal/demangle_test.cc index 052c66bb..c70cf660 100644 --- a/absl/debugging/internal/demangle_test.cc +++ b/absl/debugging/internal/demangle_test.cc @@ -612,6 +612,26 @@ TEST(Demangle, StringLiterals) { EXPECT_STREQ("f<>()", tmp); } +TEST(Demangle, GlobalInitializers) { + char tmp[80]; + + // old form without suffix + EXPECT_TRUE(Demangle("_ZGR1v", tmp, sizeof(tmp))); + EXPECT_STREQ("reference temporary for v", tmp); + + // modern form for the whole initializer + EXPECT_TRUE(Demangle("_ZGR1v_", tmp, sizeof(tmp))); + EXPECT_STREQ("reference temporary for v", tmp); + + // next subobject in depth-first preorder traversal + EXPECT_TRUE(Demangle("_ZGR1v0_", tmp, sizeof(tmp))); + EXPECT_STREQ("reference temporary for v", tmp); + + // subobject with a larger seq-id + EXPECT_TRUE(Demangle("_ZGR1v1Z_", tmp, sizeof(tmp))); + EXPECT_STREQ("reference temporary for v", tmp); +} + // Test the GNU abi_tag extension. TEST(Demangle, AbiTags) { char tmp[80]; -- cgit v1.2.3