[demangler] refactor SpecialSubKind

Code generating the special substitutions in std is a switch statement
with each case block containing the same conststruction template.  It
is more efficient to commonize that after the switch, having
determined which SubKind to create.  Also, let's sort the cases.

Reviewed By: ChuanqiXu

Differential Revision: https://reviews.llvm.org/D118131
This commit is contained in:
Nathan Sidwell
2022-01-24 07:59:57 -08:00
parent 52c7faeae8
commit 4e5fce5848
2 changed files with 32 additions and 38 deletions

View File

@@ -5448,37 +5448,34 @@ Node *AbstractManglingParser<Derived, Alloc>::parseSubstitution() {
return nullptr;
if (look() >= 'a' && look() <= 'z') {
Node *SpecialSub;
SpecialSubKind Kind;
switch (look()) {
case 'a':
++First;
SpecialSub = make<SpecialSubstitution>(SpecialSubKind::allocator);
Kind = SpecialSubKind::allocator;
break;
case 'b':
++First;
SpecialSub = make<SpecialSubstitution>(SpecialSubKind::basic_string);
break;
case 's':
++First;
SpecialSub = make<SpecialSubstitution>(SpecialSubKind::string);
break;
case 'i':
++First;
SpecialSub = make<SpecialSubstitution>(SpecialSubKind::istream);
break;
case 'o':
++First;
SpecialSub = make<SpecialSubstitution>(SpecialSubKind::ostream);
Kind = SpecialSubKind::basic_string;
break;
case 'd':
++First;
SpecialSub = make<SpecialSubstitution>(SpecialSubKind::iostream);
Kind = SpecialSubKind::iostream;
break;
case 'i':
Kind = SpecialSubKind::istream;
break;
case 'o':
Kind = SpecialSubKind::ostream;
break;
case 's':
Kind = SpecialSubKind::string;
break;
default:
return nullptr;
}
++First;
auto *SpecialSub = make<SpecialSubstitution>(Kind);
if (!SpecialSub)
return nullptr;
// Itanium C++ ABI 5.1.2: If a name that would use a built-in <substitution>
// has ABI tags, the tags are appended to the substitution; the result is a
// substitutable component.

View File

@@ -5450,37 +5450,34 @@ Node *AbstractManglingParser<Derived, Alloc>::parseSubstitution() {
return nullptr;
if (look() >= 'a' && look() <= 'z') {
Node *SpecialSub;
SpecialSubKind Kind;
switch (look()) {
case 'a':
++First;
SpecialSub = make<SpecialSubstitution>(SpecialSubKind::allocator);
Kind = SpecialSubKind::allocator;
break;
case 'b':
++First;
SpecialSub = make<SpecialSubstitution>(SpecialSubKind::basic_string);
break;
case 's':
++First;
SpecialSub = make<SpecialSubstitution>(SpecialSubKind::string);
break;
case 'i':
++First;
SpecialSub = make<SpecialSubstitution>(SpecialSubKind::istream);
break;
case 'o':
++First;
SpecialSub = make<SpecialSubstitution>(SpecialSubKind::ostream);
Kind = SpecialSubKind::basic_string;
break;
case 'd':
++First;
SpecialSub = make<SpecialSubstitution>(SpecialSubKind::iostream);
Kind = SpecialSubKind::iostream;
break;
case 'i':
Kind = SpecialSubKind::istream;
break;
case 'o':
Kind = SpecialSubKind::ostream;
break;
case 's':
Kind = SpecialSubKind::string;
break;
default:
return nullptr;
}
++First;
auto *SpecialSub = make<SpecialSubstitution>(Kind);
if (!SpecialSub)
return nullptr;
// Itanium C++ ABI 5.1.2: If a name that would use a built-in <substitution>
// has ABI tags, the tags are appended to the substitution; the result is a
// substitutable component.