diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -4937,11 +4937,7 @@ static bool ArmMveAliasValid(unsigned BuiltinID, StringRef AliasName) { if (AliasName.startswith("__arm_")) AliasName = AliasName.substr(6); - switch (BuiltinID) { #include "clang/Basic/arm_mve_builtin_aliases.inc" - default: - return false; - } } static void handleArmMveAliasAttr(Sema &S, Decl *D, const ParsedAttr &AL) { diff --git a/clang/utils/TableGen/MveEmitter.cpp b/clang/utils/TableGen/MveEmitter.cpp --- a/clang/utils/TableGen/MveEmitter.cpp +++ b/clang/utils/TableGen/MveEmitter.cpp @@ -64,6 +64,7 @@ #include "llvm/Support/raw_ostream.h" #include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" +#include "llvm/TableGen/StringToOffsetTable.h" #include #include #include @@ -1846,14 +1847,46 @@ } void MveEmitter::EmitBuiltinAliases(raw_ostream &OS) { + // Build a sorted table of: + // - intrinsic id number + // - full name + // - polymorphic name or -1 + StringToOffsetTable StringTable; + OS << "struct IntrinToName {\n" + " uint32_t Id;\n" + " int32_t FullName;\n" + " int32_t ShortName;\n" + "};\n"; + OS << "static const IntrinToName Map[] = {\n"; for (const auto &kv : ACLEIntrinsics) { const ACLEIntrinsic &Int = *kv.second; - OS << "case ARM::BI__builtin_arm_mve_" << Int.fullName() << ":\n" - << " return AliasName == \"" << Int.fullName() << "\""; - if (Int.polymorphic()) - OS << " || AliasName == \"" << Int.shortName() << "\""; - OS << ";\n"; - } + int32_t ShortNameOffset = + Int.polymorphic() ? StringTable.GetOrAddStringOffset(Int.shortName()) + : -1; + OS << " { ARM::BI__builtin_arm_mve_" << Int.fullName() << ", " + << StringTable.GetOrAddStringOffset(Int.fullName()) << ", " + << ShortNameOffset << "},\n"; + } + OS << "};\n\n"; + + OS << "static const char IntrinNames[] = {\n"; + StringTable.EmitString(OS); + OS << "};\n\n"; + + OS << "auto It = std::lower_bound(std::begin(Map), " + "std::end(Map), BuiltinID,\n" + " [](const IntrinToName &L, unsigned Id) {\n" + " return L.Id < Id;\n" + " });\n"; + OS << "if (It == std::end(Map) || It->Id != BuiltinID)\n" + " return false;\n"; + OS << "StringRef FullName(&IntrinNames[It->FullName]);\n"; + OS << "if (AliasName == FullName)\n" + " return true;\n"; + OS << "if (It->ShortName == -1)\n" + " return false;\n"; + OS << "StringRef ShortName(&IntrinNames[It->ShortName]);\n"; + OS << "return AliasName == ShortName;\n"; } } // namespace