From 4e5fce58485cc69ee69da10e26a338ceeef280a0 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Mon, 24 Jan 2022 07:59:57 -0800 Subject: [PATCH] [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 --- libcxxabi/src/demangle/ItaniumDemangle.h | 35 +++++++++----------- llvm/include/llvm/Demangle/ItaniumDemangle.h | 35 +++++++++----------- 2 files changed, 32 insertions(+), 38 deletions(-) diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h index 45bb741f5629..98489e4dc802 100644 --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/src/demangle/ItaniumDemangle.h @@ -5448,37 +5448,34 @@ Node *AbstractManglingParser::parseSubstitution() { return nullptr; if (look() >= 'a' && look() <= 'z') { - Node *SpecialSub; + SpecialSubKind Kind; switch (look()) { case 'a': - ++First; - SpecialSub = make(SpecialSubKind::allocator); + Kind = SpecialSubKind::allocator; break; case 'b': - ++First; - SpecialSub = make(SpecialSubKind::basic_string); - break; - case 's': - ++First; - SpecialSub = make(SpecialSubKind::string); - break; - case 'i': - ++First; - SpecialSub = make(SpecialSubKind::istream); - break; - case 'o': - ++First; - SpecialSub = make(SpecialSubKind::ostream); + Kind = SpecialSubKind::basic_string; break; case 'd': - ++First; - SpecialSub = make(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(Kind); if (!SpecialSub) return nullptr; + // Itanium C++ ABI 5.1.2: If a name that would use a built-in // has ABI tags, the tags are appended to the substitution; the result is a // substitutable component. diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h index a3a0381edf97..28545ed06836 100644 --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -5450,37 +5450,34 @@ Node *AbstractManglingParser::parseSubstitution() { return nullptr; if (look() >= 'a' && look() <= 'z') { - Node *SpecialSub; + SpecialSubKind Kind; switch (look()) { case 'a': - ++First; - SpecialSub = make(SpecialSubKind::allocator); + Kind = SpecialSubKind::allocator; break; case 'b': - ++First; - SpecialSub = make(SpecialSubKind::basic_string); - break; - case 's': - ++First; - SpecialSub = make(SpecialSubKind::string); - break; - case 'i': - ++First; - SpecialSub = make(SpecialSubKind::istream); - break; - case 'o': - ++First; - SpecialSub = make(SpecialSubKind::ostream); + Kind = SpecialSubKind::basic_string; break; case 'd': - ++First; - SpecialSub = make(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(Kind); if (!SpecialSub) return nullptr; + // Itanium C++ ABI 5.1.2: If a name that would use a built-in // has ABI tags, the tags are appended to the substitution; the result is a // substitutable component.