[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:
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user