[PATCH] D119542: [demangler] Reorder parseNestedName loop
Nathan Sidwell via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 11 05:00:04 PST 2022
urnathan created this revision.
urnathan added reviewers: bruno, ChuanqiXu, iains.
urnathan requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
parseNestedName's main loop allowed parsing a grammar that was more flexible than the actual grammar. This refactors that to rule out some more incorrect manglings.
1. The 'L' extension only applies to unqualified-name components, so check it just there.
2. The 'M' suffix is, AFAICT, removed from the grammar. Rather than eliminate it, let's parse it after we've parsed a component.
Added some additional bad mangling tests, which are now rejected.
I don't break the 'T' and 'D[tT]' cases out of the loop, even though they can only appear at first position, as it seems simpler to just check there is nothing SoFar.
https://reviews.llvm.org/D119542
Files:
libcxxabi/src/demangle/ItaniumDemangle.h
libcxxabi/test/test_demangle.pass.cpp
llvm/include/llvm/Demangle/ItaniumDemangle.h
Index: llvm/include/llvm/Demangle/ItaniumDemangle.h
===================================================================
--- llvm/include/llvm/Demangle/ItaniumDemangle.h
+++ llvm/include/llvm/Demangle/ItaniumDemangle.h
@@ -3108,15 +3108,6 @@
Node *SoFar = nullptr;
while (!consumeIf('E')) {
- consumeIf('L'); // extension
-
- if (consumeIf('M')) {
- // <data-member-prefix> := <member source-name> [<template-args>] M
- if (SoFar == nullptr)
- return nullptr;
- continue;
- }
-
if (State)
// Only set end-with-template on the case that does that.
State->EndsWithTemplateArgs = false;
@@ -3161,12 +3152,17 @@
return nullptr;
continue; // Do not push a new substitution.
} else {
+ consumeIf('L'); // extension
// ::= [<prefix>] <unqualified-name>
SoFar = getDerived().parseUnqualifiedName(State, SoFar);
}
if (SoFar == nullptr)
return nullptr;
Subs.push_back(SoFar);
+
+ // No longer used.
+ // <data-member-prefix> := <member source-name> [<template-args>] M
+ consumeIf('M');
}
if (SoFar == nullptr || Subs.empty())
Index: libcxxabi/test/test_demangle.pass.cpp
===================================================================
--- libcxxabi/test/test_demangle.pass.cpp
+++ libcxxabi/test/test_demangle.pass.cpp
@@ -29946,6 +29946,9 @@
"_ZN3CLSIiEIiEE",
"_ZN3CLSDtLi0EEE",
"_ZN3CLSIiEEvNS_T_Ev",
+
+ "_ZN1fIiEEvNTUt_E",
+ "_ZNDTUt_Ev",
};
const unsigned NI = sizeof(invalid_cases) / sizeof(invalid_cases[0]);
Index: libcxxabi/src/demangle/ItaniumDemangle.h
===================================================================
--- libcxxabi/src/demangle/ItaniumDemangle.h
+++ libcxxabi/src/demangle/ItaniumDemangle.h
@@ -3108,15 +3108,6 @@
Node *SoFar = nullptr;
while (!consumeIf('E')) {
- consumeIf('L'); // extension
-
- if (consumeIf('M')) {
- // <data-member-prefix> := <member source-name> [<template-args>] M
- if (SoFar == nullptr)
- return nullptr;
- continue;
- }
-
if (State)
// Only set end-with-template on the case that does that.
State->EndsWithTemplateArgs = false;
@@ -3161,12 +3152,17 @@
return nullptr;
continue; // Do not push a new substitution.
} else {
+ consumeIf('L'); // extension
// ::= [<prefix>] <unqualified-name>
SoFar = getDerived().parseUnqualifiedName(State, SoFar);
}
if (SoFar == nullptr)
return nullptr;
Subs.push_back(SoFar);
+
+ // No longer used.
+ // <data-member-prefix> := <member source-name> [<template-args>] M
+ consumeIf('M');
}
if (SoFar == nullptr || Subs.empty())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D119542.407845.patch
Type: text/x-patch
Size: 2731 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220211/5ed01021/attachment.bin>
More information about the llvm-commits
mailing list